From 646201bd9d0a7431fb4043254c10b5846ce08f5b Mon Sep 17 00:00:00 2001 From: lyft-metaservice-2 <26174213+lyft-metaservice-2@users.noreply.github.com> Date: Fri, 3 Jan 2020 09:07:55 -0800 Subject: [PATCH 001/645] Initial commit --- flytectl/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 flytectl/README.md diff --git a/flytectl/README.md b/flytectl/README.md new file mode 100644 index 0000000000..4e55a2acea --- /dev/null +++ b/flytectl/README.md @@ -0,0 +1,2 @@ +# flytectl +Flyte CLI From c68c5c2f20198417abddd4b9558f2a43ed93ccc2 Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Fri, 3 Jan 2020 09:50:33 -0800 Subject: [PATCH 002/645] Adding open-source boilerplate (#1) --- flytectl/CODE_OF_CONDUCT.md | 2 + flytectl/LICENSE | 202 ++++++++++++++++++++++++++++++++++++ flytectl/NOTICE | 4 + 3 files changed, 208 insertions(+) create mode 100644 flytectl/CODE_OF_CONDUCT.md create mode 100644 flytectl/LICENSE create mode 100644 flytectl/NOTICE diff --git a/flytectl/CODE_OF_CONDUCT.md b/flytectl/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..4c3a38cc48 --- /dev/null +++ b/flytectl/CODE_OF_CONDUCT.md @@ -0,0 +1,2 @@ +This project is governed by [Lyft's code of conduct](https://github.com/lyft/code-of-conduct). +All contributors and participants agree to abide by its terms. diff --git a/flytectl/LICENSE b/flytectl/LICENSE new file mode 100644 index 0000000000..bed437514f --- /dev/null +++ b/flytectl/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 Lyft, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/flytectl/NOTICE b/flytectl/NOTICE new file mode 100644 index 0000000000..938e7ae038 --- /dev/null +++ b/flytectl/NOTICE @@ -0,0 +1,4 @@ +flytectl +Copyright 2019-2020 Lyft Inc. + +This product includes software developed at Lyft Inc. From ff172b9286ac498b03747ab345290df1d0aa914b Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Sun, 14 Jun 2020 20:30:21 -0700 Subject: [PATCH 003/645] Proposal for flytectl (#2) * Proposal for flytectl * fixing changes * fixing changes * more changes * readme updated --- flytectl/proposal/README.md | 129 +++++++++++++++++++++ flytectl/proposal/flytectl_interaction.png | Bin 0 -> 24231 bytes 2 files changed, 129 insertions(+) create mode 100644 flytectl/proposal/README.md create mode 100644 flytectl/proposal/flytectl_interaction.png diff --git a/flytectl/proposal/README.md b/flytectl/proposal/README.md new file mode 100644 index 0000000000..8b776350b4 --- /dev/null +++ b/flytectl/proposal/README.md @@ -0,0 +1,129 @@ +# Introduction + +This document proposes, **flytectl** as one singular CLI that interacts with flyteadmin service. It is proposed to write the CLI in **Golang** and would support both gRPC and REST endpoints of +FlyteAdmin. We will start with gRPC endpoint as the client is easily generated and in future we should investigate generation of a Swagger based REST client from the gRPC specification. As we build +more SDK's in different languages we should support a common way of interacting with the API. This does no mean that some SDK's may provide native ways of interacting with the Admin API (for e.g. +flytekit), but the intention is that we will eventually replace **flytekit/flyte-cli** with flytectl exclusively. + +We also recommend that the design of flytectl is careful and it could helps us with delivering user features faster without having to rely on the UI. flytectl with follow standard oauth2 for +authentication already supported by flyteAdmin. Moreover, flytectl should be readily available on almost any platform - OSX, Linux and Windows. We will strive to keep it relatively lean and fast. + +# Why One CLI? + +As we build multiple SDK's they need a native way of interacting with the API. Having multiple CLI's makes it hard to keep all of them in sync as we rapidly evolve the API and add more features. + +*Diagram here* + + +# Why Golang? +- Most of Flytebackend is written in golang +- Golang offers great CLI tooling support with viper and cobra +- Golang toolchain to create cross-compiled small, light weight binary is really efficient and easy to use +- We already generate golang proto and clients for all our IDL +- we have multiple common libraries available to ease the development of this tool +- kubectl is a stellar example of a cli done well + +## Generating Swagger code +We started exploring this (flytetools)[https://github.com/lyft/flytetools#tools] has some work. We also got approached by the swagger code gen maintainer to see if they can help. + +# API + +## Top level commands + +```bash +$ flytectl [options] + version + configure + get + create + update + delete +``` + +### base options +- *endpoint* endpoint where flyteadmin is available +- *insecure* use if Oauth is not available +- optional *project* project for which we need to retrieve details +- optional *domain* domain for which we need to retrieve details +- TBD + +### version +returns the version of the CLI, version of Admin service and version of the Platform that is deployed + +### configure +Allows configuring flytectl for your own usage (low pri). Needed for especially storing Auth tokens. + +### get/delete +Get retrieves a list of resources that is qualified by a further sub-command. for example +```bash +$ flytectl --endpoint "example.flyte.net" get projects +$ flytectl --endpoint "example.flyte.net" --project "p" --domain "d" delete workflows +``` +This returns a list of projects + +To retrieve just one project +```bash +$ flytectl --endpoint "example.flyte.net" get projects +$ flytectl --endpoint "example.flyte.net" --project "p" --domain "d" delete workflows "W1" +``` + +### Create is special +Create may need more information than can be easily passed in command line and we recommend using files to create an entity. The file could be in protobuf, jsonpb (json) or jsonpb (yaml) form. +Eventually we may want to simplify the json and yaml representations but that is not required in first pass. We may also want to create just a separate option for that. + +The create for Task and Workflow is essential what is encompassed in the pyflyte as the registration process. We will decouple the registration process such that pyflyte, jflyte (other native cli's or +code methods) can dump a serialized representations of the workflows and tasks that are directly consumed by **flytectl**. Thus flytectl is essential in every flow for the user. + +![Registration process](flytectl_interaction.png) + +### update +This is a lower priority option as most entities in flyte are immutable and do not support updates. For the ones where update is supported, we should look into retrieving the existing and allow editing in an editor, like kubectl edit does. + +**To be specified** + + +# Details of each resource + +## Projects +Support + - create + - get + - update + +## Tasks +Support + - create + - get + - update + +## Workflows +Support + - create + - get + - update + +## Launch Plans +Support + - create + - get + - update + +## Execution +Support + - create + - get + - update + - delete - here refers to terminate + +## MatchableEntity +Support + - create + - get + - update + +## Outputs +Support + - create + - get + - update + diff --git a/flytectl/proposal/flytectl_interaction.png b/flytectl/proposal/flytectl_interaction.png new file mode 100644 index 0000000000000000000000000000000000000000..b08e587195caa3ad4232ad4b818535a4eea9c095 GIT binary patch literal 24231 zcmeFZWmuHo`Zf%R2C}U>x%O{uRB6jSr&4g>N*w{7DQeSrjCVm1%icz zt%Z*V{!{wqiUt-I1C~5YO4HMDvxUG{bNKl3k|p%^17lvM7dLX4Q26(U8;2S-+ad=@ ziZ5!J#;mX2!=1XSUn^;V6{KA`a^2cM4?^*!NK4bYwsiP<*-TZ_tg6aTq9)$lTEFyev_Zq zUcY{Q{k07$Cntxq`t7l+2ySFllwfj7%Kg&f;$nMS+vfhB8O7z@XE(6%C9!ab09xa=AY$lb)dMT5u`^-x}X^KAY~pjNT=I0_zRyEWC2 zZrPVH{=LkgscE##K(sroY=8xq0qdV3CA;uz;80f{9-eIf-(T4eONxrt2J#hC;~;5U zBg4bG=H`nh>{*^BUUqhyl@{7p$p3vOU<4NCxH<#}508<$uI{+Q&(9I65aB@iL^fS5 zt>MYq+S=1#Uk+FLzc-GVkRb|pkOZP2U-a(XZE>H2ja#}Kq*}{yAHs>5M|5;_W)+Ln zZ{-e={rm3l?*zKSJ{hvIvO0`>|4vrz!Dyy!pW8ICKG5QGcoI!5xYfC|vNDz&FUg=n z;A?J?ojy)y_0mYVF254m8wwR49n9|?9#3iY`c7LEh*>=0z$CbgvGH79rD><30Pt9E_tdZZLRKpbI!6%?6(!k?YVQHZz>_}RD74$X>FU)!O*u<(vnIvwgxL77un*Vy zTqs$)O_VDRXlaOC?(bJ8ThvYU+=>ytDEREhe%*!9GFc^K!&<-{AEn3xCFWW>L}OyjIrGw+qyI>=BkV%OB3a@4`XbLDyGWS+6zX! z)l7U%pL+bJULfK)ju|MVghWOtOI6#*NbeZ*+G^Y_iho~_+i+3j5Xsh+yX|1%@MX=F z)&frAM|G;}!l|-@GH!b1NJ1K|_5%KewkbI7#E70$n&jr;mjlC+*wQs_Cgw`U%E4z5 zl#tO*xG9-koN0OZ6GA?HYEt=#gK>c`;uPuQVZ5i^DVHzDmnry$Zou}J1uMg4ZR(W2 zSTyA!bnGSZB|n(rgyY2qhSrL}WS-uWZDS<5j#EZjM#dt%$))F&67JdGbHeu0q&1D! z)WRoCx9zC{y0`K>+u`75Z%N%%G(+b_@7R~Ju>lF64kmJiAuA>5=R=)rT5F4FUd!pt zu=N$2{PPkrc+lFhhV8RimD{JgmEl3!E5ou8kO;iYt~^(cDKg%D>irAV)G>%?DhnzIW5?ncC91pQdF&aEs*N(AG_y+ zQ%^@K3H7`QEg5E{`e-eD0tr+lavUce`FK@WL1(akuimHG+C?pJ>116%>_gAv&#?Y1i?_)R z$*!=V1Ggtp`Es0ET&)O|kOMQhCy2`s*r&Dkyp5yQZbs;Y7@=f&rWZL zrt89|EHB9wcXUUkz12 zG;3zmx!-zi+4=OXEherp$ZGgd+sEdMt-@IIhgqVaERlF{iKOl~Em#Wi=vSIGt2(FD zgAq`~cF=(t$AqK&$1x+m>MQdHB4%7vuN5x`SJfu)Tm7F@@LOhUp1vbvkB0l)?&yey z3nU$>Stoqf<*G|j(yvYv$fr_V(`Ue0S0~$yjTiS zgTy7y1N)uR_?b^wYDZ+pWu;|DS1+e)c;H4Xzsby1yVbbr#Ko?rTlqica)*40mSSfl zV#5g!eW1%7g@i-Ri0^C3VBz!%&!K*br09u_DAZ=jcSny_7AwT6c_(x?KYg7bFuZnI z+dtPcww(Z{O0p>@ql4pd^*%YJuc4Q+>((9FCJz}9W%9GKAWTnFmK;KBk9F_J6&2HPeicg*=4O9Le*1PUM7j>g@;E{qNHAu4Ie$M zGm@qun;YoYOc-Y$7GHa(2e*e(&@%hj+Rn=QYO;~*7ntz%#%peL8(hQ2_k4nd{=qv? zp&f?6FJ4>`#Fds}aM})>v?`@iiS)UXe(EATE%di{%X$=0p3_F`u ze=rl}7V*2@;WQ2^*OQ^?O478Srv){Pn>LO{FOv!p1LD|l;+Sw7*rxSedrgLMPmRqt zuvaKyk@&CoNS=CA2CFw}s@J-42`DbU#;x8}0ghh-?8Fm-#|yjRq2ad^j3pT|aQCVN zXnBjiGt=@Fkvr9|2(yN1;7GIctZL>ojx}NJ@s$q7+8U3M(D-!HAWPrb>{bQKn5c;) zO}Gu^C1@26`H&IB3!x+H^;tAsyU~*lsM*=+2C|jwxI_?6$?h;kBFOP`^A7w# zRgyT;6XlH>CffG3vJc$dIb?MCbXMkBzuj;mP}t&_)bt_nI$iiiuHr8d;W78_5a2RB zmh9);^iuVX)~;|1MwE}Gr;+myP{+*c95M@>2@qaG4_LVR65$XbVz5wwUUNi}&Jq zike!!^0_gzuPi?(ZNdS%wEFhlsX{4W%>S=pR}u=ez*EmNB?@N=%!mr@r1R-1YyPdk z9_iS_+c{S5e{M6`>{U(cG39iSeRP`o>OPTgerNOalgPtqOVO?OZ_bwl z+nls_wJiFx>;z|ht4j@gTyZMIN`{z=@H_HvK)XbHDZ%S4WCYUuxp~+Xk5A846HR%3H0cTk9~gKB4)Wow}oj0R`E9 z6T123MMci)zDXpmXFHvfgnqxSh#pS4&;~LrpB*n}d-(Ye%CifP9e*iRv1#ZTU4`d=KoZ`O|L zA(1TxPG88Co9w*@DUE#Re3$0J=<8CA{Knm<-A2omg3Z6B=x)!n*iARO_4(luP!e1t zAd8^dx4bwz9;vm_k-a_bwVbKkm^fIGbUojue$rla(lQ&F(Ld#Px_R*N29J4KC>Ry36D#|dK4*bG@A1i!Vilj0;h{i|wqWi0knqMo8 z|EA^B8U%WDFp-67!S!2iimK50-q2=od21D;OsG(NSkqSHw?diXUxHJPK`r|u`Y{^! zERFhHO&WfEys=4tc@#G7(k~X{=(U=ky7A!(p(~2Yd1d+>8=N2)@wG_2bHn1}^0te{ z&B{)?*>^gp^nK!|w)&MOA-ke*WsAOy)je5s%-p9iQKpsi!&wiSGY9|E$%CCvdQp@V zN|N{{NRpSvOk>@cxKCboaJA>|&^dQ8#=HW#@z2`Ji&IhJbOZNs)_DRdQi#$W9oSVO ze7wM`76;SMT|*52@dO`LFjf%LHt7FWC3`Dw2+yRnukB>5_+S+nf)bR&pwsR1oZ?ngg*R)4XyV`WcSPaAC0X1Pq6Mc5?~p=5R{dhu z8HrSJqP@{xlBbXB|8X+8%yE4(were7Z03V`@^y}L(mo6EvKiK{I0FILS2CcCrDN=q z__RD!Nf&&G0S5MMBY5%Qgv|rTA0Ntvha=9PHG5VjKF$-n?y}rh%WK*pbgOno!NJP0=$7K36U!HX!AR1h4@x~}u%T?}*Vqd|G@#;wM6+nHvszO1VeWN?ur z>%11yvfGZ#kcs}>i+nDs8RVgXrNgJ!{5CYk3090^oEk5D#h>HunJ4!h>VIfd@%ZN% z+L^#J@SCE4ZTnwNw(e$bj{z5E*;zRfiU6V2Wsg+l(cFg7(L$n1M#jYvv(7xQUe`>j zJdqj`9`-im=|SIhzcU42CJW&m5{{E*n$6$8oi+TwrwFiL&Jp@oD5VPsQ^&>%{R}U+ z3pQ-?Yata=oroVy{uzZLX`GoJ%9&klM8A<0wbG2tkwe_1do)ITHB#g~4NF3jd){82 zD?A96A`t20cK05N@u?tN%hy*}C`Qv@&A(or=!iZr17x^deUEmZSk@ZcYRf><))r+T zg-1o4TFRTT6#pe@GX)c${Y2jS#Q*IlHbIC^oOIC2ag9#g+<@dvykph(KHO#fe z!^rw~1`*f$kDs@O&7Ysfjx(hOr=i@;$e|(2z z7Xg^ZUb4I~7V#^RWgj;f>^?(i4)q`Gj|c*Oix}gbS7V@h_*m|0JEqP{5nF-$iPymy z;I|8Sdqt=Jo%a9RB6CKC{`~n9!mVAxu{zb@0)5=aQAhH$);ig3eZi z6q%Tp< zP|{dvB67utxBjG?__zSb3`*O-$H}R?H*T42H(97rAnBT=Y^MBte{HyKNLkcw;=R+n zB%hDqE>$5mP9U&4{NOt)xPMFq79uHvYFAKH+!osZuF;>xZ=)Ud4y)_X=_QS@^EvRh z&a)G>HauM(6fY&z!E?qxWDmmNr&!o+1bM7fJtaBK&Awm3_y<`J0-sQ{MWYIgN$P_jsy2&4p-8Z{Tli#TWO)m}1o`>N$tWouxVX9X z>%8~Zgu#v+R;&tpxT9E&z{&P)SAO&N3AJ$2B12*K4M!=pw)|dlvj)z|b|Oe|bivYh z;b<29nKST=H6Ss&t5PL@CToM zcaFRy!#Rdwq2p9WEK2^&7v}~Rr-b<}@G2j!0qBiBXXr1k4@(6L-&kjEM$}~qe&Smv zZW{LIdHaELc_gb40;a&i_@w8!jeo-mni2SL&sC@dnn3yj(^pbg{u)r-W{oO9f|K87k z*XO_X^WXCoAo>5F|6#bqe<@h~)xtd_t@i<+4)i5|^?L6H7hjX`WyJ%Nzu-@RAaLF@ zj(HTojTzz4_HNwZvw2XxZ=r2(QEM^M-c!e0P1|D|-DZ&I_V)rwPvD9_+K77J!p8T_ z3}CuG-%}#A)wypWFx^vzOYztHV&T}a2OtolqT&SD__$F4CA5k-ZzhJ=Jzf(!FaFe!^?AFjuXjx0XK^|iGnsDQwX zjm7rW`ue@Q&v8#E$jKqw-wPAZv#w z47gvpcB`f@Q}mkWtK;d~|5HJr3DQ)X&52sd1wr!1v52m0VWP)qRXsg#Ss9s6a#?(H zuL^n}S#B8u#PXfvUY6krEQeu9CFZu6x9eOSqs%XM#l^+lYlL)D z)gTMJBF(7P)83$rS6))`Ou}KN`CmC;(2%J2Pxe4@vS1=inrA~sB)Mqz? zV2s6D#>1pPt=`7Q=FsX>=dqkC0a;fzjiCM13@O`_@GXvAGqZ@p24*TU>3<6wygoAi z{zSuT^7&+KZS7P}E3&yzgO&lssHM)>bpI|Yx1?kv#`sfcX0HpI8EHw#R+dYj@cMF3 znhQ^%0=m-bEi)%K_o))79AYhcUx!GfarOlGiZ7{%95(!i9wIS;jOd2f03;-((PP`N z&1t>^+cxF^3vpB|2@ReN?TukzLFGEg%YUVQWQpP@0Jf2_-1Al`{lL`4wZ?X`1HETA z+j@=y^t+wByft$>mfzjJ?5XmciVDZUu}V{(baAA26V^fUeRIj@XGc5fmOZbWOifLh zg)Q$mzU-1E2KA5G&j%kFs3IdH*<$bTEe%=?z1_)(7<+_SoF#qxhQ&}|yT!}`(9lG- zK#*i}ns&ytm;tzVYT2sl#>pbD|8Km-td@TlO*57!sciogO;>%W2Nx*N->TWD1nefv z4rl$_GMzf^jO5Ck5U;Xl`wo`9|9O3xtm3E&;L~IN7rWUOy*r0(m(u{0Q0-S59vFBI zthL%>#;fz>U^BhuV)0w*BzJkUiNx6)q1d)eBYCJ4^jC)bXwh85MF^!~g@%e)atmaR zS9io)&(QFqFGJYngbulf*0l+WJZJndvwZb`6dMT=pB?>>wS7g?cI)Iwxsij!`KpRifz2aO zD(W*sNE$zd5!Qbql$bhB(}%{=Blpx!F>vsiT=5wOsct#lYI6Tbz&_S1IJ<$LI(xPx z2ypZ5@#SoP`+kYb=1lhqD|Z0=3va%Ak}W>1EPia3E@1b%RJXc=;{G#4q~6)=<$3nB z^S67-d9Zjq9cWLc=xBrXrth}TZ1sA1+YBhrHs8<3xS$xw$;l78m}6NsRqk7;-i859 z%(EU`{|WrBXS>&w{c818RaGnUD=UfpnP0ejY`ef@aHFXuSYR@rAsHvXs@SM5ey6qx z#hikDrU~Hf_f7>|Q?e~B^wzDf` zCNlIpHZRDEp%oRuF$RQyMrxKLi)S80`7Aml=kEh zun|q0jq7E~2D29j^_zefr~(YjD4R;w#&;bpt;Ls0YH?=g^3#v(+8(kf>yIoMO@7^x z=fMv)yYS-GTtlRRX!em07fob5&qVe6^ZQi@pN+DsO6hde*`~b3V)kUDK0_`L_v2u`VkSpeK$8gAsRLfAZr27*oTR=N zM1S^S&nI8CkY~Ol+9f#Rb6B^;#SS5Rv=#WQt*-tvk9~h@dUDT%8cv?no!15L&k}26 zq|#ecxx6^97H5_ISz~T@VNUx1QX|K}vP;Nqkq!3Y^d-^;8~ua&WJ=&AqU+u^R(%S8 z!97E07vn6THE4}<-n}@Wyh$T8;PgFNJ1>d(TumELneSI@Tjtp{=;gfkW(s~U! z5)G9T;^_XhR$M*-R$&{)MCbV<&>=iDn>cOt^&?qBl>*luWE(UV&;G93H3EX73S zDqpAb9*YNI2oo8}bqw(~4VVk%bPTnpK>-nA z)0UQIlERTyBeolKhkwF=^QY6>e#?9Ck8|o4PIa0F@7bcfcSJErt@4&4``1S0Q>NtCjSXK0E!lV_DBEtIL_Qv3&! zCSo4_mh-_dN%OH1?gHfB3boOdd3u?nRx%@ya^R zhpg|iJ`W`Vkj|t)oID>YA5P=a!`n9#@>woOK!K1}#MLHGic@YaH3JEk*1YxTm!xI( zi#6xjp&aqG@9dkFs%SQ=d=bu{4?KT87yS`%<%z78jS9T#B0Q)pxuSc7T3rU1j@w18 z_;~}9KCbk`%PM}~wR3uqW(Hec0Y|wbnw|>9sB&}q0Ny*Jw>OQfMOQDqG@V=I{{DarVQ=1vg+#Fu zdaF>;JNH=?in71ucQ<#RTD4(voRD2>pG5gnjebD_;G2ybHvk-ImR;#^55R~r*^{C2 zD%}{5uv9#BFxqx8j0d4wpvf;vt!mgd4`1H@8O1Y!A*(@H(RzHFRiw^#{O9+|-9Ay# z?J&n#p_Wg#M9mhF1Z9YU8*`YDn|D51Sthcj#s1Js3pk@=k;`TiB{6`eNveY~0$=48 zuqO}@p)i@O+l~9iZx?Hn(jI;hrrV#eDd!jdxSZhc zPwVuV7(lHVewns;9!x8{mYHrTyLHO|Fc!}DYY-xt-OkavP`uyp*{lAAVb|M}Jra@H zHy#2jW8XpEFyl2oX&gqo)Xb^}-wuw;N&BCCVWoLNX})1GMZZKQ?3TXKb#`=4>i1Q> z+Bb*FE9bYU!e(@GIl`H^VjukuCv`)VNtCAV`s*-I4d#BSH6+C(3f^Pi50x;>(SIGY z98ria()qW7JvFdT7!kwhGneRUru*@Z7stz@G258@2#BFkyCX{&t-!&whmqyt*-O4Y zM_4c{fC-O;mXuxDm1Y-Y;^U&*&89j=$l6uAJ_W4=gy->MYUZp5pm0G-sn!|j&J3~E z;CYhhIOfoHPJ@16@)>^;1Wdin(W{itDw3ZxBUEvvw?pF)!XWKZ;z4R?%BT^wkO303 z%w=Yh0sUrY4ekIG%N3ScUL6rJ;UO{BEkIpD@>Ev@9;89caD!ah6gQ0QkXMVpI!KEJa4)PU?=9(pz{sXD`7KhJBV zpq~BE2mE-CpuczJ5*Bv{ChKqqKgeYHPY_ z5@b`hzzey-K7jZ;U(#*!#Q-j`K3bm5>0pGC;r?~vYiykBk{KLA<00IGp|!2H1GoHz z7xW5aRaDerGB2d1VT)x=Th1st>*89!FWa2qlo02U+LLmQ2){Cp02I#JJV-a}fL=j= zR(iTrUyxeNyM~#~&}Wl>S!pDaOpbx$#qaMLD#GX9E4g7An0y0>CbAW> zMfa1{0@1^;ixKMvbq~!wceCmA^4620c};Fw`NI+g6vFZFc2~RK<@sSILZ%rp(8l^G z^cL-!ui>p0b)UU2!+LE$JL!3-$c$Bk87fy!mqBXd-bx8XIGbmBb{ti|F`3P=AJv2B z0es?cCFtV_!emUsq)e4K<5_wr&XHW~u{|RI>SOkz98EU(eeZ*fV+eXc-T&lpJ39gG z7N4!G|BPKM+n@7F*T;}?PXX3-i?eDa2Wk~_86-vM)DqWuhX0BBP)m`k+%Zuvd4vRQ zYtFmpb&#lO@>D# zqzEt<(TW`<8_|ZmK!m>_*P!}@$H%RC(vqfR_4rZVJs@Y~amw*gAT)$iVfcTc!(3P} zjp^b6x1iA%x3Wb^l}wRZIGUlr7L9`UwealZt^*B#VdGmeCISj_I8Kd2z12H&o%ngOa(t%fc4lalT573L<<}uG$%2~p`aT%y zUEY}?kM!%4Ko+iEB&q6jNV_Zs5sFuU5gyE6q0lqQ+vYo_P>8lIl~}F1^$LMl6(E|)UzqVlhr3)Bf2`~$W|jmJujit$MMDMNJ@zJJFZw=LR&FaHw{H7!W8BFwsxW% zl`K*Ekjp@t(1+8j@S$B2ji`IcE?=Rr*pK}C^Kh9nHpNnPu6{l4;D~hM`P_A>@@LB+ zF^=tvP1ZOE5nzVQUcI$e+i>yuJA021twQRx@{@9<7;D*EaUE}Ie!Yni;nHzGe=PbZ znQxp^P#S&ZI8YV&Ip|{ZG2I{q#Cf0=tpl`}>IIN*dgnTk3EDqu8+4g|g4(H?)@vcY zFBCC-V}hpCCof+vh#Hba6lZ!LyAm*Sr9M}Ab?0DL_xRIVM&}{Eid)xjWYX%+zMKwPiOm z|NQAmbA}d@aK?MRRGCcr98G`BcR1ryPMVq2;->myV#dB{Gs7Dw$&@v`^Cm_=%71{# zC>}O!qvk-#Pzw@Xzx7<|#x}ESNW%3dqZ>lMNwvsUHwW{hOsh2s3lM$uQx@rV8DH3s z-~84{hP)9*UFC-p*S>cjkh&&(L&3u3PfkErm44gvgX-%BGup;$4uB63?>O~;WTF=AkT6t0Q9Z&ctXk2pt zUFt@F#2x4t4Sc zM~(trYOY#oPT4hpt+;f&<$0*Y(RT2Vk;=EF-+9`zG|i6Qrp7Rh+rqs%O)13_!3mpu zCJQ>DY(Q-oV_JIVC*0vJwAS7X{I4kC0AK&3p|s^jWkRLWi513D9!X(wk~>_^k)TB0 zD2~7EVK9v6pyd)sfd+4e3qW7x=FeONo$h3jj0LLYG9^ApPv8v(cUMc zIBO8;%eJl}LfWZPa4$DItFO)Vwx^d}U6ztF$HE6hIl$YIH0&~HwqDx9@waV@kC>>` zs}a852^0bg^j&C58)WKAll6F&c^{vy#L&m!TdV^v_yGYgvcECRUT&Zv9&a=(sb$(S zd?_;HRP$DW+!CQRw$kaYtID^I-#p13#oqfjHoWf_KNadHJV&=v`BBWmgUDXlbA`m#s4s)s-CUl~L>S`ing71lq+s~5pqPAv z^~5U<>;WMA?DUFX8Hi?QZ*5RY*%3C~nd2DFrPegBpLTblTiD9NLpmvjui%m)=j5Oq z6FFMfkd-zcS3^fr2aa~;GYOclDF`;5lxb-SD|Cm9JU!>|iy)WiP)P438MC#BP1A+f zwf4AOa(EaSWvrIO)m!kuN!|RdlMRc#4SUUz@!YO0z;C=o8m;ZI2%nwc=!l*4Ar}(|cQm%xyMsCru3$Hr&EuMW_Rgd4!36T>kp59|AJ>m9|DtJ@4a;LN_hDJi{ z)Bc$bTC6BM50xLOj@Xfzb<%SjI8()yf{(86>eadrB~FP!to2Q#Zg6nv2@M>^P>^ZH zHa#f%&UP=dODAr=@QY?I0fAg}d+~OQwy}k~)bp*~qjML%3O9JrK{aQu7TOV>K_;w& zD~&UV^iWm|)99kK?W6zxF->`Y=l|!tp>R%U|CH$$ zehH{QKi;8_v>L%?ljGqv3yZgP{vs79DZ#7^LQZ&QBPv}ZZhlvM|4VUAz-JUeuBwSk z`rX6`yi!lDT6wr&y}h9hR1TZVHIL`!A$EDP)E%u+IsBEV$D|zw$YjTO>7>_5x7EkE zK~aj}Cb!FO@U3FSF?yBe^9<&j*M3Nz^X^qIIpn&=wR~KTL86G`)F)806Wau41~rCG z{?>|u+)WR4le~7NJI?T+LI1rCcX-f4QZo63H_H@a1+|ilvWB`hxDsmiz{WNN-9FZWyysTBE^gB;i8KJ-SJu@ zAsJm*kEs%-mrvB6WtM&^)U=d;i2jj<|E??UOaad5%G1HaRPQPTFHp{Wy??DXr}SM7 zw-A47jp{-qp5Tj|i(`~1Qr!Dp~BgzzW+`o=o(?4@F+#=q+Vk` z62LBg?4*#B%!3(uECn*IX|2`m9aL`qC(as)T48@xCRHoz-^}KM@T<`5XJ{gSssdQh zQf4|+`V;8qf^H@%lj_QR9t**+r>P1zS2jHCXcAGW&sDpW)1_T^xx!RW36f&p&C2KU z*MC(PtSDaiDag$BR^#)wm1<@;UlNs@Ad>54K0yHiipLunk8nwE)pR9EQcp8;JXa=# z6+`S1-GuBxVh}&o!+fPoYsU5;Sy>B_SL^x0@r-&B&L3Z4qGIB^tlGCtn16T9N0Q}C zRGTW>k1x!-Rjm}mRKT9^*AH5r@^4r(s=(E*35Wis-;?c>u~Acv3e>|-5_7GH+{o38 z^8`j2gt}HFBcP@bbzle*5;F5me$}GfL9%3rtyU}z94YY^+7YZwW~Q6p60&ppwRChu ziE%dxHD)#aekW!N#p4m&zV~>=yS6w)Vbccz!e<;Nneh4n8ortimN|bGaKsM=sf%Su zA6mIwf%_0+_|{&s>0z@(fsW$q6pctwZ~dQaxw4q^GK3kvlKj| zPOnv*zW4BzvXtB-=izCy!d@N#9+*YUzPvp<2X0;KYNlZhQ#>jeXYq^GLyi|eLaUys z<%HF@K7|r!?Jede=GLT5l=}i8Lt%*bI_0W-;UVY)y9$#bE1CRw8|PmusDAy0cEhws z;EHapmN~p^$}(M>bMdaVso9z0^`J)~pk^s73l49&rSBMPKFpN&duY*zh1+?Lm0^*{ zI$o7Y#xFARK&zWQ+{jgPL2CaSarEh+n|4;Mj)tsufqIfSGjXB27LL2OI#?D4n9Nx& z^^OnKXZ6w#N%xit0`#sf>ygc zDdLBRh+WMkRe`b{F|op0snu7Ui$@Kz<&C53k4GW-OqK?@Qc5_7mZih%7vfHQs8biE zo5;#09*?2aP`2ccO3oi@$KmOvKih7TOn$d?ixzlpCD?X>*v+HAivDqJU$QQ3ZI?eT zvq0l3!O?0>zHw?-Pur7hrHRY8%d$WD7%#?C@N{N*Km`o9P_KRdB_JX+Wl0}Ajw0>% z7IxmZ-<|SHSa+`_(ki19B;IM1v(VIDV`E7l9Xi>qulktZw#OMGJ*Q z<^N*6y%$o}{GNjhvmGm6Z~vYOJDuWdl3h^!<8 zA&0GgJr&^)>8rSD;C4u!|BLs21Tkj#r?TlU-5LYk^OvhQv=mIFWQ!Y(yPnl$N7n&@ zAcv}3WOweEO5u~)gcYW!KcPE0US6)|g!BowL0NWrmY@BuXqS|wO2W%S1l%fgA{_WC zLtQ&n>_Ll#MW>Bh#qc5d_*5JPf#wdzD8hf?f5iVxFckjv$vvo7~)fGm!8NS<3@ zFeaS;9di3wQ`^Upq!WyREkm5$YiCvgY&ml6BY7H-(U~bc_>e6N#T^qebcdjSu=c8s zh73_y@3LhAdgbWDrltzs3Nh6`p|n zfER+mer*5Kf%oJB5UcGoCWx2G)Lv-BPzqi7z_Vxsesm$zI2z0@S4B9M zLj=L*3s0Q}2$VeE2RC9X{0b-MNq$(+wPsA_9!1Gh=P`>M1<0dyw(suqdT|jj> z2Egmt!$VglFi$RUKR)ykuf6vtfQ`kby41qj&yIIDzfc<0fKHl*9Z-13;UA#@* zKin=dTrH?8u}p4Pxj06pDGQ06LDQ}#589p>$iCC z^L|U^nZ*Ek&1n77lchxHl3pfW=6`u%Dsgc%ZwmPO%b!5i zV3|(L{5bEK+8^w{n*uT#f|=q4Ro@Jl!m2*WI~pNJpmD@wq9Su-w}QrZoOq3`tD#|9 zKkL_oVTK@L-g}-7O`CO1`^h?n4WF2otaMzu7{i`bfR)Tf0{F$pz;iAHPHE_w3%Xg9 zIZLt9(n?)9|g=&^nBW2AbBdpk3h5~z7?t!!;?{ytQ7MJ#)==)+~4oOVLVxwVsA zx2A+U4RRW6N&i#ieQH||KM!ON7^1L5#Y$X^**EWW^w!UK+caTc!Rx`00rv%~S+T2r zih~x3Ha`IV6ui8{XR!>gR-K&u~ZDHs@Jx^2%O=YjUZv(K|fz;+mr z{tnL?oEPgva9@zz!`VU_0)fhfyPMnoOb{LZQ^u4DQ9{|HJQ&?KMc`c?HNWmVs zC=0y?{bvBC&$j|xakI^rNbmHEe`iU~M1=xV9V%;FD^kK(+!8nrM`>yIZlFt6YC+*Mqo17d%U98+7YmSXv2}fQ_1}-dY2xJs+L$W!#DA+@EDr2lA9u)2$T2v;KY}j|3IYt=6SAF=XENktfY>va}!6qf3w&PG_;*+eKP8kvn+11ARH8p!NK`B zp6^-DeR-SL1PS&HX){{Z!cZ>tz%y0SFfw$#tVy|04&t*>*_j6@k!RG&s{?KRmo|Wx zX#xFMPdFMuLs)4=g{sVrJ-p9Am?R45@D3L?uEc?!KH=qzeV3)41`i-$dBX&~8=8O} zh|w+q3Dy~6q(t{9@s8uoL0Qv_JeO<-WEaP>>(qNEA8yMO5__CPHl?bfBCdmn!ILiy z55>!2pFW1%z{pPYHFR_iM*tb)*_ei0;2*&HUat=t0WT{6@UguMI3Ks0jR+zhF-xFy zKg<$}fB6-wC;Me1kxySmDkF1b{8`08_x<+lm!Wo~+q*}}g>?UDxSI8~w6w0NCx5hb z42c8Rj`pVuZoiqBm@w_#82T0cg3dBRatO4vVpIWr>ig}52cRp>?lzyr6Ery9g5VUp zX|=EFx_b{cxGYD3lXlcjC~@}7qk8B?LGAC19Wu);?kJzWyRl-HFMQ)9x3JMDe4)c* z&Vr1eM~NA4$y(*(H^eU=3+Wds0BJt6Y%HC@1GBC;jF=6I3v-0r|8!rkrfaD$v&n0z zCk<$-;MH>S*UMUbH^#9st+oz?!V7U*pcPXk*1%(WxU(Fo64oku=f}HZYp>!8(H$YE?r2rKA5~F%! zyfFI(dEJf7x_hn80lai(92}Oyr_~lp<=_=B2|ox0C4Anw#DDAVP8l8^))EA&z0SAG zXBpS5UY<~byVRNToR6jk&3~h;(fwCXFxo04=^Z9%aBK&)S zL6fyM9z$6^TjRi5x7NHs*Kn9S15e9d0;Zjmo(J6TD#j|)$BT1mZ_@s4BEZMRbfkUg z$h9HrdKj2ZK}o4{=b>3wC}=?0ngZwIuHdr4K8Q2*fX&OZ01bPS_EYb76!@BknkEVf zfRYlU>7d)_^m==Tl@m> z;*)Np2K5`cVRUQ5t;o|!0oyUhmNevs!Hw^@|Mc!kDuP6=hY;v8vm^=ms0}nVUFSg9 zY<&;-7*UMw%-~#l??(`!pEyV=hC$0$$1PxO^=WArj-THc;pH0q5%zZJ11hnZU+hYl zWEAe+^ntm+-C$SqT$Ggjuz}#wqf1q1eH!^B_mz!%` zm)6^DU;G`2g8wLV0o8`-e260mY_$No1k+Bw_4Rchdf#8|+(15-hXMe#Qz~d;m6#6+ z3%NllAa=Zv_$}M>XT&`~7p*CSu0BPO_MGRWX}JVDvRTYm|6MxlZG5w{4~J#kn1>Gz z_;BCit>Y&(peL1mH4Yd&52H$uOW5Ce@LaMJESCK&=n7sAi37rbdb_&u4!}B_Pz%^T zXc1ZhZFlt`4Lghilly^AT?e~rlP{5576-oc}}Iu1@g6B}rn{B&k!jI{s><%5(CKH2kE9m79O&2#yDHywrZv z52U~kaUvfAO}GhPv0(KojQZ8xe@wCmGmxbm1pMRyzALmkxsoGjk{JbQuYk1tHTyU~ z_y4kIg+tJ`1?tM5*@(1(rB&#~_yKkG4z8=-APZm9#~zDUx`}D4r=^2EWPz`UCTFqu z|FupNp#Nq758(^u!heLV1I2B9;|gBAfVnLqJTTNhZ$nrGg-4#^%XN&}8ra}HaL68r zf%D1%{trVJz5IKCeSzZq7eovK=Ke>eT@?D~Sf7C}x+K#1Oz;=30J)0z(=^_{ty_Kn ztDQ3shjQ)XIGQp?=IyZ_*&0h(+EkOWi$N0;ro+ooXgRh};ZTtb8Y-1UAz3Duow9ez z>lGbKmu+aV91NF|P>xXH=>6UEQ0iRQ`^S5|fA-%D^W1Yk_jBLBZGPVm3Gs z3quWJnsn4V9bz~MYsNly*p$c&LjB%mx!YWLQ?8eW>z}nUpsAg!1nY8T++CVCUA7r? zY3tqGsz@~Cp4}V}ww(8PV6O5o*OPo#)!{3uM96K}&TFj-yrGEOV5s3!=Zfe zqH%F=f1l6y_4&SkzMrrEVt=A7D2ODvvjXy)8ps6Nfh1Y^s75pUv9SQ^PDjxsU>lnt z)2(>k*!%A8>6}nQJFu}llo`*^FqNU@U{SYGZ++WTLRe0_q^F9xEFZ88%u(H2TOB~_ zyz!f$IpEHL2ma!oGLe#NprFzj*m1rInGUnR6q_B>J4o+@e;+5rgy06 zW_d+f*|goZ+y;{eCHzc2F#m*BRX^O5RGT~JenpV%mm}!~5G@iZ4WJC^Ey&OB5md(N z5i?15yKW8cWk#{%xOfFJv3>|S-$dVX$=d#$U>YS=Sb6{cj3Xn?hn_qwfF#qHaVu`_ zBUkW)+-A?7J-vC^*=p<7s!5wZRgKMg@(oEc9r#kwTh%u$D1=M)rhYAlc(!@yf`*8c zLGav5NcR8e=;+wpY#%Rd=JYR+`HqJw{)$I#ghK?Ok{fBD-suA|c!=m0ft8XQ?n1$3 zT9evXAgqFvLa`brL~!Rt-Y&32Tfp$Bs`iUx#6l-^Ss^^$Gx0NYCxs=^0dm@0(bi;E zM#eflCpBwjD=Y5kuR~3J)|5?$JwUs}{D`v#u<>XpBN@l<$`j&X)ZErgS#WHFd|T0H}}UgkQB+p_pb%l?d-iUd)(2vV7W#V0!MvPO%R^BR)~cdFJ6c?fOjJ0+t~^O zD_l-erQ`941Ux%$^r93xS$ZzrvRhx2+{RT3O2i-9LieqcjL83V9aUPCnDh8K$$5lPnGcI)o`8fm+Pou5gK83 z5^RM?+cZlpr0(WFl8DE5b4W;iFCUaKJ2YyP+NxxEe+JQkF!xckSlbRfx+`N*KC$Od2t|C{=!T~a;`t%&q&~LcTPQe2;A%Qe8l9FlET_88r z^#;A8>&%VUj3JZJi4IiW;@K-4$~+4p8`3sFy8oWzH6;HkenGpS^j+DOpiK#2OF?Zc3H7o< zN$2Iblpbb+=L)o^PfsqativKkU ziS@(7sXqbb4vyhRI{7E|u0V0HSV`h(zyUgQ^mGj4`e6N8po*@%Y&9oU$*#1& zQ(_t9_P&fuP@Xs>D!j-3bysO_k6$}o)1^@=@MVIlCu*X3t3UJVcD`8w=oz0^0z6Ge z;1EdAS1--7o9EZ{(i5BesguV@uRW&FP{%d0dExC*0QUc`URT7 zyN^dGwe;o+By=Qwvidwen4eZj@V;eMD><%_l<;~xKZ(z?BE-V1QdxiIIPe%ct8n)W zqt!dXC6V3o|Bu@fM>r9?!b2vsq2^n@t+MpNm?~ub;Y7jNNbvXa6gR69(^@xApxfD6TmQM&%gf8)_~N!gIcI77wEGOsMv+ z4cZh>sJ*i0-=}J$RzsOlbFZ+=s$pPypwIJGN{Z-aY1|hR6SKp^!{Y+YS}3f6F>?Fs zLc2%G03^!jy8=K!9SKJ9 Date: Thu, 9 Jul 2020 16:37:48 -0700 Subject: [PATCH 004/645] Initial Commit (#3) --- flytectl/.github/workflows/release.yml | 25 + flytectl/.gitignore | 6 + flytectl/.goreleaser.yml | 172 +++++++ flytectl/CODEOWNERS | 3 + flytectl/Makefile | 2 + flytectl/cmd/config/config.go | 21 + flytectl/cmd/config/config_flags.go | 47 ++ flytectl/cmd/config/config_flags_test.go | 146 ++++++ flytectl/cmd/core/cmd.go | 36 ++ flytectl/cmd/core/cmd_ctx.go | 21 + flytectl/cmd/core/types.go | 5 + flytectl/cmd/get/get.go | 59 +++ flytectl/cmd/root.go | 59 +++ flytectl/cmd/testdata/config.yaml | 3 + flytectl/cmd/version.go | 17 + flytectl/config.yaml | 6 + flytectl/go.mod | 19 + flytectl/go.sum | 551 +++++++++++++++++++++++ flytectl/main.go | 9 + 19 files changed, 1207 insertions(+) create mode 100644 flytectl/.github/workflows/release.yml create mode 100644 flytectl/.gitignore create mode 100644 flytectl/.goreleaser.yml create mode 100644 flytectl/CODEOWNERS create mode 100644 flytectl/Makefile create mode 100644 flytectl/cmd/config/config.go create mode 100755 flytectl/cmd/config/config_flags.go create mode 100755 flytectl/cmd/config/config_flags_test.go create mode 100644 flytectl/cmd/core/cmd.go create mode 100644 flytectl/cmd/core/cmd_ctx.go create mode 100644 flytectl/cmd/core/types.go create mode 100644 flytectl/cmd/get/get.go create mode 100644 flytectl/cmd/root.go create mode 100644 flytectl/cmd/testdata/config.yaml create mode 100644 flytectl/cmd/version.go create mode 100644 flytectl/config.yaml create mode 100644 flytectl/go.mod create mode 100644 flytectl/go.sum create mode 100644 flytectl/main.go diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml new file mode 100644 index 0000000000..eae1b92b0b --- /dev/null +++ b/flytectl/.github/workflows/release.yml @@ -0,0 +1,25 @@ +name: goreleaser + +on: + pull_request: + push: + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Unshallow + run: git fetch --prune --unshallow + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.14 + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v2 + with: + version: latest + args: release --rm-dist + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/flytectl/.gitignore b/flytectl/.gitignore new file mode 100644 index 0000000000..8d862b62ca --- /dev/null +++ b/flytectl/.gitignore @@ -0,0 +1,6 @@ +dist/ +.idea +vendor +bin +.DS_Store +_test diff --git a/flytectl/.goreleaser.yml b/flytectl/.goreleaser.yml new file mode 100644 index 0000000000..6f8f237da5 --- /dev/null +++ b/flytectl/.goreleaser.yml @@ -0,0 +1,172 @@ +before: + hooks: + - go mod download +builds: + - env: + - CGO_ENABLED=0 + main: ./main.go + binary: flytectl + goos: + - linux + - windows + - darwin + ldflags: + - -s -w -X github.com/lyft/flytestdlib/version.Version={{.Version}} -X github.com/lyft/flytestdlib/version.Build={{.ShortCommit}} -X github.com/lyft/flytestdlib/version.BuildTime={{.Date}} +archives: + - replacements: + darwin: macOS + linux: Linux + windows: Windows + 386: i386 + amd64: x86_64 + format_overrides: + - goos: windows + format: zip +checksum: + name_template: 'checksums.txt' +snapshot: + name_template: "{{ .Tag }}-next" +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' +scoop: + # Default is "https://github.com///releases/download/{{ .Tag }}/{{ .ArtifactName }}" + # url_template: "http://github.mycompany.com/foo/bar/releases/{{ .Tag }}/{{ .ArtifactName }}" + + # Repository to push the app manifest to. + bucket: + owner: lyft + name: flytectl + + # Git author used to commit to the repository. + # Defaults are shown. + commit_author: + name: goreleaserbot + email: goreleaser@carlosbecker.com + + # Your app's homepage. + # Default is empty. + homepage: "https://godoc.org/github.com/lyft/flytectl" + + # Your app's description. + # Default is empty. + description: "FlyteCtl is a command line tool to interact with a Flyte cluster." + + # Your app's license + # Default is empty. + license: Apache-2.0 + + # Persist data between application updates + persist: + - "data" + - "config.toml" +brews: + - # Name template of the recipe + # Default to project name + name: flytectl + + # IDs of the archives to use. + # Defaults to all. + # ids: + # - foo + # - bar + + # GOARM to specify which 32-bit arm version to use if there are multiple versions + # from the build section. Brew formulas support atm only one 32-bit version. + # Default is 6 for all artifacts or each id if there a multiple versions. + goarm: 6 + + # NOTE: make sure the url_template, the token and given repo (github or gitlab) owner and name are from the + # same kind. We will probably unify this in the next major version like it is done with scoop. + + # Github repository to push the tap to. + github: + owner: github-user + name: homebrew-tap + + # OR Gitlab + # gitlab: + # owner: gitlab-user + # name: homebrew-tap + + # Gitea is not supported yet, but the support coming + + # Template for the url which is determined by the given Token (github or gitlab) + # Default for github is "https://github.com///releases/download/{{ .Tag }}/{{ .ArtifactName }}" + # Default for gitlab is "https://gitlab.com///uploads/{{ .ArtifactUploadHash }}/{{ .ArtifactName }}" + url_template: "http://github.com/lyft/flytectl/releases/{{ .Tag }}/{{ .ArtifactName }}" + + # Allows you to set a custom download strategy. Note that you'll need + # to implement the strategy and add it to your tap repository. + # Example: https://docs.brew.sh/Formula-Cookbook#specifying-the-download-strategy-explicitly + # Default is empty. + download_strategy: CurlDownloadStrategy. + + # Allows you to add a custom require_relative at the top of the formula template + # Default is empty + custom_require: custom_download_strategy + + # Git author used to commit to the repository. + # Defaults are shown. + commit_author: + name: goreleaserbot + email: goreleaser@carlosbecker.com + + # Folder inside the repository to put the formula. + # Default is the root folder. + folder: Formula + + # Caveats for the user of your binary. + # Default is empty. + caveats: "How to use this binary" + + # Your app's homepage. + # Default is empty. + homepage: "https://godoc.org/github.com/lyft/flytectl" + + # Your app's description. + # Default is empty. + description: "FlyteCtl is a command line tool to interact with a Flyte cluster." + + # Setting this will prevent goreleaser to actually try to commit the updated + # formula - instead, the formula file will be stored on the dist folder only, + # leaving the responsibility of publishing it to the user. + # If set to auto, the release will not be uploaded to the homebrew tap + # in case there is an indicator for prerelease in the tag e.g. v1.0.0-rc1 + # Default is false. + skip_upload: auto + + # Custom block for brew. + # Can be used to specify alternate downloads for devel or head releases. + # Default is empty. + # custom_block: | + # head "https://github.com/some/package.git" + # ... + + # Packages your package depends on. + # dependencies: + # - name: git + # - name: zsh + # type: optional + + # Packages that conflict with your package. + # conflicts: + # - svn + # - bash + + # Specify for packages that run as a service. + # Default is empty. + # plist: | + # + # ... + + # So you can `brew test` your formula. + # Default is empty. + test: system "#{bin}/program --version" + + # Custom install script for brew. + # Default is 'bin.install "program"'. + install: bin.install "program" diff --git a/flytectl/CODEOWNERS b/flytectl/CODEOWNERS new file mode 100644 index 0000000000..78dadcf414 --- /dev/null +++ b/flytectl/CODEOWNERS @@ -0,0 +1,3 @@ +# These owners will be the default owners for everything in +# the repo. Unless a later match takes precedence. +* @kumare3 @enghabu @wild-endeavor diff --git a/flytectl/Makefile b/flytectl/Makefile new file mode 100644 index 0000000000..73c7355ac8 --- /dev/null +++ b/flytectl/Makefile @@ -0,0 +1,2 @@ +generate: + go test github.com/lyft/flytectl/cmd --update \ No newline at end of file diff --git a/flytectl/cmd/config/config.go b/flytectl/cmd/config/config.go new file mode 100644 index 0000000000..69643ddb8b --- /dev/null +++ b/flytectl/cmd/config/config.go @@ -0,0 +1,21 @@ +package config + +import ( + "github.com/lyft/flytestdlib/config" +) + +//go:generate pflags Config + +var ( + defaultConfig = &Config{} + section = config.MustRegisterSection("root", defaultConfig) +) + +type Config struct { + Project string `json:"project" pflag:",Specifies the project to work on."` + Domain string `json:"domain" pflag:",Specified the domain to work on."` +} + +func GetConfig() *Config { + return section.GetConfig().(*Config) +} diff --git a/flytectl/cmd/config/config_flags.go b/flytectl/cmd/config/config_flags.go new file mode 100755 index 0000000000..a6986a23b2 --- /dev/null +++ b/flytectl/cmd/config/config_flags.go @@ -0,0 +1,47 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package config + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.String(fmt.Sprintf("%v%v", prefix, "project"), defaultConfig.Project, "Specifies the project to work on.") + cmdFlags.String(fmt.Sprintf("%v%v", prefix, "domain"), defaultConfig.Domain, "Specified the domain to work on.") + return cmdFlags +} diff --git a/flytectl/cmd/config/config_flags_test.go b/flytectl/cmd/config/config_flags_test.go new file mode 100755 index 0000000000..1297f83032 --- /dev/null +++ b/flytectl/cmd/config/config_flags_test.go @@ -0,0 +1,146 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package config + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_Config(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_Config(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) +} + +func testDecodeSlice_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) +} + +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_project", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("project"); err == nil { + assert.Equal(t, string(defaultConfig.Project), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("project", testValue) + if vString, err := cmdFlags.GetString("project"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Project) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_domain", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("domain"); err == nil { + assert.Equal(t, string(defaultConfig.Domain), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("domain", testValue) + if vString, err := cmdFlags.GetString("domain"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Domain) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go new file mode 100644 index 0000000000..0185772b4c --- /dev/null +++ b/flytectl/cmd/core/cmd.go @@ -0,0 +1,36 @@ +package core + +import ( + "context" + "fmt" + + "github.com/lyft/flyteidl/clients/go/admin" + "github.com/spf13/cobra" +) + +func AddCommands(rootCmd *cobra.Command, cmdFuncs map[string]CommandFunc) { + for resource, getFunc := range cmdFuncs { + cmd := &cobra.Command{ + Use: resource, + Short: fmt.Sprintf("Retrieves %v resources.", resource), + RunE: generateCommandFunc(getFunc), + } + + rootCmd.AddCommand(cmd) + } +} + +func generateCommandFunc(cmdFunc CommandFunc) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + adminClient, err := admin.InitializeAdminClientFromConfig(ctx) + if err != nil { + return err + } + + return cmdFunc(ctx, args, CommandContext{ + out: cmd.OutOrStdout(), + adminClient: adminClient, + }) + } +} diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go new file mode 100644 index 0000000000..4c4b8d3b21 --- /dev/null +++ b/flytectl/cmd/core/cmd_ctx.go @@ -0,0 +1,21 @@ +package core + +import ( + "io" + + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/service" +) + +type CommandContext struct { + adminClient service.AdminServiceClient + in io.Reader + out io.Writer +} + +func (c CommandContext) AdminClient() service.AdminServiceClient { + return c.adminClient +} + +func (c CommandContext) OutputPipe() io.Writer { + return c.out +} diff --git a/flytectl/cmd/core/types.go b/flytectl/cmd/core/types.go new file mode 100644 index 0000000000..f6c3cfacc7 --- /dev/null +++ b/flytectl/cmd/core/types.go @@ -0,0 +1,5 @@ +package core + +import "context" + +type CommandFunc func(ctx context.Context, args []string, cmdCtx CommandContext) error diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go new file mode 100644 index 0000000000..a0d9f56faa --- /dev/null +++ b/flytectl/cmd/get/get.go @@ -0,0 +1,59 @@ +package get + +import ( + "context" + + "github.com/lyft/flytectl/cmd/core" + + "github.com/lyft/flytestdlib/logger" + + "github.com/landoop/tableprinter" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/spf13/cobra" +) + +func CreateGetCommand() *cobra.Command { + getCmd := &cobra.Command{ + Use: "get", + Short: "Retrieve various resource.", + } + + getResourcesFuncs := map[string]core.CommandFunc{ + "projects": getProjectsFunc, + } + + core.AddCommands(getCmd, getResourcesFuncs) + + return getCmd +} + +func getProjectsFunc(ctx context.Context, args []string, cmdCtx core.CommandContext) error { + projects, err := cmdCtx.AdminClient().ListProjects(ctx, &admin.ProjectListRequest{}) + if err != nil { + return err + } + + logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) + printer := tableprinter.New(cmdCtx.OutputPipe()) + printer.Print(toPrintableProjects(projects.Projects)) + return nil +} + +func toPrintableProjects(projects []*admin.Project) []interface{} { + type printableProject struct { + Id string `header:"Id"` + Name string `header:"Name"` + Description string `header:"Description"` + } + + res := make([]interface{}, 0, len(projects)) + for _, p := range projects { + res = append(res, printableProject{ + Id: p.Id, + Name: p.Name, + Description: p.Description, + }) + } + + return res +} diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go new file mode 100644 index 0000000000..c0cc9d100e --- /dev/null +++ b/flytectl/cmd/root.go @@ -0,0 +1,59 @@ +package cmd + +import ( + "context" + + "github.com/lyft/flytectl/cmd/get" + + "github.com/lyft/flytectl/cmd/config" + stdConfig "github.com/lyft/flytestdlib/config" + "github.com/lyft/flytestdlib/config/viper" + "github.com/spf13/cobra" +) + +var ( + cfgFile string + configAccessor = viper.NewAccessor(stdConfig.Options{StrictMode: true}) +) + + +func newRootCmd() *cobra.Command { + rootCmd := &cobra.Command{ + PersistentPreRunE: initConfig, + } + + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", + "config file (default is $HOME/config.yaml)") + + configAccessor.InitializePflags(rootCmd.PersistentFlags()) + + // Due to https://github.com/lyft/flyte/issues/341, project flag will have to be specified as + // --root.project, this adds a convenience on top to allow --project to be used + rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Project), "project", "p", "", "Specifies the Flyte project.") + rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Domain), "domain", "d", "", "Specifies the Flyte project's domain.") + + rootCmd.AddCommand(viper.GetConfigCommand()) + rootCmd.AddCommand(versionCmd) + rootCmd.AddCommand(get.CreateGetCommand()) + config.GetConfig() + + return rootCmd +} + +func initConfig(_ *cobra.Command, _ []string) error { + configAccessor = viper.NewAccessor(stdConfig.Options{ + StrictMode: true, + SearchPaths: []string{cfgFile}, + }) + + err := configAccessor.UpdateConfig(context.TODO()) + if err != nil { + return err + } + + return nil +} + +func ExecuteCmd() error { + return newRootCmd().Execute() +} diff --git a/flytectl/cmd/testdata/config.yaml b/flytectl/cmd/testdata/config.yaml new file mode 100644 index 0000000000..5aa315c512 --- /dev/null +++ b/flytectl/cmd/testdata/config.yaml @@ -0,0 +1,3 @@ +admin: + endpoint: http://localhost:30082 + insecure: true diff --git a/flytectl/cmd/version.go b/flytectl/cmd/version.go new file mode 100644 index 0000000000..b24cc3a63f --- /dev/null +++ b/flytectl/cmd/version.go @@ -0,0 +1,17 @@ +package cmd + +import ( + "github.com/lyft/flytestdlib/version" + "github.com/spf13/cobra" +) + +var ( + versionCmd = &cobra.Command{ + Use: "version", + Short: "Displays version information for the client and server.", + Run: func(cmd *cobra.Command, args []string) { + version.LogBuildInformation("flytectl") + // TODO: Log Admin version + }, + } +) diff --git a/flytectl/config.yaml b/flytectl/config.yaml new file mode 100644 index 0000000000..117944914b --- /dev/null +++ b/flytectl/config.yaml @@ -0,0 +1,6 @@ +admin: + endpoint: http://localhost:30082 + insecure: true +logger: + show-source: true + level: 1 diff --git a/flytectl/go.mod b/flytectl/go.mod new file mode 100644 index 0000000000..309f5188b6 --- /dev/null +++ b/flytectl/go.mod @@ -0,0 +1,19 @@ +module github.com/lyft/flytectl + +go 1.13 + +require ( + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 // indirect + github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1 + github.com/lyft/flyteidl v0.17.32 + github.com/lyft/flytestdlib v0.3.0 + github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mitchellh/mapstructure v1.1.2 + github.com/spf13/afero v1.2.2 // indirect + github.com/spf13/cobra v0.0.5 + github.com/spf13/pflag v1.0.5 + github.com/stretchr/testify v1.4.0 + golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 // indirect + k8s.io/apimachinery v0.18.3 // indirect +) diff --git a/flytectl/go.sum b/flytectl/go.sum new file mode 100644 index 0000000000..3a0298d3a3 --- /dev/null +++ b/flytectl/go.sum @@ -0,0 +1,551 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.4/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.28.9/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coocood/freecache v1.1.0/go.mod h1:ePwxCDzOYvARfHdr1pByNct1at3CoKnsipOHwKlNbzI= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783 h1:SmsgwFZy9pdTk/k8BZz40D3P5umP5+Ejt3hAi0paBNQ= +github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/graymeta/stow v0.2.4/go.mod h1:+0vRL9oMECKjPMP7OeVWl8EIqRCpFwDlth3mrAeV2Kw= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.2 h1:D0EVSTwQoQOyfY35QNSuPJA4jpZRtkoGYWQMB7XNg5o= +github.com/grpc-ecosystem/grpc-gateway v1.12.2/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb v1.7.9/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 h1:M8exrBzuhWcU6aoHJlHWPe4qFjVKzkMGRal78f5jRRU= +github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23/go.mod h1:kBSna6b0/RzsOcOZf515vAXwSsXYusl2U7SA0XP09yI= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1 h1:SH30nioTpP0VaCYafgUw+iS1EfJTDbtAeBcByEFqFrY= +github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= +github.com/lyft/flyteidl v0.17.32 h1:Iio3gYjTyPhAiOMWJ/H/4YtfWIZm5KZSlWMULT1Ef6U= +github.com/lyft/flyteidl v0.17.32/go.mod h1:/zQXxuHO11u/saxTTZc8oYExIGEShXB+xCB1/F1Cu20= +github.com/lyft/flytestdlib v0.3.0 h1:nIkX4MlyYdcLLzaF35RI2P5BhARt+qMgHoFto8eVNzU= +github.com/lyft/flytestdlib v0.3.0/go.mod h1:LJPPJlkFj+wwVWMrQT3K5JZgNhZi2mULsCG4ZYhinhU= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/uuid v1.2.0/go.mod h1:B8HLsPLik/YNn6KKWVMDJ8nzCL8RP5WyfsnmvnAEwIU= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= +github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200117160349-530e935923ad h1:Jh8cai0fqIK+f6nG0UgPW5wFk8wmiMhM3AyciDBdtQg= +golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200124170513-3f4d10fc73b4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150 h1:VPpdpQkGvFicX9yo4G5oxZPi9ALBnEOZblPSa/Wa2m4= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.1 h1:GyboHr4UqMiLUybYjd22ZjQIKEJEpgtLXtuGbR21Oho= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= +gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= +k8s.io/apimachinery v0.17.2 h1:hwDQQFbdRlpnnsR64Asdi55GyCaIP/3WQpMmbNBeWr4= +k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apimachinery v0.18.3 h1:pOGcbVAhxADgUYnjS08EFXs9QMl8qaH5U4fr5LGUrSk= +k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o= +k8s.io/client-go v11.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/flytectl/main.go b/flytectl/main.go new file mode 100644 index 0000000000..d6dbf7f4ad --- /dev/null +++ b/flytectl/main.go @@ -0,0 +1,9 @@ +package main + +import "github.com/lyft/flytectl/cmd" + +func main() { + if err := cmd.ExecuteCmd(); err != nil { + panic(err) + } +} From c17ee3badb26149e480523f22b3c8dffffce3910 Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Thu, 16 Jul 2020 21:15:56 -0700 Subject: [PATCH 005/645] GH workflow change - publish binary when tag is pushed (#5) --- flytectl/.github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml index eae1b92b0b..db015f442f 100644 --- a/flytectl/.github/workflows/release.yml +++ b/flytectl/.github/workflows/release.yml @@ -1,8 +1,9 @@ name: goreleaser on: - pull_request: push: + tags: + - '*' jobs: goreleaser: From 8774f00dbba78ea084e51b3511919cb3007f7943 Mon Sep 17 00:00:00 2001 From: brucearctor <5032356+brucearctor@users.noreply.github.com> Date: Mon, 3 Aug 2020 09:39:28 -0700 Subject: [PATCH 006/645] initial contributing (#8) --- flytectl/README.md | 3 +++ flytectl/docs/CONTRIBUTING.md | 15 +++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 flytectl/docs/CONTRIBUTING.md diff --git a/flytectl/README.md b/flytectl/README.md index 4e55a2acea..dfe4413421 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -1,2 +1,5 @@ # flytectl Flyte CLI + + +[Contribution guidelines for this project](docs/CONTRIBUTING.md) diff --git a/flytectl/docs/CONTRIBUTING.md b/flytectl/docs/CONTRIBUTING.md new file mode 100644 index 0000000000..0249359719 --- /dev/null +++ b/flytectl/docs/CONTRIBUTING.md @@ -0,0 +1,15 @@ +# Developing FlyteCtl + +A local cluster can be setup via --> https://lyft.github.io/flyte/administrator/install/getting_started.html#getting-started + +Then, if having trouble connecting to local cluster see the following: + +#1) Find/Set/Verify gRPC port for your local Flyte service: + +FLYTECTL_GRPC_PORT=`kubectl get service -n flyte flyteadmin -o json | jq '.spec.ports[] | select(.name=="grpc").port'` +#2) Setup Port forwarding: kubectl port-forward -n flyte service/flyteadmin 8081:$FLYTECTL_GRPC_PORT + +and #3) Update config line in https://github.com/lyft/flytectl/blob/master/config.yaml to dns:///localhost:8081 + + + From 2811f53f24238895d9c4ea9351437797058cae34 Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Wed, 23 Sep 2020 02:53:03 +0530 Subject: [PATCH 007/645] Feature/get workflow,Task,Domain,Project (#9) --- flytectl/.golangci.yml | 30 ++ flytectl/cmd/config/config.go | 1 + flytectl/cmd/config/config_flags.go | 1 + flytectl/cmd/core/cmd.go | 3 +- flytectl/cmd/core/cmd_ctx.go | 2 +- flytectl/cmd/core/types.go | 2 +- flytectl/cmd/get/get.go | 45 +-- flytectl/cmd/get/project.go | 56 +++ flytectl/cmd/get/task.go | 78 ++++ flytectl/cmd/get/types.go | 23 ++ flytectl/cmd/get/workflow.go | 72 ++++ flytectl/cmd/root.go | 2 +- flytectl/go.mod | 6 +- flytectl/go.sum | 551 ---------------------------- flytectl/pkg/printer/printer.go | 78 ++++ 15 files changed, 352 insertions(+), 598 deletions(-) create mode 100644 flytectl/.golangci.yml create mode 100644 flytectl/cmd/get/project.go create mode 100644 flytectl/cmd/get/task.go create mode 100644 flytectl/cmd/get/types.go create mode 100644 flytectl/cmd/get/workflow.go delete mode 100644 flytectl/go.sum create mode 100644 flytectl/pkg/printer/printer.go diff --git a/flytectl/.golangci.yml b/flytectl/.golangci.yml new file mode 100644 index 0000000000..80deaf81f6 --- /dev/null +++ b/flytectl/.golangci.yml @@ -0,0 +1,30 @@ +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst + +run: + skip-dirs: + - pkg/client + +linters: + disable-all: true + enable: + - deadcode + - errcheck + - gas + - goconst + - goimports + - golint + - gosimple + - govet + - ineffassign + - misspell + - nakedret + - staticcheck + - structcheck + - typecheck + - unconvert + - unparam + - unused + - varcheck \ No newline at end of file diff --git a/flytectl/cmd/config/config.go b/flytectl/cmd/config/config.go index 69643ddb8b..59fd7d8701 100644 --- a/flytectl/cmd/config/config.go +++ b/flytectl/cmd/config/config.go @@ -14,6 +14,7 @@ var ( type Config struct { Project string `json:"project" pflag:",Specifies the project to work on."` Domain string `json:"domain" pflag:",Specified the domain to work on."` + Output string `json:"output" pflag:",Specified the output type."` } func GetConfig() *Config { diff --git a/flytectl/cmd/config/config_flags.go b/flytectl/cmd/config/config_flags.go index a6986a23b2..2722dde8f8 100755 --- a/flytectl/cmd/config/config_flags.go +++ b/flytectl/cmd/config/config_flags.go @@ -43,5 +43,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) cmdFlags.String(fmt.Sprintf("%v%v", prefix, "project"), defaultConfig.Project, "Specifies the project to work on.") cmdFlags.String(fmt.Sprintf("%v%v", prefix, "domain"), defaultConfig.Domain, "Specified the domain to work on.") + cmdFlags.String(fmt.Sprintf("%v%v", prefix, "output"), defaultConfig.Domain, "Specified the output type.") return cmdFlags } diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 0185772b4c..6be3653c34 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -1,4 +1,4 @@ -package core +package cmdcore import ( "context" @@ -27,7 +27,6 @@ func generateCommandFunc(cmdFunc CommandFunc) func(cmd *cobra.Command, args []st if err != nil { return err } - return cmdFunc(ctx, args, CommandContext{ out: cmd.OutOrStdout(), adminClient: adminClient, diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go index 4c4b8d3b21..7fb1541251 100644 --- a/flytectl/cmd/core/cmd_ctx.go +++ b/flytectl/cmd/core/cmd_ctx.go @@ -1,4 +1,4 @@ -package core +package cmdcore import ( "io" diff --git a/flytectl/cmd/core/types.go b/flytectl/cmd/core/types.go index f6c3cfacc7..dbb0b9d42a 100644 --- a/flytectl/cmd/core/types.go +++ b/flytectl/cmd/core/types.go @@ -1,4 +1,4 @@ -package core +package cmdcore import "context" diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index a0d9f56faa..c4071ee6d5 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -1,14 +1,8 @@ package get import ( - "context" - "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytestdlib/logger" - - "github.com/landoop/tableprinter" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" "github.com/spf13/cobra" ) @@ -18,42 +12,13 @@ func CreateGetCommand() *cobra.Command { Short: "Retrieve various resource.", } - getResourcesFuncs := map[string]core.CommandFunc{ - "projects": getProjectsFunc, + getResourcesFuncs := map[string]cmdcore.CommandFunc{ + "projects": getProjectsFunc, + "tasks": getTaskFunc, + "workflows": getWorkflowFunc, } - core.AddCommands(getCmd, getResourcesFuncs) + cmdcore.AddCommands(getCmd, getResourcesFuncs) return getCmd } - -func getProjectsFunc(ctx context.Context, args []string, cmdCtx core.CommandContext) error { - projects, err := cmdCtx.AdminClient().ListProjects(ctx, &admin.ProjectListRequest{}) - if err != nil { - return err - } - - logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) - printer := tableprinter.New(cmdCtx.OutputPipe()) - printer.Print(toPrintableProjects(projects.Projects)) - return nil -} - -func toPrintableProjects(projects []*admin.Project) []interface{} { - type printableProject struct { - Id string `header:"Id"` - Name string `header:"Name"` - Description string `header:"Description"` - } - - res := make([]interface{}, 0, len(projects)) - for _, p := range projects { - res = append(res, printableProject{ - Id: p.Id, - Name: p.Name, - Description: p.Description, - }) - } - - return res -} diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go new file mode 100644 index 0000000000..a576f3f20b --- /dev/null +++ b/flytectl/cmd/get/project.go @@ -0,0 +1,56 @@ +package get + +import ( + "context" + "github.com/lyft/flytectl/cmd/config" + "encoding/json" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flytectl/pkg/printer" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/lyft/flytestdlib/logger" +) + +type PrintableProject struct { + Id string `header:"Id"` + Name string `header:"Name"` + Description string `header:"Description"` +} + +var tableStructure = map[string]string{ + "Id" : "$.id", + "Name" : "$.name", + "Description" : "$.description", +} + + +func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + adminPrinter := printer.Printer{} + + transformProject := func(jsonbody [] byte)(interface{},error){ + results := PrintableProject{} + if err := json.Unmarshal(jsonbody, &results); err != nil { + return results,err + } + return results,nil + } + if len(args) == 1 { + projects, err := cmdCtx.AdminClient().ListProjects(ctx, &admin.ProjectListRequest{}) + if err != nil { + return err + } + logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) + for _, v := range projects.Projects { + if v.Name == args[0] { + adminPrinter.Print(config.GetConfig().Output, projects.Projects,tableStructure,transformProject) + } + } + return nil + } + projects, err := cmdCtx.AdminClient().ListProjects(ctx, &admin.ProjectListRequest{}) + if err != nil { + return err + } + logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) + adminPrinter.Print(config.GetConfig().Output, projects.Projects,tableStructure,transformProject) + return nil +} diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go new file mode 100644 index 0000000000..70f5126add --- /dev/null +++ b/flytectl/cmd/get/task.go @@ -0,0 +1,78 @@ +package get + +import ( + "context" + "encoding/json" + "fmt" + "github.com/lyft/flytectl/cmd/config" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flytectl/pkg/printer" + "github.com/lyft/flytestdlib/logger" + + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" +) + +type PrintableTask struct { + Version string `header:"Version"` + Name string `header:"Name"` + Type string `header:"Type"` + Discoverable bool `header:"Discoverable"` + DiscoveryVersion string `header:"DiscoveryVersion"` +} + +var taskStructure = map[string]string{ + "Version" : "$.id.version", + "Name" : "$.id.name", + "Type" : "$.closure.compiledTask.template.type", + "Discoverable" : "$.closure.compiledTask.template.metadata.discoverable", + "DiscoveryVersion" : "$.closure.compiledTask.template.metadata.discovery_version", +} + +var transformTask = func(jsonbody [] byte)(interface{},error){ + results := PrintableTask{} + if err := json.Unmarshal(jsonbody, &results); err != nil { + return results,err + } + return results,nil +} + +func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + if config.GetConfig().Project == "" { + return fmt.Errorf("Please set project name to get domain") + } + if config.GetConfig().Domain == "" { + return fmt.Errorf("Please set project name to get workflow") + } + taskPrinter := printer.Printer{ + } + + if len(args) == 1 { + task, err := cmdCtx.AdminClient().ListTasks(ctx, &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: args[0], + }, + Limit: 10, + }) + if err != nil { + return err + } + logger.Debugf(ctx, "Retrieved Task", task.Tasks) + + taskPrinter.Print(config.GetConfig().Output, task.Tasks,taskStructure,transformTask) + return nil + } + + tasks, err := cmdCtx.AdminClient().ListTaskIds(ctx, &admin.NamedEntityIdentifierListRequest{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Limit: 3, + }) + if err != nil { + return err + } + logger.Debugf(ctx, "Retrieved %v Task", len(tasks.Entities)) + taskPrinter.Print(config.GetConfig().Output, tasks.Entities,entityStructure,transformTaskEntity) + return nil +} diff --git a/flytectl/cmd/get/types.go b/flytectl/cmd/get/types.go new file mode 100644 index 0000000000..a73547bf81 --- /dev/null +++ b/flytectl/cmd/get/types.go @@ -0,0 +1,23 @@ +package get + +import "encoding/json" + +type PrintableNamedEntityIdentifier struct { + Name string `header:"Name"` + Project string `header:"Project"` + Domain string `header:"Domain"` +} + +var entityStructure = map[string]string{ + "Domain" : "$.domain", + "Name" : "$.name", + "Project" : "$.project", +} + +var transformTaskEntity = func(jsonbody [] byte)(interface{},error){ + results := PrintableNamedEntityIdentifier{} + if err := json.Unmarshal(jsonbody, &results); err != nil { + return results,err + } + return results,nil +} diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go new file mode 100644 index 0000000000..6ef2fe77dd --- /dev/null +++ b/flytectl/cmd/get/workflow.go @@ -0,0 +1,72 @@ +package get + +import ( + "context" + "encoding/json" + "fmt" + "github.com/lyft/flytectl/cmd/config" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flytectl/pkg/printer" + "github.com/lyft/flytestdlib/logger" + + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" +) + +var workflowStructure = map[string]string{ + "Version" : "$.id.version", + "Name" : "$.id.name", +} + +type PrintableWorkflow struct { + Name string `header:"Name"` + Version string `header:"Version"` +} + +var transformWorkflow = func(jsonbody [] byte)(interface{},error){ + results := PrintableWorkflow{} + if err := json.Unmarshal(jsonbody, &results); err != nil { + return results,err + } + return results,nil +} + + +func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + if config.GetConfig().Project == "" { + return fmt.Errorf("Please set project name to get domain") + } + if config.GetConfig().Domain == "" { + return fmt.Errorf("Please set project name to get workflow") + } + adminPrinter := printer.Printer{ + } + if len(args) > 0 { + workflows, err := cmdCtx.AdminClient().ListWorkflows(ctx, &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: args[0], + }, + Limit: 10, + }) + if err != nil { + return err + } + logger.Debugf(ctx, "Retrieved %v workflows", len(workflows.Workflows)) + + adminPrinter.Print(config.GetConfig().Output, workflows.Workflows,workflowStructure,transformWorkflow) + return nil + } + workflows, err := cmdCtx.AdminClient().ListWorkflowIds(ctx, &admin.NamedEntityIdentifierListRequest{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Limit: 10, + }) + if err != nil { + return err + } + logger.Debugf(ctx, "Retrieved %v workflows", len(workflows.Entities)) + + adminPrinter.Print(config.GetConfig().Output, workflows.Entities,entityStructure,transformTaskEntity) + return nil +} diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index c0cc9d100e..a266ca9856 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -16,7 +16,6 @@ var ( configAccessor = viper.NewAccessor(stdConfig.Options{StrictMode: true}) ) - func newRootCmd() *cobra.Command { rootCmd := &cobra.Command{ PersistentPreRunE: initConfig, @@ -31,6 +30,7 @@ func newRootCmd() *cobra.Command { // --root.project, this adds a convenience on top to allow --project to be used rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Project), "project", "p", "", "Specifies the Flyte project.") rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Domain), "domain", "d", "", "Specifies the Flyte project's domain.") + rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Output), "output", "o", "table", "Specifies the output type") rootCmd.AddCommand(viper.GetConfigCommand()) rootCmd.AddCommand(versionCmd) diff --git a/flytectl/go.mod b/flytectl/go.mod index 309f5188b6..468b3ef403 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -4,16 +4,18 @@ go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect + github.com/golang/protobuf v1.3.2 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 // indirect github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1 - github.com/lyft/flyteidl v0.17.32 - github.com/lyft/flytestdlib v0.3.0 + github.com/lyft/flyteidl v0.18.1 + github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/mapstructure v1.1.2 github.com/spf13/afero v1.2.2 // indirect github.com/spf13/cobra v0.0.5 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.4.0 + github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 // indirect k8s.io/apimachinery v0.18.3 // indirect ) diff --git a/flytectl/go.sum b/flytectl/go.sum deleted file mode 100644 index 3a0298d3a3..0000000000 --- a/flytectl/go.sum +++ /dev/null @@ -1,551 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v38.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.4/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.28.9/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coocood/freecache v1.1.0/go.mod h1:ePwxCDzOYvARfHdr1pByNct1at3CoKnsipOHwKlNbzI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783 h1:SmsgwFZy9pdTk/k8BZz40D3P5umP5+Ejt3hAi0paBNQ= -github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/graymeta/stow v0.2.4/go.mod h1:+0vRL9oMECKjPMP7OeVWl8EIqRCpFwDlth3mrAeV2Kw= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.2 h1:D0EVSTwQoQOyfY35QNSuPJA4jpZRtkoGYWQMB7XNg5o= -github.com/grpc-ecosystem/grpc-gateway v1.12.2/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb v1.7.9/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 h1:M8exrBzuhWcU6aoHJlHWPe4qFjVKzkMGRal78f5jRRU= -github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23/go.mod h1:kBSna6b0/RzsOcOZf515vAXwSsXYusl2U7SA0XP09yI= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1 h1:SH30nioTpP0VaCYafgUw+iS1EfJTDbtAeBcByEFqFrY= -github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= -github.com/lyft/flyteidl v0.17.32 h1:Iio3gYjTyPhAiOMWJ/H/4YtfWIZm5KZSlWMULT1Ef6U= -github.com/lyft/flyteidl v0.17.32/go.mod h1:/zQXxuHO11u/saxTTZc8oYExIGEShXB+xCB1/F1Cu20= -github.com/lyft/flytestdlib v0.3.0 h1:nIkX4MlyYdcLLzaF35RI2P5BhARt+qMgHoFto8eVNzU= -github.com/lyft/flytestdlib v0.3.0/go.mod h1:LJPPJlkFj+wwVWMrQT3K5JZgNhZi2mULsCG4ZYhinhU= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= -github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/satori/uuid v1.2.0/go.mod h1:B8HLsPLik/YNn6KKWVMDJ8nzCL8RP5WyfsnmvnAEwIU= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad h1:Jh8cai0fqIK+f6nG0UgPW5wFk8wmiMhM3AyciDBdtQg= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200124170513-3f4d10fc73b4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150 h1:VPpdpQkGvFicX9yo4G5oxZPi9ALBnEOZblPSa/Wa2m4= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.1 h1:GyboHr4UqMiLUybYjd22ZjQIKEJEpgtLXtuGbR21Oho= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= -k8s.io/apimachinery v0.17.2 h1:hwDQQFbdRlpnnsR64Asdi55GyCaIP/3WQpMmbNBeWr4= -k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/apimachinery v0.18.3 h1:pOGcbVAhxADgUYnjS08EFXs9QMl8qaH5U4fr5LGUrSk= -k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o= -k8s.io/client-go v11.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go new file mode 100644 index 0000000000..8462625875 --- /dev/null +++ b/flytectl/pkg/printer/printer.go @@ -0,0 +1,78 @@ +package printer + +import ( + "bytes" + "encoding/json" + "fmt" + "github.com/landoop/tableprinter" + "github.com/yalp/jsonpath" + "os" +) + +type Printer struct{} + +const ( + empty = "" + tab = "\t" +) + +func (p Printer) PrintOutput(output string, i interface{}) { + // Factory Method for all printer + switch output { + case "json": // Print protobuf to json + buffer := new(bytes.Buffer) + encoder := json.NewEncoder(buffer) + encoder.SetIndent(empty, tab) + + err := encoder.Encode(i) + if err != nil { + os.Exit(1) + } + + fmt.Println(buffer.String()) + break + default: // Print table + + printer := tableprinter.New(os.Stdout) + printer.Print(i) + break + } +} + +func(p Printer) BuildOutput(input []interface{},column map[string]string,printTransform func(data []byte)(interface{},error)) ([]interface{},error) { + responses := make([]interface{}, 0, len(input)) + for _, data := range input { + tableData := make(map[string]interface{}) + + for k := range column { + out, _ := jsonpath.Read(data, column[k]) + tableData[k] = out.(string) + } + jsonbody, err := json.Marshal(tableData) + if err != nil { + return responses,err + } + response,err := printTransform(jsonbody) + if err != nil { + return responses,err + } + responses = append(responses, response) + } + return responses,nil +} + +func (p Printer) Print(output string, i interface{},column map[string]string,printTransform func(data []byte)(interface{},error)) { + + var data interface{} + byte, _ := json.Marshal(i) + _ = json.Unmarshal(byte, &data) + if data == nil { + os.Exit(1) + } + input := data.([]interface{}) + response,err := p.BuildOutput(input,column,printTransform) + if err != nil { + os.Exit(1) + } + p.PrintOutput(output, response) +} From 3414946e100c3b7f08818f77a554bf68ce42cfbe Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Wed, 30 Sep 2020 21:20:13 -0700 Subject: [PATCH 008/645] Devflow, boilerplate, improved code, formatting and bug fixes (#11) --- flytectl/.github/workflows/release.yml | 26 - flytectl/.gitignore | 1 + flytectl/.golangci.yml | 4 +- flytectl/Makefile | 12 +- flytectl/adminutils/config.go | 22 + flytectl/adminutils/config_flags.go | 47 ++ flytectl/adminutils/config_flags_test.go | 146 +++++ flytectl/adminutils/iterator.go | 62 ++ .../lyft/golang_support_tools/go.mod | 12 + .../lyft/golang_support_tools/go.sum | 558 ++++++++++++++++++ .../lyft/golang_support_tools/tools.go | 10 + .../lyft/golang_test_targets/Makefile | 53 ++ .../lyft/golang_test_targets/Readme.rst | 31 + .../golang_test_targets/download_tooling.sh | 36 ++ .../lyft/golang_test_targets/goimports | 8 + .../lyft/golangci_file/.golangci.yml | 30 + .../boilerplate/lyft/golangci_file/Readme.rst | 8 + .../boilerplate/lyft/golangci_file/update.sh | 14 + .../lyft/pull_request_template/Readme.rst | 8 + .../pull_request_template.md | 26 + .../lyft/pull_request_template/update.sh | 12 + flytectl/boilerplate/update.cfg | 4 + flytectl/boilerplate/update.sh | 54 ++ flytectl/cmd/config/config.go | 17 + flytectl/cmd/core/cmd.go | 30 +- flytectl/cmd/core/cmd_ctx.go | 4 + flytectl/cmd/get/get.go | 10 +- flytectl/cmd/get/project.go | 42 +- flytectl/cmd/get/project_test.go | 25 + flytectl/cmd/get/task.go | 52 +- flytectl/cmd/get/types.go | 12 +- flytectl/cmd/get/workflow.go | 46 +- flytectl/cmd/root.go | 7 +- flytectl/config.yaml | 2 + flytectl/go.mod | 5 +- flytectl/go.sum | 516 ++++++++++++++++ flytectl/pkg/printer/printer.go | 78 --- flytectl/printer/outputformat_enumer.go | 86 +++ flytectl/printer/printer.go | 110 ++++ flytectl/pull_request_template.md | 26 + 40 files changed, 2048 insertions(+), 204 deletions(-) delete mode 100644 flytectl/.github/workflows/release.yml create mode 100644 flytectl/adminutils/config.go create mode 100755 flytectl/adminutils/config_flags.go create mode 100755 flytectl/adminutils/config_flags_test.go create mode 100644 flytectl/adminutils/iterator.go create mode 100644 flytectl/boilerplate/lyft/golang_support_tools/go.mod create mode 100644 flytectl/boilerplate/lyft/golang_support_tools/go.sum create mode 100644 flytectl/boilerplate/lyft/golang_support_tools/tools.go create mode 100644 flytectl/boilerplate/lyft/golang_test_targets/Makefile create mode 100644 flytectl/boilerplate/lyft/golang_test_targets/Readme.rst create mode 100755 flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh create mode 100755 flytectl/boilerplate/lyft/golang_test_targets/goimports create mode 100644 flytectl/boilerplate/lyft/golangci_file/.golangci.yml create mode 100644 flytectl/boilerplate/lyft/golangci_file/Readme.rst create mode 100755 flytectl/boilerplate/lyft/golangci_file/update.sh create mode 100644 flytectl/boilerplate/lyft/pull_request_template/Readme.rst create mode 100644 flytectl/boilerplate/lyft/pull_request_template/pull_request_template.md create mode 100755 flytectl/boilerplate/lyft/pull_request_template/update.sh create mode 100644 flytectl/boilerplate/update.cfg create mode 100755 flytectl/boilerplate/update.sh create mode 100644 flytectl/cmd/get/project_test.go create mode 100644 flytectl/go.sum delete mode 100644 flytectl/pkg/printer/printer.go create mode 100644 flytectl/printer/outputformat_enumer.go create mode 100644 flytectl/printer/printer.go create mode 100644 flytectl/pull_request_template.md diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml deleted file mode 100644 index db015f442f..0000000000 --- a/flytectl/.github/workflows/release.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: goreleaser - -on: - push: - tags: - - '*' - -jobs: - goreleaser: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Unshallow - run: git fetch --prune --unshallow - - name: Set up Go - uses: actions/setup-go@v2 - with: - go-version: 1.14 - - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v2 - with: - version: latest - args: release --rm-dist - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/flytectl/.gitignore b/flytectl/.gitignore index 8d862b62ca..fb3907b444 100644 --- a/flytectl/.gitignore +++ b/flytectl/.gitignore @@ -4,3 +4,4 @@ vendor bin .DS_Store _test +./config.yaml diff --git a/flytectl/.golangci.yml b/flytectl/.golangci.yml index 80deaf81f6..a414f33f79 100644 --- a/flytectl/.golangci.yml +++ b/flytectl/.golangci.yml @@ -1,6 +1,6 @@ # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. # ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: -# +# # TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst run: @@ -27,4 +27,4 @@ linters: - unconvert - unparam - unused - - varcheck \ No newline at end of file + - varcheck diff --git a/flytectl/Makefile b/flytectl/Makefile index 73c7355ac8..5a8e04ea54 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -1,2 +1,12 @@ +export REPOSITORY=flytectl +include boilerplate/lyft/golang_test_targets/Makefile + generate: - go test github.com/lyft/flytectl/cmd --update \ No newline at end of file + go test github.com/lyft/flytectl/cmd --update + +compile: + go build -o bin/flytectl main.go + +.PHONY: update_boilerplate +update_boilerplate: + @boilerplate/update.sh diff --git a/flytectl/adminutils/config.go b/flytectl/adminutils/config.go new file mode 100644 index 0000000000..3b362b310b --- /dev/null +++ b/flytectl/adminutils/config.go @@ -0,0 +1,22 @@ +package adminutils + +import "github.com/lyft/flytestdlib/config" + +//go:generate pflags Config + +var ( + defaultConfig = &Config{ + MaxRecords: 500, + BatchSize: 100, + } + section = config.MustRegisterSection("adminutils", defaultConfig) +) + +type Config struct { + MaxRecords int `json:"maxRecords" pflag:",Maximum number of records to retrieve."` + BatchSize int `json:"batchSize" pflag:",Maximum number of records to retrieve per call."` +} + +func GetConfig() *Config { + return section.GetConfig().(*Config) +} diff --git a/flytectl/adminutils/config_flags.go b/flytectl/adminutils/config_flags.go new file mode 100755 index 0000000000..5a3c9a2c4d --- /dev/null +++ b/flytectl/adminutils/config_flags.go @@ -0,0 +1,47 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package adminutils + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.Int(fmt.Sprintf("%v%v", prefix, "maxRecords"), defaultConfig.MaxRecords, "Maximum number of records to retrieve.") + cmdFlags.Int(fmt.Sprintf("%v%v", prefix, "batchSize"), defaultConfig.BatchSize, "Maximum number of records to retrieve per call.") + return cmdFlags +} diff --git a/flytectl/adminutils/config_flags_test.go b/flytectl/adminutils/config_flags_test.go new file mode 100755 index 0000000000..1f7cf5ec73 --- /dev/null +++ b/flytectl/adminutils/config_flags_test.go @@ -0,0 +1,146 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package adminutils + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_Config(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_Config(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) +} + +func testDecodeSlice_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) +} + +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_maxRecords", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vInt, err := cmdFlags.GetInt("maxRecords"); err == nil { + assert.Equal(t, int(defaultConfig.MaxRecords), vInt) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("maxRecords", testValue) + if vInt, err := cmdFlags.GetInt("maxRecords"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt), &actual.MaxRecords) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_batchSize", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vInt, err := cmdFlags.GetInt("batchSize"); err == nil { + assert.Equal(t, int(defaultConfig.BatchSize), vInt) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("batchSize", testValue) + if vInt, err := cmdFlags.GetInt("batchSize"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt), &actual.BatchSize) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/adminutils/iterator.go b/flytectl/adminutils/iterator.go new file mode 100644 index 0000000000..8057491dd9 --- /dev/null +++ b/flytectl/adminutils/iterator.go @@ -0,0 +1,62 @@ +package adminutils + +import ( + "context" + + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "google.golang.org/grpc" +) + +type NamedEntityIDLister func(ctx context.Context, in *admin.NamedEntityIdentifierListRequest, opts ...grpc.CallOption) (*admin.NamedEntityIdentifierList, error) + +type NamedEntityVisitor func(entities []*admin.NamedEntityIdentifier) error + +type ListRequest struct { + Project string + Domain string + Filters string +} + +func IterateThroughAllNamedEntities(ctx context.Context, lister NamedEntityIDLister, visitor NamedEntityVisitor, req ListRequest, opts ...grpc.CallOption) error { + adminReq := &admin.NamedEntityIdentifierListRequest{ + Project: req.Project, + Domain: req.Domain, + Filters: req.Filters, + SortBy: &admin.Sort{ + Key: "name", + Direction: admin.Sort_ASCENDING, + }, + Limit: uint32(GetConfig().BatchSize), + } + + i := 0 + for i < GetConfig().MaxRecords { + res, err := lister(ctx, adminReq, opts...) + if err != nil { + return err + } + if len(res.Entities) != 0 { + if err := visitor(res.Entities); err != nil { + return err + } + } + i = i + len(res.Entities) + if len(res.Entities) == 0 || res.Token == "" { + break + } + adminReq.Token = res.Token + } + return nil +} + +func GetAllNamedEntities(ctx context.Context, lister NamedEntityIDLister, req ListRequest, opts ...grpc.CallOption) ([]*admin.NamedEntityIdentifier, error) { + var allEntities []*admin.NamedEntityIdentifier + err := IterateThroughAllNamedEntities(ctx, lister, func(entities []*admin.NamedEntityIdentifier) error { + allEntities = append(allEntities, entities...) + return nil + }, req) + if err != nil { + return nil, err + } + return allEntities, nil +} diff --git a/flytectl/boilerplate/lyft/golang_support_tools/go.mod b/flytectl/boilerplate/lyft/golang_support_tools/go.mod new file mode 100644 index 0000000000..6816461a59 --- /dev/null +++ b/flytectl/boilerplate/lyft/golang_support_tools/go.mod @@ -0,0 +1,12 @@ +module github.com/lyft/boilerplate + +go 1.13 + +require ( + github.com/alvaroloes/enumer v1.1.2 + github.com/golangci/golangci-lint v1.22.2 + github.com/lyft/flytestdlib v0.2.31 + github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5 +) + +replace github.com/vektra/mockery => github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0 diff --git a/flytectl/boilerplate/lyft/golang_support_tools/go.sum b/flytectl/boilerplate/lyft/golang_support_tools/go.sum new file mode 100644 index 0000000000..81e0469630 --- /dev/null +++ b/flytectl/boilerplate/lyft/golang_support_tools/go.sum @@ -0,0 +1,558 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.47.0 h1:1JUtpcY9E7+eTospEwWS2QXP3DEn7poB3E2j0jN74mM= +cloud.google.com/go v0.47.0/go.mod h1:5p3Ky/7f3N10VBkhuR5LFtddroTiMyjZV/Kj5qOQFxU= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v10.2.1-beta+incompatible h1:/x4W7ZQV4PHJYnLUgKubojM8T+zlFEDdaBazAnA/QCY= +github.com/Azure/azure-sdk-for-go v10.2.1-beta+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-autorest/autorest v0.9.2 h1:6AWuh3uWrsZJcNoCHrCF/+g4aKPCU39kaMO6/qrnK/4= +github.com/Azure/go-autorest/autorest v0.9.2/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0 h1:q2gDruN08/guU9vAjuPWff0+QIrpH6ediguzdAzXAUU= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/date v0.1.0 h1:YGrhWfrgtFs84+h0o46rJrlmsZtyZRg470CqAXTZaGM= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0 h1:Ww5g4zThfD/6cLb4z6xxgeyDa7QDkizMkJKe0ysZXp0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= +github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aws/aws-sdk-go v1.25.16 h1:k7Fy6T/uNuLX6zuayU/TJoP7yMgGcJSkZpF7QVjwYpA= +github.com/aws/aws-sdk-go v1.25.16/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bombsimon/wsl/v2 v2.0.0 h1:+Vjcn+/T5lSrO8Bjzhk4v14Un/2UyCA1E3V5j9nwTkQ= +github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coocood/freecache v1.1.0 h1:ENiHOsWdj1BrrlPwblhbn4GdAsMymK3pZORJ+bJGAjA= +github.com/coocood/freecache v1.1.0/go.mod h1:ePwxCDzOYvARfHdr1pByNct1at3CoKnsipOHwKlNbzI= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0 h1:qxIJwfSemSCqhG3/lEw1Rm+wYbegjuKsqy0ZqnIpL14= +github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0/go.mod h1:KfdIkmkpVY3n2sc1ykFj01uMviOiXH2HMhUCvA5FYGg= +github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= +github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/structtag v1.1.0 h1:6j4mUV/ES2duvnAzKMFkN6/A5mCaNYPD3xfbAkLLOF8= +github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783 h1:SmsgwFZy9pdTk/k8BZz40D3P5umP5+Ejt3hAi0paBNQ= +github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-critic/go-critic v0.4.0 h1:sXD3pix0wDemuPuSlrXpJNNYXlUiKiysLrtPVQmxkzI= +github.com/go-critic/go-critic v0.4.0/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2XQaA= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b h1:ekuhfTjngPhisSjOJ0QWKpPQE8/rbknHaes6WVJj5Hw= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191002201903-404acd9df4cc h1:55rEp52jU6bkyslZ1+C/7NGfpQsEc6pxGLAGDOctqbw= +github.com/golang/groupcache v0.0.0-20191002201903-404acd9df4cc/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee h1:J2XAy40+7yz70uaOiMbNnluTg7gyQhtGqLQncQh+4J8= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.22.2 h1:iaihss3Tf6NvZVjun3lHimKSgofPV1+FqE/cbehoiRQ= +github.com/golangci/golangci-lint v1.22.2/go.mod h1:2Bj42k6hPQFTRxkDb7S3TQ+EsnumZXOmIYNqlQrp0FI= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3 h1:JVnpOZS+qxli+rgVl98ILOXVNbW+kb5wcxeGx8ShUIw= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/graymeta/stow v0.0.0-20190522170649-903027f87de7 h1:oIYi27Ruo2k5dxukdOisCSZrowkg70jxxuaPZck9+ic= +github.com/graymeta/stow v0.0.0-20190522170649-903027f87de7/go.mod h1:B24dekNjtWVeREK+dyMHtI22d85VzCT+sX5bVWDtjoA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lyft/flytestdlib v0.2.31 h1:JAOSGwy/wLprhq1KR9zxekBqnKdSlAQQG1x4KQe+hlI= +github.com/lyft/flytestdlib v0.2.31/go.mod h1:/fqNXKCGChEvMzcRapVq6vDM69Vlusl+bCj7foToaUQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/ncw/swift v1.0.49-0.20190728102658-a24ef33bc9b7 h1:2FttUGr9cza0JNOUDHeVWo4wVGk92m8bralgdbAeYJY= +github.com/ncw/swift v1.0.49-0.20190728102658-a24ef33bc9b7/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= +github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.5.0 h1:5BakdOZdtKJ1FFk6QdL8iSGrMWsXgchNJcrnarjbmJQ= +github.com/pelletier/go-toml v1.5.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/satori/uuid v1.2.0 h1:6TFY4nxn5XwBx0gDfzbEMCNT6k4N/4FNIuN8RACZ0KI= +github.com/satori/uuid v1.2.0/go.mod h1:B8HLsPLik/YNn6KKWVMDJ8nzCL8RP5WyfsnmvnAEwIU= +github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d h1:BzRvVq1EHuIjxpijCEKpAxzKUUMurOQ4sknehIATRh8= +github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d/go.mod h1:w5+eXa0mYznDkHaMCXA4XYffjlH+cy1oyKbfzJXa2Do= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.6.1 h1:VPZzIkznI1YhVMRi6vNFLHSwhnhReBfgTxIPccpfdZk= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tommy-muehle/go-mnd v1.1.1 h1:4D0wuPKjOTiK2garzuPGGvm4zZ/wLYDOH8TJSABC7KU= +github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ultraware/funlen v0.0.2 h1:Av96YVBwwNSe4MLR7iI/BIa3VyI7/djnto/pK3Uxbdo= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.1 h1:8dP3SGL7MPB94crU3bEPplMPe83FI4EouesJUeFHv50= +go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191021144547-ec77196f6094 h1:5O4U9trLjNpuhpynaDsqwCk+Tw6seqJz1EbqbnzHrc8= +golang.org/x/net v0.0.0-20191021144547-ec77196f6094/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191020212454-3e7259c5e7c2 h1:nq114VpM8lsSlP+lyUbANecYHYiFcSNFtqcBlxRV+gA= +golang.org/x/sys v0.0.0-20191020212454-3e7259c5e7c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 h1:xQwXv67TxFo9nC1GJFyab5eq/5B590r6RlnL/G8Sz7w= +golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181112210238-4b1f3b6b1646/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010171213-8abd42400456/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191204011308-9611592c72f6 h1:BP62y4oUl8+/CvHuvVqHIPmVRixgDl6y6a+tR7pXXIA= +golang.org/x/tools v0.0.0-20191204011308-9611592c72f6/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.11.1-0.20191020000718-bf72a15fd9e9 h1:DcDldKT1PaijNBNDNPaGtfl+LvUHR1xsw5DpipSI1CE= +google.golang.org/api v0.11.1-0.20191020000718-bf72a15fd9e9/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= +google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93 h1:tT6oQBi0qwLbbZSfDkdIsb23EwaLY85hoAV4SpXfdao= +k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/client-go v0.0.0-20181213151034-8d9ed539ba31 h1:OH3z6khCtxnJBAc0C5CMYWLl1CoK5R5fngX7wrwdN5c= +k8s.io/client-go v0.0.0-20181213151034-8d9ed539ba31/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/flytectl/boilerplate/lyft/golang_support_tools/tools.go b/flytectl/boilerplate/lyft/golang_support_tools/tools.go new file mode 100644 index 0000000000..4310b39d79 --- /dev/null +++ b/flytectl/boilerplate/lyft/golang_support_tools/tools.go @@ -0,0 +1,10 @@ +// +build tools + +package tools + +import ( + _ "github.com/golangci/golangci-lint/cmd/golangci-lint" + _ "github.com/lyft/flytestdlib/cli/pflags" + _ "github.com/vektra/mockery/cmd/mockery" + _ "github.com/alvaroloes/enumer" +) diff --git a/flytectl/boilerplate/lyft/golang_test_targets/Makefile b/flytectl/boilerplate/lyft/golang_test_targets/Makefile new file mode 100644 index 0000000000..5abd2ed607 --- /dev/null +++ b/flytectl/boilerplate/lyft/golang_test_targets/Makefile @@ -0,0 +1,53 @@ +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst + + +.PHONY: download_tooling +download_tooling: #download dependencies (including test deps) for the package + @boilerplate/lyft/golang_test_targets/download_tooling.sh + +.PHONY: lint +lint: download_tooling #lints the package for common code smells + GL_DEBUG=linters_output,env golangci-lint run --deadline=5m --exclude deprecated -v + +# If code is failing goimports linter, this will fix. +# skips 'vendor' +.PHONY: goimports +goimports: + @boilerplate/lyft/golang_test_targets/goimports + +.PHONY: mod_download +mod_download: #download dependencies (including test deps) for the package + go mod download + +.PHONY: install +install: download_tooling mod_download + +.PHONY: show +show: + go list -m all + +.PHONY: test_unit +test_unit: + go test -cover ./... -race + +.PHONY: test_benchmark +test_benchmark: + go test -bench . ./... + +.PHONY: test_unit_cover +test_unit_cover: + go test ./... -coverprofile /tmp/cover.out -covermode=count + go tool cover -func /tmp/cover.out + +.PHONY: test_unit_visual +test_unit_visual: + go test ./... -coverprofile /tmp/cover.out -covermode=count + go tool cover -html=/tmp/cover.out + +.PHONY: test_unit_codecov +test_unit_codecov: + go test ./... -race -coverprofile=coverage.txt -covermode=atomic + curl -s https://codecov.io/bash > codecov_bash.sh && bash codecov_bash.sh diff --git a/flytectl/boilerplate/lyft/golang_test_targets/Readme.rst b/flytectl/boilerplate/lyft/golang_test_targets/Readme.rst new file mode 100644 index 0000000000..3466e30c55 --- /dev/null +++ b/flytectl/boilerplate/lyft/golang_test_targets/Readme.rst @@ -0,0 +1,31 @@ +Golang Test Targets +~~~~~~~~~~~~~~~~~~~ + +Provides an ``install`` make target that uses ``go mod`` to install golang dependencies. + +Provides a ``lint`` make target that uses golangci to lint your code. + +Provides a ``test_unit`` target for unit tests. + +Provides a ``test_unit_cover`` target for analysing coverage of unit tests, which will output the coverage of each function and total statement coverage. + +Provides a ``test_unit_visual`` target for visualizing coverage of unit tests through an interactive html code heat map. + +Provides a ``test_benchmark`` target for benchmark tests. + +**To Enable:** + +Add ``lyft/golang_test_targets`` to your ``boilerplate/update.cfg`` file. + +Make sure you're using ``go mod`` for dependency management. + +Provide a ``.golangci`` configuration (the lint target requires it). + +Add ``include boilerplate/lyft/golang_test_targets/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable + +:: + + REPOSITORY= + include boilerplate/lyft/golang_test_targets/Makefile + +(this ensures the extra make targets get included in your main Makefile) diff --git a/flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh b/flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh new file mode 100755 index 0000000000..ab56c7e481 --- /dev/null +++ b/flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Everything in this file needs to be installed outside of current module +# The reason we cannot turn off module entirely and install is that we need the replace statement in go.mod +# because we are installing a mockery fork. Turning it off would result installing the original not the fork. +# We also want to version all the other tools. We also want to be able to run go mod tidy without removing the version +# pins. To facilitate this, we're maintaining two sets of go.mod/sum files - the second one only for tooling. This is +# the same approach that go 1.14 will take as well. +# See: +# https://github.com/lyft/flyte/issues/129 +# https://github.com/golang/go/issues/30515 for some background context +# https://github.com/go-modules-by-example/index/blob/5ec250b4b78114a55001bd7c9cb88f6e07270ea5/010_tools/README.md + +set -e + +# List of tools to go get +# In the format of ":" or ":" if no cli +tools=( + "github.com/vektra/mockery/cmd/mockery" + "github.com/lyft/flytestdlib/cli/pflags" + "github.com/golangci/golangci-lint/cmd/golangci-lint" + "github.com/alvaroloes/enumer" +) + +tmp_dir=$(mktemp -d -t gotooling-XXX) +echo "Using temp directory ${tmp_dir}" +cp -R boilerplate/lyft/golang_support_tools/* $tmp_dir +pushd "$tmp_dir" + +for tool in "${tools[@]}" +do + echo "Installing ${tool}" + GO111MODULE=on go install $tool +done + +popd diff --git a/flytectl/boilerplate/lyft/golang_test_targets/goimports b/flytectl/boilerplate/lyft/golang_test_targets/goimports new file mode 100755 index 0000000000..160525a8cc --- /dev/null +++ b/flytectl/boilerplate/lyft/golang_test_targets/goimports @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst + +goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*") diff --git a/flytectl/boilerplate/lyft/golangci_file/.golangci.yml b/flytectl/boilerplate/lyft/golangci_file/.golangci.yml new file mode 100644 index 0000000000..a414f33f79 --- /dev/null +++ b/flytectl/boilerplate/lyft/golangci_file/.golangci.yml @@ -0,0 +1,30 @@ +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst + +run: + skip-dirs: + - pkg/client + +linters: + disable-all: true + enable: + - deadcode + - errcheck + - gas + - goconst + - goimports + - golint + - gosimple + - govet + - ineffassign + - misspell + - nakedret + - staticcheck + - structcheck + - typecheck + - unconvert + - unparam + - unused + - varcheck diff --git a/flytectl/boilerplate/lyft/golangci_file/Readme.rst b/flytectl/boilerplate/lyft/golangci_file/Readme.rst new file mode 100644 index 0000000000..ba5d2b61ce --- /dev/null +++ b/flytectl/boilerplate/lyft/golangci_file/Readme.rst @@ -0,0 +1,8 @@ +GolangCI File +~~~~~~~~~~~~~ + +Provides a ``.golangci`` file with the linters we've agreed upon. + +**To Enable:** + +Add ``lyft/golangci_file`` to your ``boilerplate/update.cfg`` file. diff --git a/flytectl/boilerplate/lyft/golangci_file/update.sh b/flytectl/boilerplate/lyft/golangci_file/update.sh new file mode 100755 index 0000000000..9e9e6c1f46 --- /dev/null +++ b/flytectl/boilerplate/lyft/golangci_file/update.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst + +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Clone the .golangci file +echo " - copying ${DIR}/.golangci to the root directory." +cp ${DIR}/.golangci.yml ${DIR}/../../../.golangci.yml diff --git a/flytectl/boilerplate/lyft/pull_request_template/Readme.rst b/flytectl/boilerplate/lyft/pull_request_template/Readme.rst new file mode 100644 index 0000000000..b85a4ea121 --- /dev/null +++ b/flytectl/boilerplate/lyft/pull_request_template/Readme.rst @@ -0,0 +1,8 @@ +Pull Request Template +~~~~~~~~~~~~~~~~~~~~~ + +Provides a Pull Request template. + +**To Enable:** + +Add ``lyft/golang_test_targets`` to your ``boilerplate/update.cfg`` file. diff --git a/flytectl/boilerplate/lyft/pull_request_template/pull_request_template.md b/flytectl/boilerplate/lyft/pull_request_template/pull_request_template.md new file mode 100644 index 0000000000..d2becf38b7 --- /dev/null +++ b/flytectl/boilerplate/lyft/pull_request_template/pull_request_template.md @@ -0,0 +1,26 @@ +# TL;DR +_Please replace this text with a description of what this PR accomplishes._ + +## Type + - [ ] Bug Fix + - [ ] Feature + - [ ] Plugin + +## Are all requirements met? + + - [ ] Code completed + - [ ] Smoke tested + - [ ] Unit tests added + - [ ] Code documentation added + - [ ] Any pending items have an associated Issue + +## Complete description + _How did you fix the bug, make the feature etc. Link to any design docs etc_ + +## Tracking Issue +https://github.com/lyft/flyte/issues/ + +## Follow-up issue +_NA_ +OR +_https://github.com/lyft/flyte/issues/_ diff --git a/flytectl/boilerplate/lyft/pull_request_template/update.sh b/flytectl/boilerplate/lyft/pull_request_template/update.sh new file mode 100755 index 0000000000..13f0c3b57d --- /dev/null +++ b/flytectl/boilerplate/lyft/pull_request_template/update.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst + +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +cp ${DIR}/pull_request_template.md ${DIR}/../../../pull_request_template.md diff --git a/flytectl/boilerplate/update.cfg b/flytectl/boilerplate/update.cfg new file mode 100644 index 0000000000..a1b1bff989 --- /dev/null +++ b/flytectl/boilerplate/update.cfg @@ -0,0 +1,4 @@ +lyft/golang_test_targets +lyft/golangci_file +lyft/golang_support_tools +lyft/pull_request_template diff --git a/flytectl/boilerplate/update.sh b/flytectl/boilerplate/update.sh new file mode 100755 index 0000000000..a8c05705e3 --- /dev/null +++ b/flytectl/boilerplate/update.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst + +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +OUT="$(mktemp -d)" +git clone git@github.com:lyft/boilerplate.git "${OUT}" + +echo "Updating the update.sh script." +cp "${OUT}/boilerplate/update.sh" "${DIR}/update.sh" +echo "" + + +CONFIG_FILE="${DIR}/update.cfg" +README="https://github.com/lyft/boilerplate/blob/master/Readme.rst" + +if [ ! -f "$CONFIG_FILE" ]; then + echo "$CONFIG_FILE not found." + echo "This file is required in order to select which features to include." + echo "See $README for more details." + exit 1 +fi + +if [ -z "$REPOSITORY" ]; then + echo '$REPOSITORY is required to run this script' + echo "See $README for more details." + exit 1 +fi + +while read directory; do + # TODO: Skip empty lines, whitespace only lines, and comment lines + echo "***********************************************************************************" + echo "$directory is configured in update.cfg." + echo "-----------------------------------------------------------------------------------" + echo "syncing files from source." + dir_path="${OUT}/boilerplate/${directory}" + rm -rf "${DIR}/${directory}" + mkdir -p $(dirname "${DIR}/${directory}") + cp -r "$dir_path" "${DIR}/${directory}" + if [ -f "${DIR}/${directory}/update.sh" ]; then + echo "executing ${DIR}/${directory}/update.sh" + "${DIR}/${directory}/update.sh" + fi + echo "***********************************************************************************" + echo "" +done < "$CONFIG_FILE" + +rm -rf "${OUT}" diff --git a/flytectl/cmd/config/config.go b/flytectl/cmd/config/config.go index 59fd7d8701..406279ec71 100644 --- a/flytectl/cmd/config/config.go +++ b/flytectl/cmd/config/config.go @@ -1,7 +1,12 @@ package config import ( + "fmt" + "strings" + "github.com/lyft/flytestdlib/config" + + "github.com/lyft/flytectl/printer" ) //go:generate pflags Config @@ -17,6 +22,18 @@ type Config struct { Output string `json:"output" pflag:",Specified the output type."` } +func (cfg Config) OutputFormat() (printer.OutputFormat, error) { + return printer.OutputFormatString(strings.ToUpper(cfg.Output)) +} + +func (cfg Config) MustOutputFormat() printer.OutputFormat { + f, err := cfg.OutputFormat() + if err != nil { + panic(fmt.Sprintf("unsupported output format [%s], supported types %s", cfg.Output, printer.OutputFormats())) + } + return f +} + func GetConfig() *Config { return section.GetConfig().(*Config) } diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 6be3653c34..96e62950ba 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -6,28 +6,48 @@ import ( "github.com/lyft/flyteidl/clients/go/admin" "github.com/spf13/cobra" + + "github.com/lyft/flytectl/cmd/config" ) -func AddCommands(rootCmd *cobra.Command, cmdFuncs map[string]CommandFunc) { - for resource, getFunc := range cmdFuncs { +type CommandEntry struct { + ProjectDomainNotRequired bool + CmdFunc CommandFunc +} + +func AddCommands(rootCmd *cobra.Command, cmdFuncs map[string]CommandEntry) { + for resource, cmdEntry := range cmdFuncs { cmd := &cobra.Command{ Use: resource, Short: fmt.Sprintf("Retrieves %v resources.", resource), - RunE: generateCommandFunc(getFunc), + RunE: generateCommandFunc(cmdEntry), } rootCmd.AddCommand(cmd) } } -func generateCommandFunc(cmdFunc CommandFunc) func(cmd *cobra.Command, args []string) error { +func generateCommandFunc(cmdEntry CommandEntry) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { ctx := context.Background() + + if !cmdEntry.ProjectDomainNotRequired { + if config.GetConfig().Project == "" { + return fmt.Errorf("project and domain are required parameters") + } + if config.GetConfig().Domain == "" { + return fmt.Errorf("project and domain are required parameters") + } + } + if _, err := config.GetConfig().OutputFormat(); err != nil { + return err + } + adminClient, err := admin.InitializeAdminClientFromConfig(ctx) if err != nil { return err } - return cmdFunc(ctx, args, CommandContext{ + return cmdEntry.CmdFunc(ctx, args, CommandContext{ out: cmd.OutOrStdout(), adminClient: adminClient, }) diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go index 7fb1541251..c39a0d902a 100644 --- a/flytectl/cmd/core/cmd_ctx.go +++ b/flytectl/cmd/core/cmd_ctx.go @@ -19,3 +19,7 @@ func (c CommandContext) AdminClient() service.AdminServiceClient { func (c CommandContext) OutputPipe() io.Writer { return c.out } + +func (c CommandContext) InputPipe() io.Reader { + return c.in +} diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index c4071ee6d5..19e80a4a64 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -1,7 +1,7 @@ package get import ( - "github.com/lyft/flytectl/cmd/core" + cmdcore "github.com/lyft/flytectl/cmd/core" "github.com/spf13/cobra" ) @@ -12,10 +12,10 @@ func CreateGetCommand() *cobra.Command { Short: "Retrieve various resource.", } - getResourcesFuncs := map[string]cmdcore.CommandFunc{ - "projects": getProjectsFunc, - "tasks": getTaskFunc, - "workflows": getWorkflowFunc, + getResourcesFuncs := map[string]cmdcore.CommandEntry{ + "projects": {CmdFunc: getProjectsFunc, ProjectDomainNotRequired: true}, + "tasks": {CmdFunc: getTaskFunc}, + "workflows": {CmdFunc: getWorkflowFunc}, } cmdcore.AddCommands(getCmd, getResourcesFuncs) diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index a576f3f20b..84f701d36f 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -2,46 +2,53 @@ package get import ( "context" - "github.com/lyft/flytectl/cmd/config" "encoding/json" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/pkg/printer" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" "github.com/lyft/flytestdlib/logger" + + "github.com/lyft/flytectl/cmd/config" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flytectl/printer" ) type PrintableProject struct { - Id string `header:"Id"` + ID string `header:"Id"` Name string `header:"Name"` Description string `header:"Description"` } var tableStructure = map[string]string{ - "Id" : "$.id", - "Name" : "$.name", - "Description" : "$.description", + "ID": "$.id", + "Name": "$.name", + "Description": "$.description", } +func transformProject(jsonbody []byte) (interface{}, error) { + results := PrintableProject{} + if err := json.Unmarshal(jsonbody, &results); err != nil { + return results, err + } + return results, nil +} func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { adminPrinter := printer.Printer{} - transformProject := func(jsonbody [] byte)(interface{},error){ - results := PrintableProject{} - if err := json.Unmarshal(jsonbody, &results); err != nil { - return results,err - } - return results,nil - } if len(args) == 1 { + name := args[0] projects, err := cmdCtx.AdminClient().ListProjects(ctx, &admin.ProjectListRequest{}) if err != nil { return err } logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) for _, v := range projects.Projects { - if v.Name == args[0] { - adminPrinter.Print(config.GetConfig().Output, projects.Projects,tableStructure,transformProject) + if v.Name == name { + err := adminPrinter.Print(config.GetConfig().MustOutputFormat(), v, tableStructure, transformProject) + if err != nil { + return err + } + return nil } } return nil @@ -51,6 +58,5 @@ func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC return err } logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) - adminPrinter.Print(config.GetConfig().Output, projects.Projects,tableStructure,transformProject) - return nil + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), projects.Projects, tableStructure, transformProject) } diff --git a/flytectl/cmd/get/project_test.go b/flytectl/cmd/get/project_test.go new file mode 100644 index 0000000000..3ec6479ca3 --- /dev/null +++ b/flytectl/cmd/get/project_test.go @@ -0,0 +1,25 @@ +package get + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_transformProject(t *testing.T) { + t.Run("happy", func(t *testing.T) { + v, err := json.Marshal(map[string]string{ + "Id": "id", + "Name": "name", + "Description": "description", + }) + assert.NoError(t, err) + row, err := transformProject(v) + assert.NoError(t, err) + typedRow, ok := row.(PrintableProject) + assert.True(t, ok) + assert.NotNil(t, typedRow) + assert.Equal(t, "id", typedRow.Id) + }) +} diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 70f5126add..84f0c84993 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -3,11 +3,14 @@ package get import ( "context" "encoding/json" - "fmt" + + "github.com/lyft/flytestdlib/logger" + + "github.com/lyft/flytectl/adminutils" + "github.com/lyft/flytectl/printer" + "github.com/lyft/flytectl/cmd/config" cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/pkg/printer" - "github.com/lyft/flytestdlib/logger" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" ) @@ -21,30 +24,24 @@ type PrintableTask struct { } var taskStructure = map[string]string{ - "Version" : "$.id.version", - "Name" : "$.id.name", - "Type" : "$.closure.compiledTask.template.type", - "Discoverable" : "$.closure.compiledTask.template.metadata.discoverable", - "DiscoveryVersion" : "$.closure.compiledTask.template.metadata.discovery_version", + "Version": "$.id.version", + "Name": "$.id.name", + "Type": "$.closure.compiledTask.template.type", + "Discoverable": "$.closure.compiledTask.template.metadata.discoverable", + "DiscoveryVersion": "$.closure.compiledTask.template.metadata.discovery_version", } -var transformTask = func(jsonbody [] byte)(interface{},error){ +var transformTask = func(jsonbody []byte) (interface{}, error) { results := PrintableTask{} if err := json.Unmarshal(jsonbody, &results); err != nil { - return results,err + return results, err } - return results,nil + return results, nil } func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - if config.GetConfig().Project == "" { - return fmt.Errorf("Please set project name to get domain") - } - if config.GetConfig().Domain == "" { - return fmt.Errorf("Please set project name to get workflow") - } - taskPrinter := printer.Printer{ - } + + taskPrinter := printer.Printer{} if len(args) == 1 { task, err := cmdCtx.AdminClient().ListTasks(ctx, &admin.ResourceListRequest{ @@ -53,26 +50,19 @@ func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte Domain: config.GetConfig().Domain, Name: args[0], }, - Limit: 10, + Limit: 1, }) if err != nil { return err } logger.Debugf(ctx, "Retrieved Task", task.Tasks) - taskPrinter.Print(config.GetConfig().Output, task.Tasks,taskStructure,transformTask) - return nil + return taskPrinter.Print(config.GetConfig().MustOutputFormat(), task.Tasks, taskStructure, transformTask) } - - tasks, err := cmdCtx.AdminClient().ListTaskIds(ctx, &admin.NamedEntityIdentifierListRequest{ - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - Limit: 3, - }) + tasks, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListTaskIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) if err != nil { return err } - logger.Debugf(ctx, "Retrieved %v Task", len(tasks.Entities)) - taskPrinter.Print(config.GetConfig().Output, tasks.Entities,entityStructure,transformTaskEntity) - return nil + logger.Debugf(ctx, "Retrieved %v Task", len(tasks)) + return taskPrinter.Print(config.GetConfig().MustOutputFormat(), tasks, entityStructure, transformTaskEntity) } diff --git a/flytectl/cmd/get/types.go b/flytectl/cmd/get/types.go index a73547bf81..3cde02d01d 100644 --- a/flytectl/cmd/get/types.go +++ b/flytectl/cmd/get/types.go @@ -9,15 +9,15 @@ type PrintableNamedEntityIdentifier struct { } var entityStructure = map[string]string{ - "Domain" : "$.domain", - "Name" : "$.name", - "Project" : "$.project", + "Domain": "$.domain", + "Name": "$.name", + "Project": "$.project", } -var transformTaskEntity = func(jsonbody [] byte)(interface{},error){ +var transformTaskEntity = func(jsonbody []byte) (interface{}, error) { results := PrintableNamedEntityIdentifier{} if err := json.Unmarshal(jsonbody, &results); err != nil { - return results,err + return results, err } - return results,nil + return results, nil } diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 6ef2fe77dd..90f34b1c1c 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -3,18 +3,20 @@ package get import ( "context" "encoding/json" - "fmt" + + "github.com/lyft/flytestdlib/logger" + + "github.com/lyft/flytectl/adminutils" "github.com/lyft/flytectl/cmd/config" cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/pkg/printer" - "github.com/lyft/flytestdlib/logger" + "github.com/lyft/flytectl/printer" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" ) var workflowStructure = map[string]string{ - "Version" : "$.id.version", - "Name" : "$.id.name", + "Version": "$.id.version", + "Name": "$.id.name", } type PrintableWorkflow struct { @@ -22,24 +24,16 @@ type PrintableWorkflow struct { Version string `header:"Version"` } -var transformWorkflow = func(jsonbody [] byte)(interface{},error){ +var transformWorkflow = func(jsonbody []byte) (interface{}, error) { results := PrintableWorkflow{} if err := json.Unmarshal(jsonbody, &results); err != nil { - return results,err + return results, err } - return results,nil + return results, nil } - func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - if config.GetConfig().Project == "" { - return fmt.Errorf("Please set project name to get domain") - } - if config.GetConfig().Domain == "" { - return fmt.Errorf("Please set project name to get workflow") - } - adminPrinter := printer.Printer{ - } + adminPrinter := printer.Printer{} if len(args) > 0 { workflows, err := cmdCtx.AdminClient().ListWorkflows(ctx, &admin.ResourceListRequest{ Id: &admin.NamedEntityIdentifier{ @@ -47,26 +41,20 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC Domain: config.GetConfig().Domain, Name: args[0], }, - Limit: 10, + Limit: 1, }) if err != nil { return err } logger.Debugf(ctx, "Retrieved %v workflows", len(workflows.Workflows)) - adminPrinter.Print(config.GetConfig().Output, workflows.Workflows,workflowStructure,transformWorkflow) - return nil + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflows.Workflows, workflowStructure, transformWorkflow) } - workflows, err := cmdCtx.AdminClient().ListWorkflowIds(ctx, &admin.NamedEntityIdentifierListRequest{ - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - Limit: 10, - }) + + workflows, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListWorkflowIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) if err != nil { return err } - logger.Debugf(ctx, "Retrieved %v workflows", len(workflows.Entities)) - - adminPrinter.Print(config.GetConfig().Output, workflows.Entities,entityStructure,transformTaskEntity) - return nil + logger.Debugf(ctx, "Retrieved %v workflows", len(workflows)) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflows, entityStructure, transformTaskEntity) } diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index a266ca9856..f099db0117 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -2,13 +2,16 @@ package cmd import ( "context" + "fmt" "github.com/lyft/flytectl/cmd/get" + "github.com/lyft/flytectl/printer" - "github.com/lyft/flytectl/cmd/config" stdConfig "github.com/lyft/flytestdlib/config" "github.com/lyft/flytestdlib/config/viper" "github.com/spf13/cobra" + + "github.com/lyft/flytectl/cmd/config" ) var ( @@ -30,7 +33,7 @@ func newRootCmd() *cobra.Command { // --root.project, this adds a convenience on top to allow --project to be used rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Project), "project", "p", "", "Specifies the Flyte project.") rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Domain), "domain", "d", "", "Specifies the Flyte project's domain.") - rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Output), "output", "o", "table", "Specifies the output type") + rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Output), "output", "o", printer.OutputFormatTABLE.String(), fmt.Sprintf("Specifies the output type - supported formats %s", printer.OutputFormats())) rootCmd.AddCommand(viper.GetConfigCommand()) rootCmd.AddCommand(versionCmd) diff --git a/flytectl/config.yaml b/flytectl/config.yaml index 117944914b..7bc38d9c18 100644 --- a/flytectl/config.yaml +++ b/flytectl/config.yaml @@ -1,5 +1,7 @@ admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: http://localhost:30082 + # endpoint: dns:///flyte.lyft.net insecure: true logger: show-source: true diff --git a/flytectl/go.mod b/flytectl/go.mod index 468b3ef403..4dac235d14 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -4,8 +4,9 @@ go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect + github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.3.2 - github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 // indirect + github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1 github.com/lyft/flyteidl v0.18.1 github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa @@ -16,6 +17,8 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.4.0 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 + go.uber.org/zap v1.10.0 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 // indirect + google.golang.org/grpc v1.26.0 k8s.io/apimachinery v0.18.3 // indirect ) diff --git a/flytectl/go.sum b/flytectl/go.sum new file mode 100644 index 0000000000..d43baa8c3c --- /dev/null +++ b/flytectl/go.sum @@ -0,0 +1,516 @@ +<<<<<<< Updated upstream +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.4/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.28.9/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coocood/freecache v1.1.0/go.mod h1:ePwxCDzOYvARfHdr1pByNct1at3CoKnsipOHwKlNbzI= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783 h1:SmsgwFZy9pdTk/k8BZz40D3P5umP5+Ejt3hAi0paBNQ= +github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/graymeta/stow v0.2.4/go.mod h1:+0vRL9oMECKjPMP7OeVWl8EIqRCpFwDlth3mrAeV2Kw= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.2 h1:D0EVSTwQoQOyfY35QNSuPJA4jpZRtkoGYWQMB7XNg5o= +github.com/grpc-ecosystem/grpc-gateway v1.12.2/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb v1.7.9/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 h1:M8exrBzuhWcU6aoHJlHWPe4qFjVKzkMGRal78f5jRRU= +github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23/go.mod h1:kBSna6b0/RzsOcOZf515vAXwSsXYusl2U7SA0XP09yI= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1 h1:SH30nioTpP0VaCYafgUw+iS1EfJTDbtAeBcByEFqFrY= +github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= +github.com/lyft/flyteidl v0.18.1 h1:COKkZi5k6bQvUYOk5gE70+FJX9/NUn0WOQ1uMrw3Qio= +github.com/lyft/flyteidl v0.18.1/go.mod h1:/zQXxuHO11u/saxTTZc8oYExIGEShXB+xCB1/F1Cu20= +github.com/lyft/flytestdlib v0.3.0/go.mod h1:LJPPJlkFj+wwVWMrQT3K5JZgNhZi2mULsCG4ZYhinhU= +github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa h1:anYLG/feMdMv321AfhHGBRd0S3cPLFFTZvJYssjhxFo= +github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa/go.mod h1:LJPPJlkFj+wwVWMrQT3K5JZgNhZi2mULsCG4ZYhinhU= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/uuid v1.2.0/go.mod h1:B8HLsPLik/YNn6KKWVMDJ8nzCL8RP5WyfsnmvnAEwIU= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= +github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200124170513-3f4d10fc73b4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150 h1:VPpdpQkGvFicX9yo4G5oxZPi9ALBnEOZblPSa/Wa2m4= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.1 h1:GyboHr4UqMiLUybYjd22ZjQIKEJEpgtLXtuGbR21Oho= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= +gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= +k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/client-go v11.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go deleted file mode 100644 index 8462625875..0000000000 --- a/flytectl/pkg/printer/printer.go +++ /dev/null @@ -1,78 +0,0 @@ -package printer - -import ( - "bytes" - "encoding/json" - "fmt" - "github.com/landoop/tableprinter" - "github.com/yalp/jsonpath" - "os" -) - -type Printer struct{} - -const ( - empty = "" - tab = "\t" -) - -func (p Printer) PrintOutput(output string, i interface{}) { - // Factory Method for all printer - switch output { - case "json": // Print protobuf to json - buffer := new(bytes.Buffer) - encoder := json.NewEncoder(buffer) - encoder.SetIndent(empty, tab) - - err := encoder.Encode(i) - if err != nil { - os.Exit(1) - } - - fmt.Println(buffer.String()) - break - default: // Print table - - printer := tableprinter.New(os.Stdout) - printer.Print(i) - break - } -} - -func(p Printer) BuildOutput(input []interface{},column map[string]string,printTransform func(data []byte)(interface{},error)) ([]interface{},error) { - responses := make([]interface{}, 0, len(input)) - for _, data := range input { - tableData := make(map[string]interface{}) - - for k := range column { - out, _ := jsonpath.Read(data, column[k]) - tableData[k] = out.(string) - } - jsonbody, err := json.Marshal(tableData) - if err != nil { - return responses,err - } - response,err := printTransform(jsonbody) - if err != nil { - return responses,err - } - responses = append(responses, response) - } - return responses,nil -} - -func (p Printer) Print(output string, i interface{},column map[string]string,printTransform func(data []byte)(interface{},error)) { - - var data interface{} - byte, _ := json.Marshal(i) - _ = json.Unmarshal(byte, &data) - if data == nil { - os.Exit(1) - } - input := data.([]interface{}) - response,err := p.BuildOutput(input,column,printTransform) - if err != nil { - os.Exit(1) - } - p.PrintOutput(output, response) -} diff --git a/flytectl/printer/outputformat_enumer.go b/flytectl/printer/outputformat_enumer.go new file mode 100644 index 0000000000..b10b45143f --- /dev/null +++ b/flytectl/printer/outputformat_enumer.go @@ -0,0 +1,86 @@ +// Code generated by "enumer --type=OutputFormat -json -yaml -trimprefix=OutputFormat"; DO NOT EDIT. + +// +package printer + +import ( + "encoding/json" + "fmt" +) + +const _OutputFormatName = "TABLEJSONYAML" + +var _OutputFormatIndex = [...]uint8{0, 5, 9, 13} + +func (i OutputFormat) String() string { + if i >= OutputFormat(len(_OutputFormatIndex)-1) { + return fmt.Sprintf("OutputFormat(%d)", i) + } + return _OutputFormatName[_OutputFormatIndex[i]:_OutputFormatIndex[i+1]] +} + +var _OutputFormatValues = []OutputFormat{0, 1, 2} + +var _OutputFormatNameToValueMap = map[string]OutputFormat{ + _OutputFormatName[0:5]: 0, + _OutputFormatName[5:9]: 1, + _OutputFormatName[9:13]: 2, +} + +// OutputFormatString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func OutputFormatString(s string) (OutputFormat, error) { + if val, ok := _OutputFormatNameToValueMap[s]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to OutputFormat values", s) +} + +// OutputFormatValues returns all values of the enum +func OutputFormatValues() []OutputFormat { + return _OutputFormatValues +} + +// IsAOutputFormat returns "true" if the value is listed in the enum definition. "false" otherwise +func (i OutputFormat) IsAOutputFormat() bool { + for _, v := range _OutputFormatValues { + if i == v { + return true + } + } + return false +} + +// MarshalJSON implements the json.Marshaler interface for OutputFormat +func (i OutputFormat) MarshalJSON() ([]byte, error) { + return json.Marshal(i.String()) +} + +// UnmarshalJSON implements the json.Unmarshaler interface for OutputFormat +func (i *OutputFormat) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return fmt.Errorf("OutputFormat should be a string, got %s", data) + } + + var err error + *i, err = OutputFormatString(s) + return err +} + +// MarshalYAML implements a YAML Marshaler for OutputFormat +func (i OutputFormat) MarshalYAML() (interface{}, error) { + return i.String(), nil +} + +// UnmarshalYAML implements a YAML Unmarshaler for OutputFormat +func (i *OutputFormat) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + + var err error + *i, err = OutputFormatString(s) + return err +} diff --git a/flytectl/printer/printer.go b/flytectl/printer/printer.go new file mode 100644 index 0000000000..6ed17d4ef3 --- /dev/null +++ b/flytectl/printer/printer.go @@ -0,0 +1,110 @@ +package printer + +import ( + "bytes" + "encoding/json" + "fmt" + "os" + + "github.com/ghodss/yaml" + "github.com/kataras/tablewriter" + "github.com/landoop/tableprinter" + "github.com/yalp/jsonpath" +) + +//go:generate enumer --type=OutputFormat -json -yaml -trimprefix=OutputFormat +type OutputFormat uint8 + +const ( + OutputFormatTABLE OutputFormat = iota + OutputFormatJSON + OutputFormatYAML +) + +func OutputFormats() []string { + var v []string + for _, o := range OutputFormatValues() { + v = append(v, o.String()) + } + return v +} + +type Printer struct{} + +const ( + empty = "" + tab = "\t" +) + +func (p Printer) projectColumns(input []interface{}, column map[string]string, printTransform func(data []byte) (interface{}, error)) ([]interface{}, error) { + responses := make([]interface{}, 0, len(input)) + for _, data := range input { + tableData := make(map[string]interface{}) + + for k := range column { + out, err := jsonpath.Read(data, column[k]) + if err != nil { + out = nil + } + tableData[k] = out + } + jsonbody, err := json.Marshal(tableData) + if err != nil { + return responses, err + } + response, err := printTransform(jsonbody) + if err != nil { + return responses, err + } + responses = append(responses, response) + } + return responses, nil +} + +func (p Printer) Print(format OutputFormat, i interface{}, column map[string]string, printTransform func(data []byte) (interface{}, error)) error { + + buf := new(bytes.Buffer) + encoder := json.NewEncoder(buf) + encoder.SetIndent(empty, tab) + + err := encoder.Encode(i) + if err != nil { + return err + } + + // Factory Method for all printer + switch format { + case OutputFormatJSON: // Print protobuf to json + fmt.Println(buf.String()) + case OutputFormatYAML: + v, err := yaml.JSONToYAML(buf.Bytes()) + if err != nil { + return err + } + fmt.Println(string(v)) + default: // Print table + var rows []interface{} + err := json.Unmarshal(buf.Bytes(), &rows) + if err != nil { + return err + } + if rows == nil { + return nil + } + response, err := p.projectColumns(rows, column, printTransform) + if err != nil { + return err + } + printer := tableprinter.New(os.Stdout) + printer.AutoWrapText = false + printer.BorderLeft = true + printer.BorderRight = true + printer.ColumnSeparator = "|" + printer.HeaderBgColor = tablewriter.BgHiWhiteColor + if printer.Print(response) == -1 { + return fmt.Errorf("failed to print table data") + } + fmt.Printf("%d rows\n", len(rows)) + } + return nil +} diff --git a/flytectl/pull_request_template.md b/flytectl/pull_request_template.md new file mode 100644 index 0000000000..d2becf38b7 --- /dev/null +++ b/flytectl/pull_request_template.md @@ -0,0 +1,26 @@ +# TL;DR +_Please replace this text with a description of what this PR accomplishes._ + +## Type + - [ ] Bug Fix + - [ ] Feature + - [ ] Plugin + +## Are all requirements met? + + - [ ] Code completed + - [ ] Smoke tested + - [ ] Unit tests added + - [ ] Code documentation added + - [ ] Any pending items have an associated Issue + +## Complete description + _How did you fix the bug, make the feature etc. Link to any design docs etc_ + +## Tracking Issue +https://github.com/lyft/flyte/issues/ + +## Follow-up issue +_NA_ +OR +_https://github.com/lyft/flyte/issues/_ From 79e8fddf56351ba76f7743af69ba42e6099f7aa8 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Sat, 10 Oct 2020 12:11:12 -0700 Subject: [PATCH 009/645] Auto rendering of JSON entities using path (#13) --- flytectl/cmd/get/named_entity.go | 11 ++++ flytectl/cmd/get/project.go | 27 ++------ flytectl/cmd/get/project_test.go | 25 -------- flytectl/cmd/get/task.go | 33 +++------- flytectl/cmd/get/types.go | 23 ------- flytectl/cmd/get/workflow.go | 24 ++----- flytectl/config.yaml | 6 +- flytectl/go.mod | 2 +- flytectl/go.sum | 2 + flytectl/printer/printer.go | 105 ++++++++++++++++++------------- flytectl/printer/printer_test.go | 41 ++++++++++++ 11 files changed, 140 insertions(+), 159 deletions(-) create mode 100644 flytectl/cmd/get/named_entity.go delete mode 100644 flytectl/cmd/get/project_test.go delete mode 100644 flytectl/cmd/get/types.go create mode 100644 flytectl/printer/printer_test.go diff --git a/flytectl/cmd/get/named_entity.go b/flytectl/cmd/get/named_entity.go new file mode 100644 index 0000000000..5b0e513778 --- /dev/null +++ b/flytectl/cmd/get/named_entity.go @@ -0,0 +1,11 @@ +package get + +import ( + "github.com/lyft/flytectl/printer" +) + +var entityColumns = []printer.Column{ + {"Domain", "$.domain"}, + {"Name", "$.name"}, + {"Project", "$.project"}, +} diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 84f701d36f..483d310df6 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -2,7 +2,6 @@ package get import ( "context" - "encoding/json" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" "github.com/lyft/flytestdlib/logger" @@ -12,24 +11,10 @@ import ( "github.com/lyft/flytectl/printer" ) -type PrintableProject struct { - ID string `header:"Id"` - Name string `header:"Name"` - Description string `header:"Description"` -} - -var tableStructure = map[string]string{ - "ID": "$.id", - "Name": "$.name", - "Description": "$.description", -} - -func transformProject(jsonbody []byte) (interface{}, error) { - results := PrintableProject{} - if err := json.Unmarshal(jsonbody, &results); err != nil { - return results, err - } - return results, nil +var projectColumns = []printer.Column{ + {"ID", "$.id"}, + {"Name", "$.name"}, + {"Description", "$.description"}, } func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { @@ -44,7 +29,7 @@ func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) for _, v := range projects.Projects { if v.Name == name { - err := adminPrinter.Print(config.GetConfig().MustOutputFormat(), v, tableStructure, transformProject) + err := adminPrinter.Print(config.GetConfig().MustOutputFormat(), v, projectColumns) if err != nil { return err } @@ -58,5 +43,5 @@ func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC return err } logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), projects.Projects, tableStructure, transformProject) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), projects.Projects, projectColumns) } diff --git a/flytectl/cmd/get/project_test.go b/flytectl/cmd/get/project_test.go deleted file mode 100644 index 3ec6479ca3..0000000000 --- a/flytectl/cmd/get/project_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package get - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_transformProject(t *testing.T) { - t.Run("happy", func(t *testing.T) { - v, err := json.Marshal(map[string]string{ - "Id": "id", - "Name": "name", - "Description": "description", - }) - assert.NoError(t, err) - row, err := transformProject(v) - assert.NoError(t, err) - typedRow, ok := row.(PrintableProject) - assert.True(t, ok) - assert.NotNil(t, typedRow) - assert.Equal(t, "id", typedRow.Id) - }) -} diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 84f0c84993..a61a7f8e34 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -2,7 +2,6 @@ package get import ( "context" - "encoding/json" "github.com/lyft/flytestdlib/logger" @@ -15,28 +14,12 @@ import ( "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" ) -type PrintableTask struct { - Version string `header:"Version"` - Name string `header:"Name"` - Type string `header:"Type"` - Discoverable bool `header:"Discoverable"` - DiscoveryVersion string `header:"DiscoveryVersion"` -} - -var taskStructure = map[string]string{ - "Version": "$.id.version", - "Name": "$.id.name", - "Type": "$.closure.compiledTask.template.type", - "Discoverable": "$.closure.compiledTask.template.metadata.discoverable", - "DiscoveryVersion": "$.closure.compiledTask.template.metadata.discovery_version", -} - -var transformTask = func(jsonbody []byte) (interface{}, error) { - results := PrintableTask{} - if err := json.Unmarshal(jsonbody, &results); err != nil { - return results, err - } - return results, nil +var taskColumns = []printer.Column{ + {"Version", "$.id.version"}, + {"Name", "$.id.name"}, + {"Type", "$.closure.compiledTask.template.type"}, + {"Discoverable", "$.closure.compiledTask.template.metadata.discoverable"}, + {"DiscoveryVersion", "$.closure.compiledTask.template.metadata.discovery_version"}, } func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { @@ -57,12 +40,12 @@ func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte } logger.Debugf(ctx, "Retrieved Task", task.Tasks) - return taskPrinter.Print(config.GetConfig().MustOutputFormat(), task.Tasks, taskStructure, transformTask) + return taskPrinter.Print(config.GetConfig().MustOutputFormat(), task.Tasks, taskColumns) } tasks, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListTaskIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) if err != nil { return err } logger.Debugf(ctx, "Retrieved %v Task", len(tasks)) - return taskPrinter.Print(config.GetConfig().MustOutputFormat(), tasks, entityStructure, transformTaskEntity) + return taskPrinter.Print(config.GetConfig().MustOutputFormat(), tasks, entityColumns) } diff --git a/flytectl/cmd/get/types.go b/flytectl/cmd/get/types.go deleted file mode 100644 index 3cde02d01d..0000000000 --- a/flytectl/cmd/get/types.go +++ /dev/null @@ -1,23 +0,0 @@ -package get - -import "encoding/json" - -type PrintableNamedEntityIdentifier struct { - Name string `header:"Name"` - Project string `header:"Project"` - Domain string `header:"Domain"` -} - -var entityStructure = map[string]string{ - "Domain": "$.domain", - "Name": "$.name", - "Project": "$.project", -} - -var transformTaskEntity = func(jsonbody []byte) (interface{}, error) { - results := PrintableNamedEntityIdentifier{} - if err := json.Unmarshal(jsonbody, &results); err != nil { - return results, err - } - return results, nil -} diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 90f34b1c1c..7f45b1ac90 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -2,7 +2,6 @@ package get import ( "context" - "encoding/json" "github.com/lyft/flytestdlib/logger" @@ -14,22 +13,9 @@ import ( "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" ) -var workflowStructure = map[string]string{ - "Version": "$.id.version", - "Name": "$.id.name", -} - -type PrintableWorkflow struct { - Name string `header:"Name"` - Version string `header:"Version"` -} - -var transformWorkflow = func(jsonbody []byte) (interface{}, error) { - results := PrintableWorkflow{} - if err := json.Unmarshal(jsonbody, &results); err != nil { - return results, err - } - return results, nil +var workflowColumns = []printer.Column{ + {"Version", "$.id.version"}, + {"Name", "$.id.name"}, } func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { @@ -48,7 +34,7 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC } logger.Debugf(ctx, "Retrieved %v workflows", len(workflows.Workflows)) - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflows.Workflows, workflowStructure, transformWorkflow) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflows.Workflows, workflowColumns) } workflows, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListWorkflowIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) @@ -56,5 +42,5 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC return err } logger.Debugf(ctx, "Retrieved %v workflows", len(workflows)) - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflows, entityStructure, transformTaskEntity) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflows, entityColumns) } diff --git a/flytectl/config.yaml b/flytectl/config.yaml index 7bc38d9c18..82a73dac7d 100644 --- a/flytectl/config.yaml +++ b/flytectl/config.yaml @@ -1,8 +1,8 @@ admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: http://localhost:30082 - # endpoint: dns:///flyte.lyft.net - insecure: true + # endpoint: http://localhost:30082 + endpoint: dns:///flyte.lyft.net + insecure: false logger: show-source: true level: 1 diff --git a/flytectl/go.mod b/flytectl/go.mod index 4dac235d14..593de7c5cf 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -7,7 +7,7 @@ require ( github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.3.2 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 - github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1 + github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 github.com/lyft/flyteidl v0.18.1 github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa github.com/mattn/go-runewidth v0.0.9 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index d43baa8c3c..729c0ddc2e 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -186,6 +186,8 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= +github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1 h1:SH30nioTpP0VaCYafgUw+iS1EfJTDbtAeBcByEFqFrY= github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= github.com/lyft/flyteidl v0.18.1 h1:COKkZi5k6bQvUYOk5gE70+FJX9/NUn0WOQ1uMrw3Qio= diff --git a/flytectl/printer/printer.go b/flytectl/printer/printer.go index 6ed17d4ef3..a92c234152 100644 --- a/flytectl/printer/printer.go +++ b/flytectl/printer/printer.go @@ -29,6 +29,11 @@ func OutputFormats() []string { return v } +type Column struct { + Header string + JSONPath string +} + type Printer struct{} const ( @@ -36,32 +41,69 @@ const ( tab = "\t" ) -func (p Printer) projectColumns(input []interface{}, column map[string]string, printTransform func(data []byte) (interface{}, error)) ([]interface{}, error) { - responses := make([]interface{}, 0, len(input)) - for _, data := range input { - tableData := make(map[string]interface{}) - - for k := range column { - out, err := jsonpath.Read(data, column[k]) - if err != nil { - out = nil - } - tableData[k] = out - } - jsonbody, err := json.Marshal(tableData) - if err != nil { - return responses, err - } - response, err := printTransform(jsonbody) +// Projects the columns in one row of data from the given JSON using the []Column map +func extractRow(data interface{}, columns []Column) []string { + if columns == nil || data == nil { + return nil + } + tableData := make([]string, 0, len(columns)) + + for _, c := range columns { + out, err := jsonpath.Read(data, c.JSONPath) if err != nil { - return responses, err + out = "" } - responses = append(responses, response) + tableData = append(tableData, fmt.Sprintf("%s", out)) + } + return tableData +} + +// Projects the columns from the given list of JSON elements using the []Column map +// Potential performance problem, as it returns all the rows in memory. +// We could use the render row, but that may lead to misalignment. +// TODO figure out a more optimal way +func projectColumns(input []interface{}, column []Column) ([][]string, error) { + responses := make([][]string, 0, len(input)) + for _, data := range input { + responses = append(responses, extractRow(data, column)) } return responses, nil } -func (p Printer) Print(format OutputFormat, i interface{}, column map[string]string, printTransform func(data []byte) (interface{}, error)) error { +func JSONToTable(b []byte, columns []Column) error { + var jsonRows []interface{} + err := json.Unmarshal(b, &jsonRows) + if err != nil { + return err + } + if jsonRows == nil { + return nil + } + rows, err := projectColumns(jsonRows, columns) + if err != nil { + return err + } + printer := tableprinter.New(os.Stdout) + // TODO make this configurable + printer.AutoWrapText = false + printer.BorderLeft = true + printer.BorderRight = true + printer.ColumnSeparator = "|" + printer.HeaderBgColor = tablewriter.BgHiWhiteColor + headers := make([]string, 0, len(columns)) + positions := make([]int, 0, len(columns)) + for _, c := range columns { + headers = append(headers, c.Header) + positions = append(positions, 30) + } + if r := printer.Render(headers, rows, positions, true); r == -1 { + return fmt.Errorf("failed to render table") + } + fmt.Printf("%d rows\n", len(rows)) + return nil +} + +func (p Printer) Print(format OutputFormat, i interface{}, columns []Column) error { buf := new(bytes.Buffer) encoder := json.NewEncoder(buf) @@ -83,28 +125,7 @@ func (p Printer) Print(format OutputFormat, i interface{}, column map[string]str } fmt.Println(string(v)) default: // Print table - var rows []interface{} - err := json.Unmarshal(buf.Bytes(), &rows) - if err != nil { - return err - } - if rows == nil { - return nil - } - response, err := p.projectColumns(rows, column, printTransform) - if err != nil { - return err - } - printer := tableprinter.New(os.Stdout) - printer.AutoWrapText = false - printer.BorderLeft = true - printer.BorderRight = true - printer.ColumnSeparator = "|" - printer.HeaderBgColor = tablewriter.BgHiWhiteColor - if printer.Print(response) == -1 { - return fmt.Errorf("failed to print table data") - } - fmt.Printf("%d rows\n", len(rows)) + return JSONToTable(buf.Bytes(), columns) } return nil } diff --git a/flytectl/printer/printer_test.go b/flytectl/printer/printer_test.go new file mode 100644 index 0000000000..1876688d85 --- /dev/null +++ b/flytectl/printer/printer_test.go @@ -0,0 +1,41 @@ +package printer + +import ( + "encoding/json" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +type Inner struct { + X string `json:"x"` + Y *time.Time `json:"y"` +} + +func TestJSONToTable(t *testing.T) { + d := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) + j := []struct { + A string `json:"a"` + B int `json:"b"` + S *Inner `json:"s"` + }{ + {"hello", 0, &Inner{"x-hello", nil}}, + {"hello", 0, &Inner{"x-hello", &d}}, + {"hello", 0, nil}, + } + + b, err := json.Marshal(j) + assert.NoError(t, err) + assert.NoError(t, JSONToTable(b, []Column{ + {"A", "$.a"}, + {"S", "$.s.y"}, + })) + // Output: + // | A | S | + // ------- ---------------------- + // | hello | %!s() | + // | hello | 2020-01-01T00:00:00Z | + // | hello | | + // 3 rows +} From 09013f7682521040e207c036f492acbb3c12f967 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Mon, 12 Oct 2020 09:25:53 -0700 Subject: [PATCH 010/645] Fix small bug in rendering table (#14) - Missing entities are rendered as nil, instead of empty --- flytectl/printer/printer.go | 2 +- flytectl/printer/printer_test.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/flytectl/printer/printer.go b/flytectl/printer/printer.go index a92c234152..edee1a1df1 100644 --- a/flytectl/printer/printer.go +++ b/flytectl/printer/printer.go @@ -50,7 +50,7 @@ func extractRow(data interface{}, columns []Column) []string { for _, c := range columns { out, err := jsonpath.Read(data, c.JSONPath) - if err != nil { + if err != nil || out == nil { out = "" } tableData = append(tableData, fmt.Sprintf("%s", out)) diff --git a/flytectl/printer/printer_test.go b/flytectl/printer/printer_test.go index 1876688d85..92fb80c0cf 100644 --- a/flytectl/printer/printer_test.go +++ b/flytectl/printer/printer_test.go @@ -13,6 +13,7 @@ type Inner struct { Y *time.Time `json:"y"` } +// TODO Convert this to a Testable Example. For some reason the comparison fails func TestJSONToTable(t *testing.T) { d := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) j := []struct { @@ -34,7 +35,7 @@ func TestJSONToTable(t *testing.T) { // Output: // | A | S | // ------- ---------------------- - // | hello | %!s() | + // | hello | | // | hello | 2020-01-01T00:00:00Z | // | hello | | // 3 rows From 1d96987e886c5eb2344b936f46892f24885c5f50 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Mon, 12 Oct 2020 17:33:51 -0700 Subject: [PATCH 011/645] Task details in table and using jsonpb to print data (#15) --- flytectl/adminutils/iterator.go | 9 ++++ flytectl/cmd/get/project.go | 13 ++++- flytectl/cmd/get/task.go | 23 +++++++-- flytectl/cmd/get/workflow.go | 21 ++++++-- flytectl/printer/printer.go | 85 +++++++++++++++++++++++---------- 5 files changed, 116 insertions(+), 35 deletions(-) diff --git a/flytectl/adminutils/iterator.go b/flytectl/adminutils/iterator.go index 8057491dd9..18368dc012 100644 --- a/flytectl/adminutils/iterator.go +++ b/flytectl/adminutils/iterator.go @@ -3,6 +3,7 @@ package adminutils import ( "context" + "github.com/golang/protobuf/proto" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" "google.golang.org/grpc" ) @@ -60,3 +61,11 @@ func GetAllNamedEntities(ctx context.Context, lister NamedEntityIDLister, req Li } return allEntities, nil } + +func NamedEntityToProtoMessage(l []*admin.NamedEntityIdentifier) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages +} \ No newline at end of file diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 483d310df6..46868b4932 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -3,6 +3,7 @@ package get import ( "context" + "github.com/golang/protobuf/proto" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" "github.com/lyft/flytestdlib/logger" @@ -17,6 +18,14 @@ var projectColumns = []printer.Column{ {"Description", "$.description"}, } +func ProjectToProtoMessages(l []*admin.Project) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages +} + func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { adminPrinter := printer.Printer{} @@ -29,7 +38,7 @@ func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) for _, v := range projects.Projects { if v.Name == name { - err := adminPrinter.Print(config.GetConfig().MustOutputFormat(), v, projectColumns) + err := adminPrinter.Print(config.GetConfig().MustOutputFormat(), projectColumns, v) if err != nil { return err } @@ -43,5 +52,5 @@ func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC return err } logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), projects.Projects, projectColumns) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), projectColumns, ProjectToProtoMessages(projects.Projects)...) } diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index a61a7f8e34..08344462ba 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -3,6 +3,7 @@ package get import ( "context" + "github.com/golang/protobuf/proto" "github.com/lyft/flytestdlib/logger" "github.com/lyft/flytectl/adminutils" @@ -19,7 +20,16 @@ var taskColumns = []printer.Column{ {"Name", "$.id.name"}, {"Type", "$.closure.compiledTask.template.type"}, {"Discoverable", "$.closure.compiledTask.template.metadata.discoverable"}, - {"DiscoveryVersion", "$.closure.compiledTask.template.metadata.discovery_version"}, + {"Discovery Version", "$.closure.compiledTask.template.metadata.discoveryVersion"}, + {"Created At", "$.closure.createdAt"}, +} + +func TaskToProtoMessages(l []*admin.Task) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages } func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { @@ -33,19 +43,24 @@ func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte Domain: config.GetConfig().Domain, Name: args[0], }, - Limit: 1, + // TODO Sorting and limits should be parameters + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + Limit: 100, }) if err != nil { return err } logger.Debugf(ctx, "Retrieved Task", task.Tasks) - return taskPrinter.Print(config.GetConfig().MustOutputFormat(), task.Tasks, taskColumns) + return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToProtoMessages(task.Tasks)...) } tasks, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListTaskIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) if err != nil { return err } logger.Debugf(ctx, "Retrieved %v Task", len(tasks)) - return taskPrinter.Print(config.GetConfig().MustOutputFormat(), tasks, entityColumns) + return taskPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, adminutils.NamedEntityToProtoMessage(tasks)...) } diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 7f45b1ac90..e20e9be560 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -3,6 +3,7 @@ package get import ( "context" + "github.com/golang/protobuf/proto" "github.com/lyft/flytestdlib/logger" "github.com/lyft/flytectl/adminutils" @@ -16,6 +17,15 @@ import ( var workflowColumns = []printer.Column{ {"Version", "$.id.version"}, {"Name", "$.id.name"}, + {"Created At", "$.closure.createdAt"}, +} + +func WorkflowToProtoMessages(l []*admin.Workflow) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages } func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { @@ -27,14 +37,19 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC Domain: config.GetConfig().Domain, Name: args[0], }, - Limit: 1, + // TODO Sorting and limits should be parameters + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + Limit: 100, }) if err != nil { return err } logger.Debugf(ctx, "Retrieved %v workflows", len(workflows.Workflows)) - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflows.Workflows, workflowColumns) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows.Workflows)...) } workflows, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListWorkflowIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) @@ -42,5 +57,5 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC return err } logger.Debugf(ctx, "Retrieved %v workflows", len(workflows)) - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflows, entityColumns) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, adminutils.NamedEntityToProtoMessage(workflows)...) } diff --git a/flytectl/printer/printer.go b/flytectl/printer/printer.go index edee1a1df1..e1d57d3266 100644 --- a/flytectl/printer/printer.go +++ b/flytectl/printer/printer.go @@ -7,8 +7,11 @@ import ( "os" "github.com/ghodss/yaml" + "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/proto" "github.com/kataras/tablewriter" "github.com/landoop/tableprinter" + "github.com/lyft/flytestdlib/errors" "github.com/yalp/jsonpath" ) @@ -62,24 +65,23 @@ func extractRow(data interface{}, columns []Column) []string { // Potential performance problem, as it returns all the rows in memory. // We could use the render row, but that may lead to misalignment. // TODO figure out a more optimal way -func projectColumns(input []interface{}, column []Column) ([][]string, error) { - responses := make([][]string, 0, len(input)) - for _, data := range input { - responses = append(responses, extractRow(data, column)) +func projectColumns(rows []interface{}, column []Column) ([][]string, error) { + responses := make([][]string, 0, len(rows)) + for _, row := range rows { + responses = append(responses, extractRow(row, column)) } return responses, nil } -func JSONToTable(b []byte, columns []Column) error { - var jsonRows []interface{} - err := json.Unmarshal(b, &jsonRows) - if err != nil { - return err +func JSONToTable(jsonRows []byte, columns []Column) error { + var rawRows []interface{} + if err := json.Unmarshal(jsonRows, &rawRows); err != nil { + return errors.Wrapf("JSONUnmarshalFailure", err, "failed to unmarshal into []interface{} from json") } - if jsonRows == nil { - return nil + if rawRows == nil { + return errors.Errorf("JSONUnmarshalNil", "expected one row or empty rows, received nil") } - rows, err := projectColumns(jsonRows, columns) + rows, err := projectColumns(rawRows, columns) if err != nil { return err } @@ -103,29 +105,60 @@ func JSONToTable(b []byte, columns []Column) error { return nil } -func (p Printer) Print(format OutputFormat, i interface{}, columns []Column) error { - - buf := new(bytes.Buffer) - encoder := json.NewEncoder(buf) - encoder.SetIndent(empty, tab) +func (p Printer) Print(format OutputFormat, columns []Column, messages ...proto.Message) error { - err := encoder.Encode(i) - if err != nil { - return err + printableMessages := make([]*PrintableProto, 0, len(messages)) + for _, m := range messages { + printableMessages = append(printableMessages, &PrintableProto{Message: m}) } // Factory Method for all printer switch format { - case OutputFormatJSON: // Print protobuf to json - fmt.Println(buf.String()) - case OutputFormatYAML: - v, err := yaml.JSONToYAML(buf.Bytes()) + case OutputFormatJSON, OutputFormatYAML: // Print protobuf to json + buf := new(bytes.Buffer) + encoder := json.NewEncoder(buf) + encoder.SetIndent(empty, tab) + var err error + if len(printableMessages) == 1 { + err = encoder.Encode(printableMessages[0]) + } else { + err = encoder.Encode(printableMessages) + } if err != nil { return err } - fmt.Println(string(v)) + if format == OutputFormatJSON { + fmt.Println(buf.String()) + } else { + v, err := yaml.JSONToYAML(buf.Bytes()) + if err != nil { + return err + } + fmt.Println(string(v)) + } default: // Print table - return JSONToTable(buf.Bytes(), columns) + rows, err := json.Marshal(printableMessages) + if err != nil { + return errors.Wrapf("ProtoToJSONFailure", err, "failed to marshal proto messages") + } + return JSONToTable(rows, columns) } return nil } + +type PrintableProto struct { + proto.Message +} + +var marshaller = jsonpb.Marshaler{ + Indent: tab, +} + +func (p PrintableProto) MarshalJSON() ([]byte, error) { + buf := new(bytes.Buffer) + err := marshaller.Marshal(buf, p.Message) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} From 73aa8188c43145dd456f0ea2c2c245d2be3b03d7 Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Fri, 23 Oct 2020 04:15:23 +0530 Subject: [PATCH 012/645] launch plan command added (#10) --- flytectl/.github.com/PULL_REQUEST_TEMPLATE.md | 26 ++ .../.github.com/workflow/pull_request.yaml | 0 flytectl/README.md | 6 +- flytectl/cmd/config/config.go | 6 +- flytectl/cmd/core/cmd.go | 8 +- flytectl/cmd/get/get.go | 8 +- flytectl/cmd/get/launch_plan.go | 61 +++ flytectl/cmd/get/named_entity.go | 2 +- flytectl/cmd/get/project.go | 12 +- flytectl/cmd/get/task.go | 7 +- flytectl/cmd/get/workflow.go | 7 +- flytectl/cmd/root.go | 3 +- flytectl/config.yaml | 4 +- flytectl/go.mod | 1 + flytectl/install.sh | 392 ++++++++++++++++++ flytectl/{ => pkg}/adminutils/config.go | 0 flytectl/{ => pkg}/adminutils/config_flags.go | 0 .../{ => pkg}/adminutils/config_flags_test.go | 0 flytectl/{ => pkg}/adminutils/iterator.go | 0 .../{ => pkg}/printer/outputformat_enumer.go | 0 flytectl/{ => pkg}/printer/printer.go | 0 flytectl/{ => pkg}/printer/printer_test.go | 0 22 files changed, 515 insertions(+), 28 deletions(-) create mode 100644 flytectl/.github.com/PULL_REQUEST_TEMPLATE.md create mode 100644 flytectl/.github.com/workflow/pull_request.yaml create mode 100644 flytectl/cmd/get/launch_plan.go create mode 100644 flytectl/install.sh rename flytectl/{ => pkg}/adminutils/config.go (100%) rename flytectl/{ => pkg}/adminutils/config_flags.go (100%) rename flytectl/{ => pkg}/adminutils/config_flags_test.go (100%) rename flytectl/{ => pkg}/adminutils/iterator.go (100%) rename flytectl/{ => pkg}/printer/outputformat_enumer.go (100%) rename flytectl/{ => pkg}/printer/printer.go (100%) rename flytectl/{ => pkg}/printer/printer_test.go (100%) diff --git a/flytectl/.github.com/PULL_REQUEST_TEMPLATE.md b/flytectl/.github.com/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..d2becf38b7 --- /dev/null +++ b/flytectl/.github.com/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +# TL;DR +_Please replace this text with a description of what this PR accomplishes._ + +## Type + - [ ] Bug Fix + - [ ] Feature + - [ ] Plugin + +## Are all requirements met? + + - [ ] Code completed + - [ ] Smoke tested + - [ ] Unit tests added + - [ ] Code documentation added + - [ ] Any pending items have an associated Issue + +## Complete description + _How did you fix the bug, make the feature etc. Link to any design docs etc_ + +## Tracking Issue +https://github.com/lyft/flyte/issues/ + +## Follow-up issue +_NA_ +OR +_https://github.com/lyft/flyte/issues/_ diff --git a/flytectl/.github.com/workflow/pull_request.yaml b/flytectl/.github.com/workflow/pull_request.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/flytectl/README.md b/flytectl/README.md index dfe4413421..28f29f2a50 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -1,5 +1,9 @@ # flytectl -Flyte CLI +Install Flyte CLI +```bash +curl -s https://github.com/lyft/flytectl/blob/master/install.sh | bash +``` [Contribution guidelines for this project](docs/CONTRIBUTING.md) + diff --git a/flytectl/cmd/config/config.go b/flytectl/cmd/config/config.go index 406279ec71..bb691b52c0 100644 --- a/flytectl/cmd/config/config.go +++ b/flytectl/cmd/config/config.go @@ -6,7 +6,7 @@ import ( "github.com/lyft/flytestdlib/config" - "github.com/lyft/flytectl/printer" + "github.com/lyft/flytectl/pkg/printer" ) //go:generate pflags Config @@ -16,16 +16,19 @@ var ( section = config.MustRegisterSection("root", defaultConfig) ) +// Config hold configration for flytectl flag type Config struct { Project string `json:"project" pflag:",Specifies the project to work on."` Domain string `json:"domain" pflag:",Specified the domain to work on."` Output string `json:"output" pflag:",Specified the output type."` } +// OutputFormat will return output formate func (cfg Config) OutputFormat() (printer.OutputFormat, error) { return printer.OutputFormatString(strings.ToUpper(cfg.Output)) } +// MustOutputFormat will validate the supported output formate and return output formate func (cfg Config) MustOutputFormat() printer.OutputFormat { f, err := cfg.OutputFormat() if err != nil { @@ -34,6 +37,7 @@ func (cfg Config) MustOutputFormat() printer.OutputFormat { return f } +// GetConfig will return the config func GetConfig() *Config { return section.GetConfig().(*Config) } diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 96e62950ba..07d57bb14c 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -13,14 +13,16 @@ import ( type CommandEntry struct { ProjectDomainNotRequired bool CmdFunc CommandFunc + Aliases []string } func AddCommands(rootCmd *cobra.Command, cmdFuncs map[string]CommandEntry) { for resource, cmdEntry := range cmdFuncs { cmd := &cobra.Command{ - Use: resource, - Short: fmt.Sprintf("Retrieves %v resources.", resource), - RunE: generateCommandFunc(cmdEntry), + Use: resource, + Short: fmt.Sprintf("Retrieves %v resources.", resource), + Aliases: cmdEntry.Aliases, + RunE: generateCommandFunc(cmdEntry), } rootCmd.AddCommand(cmd) diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index 19e80a4a64..097206c2ff 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" ) +// CreateGetCommand will return get command func CreateGetCommand() *cobra.Command { getCmd := &cobra.Command{ Use: "get", @@ -13,9 +14,10 @@ func CreateGetCommand() *cobra.Command { } getResourcesFuncs := map[string]cmdcore.CommandEntry{ - "projects": {CmdFunc: getProjectsFunc, ProjectDomainNotRequired: true}, - "tasks": {CmdFunc: getTaskFunc}, - "workflows": {CmdFunc: getWorkflowFunc}, + "project": {CmdFunc: getProjectsFunc, Aliases: []string{"projects"}, ProjectDomainNotRequired: true}, + "task": {CmdFunc: getTaskFunc, Aliases: []string{"tasks"}}, + "workflow": {CmdFunc: getWorkflowFunc, Aliases: []string{"workflows"}}, + "launchplan": {CmdFunc: getLaunchPlanFunc, Aliases: []string{"launchplans"}}, } cmdcore.AddCommands(getCmd, getResourcesFuncs) diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go new file mode 100644 index 0000000000..0f31e5106b --- /dev/null +++ b/flytectl/cmd/get/launch_plan.go @@ -0,0 +1,61 @@ +package get + +import ( + "context" + "github.com/golang/protobuf/proto" + "github.com/lyft/flytectl/cmd/config" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flytectl/pkg/adminutils" + "github.com/lyft/flytectl/pkg/printer" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/lyft/flytestdlib/logger" +) + +var launchplanColumns = []printer.Column{ + {"Version", "$.id.version"}, + {"Name", "$.id.name"}, + {"Type", "$.closure.compiledTask.template.type"}, + {"State", "$.spec.state"}, + {"Schedule", "$.spec.entityMetadata.schedule"}, +} + +func LaunchplanToProtoMessages(l []*admin.LaunchPlan) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages +} + +func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + launchPlanPrinter := printer.Printer{} + + if len(args) == 1 { + name := args[0] + launchPlan, err := cmdCtx.AdminClient().ListLaunchPlans(ctx, &admin.ResourceListRequest{ + Limit: 10, + Id: &admin.NamedEntityIdentifier{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: name, + }, + }) + if err != nil { + return err + } + logger.Debugf(ctx, "Retrieved %v excutions", len(launchPlan.LaunchPlans)) + err = launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplanColumns, LaunchplanToProtoMessages(launchPlan.LaunchPlans)...) + if err != nil { + return err + } + return nil + } + + launchPlans, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListLaunchPlanIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) + if err != nil { + return err + } + logger.Debugf(ctx, "Retrieved %v launch plans", len(launchPlans)) + return launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, adminutils.NamedEntityToProtoMessage(launchPlans)...) + return nil +} diff --git a/flytectl/cmd/get/named_entity.go b/flytectl/cmd/get/named_entity.go index 5b0e513778..a8bc1e60c9 100644 --- a/flytectl/cmd/get/named_entity.go +++ b/flytectl/cmd/get/named_entity.go @@ -1,7 +1,7 @@ package get import ( - "github.com/lyft/flytectl/printer" + "github.com/lyft/flytectl/pkg/printer" ) var entityColumns = []printer.Column{ diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 46868b4932..93c3395d8e 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -9,7 +9,7 @@ import ( "github.com/lyft/flytectl/cmd/config" cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/printer" + "github.com/lyft/flytectl/pkg/printer" ) var projectColumns = []printer.Column{ @@ -28,10 +28,12 @@ func ProjectToProtoMessages(l []*admin.Project) []proto.Message { func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { adminPrinter := printer.Printer{} - + projects, err := cmdCtx.AdminClient().ListProjects(ctx, &admin.ProjectListRequest{}) + if err != nil { + return err + } if len(args) == 1 { name := args[0] - projects, err := cmdCtx.AdminClient().ListProjects(ctx, &admin.ProjectListRequest{}) if err != nil { return err } @@ -47,10 +49,6 @@ func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC } return nil } - projects, err := cmdCtx.AdminClient().ListProjects(ctx, &admin.ProjectListRequest{}) - if err != nil { - return err - } logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) return adminPrinter.Print(config.GetConfig().MustOutputFormat(), projectColumns, ProjectToProtoMessages(projects.Projects)...) } diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 08344462ba..a29d690660 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -2,12 +2,11 @@ package get import ( "context" - "github.com/golang/protobuf/proto" "github.com/lyft/flytestdlib/logger" - "github.com/lyft/flytectl/adminutils" - "github.com/lyft/flytectl/printer" + "github.com/lyft/flytectl/pkg/adminutils" + "github.com/lyft/flytectl/pkg/printer" "github.com/lyft/flytectl/cmd/config" cmdCore "github.com/lyft/flytectl/cmd/core" @@ -45,7 +44,7 @@ func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte }, // TODO Sorting and limits should be parameters SortBy: &admin.Sort{ - Key: "created_at", + Key: "created_at", Direction: admin.Sort_DESCENDING, }, Limit: 100, diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index e20e9be560..71b08f4c7b 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -2,14 +2,13 @@ package get import ( "context" - "github.com/golang/protobuf/proto" "github.com/lyft/flytestdlib/logger" - "github.com/lyft/flytectl/adminutils" "github.com/lyft/flytectl/cmd/config" cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/printer" + "github.com/lyft/flytectl/pkg/adminutils" + "github.com/lyft/flytectl/pkg/printer" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" ) @@ -39,7 +38,7 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC }, // TODO Sorting and limits should be parameters SortBy: &admin.Sort{ - Key: "created_at", + Key: "created_at", Direction: admin.Sort_DESCENDING, }, Limit: 100, diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index f099db0117..11593ba3c0 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/lyft/flytectl/cmd/get" - "github.com/lyft/flytectl/printer" + "github.com/lyft/flytectl/pkg/printer" stdConfig "github.com/lyft/flytestdlib/config" "github.com/lyft/flytestdlib/config/viper" @@ -34,7 +34,6 @@ func newRootCmd() *cobra.Command { rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Project), "project", "p", "", "Specifies the Flyte project.") rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Domain), "domain", "d", "", "Specifies the Flyte project's domain.") rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Output), "output", "o", printer.OutputFormatTABLE.String(), fmt.Sprintf("Specifies the output type - supported formats %s", printer.OutputFormats())) - rootCmd.AddCommand(viper.GetConfigCommand()) rootCmd.AddCommand(versionCmd) rootCmd.AddCommand(get.CreateGetCommand()) diff --git a/flytectl/config.yaml b/flytectl/config.yaml index 82a73dac7d..a6b72e5741 100644 --- a/flytectl/config.yaml +++ b/flytectl/config.yaml @@ -1,8 +1,8 @@ admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com - # endpoint: http://localhost:30082 endpoint: dns:///flyte.lyft.net - insecure: false + # endpoint: dns:///flyte.lyft.net + insecure: true logger: show-source: true level: 1 diff --git a/flytectl/go.mod b/flytectl/go.mod index 593de7c5cf..e7872d901a 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -12,6 +12,7 @@ require ( github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/mapstructure v1.1.2 + github.com/sirupsen/logrus v1.4.2 github.com/spf13/afero v1.2.2 // indirect github.com/spf13/cobra v0.0.5 github.com/spf13/pflag v1.0.5 diff --git a/flytectl/install.sh b/flytectl/install.sh new file mode 100644 index 0000000000..bee7affdf3 --- /dev/null +++ b/flytectl/install.sh @@ -0,0 +1,392 @@ +#!/bin/sh +set -e +# Code generated by godownloader on 2020-10-10T20:07:34Z. DO NOT EDIT. +# + +usage() { + this=$1 + cat </dev/null +} +echoerr() { + echo "$@" 1>&2 +} +log_prefix() { + echo "$0" +} +_logp=6 +log_set_priority() { + _logp="$1" +} +log_priority() { + if test -z "$1"; then + echo "$_logp" + return + fi + [ "$1" -le "$_logp" ] +} +log_tag() { + case $1 in + 0) echo "emerg" ;; + 1) echo "alert" ;; + 2) echo "crit" ;; + 3) echo "err" ;; + 4) echo "warning" ;; + 5) echo "notice" ;; + 6) echo "info" ;; + 7) echo "debug" ;; + *) echo "$1" ;; + esac +} +log_debug() { + log_priority 7 || return 0 + echoerr "$(log_prefix)" "$(log_tag 7)" "$@" +} +log_info() { + log_priority 6 || return 0 + echoerr "$(log_prefix)" "$(log_tag 6)" "$@" +} +log_err() { + log_priority 3 || return 0 + echoerr "$(log_prefix)" "$(log_tag 3)" "$@" +} +log_crit() { + log_priority 2 || return 0 + echoerr "$(log_prefix)" "$(log_tag 2)" "$@" +} +uname_os() { + os=$(uname -s | tr '[:upper:]' '[:lower:]') + case "$os" in + cygwin_nt*) os="windows" ;; + mingw*) os="windows" ;; + msys_nt*) os="windows" ;; + esac + echo "$os" +} +uname_arch() { + arch=$(uname -m) + case $arch in + x86_64) arch="amd64" ;; + x86) arch="386" ;; + i686) arch="386" ;; + i386) arch="386" ;; + aarch64) arch="arm64" ;; + armv5*) arch="armv5" ;; + armv6*) arch="armv6" ;; + armv7*) arch="armv7" ;; + esac + echo ${arch} +} +uname_os_check() { + os=$(uname_os) + case "$os" in + darwin) return 0 ;; + dragonfly) return 0 ;; + freebsd) return 0 ;; + linux) return 0 ;; + android) return 0 ;; + nacl) return 0 ;; + netbsd) return 0 ;; + openbsd) return 0 ;; + plan9) return 0 ;; + solaris) return 0 ;; + windows) return 0 ;; + esac + log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" + return 1 +} +uname_arch_check() { + arch=$(uname_arch) + case "$arch" in + 386) return 0 ;; + amd64) return 0 ;; + arm64) return 0 ;; + armv5) return 0 ;; + armv6) return 0 ;; + armv7) return 0 ;; + ppc64) return 0 ;; + ppc64le) return 0 ;; + mips) return 0 ;; + mipsle) return 0 ;; + mips64) return 0 ;; + mips64le) return 0 ;; + s390x) return 0 ;; + amd64p32) return 0 ;; + esac + log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" + return 1 +} +untar() { + tarball=$1 + case "${tarball}" in + *.tar.gz | *.tgz) tar --no-same-owner -xzf "${tarball}" ;; + *.tar) tar --no-same-owner -xf "${tarball}" ;; + *.zip) unzip "${tarball}" ;; + *) + log_err "untar unknown archive format for ${tarball}" + return 1 + ;; + esac +} +http_download_curl() { + local_file=$1 + source_url=$2 + header=$3 + if [ -z "$header" ]; then + code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url") + else + code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url") + fi + if [ "$code" != "200" ]; then + log_debug "http_download_curl received HTTP status $code" + return 1 + fi + return 0 +} +http_download_wget() { + local_file=$1 + source_url=$2 + header=$3 + if [ -z "$header" ]; then + wget -q -O "$local_file" "$source_url" + else + wget -q --header "$header" -O "$local_file" "$source_url" + fi +} +http_download() { + log_debug "http_download $2" + if is_command curl; then + http_download_curl "$@" + return + elif is_command wget; then + http_download_wget "$@" + return + fi + log_crit "http_download unable to find wget or curl" + return 1 +} +http_copy() { + tmp=$(mktemp) + http_download "${tmp}" "$1" "$2" || return 1 + body=$(cat "$tmp") + rm -f "${tmp}" + echo "$body" +} +github_release() { + owner_repo=$1 + version=$2 + test -z "$version" && version="latest" + giturl="https://github.com/${owner_repo}/releases/${version}" + json=$(http_copy "$giturl" "Accept:application/json") + test -z "$json" && return 1 + version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//') + test -z "$version" && return 1 + echo "$version" +} +hash_sha256() { + TARGET=${1:-/dev/stdin} + if is_command gsha256sum; then + hash=$(gsha256sum "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command sha256sum; then + hash=$(sha256sum "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command shasum; then + hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command openssl; then + hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f a + else + log_crit "hash_sha256 unable to find command to compute sha-256 hash" + return 1 + fi +} +hash_sha256_verify() { + TARGET=$1 + checksums=$2 + if [ -z "$checksums" ]; then + log_err "hash_sha256_verify checksum file not specified in arg2" + return 1 + fi + BASENAME=${TARGET##*/} + want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) + if [ -z "$want" ]; then + log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" + return 1 + fi + got=$(hash_sha256 "$TARGET") + if [ "$want" != "$got" ]; then + log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got" + return 1 + fi +} +cat /dev/null < Date: Thu, 22 Oct 2020 15:49:09 -0700 Subject: [PATCH 013/645] Proposal update: Additional details on some commands & aux commands (#12) * More updates * Updated readme * more updates * more updates --- flytectl/proposal/README.md | 103 ++++++++++++++++++++++++++++++++---- 1 file changed, 92 insertions(+), 11 deletions(-) diff --git a/flytectl/proposal/README.md b/flytectl/proposal/README.md index 8b776350b4..e325777082 100644 --- a/flytectl/proposal/README.md +++ b/flytectl/proposal/README.md @@ -85,45 +85,126 @@ This is a lower priority option as most entities in flyte are immutable and do n # Details of each resource ## Projects -Support +Projects are top level entity in Flyte. You can fetch multiple projects or one project using the CLI. Think about projects like namespaces. + - create +```bash +$ flytectl create projects --name "Human readable Name of project" --id project-id --labels key=value --labels key=value --description "long string" +Alternatively +$ flytectl create project -f project.yaml +``` + +```yaml +project.yaml +name: Human readable project name +id: project-x +labels: + - k: v + - k1: v1 +description: | + Long description +``` - get +```bash +$ flytectl get projects [project-name] [-o yaml | -o json | default -o table] +``` - update +```bash +$ flytectl update projects --id project-x ... +# You can only update one project at a time +``` ## Tasks -Support - - create - get +```bash +$ flytectl get tasks [task-name] [-o yaml | -o json | default -o table] [--filters...] [--sort-by...] [--selectors...] +``` + - get specific version and get a template to launch + Create an execution is complicated as the user needs to know all the input types and way to simplify this could be to create a YAML template locally from the launchplan (the interface, etc) +```bash +$ flytectl get task task-name --execution-template -o YAML +yaml.template (TBD) +This is a special version of get launch-plan which can be executed by passing it to create execution. + +``` + - create + - create - update ## Workflows Support - - create - get +```bash +$ flytectl get workflows [workflow-name] [-o yaml | -o json | default -o table] [--filters...] [--sort-by...] [--selectors...] +``` + - create - update ## Launch Plans Support - - create - get +```bash +$ flytectl get launch-plans [launchplan-name] [-o yaml | -o json | default -o table] [--filters...] [--sort-by...] [--selectors...] +``` + - get specific version and get a template to launch + Create an execution is complicated as the user needs to know all the input types and way to simplify this could be to create a YAML template locally from the launchplan (the interface, etc) +```bash +$ flytectl get launch-plans launch-plan-name --execution-template -o YAML +yaml.template (TBD) +This is a special version of get launch-plan which can be executed by passing it to create execution. + +``` + - create - update ## Execution -Support - - create +Create or retrieve an execution. - get - - update +Get all executions or get a single execution. +```bash +$ flytectl get execution [exec-name] [-o yaml | -o json | default -o table] [--filters...] [--sort-by...] [--selectors...] +``` +An interesting feature in get-execution might be to filter within the execution only the execution of a node, or quickly find the ones that have failed. +Visualizing the execution is also challenging. We may want to visualize +We could use https://graphviz.org/ to visualize the DAG. +Within the DAG, NodeExecutions and corresponding task executions need to be fetched. + - create + Create an execution for a LaunchPlan or a Task. This is very interesting as it should accept inputs for the execution. +```bash +$ flytectl create execution -f template.yaml (see get-template command) +OR +$ flytectl create execution --launch-plan "name" --inputs "key=value" +``` - delete - here refers to terminate ## MatchableEntity -Support - - create +Ability to retrieve matchable entity and edit its details - get + - create - update ## Outputs Support - - create - get + - create - update +# No resource interactions + +## Install all examples +Today Flytesnacks houses a few examples for Flyte usage in python. When a user wants to get started with Flyte quickly it would be preferable that all Flytesnacks examples are serialized and stored as artifacts in flytesnacks for every checkin. This can be done for python flytekit using `pyflyte serialize` command. Once they are posted as serialized blobs, flytectl could easily retrieve them and register them in a specific project as desired by the user. + +```bash +$ flytectl examples register-all [cookbook|plugins|--custom-path=remote-path] [--semver semantic-version-of-flytesnacks-examples] --target-project --target-domain +``` +The remote has to follow a protocol. It should be an archive - `tar.gz` with two folders `example-set/ -tasks/*.pb -workflows/*.pb` All the workflows in this path will be installed to the target project / domain + +## Setup a repository with dockerfile for writing code for Flyte +Maybe we should look at `boilr` or some other existing framework to do this +```bash +$ flytectl init project --archetype tensorflow-2.0 +$ flytectl init project --archetype spark-3.0 +$ flytectl init project --archetype xgboost +... +``` +For this to work, all these archetypes should be available in a separate repository. An archetype is essentially a template with dockerfile and folder setup with flytekit.config From 34ed4b0d7d771244a4e3a6c7c8f4e18bd1ee53d0 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Thu, 22 Oct 2020 15:53:04 -0700 Subject: [PATCH 014/645] correct the install command (#16) --- flytectl/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/README.md b/flytectl/README.md index 28f29f2a50..617827a591 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -2,7 +2,7 @@ Install Flyte CLI ```bash -curl -s https://github.com/lyft/flytectl/blob/master/install.sh | bash +curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash ``` [Contribution guidelines for this project](docs/CONTRIBUTING.md) From f24f3a6830afa92b168a9972c9c544ca5fe6fac4 Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Mon, 4 Jan 2021 14:50:24 -0800 Subject: [PATCH 015/645] Update proposal for create (#18) * addendums * Update README.md --- flytectl/proposal/README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/flytectl/proposal/README.md b/flytectl/proposal/README.md index e325777082..c9c2acedd4 100644 --- a/flytectl/proposal/README.md +++ b/flytectl/proposal/README.md @@ -74,6 +74,35 @@ Eventually we may want to simplify the json and yaml representations but that is The create for Task and Workflow is essential what is encompassed in the pyflyte as the registration process. We will decouple the registration process such that pyflyte, jflyte (other native cli's or code methods) can dump a serialized representations of the workflows and tasks that are directly consumed by **flytectl**. Thus flytectl is essential in every flow for the user. + +#### Create Templatization +User-facing SDKs can serialize workflow code to protobuf representations but these will be incomplete. Specifically, the _project_, _domain_, and _version_ parameters must be supplied at create time since these are attributes of the registerable, rather than serialized object. Placeholder template variables including: + +* `{{ .project }}` +* `{{ .domain }}` +* `{{ .version }}` +* [auth](https://github.com/lyft/flyteidl/blob/c3baba8983019680ef57b6244cea36ba951233ed/protos/flyteidl/admin/common.proto#L241): including the assumable_iam_role and/or kubernetes_service_account +* the [output_location_prefix](https://github.com/lyft/flyteidl/blob/c3baba8983019680ef57b6244cea36ba951233ed/protos/flyteidl/admin/common.proto#L250) + +will be included in the serialized protobuf that must be substituted at **create** time. Eventually the hope is that substitution will be done server-side. + +Furthermore, to reproduce the equivalent **fast-register** code path for the flyte-cli defined in flytekit an equivalent _fast-create_ command must fill in additional template variables in the [task container args](https://github.com/lyft/flyteidl/blob/master/protos/flyteidl/core/tasks.proto#L142). These serialized, templatized args will appear like so: + +``` +"pyflyte-fast-execute", +"--additional-distribution", +"{{ .remote_package_path }}", +"--dest-dir", +"{{ .dest_dir }}", +"--", +"pyflyte-execute", +... +``` + +The `remote package path` is determined by uploading the compressed user code (produced in the serialize step) to a user-specified remote directory (called `additional-distribution-dir` in flytekit). In the case of fast-create the code _version_ arg can be deterministcally assigned when serializing the code. Compressed code archives uploaded as individual files to the remote directory can assume the version name to guarantee uniqueness. + +The `dest dir` is an optional argument specified by the user to designate where code is downloaded at execution time. + ![Registration process](flytectl_interaction.png) ### update From 48e15a66678e89844640f73faa1dadc6e1ac5b59 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Sat, 6 Feb 2021 23:06:23 +0530 Subject: [PATCH 016/645] Register file and Get executions functionality (#22) --- flytectl/cmd/core/cmd.go | 15 +- flytectl/cmd/core/cmd_ctx.go | 4 + flytectl/cmd/get/execution.go | 68 ++++++ flytectl/cmd/get/execution_test.go | 219 ++++++++++++++++++ flytectl/cmd/get/get.go | 1 + flytectl/cmd/get/get_test.go | 36 +++ flytectl/cmd/register/files.go | 61 +++++ flytectl/cmd/register/register.go | 23 ++ flytectl/cmd/register/register_test.go | 24 ++ flytectl/cmd/register/register_util.go | 206 ++++++++++++++++ .../cmd/register/registerfilesconfig_flags.go | 46 ++++ .../registerfilesconfig_flags_test.go | 146 ++++++++++++ flytectl/cmd/root.go | 2 + flytectl/go.mod | 2 +- flytectl/go.sum | 2 + flytectl/pkg/printer/printer.go | 7 +- 16 files changed, 854 insertions(+), 8 deletions(-) create mode 100644 flytectl/cmd/get/execution.go create mode 100644 flytectl/cmd/get/execution_test.go create mode 100644 flytectl/cmd/get/get_test.go create mode 100644 flytectl/cmd/register/files.go create mode 100644 flytectl/cmd/register/register.go create mode 100644 flytectl/cmd/register/register_test.go create mode 100644 flytectl/cmd/register/register_util.go create mode 100755 flytectl/cmd/register/registerfilesconfig_flags.go create mode 100755 flytectl/cmd/register/registerfilesconfig_flags_test.go diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 07d57bb14c..8e2463aad2 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -3,6 +3,7 @@ package cmdcore import ( "context" "fmt" + "github.com/spf13/pflag" "github.com/lyft/flyteidl/clients/go/admin" "github.com/spf13/cobra" @@ -10,10 +11,15 @@ import ( "github.com/lyft/flytectl/cmd/config" ) +type PFlagProvider interface { + GetPFlagSet(prefix string) *pflag.FlagSet +} + type CommandEntry struct { ProjectDomainNotRequired bool CmdFunc CommandFunc Aliases []string + PFlagProvider PFlagProvider } func AddCommands(rootCmd *cobra.Command, cmdFuncs map[string]CommandEntry) { @@ -24,7 +30,9 @@ func AddCommands(rootCmd *cobra.Command, cmdFuncs map[string]CommandEntry) { Aliases: cmdEntry.Aliases, RunE: generateCommandFunc(cmdEntry), } - + if cmdEntry.PFlagProvider != nil { + cmd.Flags().AddFlagSet(cmdEntry.PFlagProvider.GetPFlagSet("")) + } rootCmd.AddCommand(cmd) } } @@ -49,9 +57,6 @@ func generateCommandFunc(cmdEntry CommandEntry) func(cmd *cobra.Command, args [] if err != nil { return err } - return cmdEntry.CmdFunc(ctx, args, CommandContext{ - out: cmd.OutOrStdout(), - adminClient: adminClient, - }) + return cmdEntry.CmdFunc(ctx, args, NewCommandContext(adminClient, cmd.OutOrStdout())) } } diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go index c39a0d902a..bf593b2b4c 100644 --- a/flytectl/cmd/core/cmd_ctx.go +++ b/flytectl/cmd/core/cmd_ctx.go @@ -12,6 +12,10 @@ type CommandContext struct { out io.Writer } +func NewCommandContext(adminClient service.AdminServiceClient, out io.Writer) CommandContext { + return CommandContext{adminClient: adminClient, out : out} +} + func (c CommandContext) AdminClient() service.AdminServiceClient { return c.adminClient } diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go new file mode 100644 index 0000000000..b0a51deade --- /dev/null +++ b/flytectl/cmd/get/execution.go @@ -0,0 +1,68 @@ +package get + +import ( + "context" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" + + "github.com/golang/protobuf/proto" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/lyft/flytestdlib/logger" + + "github.com/lyft/flytectl/cmd/config" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flytectl/pkg/printer" +) + +var executionColumns = []printer.Column{ + {"Name", "$.id.name"}, + {"Workflow Name", "$.closure.workflowId.name"}, + {"Type", "$.closure.workflowId.resourceType"}, + {"Phase", "$.closure.phase"}, + {"Started", "$.closure.startedAt"}, + {"Elapsed Time", "$.closure.duration"}, +} + +func ExecutionToProtoMessages(l []*admin.Execution) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages +} + +func getExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + adminPrinter := printer.Printer{} + var executions []* admin.Execution + if len(args) > 0 { + name := args[0] + execution, err := cmdCtx.AdminClient().GetExecution(ctx, &admin.WorkflowExecutionGetRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: name, + }, + }) + if err != nil { + return err + } + executions = append(executions, execution) + } else { + executionList, err := cmdCtx.AdminClient().ListExecutions(ctx, &admin.ResourceListRequest{ + Limit: 100, + Id: &admin.NamedEntityIdentifier{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + }, + }) + if err != nil { + return err + } + executions = executionList.Executions + } + logger.Infof(ctx, "Retrieved %v executions", len(executions)) + err := adminPrinter.Print(config.GetConfig().MustOutputFormat(), executionColumns, ExecutionToProtoMessages(executions)...) + if err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go new file mode 100644 index 0000000000..b7a83cbef6 --- /dev/null +++ b/flytectl/cmd/get/execution_test.go @@ -0,0 +1,219 @@ +package get + +import ( + "context" + "errors" + "github.com/lyft/flytectl/cmd/config" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flyteidl/clients/go/admin/mocks" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" + "github.com/stretchr/testify/assert" + "io" + "testing" +) + +const projectValue = "dummyProject" +const domainValue = "dummyDomain" +const executionNameValue = "e124" +const launchPlanNameValue = "lp_name" +const launchPlanVersionValue = "lp_version" +const workflowNameValue = "wf_name" +const workflowVersionValue = "wf_version" + +func TestListExecutionFunc(t *testing.T) { + ctx := context.Background() + config.GetConfig().Project = projectValue + config.GetConfig().Domain = domainValue + config.GetConfig().Output = "json" + var args []string + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + execListRequest := &admin.ResourceListRequest{ + Limit: 100, + Id: &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + }, + } + executionResponse := &admin.Execution{ + Id: &core.WorkflowExecutionIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: executionNameValue, + }, + Spec: &admin.ExecutionSpec{ + LaunchPlan: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: launchPlanNameValue, + Version: launchPlanVersionValue, + }, + }, + Closure: &admin.ExecutionClosure{ + WorkflowId: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: workflowNameValue, + Version: workflowVersionValue, + }, + Phase: core.WorkflowExecution_SUCCEEDED, + }, + } + var executions []*admin.Execution + executions = append(executions, executionResponse) + executionList := &admin.ExecutionList{ + Executions: executions, + } + mockClient.OnListExecutionsMatch(ctx, execListRequest).Return(executionList, nil) + err := getExecutionFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListExecutions", ctx, execListRequest) +} + +func TestListExecutionFuncWithError(t *testing.T) { + ctx := context.Background() + config.GetConfig().Project = projectValue + config.GetConfig().Domain = domainValue + config.GetConfig().Output = "json" + var args []string + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + execListRequest := &admin.ResourceListRequest{ + Limit: 100, + Id: &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + }, + } + executionResponse := &admin.Execution{ + Id: &core.WorkflowExecutionIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: executionNameValue, + }, + Spec: &admin.ExecutionSpec{ + LaunchPlan: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: launchPlanNameValue, + Version: launchPlanVersionValue, + }, + }, + Closure: &admin.ExecutionClosure{ + WorkflowId: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: workflowNameValue, + Version: workflowVersionValue, + }, + Phase: core.WorkflowExecution_SUCCEEDED, + }, + } + var executions []*admin.Execution + executions = append(executions, executionResponse) + mockClient.OnListExecutionsMatch(ctx, execListRequest).Return(nil, errors.New("Executions NotFound.")) + err := getExecutionFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, err, errors.New("Executions NotFound.")) + mockClient.AssertCalled(t, "ListExecutions", ctx, execListRequest) +} + +func TestGetExecutionFunc(t *testing.T) { + ctx := context.Background() + config.GetConfig().Project = projectValue + config.GetConfig().Domain = domainValue + config.GetConfig().Output = "json" + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + execGetRequest := &admin.WorkflowExecutionGetRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: executionNameValue, + }, + } + executionResponse := &admin.Execution{ + Id: &core.WorkflowExecutionIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: executionNameValue, + }, + Spec: &admin.ExecutionSpec{ + LaunchPlan: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: launchPlanNameValue, + Version: launchPlanVersionValue, + }, + }, + Closure: &admin.ExecutionClosure{ + WorkflowId: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: workflowNameValue, + Version: workflowVersionValue, + }, + Phase: core.WorkflowExecution_SUCCEEDED, + }, + } + var executions []*admin.Execution + executions = append(executions, executionResponse) + args := []string{executionNameValue} + mockClient.OnGetExecutionMatch(ctx, execGetRequest).Return(executionResponse, nil) + err := getExecutionFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "GetExecution", ctx, execGetRequest) +} + +func TestGetExecutionFuncWithError(t *testing.T) { + ctx := context.Background() + config.GetConfig().Project = projectValue + config.GetConfig().Domain = domainValue + config.GetConfig().Output = "json" + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + execGetRequest := &admin.WorkflowExecutionGetRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: executionNameValue, + }, + } + executionResponse := &admin.Execution{ + Id: &core.WorkflowExecutionIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: executionNameValue, + }, + Spec: &admin.ExecutionSpec{ + LaunchPlan: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: launchPlanNameValue, + Version: launchPlanVersionValue, + }, + }, + Closure: &admin.ExecutionClosure{ + WorkflowId: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: workflowNameValue, + Version: workflowVersionValue, + }, + Phase: core.WorkflowExecution_SUCCEEDED, + }, + } + var executions []*admin.Execution + executions = append(executions, executionResponse) + args := []string{executionNameValue} + mockClient.OnGetExecutionMatch(ctx, execGetRequest).Return(nil, errors.New("Execution NotFound.")) + err := getExecutionFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, err, errors.New("Execution NotFound.")) + mockClient.AssertCalled(t, "GetExecution", ctx, execGetRequest) +} diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index 097206c2ff..ed86e5d0d0 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -18,6 +18,7 @@ func CreateGetCommand() *cobra.Command { "task": {CmdFunc: getTaskFunc, Aliases: []string{"tasks"}}, "workflow": {CmdFunc: getWorkflowFunc, Aliases: []string{"workflows"}}, "launchplan": {CmdFunc: getLaunchPlanFunc, Aliases: []string{"launchplans"}}, + "execution": {CmdFunc: getExecutionFunc, Aliases: []string{"executions"}}, } cmdcore.AddCommands(getCmd, getResourcesFuncs) diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go new file mode 100644 index 0000000000..8602d161c7 --- /dev/null +++ b/flytectl/cmd/get/get_test.go @@ -0,0 +1,36 @@ +package get + +import ( + "fmt" + "github.com/stretchr/testify/assert" + "sort" + "testing" +) + +func TestCreateGetCommand(t *testing.T) { + getCommand := CreateGetCommand() + assert.Equal(t, getCommand.Use , "get") + assert.Equal(t, getCommand.Short , "Retrieve various resource.") + fmt.Println(getCommand.Commands()) + assert.Equal(t, len(getCommand.Commands()), 5) + cmdNouns := getCommand.Commands() + // Sort by Use value. + sort.Slice(cmdNouns, func(i, j int) bool { + return cmdNouns[i].Use < cmdNouns[j].Use + }) + assert.Equal(t, cmdNouns[0].Use, "execution") + assert.Equal(t, cmdNouns[0].Aliases, []string{"executions"}) + assert.Equal(t, cmdNouns[0].Short, "Retrieves execution resources.") + assert.Equal(t, cmdNouns[1].Use, "launchplan") + assert.Equal(t, cmdNouns[1].Aliases, []string{"launchplans"}) + assert.Equal(t, cmdNouns[1].Short, "Retrieves launchplan resources.") + assert.Equal(t, cmdNouns[2].Use, "project") + assert.Equal(t, cmdNouns[2].Aliases, []string{"projects"}) + assert.Equal(t, cmdNouns[2].Short, "Retrieves project resources.") + assert.Equal(t, cmdNouns[3].Use, "task") + assert.Equal(t, cmdNouns[3].Aliases, []string{"tasks"}) + assert.Equal(t, cmdNouns[3].Short, "Retrieves task resources.") + assert.Equal(t, cmdNouns[4].Use, "workflow") + assert.Equal(t, cmdNouns[4].Aliases, []string{"workflows"}) + assert.Equal(t, cmdNouns[4].Short, "Retrieves workflow resources.") +} diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go new file mode 100644 index 0000000000..4787a69b27 --- /dev/null +++ b/flytectl/cmd/register/files.go @@ -0,0 +1,61 @@ +package register + +import ( + "context" + "encoding/json" + "fmt" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flytectl/pkg/printer" + "github.com/lyft/flytestdlib/logger" + "io/ioutil" + "sort" +) + +func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + files := args + sort.Strings(files) + logger.Infof(ctx, "Parsing files... Total(%v)", len(files)) + logger.Infof(ctx, "Params version %v", filesConfig.version) + var registerResults [] RegisterResult + adminPrinter := printer.Printer{} + fastFail := !filesConfig.skipOnError + logger.Infof(ctx, "Fail fast %v", fastFail) + var _err error + for i := 0; i< len(files) && !(fastFail && _err != nil) ; i++ { + absFilePath := files[i] + var registerResult RegisterResult + logger.Infof(ctx, "Parsing %v", absFilePath) + fileContents, err := ioutil.ReadFile(absFilePath) + if err != nil { + registerResult = RegisterResult{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error reading file due to %v", err)} + registerResults = append(registerResults, registerResult) + _err = err + continue + } + spec, err := unMarshalContents(ctx, fileContents, absFilePath) + if err != nil { + registerResult = RegisterResult{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error unmarshalling file due to %v", err)} + registerResults = append(registerResults, registerResult) + _err = err + continue + } + if err := hydrateSpec(spec); err != nil { + registerResult = RegisterResult{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error hydrating spec due to %v", err)} + registerResults = append(registerResults, registerResult) + _err = err + continue + } + logger.Debugf(ctx, "Hydrated spec : %v", getJsonSpec(spec)) + if err := register(ctx, spec, cmdCtx); err != nil { + registerResult = RegisterResult{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error registering file due to %v", err)} + registerResults = append(registerResults, registerResult) + _err = err + continue + } + registerResult = RegisterResult{Name: absFilePath, Status: "Success", Info: "Successfully registered file"} + registerResults = append(registerResults, registerResult) + } + payload, _ := json.Marshal(registerResults) + adminPrinter.JSONToTable(payload, projectColumns) + return nil +} diff --git a/flytectl/cmd/register/register.go b/flytectl/cmd/register/register.go new file mode 100644 index 0000000000..f6381521e4 --- /dev/null +++ b/flytectl/cmd/register/register.go @@ -0,0 +1,23 @@ +package register + +import ( + cmdcore "github.com/lyft/flytectl/cmd/core" + "github.com/spf13/cobra" +) + +// RegisterCommand will return register command +func RegisterCommand() *cobra.Command { + registerCmd := &cobra.Command{ + Use: "register", + Short: "Registers tasks/workflows/launchplans from list of generated serialized files.", + Long: "Takes input files as serialized versions of the tasks/workflows/launchplans and registers them with flyteadmin.\n" + + "Currently these input files are protobuf files generated as output from flytekit serialize.\n" + + "Project & Domain are mandatory fields to be passed for registration and an optional version which defaults to v1\n" + + "If the entities are already registered with flyte for the same version then registration would fail.\n", + } + registerResourcesFuncs := map[string]cmdcore.CommandEntry{ + "files": {CmdFunc: registerFromFilesFunc, Aliases: []string{"file"}, PFlagProvider: filesConfig}, + } + cmdcore.AddCommands(registerCmd, registerResourcesFuncs) + return registerCmd +} diff --git a/flytectl/cmd/register/register_test.go b/flytectl/cmd/register/register_test.go new file mode 100644 index 0000000000..99e4a6964f --- /dev/null +++ b/flytectl/cmd/register/register_test.go @@ -0,0 +1,24 @@ +package register + +import ( + "fmt" + "github.com/stretchr/testify/assert" + "sort" + "testing" +) + +func TestRegisterCommand(t *testing.T) { + registerCommand := RegisterCommand() + assert.Equal(t, registerCommand.Use, "register") + assert.Equal(t, registerCommand.Short, "Registers tasks/workflows/launchplans from list of generated serialized files.") + fmt.Println(registerCommand.Commands()) + assert.Equal(t, len(registerCommand.Commands()), 1) + cmdNouns := registerCommand.Commands() + // Sort by Use value. + sort.Slice(cmdNouns, func(i, j int) bool { + return cmdNouns[i].Use < cmdNouns[j].Use + }) + assert.Equal(t, cmdNouns[0].Use, "files") + assert.Equal(t, cmdNouns[0].Aliases, []string{"file"}) + assert.Equal(t, cmdNouns[0].Short, "Retrieves files resources.") +} diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go new file mode 100644 index 0000000000..5149fd1e21 --- /dev/null +++ b/flytectl/cmd/register/register_util.go @@ -0,0 +1,206 @@ +package register + +import ( + "context" + "errors" + "fmt" + "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/proto" + "github.com/lyft/flytectl/cmd/config" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flytectl/pkg/printer" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" + "github.com/lyft/flytestdlib/logger" +) + +//go:generate pflags RegisterFilesConfig + +var ( + filesConfig = &RegisterFilesConfig{ + version: "v1", + skipOnError: false, + } +) + +const registrationProjectPattern = "{{ registration.project }}" +const registrationDomainPattern = "{{ registration.domain }}" +const registrationVersionPattern = "{{ registration.version }}" + +type RegisterFilesConfig struct { + version string `json:"version" pflag:",version of the entity to be registered with flyte."` + skipOnError bool `json:"skipOnError" pflag:",fail fast when registering files."` +} + +type RegisterResult struct { + Name string + Status string + Info string +} + +var projectColumns = []printer.Column{ + {"Name", "$.Name"}, + {"Status", "$.Status"}, + {"Additional Info", "$.Info"}, +} + +func unMarshalContents(ctx context.Context, fileContents []byte, fname string) (proto.Message, error) { + workflowSpec := &admin.WorkflowSpec{} + if err := proto.Unmarshal(fileContents, workflowSpec); err == nil { + return workflowSpec, nil + } + logger.Debugf(ctx, "Failed to unmarshal file %v for workflow type", fname) + taskSpec := &admin.TaskSpec{} + if err := proto.Unmarshal(fileContents, taskSpec); err == nil { + return taskSpec, nil + } + logger.Debugf(ctx, "Failed to unmarshal file %v for task type", fname) + launchPlan := &admin.LaunchPlan{} + if err := proto.Unmarshal(fileContents, launchPlan); err == nil { + return launchPlan, nil + } + logger.Debugf(ctx, "Failed to unmarshal file %v for launch plan type", fname) + return nil, errors.New(fmt.Sprintf("Failed unmarshalling file %v", fname)) + +} + +func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.CommandContext) error { + switch message.(type) { + case *admin.LaunchPlan: + launchPlan := message.(*admin.LaunchPlan) + _, err := cmdCtx.AdminClient().CreateLaunchPlan(ctx, &admin.LaunchPlanCreateRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_LAUNCH_PLAN, + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: launchPlan.Id.Name, + Version: filesConfig.version, + }, + Spec: launchPlan.Spec, + }) + return err + case *admin.WorkflowSpec: + workflowSpec := message.(*admin.WorkflowSpec) + _, err := cmdCtx.AdminClient().CreateWorkflow(ctx, &admin.WorkflowCreateRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_WORKFLOW, + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: workflowSpec.Template.Id.Name, + Version: filesConfig.version, + }, + Spec: workflowSpec, + }) + return err + case *admin.TaskSpec: + taskSpec := message.(*admin.TaskSpec) + _, err := cmdCtx.AdminClient().CreateTask(ctx, &admin.TaskCreateRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_TASK, + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: taskSpec.Template.Id.Name, + Version: filesConfig.version, + }, + Spec: taskSpec, + }) + return err + default: + return errors.New(fmt.Sprintf("Failed registering unknown entity %v", message)) + } +} + +func hydrateNode(node *core.Node) error { + targetNode := node.Target + switch targetNode.(type) { + case *core.Node_TaskNode: + taskNodeWrapper := targetNode.(*core.Node_TaskNode) + taskNodeReference := taskNodeWrapper.TaskNode.Reference.(*core.TaskNode_ReferenceId) + hydrateIdentifier(taskNodeReference.ReferenceId) + case *core.Node_WorkflowNode: + workflowNodeWrapper := targetNode.(*core.Node_WorkflowNode) + switch workflowNodeWrapper.WorkflowNode.Reference.(type) { + case *core.WorkflowNode_SubWorkflowRef: + subWorkflowNodeReference := workflowNodeWrapper.WorkflowNode.Reference.(*core.WorkflowNode_SubWorkflowRef) + hydrateIdentifier(subWorkflowNodeReference.SubWorkflowRef) + case *core.WorkflowNode_LaunchplanRef: + launchPlanNodeReference := workflowNodeWrapper.WorkflowNode.Reference.(*core.WorkflowNode_LaunchplanRef) + hydrateIdentifier(launchPlanNodeReference.LaunchplanRef) + default: + errors.New(fmt.Sprintf("Unknown type %T", workflowNodeWrapper.WorkflowNode.Reference)) + } + case *core.Node_BranchNode: + branchNodeWrapper := targetNode.(*core.Node_BranchNode) + hydrateNode(branchNodeWrapper.BranchNode.IfElse.Case.ThenNode) + if len(branchNodeWrapper.BranchNode.IfElse.Other) > 0 { + for _, ifBlock := range branchNodeWrapper.BranchNode.IfElse.Other { + hydrateNode(ifBlock.ThenNode) + } + } + switch branchNodeWrapper.BranchNode.IfElse.Default.(type) { + case *core.IfElseBlock_ElseNode: + elseNodeReference := branchNodeWrapper.BranchNode.IfElse.Default.(*core.IfElseBlock_ElseNode) + hydrateNode(elseNodeReference.ElseNode) + case *core.IfElseBlock_Error: + // Do nothing. + default: + return errors.New(fmt.Sprintf("Unknown type %T", branchNodeWrapper.BranchNode.IfElse.Default)) + } + default: + return errors.New(fmt.Sprintf("Unknown type %T", targetNode)) + } + return nil +} + +func hydrateIdentifier(identifier *core.Identifier) { + if identifier.Project == "" || identifier.Project == registrationProjectPattern { + identifier.Project = config.GetConfig().Project + } + if identifier.Domain == "" || identifier.Domain == registrationDomainPattern { + identifier.Domain = config.GetConfig().Domain + } + if identifier.Version == "" || identifier.Version == registrationVersionPattern { + identifier.Version = filesConfig.version + } +} + +func hydrateSpec(message proto.Message) error { + switch message.(type) { + case *admin.LaunchPlan: + launchPlan := message.(*admin.LaunchPlan) + hydrateIdentifier(launchPlan.Spec.WorkflowId) + case *admin.WorkflowSpec: + workflowSpec := message.(*admin.WorkflowSpec) + for _, Noderef := range workflowSpec.Template.Nodes { + if err := hydrateNode(Noderef); err != nil { + return err + } + } + hydrateIdentifier(workflowSpec.Template.Id) + for _, subWorkflow := range workflowSpec.SubWorkflows { + for _, Noderef := range subWorkflow.Nodes { + if err := hydrateNode(Noderef); err != nil { + return err + } + } + hydrateIdentifier(subWorkflow.Id) + } + case *admin.TaskSpec: + taskSpec := message.(*admin.TaskSpec) + hydrateIdentifier(taskSpec.Template.Id) + default: + return errors.New(fmt.Sprintf("Unknown type %T", message)) + } + return nil +} + +func getJsonSpec(message proto.Message) string { + marshaller := jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + Indent: " ", + OrigName: true, + } + jsonSpec, _ := marshaller.MarshalToString(message) + return jsonSpec +} diff --git a/flytectl/cmd/register/registerfilesconfig_flags.go b/flytectl/cmd/register/registerfilesconfig_flags.go new file mode 100755 index 0000000000..97c5884485 --- /dev/null +++ b/flytectl/cmd/register/registerfilesconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package register + +import ( + "encoding/json" + "fmt" + "reflect" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (RegisterFilesConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (RegisterFilesConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in RegisterFilesConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg RegisterFilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("RegisterFilesConfig", pflag.ExitOnError) + cmdFlags.StringVarP(&(filesConfig.version),fmt.Sprintf("%v%v", prefix, "version"), "v", "v1", "version of the entity to be registered with flyte.") + cmdFlags.BoolVarP(&(filesConfig.skipOnError), fmt.Sprintf("%v%v", prefix, "skipOnError"), "s", *new(bool), "fail fast when registering files.") + return cmdFlags +} diff --git a/flytectl/cmd/register/registerfilesconfig_flags_test.go b/flytectl/cmd/register/registerfilesconfig_flags_test.go new file mode 100755 index 0000000000..9c055e83e4 --- /dev/null +++ b/flytectl/cmd/register/registerfilesconfig_flags_test.go @@ -0,0 +1,146 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package register + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsRegisterFilesConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementRegisterFilesConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsRegisterFilesConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookRegisterFilesConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementRegisterFilesConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_RegisterFilesConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookRegisterFilesConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_RegisterFilesConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_RegisterFilesConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_RegisterFilesConfig(val, result)) +} + +func testDecodeSlice_RegisterFilesConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_RegisterFilesConfig(vStringSlice, result)) +} + +func TestRegisterFilesConfig_GetPFlagSet(t *testing.T) { + val := RegisterFilesConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestRegisterFilesConfig_SetFlags(t *testing.T) { + actual := RegisterFilesConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_version", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("version"); err == nil { + assert.Equal(t, string("v1"), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("version", testValue) + if vString, err := cmdFlags.GetString("version"); err == nil { + testDecodeJson_RegisterFilesConfig(t, fmt.Sprintf("%v", vString), &actual.version) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_skipOnError", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vBool, err := cmdFlags.GetBool("skipOnError"); err == nil { + assert.Equal(t, bool(*new(bool)), vBool) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("skipOnError", testValue) + if vBool, err := cmdFlags.GetBool("skipOnError"); err == nil { + testDecodeJson_RegisterFilesConfig(t, fmt.Sprintf("%v", vBool), &actual.skipOnError) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 11593ba3c0..39f5d25e8d 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "context" "fmt" + "github.com/lyft/flytectl/cmd/register" "github.com/lyft/flytectl/cmd/get" "github.com/lyft/flytectl/pkg/printer" @@ -37,6 +38,7 @@ func newRootCmd() *cobra.Command { rootCmd.AddCommand(viper.GetConfigCommand()) rootCmd.AddCommand(versionCmd) rootCmd.AddCommand(get.CreateGetCommand()) + rootCmd.AddCommand(register.RegisterCommand()) config.GetConfig() return rootCmd diff --git a/flytectl/go.mod b/flytectl/go.mod index e7872d901a..b2617470b1 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -8,7 +8,7 @@ require ( github.com/golang/protobuf v1.3.2 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 - github.com/lyft/flyteidl v0.18.1 + github.com/lyft/flyteidl v0.18.11 github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/mapstructure v1.1.2 diff --git a/flytectl/go.sum b/flytectl/go.sum index 729c0ddc2e..b89512e672 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -192,6 +192,8 @@ github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1 h1:SH30nioTpP github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= github.com/lyft/flyteidl v0.18.1 h1:COKkZi5k6bQvUYOk5gE70+FJX9/NUn0WOQ1uMrw3Qio= github.com/lyft/flyteidl v0.18.1/go.mod h1:/zQXxuHO11u/saxTTZc8oYExIGEShXB+xCB1/F1Cu20= +github.com/lyft/flyteidl v0.18.11 h1:24NaFYWxANhRbwKfvkgu8axGTWUcl1tgZBqNJutKNJ8= +github.com/lyft/flyteidl v0.18.11/go.mod h1:/zQXxuHO11u/saxTTZc8oYExIGEShXB+xCB1/F1Cu20= github.com/lyft/flytestdlib v0.3.0/go.mod h1:LJPPJlkFj+wwVWMrQT3K5JZgNhZi2mULsCG4ZYhinhU= github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa h1:anYLG/feMdMv321AfhHGBRd0S3cPLFFTZvJYssjhxFo= github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa/go.mod h1:LJPPJlkFj+wwVWMrQT3K5JZgNhZi2mULsCG4ZYhinhU= diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index e1d57d3266..a41d6bcb92 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -73,7 +73,7 @@ func projectColumns(rows []interface{}, column []Column) ([][]string, error) { return responses, nil } -func JSONToTable(jsonRows []byte, columns []Column) error { +func (p Printer) JSONToTable(jsonRows []byte, columns []Column) error { var rawRows []interface{} if err := json.Unmarshal(jsonRows, &rawRows); err != nil { return errors.Wrapf("JSONUnmarshalFailure", err, "failed to unmarshal into []interface{} from json") @@ -90,6 +90,9 @@ func JSONToTable(jsonRows []byte, columns []Column) error { printer.AutoWrapText = false printer.BorderLeft = true printer.BorderRight = true + printer.BorderBottom = true + printer.BorderTop = true + printer.RowLine = true printer.ColumnSeparator = "|" printer.HeaderBgColor = tablewriter.BgHiWhiteColor headers := make([]string, 0, len(columns)) @@ -141,7 +144,7 @@ func (p Printer) Print(format OutputFormat, columns []Column, messages ...proto. if err != nil { return errors.Wrapf("ProtoToJSONFailure", err, "failed to marshal proto messages") } - return JSONToTable(rows, columns) + return p.JSONToTable(rows, columns) } return nil } From a0561024f6edc82699f004410508c91208fbc0f5 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Sun, 7 Feb 2021 20:43:43 +0530 Subject: [PATCH 017/645] Archive and Update project command (#24) --- flytectl/cmd/root.go | 2 + flytectl/cmd/update/project.go | 52 +++++++ flytectl/cmd/update/project_test.go | 130 ++++++++++++++++ flytectl/cmd/update/projectconfig_flags.go | 47 ++++++ .../cmd/update/projectconfig_flags_test.go | 146 ++++++++++++++++++ flytectl/cmd/update/update.go | 22 +++ flytectl/cmd/update/update_test.go | 21 +++ flytectl/docs/CONTRIBUTING.md | 7 +- 8 files changed, 424 insertions(+), 3 deletions(-) create mode 100644 flytectl/cmd/update/project.go create mode 100644 flytectl/cmd/update/project_test.go create mode 100755 flytectl/cmd/update/projectconfig_flags.go create mode 100755 flytectl/cmd/update/projectconfig_flags_test.go create mode 100644 flytectl/cmd/update/update.go create mode 100644 flytectl/cmd/update/update_test.go diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 39f5d25e8d..7dca669327 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "context" "fmt" + "github.com/lyft/flytectl/cmd/update" "github.com/lyft/flytectl/cmd/register" "github.com/lyft/flytectl/cmd/get" @@ -38,6 +39,7 @@ func newRootCmd() *cobra.Command { rootCmd.AddCommand(viper.GetConfigCommand()) rootCmd.AddCommand(versionCmd) rootCmd.AddCommand(get.CreateGetCommand()) + rootCmd.AddCommand(update.CreateUpdateCommand()) rootCmd.AddCommand(register.RegisterCommand()) config.GetConfig() diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go new file mode 100644 index 0000000000..b00d91bf59 --- /dev/null +++ b/flytectl/cmd/update/project.go @@ -0,0 +1,52 @@ +package update + +import ( + "context" + "fmt" + "github.com/lyft/flytectl/cmd/config" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" +) + +//go:generate pflags ProjectConfig + +// Config hold configuration for project update flags. +type ProjectConfig struct { + ActivateProject bool `json:"activateProject" pflag:",Activates the project specified as argument."` + ArchiveProject bool `json:"archiveProject" pflag:",Archives the project specified as argument."` +} + +var ( + projectConfig = &ProjectConfig{} + errProjectNotFound = "Project %v not found\n" + errInvalidUpdate = "Invalid state passed. Specify either activate or archive\n" + errFailedUpdate = "Project %v failed to get updated to %v state due to %v\n" +) + +func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + id := config.GetConfig().Project + if id == "" { + fmt.Printf(errProjectNotFound, id) + return nil + } + archiveProject := projectConfig.ArchiveProject + activateProject := projectConfig.ActivateProject + if activateProject == archiveProject { + fmt.Printf(errInvalidUpdate) + return nil + } + projectState := admin.Project_ACTIVE + if archiveProject { + projectState = admin.Project_ARCHIVED + } + _, err := cmdCtx.AdminClient().UpdateProject(ctx, &admin.Project{ + Id: id, + State: projectState, + }) + if err != nil { + fmt.Printf(errFailedUpdate, id, projectState, err) + return nil + } + fmt.Printf("Project %v updated to %v state\n", id, projectState) + return nil +} diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go new file mode 100644 index 0000000000..cf9fe7678b --- /dev/null +++ b/flytectl/cmd/update/project_test.go @@ -0,0 +1,130 @@ +package update + +import ( + "bytes" + "context" + "errors" + "github.com/lyft/flytectl/cmd/config" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flyteidl/clients/go/admin/mocks" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/stretchr/testify/assert" + "io" + "log" + "os" + "testing" +) + +const projectValue = "dummyProject" + +var ( + reader *os.File + writer *os.File + err error + ctx context.Context + mockClient *mocks.AdminServiceClient + mockOutStream io.Writer + args []string + cmdCtx cmdCore.CommandContext + projectUpdateRequest *admin.Project + stdOut *os.File + stderr *os.File +) + +func setup() { + reader, writer, err = os.Pipe() + if err != nil { + panic(err) + } + stdOut = os.Stdout + stderr = os.Stderr + os.Stdout = writer + os.Stderr = writer + log.SetOutput(writer) + config.GetConfig().Project = projectValue + mockClient = new(mocks.AdminServiceClient) + mockOutStream = writer + cmdCtx = cmdCore.NewCommandContext(mockClient, mockOutStream) + projectUpdateRequest = &admin.Project{ + Id: projectValue, + State: admin.Project_ACTIVE, + } +} + +func teardownAndVerify(t *testing.T, expectedLog string) { + writer.Close() + os.Stdout = stdOut + os.Stderr = stderr + var buf bytes.Buffer + io.Copy(&buf, reader) + assert.Equal(t, expectedLog, buf.String()) +} + +func modifyProjectFlags(archiveProject *bool, newArchiveVal bool, activateProject *bool, newActivateVal bool) { + *archiveProject = newArchiveVal + *activateProject = newActivateVal +} + +func TestActivateProjectFunc(t *testing.T) { + setup() + defer teardownAndVerify(t, "Project dummyProject updated to ACTIVE state\n") + modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) + mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) + updateProjectsFunc(ctx, args, cmdCtx) + mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) +} + +func TestActivateProjectFuncWithError(t *testing.T) { + setup() + defer teardownAndVerify(t, "Project dummyProject failed to get updated to ACTIVE state due to Error Updating Project\n") + modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) + mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) + updateProjectsFunc(ctx, args, cmdCtx) + mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) +} + +func TestArchiveProjectFunc(t *testing.T) { + setup() + defer teardownAndVerify(t, "Project dummyProject updated to ARCHIVED state\n") + modifyProjectFlags(&(projectConfig.ArchiveProject), true, &(projectConfig.ActivateProject), false) + projectUpdateRequest := &admin.Project{ + Id: projectValue, + State: admin.Project_ARCHIVED, + } + mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) + err := updateProjectsFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) +} + +func TestArchiveProjectFuncWithError(t *testing.T) { + setup() + defer teardownAndVerify(t, "Project dummyProject failed to get updated to ARCHIVED state due to Error Updating Project\n") + modifyProjectFlags(&(projectConfig.ArchiveProject), true, &(projectConfig.ActivateProject), false) + projectUpdateRequest := &admin.Project{ + Id: projectValue, + State: admin.Project_ARCHIVED, + } + mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) + updateProjectsFunc(ctx, args, cmdCtx) + mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) +} + +func TestEmptyProjectInput(t *testing.T) { + setup() + defer teardownAndVerify(t, "Project not found\n") + config.GetConfig().Project = "" + modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) + mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) + updateProjectsFunc(ctx, args, cmdCtx) + mockClient.AssertNotCalled(t, "UpdateProject", ctx, projectUpdateRequest) +} + +func TestInvalidInput(t *testing.T) { + setup() + defer teardownAndVerify(t, "Invalid state passed. Specify either activate or archive\n") + modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), false) + mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) + updateProjectsFunc(ctx, args, cmdCtx) + mockClient.AssertNotCalled(t, "UpdateProject", ctx, projectUpdateRequest) +} diff --git a/flytectl/cmd/update/projectconfig_flags.go b/flytectl/cmd/update/projectconfig_flags.go new file mode 100755 index 0000000000..e214a4fe1f --- /dev/null +++ b/flytectl/cmd/update/projectconfig_flags.go @@ -0,0 +1,47 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package update + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (ProjectConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (ProjectConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in ProjectConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg ProjectConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("ProjectConfig", pflag.ExitOnError) + cmdFlags.BoolVarP(&(projectConfig.ActivateProject), fmt.Sprintf("%v%v", prefix, "activateProject"),"t", *new(bool), "Activates the project specified as argument.") + cmdFlags.BoolVarP(&(projectConfig.ArchiveProject), fmt.Sprintf("%v%v", prefix, "archiveProject"), "a", *new(bool), "Archives the project specified as argument.") + return cmdFlags +} diff --git a/flytectl/cmd/update/projectconfig_flags_test.go b/flytectl/cmd/update/projectconfig_flags_test.go new file mode 100755 index 0000000000..4a13ad3aff --- /dev/null +++ b/flytectl/cmd/update/projectconfig_flags_test.go @@ -0,0 +1,146 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package update + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsProjectConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementProjectConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsProjectConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookProjectConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementProjectConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_ProjectConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookProjectConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_ProjectConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_ProjectConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_ProjectConfig(val, result)) +} + +func testDecodeSlice_ProjectConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_ProjectConfig(vStringSlice, result)) +} + +func TestProjectConfig_GetPFlagSet(t *testing.T) { + val := ProjectConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestProjectConfig_SetFlags(t *testing.T) { + actual := ProjectConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_activateProject", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vBool, err := cmdFlags.GetBool("activateProject"); err == nil { + assert.Equal(t, bool(*new(bool)), vBool) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("activateProject", testValue) + if vBool, err := cmdFlags.GetBool("activateProject"); err == nil { + testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vBool), &actual.ActivateProject) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_archiveProject", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vBool, err := cmdFlags.GetBool("archiveProject"); err == nil { + assert.Equal(t, bool(*new(bool)), vBool) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("archiveProject", testValue) + if vBool, err := cmdFlags.GetBool("archiveProject"); err == nil { + testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vBool), &actual.ArchiveProject) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go new file mode 100644 index 0000000000..ac83b69200 --- /dev/null +++ b/flytectl/cmd/update/update.go @@ -0,0 +1,22 @@ +package update + +import ( + cmdcore "github.com/lyft/flytectl/cmd/core" + + "github.com/spf13/cobra" +) + +// CreateUpdateCommand will return update command +func CreateUpdateCommand() *cobra.Command { + updateCmd := &cobra.Command{ + Use: "update", + Short: "Update various resources.", + } + + updateResourcesFuncs := map[string]cmdcore.CommandEntry{ + "project": {CmdFunc: updateProjectsFunc, Aliases: []string{"projects"}, ProjectDomainNotRequired: true, PFlagProvider: projectConfig}, + } + + cmdcore.AddCommands(updateCmd, updateResourcesFuncs) + return updateCmd +} diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go new file mode 100644 index 0000000000..749d00a6a0 --- /dev/null +++ b/flytectl/cmd/update/update_test.go @@ -0,0 +1,21 @@ +package update + +import ( + "github.com/stretchr/testify/assert" + "sort" + "testing" +) + +func TestUpdateCommand(t *testing.T) { + updateCommand := CreateUpdateCommand() + assert.Equal(t, updateCommand.Use , "update") + assert.Equal(t, updateCommand.Short , "Update various resources.") + assert.Equal(t, len(updateCommand.Commands()), 1) + cmdNouns := updateCommand.Commands() + // Sort by Use value. + sort.Slice(cmdNouns, func(i, j int) bool { + return cmdNouns[i].Use < cmdNouns[j].Use + }) + assert.Equal(t, cmdNouns[0].Use, "project") + assert.Equal(t, cmdNouns[0].Aliases, []string{"projects"}) +} diff --git a/flytectl/docs/CONTRIBUTING.md b/flytectl/docs/CONTRIBUTING.md index 0249359719..391bee6d82 100644 --- a/flytectl/docs/CONTRIBUTING.md +++ b/flytectl/docs/CONTRIBUTING.md @@ -4,12 +4,13 @@ A local cluster can be setup via --> https://lyft.github.io/flyte/administrator/ Then, if having trouble connecting to local cluster see the following: + #1) Find/Set/Verify gRPC port for your local Flyte service: FLYTECTL_GRPC_PORT=`kubectl get service -n flyte flyteadmin -o json | jq '.spec.ports[] | select(.name=="grpc").port'` -#2) Setup Port forwarding: kubectl port-forward -n flyte service/flyteadmin 8081:$FLYTECTL_GRPC_PORT - -and #3) Update config line in https://github.com/lyft/flytectl/blob/master/config.yaml to dns:///localhost:8081 +#2) Setup Port forwarding: kubectl port-forward -n flyte service/flyteadmin 8081:$FLYTECTL_GRPC_PORT +#3) Update config line in https://github.com/lyft/flytectl/blob/master/config.yaml to dns:///localhost:8081 +#4) All new flags introduced for flytectl commands and subcommands should be camelcased. eg: bin/flytectl update project -p flytesnacks --activateProject From 62dfd32081cbec23f100210225defccd4fdad012 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Mon, 8 Feb 2021 10:51:09 -0800 Subject: [PATCH 018/645] Documentation setup for FlyteCTL (#26) * Documentation setup for FlyteCTL * Conf updated --- flytectl/.gitignore | 1 + flytectl/.readthedocs.yml | 16 ++ flytectl/Makefile | 12 ++ flytectl/doc-requirements.in | 5 + flytectl/doc-requirements.txt | 88 +++++++++ flytectl/docs/Makefile | 20 ++ flytectl/docs/make.bat | 36 ++++ flytectl/docs/source/conf.py | 181 ++++++++++++++++++ flytectl/docs/source/delete.rst | 3 + .../source/flyte_circle_gradient_1_4x4.png | Bin 0 -> 70985 bytes flytectl/docs/source/get.rst | 3 + flytectl/docs/source/index.rst | 76 ++++++++ flytectl/docs/source/launchplan.rst | 3 + flytectl/docs/source/register.rst | 3 + flytectl/docs/source/tasks.rst | 4 + flytectl/docs/source/update.rst | 3 + flytectl/docs/source/workflow.rst | 4 + 17 files changed, 458 insertions(+) create mode 100644 flytectl/.readthedocs.yml create mode 100644 flytectl/doc-requirements.in create mode 100644 flytectl/doc-requirements.txt create mode 100644 flytectl/docs/Makefile create mode 100644 flytectl/docs/make.bat create mode 100644 flytectl/docs/source/conf.py create mode 100644 flytectl/docs/source/delete.rst create mode 100644 flytectl/docs/source/flyte_circle_gradient_1_4x4.png create mode 100644 flytectl/docs/source/get.rst create mode 100644 flytectl/docs/source/index.rst create mode 100644 flytectl/docs/source/launchplan.rst create mode 100644 flytectl/docs/source/register.rst create mode 100644 flytectl/docs/source/tasks.rst create mode 100644 flytectl/docs/source/update.rst create mode 100644 flytectl/docs/source/workflow.rst diff --git a/flytectl/.gitignore b/flytectl/.gitignore index fb3907b444..45283c9a91 100644 --- a/flytectl/.gitignore +++ b/flytectl/.gitignore @@ -5,3 +5,4 @@ bin .DS_Store _test ./config.yaml +docs/build/* diff --git a/flytectl/.readthedocs.yml b/flytectl/.readthedocs.yml new file mode 100644 index 0000000000..1c0f039d3a --- /dev/null +++ b/flytectl/.readthedocs.yml @@ -0,0 +1,16 @@ +# .readthedocs.yml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Build documentation in the docs/ directory with Sphinx +sphinx: + configuration: docs/source/conf.py + +# Optionally set the version of Python and requirements required to build your docs +python: + version: 3.8 + install: + - requirements: doc-requirements.txt diff --git a/flytectl/Makefile b/flytectl/Makefile index 5a8e04ea54..edf00f07ea 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -1,6 +1,10 @@ export REPOSITORY=flytectl include boilerplate/lyft/golang_test_targets/Makefile +define PIP_COMPILE +pip-compile $(1) --upgrade --verbose +endef + generate: go test github.com/lyft/flytectl/cmd --update @@ -10,3 +14,11 @@ compile: .PHONY: update_boilerplate update_boilerplate: @boilerplate/update.sh + +.PHONY: install-piptools +install-piptools: + pip install -U pip-tools + +.PHONY: doc-requirements.txt +doc-requirements.txt: doc-requirements.in install-piptools + $(call PIP_COMPILE,doc-requirements.in) diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in new file mode 100644 index 0000000000..cdb6725a1b --- /dev/null +++ b/flytectl/doc-requirements.in @@ -0,0 +1,5 @@ +sphinx +sphinx-prompt +sphinx-material +sphinx-code-include +sphinx-copybutton diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt new file mode 100644 index 0000000000..d5a288dbd0 --- /dev/null +++ b/flytectl/doc-requirements.txt @@ -0,0 +1,88 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile doc-requirements.in +# +alabaster==0.7.12 + # via sphinx +babel==2.9.0 + # via sphinx +beautifulsoup4==4.9.3 + # via + # sphinx-code-include + # sphinx-material +certifi==2020.12.5 + # via requests +chardet==4.0.0 + # via requests +css-html-js-minify==2.5.5 + # via sphinx-material +docutils==0.16 + # via sphinx +idna==2.10 + # via requests +imagesize==1.2.0 + # via sphinx +jinja2==2.11.3 + # via sphinx +lxml==4.6.2 + # via sphinx-material +markupsafe==1.1.1 + # via jinja2 +packaging==20.9 + # via sphinx +pygments==2.7.4 + # via + # sphinx + # sphinx-prompt +pyparsing==2.4.7 + # via packaging +python-slugify[unidecode]==4.0.1 + # via sphinx-material +pytz==2021.1 + # via babel +requests==2.25.1 + # via sphinx +six==1.15.0 + # via sphinx-code-include +snowballstemmer==2.1.0 + # via sphinx +soupsieve==2.1 + # via beautifulsoup4 +sphinx-code-include==1.1.1 + # via -r doc-requirements.in +sphinx-copybutton==0.3.1 + # via -r doc-requirements.in +sphinx-material==0.0.32 + # via -r doc-requirements.in +sphinx-prompt==1.3.0 + # via -r doc-requirements.in +sphinx==3.4.3 + # via + # -r doc-requirements.in + # sphinx-code-include + # sphinx-copybutton + # sphinx-material + # sphinx-prompt +sphinxcontrib-applehelp==1.0.2 + # via sphinx +sphinxcontrib-devhelp==1.0.2 + # via sphinx +sphinxcontrib-htmlhelp==1.0.3 + # via sphinx +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==1.0.3 + # via sphinx +sphinxcontrib-serializinghtml==1.1.4 + # via sphinx +text-unidecode==1.3 + # via python-slugify +unidecode==1.2.0 + # via python-slugify +urllib3==1.26.3 + # via requests + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/flytectl/docs/Makefile b/flytectl/docs/Makefile new file mode 100644 index 0000000000..e61723ad76 --- /dev/null +++ b/flytectl/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = flytekit +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/flytectl/docs/make.bat b/flytectl/docs/make.bat new file mode 100644 index 0000000000..47d656bb74 --- /dev/null +++ b/flytectl/docs/make.bat @@ -0,0 +1,36 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build +set SPHINXPROJ=simpleble + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py new file mode 100644 index 0000000000..29fba17e72 --- /dev/null +++ b/flytectl/docs/source/conf.py @@ -0,0 +1,181 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/stable/config + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import re + + +# -- Project information ----------------------------------------------------- + +project = "Flytectl" +copyright = "2021, Flyte" +author = "Flyte" + +# The full version, including alpha/beta/rc tags +release = re.sub('^v', '', os.popen('git describe').read().strip()) +version = release + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.autosummary", + "sphinx.ext.autosectionlabel", + "sphinx.ext.todo", + "sphinx.ext.viewcode", + "sphinx.ext.doctest", + "sphinx.ext.coverage", + "sphinx-prompt", + "sphinx_copybutton", +] + +# build the templated autosummary files +autosummary_generate = True + +# autosectionlabel throws warnings if section names are duplicated. +# The following tells autosectionlabel to not throw a warning for +# duplicated section names that are in different documents. +autosectionlabel_prefix_document = True + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = ".rst" + +# The master toctree document. +master_doc = "index" + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path . +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = "sphinx" + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_material" +html_logo = "flyte_circle_gradient_1_4x4.png" +html_theme_options = { + # Set the name of the project to appear in the navigation. + "nav_title": "Flyte", + # Set you GA account ID to enable tracking + "google_analytics_account": "G-YQL24L5CKY", + # Specify a base_url used to generate sitemap.xml. If not + # specified, then no sitemap will be built. + "base_url": "https://github.com/flyteorg/flytectl", + # Set the color and the accent color + "color_primary": "deep-purple", + "color_accent": "blue", + # Set the repo location to get a badge with stats + "repo_url": "https://github.com/flyteorg/flyte/", + "repo_name": "flyte", + # Visible levels of the global TOC; -1 means unlimited + "globaltoc_depth": 1, + # If False, expand all TOC entries + "globaltoc_collapse": False, + # If True, show hidden TOC entries + "globaltoc_includehidden": False, +} + +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +html_sidebars = {"**": ["logo-text.html", "globaltoc.html", "localtoc.html", "searchbox.html"]} + + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = [] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = "flytectldoc" + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, "flytectl.tex", "flytectl Documentation", "Flyte", "manual"), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [(master_doc, "flytectl", "flytectl Documentation", [author], 1)] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ( + master_doc, + "flytectl", + "flytectl Documentation", + author, + "flytectl", + "The one CLI for flyte.", + "Miscellaneous", + ), +] diff --git a/flytectl/docs/source/delete.rst b/flytectl/docs/source/delete.rst new file mode 100644 index 0000000000..3fbaf86d4c --- /dev/null +++ b/flytectl/docs/source/delete.rst @@ -0,0 +1,3 @@ +######################### +Get - Retrieve Entities +######################### diff --git a/flytectl/docs/source/flyte_circle_gradient_1_4x4.png b/flytectl/docs/source/flyte_circle_gradient_1_4x4.png new file mode 100644 index 0000000000000000000000000000000000000000..49cdbbbc3419c1c65ceeb3f11596762e0c60faa4 GIT binary patch literal 70985 zcmb5WcRbbY{|9bm6dkKl$}x@=vWm<@_B@qJB_p%4OUXJ1$*#jWi0p_o2xVrKbtGFz zMw~J;j$<6o_+3Z${rTLV@B00IfAqL}bk{lWab3^Xb6sN2S{iZfJ+ha9fq~1!SpPf& z1CtK@7dtBh1B1)c5f$(s4jSucM zic01w^(C)fz8bf(9ebbOKUXDn?wP)H$1#-uQ2ZUQ2Q~ttDz1@nhlj3|va=xX#lWrkz37$rWWKR|OFKUiAC=6a8$0kW2TQ zWU>#(oKKRnf+aE-#3+RkNP^3zm%Lohhxd!03JJgC;v#xZk|gbTd;2O5(w5MWrEOA^ z*Ka~Yu=nMb?DV>gix@uBk5T%{%W*bI%IP?5wO+$5P(~Hku%5XjR zK(KGd6Lpa0@js#*8I;)8-;JuN4%uiuH8Va>SYAMB79Ry)|M<_x2#-#nW+KOrcWsY5 zy~1yHAn}>9ij3jHmFh`)qURFH#zNcPJS2|tkSe3tih|}B(@R_O@Wa;e&-8EB>ND|+ zn|^lQVO#n>JR1DneysZZQs4Ld?+hega{+VCmQZTjWAfx(@u0`*UbthFUM{Xa^^guSL(!x%nLNO&{Ec8AHz@<}TdVl; zrf%?=U(4*vY-DSOz$5TF#CC6ht7Fl^-)oj9i`qa`ywu}t-x-H*vmYlyhD3krAbyHl z-Vl8Mz7`RweysBDbhoCMwt5`zbCDPpDbpm8j>qYT*b#;0I`_-Y@Rh&>h2gP`9~}_$ zR86A&BQkp=(NFIDe&PkYsfY?jn};7h6=RpgO=+Iw5##7*`iE0?Z~sx*^nnXo2gJ7PSrwk-_TUtr1nlz2u`;)m^aG~`YdA`*j=->#Y@Y5d>)E1*yD^W%n?l=6SByMC?|E0u@XI!!^t0hV4&HH zOMWRZ=h@Z>?vUwMSwi+rXx``f^vmf8y*(3k&tvw@lE=LFRUtnDUr0aR$ir=2P8@!z za~AauZ={e9*^oziS+t*Rt9~O-B^9;}=1QGoO)w69rq7X}0e_d*@Ua|sH}I9FRxS?h zCD+>@fxx#lPUaui<#s)dH^L;6lNz@u&d4Q8>qvF4g*bZ(QLse^ywlseFGSd%qGuYY za#wxM6yd*CWUyCfti$ zFr=@+r+@(p0uoe#IrsgC9JY%g+A2Q^$eUx}^ zFdB!3jnICKXXP44KGVk;!*tFS*q!g24$LpaYS}$It9+8Q+Ki3*gg3&bDoZqc#X!Zn zc#e7Pb>Y;UE21z@^M`P^PEawNn{Y&AeSjHE?_7ZmxCEu-+newut`3=&;`ogfx)SZQERw)%&7gO7n`fmp|Y z3H@pem#8a`*Ndksh?j!C_QIyfScBz4)cGxs}(He`G8x&71elC|zx2z#)5?KE(RRVDb0`cjSa-Pz|2_YKHhXOm)*!P_>^|Gt)Z z4A;w-zLTEz$=Z$_aB`I+l8A3eRn3*GjdIHQFgJmc3orTba*ro-1!4V#c9m$_IOc!O8^SFbZ8U$%p>y%>q3!eZ!WszPdN7zOeB zM*;PN1Lsz5mAOsC4|Qb^$q9j)Vx!2Zm*8^fi!Z*8emR1DM%TJ*r(cIP+|NBZ42dBd z^Gb-zxRzPmJHU*E4jM?)R(<+?h2bt9n?!H3_MS>A;lS$W{&THY=?|vjcDK7!a(?F`i|w1cW*7VzQrQD+0wH?vRvdvNpKGmTUhvP0N6hreV5aLims#`z`%#(`pQCaKU9-$ghpV!N zA?u7~G6DQmngG~u0y^<5>Qz`?Tcnm<=WFrY6OYMl6=n?pNJZbDV1s zB68dl_cq2G5pD-IK&9=HL-jJb(#X#HB)rkKJD%Rxpqm^9H#6y1d+PSGk=u;DlYiRK z@I!^pg}A-Th@iKSR5FX6B7ixViEm%C+jUct_soxia7a^p_m6_tQS~Y(3De;mD`a=# z1hsX2_0+c1o847&?H|+gY`>N$Hfk>h z+C(2PYg1r<5(-eX_w4oax44LmO$l|z$egp!2irbr@%p{t2jj{WOwEq7F5sVID{G3s z)D0%zWq)x0+>N)%<7N*$&2Wgfo;4@hBAS{x7vVx)>Mu}-zOjANM|PeT9NSE;*QRAQ zRGg^ShPvFKUq)_w7y3C=;ll~aW61s&0p0qc;B&If9{f&dN5ih4FLRU_^{BkT0N$hW zTd>IHPA6n5RT!XsA3O91S!Z+S%30I4YqoS-q~4nW7`m0b9%AIH?OFOpb*N=-87 z+|s3KCgvgD$^;Cs9mhhXpW@bbipn!%k?krY$(r$ZSa#|^Iw8#n(INfs7p4TA&Y995 zhw0~#%6!3$5;Oao-qIxBR=km|J<(6=>wAXCsid<~UH7Y`_d4cK!>|T;Jbka z6yq#Z7{HfrMLL=I(}%z__{3gN)znB@lD;i2-}C&kycX7UGcgQhJQIY=-;c$xumw!( z{F&%|`4?vL?TC6muj(UV@`al_iBlIjP7hp3Z$~>ABPgBC_fg|dk7kewmCY30bF5hK zj9ESxznPmZUMSlMzTty`aZXi>er-eq_QTCh4WCE`EjApXk9!lo?1$1np%UVJ%*b|B zFC_UDmYft*E=o$opH6^Uhclp4$j%3F)Eqf^lv%LsL2>ge-UVsX=*4g9>5FS=?s6oa zD%5!;MISA^J&S^~HHKeu7sHh^B%kwOp=Rt>pX*CPKU5s^GX1!IfjB}g@W=4JLJ#?= zdo9&9)CcWLjpr4Y^xY#BD_vXB<>k{Q-aTBh*duJ0NWQ!=e5qGw1I%$=^F6e#RC1&N zGF%Zq5q$@YMzt3u?mKSd{#Xt12Qm7=cK7#hx2J=Cs;b$#!`lf&M zs?@naupjtKh(iA2JHd9-u@B--T}jXu@{0Yb&~;Pu`-S-{<}dC3Pq2t}AGC(SF)Xx) z8#E~H^oDH%>D|_4*;qOi(g$xYxJ3;EJ=grnqA6-_0-m@JIcf5qJqmDIj4FVUju?|c zGc6as9=6$)DusHy|)SoWC5x0*@#%MUsDx&t!~}V=G$+ zbEIrz(sT0i`)ts0?7_5|)wC|o9 z9WFy(iR^I;WzB5?tgs`(H+^oiGQRxKX~~?ub!g}%L}-zMbbihDZ=gXr$+J3g!t)E= z6L04f5_l!waSdbs#ahxPEtW%hv|2k;bF>pG(_gcCl9na{uWFumiWM(ruqa*p_7sUD zJr*TN$0|naoM9vEse_6+P3Pd-2zr5s^(iseg}k1sGDL*UKZ~a+3EZ?%%nPhJD9sjV z_5$)Qntb^q)#mNo7zBER#M6}8WTZxz4s;qnwu}UKWX1_tOUStOXf0@94lZ~BFWqZWhmO@)qk-ZEc9s-yHksKpp&Rkwu3bRd__DtL2IM?uFC5{ zcRbF^k>4X-zLhUDsnz3Z-?rz7E5mEg@i7e3bm*Sf&WPpjofA!Nrqhy ze5E_Frr~?)#t|5JC1IUo>a~gi<65@~pL~Q8oVndo$qGlO0R&otoAGIf(J=WYMO`MD zKNkBx^09uiSICc2ie25|+2T)tn!SY!ZW#hzCkfL`_4DqTs9)VDC@$I240tc!i93~D z683lMpZCup2YMt$@J9KZq{Bpci?jhY=oagyx2E0amyb^KAg~5f5eyv}GOp*7wR}rRDC7q!c)=RXjgb2$_lJGJalUS^T_C7u8 zqtm|UkMorS7Oz#%&Bzg#ko^+Iqe$I&;yidST%9kQdC01Cl3k_F`tb<*W;B_9r*S6Z zPI~>OfA$gkC)qkNGCF)xIK!Foh2LT#aM47vGp}JL51k9`U(=8eV5Y`=CvsG9C_k30 zjcW|iyC*k#4bc)VHcT8>An}NdI#^GBW5XyCA2%Q=6yFC#7Sn5tPleM)D?(cDrof=5 zJ`|uX4ty|1UYiyE$QSUl;bdDFS>UIFr4v@c(UcSw)7>n9lwwV7FQSU0iD$HPJUa&X z962!tbYb*g*%AOi^e>-&;n7ox*;Cz>;!p&+ej?=7cVR6NUXGrK_U{$H1^e!NP&X@H zwC6eXdjR`yr4*HZD+?jd2ix80Kv4)uv%LLtXZldSqz>3~sh`1hs^+6Vm}XQfZxMW37)|J+ z06=5CA%V{$z4)`@bp=J{9aSMCVb+dxDrHD?>pb?>#($#J>QGt=9~PAgTiO}QTt&45(9HhC0{>tWh+UB&40C*n87O#1eOs9Etm2fPv9hQVAtH@Pvt{jd-YrYL`_1bUJ<5&27MH^I9?GF zBDr>P#zgeLV`2t=`GbR6PkKc;{80rXoylqBLD-!q10DYsba}&@r+(qv9&RvxzBGIp zyR>h+3I0KIY2U4CeWroiBXyoTk(PwmApf-Ywm=6DT_QL+NYT+YA23~(ttYVcFm=iG zXVBwAqQKZttD8XcXEPDR1p2Jt%8KLJ1*m!EsdA-KW_WG|tDyUSjTsf{B-Bo*;n09% zOi<`m+1g6aiSNEk8`l${JT!~=dvP20bygN^IS69BI0*mC*@oGujzJToEa%)KlT#&8 zNQpgcMEL-!`m1DeQWF^K0;v@kXkt^_Q|HclN(u5u*w)kFIKZJ(I+i>~OBPQ1Q-b|; zOk;UXk>MN&RYMld-eAOgQ= zBI-z{nCD;6B2hS#$(%LY)_~5PUq?r(V6!`%zJy<+Jt+y9RPQys`LNl@K@RI&e&=?+ zL0k2!8L{$|54s4|x3EuMj_=wkVp+@J*LA`dFdrs$Ims-;$*`82i&$MwlIqk^oWI@M z_%KPW_b7*qXONFuqxKlC1ZW9YcGkCvWMMdOVb!IOn9>4Eu(JghV}oXyoy``L54)2q z#%I*M)*!b20pE{~iN>(JFz6G5+h|a}bQQA_rjOJ1C?CVO0lTQ;hlYH#BKa(*LZTJL zOla<5u+HeaB;eP6S9P{t$yc3@(AN1a@B1%qI6zJLotp^#EOZ^_N*kUlP4;*^E?{yt z2mqLS%;J)eYoO6%GJk~EhDstdQ34S6M##vij_Vm%a^|7qPCrcO7zy+$B zc~%+6Eb{;r+=t5gB_Yxi*jC|2C2&5?t^!P_<;5%y6B=0=^$*81AILdqj3#^hCaP*| zK4h);;He24yU`ADA~R!vI-te{SR_E{vhghE?8FUJGawBOw5u%e+5F>w!Lky*@M|Dp zhv)v!T~V7Vu%btm+a;Cpx1YB@%@Ep7<7csPX+0AA*&Z<`=m-zC4c7A*0Q|yGwzgKX zdcrQ59NlAaO_EME*;>^~Ugq<4pWBe}jSpCPgc3T)&vDd0 zJo5sAR}3%#R|i_F9cQynKtKFiTqpzL9^Iq{Q>_Wymv34H`*il!yA1sH`d|3UPLe)Q z4z>FHqu`R}S|Do2OsTQK_%K0ls63&H`n%*Y>_!q8a?x~zQYGRLJ&jM~9C>0U8**4} z>XXm1io;W&eQXd%Y8awb?5)K;gJ^}bwn+qgikLqv7ta>Lig-Da-J=ru2E23e#fClU z1q-6Zu02n?|VA(BZq z@woEJPhlUvev27Xu-)ro_K4x56vC);fj6f1y{DUZ5xJHGEC0?v)Ee@*e?rAm819Uw zAXW1f>Tl)ZY0Tp+m?=<09qyx+q=I~!wRsb zfUh(fQR4*q=pNwt4BovhYB*^1r`tKIo^Gfkp3ECP2b25_q1^3_>&?g)kOW&?-f5%K zUuIt$bNVjRr!H8h@!bp13$R4KYClm)4e7~)eG zPV_93sVLw65rRKq&%LdaiBX(vQqg0 zW%dBi|JONas1n8~(D&&VX1Igd;wfFAp%qwRcMQvTiFXoNxU2v@!7Ng@Hn@tXm)J$% ze&vuj`d&5%u)&qN+(JE63HWaROXZIVD6y`@;F*V0?tHq zUv;8%!+4aqrowlQDo-67^cs#HT(}N1zIF@u?R(|ouQ3zNfhdQ1cxm}~(fwbl+ zN5Xvhh}`)`$cmcrq0F08cj_N6_nIB9S#{v9^g!<;#YCka`A>>!nh22|@81bAF1rPd z01Vp!OnuBY!~2G2>EerYJD!(pwPRBeWr&mwibzbQIL*9mN86rACeFrNQ)y3H@|16- zR54vBPsJAs`;}M5(C^fv|yJR<7HtoA|82i!&! zgq^B+WDE97m$HwQoM4-G%_k#4K~eXv`#bn9RiWDjJth|=jOh?{K9W3e6@i2^m0a8X z;MXfZu6 zYICB|F~}I-##?cblfSs_BX<_@t20lmZ$cEc+Eaj8+nh#q=Lt?TImH%LQL1nO5t>NV z+z;+rlQk*rf*cLs_HoPh8A=3x*6Z@_;ttae^&Qkf`bA2|<&$rcJEFMLAv? zO-ang_5}@Ujbv05drRM#{Cu!9nq};0_)X-rkRub>48sZ&`x9nFzECR;$+BnvKz-kh3eB3ZJ0?#NBk)@nqgo?E>%z6JqX zgQ>k|_uztO3Qv-xP5A(S_BvS=CJyny%9-?qvH)@BY^|sx0OH}hZRY=S9n95$)o}We zB7@>}YAHk@^(9qM63*#n!&?r&P7-1E`2104G-0g8!{5c0aC)&DrH+(*5eweq`SXP7 zgW9)e@xMYX?GyIj^;`JWe(-Nlw(5MqVnMeu=Z0ih2Mi?r|Ly{?Kj2XwB~UNG0S~G@ zI;*FsuzDrDf>RUlOdLAt0Sn#GZb^)s!IAA=SEUH2L5wwplYbecW9Fo*Am`upJQ*bJ%Ac;qfSx ztibxsu+U&uVB)mS2gUm5M`LJu0 zJVxd*LsSJeGmroCvYVC8m*(Obl6tk>`E?~>cHc>q$UlnVEV1p7U z$TzG4w*7auV)K~-DQ4hsFt;zEy%Fu*gCP;8RuUsH(0Vm85?}BK=_!HbnGTc8wa@9c zvD#agZ;`s!2#qQum=77_6W#izgV+hkrjg=Y_XFhBy?nb^L3e?QfQg+Gk59DAa9wMJ z4D$wABxF0p_o_J8s*~nE527}(5Ch(mp&%rZ(jwfkXgFyR+%?<$Nfa*X0#j_=aP5C8c>7MA;cg7@eD zqSvhNFLvsI`I*FAclx2`yqj&c1SZD^*qb`{P{BLDauc&1)r>FWqr8oK(p4onjW2aR zXAN560}Fw_@SIz;2+c4f4ouKLygPlJr9#fUUf7}ik^((KmNnp|fB@DdecmM23i?(7 zA4L>zJu+GZ)pH63f0*LvX9!gg9&CH6>v>>}dwMhXr;fa(2zvX9T`{QvzS`s3YseGB za)XCXBX^!xb^Au01bpsGlj@;~1Y{liSo5XM1C%G~6LFpAGFk=CN0+ipon(VGN015^ zIEp3P^HlDLZ->sZiNiTd#@TYa@K2jmMh@iukpTu)-aivjCgG@CsLv`R@0~j!sxGyz z89m+P)CDn)tJkKUg1l)N@%B^)|CDQtj zcen|P8ElysT*B$y2#ocA84Ps0o<12a;?U=c2QL3L6<&2-*7HriDVf(*m0>S0(Dwuc zuivw`%FUJ&!q1%tev@$8THX0XZR=mhDH35ZN1b{&LAbMyQNXR}5a1Q{2d#U1D zLj`pX4d?IXVg}zNbn_F*&X1XGl$WmH5eoSwY2*ub+6B1okDQAr7PE0zwH~X07`|_; z9wv4QtmL!T3gkXs2qH=c#`Cp?#)6!)9g?i-wBdA1?Ryd(pMT4nlwFi0l`ihVK)(~s z0pRi%p8A?#M=6|%q~Nn{k92d%7++&NZhUMe=px|c@92^w)VbNb;=w`;J2O4mZVinP z@cnt<$W{T6qaUe8=176@s|2w#Kij=>Ja3^)Fmi8SrT&8Ro$=lK;W`1Eco*OTx&_yF&sNXmv9_F0%!_7}+GNUyH<@8mc=YGx34>*AE-d3?y~93yB@ZAy|*KM|Cc z=T;3z@S=?Kv80+Hu(VuC-hfWb*Jxp2>j(O6*Lor^ZGxF9H^Z~7;C10rXXA5Yr@m(l1N z+iENMt~}@+X|cKYY@6*6YC29rduBmjNNY?7!}%cw$1qx^pdj3I*Tim8xb+Wv|KnC4 z?qWWlmMRyvpcoSF`4NOwT%$dR+Sp#NK({|aft!2M#Cx&`k|0-V?fUxgz$Hb9Vh3SV-ZfKH&w~gg%sYL_ zsfZ1TUft=ropY!#!D!dR4?Mw7#w!kySAS{QheY%;abDmujcqJ$jfM$n=+g z4(NiT5Dah^{nk)alBaFLLmcJx9WyI&rQ;t!>ZyZ2S?bmG_Z=FpQ{WiM!~`zsE_ z|6sh?!*M3IfBmw+N9_1h*)xj!2|YCSln>AG4iyH_9yS)ejeq2dE|^q{MuD@g=if(= zFDpVWSH3^$b*n|WWOGxQUR@IqGDrIKE4N$$Agy$g;MDT#dope2sg~7xSaXqx4&C+q zFkCPL+E`{U{fUbRCmr4gLRv{YaD^3I6&D@ty&UPz_bd4TY{Y)!Sw3Z6`RfGUIDnC`9*AvEx7t;*0JLH1l`xW+*M3mo)e{BJqn{x5<}!M(%73+sO@mQ9WwXm&m2H+hlWAQTmWha zaK8h#&EJm9kMVc(xEiv%TTQio{%yp^^$NHfLn=HtE4geTBfMcdk&C9lXQJQ3dU>E@ z)?+lxk|_3e48#w&yC_;*!C#+05rs2?If!vy5mp(tr#>rOC@tQjusf41`~24)M)d%z|1AbTF{UwkMX3}-jV7V@yho9q zk~?+K>0ceDQluY`zmi+E_@;&BeYl-yaihRoH&K22P=v-g!&qeAnS!bk`Yg$DJ%W7U z4dA{p2)ey)R+Sa2ZB#p#3Do0LqY#D;W1+d0n<@};=>I-6P|T>4#Ba0?8buFcFT*OK zBeBGD`F59ep?{b4@vj)w+2@>o`;RosjZU9I8v0h}pxyy_MVn*Qi_Q#Qj|DykC zF{{+1eFpH*q8PHXvOV!-!&QxQGY>8J8BOg1mi@X(S5-@nuBg3E3hUB+P~}p)ZGU!m zf{p|82$VgKo+2qKMnYp5Sz%2O&7y-pdQ`x>1o3%O3cd;CvU?DLMTH(r+YGi(c5SFn zMoTaDgGtANrPCGPXga~WEFW>L`yFLQ5^!1#7qY3oqiac7I8KeOq>+I>y7alGH zVrc4!BB_+6je&WBg;bi)L^5%E3>U<~`#Kq|yk_ z1I!N>7~=;HCw*#)`LWKck@uH31g6qO$&0hh5|Q&93Vqo|y2#_$W)G%ThFwGIe=>*C zJOv{;N`XP8w;icc*MHgSge$HqX>Bu1h&oSOXNGw5_JCW}WLnVLetL&eS#Qc|JfQX> zub1nnhuMD#VIPh)haVoM&yO$vLrLU^`YSuc6|Hzi7m159tOUKEUs5TlSNE%mo1d@* z-aW>H9(e_Y;n`HR=~q3ieuq&~$`iqrldvDN_H% z(Gjk97Iamz=iY(oWoF((w%u>ryB$}zh+i-31xksPhC##lBzjOBgz0S~m*{((E{hyJ z*EW+jm-0$@C+u>%bX7C=)y3fGGz$q07pd#*_0>@VwLIX+&?lG@)jc}RQQ#oh_y5dp zgKyxCSe#g)xuBhKHPwShpu1UU1d~dk?}y&?1XP$FaFldL^DBX>gy9+#zk+t9az-0N zt33tYK>JY&KZSe^4g0cQzmcKTcLeTde5@a&Wf)nYGOR`#8u|}mL6mx&)yr|8ULe7q z*v~+ceya1I1(!=Qj0JyJ@ODjplx)}LOJnfZJzm`q-r@Texp=}go%o=bdhzem5*^7x z?tLZt4coTvZ5uMZ)AdY#V`p(-&g>#P-){Y7o(Mdx|2}B`;Cr67!{h^x!@y^_TY>#c z>-3}k=_nm4k^~m2jLAp55jPP_GEEFz@6KPM0cheG4a2X zy*elM3feH8qf9 zckAn4iPLT!XAS_uLC|;rg&El*b8Q{(N2h$~_SSs-qG?}^3PxfhX1}_(%TDC+5S&K#2{n_Cod;2*3oERV^AY)SDg!9i zFcyKt=RZ1u&*yQ=Q9F65#F=v$r#u1+1>VB-0&s!{NgVIwQZo=Me7D?L@KK6}qZf(` zJwC4JZJ)oZLEee{X1|i({Y34%uNTFg8b}`BD>!r@M-W(j02x??}NVO%%|OYZA!wY~KKNPB4$4`w)T0ux%S}-j<5# z%;lAIVP1)U5(9~b#?yv8W67|`2fyD0#oD;}79lQU7sm?nr}fL)ChTJP!dqIpLKeXo zk5C}e|LzRFe1!(RbjK#{e^^VPcG159-%C)Qt?Qa@9i&YMwJo0;zO2P$1`WBJg74aX zwi0FVuSLlUt2%)L53&&fYEtJj@{ohoQ~4(X6ok{Xn^dmf5`pUq0QmSjR}lPd+QhTC z^YUmp@RoGmdcKue%7w5;Ebt+5t(+hC`84>4boqph@VRx!) zu+YOtLwnD<;oc{=BTA3L^7BG}8>m09pOx_9qf1SevBoBW&+uk74CojfW<~@`@f|7L zHI}?VqY_Y;5W^|{xR>6uV*d06QsgCVIOIsr_0fmGCZ$K3a-;iV?q)6>)lyMXk

o zHGDF~D>wW3D@>3;`p~#!H%#vWb}W!ESp!3ZPW>PCF#|)*JnUfkRuYPy_h;L7bWGUCR`K7ZvpcoCz)Q+jJhZd$#l-zwg)dNQ4rSHkrO zpfq?t=>Tmi^F;Ge4y`#X!hjL60=)(PIFiWa3HsTtojCMD zNVd1Evn+cLXwcbUmbp&n^~P?;a-FVv;}GAV4E|;cs%F>F`aCvBe$|!iWJvRoV`9=A zNj|;Xn%v_!44>t)S)6!L-T_lg4>c+3%)dpFgdc2O=H0FF47-M{_6P{$BtRJd00;33 zEI17qm)Y?W?YGC2~`=>95Nq;3uhVD)N+v?Y)vA(~vi|rnoyCJA6QX{6R<=p2_IjQCp8&gIUk^J-_W)@u-hrwL z_;>F?1ms}`45M~*v%!!abQN7OIfXuqa?exYg9q5iwEZ}D z`IU9(FR#q8*^Jtjy`_4OG++cVoD#^VlPNnIA&MqoAvsP;6sMDW^7RE|T>Aw1)c&00 z_+yTtipvApY;K_V=z=&B3cAcssQ?*rR7Vf~HA%P@cgk9iG$+tRC9J(zmcUx6_&BH$%hBUI612`(v8Xg;Nt!R&?C9_`a4ll;MwmdX@{FQ5Wh-9P6QykR0u zuqtMx;2L$~IgO)$=7ZSA@hG=&|xBQ7?er{)wZ>@NfD<+}dQ%wD$t3`xFD zv+ouc{>L!_nJyTX(dC`17pcX(1Ia~9h<)qj2Lfh|@JEa(o-b{rwP(Lq3tLlACBwB> z-pM6i(q=MK(e_s#d(@2?;ir42pr){28fk3rs>AdrKRLO2<$oC_7e_hfUt8>EXuBw9 zK^tHLM|B+8K)C)VKxsXy+E{#8aw``Ud1v=1|20V<#WpA?HO)OQqgIQhaccVQ9anW+mjYx2hlTTRJtJf;hmLe-Da3W|VkMF{Uy z)S}$dghnO${MGkN@7&!t-)}w>!l9?T&Mnw0G(BMFG&Vd?F4r)gECM%Fi!bMz2+*Y; zQVnH{nYSkx%j2296_{&@ve{EM!Rp(cv-I($*a9TnM`|@Wt*aHn_M0q@0$My6*tsvEcr3=G3ArkPaxwNU* zfMFMX*f!p@Xi?MsOxgi`Y|R=KW~lS$#vp|^YNB}uSZ)k`9l`6FENss?x&$77yHy^@ zY}&;AXDXgGB%dvWyt7z`DO%1OE#?2)n+sQ*jG9vNhq-*? zSQ3o2dik-eE?Qdvq_04Yrh{{fbd|LaGUTfB7Fg&wvAPBd_F_&VHYc&3wZVO1(VX!6 z6V*DKO#ocf))7t!dA0UaE-a108ctlKi$v-QXM! z1e#MfZ%hmAH|Ac8-Pd)`?ZodBmc^IvR%lGWR_>c{%UVx5xx5vI^;)vpS-Bd!(NoBy z?C3DX$2q6b^@h^7)`yZ5()ew8R81@U?n+bJAtc=A;{w~Y7tlVlPCgL209MD|9PqWQ zuqw^$N!Mu2*5S{;)>2N`OkJ`KOi8`E7GG{)ZLnW^D?(#^3#+ydGI8fNb+eaZ?`H%F zR-}YXhDmbN<2kj9-Ff2U3lwnY8*jXrf|Sa!%qK z1{Z785fOMw-K4Jhk+X`)lqkxek*}%L?&&3o#s-)&GOLUzy_6x8YZ7fCI%EGqQx3IJ zZ8kPC6S2D5wxPXLftn2qx1z0|&G56uSStgsg)($)@+<1gap?tYe_@uN(PpOUoyVGi zeVN*%{2)ycOLXQvG<-vUyJ71}GwlqRa*-y;<0Y3d^%i)^o(c!0GDp`U4Y$F=UUP)P zs*6wjOw7;trJM+g)o>?SeeV=E+oNoW;Vy{atWJ`>yR(^9i#RbGr5|cwUyymE%KIv^ zs>s@dMqQYLCT)LS7W{I&N6I?10@Ml;!BJdMt24+hb+;moh40U$o7C>i9bWnn_oP-i zMcXB7Wk5s{t$B{U9i_!DY5N4<3r@>{?%P4E^Pu~$vL*X<3M~%vT2wrLw!Qv@uIVMT zWj6U)&|;$1`FkQNsLVlAWQT*H1(MS|6F<{go{cH)dVTqBB)E~ZG?ZJ_0p&cqRA@a6 z=JmV0#_0@=#wD-eJ?>rR=;uefSxKWx_8rKN;1_3+mT}qE84ul@5%nBZAeFA>QU33{1u|y2X@kHhIMO{dgepE2|;(AzI1_d#=0{@pQx`Ap+L|1G1~~BY08+k zbIPB;2e_xymIvialExx5ecBlPX~%ZHEGRDAOmxTAya?#ud1#$6T~DwX+UqKC+j&CT zf2vfnkA~K~eO%n64T9>0ULC_nNr->E0M2|F0TZM%Pn*F7)~!~#9qS@pq~`X^T=fp_ z%3N&Myv%$E%P9*CcOLU5Jdrmqg8MgWlEZ&~_{?*&Am?<~NyX|LjqtCjsf?8LHHKku zV)@;#^n}xTxbDf#FYTAY4A%==Q~nSJL#LCLNPPyqd*UX(SMM683XQ0Ff7x3Z{A-a& z^Rw^jI~c4B{KxXFoN*52_)iwti%$#i9|ql?(=NfMGcwwolV?kXMAUs~9GhD|`gM7H zwGQmF?DDs}!P#zl#?SSugiN;WGpyz_Qz2`EBI~ZY$#~*KfAO_nSqn8XhPe5&rqN64 zKR3SL?K?I?Gg!S6V!nYsHQ>fF&H}plx@X7d2BqWBghux5l&|LMK62MlHI%S$?%nxZ^%|E zT^YP0XnnU;x2tZ2bMy6~*TyvQzL0D8I=+nE6BXC*x`C3UNGw`h;hle=bfHI+0aQ>c z+8&Ur#`$tvt;3GkGS(~~q@~*z#e;HE>qO|ElYi$5C2I}U%JTxertrRBA1-ufqu!me z?6YUwTP%5#1#S1IHWt-FV2ds&4b>ouFkkZTrBp1TmAmtg{FtJKrSy zO3Rfr?#%aY&x8ChG_jF1O_On@^jbA0Y;CMz!K*F~|FhAT^4& zM-7X=(t+OaI`CrdK+YG+V0H$0gyD+6!GWawx*L5rQdcllPoe@I!g%Y__!Z^2~hlUqwA`T7q@KCY$IBHU^rvBXpM(34Ay z8ElQkcrN#)lPl3h%gQ1)PhmQbw3up_Q;5x*3qPKHVTG}3fVA>DC?Nu-ifw`EyZwAV zQ+=x2?$kYWXCfIEGAU@k?$?X1g?VGNR!DhE)NbhS z`iqw$-#Lv%VzVPw@}1qr%18&Yq|TiYA5kWfAkaItUK%m>Z-fpJ`d3JHPpu2G)R&S= z8g72!VmcCj(j*kKOzngQst>S6uw4JLOj}~4^TV$zuOx20Z<7pRidbjy zlmKP1NOL4_nm$ufas<29%CgZIRX(E;=??0{r9j`ZcYl+=(krfc$mk>A^O}sn57YO? z?tKjT)hf2sUf)?+o&$*$YV~@`#)1IR3;q!^Y1Qdo1GV7P!k*JCHzOFv{68-iShi8> zHpAl{zETl}u`6>#rJt}Z9k3<194csbI|38YiQ3RydIPzco>Oz`8|!X-w>QM0kK?R8 zFO%P98{|1{$OMVGm}yq;{IFIbApiXd?Y>y0YXP%eR?<9yK2fxV`M&Jyiz+jWRgylh z6T`s|4oLy^w_hh{>lcLKA?u$feEOe)AD;51uU#l-{MGWB^)FIU04T9dbZ5X`X+E*7 zcD)siu&>H`{sQjZjAs+{WBU2AQ0|WWR?~ZF#&6U_<~h~KMQ|wM;Jj>r1r0O47d#W& zA1PVKCVFD~GOleucdK3w{`Am`b|}k-M*ZQm)P;t3)n8w%Xl1DRb45`edjM3p#b=&M zfDVoBJL$)Cl6W8|6Pi9YnNh1{F>4Tb09?;<_qFkPw>P)l8y26%AO{QxP@LFX=RGe# zhZX$5hxN5baQHD99fRs+EA(@jGl-0ylIw?Xh_Vi>=GUt`;-9CT-blT{h@p{+wmhcM z+>bbbLkVV$V76S7vF~6U3LJ}+!!esvYf>~fxl~K)^*9HmEM7Bs_R7eB5*IX)Co$XE zYOTNi7jI?o&!lY03!rEP8U{MZf-70n4{KvqC7MGa+hgb|uqT}7i*`_F?w<(Qh^^}2 z13w#M+`z5s5M?WVr{hV+wDzhs`Y!ZQ)3Dr{&I!bYmw(OiyiVwjS{2G%8JrYnCHZPC zy}c4YD5Yo1_>ELL;w;u*oU0-{XVG~d9N^WQHx&x7n0|@4ME!kiv%0_V;3e)CV=ufO zk}pu)*%hhCly+6}z&0^|^Ja>(xYQM%nynF;zBU{8>^jGn3t}Bxre#L6*))RU=IoNB z2f-@fXA5BMj2j(Vb1UeZpmrR}v-NTP+G=FFb$3kfQ|Do^m0#*d5;)(=?NhFgO1FEv zL@ttq$HXTAjK6{}?ALf6^6lpc&84+&CF*O<46@B2k*t5%-DHD3q}xXRwsr9O$H?Hc z{^KPdw)lWNe*`7{KV-dyTa;bY_DzR~2q>j8NE?VKAqotLN=XPRAQA!+l7fKbkSd{r zG?D_+At2q|-7Vb%3^7cu{sK00UHe*luXUckQ>B~Hh1zPebTh^_ZJg$j z!DGs)6cM@Es9w(1OvCJRIem|E&(VE3sAv%4Y?DU)Tp;>mS7uPvHRV?{Afd8Df34Ba z(nhbb7X$>P--u)yoWMm}p6o$JZW@4BNO$GDOV8j5*)DE!XKg;K;P~NZl3XJQCtszV zHsZHZYhST#R`bC`I0heFm45*JQIGNY6&c!# zvu)}^@Z08bSdBL{$kIysK6C|Dq%FLIgqN(uBetb zWfYz6EHn%Y=6Cq)(xoM{#j9GAVT2^d97xYzcuR(i?2K+WEb+cHf7*mG4u*`M(LxQ5 z!_XW<>8o7 z+U$YA^2lIv=y~0!!pqPP_r0lNqE{Zs)6*lzrAK!U0aPJ3P5_qx<$tU&)CnU*1uU z7F&7c!B%$AZol4cZ22tYViJDS;nF);*Ck%iJ5*1&Jnekld;11S>L!3oIYX<^J-(<=z(3;lH z_8-;oz29zQW9D3$0|AO3r=M>~yq_4Y;vDuu1N%#)-zuAs#;k}{$bc>TbvkqZ6ek+ z37q;c&M%Xu46k^2xVZodT5d!lvjzP(iRs|Gcvs$YQo91U3Daq#(>g>&{o93hDSXRT z0fq22mm)F|TkYIw-*DfMO#vm`E;VRJwYk15x&h7lmco`YBK*1nXq2i2WTT#iEx;Rd z>;T^ZHnTm{8*lR1eVPXQUa#0bhv{^SIN3CUNY>CEW2|iZMh0ACF%tEC$+?>^@(iv)5Ppgs7zRGw*wp%R`d(wU`=x+qGI9JSl$ z_-kFkA46LKO(tMJIQ?mIj;WE*G+w)fMXqidSUgLkqMzMf)1#!1ckn8w;%if{yCLm1 zOlmEen~ykn_teLeeip?DorhbsrL4%(5@sad{=vQ33kQBH>z(tbY?HNvt?OacE~!Pp za>a|Lk7$XPYK(Bey&VzZOwCd(qfi0}#mA zqP=TeqUSGzKJFo7@YsZku~XY<0xbvSxAHFgtMQIu>Mq_K#r-wzYO6H--a3qQa{qHT z<62R=`0VwS6`|V$ywHFM*I~`P5BKN1<=M!cs97#N^m+8R-Y~x}LTb#uVKb^`m-6$l zw<0~WD&0`8fFnXDDknO!dNvdL6K~T`*&P89-|Vy;rY~}I%MLIVnv-l7=fcuVZ1q`8A1F$TqOv&yioM|bNDknJe?M+9dY$~fJjh&p) zgaJLK*OTevw(&F>!oWGdYYK@fO{dkY0mp4+jHo_mwTwO|X5jr>t5>U|2SNQ;%^FFi z=!s|LwVCL93Jt%{1g6Z=M^|(E**Pf!;e7lo@WZw68wbcasC&Jwu=||w>9hiwsqSQK z-Jefki2QY8_PhRr${-6W9yNU_UG1xcwCqvo!zwdcjhY%cAAWr74r?{;ModkXkom^2 z@~6zlC%d1b<+r3nc%d<=1xvC~YQVZ&$-SQa)b~1+q6U>xy+9xt(pGVdlRAy{kjBKY z1&U@l9+zz%2QUN|mJ*4$9Plhk*6rNMN4L38&a(_YCN79wv0Te{cmD$tXm3zQ@C%ukwFxvQc7aO0!6WF7(VF^GGvIqnBw>zh&)rf)x z+{TmQyQ!nav{r}rxb3gEas|`u1oubu$3(T%g|A* z$?HtH6KVuyx2hA_)(dF4p!bI-$F?t|%PxH-kI0Z4#3tpRotxrQ>}m+)04S>!Q(x8%xL8lBer~nW~aO3p4*Y(iR zNGVYcorT5B71*@E+|ldo8S@vN6?gu`@hiPLQVE~3Xp`yMA+fvS+`f< zseR|edU^Wc!o!d|gc65aBW^iN-LtF4GO2_|-Y=0>h(BO%8h6#^%L?sDFE5HNT9s;J z9`<7n008x`akBgd?#8PYe*j4j2vtL_DfwXT>?)bweBkhA`^O8-Ne#jF1={SSo1QDM zvDNoXx+R-cqEqkAcwfpFrl+4iUA95OTS9_>dl%TT{LK3NXf?9THymKAS1WcgctpKs z2h_G*KZ0@a(9`!5F!Nju>rEPU=xX>bWr~cvV1Q0oz*z~fJP#&wxvy5+zsdVJTkO-6 z@Bh{4-vlg1727M&kHf-Z=wTswiw8On;yGZD-_yZ6--*I=MYmA8av?6*!EeYE_c$Si zda17N@DyNDD!Xfj^g$4D%LwCnm&Q7*I#U(QeL|taZT-W-!m@B^M2f$%@wQn$fr{oo zYfOwECl?T?%~y@|C_MbNWni+DcuPA%tJu|!>=TY%?Ejjz+Gl)CWk|l&)2&v`zYzoVG+#W>2J##$FnSW=>ry&$ z_1V(H?9Hx}VTwTa$a%~ik;t%Q$vSJcGSH-c6DLP zW`w^>H)WGsSy}B0|AqjxK~lDvH|qCFAjbD?-j<%uhLlod-$(_w%O3u#EMje8W*aQ7 z(sSvc(m1;S`PY@mH<#v*@jc4&m2uAJOleWC3rVdiy>SC}n9vQS$wSiJTz`Hm`PK!| z61tT77WK{P5CR;MFR2h#^L(x{c7o)yyjuQf^|;h)^+SqKwC7CEh{g-MG3eIFz%20^r)_e`+o@-My4vw`oq*2PY16@JX6Oe}gwgr~COSDIC|>gRCYzS9jHmN~^1S_W;k^Ls1IQ|of4ao8HEz4sNk1-$)w zLt91X69N1fWQ&pw-6Y48M0S+U13iY=Z#6k4x!=A4TW(wB4v6-qS~JG~R2}ifyXyd? znqk5Q!~6Crr4p99uW{!eD*J zG{gn9QkbCu)7RI?*BFRC&Gxzhtg_=C zOkp(m8V)(f>D|37p?m=s#Vh}IVo6Gc?78)mw_()iMNs}iJ|~3Cv#$Sf2$VbA$=Xm_ z0pAiZeE=8j0KXzDH}nN4#f+32%eLeL8h&_FGTQ%;%J^|IDg<#2StA#TUT$)BKwp^b z*P7?_{%RXcg*M)QzjYuqcLKknPAu>qpF+fU@s$)YJ}?kbl~$=I9(KN7tFgUJqdcPR z$%Q8ui+o?1b4u6#;aB{{RKl`ozWn;cgQ~%u0s8y1e-M##O~kJBtSpRP*vg|*((9*H z0mKlp@fH+ERu(X(?~n-tau$Ds0Dk_B5Q6IYGME^AdWud7GtFDhFU^C#7UOw}h(x3; zydSJPj6JE;tP?6c!>H!!Gu`krWqLt>*ZPBSYvZgn{q!BI86^;nT#eI)H+9QU%zU}H zf%C9@;SqXHDmo;{N%5V0pCWP2#@%-BNRFn(!@oM3oPOK&Jy7!EpZ-mYyQRVnJ4T)8 zt$>pY)|JsRW#+IROM$}e)yp3}CicIxWL-|db;j^h;yzEy#pj=ya~iF~PH?+I@R9h< zF+I_UU_u^>^_=;T{hkS>`7E&<6{|aIKl8LhH z7Yv;ssd9WA#1+dEA?0wGZno5Q-9Ol%fh0!=ei?s_vl_p~x5-y3JeF}v{z&b2(peeP zcATS5@nf^Bpl8Gu(A&kfJdot?7*sQ1`AU_E0Z>nRBD(3g5wFzN|EIHxJqWg9KUm>y zYY=##>DA_xcgt9CYJ|6|o;%Mz)NcRpjw3)C_$Q-e*(*z9JkLD~a%BUyFq++f7hq$4 zlfgW8!>Yrp8gN0fh-C-p#yOeWbCwJ-(dLJTUFq&DoJ>;3gbOL|lx2NM+w;gYB`IZc zMHH!K1Z={XthiQtOZz*=sOgW%-wA<#XlouN@l*Tt z&`+p8<~VAHoNF8$ulTWk^#@twm8EyqKR8i=1(K<+oBdv4<`~NZ&@^%d&rv`k8l^2cWk}97E>5QD@|h5d!d3ogpfy){ z=wHA5H5Lr^ZXL%gl^<(*oh$4p5ugB0qG{!MIG|WwoYBV*a{bmCX6K6k!L_?*-)pkvEY$8;E+ zedxm??Yb|{ZT75!AM(`eU?6`pf@e!gkslgX+(G6Lu{9pitmljpg4ZrMHp5#ns(nbP31Tau8}iwvTjKqq=ue?!jvAA*e9WiaN?#$dzOZaW@ zU6vlar1Adg-P=khu%S5*{8d!>gv^e;C-Dfus>%&Zy7%t+^Ow2bBu3o9q*ht<9YW-DQciyuxfcHzkij2gT$6At)e+H<5{!zI_tWok1n(UdqjwC2+*}%(^poTZu%8( zK@c-$v_Cx0#zYt4=NV=vd={vi?9@=XjXCE`W^F0aU294ArI%xV|F0I{Bm=vHg;%=O z5tvb;Fz1h3C-im=LG;q)LZby6KbgQi=g*#_4l~d_f57M0xGob?Cl(cTeI?7|af2&T zH-VRo1L@Ejob>*C9Fxx*4@khX|0%s%NX2qiytdiiFu&@__P~84W_wV#LS2rgr+b8W zD1D873wGnnOW1}{v|6T|@^WU75XltIW%IPRc_6YQpT+!6vBm6Vir+3p{zT# zoT&WO)4v~+W&;$rV0HTEjy}P-Mz%O2_Xw@;!Mb)`AcO_l+2k5Qx0VkFGf?j)kLxcg zZf5~iJMXUC?5OC5ap5mHiWMwb8r2+Nm7P7k3WjxI&L0>zM3f2eU1&Ua`282d5#Z!` zN`@Ez;y^q%UV6CADt$k#!^B%<{wy{##bEcPVGK+?x$rUYrdrR6_n?ns2IDM_`|c3j zz_g`~=mv3tobF+TBIxFPO6@5+JaU0A&cD2uFiD1f^RX|KcitxFGuhnO9I;f}-u^7u zTv7h|VGEiCpeifc$TPQQ!>v6p+3KG>KYkXTLIyqt=)5eOW6OovF2u5EZdRj889W}l zV+F;;ho?I9hx1gksnEQJJp=xRi!&K0O*YhiUt<2v)h#BzL?a>wBnIw5@htATcOvX)XjP(VRLHbxC^u| z&4487CZIFi4ixfc;QHMifl8iIWNG2=DLL#P#n5GErI{oF!Kt*^=2%LVZS@Ipryegn z!CI!TP!jhhg^`W7%LXZmZ3|sDjzp<&A_EeVbCRzEd2a5W<*WU}ze$F?M+ADFhouIG zc&2TY>t~Rk#NAY@UQ=N79TQU>)@QHH{t|ve^~K*lo7`HvIYi7>lLZK6yV5l?90Jv& z0U-MkAS_9}y_6d1Tw8*5{hb^tpKhOk6J9b!`tKR9)^8c~PsEkptB%P95SihL+VU{K z&d_>dN(t3J2CW`U5;za2`oPo8>Cca`j^(Wk&04=vcId4T2L$RaMFWaMEP3y3UC3Q( z8y@-ixzWGoE1wg(UsD2+tgQf0rR?|fPu4VY4QM^gG^|2!RLA5kLjSlSVL4BH5tz^O1jvX= zA0r(-FF?-$?e42FU!WqF{f)KqP{oO>#CtT~cX&5~4eY5SIz8I%%JofsZx-yCN)2x+ zK_0CaI4+#@u-E+RxvQAtB68bRTUOh*)L)|;!IDTa7vSzudsMgB}^&wIBv3G7wZ`F2f{EA0% zg<65}eMHaf4er(yEC|ZQf^=SXs7Rm_NJxQ9)+@tKUMFn)d@ANJ7`AMB_W!&q9T;6>MVWrY5aa%DHS^BmFB&1^Ux@+NW7fC7`MBl5}Xe2iv6O6+^V?< zU7fPqCZ_x7ffG`Q&O`E)dv3Q}8RhCmSx?EsD)m+ZzQ_c8NV<6wqGA#N+s-m+M2!Fq zX8b-V7M(DU4~<<%3*w!)y#2Q{-(Pbd`Ehj(pmp|{Tg?~X$JHKH)qQY@8aZcMAK0@5 ze)qE{5h=#I$p<*+FanvGya@20hpoFAY4aW#VCOy;KG^ssa~~tBCS>eWkJ1T(L(bhF z?@ZKMo(;B>oL1ixB+2Ihr;S4xMYq$>w5ykrn6v22!X!maTCCV@bCW@VJ=xNc;xm76 zwU4x(lA~381oPzWVk~7Gf;>0#bVU=djxV*S&ph#A z>%RH^LAfkqzWi+pcGMGIt<%96pcpY@-|dC2+Jd|S1KshFFkI3^~tYGeL3BJ3j9RRWurFNT<|wjC@4M*2zk;Xm+;|e>rwp; zRK2VBlYzJI68IC+jWJuHvm^EI;*F#X4SG76Fyv3Kz(WsH5wNb!L*hyDEoRl1pFWAq zcox;`Hb`y^0J3SPIk@qQa4a?Ggph%AHUkvQGXGbebGe1)Lad`~n}=%sS$wB#q`H5< zA)~{bG5|#p?%zGg5Y=F-YV}W9UDuQZHcoF%COO8$=PLg2s?9${F+Jmm4iiyKFvFa) zWO7YvhD{{HF$2&JCu0g$A$Sgsh(T#`to)u^$@N1`nAc<-s(^M_eWWFv)x7IwZf*a8B80MbPHM3HEXFh`k4@Vrx<5|4uf;5Q(_KH z)8|h695uE zmyzM70BL55p|_GhVVckmH^XXHw=ls6 z_{Fl1P-JhZXS#Ar6}p&O>L`c#8z@q0kE8LD@Mr3JpT%jEO9nNV2pu1fcP-^$LD-lH zqZN{$I0d(-AGW$A0=%IgB7_9pPd+*u0!(;47hnb6VN%J2(+dWjz^1>zX zzMy!MmEuh;afS3>mcOZF|%z!`tc*>Ofl$k`J z8Y%}-8}?#*E5!&xs$1O~SoNLfj|s;PaCdJ#0ys8t3|~65BeALBJ8454Xq0d$*4RR7DiWC*(uNOxun+Wo?wh z8TS4fogK0%8%fv~y_dnPJ<-l3v1V^%xtLw}Mpu2R!<^H1ERsE`XJSp>L7fdyuiIpR zHj4CxI+QV4T%6{P_iV0PmpWHz=KziHX?4_6xji)o&}X76mVe7vYco3sQuAPT2@ifI z#*TcX4|hhW!pUp3&gg->1wTUo7<%zkkx}_d#O;^885M#I$SJIBSHjO#_1jyPPcCWU zLrpv%Vl_``Hg>i&HM+wg`3Aqou-+3L9jKj}^*YmESW#%nb%95(HPc>+4}bGCZKP^mzai5o&qN%BX?Z?#+USMavQ#f}*Pb)0zv5I29Vd+p^+ZkY%Rr@6A#fpC6%19` zMk7tK?VW>mx=hm`F!W0pP?6jx%s1J%91nuRGnDzN5N!AlvL?K;H-BeS4n$BR zlW5n@cz?zC7A4oZk0y^Vf0^G~y&DM(^b6y2Fr7?$XMY!)$?GPFOOd)uDz_@Va%PS) zCG6*-dr||%zZa(%A?guM98gM+J zKUFcLR)xohD_p?Hx2$xi?-Np1#!yZ!43UqsMVJJqXji;1NIi*=q47M>G~P(Y?yhgU zjOaz?O|)&R9GT>a(;)mvy3;rZ7SqF`J-Ht&KWSwWGO&42z&>Mcq=HL;H`XFi-2PRZ zJn@4pV5>XIUR>@f`=MpiTAdce3zUAx|j@^G`0Yi5fF366tM;z$N@*h zfPiV{oqp(eXN7MR*>MB8x#3wVJ8D2Rh{A>MzITuZ5LozXWClFG^+oDiPKwdd#msR<$ZF@eSQs3Q2!3!y)PI0oQmHr1Hdi zu-(YryH{}-iOuM(>~YT{Ep2VV=NB$FZa$^tJ`$$)6R_+ILLw zaVZ0zoRm`KISbbL6zvLkN;42@<{o|?YF;$ree;B{AiFYu5Q-gHut2A!fPVV+rpH4m zN5y7f29~zEwEmLN&2X;Q{7oBFT`JD+8RbKsP^#q$gCqK2@GCYo9-GLj$cCznp?vmI z9!S1lpuT^&6C`DoO(3Bd9(t2udWY#BQ1D%qb3@JJa-(r{?d}ZIb~Wav+yQS_Z5k|p zVb@aXOcuZEJ?S1J@kwn+2II1CUHVU}1_EVHlpDpk0APZd%cirimEOaOXc8u{u~5m@ zdWu&Q9;L;_&0g0+eA{YVPZO|ec=H`}P~(8jvox6kncc@Sg`Wy&TQU;?eN#lu(?X_U zcA-#k<0C60QgQo>57&^gLnEjp7fU3WVk7RGVH`ym$oC zsUDVpJz)wN*@trkfUJo>FTUfxM8$u8vY%-SwDSPA3)b_bS+tg35Z;)91G|nc`tEfz zu5(fsajB8jjqJD`T&qtPL|3|^a#)*GJ~_fE?E6(bs0rT^n7Z@Uo|9^S#B?x1q-g^m zzeCA|0^hd?-PMLShha5a(RTrvpS1I^9bDEzVjDw>oR*|Txqq;uk?V}{Q+oRURQuA) z6<<5#PtTmEzNzhx3%9H9O!GUikuRs7;N@wIGz`AGAgP2(`QW*i9L9I2-*}hE^=FiJ zvsm_x{Fz#5q1B70%bzuBs%E}Xj~BqshW{h;JVP!IJ5Y!XtDRW1ie_CTxv$uXkx057ojqxui8a(vw2Tck(lX~AY9?X|D z7eMsUv;7LdvFMW7GHUwrEE1Pu#+2oy@5%1{&67DdQ#p}iu_7seShAZEb+xtw7;yuy;Vv4KL zOjdv5sdwXkS9vXTOtTFgvlMj#G0AsdK4k9)c|v4;%8hM}JPN?Gl-N%5sP5o|>z|Jo zq%lEGaX*9gsJCFu)&2j{PmaZ|iQ#4Q7h6L`uXI;fJVudq|n<=&3HdigWi#HT8I~~w}{Uxes}(p-J+U7?_;;* z*c=9Ko8A*1Ki50JV6ba*m&wZ!$x1R3iILzkdJlnL=&y5xhAaEEyW{5HT0g30Y9Sbc zqiHjC_TEUC{KuOE<@7%)X{8_aNaW|e`w{hA(0-@+cRsVNU?)w~>}{vHEaRy+R@8F| zTkxWRqaZ@}#uA=uAn2#u`$H<^UD)L>|4L>|7yf7hhsdUTrXIKLsfMi(awcJG2L*RuOHhVm&1-6RsFLEDp@Ea zI?n_1J&fa^amAbCy_m}UInOqO@k&v&#{lg^5@|tZvro+ZJ#;C(H!d+i5mpYkMKU?M zd{ExMk!xHxG>!)LpK;sgwuQyrZT9p9XFgsnPHwO4l3hr_6fD$?as#%Lhif#y{>YsI>#Sr~2mgaJ2@`KdpASVoubsZjqB^5gklT z8<}eV%kCXMV02$m``y!iaOpi;&c8=2MhX7?@nS3qRcI=loko)ya_{l^KB|+fCuXKJ zS6$OMMpQ3HmOsc&%4m4hH^?dXAmCY8X5YTc)62ZAbU!jA1Syv2=z{L>X`Kzaqx(!i z>xF!ubJMP63d(y=b{&Uun8PP;%C66sCev=s+3XQtdFolF5a%pYO3BR{hd_)N|EV~n z2n4&Vi*b4bL-iJ=8KvtlIel+O>J9f71ZpV=?O+te%4b{F%#aE;MBUbqhQk*Ph-?!+ zD)NV9og4c6sD$zKr(GvTVAXHe*RS8h%pE#iwBi@4`zwsXlX*IS=Lim&FI2cN5S8@4~9Sc&eO?fExOY30kDow!)JVa2)|Ov6W-Uo2Z*UL}f8 zgd64vZ7dqGel4cLU$RqpI@$0%$h5IJV=+8_ykT33CaYQW@~Z?iO?YE_Uf8|QPNSUo z#mqz{_M{t*%%O78^S>=TEu|ib%Dx%8iI38dKRbB3eh66R3uC%}M=qr(YR@cY3IM`c zKhevWnyU-;5zT^XM-_ayk>Vb>@@%2|xq=wk@>P!#bt$rSedf?>`Br-@ti5N)9r4$%ktCs0)$HG!wypYJ9kgt~(RS^z*fh5`Qd`ND76g!x}|gPYo!%5T9XU;4K14s;e|gI$)d{-S>NSZ51W zsD!HdTH(6KFccaaq-!KhlP$_mkB_<*G3@r9@(*$8a85T!s%hjh&qMs9iI;Lrg_>K= z#g?ZFjx$F5Ziml|KCFp#y&K$+5!>y>aRiz*UQWoC=JaZv&W!^{j}n2^JM?ijY1{N3 zRq(()DM1TcV*8BE7eAzhH20-D@^-BFr}xopT7;XweHR_ywjyLMgDPvseEx4&;V5f6 zfWFS(jH9*pl99fiu6C!6B5;|WRa*ra8G8%h3s;x+(?x$!@~hy@k2(7!IEgf$j>w70 zI4{rRSvh`}*9UnDmW0IvgnN-5?{XBrMdUK&9m#V@-uB*qO6w7b{i{Y;*@AMq(*?_j z{Ehi4$807TCEayC*Y!oR5)mta;;R$zBfs1+UP-`z+Hf!~e|%&Yd(^dmfpXNMt#@8C zLaHp)8QzFXFB)P`8F`q|dJ)V)>9ODCMA4tSlXQ0wx_(YhD@)V}q50b0B(ze8CQRl% z%Ssk>R{V72C>WJ+y(4GozK(RrU6q&4d%Zj4!wzJe(Or{CpDDk1yd#kSKghP2=?I|T zw{T2i=IRhbw61DK32*%C}o7FSoEsvQ};QktK(kv!l&JRBlcUU_#wdHgNp!%3r zXxgWf^X=Jpqtg#6#7HmLH@{H>6FG%wF+nj`mhl^zo?vA*WL=~H*GfbD zr8f%T0YTAgZxQSfW2qOuOSMai95_2|3AK_*avqCTy^%F}#|IS@M9izWWbe*f zpZ@gdKGnT1lm)XuB*jnsO_8EpyRk@(wPb%?|62;3eXg}A6G!<86L@HD z93VyW`#k!ms+%L(5cFR}MA$hK4nX-zkNcg{huU*BKps{UC^iR;@s`Dm?AcV+z6;XV9UGO+_+9Re%H3 zj6|C_CQZ-xl0dMC8q^O$sYp|qf;{#sCO=!IhBP_X+0*>s7N-A9&KHg^?<0yB-&9Na zZb0`y+Rr^-;4x4!dg4I4oD}P_{A_YDl&zZYTW?YzBVK|1hXBWbBEBT+gBf)v6oZ7w zJyn}wk{SyP8Y))l`5}6oCofiljQ?C?jB7lg=lmh3b5mfHNHROpU0#}MmiIi(H2Q}7 z;;UIbp?4g1thswlvRt8Tsi$9p)8I|m>;oNl*nV@t4KH!1u|M;5MU6-Q%8EXn8Dr|G zP)2NOTEB0 zjuXmgqKM)vpQz8A7$TN1ae&y&>h-ZxxpRl6(>Ltu=2aT-4uNjKV}zn(k(k&@%A%p{ ztoWDUN;f&E{CWU%D42h&>-HNeSrGsEY=GdX^X#!nbCYn_we|AZiLXj;(!J$pD{jte zZaz9Ks*e^bBOap$(?vtbt2Gjjl=ibsl)H;=X2F^-^QQft2$6D$;Zim*FG20~)nB ztt(vM;PVzsFSd9PYks}>BtoR?omN5{e1q!gmrpS_DM~}tG48>Y2O%y^n z5AGHgcyXIH%l(;^=dQAZA&o_syShYQugqiI@@5Z>tEjLqk8TszKB}Jg)jInpm~;+! z(=QSJ8yD`k;VG01Squ7KEr4k=;n(#Glx%{GpPzEwWxqtJ6QDkrrFPZHG|Eh9?vng_ z`du;XHQu5lvWNn!FtMu&rteN)PEN-_&lu2H`m5+(*fiiP+P##Dr)3&}*H?Q~T5Ija z#l1SNT~%9LhI$mYHQXT%8yjsIp@cfBUI<-b-kFInrh_*~Ydn$RvAC7A)4zWPbFDyX znskA_s2m$mEGB09?3lU>zAne`>%6pB_fOVOZWd$=-%|u>1|xV^EPH*B@MiAU=?>@1 z9>-9BYd!B*{uX&F30A2BUuU2(ST~9mF(3Ccy@eM#Oi_qxf?sDdwqxwPAQs45V3;-+f8N; z!gpOvz-RHR!CKH~y(@=*F@T#A#t*IB`@9w3vVdzNeEnU5#OdC0bs+pbKun4LsG_mL zB}r(oXoa(@_;dn_pHn^QVij;L(nsM@;JfG6k^>)#4+stq25jYdm8QXSKB91 zk54*Z%E1vJ?+Q5>)7b1oc6ZY=>ooAu2#`K<+cJhS8V6Kd?u#ThHy9+vY+e^Vw*7?D zl4sk^N-{Xde?!48D*ba&y3WjwkE+m8GD_5869udHTsLwW@Nr(ROA(lv~G{Q0(W1+_y2cAL4H{EXjFg5 z_S01^x!LE(r2`TeE}Yk8`B5E%43K%ZNe80ntnuCx_AUle{Z5I^RINpwS~J;(5mN1k z1WA_Eru3qYh=oV0iOiJXqyS>s!23p9cqupQZ2X&<$dqm9#JsniVH7)V))Z9^&v(j7 z^!WhPmqKcE;EeHZ>I{h50LbK8Pvz(64INvBBzB9Pw8-B^VqhPQ8c-^ec!7`4rV3c~ zG)~}mgUXC&W~+6V;RA{EF&O&Y2$_((jeiapf9FB*RuBC_IejSC+_ofCFF!j8poM4A z%*D1$s|cGD{)9Bo91S)RqrXOkOFgqQawWsEK>y&s{Al^v>SPG_?XvF>R#vyYjQgXm zd*V1P*|+C}A556YwxGnBTZl(z&Odmwi6Kjy|L6iCk#a*X%m0h{3SYt!_+6krz?lA<~C?4__LC`AmJE<{j1o5R}dtSME(FhVRCD0eby@cz8MW%3=+w z#_XihlgrUcgJ$Wsk zv^mXU?T>q8=8w6^kd;Z((VRe*H+}J$4kLSR-3skCEWj8BG>9d zZ{K(Lbm48vtG|gaQ~N*llwY>b^(anm>x@km2-W~6h)j9Ue-R&cGP56SiH?VA>@zj^ z@EUyH?j+Mn1D%K+$C3Y1JLOd(`uL*s9e~12LLZ{Qwy&11nq0+l%h0zzFsbbl3C;_Fp^CSz;%a z5@KR&t%I>+@FFKDA(WDL6l`a@vW|BQ|H`8yM83uyaO2{ta57}a;&@7nt5FK_u*z%e zLnf7z-kOt-c$SV&@)}|FU*wL5Gk4)m2RdpcY?yo0he8wdU%z~qbakI znZ206PSYJnCOjTbp5Y5pN?0kaRG5)E*3cjzT(-vbv1|B1wbqo+avJcBKlI=EcDNKgc+#iIcG+N1 zZ5C{J4x^bm9V$`*q(zDMWSLKU=!WAQliF~;WREE~)-2y#UU`=FLgv34rj(d(OkH6( z;^WbzRKLaa+sNBxqUw;YWJ>8MX`FKz>F*BvL8(0^cH4=XjJ zlRcl|0>X;q5K6mY7S|?g-?BUPV&y$itJq=d{mjiyvNoU`tNKqlHdYwtRJAXw-unBi z2Zry9Ex^>?A_`cs4mSNOIR8ScWw(W(yreF!zAd!=jWP0`t@e_x@3(u`-L}+%V8`l6 z#@h{x=x=H|o&~BAOq(I^!N9vCuGPdg-{Z;X=QXk}h7Cx)4Xor^b?lmXM~u+y7}3(r zQN}9Kg5g{>NwAg9A-?~y;pg^G5Pz1;%vac~FHYO(a!EsL=8^HqJUu-FE1Jvezgi4l z|D4*iH{q&;b+=D83kBFN0`C?V1b8A`h0_>92G4ur9{3F~( zu4cxro;dg?tHf*uB$%q;B*=EJhCQ>qZrMj3_C1YsM|x^-F&x6~#aO@me=m{Jsy-PY zsM=m`VBwDg78w(48=}#_nRc&-{#Yp+pO-8V&p4Qjv-R8n?O_Gkq@i0X?HXPtaJyB; z3|R9d$Fljfpm&%09@8ZFv2ef?-pcm-lGn;wn9b#(tK2W-Wf+y5=lz zjU?x&bPIX@$S1LuX5oPR(f?*qUF2*WCbancLoB*OFHnMm%%=u7Te-jXc&9^%%F~8i zqg7+?8=9~9CAVVAVs{-E3~QwHAh}sn7RsHivA16SWxD9}3bmMd_sl*(d)#Um1E(eR zlf8H+WAtEevLqMNkfO|aKpQjF%B7IQwy6KgB>f=0KG*L|nA^U^H(Kw5v%m?|9as}O zV+7Oz{=fJ7oMyjWwWa2ALYk7NORf>p9>c6xvWYGk?Ldb-Remg3|Dl)y-x}uu#y5Qu z&y{l4!!A$aGqBU2A#QcgMSWH+4=F!4FDp6yX;I-j9cJ!);WgDejJ?p@Qmo!di`z7bO0hVlvY%=^J50pGJQw>Wi&H+ z%359I?eBz~e`8|k>h|4vNrrc^D@~Vq+`rIoQ%4Sco+&IIdZ<%jhSXm9RziA_8+`X?SJ0Ri2`hz zhsXKLjw9h(2Cq*fP7#c$*9N&qgeC=hy`*QKQ}TlApnD1>lokcuEX2ktam`$~a=#?4 zcWb%ZGKl`g6(_WGLL}?_uUlFj8|5mBE!u=3d5lmm`F|-XR)u0>O(`415KY@YAHSN| zhfa&MG)1+#8a~%ghdqTA-U|XHbqXqSNYS7>0+OS7>Z1r6!C=aPd21|l9EF;T;w~cO{@b|Ie2~cH2SN}C0>OdXLx>gKks104T`|r zb5&RI?XhDOn``njJH?Cxl%Q}jlh~CWppj_m52a*G`krKv{6QC|NPOqTS%qE#AK)vr zf|@=^5HEBuv|SH8#o~jr^ff8NtIeoOO`tKWVz!1nBpV$81wIUxZ1W^M$ndg!le|1Y z0_k&D!>YsKqY_3a2zx?^#% zO;hSl%~?iXeCcHX(qAW|G|o?HghRtlj9vMKI#4X40p8G=KIA93{7bUTrH$dHw&?PfX+NH4m#; zetNU6n|Seg>wOT=(nUoIX!%(F7>WQl+jks|ON6g-H~w24&)|gD!86ok0JhcQMG3Ms zeKcoOdba=Qv?%|8VbG_vbm1tm_JA61KE^sD5J!h>*%uQm7K6HjYNn^njy@$o3`;;i>3ZDR-|L z9Aq^;=u{M9)k8}5_$7C%$^JA0ISXUrzU3m#98#gf_^5IA8PstBZ07a$_Cc2%Prmb3 z*0c2&?W)?GDn@R^qx5KS8~}ZTS)Yjeif6;;rnXpz4V)PPzj%}pN9UFOapM8)Y{f0x z6YNXF$f*;&-m>`P_alRuZeiph@w|jklQir#LqV^i@8;$+o$@2=p7b=f()StXU0Eb8 z>_XtjG!x z$v7k{;}l6{kBqEjuXB)$BC{ytke%$E>|HXGP4-@ggX65<^XR_c-}mP`e*fKn-1qHy z&Uw9_*L6MCm3}M7(ricrT|h8G=c$$1_}L9rr|K>}x6nyh=lGyTxS~Obtl^8Q*$GP7 zEX?0u)I?vOIN1FF9UEgsF)>qwz$%$>d2m3Ec^^by{ay7OW>1d!@NtU5ilv9*b~~lX z3>f4tDWbp%t|EXcuE!t*XlMZi{|Lr{V2VSR*kHLlf962)UQvo5zMm~S>a~8_kzL5p zM{qv?Fy-)3>o2`kcAZB|5LPq83)B{kVIqT4D+Q0}Ry2W{u+a$LD;ry+auCbhu;M*k zxUJZKxUfsYX|1m#X=$0y)01FY_In@w$f!3{xS6=2PF|OA1?lwe=cM@BguvX*md`@M zX-#6tg*Tw<9RX?b;JQ<80#fa$)yFg02bYshSF=H@9(Ttx6Hi9q?BBUNtd0;}e_X8k zN%$(er)RCO`I(@i0ZswlF2l#0i!TLy*6nPzYP_UInr63F}v`CLD-v(=^Tl% zHn1YoFh!HSorJCDfXrr@kx}2U>Pc_q1D(o8``ov>us#DtxazF5is@mXH6z|J|4W@868rn&e(TWbBPpLkF8R^x ze&D9WMNfUB=1dg=82)7th8|z%siR%vI5YT%M^N}UW}LKjSZf&Okswzc2Ex^ay|;fG zZ@$(1>|blG@5JL)-*cWqAA#$OL#|Nh*eA8}X~C<%Q&|?vPJ4UrHND(Kxh@?fe8Oih z6%i>Q>~D60Ev>sr60Y~KIFNQa0Ild~jwavC@$+wXy<`sX4;oiRIleC!wNxQaZ%&rm zES^nVY0Z7aCmy(je^8i5&g-vCVS5yi1flu}RCIv0=}v4#5!gJc8LA#0cxV&MezBk= z^mho5qu(%b5C~8T8V(BA06?qEoOixUon1~mRg|>lXX#wZZ>#WndJl&nJhulMU)04? zZM!4js&(F5-1HF*$E#+%uHCZ{oQuFlzTyH8R~^%8IKlO{zq(@#?;(t6(y4QYxzunR zWAZ69pxh7SUqUB-6+2QnDkn`jW121B#iYHkX$^xu>KWx0}giC|le&aa*Hte0t+qSu@{{QMDD?lvfU)N6Si3@49KJm^3fhV{Gt zApf$J(Tq|jF#;feytI`l5B#aVOYRmAgfozhyYSC8dKBuFpTrsbeaVls{DK@;`30uH znr&DRhp{O^IUL~1;`96>`d`RYVvxz_dEU>2fBSa?g@s8lG2vKkuO5$YxeO?)mQ1s2;l#d~%chLP^dP*|o+F~#4luePal%%bkpwT> zbf;Y4v*C>BI+RZBiROUkSS86PWyH}6d+U8rAOCH(2i75)90{ZZu%vlt$hTGG!Ir$w zxu7vgcjMCfpS`Vk9a9J!t!nVA!+(dN(pv<(U>qj@%(S4=y>$%;bPfWFEm<9`2dsvU zu)ZUs9fV^um2P4)9f4WPdDsm4o{9S}R`)=XiRS{yno)u(@uxeb4R^ z@JR(kB}?9hQz|H6n&2n8{p2U&>04nIe{#6bNgi@Ui%Zp1%5TKCS@1jz0}~s80(t{5 zrlnW9IyHpbfod4oUUzJ?wsTG%34qPDI`7yHccxE%{p0T%N9m2)U0{4A?WYF?S;gGv zDMETRlDFR7ID@l0T6!_#`!UR%4gJ9<1b@#|Jyz`f`4#?R`5U-%d(Q-db@+f%SmDF7C*tI^m}ddAynr3 zDtL-3^fz7$yek7^VXNPx;~5v!<-8!A7uZ|Vbo}EbEhxekvQqm>%rsG#E;ZgHw*UO( z2F*f?ap^0<#i+?72DU~$I*r|@vaMcag?(X0QtLUoni zQrW{MAEplAZg5xWN^b*!^qr%s&R+HX4fudR{B1NR48H8{S%$powAh&K8C!~wyhkEc zRVyRuNlQnBO&)wQy%|n^N1iH!#Oadm)?(sjT?Hr0YjTRX_Zy6mt6D+lER@k&coX** zB|{JxJUgoTWD>_qzhEZNCoae0*<2YcI-xDzr&$R5LQ2N`O2*vK`{HJYR)$Sr!6q## z&XY0R!r#8bRV->R8?jAMiQ4bSr`((7(xIN!tZ3b3v`5@Sa-*R4%mQ zVw+wLi1`5QqIc2+tZu=#-A8ZD4(e5I=gF(`FaRtUo`4Giwof;a=dH=|TmPd!iX%Kx zPnO^Mwx1m&;J0|9diJLe%U6F4Y9)cD@g{H`^tZv*yH40;^dR9k}3^9wP^Z=~@1D~xM) za&HysmHoLglfvhm3cS@`%(XsZ1g(x+hhNv_1E zykoid)zdSSGE%{f<>+@*`PrlQi97~@besLZ2ec*fQ*9S27H&TL!RMGi}5qtLJ z2+#N@fNd)5Z7k5O3l;D~mFVAj&e3xMSHQ0terO=FYp&QC{vr;WSJfWJi4bm=BtNBP z%O8O`%ojk-8Cbt(_pO#)tZt!hh?1QUk=Yl^>otnaffKv4(M(8)$-8m%2-9(n)BFA{ z{@4z!5AS%_4aHe6u<(DR5FXcSiR>rB_vcbLmE3_g9<)ql6evolaQsm%?VL(5 z=z^{1(!#h3v{b%luIOuL??Ljn&Xn!sjMyP|m>aI4E_fkv4!F>KKhr^s)*waRr8B0= z)0pJ|UirNgikTgCM(sQF1MHk$eOuG=oJvsa+KI+fCYr>K&TcR5r? z_K8?r{AedESKeFR?Nz*Torc0mirwtvenO@|F(ofTVpIA;Nbst_fljWCF-eIJveSRG zE510hK1lWM@iqZ-fYmdMpD(|5jaryE5E4CA{aB3eP;WP+0e?4odU|)DDn(3) z7R9@iE_<-3U2{d~H0*6-qW0@(?{Vt>VE6{S9+&^S`3@8bK;hQdhIw3pZKX(1+8*+a*e?#uWWS3>Ue!{b zHVIH*0;{>P0;a`y(l++KDh29FmDsc#V&7~q*#cI|8qNP2H*eLZ7xlc?YjZaE@XNA+ z*Ao#Qi@h(9)Vzg2c|BTzu~N8VL_Kzcg7&cn<*c|!W^dD^J97Npi2ust9}}P2+9SVN z+fiYRhAkscq{I(g_4>4Y??)7&~Z{Gps z#|J+XM_@~)!V0X1uAfTXyJsCuBYy8zUyB0JtK4fxA^93#c9=`iqNXvl=#9^D8+d5{ zyv_G3R!b|r^0zPvtNohN^PO#UvF|?ZJ&WO20awZOd5!+}?ld;)_ivs5Qp1cAdDR-WO6qGfA~I{qQx|1#P74v0JGDY7Nk=@Gei={_j}-#DoUAJmm!6-1MU~ zPI=tJ@fFGm+0Yk<#nI5yb1*8SGz%3$z4a2k>TB0L$VBYS$c8w~oBge4HAI0Ftx-j5 zBi84&{Xa{6 zEG^lT_A3ek4h>h)=%eL_yyH@Yy&OWG!N^!t$6&CC7j~r$ISD4}*#_Yz(pUdL61=(N zaaH?@s0)c#68x+}$Gtj~JjV1Oy$#Pky^FejM(4@Q53c?aMf648#Q~!iYocm%pgI8&+FX8n^%t86Zv-u zKDRr9M7oYY1I%mAgi070 za_#bKDw?eiMeEMT1fMC8|Fc==fR0-}xjmcqleBaK0lq}4- z2atR<@#hWcn6zjjc+BQNw@2G+6DvGfSqv%BKZ4W18y`+_jArj#bj@p>hTC}SifISP z@%We+c16v*gVk&MBM7>wCyHQu%&Hki33RqAh>3;qJTBT>@@heam>dzOxv{$N&5H!L z#X~wo->S$(=OjKTVXd#%XXc#e09}H*q0dUz-5nw21BR}9i&)tfF9m#o<|Lg-MRj>c zlIYZ2A)$M7{yv*=zMK5Q?xHZJ3rnJE$2PlQdv&|N8*1$_yT(q8eU;$1H$J^rl9-As zHj|$@(Srracu0#h?Rgtsg3Cx21m222Oft|Z+LHtQIW0K~>!~{1)w{6d;4#i|EAb3+ ziO`K|&S^Oq_)(3D(0i*zaBb<(JD4o)bu{wroAhm|5B~CnFyAxpG9*NzaSd+}?q6L| zGr9KMKQegFTMK+4S1MwVa>?IW56H{4T~lTx7N-PARB-Rh)-w|L$(CRC+g%bRgOuzm z@j>Fwj5HMgK|n%pjh3nrvH%fMIBzchA@MqC8IAcTF))sn?J-3#jQr&Hgu*)u6g zP4w+bdg}s}YkwBq;e(R!X-g^8?{BG4b^XWwcHHv0PJyr$LRaN-hao;`YB$-K{FJ`1 zLx9jANS5611JS0;^qi|%J(J_r9hGLshYN(?wP_jwi}Fr0rOq3<^jIGZHb`+Q@o<;h zjB|M&=*vzr5^*K+J1bf5W)FymL=#l|mBD;vX@p&rZ_k^HAM%w5*gK|}@f5)CN%%%A zKVg<;6H4NPUSlVCTY8)9F{XkOC4@ec*{;#yETz7 zfyj5STb!kCZ-9BHb?Ia8x`(GxJ!4Vew?7rHhu@12M^EuWf&;w=o6n;dT|b7?V$-i* z+lNzl?A}HvgFUml?4({HgQeIJzc)QuVN_31E~3{eb>_G7(_%{?=y*(_&N2W4d#X&T zdj+pRRm9@Jo~rDgNMC8c&5~eB43C%(YVe0qbpLQ}PIy#VQDFI>io3(_U-9EJ0r%*w zlLXdV{BMm(28-CXaz8Vt=rF6;&5_#rZYeR395ynx5v6CwTw#E}G zMprN~aszQhKaMuCc<@he1_P6iBz{ch5nXDQeOI#RW~VQVKkrbgnmJAUJ)(4w4VAs- zU29+7Rr3&~?5Z7XtPuqJV9$BqR;OnagAHLz+4knqwLwmeLS# zWp^iJiJOHBgMV-|yuWJ&JU>yLKJ_5v)pRUlIL(LtWbY!hlnC2tBF2ORxib1%r)G?;oj|_iF2G>iY6|2gYd?(O% zh`KfuQZ!jrhzF7!~>iXqMa}+5B zfz9od@}!->>D`=+*JcL-Irh0o|I&K|NfNSZ_&I~^tv13>Mbz;EaWR2k_Q1FSiWzRY z@x0ynv_kAMB+zjhcP9&cgvCpxNmbfD_Jx7Lhg?cTRl_q(`=a`Rz)SSAg)6STo7I)y zyp;+xI6o$3y9z;TJlJf7UK?1!X(7Lzf|-fazZ0lL#p=wXNCFU_l^nMd*DRhT{L(W@ z@)3%{X`aIk9+FlnUO7hr9?cUwlzf=$d(qqTu&0d16gIfU(s^w$(XI}rj3V-iD?T;# zW`$g}-s71xhOfkbRcdi%h=h?tbOYULwv+j`ONg95TbiN*S*H;d2R&al+?uOB+Yj^> zM~dXgpQw?Jau(1HEOt?1V8*5DV#IJoJYEu0%F%_Kn3-E|Fva(L=?$%FLC*3kgMe(H=J@oP{7b}5XA3eBUj_!VWa4wAos760 zSoW!{euct#59}`tHvWVFxpb#Hgi949xzGcedb1FF43DVX%&1q#`t)Lq94FMN{KWa@ zZVMq^z*3JoNnivFZLS$?G6;Oh_$9HfCT4!f;!g+Xc8qbHW#bNU>`M|-R623z9XTR) zbc9T|?<32$G8*i)${rw>Tm|~_1z`v-^Ua-MnFu?uUb${hHzDGoH;&a5K8IS?M_+f< z4#Rn|I!5sMav7$71G~3RPC7ri18?Q$1sYCq3k6|G&nK04r?(mzM|8jCJ}|{+d-5ql zJ$@fJ)^6f_D`l6mr^&OwhZ&!`l$)qd1EMe28+@HbPKH<<*Lb$X#1~e>%~q>+X9i7t z@*c@`v0i?*N_;mGd~>K;pFS2@LBlNZrr@55-aO6HrN+MufAWoCG1b>0ySHw`v$-7x z58u>Suv=n7w;rcrrp%Y!6Fx{ZMSOprr387i0`euAd@eDavzW!{(LVwx9elFz~oy*5g8O&j5P_RVQr87>@7RHhxXGzUy6 z%)Zb(qWaX5%7m=SS49##C?-AzLj?=n33&J;$*et6?#~@`nSsNh#6$@xD;8=11YL&U z3C%{dFamSco(nLDvJ#GZGR-rLL9vZT&E+kvHGe0wasUrw!5;NYXxB^KVH@_ z^eGv>ElL{ej0(5gkskO2AT(44_{RRg}^VnpIqEv;>vG~~czF)1^H*x(Z0d%Z7xk&uvM?NwL=ku+t4zYq?5CyXmUq48!q6tx&R5+HxctI7Htl9tO5BX{U{s!h=w zHTQ`lux?&tx@vK3ca!x~^Scji8u!is!QuDH0-v{U1nvm`Z6LT`fp?-(?1N7bGPwXw zm75S9q25~+ni*;-CYPh(a3R^=qBH8vV>~(W&IL-~6te_ts3OC;z;<_;pS)V;&HzW}spU%$5OK4hJzgauKn$`A!$s8k z8IpiRIOe9Dl&)H-qxnD^C-v>hN`><~39h2Mw>gXvS069zL{$$YB`Uk{xL9j6)$qN? zRW}kK-yW{`Bo-)e`IB=4eKN2`duyqhGGStlB)5aK>FQ%tH}Zh9F32$z<8ObGgHKV9 zPEOCqWC|(+3Y~!loO^f7qg0mmKyS*%-B~29KK+U_*m7^hwtkA;BEZ3WbiYrjYSvCI ztiWWkUMnuud4mptq?rYIbY2CD6R+V~sJRzHir{PedE=pci&I}t_l;;y=%<|h2ZtZd z1nSYB$({!~C_q4D^;o#%GFGX?n!N$7oCLPs3f;j)e(AhIK7jFcKl-Wfq}Qi2!rY(F zabTUTyT(b$=|}HZmm^rjIK%6V4H?mtwjAMzZxxF|zUKzw*x5f`c+HkbfePAjpfd02 zJ)F0(M(0E$KH3kce3ALE_uGhqc1JmgKw`GnO+VijH!~l2-kB-x+CHK27wP9o<+?9G zTFFth$>Y@IMR~F-N}qh-BCBF4bEMsJi=N0>HUG8OdyaQFFbTYeIXhKgSDfbebu3Cq zvG?W;Ldc-zL2Fzpw&BLaU>S!3i@FP7Yl1Jdl~HodgNMLmvu29WXEBA4H0Sgmg+Aak zx5#z;a2r%W3WdxQD=!%8%qU!QUa?L$?6`&OnQ1!aFtyi}IY2@4z-CXie8t(nXVqT8 z+qv-`ppCjHsiVg%W08QU1yeD-2OXvgcc%S|D+^DQ0uO0nz17|s8(lF6`!!E@3Omus zgflBj>D7TUinrg)J`OsA0{rBvA4Z><~070tIBtct7`ty+PRgipQuJ{Y@EFOG@;$(vQ0S1<`%LB zB6Vs77<_8ah9shAepBaLI1T}t)j^OlxAI4NAlJxJbfkRG%CqgwU9`KC4`Up}#((@w zQ8E3=6qW(fqD<`8lp$SEU;uB#a!C(0UpD(_1-L4%i(d}KMYMu26Utme)bh*Fi2~Ef zlrQ`1)AGCW{I6L--+P|>?AsfqPc;DYbfu^Pa`FgCiD{~#7R$mL7}*G_9bD3oa^Dh` z;n(x+{C9wSiVg3I%D_W=z-M2wPKz@#7VAs1G*kqd_TyvBo;xwn9FLw3kMz~GSptIJ zhUt@&GiSU-4y3dmudVyc`}7?I?H*l)}O#X!?B#t4NZdF zl=O;(Sky_OEGn1SC(6!&_wTzbjtDlONEnuKY-bY;al#QgEEq{)y z9mrnM_k2V%4*Wtila7S5!`j$Mf;{YWhXlJ#6EH2Aooe}NCis{dK;jAz{=a9Vz{mFlm6Z71Zf=dA+*6>ljziGzPY}dMc-xBh58rV# zRCPc%zX$V0G|)x51Hu&L?Vhr=(ACRET(1U;i%!+xOZ}Cg{Xlrp^?u0uqclmNM!XjU z_|?T-lADRPac#bvzIWb=d`nXe9ua{mIC9_$46S3h-a|TcTWZ9J}25=uWV+i@w_b$EMVM! zkn49j+7z?qZ64CUV3B4cKk72|?)jKcn3>w>saYty$x4V|Z#-!jo6s-4xAE$9eMNvz zVyhznNfz(ZE3$&!pEtFa0wKj$_CMi7pR;X_ESY#^S8rwU?Fh-G?j15ih)L}l>Ka+n z`YnuI!Cg_Bb%eLl?imWXqKdrR?Kb9sj{;i4wp(V`k4XG80gM~>=~=ugsgCY+vy2e> zu?g>dC>KNMpB;%mYV6v!>7o_5UIdu&ZRMko_us-vn}dsmo`;c_UfJgscRKP_gjHYZ z;NbJFd%zE`SSrk?ril(|&(J*{$qu=EEsvn+r)sqlQzcs8(6TFUc=9032TwKe%HSGc=iFVh_zK!El0vA=iZy+8I5>^x zNK5N8V#>8FcKkc9RsC1-JY&PBD*V}G(O}!sto^|GOJXbsJb%OOQ@gJXAA@+B#}6jX z2FB&2rR;rjlEssOK5dLALOdXgLOvyTvw&*P`F|hYxOy@z470(}&`xjHAN!R=kixw>Hsy#bW6)Yle9S~ zz1$vitzi&BjtZjfXzY9sz9xRfozl%k|IJEG50GN)ok%p?0$m-a*H>RX1xq5SITn60)~_;I&-3b4(X< zwujj`8M;$0=fKf2_VwO9e~gO3jG|neigujH2q+hOiuar;pbBRIds+rwnDxeiIOQo~ zAL6{YXqROno#$6~>5h~}9iQQ|D9iAULuXv_PS3Nqm0>ZpMMj!X$9nbI6FdcQb~v)}etL+QxJhaI zU8K5C#`C?;e8_KAI3Q|aca>@fqRAp3z_HkX+$RzUB?O@4tpy+x{c>NUtmDw*hv8 zYQ0>lp+anv*FxTe$3Nyx3n$d77W8qWJQ2TSo zTmQmGE@;o|vdXWgYpt~hC4t`@MBnilyAYq?GIYLccc+Z>0{y|fnM zJGOSbmkaSfg}pUp!pOII{?=a6W}+bRBX;y>-J;Hm-U^y-pVx2>aN)luFJ-e!8e50} z&sxM5q8Y%8(I$)YZl^5BK)b1%Si*s*38J)hPbE`%AZ(bKH_T|b_d7^Ey^G_Y*|fLt zpV?IGzPeKJQ}a&7p?pQ?q<7mjkZF=tYZ{`%1mVY%4{Ps@govL5YD_bOf66TXAp$TS zH3r{YF|A-8uE(pO&-;&Jm_ee*k(6HNvRdo^PpxG?W8C{3c>K2fL^bAdQRu@T%-)oX z)KN{9kvgF{cjHETIGkRizqpY-hQR^E#eZ}WMX>;yp;+PDa8BxC6DmB!d++wa*nz?o zOqFKr8KmgC8>2tXepH{kUMy}t?%45imHHX*`(*42@oi@tsN+UWkzUx}iam(DJ^MQFLJVYwmKI37q?F(+Q%_Jlq!z&9^Z1@Z zdzMmXH?G;a zh|2!R-sYRijQ($2$wuDE6$_P+lR`Ye%JKE!mI-@812dEVpb&4;7Ia===d?dg#jy-a zl1&ziW%3ifNhW0V@n6@v=(@>2IRm};>tc~3RRy<`bI6Wph4qHMIZ*@PY`793RB?)u znQid~@p!r573NoGGXK>AFs{iofEU#Kx_fdGn7<(ze(dlk>AKr5=2VWZym*#02|DXHP^J^`+|=s?hB!zJK+(;b z8}hmp`-Q=HSD9WAasCP31q9dpdGp5Rr)~-1`5^eon_5(~z~b{nt;<5G(ICO-x;q&? z2<-^(9j`n1D!++=R&`&Nm=RU>ot-oA+vI>ZMvtkwT!?fD;Q+!gGR@Zo3L(dh!w)Ih z(D_aKh$5)kf!>qpy53+?HB8ce?pZx2T{rpy15>W2m3II|Op&6K&@JYu5x&|6;g zs(gU7N&mJ2Ip!2umvh`M0CM&nuX$$bAO7DDW5Pw}AY!103GQfTN?RgM=LnX@nd ztl{>Xe4qhOK5HMG?xDfaO&%Niw_M8u=I<&s;2bF9hMb9qM;1{HMqO%VI#S9xnV=LI zQBl3@Zg0)iT00pC3}(MXjB|gNP-$gr zdEx%XgmF=~(v%kzB&F=WV7u&pb`oYM-<<^Bg?e6K;Ub>T=?S~he6N<55qKh%wH}Ek zMkq{N02XGT+_y;6MKOhw6NB#i&kR8f-jiu(fk;R60=3vuOQRbAw|)&CqZulvz-;Ge zejQB-HPc+bp#=XV-aewm&>4m}zn=`Tw?_W~X7*}(Xl={okzL-ZpO(@>= z+OJtJeFGrW!e+hHUjKIorOljjj`r#1>QS^s)MEJw_w4J1e*k@q1~t3FAy6S^RjTe~ z{dsah^vUiY%#aV5tDo}CNUF41oh5hDi429bz?*@Q`x;i@6AOmnO)l!r_aj2rcOvbD zkfAIrM5CH39gxMT=N@%SFXjCXfZ7G>q<&c+dZBr3HpeeAJ^x0M&n=WLLE&$(B=6-eD?;EaJK;>6hT zbjg1+wf?U|aoR1^+_>&Dbcg<(fF3qK=C2cEr$TNOyaaeUu~QBu3WR2)ldL}(7;4de zd31v9zzH*;bMSq-@GTie&3@S5Lk-oLzqe{>tU0B7+JX$wxnSNj8>1jPVoP@&W*hKj z8!`N)S%AeU5N%jVp}!LcX$4&%3ukT6**BjPFw8iX#2q}FPG+2C%z5P)>i&fJ4DbPrT z-#!&2LZ=MRHK97n6UOX>t8GqgdB~^M-e-=Nt*;;VUqm>)<%i1HS#=qHSE3IvK1&+n z8}m|Irr~9~2>jZdtP1?w#B=k_ap=<}1EAtr1s%`-YeF8v1G4qRV!*Ob$PY~ucm7&7 zh1mTs#KV`G9SS%}QT>$pn`P&3(4zD_$RxtssiSwT`!(Gg|3#n${ub@Uk#=(nhq%cb zrV}&Y!w?hhP1wrnHHBLF(Rm|642O~Qm9D7wbRA@)@8q5ts?2vFCbkU-aQ!uD*`+I^ zIKQ7>Q3_eTvVgLG5ZFr!0W*O zO8sFTip&H*U96g;#P-M_y5Fs7{hBIu%a3PobS zv_e4GS^3|ijji!KwHNsGdbg>BNed&HnckA;U98BthN3{%Jnhy`L)-7y(Dh8k`VI4E zr`Fu1pgykYz(-(wjh*E1&2@fS3UM98ZdXlj4QBo9@vfN(nwcx&=8du7?1OPN)icC1 z0E{I<#Hyd&tkn|pE`cP8dZClOAALN|yKiD&Ux8+U0-Lz+y4C?P`l@s4V)W;S0TW>{ z_jyE`-dLY@n0QGpDSkX%zdF+~GNy+$CSo@b_g5|FrRltA=jMUZg zRzH47=*X1DVf|6D4)C{|Ic}ePk+lCw<_ej6{J&s#N&vTjD3|@u`^0KN+P)uC-YBWh zEH~nBjV_$X0)fCF-pBl(NtZNt|Cv2e8_Nrh#tc*cCo{|;ys=fy;|gnkC3sJTs!z>J z%OF;YAW2j65gXq@)`0|Jq;!x4P#NfgMjjHq=iQWlp;kKC-+})Cn|Y-HGYX1C{XYi; zHC>E)FPm5lq0o)M{c_)u1mpKzY{Jdj?PLbcD%#w%2Y7y6ly+JPzai~c;1Fo6v?6;6 zI82sn*NTNSnjh(A{*5{T)ACbGGY7$Cewfp5xPO&zQ!iuB$z7|?9DGw2*IC24eMjY} zH+JW$9Q3B|?znWp?&5fg48GOjm%Q6v^FzT7yGuga**lru5+nxVe6uk4{sX2&y-R$Kbvcygy5s1v13($LTnp7hPd{_{4bBfMynT(|Q_|`+e z-{kpyQW*r(BvSA)0x;u$z|Rlv!r8a5dBmw20{BK@=gesHEZeu);t8JiU9hv=nO#wV zD_x9qmJuaf<5U*gjhlJ%NeYBSdOE!^#2}c*;z*4Ks|8MIGpEkoZVBR@wa_%qsPh&? z=P#Ah#z8c5Q^B?LUZjtI07wBfo+csHbQk!RW0C=PSHcSy@c2YwYeurZUbDE$bnPex6G$xdy8J|?y9doB7c#dCAeM=Scpc#PjY&oHeMhN z*Ofz6yt^P3tK9xK(`+{h|4Qm-G`owvNXlS*%C<;0IQ8pK%rIMzf|Jh1fyNKVgmr09 zvz@I6Ygv24Xt4>O?*Sc&B>Q!N$`ox2%=uL4FLlzMg!I<7`ke^h9*7n zZWj0){p4g{FYb4jJ#P5Y%gDgA;r;9%K(~KxdF74}^*yw8N(+lU^UJ>k@c$UH^)=wa zO|)H&(jfCP{4#$;;DEILHW$GLj_ojVMaLLCajJgat0lOfeUg@miTS0f9M9jN6wV&4 zh)0qn0TOGK=tP&6#W(4-Fpe?>4RFwm6>+= zQL$lX!@_?wNQER?KNzP-Z&ue`64}y9Qb}?71COE0tk46Jo9o|dOpYpBZLPtA*9fEy zEDw2>fjS&1`TwlLi{%5n;zeXo3Edy7QTcN>4$F;>qz|w*0Q6_3tn(7Rylf}$=0Fwr zmYkNQ-!i2o@$S?UPOa?Jnef}OR{3`UlJh1NWR-yNJyy*Jh3ut(W)-mkWf{QFNzo*g z8q+--6gjC12U93+%r-brey;$vFo+6e=LcaWEdadzTa<&y|OqKGAzsJRcV%EGJ*Y<$0>igu`6-6j^oWF>z?i|z<=CSmKY463$ z;5T&Zug~!5sm<+NT45kY%!EhL7mLtQkUVN-+D9%1#Jj*E-5gE)hSaM0NE&N5SVxa$ z3`BG~drS30H9ph`5?T+?RhQ}aJ2>z6){6@0>^PV=G6HP40l;Q>3HDxY(1rnc5VV;5 zpudl+@k~W*wr8#JX56-$H6Cct=%LY+raxEarrJjayg2|j8btUzW3B#g#S;W>-qP`4 zTxA>CQ$U`UMn`=!!P5xE#!W0GO+0Th;pin%6{`YsP;yiYOJ5Qx14UgNr8k@bdkKc$ zazt2}SoZG@)51VCvrQYs()aQ(;g z+~>~o+?KIId++=|)sOAaeCpkj)0d^8gK|mq4e{Q2os84Tl0be{@mE}xJ#R=C2Ufk? zfiJT^A!QxRyv4|Yr_FPsUL?qrR{S|Bg7u2CTzlQ0r3;!^u(6feJfu8?&&ffXYm>v9|p_WU&jn(p*Dc;4sfg1U~2v20xLY^~SF}s=JN;}vM zvj6-zj9c%if~_MugWi8=9K!1WrZGZMrveANHE*oh9g?*18x4U~{#Fixb$OTIAs{cI zB~Hy`*RBW#@{UqpAkbrKOd{=%IV3l4E{LnT>_ zyR`3C{I_Djez4`sqf;`wwz?WRWDYdyKD7)y1VlXy-l~7k2VjA_a1bzYsHdUPGQZR@ z^*jPwA}xFt?-ysa6}9JB-COQ_Mfyu9OQY8{O?allWuW&$lIHrqe~A7d50tIQ6 z<7<+cS%5(WEF!y!5qIcSh2x&}B92}%cO|4O)gBHZ8Hp%Mr>!2hoEv2;lMyzp!FYB3 ztJEhgjTtlltFjqM|D6SMod3sTd|%SARy2*kNrGGA;|OI++{%)V3bmMFF`ne* z8l-X<&3^N8b@>Sxq(o3W$l(uXt(Wc1$<&v5$e(s2eO7qEATp z=7Hd|!bbB*@BtlcaR$J-w`}Ahz z#~NPIuboGam^Sp{G~1rl>ji3`!#Y>r!Kj7_%6+mL z3Ha9I@$NcB7TdlOM;65|Wr5)WY91n_vI#aiSkbKu^7)xA$xgldg1WHpU~_qcDesCIDkp$AzaxG6d>@-M#v8ycuQRQ{!1LlEuT zt!mUG?_ULi(X?zdRRt0mPU?J@B|s&U}C)i5yUyru!iRMF9$?|Z8-Wo*4zDjlw05gjjMMj}xE zm*Tf@2nuTCFRAjUn9!SLVvj$JtVSjMIu)H@Kp;G4K1tK!#U99V6&aV^3G+A?2x|9T z;GK`>gQOKjgXA1!jIqWOM;<$iX#?eH?{tj`pg9q0(|Zl^$Lo@kJlDHmnMRnENvG+a z52XWD0s;+3CwGkg$Djr>SCM2GAl9l1UMvp+E0$h>5B`GcYRoUeGscZNx8x7YYRG|Z zcHW<)kn*!PKL^e)Cbihg2;!E4ARr5slH}71RLBLo2>M;Q8SfRt_h^VDyK<$oPxIvV zRvy#zZl8;D=Hd;q9eNLu|At@#yp9prdJYgdc@h)e8h`+Hm)Y*-TrIcbLv;QSBAOMS zvO?d_r;f(4B^G|G=mU}j{lZ8f!Qg(6cJ_+oU>iu1)?d0H@_1QC*8YRJ(y9r?he_$6nC<~U_TBO2-A{JCs`6N%?ht3l!;7o7Sn z-Uga9m#z?$Hz$Y+5*<-&6rV^{DfOv?GE3g6pMPmkpjz<`D_IpT3_VsoRRU$k5V}N9 zV0u9MY0JR!2UA{0jGmL1E^Y$TLq`g>V(_3keNp@`AN$Xw<$Z95LSGbO!{8PGLXdSE z5(?zH>u}QVYjX~;ey4t1flSIXI3^#1q~FW|?D~JWPV%(3Cb^-7T};y=c5UEs6Gc3q z+!MT)PhH&EW*!YGHD<$xMLJsG>U)hPS^Q_*ZrA@ym$$s;;>h_RGJH}YdY37DF7 zv(o+qTm1p>+k358+@W@lC=tEj1Oh-Qr+;|8*fCunZ~=>wNhkz>hrsr|qD`CQ3GU8V z<(S+x%-Ih>KG@>xFO+#hNYSKzui6vCo1*JiwYNs35)V%e$sD>q`isK7sEiYpA^H%j^98}cjo+k0 z)G%45-9<4)k#+=xN#se6|10ikYOCxhR;jcHK||Dwqnjy0%>NKKfursP#e-;@^U z#c!V+DMrAX@P*O1krYTS_N@YV#()h>@#D>>XBNGhj)-s2jzNa7`!mP+TzTNza`WM*{Yj#hd`sq?^_YU?{|P9@R368h-fQ1;j)8!DjG~vgLw|+Ty}hW~&j}kzAk7W_ ztT$p3grl6*Qb_$&IKItpW|?Vw6XZkL2sTUoB)2FO)`<8EXo}&^Cp;`5R9Av#&wGd{ z*VVwVKNU`I7D%>ATHosJ(mVnJvmAOqMYZ1n44UcAEIAcm6}S&_2VmYDEs)3)44^T|D#|mP|epZIROZDDDK@u_<;NOCZ#;p z&;*Xg&Nn~dTl{)}ntq?@h~2_` z14-VS^A|;~pQ(#~S6e9a=l8Ua*iD`5zq#Zih>GMp4i?Suo0a@9I17c(AYvqnTtF4R z9F+z}wUZSLj*kgkJ;L4V*LQeC)t{g*JbF@pxU@Dkn?1p=CYb+GI|jMVd*bhD{=dTB zJRZvS{TsJssVtGD$k->5rDVx6wnAk|-Qkv zo&6S?BBg!iqO5_BnNjfWjlmSm&m7lEbH%lIJO$nzhM%tS3VxzOO_ORnjZGw8)+lpV z|3j#KfjPAV1MRyL%u-~e_3ldiG>%SC(sP?1c_2VdLEFdkDs%teOvI@KNKVkn{O7}e zllgAiDjh+C4&(rsg-Rd%f~hQNB73d{m^FEjT3l0lfb+XGIi$=8L;9h8IwY*UG41gn z1NPP4OymF2&!cCPAW#AT!~M2L50Dwx8rSo)YtXlH8U)Pq?14WBeOSz?G3jQH?E!kF zDxf26B-+@ky*nfD4n#AgW;Lw#g)(U-lwSr$ZMeil2m&$--sdxLaO#)V?<6&zbDM`x zv3!)0n{};{A*hbBJ>MPFUZ37Uf)D19|R#;D}SJQqBl&1UUU8er8oHq*UZYgED%2x|6%Luj#$83^=ODd{yy|K!QQ&+mpYD!K0f) zKY)C3bTp8-&t%>{s;4V#vnZqHX?EXpAmilG6`+cb2KreX%kw)VoEq8n#L3wbN}cd8 z5G+j{e6rH`9I<-TC1kgvET4ACxTJ~7cZB&!q0m3S>Xe6oR~F@Zba)gTNx`v4{z3A4 zu%bf}pbrxe{y@C(%;4*_)8do35IQ!ubqX}-4`w2=N_95r-+OvSDAR~h%7k6)cd??1 zUeLkpl7%;n|1DUc%8882lWVpEkify+Ed|{CQ^Yw3!;62k0MwC=yLF+OrKcwKcm?T% z+l_VgKL7uVkkzy7zq(;++-jc^@RYF+gX1gx9N=-H((KG`f7etTkQ4zHGQbD4)lht2 zbJhcK*wsp=ZC8z_{;pO^K!WyJ(+vJ#PK2f*&!)_9_p|?Y)1rS$1x#wwevWVV6Z&1n zS)MayAYIZKk^iAu)sg=q+A1&%a8FKX$-gZtIfq00YHDkTJ9vJ`0l9U}kl1L0}A+ zP0{wg)x3E*lJ&x>i@k`Q*05c)jLr-DFZsaC#dD40M>%TWkCVGYsvvjMPy2ZK`x%xu zfU8Bu!vg!c?1UZX(or?7g}{EI5nMl#a0w{eAu)sJ5r-8|e9fi}mCYVvUXf|#v^{@p z4howe-5Ck7KYK3Re!Bw~GwT|Z1n#_V=aepd78-^o$}Sm>`x39L&3PA@eqqP6YZ zT}iLc`{e0Evn60?7Wl=59V5E0uGEK(PJtE=WAmzIo>U5^LZ`q*xm`Ui(@yy*{a~HM zJU$M(L^M(;M{NaR>_Y+b5jpAPQM)0q`zt_wWVMS!3Id(FKgC7!qLDboQOK=1<7s252YHzIy(pKNAtM#5Iq9t^ab}Z(pef))wMU^9+DHE|S z?+A6Q^ElGS|FCBUVJtwTY52^`ql?V#cf+YYd$Bddf2KHtW%kUHj-M^2ReAQhHCph$ znX}3BWoEUR;MtS-3n-BSCub7?lgzjbEA483Z< z(YV3;dTm0}=Wh@uXeI>Y4P43WgwFV)kf7;HlYWwExpf=dNR~Ii`B? z(RG&X*8SLt68==kToeGt#tN(o)Y-eWE?s<pl!ln-o_R3c@+Xk!dxiJ$=UXzcJUF;#H*Y~OWbi$oBVA z3ZM(7{xo3-cwyuFTTKC3nItsyc0K&v&wzJrcNIwlD}-p>lEuChdvSW^C^N@_8B8TM zV^L@8A>gwM@H1!?&u#X<`)<4WD3w6KZ~kqCe9B=mXca#8C@h!|q_B1^CsB??3RD{V z&A>Rt+c;d-(2GUIxA116gV*2xa{QgWL7(Gc=G?c(fB}0PecHjP`kqC9;VrAl1Gw_+ zg?qIKFGzCitT-!>7)dH0*`25{=Jiao!@ZclxMV5nTmYQY_>$5gyR-9JeRnUNH4l&B zh07%}bxOb{D;weluiDe0%v<@R80yzO5h@@ZIrttRId(E*oi8-;@I{J zl1n^(BLHV~@5lYr@9IZLi8)`)Pe@MD`&<9Tx&7Ns0_iF(s2FnP?ACyl{WJ^X*%j@m z+Lq&SU=St?NZI2{|E(>sX3j#)-;GvXQQmOJ9-o+O&tc5OH*(+r0$<2j+&r_43Mwj}Q69%p+-LtIb79 z>|&rp6q%uL7T~1+w1_UsRQa~F{O-wsiLP$lWhkD44HF2!b8daRvpcfH7JsN|X=WmX z>N^blrP%kz(+MBRvX5%U!NFbE-IZZqthT;A`6Jzk-%oZlllx}AXC2e_^s`Uslv_6s zSlMl+b>D5A^byBcyr6o1qlM74@oM_TmJ)h%Kmz6lc@a?On~M~xxojQ)9X=6sMUYOe0WxQg)cQ>5 zi9VdY7BJN}XgqzGar42(N4QuO7|7wt=sus!3x-~A|5L`wA;T4*0z?b=p^?g0KSIJi=>;X+I(O4b#7+8O(o`d$;p00`1v zqJqJ6*ZjYk;;}T$TS0sCDDJu~qkq%#IG>fdY2C(!cH`r{vroEaOs0(?nBVOm2^{yE zSlR&*1qHguR>AQXk7Wx^IZfMv>LJ?4SMxU)H)?6~?;wH;aKWY@)K_6Gc+(cl!*mzt zKaC(+)=L1!eds;|8te~ijcRUk@dSWleExK1uB0?QTl4Jbmk;FY-96G zcioIBv3y^(QOy%*)pAl#bw>@EwI4P?kN|9!Ola#&2=c&hCMyq!=VJWl%pr^Rq-3`z z=oEs(CcRwO@Y8k-s@*AVhNnUulaw%24>r_hBFGB0a?i4Op$we+59e^LhK z{dTGJvqMOYt3oA1-C*AK#{=IoHN!G%n2Kte9OZ5KK-(oE;e~%XJ7Uk}w$<caVdU2JXg9y*Ha)s&{DFgsQp>kVL;t&l7n!>`8+tKHM}J#x{#C&qy&Ut zN`mD(l5K_Bu2#js?FFQiqf)S$o~Ksh2B%6ndM#)+PPG>tGxH5UH2!9?78Qm5k9?B% zErkMztAlMzVRf@TGkBC!KJEHybKaAC{27o#LQrr(UEB4HD*kqMYDDk=2$t_*!w(zI zcbZGF(hkI|9(ETfX&4(>i!yU@?FJd9ap}=$Nr}Ia+of z!zBEJmBx>#=M%92GlE$??d9mL4|uY$MSv;r7`;r4eU~_?5e%|f8W6EA)1w#JcJLqIPh1`1Ih%;9CtxW`8s+@0B24Va-zq+8w_$W$jf2MrsG> zUN&1xOmvGieOhW`I???wGjN~6hu#sT+hBI@LMB}Fz(Gp$FKm_h{~v>R4!>6oBIfN9yJo-`5IvxD#V=zQfZ5XZ6e1&r@n zAN+x9;%5fSHcr_aUP&u=`&p-`dBO9J4WLr{LC>W|f;s`-Ow#@HV79iadC2(b@LdbV zo#qrI2Xv^Z%K1VtrMw2Xt}`DT_3Y|Ip=LsoT)PoVv99AU8IoLYEt^I)AANfSG~+KF zw&d}&5h5F`Jq9*CEKn(ChhS=s3dX%e?-LzqFYKc8n zI8`jH1h$$sOsE0l{wUORIX~!BNjDg!7&^ypc zw=b&95Vx-Pl0bhKd4xB%BBMYx^}p2nI_D2YqK$1`|Kz+sHHwT80^zQZzrruM;>~UG zx6Vc^cfQ)0sqXZHlT2As`-0P&Hc#!W#D6zmR}^~tw)3ZFjY07I4ZThM(A%kymcz^D zd%1V>n#`86T4S~}EN#63(U-pOXSR;-OU((J*oz3%Q{X$4h~jnnlYHhS-aEhOyq-bg z{_T3Eq5JXSVyQLxNUc8)yMkOkx%bf1;rn?HpXk@;eWvS|`oXsC^5Z8K#jj0AR?iH{sAqjhbV)ef-6`0bcy_Kd zy3gr^52wlJ;s=i{gm{|otRvQgs^9Idyvq+*8f^^04~EHPXb;}0m_O^jv2bUnr|#ay zOXB|Cv(=u9lE@P&=EhE9AayWNO}<=)%UaTOvK!>q#E`b@y=rsWSd(S92+zmqXbT=> z6O58Kyn97&r)Kb&73{P&`3g7pzWN(aij*CxkC~`t^97D0y+MDUB){T?XukfZUrtv; zXJf+WC%ZTiuQep#%yDx(Vw{mG9=7n}X91jD&5Dn#=XLO=nqM}t6s2m!t$~bk=!z|XQ#uauEgNCZnT4^efeOkf)WG2yT*y7kRIL*dJYE;yvz=K*f3S-BpmmGY zie4lA$VjZL6>8-?pDsbN$x9lf8BPE68-Th>!xv|ajXjyw zvM;5QB3F}?usin0XyfKwmcT2iBtY)#j5G{+HXf3QOM!FTQq|xHUfw_-nTqP8j@z5! z%}iK4 zEp@rIEUW%4rJC_LrPi*K;)=~`L?lSWNs{%AP%Q+5`ONNK)jaDO&tWkPOu6Grf1C-z88!Ge;2!CJ`ok#L8b+_=JI zETgb86m@}iADonm>8zY>zkqnDF6AIk)wul8E14I*?|5XakNTU&`==MGA7y!q)N2r@ z6U`B!X^?lKozll=J*t(!kL|yl$gEmEDU8g8C*;C6=nK)Mz=(VW!dw}IA6Txo;;Ox8 zz4On?j5l007q;aBesCFV;Qo2keUY2{lOhI)lJ>CT4Q{ z?K}mj`+Y{059j>FrncdtSlM^c*aJ9rAm zISoYJmQ1>Vzg&lnRWC7Zcux|%ggA&_=<4NMOH#T0(o4bzd7w?$VW&5M#Vq`w7On6K zb)K{bim(x!zmmvs~w?Uks=heiG$ z7*Uku51%MX`L^iNdIo~E>bHp*&}++O@QRFu1>W+>dcdZ3tIyP7u$ee0P33q4nn<0M zL#c2AvD6-G!a<8q-mGaMx*yAKSk{5vGFGlC=!!hYpIoO3JE-O|NPm9?(Rv8eS{EB% zEkp!h!63j_Vv4s)oyNrU8~}OA#KTP$QR;cSU#-g6Oho8UATx8fdjfBk0gT&g3 zcjP?9oNf65fhlyuG_q$9C)DH7>i0}E>9j1D9s;#(1&C<@kcA=i~o-1{Z z*kQwQ#$1}zdkzZ;ovnx~RL7AauoaWj(ji@HZ$3YkH&$3o6g-|BErwzxDbpitU)@7j zm=e`w)d;h9W2?Y6k{i|BSxt4zL_Vx*zRxzFGiCcT_oOl}fo)M{Bi0iR zQ#sozN3YK5@v=2NVQ%W5VXS!z(v1xaK7OF)RAFeCD!eJq}u9a%q_igH7HB{!rLOHmGg@p^*DJ&Em-;ioT7Nf+6=J z{l3(PPo_{r<_xs=h=?{(iVJa$4g7Hlha;1TzT4*piCUNOXAwW=tFyJ$8rGw1TWbV$ zjNmU_T)xhr!;W)3<7`Yr*C)@}42C(9T}H#l5+NxDn7N(K+Rh&-1^JyRvstk;N-Wn* zbQrrI;-gNchYZGI;NgKj0}~0xKulekcx=E$lQE_|TV+TNjhz)VH=gD7XUa!sIBep5 zXHWJ-H*I}+HPKQBNf-><9bJmmtOzOr!#4$_1{0Kvs+Jiz4=>J?mNWN~BbOG)vfJy# zOxbV2thKr`9Lt;XfJY%4Yo$NxcJ~7Os!_c5H>?C&4Y^uJv@7E?Cpeq?FUy@3V&-)j z=g_b4YJd?h20DU6p2!MwYMVe@2znuhs9;=!@5c?!-aZEOtrYa zazFuPt>xGLw z5_X8_K5p`cnQX9g-V~8FTX=8bqAfVMl1?Oozlt;&fxk!55npBh_N_xHNQb3+hn-uJjI!1oj6D~od`&d6Vd+vn`_;9`18hQ#n220aX&peowKL*3SIvD|6<8TS@ zesCDquAi~Of(em?m2kBO+)lR^)D`I}5e7G51UG3v!!}@SA#g!XFR%#ri9^lGoYb-)l{Wzb2;`3IxV0NZA$z8g* zCga2gr;JXQjPi~|CwKWyL1hiGqguS~^^vO=S9?PwQN)$26?_nPOHY-uEbd7^tQFs> zzbja`#T{-bN<7@4_J-`IIt8?5_r=J_m3;eNoPpl?UfH}6*92es(JxqZ+fR)2#y*H6 z2L9bDPnu=ef>sYEEv5WG_*j+;&2QPUKTj*{?BRihUbr*IJuE~j%fG%mKxFoW2V7}| zbjtb+co~l?Q>y|wC-BrCM=(rZB**=I*W+mw@-IT=57DFlnv7XEjlDC5FgW>dv=H zkI96-RLX3L;6Xi*E00?|F|Mg181NQJc}H}Y=h$XAyv%ENjqra~L^>y&9c5ZcWOL?P z&l8+8k5av&Ikl-6PWy+m^Am-n9%FKvd^%#gF_)%3Fu~%%(6E*q$@1`8p2EO z<_lxq1W|ul1ZG9wWQ=S&bL}~}_(!WJ$pkhR@;vYhEVz5&ikOTU9JMAclfA;?_x`-T zF6w6Pei^`*_J&GM_d)dooHK1-SMAsCzl)k#_tt^V8u2OR+R|kAs015WHSun4#3%_D61?IYsY~Ps`K9XZL-d z4aryM)gO{9#e8;sr&W3Ofb5Sz%QFNl9GP@ArRyen-ZzqGMLKx)*j9hRr>jsEF<8H7 z`sX#ZkzqkAYA*NeZ5*&OWy@o zD6GmrTADcn5|M%SILHVVRd8;+$Ywt{WZ)0J{;?^%h^1W1jn^6%l+}lm4M4xhbKqW&`<99E^b~HaV(&t){0wuymT+vF$?|?C@@#*9#4}Vqmsy za;(SV9{_+vuM0o(c@talh+zatdise_l`0IPr;7w^zYsGWApN66e$|8PApnRHF%&Y} zFDWi(oSJ6%5|!*tun*I8cyIKxKJRLmYP+l6Vl?H6Fj%zoQ2$ENgD*wVv{2b`IP;U9 z$)J33GUM{?k*fsZFqKr11v`$wH@i6{z=KIRoPBl|_8Ro1M%-O(S5^>5&jM@N_C-iH~ zNH{48Q^1K;ns2L2Qo%1Lk%KsV{ZZ0^;y$}`I$H{Y-#2{-nkUpITZKGA^XHi2T!vpq z`FJVwQug<<|FcnXvB=h)WwO0Bnq}>r5w7ob1a^iP>*Yw`6HXTX_ zsDrS-ZYUr1J<&*MAK7KjQOg`nqYMa0f+{MBog1@-Oe#Me={I>nbE0)x%BRSAKzVF4_fj z=|4@`htTZI05fb>dpaHr49c7H`@81R9B$3WROfxW8nB{{7?XhI*+V6{hF`Zfx0cr0 z;~%LRx%)DyIBWTS+#Z(zIS8Wj;5k}#gOtjG{aCV z@w-(Zb1K^L5(1!y^B)WIw_0}8sd^v^$$U?NC%~DuLXt9R6qG$*IE-1vzhNY@=JliYGN6_1VEU%! z%(Y#JLFTrIq$j5FDT+C$V*Cfuod$k1W5f3NMToYyK$M@D*C`s_c4Rsf((=W#V4&8zZjtUlF4m6>_yB8s)8O6PrEzXGuAT%0*r zRW1dKLFt>{v{#eKPPK0-QQ)hJ@|3x}2ER`azIn`@Y&8Wb(-M?YL#+0i8OwoyA7+M# z3Ho_piyq;$->ON&4?9BFOhS+LY#ApymMKVaGK{Jl{QA@ddcDA}Ys+=O;cY(ht^z1~yKJM_wk8a&o_ zDfn#i#+!?t<5EqfF(e~q+=O*#_JLI9Uo^m*y0S9^s%bqDMVO4O*AsHOd>wB#n$(*Z zH$G)K$s(;ekh~7g{=Q_%8|4h)DH0h}v}p z@HKb|JGXll^2=G>1o6B@Sg2LlIM!WC`4RzaWF#^6T3D}@EjeR01^)GSM9p?%c5yT$ zmUAJu%lb;$)}K8?1@j+=pAMb2BB z+?NoZ!l@|Iq+h4iHwaar&d2+4Jc&@tcdLK)Qx3ACs0zxW9|Zp`tf=6lheUT2Pb zrXQc)t5*e05m*r!=`JAC$f#Gg0i}brvLE4<=W!j>O7ZKx;#DK&lj#*g1|VyMW;1D0 zBf9V^aSbBF=NkdUI^Wm~^w+3LhH|B!-?oV3@(0-FP|quh4pDyuo@JnrTb{6KAO$z8$uC3`(Jx1tHlR;SMPUrZ-}_6MlXd)8vjeYBmw z_{l4S{qTTPA*p!Q5~2DmQST1~%X&!j%}_46Bw$gXE>XHenJ&4h`jGM`3{j^`1P0J+ zpnz{#<`?TYxUo=2@wB+bTV!ZvaDhlf0W9la+d@F0{DqY;eS(0%Pc7*cnhmrpM;VCx zlg0xIKp!xr;jexTlz<>xs%@PL{5(4L1zghey;Zo#>Ff6b7l#X8u6m|E#QIuBN=f@QhLU!i#6) zGG-It8|M+1goS!e_GEOv6Nf<)+(UCI>L<{Wnt*nQUO$QyuI6>{C zDiuq4a@!n%v3|Kp>0acD<`XmG<+2M{-{fi8selzcLpJT6RLG@SW1fI8!9+9yjEuYk z$aRLXs=nLvs!~g-G@*K$_{=tam53dUEnX#RJ!I@8Ag2Z6Cji^H8s1AKIgA94IU!N?70jY)9r;XdVYS` z{qUjM_uNMTzUNovM_0`ek;>GhESivVXu#)Si{7M%G$A@07aCS+K^uF6-&pehcmO;^ z``eXI?i&IUumjJR#{&bm@H&4n5T*LTj-rJqqUahJ)(K*lZB*;qE{*iswNC;<#P6 zln7l8006YKZV6S?)?=4)Q99PeOr6m`FkW-~^*Y>QX9TXqE0u;8J$nVoBAeR$iZW@?ix?BeEFeI^DvB0oA^!W=eb z123c(Sj}(J&c9lEcAa1#@>$0II|VG37@u{w+4ia?tDPHz5nJY7-xR?LcLA^UU<|WW z-e|s}yWp;B*qw2q$G6^dbcp#f5rstDBr@He@)sVWv(3NuZzSkgm8k}FfG7l9P=%)ehwZpp zs!0A^oF`!fVoY9cslWKq4rGdp6S#u4kaw8N&2z`2_zRC7*W22$&#Ig)H2de|=%uwd zd1F6zumi+mDb2Io)aQV*58Q71#zRLE{&9+D8+|~G65s-x=E3B;+WUA5PAxr6s*^*X zK@ymelstQsIja(Q^*=EXe!FuARB4hhGq^}m1fN)kM=D>T{DF`Irvh#2>~eZRC7yK! zRQci{`TpVPOLP(XDJ=J^h|sVXa!?&3aI1DEaI4FN8vNPXT1o-IEwi^(D+7XSE&(_U zyZXs=UQaJu_YZ`?vd~k$B7Vo7dJhgxCN&Mq`=+b|zCq&A+MVgTZ*B3t{HL0miADy0 z6CDkR&^bvNsKfb>ZX;uX@&EgVwoF6Qx<0Y}+$srs->Ym7E^&#e7PB+f9m&4P(N1*d zbicHoLrKC#5{X@LNO~Q@;}G9f|LWb8Pw`&l1N#>%qX0WveNuy@q3}>7Ijxx^)y4Ad z+S<%rSEsJ=Bp(i^>Pn^zZ5f11wOE~rPA8qJDY;C`U*AaQ@COCh8>#<6Y~Kva8-RG~ z_~UUG;Te`4uJom91HZL#W!`Ys|F)1zbtx8duqE}oRXh(L6c7f4L9Y}3vwO5NAv%I~ zA;frG8dSdjsV;u+R{PE#B&~UR%gmn8v!O1-0bV$6GHX!#FKW=sgO}DbDN%YtytE64 zoImX6I~)uMPgAXA6*sU<=UCVQZ*r230}jeYDgs94hqrgIiUX-`gLIMRuFz2oc7K)1 z+o?O|Q+U1+FzuJo_=w_EecbA%i4;8GvvG*?|809-@(%c%F%Jv)wndTNIr`2;7W~kv zObXFQ>&*)>gLmbXm!N#C>7NaG(S|Z6h=pL?3&nj4nkTX;JRPr*g6bF_@4pk!u+bG` zz2IaM1CeB8D|qu|B-~*4wFh?v9UfsC#s-^l=Gtb@Io~i&3Um7waeh&oXOsn7+9%VB zrYAC+eHd558y1N|JtjG6mFAW5wHY0NkiLp`oT6XKZF#0L=#~*_W$5Qi+S8l(F%^6K zOF^i#r3%=<;I$;~Bxcca0FYl?39PnW)bQ<5qnRpn+mNVo6{x0oYr(i*8epaIIgwX@>zsd$cxm?2=DM^yR6Y)1et=Z zgf(h*-GF6yr52u&0h!qkFo=d~;C}!Nz>m#@cQrFN5##`ITiYK&#QaJJg2TB-39$1>k9vRJlcY~IJ2&!#byW}w$%A3^FyO;TE`7@@jc zY~LrF{+2M9Qp3%Cy=h7QWO`_|v-vc56(wkX$j)I+@wBGM3V5TfeN2#$ zub)R>$uFEhoEYV=J}Ladz~6nskd>UZm-FVL`Ne;4r0sMx?arFZ?PB+fX2CQ~Z7w4N zu(8$8V$pWg^1L>4w|6ZgO>f*|110$4M4)i|ur^o*Fu*qMt?i#-n;+3r8d+|q`vVp# zD!o_!5{)gAq+cKyi=K`?J_^=m^(BW_+*KTDGBoLtVeKy*Jg@mCZRrSC=$G{1TPpg< z1joJ!ja7cA7MGC&{gnZcBF5S4!81zj6;&_J_Gr*5crAO(@>rQ5^k9vt-I25d)Npl2 zN%77SUc9xFgoenACI3QYP9g|G7CM=om_ybf4bv<-Q7 zw$pG9pk+D*2$`BLp&E2`B!qSRgnOcVG$(xJ+0DX1T$(6xpkCWK*w>v<>~Zl9pOqK~ z;DiX=1l^`$WANxjLu0Ghv%|P*Us`uZ4fQS`S4SLJhZ8vr>r0#Ki3i8<=iOB1-MVj9fg;J$064_Dv@Lfu zS-%u1PkUf@ZfWIf(c-)ml0E970@yod(VpjT4RDwpAIE&~qpj}_{gl(->ex?zr4w<4 z6vV`%MR8QQ$R~@2@|xtuHiMD*dLBC`CNkfp78dfG$u<7Rr;^==vsR>0F48NLwV^m< gQtQMs@#y7Uv!)>Zi#8(%8Nfd#=gbT%^c^Gr7wlBUUjP6A literal 0 HcmV?d00001 diff --git a/flytectl/docs/source/get.rst b/flytectl/docs/source/get.rst new file mode 100644 index 0000000000..3fbaf86d4c --- /dev/null +++ b/flytectl/docs/source/get.rst @@ -0,0 +1,3 @@ +######################### +Get - Retrieve Entities +######################### diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst new file mode 100644 index 0000000000..2863700592 --- /dev/null +++ b/flytectl/docs/source/index.rst @@ -0,0 +1,76 @@ +.. flytectl doc + +########################################## +Welcome to ``Flytectl``'s documentation! +########################################## + + +Installation +============= +Flytectl is a Golang binary and can be installed on any platform supported by +golang. To install simply copy paste the following into the command-line + +.. prompt:: bash + + curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash + + +Configuration +============== +Flytectl allows configuring using a YAML file or pass every configuration value +on command-line. The follow configuration is useful to setup. + +Basic Configuration +-------------------- + +.. code-block:: yaml + + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:///flyte.lyft.net + # Change insecure flag to ensure that you use the right setting for your environment + insecure: true + # Logger settings to control logger output. Useful to debug + #logger: + #show-source: true + #level: 1 + + + +.. toctree:: + :maxdepth: 1 + :caption: Flyte Core docs + + Flyte Documentation + +.. toctree:: + :maxdepth: 2 + :caption: Flytectl docs - Entities + + tasks + workflow + launchplan + + +.. toctree:: + :maxdepth: 2 + :caption: Flytectl verbs + + get + update + delete + register + +.. toctree:: + :maxdepth: 2 + :caption: Contribute + + contribute + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/flytectl/docs/source/launchplan.rst b/flytectl/docs/source/launchplan.rst new file mode 100644 index 0000000000..399976e6a9 --- /dev/null +++ b/flytectl/docs/source/launchplan.rst @@ -0,0 +1,3 @@ +################################# +Interacting with LaunchPlans +################################# diff --git a/flytectl/docs/source/register.rst b/flytectl/docs/source/register.rst new file mode 100644 index 0000000000..3fbaf86d4c --- /dev/null +++ b/flytectl/docs/source/register.rst @@ -0,0 +1,3 @@ +######################### +Get - Retrieve Entities +######################### diff --git a/flytectl/docs/source/tasks.rst b/flytectl/docs/source/tasks.rst new file mode 100644 index 0000000000..a5df10ff75 --- /dev/null +++ b/flytectl/docs/source/tasks.rst @@ -0,0 +1,4 @@ +####################### +Interacting with Tasks +####################### + diff --git a/flytectl/docs/source/update.rst b/flytectl/docs/source/update.rst new file mode 100644 index 0000000000..3fbaf86d4c --- /dev/null +++ b/flytectl/docs/source/update.rst @@ -0,0 +1,3 @@ +######################### +Get - Retrieve Entities +######################### diff --git a/flytectl/docs/source/workflow.rst b/flytectl/docs/source/workflow.rst new file mode 100644 index 0000000000..c75064ce2b --- /dev/null +++ b/flytectl/docs/source/workflow.rst @@ -0,0 +1,4 @@ +############################ +Interacting with Workflows +########################### + From 460920a6cd326b3c3e6d110d2086f200c4592683 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Mon, 8 Feb 2021 15:12:37 -0800 Subject: [PATCH 019/645] flytectl docs (#28) --- flytectl/README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/flytectl/README.md b/flytectl/README.md index 617827a591..a85eecb3ab 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -1,9 +1,28 @@ # flytectl -Install Flyte CLI + +[![Docs](https://readthedocs.org/projects/flytectl/badge/?version=latest&style=plastic)](https://flytectl.rtfd.io) +[![Current Release](https://img.shields.io/github/release/flyteorg/flytectl.svg)](https://github.com/flyteorg/flytectl/releases/latest) +![Master](https://github.com/flyteorg/flytectl/workflows/Master/badge.svg) +[![GoDoc](https://godoc.org/github.com/lyft/flytectl?status.svg)](https://pkg.go.dev/mod/github.com/lyft/flytectl) +[![License](https://img.shields.io/badge/LICENSE-Apache2.0-ff69b4.svg)](http://www.apache.org/licenses/LICENSE-2.0.html) +[![CodeCoverage](https://img.shields.io/codecov/c/github/flyteorg/flytectl.svg)](https://codecov.io/gh/flyteorg/flytectl) +[![Go Report Card](https://goreportcard.com/badge/github.com/lyft/flytectl)](https://goreportcard.com/report/github.com/lyft/flytectl) +![Commit activity](https://img.shields.io/github/commit-activity/w/lyft/flytectl.svg?style=plastic) +![Commit since last release](https://img.shields.io/github/commits-since/lyft/flytectl/latest.svg?style=plastic) + +Flytectl is designed to be a portable, lightweight, CLI for working with Flyte. It is written in Golang and can access FlyteAdmin + +## Docs + +Docs are generated using Sphinx and are available at [flytectl.rtfd.io](https://flytectl.rtfd.io) + +## Installation ```bash curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash ``` +## Contributing + [Contribution guidelines for this project](docs/CONTRIBUTING.md) From 3fb50804feb3b6e8011bd3412ff5a3361ba4a2f1 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Thu, 11 Feb 2021 22:19:25 +0530 Subject: [PATCH 020/645] Autodoc generation for cobra commands (#29) --- flytectl/README.md | 3 + flytectl/cmd/core/cmd.go | 5 +- flytectl/cmd/get/execution.go | 35 ++++++ flytectl/cmd/get/get.go | 30 ++++- flytectl/cmd/get/launch_plan.go | 36 ++++++ flytectl/cmd/get/project.go | 35 ++++++ flytectl/cmd/get/task.go | 35 ++++++ flytectl/cmd/get/workflow.go | 35 ++++++ flytectl/cmd/register/files.go | 36 ++++++ flytectl/cmd/register/register.go | 21 +++- flytectl/cmd/root.go | 30 ++++- flytectl/cmd/update/project.go | 48 ++++++++ flytectl/cmd/update/update.go | 25 +++- flytectl/docs/Makefile | 12 ++ flytectl/docs/source/delete.rst | 3 - flytectl/docs/source/gen/flytectl.rst | 57 +++++++++ flytectl/docs/source/gen/flytectl_config.rst | 61 ++++++++++ .../source/gen/flytectl_config_discover.rst | 63 ++++++++++ .../source/gen/flytectl_config_validate.rst | 65 +++++++++++ flytectl/docs/source/gen/flytectl_get.rst | 67 +++++++++++ .../source/gen/flytectl_get_execution.rst | 91 +++++++++++++++ .../source/gen/flytectl_get_launchplan.rst | 91 +++++++++++++++ .../docs/source/gen/flytectl_get_project.rst | 91 +++++++++++++++ .../docs/source/gen/flytectl_get_task.rst | 91 +++++++++++++++ .../docs/source/gen/flytectl_get_workflow.rst | 91 +++++++++++++++ .../docs/source/gen/flytectl_register.rst | 63 ++++++++++ .../source/gen/flytectl_register_files.rst | 94 +++++++++++++++ flytectl/docs/source/gen/flytectl_update.rst | 67 +++++++++++ .../source/gen/flytectl_update_project.rst | 108 ++++++++++++++++++ flytectl/docs/source/gen/flytectl_version.rst | 61 ++++++++++ flytectl/docs/source/generate_docs.go | 10 ++ flytectl/docs/source/get.rst | 3 - flytectl/docs/source/index.rst | 31 +++-- flytectl/docs/source/launchplan.rst | 3 - flytectl/docs/source/register.rst | 3 - flytectl/docs/source/tasks.rst | 4 - flytectl/docs/source/update.rst | 3 - flytectl/docs/source/workflow.rst | 4 - flytectl/go.sum | 2 + 39 files changed, 1558 insertions(+), 55 deletions(-) delete mode 100644 flytectl/docs/source/delete.rst create mode 100644 flytectl/docs/source/gen/flytectl.rst create mode 100644 flytectl/docs/source/gen/flytectl_config.rst create mode 100644 flytectl/docs/source/gen/flytectl_config_discover.rst create mode 100644 flytectl/docs/source/gen/flytectl_config_validate.rst create mode 100644 flytectl/docs/source/gen/flytectl_get.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_execution.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_launchplan.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_project.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_task.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_workflow.rst create mode 100644 flytectl/docs/source/gen/flytectl_register.rst create mode 100644 flytectl/docs/source/gen/flytectl_register_files.rst create mode 100644 flytectl/docs/source/gen/flytectl_update.rst create mode 100644 flytectl/docs/source/gen/flytectl_update_project.rst create mode 100644 flytectl/docs/source/gen/flytectl_version.rst create mode 100644 flytectl/docs/source/generate_docs.go delete mode 100644 flytectl/docs/source/get.rst delete mode 100644 flytectl/docs/source/launchplan.rst delete mode 100644 flytectl/docs/source/register.rst delete mode 100644 flytectl/docs/source/tasks.rst delete mode 100644 flytectl/docs/source/update.rst delete mode 100644 flytectl/docs/source/workflow.rst diff --git a/flytectl/README.md b/flytectl/README.md index a85eecb3ab..fd022104df 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -15,6 +15,8 @@ Flytectl is designed to be a portable, lightweight, CLI for working with Flyte. ## Docs Docs are generated using Sphinx and are available at [flytectl.rtfd.io](https://flytectl.rtfd.io) +Generating docs locally can be accomplished by running make gendocs from within the docs folder + ## Installation @@ -26,3 +28,4 @@ curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash [Contribution guidelines for this project](docs/CONTRIBUTING.md) + diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 8e2463aad2..c625fd2072 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -19,6 +19,8 @@ type CommandEntry struct { ProjectDomainNotRequired bool CmdFunc CommandFunc Aliases []string + Short string + Long string PFlagProvider PFlagProvider } @@ -26,7 +28,8 @@ func AddCommands(rootCmd *cobra.Command, cmdFuncs map[string]CommandEntry) { for resource, cmdEntry := range cmdFuncs { cmd := &cobra.Command{ Use: resource, - Short: fmt.Sprintf("Retrieves %v resources.", resource), + Short: cmdEntry.Short, + Long: cmdEntry.Long, Aliases: cmdEntry.Aliases, RunE: generateCommandFunc(cmdEntry), } diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index b0a51deade..4491ef03dc 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -13,6 +13,41 @@ import ( "github.com/lyft/flytectl/pkg/printer" ) +const( + executionShort = "Gets execution resources" + executionLong = ` +Retrieves all the executions within project and domain.(execution,executions can be used interchangeably in these commands) +:: + + bin/flytectl get execution -p flytesnacks -d development + +Retrieves execution by name within project and domain. + +:: + + bin/flytectl execution -p flytesnacks -d development oeh94k9r2r + +Retrieves execution by filters +:: + + Not yet implemented + +Retrieves all the execution within project and domain in yaml format + +:: + + bin/flytectl get execution -p flytesnacks -d development -o yaml + +Retrieves all the execution within project and domain in json format. + +:: + + bin/flytectl get execution -p flytesnacks -d development -o json + +Usage +` +) + var executionColumns = []printer.Column{ {"Name", "$.id.name"}, {"Workflow Name", "$.closure.workflowId.name"}, diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index ed86e5d0d0..c19a593280 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -6,19 +6,37 @@ import ( "github.com/spf13/cobra" ) +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + getCmdShort = `Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project.` + getCmdLong = ` +Example get projects. +:: + + bin/flytectl get project +` +) + // CreateGetCommand will return get command func CreateGetCommand() *cobra.Command { getCmd := &cobra.Command{ Use: "get", - Short: "Retrieve various resource.", + Short: getCmdShort, + Long: getCmdLong, } getResourcesFuncs := map[string]cmdcore.CommandEntry{ - "project": {CmdFunc: getProjectsFunc, Aliases: []string{"projects"}, ProjectDomainNotRequired: true}, - "task": {CmdFunc: getTaskFunc, Aliases: []string{"tasks"}}, - "workflow": {CmdFunc: getWorkflowFunc, Aliases: []string{"workflows"}}, - "launchplan": {CmdFunc: getLaunchPlanFunc, Aliases: []string{"launchplans"}}, - "execution": {CmdFunc: getExecutionFunc, Aliases: []string{"executions"}}, + "project": {CmdFunc: getProjectsFunc, Aliases: []string{"projects"}, ProjectDomainNotRequired: true, + Short: projectShort, + Long: projectLong}, + "task": {CmdFunc: getTaskFunc, Aliases: []string{"tasks"}, Short: taskShort, + Long: taskLong}, + "workflow": {CmdFunc: getWorkflowFunc, Aliases: []string{"workflows"}, Short: workflowShort, + Long: workflowLong}, + "launchplan": {CmdFunc: getLaunchPlanFunc, Aliases: []string{"launchplans"}, Short: launchPlanShort, + Long: launchPlanLong}, + "execution": {CmdFunc: getExecutionFunc, Aliases: []string{"executions"}, Short: executionShort, + Long: executionLong}, } cmdcore.AddCommands(getCmd, getResourcesFuncs) diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 0f31e5106b..ff8e1ce912 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -11,6 +11,42 @@ import ( "github.com/lyft/flytestdlib/logger" ) +const( + + launchPlanShort = "Gets launch plan resources" + launchPlanLong = ` +Retrieves all the launch plans within project and domain.(launchplan,launchplans can be used interchangeably in these commands) +:: + + bin/flytectl get launchplan -p flytesnacks -d development + +Retrieves launch plan by name within project and domain. + +:: + + bin/flytectl launchplan -p flytesnacks -d development recipes.core.basic.lp.my_wf + +Retrieves launchplan by filters. +:: + + Not yet implemented + +Retrieves all the launchplan within project and domain in yaml format. + +:: + + bin/flytectl get launchplan -p flytesnacks -d development -o yaml + +Retrieves all the launchplan within project and domain in json format + +:: + + bin/flytectl get launchplan -p flytesnacks -d development -o json + +Usage +` +) + var launchplanColumns = []printer.Column{ {"Version", "$.id.version"}, {"Name", "$.id.name"}, diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 93c3395d8e..6b68011ea3 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -12,6 +12,41 @@ import ( "github.com/lyft/flytectl/pkg/printer" ) +const( +projectShort = "Gets project resources" +projectLong = ` +Retrieves all the projects.(project,projects can be used interchangeably in these commands) +:: + + bin/flytectl get project + +Retrieves project by name + +:: + + bin/flytectl get project flytesnacks + +Retrieves project by filters +:: + + Not yet implemented + +Retrieves all the projects in yaml format + +:: + + bin/flytectl get project -o yaml + +Retrieves all the projects in json format + +:: + + bin/flytectl get project -o json + +Usage +` +) + var projectColumns = []printer.Column{ {"ID", "$.id"}, {"Name", "$.name"}, diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index a29d690660..ddc28fb0b9 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -14,6 +14,41 @@ import ( "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" ) +const( + taskShort = "Gets task resources" + taskLong = ` +Retrieves all the task within project and domain.(task,tasks can be used interchangeably in these commands) +:: + + bin/flytectl get task -p flytesnacks -d development + +Retrieves task by name within project and domain. + +:: + + bin/flytectl task -p flytesnacks -d development square + +Retrieves project by filters. +:: + + Not yet implemented + +Retrieves all the tasks within project and domain in yaml format. + +:: + + bin/flytectl get task -p flytesnacks -d development -o yaml + +Retrieves all the tasks within project and domain in json format. + +:: + + bin/flytectl get task -p flytesnacks -d development -o json + +Usage +` +) + var taskColumns = []printer.Column{ {"Version", "$.id.version"}, {"Name", "$.id.name"}, diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 71b08f4c7b..d6a8d9172b 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -13,6 +13,41 @@ import ( "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" ) +const( + workflowShort = "Gets workflow resources" + workflowLong = ` +Retrieves all the workflows within project and domain.(workflow,workflows can be used interchangeably in these commands) +:: + + bin/flytectl get workflow -p flytesnacks -d development + +Retrieves workflow by name within project and domain. + +:: + + bin/flytectl workflow -p flytesnacks -d development recipes.plugins.k8s_spark.pyspark_pi.my_spark + +Retrieves workflow by filters. +:: + + Not yet implemented + +Retrieves all the workflow within project and domain in yaml format. + +:: + + bin/flytectl get workflow -p flytesnacks -d development -o yaml + +Retrieves all the workflow within project and domain in json format. + +:: + + bin/flytectl get workflow -p flytesnacks -d development -o json + +Usage +` +) + var workflowColumns = []printer.Column{ {"Version", "$.id.version"}, {"Name", "$.id.name"}, diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index 4787a69b27..821f034cd8 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -11,6 +11,42 @@ import ( "sort" ) +const( + registerFilesShort = "Registers file resources" + registerFilesLong = ` +Registers all the serialized protobuf files including tasks, workflows and launchplans with default v1 version. +If there are already registered entities with v1 version then the command will fail immediately on the first such encounter. +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks + +If you want to continue executing registration on other files ignoring the errors including version conflicts then pass in +the skipOnError flag. + +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks --skipOnError + +Using short format of skipOnError flag +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -s + +Overriding the default version v1 using version string. +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 + +Change the o/p format has not effect on registration. The O/p is currently available only in table format. + +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -s -o yaml + +Usage +` +) + func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { files := args sort.Strings(files) diff --git a/flytectl/cmd/register/register.go b/flytectl/cmd/register/register.go index f6381521e4..62263a3387 100644 --- a/flytectl/cmd/register/register.go +++ b/flytectl/cmd/register/register.go @@ -5,18 +5,27 @@ import ( "github.com/spf13/cobra" ) +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + registerCmdShort = "Registers tasks/workflows/launchplans from list of generated serialized files." + registercmdLong = ` +Takes input files as serialized versions of the tasks/workflows/launchplans and registers them with flyteadmin. +Currently these input files are protobuf files generated as output from flytekit serialize. +Project & Domain are mandatory fields to be passed for registration and an optional version which defaults to v1 +If the entities are already registered with flyte for the same version then registration would fail. +` +) + // RegisterCommand will return register command func RegisterCommand() *cobra.Command { registerCmd := &cobra.Command{ Use: "register", - Short: "Registers tasks/workflows/launchplans from list of generated serialized files.", - Long: "Takes input files as serialized versions of the tasks/workflows/launchplans and registers them with flyteadmin.\n" + - "Currently these input files are protobuf files generated as output from flytekit serialize.\n" + - "Project & Domain are mandatory fields to be passed for registration and an optional version which defaults to v1\n" + - "If the entities are already registered with flyte for the same version then registration would fail.\n", + Short: registerCmdShort, + Long: registercmdLong, } registerResourcesFuncs := map[string]cmdcore.CommandEntry{ - "files": {CmdFunc: registerFromFilesFunc, Aliases: []string{"file"}, PFlagProvider: filesConfig}, + "files": {CmdFunc: registerFromFilesFunc, Aliases: []string{"file"}, PFlagProvider: filesConfig, Short: registerFilesShort, + Long: registerFilesLong}, } cmdcore.AddCommands(registerCmd, registerResourcesFuncs) return registerCmd diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 7dca669327..c92fb30d56 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -3,15 +3,15 @@ package cmd import ( "context" "fmt" - "github.com/lyft/flytectl/cmd/update" - "github.com/lyft/flytectl/cmd/register" - "github.com/lyft/flytectl/cmd/get" + "github.com/lyft/flytectl/cmd/register" + "github.com/lyft/flytectl/cmd/update" "github.com/lyft/flytectl/pkg/printer" - stdConfig "github.com/lyft/flytestdlib/config" "github.com/lyft/flytestdlib/config/viper" + "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" "github.com/lyft/flytectl/cmd/config" ) @@ -24,6 +24,9 @@ var ( func newRootCmd() *cobra.Command { rootCmd := &cobra.Command{ PersistentPreRunE: initConfig, + Long : "flytectl is CLI tool written in go to interact with flyteadmin service", + Short: "flyetcl CLI tool", + Use : "flytectl", } rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", @@ -60,6 +63,25 @@ func initConfig(_ *cobra.Command, _ []string) error { return nil } +func GenerateDocs() error { + rootCmd := newRootCmd() + err := GenReSTTree(rootCmd, "gen") + if err != nil { + logrus.Fatal(err) + return err + } + return nil +} + +func GenReSTTree(cmd *cobra.Command, dir string) error { + emptyStr := func(s string) string { return "" } + // Sphinx cross-referencing format + linkHandler := func(name, ref string) string { + return fmt.Sprintf(":doc:`%s`", ref) + } + return doc.GenReSTTreeCustom(cmd, dir, emptyStr, linkHandler) +} + func ExecuteCmd() error { return newRootCmd().Execute() } diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index b00d91bf59..9ccbb4ee29 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -16,6 +16,54 @@ type ProjectConfig struct { ArchiveProject bool `json:"archiveProject" pflag:",Archives the project specified as argument."` } +const( + projectShort = "Updates project resources" + projectLong = ` +Updates the project according the flags passed.Allows you to archive or activate a project. +Activates project named flytesnacks. +:: + + bin/flytectl update project -p flytesnacks --activateProject + +Archives project named flytesnacks. + +:: + + bin/flytectl get project flytesnacks --archiveProject + +Activates project named flytesnacks using short option -t. +:: + + bin/flytectl update project -p flytesnacks -t + +Archives project named flytesnacks using short option -a. + +:: + + bin/flytectl update project flytesnacks -a + +Incorrect usage when passing both archive and activate. + +:: + + bin/flytectl update project flytesnacks -a -t + +Incorrect usage when passing unknown-project. + +:: + + bin/flytectl update project unknown-project -a + +Incorrect usage when passing valid project using -p option. + +:: + + bin/flytectl update project unknown-project -a -p known-project + +Usage +` +) + var ( projectConfig = &ProjectConfig{} errProjectNotFound = "Project %v not found\n" diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index ac83b69200..791deb5c9d 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -6,15 +6,34 @@ import ( "github.com/spf13/cobra" ) +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + updateUse = "update" + updateShort = ` +Used for updating flyte resources eg: project. +` + updatecmdLong = ` +Currently this command only provides subcommands to update project. +Takes input project which need to be archived or unarchived. Name of the project to be updated is mandatory field. +Example update project to activate it. +:: + + bin/flytectl update project -p flytesnacks --activateProject +` +) + // CreateUpdateCommand will return update command func CreateUpdateCommand() *cobra.Command { updateCmd := &cobra.Command{ - Use: "update", - Short: "Update various resources.", + Use: updateUse, + Short: updateShort, + Long: updatecmdLong, } updateResourcesFuncs := map[string]cmdcore.CommandEntry{ - "project": {CmdFunc: updateProjectsFunc, Aliases: []string{"projects"}, ProjectDomainNotRequired: true, PFlagProvider: projectConfig}, + "project": {CmdFunc: updateProjectsFunc, Aliases: []string{"projects"}, ProjectDomainNotRequired: true, PFlagProvider: projectConfig, + Short: projectShort, + Long: projectLong}, } cmdcore.AddCommands(updateCmd, updateResourcesFuncs) diff --git a/flytectl/docs/Makefile b/flytectl/docs/Makefile index e61723ad76..c43bf3516c 100644 --- a/flytectl/docs/Makefile +++ b/flytectl/docs/Makefile @@ -14,6 +14,18 @@ help: .PHONY: help Makefile +gendocs: + go build -o ../bin/flytectl-docs $(SOURCEDIR)/generate_docs.go + rm -rf $(SOURCEDIR)/gen + mkdir gen + ../bin/flytectl-docs + mv gen $(SOURCEDIR) + make html + +clean: + rm -rf $(SOURCEDIR)/gen + rm -rf build/* + # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile diff --git a/flytectl/docs/source/delete.rst b/flytectl/docs/source/delete.rst deleted file mode 100644 index 3fbaf86d4c..0000000000 --- a/flytectl/docs/source/delete.rst +++ /dev/null @@ -1,3 +0,0 @@ -######################### -Get - Retrieve Entities -######################### diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst new file mode 100644 index 0000000000..ea2cffb934 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl.rst @@ -0,0 +1,57 @@ +.. _flytectl: + +flytectl +-------- + +flyetcl CLI tool + +Synopsis +~~~~~~~~ + + +flytectl is CLI tool written in go to interact with flyteadmin service + +Options +~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -h, --help help for flytectl + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. +* :doc:`flytectl_update` - +Used for updating flyte resources eg: project. + +* :doc:`flytectl_version` - Displays version information for the client and server. + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst new file mode 100644 index 0000000000..7bace0e069 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -0,0 +1,61 @@ +.. _flytectl_config: + +flytectl config +--------------- + +Runs various config commands, look at the help of this command to get a list of available commands.. + +Synopsis +~~~~~~~~ + + +Runs various config commands, look at the help of this command to get a list of available commands.. + +Options +~~~~~~~ + +:: + + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + -h, --help help for config + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_config_discover` - Searches for a config in one of the default search paths. +* :doc:`flytectl_config_validate` - Validates the loaded config. + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst new file mode 100644 index 0000000000..0173329f4e --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -0,0 +1,63 @@ +.. _flytectl_config_discover: + +flytectl config discover +------------------------ + +Searches for a config in one of the default search paths. + +Synopsis +~~~~~~~~ + + +Searches for a config in one of the default search paths. + +:: + + flytectl config discover [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for discover + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst new file mode 100644 index 0000000000..923bb9d794 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -0,0 +1,65 @@ +.. _flytectl_config_validate: + +flytectl config validate +------------------------ + +Validates the loaded config. + +Synopsis +~~~~~~~~ + + +Validates the loaded config. + +:: + + flytectl config validate [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for validate + --strict Validates that all keys in loaded config + map to already registered sections. + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst new file mode 100644 index 0000000000..75ebbba98c --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -0,0 +1,67 @@ +.. _flytectl_get: + +flytectl get +------------ + +Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + +Synopsis +~~~~~~~~ + + + +Example get projects. +:: + + bin/flytectl get project + + +Options +~~~~~~~ + +:: + + -h, --help help for get + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_get_execution` - Gets execution resources +* :doc:`flytectl_get_launchplan` - Gets launch plan resources +* :doc:`flytectl_get_project` - Gets project resources +* :doc:`flytectl_get_task` - Gets task resources +* :doc:`flytectl_get_workflow` - Gets workflow resources + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst new file mode 100644 index 0000000000..450ffacf32 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -0,0 +1,91 @@ +.. _flytectl_get_execution: + +flytectl get execution +---------------------- + +Gets execution resources + +Synopsis +~~~~~~~~ + + + +Retrieves all the executions within project and domain.(execution,executions can be used interchangeably in these commands) +:: + + bin/flytectl get execution -p flytesnacks -d development + +Retrieves execution by name within project and domain. + +:: + + bin/flytectl execution -p flytesnacks -d development oeh94k9r2r + +Retrieves execution by filters +:: + + Not yet implemented + +Retrieves all the execution within project and domain in yaml format + +:: + + bin/flytectl get execution -p flytesnacks -d development -o yaml + +Retrieves all the execution within project and domain in json format. + +:: + + bin/flytectl get execution -p flytesnacks -d development -o json + +Usage + + +:: + + flytectl get execution [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for execution + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst new file mode 100644 index 0000000000..a223801fb7 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -0,0 +1,91 @@ +.. _flytectl_get_launchplan: + +flytectl get launchplan +----------------------- + +Gets launch plan resources + +Synopsis +~~~~~~~~ + + + +Retrieves all the launch plans within project and domain.(launchplan,launchplans can be used interchangeably in these commands) +:: + + bin/flytectl get launchplan -p flytesnacks -d development + +Retrieves launch plan by name within project and domain. + +:: + + bin/flytectl launchplan -p flytesnacks -d development recipes.core.basic.lp.my_wf + +Retrieves launchplan by filters. +:: + + Not yet implemented + +Retrieves all the launchplan within project and domain in yaml format. + +:: + + bin/flytectl get launchplan -p flytesnacks -d development -o yaml + +Retrieves all the launchplan within project and domain in json format + +:: + + bin/flytectl get launchplan -p flytesnacks -d development -o json + +Usage + + +:: + + flytectl get launchplan [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for launchplan + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst new file mode 100644 index 0000000000..1c3d7490bf --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -0,0 +1,91 @@ +.. _flytectl_get_project: + +flytectl get project +-------------------- + +Gets project resources + +Synopsis +~~~~~~~~ + + + +Retrieves all the projects.(project,projects can be used interchangeably in these commands) +:: + + bin/flytectl get project + +Retrieves project by name + +:: + + bin/flytectl get project flytesnacks + +Retrieves project by filters +:: + + Not yet implemented + +Retrieves all the projects in yaml format + +:: + + bin/flytectl get project -o yaml + +Retrieves all the projects in json format + +:: + + bin/flytectl get project -o json + +Usage + + +:: + + flytectl get project [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for project + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst new file mode 100644 index 0000000000..dab9475f2e --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -0,0 +1,91 @@ +.. _flytectl_get_task: + +flytectl get task +----------------- + +Gets task resources + +Synopsis +~~~~~~~~ + + + +Retrieves all the task within project and domain.(task,tasks can be used interchangeably in these commands) +:: + + bin/flytectl get task -p flytesnacks -d development + +Retrieves task by name within project and domain. + +:: + + bin/flytectl task -p flytesnacks -d development square + +Retrieves project by filters. +:: + + Not yet implemented + +Retrieves all the tasks within project and domain in yaml format. + +:: + + bin/flytectl get task -p flytesnacks -d development -o yaml + +Retrieves all the tasks within project and domain in json format. + +:: + + bin/flytectl get task -p flytesnacks -d development -o json + +Usage + + +:: + + flytectl get task [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for task + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst new file mode 100644 index 0000000000..14d2d57fe0 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -0,0 +1,91 @@ +.. _flytectl_get_workflow: + +flytectl get workflow +--------------------- + +Gets workflow resources + +Synopsis +~~~~~~~~ + + + +Retrieves all the workflows within project and domain.(workflow,workflows can be used interchangeably in these commands) +:: + + bin/flytectl get workflow -p flytesnacks -d development + +Retrieves workflow by name within project and domain. + +:: + + bin/flytectl workflow -p flytesnacks -d development recipes.plugins.k8s_spark.pyspark_pi.my_spark + +Retrieves workflow by filters. +:: + + Not yet implemented + +Retrieves all the workflow within project and domain in yaml format. + +:: + + bin/flytectl get workflow -p flytesnacks -d development -o yaml + +Retrieves all the workflow within project and domain in json format. + +:: + + bin/flytectl get workflow -p flytesnacks -d development -o json + +Usage + + +:: + + flytectl get workflow [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for workflow + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst new file mode 100644 index 0000000000..27269b9856 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -0,0 +1,63 @@ +.. _flytectl_register: + +flytectl register +----------------- + +Registers tasks/workflows/launchplans from list of generated serialized files. + +Synopsis +~~~~~~~~ + + + +Takes input files as serialized versions of the tasks/workflows/launchplans and registers them with flyteadmin. +Currently these input files are protobuf files generated as output from flytekit serialize. +Project & Domain are mandatory fields to be passed for registration and an optional version which defaults to v1 +If the entities are already registered with flyte for the same version then registration would fail. + + +Options +~~~~~~~ + +:: + + -h, --help help for register + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_register_files` - Registers file resources + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst new file mode 100644 index 0000000000..1f1b8bb7be --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -0,0 +1,94 @@ +.. _flytectl_register_files: + +flytectl register files +----------------------- + +Registers file resources + +Synopsis +~~~~~~~~ + + + +Registers all the serialized protobuf files including tasks, workflows and launchplans with default v1 version. +If there are already registered entities with v1 version then the command will fail immediately on the first such encounter. +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks + +If you want to continue executing registration on other files ignoring the errors including version conflicts then pass in +the skipOnError flag. + +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks --skipOnError + +Using short format of skipOnError flag +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -s + +Overriding the default version v1 using version string. +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 + +Change the o/p format has not effect on registration. The O/p is currently available only in table format. + +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -s -o yaml + +Usage + + +:: + + flytectl register files [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for files + -s, --skipOnError fail fast when registering files. + -v, --version string version of the entity to be registered with flyte. (default "v1") + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst new file mode 100644 index 0000000000..663e28f992 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -0,0 +1,67 @@ +.. _flytectl_update: + +flytectl update +--------------- + + +Used for updating flyte resources eg: project. + + +Synopsis +~~~~~~~~ + + + +Currently this command only provides subcommands to update project. +Takes input project which need to be archived or unarchived. Name of the project to be updated is mandatory field. +Example update project to activate it. +:: + + bin/flytectl update project -p flytesnacks --activateProject + + +Options +~~~~~~~ + +:: + + -h, --help help for update + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_update_project` - Updates project resources + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst new file mode 100644 index 0000000000..da7bcbb115 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -0,0 +1,108 @@ +.. _flytectl_update_project: + +flytectl update project +----------------------- + +Updates project resources + +Synopsis +~~~~~~~~ + + + +Updates the project according the flags passed.Allows you to archive or activate a project. +Activates project named flytesnacks. +:: + + bin/flytectl update project -p flytesnacks --activateProject + +Archives project named flytesnacks. + +:: + + bin/flytectl get project flytesnacks --archiveProject + +Activates project named flytesnacks using short option -t. +:: + + bin/flytectl update project -p flytesnacks -t + +Archives project named flytesnacks using short option -a. + +:: + + bin/flytectl update project flytesnacks -a + +Incorrect usage when passing both archive and activate. + +:: + + bin/flytectl update project flytesnacks -a -t + +Incorrect usage when passing unknown-project. + +:: + + bin/flytectl update project unknown-project -a + +Incorrect usage when passing valid project using -p option. + +:: + + bin/flytectl update project unknown-project -a -p known-project + +Usage + + +:: + + flytectl update project [flags] + +Options +~~~~~~~ + +:: + + -t, --activateProject Activates the project specified as argument. + -a, --archiveProject Archives the project specified as argument. + -h, --help help for project + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - +Used for updating flyte resources eg: project. + + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst new file mode 100644 index 0000000000..ad0f5f66fa --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -0,0 +1,61 @@ +.. _flytectl_version: + +flytectl version +---------------- + +Displays version information for the client and server. + +Synopsis +~~~~~~~~ + + +Displays version information for the client and server. + +:: + + flytectl version [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for version + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - flyetcl CLI tool + +*Auto generated by spf13/cobra on 11-Feb-2021* diff --git a/flytectl/docs/source/generate_docs.go b/flytectl/docs/source/generate_docs.go new file mode 100644 index 0000000000..458b597c8b --- /dev/null +++ b/flytectl/docs/source/generate_docs.go @@ -0,0 +1,10 @@ +package main + +import "github.com/lyft/flytectl/cmd" + +func main() { + if err := cmd.GenerateDocs(); err != nil { + panic(err) + } +} + diff --git a/flytectl/docs/source/get.rst b/flytectl/docs/source/get.rst deleted file mode 100644 index 3fbaf86d4c..0000000000 --- a/flytectl/docs/source/get.rst +++ /dev/null @@ -1,3 +0,0 @@ -######################### -Get - Retrieve Entities -######################### diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 2863700592..173c1a6759 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -41,25 +41,32 @@ Basic Configuration :maxdepth: 1 :caption: Flyte Core docs - Flyte Documentation + Flyte Documentation + gen/flytectl .. toctree:: :maxdepth: 2 - :caption: Flytectl docs - Entities + :caption: Flytectl verbs - tasks - workflow - launchplan - + gen/flytectl_get + gen/flytectl_update + gen/flytectl_delete + gen/flytectl_register + gen/flytectl_config .. toctree:: :maxdepth: 2 - :caption: Flytectl verbs - - get - update - delete - register + :caption: Flytectl nouns + + gen/flytectl_get_execution + gen/flytectl_get_project + gen/flytectl_get_workflow + gen/flytectl_get_task + gen/flytectl_get_launchplan + gen/flytectl_update_project + gen/flytectl_register_files + gen/flytectl_version + gen/flytectl_config_validate .. toctree:: :maxdepth: 2 diff --git a/flytectl/docs/source/launchplan.rst b/flytectl/docs/source/launchplan.rst deleted file mode 100644 index 399976e6a9..0000000000 --- a/flytectl/docs/source/launchplan.rst +++ /dev/null @@ -1,3 +0,0 @@ -################################# -Interacting with LaunchPlans -################################# diff --git a/flytectl/docs/source/register.rst b/flytectl/docs/source/register.rst deleted file mode 100644 index 3fbaf86d4c..0000000000 --- a/flytectl/docs/source/register.rst +++ /dev/null @@ -1,3 +0,0 @@ -######################### -Get - Retrieve Entities -######################### diff --git a/flytectl/docs/source/tasks.rst b/flytectl/docs/source/tasks.rst deleted file mode 100644 index a5df10ff75..0000000000 --- a/flytectl/docs/source/tasks.rst +++ /dev/null @@ -1,4 +0,0 @@ -####################### -Interacting with Tasks -####################### - diff --git a/flytectl/docs/source/update.rst b/flytectl/docs/source/update.rst deleted file mode 100644 index 3fbaf86d4c..0000000000 --- a/flytectl/docs/source/update.rst +++ /dev/null @@ -1,3 +0,0 @@ -######################### -Get - Retrieve Entities -######################### diff --git a/flytectl/docs/source/workflow.rst b/flytectl/docs/source/workflow.rst deleted file mode 100644 index c75064ce2b..0000000000 --- a/flytectl/docs/source/workflow.rst +++ /dev/null @@ -1,4 +0,0 @@ -############################ -Interacting with Workflows -########################### - diff --git a/flytectl/go.sum b/flytectl/go.sum index b89512e672..2c4b1fcd70 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -66,6 +66,7 @@ github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHo github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -271,6 +272,7 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/uuid v1.2.0/go.mod h1:B8HLsPLik/YNn6KKWVMDJ8nzCL8RP5WyfsnmvnAEwIU= From 4367c0b0a12934ea52eb0152e8b72e340d7cf4d5 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Thu, 11 Feb 2021 12:12:33 -0800 Subject: [PATCH 021/645] Index is too verbose for the docs, fix it (#30) --- flytectl/docs/source/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 173c1a6759..581884254d 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -45,7 +45,7 @@ Basic Configuration gen/flytectl .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Flytectl verbs gen/flytectl_get @@ -55,7 +55,7 @@ Basic Configuration gen/flytectl_config .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Flytectl nouns gen/flytectl_get_execution From 22c203bdd6b7d3037d1ea9db8d30b9a204db34ce Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Mon, 15 Feb 2021 23:02:51 +0530 Subject: [PATCH 022/645] Feature/goreleaser (#27) --- .../.github.com/workflow/pull_request.yaml | 0 .../PULL_REQUEST_TEMPLATE.md | 0 flytectl/.github/workflows/build.yaml | 31 +++++++++ flytectl/.github/workflows/release.yml | 38 +++++++++++ flytectl/.goreleaser.yml | 62 +++-------------- flytectl/README.md | 2 +- .../lyft/golang_support_tools/tools.go | 2 +- flytectl/cmd/core/cmd.go | 1 + flytectl/cmd/core/cmd_ctx.go | 2 +- flytectl/cmd/get/execution.go | 17 ++--- flytectl/cmd/get/execution_test.go | 36 +++++----- flytectl/cmd/get/get.go | 2 +- flytectl/cmd/get/get_test.go | 17 ++--- flytectl/cmd/get/launch_plan.go | 15 ++--- flytectl/cmd/get/named_entity.go | 6 +- flytectl/cmd/get/project.go | 12 ++-- flytectl/cmd/get/task.go | 15 +++-- flytectl/cmd/get/workflow.go | 9 +-- flytectl/cmd/register/files.go | 33 +++++----- ...esconfig_flags.go => filesconfig_flags.go} | 17 ++--- ...lags_test.go => filesconfig_flags_test.go} | 38 +++++------ flytectl/cmd/register/register.go | 4 +- flytectl/cmd/register/register_test.go | 7 +- flytectl/cmd/register/register_util.go | 66 +++++++++++-------- flytectl/cmd/root.go | 9 +-- flytectl/cmd/update/project.go | 6 +- flytectl/cmd/update/project_test.go | 29 ++++---- flytectl/cmd/update/projectconfig_flags.go | 2 +- flytectl/cmd/update/update.go | 4 +- flytectl/cmd/update/update_test.go | 7 +- flytectl/docs/source/generate_docs.go | 1 - flytectl/install.sh | 8 +-- flytectl/pkg/adminutils/iterator.go | 2 +- flytectl/pkg/printer/printer.go | 10 ++- flytectl/pkg/printer/printer_test.go | 3 +- flytectl/pull_request_template.md | 26 -------- 36 files changed, 280 insertions(+), 259 deletions(-) delete mode 100644 flytectl/.github.com/workflow/pull_request.yaml rename flytectl/{.github.com => .github}/PULL_REQUEST_TEMPLATE.md (100%) create mode 100644 flytectl/.github/workflows/build.yaml create mode 100644 flytectl/.github/workflows/release.yml rename flytectl/cmd/register/{registerfilesconfig_flags.go => filesconfig_flags.go} (55%) rename flytectl/cmd/register/{registerfilesconfig_flags_test.go => filesconfig_flags_test.go} (70%) delete mode 100644 flytectl/pull_request_template.md diff --git a/flytectl/.github.com/workflow/pull_request.yaml b/flytectl/.github.com/workflow/pull_request.yaml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/flytectl/.github.com/PULL_REQUEST_TEMPLATE.md b/flytectl/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from flytectl/.github.com/PULL_REQUEST_TEMPLATE.md rename to flytectl/.github/PULL_REQUEST_TEMPLATE.md diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml new file mode 100644 index 0000000000..4b78569361 --- /dev/null +++ b/flytectl/.github/workflows/build.yaml @@ -0,0 +1,31 @@ +name: build + +on: + pull_request: + push: + +jobs: + build: + name: Run tests and lint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Unit Tests + uses: cedrickring/golang-action@1.5.2 + env: + GO111MODULE: "on" + with: + args: make install && make test_unit_codecov + - name: Push CodeCov + uses: codecov/codecov-action@v1 + with: + file: coverage.txt + flags: unittests + fail_ci_if_error: true + - name: Lint + uses: cedrickring/golang-action@1.5.2 + env: + GO111MODULE: "on" + with: + args: make install && make lint \ No newline at end of file diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml new file mode 100644 index 0000000000..7d30bdb666 --- /dev/null +++ b/flytectl/.github/workflows/release.yml @@ -0,0 +1,38 @@ +name: releaser +on: + push: + tags: + - 'v*' + +jobs: + create-release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Unit Tests + uses: cedrickring/golang-action@1.5.2 + env: + GO111MODULE: "on" + with: + args: make install && make test_unit_codecov + - name: Push CodeCov + uses: codecov/codecov-action@v1 + with: + file: coverage.txt + flags: unittests + fail_ci_if_error: true + - name: Lint + uses: cedrickring/golang-action@1.5.2 + env: + GO111MODULE: "on" + with: + args: make install && make lint + + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v2 + with: + version: latest + args: release --rm-dist --debug + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/flytectl/.goreleaser.yml b/flytectl/.goreleaser.yml index 6f8f237da5..18ace3b56b 100644 --- a/flytectl/.goreleaser.yml +++ b/flytectl/.goreleaser.yml @@ -11,7 +11,7 @@ builds: - windows - darwin ldflags: - - -s -w -X github.com/lyft/flytestdlib/version.Version={{.Version}} -X github.com/lyft/flytestdlib/version.Build={{.ShortCommit}} -X github.com/lyft/flytestdlib/version.BuildTime={{.Date}} + - -s -w -X github.com/flyteorg/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flytestdlib/version.BuildTime={{.Date}} archives: - replacements: darwin: macOS @@ -38,7 +38,7 @@ scoop: # Repository to push the app manifest to. bucket: - owner: lyft + owner: flyteorg name: flytectl # Git author used to commit to the repository. @@ -49,7 +49,7 @@ scoop: # Your app's homepage. # Default is empty. - homepage: "https://godoc.org/github.com/lyft/flytectl" + homepage: "https://godoc.org/github.com/flyteorg/flytectl" # Your app's description. # Default is empty. @@ -61,19 +61,12 @@ scoop: # Persist data between application updates persist: - - "data" - "config.toml" brews: - # Name template of the recipe # Default to project name name: flytectl - # IDs of the archives to use. - # Defaults to all. - # ids: - # - foo - # - bar - # GOARM to specify which 32-bit arm version to use if there are multiple versions # from the build section. Brew formulas support atm only one 32-bit version. # Default is 6 for all artifacts or each id if there a multiple versions. @@ -83,21 +76,14 @@ brews: # same kind. We will probably unify this in the next major version like it is done with scoop. # Github repository to push the tap to. - github: - owner: github-user - name: homebrew-tap - - # OR Gitlab - # gitlab: - # owner: gitlab-user - # name: homebrew-tap - - # Gitea is not supported yet, but the support coming + tap: + owner: flyteorg + name: flytectl # Template for the url which is determined by the given Token (github or gitlab) # Default for github is "https://github.com///releases/download/{{ .Tag }}/{{ .ArtifactName }}" # Default for gitlab is "https://gitlab.com///uploads/{{ .ArtifactUploadHash }}/{{ .ArtifactName }}" - url_template: "http://github.com/lyft/flytectl/releases/{{ .Tag }}/{{ .ArtifactName }}" + url_template: "http://github.com/flyteorg/flytectl/releases/{{ .Tag }}/{{ .ArtifactName }}" # Allows you to set a custom download strategy. Note that you'll need # to implement the strategy and add it to your tap repository. @@ -112,12 +98,8 @@ brews: # Git author used to commit to the repository. # Defaults are shown. commit_author: - name: goreleaserbot - email: goreleaser@carlosbecker.com - - # Folder inside the repository to put the formula. - # Default is the root folder. - folder: Formula + name: flytebot + email: flytebot@flyte.org # Caveats for the user of your binary. # Default is empty. @@ -125,7 +107,7 @@ brews: # Your app's homepage. # Default is empty. - homepage: "https://godoc.org/github.com/lyft/flytectl" + homepage: "https://flytectl.readthedocs.io/en/latest" # Your app's description. # Default is empty. @@ -139,30 +121,6 @@ brews: # Default is false. skip_upload: auto - # Custom block for brew. - # Can be used to specify alternate downloads for devel or head releases. - # Default is empty. - # custom_block: | - # head "https://github.com/some/package.git" - # ... - - # Packages your package depends on. - # dependencies: - # - name: git - # - name: zsh - # type: optional - - # Packages that conflict with your package. - # conflicts: - # - svn - # - bash - - # Specify for packages that run as a service. - # Default is empty. - # plist: | - # - # ... - # So you can `brew test` your formula. # Default is empty. test: system "#{bin}/program --version" diff --git a/flytectl/README.md b/flytectl/README.md index fd022104df..a1a2af7292 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -21,7 +21,7 @@ Generating docs locally can be accomplished by running make gendocs from within ## Installation ```bash -curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash +curl -s https://raw.githubusercontent.com/flyteorg/flytectl/master/install.sh | bash ``` ## Contributing diff --git a/flytectl/boilerplate/lyft/golang_support_tools/tools.go b/flytectl/boilerplate/lyft/golang_support_tools/tools.go index 4310b39d79..88ff645233 100644 --- a/flytectl/boilerplate/lyft/golang_support_tools/tools.go +++ b/flytectl/boilerplate/lyft/golang_support_tools/tools.go @@ -3,8 +3,8 @@ package tools import ( + _ "github.com/alvaroloes/enumer" _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/lyft/flytestdlib/cli/pflags" _ "github.com/vektra/mockery/cmd/mockery" - _ "github.com/alvaroloes/enumer" ) diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index c625fd2072..aa76d00112 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -3,6 +3,7 @@ package cmdcore import ( "context" "fmt" + "github.com/spf13/pflag" "github.com/lyft/flyteidl/clients/go/admin" diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go index bf593b2b4c..347e75c3fe 100644 --- a/flytectl/cmd/core/cmd_ctx.go +++ b/flytectl/cmd/core/cmd_ctx.go @@ -13,7 +13,7 @@ type CommandContext struct { } func NewCommandContext(adminClient service.AdminServiceClient, out io.Writer) CommandContext { - return CommandContext{adminClient: adminClient, out : out} + return CommandContext{adminClient: adminClient, out: out} } func (c CommandContext) AdminClient() service.AdminServiceClient { diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 4491ef03dc..0c22e5674e 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -2,6 +2,7 @@ package get import ( "context" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" "github.com/golang/protobuf/proto" @@ -13,7 +14,7 @@ import ( "github.com/lyft/flytectl/pkg/printer" ) -const( +const ( executionShort = "Gets execution resources" executionLong = ` Retrieves all the executions within project and domain.(execution,executions can be used interchangeably in these commands) @@ -49,12 +50,12 @@ Usage ) var executionColumns = []printer.Column{ - {"Name", "$.id.name"}, - {"Workflow Name", "$.closure.workflowId.name"}, - {"Type", "$.closure.workflowId.resourceType"}, - {"Phase", "$.closure.phase"}, - {"Started", "$.closure.startedAt"}, - {"Elapsed Time", "$.closure.duration"}, + {Header: "Name", JSONPath: "$.id.name"}, + {Header: "Workflow Name", JSONPath: "$.closure.workflowId.name"}, + {Header: "Type", JSONPath: "$.closure.workflowId.resourceType"}, + {Header: "Phase", JSONPath: "$.closure.phase"}, + {Header: "Started", JSONPath: "$.closure.startedAt"}, + {Header: "Elapsed Time", JSONPath: "$.closure.duration"}, } func ExecutionToProtoMessages(l []*admin.Execution) []proto.Message { @@ -67,7 +68,7 @@ func ExecutionToProtoMessages(l []*admin.Execution) []proto.Message { func getExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { adminPrinter := printer.Printer{} - var executions []* admin.Execution + var executions []*admin.Execution if len(args) > 0 { name := args[0] execution, err := cmdCtx.AdminClient().GetExecution(ctx, &admin.WorkflowExecutionGetRequest{ diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go index b7a83cbef6..33cccd465f 100644 --- a/flytectl/cmd/get/execution_test.go +++ b/flytectl/cmd/get/execution_test.go @@ -3,14 +3,15 @@ package get import ( "context" "errors" + "io" + "testing" + "github.com/lyft/flytectl/cmd/config" cmdCore "github.com/lyft/flytectl/cmd/core" "github.com/lyft/flyteidl/clients/go/admin/mocks" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" - "io" - "testing" ) const projectValue = "dummyProject" @@ -20,12 +21,13 @@ const launchPlanNameValue = "lp_name" const launchPlanVersionValue = "lp_version" const workflowNameValue = "wf_name" const workflowVersionValue = "wf_version" +const output = "json" func TestListExecutionFunc(t *testing.T) { ctx := context.Background() config.GetConfig().Project = projectValue config.GetConfig().Domain = domainValue - config.GetConfig().Output = "json" + config.GetConfig().Output = output var args []string mockClient := new(mocks.AdminServiceClient) mockOutStream := new(io.Writer) @@ -61,8 +63,7 @@ func TestListExecutionFunc(t *testing.T) { Phase: core.WorkflowExecution_SUCCEEDED, }, } - var executions []*admin.Execution - executions = append(executions, executionResponse) + executions := []*admin.Execution{executionResponse} executionList := &admin.ExecutionList{ Executions: executions, } @@ -76,7 +77,7 @@ func TestListExecutionFuncWithError(t *testing.T) { ctx := context.Background() config.GetConfig().Project = projectValue config.GetConfig().Domain = domainValue - config.GetConfig().Output = "json" + config.GetConfig().Output = output var args []string mockClient := new(mocks.AdminServiceClient) mockOutStream := new(io.Writer) @@ -88,7 +89,7 @@ func TestListExecutionFuncWithError(t *testing.T) { Domain: domainValue, }, } - executionResponse := &admin.Execution{ + _ = &admin.Execution{ Id: &core.WorkflowExecutionIdentifier{ Project: projectValue, Domain: domainValue, @@ -112,12 +113,10 @@ func TestListExecutionFuncWithError(t *testing.T) { Phase: core.WorkflowExecution_SUCCEEDED, }, } - var executions []*admin.Execution - executions = append(executions, executionResponse) - mockClient.OnListExecutionsMatch(ctx, execListRequest).Return(nil, errors.New("Executions NotFound.")) + mockClient.OnListExecutionsMatch(ctx, execListRequest).Return(nil, errors.New("executions NotFound")) err := getExecutionFunc(ctx, args, cmdCtx) assert.NotNil(t, err) - assert.Equal(t, err, errors.New("Executions NotFound.")) + assert.Equal(t, err, errors.New("executions NotFound")) mockClient.AssertCalled(t, "ListExecutions", ctx, execListRequest) } @@ -125,7 +124,7 @@ func TestGetExecutionFunc(t *testing.T) { ctx := context.Background() config.GetConfig().Project = projectValue config.GetConfig().Domain = domainValue - config.GetConfig().Output = "json" + config.GetConfig().Output = output mockClient := new(mocks.AdminServiceClient) mockOutStream := new(io.Writer) cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) @@ -160,8 +159,6 @@ func TestGetExecutionFunc(t *testing.T) { Phase: core.WorkflowExecution_SUCCEEDED, }, } - var executions []*admin.Execution - executions = append(executions, executionResponse) args := []string{executionNameValue} mockClient.OnGetExecutionMatch(ctx, execGetRequest).Return(executionResponse, nil) err := getExecutionFunc(ctx, args, cmdCtx) @@ -173,7 +170,7 @@ func TestGetExecutionFuncWithError(t *testing.T) { ctx := context.Background() config.GetConfig().Project = projectValue config.GetConfig().Domain = domainValue - config.GetConfig().Output = "json" + config.GetConfig().Output = output mockClient := new(mocks.AdminServiceClient) mockOutStream := new(io.Writer) cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) @@ -184,7 +181,7 @@ func TestGetExecutionFuncWithError(t *testing.T) { Name: executionNameValue, }, } - executionResponse := &admin.Execution{ + _ = &admin.Execution{ Id: &core.WorkflowExecutionIdentifier{ Project: projectValue, Domain: domainValue, @@ -208,12 +205,11 @@ func TestGetExecutionFuncWithError(t *testing.T) { Phase: core.WorkflowExecution_SUCCEEDED, }, } - var executions []*admin.Execution - executions = append(executions, executionResponse) + args := []string{executionNameValue} - mockClient.OnGetExecutionMatch(ctx, execGetRequest).Return(nil, errors.New("Execution NotFound.")) + mockClient.OnGetExecutionMatch(ctx, execGetRequest).Return(nil, errors.New("execution NotFound")) err := getExecutionFunc(ctx, args, cmdCtx) assert.NotNil(t, err) - assert.Equal(t, err, errors.New("Execution NotFound.")) + assert.Equal(t, err, errors.New("execution NotFound")) mockClient.AssertCalled(t, "GetExecution", ctx, execGetRequest) } diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index c19a593280..2fd6806c5a 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -22,7 +22,7 @@ func CreateGetCommand() *cobra.Command { getCmd := &cobra.Command{ Use: "get", Short: getCmdShort, - Long: getCmdLong, + Long: getCmdLong, } getResourcesFuncs := map[string]cmdcore.CommandEntry{ diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index 8602d161c7..243a6a97da 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -2,15 +2,16 @@ package get import ( "fmt" - "github.com/stretchr/testify/assert" "sort" "testing" + + "github.com/stretchr/testify/assert" ) func TestCreateGetCommand(t *testing.T) { getCommand := CreateGetCommand() - assert.Equal(t, getCommand.Use , "get") - assert.Equal(t, getCommand.Short , "Retrieve various resource.") + assert.Equal(t, getCommand.Use, "get") + assert.Equal(t, getCommand.Short, "Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project.") fmt.Println(getCommand.Commands()) assert.Equal(t, len(getCommand.Commands()), 5) cmdNouns := getCommand.Commands() @@ -20,17 +21,17 @@ func TestCreateGetCommand(t *testing.T) { }) assert.Equal(t, cmdNouns[0].Use, "execution") assert.Equal(t, cmdNouns[0].Aliases, []string{"executions"}) - assert.Equal(t, cmdNouns[0].Short, "Retrieves execution resources.") + assert.Equal(t, cmdNouns[0].Short, "Gets execution resources") assert.Equal(t, cmdNouns[1].Use, "launchplan") assert.Equal(t, cmdNouns[1].Aliases, []string{"launchplans"}) - assert.Equal(t, cmdNouns[1].Short, "Retrieves launchplan resources.") + assert.Equal(t, cmdNouns[1].Short, "Gets launch plan resources") assert.Equal(t, cmdNouns[2].Use, "project") assert.Equal(t, cmdNouns[2].Aliases, []string{"projects"}) - assert.Equal(t, cmdNouns[2].Short, "Retrieves project resources.") + assert.Equal(t, cmdNouns[2].Short, "Gets project resources") assert.Equal(t, cmdNouns[3].Use, "task") assert.Equal(t, cmdNouns[3].Aliases, []string{"tasks"}) - assert.Equal(t, cmdNouns[3].Short, "Retrieves task resources.") + assert.Equal(t, cmdNouns[3].Short, "Gets task resources") assert.Equal(t, cmdNouns[4].Use, "workflow") assert.Equal(t, cmdNouns[4].Aliases, []string{"workflows"}) - assert.Equal(t, cmdNouns[4].Short, "Retrieves workflow resources.") + assert.Equal(t, cmdNouns[4].Short, "Gets workflow resources") } diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index ff8e1ce912..8706a36271 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -2,6 +2,7 @@ package get import ( "context" + "github.com/golang/protobuf/proto" "github.com/lyft/flytectl/cmd/config" cmdCore "github.com/lyft/flytectl/cmd/core" @@ -11,8 +12,7 @@ import ( "github.com/lyft/flytestdlib/logger" ) -const( - +const ( launchPlanShort = "Gets launch plan resources" launchPlanLong = ` Retrieves all the launch plans within project and domain.(launchplan,launchplans can be used interchangeably in these commands) @@ -48,11 +48,11 @@ Usage ) var launchplanColumns = []printer.Column{ - {"Version", "$.id.version"}, - {"Name", "$.id.name"}, - {"Type", "$.closure.compiledTask.template.type"}, - {"State", "$.spec.state"}, - {"Schedule", "$.spec.entityMetadata.schedule"}, + {Header: "Version", JSONPath: "$.id.version"}, + {Header: "Name", JSONPath: "$.id.name"}, + {Header: "Type", JSONPath: "$.closure.compiledTask.template.type"}, + {Header: "State", JSONPath: "$.spec.state"}, + {Header: "Schedule", JSONPath: "$.spec.entityMetadata.schedule"}, } func LaunchplanToProtoMessages(l []*admin.LaunchPlan) []proto.Message { @@ -93,5 +93,4 @@ func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comman } logger.Debugf(ctx, "Retrieved %v launch plans", len(launchPlans)) return launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, adminutils.NamedEntityToProtoMessage(launchPlans)...) - return nil } diff --git a/flytectl/cmd/get/named_entity.go b/flytectl/cmd/get/named_entity.go index a8bc1e60c9..b636145790 100644 --- a/flytectl/cmd/get/named_entity.go +++ b/flytectl/cmd/get/named_entity.go @@ -5,7 +5,7 @@ import ( ) var entityColumns = []printer.Column{ - {"Domain", "$.domain"}, - {"Name", "$.name"}, - {"Project", "$.project"}, + {Header: "Domain", JSONPath: "$.domain"}, + {Header: "Name", JSONPath: "$.name"}, + {Header: "Project", JSONPath: "$.project"}, } diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 6b68011ea3..8307a6e627 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -12,9 +12,9 @@ import ( "github.com/lyft/flytectl/pkg/printer" ) -const( -projectShort = "Gets project resources" -projectLong = ` +const ( + projectShort = "Gets project resources" + projectLong = ` Retrieves all the projects.(project,projects can be used interchangeably in these commands) :: @@ -48,9 +48,9 @@ Usage ) var projectColumns = []printer.Column{ - {"ID", "$.id"}, - {"Name", "$.name"}, - {"Description", "$.description"}, + {Header: "ID", JSONPath: "$.id"}, + {Header: "Name", JSONPath: "$.name"}, + {Header: "Description", JSONPath: "$.description"}, } func ProjectToProtoMessages(l []*admin.Project) []proto.Message { diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index ddc28fb0b9..96631d1741 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -2,6 +2,7 @@ package get import ( "context" + "github.com/golang/protobuf/proto" "github.com/lyft/flytestdlib/logger" @@ -14,7 +15,7 @@ import ( "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" ) -const( +const ( taskShort = "Gets task resources" taskLong = ` Retrieves all the task within project and domain.(task,tasks can be used interchangeably in these commands) @@ -50,12 +51,12 @@ Usage ) var taskColumns = []printer.Column{ - {"Version", "$.id.version"}, - {"Name", "$.id.name"}, - {"Type", "$.closure.compiledTask.template.type"}, - {"Discoverable", "$.closure.compiledTask.template.metadata.discoverable"}, - {"Discovery Version", "$.closure.compiledTask.template.metadata.discoveryVersion"}, - {"Created At", "$.closure.createdAt"}, + {Header: "Version", JSONPath: "$.id.version"}, + {Header: "Name", JSONPath: "$.id.name"}, + {Header: "Type", JSONPath: "$.closure.compiledTask.template.type"}, + {Header: "Discoverable", JSONPath: "$.closure.compiledTask.template.metadata.discoverable"}, + {Header: "Discovery Version", JSONPath: "$.closure.compiledTask.template.metadata.discoveryVersion"}, + {Header: "Created At", JSONPath: "$.closure.createdAt"}, } func TaskToProtoMessages(l []*admin.Task) []proto.Message { diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index d6a8d9172b..857df5bf5b 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -2,6 +2,7 @@ package get import ( "context" + "github.com/golang/protobuf/proto" "github.com/lyft/flytestdlib/logger" @@ -13,7 +14,7 @@ import ( "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" ) -const( +const ( workflowShort = "Gets workflow resources" workflowLong = ` Retrieves all the workflows within project and domain.(workflow,workflows can be used interchangeably in these commands) @@ -49,9 +50,9 @@ Usage ) var workflowColumns = []printer.Column{ - {"Version", "$.id.version"}, - {"Name", "$.id.name"}, - {"Created At", "$.closure.createdAt"}, + {Header: "Version", JSONPath: "$.id.version"}, + {Header: "Name", JSONPath: "$.id.name"}, + {Header: "Created At", JSONPath: "$.closure.createdAt"}, } func WorkflowToProtoMessages(l []*admin.Workflow) []proto.Message { diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index 821f034cd8..b53ed63097 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -4,14 +4,15 @@ import ( "context" "encoding/json" "fmt" + "io/ioutil" + "sort" + cmdCore "github.com/lyft/flytectl/cmd/core" "github.com/lyft/flytectl/pkg/printer" "github.com/lyft/flytestdlib/logger" - "io/ioutil" - "sort" ) -const( +const ( registerFilesShort = "Registers file resources" registerFilesLong = ` Registers all the serialized protobuf files including tasks, workflows and launchplans with default v1 version. @@ -51,47 +52,49 @@ func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.Co files := args sort.Strings(files) logger.Infof(ctx, "Parsing files... Total(%v)", len(files)) - logger.Infof(ctx, "Params version %v", filesConfig.version) - var registerResults [] RegisterResult + logger.Infof(ctx, "Params version %v", filesConfig.Version) + var registerResults []Result adminPrinter := printer.Printer{} - fastFail := !filesConfig.skipOnError + fastFail := !filesConfig.SkipOnError logger.Infof(ctx, "Fail fast %v", fastFail) var _err error - for i := 0; i< len(files) && !(fastFail && _err != nil) ; i++ { + for i := 0; i < len(files) && !(fastFail && _err != nil); i++ { absFilePath := files[i] - var registerResult RegisterResult + var registerResult Result logger.Infof(ctx, "Parsing %v", absFilePath) fileContents, err := ioutil.ReadFile(absFilePath) if err != nil { - registerResult = RegisterResult{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error reading file due to %v", err)} + registerResult = Result{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error reading file due to %v", err)} registerResults = append(registerResults, registerResult) _err = err continue } spec, err := unMarshalContents(ctx, fileContents, absFilePath) if err != nil { - registerResult = RegisterResult{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error unmarshalling file due to %v", err)} + registerResult = Result{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error unmarshalling file due to %v", err)} registerResults = append(registerResults, registerResult) _err = err continue } if err := hydrateSpec(spec); err != nil { - registerResult = RegisterResult{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error hydrating spec due to %v", err)} + registerResult = Result{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error hydrating spec due to %v", err)} registerResults = append(registerResults, registerResult) _err = err continue } - logger.Debugf(ctx, "Hydrated spec : %v", getJsonSpec(spec)) + logger.Debugf(ctx, "Hydrated spec : %v", getJSONSpec(spec)) if err := register(ctx, spec, cmdCtx); err != nil { - registerResult = RegisterResult{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error registering file due to %v", err)} + registerResult = Result{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error registering file due to %v", err)} registerResults = append(registerResults, registerResult) _err = err continue } - registerResult = RegisterResult{Name: absFilePath, Status: "Success", Info: "Successfully registered file"} + registerResult = Result{Name: absFilePath, Status: "Success", Info: "Successfully registered file"} registerResults = append(registerResults, registerResult) } payload, _ := json.Marshal(registerResults) - adminPrinter.JSONToTable(payload, projectColumns) + if err := adminPrinter.JSONToTable(payload, projectColumns); err != nil { + return err + } return nil } diff --git a/flytectl/cmd/register/registerfilesconfig_flags.go b/flytectl/cmd/register/filesconfig_flags.go similarity index 55% rename from flytectl/cmd/register/registerfilesconfig_flags.go rename to flytectl/cmd/register/filesconfig_flags.go index 97c5884485..a631183709 100755 --- a/flytectl/cmd/register/registerfilesconfig_flags.go +++ b/flytectl/cmd/register/filesconfig_flags.go @@ -5,15 +5,16 @@ package register import ( "encoding/json" - "fmt" "reflect" + "fmt" + "github.com/spf13/pflag" ) // If v is a pointer, it will get its element value or the zero value of the element type. // If v is not a pointer, it will return it as is. -func (RegisterFilesConfig) elemValueOrNil(v interface{}) interface{} { +func (FilesConfig) elemValueOrNil(v interface{}) interface{} { if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { if reflect.ValueOf(v).IsNil() { return reflect.Zero(t.Elem()).Interface() @@ -27,7 +28,7 @@ func (RegisterFilesConfig) elemValueOrNil(v interface{}) interface{} { return v } -func (RegisterFilesConfig) mustMarshalJSON(v json.Marshaler) string { +func (FilesConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { panic(err) @@ -36,11 +37,11 @@ func (RegisterFilesConfig) mustMarshalJSON(v json.Marshaler) string { return string(raw) } -// GetPFlagSet will return strongly types pflags for all fields in RegisterFilesConfig and its nested types. The format of the +// GetPFlagSet will return strongly types pflags for all fields in FilesConfig and its nested types. The format of the // flags is json-name.json-sub-name... etc. -func (cfg RegisterFilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("RegisterFilesConfig", pflag.ExitOnError) - cmdFlags.StringVarP(&(filesConfig.version),fmt.Sprintf("%v%v", prefix, "version"), "v", "v1", "version of the entity to be registered with flyte.") - cmdFlags.BoolVarP(&(filesConfig.skipOnError), fmt.Sprintf("%v%v", prefix, "skipOnError"), "s", *new(bool), "fail fast when registering files.") +func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("FilesConfig", pflag.ExitOnError) + cmdFlags.String(fmt.Sprintf("%v%v", prefix, "version"), *new(string), "version of the entity to be registered with flyte.") + cmdFlags.Bool(fmt.Sprintf("%v%v", prefix, "skipOnError"), *new(bool), "fail fast when registering files.") return cmdFlags } diff --git a/flytectl/cmd/register/registerfilesconfig_flags_test.go b/flytectl/cmd/register/filesconfig_flags_test.go similarity index 70% rename from flytectl/cmd/register/registerfilesconfig_flags_test.go rename to flytectl/cmd/register/filesconfig_flags_test.go index 9c055e83e4..163852ee41 100755 --- a/flytectl/cmd/register/registerfilesconfig_flags_test.go +++ b/flytectl/cmd/register/filesconfig_flags_test.go @@ -14,22 +14,22 @@ import ( "github.com/stretchr/testify/assert" ) -var dereferencableKindsRegisterFilesConfig = map[reflect.Kind]struct{}{ +var dereferencableKindsFilesConfig = map[reflect.Kind]struct{}{ reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, } // Checks if t is a kind that can be dereferenced to get its underlying type. -func canGetElementRegisterFilesConfig(t reflect.Kind) bool { - _, exists := dereferencableKindsRegisterFilesConfig[t] +func canGetElementFilesConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsFilesConfig[t] return exists } // This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the // object. Otherwise, it'll just pass on the original data. -func jsonUnmarshalerHookRegisterFilesConfig(_, to reflect.Type, data interface{}) (interface{}, error) { +func jsonUnmarshalerHookFilesConfig(_, to reflect.Type, data interface{}) (interface{}, error) { unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || - (canGetElementRegisterFilesConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + (canGetElementFilesConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { raw, err := json.Marshal(data) if err != nil { @@ -50,7 +50,7 @@ func jsonUnmarshalerHookRegisterFilesConfig(_, to reflect.Type, data interface{} return data, nil } -func decode_RegisterFilesConfig(input, result interface{}) error { +func decode_FilesConfig(input, result interface{}) error { config := &mapstructure.DecoderConfig{ TagName: "json", WeaklyTypedInput: true, @@ -58,7 +58,7 @@ func decode_RegisterFilesConfig(input, result interface{}) error { DecodeHook: mapstructure.ComposeDecodeHookFunc( mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToSliceHookFunc(","), - jsonUnmarshalerHookRegisterFilesConfig, + jsonUnmarshalerHookFilesConfig, ), } @@ -70,7 +70,7 @@ func decode_RegisterFilesConfig(input, result interface{}) error { return decoder.Decode(input) } -func join_RegisterFilesConfig(arr interface{}, sep string) string { +func join_FilesConfig(arr interface{}, sep string) string { listValue := reflect.ValueOf(arr) strs := make([]string, 0, listValue.Len()) for i := 0; i < listValue.Len(); i++ { @@ -80,22 +80,22 @@ func join_RegisterFilesConfig(arr interface{}, sep string) string { return strings.Join(strs, sep) } -func testDecodeJson_RegisterFilesConfig(t *testing.T, val, result interface{}) { - assert.NoError(t, decode_RegisterFilesConfig(val, result)) +func testDecodeJson_FilesConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_FilesConfig(val, result)) } -func testDecodeSlice_RegisterFilesConfig(t *testing.T, vStringSlice, result interface{}) { - assert.NoError(t, decode_RegisterFilesConfig(vStringSlice, result)) +func testDecodeSlice_FilesConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_FilesConfig(vStringSlice, result)) } -func TestRegisterFilesConfig_GetPFlagSet(t *testing.T) { - val := RegisterFilesConfig{} +func TestFilesConfig_GetPFlagSet(t *testing.T) { + val := FilesConfig{} cmdFlags := val.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) } -func TestRegisterFilesConfig_SetFlags(t *testing.T) { - actual := RegisterFilesConfig{} +func TestFilesConfig_SetFlags(t *testing.T) { + actual := FilesConfig{} cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) @@ -103,7 +103,7 @@ func TestRegisterFilesConfig_SetFlags(t *testing.T) { t.Run("DefaultValue", func(t *testing.T) { // Test that default value is set properly if vString, err := cmdFlags.GetString("version"); err == nil { - assert.Equal(t, string("v1"), vString) + assert.Equal(t, string(*new(string)), vString) } else { assert.FailNow(t, err.Error()) } @@ -114,7 +114,7 @@ func TestRegisterFilesConfig_SetFlags(t *testing.T) { cmdFlags.Set("version", testValue) if vString, err := cmdFlags.GetString("version"); err == nil { - testDecodeJson_RegisterFilesConfig(t, fmt.Sprintf("%v", vString), &actual.version) + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vString), &actual.Version) } else { assert.FailNow(t, err.Error()) @@ -136,7 +136,7 @@ func TestRegisterFilesConfig_SetFlags(t *testing.T) { cmdFlags.Set("skipOnError", testValue) if vBool, err := cmdFlags.GetBool("skipOnError"); err == nil { - testDecodeJson_RegisterFilesConfig(t, fmt.Sprintf("%v", vBool), &actual.skipOnError) + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vBool), &actual.SkipOnError) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/register/register.go b/flytectl/cmd/register/register.go index 62263a3387..3a46653b12 100644 --- a/flytectl/cmd/register/register.go +++ b/flytectl/cmd/register/register.go @@ -16,8 +16,8 @@ If the entities are already registered with flyte for the same version then regi ` ) -// RegisterCommand will return register command -func RegisterCommand() *cobra.Command { +// RemoteRegisterCommand will return register command +func RemoteRegisterCommand() *cobra.Command { registerCmd := &cobra.Command{ Use: "register", Short: registerCmdShort, diff --git a/flytectl/cmd/register/register_test.go b/flytectl/cmd/register/register_test.go index 99e4a6964f..476e7b31bc 100644 --- a/flytectl/cmd/register/register_test.go +++ b/flytectl/cmd/register/register_test.go @@ -2,13 +2,14 @@ package register import ( "fmt" - "github.com/stretchr/testify/assert" "sort" "testing" + + "github.com/stretchr/testify/assert" ) func TestRegisterCommand(t *testing.T) { - registerCommand := RegisterCommand() + registerCommand := RemoteRegisterCommand() assert.Equal(t, registerCommand.Use, "register") assert.Equal(t, registerCommand.Short, "Registers tasks/workflows/launchplans from list of generated serialized files.") fmt.Println(registerCommand.Commands()) @@ -20,5 +21,5 @@ func TestRegisterCommand(t *testing.T) { }) assert.Equal(t, cmdNouns[0].Use, "files") assert.Equal(t, cmdNouns[0].Aliases, []string{"file"}) - assert.Equal(t, cmdNouns[0].Short, "Retrieves files resources.") + assert.Equal(t, cmdNouns[0].Short, "Registers file resources") } diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 5149fd1e21..d9a5aaff52 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -2,8 +2,8 @@ package register import ( "context" - "errors" "fmt" + "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" "github.com/lyft/flytectl/cmd/config" @@ -14,12 +14,12 @@ import ( "github.com/lyft/flytestdlib/logger" ) -//go:generate pflags RegisterFilesConfig +//go:generate pflags FilesConfig var ( - filesConfig = &RegisterFilesConfig{ - version: "v1", - skipOnError: false, + filesConfig = &FilesConfig{ + Version: "v1", + SkipOnError: false, } ) @@ -27,21 +27,22 @@ const registrationProjectPattern = "{{ registration.project }}" const registrationDomainPattern = "{{ registration.domain }}" const registrationVersionPattern = "{{ registration.version }}" -type RegisterFilesConfig struct { - version string `json:"version" pflag:",version of the entity to be registered with flyte."` - skipOnError bool `json:"skipOnError" pflag:",fail fast when registering files."` +// FilesConfig +type FilesConfig struct { + Version string `json:"version" pflag:",version of the entity to be registered with flyte."` + SkipOnError bool `json:"skipOnError" pflag:",fail fast when registering files."` } -type RegisterResult struct { +type Result struct { Name string Status string Info string } var projectColumns = []printer.Column{ - {"Name", "$.Name"}, - {"Status", "$.Status"}, - {"Additional Info", "$.Info"}, + {Header: "Name", JSONPath: "$.Name"}, + {Header: "Status", JSONPath: "$.Status"}, + {Header: "Additional Info", JSONPath: "$.Info"}, } func unMarshalContents(ctx context.Context, fileContents []byte, fname string) (proto.Message, error) { @@ -60,12 +61,12 @@ func unMarshalContents(ctx context.Context, fileContents []byte, fname string) ( return launchPlan, nil } logger.Debugf(ctx, "Failed to unmarshal file %v for launch plan type", fname) - return nil, errors.New(fmt.Sprintf("Failed unmarshalling file %v", fname)) + return nil, fmt.Errorf("failed unmarshalling file %v", fname) } func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.CommandContext) error { - switch message.(type) { + switch v := message.(type) { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) _, err := cmdCtx.AdminClient().CreateLaunchPlan(ctx, &admin.LaunchPlanCreateRequest{ @@ -74,7 +75,7 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: launchPlan.Id.Name, - Version: filesConfig.version, + Version: filesConfig.Version, }, Spec: launchPlan.Spec, }) @@ -87,7 +88,7 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: workflowSpec.Template.Id.Name, - Version: filesConfig.version, + Version: filesConfig.Version, }, Spec: workflowSpec, }) @@ -100,19 +101,19 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: taskSpec.Template.Id.Name, - Version: filesConfig.version, + Version: filesConfig.Version, }, Spec: taskSpec, }) return err default: - return errors.New(fmt.Sprintf("Failed registering unknown entity %v", message)) + return fmt.Errorf("Failed registering unknown entity %v", v) } } func hydrateNode(node *core.Node) error { targetNode := node.Target - switch targetNode.(type) { + switch v := targetNode.(type) { case *core.Node_TaskNode: taskNodeWrapper := targetNode.(*core.Node_TaskNode) taskNodeReference := taskNodeWrapper.TaskNode.Reference.(*core.TaskNode_ReferenceId) @@ -127,27 +128,34 @@ func hydrateNode(node *core.Node) error { launchPlanNodeReference := workflowNodeWrapper.WorkflowNode.Reference.(*core.WorkflowNode_LaunchplanRef) hydrateIdentifier(launchPlanNodeReference.LaunchplanRef) default: - errors.New(fmt.Sprintf("Unknown type %T", workflowNodeWrapper.WorkflowNode.Reference)) + return fmt.Errorf("unknown type %T", workflowNodeWrapper.WorkflowNode.Reference) } case *core.Node_BranchNode: branchNodeWrapper := targetNode.(*core.Node_BranchNode) - hydrateNode(branchNodeWrapper.BranchNode.IfElse.Case.ThenNode) + if err := hydrateNode(branchNodeWrapper.BranchNode.IfElse.Case.ThenNode); err != nil { + return fmt.Errorf("failed to hydrateNode") + } if len(branchNodeWrapper.BranchNode.IfElse.Other) > 0 { for _, ifBlock := range branchNodeWrapper.BranchNode.IfElse.Other { - hydrateNode(ifBlock.ThenNode) + if err := hydrateNode(ifBlock.ThenNode); err != nil { + return fmt.Errorf("failed to hydrateNode") + } } } switch branchNodeWrapper.BranchNode.IfElse.Default.(type) { case *core.IfElseBlock_ElseNode: elseNodeReference := branchNodeWrapper.BranchNode.IfElse.Default.(*core.IfElseBlock_ElseNode) - hydrateNode(elseNodeReference.ElseNode) + if err := hydrateNode(elseNodeReference.ElseNode); err != nil { + return fmt.Errorf("failed to hydrateNode") + } + case *core.IfElseBlock_Error: // Do nothing. default: - return errors.New(fmt.Sprintf("Unknown type %T", branchNodeWrapper.BranchNode.IfElse.Default)) + return fmt.Errorf("unknown type %T", branchNodeWrapper.BranchNode.IfElse.Default) } default: - return errors.New(fmt.Sprintf("Unknown type %T", targetNode)) + return fmt.Errorf("unknown type %T", v) } return nil } @@ -160,12 +168,12 @@ func hydrateIdentifier(identifier *core.Identifier) { identifier.Domain = config.GetConfig().Domain } if identifier.Version == "" || identifier.Version == registrationVersionPattern { - identifier.Version = filesConfig.version + identifier.Version = filesConfig.Version } } func hydrateSpec(message proto.Message) error { - switch message.(type) { + switch v := message.(type) { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) hydrateIdentifier(launchPlan.Spec.WorkflowId) @@ -189,12 +197,12 @@ func hydrateSpec(message proto.Message) error { taskSpec := message.(*admin.TaskSpec) hydrateIdentifier(taskSpec.Template.Id) default: - return errors.New(fmt.Sprintf("Unknown type %T", message)) + return fmt.Errorf("Unknown type %T", v) } return nil } -func getJsonSpec(message proto.Message) string { +func getJSONSpec(message proto.Message) string { marshaller := jsonpb.Marshaler{ EnumsAsInts: false, EmitDefaults: true, diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index c92fb30d56..b666b29b90 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "context" "fmt" + "github.com/lyft/flytectl/cmd/get" "github.com/lyft/flytectl/cmd/register" "github.com/lyft/flytectl/cmd/update" @@ -24,9 +25,9 @@ var ( func newRootCmd() *cobra.Command { rootCmd := &cobra.Command{ PersistentPreRunE: initConfig, - Long : "flytectl is CLI tool written in go to interact with flyteadmin service", - Short: "flyetcl CLI tool", - Use : "flytectl", + Long: "flytectl is CLI tool written in go to interact with flyteadmin service", + Short: "flyetcl CLI tool", + Use: "flytectl", } rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", @@ -43,7 +44,7 @@ func newRootCmd() *cobra.Command { rootCmd.AddCommand(versionCmd) rootCmd.AddCommand(get.CreateGetCommand()) rootCmd.AddCommand(update.CreateUpdateCommand()) - rootCmd.AddCommand(register.RegisterCommand()) + rootCmd.AddCommand(register.RemoteRegisterCommand()) config.GetConfig() return rootCmd diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 9ccbb4ee29..c421dddd2b 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -3,6 +3,7 @@ package update import ( "context" "fmt" + "github.com/lyft/flytectl/cmd/config" cmdCore "github.com/lyft/flytectl/cmd/core" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" @@ -16,7 +17,7 @@ type ProjectConfig struct { ArchiveProject bool `json:"archiveProject" pflag:",Archives the project specified as argument."` } -const( +const ( projectShort = "Updates project resources" projectLong = ` Updates the project according the flags passed.Allows you to archive or activate a project. @@ -80,8 +81,7 @@ func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comma archiveProject := projectConfig.ArchiveProject activateProject := projectConfig.ActivateProject if activateProject == archiveProject { - fmt.Printf(errInvalidUpdate) - return nil + return fmt.Errorf(errInvalidUpdate) } projectState := admin.Project_ACTIVE if archiveProject { diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index cf9fe7678b..c11986b6fa 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -4,15 +4,16 @@ import ( "bytes" "context" "errors" + "io" + "log" + "os" + "testing" + "github.com/lyft/flytectl/cmd/config" cmdCore "github.com/lyft/flytectl/cmd/core" "github.com/lyft/flyteidl/clients/go/admin/mocks" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" - "io" - "log" - "os" - "testing" ) const projectValue = "dummyProject" @@ -56,8 +57,9 @@ func teardownAndVerify(t *testing.T, expectedLog string) { os.Stdout = stdOut os.Stderr = stderr var buf bytes.Buffer - io.Copy(&buf, reader) - assert.Equal(t, expectedLog, buf.String()) + if _, err := io.Copy(&buf, reader); err != nil { + assert.Equal(t, expectedLog, buf.String()) + } } func modifyProjectFlags(archiveProject *bool, newArchiveVal bool, activateProject *bool, newActivateVal bool) { @@ -70,7 +72,8 @@ func TestActivateProjectFunc(t *testing.T) { defer teardownAndVerify(t, "Project dummyProject updated to ACTIVE state\n") modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) - updateProjectsFunc(ctx, args, cmdCtx) + err := updateProjectsFunc(ctx, args, cmdCtx) + assert.Nil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) } @@ -79,7 +82,8 @@ func TestActivateProjectFuncWithError(t *testing.T) { defer teardownAndVerify(t, "Project dummyProject failed to get updated to ACTIVE state due to Error Updating Project\n") modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) - updateProjectsFunc(ctx, args, cmdCtx) + err := updateProjectsFunc(ctx, args, cmdCtx) + assert.Nil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) } @@ -106,7 +110,8 @@ func TestArchiveProjectFuncWithError(t *testing.T) { State: admin.Project_ARCHIVED, } mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) - updateProjectsFunc(ctx, args, cmdCtx) + err := updateProjectsFunc(ctx, args, cmdCtx) + assert.Nil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) } @@ -116,7 +121,8 @@ func TestEmptyProjectInput(t *testing.T) { config.GetConfig().Project = "" modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) - updateProjectsFunc(ctx, args, cmdCtx) + err := updateProjectsFunc(ctx, args, cmdCtx) + assert.Nil(t, err) mockClient.AssertNotCalled(t, "UpdateProject", ctx, projectUpdateRequest) } @@ -125,6 +131,7 @@ func TestInvalidInput(t *testing.T) { defer teardownAndVerify(t, "Invalid state passed. Specify either activate or archive\n") modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), false) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) - updateProjectsFunc(ctx, args, cmdCtx) + err := updateProjectsFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) mockClient.AssertNotCalled(t, "UpdateProject", ctx, projectUpdateRequest) } diff --git a/flytectl/cmd/update/projectconfig_flags.go b/flytectl/cmd/update/projectconfig_flags.go index e214a4fe1f..f56579fe9f 100755 --- a/flytectl/cmd/update/projectconfig_flags.go +++ b/flytectl/cmd/update/projectconfig_flags.go @@ -41,7 +41,7 @@ func (ProjectConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg ProjectConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("ProjectConfig", pflag.ExitOnError) - cmdFlags.BoolVarP(&(projectConfig.ActivateProject), fmt.Sprintf("%v%v", prefix, "activateProject"),"t", *new(bool), "Activates the project specified as argument.") + cmdFlags.BoolVarP(&(projectConfig.ActivateProject), fmt.Sprintf("%v%v", prefix, "activateProject"), "t", *new(bool), "Activates the project specified as argument.") cmdFlags.BoolVarP(&(projectConfig.ArchiveProject), fmt.Sprintf("%v%v", prefix, "archiveProject"), "a", *new(bool), "Archives the project specified as argument.") return cmdFlags } diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 791deb5c9d..f165512740 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -12,7 +12,7 @@ const ( updateShort = ` Used for updating flyte resources eg: project. ` - updatecmdLong = ` + updatecmdLong = ` Currently this command only provides subcommands to update project. Takes input project which need to be archived or unarchived. Name of the project to be updated is mandatory field. Example update project to activate it. @@ -27,7 +27,7 @@ func CreateUpdateCommand() *cobra.Command { updateCmd := &cobra.Command{ Use: updateUse, Short: updateShort, - Long: updatecmdLong, + Long: updatecmdLong, } updateResourcesFuncs := map[string]cmdcore.CommandEntry{ diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index 749d00a6a0..816c094875 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -1,15 +1,16 @@ package update import ( - "github.com/stretchr/testify/assert" "sort" "testing" + + "github.com/stretchr/testify/assert" ) func TestUpdateCommand(t *testing.T) { updateCommand := CreateUpdateCommand() - assert.Equal(t, updateCommand.Use , "update") - assert.Equal(t, updateCommand.Short , "Update various resources.") + assert.Equal(t, updateCommand.Use, "update") + assert.Equal(t, updateCommand.Short, "\nUsed for updating flyte resources eg: project.\n") assert.Equal(t, len(updateCommand.Commands()), 1) cmdNouns := updateCommand.Commands() // Sort by Use value. diff --git a/flytectl/docs/source/generate_docs.go b/flytectl/docs/source/generate_docs.go index 458b597c8b..4bfb6667ef 100644 --- a/flytectl/docs/source/generate_docs.go +++ b/flytectl/docs/source/generate_docs.go @@ -7,4 +7,3 @@ func main() { panic(err) } } - diff --git a/flytectl/install.sh b/flytectl/install.sh index bee7affdf3..8cd6b6ebd1 100644 --- a/flytectl/install.sh +++ b/flytectl/install.sh @@ -1,18 +1,18 @@ #!/bin/sh set -e -# Code generated by godownloader on 2020-10-10T20:07:34Z. DO NOT EDIT. +# Code generated by godownloader on 2021-02-08T20:29:16Z. DO NOT EDIT. # usage() { this=$1 cat < - -## Follow-up issue -_NA_ -OR -_https://github.com/lyft/flyte/issues/_ From 07fccb1dcc8c35f44ee1005942648357cfdf2cfc Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Tue, 16 Feb 2021 21:57:23 +0530 Subject: [PATCH 023/645] Added reading of archive files for registration to flyte (#31) * Added reading of archive files for registration to flyte * Supporting tgz files and also added filenames from archive in results instead of archive name * Using temp directory to unarchive files and use it for registering * Added unit tests * Fixed linter issues * Addressed review comments and regerated the docs Co-authored-by: pmahindrakar --- flytectl/cmd/register/files.go | 100 +++++---- flytectl/cmd/register/filesconfig_flags.go | 5 +- .../cmd/register/filesconfig_flags_test.go | 34 ++- flytectl/cmd/register/register_util.go | 186 ++++++++++++++-- flytectl/cmd/register/register_util_test.go | 198 ++++++++++++++++++ .../testdata/invalid-extension-register.zip | 1 + flytectl/cmd/register/testdata/invalid.tar | 1 + flytectl/cmd/register/testdata/invalid.tgz | 1 + .../testdata/valid-parent-folder-register.tar | Bin 0 -> 7168 bytes .../cmd/register/testdata/valid-register.tar | Bin 0 -> 6656 bytes .../cmd/register/testdata/valid-register.tgz | Bin 0 -> 892 bytes .../testdata/valid-unordered-register.tar | Bin 0 -> 6656 bytes flytectl/docs/source/gen/flytectl.rst | 67 +++--- flytectl/docs/source/gen/flytectl_config.rst | 65 +++--- .../source/gen/flytectl_config_discover.rst | 69 +++--- .../source/gen/flytectl_config_validate.rst | 69 +++--- flytectl/docs/source/gen/flytectl_get.rst | 65 +++--- .../source/gen/flytectl_get_execution.rst | 65 +++--- .../source/gen/flytectl_get_launchplan.rst | 65 +++--- .../docs/source/gen/flytectl_get_project.rst | 65 +++--- .../docs/source/gen/flytectl_get_task.rst | 65 +++--- .../docs/source/gen/flytectl_get_workflow.rst | 65 +++--- .../docs/source/gen/flytectl_register.rst | 65 +++--- .../source/gen/flytectl_register_files.rst | 95 ++++++--- flytectl/docs/source/gen/flytectl_update.rst | 65 +++--- .../source/gen/flytectl_update_project.rst | 65 +++--- flytectl/docs/source/gen/flytectl_version.rst | 65 +++--- flytectl/go.sum | 22 ++ 28 files changed, 1086 insertions(+), 477 deletions(-) create mode 100644 flytectl/cmd/register/register_util_test.go create mode 100644 flytectl/cmd/register/testdata/invalid-extension-register.zip create mode 100644 flytectl/cmd/register/testdata/invalid.tar create mode 100644 flytectl/cmd/register/testdata/invalid.tgz create mode 100644 flytectl/cmd/register/testdata/valid-parent-folder-register.tar create mode 100644 flytectl/cmd/register/testdata/valid-register.tar create mode 100644 flytectl/cmd/register/testdata/valid-register.tgz create mode 100644 flytectl/cmd/register/testdata/valid-unordered-register.tar diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index b53ed63097..b413619008 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -3,15 +3,28 @@ package register import ( "context" "encoding/json" - "fmt" - "io/ioutil" - "sort" + "os" cmdCore "github.com/lyft/flytectl/cmd/core" "github.com/lyft/flytectl/pkg/printer" "github.com/lyft/flytestdlib/logger" ) +//go:generate pflags FilesConfig +var ( + filesConfig = &FilesConfig{ + Version: "v1", + ContinueOnError: false, + } +) + +// FilesConfig +type FilesConfig struct { + Version string `json:"version" pflag:",version of the entity to be registered with flyte."` + ContinueOnError bool `json:"continueOnError" pflag:",continue on error when registering files."` + Archive bool `json:"archive" pflag:",pass in archive file either an http link or local path."` +} + const ( registerFilesShort = "Registers file resources" registerFilesLong = ` @@ -21,17 +34,30 @@ If there are already registered entities with v1 version then the command will f bin/flytectl register file _pb_output/* -d development -p flytesnacks +Using archive file.Currently supported are .tgz and .tar extension files and can be local or remote file served through http/https. +Use --archive flag. + +:: + + bin/flytectl register files http://localhost:8080/_pb_output.tar -d development -p flytesnacks --archive + +Using local tgz file. + +:: + + bin/flytectl register files _pb_output.tgz -d development -p flytesnacks --archive + If you want to continue executing registration on other files ignoring the errors including version conflicts then pass in -the skipOnError flag. +the continueOnError flag. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --skipOnError + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -Using short format of skipOnError flag +Using short format of continueOnError flag :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -s + bin/flytectl register file _pb_output/* -d development -p flytesnacks -c Overriding the default version v1 using version string. :: @@ -42,59 +68,31 @@ Change the o/p format has not effect on registration. The O/p is currently avail :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -s -o yaml + bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -o yaml Usage ` ) func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - files := args - sort.Strings(files) - logger.Infof(ctx, "Parsing files... Total(%v)", len(files)) - logger.Infof(ctx, "Params version %v", filesConfig.Version) + dataRefs, tmpDir, _err := getSortedFileList(ctx, args) + if _err != nil { + logger.Errorf(ctx, "error while un-archiving files in tmp dir due to %v", _err) + return _err + } + logger.Infof(ctx, "Parsing files... Total(%v)", len(dataRefs)) + fastFail := !filesConfig.ContinueOnError var registerResults []Result - adminPrinter := printer.Printer{} - fastFail := !filesConfig.SkipOnError - logger.Infof(ctx, "Fail fast %v", fastFail) - var _err error - for i := 0; i < len(files) && !(fastFail && _err != nil); i++ { - absFilePath := files[i] - var registerResult Result - logger.Infof(ctx, "Parsing %v", absFilePath) - fileContents, err := ioutil.ReadFile(absFilePath) - if err != nil { - registerResult = Result{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error reading file due to %v", err)} - registerResults = append(registerResults, registerResult) - _err = err - continue - } - spec, err := unMarshalContents(ctx, fileContents, absFilePath) - if err != nil { - registerResult = Result{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error unmarshalling file due to %v", err)} - registerResults = append(registerResults, registerResult) - _err = err - continue - } - if err := hydrateSpec(spec); err != nil { - registerResult = Result{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error hydrating spec due to %v", err)} - registerResults = append(registerResults, registerResult) - _err = err - continue - } - logger.Debugf(ctx, "Hydrated spec : %v", getJSONSpec(spec)) - if err := register(ctx, spec, cmdCtx); err != nil { - registerResult = Result{Name: absFilePath, Status: "Failed", Info: fmt.Sprintf("Error registering file due to %v", err)} - registerResults = append(registerResults, registerResult) - _err = err - continue - } - registerResult = Result{Name: absFilePath, Status: "Success", Info: "Successfully registered file"} - registerResults = append(registerResults, registerResult) + for i := 0; i < len(dataRefs) && !(fastFail && _err != nil); i++ { + registerResults, _err = registerFile(ctx, dataRefs[i], registerResults, cmdCtx) } payload, _ := json.Marshal(registerResults) - if err := adminPrinter.JSONToTable(payload, projectColumns); err != nil { - return err + registerPrinter := printer.Printer{} + _ = registerPrinter.JSONToTable(payload, projectColumns) + if tmpDir != "" { + if _err = os.RemoveAll(tmpDir); _err != nil { + logger.Errorf(ctx, "unable to delete temp dir %v due to %v", tmpDir, _err) + } } return nil } diff --git a/flytectl/cmd/register/filesconfig_flags.go b/flytectl/cmd/register/filesconfig_flags.go index a631183709..b35de5beb8 100755 --- a/flytectl/cmd/register/filesconfig_flags.go +++ b/flytectl/cmd/register/filesconfig_flags.go @@ -41,7 +41,8 @@ func (FilesConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("FilesConfig", pflag.ExitOnError) - cmdFlags.String(fmt.Sprintf("%v%v", prefix, "version"), *new(string), "version of the entity to be registered with flyte.") - cmdFlags.Bool(fmt.Sprintf("%v%v", prefix, "skipOnError"), *new(bool), "fail fast when registering files.") + cmdFlags.StringVarP(&(filesConfig.Version),fmt.Sprintf("%v%v", prefix, "version"), "v", "v1", "version of the entity to be registered with flyte.") + cmdFlags.BoolVarP(&(filesConfig.ContinueOnError), fmt.Sprintf("%v%v", prefix, "continueOnError"), "c", *new(bool), "continue on error when registering files.") + cmdFlags.BoolVarP(&(filesConfig.Archive), fmt.Sprintf("%v%v", prefix, "archive"), "a", *new(bool), "pass in archive file either an http link or local path.") return cmdFlags } diff --git a/flytectl/cmd/register/filesconfig_flags_test.go b/flytectl/cmd/register/filesconfig_flags_test.go index 163852ee41..2a78db2a9a 100755 --- a/flytectl/cmd/register/filesconfig_flags_test.go +++ b/flytectl/cmd/register/filesconfig_flags_test.go @@ -103,7 +103,7 @@ func TestFilesConfig_SetFlags(t *testing.T) { t.Run("DefaultValue", func(t *testing.T) { // Test that default value is set properly if vString, err := cmdFlags.GetString("version"); err == nil { - assert.Equal(t, string(*new(string)), vString) + assert.Equal(t, "v1", vString) } else { assert.FailNow(t, err.Error()) } @@ -121,10 +121,10 @@ func TestFilesConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_skipOnError", func(t *testing.T) { + t.Run("Test_continueOnError", func(t *testing.T) { t.Run("DefaultValue", func(t *testing.T) { // Test that default value is set properly - if vBool, err := cmdFlags.GetBool("skipOnError"); err == nil { + if vBool, err := cmdFlags.GetBool("continueOnError"); err == nil { assert.Equal(t, bool(*new(bool)), vBool) } else { assert.FailNow(t, err.Error()) @@ -134,9 +134,31 @@ func TestFilesConfig_SetFlags(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("skipOnError", testValue) - if vBool, err := cmdFlags.GetBool("skipOnError"); err == nil { - testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vBool), &actual.SkipOnError) + cmdFlags.Set("continueOnError", testValue) + if vBool, err := cmdFlags.GetBool("continueOnError"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vBool), &actual.ContinueOnError) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_archive", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vBool, err := cmdFlags.GetBool("archive"); err == nil { + assert.Equal(t, bool(*new(bool)), vBool) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("archive", testValue) + if vBool, err := cmdFlags.GetBool("archive"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vBool), &actual.Archive) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index d9a5aaff52..1b419912f4 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -1,44 +1,51 @@ package register import ( + "archive/tar" + "compress/gzip" "context" + "errors" "fmt" + "io" + "io/ioutil" + "net/http" + "os" + "sort" + "strings" "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" + "github.com/lyft/flytectl/cmd/config" cmdCore "github.com/lyft/flytectl/cmd/core" "github.com/lyft/flytectl/pkg/printer" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" "github.com/lyft/flytestdlib/logger" -) - -//go:generate pflags FilesConfig - -var ( - filesConfig = &FilesConfig{ - Version: "v1", - SkipOnError: false, - } + "github.com/lyft/flytestdlib/storage" ) const registrationProjectPattern = "{{ registration.project }}" const registrationDomainPattern = "{{ registration.domain }}" const registrationVersionPattern = "{{ registration.version }}" -// FilesConfig -type FilesConfig struct { - Version string `json:"version" pflag:",version of the entity to be registered with flyte."` - SkipOnError bool `json:"skipOnError" pflag:",fail fast when registering files."` -} - type Result struct { Name string Status string Info string } +// HTTPClient interface +type HTTPClient interface { + Do(req *http.Request) (*http.Response, error) +} + +var Client HTTPClient + +func init() { + Client = &http.Client{} +} + var projectColumns = []printer.Column{ {Header: "Name", JSONPath: "$.Name"}, {Header: "Status", JSONPath: "$.Status"}, @@ -202,6 +209,155 @@ func hydrateSpec(message proto.Message) error { return nil } +func DownloadFileFromHTTP(ctx context.Context, ref storage.DataReference) (io.ReadCloser, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, ref.String(), nil) + if err != nil { + return nil, err + } + resp, err := Client.Do(req) + if err != nil { + return nil, err + } + return resp.Body, nil +} + +/* +Get file list from the args list. +If the archive flag is on then download the archives to temp directory and extract it. +The o/p of this function would be sorted list of the file locations. +*/ +func getSortedFileList(ctx context.Context, args []string) ([]string, string, error) { + if !filesConfig.Archive { + /* + * Sorting is required for non-archived case since its possible for the user to pass in a list of unordered + * serialized protobuf files , but flyte expects them to be registered in topologically sorted order that it had + * generated otherwise the registration can fail if the dependent files are not registered earlier. + */ + sort.Strings(args) + return args, "", nil + } + tempDir, err := ioutil.TempDir("/tmp", "register") + + if err != nil { + return nil, tempDir, err + } + dataRefs := args + var unarchivedFiles []string + for i := 0; i < len(dataRefs); i++ { + dataRefReaderCloser, err := getArchiveReaderCloser(ctx, dataRefs[i]) + if err != nil { + return unarchivedFiles, tempDir, err + } + archiveReader := tar.NewReader(dataRefReaderCloser) + if unarchivedFiles, err = readAndCopyArchive(archiveReader, tempDir, unarchivedFiles); err != nil { + return unarchivedFiles, tempDir, err + } + if err = dataRefReaderCloser.Close(); err != nil { + return unarchivedFiles, tempDir, err + } + } + /* + * Similarly in case of archived files, it possible to have an archive created in totally different order than the + * listing order of the serialized files which is required by flyte. Hence we explicitly sort here after unarchiving it. + */ + sort.Strings(unarchivedFiles) + return unarchivedFiles, tempDir, nil +} + +func readAndCopyArchive(src io.Reader, tempDir string, unarchivedFiles []string) ([]string, error) { + for { + tarReader := src.(*tar.Reader) + header, err := tarReader.Next() + switch { + case err == io.EOF: + return unarchivedFiles, nil + case err != nil: + return unarchivedFiles, err + } + // Location to untar. FilePath couldnt be used here due to, + // G305: File traversal when extracting zip archive + target := tempDir + "/" + header.Name + if header.Typeflag == tar.TypeDir { + if _, err := os.Stat(target); err != nil { + if err := os.MkdirAll(target, 0755); err != nil { + return unarchivedFiles, err + } + } + } else if header.Typeflag == tar.TypeReg { + dest, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode)) + if err != nil { + return unarchivedFiles, err + } + if _, err := io.Copy(dest, src); err != nil { + return unarchivedFiles, err + } + unarchivedFiles = append(unarchivedFiles, dest.Name()) + if err := dest.Close(); err != nil { + return unarchivedFiles, err + } + } + } +} + +func registerFile(ctx context.Context, fileName string, registerResults []Result, cmdCtx cmdCore.CommandContext) ([]Result, error) { + var registerResult Result + var fileContents []byte + var err error + if fileContents, err = ioutil.ReadFile(fileName); err != nil { + registerResults = append(registerResults, Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error reading file due to %v", err)}) + return registerResults, err + } + spec, err := unMarshalContents(ctx, fileContents, fileName) + if err != nil { + registerResult = Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error unmarshalling file due to %v", err)} + registerResults = append(registerResults, registerResult) + return registerResults, err + } + if err := hydrateSpec(spec); err != nil { + registerResult = Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error hydrating spec due to %v", err)} + registerResults = append(registerResults, registerResult) + return registerResults, err + } + logger.Debugf(ctx, "Hydrated spec : %v", getJSONSpec(spec)) + if err := register(ctx, spec, cmdCtx); err != nil { + registerResult = Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error registering file due to %v", err)} + registerResults = append(registerResults, registerResult) + return registerResults, err + } + registerResult = Result{Name: fileName, Status: "Success", Info: "Successfully registered file"} + logger.Debugf(ctx, "Successfully registered %v", fileName) + registerResults = append(registerResults, registerResult) + return registerResults, nil +} + +func getArchiveReaderCloser(ctx context.Context, ref string) (io.ReadCloser, error) { + dataRef := storage.DataReference(ref) + scheme, _, key, err := dataRef.Split() + segments := strings.Split(key, ".") + ext := segments[len(segments)-1] + if err != nil { + return nil, err + } + if ext != "tar" && ext != "tgz" { + return nil, errors.New("only .tar and .tgz extension archives are supported") + } + var dataRefReaderCloser io.ReadCloser + if scheme == "http" || scheme == "https" { + dataRefReaderCloser, err = DownloadFileFromHTTP(ctx, dataRef) + } else { + dataRefReaderCloser, err = os.Open(dataRef.String()) + } + if err != nil { + return nil, err + } + if ext == "tgz" { + if dataRefReaderCloser, err = gzip.NewReader(dataRefReaderCloser); err != nil { + return nil, err + } + } + return dataRefReaderCloser, err +} + func getJSONSpec(message proto.Message) string { marshaller := jsonpb.Marshaler{ EnumsAsInts: false, diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go new file mode 100644 index 0000000000..f551efc80c --- /dev/null +++ b/flytectl/cmd/register/register_util_test.go @@ -0,0 +1,198 @@ +package register + +import ( + "context" + "errors" + "fmt" + "net/http" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +type MockClient struct { + DoFunc func(req *http.Request) (*http.Response, error) +} + +func (m *MockClient) Do(req *http.Request) (*http.Response, error) { + return GetDoFunc(req) +} + +var ( + ctx context.Context + args []string + GetDoFunc func(req *http.Request) (*http.Response, error) +) + +func setup() { + ctx = context.Background() + Client = &MockClient{} + validTar, err := os.Open("testdata/valid-register.tar") + if err != nil { + fmt.Printf("unexpected error: %v", err) + os.Exit(-1) + } + response := &http.Response{ + Body: validTar, + } + GetDoFunc = func(*http.Request) (*http.Response, error) { + return response, nil + } +} + +func TestGetSortedFileList(t *testing.T) { + setup() + filesConfig.Archive = false + args = []string{"file2", "file1"} + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, "file1", fileList[0]) + assert.Equal(t, "file2", fileList[1]) + assert.Equal(t, tmpDir, "") + assert.Nil(t, err) +} + +func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { + setup() + filesConfig.Archive = true + args = []string{"testdata/valid-parent-folder-register.tar"} + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, len(fileList), 4) + assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) + assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) + assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "016_recipes.core.basic.basic_workflow.my_wf_2.pb"), fileList[2]) + assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "017_recipes.core.basic.basic_workflow.my_wf_3.pb"), fileList[3]) + assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) + assert.Nil(t, err) + // Clean up the temp directory. + assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) +} + +func TestGetSortedArchivedFileList(t *testing.T) { + setup() + filesConfig.Archive = true + args = []string{"testdata/valid-register.tar"} + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, len(fileList), 4) + assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) + assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) + assert.Equal(t, filepath.Join(tmpDir, "016_recipes.core.basic.basic_workflow.my_wf_2.pb"), fileList[2]) + assert.Equal(t, filepath.Join(tmpDir, "017_recipes.core.basic.basic_workflow.my_wf_3.pb"), fileList[3]) + assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) + assert.Nil(t, err) + // Clean up the temp directory. + assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) +} + +func TestGetSortedArchivedFileUnorderedList(t *testing.T) { + setup() + filesConfig.Archive = true + args = []string{"testdata/valid-unordered-register.tar"} + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, len(fileList), 4) + assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) + assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) + assert.Equal(t, filepath.Join(tmpDir, "016_recipes.core.basic.basic_workflow.my_wf_2.pb"), fileList[2]) + assert.Equal(t, filepath.Join(tmpDir, "017_recipes.core.basic.basic_workflow.my_wf_3.pb"), fileList[3]) + assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) + assert.Nil(t, err) + // Clean up the temp directory. + assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) +} + +func TestGetSortedArchivedCorruptedFileList(t *testing.T) { + setup() + filesConfig.Archive = true + args = []string{"testdata/invalid.tar"} + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, len(fileList), 0) + assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) + assert.NotNil(t, err) + // Clean up the temp directory. + assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) +} + +func TestGetSortedArchivedTgzList(t *testing.T) { + setup() + filesConfig.Archive = true + args = []string{"testdata/valid-register.tgz"} + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, len(fileList), 4) + assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) + assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) + assert.Equal(t, filepath.Join(tmpDir, "016_recipes.core.basic.basic_workflow.my_wf_2.pb"), fileList[2]) + assert.Equal(t, filepath.Join(tmpDir, "017_recipes.core.basic.basic_workflow.my_wf_3.pb"), fileList[3]) + assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) + assert.Nil(t, err) + // Clean up the temp directory. + assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) +} + +func TestGetSortedArchivedCorruptedTgzFileList(t *testing.T) { + setup() + filesConfig.Archive = true + args = []string{"testdata/invalid.tgz"} + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, 0, len(fileList)) + assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) + assert.NotNil(t, err) + // Clean up the temp directory. + assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) +} + +func TestGetSortedArchivedInvalidArchiveFileList(t *testing.T) { + setup() + filesConfig.Archive = true + args = []string{"testdata/invalid-extension-register.zip"} + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, 0, len(fileList)) + assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) + assert.NotNil(t, err) + assert.Equal(t, errors.New("only .tar and .tgz extension archives are supported"), err) + // Clean up the temp directory. + assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) +} + +func TestGetSortedArchivedFileThroughInvalidHttpList(t *testing.T) { + setup() + filesConfig.Archive = true + args = []string{"http://invalidhost:invalidport/testdata/valid-register.tar"} + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, 0, len(fileList)) + assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) + assert.NotNil(t, err) + // Clean up the temp directory. + assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) +} + +func TestGetSortedArchivedFileThroughValidHttpList(t *testing.T) { + setup() + filesConfig.Archive = true + args = []string{"http://dummyhost:80/testdata/valid-register.tar"} + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, len(fileList), 4) + assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) + assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) + assert.Equal(t, filepath.Join(tmpDir, "016_recipes.core.basic.basic_workflow.my_wf_2.pb"), fileList[2]) + assert.Equal(t, filepath.Join(tmpDir, "017_recipes.core.basic.basic_workflow.my_wf_3.pb"), fileList[3]) + assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) + assert.Nil(t, err) + // Clean up the temp directory. + assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) +} + +func TestGetSortedArchivedFileThroughValidHttpWithNullContextList(t *testing.T) { + setup() + filesConfig.Archive = true + args = []string{"http://dummyhost:80/testdata/valid-register.tar"} + ctx = nil + fileList, tmpDir, err := getSortedFileList(ctx, args) + assert.Equal(t, len(fileList), 0) + assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) + assert.NotNil(t, err) + assert.Equal(t, errors.New("net/http: nil Context"), err) + // Clean up the temp directory. + assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) +} diff --git a/flytectl/cmd/register/testdata/invalid-extension-register.zip b/flytectl/cmd/register/testdata/invalid-extension-register.zip new file mode 100644 index 0000000000..6dec9fb7eb --- /dev/null +++ b/flytectl/cmd/register/testdata/invalid-extension-register.zip @@ -0,0 +1 @@ +invalid extension file for register diff --git a/flytectl/cmd/register/testdata/invalid.tar b/flytectl/cmd/register/testdata/invalid.tar new file mode 100644 index 0000000000..5c9d15ea1c --- /dev/null +++ b/flytectl/cmd/register/testdata/invalid.tar @@ -0,0 +1 @@ +invalid tar file diff --git a/flytectl/cmd/register/testdata/invalid.tgz b/flytectl/cmd/register/testdata/invalid.tgz new file mode 100644 index 0000000000..3f37575e6a --- /dev/null +++ b/flytectl/cmd/register/testdata/invalid.tgz @@ -0,0 +1 @@ +invalid tgz file diff --git a/flytectl/cmd/register/testdata/valid-parent-folder-register.tar b/flytectl/cmd/register/testdata/valid-parent-folder-register.tar new file mode 100644 index 0000000000000000000000000000000000000000..5d3091b6f65964cb117503896c51cd34c6effae3 GIT binary patch literal 7168 zcmeHL&2HO95T@iLRX5E~*%WZu0;Poj0R)g*F8>mqVzhSZ!m$IxIpjnv$z{w+A_;O8 zSrFU@=%r8BC+H<_kXzd!6#=&5%8V@q20{Y%a%X0jJ3snnXHuH6n1@L}U|CmK&4V$v zO;Z+%(Z=P7i7_34Ry?w1V2#+s(sf&e>guIj0#MEgjIKC=N2(gXuXB zh=t)f^cm^B9)*(d$TRYFAJfzR$C~A4%#Tu*tA3I()uVajPyf54Bj%yWueQ3*B5!^PYO~$+^}Muppu0C^scI79}TW(rR4RSPv_Ga)G7V?+PuoC2L7a zE$E#Q(At}7?X`ilddS3C(l_P#?r_bGV(unGo(_5Eei9}G{}le4hHcmQ|0&`Sy}hw&NL%>B z7H?0%St&4CS{Frt*IQWCEEP+)rmT+eRA}S>&kzMLi}z1ugtYn-57F6Mp$Jz+ zNG4~A*Dot*bym1s!5@tc^kc3&-EMyz@}hKLeQy|*&GuPYBHe%n*kUKu P+}Z-Q1!@bdzykjPM9j+Q literal 0 HcmV?d00001 diff --git a/flytectl/cmd/register/testdata/valid-register.tar b/flytectl/cmd/register/testdata/valid-register.tar new file mode 100644 index 0000000000000000000000000000000000000000..ecfad5102f04c20016c900b500a7ba36050b24e7 GIT binary patch literal 6656 zcmeHLUvJws5SN{{OWF0GngJO%ppH>sfC0%QC0nhY8f;0MB29`Qd)SjeNmQfS77dAx zV;I>7*vmfMKEYo04feL}B-h)LrupMGY1&GFP4Vt1-knaryCb2tmx>_ni_8pUDomee zaWMJ!hBEC$T{$!r^{CnRwb?F0NZYn+8jOxZijlC%97u#RLTl6pCTq1U=F|wY2w_@{ z%(mUxRt+-6Q&6qn<2!K@ro02wBQ6k&q9f>2Qf>)(ZCpNnBp3SY3L4K>bUYr{Qt>j* zRLWH>6SJSnS0Yfg{eArPVO}VEJWhaBe{h=EX}t09U6E$62|Pi+(I2TDnHY*^9lWUP zpvyI4(zZ$PwF#@CJ=W^0=ob1CRk;2Is)7jI*!est=5u-_Ko8JO2-7%Go*bzDKl|{U?nsG1%8m~|Hx#?ZL&tKQz>nJ87OjW}JYts3+CUCz7z9y^`Szo>&+zU3 zs90@?JrN9)z&DLTbE7B2L090V6a9g2yk3#;p1@T_@w{Qg2`HRlG#;D9EjazQVNC2W z`l*QGJ$x6K6UvK%05Xe)k@DeGF64?&g%?2>Seu0>egMXFOX zFeHEQ4upd{^Y`$%EhN-AHU3-Yga4#WkHCMY#Q%$kMF9V~4+{Q&S1v*R(dru0T(=zeCo&1QELsr-;gbp1ix4Mp0V9zfwMx`r>}RhN5|9wln4wv#rHCnnfnXl!U2 z4?IOq;;_&*t`e87s>TQ4g-^#P;Dv9%8{oK<%Yab^yCCwHS|>io$vLk3J2t|$m$D%4 zvCIs3%1obTaWMY&20U#?9X>Dx_ORLWwcQCJ)Uxer-Z~CaEh6LlT$mtS#kMq(X44{0 z6%k81XjQb!_x+aonV_i*rPrk!aT2DqEpLAy=@vyhJZGFs^>h1=2)sW6MwOBdN26-W zp2nF-sfc-E_EP?g1){pO1ut*6g}h7SM4D>Xr&&Ao?;ie~rI~Ey6ZDh4q1fPwA!ycy zv$`&0IfhK!G7&sBHr2J;T5S=W0jEHT>c>G@y2uMVzYo;?j9v=Bb#PiP(>M_x?~7hv z=oggdx1HqG3~-~)P_TgWwl6NKXpV7dmW0xHSd;yF+gfd1RL*;8*;&EVP~fEz~UdzaIjxkAfGK z@^1NmW6HI&V+qjU?Vri=^fj=o0M(9#Nt1*NDp+Wa z>xdWilOTV$ms8oC>g1v!4T3zBqcATsWa~f=OSN}-miRAcNmQ0+@+?ol<7yg9L7ufg z&f2fZuD#EE$8AFWiu%1T!3!$BZx40#b82w_SW&Yh9o>WeTm3Ua*qNID*52?RweS!4 z?-cys4@vmX94P!hlnz1t(P|peTDAxGC?jhT`r7 zv9u#tCNiIjU?YDYOXaRy9uJh!h-vt;GzYF_mfL7_hLOmR4y@z%<4(xZ#$*o-kK_Rq SDpaV@e(NI)FQ=dY8UO$|{=rWG literal 0 HcmV?d00001 diff --git a/flytectl/cmd/register/testdata/valid-unordered-register.tar b/flytectl/cmd/register/testdata/valid-unordered-register.tar new file mode 100644 index 0000000000000000000000000000000000000000..4b845118c347049d284d68bc14373c318e41a98a GIT binary patch literal 6656 zcmeHK&2HO95GLjPxSQsWO#ydXpt2C4fB;gvOG-?5iqYDs3&#!&_s|ouB$qKOi7Sw+ z$b#TLKrel|K0z;igWlQ>sR*bYSCN&VgLqc6Y6JatCxfRMxSOL$I zaQg3$WY&#)a%A<#{wVfsYY=ElEJ8@faq1deU6+(s!lpE^KuAfQIv`~2w$0o+VRnbO zTAeI$)}^-$bHy_-ZP4e(Ng8Fm3*-e0)Z+L8{)|<6^2#{^*AHZ&pVrq5Jekxp@gm7p z##JIyYmmtwMX2hhr}(q;vPkxMl7gu5)q;uBeC_!!MV7-k@DSrK9ZaabQxi0-H8iGq z+II)&8P8IWk8&^Jeb1w={Rk4X&0L3hne2&H+#4$q57V%S6YnXJt32Q;JT7WQWF|x| z8kRyc;nC0fCi*hBy;iF?j+NP$k>~}(q!)>-6-wC+;D@gnV8FXtgmxCLf3}+Xr?!1T z{kN<7zlxkdzg~Y2>hB5q0)341z_^KOfJb^zP`spc18(Z*4ys9Nte0ZAD``^Fx>1v) z@tclnDKQSwURj~tL|HsdrQ%9N)?loTW$Mq$)>l05T5kp~MVlJYFe*&Bj=?O>PSIpt zUlyz$E_CD^ux$KMcuD_bFInm3ox;nHFuVW=qaGGs2UD+u2C!D|Ih)renxDh_C&s7v zlhVH1iuy^ad^uEup=#bMlLKK$4~PyZdRI|8|BEvSZ7+cTiurU&@P{ZBBi@|(kJ7e% ze*PnrRrr4u35I^ZwrWV5TiC{}DL9)2CgTmm0C>GYEZVUMzA+UwwI^DG{CkHefZ4eB zkB+cbKmhw?4S8iRmVc za~<6L|BDV2*FS+L7|Uz%|A2x@jgU09KCCWMY-KFk#;{%_)w- z@F?Qs1m6eYl=Hk~fX;?#W_&c$i@4%5MVl)bd~te2z?FzNrnHHe3Q$mqd!-U|8(A9w Date: Wed, 17 Feb 2021 21:54:39 +0530 Subject: [PATCH 024/645] Added command delete along with subcommand executions for terminating (#34) --- flytectl/cmd/delete/delete.go | 32 +++++ flytectl/cmd/delete/delete_test.go | 25 ++++ flytectl/cmd/delete/execution.go | 81 ++++++++++++ flytectl/cmd/delete/execution_test.go | 82 ++++++++++++ flytectl/cmd/root.go | 7 +- flytectl/cmd/update/update.go | 6 +- flytectl/cmd/update/update_test.go | 7 +- flytectl/docs/source/gen/flytectl.rst | 6 +- flytectl/docs/source/gen/flytectl_config.rst | 1 - .../source/gen/flytectl_config_discover.rst | 1 - .../source/gen/flytectl_config_validate.rst | 1 - flytectl/docs/source/gen/flytectl_delete.rst | 75 +++++++++++ .../source/gen/flytectl_delete_execution.rst | 117 ++++++++++++++++++ flytectl/docs/source/gen/flytectl_get.rst | 1 - .../source/gen/flytectl_get_execution.rst | 1 - .../source/gen/flytectl_get_launchplan.rst | 1 - .../docs/source/gen/flytectl_get_project.rst | 1 - .../docs/source/gen/flytectl_get_task.rst | 1 - .../docs/source/gen/flytectl_get_workflow.rst | 1 - .../docs/source/gen/flytectl_register.rst | 1 - .../source/gen/flytectl_register_files.rst | 1 - flytectl/docs/source/gen/flytectl_update.rst | 3 - .../source/gen/flytectl_update_project.rst | 5 +- flytectl/docs/source/gen/flytectl_version.rst | 1 - flytectl/go.mod | 1 + flytectl/go.sum | 1 + 26 files changed, 429 insertions(+), 31 deletions(-) create mode 100644 flytectl/cmd/delete/delete.go create mode 100644 flytectl/cmd/delete/delete_test.go create mode 100644 flytectl/cmd/delete/execution.go create mode 100644 flytectl/cmd/delete/execution_test.go create mode 100644 flytectl/docs/source/gen/flytectl_delete.rst create mode 100644 flytectl/docs/source/gen/flytectl_delete_execution.rst diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go new file mode 100644 index 0000000000..47eaf657e5 --- /dev/null +++ b/flytectl/cmd/delete/delete.go @@ -0,0 +1,32 @@ +package delete + +import ( + cmdcore "github.com/lyft/flytectl/cmd/core" + + "github.com/spf13/cobra" +) + +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + deleteCmdShort = `Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project.` + deleteCmdLong = ` +Example Delete executions. +:: + + bin/flytectl delete execution kxd1i72850 -d development -p flytesnacks +` +) + +// RemoteDeleteCommand will return delete command +func RemoteDeleteCommand() *cobra.Command { + deleteCmd := &cobra.Command{ + Use: "delete", + Short: deleteCmdShort, + Long: deleteCmdLong, + } + terminateResourcesFuncs := map[string]cmdcore.CommandEntry{ + "execution": {CmdFunc: terminateExecutionFunc, Aliases: []string{"executions"}, Short: execCmdShort, Long: execCmdLong}, + } + cmdcore.AddCommands(deleteCmd, terminateResourcesFuncs) + return deleteCmd +} diff --git a/flytectl/cmd/delete/delete_test.go b/flytectl/cmd/delete/delete_test.go new file mode 100644 index 0000000000..5543c88d28 --- /dev/null +++ b/flytectl/cmd/delete/delete_test.go @@ -0,0 +1,25 @@ +package delete + +import ( + "sort" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDeleteCommand(t *testing.T) { + deleteCommand := RemoteDeleteCommand() + assert.Equal(t, deleteCommand.Use, "delete") + assert.Equal(t, deleteCommand.Short, deleteCmdShort) + assert.Equal(t, deleteCommand.Long, deleteCmdLong) + assert.Equal(t, len(deleteCommand.Commands()), 1) + cmdNouns := deleteCommand.Commands() + // Sort by Use value. + sort.Slice(cmdNouns, func(i, j int) bool { + return cmdNouns[i].Use < cmdNouns[j].Use + }) + assert.Equal(t, cmdNouns[0].Use, "execution") + assert.Equal(t, cmdNouns[0].Aliases, []string{"executions"}) + assert.Equal(t, cmdNouns[0].Short, execCmdShort) + assert.Equal(t, cmdNouns[0].Long, execCmdLong) +} diff --git a/flytectl/cmd/delete/execution.go b/flytectl/cmd/delete/execution.go new file mode 100644 index 0000000000..90220e9a50 --- /dev/null +++ b/flytectl/cmd/delete/execution.go @@ -0,0 +1,81 @@ +package delete + +import ( + "context" + + "github.com/lyft/flytectl/cmd/config" + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" + "github.com/lyft/flytestdlib/logger" +) + +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + execCmdShort = `Terminate/Delete execution resources.` + execCmdLong = ` +Terminate executions.(execution,executions can be used interchangeably in these commands) + +Task executions can be aborted only if they are in non-terminal state i.e if they are FAILED,ABORTED or SUCCEEDED then +calling terminate on them has no effect. + +Terminate a single execution with its name + +:: + + bin/flytectl delete execution c6a51x2l9e -d development -p flytesnacks + +You can get executions to check its state. + +:: + + bin/flytectl get execution -d development -p flytesnacks + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | c6a51x2l9e | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:13:04.680476300Z | 15.540361300s | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + +Terminate multiple executions with there names +:: + + bin/flytectl delete execution eeam9s8sny p4wv4hwgc4 -d development -p flytesnacks + +Similarly you can get executions to find the state of previously terminated executions. + +:: + + bin/flytectl get execution -d development -p flytesnacks + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | c6a51x2l9e | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:13:04.680476300Z | 15.540361300s | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | eeam9s8sny | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:14:04.803084100Z | 42.306385500s | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | p4wv4hwgc4 | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:14:27.476307400Z | 19.727504400s | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + +Usage +` +) + +func terminateExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + for i := 0; i < len(args); i++ { + name := args[i] + logger.Infof(ctx, "Terminating execution of %v execution ", name) + _, err := cmdCtx.AdminClient().TerminateExecution(ctx, &admin.ExecutionTerminateRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: name, + }, + }) + if err != nil { + logger.Errorf(ctx, "Failed in terminating execution of %v execution due to %v ", name, err) + return err + } + logger.Infof(ctx, "Terminated execution of %v execution ", name) + } + return nil +} diff --git a/flytectl/cmd/delete/execution_test.go b/flytectl/cmd/delete/execution_test.go new file mode 100644 index 0000000000..41e5f04085 --- /dev/null +++ b/flytectl/cmd/delete/execution_test.go @@ -0,0 +1,82 @@ +package delete + +import ( + "context" + "errors" + "io" + "testing" + + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flyteidl/clients/go/admin/mocks" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" + + "github.com/stretchr/testify/assert" +) + +var ( + ctx context.Context + args []string +) + +func setup() { + ctx = context.Background() + args = []string{} +} + +func TestTerminateExecutionFunc(t *testing.T) { + setup() + args = append(args, "exec1", "exec2") + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + terminateExecRequests := []*admin.ExecutionTerminateRequest{ + {Id: &core.WorkflowExecutionIdentifier{Name: "exec1"}}, + {Id: &core.WorkflowExecutionIdentifier{Name: "exec2"}}, + } + terminateExecResponse := &admin.ExecutionTerminateResponse{} + mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[0]).Return(terminateExecResponse, nil) + mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[1]).Return(terminateExecResponse, nil) + err := terminateExecutionFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[0]) + mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[1]) +} + +func TestTerminateExecutionFuncWithError(t *testing.T) { + setup() + args = append(args, "exec1", "exec2") + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + terminateExecRequests := []*admin.ExecutionTerminateRequest{ + {Id: &core.WorkflowExecutionIdentifier{Name: "exec1"}}, + {Id: &core.WorkflowExecutionIdentifier{Name: "exec2"}}, + } + terminateExecResponse := &admin.ExecutionTerminateResponse{} + mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[0]).Return(nil, errors.New("failed to terminate")) + mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[1]).Return(terminateExecResponse, nil) + err := terminateExecutionFunc(ctx, args, cmdCtx) + assert.Equal(t, errors.New("failed to terminate"), err) + mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[0]) + mockClient.AssertNotCalled(t, "TerminateExecution", ctx, terminateExecRequests[1]) +} + +func TestTerminateExecutionFuncWithPartialSuccess(t *testing.T) { + setup() + args = append(args, "exec1", "exec2") + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + terminateExecRequests := []*admin.ExecutionTerminateRequest{ + {Id: &core.WorkflowExecutionIdentifier{Name: "exec1"}}, + {Id: &core.WorkflowExecutionIdentifier{Name: "exec2"}}, + } + terminateExecResponse := &admin.ExecutionTerminateResponse{} + mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[0]).Return(terminateExecResponse, nil) + mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[1]).Return(nil, errors.New("failed to terminate")) + err := terminateExecutionFunc(ctx, args, cmdCtx) + assert.Equal(t, errors.New("failed to terminate"), err) + mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[0]) + mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[1]) +} diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index b666b29b90..4ce6159973 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -4,17 +4,18 @@ import ( "context" "fmt" + "github.com/lyft/flytectl/cmd/config" + "github.com/lyft/flytectl/cmd/delete" "github.com/lyft/flytectl/cmd/get" "github.com/lyft/flytectl/cmd/register" "github.com/lyft/flytectl/cmd/update" "github.com/lyft/flytectl/pkg/printer" stdConfig "github.com/lyft/flytestdlib/config" "github.com/lyft/flytestdlib/config/viper" + "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/cobra/doc" - - "github.com/lyft/flytectl/cmd/config" ) var ( @@ -28,6 +29,7 @@ func newRootCmd() *cobra.Command { Long: "flytectl is CLI tool written in go to interact with flyteadmin service", Short: "flyetcl CLI tool", Use: "flytectl", + DisableAutoGenTag: true, } rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", @@ -45,6 +47,7 @@ func newRootCmd() *cobra.Command { rootCmd.AddCommand(get.CreateGetCommand()) rootCmd.AddCommand(update.CreateUpdateCommand()) rootCmd.AddCommand(register.RemoteRegisterCommand()) + rootCmd.AddCommand(delete.RemoteDeleteCommand()) config.GetConfig() return rootCmd diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index f165512740..f88d0ff3aa 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -8,10 +8,8 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - updateUse = "update" - updateShort = ` -Used for updating flyte resources eg: project. -` + updateUse = "update" + updateShort = `Used for updating flyte resources eg: project.` updatecmdLong = ` Currently this command only provides subcommands to update project. Takes input project which need to be archived or unarchived. Name of the project to be updated is mandatory field. diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index 816c094875..c54701f40a 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -9,8 +9,9 @@ import ( func TestUpdateCommand(t *testing.T) { updateCommand := CreateUpdateCommand() - assert.Equal(t, updateCommand.Use, "update") - assert.Equal(t, updateCommand.Short, "\nUsed for updating flyte resources eg: project.\n") + assert.Equal(t, updateCommand.Use, updateUse) + assert.Equal(t, updateCommand.Short, updateShort) + assert.Equal(t, updateCommand.Long, updatecmdLong) assert.Equal(t, len(updateCommand.Commands()), 1) cmdNouns := updateCommand.Commands() // Sort by Use value. @@ -19,4 +20,6 @@ func TestUpdateCommand(t *testing.T) { }) assert.Equal(t, cmdNouns[0].Use, "project") assert.Equal(t, cmdNouns[0].Aliases, []string{"projects"}) + assert.Equal(t, cmdNouns[0].Short, projectShort) + assert.Equal(t, cmdNouns[0].Long, projectLong) } diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 98c2e98d86..ee262c6ec4 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -60,11 +60,9 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. -* :doc:`flytectl_update` - -Used for updating flyte resources eg: project. - +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. * :doc:`flytectl_version` - Displays version information for the client and server. -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index a8dcaff897..d3bf35e5bf 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -71,4 +71,3 @@ SEE ALSO * :doc:`flytectl_config_discover` - Searches for a config in one of the default search paths. * :doc:`flytectl_config_validate` - Validates the loaded config. -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index c8d945e1d5..2ce677324c 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -73,4 +73,3 @@ SEE ALSO * :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index e7fd55fe82..ac0f848d42 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -75,4 +75,3 @@ SEE ALSO * :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst new file mode 100644 index 0000000000..f9c3e5b589 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -0,0 +1,75 @@ +.. _flytectl_delete: + +flytectl delete +--------------- + +Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. + +Synopsis +~~~~~~~~ + + + +Example Delete executions. +:: + + bin/flytectl delete execution kxd1i72850 -d development -p flytesnacks + + +Options +~~~~~~~ + +:: + + -h, --help help for delete + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_delete_execution` - Terminate/Delete execution resources. + diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst new file mode 100644 index 0000000000..d606658174 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -0,0 +1,117 @@ +.. _flytectl_delete_execution: + +flytectl delete execution +------------------------- + +Terminate/Delete execution resources. + +Synopsis +~~~~~~~~ + + + +Terminate executions.(execution,executions can be used interchangeably in these commands) + +Task executions can be aborted only if they are in non-terminal state i.e if they are FAILED,ABORTED or SUCCEEDED then +calling terminate on them has no effect. + +Terminate a single execution with its name + +:: + + bin/flytectl delete execution c6a51x2l9e -d development -p flytesnacks + +You can get executions to check its state. + +:: + + bin/flytectl get execution -d development -p flytesnacks + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | c6a51x2l9e | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:13:04.680476300Z | 15.540361300s | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + +Terminate multiple executions with there names +:: + + bin/flytectl delete execution eeam9s8sny p4wv4hwgc4 -d development -p flytesnacks + +Similarly you can get executions to find the state of previously terminated executions. + +:: + + bin/flytectl get execution -d development -p flytesnacks + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | c6a51x2l9e | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:13:04.680476300Z | 15.540361300s | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | eeam9s8sny | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:14:04.803084100Z | 42.306385500s | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + | p4wv4hwgc4 | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:14:27.476307400Z | 19.727504400s | + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + +Usage + + +:: + + flytectl delete execution [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for execution + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index a1f3bf0958..ae7a6ae65d 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -77,4 +77,3 @@ SEE ALSO * :doc:`flytectl_get_task` - Gets task resources * :doc:`flytectl_get_workflow` - Gets workflow resources -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 1d920920ef..c623b62409 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -101,4 +101,3 @@ SEE ALSO * :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index ec077f41b8..8ad77613a5 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -101,4 +101,3 @@ SEE ALSO * :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 5bc2c48e40..17c5d35b3a 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -101,4 +101,3 @@ SEE ALSO * :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index a5ea0f978c..01587b65ab 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -101,4 +101,3 @@ SEE ALSO * :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 82d0b3edd1..e27166be70 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -101,4 +101,3 @@ SEE ALSO * :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 1f031fec23..19179afdfc 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -73,4 +73,3 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_register_files` - Registers file resources -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 23135a982c..01074e4dc8 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -118,4 +118,3 @@ SEE ALSO * :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index a0dd80e5fc..0424744484 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -3,10 +3,8 @@ flytectl update --------------- - Used for updating flyte resources eg: project. - Synopsis ~~~~~~~~ @@ -77,4 +75,3 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_update_project` - Updates project resources -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 0db111a1ab..5df7744a40 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -114,8 +114,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - -Used for updating flyte resources eg: project. +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. - -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 11247bb736..cbcf99db64 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -71,4 +71,3 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool -*Auto generated by spf13/cobra on 16-Feb-2021* diff --git a/flytectl/go.mod b/flytectl/go.mod index b2617470b1..5f46438ddc 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -5,6 +5,7 @@ go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect github.com/ghodss/yaml v1.0.0 + github.com/golang/mock v1.3.1 github.com/golang/protobuf v1.3.2 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 diff --git a/flytectl/go.sum b/flytectl/go.sum index 8716cb318d..41fc86466b 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -129,6 +129,7 @@ github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18h github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= From d7e0624911b2830df6c092e806ca16a760bc7419 Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Thu, 18 Feb 2021 01:04:21 +0530 Subject: [PATCH 025/645] Added Create command (#17) --- flytectl/cmd/create/create.go | 32 ++++ flytectl/cmd/create/create_test.go | 23 +++ flytectl/cmd/create/project.go | 95 ++++++++++ flytectl/cmd/create/project_test.go | 102 +++++++++++ flytectl/cmd/create/projectconfig_flags.go | 59 ++++++ .../cmd/create/projectconfig_flags_test.go | 172 ++++++++++++++++++ flytectl/cmd/create/type.go | 8 + flytectl/cmd/root.go | 2 + flytectl/docs/source/gen/flytectl.rst | 1 + flytectl/docs/source/gen/flytectl_create.rst | 75 ++++++++ .../source/gen/flytectl_create_project.rst | 98 ++++++++++ flytectl/docs/source/index.rst | 4 +- flytectl/go.mod | 3 +- flytectl/go.sum | 27 ++- flytectl/main.go | 8 +- 15 files changed, 697 insertions(+), 12 deletions(-) create mode 100644 flytectl/cmd/create/create.go create mode 100644 flytectl/cmd/create/create_test.go create mode 100644 flytectl/cmd/create/project.go create mode 100644 flytectl/cmd/create/project_test.go create mode 100755 flytectl/cmd/create/projectconfig_flags.go create mode 100755 flytectl/cmd/create/projectconfig_flags_test.go create mode 100644 flytectl/cmd/create/type.go create mode 100644 flytectl/docs/source/gen/flytectl_create.rst create mode 100644 flytectl/docs/source/gen/flytectl_create_project.rst diff --git a/flytectl/cmd/create/create.go b/flytectl/cmd/create/create.go new file mode 100644 index 0000000000..51d487fc7b --- /dev/null +++ b/flytectl/cmd/create/create.go @@ -0,0 +1,32 @@ +package create + +import ( + cmdcore "github.com/lyft/flytectl/cmd/core" + "github.com/spf13/cobra" +) + +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + createCmdShort = `Used for creating various flyte resources including tasks/workflows/launchplans/executions/project.` + createCmdLong = ` +Example create. +:: + + bin/flytectl create project --file project.yaml +` +) + +// CreateCommand will return create command +func RemoteCreateCommand() *cobra.Command { + createCmd := &cobra.Command{ + Use: "create", + Short: createCmdShort, + Long: createCmdLong, + } + createResourcesFuncs := map[string]cmdcore.CommandEntry{ + "project": {CmdFunc: createProjectsCommand, Aliases: []string{"projects"}, ProjectDomainNotRequired: true, PFlagProvider: projectConfig, Short: projectShort, + Long: projectLong}, + } + cmdcore.AddCommands(createCmd, createResourcesFuncs) + return createCmd +} diff --git a/flytectl/cmd/create/create_test.go b/flytectl/cmd/create/create_test.go new file mode 100644 index 0000000000..fb0d58a535 --- /dev/null +++ b/flytectl/cmd/create/create_test.go @@ -0,0 +1,23 @@ +package create + +import ( + "sort" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCreateCommand(t *testing.T) { + createCommand := RemoteCreateCommand() + assert.Equal(t, createCommand.Use, "create") + assert.Equal(t, createCommand.Short, "Used for creating various flyte resources including tasks/workflows/launchplans/executions/project.") + assert.Equal(t, len(createCommand.Commands()), 1) + cmdNouns := createCommand.Commands() + // Sort by Use value. + sort.Slice(cmdNouns, func(i, j int) bool { + return cmdNouns[i].Use < cmdNouns[j].Use + }) + assert.Equal(t, cmdNouns[0].Use, "project") + assert.Equal(t, cmdNouns[0].Aliases, []string{"projects"}) + assert.Equal(t, cmdNouns[0].Short, "Create project resources") +} diff --git a/flytectl/cmd/create/project.go b/flytectl/cmd/create/project.go new file mode 100644 index 0000000000..93a444ea8c --- /dev/null +++ b/flytectl/cmd/create/project.go @@ -0,0 +1,95 @@ +package create + +import ( + "context" + "fmt" + "io/ioutil" + + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "gopkg.in/yaml.v2" + + cmdCore "github.com/lyft/flytectl/cmd/core" +) + +const ( + projectShort = "Create project resources" + projectLong = ` +Create the projects.(project,projects can be used interchangeably in these commands) + +:: + + bin/flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte + +Create Project by definition file +:: + + bin/flytectl create project --file project.yaml + +.. code-block:: yaml + + id: "project-unique-id" + name: "Friendly name" + labels: + app: flyte + description: "Some description for the project" + +` +) + +//go:generate pflags ProjectConfig --default-var projectConfig --bind-default-var + +// ProjectConfig Config hold configuration for project create flags. +type ProjectConfig struct { + ID string `json:"id" pflag:",id for the project specified as argument."` + Name string `json:"name" pflag:",name for the project specified as argument."` + File string `json:"file" pflag:",file for the project definition."` + Description string `json:"description" pflag:",description for the project specified as argument."` + Labels map[string]string `json:"labels" pflag:",labels for the project specified as argument."` +} + +var ( + projectConfig = &ProjectConfig{ + Description: "", + Labels: map[string]string{}, + } +) + +func createProjectsCommand(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + project := projectDefinition{} + if projectConfig.File != "" { + yamlFile, err := ioutil.ReadFile(projectConfig.File) + if err != nil { + return err + } + err = yaml.Unmarshal(yamlFile, &project) + if err != nil { + return err + } + } else { + project.ID = projectConfig.ID + project.Name = projectConfig.Name + project.Description = projectConfig.Description + project.Labels = projectConfig.Labels + } + if project.ID == "" { + return fmt.Errorf("project ID is required flag") + } + if project.Name == "" { + return fmt.Errorf("project name is required flag") + } + _, err := cmdCtx.AdminClient().RegisterProject(ctx, &admin.ProjectRegisterRequest{ + Project: &admin.Project{ + Id: project.ID, + Name: project.Name, + Description: project.Description, + Labels: &admin.Labels{ + Values: project.Labels, + }, + }, + }) + if err != nil { + return err + } + fmt.Println("project Created successfully") + return nil +} diff --git a/flytectl/cmd/create/project_test.go b/flytectl/cmd/create/project_test.go new file mode 100644 index 0000000000..e43e9124a5 --- /dev/null +++ b/flytectl/cmd/create/project_test.go @@ -0,0 +1,102 @@ +package create + +import ( + "bytes" + "context" + "io" + "log" + "os" + "testing" + + cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/lyft/flyteidl/clients/go/admin/mocks" + "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/stretchr/testify/assert" +) + +const projectValue = "dummyProject" + +var ( + reader *os.File + writer *os.File + err error + ctx context.Context + mockClient *mocks.AdminServiceClient + mockOutStream io.Writer + args []string + cmdCtx cmdCore.CommandContext + projectRegisterRequest *admin.ProjectRegisterRequest + stdOut *os.File + stderr *os.File +) + +func setup() { + reader, writer, err = os.Pipe() + if err != nil { + panic(err) + } + stdOut = os.Stdout + stderr = os.Stderr + os.Stdout = writer + os.Stderr = writer + log.SetOutput(writer) + mockClient = new(mocks.AdminServiceClient) + mockOutStream = writer + cmdCtx = cmdCore.NewCommandContext(mockClient, mockOutStream) + projectRegisterRequest = &admin.ProjectRegisterRequest{ + Project: &admin.Project{ + Id: projectValue, + Name: projectValue, + Description: "", + Labels: &admin.Labels{ + Values: map[string]string{}, + }, + }, + } +} + +func teardownAndVerify(t *testing.T, expectedLog string) { + writer.Close() + os.Stdout = stdOut + os.Stderr = stderr + var buf bytes.Buffer + if _, err := io.Copy(&buf, reader); err != nil { + assert.Equal(t, expectedLog, buf.String()) + } +} + +func TestCreateProjectFunc(t *testing.T) { + setup() + defer teardownAndVerify(t, "project Created successfully") + projectConfig.ID = projectValue + projectConfig.Name = projectValue + projectConfig.Labels = map[string]string{} + projectConfig.Description = "" + mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) + err := createProjectsCommand(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "RegisterProject", ctx, projectRegisterRequest) +} + +func TestEmptyProjectID(t *testing.T) { + setup() + defer teardownAndVerify(t, "project ID is required flag") + projectConfig.Name = projectValue + projectConfig.Labels = map[string]string{} + mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) + err := createProjectsCommand(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "RegisterProject", ctx, projectRegisterRequest) +} + +func TestEmptyProjectName(t *testing.T) { + setup() + defer teardownAndVerify(t, "project ID is required flag") + projectConfig.ID = projectValue + projectConfig.Labels = map[string]string{} + projectConfig.Description = "" + mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) + err := createProjectsCommand(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "RegisterProject", ctx, projectRegisterRequest) +} diff --git a/flytectl/cmd/create/projectconfig_flags.go b/flytectl/cmd/create/projectconfig_flags.go new file mode 100755 index 0000000000..db17e4882b --- /dev/null +++ b/flytectl/cmd/create/projectconfig_flags.go @@ -0,0 +1,59 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package create + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (ProjectConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (ProjectConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (ProjectConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in ProjectConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg ProjectConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("ProjectConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(projectConfig.ID), fmt.Sprintf("%v%v", prefix, "id"), *new(string), "id for the project specified as argument.") + cmdFlags.StringVar(&(projectConfig.Name), fmt.Sprintf("%v%v", prefix, "name"), *new(string), "name for the project specified as argument.") + cmdFlags.StringVar(&(projectConfig.File), fmt.Sprintf("%v%v", prefix, "file"), *new(string), "file for the project definition.") + cmdFlags.StringVar(&(projectConfig.Description), fmt.Sprintf("%v%v", prefix, "description"), *new(string), "description for the project specified as argument.") + cmdFlags.StringToStringVar(&(projectConfig.Labels), fmt.Sprintf("%v%v", prefix, "labels"), map[string]string{}, "labels for the project specified as argument.") + return cmdFlags +} diff --git a/flytectl/cmd/create/projectconfig_flags_test.go b/flytectl/cmd/create/projectconfig_flags_test.go new file mode 100755 index 0000000000..8d90bc5cd7 --- /dev/null +++ b/flytectl/cmd/create/projectconfig_flags_test.go @@ -0,0 +1,172 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package create + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsProjectConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementProjectConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsProjectConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookProjectConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementProjectConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_ProjectConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookProjectConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_ProjectConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_ProjectConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_ProjectConfig(val, result)) +} + +func testDecodeRaw_ProjectConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_ProjectConfig(vStringSlice, result)) +} + +func TestProjectConfig_GetPFlagSet(t *testing.T) { + val := ProjectConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestProjectConfig_SetFlags(t *testing.T) { + actual := ProjectConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_id", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("id", testValue) + if vString, err := cmdFlags.GetString("id"); err == nil { + testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vString), &actual.ID) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_name", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("name", testValue) + if vString, err := cmdFlags.GetString("name"); err == nil { + testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vString), &actual.Name) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_file", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("file", testValue) + if vString, err := cmdFlags.GetString("file"); err == nil { + testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vString), &actual.File) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_description", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("description", testValue) + if vString, err := cmdFlags.GetString("description"); err == nil { + testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vString), &actual.Description) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_labels", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "a=1,b=2" + + cmdFlags.Set("labels", testValue) + if vStringToString, err := cmdFlags.GetStringToString("labels"); err == nil { + testDecodeRaw_ProjectConfig(t, vStringToString, &actual.Labels) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/create/type.go b/flytectl/cmd/create/type.go new file mode 100644 index 0000000000..61709eb6ef --- /dev/null +++ b/flytectl/cmd/create/type.go @@ -0,0 +1,8 @@ +package create + +type projectDefinition struct { + ID string `yaml:"id"` + Name string `yaml:"name"` + Description string `yaml:"description"` + Labels map[string]string `yaml:"labels"` +} diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 4ce6159973..572dc7d058 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/lyft/flytectl/cmd/config" + "github.com/lyft/flytectl/cmd/create" "github.com/lyft/flytectl/cmd/delete" "github.com/lyft/flytectl/cmd/get" "github.com/lyft/flytectl/cmd/register" @@ -45,6 +46,7 @@ func newRootCmd() *cobra.Command { rootCmd.AddCommand(viper.GetConfigCommand()) rootCmd.AddCommand(versionCmd) rootCmd.AddCommand(get.CreateGetCommand()) + rootCmd.AddCommand(create.RemoteCreateCommand()) rootCmd.AddCommand(update.CreateUpdateCommand()) rootCmd.AddCommand(register.RemoteRegisterCommand()) rootCmd.AddCommand(delete.RemoteDeleteCommand()) diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index ee262c6ec4..70c8b01eba 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -60,6 +60,7 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`flytectl_create` - Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst new file mode 100644 index 0000000000..dbd0218ae4 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -0,0 +1,75 @@ +.. _flytectl_create: + +flytectl create +--------------- + +Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. + +Synopsis +~~~~~~~~ + + + +Example create. +:: + + bin/flytectl create project --file project.yaml + + +Options +~~~~~~~ + +:: + + -h, --help help for create + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_create_project` - Create project resources + diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst new file mode 100644 index 0000000000..26b8b4e557 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -0,0 +1,98 @@ +.. _flytectl_create_project: + +flytectl create project +----------------------- + +Create project resources + +Synopsis +~~~~~~~~ + + + +Create the projects.(project,projects can be used interchangeably in these commands) + +:: + + bin/flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte + +Create Project by definition file +:: + + bin/flytectl create project --file project.yaml + +.. code-block:: yaml + + id: "project-unique-id" + name: "Friendly name" + labels: + app: flyte + description: "Some description for the project" + + + +:: + + flytectl create project [flags] + +Options +~~~~~~~ + +:: + + --description string description for the project specified as argument. + --file string file for the project definition. + -h, --help help for project + --id string id for the project specified as argument. + --labels stringToString labels for the project specified as argument. (default []) + --name string name for the project specified as argument. + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_create` - Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 581884254d..00a24536a7 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -47,7 +47,8 @@ Basic Configuration .. toctree:: :maxdepth: 1 :caption: Flytectl verbs - + + gen/flytectl_create gen/flytectl_get gen/flytectl_update gen/flytectl_delete @@ -58,6 +59,7 @@ Basic Configuration :maxdepth: 1 :caption: Flytectl nouns + gen/flytectl_create_project gen/flytectl_get_execution gen/flytectl_get_project gen/flytectl_get_workflow diff --git a/flytectl/go.mod b/flytectl/go.mod index 5f46438ddc..3c1d85d0d9 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -5,7 +5,6 @@ go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect github.com/ghodss/yaml v1.0.0 - github.com/golang/mock v1.3.1 github.com/golang/protobuf v1.3.2 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 @@ -19,8 +18,8 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.4.0 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 - go.uber.org/zap v1.10.0 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 // indirect google.golang.org/grpc v1.26.0 + gopkg.in/yaml.v2 v2.2.8 k8s.io/apimachinery v0.18.3 // indirect ) diff --git a/flytectl/go.sum b/flytectl/go.sum index 41fc86466b..bc1a758eb3 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -1,4 +1,3 @@ -<<<<<<< Updated upstream cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -28,15 +27,19 @@ github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSW github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= @@ -60,6 +63,7 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -84,6 +88,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= @@ -120,6 +125,7 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -129,7 +135,6 @@ github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18h github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -141,6 +146,7 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -157,6 +163,7 @@ github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/graymeta/stow v0.2.4 h1:qDGstknYXqcnmBQ5TRJtxD9Qv1MuRbYRhLoSMeUDs7U= @@ -178,6 +185,7 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb v1.7.9/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= @@ -188,6 +196,7 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 h1:M8exrBzuhWcU6aoHJlHWPe4qFjVKzkMGRal78f5jRRU= @@ -196,18 +205,17 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= -github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1 h1:SH30nioTpP0VaCYafgUw+iS1EfJTDbtAeBcByEFqFrY= -github.com/landoop/tableprinter v0.0.0-20200104100433-ae9249991eb1/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= -github.com/lyft/flyteidl v0.18.1 h1:COKkZi5k6bQvUYOk5gE70+FJX9/NUn0WOQ1uMrw3Qio= -github.com/lyft/flyteidl v0.18.1/go.mod h1:/zQXxuHO11u/saxTTZc8oYExIGEShXB+xCB1/F1Cu20= github.com/lyft/flyteidl v0.18.11 h1:24NaFYWxANhRbwKfvkgu8axGTWUcl1tgZBqNJutKNJ8= github.com/lyft/flyteidl v0.18.11/go.mod h1:/zQXxuHO11u/saxTTZc8oYExIGEShXB+xCB1/F1Cu20= github.com/lyft/flytestdlib v0.3.0/go.mod h1:LJPPJlkFj+wwVWMrQT3K5JZgNhZi2mULsCG4ZYhinhU= @@ -296,9 +304,12 @@ github.com/satori/uuid v1.2.0/go.mod h1:B8HLsPLik/YNn6KKWVMDJ8nzCL8RP5WyfsnmvnAE github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= @@ -343,7 +354,6 @@ go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -467,6 +477,7 @@ golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200124170513-3f4d10fc73b4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -478,6 +489,7 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -501,6 +513,7 @@ google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= diff --git a/flytectl/main.go b/flytectl/main.go index d6dbf7f4ad..5bc6a6fddc 100644 --- a/flytectl/main.go +++ b/flytectl/main.go @@ -1,9 +1,13 @@ package main -import "github.com/lyft/flytectl/cmd" +import ( + "fmt" + + "github.com/lyft/flytectl/cmd" +) func main() { if err := cmd.ExecuteCmd(); err != nil { - panic(err) + fmt.Printf("error: %v", err) } } From a2c4dd3149379dd77212764d90d04e07a8b6581d Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Wed, 17 Feb 2021 13:53:12 -0800 Subject: [PATCH 026/645] Pygments style should default to material (#35) --- flytectl/docs/source/conf.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 29fba17e72..c346003f67 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -75,10 +75,6 @@ # This pattern also affects html_static_path and html_extra_path . exclude_patterns = [] -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - - # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for From 3eb2ea3a35d196cc4b9fa59d675b57fd33c836ba Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Thu, 25 Feb 2021 08:18:12 +0530 Subject: [PATCH 027/645] Flytectl Doc fixes (#38) * Flytectl Doc fixes * removed tab characters Co-authored-by: pmahindrakar --- flytectl/cmd/create/project.go | 12 ++++++------ flytectl/cmd/get/execution.go | 2 +- flytectl/cmd/get/launch_plan.go | 2 +- flytectl/cmd/get/task.go | 2 +- flytectl/cmd/get/workflow.go | 2 +- flytectl/cmd/update/project.go | 2 +- flytectl/docs/source/gen/flytectl_create_project.rst | 12 ++++++------ flytectl/docs/source/gen/flytectl_get_execution.rst | 2 +- flytectl/docs/source/gen/flytectl_get_launchplan.rst | 2 +- flytectl/docs/source/gen/flytectl_get_task.rst | 2 +- flytectl/docs/source/gen/flytectl_get_workflow.rst | 2 +- flytectl/docs/source/gen/flytectl_update_project.rst | 2 +- 12 files changed, 22 insertions(+), 22 deletions(-) diff --git a/flytectl/cmd/create/project.go b/flytectl/cmd/create/project.go index 93a444ea8c..776be99056 100644 --- a/flytectl/cmd/create/project.go +++ b/flytectl/cmd/create/project.go @@ -20,18 +20,18 @@ Create the projects.(project,projects can be used interchangeably in these comma bin/flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte -Create Project by definition file +Create Project by definition file. Note: The name shouldn't contain any whitespace characters' :: bin/flytectl create project --file project.yaml .. code-block:: yaml - id: "project-unique-id" - name: "Friendly name" - labels: - app: flyte - description: "Some description for the project" + id: "project-unique-id" + name: "Name" + labels: + app: flyte + description: "Some description for the project" ` ) diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 0c22e5674e..67ef82b9ac 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -26,7 +26,7 @@ Retrieves execution by name within project and domain. :: - bin/flytectl execution -p flytesnacks -d development oeh94k9r2r + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r Retrieves execution by filters :: diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 8706a36271..eb4d292e20 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -24,7 +24,7 @@ Retrieves launch plan by name within project and domain. :: - bin/flytectl launchplan -p flytesnacks -d development recipes.core.basic.lp.my_wf + bin/flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet Retrieves launchplan by filters. :: diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 96631d1741..054225e413 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -27,7 +27,7 @@ Retrieves task by name within project and domain. :: - bin/flytectl task -p flytesnacks -d development square + bin/flytectl task -p flytesnacks -d development core.basic.lp.greet Retrieves project by filters. :: diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 857df5bf5b..322a3af0c0 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -26,7 +26,7 @@ Retrieves workflow by name within project and domain. :: - bin/flytectl workflow -p flytesnacks -d development recipes.plugins.k8s_spark.pyspark_pi.my_spark + bin/flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet Retrieves workflow by filters. :: diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index c421dddd2b..15c1c9dc73 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -30,7 +30,7 @@ Archives project named flytesnacks. :: - bin/flytectl get project flytesnacks --archiveProject + bin/flytectl update project -p flytesnacks --archiveProject Activates project named flytesnacks using short option -t. :: diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index 26b8b4e557..3b1aa15100 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -16,18 +16,18 @@ Create the projects.(project,projects can be used interchangeably in these comma bin/flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte -Create Project by definition file +Create Project by definition file. Note: The name shouldn't contain any whitespace characters' :: bin/flytectl create project --file project.yaml .. code-block:: yaml - id: "project-unique-id" - name: "Friendly name" - labels: - app: flyte - description: "Some description for the project" + id: "project-unique-id" + name: "Name" + labels: + app: flyte + description: "Some description for the project" diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index c623b62409..48a01189cc 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -19,7 +19,7 @@ Retrieves execution by name within project and domain. :: - bin/flytectl execution -p flytesnacks -d development oeh94k9r2r + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r Retrieves execution by filters :: diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 8ad77613a5..ab832ed6b5 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -19,7 +19,7 @@ Retrieves launch plan by name within project and domain. :: - bin/flytectl launchplan -p flytesnacks -d development recipes.core.basic.lp.my_wf + bin/flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet Retrieves launchplan by filters. :: diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 01587b65ab..3037d96055 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -19,7 +19,7 @@ Retrieves task by name within project and domain. :: - bin/flytectl task -p flytesnacks -d development square + bin/flytectl task -p flytesnacks -d development core.basic.lp.greet Retrieves project by filters. :: diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index e27166be70..4b4a996b2c 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -19,7 +19,7 @@ Retrieves workflow by name within project and domain. :: - bin/flytectl workflow -p flytesnacks -d development recipes.plugins.k8s_spark.pyspark_pi.my_spark + bin/flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet Retrieves workflow by filters. :: diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 5df7744a40..d3b2d44096 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -20,7 +20,7 @@ Archives project named flytesnacks. :: - bin/flytectl get project flytesnacks --archiveProject + bin/flytectl update project -p flytesnacks --archiveProject Activates project named flytesnacks using short option -t. :: From caf9bbc995a6022fa19a0caf5f8699ecbbc8eeaf Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Thu, 4 Mar 2021 01:26:36 +0530 Subject: [PATCH 028/645] Fix goreleaser (#40) Signed-off-by: Yuvraj --- flytectl/.github/workflows/release.yml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml index 7d30bdb666..e4c2de9fd3 100644 --- a/flytectl/.github/workflows/release.yml +++ b/flytectl/.github/workflows/release.yml @@ -10,25 +10,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 - - name: Unit Tests - uses: cedrickring/golang-action@1.5.2 - env: - GO111MODULE: "on" - with: - args: make install && make test_unit_codecov - - name: Push CodeCov - uses: codecov/codecov-action@v1 - with: - file: coverage.txt - flags: unittests - fail_ci_if_error: true - - name: Lint - uses: cedrickring/golang-action@1.5.2 - env: - GO111MODULE: "on" - with: - args: make install && make lint - - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 with: From ce7ddc1ff5edbb825f2964fde05adb4998be828a Mon Sep 17 00:00:00 2001 From: brucearctor <5032356+brucearctor@users.noreply.github.com> Date: Wed, 17 Mar 2021 21:54:24 -0700 Subject: [PATCH 029/645] to flyteorg (#43) --- flytectl/Makefile | 2 +- flytectl/README.md | 6 +- flytectl/cmd/config/config.go | 4 +- flytectl/cmd/core/cmd.go | 4 +- flytectl/cmd/core/cmd_ctx.go | 2 +- flytectl/cmd/create/create.go | 2 +- flytectl/cmd/create/project.go | 4 +- flytectl/cmd/create/project_test.go | 6 +- flytectl/cmd/delete/delete.go | 2 +- flytectl/cmd/delete/execution.go | 10 +- flytectl/cmd/delete/execution_test.go | 8 +- flytectl/cmd/get/execution.go | 13 +- flytectl/cmd/get/execution_test.go | 10 +- flytectl/cmd/get/get.go | 2 +- flytectl/cmd/get/launch_plan.go | 12 +- flytectl/cmd/get/named_entity.go | 2 +- flytectl/cmd/get/project.go | 10 +- flytectl/cmd/get/task.go | 12 +- flytectl/cmd/get/workflow.go | 12 +- flytectl/cmd/register/files.go | 6 +- flytectl/cmd/register/filesconfig_flags.go | 2 +- flytectl/cmd/register/register.go | 2 +- flytectl/cmd/register/register_util.go | 14 +- flytectl/cmd/root.go | 18 +- flytectl/cmd/update/project.go | 6 +- flytectl/cmd/update/project_test.go | 8 +- flytectl/cmd/update/update.go | 2 +- flytectl/cmd/version.go | 2 +- flytectl/docs/CONTRIBUTING.md | 2 +- flytectl/docs/source/generate_docs.go | 2 +- flytectl/go.mod | 23 +- flytectl/go.sum | 750 +++++++++++++++++---- flytectl/main.go | 2 +- flytectl/pkg/adminutils/config.go | 2 +- flytectl/pkg/adminutils/iterator.go | 2 +- flytectl/pkg/printer/printer.go | 2 +- flytectl/proposal/README.md | 6 +- 37 files changed, 715 insertions(+), 259 deletions(-) diff --git a/flytectl/Makefile b/flytectl/Makefile index edf00f07ea..2e5bcf7a82 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -6,7 +6,7 @@ pip-compile $(1) --upgrade --verbose endef generate: - go test github.com/lyft/flytectl/cmd --update + go test github.com/flyteorg/flytectl/cmd --update compile: go build -o bin/flytectl main.go diff --git a/flytectl/README.md b/flytectl/README.md index a1a2af7292..6f46476b67 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -3,10 +3,10 @@ [![Docs](https://readthedocs.org/projects/flytectl/badge/?version=latest&style=plastic)](https://flytectl.rtfd.io) [![Current Release](https://img.shields.io/github/release/flyteorg/flytectl.svg)](https://github.com/flyteorg/flytectl/releases/latest) ![Master](https://github.com/flyteorg/flytectl/workflows/Master/badge.svg) -[![GoDoc](https://godoc.org/github.com/lyft/flytectl?status.svg)](https://pkg.go.dev/mod/github.com/lyft/flytectl) +[![GoDoc](https://godoc.org/github.com/flyteorg/flytectl?status.svg)](https://pkg.go.dev/mod/github.com/flyteorg/flytectl) [![License](https://img.shields.io/badge/LICENSE-Apache2.0-ff69b4.svg)](http://www.apache.org/licenses/LICENSE-2.0.html) [![CodeCoverage](https://img.shields.io/codecov/c/github/flyteorg/flytectl.svg)](https://codecov.io/gh/flyteorg/flytectl) -[![Go Report Card](https://goreportcard.com/badge/github.com/lyft/flytectl)](https://goreportcard.com/report/github.com/lyft/flytectl) +[![Go Report Card](https://goreportcard.com/badge/github.com/flyteorg/flytectl)](https://goreportcard.com/report/github.com/flyteorg/flytectl) ![Commit activity](https://img.shields.io/github/commit-activity/w/lyft/flytectl.svg?style=plastic) ![Commit since last release](https://img.shields.io/github/commits-since/lyft/flytectl/latest.svg?style=plastic) @@ -27,5 +27,3 @@ curl -s https://raw.githubusercontent.com/flyteorg/flytectl/master/install.sh | ## Contributing [Contribution guidelines for this project](docs/CONTRIBUTING.md) - - diff --git a/flytectl/cmd/config/config.go b/flytectl/cmd/config/config.go index bb691b52c0..6c212d1cf9 100644 --- a/flytectl/cmd/config/config.go +++ b/flytectl/cmd/config/config.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "github.com/lyft/flytestdlib/config" + "github.com/flyteorg/flytestdlib/config" - "github.com/lyft/flytectl/pkg/printer" + "github.com/flyteorg/flytectl/pkg/printer" ) //go:generate pflags Config diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index aa76d00112..0e62c7369d 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -6,10 +6,10 @@ import ( "github.com/spf13/pflag" - "github.com/lyft/flyteidl/clients/go/admin" + "github.com/flyteorg/flyteidl/clients/go/admin" "github.com/spf13/cobra" - "github.com/lyft/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config" ) type PFlagProvider interface { diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go index 347e75c3fe..e0de7d1a18 100644 --- a/flytectl/cmd/core/cmd_ctx.go +++ b/flytectl/cmd/core/cmd_ctx.go @@ -3,7 +3,7 @@ package cmdcore import ( "io" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/service" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" ) type CommandContext struct { diff --git a/flytectl/cmd/create/create.go b/flytectl/cmd/create/create.go index 51d487fc7b..5fbf0b9914 100644 --- a/flytectl/cmd/create/create.go +++ b/flytectl/cmd/create/create.go @@ -1,7 +1,7 @@ package create import ( - cmdcore "github.com/lyft/flytectl/cmd/core" + cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" ) diff --git a/flytectl/cmd/create/project.go b/flytectl/cmd/create/project.go index 776be99056..e7550c6b5f 100644 --- a/flytectl/cmd/create/project.go +++ b/flytectl/cmd/create/project.go @@ -5,10 +5,10 @@ import ( "fmt" "io/ioutil" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "gopkg.in/yaml.v2" - cmdCore "github.com/lyft/flytectl/cmd/core" + cmdCore "github.com/flyteorg/flytectl/cmd/core" ) const ( diff --git a/flytectl/cmd/create/project_test.go b/flytectl/cmd/create/project_test.go index e43e9124a5..77c3cb7578 100644 --- a/flytectl/cmd/create/project_test.go +++ b/flytectl/cmd/create/project_test.go @@ -8,9 +8,9 @@ import ( "os" "testing" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flyteidl/clients/go/admin/mocks" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index 47eaf657e5..29ec1efa05 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -1,7 +1,7 @@ package delete import ( - cmdcore "github.com/lyft/flytectl/cmd/core" + cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" ) diff --git a/flytectl/cmd/delete/execution.go b/flytectl/cmd/delete/execution.go index 90220e9a50..d92871d45b 100644 --- a/flytectl/cmd/delete/execution.go +++ b/flytectl/cmd/delete/execution.go @@ -3,11 +3,11 @@ package delete import ( "context" - "github.com/lyft/flytectl/cmd/config" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" - "github.com/lyft/flytestdlib/logger" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytestdlib/logger" ) // Long descriptions are whitespace sensitive when generating docs using sphinx. diff --git a/flytectl/cmd/delete/execution_test.go b/flytectl/cmd/delete/execution_test.go index 41e5f04085..f2f3ec11bb 100644 --- a/flytectl/cmd/delete/execution_test.go +++ b/flytectl/cmd/delete/execution_test.go @@ -6,10 +6,10 @@ import ( "io" "testing" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flyteidl/clients/go/admin/mocks" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 67ef82b9ac..8cde1b7b57 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -3,15 +3,14 @@ package get import ( "context" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" - + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/lyft/flytestdlib/logger" - "github.com/lyft/flytectl/cmd/config" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/pkg/printer" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/printer" ) const ( diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go index 33cccd465f..d414f32145 100644 --- a/flytectl/cmd/get/execution_test.go +++ b/flytectl/cmd/get/execution_test.go @@ -6,11 +6,11 @@ import ( "io" "testing" - "github.com/lyft/flytectl/cmd/config" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flyteidl/clients/go/admin/mocks" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index 2fd6806c5a..8f8cc9c25d 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -1,7 +1,7 @@ package get import ( - cmdcore "github.com/lyft/flytectl/cmd/core" + cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" ) diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index eb4d292e20..6d40cec4d4 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -3,13 +3,13 @@ package get import ( "context" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/adminutils" + "github.com/flyteorg/flytectl/pkg/printer" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" - "github.com/lyft/flytectl/cmd/config" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/pkg/adminutils" - "github.com/lyft/flytectl/pkg/printer" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/lyft/flytestdlib/logger" ) const ( diff --git a/flytectl/cmd/get/named_entity.go b/flytectl/cmd/get/named_entity.go index b636145790..617542f5ec 100644 --- a/flytectl/cmd/get/named_entity.go +++ b/flytectl/cmd/get/named_entity.go @@ -1,7 +1,7 @@ package get import ( - "github.com/lyft/flytectl/pkg/printer" + "github.com/flyteorg/flytectl/pkg/printer" ) var entityColumns = []printer.Column{ diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 8307a6e627..f89b952d4b 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -3,13 +3,13 @@ package get import ( "context" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/lyft/flytestdlib/logger" - "github.com/lyft/flytectl/cmd/config" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/pkg/printer" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/printer" ) const ( diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 054225e413..ccbd46dd4d 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -3,16 +3,16 @@ package get import ( "context" + "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" - "github.com/lyft/flytestdlib/logger" - "github.com/lyft/flytectl/pkg/adminutils" - "github.com/lyft/flytectl/pkg/printer" + "github.com/flyteorg/flytectl/pkg/adminutils" + "github.com/flyteorg/flytectl/pkg/printer" - "github.com/lyft/flytectl/cmd/config" - cmdCore "github.com/lyft/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 322a3af0c0..2736fe9b11 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -3,15 +3,15 @@ package get import ( "context" + "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" - "github.com/lyft/flytestdlib/logger" - "github.com/lyft/flytectl/cmd/config" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/pkg/adminutils" - "github.com/lyft/flytectl/pkg/printer" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/adminutils" + "github.com/flyteorg/flytectl/pkg/printer" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index b413619008..cf4f957e3a 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -5,9 +5,9 @@ import ( "encoding/json" "os" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/pkg/printer" - "github.com/lyft/flytestdlib/logger" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/printer" + "github.com/flyteorg/flytestdlib/logger" ) //go:generate pflags FilesConfig diff --git a/flytectl/cmd/register/filesconfig_flags.go b/flytectl/cmd/register/filesconfig_flags.go index b35de5beb8..2600e6024e 100755 --- a/flytectl/cmd/register/filesconfig_flags.go +++ b/flytectl/cmd/register/filesconfig_flags.go @@ -41,7 +41,7 @@ func (FilesConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("FilesConfig", pflag.ExitOnError) - cmdFlags.StringVarP(&(filesConfig.Version),fmt.Sprintf("%v%v", prefix, "version"), "v", "v1", "version of the entity to be registered with flyte.") + cmdFlags.StringVarP(&(filesConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), "v", "v1", "version of the entity to be registered with flyte.") cmdFlags.BoolVarP(&(filesConfig.ContinueOnError), fmt.Sprintf("%v%v", prefix, "continueOnError"), "c", *new(bool), "continue on error when registering files.") cmdFlags.BoolVarP(&(filesConfig.Archive), fmt.Sprintf("%v%v", prefix, "archive"), "a", *new(bool), "pass in archive file either an http link or local path.") return cmdFlags diff --git a/flytectl/cmd/register/register.go b/flytectl/cmd/register/register.go index 3a46653b12..476080dd2c 100644 --- a/flytectl/cmd/register/register.go +++ b/flytectl/cmd/register/register.go @@ -1,7 +1,7 @@ package register import ( - cmdcore "github.com/lyft/flytectl/cmd/core" + cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" ) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 1b419912f4..1f3ac0e816 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -16,13 +16,13 @@ import ( "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" - "github.com/lyft/flytectl/cmd/config" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flytectl/pkg/printer" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/core" - "github.com/lyft/flytestdlib/logger" - "github.com/lyft/flytestdlib/storage" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/printer" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytestdlib/logger" + "github.com/flyteorg/flytestdlib/storage" ) const registrationProjectPattern = "{{ registration.project }}" diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 572dc7d058..26bfc2b453 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -4,15 +4,15 @@ import ( "context" "fmt" - "github.com/lyft/flytectl/cmd/config" - "github.com/lyft/flytectl/cmd/create" - "github.com/lyft/flytectl/cmd/delete" - "github.com/lyft/flytectl/cmd/get" - "github.com/lyft/flytectl/cmd/register" - "github.com/lyft/flytectl/cmd/update" - "github.com/lyft/flytectl/pkg/printer" - stdConfig "github.com/lyft/flytestdlib/config" - "github.com/lyft/flytestdlib/config/viper" + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/create" + "github.com/flyteorg/flytectl/cmd/delete" + "github.com/flyteorg/flytectl/cmd/get" + "github.com/flyteorg/flytectl/cmd/register" + "github.com/flyteorg/flytectl/cmd/update" + "github.com/flyteorg/flytectl/pkg/printer" + stdConfig "github.com/flyteorg/flytestdlib/config" + "github.com/flyteorg/flytestdlib/config/viper" "github.com/sirupsen/logrus" "github.com/spf13/cobra" diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 15c1c9dc73..0c13b7ed74 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -4,9 +4,9 @@ import ( "context" "fmt" - "github.com/lyft/flytectl/cmd/config" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) //go:generate pflags ProjectConfig diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index c11986b6fa..36e703b15e 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -9,10 +9,10 @@ import ( "os" "testing" - "github.com/lyft/flytectl/cmd/config" - cmdCore "github.com/lyft/flytectl/cmd/core" - "github.com/lyft/flyteidl/clients/go/admin/mocks" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index f88d0ff3aa..33526e6dcd 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -1,7 +1,7 @@ package update import ( - cmdcore "github.com/lyft/flytectl/cmd/core" + cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" ) diff --git a/flytectl/cmd/version.go b/flytectl/cmd/version.go index b24cc3a63f..647a5a1eac 100644 --- a/flytectl/cmd/version.go +++ b/flytectl/cmd/version.go @@ -1,7 +1,7 @@ package cmd import ( - "github.com/lyft/flytestdlib/version" + "github.com/flyteorg/flytestdlib/version" "github.com/spf13/cobra" ) diff --git a/flytectl/docs/CONTRIBUTING.md b/flytectl/docs/CONTRIBUTING.md index 391bee6d82..5758d747b2 100644 --- a/flytectl/docs/CONTRIBUTING.md +++ b/flytectl/docs/CONTRIBUTING.md @@ -11,6 +11,6 @@ FLYTECTL_GRPC_PORT=`kubectl get service -n flyte flyteadmin -o json | jq '.spec. #2) Setup Port forwarding: kubectl port-forward -n flyte service/flyteadmin 8081:$FLYTECTL_GRPC_PORT -#3) Update config line in https://github.com/lyft/flytectl/blob/master/config.yaml to dns:///localhost:8081 +#3) Update config line in https://github.com/flyteorg/flytectl/blob/master/config.yaml to dns:///localhost:8081 #4) All new flags introduced for flytectl commands and subcommands should be camelcased. eg: bin/flytectl update project -p flytesnacks --activateProject diff --git a/flytectl/docs/source/generate_docs.go b/flytectl/docs/source/generate_docs.go index 4bfb6667ef..e64f2a5996 100644 --- a/flytectl/docs/source/generate_docs.go +++ b/flytectl/docs/source/generate_docs.go @@ -1,6 +1,6 @@ package main -import "github.com/lyft/flytectl/cmd" +import "github.com/flyteorg/flytectl/cmd" func main() { if err := cmd.GenerateDocs(); err != nil { diff --git a/flytectl/go.mod b/flytectl/go.mod index 3c1d85d0d9..c07b1b38a1 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -1,25 +1,22 @@ -module github.com/lyft/flytectl +module github.com/flyteorg/flytectl go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect + github.com/flyteorg/flyteidl v0.18.15 + github.com/flyteorg/flytestdlib v0.3.13 github.com/ghodss/yaml v1.0.0 - github.com/golang/protobuf v1.3.2 + github.com/golang/protobuf v1.4.3 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 - github.com/lyft/flyteidl v0.18.11 - github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/mitchellh/mapstructure v1.1.2 - github.com/sirupsen/logrus v1.4.2 - github.com/spf13/afero v1.2.2 // indirect - github.com/spf13/cobra v0.0.5 + github.com/mitchellh/mapstructure v1.4.1 + github.com/sirupsen/logrus v1.7.0 + github.com/spf13/cobra v1.1.1 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.4.0 + github.com/stretchr/testify v1.7.0 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 - golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 // indirect - google.golang.org/grpc v1.26.0 - gopkg.in/yaml.v2 v2.2.8 - k8s.io/apimachinery v0.18.3 // indirect + google.golang.org/grpc v1.35.0 + gopkg.in/yaml.v2 v2.4.0 ) diff --git a/flytectl/go.sum b/flytectl/go.sum index bc1a758eb3..410cad1d09 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -5,59 +5,109 @@ cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6A cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.52.0 h1:GGslhk/BU052LPlnI1vpp3fcbUs+hQ3E+Doti/3/vF8= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0 h1:XgtDnVJRCPEUG21gjFiRPz4zI1Mjg16R+NYQjfmU4XY= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.12.0 h1:4y3gHptW1EHVtcPAVE0eBBlFuGqEejTTG3KdIE0lUX4= +cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v38.2.0+incompatible h1:ZeCdp1E/V5lI8oLR/BjWQh0OW9aFBYlgXGKRVIWNPXY= -github.com/Azure/azure-sdk-for-go v38.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v51.0.0+incompatible h1:p7blnyJSjJqf5jflHbSGhIhEpXIgIFmYZNg5uwqweso= +github.com/Azure/azure-sdk-for-go v51.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.4 h1:1cM+NmKw91+8h5vfjgzK4ZGLuN72k87XVZBWyGwNjUM= -github.com/Azure/go-autorest/autorest v0.9.4/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= +github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/adal v0.8.1 h1:pZdL8o72rK+avFWl+p9nE8RWi1JInZrWJYlnpfXJwHk= -github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= +github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= -github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= +github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.28.9 h1:grIuBQc+p3dTRXerh5+2OxSuWFi0iXuxbFdTSg0jaW0= -github.com/aws/aws-sdk-go v1.28.9/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= +github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -68,64 +118,103 @@ github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgk github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coocood/freecache v1.1.0 h1:ENiHOsWdj1BrrlPwblhbn4GdAsMymK3pZORJ+bJGAjA= -github.com/coocood/freecache v1.1.0/go.mod h1:ePwxCDzOYvARfHdr1pByNct1at3CoKnsipOHwKlNbzI= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= +github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/flyteorg/flyteidl v0.18.15 h1:sXrlwTRaRjQsXYMNrY/S930SKdKtu4XnpNFEu8I4tn4= +github.com/flyteorg/flyteidl v0.18.15/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= +github.com/flyteorg/flytestdlib v0.3.13 h1:5ioA/q3ixlyqkFh5kDaHgmPyTP/AHtqq1K/TIbVLUzM= +github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783 h1:SmsgwFZy9pdTk/k8BZz40D3P5umP5+Ejt3hAi0paBNQ= -github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -136,241 +225,402 @@ github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/graymeta/stow v0.2.4 h1:qDGstknYXqcnmBQ5TRJtxD9Qv1MuRbYRhLoSMeUDs7U= -github.com/graymeta/stow v0.2.4/go.mod h1:+0vRL9oMECKjPMP7OeVWl8EIqRCpFwDlth3mrAeV2Kw= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graymeta/stow v0.2.7 h1:b31cB1Ylw/388sYSZxnmpjT2QxC21AaQ8fRnUtE13b4= +github.com/graymeta/stow v0.2.7/go.mod h1:JAs139Zr29qfsecy7b+h9DRsWXbFbsd7LCrbCDYI84k= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.2 h1:D0EVSTwQoQOyfY35QNSuPJA4jpZRtkoGYWQMB7XNg5o= github.com/grpc-ecosystem/grpc-gateway v1.12.2/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb v1.7.9/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 h1:M8exrBzuhWcU6aoHJlHWPe4qFjVKzkMGRal78f5jRRU= github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23/go.mod h1:kBSna6b0/RzsOcOZf515vAXwSsXYusl2U7SA0XP09yI= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= -github.com/lyft/flyteidl v0.18.11 h1:24NaFYWxANhRbwKfvkgu8axGTWUcl1tgZBqNJutKNJ8= -github.com/lyft/flyteidl v0.18.11/go.mod h1:/zQXxuHO11u/saxTTZc8oYExIGEShXB+xCB1/F1Cu20= -github.com/lyft/flytestdlib v0.3.0/go.mod h1:LJPPJlkFj+wwVWMrQT3K5JZgNhZi2mULsCG4ZYhinhU= -github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa h1:anYLG/feMdMv321AfhHGBRd0S3cPLFFTZvJYssjhxFo= -github.com/lyft/flytestdlib v0.3.10-0.20200619054107-45f341b716fa/go.mod h1:LJPPJlkFj+wwVWMrQT3K5JZgNhZi2mULsCG4ZYhinhU= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= +github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.49 h1:eQaKIjSt/PXLKfYgzg01nevmO+CMXfXGRhB1gOhDs7E= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= +github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= -github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU= +github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0 h1:Uehi/mxLK0eiUc0H0++5tpMGTexB8wZ598MIgU8VpDM= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/satori/uuid v1.2.0/go.mod h1:B8HLsPLik/YNn6KKWVMDJ8nzCL8RP5WyfsnmvnAEwIU= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= +github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.22.6 h1:BdkrbWrzDlV9dnbzoP7sfN+dHheJ4J9JOaYxcUDL+ok= +go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -379,83 +629,160 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 h1:55H5j7lotzuFCEOKDsMch+fRNUQ9DgtyHOUP31FNqKc= +golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -467,92 +794,227 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200124170513-3f4d10fc73b4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.38.0 h1:vDyWk6eup8eQAidaZ31sNWIn8tZEL8qpbtGkBD4ytQo= +google.golang.org/api v0.38.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150 h1:VPpdpQkGvFicX9yo4G5oxZPi9ALBnEOZblPSa/Wa2m4= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200831141814-d751682dd103/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 h1:uLBY0yHDCj2PMQ98KWDSIDFwn9zK2zh+tgWtbvPPBjI= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.1 h1:GyboHr4UqMiLUybYjd22ZjQIKEJEpgtLXtuGbR21Oho= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= -k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/apimachinery v0.18.3 h1:pOGcbVAhxADgUYnjS08EFXs9QMl8qaH5U4fr5LGUrSk= -k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o= -k8s.io/client-go v11.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= +k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= +k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= +k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= +k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 h1:d+LBRNY3c/KGp7lDblRlUJkayx4Vla7WUTIazoGMdYo= +k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= +k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/flytectl/main.go b/flytectl/main.go index 5bc6a6fddc..5951864944 100644 --- a/flytectl/main.go +++ b/flytectl/main.go @@ -3,7 +3,7 @@ package main import ( "fmt" - "github.com/lyft/flytectl/cmd" + "github.com/flyteorg/flytectl/cmd" ) func main() { diff --git a/flytectl/pkg/adminutils/config.go b/flytectl/pkg/adminutils/config.go index 3b362b310b..f47ae8276b 100644 --- a/flytectl/pkg/adminutils/config.go +++ b/flytectl/pkg/adminutils/config.go @@ -1,6 +1,6 @@ package adminutils -import "github.com/lyft/flytestdlib/config" +import "github.com/flyteorg/flytestdlib/config" //go:generate pflags Config diff --git a/flytectl/pkg/adminutils/iterator.go b/flytectl/pkg/adminutils/iterator.go index 927b126de6..3e90690b43 100644 --- a/flytectl/pkg/adminutils/iterator.go +++ b/flytectl/pkg/adminutils/iterator.go @@ -3,8 +3,8 @@ package adminutils import ( "context" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/golang/protobuf/proto" - "github.com/lyft/flyteidl/gen/pb-go/flyteidl/admin" "google.golang.org/grpc" ) diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index 40fc4c39d9..fa86127b9e 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -6,12 +6,12 @@ import ( "fmt" "os" + "github.com/flyteorg/flytestdlib/errors" "github.com/ghodss/yaml" "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" "github.com/kataras/tablewriter" "github.com/landoop/tableprinter" - "github.com/lyft/flytestdlib/errors" "github.com/yalp/jsonpath" ) diff --git a/flytectl/proposal/README.md b/flytectl/proposal/README.md index c9c2acedd4..abbf8c6bfb 100644 --- a/flytectl/proposal/README.md +++ b/flytectl/proposal/README.md @@ -81,12 +81,12 @@ User-facing SDKs can serialize workflow code to protobuf representations but the * `{{ .project }}` * `{{ .domain }}` * `{{ .version }}` -* [auth](https://github.com/lyft/flyteidl/blob/c3baba8983019680ef57b6244cea36ba951233ed/protos/flyteidl/admin/common.proto#L241): including the assumable_iam_role and/or kubernetes_service_account -* the [output_location_prefix](https://github.com/lyft/flyteidl/blob/c3baba8983019680ef57b6244cea36ba951233ed/protos/flyteidl/admin/common.proto#L250) +* [auth](https://github.com/flyteorg/flyteidl/blob/c3baba8983019680ef57b6244cea36ba951233ed/protos/flyteidl/admin/common.proto#L241): including the assumable_iam_role and/or kubernetes_service_account +* the [output_location_prefix](https://github.com/flyteorg/flyteidl/blob/c3baba8983019680ef57b6244cea36ba951233ed/protos/flyteidl/admin/common.proto#L250) will be included in the serialized protobuf that must be substituted at **create** time. Eventually the hope is that substitution will be done server-side. -Furthermore, to reproduce the equivalent **fast-register** code path for the flyte-cli defined in flytekit an equivalent _fast-create_ command must fill in additional template variables in the [task container args](https://github.com/lyft/flyteidl/blob/master/protos/flyteidl/core/tasks.proto#L142). These serialized, templatized args will appear like so: +Furthermore, to reproduce the equivalent **fast-register** code path for the flyte-cli defined in flytekit an equivalent _fast-create_ command must fill in additional template variables in the [task container args](https://github.com/flyteorg/flyteidl/blob/master/protos/flyteidl/core/tasks.proto#L142). These serialized, templatized args will appear like so: ``` "pyflyte-fast-execute", From e5d11a886fbc29d29f00d36b71df926ab71b362f Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Mon, 22 Mar 2021 10:13:51 +0530 Subject: [PATCH 030/645] Create executions in flytectl (#39) --- .../lyft/golang_support_tools/tools.go | 2 +- .../golang_test_targets/download_tooling.sh | 2 +- flytectl/cmd/create/create.go | 2 + flytectl/cmd/create/create_test.go | 28 +- flytectl/cmd/create/execution.go | 129 ++++ flytectl/cmd/create/execution_test.go | 166 +++++ flytectl/cmd/create/execution_util.go | 148 +++++ flytectl/cmd/create/executionconfig_flags.go | 50 ++ .../cmd/create/executionconfig_flags_test.go | 212 ++++++ flytectl/cmd/create/project_test.go | 70 +- flytectl/cmd/create/serialization_utils.go | 29 + flytectl/cmd/get/execution.go | 4 +- flytectl/cmd/get/execution_test.go | 9 - flytectl/cmd/get/execution_util.go | 128 ++++ flytectl/cmd/get/get.go | 4 +- flytectl/cmd/get/get_test.go | 24 + flytectl/cmd/get/launch_plan.go | 66 +- flytectl/cmd/get/launch_plan_test.go | 628 ++++++++++++++++++ flytectl/cmd/get/launch_plan_util.go | 90 +++ flytectl/cmd/get/launchplanconfig_flags.go | 48 ++ .../cmd/get/launchplanconfig_flags_test.go | 168 +++++ flytectl/cmd/get/task.go | 77 ++- flytectl/cmd/get/task_test.go | 368 ++++++++++ flytectl/cmd/get/task_util.go | 93 +++ flytectl/cmd/get/taskconfig_flags.go | 48 ++ flytectl/cmd/get/taskconfig_flags_test.go | 168 +++++ flytectl/cmd/register/register_util.go | 6 +- .../testdata/launchplan_execution_spec.yaml | 11 + .../cmd/testdata/task_execution_spec.yaml | 15 + flytectl/cmd/testutils/test_utils.go | 62 ++ flytectl/cmd/update/project_test.go | 1 + flytectl/docs/source/gen/flytectl_create.rst | 1 + .../source/gen/flytectl_create_execution.rst | 140 ++++ .../source/gen/flytectl_get_launchplan.rst | 37 +- .../docs/source/gen/flytectl_get_task.rst | 29 +- flytectl/docs/source/index.rst | 1 + flytectl/go.mod | 12 +- flytectl/go.sum | 26 +- flytectl/main.go | 2 +- flytectl/pkg/commandutils/command_utils.go | 26 + 40 files changed, 3000 insertions(+), 130 deletions(-) create mode 100644 flytectl/cmd/create/execution.go create mode 100644 flytectl/cmd/create/execution_test.go create mode 100644 flytectl/cmd/create/execution_util.go create mode 100755 flytectl/cmd/create/executionconfig_flags.go create mode 100755 flytectl/cmd/create/executionconfig_flags_test.go create mode 100644 flytectl/cmd/create/serialization_utils.go create mode 100644 flytectl/cmd/get/execution_util.go create mode 100644 flytectl/cmd/get/launch_plan_test.go create mode 100644 flytectl/cmd/get/launch_plan_util.go create mode 100755 flytectl/cmd/get/launchplanconfig_flags.go create mode 100755 flytectl/cmd/get/launchplanconfig_flags_test.go create mode 100644 flytectl/cmd/get/task_test.go create mode 100644 flytectl/cmd/get/task_util.go create mode 100755 flytectl/cmd/get/taskconfig_flags.go create mode 100755 flytectl/cmd/get/taskconfig_flags_test.go create mode 100644 flytectl/cmd/testdata/launchplan_execution_spec.yaml create mode 100644 flytectl/cmd/testdata/task_execution_spec.yaml create mode 100644 flytectl/cmd/testutils/test_utils.go create mode 100644 flytectl/docs/source/gen/flytectl_create_execution.rst create mode 100644 flytectl/pkg/commandutils/command_utils.go diff --git a/flytectl/boilerplate/lyft/golang_support_tools/tools.go b/flytectl/boilerplate/lyft/golang_support_tools/tools.go index 88ff645233..a256d868f1 100644 --- a/flytectl/boilerplate/lyft/golang_support_tools/tools.go +++ b/flytectl/boilerplate/lyft/golang_support_tools/tools.go @@ -5,6 +5,6 @@ package tools import ( _ "github.com/alvaroloes/enumer" _ "github.com/golangci/golangci-lint/cmd/golangci-lint" - _ "github.com/lyft/flytestdlib/cli/pflags" + _ "github.com/flyteorg/flytestdlib/cli/pflags" _ "github.com/vektra/mockery/cmd/mockery" ) diff --git a/flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh b/flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh index ab56c7e481..bc51af5646 100755 --- a/flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh +++ b/flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh @@ -17,7 +17,7 @@ set -e # In the format of ":" or ":" if no cli tools=( "github.com/vektra/mockery/cmd/mockery" - "github.com/lyft/flytestdlib/cli/pflags" + "github.com/flyteorg/flytestdlib/cli/pflags" "github.com/golangci/golangci-lint/cmd/golangci-lint" "github.com/alvaroloes/enumer" ) diff --git a/flytectl/cmd/create/create.go b/flytectl/cmd/create/create.go index 5fbf0b9914..ad1f6ac33c 100644 --- a/flytectl/cmd/create/create.go +++ b/flytectl/cmd/create/create.go @@ -26,6 +26,8 @@ func RemoteCreateCommand() *cobra.Command { createResourcesFuncs := map[string]cmdcore.CommandEntry{ "project": {CmdFunc: createProjectsCommand, Aliases: []string{"projects"}, ProjectDomainNotRequired: true, PFlagProvider: projectConfig, Short: projectShort, Long: projectLong}, + "execution": {CmdFunc: createExecutionCommand, Aliases: []string{"executions"}, ProjectDomainNotRequired: false, PFlagProvider: executionConfig, Short: executionShort, + Long: executionLong}, } cmdcore.AddCommands(createCmd, createResourcesFuncs) return createCmd diff --git a/flytectl/cmd/create/create_test.go b/flytectl/cmd/create/create_test.go index fb0d58a535..d2e4711a31 100644 --- a/flytectl/cmd/create/create_test.go +++ b/flytectl/cmd/create/create_test.go @@ -1,23 +1,43 @@ package create import ( + "context" "sort" "testing" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/stretchr/testify/assert" ) +const testDataFolder = "../testdata/" + +var ( + err error + ctx context.Context + mockClient *mocks.AdminServiceClient + args []string + cmdCtx cmdCore.CommandContext +) +var setup = testutils.Setup +var tearDownAndVerify = testutils.TearDownAndVerify + func TestCreateCommand(t *testing.T) { createCommand := RemoteCreateCommand() assert.Equal(t, createCommand.Use, "create") assert.Equal(t, createCommand.Short, "Used for creating various flyte resources including tasks/workflows/launchplans/executions/project.") - assert.Equal(t, len(createCommand.Commands()), 1) + assert.Equal(t, len(createCommand.Commands()), 2) cmdNouns := createCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - assert.Equal(t, cmdNouns[0].Use, "project") - assert.Equal(t, cmdNouns[0].Aliases, []string{"projects"}) - assert.Equal(t, cmdNouns[0].Short, "Create project resources") + assert.Equal(t, cmdNouns[0].Use, "execution") + assert.Equal(t, cmdNouns[0].Aliases, []string{"executions"}) + assert.Equal(t, cmdNouns[0].Short, executionShort) + assert.Equal(t, cmdNouns[1].Use, "project") + assert.Equal(t, cmdNouns[1].Aliases, []string{"projects"}) + assert.Equal(t, cmdNouns[1].Short, "Create project resources") } diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go new file mode 100644 index 0000000000..b687790e12 --- /dev/null +++ b/flytectl/cmd/create/execution.go @@ -0,0 +1,129 @@ +package create + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + executionShort = "Create execution resources" + executionLong = ` +Create the executions for given workflow/task in a project and domain. + +There are three steps in generating an execution. + +- Generate the execution spec file using the get command. +- Update the inputs for the execution if needed. +- Run the execution by passing in the generated yaml file. + +The spec file should be generated first and then run the execution using the spec file. +You can reference the flytectl get task for more details + +:: + + flytectl get tasks -d development -p flytectldemo core.advanced.run_merge_sort.merge --version v2 --execFile execution_spec.yaml + +The generated file would look similar to this + +.. code-block:: yaml + + iamRoleARN: "" + inputs: + sorted_list1: + - 0 + sorted_list2: + - 0 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.advanced.run_merge_sort.merge + version: "v2" + + +The generated file can be modified to change the input values. + +.. code-block:: yaml + + iamRoleARN: 'arn:aws:iam::12345678:role/defaultrole' + inputs: + sorted_list1: + - 2 + - 4 + - 6 + sorted_list2: + - 1 + - 3 + - 5 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.advanced.run_merge_sort.merge + version: "v2" + +And then can be passed through the command line. +Notice the source and target domain/projects can be different. +The root project and domain flags of -p and -d should point to task/launch plans project/domain. + +:: + + flytectl create execution --execFile execution_spec.yaml -p flytectldemo -d development --targetProject flytesnacks + +Usage +` +) + +//go:generate pflags ExecutionConfig --default-var executionConfig + +// ExecutionConfig hold configuration for create execution flags and configuration of the actual task or workflow to be launched. +type ExecutionConfig struct { + // pflag section + ExecFile string `json:"execFile,omitempty" pflag:",file for the execution params.If not specified defaults to <_name>.execution_spec.yaml"` + TargetDomain string `json:"targetDomain" pflag:",project where execution needs to be created.If not specified configured domain would be used."` + TargetProject string `json:"targetProject" pflag:",project where execution needs to be created.If not specified configured project would be used."` + KubeServiceAcct string `json:"kubeServiceAcct" pflag:",kubernetes service account AuthRole for launching execution."` + IamRoleARN string `json:"iamRoleARN" pflag:",iam role ARN AuthRole for launching execution."` + // Non plfag section is read from the execution config generated by get task/launchplan + Workflow string `json:"workflow,omitempty"` + Task string `json:"task,omitempty"` + Version string `json:"version"` + Inputs map[string]interface{} `json:"inputs"` +} + +type ExecutionParams struct { + name string + isTask bool +} + +var ( + executionConfig = &ExecutionConfig{} +) + +func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var execParams ExecutionParams + var err error + sourceProject := config.GetConfig().Project + sourceDomain := config.GetConfig().Domain + if execParams, err = readConfigAndValidate(config.GetConfig().Project, config.GetConfig().Domain); err != nil { + return err + } + var executionRequest *admin.ExecutionCreateRequest + if execParams.isTask { + if executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx); err != nil { + return err + } + } else { + if executionRequest, err = createExecutionRequestForWorkflow(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx); err != nil { + return err + } + } + exec, _err := cmdCtx.AdminClient().CreateExecution(ctx, executionRequest) + if _err != nil { + return _err + } + fmt.Printf("execution identifier %v\n", exec.Id) + return nil +} diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go new file mode 100644 index 0000000000..cb9fa4cc15 --- /dev/null +++ b/flytectl/cmd/create/execution_test.go @@ -0,0 +1,166 @@ +package create + +import ( + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "google.golang.org/protobuf/types/known/timestamppb" +) + +// This function needs to be called after testutils.Steup() +func createExecutionSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient + sortedListLiteralType := core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + } + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, + } + + task1 := &admin.Task{ + Id: &core.Identifier{ + Name: "task1", + Version: "v2", + }, + Closure: &admin.TaskClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + CompiledTask: &core.CompiledTask{ + Template: &core.TaskTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }, + }, + } + mockClient.OnGetTaskMatch(ctx, mock.Anything).Return(task1, nil) + parameterMap := map[string]*core.Parameter{ + "numbers": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + }, + }, + "numbers_count": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + "run_local_at_count": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, + }, + }, + }, + }, + }, + }, + }, + }, + } + launchPlan1 := &admin.LaunchPlan{ + Id: &core.Identifier{ + Name: "core.advanced.run_merge_sort.merge_sort", + Version: "v3", + }, + Spec: &admin.LaunchPlanSpec{ + DefaultInputs: &core.ParameterMap{ + Parameters: parameterMap, + }, + }, + Closure: &admin.LaunchPlanClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 0, Nanos: 0}, + ExpectedInputs: &core.ParameterMap{ + Parameters: parameterMap, + }, + }, + } + objectGetRequest := &admin.ObjectGetRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_LAUNCH_PLAN, + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: "core.advanced.run_merge_sort.merge_sort", + Version: "v3", + }, + } + mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan1, nil) +} +func TestCreateLaunchPlanExecutionFunc(t *testing.T) { + setup() + createExecutionSetup() + executionCreateResponseLP := &admin.ExecutionCreateResponse{ + Id: &core.WorkflowExecutionIdentifier{ + Project: "flytesnacks", + Domain: "development", + Name: "f652ea3596e7f4d80a0e", + }, + } + mockClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseLP, nil) + executionConfig.ExecFile = testDataFolder + "launchplan_execution_spec.yaml" + err = createExecutionCommand(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) + tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) +} + +func TestCreateTaskExecutionFunc(t *testing.T) { + setup() + createExecutionSetup() + executionCreateResponseTask := &admin.ExecutionCreateResponse{ + Id: &core.WorkflowExecutionIdentifier{ + Project: "flytesnacks", + Domain: "development", + Name: "ff513c0e44b5b4a35aa5", + }, + } + mockClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseTask, nil) + executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" + err = createExecutionCommand(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) + tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) +} diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go new file mode 100644 index 0000000000..acb3f595d8 --- /dev/null +++ b/flytectl/cmd/create/execution_util.go @@ -0,0 +1,148 @@ +package create + +import ( + "context" + "errors" + "fmt" + "io/ioutil" + "strings" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + cmdGet "github.com/flyteorg/flytectl/cmd/get" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + "github.com/google/uuid" + "sigs.k8s.io/yaml" +) + +func createExecutionRequestForWorkflow(ctx context.Context, workflowName string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.ExecutionCreateRequest, error) { + var lp *admin.LaunchPlan + var err error + // Fetch the launch plan + if lp, err = cmdGet.FetchLPVersion(ctx, workflowName, executionConfig.Version, project, domain, cmdCtx); err != nil { + return nil, err + } + // Create workflow params literal map + var paramLiterals map[string]*core.Literal + workflowParams := cmdGet.WorkflowParams(lp) + if paramLiterals, err = MakeLiteralForParams(executionConfig.Inputs, workflowParams); err != nil { + return nil, err + } + var inputs = &core.LiteralMap{ + Literals: paramLiterals, + } + ID := lp.Id + return createExecutionRequest(ID, inputs, nil), nil +} + +func createExecutionRequestForTask(ctx context.Context, taskName string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.ExecutionCreateRequest, error) { + var task *admin.Task + var err error + // Fetch the task + if task, err = cmdGet.FetchTaskVersion(ctx, taskName, executionConfig.Version, project, domain, cmdCtx); err != nil { + return nil, err + } + // Create task variables literal map + var variableLiterals map[string]*core.Literal + taskInputs := cmdGet.TaskInputs(task) + if variableLiterals, err = MakeLiteralForVariables(executionConfig.Inputs, taskInputs); err != nil { + return nil, err + } + var inputs = &core.LiteralMap{ + Literals: variableLiterals, + } + var authRole *admin.AuthRole + if executionConfig.KubeServiceAcct != "" { + authRole = &admin.AuthRole{Method: &admin.AuthRole_KubernetesServiceAccount{ + KubernetesServiceAccount: executionConfig.KubeServiceAcct}} + } else { + authRole = &admin.AuthRole{Method: &admin.AuthRole_AssumableIamRole{ + AssumableIamRole: executionConfig.IamRoleARN}} + } + ID := &core.Identifier{ + ResourceType: core.ResourceType_TASK, + Project: project, + Domain: domain, + Name: task.Id.Name, + Version: task.Id.Version, + } + return createExecutionRequest(ID, inputs, authRole), nil +} + +func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, authRole *admin.AuthRole) *admin.ExecutionCreateRequest { + return &admin.ExecutionCreateRequest{ + Project: executionConfig.TargetProject, + Domain: executionConfig.TargetDomain, + Name: "f" + strings.ReplaceAll(uuid.New().String(), "-", "")[:19], + Spec: &admin.ExecutionSpec{ + LaunchPlan: ID, + Metadata: &admin.ExecutionMetadata{ + Mode: admin.ExecutionMetadata_MANUAL, + Principal: "sdk", + Nesting: 0, + }, + AuthRole: authRole, + }, + Inputs: inputs, + } +} + +func readExecConfigFromFile(fileName string) (*ExecutionConfig, error) { + data, _err := ioutil.ReadFile(fileName) + if _err != nil { + return nil, fmt.Errorf("unable to read from %v yaml file", fileName) + } + executionConfigRead := ExecutionConfig{} + if _err = yaml.Unmarshal(data, &executionConfigRead); _err != nil { + return nil, _err + } + return &executionConfigRead, nil +} + +func resolveOverrides(readExecutionConfig *ExecutionConfig, project string, domain string) { + if executionConfig.KubeServiceAcct != "" { + readExecutionConfig.KubeServiceAcct = executionConfig.KubeServiceAcct + } + if executionConfig.IamRoleARN != "" { + readExecutionConfig.IamRoleARN = executionConfig.IamRoleARN + } + if executionConfig.TargetProject != "" { + readExecutionConfig.TargetProject = executionConfig.TargetProject + } + if executionConfig.TargetDomain != "" { + readExecutionConfig.TargetDomain = executionConfig.TargetDomain + } + // Use the root project and domain to launch the task/workflow if target is unspecified + if executionConfig.TargetProject == "" { + readExecutionConfig.TargetProject = project + } + if executionConfig.TargetDomain == "" { + readExecutionConfig.TargetDomain = domain + } +} + +func readConfigAndValidate(project string, domain string) (ExecutionParams, error) { + executionParams := ExecutionParams{} + if executionConfig.ExecFile == "" { + return executionParams, errors.New("executionConfig can't be empty. Run the flytectl get task/launchplan to generate the config") + } + var readExecutionConfig *ExecutionConfig + var err error + if readExecutionConfig, err = readExecConfigFromFile(executionConfig.ExecFile); err != nil { + return executionParams, err + } + resolveOverrides(readExecutionConfig, project, domain) + // Update executionConfig pointer to readExecutionConfig as it contains all the updates. + executionConfig = readExecutionConfig + isTask := readExecutionConfig.Task != "" + isWorkflow := readExecutionConfig.Workflow != "" + if isTask == isWorkflow { + return executionParams, errors.New("either one of task or workflow name should be specified to launch an execution") + } + name := readExecutionConfig.Task + if !isTask { + name = readExecutionConfig.Workflow + } + return ExecutionParams{name: name, isTask: isTask}, nil +} diff --git a/flytectl/cmd/create/executionconfig_flags.go b/flytectl/cmd/create/executionconfig_flags.go new file mode 100755 index 0000000000..4a9774dff0 --- /dev/null +++ b/flytectl/cmd/create/executionconfig_flags.go @@ -0,0 +1,50 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package create + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (ExecutionConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (ExecutionConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in ExecutionConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("ExecutionConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(executionConfig.ExecFile),fmt.Sprintf("%v%v", prefix, "execFile"), executionConfig.ExecFile, "file for the execution params.If not specified defaults to <_name>.execution_spec.yaml") + cmdFlags.StringVar(&(executionConfig.TargetDomain),fmt.Sprintf("%v%v", prefix, "targetDomain"), executionConfig.TargetDomain, "project where execution needs to be created.If not specified configured domain would be used.") + cmdFlags.StringVar(&(executionConfig.TargetProject),fmt.Sprintf("%v%v", prefix, "targetProject"), executionConfig.TargetProject, "project where execution needs to be created.If not specified configured project would be used.") + cmdFlags.StringVar(&(executionConfig.KubeServiceAcct),fmt.Sprintf("%v%v", prefix, "kubeServiceAcct"), executionConfig.KubeServiceAcct, "kubernetes service account AuthRole for launching execution.") + cmdFlags.StringVar(&(executionConfig.IamRoleARN),fmt.Sprintf("%v%v", prefix, "iamRoleARN"), executionConfig.IamRoleARN, "iam role ARN AuthRole for launching execution.") + return cmdFlags +} diff --git a/flytectl/cmd/create/executionconfig_flags_test.go b/flytectl/cmd/create/executionconfig_flags_test.go new file mode 100755 index 0000000000..bf7ab9c47b --- /dev/null +++ b/flytectl/cmd/create/executionconfig_flags_test.go @@ -0,0 +1,212 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package create + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsExecutionConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementExecutionConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsExecutionConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookExecutionConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementExecutionConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_ExecutionConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookExecutionConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_ExecutionConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_ExecutionConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_ExecutionConfig(val, result)) +} + +func testDecodeSlice_ExecutionConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_ExecutionConfig(vStringSlice, result)) +} + +func TestExecutionConfig_GetPFlagSet(t *testing.T) { + val := ExecutionConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestExecutionConfig_SetFlags(t *testing.T) { + actual := ExecutionConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_execFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("execFile"); err == nil { + assert.Equal(t, string(executionConfig.ExecFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("execFile", testValue) + if vString, err := cmdFlags.GetString("execFile"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.ExecFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_targetDomain", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("targetDomain"); err == nil { + assert.Equal(t, string(executionConfig.TargetDomain), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("targetDomain", testValue) + if vString, err := cmdFlags.GetString("targetDomain"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.TargetDomain) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_targetProject", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("targetProject"); err == nil { + assert.Equal(t, string(executionConfig.TargetProject), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("targetProject", testValue) + if vString, err := cmdFlags.GetString("targetProject"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.TargetProject) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_kubeServiceAcct", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("kubeServiceAcct"); err == nil { + assert.Equal(t, string(executionConfig.KubeServiceAcct), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("kubeServiceAcct", testValue) + if vString, err := cmdFlags.GetString("kubeServiceAcct"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.KubeServiceAcct) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_iamRoleARN", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("iamRoleARN"); err == nil { + assert.Equal(t, string(executionConfig.IamRoleARN), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("iamRoleARN", testValue) + if vString, err := cmdFlags.GetString("iamRoleARN"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.IamRoleARN) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/create/project_test.go b/flytectl/cmd/create/project_test.go index 77c3cb7578..8f4bb309b0 100644 --- a/flytectl/cmd/create/project_test.go +++ b/flytectl/cmd/create/project_test.go @@ -1,48 +1,26 @@ package create import ( - "bytes" - "context" - "io" - "log" - "os" + "fmt" "testing" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" ) const projectValue = "dummyProject" var ( - reader *os.File - writer *os.File - err error - ctx context.Context - mockClient *mocks.AdminServiceClient - mockOutStream io.Writer - args []string - cmdCtx cmdCore.CommandContext projectRegisterRequest *admin.ProjectRegisterRequest - stdOut *os.File - stderr *os.File ) -func setup() { - reader, writer, err = os.Pipe() - if err != nil { - panic(err) - } - stdOut = os.Stdout - stderr = os.Stderr - os.Stdout = writer - os.Stderr = writer - log.SetOutput(writer) - mockClient = new(mocks.AdminServiceClient) - mockOutStream = writer - cmdCtx = cmdCore.NewCommandContext(mockClient, mockOutStream) +func createProjectSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient projectRegisterRequest = &admin.ProjectRegisterRequest{ Project: &admin.Project{ Id: projectValue, @@ -53,21 +31,15 @@ func setup() { }, }, } + projectConfig.ID = "" + projectConfig.Name = "" + projectConfig.Labels = map[string]string{} + projectConfig.Description = "" } - -func teardownAndVerify(t *testing.T, expectedLog string) { - writer.Close() - os.Stdout = stdOut - os.Stderr = stderr - var buf bytes.Buffer - if _, err := io.Copy(&buf, reader); err != nil { - assert.Equal(t, expectedLog, buf.String()) - } -} - func TestCreateProjectFunc(t *testing.T) { setup() - defer teardownAndVerify(t, "project Created successfully") + createProjectSetup() + defer tearDownAndVerify(t, "project Created successfully") projectConfig.ID = projectValue projectConfig.Name = projectValue projectConfig.Labels = map[string]string{} @@ -80,23 +52,25 @@ func TestCreateProjectFunc(t *testing.T) { func TestEmptyProjectID(t *testing.T) { setup() - defer teardownAndVerify(t, "project ID is required flag") + createProjectSetup() + defer tearDownAndVerify(t, "") projectConfig.Name = projectValue projectConfig.Labels = map[string]string{} mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) err := createProjectsCommand(ctx, args, cmdCtx) - assert.Nil(t, err) - mockClient.AssertCalled(t, "RegisterProject", ctx, projectRegisterRequest) + assert.Equal(t, fmt.Errorf("project ID is required flag"), err) + mockClient.AssertNotCalled(t, "RegisterProject", ctx, mock.Anything) } func TestEmptyProjectName(t *testing.T) { setup() - defer teardownAndVerify(t, "project ID is required flag") + createProjectSetup() + defer tearDownAndVerify(t, "") projectConfig.ID = projectValue projectConfig.Labels = map[string]string{} projectConfig.Description = "" mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) err := createProjectsCommand(ctx, args, cmdCtx) - assert.Nil(t, err) - mockClient.AssertCalled(t, "RegisterProject", ctx, projectRegisterRequest) + assert.Equal(t, fmt.Errorf("project name is required flag"), err) + mockClient.AssertNotCalled(t, "RegisterProject", ctx, mock.Anything) } diff --git a/flytectl/cmd/create/serialization_utils.go b/flytectl/cmd/create/serialization_utils.go new file mode 100644 index 0000000000..b9759ca7c1 --- /dev/null +++ b/flytectl/cmd/create/serialization_utils.go @@ -0,0 +1,29 @@ +package create + +import ( + "github.com/flyteorg/flyteidl/clients/go/coreutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +// TODO: Move all functions to flyteidl +func MakeLiteralForVariables(serialize map[string]interface{}, variables map[string]*core.Variable) (map[string]*core.Literal, error) { + result := make(map[string]*core.Literal) + var err error + for k, v := range variables { + if result[k], err = coreutils.MakeLiteralForType(v.Type, serialize[k]); err != nil { + return nil, err + } + } + return result, nil +} + +func MakeLiteralForParams(serialize map[string]interface{}, parameters map[string]*core.Parameter) (map[string]*core.Literal, error) { + result := make(map[string]*core.Literal) + var err error + for k, v := range parameters { + if result[k], err = coreutils.MakeLiteralForType(v.GetVar().Type, serialize[k]); err != nil { + return nil, err + } + } + return result, nil +} diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 8cde1b7b57..f7d91812c1 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -50,8 +50,8 @@ Usage var executionColumns = []printer.Column{ {Header: "Name", JSONPath: "$.id.name"}, - {Header: "Workflow Name", JSONPath: "$.closure.workflowId.name"}, - {Header: "Type", JSONPath: "$.closure.workflowId.resourceType"}, + {Header: "Launch Plan Name", JSONPath: "$.spec.launchPlan.name"}, + {Header: "Type", JSONPath: "$.spec.launchPlan.resourceType"}, {Header: "Phase", JSONPath: "$.closure.phase"}, {Header: "Started", JSONPath: "$.closure.startedAt"}, {Header: "Elapsed Time", JSONPath: "$.closure.duration"}, diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go index d414f32145..5940c3d17a 100644 --- a/flytectl/cmd/get/execution_test.go +++ b/flytectl/cmd/get/execution_test.go @@ -14,15 +14,6 @@ import ( "github.com/stretchr/testify/assert" ) -const projectValue = "dummyProject" -const domainValue = "dummyDomain" -const executionNameValue = "e124" -const launchPlanNameValue = "lp_name" -const launchPlanVersionValue = "lp_version" -const workflowNameValue = "wf_name" -const workflowVersionValue = "wf_version" -const output = "json" - func TestListExecutionFunc(t *testing.T) { ctx := context.Background() config.GetConfig().Project = projectValue diff --git a/flytectl/cmd/get/execution_util.go b/flytectl/cmd/get/execution_util.go new file mode 100644 index 0000000000..da330af39e --- /dev/null +++ b/flytectl/cmd/get/execution_util.go @@ -0,0 +1,128 @@ +package get + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" + "github.com/flyteorg/flyteidl/clients/go/coreutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + "sigs.k8s.io/yaml" +) + +// ExecutionConfig is duplicated struct from create with the same structure. This is to avoid the circular dependency. +// TODO : replace this with a cleaner design +type ExecutionConfig struct { + TargetDomain string `json:"targetDomain"` + TargetProject string `json:"targetProject"` + KubeServiceAcct string `json:"kubeServiceAcct"` + IamRoleARN string `json:"iamRoleARN"` + Workflow string `json:"workflow,omitempty"` + Task string `json:"task,omitempty"` + Version string `json:"version"` + Inputs map[string]interface{} `json:"inputs"` +} + +func WriteExecConfigToFile(executionConfig ExecutionConfig, fileName string) error { + d, err := yaml.Marshal(executionConfig) + if err != nil { + fmt.Printf("error: %v", err) + } + if _, err = os.Stat(fileName); err == nil { + if !cmdUtil.AskForConfirmation(fmt.Sprintf("warning file %v will be overwritten", fileName)) { + return errors.New("backup the file before continuing") + } + } + return ioutil.WriteFile(fileName, d, 0600) +} + +func CreateAndWriteExecConfigForTask(task *admin.Task, fileName string) error { + var err error + executionConfig := ExecutionConfig{Task: task.Id.Name, Version: task.Id.Version} + if executionConfig.Inputs, err = ParamMapForTask(task); err != nil { + return err + } + return WriteExecConfigToFile(executionConfig, fileName) +} + +func CreateAndWriteExecConfigForWorkflow(wlp *admin.LaunchPlan, fileName string) error { + var err error + executionConfig := ExecutionConfig{Workflow: wlp.Id.Name, Version: wlp.Id.Version} + if executionConfig.Inputs, err = ParamMapForWorkflow(wlp); err != nil { + return err + } + return WriteExecConfigToFile(executionConfig, fileName) +} + +func TaskInputs(task *admin.Task) map[string]*core.Variable { + taskInputs := map[string]*core.Variable{} + if task == nil || task.Closure == nil { + return taskInputs + } + if task.Closure.CompiledTask == nil { + return taskInputs + } + if task.Closure.CompiledTask.Template == nil { + return taskInputs + } + if task.Closure.CompiledTask.Template.Interface == nil { + return taskInputs + } + if task.Closure.CompiledTask.Template.Interface.Inputs == nil { + return taskInputs + } + return task.Closure.CompiledTask.Template.Interface.Inputs.Variables +} + +func ParamMapForTask(task *admin.Task) (map[string]interface{}, error) { + taskInputs := TaskInputs(task) + paramMap := make(map[string]interface{}, len(taskInputs)) + for k, v := range taskInputs { + varTypeValue, err := coreutils.MakeDefaultLiteralForType(v.Type) + if err != nil { + fmt.Println("error creating default value for literal type ", v.Type) + return nil, err + } + if paramMap[k], err = coreutils.ExtractFromLiteral(varTypeValue); err != nil { + return nil, err + } + } + return paramMap, nil +} + +func WorkflowParams(lp *admin.LaunchPlan) map[string]*core.Parameter { + workflowParams := map[string]*core.Parameter{} + if lp == nil || lp.Spec == nil { + return workflowParams + } + if lp.Spec.DefaultInputs == nil { + return workflowParams + } + return lp.Spec.DefaultInputs.Parameters +} + +func ParamMapForWorkflow(lp *admin.LaunchPlan) (map[string]interface{}, error) { + workflowParams := WorkflowParams(lp) + paramMap := make(map[string]interface{}, len(workflowParams)) + for k, v := range workflowParams { + varTypeValue, err := coreutils.MakeDefaultLiteralForType(v.Var.Type) + if err != nil { + fmt.Println("error creating default value for literal type ", v.Var.Type) + return nil, err + } + if paramMap[k], err = coreutils.ExtractFromLiteral(varTypeValue); err != nil { + return nil, err + } + // Override if there is a default value + if paramsDefault, ok := v.Behavior.(*core.Parameter_Default); ok { + if paramMap[k], err = coreutils.ExtractFromLiteral(paramsDefault.Default); err != nil { + return nil, err + } + } + } + return paramMap, nil +} diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index 8f8cc9c25d..e875a0ca01 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -30,11 +30,11 @@ func CreateGetCommand() *cobra.Command { Short: projectShort, Long: projectLong}, "task": {CmdFunc: getTaskFunc, Aliases: []string{"tasks"}, Short: taskShort, - Long: taskLong}, + Long: taskLong, PFlagProvider: taskConfig}, "workflow": {CmdFunc: getWorkflowFunc, Aliases: []string{"workflows"}, Short: workflowShort, Long: workflowLong}, "launchplan": {CmdFunc: getLaunchPlanFunc, Aliases: []string{"launchplans"}, Short: launchPlanShort, - Long: launchPlanLong}, + Long: launchPlanLong, PFlagProvider: launchPlanConfig}, "execution": {CmdFunc: getExecutionFunc, Aliases: []string{"executions"}, Short: executionShort, Long: executionLong}, } diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index 243a6a97da..852994db00 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -1,13 +1,37 @@ package get import ( + "context" "fmt" "sort" "testing" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/stretchr/testify/assert" ) +const projectValue = "dummyProject" +const domainValue = "dummyDomain" +const output = "json" +const executionNameValue = "e124" +const launchPlanNameValue = "lp_name" +const launchPlanVersionValue = "lp_version" +const workflowNameValue = "wf_name" +const workflowVersionValue = "wf_version" +const testDataFolder = "../testdata/" + +var ( + err error + ctx context.Context + mockClient *mocks.AdminServiceClient + cmdCtx cmdCore.CommandContext +) +var setup = testutils.Setup +var tearDownAndVerify = testutils.TearDownAndVerify + func TestCreateGetCommand(t *testing.T) { getCommand := CreateGetCommand() assert.Equal(t, getCommand.Use, "get") diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 6d40cec4d4..2b6e8a7fe2 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -9,6 +9,7 @@ import ( "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" + "github.com/golang/protobuf/proto" ) @@ -18,13 +19,13 @@ const ( Retrieves all the launch plans within project and domain.(launchplan,launchplans can be used interchangeably in these commands) :: - bin/flytectl get launchplan -p flytesnacks -d development + flytectl get launchplan -p flytesnacks -d development Retrieves launch plan by name within project and domain. :: - bin/flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet + flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet Retrieves launchplan by filters. :: @@ -35,18 +36,54 @@ Retrieves all the launchplan within project and domain in yaml format. :: - bin/flytectl get launchplan -p flytesnacks -d development -o yaml + flytectl get launchplan -p flytesnacks -d development -o yaml Retrieves all the launchplan within project and domain in json format :: - bin/flytectl get launchplan -p flytesnacks -d development -o json + flytectl get launchplan -p flytesnacks -d development -o json + +Retrieves a launch plans within project and domain for a version and generate the execution spec file for it to be used for launching the execution using create execution. + +:: + + flytectl get launchplan -d development -p flytectldemo core.advanced.run_merge_sort.merge_sort --execFile execution_spec.yam + +The generated file would look similar to this + +.. code-block:: yaml + + iamRoleARN: "" + inputs: + numbers: + - 0 + numbers_count: 0 + run_local_at_count: 10 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + version: v3 + workflow: core.advanced.run_merge_sort.merge_sort + +Check the create execution section on how to launch one using the generated file. Usage ` ) +//go:generate pflags LaunchPlanConfig --default-var launchPlanConfig +var ( + launchPlanConfig = &LaunchPlanConfig{} +) + +// LaunchPlanConfig +type LaunchPlanConfig struct { + ExecFile string `json:"execFile" pflag:",execution file name to be used for generating execution spec of a single launchplan."` + Version string `json:"version" pflag:",version of the launchplan to be fetched."` + Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` +} + var launchplanColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, @@ -65,29 +102,24 @@ func LaunchplanToProtoMessages(l []*admin.LaunchPlan) []proto.Message { func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { launchPlanPrinter := printer.Printer{} - + project := config.GetConfig().Project + domain := config.GetConfig().Domain if len(args) == 1 { name := args[0] - launchPlan, err := cmdCtx.AdminClient().ListLaunchPlans(ctx, &admin.ResourceListRequest{ - Limit: 10, - Id: &admin.NamedEntityIdentifier{ - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - Name: name, - }, - }) - if err != nil { + var launchPlans []*admin.LaunchPlan + var err error + if launchPlans, err = FetchLPForName(ctx, name, project, domain, cmdCtx); err != nil { return err } - logger.Debugf(ctx, "Retrieved %v excutions", len(launchPlan.LaunchPlans)) - err = launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplanColumns, LaunchplanToProtoMessages(launchPlan.LaunchPlans)...) + logger.Debugf(ctx, "Retrieved %v launch plans", len(launchPlans)) + err = launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplanColumns, LaunchplanToProtoMessages(launchPlans)...) if err != nil { return err } return nil } - launchPlans, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListLaunchPlanIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) + launchPlans, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListLaunchPlanIds, adminutils.ListRequest{Project: project, Domain: domain}) if err != nil { return err } diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go new file mode 100644 index 0000000000..54f7f14202 --- /dev/null +++ b/flytectl/cmd/get/launch_plan_test.go @@ -0,0 +1,628 @@ +package get + +import ( + "os" + "testing" + + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/types/known/timestamppb" +) + +var ( + resourceListRequest *admin.ResourceListRequest + objectGetRequest *admin.ObjectGetRequest + namedIDRequest *admin.NamedEntityIdentifierListRequest + launchPlanListResponse *admin.LaunchPlanList + argsLp []string +) + +func getLaunchPlanSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient + argsLp = []string{"launchplan1"} + parameterMap := map[string]*core.Parameter{ + "numbers": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + }, + }, + "numbers_count": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + "run_local_at_count": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, + }, + }, + }, + }, + }, + }, + }, + }, + } + launchPlan1 := &admin.LaunchPlan{ + Id: &core.Identifier{ + Name: "launchplan1", + Version: "v1", + }, + Spec: &admin.LaunchPlanSpec{ + DefaultInputs: &core.ParameterMap{ + Parameters: parameterMap, + }, + }, + Closure: &admin.LaunchPlanClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 0, Nanos: 0}, + ExpectedInputs: &core.ParameterMap{ + Parameters: parameterMap, + }, + }, + } + launchPlan2 := &admin.LaunchPlan{ + Id: &core.Identifier{ + Name: "launchplan1", + Version: "v2", + }, + Spec: &admin.LaunchPlanSpec{ + DefaultInputs: &core.ParameterMap{ + Parameters: parameterMap, + }, + }, + Closure: &admin.LaunchPlanClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + ExpectedInputs: &core.ParameterMap{ + Parameters: parameterMap, + }, + }, + } + + launchPlans := []*admin.LaunchPlan{launchPlan2, launchPlan1} + + resourceListRequest = &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: argsLp[0], + }, + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + Limit: 100, + } + + launchPlanListResponse = &admin.LaunchPlanList{ + LaunchPlans: launchPlans, + } + + objectGetRequest = &admin.ObjectGetRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_LAUNCH_PLAN, + Project: projectValue, + Domain: domainValue, + Name: argsLp[0], + Version: "v2", + }, + } + + namedIDRequest = &admin.NamedEntityIdentifierListRequest{ + Project: projectValue, + Domain: domainValue, + SortBy: &admin.Sort{ + Key: "name", + Direction: admin.Sort_ASCENDING, + }, + Limit: 100, + } + + var entities []*admin.NamedEntityIdentifier + id1 := &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: "launchplan1", + } + id2 := &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: "launchplan2", + } + entities = append(entities, id1, id2) + namedIdentifierList := &admin.NamedEntityIdentifierList{ + Entities: entities, + } + + mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) + mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) + mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) + + launchPlanConfig.Latest = false + launchPlanConfig.Version = "" + launchPlanConfig.ExecFile = "" +} + +func TestGetLaunchPlanFunc(t *testing.T) { + setup() + getLaunchPlanSetup() + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceListRequest) + tearDownAndVerify(t, `[ + { + "id": { + "name": "launchplan1", + "version": "v2" + }, + "spec": { + "defaultInputs": { + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + }, + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + } + } + }, + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" + } + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + } + }, + "closure": { + "expectedInputs": { + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + }, + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + } + } + }, + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" + } + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + }, + "createdAt": "1970-01-01T00:00:01Z" + } + }, + { + "id": { + "name": "launchplan1", + "version": "v1" + }, + "spec": { + "defaultInputs": { + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + }, + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + } + } + }, + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" + } + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + } + }, + "closure": { + "expectedInputs": { + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + }, + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + } + } + }, + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" + } + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + }, + "createdAt": "1970-01-01T00:00:00Z" + } + } +]`) +} + +func TestGetLaunchPlanFuncLatest(t *testing.T) { + setup() + getLaunchPlanSetup() + launchPlanConfig.Latest = true + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceListRequest) + tearDownAndVerify(t, `{ + "id": { + "name": "launchplan1", + "version": "v2" + }, + "spec": { + "defaultInputs": { + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + }, + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + } + } + }, + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" + } + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + } + }, + "closure": { + "expectedInputs": { + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + }, + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + } + } + }, + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" + } + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + }, + "createdAt": "1970-01-01T00:00:01Z" + } +}`) +} + +func TestGetLaunchPlanWithVersion(t *testing.T) { + setup() + getLaunchPlanSetup() + launchPlanConfig.Version = "v2" + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "GetLaunchPlan", ctx, objectGetRequest) + tearDownAndVerify(t, `{ + "id": { + "name": "launchplan1", + "version": "v2" + }, + "spec": { + "defaultInputs": { + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + }, + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + } + } + }, + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" + } + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + } + }, + "closure": { + "expectedInputs": { + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + }, + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + } + } + }, + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" + } + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + }, + "createdAt": "1970-01-01T00:00:01Z" + } +}`) +} + +func TestGetLaunchPlans(t *testing.T) { + setup() + getLaunchPlanSetup() + argsLp = []string{} + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListLaunchPlanIds", ctx, namedIDRequest) + tearDownAndVerify(t, `[ + { + "project": "dummyProject", + "domain": "dummyDomain", + "name": "launchplan1" + }, + { + "project": "dummyProject", + "domain": "dummyDomain", + "name": "launchplan2" + } +]`) +} + +func TestGetLaunchPlansWithExecFile(t *testing.T) { + setup() + getLaunchPlanSetup() + launchPlanConfig.Version = "v2" + launchPlanConfig.ExecFile = testDataFolder + "exec_file" + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + os.Remove(launchPlanConfig.ExecFile) + assert.Nil(t, err) + mockClient.AssertCalled(t, "GetLaunchPlan", ctx, objectGetRequest) + tearDownAndVerify(t, `{ + "id": { + "name": "launchplan1", + "version": "v2" + }, + "spec": { + "defaultInputs": { + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + }, + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + } + } + }, + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" + } + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + } + }, + "closure": { + "expectedInputs": { + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + }, + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + } + } + }, + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" + } + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + }, + "createdAt": "1970-01-01T00:00:01Z" + } +}`) +} diff --git a/flytectl/cmd/get/launch_plan_util.go b/flytectl/cmd/get/launch_plan_util.go new file mode 100644 index 0000000000..e72c6e9094 --- /dev/null +++ b/flytectl/cmd/get/launch_plan_util.go @@ -0,0 +1,90 @@ +package get + +import ( + "context" + "fmt" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +// Reads the launchplan config to drive fetching the correct launch plans. +func FetchLPForName(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) ([]*admin.LaunchPlan, error) { + var launchPlans []*admin.LaunchPlan + var lp *admin.LaunchPlan + var err error + if launchPlanConfig.Latest { + if lp, err = FetchLPLatestVersion(ctx, name, project, domain, cmdCtx); err != nil { + return nil, err + } + launchPlans = append(launchPlans, lp) + } else if launchPlanConfig.Version != "" { + if lp, err = FetchLPVersion(ctx, name, launchPlanConfig.Version, project, domain, cmdCtx); err != nil { + return nil, err + } + launchPlans = append(launchPlans, lp) + } else { + launchPlans, err = FetchAllVerOfLP(ctx, name, project, domain, cmdCtx) + if err != nil { + return nil, err + } + } + if launchPlanConfig.ExecFile != "" { + // There would be atleast one launchplan object when code reaches here and hence the length assertion is not required. + lp = launchPlans[0] + // Only write the first task from the tasks object. + if err = CreateAndWriteExecConfigForWorkflow(lp, launchPlanConfig.ExecFile); err != nil { + return nil, err + } + } + return launchPlans, nil +} + +func FetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string, cmdCtx cmdCore.CommandContext) ([]*admin.LaunchPlan, error) { + tList, err := cmdCtx.AdminClient().ListLaunchPlans(ctx, &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + Name: lpName, + }, + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + Limit: 100, + }) + if err != nil { + return nil, err + } + if len(tList.LaunchPlans) == 0 { + return nil, fmt.Errorf("no launchplans retrieved for %v", lpName) + } + return tList.LaunchPlans, nil +} + +func FetchLPLatestVersion(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.LaunchPlan, error) { + // Fetch the latest version of the task. + lpVersions, err := FetchAllVerOfLP(ctx, name, project, domain, cmdCtx) + if err != nil { + return nil, err + } + lp := lpVersions[0] + return lp, nil +} + +func FetchLPVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.LaunchPlan, error) { + lp, err := cmdCtx.AdminClient().GetLaunchPlan(ctx, &admin.ObjectGetRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_LAUNCH_PLAN, + Project: project, + Domain: domain, + Name: name, + Version: version, + }, + }) + if err != nil { + return nil, err + } + return lp, nil +} diff --git a/flytectl/cmd/get/launchplanconfig_flags.go b/flytectl/cmd/get/launchplanconfig_flags.go new file mode 100755 index 0000000000..00becdd073 --- /dev/null +++ b/flytectl/cmd/get/launchplanconfig_flags.go @@ -0,0 +1,48 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package get + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (LaunchPlanConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (LaunchPlanConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in LaunchPlanConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg LaunchPlanConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("LaunchPlanConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(launchPlanConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), launchPlanConfig.ExecFile, "execution file name to be used for generating execution spec of a single launchplan.") + cmdFlags.StringVar(&(launchPlanConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), launchPlanConfig.Version, "version of the launchplan to be fetched.") + cmdFlags.BoolVar(&(launchPlanConfig.Latest),fmt.Sprintf("%v%v", prefix, "latest"), launchPlanConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") + return cmdFlags +} diff --git a/flytectl/cmd/get/launchplanconfig_flags_test.go b/flytectl/cmd/get/launchplanconfig_flags_test.go new file mode 100755 index 0000000000..2b9271b278 --- /dev/null +++ b/flytectl/cmd/get/launchplanconfig_flags_test.go @@ -0,0 +1,168 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package get + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsLaunchPlanConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementLaunchPlanConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsLaunchPlanConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookLaunchPlanConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementLaunchPlanConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_LaunchPlanConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookLaunchPlanConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_LaunchPlanConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_LaunchPlanConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_LaunchPlanConfig(val, result)) +} + +func testDecodeSlice_LaunchPlanConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_LaunchPlanConfig(vStringSlice, result)) +} + +func TestLaunchPlanConfig_GetPFlagSet(t *testing.T) { + val := LaunchPlanConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestLaunchPlanConfig_SetFlags(t *testing.T) { + actual := LaunchPlanConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_execFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("execFile"); err == nil { + assert.Equal(t, string(launchPlanConfig.ExecFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("execFile", testValue) + if vString, err := cmdFlags.GetString("execFile"); err == nil { + testDecodeJson_LaunchPlanConfig(t, fmt.Sprintf("%v", vString), &actual.ExecFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_version", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("version"); err == nil { + assert.Equal(t, string(launchPlanConfig.Version), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("version", testValue) + if vString, err := cmdFlags.GetString("version"); err == nil { + testDecodeJson_LaunchPlanConfig(t, fmt.Sprintf("%v", vString), &actual.Version) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_latest", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vBool, err := cmdFlags.GetBool("latest"); err == nil { + assert.Equal(t, bool(launchPlanConfig.Latest), vBool) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("latest", testValue) + if vBool, err := cmdFlags.GetBool("latest"); err == nil { + testDecodeJson_LaunchPlanConfig(t, fmt.Sprintf("%v", vBool), &actual.Latest) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index ccbd46dd4d..9b98de40d6 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -3,16 +3,14 @@ package get import ( "context" - "github.com/flyteorg/flytestdlib/logger" - "github.com/golang/protobuf/proto" - - "github.com/flyteorg/flytectl/pkg/adminutils" - "github.com/flyteorg/flytectl/pkg/printer" - "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" - + "github.com/flyteorg/flytectl/pkg/adminutils" + "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" + + "github.com/golang/protobuf/proto" ) const ( @@ -46,10 +44,46 @@ Retrieves all the tasks within project and domain in json format. bin/flytectl get task -p flytesnacks -d development -o json +Retrieves a tasks within project and domain for a version and generate the execution spec file for it to be used for launching the execution using create execution. + +:: + + bin/flytectl get tasks -d development -p flytesnacks core.advanced.run_merge_sort.merge --execFile execution_spec.yaml --version v2 + +The generated file would look similar to this + +.. code-block:: yaml + + iamRoleARN: "" + inputs: + sorted_list1: + - 0 + sorted_list2: + - 0 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.advanced.run_merge_sort.merge + version: v2 + +Check the create execution section on how to launch one using the generated file. + Usage ` ) +//go:generate pflags TaskConfig --default-var taskConfig +var ( + taskConfig = &TaskConfig{} +) + +// FilesConfig +type TaskConfig struct { + ExecFile string `json:"execFile" pflag:",execution file name to be used for generating execution spec of a single task."` + Version string `json:"version" pflag:",version of the task to be fetched."` + Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` +} + var taskColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, @@ -68,31 +102,20 @@ func TaskToProtoMessages(l []*admin.Task) []proto.Message { } func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - taskPrinter := printer.Printer{} - + project := config.GetConfig().Project + domain := config.GetConfig().Domain if len(args) == 1 { - task, err := cmdCtx.AdminClient().ListTasks(ctx, &admin.ResourceListRequest{ - Id: &admin.NamedEntityIdentifier{ - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - Name: args[0], - }, - // TODO Sorting and limits should be parameters - SortBy: &admin.Sort{ - Key: "created_at", - Direction: admin.Sort_DESCENDING, - }, - Limit: 100, - }) - if err != nil { + name := args[0] + var tasks []*admin.Task + var err error + if tasks, err = FetchTaskForName(ctx, name, project, domain, cmdCtx); err != nil { return err } - logger.Debugf(ctx, "Retrieved Task", task.Tasks) - - return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToProtoMessages(task.Tasks)...) + logger.Debugf(ctx, "Retrieved Task", tasks) + return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToProtoMessages(tasks)...) } - tasks, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListTaskIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) + tasks, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListTaskIds, adminutils.ListRequest{Project: project, Domain: domain}) if err != nil { return err } diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go new file mode 100644 index 0000000000..9f525b39ba --- /dev/null +++ b/flytectl/cmd/get/task_test.go @@ -0,0 +1,368 @@ +package get + +import ( + "os" + "testing" + + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/types/known/timestamppb" +) + +var ( + resourceListRequestTask *admin.ResourceListRequest + objectGetRequestTask *admin.ObjectGetRequest + namedIDRequestTask *admin.NamedEntityIdentifierListRequest + taskListResponse *admin.TaskList + argsTask []string +) + +func getTaskSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient + argsTask = []string{"task1"} + sortedListLiteralType := core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + } + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, + } + + task1 := &admin.Task{ + Id: &core.Identifier{ + Name: "task1", + Version: "v1", + }, + Closure: &admin.TaskClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 0, Nanos: 0}, + CompiledTask: &core.CompiledTask{ + Template: &core.TaskTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }, + }, + } + + task2 := &admin.Task{ + Id: &core.Identifier{ + Name: "task1", + Version: "v2", + }, + Closure: &admin.TaskClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + CompiledTask: &core.CompiledTask{ + Template: &core.TaskTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }, + }, + } + + tasks := []*admin.Task{task2, task1} + resourceListRequestTask = &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: argsTask[0], + }, + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + Limit: 100, + } + + taskListResponse = &admin.TaskList{ + Tasks: tasks, + } + + objectGetRequestTask = &admin.ObjectGetRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_TASK, + Project: projectValue, + Domain: domainValue, + Name: argsTask[0], + Version: "v2", + }, + } + namedIDRequestTask = &admin.NamedEntityIdentifierListRequest{ + Project: projectValue, + Domain: domainValue, + SortBy: &admin.Sort{ + Key: "name", + Direction: admin.Sort_ASCENDING, + }, + Limit: 100, + } + + var taskEntities []*admin.NamedEntityIdentifier + idTask1 := &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: "task1", + } + idTask2 := &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: "task2", + } + taskEntities = append(taskEntities, idTask1, idTask2) + namedIdentifierListTask := &admin.NamedEntityIdentifierList{ + Entities: taskEntities, + } + + mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) + mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) + mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) + + taskConfig.Latest = false + taskConfig.ExecFile = "" + taskConfig.Version = "" +} + +func TestGetTaskFunc(t *testing.T) { + setup() + getTaskSetup() + err = getTaskFunc(ctx, argsTask, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListTasks", ctx, resourceListRequestTask) + tearDownAndVerify(t, `[ + { + "id": { + "name": "task1", + "version": "v2" + }, + "closure": { + "compiledTask": { + "template": { + "interface": { + "inputs": { + "variables": { + "sorted_list1": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + }, + "sorted_list2": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + } + } + } + } + }, + "createdAt": "1970-01-01T00:00:01Z" + } + }, + { + "id": { + "name": "task1", + "version": "v1" + }, + "closure": { + "compiledTask": { + "template": { + "interface": { + "inputs": { + "variables": { + "sorted_list1": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + }, + "sorted_list2": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + } + } + } + } + }, + "createdAt": "1970-01-01T00:00:00Z" + } + } +]`) +} + +func TestGetTaskFuncLatest(t *testing.T) { + setup() + getTaskSetup() + taskConfig.Latest = true + err = getTaskFunc(ctx, argsTask, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListTasks", ctx, resourceListRequestTask) + tearDownAndVerify(t, `{ + "id": { + "name": "task1", + "version": "v2" + }, + "closure": { + "compiledTask": { + "template": { + "interface": { + "inputs": { + "variables": { + "sorted_list1": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + }, + "sorted_list2": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + } + } + } + } + }, + "createdAt": "1970-01-01T00:00:01Z" + } +}`) +} + +func TestGetTaskWithVersion(t *testing.T) { + setup() + getTaskSetup() + taskConfig.Version = "v2" + objectGetRequestTask.Id.ResourceType = core.ResourceType_TASK + err = getTaskFunc(ctx, argsTask, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "GetTask", ctx, objectGetRequestTask) + tearDownAndVerify(t, `{ + "id": { + "name": "task1", + "version": "v2" + }, + "closure": { + "compiledTask": { + "template": { + "interface": { + "inputs": { + "variables": { + "sorted_list1": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + }, + "sorted_list2": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + } + } + } + } + }, + "createdAt": "1970-01-01T00:00:01Z" + } +}`) +} + +func TestGetTasks(t *testing.T) { + setup() + getTaskSetup() + argsTask = []string{} + err = getTaskFunc(ctx, argsTask, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListTaskIds", ctx, namedIDRequest) + tearDownAndVerify(t, `[ + { + "project": "dummyProject", + "domain": "dummyDomain", + "name": "task1" + }, + { + "project": "dummyProject", + "domain": "dummyDomain", + "name": "task2" + } +]`) +} + +func TestGetTaskWithExecFile(t *testing.T) { + setup() + getTaskSetup() + taskConfig.Version = "v2" + taskConfig.ExecFile = testDataFolder + "task_exec_file" + err = getTaskFunc(ctx, argsTask, cmdCtx) + os.Remove(taskConfig.ExecFile) + assert.Nil(t, err) + mockClient.AssertCalled(t, "GetTask", ctx, objectGetRequestTask) + tearDownAndVerify(t, `{ + "id": { + "name": "task1", + "version": "v2" + }, + "closure": { + "compiledTask": { + "template": { + "interface": { + "inputs": { + "variables": { + "sorted_list1": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + }, + "sorted_list2": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + } + } + } + } + } + } + }, + "createdAt": "1970-01-01T00:00:01Z" + } +}`) +} diff --git a/flytectl/cmd/get/task_util.go b/flytectl/cmd/get/task_util.go new file mode 100644 index 0000000000..0be9490dc0 --- /dev/null +++ b/flytectl/cmd/get/task_util.go @@ -0,0 +1,93 @@ +package get + +import ( + "context" + "fmt" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +// Reads the task config to drive fetching the correct tasks. +func FetchTaskForName(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) ([]*admin.Task, error) { + var tasks []*admin.Task + var err error + var task *admin.Task + if taskConfig.Latest { + if task, err = FetchTaskLatestVersion(ctx, name, project, domain, cmdCtx); err != nil { + return nil, err + } + tasks = append(tasks, task) + } else if taskConfig.Version != "" { + if task, err = FetchTaskVersion(ctx, name, taskConfig.Version, project, domain, cmdCtx); err != nil { + return nil, err + } + tasks = append(tasks, task) + } else { + tasks, err = FetchAllVerOfTask(ctx, name, project, domain, cmdCtx) + if err != nil { + return nil, err + } + } + if taskConfig.ExecFile != "" { + // There would be atleast one task object when code reaches here and hence the length assertion is not required. + task = tasks[0] + // Only write the first task from the tasks object. + if err = CreateAndWriteExecConfigForTask(task, taskConfig.ExecFile); err != nil { + return nil, err + } + } + return tasks, nil +} + +func FetchAllVerOfTask(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) ([]*admin.Task, error) { + tList, err := cmdCtx.AdminClient().ListTasks(ctx, &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + Name: name, + }, + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + Limit: 100, + }) + if err != nil { + return nil, err + } + if len(tList.Tasks) == 0 { + return nil, fmt.Errorf("no tasks retrieved for %v", name) + } + return tList.Tasks, nil +} + +func FetchTaskLatestVersion(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.Task, error) { + var t *admin.Task + var err error + // Fetch the latest version of the task. + var taskVersions []*admin.Task + taskVersions, err = FetchAllVerOfTask(ctx, name, project, domain, cmdCtx) + if err != nil { + return nil, err + } + t = taskVersions[0] + return t, nil +} + +func FetchTaskVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.Task, error) { + t, err := cmdCtx.AdminClient().GetTask(ctx, &admin.ObjectGetRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_TASK, + Project: project, + Domain: domain, + Name: name, + Version: version, + }, + }) + if err != nil { + return nil, err + } + return t, nil +} diff --git a/flytectl/cmd/get/taskconfig_flags.go b/flytectl/cmd/get/taskconfig_flags.go new file mode 100755 index 0000000000..5379d61df7 --- /dev/null +++ b/flytectl/cmd/get/taskconfig_flags.go @@ -0,0 +1,48 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package get + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (TaskConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (TaskConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in TaskConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg TaskConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("TaskConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(taskConfig.ExecFile),fmt.Sprintf("%v%v", prefix, "execFile"), taskConfig.ExecFile, "execution file name to be used for generating execution spec of a single task.") + cmdFlags.StringVar(&(taskConfig.Version),fmt.Sprintf("%v%v", prefix, "version"), taskConfig.Version, "version of the task to be fetched.") + cmdFlags.BoolVar(&(taskConfig.Latest),fmt.Sprintf("%v%v", prefix, "latest"), taskConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") + return cmdFlags +} diff --git a/flytectl/cmd/get/taskconfig_flags_test.go b/flytectl/cmd/get/taskconfig_flags_test.go new file mode 100755 index 0000000000..b945e78619 --- /dev/null +++ b/flytectl/cmd/get/taskconfig_flags_test.go @@ -0,0 +1,168 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package get + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsTaskConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementTaskConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsTaskConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookTaskConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementTaskConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_TaskConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookTaskConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_TaskConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_TaskConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_TaskConfig(val, result)) +} + +func testDecodeSlice_TaskConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_TaskConfig(vStringSlice, result)) +} + +func TestTaskConfig_GetPFlagSet(t *testing.T) { + val := TaskConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestTaskConfig_SetFlags(t *testing.T) { + actual := TaskConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_execFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("execFile"); err == nil { + assert.Equal(t, string(taskConfig.ExecFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("execFile", testValue) + if vString, err := cmdFlags.GetString("execFile"); err == nil { + testDecodeJson_TaskConfig(t, fmt.Sprintf("%v", vString), &actual.ExecFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_version", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("version"); err == nil { + assert.Equal(t, string(taskConfig.Version), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("version", testValue) + if vString, err := cmdFlags.GetString("version"); err == nil { + testDecodeJson_TaskConfig(t, fmt.Sprintf("%v", vString), &actual.Version) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_latest", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vBool, err := cmdFlags.GetBool("latest"); err == nil { + assert.Equal(t, bool(taskConfig.Latest), vBool) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("latest", testValue) + if vBool, err := cmdFlags.GetBool("latest"); err == nil { + testDecodeJson_TaskConfig(t, fmt.Sprintf("%v", vBool), &actual.Latest) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 1f3ac0e816..031b0e836d 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -13,9 +13,6 @@ import ( "sort" "strings" - "github.com/golang/protobuf/jsonpb" - "github.com/golang/protobuf/proto" - "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" @@ -23,6 +20,9 @@ import ( "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytestdlib/logger" "github.com/flyteorg/flytestdlib/storage" + + "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/proto" ) const registrationProjectPattern = "{{ registration.project }}" diff --git a/flytectl/cmd/testdata/launchplan_execution_spec.yaml b/flytectl/cmd/testdata/launchplan_execution_spec.yaml new file mode 100644 index 0000000000..aa23903ed8 --- /dev/null +++ b/flytectl/cmd/testdata/launchplan_execution_spec.yaml @@ -0,0 +1,11 @@ +iamRoleARN: "" +inputs: + numbers: + - 0 + numbers_count: 0 + run_local_at_count: 10 +kubeServiceAcct: "" +targetDomain: "" +targetProject: "" +version: v3 +workflow: core.advanced.run_merge_sort.merge_sort diff --git a/flytectl/cmd/testdata/task_execution_spec.yaml b/flytectl/cmd/testdata/task_execution_spec.yaml new file mode 100644 index 0000000000..aba4e46d6d --- /dev/null +++ b/flytectl/cmd/testdata/task_execution_spec.yaml @@ -0,0 +1,15 @@ +iamRoleARN: "" +inputs: + sorted_list1: + - 0 + - 2 + - 4 + sorted_list2: + - 1 + - 3 + - 5 +kubeServiceAcct: "" +targetDomain: "development" +targetProject: "flytesnacks" +task: core.advanced.run_merge_sort.merge +version: v2 diff --git a/flytectl/cmd/testutils/test_utils.go b/flytectl/cmd/testutils/test_utils.go new file mode 100644 index 0000000000..28d999ba73 --- /dev/null +++ b/flytectl/cmd/testutils/test_utils.go @@ -0,0 +1,62 @@ +package testutils + +import ( + "bytes" + "context" + "io" + "log" + "os" + "strings" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + + "github.com/stretchr/testify/assert" +) + +const projectValue = "dummyProject" +const domainValue = "dummyDomain" +const output = "json" + +var ( + reader *os.File + writer *os.File + Err error + Ctx context.Context + MockClient *mocks.AdminServiceClient + mockOutStream io.Writer + CmdCtx cmdCore.CommandContext + stdOut *os.File + stderr *os.File +) + +func Setup() { + Ctx = context.Background() + reader, writer, Err = os.Pipe() + if Err != nil { + panic(Err) + } + stdOut = os.Stdout + stderr = os.Stderr + os.Stdout = writer + os.Stderr = writer + log.SetOutput(writer) + MockClient = new(mocks.AdminServiceClient) + mockOutStream = writer + CmdCtx = cmdCore.NewCommandContext(MockClient, mockOutStream) + config.GetConfig().Project = projectValue + config.GetConfig().Domain = domainValue + config.GetConfig().Output = output +} + +func TearDownAndVerify(t *testing.T, expectedLog string) { + writer.Close() + os.Stdout = stdOut + os.Stderr = stderr + var buf bytes.Buffer + if _, err := io.Copy(&buf, reader); err == nil { + assert.Equal(t, strings.Trim(expectedLog, "\n "), strings.Trim(buf.String(), "\n ")) + } +} diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index 36e703b15e..6b0491a375 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -13,6 +13,7 @@ import ( cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/stretchr/testify/assert" ) diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index dbd0218ae4..a7528e911e 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -71,5 +71,6 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_create_execution` - Create execution resources * :doc:`flytectl_create_project` - Create project resources diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst new file mode 100644 index 0000000000..01b7f0e2b1 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -0,0 +1,140 @@ +.. _flytectl_create_execution: + +flytectl create execution +------------------------- + +Create execution resources + +Synopsis +~~~~~~~~ + + + +Create the executions for given workflow/task in a project and domain. + +There are three steps in generating an execution. + +- Generate the execution spec file using the get command. +- Update the inputs for the execution if needed. +- Run the execution by passing in the generated yaml file. + +The spec file should be generated first and then run the execution using the spec file. +You can reference the flytectl get task for more details + +:: + + flytectl get tasks -d development -p flytectldemo core.advanced.run_merge_sort.merge --version v2 --execFile execution_spec.yaml + +The generated file would look similar to this + +.. code-block:: yaml + + iamRoleARN: "" + inputs: + sorted_list1: + - 0 + sorted_list2: + - 0 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.advanced.run_merge_sort.merge + version: "v2" + + +The generated file can be modified to change the input values. + +.. code-block:: yaml + + iamRoleARN: 'arn:aws:iam::12345678:role/defaultrole' + inputs: + sorted_list1: + - 2 + - 4 + - 6 + sorted_list2: + - 1 + - 3 + - 5 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.advanced.run_merge_sort.merge + version: "v2" + +And then can be passed through the command line. +Notice the source and target domain/projects can be different. +The root project and domain flags of -p and -d should point to task/launch plans project/domain. + +:: + + flytectl create execution --execFile execution_spec.yaml -p flytectldemo -d development --targetProject flytesnacks + +Usage + + +:: + + flytectl create execution [flags] + +Options +~~~~~~~ + +:: + + --execFile string file for the execution params.If not specified defaults to <_name>.execution_spec.yaml + -h, --help help for execution + --iamRoleARN string iam role ARN AuthRole for launching execution. + --kubeServiceAcct string kubernetes service account AuthRole for launching execution. + --targetDomain string project where execution needs to be created.If not specified configured domain would be used. + --targetProject string project where execution needs to be created.If not specified configured project would be used. + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_create` - Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index ab832ed6b5..2746270b21 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -13,13 +13,13 @@ Synopsis Retrieves all the launch plans within project and domain.(launchplan,launchplans can be used interchangeably in these commands) :: - bin/flytectl get launchplan -p flytesnacks -d development + flytectl get launchplan -p flytesnacks -d development Retrieves launch plan by name within project and domain. :: - bin/flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet + flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet Retrieves launchplan by filters. :: @@ -30,13 +30,37 @@ Retrieves all the launchplan within project and domain in yaml format. :: - bin/flytectl get launchplan -p flytesnacks -d development -o yaml + flytectl get launchplan -p flytesnacks -d development -o yaml Retrieves all the launchplan within project and domain in json format :: - bin/flytectl get launchplan -p flytesnacks -d development -o json + flytectl get launchplan -p flytesnacks -d development -o json + +Retrieves a launch plans within project and domain for a version and generate the execution spec file for it to be used for launching the execution using create execution. + +:: + + flytectl get launchplan -d development -p flytectldemo core.advanced.run_merge_sort.merge_sort --execFile execution_spec.yam + +The generated file would look similar to this + +.. code-block:: yaml + + iamRoleARN: "" + inputs: + numbers: + - 0 + numbers_count: 0 + run_local_at_count: 10 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + workflow: core.advanced.run_merge_sort.merge + version: "v3" + +Check the create execution section on how to launch one using the generated file. Usage @@ -50,7 +74,10 @@ Options :: - -h, --help help for launchplan + --execFile string execution file name to be used for generating execution spec of a single launchplan. + -h, --help help for launchplan + --latest flag to indicate to fetch the latest version, version flag will be ignored in this case + --version string version of the launchplan to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 3037d96055..245de2b4f3 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -38,6 +38,30 @@ Retrieves all the tasks within project and domain in json format. bin/flytectl get task -p flytesnacks -d development -o json +Retrieves a tasks within project and domain for a version and generate the execution spec file for it to be used for launching the execution using create execution. + +:: + + bin/flytectl get tasks -d development -p flytesnacks core.advanced.run_merge_sort.merge --execFile execution_spec.yaml --version v2 + +The generated file would look similar to this + +.. code-block:: yaml + + iamRoleARN: "" + inputs: + sorted_list1: + - 0 + sorted_list2: + - 0 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.advanced.run_merge_sort.merge + version: "v2" + +Check the create execution section on how to launch one using the generated file. + Usage @@ -50,7 +74,10 @@ Options :: - -h, --help help for task + --execFile string execution file name to be used for generating execution spec of a single task. + -h, --help help for task + --latest flag to indicate to fetch the latest version, version flag will be ignored in this case + --version string version of the task to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 00a24536a7..9833bf0c50 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -60,6 +60,7 @@ Basic Configuration :caption: Flytectl nouns gen/flytectl_create_project + gen/flytectl_create_execution gen/flytectl_get_execution gen/flytectl_get_project gen/flytectl_get_workflow diff --git a/flytectl/go.mod b/flytectl/go.mod index c07b1b38a1..5723376489 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -8,15 +8,23 @@ require ( github.com/flyteorg/flytestdlib v0.3.13 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 + github.com/google/uuid v1.1.2 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 + github.com/kr/text v0.2.0 // indirect github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/mapstructure v1.4.1 - github.com/sirupsen/logrus v1.7.0 - github.com/spf13/cobra v1.1.1 + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/sirupsen/logrus v1.8.0 + github.com/spf13/cobra v1.1.3 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.7.0 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 google.golang.org/grpc v1.35.0 + google.golang.org/protobuf v1.25.0 + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.4.0 + sigs.k8s.io/yaml v1.2.0 ) + +replace github.com/flyteorg/flyteidl => github.com/flyteorg/flyteidl v0.18.21-0.20210317055906-f2ce9eb7bd1f diff --git a/flytectl/go.sum b/flytectl/go.sum index 410cad1d09..a189bc399e 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -141,6 +141,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -172,8 +173,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.18.15 h1:sXrlwTRaRjQsXYMNrY/S930SKdKtu4XnpNFEu8I4tn4= -github.com/flyteorg/flyteidl v0.18.15/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= +github.com/flyteorg/flyteidl v0.18.21-0.20210317055906-f2ce9eb7bd1f h1:7qRMZRPQXUVpebBt92msIzQBRtJ4fraWhd75qA6oqaE= +github.com/flyteorg/flyteidl v0.18.21-0.20210317055906-f2ce9eb7bd1f/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= github.com/flyteorg/flytestdlib v0.3.13 h1:5ioA/q3ixlyqkFh5kDaHgmPyTP/AHtqq1K/TIbVLUzM= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= @@ -208,6 +209,7 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -228,6 +230,7 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -280,6 +283,7 @@ github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= @@ -367,17 +371,19 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= +github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -426,6 +432,8 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -518,8 +526,9 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU= +github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= @@ -536,8 +545,9 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -959,8 +969,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -1016,5 +1027,6 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/flytectl/main.go b/flytectl/main.go index 5951864944..89ecd8e65a 100644 --- a/flytectl/main.go +++ b/flytectl/main.go @@ -8,6 +8,6 @@ import ( func main() { if err := cmd.ExecuteCmd(); err != nil { - fmt.Printf("error: %v", err) + fmt.Printf("error: %v\n", err) } } diff --git a/flytectl/pkg/commandutils/command_utils.go b/flytectl/pkg/commandutils/command_utils.go new file mode 100644 index 0000000000..acee518a5f --- /dev/null +++ b/flytectl/pkg/commandutils/command_utils.go @@ -0,0 +1,26 @@ +package commandutils + +import ( + "bufio" + "fmt" + "log" + "os" + "strings" +) + +func AskForConfirmation(s string) bool { + reader := bufio.NewReader(os.Stdin) + for { + fmt.Printf("%s [y/n]: ", s) + response, err := reader.ReadString('\n') + if err != nil { + log.Fatal(err) + } + response = strings.ToLower(strings.TrimSpace(response)) + if response == "y" || response == "yes" { + return true + } else if response == "n" || response == "no" { + return false + } + } +} From 1468b6b495bd4d7fe198aa4d44d209a8970a3d7c Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Tue, 30 Mar 2021 15:22:53 -0400 Subject: [PATCH 031/645] update docs theme (#44) Signed-off-by: cosmicBboy --- flytectl/doc-requirements.in | 2 + flytectl/doc-requirements.txt | 18 ++++--- flytectl/docs/source/_static/custom.css | 33 +++++++++++++ .../docs/source/_templates/sidebar/brand.html | 18 +++++++ flytectl/docs/source/conf.py | 49 ++++++++++--------- flytectl/docs/source/index.rst | 49 ++++++++++--------- flytectl/docs/source/reference/index.rst | 24 +++++++++ 7 files changed, 141 insertions(+), 52 deletions(-) create mode 100644 flytectl/docs/source/_static/custom.css create mode 100644 flytectl/docs/source/_templates/sidebar/brand.html create mode 100644 flytectl/docs/source/reference/index.rst diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in index cdb6725a1b..8a0e088122 100644 --- a/flytectl/doc-requirements.in +++ b/flytectl/doc-requirements.in @@ -1,3 +1,5 @@ +furo +readthedocs-sphinx-search sphinx sphinx-prompt sphinx-material diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index d5a288dbd0..d01f9385bf 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -10,6 +10,7 @@ babel==2.9.0 # via sphinx beautifulsoup4==4.9.3 # via + # furo # sphinx-code-include # sphinx-material certifi==2020.12.5 @@ -20,19 +21,21 @@ css-html-js-minify==2.5.5 # via sphinx-material docutils==0.16 # via sphinx +furo==2021.3.20b30 + # via -r doc-requirements.in idna==2.10 # via requests imagesize==1.2.0 # via sphinx jinja2==2.11.3 # via sphinx -lxml==4.6.2 +lxml==4.6.3 # via sphinx-material markupsafe==1.1.1 # via jinja2 packaging==20.9 # via sphinx -pygments==2.7.4 +pygments==2.8.1 # via # sphinx # sphinx-prompt @@ -42,13 +45,15 @@ python-slugify[unidecode]==4.0.1 # via sphinx-material pytz==2021.1 # via babel +readthedocs-sphinx-search==0.1.0 + # via -r doc-requirements.in requests==2.25.1 # via sphinx six==1.15.0 # via sphinx-code-include snowballstemmer==2.1.0 # via sphinx -soupsieve==2.1 +soupsieve==2.2.1 # via beautifulsoup4 sphinx-code-include==1.1.1 # via -r doc-requirements.in @@ -56,11 +61,12 @@ sphinx-copybutton==0.3.1 # via -r doc-requirements.in sphinx-material==0.0.32 # via -r doc-requirements.in -sphinx-prompt==1.3.0 +sphinx-prompt==1.4.0 # via -r doc-requirements.in -sphinx==3.4.3 +sphinx==3.5.3 # via # -r doc-requirements.in + # furo # sphinx-code-include # sphinx-copybutton # sphinx-material @@ -81,7 +87,7 @@ text-unidecode==1.3 # via python-slugify unidecode==1.2.0 # via python-slugify -urllib3==1.26.3 +urllib3==1.26.4 # via requests # The following packages are considered to be unsafe in a requirements file: diff --git a/flytectl/docs/source/_static/custom.css b/flytectl/docs/source/_static/custom.css new file mode 100644 index 0000000000..786fcd2611 --- /dev/null +++ b/flytectl/docs/source/_static/custom.css @@ -0,0 +1,33 @@ +h1, h2, h3, h4, h5, h6 { + font-weight: bold; +} + +.sidebar-logo { + max-width: 30%; +} + + +.sidebar-tree .reference.external:after { + content: none; +} + +div.sphx-glr-download a { + color: #4300c9; + background-color: rgb(241, 241, 241); + background-image: none; + border: 1px solid rgb(202, 202, 202); +} + +div.sphx-glr-download a:hover { + background-color: rgb(230, 230, 230); + box-shadow: none; +} + +div.sphx-glr-thumbcontainer a.headerlink { + display: none; +} + +div.sphx-glr-thumbcontainer:hover { + border-color: white; + box-shadow: none; +} diff --git a/flytectl/docs/source/_templates/sidebar/brand.html b/flytectl/docs/source/_templates/sidebar/brand.html new file mode 100644 index 0000000000..a170d6c6d1 --- /dev/null +++ b/flytectl/docs/source/_templates/sidebar/brand.html @@ -0,0 +1,18 @@ +

diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index c346003f67..a5b237ba3f 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -41,6 +41,7 @@ "sphinx.ext.coverage", "sphinx-prompt", "sphinx_copybutton", + "sphinx_search.extension", ] # build the templated autosummary files @@ -73,48 +74,50 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path . -exclude_patterns = [] +exclude_patterns = [u'_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = "tango" +pygments_dark_style = "paraiso-dark" # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = "sphinx_material" +html_theme = "furo" +html_title = "Flyte Docs" html_logo = "flyte_circle_gradient_1_4x4.png" + html_theme_options = { - # Set the name of the project to appear in the navigation. - "nav_title": "Flyte", - # Set you GA account ID to enable tracking - "google_analytics_account": "G-YQL24L5CKY", - # Specify a base_url used to generate sitemap.xml. If not - # specified, then no sitemap will be built. - "base_url": "https://github.com/flyteorg/flytectl", - # Set the color and the accent color - "color_primary": "deep-purple", - "color_accent": "blue", - # Set the repo location to get a badge with stats - "repo_url": "https://github.com/flyteorg/flyte/", - "repo_name": "flyte", - # Visible levels of the global TOC; -1 means unlimited - "globaltoc_depth": 1, - # If False, expand all TOC entries - "globaltoc_collapse": False, - # If True, show hidden TOC entries - "globaltoc_includehidden": False, + "light_css_variables": { + "color-brand-primary": "#4300c9", + "color-brand-content": "#4300c9", + }, + "dark_css_variables": { + "color-brand-primary": "#9D68E4", + "color-brand-content": "#9D68E4", + }, +} + +html_context = { + "home_page": "https://docs.flyte.org", } # The default sidebars (for documents that don't match any pattern) are # defined by theme itself. Builtin themes are using these templates by # default: ``['localtoc.html', 'relations.html', 'sourcelink.html', # 'searchbox.html']``. -html_sidebars = {"**": ["logo-text.html", "globaltoc.html", "localtoc.html", "searchbox.html"]} +# html_sidebars = {"**": ["logo-text.html", "globaltoc.html", "localtoc.html", "searchbox.html"]} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = [] +html_static_path = ["_static"] +html_css_files = [ + "custom.css", +] # Custom sidebar templates, must be a dictionary that maps document names # to template names. diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 9833bf0c50..a950c89fc9 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -1,22 +1,22 @@ .. flytectl doc ########################################## -Welcome to ``Flytectl``'s documentation! +``Flytectl`` Reference ########################################## -Installation -============= +Install +======= Flytectl is a Golang binary and can be installed on any platform supported by -golang. To install simply copy paste the following into the command-line +golang. To install simply copy paste the following into the command-line: .. prompt:: bash curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash -Configuration -============== +Configure +========= Flytectl allows configuring using a YAML file or pass every configuration value on command-line. The follow configuration is useful to setup. @@ -30,23 +30,32 @@ Basic Configuration endpoint: dns:///flyte.lyft.net # Change insecure flag to ensure that you use the right setting for your environment insecure: true - # Logger settings to control logger output. Useful to debug - #logger: - #show-source: true - #level: 1 + # Logger settings to control logger output. Useful to debug logger: + show-source: true + level: 1 .. toctree:: :maxdepth: 1 - :caption: Flyte Core docs + :hidden: - Flyte Documentation + Getting Started + Tutorials + reference/index + Community - gen/flytectl .. toctree:: :maxdepth: 1 - :caption: Flytectl verbs + :caption: Flytectl + :hidden: + + Install and Configure + +.. toctree:: + :maxdepth: 1 + :caption: Verbs + :hidden: gen/flytectl_create gen/flytectl_get @@ -57,7 +66,8 @@ Basic Configuration .. toctree:: :maxdepth: 1 - :caption: Flytectl nouns + :caption: Nouns + :hidden: gen/flytectl_create_project gen/flytectl_create_execution @@ -74,13 +84,6 @@ Basic Configuration .. toctree:: :maxdepth: 2 :caption: Contribute + :hidden: contribute - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/flytectl/docs/source/reference/index.rst b/flytectl/docs/source/reference/index.rst new file mode 100644 index 0000000000..6b6ff34c49 --- /dev/null +++ b/flytectl/docs/source/reference/index.rst @@ -0,0 +1,24 @@ +############# +API Reference +############# + +.. toctree:: + :maxdepth: 1 + :caption: API Reference + :name: apitoc + + Flytekit Python + Flytekit Java + FlyteIDL + Flytectl + +.. toctree:: + :maxdepth: 1 + :caption: Component Reference (Code docs) + :name: componentreftoc + + FlytePropeller + FlyteAdmin + FlytePlugins + DataCatalog + \ No newline at end of file From cad9e39bf50cebdb9e417b80af15fafd3dc4081c Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Wed, 31 Mar 2021 12:00:09 -0400 Subject: [PATCH 032/645] dark theme updates (#45) Signed-off-by: cosmicBboy --- flytectl/docs/source/_static/custom.css | 66 +++++++++++++++++++++++-- flytectl/docs/source/conf.py | 2 +- 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/flytectl/docs/source/_static/custom.css b/flytectl/docs/source/_static/custom.css index 786fcd2611..d9851b7d8f 100644 --- a/flytectl/docs/source/_static/custom.css +++ b/flytectl/docs/source/_static/custom.css @@ -11,15 +11,24 @@ h1, h2, h3, h4, h5, h6 { content: none; } +.sphx-glr-thumbcontainer { + background-color: transparent; + border: transparent; +} + +.sphx-glr-thumbcontainer:hover { + border: transparent; +} + div.sphx-glr-download a { - color: #4300c9; - background-color: rgb(241, 241, 241); + color:white; + background-color: #9d68e4cf; background-image: none; - border: 1px solid rgb(202, 202, 202); + border: 1px solid #9d68e4cf; } div.sphx-glr-download a:hover { - background-color: rgb(230, 230, 230); + background-color: #8b48e2cf; box-shadow: none; } @@ -31,3 +40,52 @@ div.sphx-glr-thumbcontainer:hover { border-color: white; box-shadow: none; } + +.sphx-glr-script-out .highlight pre { + background-color: #f8f8f8; +} + +p.sphx-glr-script-out { + padding-top: 0em; +} + +.search__outer::-webkit-scrollbar-track { + border-radius: 0px; +} + +@media (prefers-color-scheme: dark) { + .search__outer { + background-color: #131416 !important; + border: 1px solid #131416 !important; + } + .search__outer__input { + background-color: #1a1c1e !important; + } + .search__result__single { + border-bottom: #303335 !important; + } + .outer_div_page_results:hover { + background-color: black; + } + .search__result__title, .rtd_ui_search_subtitle { + color: #9D68E4 !important; + border-bottom: 1px solid #9D68E4 !important; + } + .search__outer .search__result__title span, .search__outer .search__result__content span { + background-color: #9d68e454; + } + .search__result__subheading, .search__result__content { + color: #ffffffd9 !important; + } + .search__outer::-webkit-scrollbar-track { + background-color: #131416 !important; + } + .rtd__search__credits { + background-color: #1a1c1e !important; + border: 1px solid #1a1c1e !important; + color: #81868d !important; + } + .rtd__search__credits a, .search__error__box { + color: #9ca0a5 !important; + } + } diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index a5b237ba3f..51ec8df120 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -78,7 +78,7 @@ # The name of the Pygments (syntax highlighting) style to use. pygments_style = "tango" -pygments_dark_style = "paraiso-dark" +pygments_dark_style = "native" # -- Options for HTML output ------------------------------------------------- From 676f0cf847e952b01ce18e04d9487bafc153c717 Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Fri, 2 Apr 2021 19:47:34 +0530 Subject: [PATCH 033/645] Added different repo for brew release (#46) * Added different repo for brew release Signed-off-by: yuvraj * small fix Signed-off-by: yuvraj --- flytectl/.goreleaser.yml | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/flytectl/.goreleaser.yml b/flytectl/.goreleaser.yml index 18ace3b56b..43862c26fb 100644 --- a/flytectl/.goreleaser.yml +++ b/flytectl/.goreleaser.yml @@ -72,13 +72,12 @@ brews: # Default is 6 for all artifacts or each id if there a multiple versions. goarm: 6 - # NOTE: make sure the url_template, the token and given repo (github or gitlab) owner and name are from the - # same kind. We will probably unify this in the next major version like it is done with scoop. - + folder: Formula + # Github repository to push the tap to. tap: owner: flyteorg - name: flytectl + name: homebrew-tap # Template for the url which is determined by the given Token (github or gitlab) # Default for github is "https://github.com///releases/download/{{ .Tag }}/{{ .ArtifactName }}" @@ -98,16 +97,12 @@ brews: # Git author used to commit to the repository. # Defaults are shown. commit_author: - name: flytebot - email: flytebot@flyte.org - - # Caveats for the user of your binary. - # Default is empty. - caveats: "How to use this binary" + name: Flyte-Bot + email: admin@flyte.org # Your app's homepage. # Default is empty. - homepage: "https://flytectl.readthedocs.io/en/latest" + homepage: "https://docs.flyte.org/projects/flytectl" # Your app's description. # Default is empty. From 696065ce52ac4beffb94dc04348250132f010196 Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Fri, 2 Apr 2021 22:35:29 +0530 Subject: [PATCH 034/645] Added goreleaser dry run in build (#47) * Added goreleaser dry run in build Signed-off-by: yuvraj * bug fix in goreleaser Signed-off-by: yuvraj --- flytectl/.github/workflows/build.yaml | 7 ++- flytectl/.github/workflows/release.yml | 2 +- flytectl/.goreleaser.yml | 69 ++------------------------ 3 files changed, 12 insertions(+), 66 deletions(-) diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml index 4b78569361..a7d933fed4 100644 --- a/flytectl/.github/workflows/build.yaml +++ b/flytectl/.github/workflows/build.yaml @@ -11,6 +11,11 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + - name: Run GoReleaser dry run + uses: goreleaser/goreleaser-action@v2 + with: + version: latest + args: --snapshot --skip-publish --rm-dist - name: Unit Tests uses: cedrickring/golang-action@1.5.2 env: @@ -28,4 +33,4 @@ jobs: env: GO111MODULE: "on" with: - args: make install && make lint \ No newline at end of file + args: make install && make lint diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml index e4c2de9fd3..6f27d86990 100644 --- a/flytectl/.github/workflows/release.yml +++ b/flytectl/.github/workflows/release.yml @@ -16,4 +16,4 @@ jobs: version: latest args: release --rm-dist --debug env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} diff --git a/flytectl/.goreleaser.yml b/flytectl/.goreleaser.yml index 43862c26fb..4f9557b3cd 100644 --- a/flytectl/.goreleaser.yml +++ b/flytectl/.goreleaser.yml @@ -13,8 +13,9 @@ builds: ldflags: - -s -w -X github.com/flyteorg/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flytestdlib/version.BuildTime={{.Date}} archives: - - replacements: - darwin: macOS + - name_template: '{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}' + replacements: + darwin: Darwin linux: Linux windows: Windows 386: i386 @@ -32,46 +33,11 @@ changelog: exclude: - '^docs:' - '^test:' -scoop: - # Default is "https://github.com///releases/download/{{ .Tag }}/{{ .ArtifactName }}" - # url_template: "http://github.mycompany.com/foo/bar/releases/{{ .Tag }}/{{ .ArtifactName }}" - - # Repository to push the app manifest to. - bucket: - owner: flyteorg - name: flytectl - - # Git author used to commit to the repository. - # Defaults are shown. - commit_author: - name: goreleaserbot - email: goreleaser@carlosbecker.com - - # Your app's homepage. - # Default is empty. - homepage: "https://godoc.org/github.com/flyteorg/flytectl" - - # Your app's description. - # Default is empty. - description: "FlyteCtl is a command line tool to interact with a Flyte cluster." - - # Your app's license - # Default is empty. - license: Apache-2.0 - - # Persist data between application updates - persist: - - "config.toml" brews: - # Name template of the recipe # Default to project name name: flytectl - # GOARM to specify which 32-bit arm version to use if there are multiple versions - # from the build section. Brew formulas support atm only one 32-bit version. - # Default is 6 for all artifacts or each id if there a multiple versions. - goarm: 6 - folder: Formula # Github repository to push the tap to. @@ -79,21 +45,6 @@ brews: owner: flyteorg name: homebrew-tap - # Template for the url which is determined by the given Token (github or gitlab) - # Default for github is "https://github.com///releases/download/{{ .Tag }}/{{ .ArtifactName }}" - # Default for gitlab is "https://gitlab.com///uploads/{{ .ArtifactUploadHash }}/{{ .ArtifactName }}" - url_template: "http://github.com/flyteorg/flytectl/releases/{{ .Tag }}/{{ .ArtifactName }}" - - # Allows you to set a custom download strategy. Note that you'll need - # to implement the strategy and add it to your tap repository. - # Example: https://docs.brew.sh/Formula-Cookbook#specifying-the-download-strategy-explicitly - # Default is empty. - download_strategy: CurlDownloadStrategy. - - # Allows you to add a custom require_relative at the top of the formula template - # Default is empty - custom_require: custom_download_strategy - # Git author used to commit to the repository. # Defaults are shown. commit_author: @@ -108,18 +59,8 @@ brews: # Default is empty. description: "FlyteCtl is a command line tool to interact with a Flyte cluster." - # Setting this will prevent goreleaser to actually try to commit the updated - # formula - instead, the formula file will be stored on the dist folder only, - # leaving the responsibility of publishing it to the user. - # If set to auto, the release will not be uploaded to the homebrew tap - # in case there is an indicator for prerelease in the tag e.g. v1.0.0-rc1 # Default is false. skip_upload: auto - # So you can `brew test` your formula. - # Default is empty. - test: system "#{bin}/program --version" - - # Custom install script for brew. - # Default is 'bin.install "program"'. - install: bin.install "program" + dependencies: + - name: go \ No newline at end of file From 3904146af2ea42496e794f230b21fc65e3fbe5e9 Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Sat, 3 Apr 2021 00:03:13 +0530 Subject: [PATCH 035/645] Added version command (#41) * wip: Added version command Signed-off-by: Yuvraj * wip: small fix Signed-off-by: yuvraj * wip: version api call added Signed-off-by: yuvraj * added docs for version Signed-off-by: Yuvraj * wip: lint fix Signed-off-by: yuvraj * fix testcase Signed-off-by: yuvraj * Removed version pkg Signed-off-by: yuvraj * added json output in version command Signed-off-by: yuvraj * unit test added Signed-off-by: yuvraj * Added brew install in readme Signed-off-by: yuvraj --- flytectl/Makefile | 11 ++- flytectl/README.md | 3 +- flytectl/cmd/root.go | 7 +- flytectl/cmd/version.go | 17 ---- flytectl/cmd/version/version.go | 82 +++++++++++++++++++ flytectl/cmd/version/version_test.go | 34 ++++++++ flytectl/docs/source/gen/flytectl.rst | 2 +- .../source/gen/flytectl_get_launchplan.rst | 12 +-- .../docs/source/gen/flytectl_get_task.rst | 2 +- flytectl/docs/source/gen/flytectl_version.rst | 9 +- flytectl/go.mod | 7 +- flytectl/go.sum | 8 +- 12 files changed, 156 insertions(+), 38 deletions(-) delete mode 100644 flytectl/cmd/version.go create mode 100644 flytectl/cmd/version/version.go create mode 100644 flytectl/cmd/version/version_test.go diff --git a/flytectl/Makefile b/flytectl/Makefile index 2e5bcf7a82..8104b44ca9 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -1,6 +1,15 @@ export REPOSITORY=flytectl include boilerplate/lyft/golang_test_targets/Makefile +GIT_VERSION := $(shell git describe --always --tags) +GIT_HASH := $(shell git rev-parse --short HEAD) +TIMESTAMP := $(shell date '+%Y-%m-%d') +PACKAGE ?=github.com/flyteorg/flytestdlib + +LD_FLAGS="-s -w -X $(PACKAGE)/version.Version=$(GIT_VERSION) -X $(PACKAGE)/version.Build=$(GIT_HASH) -X $(PACKAGE)/version.BuildTime=$(TIMESTAMP)" + + + define PIP_COMPILE pip-compile $(1) --upgrade --verbose endef @@ -9,7 +18,7 @@ generate: go test github.com/flyteorg/flytectl/cmd --update compile: - go build -o bin/flytectl main.go + go build -o bin/flytectl -ldflags=$(LD_FLAGS) main.go .PHONY: update_boilerplate update_boilerplate: diff --git a/flytectl/README.md b/flytectl/README.md index 6f46476b67..18d1afe748 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -21,7 +21,8 @@ Generating docs locally can be accomplished by running make gendocs from within ## Installation ```bash -curl -s https://raw.githubusercontent.com/flyteorg/flytectl/master/install.sh | bash +$ brew tap flyteorg/homebrew-tap +$ brew install flytectl ``` ## Contributing diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 26bfc2b453..8ad0fef299 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -5,11 +5,13 @@ import ( "fmt" "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/create" "github.com/flyteorg/flytectl/cmd/delete" "github.com/flyteorg/flytectl/cmd/get" "github.com/flyteorg/flytectl/cmd/register" "github.com/flyteorg/flytectl/cmd/update" + "github.com/flyteorg/flytectl/cmd/version" "github.com/flyteorg/flytectl/pkg/printer" stdConfig "github.com/flyteorg/flytestdlib/config" "github.com/flyteorg/flytestdlib/config/viper" @@ -44,12 +46,15 @@ func newRootCmd() *cobra.Command { rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Domain), "domain", "d", "", "Specifies the Flyte project's domain.") rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Output), "output", "o", printer.OutputFormatTABLE.String(), fmt.Sprintf("Specifies the output type - supported formats %s", printer.OutputFormats())) rootCmd.AddCommand(viper.GetConfigCommand()) - rootCmd.AddCommand(versionCmd) rootCmd.AddCommand(get.CreateGetCommand()) rootCmd.AddCommand(create.RemoteCreateCommand()) rootCmd.AddCommand(update.CreateUpdateCommand()) rootCmd.AddCommand(register.RemoteRegisterCommand()) rootCmd.AddCommand(delete.RemoteDeleteCommand()) + // Added version command + versioncmd := version.GetVersionCommand(rootCmd) + cmdCore.AddCommands(rootCmd, versioncmd) + config.GetConfig() return rootCmd diff --git a/flytectl/cmd/version.go b/flytectl/cmd/version.go deleted file mode 100644 index 647a5a1eac..0000000000 --- a/flytectl/cmd/version.go +++ /dev/null @@ -1,17 +0,0 @@ -package cmd - -import ( - "github.com/flyteorg/flytestdlib/version" - "github.com/spf13/cobra" -) - -var ( - versionCmd = &cobra.Command{ - Use: "version", - Short: "Displays version information for the client and server.", - Run: func(cmd *cobra.Command, args []string) { - version.LogBuildInformation("flytectl") - // TODO: Log Admin version - }, - } -) diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go new file mode 100644 index 0000000000..57c7ddac08 --- /dev/null +++ b/flytectl/cmd/version/version.go @@ -0,0 +1,82 @@ +package version + +import ( + "context" + "encoding/json" + "fmt" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + stdlibversion "github.com/flyteorg/flytestdlib/version" + "github.com/spf13/cobra" +) + +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + versionCmdShort = `Used for fetching flyte version` + versionCmdLong = ` +Example version. +:: + + bin/flytectl version +` +) + +type versionOutput struct { + // Specifies the Name of app + App string `json:"App,omitempty"` + // Specifies the GIT sha of the build + Build string `json:"Build,omitempty"` + // Version for the build, should follow a semver + Version string `json:"Version,omitempty"` + // Build timestamp + BuildTime string `json:"BuildTime,omitempty"` +} + +// GetVersionCommand will return version command +func GetVersionCommand(rootCmd *cobra.Command) map[string]cmdCore.CommandEntry { + getResourcesFuncs := map[string]cmdCore.CommandEntry{ + "version": {CmdFunc: getVersion, Aliases: []string{"versions"}, ProjectDomainNotRequired: true, + Short: versionCmdShort, + Long: versionCmdLong}, + } + return getResourcesFuncs +} + +func getVersion(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + + v, err := cmdCtx.AdminClient().GetVersion(ctx, &admin.GetVersionRequest{}) + if err != nil { + return fmt.Errorf("err %v: ", err) + } + + // Print Flytectl + if err := printVersion(versionOutput{ + Build: stdlibversion.Build, + BuildTime: stdlibversion.BuildTime, + Version: stdlibversion.Version, + App: "flytectl", + }); err != nil { + return err + } + + // Print Flyteadmin + if err := printVersion(versionOutput{ + Build: v.ControlPlaneVersion.Build, + BuildTime: v.ControlPlaneVersion.BuildTime, + Version: v.ControlPlaneVersion.Version, + App: "controlPlane", + }); err != nil { + return err + } + return nil +} + +func printVersion(response versionOutput) error { + b, err := json.MarshalIndent(response, "", " ") + if err != nil { + return fmt.Errorf("err %v: ", err) + } + fmt.Print(string(b)) + return nil +} diff --git a/flytectl/cmd/version/version_test.go b/flytectl/cmd/version/version_test.go new file mode 100644 index 0000000000..acaf34a829 --- /dev/null +++ b/flytectl/cmd/version/version_test.go @@ -0,0 +1,34 @@ +package version + +import ( + "context" + "fmt" + "io" + "testing" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/stretchr/testify/assert" +) + +func TestListExecutionFunc(t *testing.T) { + ctx := context.Background() + var args []string + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + versionRequest := &admin.GetVersionRequest{} + versionResponse := &admin.GetVersionResponse{ + ControlPlaneVersion: &admin.Version{ + Build: "", + BuildTime: "", + Version: "", + }, + } + mockClient.OnGetVersionMatch(ctx, versionRequest).Return(versionResponse, nil) + err := getVersion(ctx, args, cmdCtx) + fmt.Println(err) + assert.Nil(t, nil) + mockClient.AssertCalled(t, "GetVersion", ctx, versionRequest) +} diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 70c8b01eba..89e4a4db9c 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -65,5 +65,5 @@ SEE ALSO * :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. * :doc:`flytectl_update` - Used for updating flyte resources eg: project. -* :doc:`flytectl_version` - Displays version information for the client and server. +* :doc:`flytectl_version` - Used for fetching flyte version diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 2746270b21..0cd64b8651 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -50,15 +50,15 @@ The generated file would look similar to this iamRoleARN: "" inputs: - numbers: - - 0 - numbers_count: 0 - run_local_at_count: 10 + numbers: + - 0 + numbers_count: 0 + run_local_at_count: 10 kubeServiceAcct: "" targetDomain: "" targetProject: "" - workflow: core.advanced.run_merge_sort.merge - version: "v3" + version: v3 + workflow: core.advanced.run_merge_sort.merge_sort Check the create execution section on how to launch one using the generated file. diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 245de2b4f3..5ccddc30c9 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -58,7 +58,7 @@ The generated file would look similar to this targetDomain: "" targetProject: "" task: core.advanced.run_merge_sort.merge - version: "v2" + version: v2 Check the create execution section on how to launch one using the generated file. diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index cbcf99db64..a56c061f65 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -3,13 +3,18 @@ flytectl version ---------------- -Displays version information for the client and server. +Used for fetching flyte version Synopsis ~~~~~~~~ -Displays version information for the client and server. + +Example version. +:: + + bin/flytectl version + :: diff --git a/flytectl/go.mod b/flytectl/go.mod index 5723376489..4e89215bdf 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -4,14 +4,15 @@ go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect - github.com/flyteorg/flyteidl v0.18.15 - github.com/flyteorg/flytestdlib v0.3.13 + github.com/flyteorg/flyteidl v0.18.25 + github.com/flyteorg/flytestdlib v0.3.15 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 github.com/google/uuid v1.1.2 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/kr/text v0.2.0 // indirect github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 + github.com/magiconair/properties v1.8.4 github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/mapstructure v1.4.1 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect @@ -26,5 +27,3 @@ require ( gopkg.in/yaml.v2 v2.4.0 sigs.k8s.io/yaml v1.2.0 ) - -replace github.com/flyteorg/flyteidl => github.com/flyteorg/flyteidl v0.18.21-0.20210317055906-f2ce9eb7bd1f diff --git a/flytectl/go.sum b/flytectl/go.sum index a189bc399e..cdd768fdab 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -173,10 +173,11 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.18.21-0.20210317055906-f2ce9eb7bd1f h1:7qRMZRPQXUVpebBt92msIzQBRtJ4fraWhd75qA6oqaE= -github.com/flyteorg/flyteidl v0.18.21-0.20210317055906-f2ce9eb7bd1f/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= -github.com/flyteorg/flytestdlib v0.3.13 h1:5ioA/q3ixlyqkFh5kDaHgmPyTP/AHtqq1K/TIbVLUzM= +github.com/flyteorg/flyteidl v0.18.25 h1:XbHwM4G1u5nGAcdKod+ENgbL84cHdNzQIWY+NajuHs8= +github.com/flyteorg/flyteidl v0.18.25/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= +github.com/flyteorg/flytestdlib v0.3.15 h1:vzsfqriENyavv6EBwsIm55di2wC+j0jkmjw30JGHAkM= +github.com/flyteorg/flytestdlib v0.3.15/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -230,7 +231,6 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= From e3aaedb08f617e5fd9a8d60dcfbf05d7c05639df Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Sat, 3 Apr 2021 20:03:58 +0530 Subject: [PATCH 036/645] Update template formate in install script (#48) Signed-off-by: yuvraj --- flytectl/install.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) mode change 100644 => 100755 flytectl/install.sh diff --git a/flytectl/install.sh b/flytectl/install.sh old mode 100644 new mode 100755 index 8cd6b6ebd1..150ae277af --- a/flytectl/install.sh +++ b/flytectl/install.sh @@ -1,6 +1,6 @@ #!/bin/sh set -e -# Code generated by godownloader on 2021-02-08T20:29:16Z. DO NOT EDIT. +# Code generated by godownloader on 2021-04-03T07:49:04Z. DO NOT EDIT. # usage() { @@ -101,7 +101,7 @@ adjust_os() { case ${OS} in 386) OS=i386 ;; amd64) OS=x86_64 ;; - darwin) OS=macOS ;; + darwin) OS=Darwin ;; linux) OS=Linux ;; windows) OS=Windows ;; esac @@ -112,7 +112,7 @@ adjust_arch() { case ${ARCH} in 386) ARCH=i386 ;; amd64) ARCH=x86_64 ;; - darwin) ARCH=macOS ;; + darwin) ARCH=Darwin ;; linux) ARCH=Linux ;; windows) ARCH=Windows ;; esac @@ -382,7 +382,7 @@ adjust_arch log_info "found version: ${VERSION} for ${TAG}/${OS}/${ARCH}" -NAME=${PROJECT_NAME}_${VERSION}_${OS}_${ARCH} +NAME=${PROJECT_NAME}_${OS}_${ARCH} TARBALL=${NAME}.${FORMAT} TARBALL_URL=${GITHUB_DOWNLOAD}/${TAG}/${TARBALL} CHECKSUM=checksums.txt From 6a00fb3f3cc18782cc557b82512de24fb6957de1 Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Sat, 10 Apr 2021 05:21:29 +0530 Subject: [PATCH 037/645] fix config in docs (#50) Signed-off-by: yuvraj --- flytectl/docs/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index a950c89fc9..0f381d5e59 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -30,12 +30,12 @@ Basic Configuration endpoint: dns:///flyte.lyft.net # Change insecure flag to ensure that you use the right setting for your environment insecure: true + logger: # Logger settings to control logger output. Useful to debug logger: show-source: true level: 1 - .. toctree:: :maxdepth: 1 :hidden: From c673d3b7dac5d78f4a077459e88e921004755c04 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Sun, 18 Apr 2021 10:53:18 +0530 Subject: [PATCH 038/645] Bumped up the flyteidl version to fix create execution issue (#53) * Bumped up the flyteidl version to fix create execution issue Signed-off-by: Prafulla Mahindrakar * Dummy commit Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/update/project.go | 2 +- flytectl/go.mod | 3 +-- flytectl/go.sum | 2 ++ 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 0c13b7ed74..5865c7e6af 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -20,7 +20,7 @@ type ProjectConfig struct { const ( projectShort = "Updates project resources" projectLong = ` -Updates the project according the flags passed.Allows you to archive or activate a project. +Updates the project according the flags passed. Allows you to archive or activate a project. Activates project named flytesnacks. :: diff --git a/flytectl/go.mod b/flytectl/go.mod index 4e89215bdf..ca000d677b 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect - github.com/flyteorg/flyteidl v0.18.25 + github.com/flyteorg/flyteidl v0.18.32 github.com/flyteorg/flytestdlib v0.3.15 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 @@ -12,7 +12,6 @@ require ( github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/kr/text v0.2.0 // indirect github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 - github.com/magiconair/properties v1.8.4 github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/mapstructure v1.4.1 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index cdd768fdab..699d774fb8 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -175,6 +175,8 @@ github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v0.18.25 h1:XbHwM4G1u5nGAcdKod+ENgbL84cHdNzQIWY+NajuHs8= github.com/flyteorg/flyteidl v0.18.25/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= +github.com/flyteorg/flyteidl v0.18.32 h1:Z+DeBh4i+mZK75lfJwmsHPf23nbsp2Qiv+kCnGMY9Ds= +github.com/flyteorg/flyteidl v0.18.32/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.15 h1:vzsfqriENyavv6EBwsIm55di2wC+j0jkmjw30JGHAkM= github.com/flyteorg/flytestdlib v0.3.15/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= From 89f6e6f3dc732ac98fddf858f2828eb26860eaa7 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Tue, 20 Apr 2021 22:08:11 +0530 Subject: [PATCH 039/645] Added capability to relaunch an execution (#52) * Added capability to relaunch an execution Signed-off-by: Prafulla Mahindrakar * Added more coverage Signed-off-by: Prafulla Mahindrakar * Moved around test function Signed-off-by: Prafulla Mahindrakar * Added few more tests Signed-off-by: Prafulla Mahindrakar * Using RelaunchExecution directly Signed-off-by: Prafulla Mahindrakar * added comments for interface and renamed the file Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/create/execution.go | 28 +++++- flytectl/cmd/create/execution_test.go | 71 +++++++++++-- flytectl/cmd/create/execution_util.go | 47 ++++++--- flytectl/cmd/create/execution_util_test.go | 56 +++++++++++ flytectl/cmd/create/executionconfig_flags.go | 12 ++- flytectl/cmd/get/execution.go | 9 +- flytectl/cmd/get/execution_util.go | 16 +++ flytectl/cmd/get/get.go | 12 +++ .../cmd/get/interfaces/fetcher_interface.go | 16 +++ flytectl/cmd/get/interfaces/mocks/fetcher.go | 99 +++++++++++++++++++ .../cmd/get/interfaces/mocks/get_execution.go | 58 +++++++++++ flytectl/cmd/get/launch_plan_util.go | 4 +- flytectl/cmd/get/launchplanconfig_flags.go | 2 +- flytectl/cmd/get/taskconfig_flags.go | 6 +- .../cmd/testdata/invalid_execution_spec.yaml | 12 +++ .../cmd/testdata/task_execution_spec.yaml | 4 +- .../source/gen/flytectl_create_execution.rst | 7 ++ 17 files changed, 413 insertions(+), 46 deletions(-) create mode 100644 flytectl/cmd/create/execution_util_test.go create mode 100644 flytectl/cmd/get/interfaces/fetcher_interface.go create mode 100644 flytectl/cmd/get/interfaces/mocks/fetcher.go create mode 100644 flytectl/cmd/get/interfaces/mocks/get_execution.go create mode 100644 flytectl/cmd/testdata/invalid_execution_spec.yaml diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index b687790e12..d80f310b90 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -72,6 +72,12 @@ The root project and domain flags of -p and -d should point to task/launch plans flytectl create execution --execFile execution_spec.yaml -p flytectldemo -d development --targetProject flytesnacks +Also an execution can be relaunched by passing in current execution id. + +:: + + flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development + Usage ` ) @@ -86,6 +92,7 @@ type ExecutionConfig struct { TargetProject string `json:"targetProject" pflag:",project where execution needs to be created.If not specified configured project would be used."` KubeServiceAcct string `json:"kubeServiceAcct" pflag:",kubernetes service account AuthRole for launching execution."` IamRoleARN string `json:"iamRoleARN" pflag:",iam role ARN AuthRole for launching execution."` + Relaunch string `json:"relaunch" pflag:",execution id to be relaunched."` // Non plfag section is read from the execution config generated by get task/launchplan Workflow string `json:"workflow,omitempty"` Task string `json:"task,omitempty"` @@ -93,9 +100,17 @@ type ExecutionConfig struct { Inputs map[string]interface{} `json:"inputs"` } +type ExecutionType int + +const ( + Task ExecutionType = iota + Workflow + Relaunch +) + type ExecutionParams struct { - name string - isTask bool + name string + execType ExecutionType } var ( @@ -111,14 +126,19 @@ func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.C return err } var executionRequest *admin.ExecutionCreateRequest - if execParams.isTask { + switch execParams.execType { + case Relaunch: + return relaunchExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx) + case Task: if executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx); err != nil { return err } - } else { + case Workflow: if executionRequest, err = createExecutionRequestForWorkflow(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx); err != nil { return err } + default: + return fmt.Errorf("invalid execution type %v", execParams.execType) } exec, _err := cmdCtx.AdminClient().CreateExecution(ctx, executionRequest) if _err != nil { diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index cb9fa4cc15..9a593760c9 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -1,6 +1,7 @@ package create import ( + "fmt" "testing" "github.com/flyteorg/flytectl/cmd/config" @@ -129,6 +130,36 @@ func createExecutionSetup() { } mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan1, nil) } + +func TestCreateTaskExecutionFunc(t *testing.T) { + setup() + createExecutionSetup() + executionCreateResponseTask := &admin.ExecutionCreateResponse{ + Id: &core.WorkflowExecutionIdentifier{ + Project: "flytesnacks", + Domain: "development", + Name: "ff513c0e44b5b4a35aa5", + }, + } + mockClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseTask, nil) + executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" + err = createExecutionCommand(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) + tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) +} + +func TestCreateTaskExecutionFuncError(t *testing.T) { + setup() + createExecutionSetup() + mockClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(nil, fmt.Errorf("error launching task")) + executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" + err = createExecutionCommand(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error launching task"), err) + mockClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) +} + func TestCreateLaunchPlanExecutionFunc(t *testing.T) { setup() createExecutionSetup() @@ -147,20 +178,46 @@ func TestCreateLaunchPlanExecutionFunc(t *testing.T) { tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) } -func TestCreateTaskExecutionFunc(t *testing.T) { +func TestCreateRelaunchExecutionFunc(t *testing.T) { setup() createExecutionSetup() - executionCreateResponseTask := &admin.ExecutionCreateResponse{ + relaunchExecResponse := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", Domain: "development", - Name: "ff513c0e44b5b4a35aa5", + Name: "f652ea3596e7f4d80a0e", }, } - mockClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseTask, nil) - executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" + + executionConfig.Relaunch = relaunchExecResponse.Id.Name + relaunchRequest := &admin.ExecutionRelaunchRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Name: executionConfig.Relaunch, + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + }, + } + mockClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(relaunchExecResponse, nil) err = createExecutionCommand(ctx, args, cmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) - tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) + mockClient.AssertCalled(t, "RelaunchExecution", ctx, relaunchRequest) + tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) +} + +func TestCreateExecutionFuncInvalid(t *testing.T) { + setup() + createExecutionSetup() + executionConfig.Relaunch = "" + executionConfig.ExecFile = "" + err = createExecutionCommand(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("executionConfig or relaunch can't be empty. Run the flytectl get task/launchplan to generate the config"), err) + executionConfig.ExecFile = "Invalid-file" + err = createExecutionCommand(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to read from %v yaml file", executionConfig.ExecFile), err) + executionConfig.ExecFile = testDataFolder + "invalid_execution_spec.yaml" + err = createExecutionCommand(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("either one of task or workflow name should be specified to launch an execution"), err) } diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index acb3f595d8..dd21867ba8 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -2,7 +2,6 @@ package create import ( "context" - "errors" "fmt" "io/ioutil" "strings" @@ -11,7 +10,6 @@ import ( cmdGet "github.com/flyteorg/flytectl/cmd/get" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/google/uuid" "sigs.k8s.io/yaml" ) @@ -20,7 +18,7 @@ func createExecutionRequestForWorkflow(ctx context.Context, workflowName string, var lp *admin.LaunchPlan var err error // Fetch the launch plan - if lp, err = cmdGet.FetchLPVersion(ctx, workflowName, executionConfig.Version, project, domain, cmdCtx); err != nil { + if lp, err = cmdGet.DefaultFetcher.FetchLPVersion(ctx, workflowName, executionConfig.Version, project, domain, cmdCtx); err != nil { return nil, err } // Create workflow params literal map @@ -70,6 +68,21 @@ func createExecutionRequestForTask(ctx context.Context, taskName string, project return createExecutionRequest(ID, inputs, authRole), nil } +func relaunchExecution(ctx context.Context, executionName string, project string, domain string, cmdCtx cmdCore.CommandContext) error { + relaunchedExec, err := cmdCtx.AdminClient().RelaunchExecution(ctx, &admin.ExecutionRelaunchRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Name: executionName, + Project: project, + Domain: domain, + }, + }) + if err != nil { + return err + } + fmt.Printf("execution identifier %v\n", relaunchedExec.Id) + return nil +} + func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, authRole *admin.AuthRole) *admin.ExecutionCreateRequest { return &admin.ExecutionCreateRequest{ Project: executionConfig.TargetProject, @@ -100,32 +113,36 @@ func readExecConfigFromFile(fileName string) (*ExecutionConfig, error) { return &executionConfigRead, nil } -func resolveOverrides(readExecutionConfig *ExecutionConfig, project string, domain string) { +func resolveOverrides(toBeOverridden *ExecutionConfig, project string, domain string) { if executionConfig.KubeServiceAcct != "" { - readExecutionConfig.KubeServiceAcct = executionConfig.KubeServiceAcct + toBeOverridden.KubeServiceAcct = executionConfig.KubeServiceAcct } if executionConfig.IamRoleARN != "" { - readExecutionConfig.IamRoleARN = executionConfig.IamRoleARN + toBeOverridden.IamRoleARN = executionConfig.IamRoleARN } if executionConfig.TargetProject != "" { - readExecutionConfig.TargetProject = executionConfig.TargetProject + toBeOverridden.TargetProject = executionConfig.TargetProject } if executionConfig.TargetDomain != "" { - readExecutionConfig.TargetDomain = executionConfig.TargetDomain + toBeOverridden.TargetDomain = executionConfig.TargetDomain } // Use the root project and domain to launch the task/workflow if target is unspecified if executionConfig.TargetProject == "" { - readExecutionConfig.TargetProject = project + toBeOverridden.TargetProject = project } if executionConfig.TargetDomain == "" { - readExecutionConfig.TargetDomain = domain + toBeOverridden.TargetDomain = domain } } func readConfigAndValidate(project string, domain string) (ExecutionParams, error) { executionParams := ExecutionParams{} - if executionConfig.ExecFile == "" { - return executionParams, errors.New("executionConfig can't be empty. Run the flytectl get task/launchplan to generate the config") + if executionConfig.ExecFile == "" && executionConfig.Relaunch == "" { + return executionParams, fmt.Errorf("executionConfig or relaunch can't be empty. Run the flytectl get task/launchplan to generate the config") + } + if executionConfig.Relaunch != "" { + resolveOverrides(executionConfig, project, domain) + return ExecutionParams{name: executionConfig.Relaunch, execType: Relaunch}, nil } var readExecutionConfig *ExecutionConfig var err error @@ -138,11 +155,13 @@ func readConfigAndValidate(project string, domain string) (ExecutionParams, erro isTask := readExecutionConfig.Task != "" isWorkflow := readExecutionConfig.Workflow != "" if isTask == isWorkflow { - return executionParams, errors.New("either one of task or workflow name should be specified to launch an execution") + return executionParams, fmt.Errorf("either one of task or workflow name should be specified to launch an execution") } name := readExecutionConfig.Task + execType := Task if !isTask { name = readExecutionConfig.Workflow + execType = Workflow } - return ExecutionParams{name: name, isTask: isTask}, nil + return ExecutionParams{name: name, execType: execType}, nil } diff --git a/flytectl/cmd/create/execution_util_test.go b/flytectl/cmd/create/execution_util_test.go new file mode 100644 index 0000000000..db3a084225 --- /dev/null +++ b/flytectl/cmd/create/execution_util_test.go @@ -0,0 +1,56 @@ +package create + +import ( + "errors" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + "github.com/stretchr/testify/assert" +) + +var ( + relaunchExecResponse *admin.ExecutionCreateResponse + relaunchRequest *admin.ExecutionRelaunchRequest +) + +// This function needs to be called after testutils.Steup() +func createExecutionUtilSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient + relaunchExecResponse = &admin.ExecutionCreateResponse{ + Id: &core.WorkflowExecutionIdentifier{ + Project: "flytesnacks", + Domain: "development", + Name: "f652ea3596e7f4d80a0e", + }, + } + relaunchRequest = &admin.ExecutionRelaunchRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Name: "execName", + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + }, + } +} + +func TestCreateExecutionForRelaunch(t *testing.T) { + setup() + createExecutionUtilSetup() + mockClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(relaunchExecResponse, nil) + err = relaunchExecution(ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) + assert.Nil(t, err) +} + +func TestCreateExecutionForRelaunchNotFound(t *testing.T) { + setup() + createExecutionUtilSetup() + mockClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(nil, errors.New("unknown execution")) + err = relaunchExecution(ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, err, errors.New("unknown execution")) +} diff --git a/flytectl/cmd/create/executionconfig_flags.go b/flytectl/cmd/create/executionconfig_flags.go index 4a9774dff0..59dc9adf41 100755 --- a/flytectl/cmd/create/executionconfig_flags.go +++ b/flytectl/cmd/create/executionconfig_flags.go @@ -41,10 +41,12 @@ func (ExecutionConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("ExecutionConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(executionConfig.ExecFile),fmt.Sprintf("%v%v", prefix, "execFile"), executionConfig.ExecFile, "file for the execution params.If not specified defaults to <_name>.execution_spec.yaml") - cmdFlags.StringVar(&(executionConfig.TargetDomain),fmt.Sprintf("%v%v", prefix, "targetDomain"), executionConfig.TargetDomain, "project where execution needs to be created.If not specified configured domain would be used.") - cmdFlags.StringVar(&(executionConfig.TargetProject),fmt.Sprintf("%v%v", prefix, "targetProject"), executionConfig.TargetProject, "project where execution needs to be created.If not specified configured project would be used.") - cmdFlags.StringVar(&(executionConfig.KubeServiceAcct),fmt.Sprintf("%v%v", prefix, "kubeServiceAcct"), executionConfig.KubeServiceAcct, "kubernetes service account AuthRole for launching execution.") - cmdFlags.StringVar(&(executionConfig.IamRoleARN),fmt.Sprintf("%v%v", prefix, "iamRoleARN"), executionConfig.IamRoleARN, "iam role ARN AuthRole for launching execution.") + cmdFlags.StringVar(&(executionConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), executionConfig.ExecFile, "file for the execution params.If not specified defaults to <_name>.execution_spec.yaml") + cmdFlags.StringVar(&(executionConfig.TargetDomain), fmt.Sprintf("%v%v", prefix, "targetDomain"), executionConfig.TargetDomain, "project where execution needs to be created.If not specified configured domain would be used.") + cmdFlags.StringVar(&(executionConfig.TargetProject), fmt.Sprintf("%v%v", prefix, "targetProject"), executionConfig.TargetProject, "project where execution needs to be created.If not specified configured project would be used.") + cmdFlags.StringVar(&(executionConfig.KubeServiceAcct), fmt.Sprintf("%v%v", prefix, "kubeServiceAcct"), executionConfig.KubeServiceAcct, "kubernetes service account AuthRole for launching execution.") + cmdFlags.StringVar(&(executionConfig.IamRoleARN), fmt.Sprintf("%v%v", prefix, "iamRoleARN"), executionConfig.IamRoleARN, "iam role ARN AuthRole for launching execution.") + cmdFlags.StringVar(&(executionConfig.Relaunch), fmt.Sprintf("%v%v", prefix, "relaunch"), executionConfig.Relaunch, "execution id to be relaunched.") + return cmdFlags } diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index f7d91812c1..e6ab431df5 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -4,7 +4,6 @@ import ( "context" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" @@ -70,13 +69,7 @@ func getExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Command var executions []*admin.Execution if len(args) > 0 { name := args[0] - execution, err := cmdCtx.AdminClient().GetExecution(ctx, &admin.WorkflowExecutionGetRequest{ - Id: &core.WorkflowExecutionIdentifier{ - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - Name: name, - }, - }) + execution, err := DefaultFetcher.FetchExecution(ctx, name, config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) if err != nil { return err } diff --git a/flytectl/cmd/get/execution_util.go b/flytectl/cmd/get/execution_util.go index da330af39e..2a563f4165 100644 --- a/flytectl/cmd/get/execution_util.go +++ b/flytectl/cmd/get/execution_util.go @@ -1,11 +1,13 @@ package get import ( + "context" "errors" "fmt" "io/ioutil" "os" + cmdCore "github.com/flyteorg/flytectl/cmd/core" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" "github.com/flyteorg/flyteidl/clients/go/coreutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -27,6 +29,20 @@ type ExecutionConfig struct { Inputs map[string]interface{} `json:"inputs"` } +func (f FetcherImpl) FetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.Execution, error) { + e, err := cmdCtx.AdminClient().GetExecution(ctx, &admin.WorkflowExecutionGetRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Project: project, + Domain: domain, + Name: name, + }, + }) + if err != nil { + return nil, err + } + return e, nil +} + func WriteExecConfigToFile(executionConfig ExecutionConfig, fileName string) error { d, err := yaml.Marshal(executionConfig) if err != nil { diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index e875a0ca01..46f392c4d0 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -2,6 +2,7 @@ package get import ( cmdcore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/get/interfaces" "github.com/spf13/cobra" ) @@ -17,6 +18,17 @@ Example get projects. ` ) +var ( + DefaultFetcher = NewFetcherImpl() +) + +func NewFetcherImpl() interfaces.Fetcher { + return FetcherImpl{} +} + +type FetcherImpl struct { +} + // CreateGetCommand will return get command func CreateGetCommand() *cobra.Command { getCmd := &cobra.Command{ diff --git a/flytectl/cmd/get/interfaces/fetcher_interface.go b/flytectl/cmd/get/interfaces/fetcher_interface.go new file mode 100644 index 0000000000..62a007e848 --- /dev/null +++ b/flytectl/cmd/get/interfaces/fetcher_interface.go @@ -0,0 +1,16 @@ +package interfaces + +import ( + "context" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +//go:generate mockery -all -case=underscore + +// Interface for exposing the fetch capabilities to other modules. eg : create execution which requires to fetch launchplan details. +type Fetcher interface { + FetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.Execution, error) + FetchLPVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.LaunchPlan, error) +} diff --git a/flytectl/cmd/get/interfaces/mocks/fetcher.go b/flytectl/cmd/get/interfaces/mocks/fetcher.go new file mode 100644 index 0000000000..61742c70c6 --- /dev/null +++ b/flytectl/cmd/get/interfaces/mocks/fetcher.go @@ -0,0 +1,99 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + cmdcore "github.com/flyteorg/flytectl/cmd/core" + admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + context "context" + + mock "github.com/stretchr/testify/mock" +) + +// Fetcher is an autogenerated mock type for the Fetcher type +type Fetcher struct { + mock.Mock +} + +type Fetcher_FetchExecution struct { + *mock.Call +} + +func (_m Fetcher_FetchExecution) Return(_a0 *admin.Execution, _a1 error) *Fetcher_FetchExecution { + return &Fetcher_FetchExecution{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Fetcher) OnFetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdcore.CommandContext) *Fetcher_FetchExecution { + c := _m.On("FetchExecution", ctx, name, project, domain, cmdCtx) + return &Fetcher_FetchExecution{Call: c} +} + +func (_m *Fetcher) OnFetchExecutionMatch(matchers ...interface{}) *Fetcher_FetchExecution { + c := _m.On("FetchExecution", matchers...) + return &Fetcher_FetchExecution{Call: c} +} + +// FetchExecution provides a mock function with given fields: ctx, name, project, domain, cmdCtx +func (_m *Fetcher) FetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdcore.CommandContext) (*admin.Execution, error) { + ret := _m.Called(ctx, name, project, domain, cmdCtx) + + var r0 *admin.Execution + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, cmdcore.CommandContext) *admin.Execution); ok { + r0 = rf(ctx, name, project, domain, cmdCtx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Execution) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, cmdcore.CommandContext) error); ok { + r1 = rf(ctx, name, project, domain, cmdCtx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type Fetcher_FetchLPVersion struct { + *mock.Call +} + +func (_m Fetcher_FetchLPVersion) Return(_a0 *admin.LaunchPlan, _a1 error) *Fetcher_FetchLPVersion { + return &Fetcher_FetchLPVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Fetcher) OnFetchLPVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdcore.CommandContext) *Fetcher_FetchLPVersion { + c := _m.On("FetchLPVersion", ctx, name, version, project, domain, cmdCtx) + return &Fetcher_FetchLPVersion{Call: c} +} + +func (_m *Fetcher) OnFetchLPVersionMatch(matchers ...interface{}) *Fetcher_FetchLPVersion { + c := _m.On("FetchLPVersion", matchers...) + return &Fetcher_FetchLPVersion{Call: c} +} + +// FetchLPVersion provides a mock function with given fields: ctx, name, version, project, domain, cmdCtx +func (_m *Fetcher) FetchLPVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdcore.CommandContext) (*admin.LaunchPlan, error) { + ret := _m.Called(ctx, name, version, project, domain, cmdCtx) + + var r0 *admin.LaunchPlan + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string, cmdcore.CommandContext) *admin.LaunchPlan); ok { + r0 = rf(ctx, name, version, project, domain, cmdCtx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.LaunchPlan) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string, cmdcore.CommandContext) error); ok { + r1 = rf(ctx, name, version, project, domain, cmdCtx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/flytectl/cmd/get/interfaces/mocks/get_execution.go b/flytectl/cmd/get/interfaces/mocks/get_execution.go new file mode 100644 index 0000000000..0df4fcf5ac --- /dev/null +++ b/flytectl/cmd/get/interfaces/mocks/get_execution.go @@ -0,0 +1,58 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + cmdcore "github.com/flyteorg/flytectl/cmd/core" + admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + context "context" + + mock "github.com/stretchr/testify/mock" +) + +// GetExecution is an autogenerated mock type for the GetExecution type +type GetExecution struct { + mock.Mock +} + +type GetExecution_FetchExecution struct { + *mock.Call +} + +func (_m GetExecution_FetchExecution) Return(_a0 *admin.Execution, _a1 error) *GetExecution_FetchExecution { + return &GetExecution_FetchExecution{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *GetExecution) OnFetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdcore.CommandContext) *GetExecution_FetchExecution { + c := _m.On("FetchExecution", ctx, name, project, domain, cmdCtx) + return &GetExecution_FetchExecution{Call: c} +} + +func (_m *GetExecution) OnFetchExecutionMatch(matchers ...interface{}) *GetExecution_FetchExecution { + c := _m.On("FetchExecution", matchers...) + return &GetExecution_FetchExecution{Call: c} +} + +// FetchExecution provides a mock function with given fields: ctx, name, project, domain, cmdCtx +func (_m *GetExecution) FetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdcore.CommandContext) (*admin.Execution, error) { + ret := _m.Called(ctx, name, project, domain, cmdCtx) + + var r0 *admin.Execution + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, cmdcore.CommandContext) *admin.Execution); ok { + r0 = rf(ctx, name, project, domain, cmdCtx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Execution) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, cmdcore.CommandContext) error); ok { + r1 = rf(ctx, name, project, domain, cmdCtx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/flytectl/cmd/get/launch_plan_util.go b/flytectl/cmd/get/launch_plan_util.go index e72c6e9094..d3a803e32b 100644 --- a/flytectl/cmd/get/launch_plan_util.go +++ b/flytectl/cmd/get/launch_plan_util.go @@ -20,7 +20,7 @@ func FetchLPForName(ctx context.Context, name string, project string, domain str } launchPlans = append(launchPlans, lp) } else if launchPlanConfig.Version != "" { - if lp, err = FetchLPVersion(ctx, name, launchPlanConfig.Version, project, domain, cmdCtx); err != nil { + if lp, err = DefaultFetcher.FetchLPVersion(ctx, name, launchPlanConfig.Version, project, domain, cmdCtx); err != nil { return nil, err } launchPlans = append(launchPlans, lp) @@ -73,7 +73,7 @@ func FetchLPLatestVersion(ctx context.Context, name string, project string, doma return lp, nil } -func FetchLPVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.LaunchPlan, error) { +func (f FetcherImpl) FetchLPVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.LaunchPlan, error) { lp, err := cmdCtx.AdminClient().GetLaunchPlan(ctx, &admin.ObjectGetRequest{ Id: &core.Identifier{ ResourceType: core.ResourceType_LAUNCH_PLAN, diff --git a/flytectl/cmd/get/launchplanconfig_flags.go b/flytectl/cmd/get/launchplanconfig_flags.go index 00becdd073..f4e37ea0c4 100755 --- a/flytectl/cmd/get/launchplanconfig_flags.go +++ b/flytectl/cmd/get/launchplanconfig_flags.go @@ -43,6 +43,6 @@ func (cfg LaunchPlanConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("LaunchPlanConfig", pflag.ExitOnError) cmdFlags.StringVar(&(launchPlanConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), launchPlanConfig.ExecFile, "execution file name to be used for generating execution spec of a single launchplan.") cmdFlags.StringVar(&(launchPlanConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), launchPlanConfig.Version, "version of the launchplan to be fetched.") - cmdFlags.BoolVar(&(launchPlanConfig.Latest),fmt.Sprintf("%v%v", prefix, "latest"), launchPlanConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") + cmdFlags.BoolVar(&(launchPlanConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), launchPlanConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") return cmdFlags } diff --git a/flytectl/cmd/get/taskconfig_flags.go b/flytectl/cmd/get/taskconfig_flags.go index 5379d61df7..71a3fadabc 100755 --- a/flytectl/cmd/get/taskconfig_flags.go +++ b/flytectl/cmd/get/taskconfig_flags.go @@ -41,8 +41,8 @@ func (TaskConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg TaskConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("TaskConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(taskConfig.ExecFile),fmt.Sprintf("%v%v", prefix, "execFile"), taskConfig.ExecFile, "execution file name to be used for generating execution spec of a single task.") - cmdFlags.StringVar(&(taskConfig.Version),fmt.Sprintf("%v%v", prefix, "version"), taskConfig.Version, "version of the task to be fetched.") - cmdFlags.BoolVar(&(taskConfig.Latest),fmt.Sprintf("%v%v", prefix, "latest"), taskConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") + cmdFlags.StringVar(&(taskConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), taskConfig.ExecFile, "execution file name to be used for generating execution spec of a single task.") + cmdFlags.StringVar(&(taskConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), taskConfig.Version, "version of the task to be fetched.") + cmdFlags.BoolVar(&(taskConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), taskConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") return cmdFlags } diff --git a/flytectl/cmd/testdata/invalid_execution_spec.yaml b/flytectl/cmd/testdata/invalid_execution_spec.yaml new file mode 100644 index 0000000000..556bb512c7 --- /dev/null +++ b/flytectl/cmd/testdata/invalid_execution_spec.yaml @@ -0,0 +1,12 @@ +iamRoleARN: "" +inputs: + numbers: + - 0 + numbers_count: 0 + run_local_at_count: 10 +kubeServiceAcct: "" +targetDomain: "" +targetProject: "" +version: v3 +workflow: core.advanced.run_merge_sort.merge_sort +task: core.advanced.run_merge_sort.merge diff --git a/flytectl/cmd/testdata/task_execution_spec.yaml b/flytectl/cmd/testdata/task_execution_spec.yaml index aba4e46d6d..aa33cdb355 100644 --- a/flytectl/cmd/testdata/task_execution_spec.yaml +++ b/flytectl/cmd/testdata/task_execution_spec.yaml @@ -1,4 +1,4 @@ -iamRoleARN: "" +iamRoleARN: "iamRoleARN" inputs: sorted_list1: - 0 @@ -8,7 +8,7 @@ inputs: - 1 - 3 - 5 -kubeServiceAcct: "" +kubeServiceAcct: "kubeServiceAcct" targetDomain: "development" targetProject: "flytesnacks" task: core.advanced.run_merge_sort.merge diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 01b7f0e2b1..5487019357 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -70,6 +70,12 @@ The root project and domain flags of -p and -d should point to task/launch plans flytectl create execution --execFile execution_spec.yaml -p flytectldemo -d development --targetProject flytesnacks +Also an execution can be relaunched by passing in current execution id. + +:: + + flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development + Usage @@ -86,6 +92,7 @@ Options -h, --help help for execution --iamRoleARN string iam role ARN AuthRole for launching execution. --kubeServiceAcct string kubernetes service account AuthRole for launching execution. + --relaunch string execution id to be relaunched. --targetDomain string project where execution needs to be created.If not specified configured domain would be used. --targetProject string project where execution needs to be created.If not specified configured project would be used. From cf3ffa193209ab798f671a2c19ac2be5de9211b7 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Tue, 27 Apr 2021 16:20:56 +0530 Subject: [PATCH 040/645] Added update for named entity (#54) * Added update for named entity Signed-off-by: Prafulla Mahindrakar * Added docs Signed-off-by: Prafulla Mahindrakar * Incorporated the feedback Signed-off-by: Prafulla Mahindrakar * Fixed unit test Signed-off-by: Prafulla Mahindrakar * Removed unarchive comment on activate Signed-off-by: Prafulla Mahindrakar --- flytectl/Makefile | 3 + flytectl/clierrors/errors.go | 17 ++ flytectl/cmd/create/executionconfig_flags.go | 1 - .../cmd/update/interfaces/mocks/updater.go | 50 ++++++ flytectl/cmd/update/interfaces/updater.go | 14 ++ flytectl/cmd/update/launch_plan.go | 49 +++++ flytectl/cmd/update/launch_plan_test.go | 44 +++++ flytectl/cmd/update/named_entity.go | 50 ++++++ flytectl/cmd/update/named_entity_test.go | 48 +++++ .../cmd/update/namedentityconfig_flags.go | 48 +++++ .../update/namedentityconfig_flags_test.go | 168 ++++++++++++++++++ flytectl/cmd/update/project.go | 17 +- flytectl/cmd/update/project_test.go | 6 +- flytectl/cmd/update/task.go | 49 +++++ flytectl/cmd/update/task_test.go | 44 +++++ flytectl/cmd/update/update.go | 20 ++- flytectl/cmd/update/update_test.go | 16 +- flytectl/cmd/update/workflow.go | 49 +++++ flytectl/cmd/update/workflow_test.go | 44 +++++ flytectl/docs/source/gen/flytectl_update.rst | 3 + .../source/gen/flytectl_update_launchplan.rst | 94 ++++++++++ .../docs/source/gen/flytectl_update_task.rst | 94 ++++++++++ .../source/gen/flytectl_update_workflow.rst | 94 ++++++++++ 23 files changed, 994 insertions(+), 28 deletions(-) create mode 100644 flytectl/clierrors/errors.go create mode 100644 flytectl/cmd/update/interfaces/mocks/updater.go create mode 100644 flytectl/cmd/update/interfaces/updater.go create mode 100644 flytectl/cmd/update/launch_plan.go create mode 100644 flytectl/cmd/update/launch_plan_test.go create mode 100644 flytectl/cmd/update/named_entity.go create mode 100644 flytectl/cmd/update/named_entity_test.go create mode 100755 flytectl/cmd/update/namedentityconfig_flags.go create mode 100755 flytectl/cmd/update/namedentityconfig_flags_test.go create mode 100644 flytectl/cmd/update/task.go create mode 100644 flytectl/cmd/update/task_test.go create mode 100644 flytectl/cmd/update/workflow.go create mode 100644 flytectl/cmd/update/workflow_test.go create mode 100644 flytectl/docs/source/gen/flytectl_update_launchplan.rst create mode 100644 flytectl/docs/source/gen/flytectl_update_task.rst create mode 100644 flytectl/docs/source/gen/flytectl_update_workflow.rst diff --git a/flytectl/Makefile b/flytectl/Makefile index 8104b44ca9..118f40cf06 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -20,6 +20,9 @@ generate: compile: go build -o bin/flytectl -ldflags=$(LD_FLAGS) main.go +compile_debug: + go build -gcflags='all=-N -l' -o bin/flytectl main.go + .PHONY: update_boilerplate update_boilerplate: @boilerplate/update.sh diff --git a/flytectl/clierrors/errors.go b/flytectl/clierrors/errors.go new file mode 100644 index 0000000000..a93f3c7a19 --- /dev/null +++ b/flytectl/clierrors/errors.go @@ -0,0 +1,17 @@ +package clierrors + +var ( + ErrInvalidStateUpdate = "Invalid state passed. Specify either activate or archive\n" + + ErrProjectNotPassed = "Project not passed\n" + ErrFailedProjectUpdate = "Project %v failed to get updated to %v state due to %v\n" + + ErrLPNotPassed = "Launch plan name not passed\n" + ErrFailedLPUpdate = "Launch plan %v failed to get updated due to %v\n" + + ErrWorkflowNotPassed = "Workflow name not passed\n" + ErrFailedWorkflowUpdate = "Workflow %v failed to get updated to due to %v\n" + + ErrTaskNotPassed = "Task name not passed\n" // #nosec + ErrFailedTaskUpdate = "Task %v failed to get updated to due to %v\n" +) diff --git a/flytectl/cmd/create/executionconfig_flags.go b/flytectl/cmd/create/executionconfig_flags.go index 59dc9adf41..974c284b0b 100755 --- a/flytectl/cmd/create/executionconfig_flags.go +++ b/flytectl/cmd/create/executionconfig_flags.go @@ -47,6 +47,5 @@ func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&(executionConfig.KubeServiceAcct), fmt.Sprintf("%v%v", prefix, "kubeServiceAcct"), executionConfig.KubeServiceAcct, "kubernetes service account AuthRole for launching execution.") cmdFlags.StringVar(&(executionConfig.IamRoleARN), fmt.Sprintf("%v%v", prefix, "iamRoleARN"), executionConfig.IamRoleARN, "iam role ARN AuthRole for launching execution.") cmdFlags.StringVar(&(executionConfig.Relaunch), fmt.Sprintf("%v%v", prefix, "relaunch"), executionConfig.Relaunch, "execution id to be relaunched.") - return cmdFlags } diff --git a/flytectl/cmd/update/interfaces/mocks/updater.go b/flytectl/cmd/update/interfaces/mocks/updater.go new file mode 100644 index 0000000000..30935bb156 --- /dev/null +++ b/flytectl/cmd/update/interfaces/mocks/updater.go @@ -0,0 +1,50 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + cmdcore "github.com/flyteorg/flytectl/cmd/core" + + core "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + mock "github.com/stretchr/testify/mock" +) + +// Updater is an autogenerated mock type for the Updater type +type Updater struct { + mock.Mock +} + +type Updater_UpdateNamedEntity struct { + *mock.Call +} + +func (_m Updater_UpdateNamedEntity) Return(_a0 error) *Updater_UpdateNamedEntity { + return &Updater_UpdateNamedEntity{Call: _m.Call.Return(_a0)} +} + +func (_m *Updater) OnUpdateNamedEntity(ctx context.Context, name string, project string, domain string, rsType core.ResourceType, cmdCtx cmdcore.CommandContext) *Updater_UpdateNamedEntity { + c := _m.On("UpdateNamedEntity", ctx, name, project, domain, rsType, cmdCtx) + return &Updater_UpdateNamedEntity{Call: c} +} + +func (_m *Updater) OnUpdateNamedEntityMatch(matchers ...interface{}) *Updater_UpdateNamedEntity { + c := _m.On("UpdateNamedEntity", matchers...) + return &Updater_UpdateNamedEntity{Call: c} +} + +// UpdateNamedEntity provides a mock function with given fields: ctx, name, project, domain, rsType, cmdCtx +func (_m *Updater) UpdateNamedEntity(ctx context.Context, name string, project string, domain string, rsType core.ResourceType, cmdCtx cmdcore.CommandContext) error { + ret := _m.Called(ctx, name, project, domain, rsType, cmdCtx) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, core.ResourceType, cmdcore.CommandContext) error); ok { + r0 = rf(ctx, name, project, domain, rsType, cmdCtx) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/flytectl/cmd/update/interfaces/updater.go b/flytectl/cmd/update/interfaces/updater.go new file mode 100644 index 0000000000..3ea18f678a --- /dev/null +++ b/flytectl/cmd/update/interfaces/updater.go @@ -0,0 +1,14 @@ +package interfaces + +import ( + "context" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +//go:generate mockery -name=Updater -case=underscore + +type Updater interface { + UpdateNamedEntity(ctx context.Context, name, project, domain string, rsType core.ResourceType, cmdCtx cmdCore.CommandContext) error +} diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go new file mode 100644 index 0000000000..1f32a2cb04 --- /dev/null +++ b/flytectl/cmd/update/launch_plan.go @@ -0,0 +1,49 @@ +package update + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +const ( + updateLPShort = "Updates launch plan metadata" + updateLPLong = ` +Following command updates the description on the launchplan. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort example" + +Archiving launchplan named entity is not supported and would throw an error. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + +Activating launchplan named entity would be a noop. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate + +Usage +` +) + +func updateLPFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + project := config.GetConfig().Project + domain := config.GetConfig().Domain + if len(args) != 1 { + return fmt.Errorf(clierrors.ErrLPNotPassed) + } + name := args[0] + err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_LAUNCH_PLAN, cmdCtx) + if err != nil { + fmt.Printf(clierrors.ErrFailedLPUpdate, name, err) + return err + } + fmt.Printf("updated metadata successfully on %v", name) + return nil +} diff --git a/flytectl/cmd/update/launch_plan_test.go b/flytectl/cmd/update/launch_plan_test.go new file mode 100644 index 0000000000..aa8f8601de --- /dev/null +++ b/flytectl/cmd/update/launch_plan_test.go @@ -0,0 +1,44 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func UpdateLPSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient +} + +func TestLPUpdate(t *testing.T) { + testutils.Setup() + UpdateLPSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{"task1"} + mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) + assert.Nil(t, updateLPFunc(ctx, args, cmdCtx)) +} + +func TestLPUpdateFail(t *testing.T) { + testutils.Setup() + UpdateLPSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{"task1"} + mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) +} + +func TestLPUpdateInvalidArgs(t *testing.T) { + testutils.Setup() + UpdateLPSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{} + assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) +} diff --git a/flytectl/cmd/update/named_entity.go b/flytectl/cmd/update/named_entity.go new file mode 100644 index 0000000000..5c3391d708 --- /dev/null +++ b/flytectl/cmd/update/named_entity.go @@ -0,0 +1,50 @@ +package update + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/clierrors" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +//go:generate pflags NamedEntityConfig --default-var namedEntityConfig + +var ( + namedEntityConfig = &NamedEntityConfig{} +) + +type NamedEntityConfig struct { + Archive bool `json:"archive" pflag:",archive named entity."` + Activate bool `json:"activate" pflag:",activate the named entity."` + Description string `json:"description" pflag:",description of the named entity."` +} + +func (n NamedEntityConfig) UpdateNamedEntity(ctx context.Context, name string, project string, domain string, rsType core.ResourceType, cmdCtx cmdCore.CommandContext) error { + archiveProject := n.Archive + activateProject := n.Activate + if activateProject == archiveProject && activateProject { + return fmt.Errorf(clierrors.ErrInvalidStateUpdate) + } + var nameEntityState admin.NamedEntityState + if activateProject { + nameEntityState = admin.NamedEntityState_NAMED_ENTITY_ACTIVE + } else if archiveProject { + nameEntityState = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + } + _, err := cmdCtx.AdminClient().UpdateNamedEntity(ctx, &admin.NamedEntityUpdateRequest{ + ResourceType: rsType, + Id: &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + Name: name, + }, + Metadata: &admin.NamedEntityMetadata{ + Description: n.Description, + State: nameEntityState, + }, + }) + return err +} diff --git a/flytectl/cmd/update/named_entity_test.go b/flytectl/cmd/update/named_entity_test.go new file mode 100644 index 0000000000..9c322f1840 --- /dev/null +++ b/flytectl/cmd/update/named_entity_test.go @@ -0,0 +1,48 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/stretchr/testify/mock" + + "github.com/stretchr/testify/assert" +) + +func NamedEntitySetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient +} + +func TestNamedEntity(t *testing.T) { + testutils.Setup() + NamedEntitySetup() + mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) + namedEntityConfig = &NamedEntityConfig{Archive: false, Activate: true, Description: "named entity description"} + assert.Nil(t, namedEntityConfig.UpdateNamedEntity(ctx, "namedEntity", "project", "domain", + core.ResourceType_WORKFLOW, cmdCtx)) + namedEntityConfig = &NamedEntityConfig{Archive: true, Activate: false, Description: "named entity description"} + assert.Nil(t, namedEntityConfig.UpdateNamedEntity(ctx, "namedEntity", "project", "domain", + core.ResourceType_WORKFLOW, cmdCtx)) +} + +func TestNamedEntityValidationFailure(t *testing.T) { + testutils.Setup() + NamedEntitySetup() + namedEntityConfig = &NamedEntityConfig{Archive: true, Activate: true, Description: "named entity description"} + assert.NotNil(t, namedEntityConfig.UpdateNamedEntity(ctx, "namedEntity", "project", "domain", + core.ResourceType_WORKFLOW, cmdCtx)) +} + +func TestNamedEntityFailure(t *testing.T) { + testutils.Setup() + NamedEntitySetup() + namedEntityConfig = &NamedEntityConfig{Archive: true, Activate: true, Description: "named entity description"} + mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, namedEntityConfig.UpdateNamedEntity(ctx, "namedEntity", "project", "domain", + core.ResourceType_WORKFLOW, cmdCtx)) +} diff --git a/flytectl/cmd/update/namedentityconfig_flags.go b/flytectl/cmd/update/namedentityconfig_flags.go new file mode 100755 index 0000000000..3d61711bec --- /dev/null +++ b/flytectl/cmd/update/namedentityconfig_flags.go @@ -0,0 +1,48 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package update + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (NamedEntityConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (NamedEntityConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in NamedEntityConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (n NamedEntityConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("NamedEntityConfig", pflag.ExitOnError) + cmdFlags.BoolVar(&(namedEntityConfig.Activate), fmt.Sprintf("%v%v", prefix, "activate"), *new(bool), "Activates the named entity specified as argument.") + cmdFlags.BoolVar(&(namedEntityConfig.Archive), fmt.Sprintf("%v%v", prefix, "archive"), *new(bool), "Archives the named entity specified as argument.") + cmdFlags.StringVar(&(namedEntityConfig.Description), fmt.Sprintf("%v%v", prefix, "description"), namedEntityConfig.Description, "description of the namedentity.") + return cmdFlags +} diff --git a/flytectl/cmd/update/namedentityconfig_flags_test.go b/flytectl/cmd/update/namedentityconfig_flags_test.go new file mode 100755 index 0000000000..1f9506481b --- /dev/null +++ b/flytectl/cmd/update/namedentityconfig_flags_test.go @@ -0,0 +1,168 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package update + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsNamedEntityConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementNamedEntityConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsNamedEntityConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookNamedEntityConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementNamedEntityConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_NamedEntityConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookNamedEntityConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_NamedEntityConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_NamedEntityConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_NamedEntityConfig(val, result)) +} + +func testDecodeSlice_NamedEntityConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_NamedEntityConfig(vStringSlice, result)) +} + +func TestNamedEntityConfig_GetPFlagSet(t *testing.T) { + val := NamedEntityConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestNamedEntityConfig_SetFlags(t *testing.T) { + actual := NamedEntityConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_archive", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vBool, err := cmdFlags.GetBool("archive"); err == nil { + assert.Equal(t, bool(namedEntityConfig.Archive), vBool) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("archive", testValue) + if vBool, err := cmdFlags.GetBool("archive"); err == nil { + testDecodeJson_NamedEntityConfig(t, fmt.Sprintf("%v", vBool), &actual.Archive) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_activate", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vBool, err := cmdFlags.GetBool("activate"); err == nil { + assert.Equal(t, bool(namedEntityConfig.Activate), vBool) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("activate", testValue) + if vBool, err := cmdFlags.GetBool("activate"); err == nil { + testDecodeJson_NamedEntityConfig(t, fmt.Sprintf("%v", vBool), &actual.Activate) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_description", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("description"); err == nil { + assert.Equal(t, string(namedEntityConfig.Description), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("description", testValue) + if vString, err := cmdFlags.GetString("description"); err == nil { + testDecodeJson_NamedEntityConfig(t, fmt.Sprintf("%v", vString), &actual.Description) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 5865c7e6af..0a1f5415d7 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -4,6 +4,8 @@ import ( "context" "fmt" + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -65,23 +67,18 @@ Usage ` ) -var ( - projectConfig = &ProjectConfig{} - errProjectNotFound = "Project %v not found\n" - errInvalidUpdate = "Invalid state passed. Specify either activate or archive\n" - errFailedUpdate = "Project %v failed to get updated to %v state due to %v\n" -) +var projectConfig = &ProjectConfig{} func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { id := config.GetConfig().Project if id == "" { - fmt.Printf(errProjectNotFound, id) + fmt.Printf(clierrors.ErrProjectNotPassed) return nil } archiveProject := projectConfig.ArchiveProject activateProject := projectConfig.ActivateProject if activateProject == archiveProject { - return fmt.Errorf(errInvalidUpdate) + return fmt.Errorf(clierrors.ErrInvalidStateUpdate) } projectState := admin.Project_ACTIVE if archiveProject { @@ -92,8 +89,8 @@ func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comma State: projectState, }) if err != nil { - fmt.Printf(errFailedUpdate, id, projectState, err) - return nil + fmt.Printf(clierrors.ErrFailedProjectUpdate, id, projectState, err) + return err } fmt.Printf("Project %v updated to %v state\n", id, projectState) return nil diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index 6b0491a375..a3e7d9e2e5 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -84,7 +84,7 @@ func TestActivateProjectFuncWithError(t *testing.T) { modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) err := updateProjectsFunc(ctx, args, cmdCtx) - assert.Nil(t, err) + assert.NotNil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) } @@ -112,13 +112,13 @@ func TestArchiveProjectFuncWithError(t *testing.T) { } mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) err := updateProjectsFunc(ctx, args, cmdCtx) - assert.Nil(t, err) + assert.NotNil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) } func TestEmptyProjectInput(t *testing.T) { setup() - defer teardownAndVerify(t, "Project not found\n") + defer teardownAndVerify(t, "Project not passed\n") config.GetConfig().Project = "" modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) diff --git a/flytectl/cmd/update/task.go b/flytectl/cmd/update/task.go new file mode 100644 index 0000000000..e38cdff16b --- /dev/null +++ b/flytectl/cmd/update/task.go @@ -0,0 +1,49 @@ +package update + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +const ( + updateTaskShort = "Updates task metadata" + updateTaskLong = ` +Following command updates the description on the task. +:: + + flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --description "Merge sort example" + +Archiving task named entity is not supported and would throw an error. +:: + + flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --archive + +Activating task named entity would be a noop as archiving is not possible. +:: + + flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --activate + +Usage +` +) + +func updateTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + project := config.GetConfig().Project + domain := config.GetConfig().Domain + if len(args) != 1 { + return fmt.Errorf(clierrors.ErrTaskNotPassed) + } + name := args[0] + err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_TASK, cmdCtx) + if err != nil { + fmt.Printf(clierrors.ErrFailedTaskUpdate, name, err) + return err + } + fmt.Printf("updated metadata successfully on %v", name) + return nil +} diff --git a/flytectl/cmd/update/task_test.go b/flytectl/cmd/update/task_test.go new file mode 100644 index 0000000000..250f7f9fde --- /dev/null +++ b/flytectl/cmd/update/task_test.go @@ -0,0 +1,44 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func UpdateTaskSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient +} + +func TestTaskUpdate(t *testing.T) { + testutils.Setup() + UpdateTaskSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{"task1"} + mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) + assert.Nil(t, updateTaskFunc(ctx, args, cmdCtx)) +} + +func TestTaskUpdateFail(t *testing.T) { + testutils.Setup() + UpdateWorkflowSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{"workflow1"} + mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) +} + +func TestTaskUpdateInvalidArgs(t *testing.T) { + testutils.Setup() + UpdateWorkflowSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{} + assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) +} diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 33526e6dcd..3f801ce08f 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -1,8 +1,7 @@ package update import ( - cmdcore "github.com/flyteorg/flytectl/cmd/core" - + cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" ) @@ -27,13 +26,16 @@ func CreateUpdateCommand() *cobra.Command { Short: updateShort, Long: updatecmdLong, } - - updateResourcesFuncs := map[string]cmdcore.CommandEntry{ - "project": {CmdFunc: updateProjectsFunc, Aliases: []string{"projects"}, ProjectDomainNotRequired: true, PFlagProvider: projectConfig, - Short: projectShort, - Long: projectLong}, + updateResourcesFuncs := map[string]cmdCore.CommandEntry{ + "launchplan": {CmdFunc: updateLPFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, + Short: updateLPShort, Long: updateLPLong}, + "project": {CmdFunc: updateProjectsFunc, Aliases: []string{}, ProjectDomainNotRequired: true, PFlagProvider: projectConfig, + Short: projectShort, Long: projectLong}, + "task": {CmdFunc: updateTaskFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, + Short: updateTaskShort, Long: updateTaskLong}, + "workflow": {CmdFunc: updateWorkflowFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, + Short: updateWorkflowShort, Long: updateWorkflowLong}, } - - cmdcore.AddCommands(updateCmd, updateResourcesFuncs) + cmdCore.AddCommands(updateCmd, updateResourcesFuncs) return updateCmd } diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index c54701f40a..9a610f9f5d 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -12,14 +12,20 @@ func TestUpdateCommand(t *testing.T) { assert.Equal(t, updateCommand.Use, updateUse) assert.Equal(t, updateCommand.Short, updateShort) assert.Equal(t, updateCommand.Long, updatecmdLong) - assert.Equal(t, len(updateCommand.Commands()), 1) + assert.Equal(t, len(updateCommand.Commands()), 4) cmdNouns := updateCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - assert.Equal(t, cmdNouns[0].Use, "project") - assert.Equal(t, cmdNouns[0].Aliases, []string{"projects"}) - assert.Equal(t, cmdNouns[0].Short, projectShort) - assert.Equal(t, cmdNouns[0].Long, projectLong) + useArray := []string{"launchplan", "project", "task", "workflow"} + aliases := [][]string{{}, {}, {}, {}} + shortArray := []string{updateLPShort, projectShort, updateTaskShort, updateWorkflowShort} + longArray := []string{updateLPLong, projectLong, updateTaskLong, updateWorkflowLong} + for i := range cmdNouns { + assert.Equal(t, cmdNouns[i].Use, useArray[i]) + assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) + assert.Equal(t, cmdNouns[i].Short, shortArray[i]) + assert.Equal(t, cmdNouns[i].Long, longArray[i]) + } } diff --git a/flytectl/cmd/update/workflow.go b/flytectl/cmd/update/workflow.go new file mode 100644 index 0000000000..9e67796208 --- /dev/null +++ b/flytectl/cmd/update/workflow.go @@ -0,0 +1,49 @@ +package update + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +const ( + updateWorkflowShort = "Updates workflow metadata" + updateWorkflowLong = ` +Following command updates the description on the workflow. +:: + + flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort workflow example" + +Archiving workflow named entity would cause this to disapper from flyteconsole UI. +:: + + flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + +Activating workflow named entity +:: + + flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate + +Usage +` +) + +func updateWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + project := config.GetConfig().Project + domain := config.GetConfig().Domain + if len(args) != 1 { + return fmt.Errorf(clierrors.ErrWorkflowNotPassed) + } + name := args[0] + err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_WORKFLOW, cmdCtx) + if err != nil { + fmt.Printf(clierrors.ErrFailedWorkflowUpdate, name, err) + return err + } + fmt.Printf("updated metadata successfully on %v", name) + return nil +} diff --git a/flytectl/cmd/update/workflow_test.go b/flytectl/cmd/update/workflow_test.go new file mode 100644 index 0000000000..d6b5ba06ad --- /dev/null +++ b/flytectl/cmd/update/workflow_test.go @@ -0,0 +1,44 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func UpdateWorkflowSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient +} + +func TestWorkflowUpdate(t *testing.T) { + testutils.Setup() + UpdateWorkflowSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{"workflow1"} + mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) + assert.Nil(t, updateWorkflowFunc(ctx, args, cmdCtx)) +} + +func TestWorkflowUpdateFail(t *testing.T) { + testutils.Setup() + UpdateWorkflowSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{"workflow1"} + mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, updateWorkflowFunc(ctx, args, cmdCtx)) +} + +func TestWorkflowUpdateInvalidArgs(t *testing.T) { + testutils.Setup() + UpdateWorkflowSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{} + assert.NotNil(t, updateWorkflowFunc(ctx, args, cmdCtx)) +} diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 0424744484..e3e03e6496 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -73,5 +73,8 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_update_launchplan` - Updates launch plan metadata * :doc:`flytectl_update_project` - Updates project resources +* :doc:`flytectl_update_task` - Updates task metadata +* :doc:`flytectl_update_workflow` - Updates launch plan metadata diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst new file mode 100644 index 0000000000..a110317ff2 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -0,0 +1,94 @@ +.. _flytectl_update_launchplan: + +flytectl update launchplan +-------------------------- + +Updates launch plan metadata + +Synopsis +~~~~~~~~ + + + +Updates launchplan metadata. +Following command updates the description on the launchplan. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort example" + +Archiving launchplan named entity is not supported and would throw an error. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + +Activating launchplan named entity would be a noop. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate + +Usage + + +:: + + flytectl update launchplan [flags] + +Options +~~~~~~~ + +:: + + --activate Activates the named entity specified as argument. + --archive Archives the named entity specified as argument. + --description string description of the namedentity. + -h, --help help for launchplan + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. + diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst new file mode 100644 index 0000000000..358537b9c3 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -0,0 +1,94 @@ +.. _flytectl_update_task: + +flytectl update task +-------------------- + +Updates task metadata + +Synopsis +~~~~~~~~ + + + +Updates task metadata. +Following command updates the description on the task. +:: + + flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --description "Merge sort example" + +Archiving task named entity would is not supported and would throw an error. +:: + + flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --archive + +Activating workflow named entity would be a noop as archiving is not possible. +:: + + flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --activate + +Usage + + +:: + + flytectl update task [flags] + +Options +~~~~~~~ + +:: + + --activate Activates the named entity specified as argument. + --archive Archives the named entity specified as argument. + --description string description of the namedentity. + -h, --help help for task + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. + diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst new file mode 100644 index 0000000000..2cdd0c21ea --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -0,0 +1,94 @@ +.. _flytectl_update_workflow: + +flytectl update workflow +------------------------ + +Updates launch plan metadata + +Synopsis +~~~~~~~~ + + + +Updates workflow metadata. +Following command updates the description on the workflow. +:: + + flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort workflow example" + +Archiving workflow named entity would cause this to disapper from flyteconsole UI. +:: + + flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + +Activating workflow named entity would unarchive it. +:: + + flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate + +Usage + + +:: + + flytectl update workflow [flags] + +Options +~~~~~~~ + +:: + + --activate Activates the named entity specified as argument. + --archive Archives the named entity specified as argument. + --description string description of the namedentity. + -h, --help help for workflow + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' + --admin.clientId string Client ID + --admin.clientSecretLocation string File containing the client secret + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string Your IDPs token endpoint + --admin.useAuth Whether or not to try to authenticate with options below + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. + From 65580deaf0b23c7fe37a65835d8d7fb09950b53d Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Thu, 29 Apr 2021 02:05:23 +0530 Subject: [PATCH 041/645] Updated Boilerplate Code (#57) Signed-off-by: Samhita Alla --- flytectl/.github/config.yml | 15 +++++++++++ flytectl/boilerplate/flyte/Readme.rst | 8 ++++++ flytectl/boilerplate/flyte/config.yml | 15 +++++++++++ flytectl/boilerplate/flyte/update.sh | 14 ++++++++++ flytectl/boilerplate/update.cfg | 2 ++ flytectl/boilerplate/update.sh | 37 +++++++++++++++++++++------ 6 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 flytectl/.github/config.yml create mode 100644 flytectl/boilerplate/flyte/Readme.rst create mode 100644 flytectl/boilerplate/flyte/config.yml create mode 100755 flytectl/boilerplate/flyte/update.sh diff --git a/flytectl/.github/config.yml b/flytectl/.github/config.yml new file mode 100644 index 0000000000..f99bcd78f1 --- /dev/null +++ b/flytectl/.github/config.yml @@ -0,0 +1,15 @@ +# Comment to be posted on PRs from first-time contributors in your repository +newPRWelcomeComment: > + Thank you for opening this pull request! 🙌 + + These tips will help get your PR across the finish line: + - Most of the repos have a PR template; if not, fill it out to the best of your knowledge. + - Sign off your commits (Reference: [DCO Guide](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md)). + +# Comment to be posted to on pull requests merged by a first time user +firstPRMergeComment: > + Congrats on merging your first pull request! 🎉 + +# Comment to be posted on first-time issues +newIssueWelcomeComment: > + Thank you for opening your first issue here! 🛠 diff --git a/flytectl/boilerplate/flyte/Readme.rst b/flytectl/boilerplate/flyte/Readme.rst new file mode 100644 index 0000000000..ea18781185 --- /dev/null +++ b/flytectl/boilerplate/flyte/Readme.rst @@ -0,0 +1,8 @@ +Config File -- Welcome Bot +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Provides a ``config.yml`` file. + +**To Enable:** + +Add ``flyte/config.yml`` to your ``boilerplate/update.cfg`` file. \ No newline at end of file diff --git a/flytectl/boilerplate/flyte/config.yml b/flytectl/boilerplate/flyte/config.yml new file mode 100644 index 0000000000..f99bcd78f1 --- /dev/null +++ b/flytectl/boilerplate/flyte/config.yml @@ -0,0 +1,15 @@ +# Comment to be posted on PRs from first-time contributors in your repository +newPRWelcomeComment: > + Thank you for opening this pull request! 🙌 + + These tips will help get your PR across the finish line: + - Most of the repos have a PR template; if not, fill it out to the best of your knowledge. + - Sign off your commits (Reference: [DCO Guide](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md)). + +# Comment to be posted to on pull requests merged by a first time user +firstPRMergeComment: > + Congrats on merging your first pull request! 🎉 + +# Comment to be posted on first-time issues +newIssueWelcomeComment: > + Thank you for opening your first issue here! 🛠 diff --git a/flytectl/boilerplate/flyte/update.sh b/flytectl/boilerplate/flyte/update.sh new file mode 100755 index 0000000000..506c3221b7 --- /dev/null +++ b/flytectl/boilerplate/flyte/update.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst + +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Clone the config.yml file +echo " - copying ${DIR}/config.yml to the root directory." +cp ${DIR}/config.yml ${DIR}/../../.github/config.yml diff --git a/flytectl/boilerplate/update.cfg b/flytectl/boilerplate/update.cfg index a1b1bff989..468bf2cb80 100644 --- a/flytectl/boilerplate/update.cfg +++ b/flytectl/boilerplate/update.cfg @@ -2,3 +2,5 @@ lyft/golang_test_targets lyft/golangci_file lyft/golang_support_tools lyft/pull_request_template +flyte/ + diff --git a/flytectl/boilerplate/update.sh b/flytectl/boilerplate/update.sh index a8c05705e3..374e4b930e 100755 --- a/flytectl/boilerplate/update.sh +++ b/flytectl/boilerplate/update.sh @@ -10,7 +10,9 @@ set -e DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" OUT="$(mktemp -d)" -git clone git@github.com:lyft/boilerplate.git "${OUT}" +trap "rm -fr $OUT" EXIT + +git clone git@github.com:flyteorg/boilerplate.git "${OUT}" echo "Updating the update.sh script." cp "${OUT}/boilerplate/update.sh" "${DIR}/update.sh" @@ -18,7 +20,7 @@ echo "" CONFIG_FILE="${DIR}/update.cfg" -README="https://github.com/lyft/boilerplate/blob/master/Readme.rst" +README="https://github.com/flyteorg/boilerplate/blob/master/Readme.rst" if [ ! -f "$CONFIG_FILE" ]; then echo "$CONFIG_FILE not found." @@ -33,13 +35,34 @@ if [ -z "$REPOSITORY" ]; then exit 1 fi -while read directory; do - # TODO: Skip empty lines, whitespace only lines, and comment lines +while read directory junk; do + # Skip comment lines (which can have leading whitespace) + if [[ "$directory" == '#'* ]]; then + continue + fi + # Skip blank or whitespace-only lines + if [[ "$directory" == "" ]]; then + continue + fi + # Lines like + # valid/path other_junk + # are not acceptable, unless `other_junk` is a comment + if [[ "$junk" != "" ]] && [[ "$junk" != '#'* ]]; then + echo "Invalid config! Only one directory is allowed per line. Found '$junk'" + exit 1 + fi + + dir_path="${OUT}/boilerplate/${directory}" + # Make sure the directory exists + if ! [[ -d "$dir_path" ]]; then + echo "Invalid boilerplate directory: '$directory'" + exit 1 + fi + echo "***********************************************************************************" echo "$directory is configured in update.cfg." echo "-----------------------------------------------------------------------------------" echo "syncing files from source." - dir_path="${OUT}/boilerplate/${directory}" rm -rf "${DIR}/${directory}" mkdir -p $(dirname "${DIR}/${directory}") cp -r "$dir_path" "${DIR}/${directory}" @@ -49,6 +72,4 @@ while read directory; do fi echo "***********************************************************************************" echo "" -done < "$CONFIG_FILE" - -rm -rf "${OUT}" +done < "$CONFIG_FILE" \ No newline at end of file From 6114a7cd66c9107182987f207844e974b4fea4c0 Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Fri, 30 Apr 2021 17:00:55 -0400 Subject: [PATCH 042/645] update docs based on revamp RFC (#60) * update docs based on revamp RFC - udpate main nav items - update toc - use furo fork Signed-off-by: cosmicBboy * remove custom.css Signed-off-by: cosmicBboy --- flytectl/doc-requirements.in | 2 +- flytectl/doc-requirements.txt | 6 +- flytectl/docs/source/_static/custom.css | 91 ------------------- flytectl/docs/source/conf.py | 3 - flytectl/docs/source/gen/flytectl_update.rst | 2 +- .../source/gen/flytectl_update_launchplan.rst | 1 - .../source/gen/flytectl_update_project.rst | 2 +- .../docs/source/gen/flytectl_update_task.rst | 5 +- .../source/gen/flytectl_update_workflow.rst | 5 +- flytectl/docs/source/index.rst | 47 ++-------- flytectl/docs/source/nouns.rst | 19 ++++ flytectl/docs/source/reference/index.rst | 24 ----- flytectl/docs/source/verbs.rst | 14 +++ 13 files changed, 51 insertions(+), 170 deletions(-) delete mode 100644 flytectl/docs/source/_static/custom.css create mode 100644 flytectl/docs/source/nouns.rst delete mode 100644 flytectl/docs/source/reference/index.rst create mode 100644 flytectl/docs/source/verbs.rst diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in index 8a0e088122..3cf9da6f2f 100644 --- a/flytectl/doc-requirements.in +++ b/flytectl/doc-requirements.in @@ -1,4 +1,4 @@ -furo +git+git://github.com/flyteorg/furo@main readthedocs-sphinx-search sphinx sphinx-prompt diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index d01f9385bf..8df6e8b686 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -6,7 +6,7 @@ # alabaster==0.7.12 # via sphinx -babel==2.9.0 +babel==2.9.1 # via sphinx beautifulsoup4==4.9.3 # via @@ -21,7 +21,7 @@ css-html-js-minify==2.5.5 # via sphinx-material docutils==0.16 # via sphinx -furo==2021.3.20b30 +git+git://github.com/flyteorg/furo@main # via -r doc-requirements.in idna==2.10 # via requests @@ -63,7 +63,7 @@ sphinx-material==0.0.32 # via -r doc-requirements.in sphinx-prompt==1.4.0 # via -r doc-requirements.in -sphinx==3.5.3 +sphinx==3.5.4 # via # -r doc-requirements.in # furo diff --git a/flytectl/docs/source/_static/custom.css b/flytectl/docs/source/_static/custom.css deleted file mode 100644 index d9851b7d8f..0000000000 --- a/flytectl/docs/source/_static/custom.css +++ /dev/null @@ -1,91 +0,0 @@ -h1, h2, h3, h4, h5, h6 { - font-weight: bold; -} - -.sidebar-logo { - max-width: 30%; -} - - -.sidebar-tree .reference.external:after { - content: none; -} - -.sphx-glr-thumbcontainer { - background-color: transparent; - border: transparent; -} - -.sphx-glr-thumbcontainer:hover { - border: transparent; -} - -div.sphx-glr-download a { - color:white; - background-color: #9d68e4cf; - background-image: none; - border: 1px solid #9d68e4cf; -} - -div.sphx-glr-download a:hover { - background-color: #8b48e2cf; - box-shadow: none; -} - -div.sphx-glr-thumbcontainer a.headerlink { - display: none; -} - -div.sphx-glr-thumbcontainer:hover { - border-color: white; - box-shadow: none; -} - -.sphx-glr-script-out .highlight pre { - background-color: #f8f8f8; -} - -p.sphx-glr-script-out { - padding-top: 0em; -} - -.search__outer::-webkit-scrollbar-track { - border-radius: 0px; -} - -@media (prefers-color-scheme: dark) { - .search__outer { - background-color: #131416 !important; - border: 1px solid #131416 !important; - } - .search__outer__input { - background-color: #1a1c1e !important; - } - .search__result__single { - border-bottom: #303335 !important; - } - .outer_div_page_results:hover { - background-color: black; - } - .search__result__title, .rtd_ui_search_subtitle { - color: #9D68E4 !important; - border-bottom: 1px solid #9D68E4 !important; - } - .search__outer .search__result__title span, .search__outer .search__result__content span { - background-color: #9d68e454; - } - .search__result__subheading, .search__result__content { - color: #ffffffd9 !important; - } - .search__outer::-webkit-scrollbar-track { - background-color: #131416 !important; - } - .rtd__search__credits { - background-color: #1a1c1e !important; - border: 1px solid #1a1c1e !important; - color: #81868d !important; - } - .rtd__search__credits a, .search__error__box { - color: #9ca0a5 !important; - } - } diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 51ec8df120..9874c85aa7 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -115,9 +115,6 @@ # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] -html_css_files = [ - "custom.css", -] # Custom sidebar templates, must be a dictionary that maps document names # to template names. diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index e3e03e6496..7db54b49a6 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -76,5 +76,5 @@ SEE ALSO * :doc:`flytectl_update_launchplan` - Updates launch plan metadata * :doc:`flytectl_update_project` - Updates project resources * :doc:`flytectl_update_task` - Updates task metadata -* :doc:`flytectl_update_workflow` - Updates launch plan metadata +* :doc:`flytectl_update_workflow` - Updates workflow metadata diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index a110317ff2..49bf4bffa9 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -10,7 +10,6 @@ Synopsis -Updates launchplan metadata. Following command updates the description on the launchplan. :: diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index d3b2d44096..4a6e7bee48 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -10,7 +10,7 @@ Synopsis -Updates the project according the flags passed.Allows you to archive or activate a project. +Updates the project according the flags passed. Allows you to archive or activate a project. Activates project named flytesnacks. :: diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst index 358537b9c3..5a81366eb8 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -10,18 +10,17 @@ Synopsis -Updates task metadata. Following command updates the description on the task. :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --description "Merge sort example" -Archiving task named entity would is not supported and would throw an error. +Archiving task named entity is not supported and would throw an error. :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --archive -Activating workflow named entity would be a noop as archiving is not possible. +Activating task named entity would be a noop as archiving is not possible. :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --activate diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst index 2cdd0c21ea..553446ca27 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -3,14 +3,13 @@ flytectl update workflow ------------------------ -Updates launch plan metadata +Updates workflow metadata Synopsis ~~~~~~~~ -Updates workflow metadata. Following command updates the description on the workflow. :: @@ -21,7 +20,7 @@ Archiving workflow named entity would cause this to disapper from flyteconsole U flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive -Activating workflow named entity would unarchive it. +Activating workflow named entity :: flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 0f381d5e59..44d061489d 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -41,49 +41,18 @@ Basic Configuration :hidden: Getting Started - Tutorials - reference/index + User Guide + Tutorials + Concepts + API Reference Community .. toctree:: - :maxdepth: 1 + :maxdepth: -1 :caption: Flytectl :hidden: Install and Configure - -.. toctree:: - :maxdepth: 1 - :caption: Verbs - :hidden: - - gen/flytectl_create - gen/flytectl_get - gen/flytectl_update - gen/flytectl_delete - gen/flytectl_register - gen/flytectl_config - -.. toctree:: - :maxdepth: 1 - :caption: Nouns - :hidden: - - gen/flytectl_create_project - gen/flytectl_create_execution - gen/flytectl_get_execution - gen/flytectl_get_project - gen/flytectl_get_workflow - gen/flytectl_get_task - gen/flytectl_get_launchplan - gen/flytectl_update_project - gen/flytectl_register_files - gen/flytectl_version - gen/flytectl_config_validate - -.. toctree:: - :maxdepth: 2 - :caption: Contribute - :hidden: - - contribute + verbs + nouns + Contribute diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst new file mode 100644 index 0000000000..78996e38ce --- /dev/null +++ b/flytectl/docs/source/nouns.rst @@ -0,0 +1,19 @@ +Nouns +------ + +.. toctree:: + :maxdepth: 1 + :caption: Nouns + :hidden: + + gen/flytectl_create_project + gen/flytectl_create_execution + gen/flytectl_get_execution + gen/flytectl_get_project + gen/flytectl_get_workflow + gen/flytectl_get_task + gen/flytectl_get_launchplan + gen/flytectl_update_project + gen/flytectl_register_files + gen/flytectl_version + gen/flytectl_config_validate diff --git a/flytectl/docs/source/reference/index.rst b/flytectl/docs/source/reference/index.rst deleted file mode 100644 index 6b6ff34c49..0000000000 --- a/flytectl/docs/source/reference/index.rst +++ /dev/null @@ -1,24 +0,0 @@ -############# -API Reference -############# - -.. toctree:: - :maxdepth: 1 - :caption: API Reference - :name: apitoc - - Flytekit Python - Flytekit Java - FlyteIDL - Flytectl - -.. toctree:: - :maxdepth: 1 - :caption: Component Reference (Code docs) - :name: componentreftoc - - FlytePropeller - FlyteAdmin - FlytePlugins - DataCatalog - \ No newline at end of file diff --git a/flytectl/docs/source/verbs.rst b/flytectl/docs/source/verbs.rst new file mode 100644 index 0000000000..49f90367b0 --- /dev/null +++ b/flytectl/docs/source/verbs.rst @@ -0,0 +1,14 @@ +Verbs +------ + +.. toctree:: + :maxdepth: 1 + :caption: Verbs + :hidden: + + gen/flytectl_create + gen/flytectl_get + gen/flytectl_update + gen/flytectl_delete + gen/flytectl_register + gen/flytectl_config \ No newline at end of file From 73e4aa37555c6cfca4119b032cebebbd17e691ce Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Sat, 1 May 2021 03:08:40 +0530 Subject: [PATCH 043/645] Added HOMEDIR/.flyte to search path for config.yaml (#59) Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/root.go | 10 ++++- flytectl/docs/source/index.rst | 6 +++ .../pkg/filesystemutils/file_system_utils.go | 22 ++++++++++ .../flile_system_utils_test.go | 42 +++++++++++++++++++ 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 flytectl/pkg/filesystemutils/file_system_utils.go create mode 100644 flytectl/pkg/filesystemutils/flile_system_utils_test.go diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 8ad0fef299..56a371a75a 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -12,6 +12,7 @@ import ( "github.com/flyteorg/flytectl/cmd/register" "github.com/flyteorg/flytectl/cmd/update" "github.com/flyteorg/flytectl/cmd/version" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/flyteorg/flytectl/pkg/printer" stdConfig "github.com/flyteorg/flytestdlib/config" "github.com/flyteorg/flytestdlib/config/viper" @@ -26,6 +27,11 @@ var ( configAccessor = viper.NewAccessor(stdConfig.Options{StrictMode: true}) ) +const ( + configFileDir = ".flyte" + configFileName = "config.yaml" +) + func newRootCmd() *cobra.Command { rootCmd := &cobra.Command{ PersistentPreRunE: initConfig, @@ -36,7 +42,7 @@ func newRootCmd() *cobra.Command { } rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", - "config file (default is $HOME/config.yaml)") + "config file (default is $HOME/.flyte/config.yaml)") configAccessor.InitializePflags(rootCmd.PersistentFlags()) @@ -63,7 +69,7 @@ func newRootCmd() *cobra.Command { func initConfig(_ *cobra.Command, _ []string) error { configAccessor = viper.NewAccessor(stdConfig.Options{ StrictMode: true, - SearchPaths: []string{cfgFile}, + SearchPaths: []string{cfgFile, f.FilePathJoin(f.UserHomeDir(), configFileDir, configFileName)}, }) err := configAccessor.UpdateConfig(context.TODO()) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 44d061489d..a3a3d61cc1 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -19,6 +19,12 @@ Configure ========= Flytectl allows configuring using a YAML file or pass every configuration value on command-line. The follow configuration is useful to setup. +Place this in $HOME/.flyte directory with name config.yaml. +This file is searched in +1] $HOME/.flyte +2] currDir from where you run flytectl +3] /etc/flyte/config +4] You can pass it commandline using --config Basic Configuration -------------------- diff --git a/flytectl/pkg/filesystemutils/file_system_utils.go b/flytectl/pkg/filesystemutils/file_system_utils.go new file mode 100644 index 0000000000..2f0b756c90 --- /dev/null +++ b/flytectl/pkg/filesystemutils/file_system_utils.go @@ -0,0 +1,22 @@ +package filesystemutils + +import ( + "os" + "path/filepath" +) + +var osUserHomDirFunc = os.UserHomeDir +var filePathJoinFunc = filepath.Join + +// UserHomeDir Returns the users home directory or on error returns the current dir +func UserHomeDir() string { + if homeDir, err := osUserHomDirFunc(); err == nil { + return homeDir + } + return "." +} + +// FilePathJoin Returns the file path obtained by joining various path elements. +func FilePathJoin(elems ...string) string { + return filePathJoinFunc(elems...) +} diff --git a/flytectl/pkg/filesystemutils/flile_system_utils_test.go b/flytectl/pkg/filesystemutils/flile_system_utils_test.go new file mode 100644 index 0000000000..9698d1709d --- /dev/null +++ b/flytectl/pkg/filesystemutils/flile_system_utils_test.go @@ -0,0 +1,42 @@ +package filesystemutils + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +var ( + homeDirVal = "/home/user" + homeDirErr error +) + +func FakeUserHomeDir() (string, error) { + return homeDirVal, homeDirErr +} + +func TestUserHomeDir(t *testing.T) { + t.Run("User home dir", func(t *testing.T) { + osUserHomDirFunc = FakeUserHomeDir + homeDir := UserHomeDir() + assert.Equal(t, homeDirVal, homeDir) + }) + t.Run("User home dir fail", func(t *testing.T) { + homeDirErr = fmt.Errorf("failed to get users home directory") + homeDirVal = "." + osUserHomDirFunc = FakeUserHomeDir + homeDir := UserHomeDir() + assert.Equal(t, ".", homeDir) + // Reset + homeDirErr = nil + homeDirVal = "/home/user" + }) +} + +func TestFilePathJoin(t *testing.T) { + t.Run("File path join", func(t *testing.T) { + homeDir := FilePathJoin("/", "home", "user") + assert.Equal(t, "/home/user", homeDir) + }) +} From f103e41112bd174efb5f14e4425c82bd0c141261 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Mon, 3 May 2021 10:29:49 +0530 Subject: [PATCH 044/645] Oauth support in flytectl (#49) * Using changed flyteidl which contains oauth changes Signed-off-by: Prafulla Mahindrakar * Added zlando keyring as an implementation of tokencache Signed-off-by: Prafulla Mahindrakar * Fixed unit tests Signed-off-by: Prafulla Mahindrakar * Fixed linter issues Signed-off-by: Prafulla Mahindrakar * go mod tidy Signed-off-by: Prafulla Mahindrakar * Update to latest flyteidl Signed-off-by: Haytham Abuelfutuh Signed-off-by: Prafulla Mahindrakar * Update to released flyteidl Signed-off-by: Haytham Abuelfutuh Signed-off-by: Prafulla Mahindrakar Co-authored-by: Haytham Abuelfutuh --- flytectl/cmd/core/cmd.go | 17 +++-- flytectl/cmd/get/project.go | 5 +- flytectl/cmd/root.go | 2 +- flytectl/config.yaml | 5 +- flytectl/go.mod | 4 +- flytectl/go.sum | 20 +++--- .../pkg/pkce/testdata/empty_access_token.json | 6 ++ flytectl/pkg/pkce/testdata/token.json | 6 ++ flytectl/pkg/pkce/token_cache_keyring.go | 58 +++++++++++++++++ flytectl/pkg/pkce/token_cache_keyring_test.go | 64 +++++++++++++++++++ 10 files changed, 163 insertions(+), 24 deletions(-) create mode 100644 flytectl/pkg/pkce/testdata/empty_access_token.json create mode 100644 flytectl/pkg/pkce/testdata/token.json create mode 100644 flytectl/pkg/pkce/token_cache_keyring.go create mode 100644 flytectl/pkg/pkce/token_cache_keyring_test.go diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 0e62c7369d..27d8d56063 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -4,12 +4,12 @@ import ( "context" "fmt" - "github.com/spf13/pflag" - + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/pkg/pkce" "github.com/flyteorg/flyteidl/clients/go/admin" - "github.com/spf13/cobra" - "github.com/flyteorg/flytectl/cmd/config" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) type PFlagProvider interface { @@ -57,10 +57,15 @@ func generateCommandFunc(cmdEntry CommandEntry) func(cmd *cobra.Command, args [] return err } - adminClient, err := admin.InitializeAdminClientFromConfig(ctx) + clientSet, err := admin.ClientSetBuilder().WithConfig(admin.GetConfig(ctx)). + WithTokenCache(pkce.TokenCacheKeyringProvider{ + ServiceUser: pkce.KeyRingServiceUser, + ServiceName: pkce.KeyRingServiceName, + }).Build(ctx) if err != nil { return err } - return cmdEntry.CmdFunc(ctx, args, NewCommandContext(adminClient, cmd.OutOrStdout())) + + return cmdEntry.CmdFunc(ctx, args, NewCommandContext(clientSet.AdminClient(), cmd.OutOrStdout())) } } diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index f89b952d4b..0fa2f70450 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -67,11 +67,9 @@ func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC if err != nil { return err } + if len(args) == 1 { name := args[0] - if err != nil { - return err - } logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) for _, v := range projects.Projects { if v.Name == name { @@ -84,6 +82,7 @@ func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC } return nil } + logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) return adminPrinter.Print(config.GetConfig().MustOutputFormat(), projectColumns, ProjectToProtoMessages(projects.Projects)...) } diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 56a371a75a..200d6d4115 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -46,7 +46,7 @@ func newRootCmd() *cobra.Command { configAccessor.InitializePflags(rootCmd.PersistentFlags()) - // Due to https://github.com/lyft/flyte/issues/341, project flag will have to be specified as + // Due to https://github.com/flyteorg/flyte/issues/341, project flag will have to be specified as // --root.project, this adds a convenience on top to allow --project to be used rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Project), "project", "p", "", "Specifies the Flyte project.") rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Domain), "domain", "d", "", "Specifies the Flyte project's domain.") diff --git a/flytectl/config.yaml b/flytectl/config.yaml index a6b72e5741..a4505fccf6 100644 --- a/flytectl/config.yaml +++ b/flytectl/config.yaml @@ -1,8 +1,7 @@ admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///flyte.lyft.net - # endpoint: dns:///flyte.lyft.net - insecure: true + endpoint: dns:///flyte.myexample.com + authType: Pkce logger: show-source: true level: 1 diff --git a/flytectl/go.mod b/flytectl/go.mod index ca000d677b..cd987f766a 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect - github.com/flyteorg/flyteidl v0.18.32 + github.com/flyteorg/flyteidl v0.18.40 github.com/flyteorg/flytestdlib v0.3.15 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 @@ -20,6 +20,8 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.7.0 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 + github.com/zalando/go-keyring v0.1.1 + golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 google.golang.org/grpc v1.35.0 google.golang.org/protobuf v1.25.0 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index 699d774fb8..a1ceb251bd 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -129,8 +129,6 @@ github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEka github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -142,6 +140,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.1.0 h1:3RNcEpBg4IhIChZdFRSdlQt1QjCp1sMAPIrOnm7Yf8g= +github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -173,10 +173,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.18.25 h1:XbHwM4G1u5nGAcdKod+ENgbL84cHdNzQIWY+NajuHs8= -github.com/flyteorg/flyteidl v0.18.25/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= -github.com/flyteorg/flyteidl v0.18.32 h1:Z+DeBh4i+mZK75lfJwmsHPf23nbsp2Qiv+kCnGMY9Ds= -github.com/flyteorg/flyteidl v0.18.32/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= +github.com/flyteorg/flyteidl v0.18.40 h1:YuLBNpIotOFwyLSXSs0aj3B9N9vwPhzLRAQTWxYSI/w= +github.com/flyteorg/flyteidl v0.18.40/go.mod h1:IJD02cc/95QMkGDBJNibsr5aWd6V7TlQiJ8Iz5mVZ28= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.15 h1:vzsfqriENyavv6EBwsIm55di2wC+j0jkmjw30JGHAkM= github.com/flyteorg/flytestdlib v0.3.15/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= @@ -214,6 +212,8 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -466,6 +466,8 @@ github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -476,8 +478,6 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -589,6 +589,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zalando/go-keyring v0.1.1 h1:w2V9lcx/Uj4l+dzAf1m9s+DJ1O8ROkEHnynonHjTcYE= +github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRzC8UFJH9+L8= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -984,8 +986,6 @@ gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= diff --git a/flytectl/pkg/pkce/testdata/empty_access_token.json b/flytectl/pkg/pkce/testdata/empty_access_token.json new file mode 100644 index 0000000000..474f4762e0 --- /dev/null +++ b/flytectl/pkg/pkce/testdata/empty_access_token.json @@ -0,0 +1,6 @@ +{ + "access_token":"", + "token_type":"bearer", + "refresh_token":"eyJhbGciOiJSUzI1NiIsImtleV9pZCI6IjlLZlNILXphZjRjY1dmTlNPbm91YmZUbnItVW5kMHVuY3ctWF9KNUJVdWciLCJ0eXAiOiJKV1QifQ.eyJhdWQiOlsiaHR0cHM6Ly9kZW1vLm51Y2x5ZGUuaW8iXSwiY2xpZW50X2lkIjoiZmx5dGVjdGwiLCJleHAiOjE2MTk1MzM1MjcsImZvcm0iOnsiY29kZV9jaGFsbGVuZ2UiOiJ2bWNxazArZnJRS3Vvb2FMUHZwUDJCeUtod2VKR2VaeG1mdGtkMml0T042Tk13SVBQNWwySmNpWDd3NTdlaS9iVW1LTWhPSjJVUERnK0F5RXRaTG94SFJiMDl1cWRKSSIsImNvZGVfY2hhbGxlbmdlX21ldGhvZCI6IlN2WEgyeDh2UDUrSkJxQ0NjT2dCL0hNWjdLSmE3bkdLMDBaUVA0ekd4WGcifSwiaWF0IjoxNjE5NTAyNTM1LCJpc3MiOiJodHRwczovL2RlbW8ubnVjbHlkZS5pbyIsImp0aSI6IjQzMTM1ZWY2LTA5NjEtNGFlZC1hOTYxLWQyZGI1YWJmM2U1YyIsInNjcCI6WyJvZmZsaW5lIiwiZi5hbGwiLCJhY2Nlc3NfdG9rZW4iXSwic3ViIjoiMTE0NTI3ODE1MzA1MTI4OTc0NDcwIiwidXNlcl9pbmZvIjp7ImZhbWlseV9uYW1lIjoiTWFoaW5kcmFrYXIiLCJnaXZlbl9uYW1lIjoiUHJhZnVsbGEiLCJuYW1lIjoiUHJhZnVsbGEgTWFoaW5kcmFrYXIiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EtL0FPaDE0R2p1VDFrOC04YTV2QkdPSUYxYURnaFltRng4aEQ5S05pUjVqblp1PXM5Ni1jIiwic3ViamVjdCI6IjExNDUyNzgxNTMwNTEyODk3NDQ3MCJ9fQ.YKom5-gE4e84rJJIfxcpbMzgjZT33UZ27UTa1y8pK2BAWaPjIZtwudwDHQ5Rd3m0mJJWhBp0j0e8h9DvzBUdpsnGMXSCYKP-ag9y9k5OW59FMm9RqIakWHtj6NPnxGO1jAsaNCYePj8knR7pBLCLCse2taDHUJ8RU1F0DeHNr2y-JupgG5y1vjBcb-9eD8OwOSTp686_hm7XoJlxiKx8dj2O7HPH7M2pAHA_0bVrKKj7Y_s3fRhkm_Aq6LRdA-IiTl9xJQxgVUreejls9-RR9mSTKj6A81-Isz3qAUttVVaA4OT5OdW879_yT7OSLw_QwpXzNZ7qOR7OIpmL_xZXig", + "expiry":"2021-04-27T19:55:26.658635+05:30" +} \ No newline at end of file diff --git a/flytectl/pkg/pkce/testdata/token.json b/flytectl/pkg/pkce/testdata/token.json new file mode 100644 index 0000000000..721cecc5f6 --- /dev/null +++ b/flytectl/pkg/pkce/testdata/token.json @@ -0,0 +1,6 @@ +{ + "access_token":"eyJhbGciOiJSUzI1NiIsImtleV9pZCI6IjlLZlNILXphZjRjY1dmTlNPbm91YmZUbnItVW5kMHVuY3ctWF9KNUJVdWciLCJ0eXAiOiJKV1QifQ.eyJhdWQiOlsiaHR0cHM6Ly9kZW1vLm51Y2x5ZGUuaW8iXSwiY2xpZW50X2lkIjoiZmx5dGVjdGwiLCJleHAiOjE2MTk1Mjk5MjcsImZvcm0iOnsiY29kZV9jaGFsbGVuZ2UiOiJ2bWNxazArZnJRS3Vvb2FMUHZwUDJCeUtod2VKR2VaeG1mdGtkMml0T042Tk13SVBQNWwySmNpWDd3NTdlaS9iVW1LTWhPSjJVUERnK0F5RXRaTG94SFJiMDl1cWRKSSIsImNvZGVfY2hhbGxlbmdlX21ldGhvZCI6IlN2WEgyeDh2UDUrSkJxQ0NjT2dCL0hNWjdLSmE3bkdLMDBaUVA0ekd4WGcifSwiaWF0IjoxNjE5NTAyNTM1LCJpc3MiOiJodHRwczovL2RlbW8ubnVjbHlkZS5pbyIsImp0aSI6IjQzMTM1ZWY2LTA5NjEtNGFlZC1hOTYxLWQyZGI1YWJmM2U1YyIsInNjcCI6WyJvZmZsaW5lIiwiYWxsIiwiYWNjZXNzX3Rva2VuIl0sInN1YiI6IjExNDUyNzgxNTMwNTEyODk3NDQ3MCIsInVzZXJfaW5mbyI6eyJmYW1pbHlfbmFtZSI6Ik1haGluZHJha2FyIiwiZ2l2ZW5fbmFtZSI6IlByYWZ1bGxhIiwibmFtZSI6IlByYWZ1bGxhIE1haGluZHJha2FyIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hLS9BT2gxNEdqdVQxazgtOGE1dkJHT0lGMWFEZ2hZbUZ4OGhEOUtOaVI1am5adT1zOTYtYyIsInN1YmplY3QiOiIxMTQ1Mjc4MTUzMDUxMjg5NzQ0NzAifX0.ojbUOy2tF6HL8fIp1FJAQchU2MimlVMr3EGVPxMvYyahpW5YsWh6mz7qn4vpEnBuYZDf6cTaN50pJ8krlDX9RqtxF3iEfV2ZYHwyKMThI9sWh_kEBgGwUpyHyk98ZeqQX1uFOH3iwwhR-lPPUlpgdFGzKsxfxeFLOtu1y0V7BgA08KFqgYzl0lJqDYWBkJh_wUAv5g_r0NzSQCsMqb-B3Lno5ScMnlA3SZ_Hg-XdW8hnFIlrwJj4Cv47j3fcZxpqLbTNDXWWogmRbJb3YPlgn_LEnRAyZnFERHKMCE9vaBSTu-1Qstp-gRTORjyV7l3y680dEygQS-99KV3OSBlz6g", + "token_type":"bearer", + "refresh_token":"eyJhbGciOiJSUzI1NiIsImtleV9pZCI6IjlLZlNILXphZjRjY1dmTlNPbm91YmZUbnItVW5kMHVuY3ctWF9KNUJVdWciLCJ0eXAiOiJKV1QifQ.eyJhdWQiOlsiaHR0cHM6Ly9kZW1vLm51Y2x5ZGUuaW8iXSwiY2xpZW50X2lkIjoiZmx5dGVjdGwiLCJleHAiOjE2MTk1MzM1MjcsImZvcm0iOnsiY29kZV9jaGFsbGVuZ2UiOiJ2bWNxazArZnJRS3Vvb2FMUHZwUDJCeUtod2VKR2VaeG1mdGtkMml0T042Tk13SVBQNWwySmNpWDd3NTdlaS9iVW1LTWhPSjJVUERnK0F5RXRaTG94SFJiMDl1cWRKSSIsImNvZGVfY2hhbGxlbmdlX21ldGhvZCI6IlN2WEgyeDh2UDUrSkJxQ0NjT2dCL0hNWjdLSmE3bkdLMDBaUVA0ekd4WGcifSwiaWF0IjoxNjE5NTAyNTM1LCJpc3MiOiJodHRwczovL2RlbW8ubnVjbHlkZS5pbyIsImp0aSI6IjQzMTM1ZWY2LTA5NjEtNGFlZC1hOTYxLWQyZGI1YWJmM2U1YyIsInNjcCI6WyJvZmZsaW5lIiwiZi5hbGwiLCJhY2Nlc3NfdG9rZW4iXSwic3ViIjoiMTE0NTI3ODE1MzA1MTI4OTc0NDcwIiwidXNlcl9pbmZvIjp7ImZhbWlseV9uYW1lIjoiTWFoaW5kcmFrYXIiLCJnaXZlbl9uYW1lIjoiUHJhZnVsbGEiLCJuYW1lIjoiUHJhZnVsbGEgTWFoaW5kcmFrYXIiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EtL0FPaDE0R2p1VDFrOC04YTV2QkdPSUYxYURnaFltRng4aEQ5S05pUjVqblp1PXM5Ni1jIiwic3ViamVjdCI6IjExNDUyNzgxNTMwNTEyODk3NDQ3MCJ9fQ.YKom5-gE4e84rJJIfxcpbMzgjZT33UZ27UTa1y8pK2BAWaPjIZtwudwDHQ5Rd3m0mJJWhBp0j0e8h9DvzBUdpsnGMXSCYKP-ag9y9k5OW59FMm9RqIakWHtj6NPnxGO1jAsaNCYePj8knR7pBLCLCse2taDHUJ8RU1F0DeHNr2y-JupgG5y1vjBcb-9eD8OwOSTp686_hm7XoJlxiKx8dj2O7HPH7M2pAHA_0bVrKKj7Y_s3fRhkm_Aq6LRdA-IiTl9xJQxgVUreejls9-RR9mSTKj6A81-Isz3qAUttVVaA4OT5OdW879_yT7OSLw_QwpXzNZ7qOR7OIpmL_xZXig", + "expiry":"2021-04-27T19:55:26.658635+05:30" +} \ No newline at end of file diff --git a/flytectl/pkg/pkce/token_cache_keyring.go b/flytectl/pkg/pkce/token_cache_keyring.go new file mode 100644 index 0000000000..119fea5033 --- /dev/null +++ b/flytectl/pkg/pkce/token_cache_keyring.go @@ -0,0 +1,58 @@ +package pkce + +import ( + "encoding/json" + "fmt" + + "github.com/zalando/go-keyring" + "golang.org/x/oauth2" +) + +// TokenCacheKeyringProvider wraps the logic to save and retrieve tokens from the OS's keyring implementation. +type TokenCacheKeyringProvider struct { + ServiceName string + ServiceUser string +} + +const ( + KeyRingServiceUser = "flytectl-user" + KeyRingServiceName = "flytectl" +) + +func (t TokenCacheKeyringProvider) SaveToken(token *oauth2.Token) error { + var tokenBytes []byte + if token.AccessToken == "" { + return fmt.Errorf("cannot save empty token with expiration %v", token.Expiry) + } + + var err error + if tokenBytes, err = json.Marshal(token); err != nil { + return fmt.Errorf("unable to marshal token to save in cache due to %w", err) + } + + // set token in keyring + if err = keyring.Set(t.ServiceName, t.ServiceUser, string(tokenBytes)); err != nil { + return fmt.Errorf("unable to save token. Error: %w", err) + } + + return nil +} + +func (t TokenCacheKeyringProvider) GetToken() (*oauth2.Token, error) { + // get saved token + tokenJSON, err := keyring.Get(t.ServiceName, t.ServiceUser) + if len(tokenJSON) == 0 { + return nil, fmt.Errorf("no token found in the cache") + } + + if err != nil { + return nil, err + } + + token := oauth2.Token{} + if err = json.Unmarshal([]byte(tokenJSON), &token); err != nil { + return nil, fmt.Errorf("unmarshalling error for saved token. Error: %w", err) + } + + return &token, nil +} diff --git a/flytectl/pkg/pkce/token_cache_keyring_test.go b/flytectl/pkg/pkce/token_cache_keyring_test.go new file mode 100644 index 0000000000..11946b677d --- /dev/null +++ b/flytectl/pkg/pkce/token_cache_keyring_test.go @@ -0,0 +1,64 @@ +package pkce + +import ( + "encoding/json" + "io/ioutil" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/zalando/go-keyring" + "golang.org/x/oauth2" +) + +func TestSaveAndGetToken(t *testing.T) { + keyring.MockInit() + tokenCacheProvider := TokenCacheKeyringProvider{ + ServiceUser: "testServiceUser", + ServiceName: "testServiceName", + } + + t.Run("Valid Save/Get Token", func(t *testing.T) { + plan, _ := ioutil.ReadFile("testdata/token.json") + var tokenData oauth2.Token + err := json.Unmarshal(plan, &tokenData) + assert.NoError(t, err) + err = tokenCacheProvider.SaveToken(&tokenData) + assert.NoError(t, err) + var savedToken *oauth2.Token + savedToken, err = tokenCacheProvider.GetToken() + assert.NoError(t, err) + assert.NotNil(t, savedToken) + assert.Equal(t, tokenData.AccessToken, savedToken.AccessToken) + assert.Equal(t, tokenData.TokenType, savedToken.TokenType) + assert.Equal(t, tokenData.Expiry, savedToken.Expiry) + }) + + t.Run("Empty access token Save", func(t *testing.T) { + plan, _ := ioutil.ReadFile("testdata/empty_access_token.json") + var tokenData oauth2.Token + var err error + err = json.Unmarshal(plan, &tokenData) + assert.NoError(t, err) + + err = tokenCacheProvider.SaveToken(&tokenData) + assert.Error(t, err) + }) + + t.Run("Different service name", func(t *testing.T) { + plan, _ := ioutil.ReadFile("testdata/token.json") + var tokenData oauth2.Token + err := json.Unmarshal(plan, &tokenData) + assert.NoError(t, err) + err = tokenCacheProvider.SaveToken(&tokenData) + assert.NoError(t, err) + tokenCacheProvider2 := TokenCacheKeyringProvider{ + ServiceUser: "testServiceUser2", + ServiceName: "testServiceName2", + } + + var savedToken *oauth2.Token + savedToken, err = tokenCacheProvider2.GetToken() + assert.Error(t, err) + assert.Nil(t, savedToken) + }) +} From a0632f082b505e94c7785602891ffe7e528ec50a Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Fri, 7 May 2021 11:10:56 +0530 Subject: [PATCH 045/645] Refactored the fetcher interface to exclude cmdCtx (#61) * Refactored the fetcher interface to exclude cmdCtx and added builder Signed-off-by: Prafulla Mahindrakar * Further refactoring and fixed tests Signed-off-by: Prafulla Mahindrakar * Added more coverage and fixed linter issues Signed-off-by: Prafulla Mahindrakar * Still more coverage Signed-off-by: Prafulla Mahindrakar * Still more coverage Signed-off-by: Prafulla Mahindrakar * lint issue Signed-off-by: Prafulla Mahindrakar * lint issue Signed-off-by: Prafulla Mahindrakar * morelint issue Signed-off-by: Prafulla Mahindrakar * Renamed Fetcher to be AdminFetcherExt and initialized it cmdCtx Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/core/cmd.go | 1 - flytectl/cmd/core/cmd_ctx.go | 15 +- flytectl/cmd/create/create.go | 3 +- flytectl/cmd/create/execution_test.go | 2 +- flytectl/cmd/create/execution_util.go | 26 +- flytectl/cmd/delete/delete.go | 3 +- flytectl/cmd/get/execution.go | 12 +- flytectl/cmd/get/execution_util.go | 16 - flytectl/cmd/get/execution_util_test.go | 90 +++++ flytectl/cmd/get/get.go | 12 - .../cmd/get/interfaces/fetcher_interface.go | 16 - flytectl/cmd/get/interfaces/mocks/fetcher.go | 99 ----- .../cmd/get/interfaces/mocks/get_execution.go | 58 --- flytectl/cmd/get/launch_plan.go | 46 ++- flytectl/cmd/get/launch_plan_test.go | 72 +++- flytectl/cmd/get/launch_plan_util.go | 90 ----- flytectl/cmd/get/task.go | 35 +- flytectl/cmd/get/task_test.go | 72 +++- flytectl/cmd/get/task_util.go | 93 ----- flytectl/cmd/testutils/test_utils.go | 8 +- flytectl/docs/source/index.rst | 8 +- flytectl/pkg/ext/execution_fetcher_ext.go | 22 ++ flytectl/pkg/ext/fetcher_ext_client.go | 49 +++ flytectl/pkg/ext/launch_plan_fetcher.go | 60 ++++ .../ext/mocks/admin_fetcher_ext_interface.go | 339 ++++++++++++++++++ .../admin_service_fetcher_ext_interface.go | 339 ++++++++++++++++++ flytectl/pkg/ext/task_fetcher.go | 60 ++++ 27 files changed, 1218 insertions(+), 428 deletions(-) create mode 100644 flytectl/cmd/get/execution_util_test.go delete mode 100644 flytectl/cmd/get/interfaces/fetcher_interface.go delete mode 100644 flytectl/cmd/get/interfaces/mocks/fetcher.go delete mode 100644 flytectl/cmd/get/interfaces/mocks/get_execution.go delete mode 100644 flytectl/cmd/get/launch_plan_util.go delete mode 100644 flytectl/cmd/get/task_util.go create mode 100644 flytectl/pkg/ext/execution_fetcher_ext.go create mode 100644 flytectl/pkg/ext/fetcher_ext_client.go create mode 100644 flytectl/pkg/ext/launch_plan_fetcher.go create mode 100644 flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go create mode 100644 flytectl/pkg/ext/mocks/admin_service_fetcher_ext_interface.go create mode 100644 flytectl/pkg/ext/task_fetcher.go diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 27d8d56063..2a13e36c05 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -65,7 +65,6 @@ func generateCommandFunc(cmdEntry CommandEntry) func(cmd *cobra.Command, args [] if err != nil { return err } - return cmdEntry.CmdFunc(ctx, args, NewCommandContext(clientSet.AdminClient(), cmd.OutOrStdout())) } } diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go index e0de7d1a18..58f3ff457b 100644 --- a/flytectl/cmd/core/cmd_ctx.go +++ b/flytectl/cmd/core/cmd_ctx.go @@ -3,17 +3,20 @@ package cmdcore import ( "io" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" ) type CommandContext struct { - adminClient service.AdminServiceClient - in io.Reader - out io.Writer + adminClient service.AdminServiceClient + adminClientFetcherExt ext.AdminFetcherExtInterface + in io.Reader + out io.Writer } func NewCommandContext(adminClient service.AdminServiceClient, out io.Writer) CommandContext { - return CommandContext{adminClient: adminClient, out: out} + return CommandContext{adminClient: adminClient, out: out, + adminClientFetcherExt: &ext.AdminFetcherExtClient{AdminClient: adminClient}} } func (c CommandContext) AdminClient() service.AdminServiceClient { @@ -27,3 +30,7 @@ func (c CommandContext) OutputPipe() io.Writer { func (c CommandContext) InputPipe() io.Reader { return c.in } + +func (c CommandContext) AdminFetcherExt() ext.AdminFetcherExtInterface { + return c.adminClientFetcherExt +} diff --git a/flytectl/cmd/create/create.go b/flytectl/cmd/create/create.go index ad1f6ac33c..5868b91c97 100644 --- a/flytectl/cmd/create/create.go +++ b/flytectl/cmd/create/create.go @@ -2,6 +2,7 @@ package create import ( cmdcore "github.com/flyteorg/flytectl/cmd/core" + "github.com/spf13/cobra" ) @@ -16,7 +17,7 @@ Example create. ` ) -// CreateCommand will return create command +// RemoteCreateCommand will return create flyte resource commands func RemoteCreateCommand() *cobra.Command { createCmd := &cobra.Command{ Use: "create", diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index 9a593760c9..c833da4889 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -175,7 +175,7 @@ func TestCreateLaunchPlanExecutionFunc(t *testing.T) { err = createExecutionCommand(ctx, args, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) - tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) + tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e" `) } func TestCreateRelaunchExecutionFunc(t *testing.T) { diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index dd21867ba8..25721d14e4 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -14,31 +14,37 @@ import ( "sigs.k8s.io/yaml" ) -func createExecutionRequestForWorkflow(ctx context.Context, workflowName string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.ExecutionCreateRequest, error) { +func createExecutionRequestForWorkflow(ctx context.Context, workflowName, project, domain string, + cmdCtx cmdCore.CommandContext) (*admin.ExecutionCreateRequest, error) { var lp *admin.LaunchPlan var err error + // Fetch the launch plan - if lp, err = cmdGet.DefaultFetcher.FetchLPVersion(ctx, workflowName, executionConfig.Version, project, domain, cmdCtx); err != nil { + if lp, err = cmdCtx.AdminFetcherExt().FetchLPVersion(ctx, workflowName, executionConfig.Version, project, domain); err != nil { return nil, err } + // Create workflow params literal map var paramLiterals map[string]*core.Literal workflowParams := cmdGet.WorkflowParams(lp) + if paramLiterals, err = MakeLiteralForParams(executionConfig.Inputs, workflowParams); err != nil { return nil, err } var inputs = &core.LiteralMap{ Literals: paramLiterals, } + ID := lp.Id return createExecutionRequest(ID, inputs, nil), nil } -func createExecutionRequestForTask(ctx context.Context, taskName string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.ExecutionCreateRequest, error) { +func createExecutionRequestForTask(ctx context.Context, taskName string, project string, domain string, + cmdCtx cmdCore.CommandContext) (*admin.ExecutionCreateRequest, error) { var task *admin.Task var err error // Fetch the task - if task, err = cmdGet.FetchTaskVersion(ctx, taskName, executionConfig.Version, project, domain, cmdCtx); err != nil { + if task, err = cmdCtx.AdminFetcherExt().FetchTaskVersion(ctx, taskName, executionConfig.Version, project, domain); err != nil { return nil, err } // Create task variables literal map @@ -68,7 +74,8 @@ func createExecutionRequestForTask(ctx context.Context, taskName string, project return createExecutionRequest(ID, inputs, authRole), nil } -func relaunchExecution(ctx context.Context, executionName string, project string, domain string, cmdCtx cmdCore.CommandContext) error { +func relaunchExecution(ctx context.Context, executionName string, project string, domain string, + cmdCtx cmdCore.CommandContext) error { relaunchedExec, err := cmdCtx.AdminClient().RelaunchExecution(ctx, &admin.ExecutionRelaunchRequest{ Id: &core.WorkflowExecutionIdentifier{ Name: executionName, @@ -83,7 +90,8 @@ func relaunchExecution(ctx context.Context, executionName string, project string return nil } -func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, authRole *admin.AuthRole) *admin.ExecutionCreateRequest { +func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, + authRole *admin.AuthRole) *admin.ExecutionCreateRequest { return &admin.ExecutionCreateRequest{ Project: executionConfig.TargetProject, Domain: executionConfig.TargetDomain, @@ -138,7 +146,8 @@ func resolveOverrides(toBeOverridden *ExecutionConfig, project string, domain st func readConfigAndValidate(project string, domain string) (ExecutionParams, error) { executionParams := ExecutionParams{} if executionConfig.ExecFile == "" && executionConfig.Relaunch == "" { - return executionParams, fmt.Errorf("executionConfig or relaunch can't be empty. Run the flytectl get task/launchplan to generate the config") + return executionParams, fmt.Errorf("executionConfig or relaunch can't be empty." + + " Run the flytectl get task/launchplan to generate the config") } if executionConfig.Relaunch != "" { resolveOverrides(executionConfig, project, domain) @@ -155,7 +164,8 @@ func readConfigAndValidate(project string, domain string) (ExecutionParams, erro isTask := readExecutionConfig.Task != "" isWorkflow := readExecutionConfig.Workflow != "" if isTask == isWorkflow { - return executionParams, fmt.Errorf("either one of task or workflow name should be specified to launch an execution") + return executionParams, fmt.Errorf("either one of task or workflow name should be specified" + + " to launch an execution") } name := readExecutionConfig.Task execType := Task diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index 29ec1efa05..2b6cf36310 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -25,7 +25,8 @@ func RemoteDeleteCommand() *cobra.Command { Long: deleteCmdLong, } terminateResourcesFuncs := map[string]cmdcore.CommandEntry{ - "execution": {CmdFunc: terminateExecutionFunc, Aliases: []string{"executions"}, Short: execCmdShort, Long: execCmdLong}, + "execution": {CmdFunc: terminateExecutionFunc, Aliases: []string{"executions"}, Short: execCmdShort, + Long: execCmdLong}, } cmdcore.AddCommands(deleteCmd, terminateResourcesFuncs) return deleteCmd diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index e6ab431df5..3f378b6c1d 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -3,13 +3,12 @@ package get import ( "context" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" - "github.com/golang/protobuf/proto" - "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" + "github.com/golang/protobuf/proto" ) const ( @@ -69,7 +68,7 @@ func getExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Command var executions []*admin.Execution if len(args) > 0 { name := args[0] - execution, err := DefaultFetcher.FetchExecution(ctx, name, config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) + execution, err := cmdCtx.AdminFetcherExt().FetchExecution(ctx, name, config.GetConfig().Project, config.GetConfig().Domain) if err != nil { return err } @@ -88,7 +87,8 @@ func getExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Command executions = executionList.Executions } logger.Infof(ctx, "Retrieved %v executions", len(executions)) - err := adminPrinter.Print(config.GetConfig().MustOutputFormat(), executionColumns, ExecutionToProtoMessages(executions)...) + err := adminPrinter.Print(config.GetConfig().MustOutputFormat(), executionColumns, + ExecutionToProtoMessages(executions)...) if err != nil { return err } diff --git a/flytectl/cmd/get/execution_util.go b/flytectl/cmd/get/execution_util.go index 2a563f4165..da330af39e 100644 --- a/flytectl/cmd/get/execution_util.go +++ b/flytectl/cmd/get/execution_util.go @@ -1,13 +1,11 @@ package get import ( - "context" "errors" "fmt" "io/ioutil" "os" - cmdCore "github.com/flyteorg/flytectl/cmd/core" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" "github.com/flyteorg/flyteidl/clients/go/coreutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -29,20 +27,6 @@ type ExecutionConfig struct { Inputs map[string]interface{} `json:"inputs"` } -func (f FetcherImpl) FetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.Execution, error) { - e, err := cmdCtx.AdminClient().GetExecution(ctx, &admin.WorkflowExecutionGetRequest{ - Id: &core.WorkflowExecutionIdentifier{ - Project: project, - Domain: domain, - Name: name, - }, - }) - if err != nil { - return nil, err - } - return e, nil -} - func WriteExecConfigToFile(executionConfig ExecutionConfig, fileName string) error { d, err := yaml.Marshal(executionConfig) if err != nil { diff --git a/flytectl/cmd/get/execution_util_test.go b/flytectl/cmd/get/execution_util_test.go new file mode 100644 index 0000000000..2d98c8b834 --- /dev/null +++ b/flytectl/cmd/get/execution_util_test.go @@ -0,0 +1,90 @@ +package get + +import ( + "testing" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/stretchr/testify/assert" + + "google.golang.org/protobuf/types/known/timestamppb" +) + +func TestTaskInputs(t *testing.T) { + taskInputs := map[string]*core.Variable{} + t.Run("nil task", func(t *testing.T) { + retValue := TaskInputs(nil) + assert.Equal(t, taskInputs, retValue) + }) + t.Run("valid inputs", func(t *testing.T) { + task := createTask() + retValue := TaskInputs(task) + assert.Equal(t, task.Closure.CompiledTask.Template.Interface.Inputs.Variables, retValue) + }) + t.Run("closure compiled task nil", func(t *testing.T) { + task := createTask() + task.Closure.CompiledTask = nil + retValue := TaskInputs(task) + assert.Equal(t, taskInputs, retValue) + }) + t.Run("closure compiled task template nil", func(t *testing.T) { + task := createTask() + task.Closure.CompiledTask.Template = nil + retValue := TaskInputs(task) + assert.Equal(t, taskInputs, retValue) + }) + t.Run("closure compiled task template interface nil", func(t *testing.T) { + task := createTask() + task.Closure.CompiledTask.Template.Interface = nil + retValue := TaskInputs(task) + assert.Equal(t, taskInputs, retValue) + }) + t.Run("closure compiled task template interface input nil", func(t *testing.T) { + task := createTask() + task.Closure.CompiledTask.Template.Interface.Inputs = nil + retValue := TaskInputs(task) + assert.Equal(t, taskInputs, retValue) + }) +} + +func createTask() *admin.Task { + sortedListLiteralType := core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + } + + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, + } + + inputs := &core.VariableMap{ + Variables: variableMap, + } + typedInterface := &core.TypedInterface{ + Inputs: inputs, + } + taskTemplate := &core.TaskTemplate{ + Interface: typedInterface, + } + compiledTask := &core.CompiledTask{ + Template: taskTemplate, + } + return &admin.Task{ + Id: &core.Identifier{ + Name: "task1", + Version: "v2", + }, + Closure: &admin.TaskClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + CompiledTask: compiledTask, + }, + } +} diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index 46f392c4d0..e875a0ca01 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -2,7 +2,6 @@ package get import ( cmdcore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/cmd/get/interfaces" "github.com/spf13/cobra" ) @@ -18,17 +17,6 @@ Example get projects. ` ) -var ( - DefaultFetcher = NewFetcherImpl() -) - -func NewFetcherImpl() interfaces.Fetcher { - return FetcherImpl{} -} - -type FetcherImpl struct { -} - // CreateGetCommand will return get command func CreateGetCommand() *cobra.Command { getCmd := &cobra.Command{ diff --git a/flytectl/cmd/get/interfaces/fetcher_interface.go b/flytectl/cmd/get/interfaces/fetcher_interface.go deleted file mode 100644 index 62a007e848..0000000000 --- a/flytectl/cmd/get/interfaces/fetcher_interface.go +++ /dev/null @@ -1,16 +0,0 @@ -package interfaces - -import ( - "context" - - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" -) - -//go:generate mockery -all -case=underscore - -// Interface for exposing the fetch capabilities to other modules. eg : create execution which requires to fetch launchplan details. -type Fetcher interface { - FetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.Execution, error) - FetchLPVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.LaunchPlan, error) -} diff --git a/flytectl/cmd/get/interfaces/mocks/fetcher.go b/flytectl/cmd/get/interfaces/mocks/fetcher.go deleted file mode 100644 index 61742c70c6..0000000000 --- a/flytectl/cmd/get/interfaces/mocks/fetcher.go +++ /dev/null @@ -1,99 +0,0 @@ -// Code generated by mockery v1.0.1. DO NOT EDIT. - -package mocks - -import ( - cmdcore "github.com/flyteorg/flytectl/cmd/core" - admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - - context "context" - - mock "github.com/stretchr/testify/mock" -) - -// Fetcher is an autogenerated mock type for the Fetcher type -type Fetcher struct { - mock.Mock -} - -type Fetcher_FetchExecution struct { - *mock.Call -} - -func (_m Fetcher_FetchExecution) Return(_a0 *admin.Execution, _a1 error) *Fetcher_FetchExecution { - return &Fetcher_FetchExecution{Call: _m.Call.Return(_a0, _a1)} -} - -func (_m *Fetcher) OnFetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdcore.CommandContext) *Fetcher_FetchExecution { - c := _m.On("FetchExecution", ctx, name, project, domain, cmdCtx) - return &Fetcher_FetchExecution{Call: c} -} - -func (_m *Fetcher) OnFetchExecutionMatch(matchers ...interface{}) *Fetcher_FetchExecution { - c := _m.On("FetchExecution", matchers...) - return &Fetcher_FetchExecution{Call: c} -} - -// FetchExecution provides a mock function with given fields: ctx, name, project, domain, cmdCtx -func (_m *Fetcher) FetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdcore.CommandContext) (*admin.Execution, error) { - ret := _m.Called(ctx, name, project, domain, cmdCtx) - - var r0 *admin.Execution - if rf, ok := ret.Get(0).(func(context.Context, string, string, string, cmdcore.CommandContext) *admin.Execution); ok { - r0 = rf(ctx, name, project, domain, cmdCtx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*admin.Execution) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, string, cmdcore.CommandContext) error); ok { - r1 = rf(ctx, name, project, domain, cmdCtx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type Fetcher_FetchLPVersion struct { - *mock.Call -} - -func (_m Fetcher_FetchLPVersion) Return(_a0 *admin.LaunchPlan, _a1 error) *Fetcher_FetchLPVersion { - return &Fetcher_FetchLPVersion{Call: _m.Call.Return(_a0, _a1)} -} - -func (_m *Fetcher) OnFetchLPVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdcore.CommandContext) *Fetcher_FetchLPVersion { - c := _m.On("FetchLPVersion", ctx, name, version, project, domain, cmdCtx) - return &Fetcher_FetchLPVersion{Call: c} -} - -func (_m *Fetcher) OnFetchLPVersionMatch(matchers ...interface{}) *Fetcher_FetchLPVersion { - c := _m.On("FetchLPVersion", matchers...) - return &Fetcher_FetchLPVersion{Call: c} -} - -// FetchLPVersion provides a mock function with given fields: ctx, name, version, project, domain, cmdCtx -func (_m *Fetcher) FetchLPVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdcore.CommandContext) (*admin.LaunchPlan, error) { - ret := _m.Called(ctx, name, version, project, domain, cmdCtx) - - var r0 *admin.LaunchPlan - if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string, cmdcore.CommandContext) *admin.LaunchPlan); ok { - r0 = rf(ctx, name, version, project, domain, cmdCtx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*admin.LaunchPlan) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string, cmdcore.CommandContext) error); ok { - r1 = rf(ctx, name, version, project, domain, cmdCtx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} diff --git a/flytectl/cmd/get/interfaces/mocks/get_execution.go b/flytectl/cmd/get/interfaces/mocks/get_execution.go deleted file mode 100644 index 0df4fcf5ac..0000000000 --- a/flytectl/cmd/get/interfaces/mocks/get_execution.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by mockery v1.0.1. DO NOT EDIT. - -package mocks - -import ( - cmdcore "github.com/flyteorg/flytectl/cmd/core" - admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - - context "context" - - mock "github.com/stretchr/testify/mock" -) - -// GetExecution is an autogenerated mock type for the GetExecution type -type GetExecution struct { - mock.Mock -} - -type GetExecution_FetchExecution struct { - *mock.Call -} - -func (_m GetExecution_FetchExecution) Return(_a0 *admin.Execution, _a1 error) *GetExecution_FetchExecution { - return &GetExecution_FetchExecution{Call: _m.Call.Return(_a0, _a1)} -} - -func (_m *GetExecution) OnFetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdcore.CommandContext) *GetExecution_FetchExecution { - c := _m.On("FetchExecution", ctx, name, project, domain, cmdCtx) - return &GetExecution_FetchExecution{Call: c} -} - -func (_m *GetExecution) OnFetchExecutionMatch(matchers ...interface{}) *GetExecution_FetchExecution { - c := _m.On("FetchExecution", matchers...) - return &GetExecution_FetchExecution{Call: c} -} - -// FetchExecution provides a mock function with given fields: ctx, name, project, domain, cmdCtx -func (_m *GetExecution) FetchExecution(ctx context.Context, name string, project string, domain string, cmdCtx cmdcore.CommandContext) (*admin.Execution, error) { - ret := _m.Called(ctx, name, project, domain, cmdCtx) - - var r0 *admin.Execution - if rf, ok := ret.Get(0).(func(context.Context, string, string, string, cmdcore.CommandContext) *admin.Execution); ok { - r0 = rf(ctx, name, project, domain, cmdCtx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*admin.Execution) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, string, cmdcore.CommandContext) error); ok { - r1 = rf(ctx, name, project, domain, cmdCtx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 2b6e8a7fe2..e98029483c 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -6,6 +6,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/adminutils" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" @@ -108,21 +109,58 @@ func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comman name := args[0] var launchPlans []*admin.LaunchPlan var err error - if launchPlans, err = FetchLPForName(ctx, name, project, domain, cmdCtx); err != nil { + if launchPlans, err = FetchLPForName(ctx, cmdCtx.AdminFetcherExt(), name, project, domain); err != nil { return err } logger.Debugf(ctx, "Retrieved %v launch plans", len(launchPlans)) - err = launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplanColumns, LaunchplanToProtoMessages(launchPlans)...) + err = launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplanColumns, + LaunchplanToProtoMessages(launchPlans)...) if err != nil { return err } return nil } - launchPlans, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListLaunchPlanIds, adminutils.ListRequest{Project: project, Domain: domain}) + launchPlans, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListLaunchPlanIds, + adminutils.ListRequest{Project: project, Domain: domain}) if err != nil { return err } logger.Debugf(ctx, "Retrieved %v launch plans", len(launchPlans)) - return launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, adminutils.NamedEntityToProtoMessage(launchPlans)...) + return launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, + adminutils.NamedEntityToProtoMessage(launchPlans)...) +} + +// FetchLPForName fetches the launchplan give it name. +func FetchLPForName(ctx context.Context, fetcher ext.AdminFetcherExtInterface, name, project, + domain string) ([]*admin.LaunchPlan, error) { + var launchPlans []*admin.LaunchPlan + var lp *admin.LaunchPlan + var err error + if launchPlanConfig.Latest { + if lp, err = fetcher.FetchLPLatestVersion(ctx, name, project, domain); err != nil { + return nil, err + } + launchPlans = append(launchPlans, lp) + } else if launchPlanConfig.Version != "" { + if lp, err = fetcher.FetchLPVersion(ctx, name, launchPlanConfig.Version, project, domain); err != nil { + return nil, err + } + launchPlans = append(launchPlans, lp) + } else { + launchPlans, err = fetcher.FetchAllVerOfLP(ctx, name, project, domain) + if err != nil { + return nil, err + } + } + if launchPlanConfig.ExecFile != "" { + // There would be atleast one launchplan object when code reaches here and hence the length + // assertion is not required. + lp = launchPlans[0] + // Only write the first task from the tasks object. + if err = CreateAndWriteExecConfigForWorkflow(lp, launchPlanConfig.ExecFile); err != nil { + return nil, err + } + } + return launchPlans, nil } diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index 54f7f14202..058e745cd0 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -1,12 +1,15 @@ package get import ( + "fmt" "os" "testing" "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/timestamppb" @@ -18,6 +21,8 @@ var ( namedIDRequest *admin.NamedEntityIdentifierListRequest launchPlanListResponse *admin.LaunchPlanList argsLp []string + namedIdentifierList *admin.NamedEntityIdentifierList + launchPlan2 *admin.LaunchPlan ) func getLaunchPlanSetup() { @@ -90,7 +95,7 @@ func getLaunchPlanSetup() { }, }, } - launchPlan2 := &admin.LaunchPlan{ + launchPlan2 = &admin.LaunchPlan{ Id: &core.Identifier{ Name: "launchplan1", Version: "v2", @@ -159,22 +164,65 @@ func getLaunchPlanSetup() { Name: "launchplan2", } entities = append(entities, id1, id2) - namedIdentifierList := &admin.NamedEntityIdentifierList{ + namedIdentifierList = &admin.NamedEntityIdentifierList{ Entities: entities, } - mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) - mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) - mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) - launchPlanConfig.Latest = false launchPlanConfig.Version = "" launchPlanConfig.ExecFile = "" } +func TestGetLaunchPlanFuncWithError(t *testing.T) { + t.Run("failure fetch latest", func(t *testing.T) { + setup() + getLaunchPlanSetup() + mockFetcher := new(mocks.AdminFetcherExtInterface) + launchPlanConfig.Latest = true + mockFetcher.OnFetchLPLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) + _, err = FetchLPForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + assert.NotNil(t, err) + }) + + t.Run("failure fetching version ", func(t *testing.T) { + setup() + getLaunchPlanSetup() + mockFetcher := new(mocks.AdminFetcherExtInterface) + launchPlanConfig.Version = "v1" + mockFetcher.OnFetchLPVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("error fetching version")) + _, err = FetchLPForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + assert.NotNil(t, err) + }) + + t.Run("failure fetching all version ", func(t *testing.T) { + setup() + getLaunchPlanSetup() + mockFetcher := new(mocks.AdminFetcherExtInterface) + mockFetcher.OnFetchAllVerOfLPMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) + _, err = FetchLPForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + assert.NotNil(t, err) + }) + + t.Run("failure fetching ", func(t *testing.T) { + setup() + getLaunchPlanSetup() + mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(nil, fmt.Errorf("error fetching all version")) + mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(nil, fmt.Errorf("error fetching lanuch plan")) + mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(nil, fmt.Errorf("error listing lanuch plan ids")) + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + assert.NotNil(t, err) + }) +} + func TestGetLaunchPlanFunc(t *testing.T) { setup() getLaunchPlanSetup() + mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) + mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) + mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceListRequest) @@ -344,6 +392,9 @@ func TestGetLaunchPlanFuncLatest(t *testing.T) { setup() getLaunchPlanSetup() launchPlanConfig.Latest = true + mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) + mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) + mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceListRequest) @@ -432,6 +483,9 @@ func TestGetLaunchPlanWithVersion(t *testing.T) { setup() getLaunchPlanSetup() launchPlanConfig.Version = "v2" + mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) + mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) + mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "GetLaunchPlan", ctx, objectGetRequest) @@ -519,6 +573,9 @@ func TestGetLaunchPlanWithVersion(t *testing.T) { func TestGetLaunchPlans(t *testing.T) { setup() getLaunchPlanSetup() + mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) + mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) + mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) argsLp = []string{} err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) @@ -540,6 +597,9 @@ func TestGetLaunchPlans(t *testing.T) { func TestGetLaunchPlansWithExecFile(t *testing.T) { setup() getLaunchPlanSetup() + mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) + mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) + mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) launchPlanConfig.Version = "v2" launchPlanConfig.ExecFile = testDataFolder + "exec_file" err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) diff --git a/flytectl/cmd/get/launch_plan_util.go b/flytectl/cmd/get/launch_plan_util.go deleted file mode 100644 index d3a803e32b..0000000000 --- a/flytectl/cmd/get/launch_plan_util.go +++ /dev/null @@ -1,90 +0,0 @@ -package get - -import ( - "context" - "fmt" - - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" -) - -// Reads the launchplan config to drive fetching the correct launch plans. -func FetchLPForName(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) ([]*admin.LaunchPlan, error) { - var launchPlans []*admin.LaunchPlan - var lp *admin.LaunchPlan - var err error - if launchPlanConfig.Latest { - if lp, err = FetchLPLatestVersion(ctx, name, project, domain, cmdCtx); err != nil { - return nil, err - } - launchPlans = append(launchPlans, lp) - } else if launchPlanConfig.Version != "" { - if lp, err = DefaultFetcher.FetchLPVersion(ctx, name, launchPlanConfig.Version, project, domain, cmdCtx); err != nil { - return nil, err - } - launchPlans = append(launchPlans, lp) - } else { - launchPlans, err = FetchAllVerOfLP(ctx, name, project, domain, cmdCtx) - if err != nil { - return nil, err - } - } - if launchPlanConfig.ExecFile != "" { - // There would be atleast one launchplan object when code reaches here and hence the length assertion is not required. - lp = launchPlans[0] - // Only write the first task from the tasks object. - if err = CreateAndWriteExecConfigForWorkflow(lp, launchPlanConfig.ExecFile); err != nil { - return nil, err - } - } - return launchPlans, nil -} - -func FetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string, cmdCtx cmdCore.CommandContext) ([]*admin.LaunchPlan, error) { - tList, err := cmdCtx.AdminClient().ListLaunchPlans(ctx, &admin.ResourceListRequest{ - Id: &admin.NamedEntityIdentifier{ - Project: project, - Domain: domain, - Name: lpName, - }, - SortBy: &admin.Sort{ - Key: "created_at", - Direction: admin.Sort_DESCENDING, - }, - Limit: 100, - }) - if err != nil { - return nil, err - } - if len(tList.LaunchPlans) == 0 { - return nil, fmt.Errorf("no launchplans retrieved for %v", lpName) - } - return tList.LaunchPlans, nil -} - -func FetchLPLatestVersion(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.LaunchPlan, error) { - // Fetch the latest version of the task. - lpVersions, err := FetchAllVerOfLP(ctx, name, project, domain, cmdCtx) - if err != nil { - return nil, err - } - lp := lpVersions[0] - return lp, nil -} - -func (f FetcherImpl) FetchLPVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.LaunchPlan, error) { - lp, err := cmdCtx.AdminClient().GetLaunchPlan(ctx, &admin.ObjectGetRequest{ - Id: &core.Identifier{ - ResourceType: core.ResourceType_LAUNCH_PLAN, - Project: project, - Domain: domain, - Name: name, - Version: version, - }, - }) - if err != nil { - return nil, err - } - return lp, nil -} diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 9b98de40d6..7be143d232 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -6,6 +6,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/adminutils" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" @@ -109,7 +110,7 @@ func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte name := args[0] var tasks []*admin.Task var err error - if tasks, err = FetchTaskForName(ctx, name, project, domain, cmdCtx); err != nil { + if tasks, err = FetchTaskForName(ctx, cmdCtx.AdminFetcherExt(), name, project, domain); err != nil { return err } logger.Debugf(ctx, "Retrieved Task", tasks) @@ -122,3 +123,35 @@ func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte logger.Debugf(ctx, "Retrieved %v Task", len(tasks)) return taskPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, adminutils.NamedEntityToProtoMessage(tasks)...) } + +// FetchTaskForName Reads the task config to drive fetching the correct tasks. +func FetchTaskForName(ctx context.Context, fetcher ext.AdminFetcherExtInterface, name, project, domain string) ([]*admin.Task, error) { + var tasks []*admin.Task + var err error + var task *admin.Task + if taskConfig.Latest { + if task, err = fetcher.FetchTaskLatestVersion(ctx, name, project, domain); err != nil { + return nil, err + } + tasks = append(tasks, task) + } else if taskConfig.Version != "" { + if task, err = fetcher.FetchTaskVersion(ctx, name, taskConfig.Version, project, domain); err != nil { + return nil, err + } + tasks = append(tasks, task) + } else { + tasks, err = fetcher.FetchAllVerOfTask(ctx, name, project, domain) + if err != nil { + return nil, err + } + } + if taskConfig.ExecFile != "" { + // There would be atleast one task object when code reaches here and hence the length assertion is not required. + task = tasks[0] + // Only write the first task from the tasks object. + if err = CreateAndWriteExecConfigForTask(task, taskConfig.ExecFile); err != nil { + return nil, err + } + } + return tasks, nil +} diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index 9f525b39ba..e5f2c62246 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -1,12 +1,15 @@ package get import ( + "fmt" "os" "testing" "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/timestamppb" @@ -18,6 +21,8 @@ var ( namedIDRequestTask *admin.NamedEntityIdentifierListRequest taskListResponse *admin.TaskList argsTask []string + namedIdentifierListTask *admin.NamedEntityIdentifierList + task2 *admin.Task ) func getTaskSetup() { @@ -60,7 +65,7 @@ func getTaskSetup() { }, } - task2 := &admin.Task{ + task2 = &admin.Task{ Id: &core.Identifier{ Name: "task1", Version: "v2", @@ -128,22 +133,65 @@ func getTaskSetup() { Name: "task2", } taskEntities = append(taskEntities, idTask1, idTask2) - namedIdentifierListTask := &admin.NamedEntityIdentifierList{ + namedIdentifierListTask = &admin.NamedEntityIdentifierList{ Entities: taskEntities, } - mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) - mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) - mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) - taskConfig.Latest = false taskConfig.ExecFile = "" taskConfig.Version = "" } +func TestGetTaskFuncWithError(t *testing.T) { + t.Run("failure fetch latest", func(t *testing.T) { + setup() + getTaskSetup() + mockFetcher := new(mocks.AdminFetcherExtInterface) + taskConfig.Latest = true + mockFetcher.OnFetchTaskLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) + _, err = FetchTaskForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + assert.NotNil(t, err) + }) + + t.Run("failure fetching version ", func(t *testing.T) { + setup() + getTaskSetup() + mockFetcher := new(mocks.AdminFetcherExtInterface) + taskConfig.Version = "v1" + mockFetcher.OnFetchTaskVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("error fetching version")) + _, err = FetchTaskForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + assert.NotNil(t, err) + }) + + t.Run("failure fetching all version ", func(t *testing.T) { + setup() + getTaskSetup() + mockFetcher := new(mocks.AdminFetcherExtInterface) + mockFetcher.OnFetchAllVerOfTaskMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) + _, err = FetchTaskForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + assert.NotNil(t, err) + }) + + t.Run("failure fetching ", func(t *testing.T) { + setup() + getLaunchPlanSetup() + mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(nil, fmt.Errorf("error fetching all version")) + mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(nil, fmt.Errorf("error fetching task")) + mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(nil, fmt.Errorf("error listing task ids")) + err = getTaskFunc(ctx, argsTask, cmdCtx) + assert.NotNil(t, err) + }) +} + func TestGetTaskFunc(t *testing.T) { setup() getTaskSetup() + mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) + mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) + mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "ListTasks", ctx, resourceListRequestTask) @@ -220,6 +268,9 @@ func TestGetTaskFunc(t *testing.T) { func TestGetTaskFuncLatest(t *testing.T) { setup() getTaskSetup() + mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) + mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) + mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) taskConfig.Latest = true err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) @@ -262,6 +313,9 @@ func TestGetTaskFuncLatest(t *testing.T) { func TestGetTaskWithVersion(t *testing.T) { setup() getTaskSetup() + mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) + mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) + mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) taskConfig.Version = "v2" objectGetRequestTask.Id.ResourceType = core.ResourceType_TASK err = getTaskFunc(ctx, argsTask, cmdCtx) @@ -305,6 +359,9 @@ func TestGetTaskWithVersion(t *testing.T) { func TestGetTasks(t *testing.T) { setup() getTaskSetup() + mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) + mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) + mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) argsTask = []string{} err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) @@ -326,6 +383,9 @@ func TestGetTasks(t *testing.T) { func TestGetTaskWithExecFile(t *testing.T) { setup() getTaskSetup() + mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) + mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) + mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) taskConfig.Version = "v2" taskConfig.ExecFile = testDataFolder + "task_exec_file" err = getTaskFunc(ctx, argsTask, cmdCtx) diff --git a/flytectl/cmd/get/task_util.go b/flytectl/cmd/get/task_util.go deleted file mode 100644 index 0be9490dc0..0000000000 --- a/flytectl/cmd/get/task_util.go +++ /dev/null @@ -1,93 +0,0 @@ -package get - -import ( - "context" - "fmt" - - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" -) - -// Reads the task config to drive fetching the correct tasks. -func FetchTaskForName(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) ([]*admin.Task, error) { - var tasks []*admin.Task - var err error - var task *admin.Task - if taskConfig.Latest { - if task, err = FetchTaskLatestVersion(ctx, name, project, domain, cmdCtx); err != nil { - return nil, err - } - tasks = append(tasks, task) - } else if taskConfig.Version != "" { - if task, err = FetchTaskVersion(ctx, name, taskConfig.Version, project, domain, cmdCtx); err != nil { - return nil, err - } - tasks = append(tasks, task) - } else { - tasks, err = FetchAllVerOfTask(ctx, name, project, domain, cmdCtx) - if err != nil { - return nil, err - } - } - if taskConfig.ExecFile != "" { - // There would be atleast one task object when code reaches here and hence the length assertion is not required. - task = tasks[0] - // Only write the first task from the tasks object. - if err = CreateAndWriteExecConfigForTask(task, taskConfig.ExecFile); err != nil { - return nil, err - } - } - return tasks, nil -} - -func FetchAllVerOfTask(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) ([]*admin.Task, error) { - tList, err := cmdCtx.AdminClient().ListTasks(ctx, &admin.ResourceListRequest{ - Id: &admin.NamedEntityIdentifier{ - Project: project, - Domain: domain, - Name: name, - }, - SortBy: &admin.Sort{ - Key: "created_at", - Direction: admin.Sort_DESCENDING, - }, - Limit: 100, - }) - if err != nil { - return nil, err - } - if len(tList.Tasks) == 0 { - return nil, fmt.Errorf("no tasks retrieved for %v", name) - } - return tList.Tasks, nil -} - -func FetchTaskLatestVersion(ctx context.Context, name string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.Task, error) { - var t *admin.Task - var err error - // Fetch the latest version of the task. - var taskVersions []*admin.Task - taskVersions, err = FetchAllVerOfTask(ctx, name, project, domain, cmdCtx) - if err != nil { - return nil, err - } - t = taskVersions[0] - return t, nil -} - -func FetchTaskVersion(ctx context.Context, name string, version string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.Task, error) { - t, err := cmdCtx.AdminClient().GetTask(ctx, &admin.ObjectGetRequest{ - Id: &core.Identifier{ - ResourceType: core.ResourceType_TASK, - Project: project, - Domain: domain, - Name: name, - Version: version, - }, - }) - if err != nil { - return nil, err - } - return t, nil -} diff --git a/flytectl/cmd/testutils/test_utils.go b/flytectl/cmd/testutils/test_utils.go index 28d999ba73..3285ed1523 100644 --- a/flytectl/cmd/testutils/test_utils.go +++ b/flytectl/cmd/testutils/test_utils.go @@ -11,6 +11,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/stretchr/testify/assert" @@ -26,6 +27,7 @@ var ( Err error Ctx context.Context MockClient *mocks.AdminServiceClient + FetcherExt ext.AdminFetcherExtInterface mockOutStream io.Writer CmdCtx cmdCore.CommandContext stdOut *os.File @@ -57,6 +59,10 @@ func TearDownAndVerify(t *testing.T, expectedLog string) { os.Stderr = stderr var buf bytes.Buffer if _, err := io.Copy(&buf, reader); err == nil { - assert.Equal(t, strings.Trim(expectedLog, "\n "), strings.Trim(buf.String(), "\n ")) + assert.Equal(t, santizeString(expectedLog), santizeString(buf.String())) } } + +func santizeString(str string) string { + return strings.Trim(strings.ReplaceAll(strings.ReplaceAll(str, "\n", ""), "\t", ""), " \t") +} diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index a3a3d61cc1..d615f2fe7e 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -21,10 +21,10 @@ Flytectl allows configuring using a YAML file or pass every configuration value on command-line. The follow configuration is useful to setup. Place this in $HOME/.flyte directory with name config.yaml. This file is searched in -1] $HOME/.flyte -2] currDir from where you run flytectl -3] /etc/flyte/config -4] You can pass it commandline using --config +* $HOME/.flyte +* currDir from where you run flytectl +* /etc/flyte/config +* You can pass it commandline using --config Basic Configuration -------------------- diff --git a/flytectl/pkg/ext/execution_fetcher_ext.go b/flytectl/pkg/ext/execution_fetcher_ext.go new file mode 100644 index 0000000000..e96351c8b8 --- /dev/null +++ b/flytectl/pkg/ext/execution_fetcher_ext.go @@ -0,0 +1,22 @@ +package ext + +import ( + "context" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +func (a *AdminFetcherExtClient) FetchExecution(ctx context.Context, name, project, domain string) (*admin.Execution, error) { + e, err := a.AdminServiceClient().GetExecution(ctx, &admin.WorkflowExecutionGetRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Project: project, + Domain: domain, + Name: name, + }, + }) + if err != nil { + return nil, err + } + return e, nil +} diff --git a/flytectl/pkg/ext/fetcher_ext_client.go b/flytectl/pkg/ext/fetcher_ext_client.go new file mode 100644 index 0000000000..ebe34ca9d3 --- /dev/null +++ b/flytectl/pkg/ext/fetcher_ext_client.go @@ -0,0 +1,49 @@ +package ext + +import ( + "context" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" +) + +//go:generate mockery -all -case=underscore + +// AdminFetcherExtInterface Interface for exposing the fetch capabilities from the admin and also allow this to be injectable into other +// modules. eg : create execution which requires to fetch launchplan details to construct the execution spec. +type AdminFetcherExtInterface interface { + AdminServiceClient() service.AdminServiceClient + + // FetchExecution fetches the execution based on name, project, domain + FetchExecution(ctx context.Context, name, project, domain string) (*admin.Execution, error) + + // FetchAllVerOfLP fetches all versions of launch plan in a project, domain + FetchAllVerOfLP(ctx context.Context, lpName, project, domain string) ([]*admin.LaunchPlan, error) + + // FetchLPLatestVersion fetches latest version of launch plan in a project, domain + FetchLPLatestVersion(ctx context.Context, name, project, domain string) (*admin.LaunchPlan, error) + + // FetchLPVersion fetches particular version of launch plan in a project, domain + FetchLPVersion(ctx context.Context, name, version, project, domain string) (*admin.LaunchPlan, error) + + // FetchAllVerOfTask fetches all versions of task in a project, domain + FetchAllVerOfTask(ctx context.Context, name, project, domain string) ([]*admin.Task, error) + + // FetchTaskLatestVersion fetches latest version of task in a project, domain + FetchTaskLatestVersion(ctx context.Context, name, project, domain string) (*admin.Task, error) + + // FetchTaskVersion fetches particular version of task in a project, domain + FetchTaskVersion(ctx context.Context, name, version, project, domain string) (*admin.Task, error) +} + +// AdminFetcherExtClient is used for interacting with extended features used for fetching data from admin service +type AdminFetcherExtClient struct { + AdminClient service.AdminServiceClient +} + +func (a *AdminFetcherExtClient) AdminServiceClient() service.AdminServiceClient { + if a == nil { + return nil + } + return a.AdminClient +} diff --git a/flytectl/pkg/ext/launch_plan_fetcher.go b/flytectl/pkg/ext/launch_plan_fetcher.go new file mode 100644 index 0000000000..e7aa21b124 --- /dev/null +++ b/flytectl/pkg/ext/launch_plan_fetcher.go @@ -0,0 +1,60 @@ +package ext + +import ( + "context" + "fmt" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +// FetchAllVerOfLP fetches all the versions for give launch plan name +func (a *AdminFetcherExtClient) FetchAllVerOfLP(ctx context.Context, lpName, project, domain string) ([]*admin.LaunchPlan, error) { + tList, err := a.AdminServiceClient().ListLaunchPlans(ctx, &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + Name: lpName, + }, + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + Limit: 100, + }) + if err != nil { + return nil, err + } + if len(tList.LaunchPlans) == 0 { + return nil, fmt.Errorf("no launchplans retrieved for %v", lpName) + } + return tList.LaunchPlans, nil +} + +// FetchLPLatestVersion fetches latest version for give launch plan name +func (a *AdminFetcherExtClient) FetchLPLatestVersion(ctx context.Context, name, project, domain string) (*admin.LaunchPlan, error) { + // Fetch the latest version of the task. + lpVersions, err := a.FetchAllVerOfLP(ctx, name, project, domain) + if err != nil { + return nil, err + } + lp := lpVersions[0] + return lp, nil +} + +// FetchLPVersion fetches particular version of launch plan +func (a *AdminFetcherExtClient) FetchLPVersion(ctx context.Context, name, version, project, domain string) (*admin.LaunchPlan, error) { + lp, err := a.AdminServiceClient().GetLaunchPlan(ctx, &admin.ObjectGetRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_LAUNCH_PLAN, + Project: project, + Domain: domain, + Name: name, + Version: version, + }, + }) + if err != nil { + return nil, err + } + return lp, nil +} diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go new file mode 100644 index 0000000000..9f8d7512ff --- /dev/null +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -0,0 +1,339 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + mock "github.com/stretchr/testify/mock" + + service "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" +) + +// AdminFetcherExtInterface is an autogenerated mock type for the AdminFetcherExtInterface type +type AdminFetcherExtInterface struct { + mock.Mock +} + +type AdminFetcherExtInterface_AdminServiceClient struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_AdminServiceClient) Return(_a0 service.AdminServiceClient) *AdminFetcherExtInterface_AdminServiceClient { + return &AdminFetcherExtInterface_AdminServiceClient{Call: _m.Call.Return(_a0)} +} + +func (_m *AdminFetcherExtInterface) OnAdminServiceClient() *AdminFetcherExtInterface_AdminServiceClient { + c := _m.On("AdminServiceClient") + return &AdminFetcherExtInterface_AdminServiceClient{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnAdminServiceClientMatch(matchers ...interface{}) *AdminFetcherExtInterface_AdminServiceClient { + c := _m.On("AdminServiceClient", matchers...) + return &AdminFetcherExtInterface_AdminServiceClient{Call: c} +} + +// AdminServiceClient provides a mock function with given fields: +func (_m *AdminFetcherExtInterface) AdminServiceClient() service.AdminServiceClient { + ret := _m.Called() + + var r0 service.AdminServiceClient + if rf, ok := ret.Get(0).(func() service.AdminServiceClient); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(service.AdminServiceClient) + } + } + + return r0 +} + +type AdminFetcherExtInterface_FetchAllVerOfLP struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchAllVerOfLP) Return(_a0 []*admin.LaunchPlan, _a1 error) *AdminFetcherExtInterface_FetchAllVerOfLP { + return &AdminFetcherExtInterface_FetchAllVerOfLP{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string) *AdminFetcherExtInterface_FetchAllVerOfLP { + c := _m.On("FetchAllVerOfLP", ctx, lpName, project, domain) + return &AdminFetcherExtInterface_FetchAllVerOfLP{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchAllVerOfLPMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchAllVerOfLP { + c := _m.On("FetchAllVerOfLP", matchers...) + return &AdminFetcherExtInterface_FetchAllVerOfLP{Call: c} +} + +// FetchAllVerOfLP provides a mock function with given fields: ctx, lpName, project, domain +func (_m *AdminFetcherExtInterface) FetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string) ([]*admin.LaunchPlan, error) { + ret := _m.Called(ctx, lpName, project, domain) + + var r0 []*admin.LaunchPlan + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) []*admin.LaunchPlan); ok { + r0 = rf(ctx, lpName, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*admin.LaunchPlan) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, lpName, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminFetcherExtInterface_FetchAllVerOfTask struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchAllVerOfTask) Return(_a0 []*admin.Task, _a1 error) *AdminFetcherExtInterface_FetchAllVerOfTask { + return &AdminFetcherExtInterface_FetchAllVerOfTask{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchAllVerOfTask(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchAllVerOfTask { + c := _m.On("FetchAllVerOfTask", ctx, name, project, domain) + return &AdminFetcherExtInterface_FetchAllVerOfTask{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchAllVerOfTaskMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchAllVerOfTask { + c := _m.On("FetchAllVerOfTask", matchers...) + return &AdminFetcherExtInterface_FetchAllVerOfTask{Call: c} +} + +// FetchAllVerOfTask provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminFetcherExtInterface) FetchAllVerOfTask(ctx context.Context, name string, project string, domain string) ([]*admin.Task, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 []*admin.Task + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) []*admin.Task); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*admin.Task) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminFetcherExtInterface_FetchExecution struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchExecution) Return(_a0 *admin.Execution, _a1 error) *AdminFetcherExtInterface_FetchExecution { + return &AdminFetcherExtInterface_FetchExecution{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchExecution(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchExecution { + c := _m.On("FetchExecution", ctx, name, project, domain) + return &AdminFetcherExtInterface_FetchExecution{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchExecutionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchExecution { + c := _m.On("FetchExecution", matchers...) + return &AdminFetcherExtInterface_FetchExecution{Call: c} +} + +// FetchExecution provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminFetcherExtInterface) FetchExecution(ctx context.Context, name string, project string, domain string) (*admin.Execution, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 *admin.Execution + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.Execution); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Execution) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminFetcherExtInterface_FetchLPLatestVersion struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchLPLatestVersion) Return(_a0 *admin.LaunchPlan, _a1 error) *AdminFetcherExtInterface_FetchLPLatestVersion { + return &AdminFetcherExtInterface_FetchLPLatestVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchLPLatestVersion(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchLPLatestVersion { + c := _m.On("FetchLPLatestVersion", ctx, name, project, domain) + return &AdminFetcherExtInterface_FetchLPLatestVersion{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchLPLatestVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchLPLatestVersion { + c := _m.On("FetchLPLatestVersion", matchers...) + return &AdminFetcherExtInterface_FetchLPLatestVersion{Call: c} +} + +// FetchLPLatestVersion provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminFetcherExtInterface) FetchLPLatestVersion(ctx context.Context, name string, project string, domain string) (*admin.LaunchPlan, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 *admin.LaunchPlan + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.LaunchPlan); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.LaunchPlan) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminFetcherExtInterface_FetchLPVersion struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchLPVersion) Return(_a0 *admin.LaunchPlan, _a1 error) *AdminFetcherExtInterface_FetchLPVersion { + return &AdminFetcherExtInterface_FetchLPVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchLPVersion(ctx context.Context, name string, version string, project string, domain string) *AdminFetcherExtInterface_FetchLPVersion { + c := _m.On("FetchLPVersion", ctx, name, version, project, domain) + return &AdminFetcherExtInterface_FetchLPVersion{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchLPVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchLPVersion { + c := _m.On("FetchLPVersion", matchers...) + return &AdminFetcherExtInterface_FetchLPVersion{Call: c} +} + +// FetchLPVersion provides a mock function with given fields: ctx, name, version, project, domain +func (_m *AdminFetcherExtInterface) FetchLPVersion(ctx context.Context, name string, version string, project string, domain string) (*admin.LaunchPlan, error) { + ret := _m.Called(ctx, name, version, project, domain) + + var r0 *admin.LaunchPlan + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) *admin.LaunchPlan); ok { + r0 = rf(ctx, name, version, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.LaunchPlan) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { + r1 = rf(ctx, name, version, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminFetcherExtInterface_FetchTaskLatestVersion struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchTaskLatestVersion) Return(_a0 *admin.Task, _a1 error) *AdminFetcherExtInterface_FetchTaskLatestVersion { + return &AdminFetcherExtInterface_FetchTaskLatestVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchTaskLatestVersion(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchTaskLatestVersion { + c := _m.On("FetchTaskLatestVersion", ctx, name, project, domain) + return &AdminFetcherExtInterface_FetchTaskLatestVersion{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchTaskLatestVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchTaskLatestVersion { + c := _m.On("FetchTaskLatestVersion", matchers...) + return &AdminFetcherExtInterface_FetchTaskLatestVersion{Call: c} +} + +// FetchTaskLatestVersion provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminFetcherExtInterface) FetchTaskLatestVersion(ctx context.Context, name string, project string, domain string) (*admin.Task, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 *admin.Task + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.Task); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Task) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminFetcherExtInterface_FetchTaskVersion struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchTaskVersion) Return(_a0 *admin.Task, _a1 error) *AdminFetcherExtInterface_FetchTaskVersion { + return &AdminFetcherExtInterface_FetchTaskVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchTaskVersion(ctx context.Context, name string, version string, project string, domain string) *AdminFetcherExtInterface_FetchTaskVersion { + c := _m.On("FetchTaskVersion", ctx, name, version, project, domain) + return &AdminFetcherExtInterface_FetchTaskVersion{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchTaskVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchTaskVersion { + c := _m.On("FetchTaskVersion", matchers...) + return &AdminFetcherExtInterface_FetchTaskVersion{Call: c} +} + +// FetchTaskVersion provides a mock function with given fields: ctx, name, version, project, domain +func (_m *AdminFetcherExtInterface) FetchTaskVersion(ctx context.Context, name string, version string, project string, domain string) (*admin.Task, error) { + ret := _m.Called(ctx, name, version, project, domain) + + var r0 *admin.Task + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) *admin.Task); ok { + r0 = rf(ctx, name, version, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Task) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { + r1 = rf(ctx, name, version, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/flytectl/pkg/ext/mocks/admin_service_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_service_fetcher_ext_interface.go new file mode 100644 index 0000000000..df851c5d29 --- /dev/null +++ b/flytectl/pkg/ext/mocks/admin_service_fetcher_ext_interface.go @@ -0,0 +1,339 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + mock "github.com/stretchr/testify/mock" + + service "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" +) + +// AdminServiceFetcherExtInterface is an autogenerated mock type for the AdminServiceFetcherExtInterface type +type AdminServiceFetcherExtInterface struct { + mock.Mock +} + +type AdminServiceFetcherExtInterface_AdminServiceClient struct { + *mock.Call +} + +func (_m AdminServiceFetcherExtInterface_AdminServiceClient) Return(_a0 service.AdminServiceClient) *AdminServiceFetcherExtInterface_AdminServiceClient { + return &AdminServiceFetcherExtInterface_AdminServiceClient{Call: _m.Call.Return(_a0)} +} + +func (_m *AdminServiceFetcherExtInterface) OnAdminServiceClient() *AdminServiceFetcherExtInterface_AdminServiceClient { + c := _m.On("AdminServiceClient") + return &AdminServiceFetcherExtInterface_AdminServiceClient{Call: c} +} + +func (_m *AdminServiceFetcherExtInterface) OnAdminServiceClientMatch(matchers ...interface{}) *AdminServiceFetcherExtInterface_AdminServiceClient { + c := _m.On("AdminServiceClient", matchers...) + return &AdminServiceFetcherExtInterface_AdminServiceClient{Call: c} +} + +// AdminServiceClient provides a mock function with given fields: +func (_m *AdminServiceFetcherExtInterface) AdminServiceClient() service.AdminServiceClient { + ret := _m.Called() + + var r0 service.AdminServiceClient + if rf, ok := ret.Get(0).(func() service.AdminServiceClient); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(service.AdminServiceClient) + } + } + + return r0 +} + +type AdminServiceFetcherExtInterface_FetchAllVerOfLP struct { + *mock.Call +} + +func (_m AdminServiceFetcherExtInterface_FetchAllVerOfLP) Return(_a0 []*admin.LaunchPlan, _a1 error) *AdminServiceFetcherExtInterface_FetchAllVerOfLP { + return &AdminServiceFetcherExtInterface_FetchAllVerOfLP{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string) *AdminServiceFetcherExtInterface_FetchAllVerOfLP { + c := _m.On("FetchAllVerOfLP", ctx, lpName, project, domain) + return &AdminServiceFetcherExtInterface_FetchAllVerOfLP{Call: c} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchAllVerOfLPMatch(matchers ...interface{}) *AdminServiceFetcherExtInterface_FetchAllVerOfLP { + c := _m.On("FetchAllVerOfLP", matchers...) + return &AdminServiceFetcherExtInterface_FetchAllVerOfLP{Call: c} +} + +// FetchAllVerOfLP provides a mock function with given fields: ctx, lpName, project, domain +func (_m *AdminServiceFetcherExtInterface) FetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string) ([]*admin.LaunchPlan, error) { + ret := _m.Called(ctx, lpName, project, domain) + + var r0 []*admin.LaunchPlan + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) []*admin.LaunchPlan); ok { + r0 = rf(ctx, lpName, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*admin.LaunchPlan) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, lpName, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminServiceFetcherExtInterface_FetchAllVerOfTask struct { + *mock.Call +} + +func (_m AdminServiceFetcherExtInterface_FetchAllVerOfTask) Return(_a0 []*admin.Task, _a1 error) *AdminServiceFetcherExtInterface_FetchAllVerOfTask { + return &AdminServiceFetcherExtInterface_FetchAllVerOfTask{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchAllVerOfTask(ctx context.Context, name string, project string, domain string) *AdminServiceFetcherExtInterface_FetchAllVerOfTask { + c := _m.On("FetchAllVerOfTask", ctx, name, project, domain) + return &AdminServiceFetcherExtInterface_FetchAllVerOfTask{Call: c} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchAllVerOfTaskMatch(matchers ...interface{}) *AdminServiceFetcherExtInterface_FetchAllVerOfTask { + c := _m.On("FetchAllVerOfTask", matchers...) + return &AdminServiceFetcherExtInterface_FetchAllVerOfTask{Call: c} +} + +// FetchAllVerOfTask provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminServiceFetcherExtInterface) FetchAllVerOfTask(ctx context.Context, name string, project string, domain string) ([]*admin.Task, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 []*admin.Task + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) []*admin.Task); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*admin.Task) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminServiceFetcherExtInterface_FetchExecution struct { + *mock.Call +} + +func (_m AdminServiceFetcherExtInterface_FetchExecution) Return(_a0 *admin.Execution, _a1 error) *AdminServiceFetcherExtInterface_FetchExecution { + return &AdminServiceFetcherExtInterface_FetchExecution{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchExecution(ctx context.Context, name string, project string, domain string) *AdminServiceFetcherExtInterface_FetchExecution { + c := _m.On("FetchExecution", ctx, name, project, domain) + return &AdminServiceFetcherExtInterface_FetchExecution{Call: c} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchExecutionMatch(matchers ...interface{}) *AdminServiceFetcherExtInterface_FetchExecution { + c := _m.On("FetchExecution", matchers...) + return &AdminServiceFetcherExtInterface_FetchExecution{Call: c} +} + +// FetchExecution provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminServiceFetcherExtInterface) FetchExecution(ctx context.Context, name string, project string, domain string) (*admin.Execution, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 *admin.Execution + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.Execution); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Execution) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminServiceFetcherExtInterface_FetchLPLatestVersion struct { + *mock.Call +} + +func (_m AdminServiceFetcherExtInterface_FetchLPLatestVersion) Return(_a0 *admin.LaunchPlan, _a1 error) *AdminServiceFetcherExtInterface_FetchLPLatestVersion { + return &AdminServiceFetcherExtInterface_FetchLPLatestVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchLPLatestVersion(ctx context.Context, name string, project string, domain string) *AdminServiceFetcherExtInterface_FetchLPLatestVersion { + c := _m.On("FetchLPLatestVersion", ctx, name, project, domain) + return &AdminServiceFetcherExtInterface_FetchLPLatestVersion{Call: c} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchLPLatestVersionMatch(matchers ...interface{}) *AdminServiceFetcherExtInterface_FetchLPLatestVersion { + c := _m.On("FetchLPLatestVersion", matchers...) + return &AdminServiceFetcherExtInterface_FetchLPLatestVersion{Call: c} +} + +// FetchLPLatestVersion provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminServiceFetcherExtInterface) FetchLPLatestVersion(ctx context.Context, name string, project string, domain string) (*admin.LaunchPlan, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 *admin.LaunchPlan + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.LaunchPlan); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.LaunchPlan) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminServiceFetcherExtInterface_FetchLPVersion struct { + *mock.Call +} + +func (_m AdminServiceFetcherExtInterface_FetchLPVersion) Return(_a0 *admin.LaunchPlan, _a1 error) *AdminServiceFetcherExtInterface_FetchLPVersion { + return &AdminServiceFetcherExtInterface_FetchLPVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchLPVersion(ctx context.Context, name string, version string, project string, domain string) *AdminServiceFetcherExtInterface_FetchLPVersion { + c := _m.On("FetchLPVersion", ctx, name, version, project, domain) + return &AdminServiceFetcherExtInterface_FetchLPVersion{Call: c} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchLPVersionMatch(matchers ...interface{}) *AdminServiceFetcherExtInterface_FetchLPVersion { + c := _m.On("FetchLPVersion", matchers...) + return &AdminServiceFetcherExtInterface_FetchLPVersion{Call: c} +} + +// FetchLPVersion provides a mock function with given fields: ctx, name, version, project, domain +func (_m *AdminServiceFetcherExtInterface) FetchLPVersion(ctx context.Context, name string, version string, project string, domain string) (*admin.LaunchPlan, error) { + ret := _m.Called(ctx, name, version, project, domain) + + var r0 *admin.LaunchPlan + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) *admin.LaunchPlan); ok { + r0 = rf(ctx, name, version, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.LaunchPlan) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { + r1 = rf(ctx, name, version, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminServiceFetcherExtInterface_FetchTaskLatestVersion struct { + *mock.Call +} + +func (_m AdminServiceFetcherExtInterface_FetchTaskLatestVersion) Return(_a0 *admin.Task, _a1 error) *AdminServiceFetcherExtInterface_FetchTaskLatestVersion { + return &AdminServiceFetcherExtInterface_FetchTaskLatestVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchTaskLatestVersion(ctx context.Context, name string, project string, domain string) *AdminServiceFetcherExtInterface_FetchTaskLatestVersion { + c := _m.On("FetchTaskLatestVersion", ctx, name, project, domain) + return &AdminServiceFetcherExtInterface_FetchTaskLatestVersion{Call: c} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchTaskLatestVersionMatch(matchers ...interface{}) *AdminServiceFetcherExtInterface_FetchTaskLatestVersion { + c := _m.On("FetchTaskLatestVersion", matchers...) + return &AdminServiceFetcherExtInterface_FetchTaskLatestVersion{Call: c} +} + +// FetchTaskLatestVersion provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminServiceFetcherExtInterface) FetchTaskLatestVersion(ctx context.Context, name string, project string, domain string) (*admin.Task, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 *admin.Task + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.Task); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Task) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminServiceFetcherExtInterface_FetchTaskVersion struct { + *mock.Call +} + +func (_m AdminServiceFetcherExtInterface_FetchTaskVersion) Return(_a0 *admin.Task, _a1 error) *AdminServiceFetcherExtInterface_FetchTaskVersion { + return &AdminServiceFetcherExtInterface_FetchTaskVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchTaskVersion(ctx context.Context, name string, version string, project string, domain string) *AdminServiceFetcherExtInterface_FetchTaskVersion { + c := _m.On("FetchTaskVersion", ctx, name, version, project, domain) + return &AdminServiceFetcherExtInterface_FetchTaskVersion{Call: c} +} + +func (_m *AdminServiceFetcherExtInterface) OnFetchTaskVersionMatch(matchers ...interface{}) *AdminServiceFetcherExtInterface_FetchTaskVersion { + c := _m.On("FetchTaskVersion", matchers...) + return &AdminServiceFetcherExtInterface_FetchTaskVersion{Call: c} +} + +// FetchTaskVersion provides a mock function with given fields: ctx, name, version, project, domain +func (_m *AdminServiceFetcherExtInterface) FetchTaskVersion(ctx context.Context, name string, version string, project string, domain string) (*admin.Task, error) { + ret := _m.Called(ctx, name, version, project, domain) + + var r0 *admin.Task + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) *admin.Task); ok { + r0 = rf(ctx, name, version, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Task) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { + r1 = rf(ctx, name, version, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/flytectl/pkg/ext/task_fetcher.go b/flytectl/pkg/ext/task_fetcher.go new file mode 100644 index 0000000000..96984549a2 --- /dev/null +++ b/flytectl/pkg/ext/task_fetcher.go @@ -0,0 +1,60 @@ +package ext + +import ( + "context" + "fmt" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +func (a *AdminFetcherExtClient) FetchAllVerOfTask(ctx context.Context, name, project, domain string) ([]*admin.Task, error) { + tList, err := a.AdminServiceClient().ListTasks(ctx, &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + Name: name, + }, + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + Limit: 100, + }) + if err != nil { + return nil, err + } + if len(tList.Tasks) == 0 { + return nil, fmt.Errorf("no tasks retrieved for %v", name) + } + return tList.Tasks, nil +} + +func (a *AdminFetcherExtClient) FetchTaskLatestVersion(ctx context.Context, name, project, domain string) (*admin.Task, error) { + var t *admin.Task + var err error + // Fetch the latest version of the task. + var taskVersions []*admin.Task + taskVersions, err = a.FetchAllVerOfTask(ctx, name, project, domain) + if err != nil { + return nil, err + } + t = taskVersions[0] + return t, nil +} + +func (a *AdminFetcherExtClient) FetchTaskVersion(ctx context.Context, name, version, project, domain string) (*admin.Task, error) { + t, err := a.AdminServiceClient().GetTask(ctx, &admin.ObjectGetRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_TASK, + Project: project, + Domain: domain, + Name: name, + Version: version, + }, + }) + if err != nil { + return nil, err + } + return t, nil +} From 661de8de42b555c582dd770a8c75f0a64e07bb1b Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Tue, 11 May 2021 22:25:22 +0530 Subject: [PATCH 046/645] Matchable resource support in flytectl for task resource attributes (#63) * Adding commands for task resource attributes support Signed-off-by: Prafulla Mahindrakar --- flytectl/.gitignore | 1 + .../task_resource_attribute_delete_config.go | 10 ++ .../task_resource_attribute_fetch_config.go | 9 ++ .../task_resource_attribute_file_config.go | 86 ++++++++++ .../task_resource_attribute_update_config.go | 10 ++ .../taskresourceattrdeleteconfig_flags.go | 46 ++++++ ...taskresourceattrdeleteconfig_flags_test.go | 124 ++++++++++++++ .../taskresourceattrfetchconfig_flags.go | 46 ++++++ .../taskresourceattrfetchconfig_flags_test.go | 124 ++++++++++++++ .../taskresourceattrupdateconfig_flags.go | 46 ++++++ ...taskresourceattrupdateconfig_flags_test.go | 124 ++++++++++++++ flytectl/cmd/core/cmd.go | 11 +- flytectl/cmd/core/cmd_ctx.go | 27 +++- flytectl/cmd/create/execution_test.go | 4 +- flytectl/cmd/delete/delete.go | 4 + flytectl/cmd/delete/delete_test.go | 20 ++- flytectl/cmd/delete/execution_test.go | 66 ++++---- .../matchable_task_resource_attribute.go | 97 +++++++++++ .../matchable_task_resource_attribute_test.go | 133 +++++++++++++++ .../testdata/invalid_task_attribute.yaml | 5 + .../valid_project_domain_task_attribute.yaml | 9 ++ .../valid_workflow_task_attribute.yaml | 9 ++ flytectl/cmd/get/get.go | 4 + flytectl/cmd/get/get_test.go | 12 +- flytectl/cmd/get/launch_plan_test.go | 10 +- .../get/matchable_task_resource_attribute.go | 98 ++++++++++++ .../matchable_task_resource_attribute_test.go | 144 +++++++++++++++++ flytectl/cmd/get/task_test.go | 10 +- flytectl/cmd/get/taskconfig_flags.go | 2 +- flytectl/cmd/testutils/test_utils.go | 19 ++- .../matchable_task_resource_attribute.go | 95 +++++++++++ .../matchable_task_resource_attribute_test.go | 94 +++++++++++ flytectl/cmd/update/project_test.go | 81 ++++------ .../testdata/invalid_task_attribute.yaml | 5 + .../valid_project_domain_task_attribute.yaml | 9 ++ .../valid_workflow_task_attribute.yaml | 9 ++ flytectl/cmd/update/update.go | 3 + flytectl/cmd/update/update_test.go | 24 ++- flytectl/docs/coverage.out | 1 + flytectl/docs/source/gen/flytectl.rst | 12 +- flytectl/docs/source/gen/flytectl_config.rst | 12 +- .../source/gen/flytectl_config_discover.rst | 12 +- .../source/gen/flytectl_config_validate.rst | 12 +- flytectl/docs/source/gen/flytectl_create.rst | 12 +- .../source/gen/flytectl_create_execution.rst | 12 +- .../source/gen/flytectl_create_project.rst | 12 +- flytectl/docs/source/gen/flytectl_delete.rst | 13 +- .../source/gen/flytectl_delete_execution.rst | 12 +- ...lytectl_delete_task-resource-attribute.rst | 112 +++++++++++++ flytectl/docs/source/gen/flytectl_get.rst | 13 +- .../source/gen/flytectl_get_execution.rst | 12 +- .../source/gen/flytectl_get_launchplan.rst | 12 +- .../docs/source/gen/flytectl_get_project.rst | 12 +- .../flytectl_get_task-resource-attribute.rst | 110 +++++++++++++ .../docs/source/gen/flytectl_get_task.rst | 12 +- .../docs/source/gen/flytectl_get_workflow.rst | 12 +- .../docs/source/gen/flytectl_register.rst | 12 +- .../source/gen/flytectl_register_files.rst | 12 +- flytectl/docs/source/gen/flytectl_update.rst | 13 +- .../source/gen/flytectl_update_launchplan.rst | 12 +- .../source/gen/flytectl_update_project.rst | 12 +- ...lytectl_update_task-resource-attribute.rst | 117 ++++++++++++++ .../docs/source/gen/flytectl_update_task.rst | 12 +- .../source/gen/flytectl_update_workflow.rst | 12 +- flytectl/docs/source/gen/flytectl_version.rst | 12 +- .../pkg/ext/attribute_match_deleter_test.go | 49 ++++++ flytectl/pkg/ext/attribute_match_fetcher.go | 29 ++++ .../pkg/ext/attribute_match_fetcher_test.go | 49 ++++++ flytectl/pkg/ext/attribute_match_updater.go | 31 ++++ .../pkg/ext/attribute_match_updater_test.go | 55 +++++++ flytectl/pkg/ext/attribute_matcher_deleter.go | 26 +++ flytectl/pkg/ext/deleter.go | 33 ++++ flytectl/pkg/ext/doc.go | 2 + ...on_fetcher_ext.go => execution_fetcher.go} | 0 flytectl/pkg/ext/execution_fetcher_test.go | 68 ++++++++ .../ext/{fetcher_ext_client.go => fetcher.go} | 6 + flytectl/pkg/ext/launch_plan_fetcher_test.go | 151 ++++++++++++++++++ .../ext/mocks/admin_deleter_ext_interface.go | 116 ++++++++++++++ .../ext/mocks/admin_fetcher_ext_interface.go | 82 ++++++++++ .../ext/mocks/admin_updater_ext_interface.go | 116 ++++++++++++++ flytectl/pkg/ext/task_fetcher_test.go | 125 +++++++++++++++ flytectl/pkg/ext/updater.go | 33 ++++ 82 files changed, 2961 insertions(+), 259 deletions(-) create mode 100644 flytectl/cmd/config/subcommand/task_resource_attribute_delete_config.go create mode 100644 flytectl/cmd/config/subcommand/task_resource_attribute_fetch_config.go create mode 100644 flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go create mode 100644 flytectl/cmd/config/subcommand/task_resource_attribute_update_config.go create mode 100755 flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags_test.go create mode 100644 flytectl/cmd/delete/matchable_task_resource_attribute.go create mode 100644 flytectl/cmd/delete/matchable_task_resource_attribute_test.go create mode 100644 flytectl/cmd/delete/testdata/invalid_task_attribute.yaml create mode 100644 flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml create mode 100644 flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml create mode 100644 flytectl/cmd/get/matchable_task_resource_attribute.go create mode 100644 flytectl/cmd/get/matchable_task_resource_attribute_test.go create mode 100644 flytectl/cmd/update/matchable_task_resource_attribute.go create mode 100644 flytectl/cmd/update/matchable_task_resource_attribute_test.go create mode 100644 flytectl/cmd/update/testdata/invalid_task_attribute.yaml create mode 100644 flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml create mode 100644 flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml create mode 100644 flytectl/docs/coverage.out create mode 100644 flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst create mode 100644 flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst create mode 100644 flytectl/pkg/ext/attribute_match_deleter_test.go create mode 100644 flytectl/pkg/ext/attribute_match_fetcher.go create mode 100644 flytectl/pkg/ext/attribute_match_fetcher_test.go create mode 100644 flytectl/pkg/ext/attribute_match_updater.go create mode 100644 flytectl/pkg/ext/attribute_match_updater_test.go create mode 100644 flytectl/pkg/ext/attribute_matcher_deleter.go create mode 100644 flytectl/pkg/ext/deleter.go create mode 100644 flytectl/pkg/ext/doc.go rename flytectl/pkg/ext/{execution_fetcher_ext.go => execution_fetcher.go} (100%) create mode 100644 flytectl/pkg/ext/execution_fetcher_test.go rename flytectl/pkg/ext/{fetcher_ext_client.go => fetcher.go} (79%) create mode 100644 flytectl/pkg/ext/launch_plan_fetcher_test.go create mode 100644 flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go create mode 100644 flytectl/pkg/ext/mocks/admin_updater_ext_interface.go create mode 100644 flytectl/pkg/ext/task_fetcher_test.go create mode 100644 flytectl/pkg/ext/updater.go diff --git a/flytectl/.gitignore b/flytectl/.gitignore index 45283c9a91..5f7a3898d1 100644 --- a/flytectl/.gitignore +++ b/flytectl/.gitignore @@ -6,3 +6,4 @@ bin _test ./config.yaml docs/build/* +cmd/get/temp-output-file diff --git a/flytectl/cmd/config/subcommand/task_resource_attribute_delete_config.go b/flytectl/cmd/config/subcommand/task_resource_attribute_delete_config.go new file mode 100644 index 0000000000..34a6a4e466 --- /dev/null +++ b/flytectl/cmd/config/subcommand/task_resource_attribute_delete_config.go @@ -0,0 +1,10 @@ +package subcommand + +//go:generate pflags TaskResourceAttrDeleteConfig --default-var DefaultTaskResourceDelConfig + +// TaskResourceAttrDeleteConfig Matchable resource attributes configuration passed from command line +type TaskResourceAttrDeleteConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` +} + +var DefaultTaskResourceDelConfig = &TaskResourceAttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/task_resource_attribute_fetch_config.go b/flytectl/cmd/config/subcommand/task_resource_attribute_fetch_config.go new file mode 100644 index 0000000000..34b1d435f4 --- /dev/null +++ b/flytectl/cmd/config/subcommand/task_resource_attribute_fetch_config.go @@ -0,0 +1,9 @@ +package subcommand + +//go:generate pflags TaskResourceAttrFetchConfig --default-var DefaultTaskResourceFetchConfig + +type TaskResourceAttrFetchConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` +} + +var DefaultTaskResourceFetchConfig = &TaskResourceAttrFetchConfig{} diff --git a/flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go b/flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go new file mode 100644 index 0000000000..d0c0a0656c --- /dev/null +++ b/flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go @@ -0,0 +1,86 @@ +package subcommand + +import ( + "context" + "encoding/json" + "fmt" + "io/ioutil" + "os" + + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" + + "sigs.k8s.io/yaml" +) + +// TaskResourceAttrFileConfig shadow config for TaskResourceAttribute. +// The shadow config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. +// As the same structure is being used for both ProjectDomainAttribute/Workflowattribute +type TaskResourceAttrFileConfig struct { + Project string `json:"project"` + Domain string `json:"domain"` + Workflow string `json:"workflow,omitempty"` + *admin.TaskResourceAttributes +} + +// WriteConfigToFile used for marshaling the config to a file which can then be used for update/delete +func (t TaskResourceAttrFileConfig) WriteConfigToFile(fileName string) error { + d, err := yaml.Marshal(t) + if err != nil { + return fmt.Errorf("error: %v", err) + } + if _, err = os.Stat(fileName); err == nil { + if !cmdUtil.AskForConfirmation(fmt.Sprintf("warning file %v will be overwritten", fileName)) { + return fmt.Errorf("backup the file before continuing") + } + } + return ioutil.WriteFile(fileName, d, 0600) +} + +// Dumps the json representation of the TaskResourceAttrFileConfig +func (t TaskResourceAttrFileConfig) String() string { + tj, err := json.Marshal(t) + if err != nil { + fmt.Println(err) + return "marshaling error" + } + return fmt.Sprintf("%s\n", tj) +} + +// ReadConfigFromFile used for unmarshaling the config from a file which is used for update/delete +func (t *TaskResourceAttrFileConfig) ReadConfigFromFile(fileName string) error { + data, err := ioutil.ReadFile(fileName) + if err != nil { + return fmt.Errorf("unable to read from %v yaml file", fileName) + } + if err = yaml.UnmarshalStrict(data, t); err != nil { + return err + } + return nil +} + +// MatchableAttributeDecorator decorator over TaskResourceAttributes. Similar decorator would exist for other MatchingAttributes +func (t *TaskResourceAttrFileConfig) MatchableAttributeDecorator() *admin.MatchingAttributes { + return &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{ + TaskResourceAttributes: t.TaskResourceAttributes, + }, + } +} + +func (t TaskResourceAttrFileConfig) DumpTaskResourceAttr(ctx context.Context, fileName string) { + // Dump empty task resource attr for editing + // Write config to file if filename provided in the command + if len(fileName) > 0 { + // Read the config from the file and update the TaskResourceAttrFileConfig with the TaskResourceAttrConfig + if err := t.WriteConfigToFile(fileName); err != nil { + fmt.Printf("error dumping in file due to %v", err) + logger.Warnf(ctx, "error dumping in file due to %v", err) + return + } + fmt.Printf("wrote the config to file %v", fileName) + } else { + fmt.Printf("%v", t) + } +} diff --git a/flytectl/cmd/config/subcommand/task_resource_attribute_update_config.go b/flytectl/cmd/config/subcommand/task_resource_attribute_update_config.go new file mode 100644 index 0000000000..d85944777d --- /dev/null +++ b/flytectl/cmd/config/subcommand/task_resource_attribute_update_config.go @@ -0,0 +1,10 @@ +package subcommand + +//go:generate pflags TaskResourceAttrUpdateConfig --default-var DefaultTaskResourceUpdateConfig + +// TaskResourceAttrUpdateConfig Matchable resource attributes configuration passed from command line +type TaskResourceAttrUpdateConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` +} + +var DefaultTaskResourceUpdateConfig = &TaskResourceAttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags.go new file mode 100755 index 0000000000..fadea1f465 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package subcommand + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (TaskResourceAttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (TaskResourceAttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in TaskResourceAttrDeleteConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg TaskResourceAttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("TaskResourceAttrDeleteConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultTaskResourceDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultTaskResourceDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags_test.go new file mode 100755 index 0000000000..222fae2c50 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package subcommand + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsTaskResourceAttrDeleteConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementTaskResourceAttrDeleteConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsTaskResourceAttrDeleteConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookTaskResourceAttrDeleteConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementTaskResourceAttrDeleteConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_TaskResourceAttrDeleteConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookTaskResourceAttrDeleteConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_TaskResourceAttrDeleteConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_TaskResourceAttrDeleteConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_TaskResourceAttrDeleteConfig(val, result)) +} + +func testDecodeSlice_TaskResourceAttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_TaskResourceAttrDeleteConfig(vStringSlice, result)) +} + +func TestTaskResourceAttrDeleteConfig_GetPFlagSet(t *testing.T) { + val := TaskResourceAttrDeleteConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestTaskResourceAttrDeleteConfig_SetFlags(t *testing.T) { + actual := TaskResourceAttrDeleteConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultTaskResourceDelConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_TaskResourceAttrDeleteConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags.go new file mode 100755 index 0000000000..ebf6ec6220 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package subcommand + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (TaskResourceAttrFetchConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (TaskResourceAttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in TaskResourceAttrFetchConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg TaskResourceAttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("TaskResourceAttrFetchConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultTaskResourceFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultTaskResourceFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags_test.go new file mode 100755 index 0000000000..c2c77e82c2 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package subcommand + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsTaskResourceAttrFetchConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementTaskResourceAttrFetchConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsTaskResourceAttrFetchConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookTaskResourceAttrFetchConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementTaskResourceAttrFetchConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_TaskResourceAttrFetchConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookTaskResourceAttrFetchConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_TaskResourceAttrFetchConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_TaskResourceAttrFetchConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_TaskResourceAttrFetchConfig(val, result)) +} + +func testDecodeSlice_TaskResourceAttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_TaskResourceAttrFetchConfig(vStringSlice, result)) +} + +func TestTaskResourceAttrFetchConfig_GetPFlagSet(t *testing.T) { + val := TaskResourceAttrFetchConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestTaskResourceAttrFetchConfig_SetFlags(t *testing.T) { + actual := TaskResourceAttrFetchConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultTaskResourceFetchConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_TaskResourceAttrFetchConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags.go new file mode 100755 index 0000000000..d94413106f --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package subcommand + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (TaskResourceAttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (TaskResourceAttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in TaskResourceAttrUpdateConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg TaskResourceAttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("TaskResourceAttrUpdateConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultTaskResourceUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultTaskResourceUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags_test.go new file mode 100755 index 0000000000..73f272b45e --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package subcommand + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsTaskResourceAttrUpdateConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementTaskResourceAttrUpdateConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsTaskResourceAttrUpdateConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookTaskResourceAttrUpdateConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementTaskResourceAttrUpdateConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_TaskResourceAttrUpdateConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookTaskResourceAttrUpdateConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_TaskResourceAttrUpdateConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_TaskResourceAttrUpdateConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_TaskResourceAttrUpdateConfig(val, result)) +} + +func testDecodeSlice_TaskResourceAttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_TaskResourceAttrUpdateConfig(vStringSlice, result)) +} + +func TestTaskResourceAttrUpdateConfig_GetPFlagSet(t *testing.T) { + val := TaskResourceAttrUpdateConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestTaskResourceAttrUpdateConfig_SetFlags(t *testing.T) { + actual := TaskResourceAttrUpdateConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultTaskResourceUpdateConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_TaskResourceAttrUpdateConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 2a13e36c05..54483c5c8f 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -28,11 +28,12 @@ type CommandEntry struct { func AddCommands(rootCmd *cobra.Command, cmdFuncs map[string]CommandEntry) { for resource, cmdEntry := range cmdFuncs { cmd := &cobra.Command{ - Use: resource, - Short: cmdEntry.Short, - Long: cmdEntry.Long, - Aliases: cmdEntry.Aliases, - RunE: generateCommandFunc(cmdEntry), + Use: resource, + Short: cmdEntry.Short, + Long: cmdEntry.Long, + Aliases: cmdEntry.Aliases, + RunE: generateCommandFunc(cmdEntry), + SilenceUsage: true, } if cmdEntry.PFlagProvider != nil { cmd.Flags().AddFlagSet(cmdEntry.PFlagProvider.GetPFlagSet("")) diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go index 58f3ff457b..ab1c6c6afd 100644 --- a/flytectl/cmd/core/cmd_ctx.go +++ b/flytectl/cmd/core/cmd_ctx.go @@ -10,13 +10,30 @@ import ( type CommandContext struct { adminClient service.AdminServiceClient adminClientFetcherExt ext.AdminFetcherExtInterface + adminClientUpdateExt ext.AdminUpdaterExtInterface + adminClientDeleteExt ext.AdminDeleterExtInterface in io.Reader out io.Writer } func NewCommandContext(adminClient service.AdminServiceClient, out io.Writer) CommandContext { return CommandContext{adminClient: adminClient, out: out, - adminClientFetcherExt: &ext.AdminFetcherExtClient{AdminClient: adminClient}} + adminClientFetcherExt: &ext.AdminFetcherExtClient{AdminClient: adminClient}, + adminClientUpdateExt: &ext.AdminUpdaterExtClient{AdminClient: adminClient}, + adminClientDeleteExt: &ext.AdminDeleterExtClient{AdminClient: adminClient}} +} + +// NewCommandContextWithExt construct command context with injected extensions. Helps in injecting mocked ones for testing. +func NewCommandContextWithExt( + adminClient service.AdminServiceClient, + fetcher ext.AdminFetcherExtInterface, + updater ext.AdminUpdaterExtInterface, + deleter ext.AdminDeleterExtInterface, + out io.Writer) CommandContext { + return CommandContext{adminClient: adminClient, out: out, + adminClientFetcherExt: fetcher, + adminClientUpdateExt: updater, + adminClientDeleteExt: deleter} } func (c CommandContext) AdminClient() service.AdminServiceClient { @@ -34,3 +51,11 @@ func (c CommandContext) InputPipe() io.Reader { func (c CommandContext) AdminFetcherExt() ext.AdminFetcherExtInterface { return c.adminClientFetcherExt } + +func (c CommandContext) AdminUpdaterExt() ext.AdminUpdaterExtInterface { + return c.adminClientUpdateExt +} + +func (c CommandContext) AdminDeleterExt() ext.AdminDeleterExtInterface { + return c.adminClientDeleteExt +} diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index c833da4889..d83d99ae96 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -17,8 +18,9 @@ import ( // This function needs to be called after testutils.Steup() func createExecutionSetup() { ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx mockClient = testutils.MockClient + // TODO: migrate to new command context from testutils + cmdCtx = cmdCore.NewCommandContext(mockClient, testutils.MockOutStream) sortedListLiteralType := core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_CollectionType{ diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index 2b6cf36310..2c694db819 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -1,6 +1,7 @@ package delete import ( + "github.com/flyteorg/flytectl/cmd/config/subcommand" cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" @@ -27,6 +28,9 @@ func RemoteDeleteCommand() *cobra.Command { terminateResourcesFuncs := map[string]cmdcore.CommandEntry{ "execution": {CmdFunc: terminateExecutionFunc, Aliases: []string{"executions"}, Short: execCmdShort, Long: execCmdLong}, + "task-resource-attribute": {CmdFunc: deleteTaskResourceAttributes, Aliases: []string{"task-resource-attributes"}, + Short: taskResourceAttributesShort, + Long: taskResourceAttributesLong, PFlagProvider: subcommand.DefaultTaskResourceDelConfig, ProjectDomainNotRequired: true}, } cmdcore.AddCommands(deleteCmd, terminateResourcesFuncs) return deleteCmd diff --git a/flytectl/cmd/delete/delete_test.go b/flytectl/cmd/delete/delete_test.go index 5543c88d28..dd3075edac 100644 --- a/flytectl/cmd/delete/delete_test.go +++ b/flytectl/cmd/delete/delete_test.go @@ -1,18 +1,32 @@ package delete import ( + "context" "sort" "testing" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/stretchr/testify/assert" ) +var ( + err error + ctx context.Context + mockClient *mocks.AdminServiceClient + cmdCtx cmdCore.CommandContext +) +var setup = testutils.Setup +var tearDownAndVerify = testutils.TearDownAndVerify + func TestDeleteCommand(t *testing.T) { deleteCommand := RemoteDeleteCommand() assert.Equal(t, deleteCommand.Use, "delete") assert.Equal(t, deleteCommand.Short, deleteCmdShort) assert.Equal(t, deleteCommand.Long, deleteCmdLong) - assert.Equal(t, len(deleteCommand.Commands()), 1) + assert.Equal(t, len(deleteCommand.Commands()), 2) cmdNouns := deleteCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { @@ -22,4 +36,8 @@ func TestDeleteCommand(t *testing.T) { assert.Equal(t, cmdNouns[0].Aliases, []string{"executions"}) assert.Equal(t, cmdNouns[0].Short, execCmdShort) assert.Equal(t, cmdNouns[0].Long, execCmdLong) + assert.Equal(t, cmdNouns[1].Use, "task-resource-attribute") + assert.Equal(t, cmdNouns[1].Aliases, []string{"task-resource-attributes"}) + assert.Equal(t, cmdNouns[1].Short, taskResourceAttributesShort) + assert.Equal(t, cmdNouns[1].Long, taskResourceAttributesLong) } diff --git a/flytectl/cmd/delete/execution_test.go b/flytectl/cmd/delete/execution_test.go index f2f3ec11bb..c9a5b11c62 100644 --- a/flytectl/cmd/delete/execution_test.go +++ b/flytectl/cmd/delete/execution_test.go @@ -1,13 +1,11 @@ package delete import ( - "context" "errors" - "io" "testing" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -15,68 +13,64 @@ import ( ) var ( - ctx context.Context - args []string + args []string + terminateExecRequests []*admin.ExecutionTerminateRequest ) -func setup() { - ctx = context.Background() - args = []string{} +func terminateExecutionSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient + args = append(args, "exec1", "exec2") + terminateExecRequests = []*admin.ExecutionTerminateRequest{ + {Id: &core.WorkflowExecutionIdentifier{ + Name: "exec1", + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + }}, + {Id: &core.WorkflowExecutionIdentifier{ + Name: "exec2", + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + }}, + } } func TestTerminateExecutionFunc(t *testing.T) { setup() - args = append(args, "exec1", "exec2") - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) - terminateExecRequests := []*admin.ExecutionTerminateRequest{ - {Id: &core.WorkflowExecutionIdentifier{Name: "exec1"}}, - {Id: &core.WorkflowExecutionIdentifier{Name: "exec2"}}, - } + terminateExecutionSetup() terminateExecResponse := &admin.ExecutionTerminateResponse{} mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[0]).Return(terminateExecResponse, nil) mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[1]).Return(terminateExecResponse, nil) - err := terminateExecutionFunc(ctx, args, cmdCtx) + err = terminateExecutionFunc(ctx, args, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[0]) mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[1]) + tearDownAndVerify(t, "") } func TestTerminateExecutionFuncWithError(t *testing.T) { setup() - args = append(args, "exec1", "exec2") - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) - terminateExecRequests := []*admin.ExecutionTerminateRequest{ - {Id: &core.WorkflowExecutionIdentifier{Name: "exec1"}}, - {Id: &core.WorkflowExecutionIdentifier{Name: "exec2"}}, - } + terminateExecutionSetup() terminateExecResponse := &admin.ExecutionTerminateResponse{} mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[0]).Return(nil, errors.New("failed to terminate")) mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[1]).Return(terminateExecResponse, nil) - err := terminateExecutionFunc(ctx, args, cmdCtx) + err = terminateExecutionFunc(ctx, args, cmdCtx) assert.Equal(t, errors.New("failed to terminate"), err) mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[0]) mockClient.AssertNotCalled(t, "TerminateExecution", ctx, terminateExecRequests[1]) + tearDownAndVerify(t, "") } func TestTerminateExecutionFuncWithPartialSuccess(t *testing.T) { setup() - args = append(args, "exec1", "exec2") - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) - terminateExecRequests := []*admin.ExecutionTerminateRequest{ - {Id: &core.WorkflowExecutionIdentifier{Name: "exec1"}}, - {Id: &core.WorkflowExecutionIdentifier{Name: "exec2"}}, - } + terminateExecutionSetup() terminateExecResponse := &admin.ExecutionTerminateResponse{} mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[0]).Return(terminateExecResponse, nil) mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[1]).Return(nil, errors.New("failed to terminate")) - err := terminateExecutionFunc(ctx, args, cmdCtx) + err = terminateExecutionFunc(ctx, args, cmdCtx) assert.Equal(t, errors.New("failed to terminate"), err) mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[0]) mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[1]) + tearDownAndVerify(t, "") } diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute.go b/flytectl/cmd/delete/matchable_task_resource_attribute.go new file mode 100644 index 0000000000..57791d033d --- /dev/null +++ b/flytectl/cmd/delete/matchable_task_resource_attribute.go @@ -0,0 +1,97 @@ +package delete + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" +) + +const ( + taskResourceAttributesShort = "Deletes matchable resources of task attributes" + taskResourceAttributesLong = ` +Deletes task resource attributes for given project,domain combination or additionally with workflow name. + +Deletes task resource attribute for project and domain +Here the command delete task resource attributes for project flytectldemo and development domain. +:: + + flytectl delete task-resource-attribute -p flytectldemo -d development + + +Deleting task resource attribute using config file which was used for creating it. +Here the command deletes task resource attributes from the config file tra.yaml +eg: content of tra.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete task-resource-attribute --attrFile tra.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: 150Mi + limits: + cpu: "2" + memory: 450Mi + +Deleting task resource attribute for a workflow +Here the command deletes task resource attributes for a workflow + +:: + + flytectl delete task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage +` +) + +func deleteTaskResourceAttributes(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + delConfig := subcommand.DefaultTaskResourceDelConfig + var project string + var domain string + var workflowName string + + if len(delConfig.AttrFile) > 0 { + // Read the config from the file + taskResourceAttrFileConfig := subcommand.TaskResourceAttrFileConfig{} + if err := taskResourceAttrFileConfig.ReadConfigFromFile(delConfig.AttrFile); err != nil { + return err + } + // Get project domain workflow name from the read file. + project = taskResourceAttrFileConfig.Project + domain = taskResourceAttrFileConfig.Domain + workflowName = taskResourceAttrFileConfig.Workflow + } else { + // Get all the parameters for deletion from the command line + project = config.GetConfig().Project + domain = config.GetConfig().Domain + if len(args) == 1 { + workflowName = args[0] + } + } + + if len(workflowName) > 0 { + // Delete the workflow attribute from the admin. If the attribute doesn't exist , admin deesn't return an error and same behavior is followed here + err := cmdCtx.AdminDeleterExt().DeleteWorkflowAttributes(ctx, project, domain, workflowName, admin.MatchableResource_TASK_RESOURCE) + if err != nil { + return err + } + logger.Debugf(ctx, "Deleted task resource attributes from %v project and domain %v and workflow %v", project, domain, workflowName) + } else { + // Delete the project domain attribute from the admin. If the attribute doesn't exist , admin deesn't return an error and same behavior is followed here + err := cmdCtx.AdminDeleterExt().DeleteProjectDomainAttributes(ctx, project, domain, admin.MatchableResource_TASK_RESOURCE) + if err != nil { + return err + } + logger.Debugf(ctx, "Deleted task resource attributes from %v project and domain %v", project, domain) + } + return nil +} diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go new file mode 100644 index 0000000000..211aeb694b --- /dev/null +++ b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go @@ -0,0 +1,133 @@ +package delete + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func deleteTaskResourceAttributeSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + subcommand.DefaultTaskResourceDelConfig = &subcommand.TaskResourceAttrDeleteConfig{} +} + +func TestDeleteTaskResourceAttributes(t *testing.T) { + t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + subcommand.DefaultTaskResourceDelConfig.AttrFile = "" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + }) + t.Run("failed project domain attribute deletion", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) + err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + }) + t.Run("successful project domain attribute deletion file", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + subcommand.DefaultTaskResourceDelConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_TASK_RESOURCE) + }) + t.Run("successful workflow attribute deletion", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + subcommand.DefaultTaskResourceDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_TASK_RESOURCE) + }) + t.Run("failed workflow attribute deletion", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + subcommand.DefaultTaskResourceDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) + err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_TASK_RESOURCE) + }) + t.Run("successful workflow attribute deletion file", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + subcommand.DefaultTaskResourceDelConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_TASK_RESOURCE) + }) + t.Run("workflow attribute deletion non existent file", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + subcommand.DefaultTaskResourceDelConfig.AttrFile = "testdata/non-existent" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_TASK_RESOURCE) + }) + t.Run("attribute deletion invalid file", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + subcommand.DefaultTaskResourceDelConfig.AttrFile = "testdata/invalid_task_attribute.yaml" + // No args implying project domain attribute deletion + err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, + fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), + err) + u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_TASK_RESOURCE) + }) +} diff --git a/flytectl/cmd/delete/testdata/invalid_task_attribute.yaml b/flytectl/cmd/delete/testdata/invalid_task_attribute.yaml new file mode 100644 index 0000000000..3804d837a3 --- /dev/null +++ b/flytectl/cmd/delete/testdata/invalid_task_attribute.yaml @@ -0,0 +1,5 @@ +InvalidDomain: development +InvalidProject: flytectldemo +InvalidWorkflow: "" +cpu: "1" +memory: 150Mi \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml new file mode 100644 index 0000000000..0051a4c2cc --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml @@ -0,0 +1,9 @@ +Domain: development +Project: flytectldemo +Workflow: "" +defaults: + cpu: "1" + memory: 150Mi +limits: + cpu: "2" + memory: 450Mi \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml b/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml new file mode 100644 index 0000000000..2593cad309 --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml @@ -0,0 +1,9 @@ +Domain: development +Project: flytectldemo +Workflow: core.control_flow.run_merge_sort.merge_sort +defaults: + cpu: "2" + memory: 250Mi +limits: + cpu: "3" + memory: 350Mi \ No newline at end of file diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index e875a0ca01..0b7bd5da93 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -1,6 +1,7 @@ package get import ( + "github.com/flyteorg/flytectl/cmd/config/subcommand" cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" @@ -37,6 +38,9 @@ func CreateGetCommand() *cobra.Command { Long: launchPlanLong, PFlagProvider: launchPlanConfig}, "execution": {CmdFunc: getExecutionFunc, Aliases: []string{"executions"}, Short: executionShort, Long: executionLong}, + "task-resource-attribute": {CmdFunc: getTaskResourceAttributes, Aliases: []string{"task-resource-attributes"}, + Short: taskResourceAttributesShort, + Long: taskResourceAttributesLong, PFlagProvider: subcommand.DefaultTaskResourceFetchConfig}, } cmdcore.AddCommands(getCmd, getResourcesFuncs) diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index 852994db00..e277ba1624 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -37,7 +37,7 @@ func TestCreateGetCommand(t *testing.T) { assert.Equal(t, getCommand.Use, "get") assert.Equal(t, getCommand.Short, "Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project.") fmt.Println(getCommand.Commands()) - assert.Equal(t, len(getCommand.Commands()), 5) + assert.Equal(t, len(getCommand.Commands()), 6) cmdNouns := getCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { @@ -55,7 +55,11 @@ func TestCreateGetCommand(t *testing.T) { assert.Equal(t, cmdNouns[3].Use, "task") assert.Equal(t, cmdNouns[3].Aliases, []string{"tasks"}) assert.Equal(t, cmdNouns[3].Short, "Gets task resources") - assert.Equal(t, cmdNouns[4].Use, "workflow") - assert.Equal(t, cmdNouns[4].Aliases, []string{"workflows"}) - assert.Equal(t, cmdNouns[4].Short, "Gets workflow resources") + assert.Equal(t, cmdNouns[4].Use, "task-resource-attribute") + assert.Equal(t, cmdNouns[4].Aliases, []string{"task-resource-attributes"}) + assert.Equal(t, cmdNouns[4].Short, taskResourceAttributesShort) + assert.Equal(t, cmdNouns[4].Long, taskResourceAttributesLong) + assert.Equal(t, cmdNouns[5].Use, "workflow") + assert.Equal(t, cmdNouns[5].Aliases, []string{"workflows"}) + assert.Equal(t, cmdNouns[5].Short, "Gets workflow resources") } diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index 058e745cd0..5933746acb 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -5,7 +5,8 @@ import ( "os" "testing" - "github.com/flyteorg/flytectl/cmd/testutils" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -26,9 +27,10 @@ var ( ) func getLaunchPlanSetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient + ctx = u.Ctx + mockClient = u.MockClient + // TODO: migrate to new command context from testutils + cmdCtx = cmdCore.NewCommandContext(mockClient, u.MockOutStream) argsLp = []string{"launchplan1"} parameterMap := map[string]*core.Parameter{ "numbers": { diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go new file mode 100644 index 0000000000..09e8b5df99 --- /dev/null +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -0,0 +1,98 @@ +package get + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + taskResourceAttributesShort = "Gets matchable resources of task attributes" + taskResourceAttributesLong = ` +Retrieves task resource attributes for given project,domain combination or additionally with workflow name. + +Retrieves task resource attribute for project and domain +Here the command get task resource attributes for project flytectldemo and development domain. +:: + + flytectl get task-resource-attribute -p flytectldemo -d development + +eg : O/P + +.. code-block:: json + + {"Project":"flytectldemo","Domain":"development","Workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + +Writing the task resource attribute to a file. If there are no task resource attributes a file would be written with basic data populated. +Here the command gets task resource attributes and writes the config file to tra.yaml +eg: content of tra.yaml + +:: + + flytectl get task-resource-attribute --attrFile tra.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: 150Mi + limits: + cpu: "2" + memory: 450Mi + +Usage +` +) + +func getTaskResourceAttributes(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var project string + var domain string + var workflowName string + + // Get the project domain workflow name parameters from the command line. Project and domain are mandatory for this command + project = config.GetConfig().Project + domain = config.GetConfig().Domain + if len(args) == 1 { + workflowName = args[0] + } + // Construct a shadow config for TaskResourceAttribute. The shadow config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. + taskResourceAttrFileConfig := subcommand.TaskResourceAttrFileConfig{Project: project, Domain: domain, Workflow: workflowName} + // Get the attribute file name from the command line config + fileName := subcommand.DefaultTaskResourceFetchConfig.AttrFile + + if len(workflowName) > 0 { + // Fetch the workflow attribute from the admin + workflowAttr, err := cmdCtx.AdminFetcherExt().FetchWorkflowAttributes(ctx, + project, domain, workflowName, admin.MatchableResource_TASK_RESOURCE) + if err != nil { + return err + } + if workflowAttr.GetAttributes() == nil || workflowAttr.GetAttributes().GetMatchingAttributes() == nil { + return fmt.Errorf("attribute doesn't exist") + } + // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. + taskResourceAttrFileConfig.TaskResourceAttributes = workflowAttr.GetAttributes().GetMatchingAttributes().GetTaskResourceAttributes() + } else { + // Fetch the project domain attribute from the admin + projectDomainAttr, err := cmdCtx.AdminFetcherExt().FetchProjectDomainAttributes(ctx, + project, domain, admin.MatchableResource_TASK_RESOURCE) + if err != nil { + return err + } + if projectDomainAttr.GetAttributes() == nil || projectDomainAttr.GetAttributes().GetMatchingAttributes() == nil { + return fmt.Errorf("attribute doesn't exist") + } + // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. + taskResourceAttrFileConfig.TaskResourceAttributes = projectDomainAttr.GetAttributes().GetMatchingAttributes().GetTaskResourceAttributes() + } + // Write the config to the file which can be used for update + taskResourceAttrFileConfig.DumpTaskResourceAttr(ctx, fileName) + return nil +} diff --git a/flytectl/cmd/get/matchable_task_resource_attribute_test.go b/flytectl/cmd/get/matchable_task_resource_attribute_test.go new file mode 100644 index 0000000000..00f3efad26 --- /dev/null +++ b/flytectl/cmd/get/matchable_task_resource_attribute_test.go @@ -0,0 +1,144 @@ +package get + +import ( + "fmt" + "os" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func getTaskResourceAttributeSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + subcommand.DefaultTaskResourceFetchConfig = &subcommand.TaskResourceAttrFetchConfig{} + // Clean up the temp directory. + _ = os.Remove("temp-output-file") +} + +func TestGetTaskResourceAttributes(t *testing.T) { + taskResourceAttr := &admin.TaskResourceAttributes{ + Defaults: &admin.TaskResourceSpec{ + Cpu: "1", + Memory: "150Mi", + }, + Limits: &admin.TaskResourceSpec{ + Cpu: "2", + Memory: "350Mi", + }, + } + projectDomainResp := &admin.ProjectDomainAttributesGetResponse{ + Attributes: &admin.ProjectDomainAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{ + TaskResourceAttributes: taskResourceAttr, + }, + }, + }, + } + workflowResp := &admin.WorkflowAttributesGetResponse{ + Attributes: &admin.WorkflowAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Workflow: "workflow", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{ + TaskResourceAttributes: taskResourceAttr, + }, + }, + }, + } + t.Run("successful get project domain attribute", func(t *testing.T) { + var args []string + setup() + getTaskResourceAttributeSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getTaskResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) + }) + t.Run("successful get project domain attribute and write to file", func(t *testing.T) { + var args []string + setup() + getTaskResourceAttributeSetup() + subcommand.DefaultTaskResourceFetchConfig.AttrFile = "temp-output-file" + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getTaskResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + tearDownAndVerify(t, `wrote the config to file temp-output-file`) + }) + t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { + var args []string + setup() + getTaskResourceAttributeSetup() + subcommand.DefaultTaskResourceFetchConfig.AttrFile = "non-existent-dir/temp-output-file" + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getTaskResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + tearDownAndVerify(t, `error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory`) + }) + t.Run("failed get project domain attribute", func(t *testing.T) { + var args []string + setup() + getTaskResourceAttributeSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getTaskResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + tearDownAndVerify(t, ``) + }) + t.Run("successful get workflow attribute", func(t *testing.T) { + var args []string + setup() + getTaskResourceAttributeSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(workflowResp, nil) + err = getTaskResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + admin.MatchableResource_TASK_RESOURCE) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) + }) + t.Run("failed get workflow attribute", func(t *testing.T) { + var args []string + setup() + getTaskResourceAttributeSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getTaskResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + admin.MatchableResource_TASK_RESOURCE) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index e5f2c62246..7164840518 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -5,7 +5,8 @@ import ( "os" "testing" - "github.com/flyteorg/flytectl/cmd/testutils" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -26,9 +27,10 @@ var ( ) func getTaskSetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient + ctx = u.Ctx + mockClient = u.MockClient + // TODO: migrate to new command context from testutils + cmdCtx = cmdCore.NewCommandContext(mockClient, u.MockOutStream) argsTask = []string{"task1"} sortedListLiteralType := core.Variable{ Type: &core.LiteralType{ diff --git a/flytectl/cmd/get/taskconfig_flags.go b/flytectl/cmd/get/taskconfig_flags.go index 71a3fadabc..525884466b 100755 --- a/flytectl/cmd/get/taskconfig_flags.go +++ b/flytectl/cmd/get/taskconfig_flags.go @@ -40,7 +40,7 @@ func (TaskConfig) mustMarshalJSON(v json.Marshaler) string { // GetPFlagSet will return strongly types pflags for all fields in TaskConfig and its nested types. The format of the // flags is json-name.json-sub-name... etc. func (cfg TaskConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("TaskConfig", pflag.ExitOnError) + cmdFlags := pflag.NewFlagSet("TaskResourceAttrConfig", pflag.ExitOnError) cmdFlags.StringVar(&(taskConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), taskConfig.ExecFile, "execution file name to be used for generating execution spec of a single task.") cmdFlags.StringVar(&(taskConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), taskConfig.Version, "version of the task to be fetched.") cmdFlags.BoolVar(&(taskConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), taskConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") diff --git a/flytectl/cmd/testutils/test_utils.go b/flytectl/cmd/testutils/test_utils.go index 3285ed1523..f386341f32 100644 --- a/flytectl/cmd/testutils/test_utils.go +++ b/flytectl/cmd/testutils/test_utils.go @@ -11,7 +11,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/ext" + extMocks "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/stretchr/testify/assert" @@ -27,8 +27,10 @@ var ( Err error Ctx context.Context MockClient *mocks.AdminServiceClient - FetcherExt ext.AdminFetcherExtInterface - mockOutStream io.Writer + FetcherExt *extMocks.AdminFetcherExtInterface + UpdaterExt *extMocks.AdminUpdaterExtInterface + DeleterExt *extMocks.AdminDeleterExtInterface + MockOutStream io.Writer CmdCtx cmdCore.CommandContext stdOut *os.File stderr *os.File @@ -46,13 +48,20 @@ func Setup() { os.Stderr = writer log.SetOutput(writer) MockClient = new(mocks.AdminServiceClient) - mockOutStream = writer - CmdCtx = cmdCore.NewCommandContext(MockClient, mockOutStream) + FetcherExt = new(extMocks.AdminFetcherExtInterface) + UpdaterExt = new(extMocks.AdminUpdaterExtInterface) + DeleterExt = new(extMocks.AdminDeleterExtInterface) + FetcherExt.OnAdminServiceClient().Return(MockClient) + UpdaterExt.OnAdminServiceClient().Return(MockClient) + DeleterExt.OnAdminServiceClient().Return(MockClient) + MockOutStream = writer + CmdCtx = cmdCore.NewCommandContextWithExt(MockClient, FetcherExt, UpdaterExt, DeleterExt, MockOutStream) config.GetConfig().Project = projectValue config.GetConfig().Domain = domainValue config.GetConfig().Output = output } +// TearDownAndVerify TODO: Change this to verify log lines from context func TearDownAndVerify(t *testing.T, expectedLog string) { writer.Close() os.Stdout = stdOut diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go new file mode 100644 index 0000000000..239a81d736 --- /dev/null +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -0,0 +1,95 @@ +package update + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/cmd/config/subcommand" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytestdlib/logger" +) + +const ( + taskResourceAttributesShort = "Updates matchable resources of task attributes" + taskResourceAttributesLong = ` +Updates task resource attributes for given project and domain combination or additionally with workflow name. + +Updating the task resource attribute is only available from a generated file. See the get section for generating this file. +Here the command updates takes the input for task resource attributes from the config file tra.yaml +eg: content of tra.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: 150Mi + limits: + cpu: "2" + memory: 450Mi + +:: + + flytectl update task-resource-attribute -attrFile tra.yaml + +Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other +resource attribute defined at project domain level. +Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + defaults: + cpu: "1" + memory: 150Mi + limits: + cpu: "2" + memory: 450Mi + +:: + + flytectl update task-resource-attribute -attrFile tra.yaml + +Usage + +` +) + +func updateTaskResourceAttributesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + updateConfig := subcommand.DefaultTaskResourceUpdateConfig + if len(updateConfig.AttrFile) == 0 { + return fmt.Errorf("attrFile is mandatory while calling update for task resource attribute") + } + + taskResourceAttrFileConfig := subcommand.TaskResourceAttrFileConfig{} + if err := taskResourceAttrFileConfig.ReadConfigFromFile(updateConfig.AttrFile); err != nil { + return err + } + + // Get project domain workflow name from the read file. + project := taskResourceAttrFileConfig.Project + domain := taskResourceAttrFileConfig.Domain + workflowName := taskResourceAttrFileConfig.Workflow + + // decorate the taskresource Attributes with MatchingAttributes + matchingAttr := taskResourceAttrFileConfig.MatchableAttributeDecorator() + + if len(workflowName) > 0 { + // Update the workflow attribute using the admin. + err := cmdCtx.AdminUpdaterExt().UpdateWorkflowAttributes(ctx, project, domain, workflowName, matchingAttr) + if err != nil { + return err + } + logger.Debugf(ctx, "Updated task resource attributes from %v project and domain %v and workflow %v", project, domain, workflowName) + } else { + // Update the project domain attribute using the admin. + err := cmdCtx.AdminUpdaterExt().UpdateProjectDomainAttributes(ctx, project, domain, matchingAttr) + if err != nil { + return err + } + logger.Debugf(ctx, "Updated task resource attributes from %v project and domain %v", project, domain) + } + return nil +} diff --git a/flytectl/cmd/update/matchable_task_resource_attribute_test.go b/flytectl/cmd/update/matchable_task_resource_attribute_test.go new file mode 100644 index 0000000000..4ab7b84cab --- /dev/null +++ b/flytectl/cmd/update/matchable_task_resource_attribute_test.go @@ -0,0 +1,94 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config/subcommand" + u "github.com/flyteorg/flytectl/cmd/testutils" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func updateTaskResourceAttributeSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + subcommand.DefaultTaskResourceUpdateConfig = &subcommand.TaskResourceAttrUpdateConfig{} +} + +func TestUpdateTaskResourceAttributes(t *testing.T) { + t.Run("no input file for update", func(t *testing.T) { + setup() + updateTaskResourceAttributeSetup() + err = updateTaskResourceAttributesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for task resource attribute"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update project domain attribute", func(t *testing.T) { + setup() + updateTaskResourceAttributeSetup() + subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = updateTaskResourceAttributesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update project domain attribute", func(t *testing.T) { + setup() + updateTaskResourceAttributeSetup() + subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updateTaskResourceAttributesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update workflow attribute", func(t *testing.T) { + setup() + updateTaskResourceAttributeSetup() + subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update workflow attribute", func(t *testing.T) { + setup() + updateTaskResourceAttributeSetup() + subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("non existent file", func(t *testing.T) { + setup() + updateTaskResourceAttributeSetup() + subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/non-existent-filel" + err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-filel yaml file"), err) + tearDownAndVerify(t, ``) + }) + t.Run("invalid update file", func(t *testing.T) { + setup() + updateTaskResourceAttributeSetup() + subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/invalid_task_attribute.yaml" + err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index a3e7d9e2e5..e3eac5ff84 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -1,17 +1,13 @@ package update import ( - "bytes" - "context" "errors" - "io" - "log" - "os" + "fmt" "testing" + "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -20,49 +16,19 @@ import ( const projectValue = "dummyProject" var ( - reader *os.File - writer *os.File - err error - ctx context.Context - mockClient *mocks.AdminServiceClient - mockOutStream io.Writer args []string - cmdCtx cmdCore.CommandContext projectUpdateRequest *admin.Project - stdOut *os.File - stderr *os.File ) -func setup() { - reader, writer, err = os.Pipe() - if err != nil { - panic(err) - } - stdOut = os.Stdout - stderr = os.Stderr - os.Stdout = writer - os.Stderr = writer - log.SetOutput(writer) - config.GetConfig().Project = projectValue - mockClient = new(mocks.AdminServiceClient) - mockOutStream = writer - cmdCtx = cmdCore.NewCommandContext(mockClient, mockOutStream) +func updateProjectSetup() { + mockClient = u.MockClient + cmdCtx = u.CmdCtx projectUpdateRequest = &admin.Project{ Id: projectValue, State: admin.Project_ACTIVE, } } -func teardownAndVerify(t *testing.T, expectedLog string) { - writer.Close() - os.Stdout = stdOut - os.Stderr = stderr - var buf bytes.Buffer - if _, err := io.Copy(&buf, reader); err != nil { - assert.Equal(t, expectedLog, buf.String()) - } -} - func modifyProjectFlags(archiveProject *bool, newArchiveVal bool, activateProject *bool, newActivateVal bool) { *archiveProject = newArchiveVal *activateProject = newActivateVal @@ -70,69 +36,76 @@ func modifyProjectFlags(archiveProject *bool, newArchiveVal bool, activateProjec func TestActivateProjectFunc(t *testing.T) { setup() - defer teardownAndVerify(t, "Project dummyProject updated to ACTIVE state\n") + updateProjectSetup() modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) - err := updateProjectsFunc(ctx, args, cmdCtx) + err = updateProjectsFunc(ctx, args, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) + tearDownAndVerify(t, "Project dummyProject updated to ACTIVE state\n") } func TestActivateProjectFuncWithError(t *testing.T) { setup() - defer teardownAndVerify(t, "Project dummyProject failed to get updated to ACTIVE state due to Error Updating Project\n") + updateProjectSetup() modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) - err := updateProjectsFunc(ctx, args, cmdCtx) + err = updateProjectsFunc(ctx, args, cmdCtx) assert.NotNil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) + tearDownAndVerify(t, "Project dummyProject failed to get updated to ACTIVE state due to Error Updating Project\n") } func TestArchiveProjectFunc(t *testing.T) { setup() - defer teardownAndVerify(t, "Project dummyProject updated to ARCHIVED state\n") + updateProjectSetup() modifyProjectFlags(&(projectConfig.ArchiveProject), true, &(projectConfig.ActivateProject), false) - projectUpdateRequest := &admin.Project{ + projectUpdateRequest = &admin.Project{ Id: projectValue, State: admin.Project_ARCHIVED, } mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) - err := updateProjectsFunc(ctx, args, cmdCtx) + err = updateProjectsFunc(ctx, args, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) + tearDownAndVerify(t, "Project dummyProject updated to ARCHIVED state\n") } func TestArchiveProjectFuncWithError(t *testing.T) { setup() - defer teardownAndVerify(t, "Project dummyProject failed to get updated to ARCHIVED state due to Error Updating Project\n") + updateProjectSetup() modifyProjectFlags(&(projectConfig.ArchiveProject), true, &(projectConfig.ActivateProject), false) - projectUpdateRequest := &admin.Project{ + projectUpdateRequest = &admin.Project{ Id: projectValue, State: admin.Project_ARCHIVED, } mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) - err := updateProjectsFunc(ctx, args, cmdCtx) + err = updateProjectsFunc(ctx, args, cmdCtx) assert.NotNil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) + tearDownAndVerify(t, "Project dummyProject failed to get updated to ARCHIVED state due to Error Updating Project\n") } func TestEmptyProjectInput(t *testing.T) { setup() - defer teardownAndVerify(t, "Project not passed\n") + updateProjectSetup() config.GetConfig().Project = "" modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) - err := updateProjectsFunc(ctx, args, cmdCtx) + err = updateProjectsFunc(ctx, args, cmdCtx) assert.Nil(t, err) mockClient.AssertNotCalled(t, "UpdateProject", ctx, projectUpdateRequest) + tearDownAndVerify(t, "Project not passed") } func TestInvalidInput(t *testing.T) { setup() - defer teardownAndVerify(t, "Invalid state passed. Specify either activate or archive\n") + updateProjectSetup() modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), false) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) - err := updateProjectsFunc(ctx, args, cmdCtx) + err = updateProjectsFunc(ctx, args, cmdCtx) assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf(clierrors.ErrInvalidStateUpdate), err) mockClient.AssertNotCalled(t, "UpdateProject", ctx, projectUpdateRequest) + tearDownAndVerify(t, "") } diff --git a/flytectl/cmd/update/testdata/invalid_task_attribute.yaml b/flytectl/cmd/update/testdata/invalid_task_attribute.yaml new file mode 100644 index 0000000000..3804d837a3 --- /dev/null +++ b/flytectl/cmd/update/testdata/invalid_task_attribute.yaml @@ -0,0 +1,5 @@ +InvalidDomain: development +InvalidProject: flytectldemo +InvalidWorkflow: "" +cpu: "1" +memory: 150Mi \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml b/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml new file mode 100644 index 0000000000..0051a4c2cc --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml @@ -0,0 +1,9 @@ +Domain: development +Project: flytectldemo +Workflow: "" +defaults: + cpu: "1" + memory: 150Mi +limits: + cpu: "2" + memory: 450Mi \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml b/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml new file mode 100644 index 0000000000..2593cad309 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml @@ -0,0 +1,9 @@ +Domain: development +Project: flytectldemo +Workflow: core.control_flow.run_merge_sort.merge_sort +defaults: + cpu: "2" + memory: 250Mi +limits: + cpu: "3" + memory: 350Mi \ No newline at end of file diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 3f801ce08f..c842c0855b 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -1,6 +1,7 @@ package update import ( + "github.com/flyteorg/flytectl/cmd/config/subcommand" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" ) @@ -35,6 +36,8 @@ func CreateUpdateCommand() *cobra.Command { Short: updateTaskShort, Long: updateTaskLong}, "workflow": {CmdFunc: updateWorkflowFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateWorkflowShort, Long: updateWorkflowLong}, + "task-resource-attribute": {CmdFunc: updateTaskResourceAttributesFunc, Aliases: []string{}, PFlagProvider: subcommand.DefaultTaskResourceUpdateConfig, + Short: taskResourceAttributesShort, Long: taskResourceAttributesLong, ProjectDomainNotRequired: true}, } cmdCore.AddCommands(updateCmd, updateResourcesFuncs) return updateCmd diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index 9a610f9f5d..33e9b9eb5e 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -1,27 +1,41 @@ package update import ( + "context" "sort" "testing" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/stretchr/testify/assert" ) +var ( + err error + ctx context.Context + mockClient *mocks.AdminServiceClient + cmdCtx cmdCore.CommandContext +) +var setup = testutils.Setup +var tearDownAndVerify = testutils.TearDownAndVerify + func TestUpdateCommand(t *testing.T) { updateCommand := CreateUpdateCommand() assert.Equal(t, updateCommand.Use, updateUse) assert.Equal(t, updateCommand.Short, updateShort) assert.Equal(t, updateCommand.Long, updatecmdLong) - assert.Equal(t, len(updateCommand.Commands()), 4) + assert.Equal(t, len(updateCommand.Commands()), 5) cmdNouns := updateCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - useArray := []string{"launchplan", "project", "task", "workflow"} - aliases := [][]string{{}, {}, {}, {}} - shortArray := []string{updateLPShort, projectShort, updateTaskShort, updateWorkflowShort} - longArray := []string{updateLPLong, projectLong, updateTaskLong, updateWorkflowLong} + useArray := []string{"launchplan", "project", "task", "task-resource-attribute", "workflow"} + aliases := [][]string{{}, {}, {}, {}, {}} + shortArray := []string{updateLPShort, projectShort, updateTaskShort, taskResourceAttributesShort, updateWorkflowShort} + longArray := []string{updateLPLong, projectLong, updateTaskLong, taskResourceAttributesLong, updateWorkflowLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) diff --git a/flytectl/docs/coverage.out b/flytectl/docs/coverage.out new file mode 100644 index 0000000000..5f02b11199 --- /dev/null +++ b/flytectl/docs/coverage.out @@ -0,0 +1 @@ +mode: set diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 89e4a4db9c..c878c96298 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -17,20 +17,20 @@ Options :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. -h, --help help for flytectl --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index d3bf35e5bf..a2f96c1e7a 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -26,20 +26,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 2ce677324c..c5e86530a1 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -28,20 +28,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --file stringArray Passes the config file to load. If empty, it'll first search for the config file path then, if found, will load config from there. diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index ac0f848d42..7223e1a240 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -30,20 +30,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --file stringArray Passes the config file to load. If empty, it'll first search for the config file path then, if found, will load config from there. diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index a7528e911e..7233aa611a 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -29,20 +29,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 5487019357..ade3a51e11 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -102,20 +102,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index 3b1aa15100..b99b60268f 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -53,20 +53,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index f9c3e5b589..49006715a4 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -29,20 +29,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) @@ -72,4 +72,5 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_delete_execution` - Terminate/Delete execution resources. +* :doc:`flytectl_delete_task-resource-attribute` - Deletes matchable resources of task attributes diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index d606658174..60dda389ad 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -72,20 +72,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst new file mode 100644 index 0000000000..4f19d5b32c --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -0,0 +1,112 @@ +.. _flytectl_delete_task-resource-attribute: + +flytectl delete task-resource-attribute +--------------------------------------- + +Deletes matchable resources of task attributes + +Synopsis +~~~~~~~~ + + + +Deletes task resource attributes for given project,domain combination or additionally with workflow name. + +Deletes task resource attribute for project and domain +Here the command delete task resource attributes for project flytectldemo and development domain. +:: + + flytectl delete task-resource-attribute -p flytectldemo -d development + + +Deleting task resource attribute using config file which was used for creating it. +Here the command deletes task resource attributes from the config file tra.yaml +eg: content of tra.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete task-resource-attribute --attrFile tra.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: 150Mi + limits: + cpu: "2" + memory: 450Mi + +Deleting task resource attribute for a workflow +Here the command deletes task resource attributes for a workflow + +:: + + flytectl delete task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage + + +:: + + flytectl delete task-resource-attribute [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for delete attribute for the resource type. + -h, --help help for task-resource-attribute + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index ae7a6ae65d..add9e81c9b 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -29,20 +29,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) @@ -75,5 +75,6 @@ SEE ALSO * :doc:`flytectl_get_launchplan` - Gets launch plan resources * :doc:`flytectl_get_project` - Gets project resources * :doc:`flytectl_get_task` - Gets task resources +* :doc:`flytectl_get_task-resource-attribute` - Gets matchable resources of task attributes * :doc:`flytectl_get_workflow` - Gets workflow resources diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 48a01189cc..fad935ec01 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -58,20 +58,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 0cd64b8651..2f97de100f 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -85,20 +85,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 17c5d35b3a..e47f0061c2 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -58,20 +58,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst new file mode 100644 index 0000000000..05046e2469 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -0,0 +1,110 @@ +.. _flytectl_get_task-resource-attribute: + +flytectl get task-resource-attribute +------------------------------------ + +Gets matchable resources of task attributes + +Synopsis +~~~~~~~~ + + + +Retrieves task resource attributes for given project,domain combination or additionally with workflow name. + +Retrieves task resource attribute for project and domain +Here the command get task resource attributes for project flytectldemo and development domain. +:: + + flytectl get task-resource-attribute -p flytectldemo -d development + +eg : O/P + +.. code-block:: json + + {"Project":"flytectldemo","Domain":"development","Workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + +Writing the task resource attribute to a file. If there are no task resource attributes a file would be written with basic data populated. +Here the command gets task resource attributes and writes the config file to tra.yaml +eg: content of tra.yaml + +:: + + flytectl get task-resource-attribute --attrFile tra.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: 150Mi + limits: + cpu: "2" + memory: 450Mi + +Usage + + +:: + + flytectl get task-resource-attribute [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for generating attribute for the resource type. + -h, --help help for task-resource-attribute + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 5ccddc30c9..8a770670f9 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -85,20 +85,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 4b4a996b2c..9a2288c75f 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -58,20 +58,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 19179afdfc..f02dbed437 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -29,20 +29,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 01074e4dc8..c3c90edb5e 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -75,20 +75,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 7db54b49a6..a30c1a9337 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -31,20 +31,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) @@ -76,5 +76,6 @@ SEE ALSO * :doc:`flytectl_update_launchplan` - Updates launch plan metadata * :doc:`flytectl_update_project` - Updates project resources * :doc:`flytectl_update_task` - Updates task metadata +* :doc:`flytectl_update_task-resource-attribute` - Updates matchable resources of task attributes * :doc:`flytectl_update_workflow` - Updates workflow metadata diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 49bf4bffa9..cc76a1ab93 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -48,20 +48,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 4a6e7bee48..8a2e2525ca 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -73,20 +73,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst new file mode 100644 index 0000000000..a0aef81d04 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -0,0 +1,117 @@ +.. _flytectl_update_task-resource-attribute: + +flytectl update task-resource-attribute +--------------------------------------- + +Updates matchable resources of task attributes + +Synopsis +~~~~~~~~ + + + +Updates task resource attributes for given project and domain combination or additionally with workflow name. + +Updating the task resource attribute is only available from a generated file. See the get section for generating this file. +Here the command updates takes the input for task resource attributes from the config file tra.yaml +eg: content of tra.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: 150Mi + limits: + cpu: "2" + memory: 450Mi + +:: + + flytectl update task-resource-attribute -attrFile tra.yaml + +Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other +resource attribute defined at project domain level. +Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + defaults: + cpu: "1" + memory: 150Mi + limits: + cpu: "2" + memory: 450Mi + +:: + + flytectl update task-resource-attribute -attrFile tra.yaml + +Usage + + + +:: + + flytectl update task-resource-attribute [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for updating attribute for the resource type. + -h, --help help for task-resource-attribute + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. + diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst index 5a81366eb8..ba02121a13 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -48,20 +48,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst index 553446ca27..7320bb5423 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -48,20 +48,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index a56c061f65..84df72ed64 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -33,20 +33,20 @@ Options inherited from parent commands :: --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IDP's authorization server' - --admin.clientId string Client ID - --admin.clientSecretLocation string File containing the client secret + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.scopes strings List of scopes to request - --admin.tokenUrl string Your IDPs token endpoint - --admin.useAuth Whether or not to try to authenticate with options below + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) - --config string config file (default is $HOME/config.yaml) + --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/pkg/ext/attribute_match_deleter_test.go b/flytectl/pkg/ext/attribute_match_deleter_test.go new file mode 100644 index 0000000000..9c8c665b08 --- /dev/null +++ b/flytectl/pkg/ext/attribute_match_deleter_test.go @@ -0,0 +1,49 @@ +package ext + +import ( + "context" + "fmt" + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +var adminDeleterExt AdminDeleterExtClient + +func deleteAttributeMatchFetcherSetup() { + ctx = context.Background() + adminClient = new(mocks.AdminServiceClient) + adminDeleterExt = AdminDeleterExtClient{AdminClient: adminClient} +} + +func TestDeleteWorkflowAttributes(t *testing.T) { + deleteAttributeMatchFetcherSetup() + adminClient.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(nil, nil) + err := adminDeleterExt.DeleteWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", admin.MatchableResource_TASK_RESOURCE) + assert.Nil(t, err) +} + +func TestDeleteWorkflowAttributesError(t *testing.T) { + deleteAttributeMatchFetcherSetup() + adminClient.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + err := adminDeleterExt.DeleteWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", admin.MatchableResource_TASK_RESOURCE) + assert.Equal(t, fmt.Errorf("failed"), err) +} + +func TestDeleteProjectDomainAttributes(t *testing.T) { + deleteAttributeMatchFetcherSetup() + adminClient.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(nil, nil) + err := adminDeleterExt.DeleteProjectDomainAttributes(ctx, "dummyProject", "domainValue", admin.MatchableResource_TASK_RESOURCE) + assert.Nil(t, err) +} + +func TestDeleteProjectDomainAttributesError(t *testing.T) { + deleteAttributeMatchFetcherSetup() + adminClient.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + err := adminDeleterExt.DeleteProjectDomainAttributes(ctx, "dummyProject", "domainValue", admin.MatchableResource_TASK_RESOURCE) + assert.Equal(t, fmt.Errorf("failed"), err) +} diff --git a/flytectl/pkg/ext/attribute_match_fetcher.go b/flytectl/pkg/ext/attribute_match_fetcher.go new file mode 100644 index 0000000000..f3ea76b369 --- /dev/null +++ b/flytectl/pkg/ext/attribute_match_fetcher.go @@ -0,0 +1,29 @@ +package ext + +import ( + "context" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +func (a *AdminFetcherExtClient) FetchWorkflowAttributes(ctx context.Context, project, domain, name string, + rsType admin.MatchableResource) (*admin.WorkflowAttributesGetResponse, error) { + workflowAttr, err := a.AdminServiceClient().GetWorkflowAttributes(ctx, &admin.WorkflowAttributesGetRequest{ + Project: project, + Domain: domain, + Workflow: name, + ResourceType: rsType, + }) + return workflowAttr, err +} + +func (a *AdminFetcherExtClient) FetchProjectDomainAttributes(ctx context.Context, project, domain string, + rsType admin.MatchableResource) (*admin.ProjectDomainAttributesGetResponse, error) { + projectDomainAttr, err := a.AdminServiceClient().GetProjectDomainAttributes(ctx, + &admin.ProjectDomainAttributesGetRequest{ + Project: project, + Domain: domain, + ResourceType: rsType, + }) + return projectDomainAttr, err +} diff --git a/flytectl/pkg/ext/attribute_match_fetcher_test.go b/flytectl/pkg/ext/attribute_match_fetcher_test.go new file mode 100644 index 0000000000..b91d18fe3a --- /dev/null +++ b/flytectl/pkg/ext/attribute_match_fetcher_test.go @@ -0,0 +1,49 @@ +package ext + +import ( + "context" + "fmt" + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func getAttributeMatchFetcherSetup() { + ctx = context.Background() + adminClient = new(mocks.AdminServiceClient) + adminFetcherExt = AdminFetcherExtClient{AdminClient: adminClient} +} + +func TestFetchWorkflowAttributes(t *testing.T) { + getAttributeMatchFetcherSetup() + resp := &admin.WorkflowAttributesGetResponse{} + adminClient.OnGetWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(resp, nil) + _, err := adminFetcherExt.FetchWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", admin.MatchableResource_TASK_RESOURCE) + assert.Nil(t, err) +} + +func TestFetchWorkflowAttributesError(t *testing.T) { + getAttributeMatchFetcherSetup() + adminClient.OnGetWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", admin.MatchableResource_TASK_RESOURCE) + assert.Equal(t, fmt.Errorf("failed"), err) +} + +func TestFetchProjectDomainAttributes(t *testing.T) { + getAttributeMatchFetcherSetup() + resp := &admin.ProjectDomainAttributesGetResponse{} + adminClient.OnGetProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(resp, nil) + _, err := adminFetcherExt.FetchProjectDomainAttributes(ctx, "dummyProject", "domainValue", admin.MatchableResource_TASK_RESOURCE) + assert.Nil(t, err) +} + +func TestFetchProjectDomainAttributesError(t *testing.T) { + getAttributeMatchFetcherSetup() + adminClient.OnGetProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchProjectDomainAttributes(ctx, "dummyProject", "domainValue", admin.MatchableResource_TASK_RESOURCE) + assert.Equal(t, fmt.Errorf("failed"), err) +} diff --git a/flytectl/pkg/ext/attribute_match_updater.go b/flytectl/pkg/ext/attribute_match_updater.go new file mode 100644 index 0000000000..d06e22155e --- /dev/null +++ b/flytectl/pkg/ext/attribute_match_updater.go @@ -0,0 +1,31 @@ +package ext + +import ( + "context" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +func (a *AdminUpdaterExtClient) UpdateWorkflowAttributes(ctx context.Context, project, domain, name string, matchingAttr *admin.MatchingAttributes) error { + _, err := a.AdminServiceClient().UpdateWorkflowAttributes(ctx, &admin.WorkflowAttributesUpdateRequest{ + Attributes: &admin.WorkflowAttributes{ + Project: project, + Domain: domain, + Workflow: name, + MatchingAttributes: matchingAttr, + }, + }) + return err +} + +func (a *AdminUpdaterExtClient) UpdateProjectDomainAttributes(ctx context.Context, project, domain string, matchingAttr *admin.MatchingAttributes) error { + _, err := a.AdminServiceClient().UpdateProjectDomainAttributes(ctx, + &admin.ProjectDomainAttributesUpdateRequest{ + Attributes: &admin.ProjectDomainAttributes{ + Project: project, + Domain: domain, + MatchingAttributes: matchingAttr, + }, + }) + return err +} diff --git a/flytectl/pkg/ext/attribute_match_updater_test.go b/flytectl/pkg/ext/attribute_match_updater_test.go new file mode 100644 index 0000000000..f57d86a369 --- /dev/null +++ b/flytectl/pkg/ext/attribute_match_updater_test.go @@ -0,0 +1,55 @@ +package ext + +import ( + "context" + "fmt" + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +var adminUpdaterExt AdminUpdaterExtClient + +func updateAttributeMatchFetcherSetup() { + ctx = context.Background() + adminClient = new(mocks.AdminServiceClient) + adminUpdaterExt = AdminUpdaterExtClient{AdminClient: adminClient} +} + +func TestUpdateWorkflowAttributes(t *testing.T) { + updateAttributeMatchFetcherSetup() + matchingAttr := &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{}, + } + adminClient.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(nil, nil) + err := adminUpdaterExt.UpdateWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", matchingAttr) + assert.Nil(t, err) +} + +func TestUpdateWorkflowAttributesError(t *testing.T) { + updateAttributeMatchFetcherSetup() + adminClient.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + err := adminUpdaterExt.UpdateWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", nil) + assert.Equal(t, fmt.Errorf("failed"), err) +} + +func TestUpdateProjectDomainAttributes(t *testing.T) { + updateAttributeMatchFetcherSetup() + matchingAttr := &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{}, + } + adminClient.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(nil, nil) + err := adminUpdaterExt.UpdateProjectDomainAttributes(ctx, "dummyProject", "domainValue", matchingAttr) + assert.Nil(t, err) +} + +func TestUpdateProjectDomainAttributesError(t *testing.T) { + updateAttributeMatchFetcherSetup() + adminClient.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + err := adminUpdaterExt.UpdateProjectDomainAttributes(ctx, "dummyProject", "domainValue", nil) + assert.Equal(t, fmt.Errorf("failed"), err) +} diff --git a/flytectl/pkg/ext/attribute_matcher_deleter.go b/flytectl/pkg/ext/attribute_matcher_deleter.go new file mode 100644 index 0000000000..b7fdaec9b2 --- /dev/null +++ b/flytectl/pkg/ext/attribute_matcher_deleter.go @@ -0,0 +1,26 @@ +package ext + +import ( + "context" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +func (a *AdminDeleterExtClient) DeleteWorkflowAttributes(ctx context.Context, project, domain, name string, rsType admin.MatchableResource) error { + _, err := a.AdminServiceClient().DeleteWorkflowAttributes(ctx, &admin.WorkflowAttributesDeleteRequest{ + Project: project, + Domain: domain, + Workflow: name, + ResourceType: rsType, + }) + return err +} + +func (a *AdminDeleterExtClient) DeleteProjectDomainAttributes(ctx context.Context, project, domain string, rsType admin.MatchableResource) error { + _, err := a.AdminServiceClient().DeleteProjectDomainAttributes(ctx, &admin.ProjectDomainAttributesDeleteRequest{ + Project: project, + Domain: domain, + ResourceType: rsType, + }) + return err +} diff --git a/flytectl/pkg/ext/deleter.go b/flytectl/pkg/ext/deleter.go new file mode 100644 index 0000000000..03827d1079 --- /dev/null +++ b/flytectl/pkg/ext/deleter.go @@ -0,0 +1,33 @@ +package ext + +import ( + "context" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" +) + +//go:generate mockery -all -case=underscore + +// AdminDeleterExtInterface Interface for exposing the update capabilities from the admin +type AdminDeleterExtInterface interface { + AdminServiceClient() service.AdminServiceClient + + // DeleteWorkflowAttributes deletes workflow attributes within a project, domain for a particular matchable resource + DeleteWorkflowAttributes(ctx context.Context, project, domain, name string, rsType admin.MatchableResource) error + + // DeleteProjectDomainAttributes deletes project domain attributes for a particular matchable resource + DeleteProjectDomainAttributes(ctx context.Context, project, domain string, rsType admin.MatchableResource) error +} + +// AdminDeleterExtClient is used for interacting with extended features used for deleting/archiving data in admin service +type AdminDeleterExtClient struct { + AdminClient service.AdminServiceClient +} + +func (a *AdminDeleterExtClient) AdminServiceClient() service.AdminServiceClient { + if a == nil { + return nil + } + return a.AdminClient +} diff --git a/flytectl/pkg/ext/doc.go b/flytectl/pkg/ext/doc.go new file mode 100644 index 0000000000..aa5073ed52 --- /dev/null +++ b/flytectl/pkg/ext/doc.go @@ -0,0 +1,2 @@ +// Package ext Provides Fetch,Update and Delete extensions to the admin API's whose interface directly relates to flytectl commands +package ext diff --git a/flytectl/pkg/ext/execution_fetcher_ext.go b/flytectl/pkg/ext/execution_fetcher.go similarity index 100% rename from flytectl/pkg/ext/execution_fetcher_ext.go rename to flytectl/pkg/ext/execution_fetcher.go diff --git a/flytectl/pkg/ext/execution_fetcher_test.go b/flytectl/pkg/ext/execution_fetcher_test.go new file mode 100644 index 0000000000..add301a6da --- /dev/null +++ b/flytectl/pkg/ext/execution_fetcher_test.go @@ -0,0 +1,68 @@ +package ext + +import ( + "context" + "fmt" + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +var ( + executionResponse *admin.Execution +) + +func getExecutionFetcherSetup() { + ctx = context.Background() + adminClient = new(mocks.AdminServiceClient) + adminFetcherExt = AdminFetcherExtClient{AdminClient: adminClient} + projectValue := "dummyProject" + domainValue := "domainValue" + executionNameValue := "execName" + launchPlanNameValue := "launchPlanNameValue" + launchPlanVersionValue := "launchPlanVersionValue" + workflowNameValue := "workflowNameValue" + workflowVersionValue := "workflowVersionValue" + executionResponse = &admin.Execution{ + Id: &core.WorkflowExecutionIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: executionNameValue, + }, + Spec: &admin.ExecutionSpec{ + LaunchPlan: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: launchPlanNameValue, + Version: launchPlanVersionValue, + }, + }, + Closure: &admin.ExecutionClosure{ + WorkflowId: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: workflowNameValue, + Version: workflowVersionValue, + }, + Phase: core.WorkflowExecution_SUCCEEDED, + }, + } +} + +func TestFetchExecutionVersion(t *testing.T) { + getExecutionFetcherSetup() + adminClient.OnGetExecutionMatch(mock.Anything, mock.Anything).Return(executionResponse, nil) + _, err := adminFetcherExt.FetchExecution(ctx, "execName", "dummyProject", "domainValue") + assert.Nil(t, err) +} + +func TestFetchExecutionError(t *testing.T) { + getExecutionFetcherSetup() + adminClient.OnGetExecutionMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchExecution(ctx, "execName", "dummyProject", "domainValue") + assert.Equal(t, fmt.Errorf("failed"), err) +} diff --git a/flytectl/pkg/ext/fetcher_ext_client.go b/flytectl/pkg/ext/fetcher.go similarity index 79% rename from flytectl/pkg/ext/fetcher_ext_client.go rename to flytectl/pkg/ext/fetcher.go index ebe34ca9d3..d32421156b 100644 --- a/flytectl/pkg/ext/fetcher_ext_client.go +++ b/flytectl/pkg/ext/fetcher.go @@ -34,6 +34,12 @@ type AdminFetcherExtInterface interface { // FetchTaskVersion fetches particular version of task in a project, domain FetchTaskVersion(ctx context.Context, name, version, project, domain string) (*admin.Task, error) + + // FetchWorkflowAttributes fetches workflow attributes particular resource type in a project, domain and workflow + FetchWorkflowAttributes(ctx context.Context, project, domain, name string, rsType admin.MatchableResource) (*admin.WorkflowAttributesGetResponse, error) + + // FetchProjectDomainAttributes fetches project domain attributes particular resource type in a project, domain + FetchProjectDomainAttributes(ctx context.Context, project, domain string, rsType admin.MatchableResource) (*admin.ProjectDomainAttributesGetResponse, error) } // AdminFetcherExtClient is used for interacting with extended features used for fetching data from admin service diff --git a/flytectl/pkg/ext/launch_plan_fetcher_test.go b/flytectl/pkg/ext/launch_plan_fetcher_test.go new file mode 100644 index 0000000000..7b40fbde89 --- /dev/null +++ b/flytectl/pkg/ext/launch_plan_fetcher_test.go @@ -0,0 +1,151 @@ +package ext + +import ( + "context" + "fmt" + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "google.golang.org/protobuf/types/known/timestamppb" +) + +var ( + launchPlanListResponse *admin.LaunchPlanList +) + +func getLaunchPlanFetcherSetup() { + ctx = context.Background() + adminClient = new(mocks.AdminServiceClient) + adminFetcherExt = AdminFetcherExtClient{AdminClient: adminClient} + + parameterMap := map[string]*core.Parameter{ + "numbers": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + }, + }, + "numbers_count": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + "run_local_at_count": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, + }, + }, + }, + }, + }, + }, + }, + }, + } + launchPlan1 := &admin.LaunchPlan{ + Id: &core.Identifier{ + Name: "launchplan1", + Version: "v1", + }, + Spec: &admin.LaunchPlanSpec{ + DefaultInputs: &core.ParameterMap{ + Parameters: parameterMap, + }, + }, + Closure: &admin.LaunchPlanClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 0, Nanos: 0}, + ExpectedInputs: &core.ParameterMap{ + Parameters: parameterMap, + }, + }, + } + launchPlan2 := &admin.LaunchPlan{ + Id: &core.Identifier{ + Name: "launchplan1", + Version: "v2", + }, + Spec: &admin.LaunchPlanSpec{ + DefaultInputs: &core.ParameterMap{ + Parameters: parameterMap, + }, + }, + Closure: &admin.LaunchPlanClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + ExpectedInputs: &core.ParameterMap{ + Parameters: parameterMap, + }, + }, + } + + launchPlans := []*admin.LaunchPlan{launchPlan2, launchPlan1} + + launchPlanListResponse = &admin.LaunchPlanList{ + LaunchPlans: launchPlans, + } +} + +func TestFetchAllVerOfLP(t *testing.T) { + getLaunchPlanFetcherSetup() + adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(launchPlanListResponse, nil) + _, err := adminFetcherExt.FetchAllVerOfLP(ctx, "lpName", "project", "domain") + assert.Nil(t, err) +} + +func TestFetchAllVerOfLPError(t *testing.T) { + getLaunchPlanFetcherSetup() + adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchAllVerOfLP(ctx, "lpName", "project", "domain") + assert.Equal(t, fmt.Errorf("failed"), err) +} + +func TestFetchAllVerOfLPEmptyResponse(t *testing.T) { + launchPlanListResponse := &admin.LaunchPlanList{} + getLaunchPlanFetcherSetup() + adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(launchPlanListResponse, nil) + _, err := adminFetcherExt.FetchAllVerOfLP(ctx, "lpName", "project", "domain") + assert.Equal(t, fmt.Errorf("no launchplans retrieved for lpName"), err) +} + +func TestFetchLPLatestVersion(t *testing.T) { + getLaunchPlanFetcherSetup() + adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(launchPlanListResponse, nil) + _, err := adminFetcherExt.FetchLPLatestVersion(ctx, "lpName", "project", "domain") + assert.Nil(t, err) +} + +func TestFetchLPLatestVersionError(t *testing.T) { + launchPlanListResponse := &admin.LaunchPlanList{} + getLaunchPlanFetcherSetup() + adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(launchPlanListResponse, nil) + _, err := adminFetcherExt.FetchLPLatestVersion(ctx, "lpName", "project", "domain") + assert.Equal(t, fmt.Errorf("no launchplans retrieved for lpName"), err) +} diff --git a/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go b/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go new file mode 100644 index 0000000000..2f55293a80 --- /dev/null +++ b/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go @@ -0,0 +1,116 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + mock "github.com/stretchr/testify/mock" + + service "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" +) + +// AdminDeleterExtInterface is an autogenerated mock type for the AdminDeleterExtInterface type +type AdminDeleterExtInterface struct { + mock.Mock +} + +type AdminDeleterExtInterface_AdminServiceClient struct { + *mock.Call +} + +func (_m AdminDeleterExtInterface_AdminServiceClient) Return(_a0 service.AdminServiceClient) *AdminDeleterExtInterface_AdminServiceClient { + return &AdminDeleterExtInterface_AdminServiceClient{Call: _m.Call.Return(_a0)} +} + +func (_m *AdminDeleterExtInterface) OnAdminServiceClient() *AdminDeleterExtInterface_AdminServiceClient { + c := _m.On("AdminServiceClient") + return &AdminDeleterExtInterface_AdminServiceClient{Call: c} +} + +func (_m *AdminDeleterExtInterface) OnAdminServiceClientMatch(matchers ...interface{}) *AdminDeleterExtInterface_AdminServiceClient { + c := _m.On("AdminServiceClient", matchers...) + return &AdminDeleterExtInterface_AdminServiceClient{Call: c} +} + +// AdminServiceClient provides a mock function with given fields: +func (_m *AdminDeleterExtInterface) AdminServiceClient() service.AdminServiceClient { + ret := _m.Called() + + var r0 service.AdminServiceClient + if rf, ok := ret.Get(0).(func() service.AdminServiceClient); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(service.AdminServiceClient) + } + } + + return r0 +} + +type AdminDeleterExtInterface_DeleteProjectDomainAttributes struct { + *mock.Call +} + +func (_m AdminDeleterExtInterface_DeleteProjectDomainAttributes) Return(_a0 error) *AdminDeleterExtInterface_DeleteProjectDomainAttributes { + return &AdminDeleterExtInterface_DeleteProjectDomainAttributes{Call: _m.Call.Return(_a0)} +} + +func (_m *AdminDeleterExtInterface) OnDeleteProjectDomainAttributes(ctx context.Context, project string, domain string, rsType admin.MatchableResource) *AdminDeleterExtInterface_DeleteProjectDomainAttributes { + c := _m.On("DeleteProjectDomainAttributes", ctx, project, domain, rsType) + return &AdminDeleterExtInterface_DeleteProjectDomainAttributes{Call: c} +} + +func (_m *AdminDeleterExtInterface) OnDeleteProjectDomainAttributesMatch(matchers ...interface{}) *AdminDeleterExtInterface_DeleteProjectDomainAttributes { + c := _m.On("DeleteProjectDomainAttributes", matchers...) + return &AdminDeleterExtInterface_DeleteProjectDomainAttributes{Call: c} +} + +// DeleteProjectDomainAttributes provides a mock function with given fields: ctx, project, domain, rsType +func (_m *AdminDeleterExtInterface) DeleteProjectDomainAttributes(ctx context.Context, project string, domain string, rsType admin.MatchableResource) error { + ret := _m.Called(ctx, project, domain, rsType) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, admin.MatchableResource) error); ok { + r0 = rf(ctx, project, domain, rsType) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type AdminDeleterExtInterface_DeleteWorkflowAttributes struct { + *mock.Call +} + +func (_m AdminDeleterExtInterface_DeleteWorkflowAttributes) Return(_a0 error) *AdminDeleterExtInterface_DeleteWorkflowAttributes { + return &AdminDeleterExtInterface_DeleteWorkflowAttributes{Call: _m.Call.Return(_a0)} +} + +func (_m *AdminDeleterExtInterface) OnDeleteWorkflowAttributes(ctx context.Context, project string, domain string, name string, rsType admin.MatchableResource) *AdminDeleterExtInterface_DeleteWorkflowAttributes { + c := _m.On("DeleteWorkflowAttributes", ctx, project, domain, name, rsType) + return &AdminDeleterExtInterface_DeleteWorkflowAttributes{Call: c} +} + +func (_m *AdminDeleterExtInterface) OnDeleteWorkflowAttributesMatch(matchers ...interface{}) *AdminDeleterExtInterface_DeleteWorkflowAttributes { + c := _m.On("DeleteWorkflowAttributes", matchers...) + return &AdminDeleterExtInterface_DeleteWorkflowAttributes{Call: c} +} + +// DeleteWorkflowAttributes provides a mock function with given fields: ctx, project, domain, name, rsType +func (_m *AdminDeleterExtInterface) DeleteWorkflowAttributes(ctx context.Context, project string, domain string, name string, rsType admin.MatchableResource) error { + ret := _m.Called(ctx, project, domain, name, rsType) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, admin.MatchableResource) error); ok { + r0 = rf(ctx, project, domain, name, rsType) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index 9f8d7512ff..95d3c99c92 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -256,6 +256,47 @@ func (_m *AdminFetcherExtInterface) FetchLPVersion(ctx context.Context, name str return r0, r1 } +type AdminFetcherExtInterface_FetchProjectDomainAttributes struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchProjectDomainAttributes) Return(_a0 *admin.ProjectDomainAttributesGetResponse, _a1 error) *AdminFetcherExtInterface_FetchProjectDomainAttributes { + return &AdminFetcherExtInterface_FetchProjectDomainAttributes{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchProjectDomainAttributes(ctx context.Context, project string, domain string, rsType admin.MatchableResource) *AdminFetcherExtInterface_FetchProjectDomainAttributes { + c := _m.On("FetchProjectDomainAttributes", ctx, project, domain, rsType) + return &AdminFetcherExtInterface_FetchProjectDomainAttributes{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchProjectDomainAttributesMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchProjectDomainAttributes { + c := _m.On("FetchProjectDomainAttributes", matchers...) + return &AdminFetcherExtInterface_FetchProjectDomainAttributes{Call: c} +} + +// FetchProjectDomainAttributes provides a mock function with given fields: ctx, project, domain, rsType +func (_m *AdminFetcherExtInterface) FetchProjectDomainAttributes(ctx context.Context, project string, domain string, rsType admin.MatchableResource) (*admin.ProjectDomainAttributesGetResponse, error) { + ret := _m.Called(ctx, project, domain, rsType) + + var r0 *admin.ProjectDomainAttributesGetResponse + if rf, ok := ret.Get(0).(func(context.Context, string, string, admin.MatchableResource) *admin.ProjectDomainAttributesGetResponse); ok { + r0 = rf(ctx, project, domain, rsType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.ProjectDomainAttributesGetResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, admin.MatchableResource) error); ok { + r1 = rf(ctx, project, domain, rsType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type AdminFetcherExtInterface_FetchTaskLatestVersion struct { *mock.Call } @@ -337,3 +378,44 @@ func (_m *AdminFetcherExtInterface) FetchTaskVersion(ctx context.Context, name s return r0, r1 } + +type AdminFetcherExtInterface_FetchWorkflowAttributes struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchWorkflowAttributes) Return(_a0 *admin.WorkflowAttributesGetResponse, _a1 error) *AdminFetcherExtInterface_FetchWorkflowAttributes { + return &AdminFetcherExtInterface_FetchWorkflowAttributes{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchWorkflowAttributes(ctx context.Context, project string, domain string, name string, rsType admin.MatchableResource) *AdminFetcherExtInterface_FetchWorkflowAttributes { + c := _m.On("FetchWorkflowAttributes", ctx, project, domain, name, rsType) + return &AdminFetcherExtInterface_FetchWorkflowAttributes{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchWorkflowAttributesMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchWorkflowAttributes { + c := _m.On("FetchWorkflowAttributes", matchers...) + return &AdminFetcherExtInterface_FetchWorkflowAttributes{Call: c} +} + +// FetchWorkflowAttributes provides a mock function with given fields: ctx, project, domain, name, rsType +func (_m *AdminFetcherExtInterface) FetchWorkflowAttributes(ctx context.Context, project string, domain string, name string, rsType admin.MatchableResource) (*admin.WorkflowAttributesGetResponse, error) { + ret := _m.Called(ctx, project, domain, name, rsType) + + var r0 *admin.WorkflowAttributesGetResponse + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, admin.MatchableResource) *admin.WorkflowAttributesGetResponse); ok { + r0 = rf(ctx, project, domain, name, rsType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.WorkflowAttributesGetResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, admin.MatchableResource) error); ok { + r1 = rf(ctx, project, domain, name, rsType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go b/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go new file mode 100644 index 0000000000..d944ff5a82 --- /dev/null +++ b/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go @@ -0,0 +1,116 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + mock "github.com/stretchr/testify/mock" + + service "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" +) + +// AdminUpdaterExtInterface is an autogenerated mock type for the AdminUpdaterExtInterface type +type AdminUpdaterExtInterface struct { + mock.Mock +} + +type AdminUpdaterExtInterface_AdminServiceClient struct { + *mock.Call +} + +func (_m AdminUpdaterExtInterface_AdminServiceClient) Return(_a0 service.AdminServiceClient) *AdminUpdaterExtInterface_AdminServiceClient { + return &AdminUpdaterExtInterface_AdminServiceClient{Call: _m.Call.Return(_a0)} +} + +func (_m *AdminUpdaterExtInterface) OnAdminServiceClient() *AdminUpdaterExtInterface_AdminServiceClient { + c := _m.On("AdminServiceClient") + return &AdminUpdaterExtInterface_AdminServiceClient{Call: c} +} + +func (_m *AdminUpdaterExtInterface) OnAdminServiceClientMatch(matchers ...interface{}) *AdminUpdaterExtInterface_AdminServiceClient { + c := _m.On("AdminServiceClient", matchers...) + return &AdminUpdaterExtInterface_AdminServiceClient{Call: c} +} + +// AdminServiceClient provides a mock function with given fields: +func (_m *AdminUpdaterExtInterface) AdminServiceClient() service.AdminServiceClient { + ret := _m.Called() + + var r0 service.AdminServiceClient + if rf, ok := ret.Get(0).(func() service.AdminServiceClient); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(service.AdminServiceClient) + } + } + + return r0 +} + +type AdminUpdaterExtInterface_UpdateProjectDomainAttributes struct { + *mock.Call +} + +func (_m AdminUpdaterExtInterface_UpdateProjectDomainAttributes) Return(_a0 error) *AdminUpdaterExtInterface_UpdateProjectDomainAttributes { + return &AdminUpdaterExtInterface_UpdateProjectDomainAttributes{Call: _m.Call.Return(_a0)} +} + +func (_m *AdminUpdaterExtInterface) OnUpdateProjectDomainAttributes(ctx context.Context, project string, domain string, matchingAttr *admin.MatchingAttributes) *AdminUpdaterExtInterface_UpdateProjectDomainAttributes { + c := _m.On("UpdateProjectDomainAttributes", ctx, project, domain, matchingAttr) + return &AdminUpdaterExtInterface_UpdateProjectDomainAttributes{Call: c} +} + +func (_m *AdminUpdaterExtInterface) OnUpdateProjectDomainAttributesMatch(matchers ...interface{}) *AdminUpdaterExtInterface_UpdateProjectDomainAttributes { + c := _m.On("UpdateProjectDomainAttributes", matchers...) + return &AdminUpdaterExtInterface_UpdateProjectDomainAttributes{Call: c} +} + +// UpdateProjectDomainAttributes provides a mock function with given fields: ctx, project, domain, matchingAttr +func (_m *AdminUpdaterExtInterface) UpdateProjectDomainAttributes(ctx context.Context, project string, domain string, matchingAttr *admin.MatchingAttributes) error { + ret := _m.Called(ctx, project, domain, matchingAttr) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, *admin.MatchingAttributes) error); ok { + r0 = rf(ctx, project, domain, matchingAttr) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type AdminUpdaterExtInterface_UpdateWorkflowAttributes struct { + *mock.Call +} + +func (_m AdminUpdaterExtInterface_UpdateWorkflowAttributes) Return(_a0 error) *AdminUpdaterExtInterface_UpdateWorkflowAttributes { + return &AdminUpdaterExtInterface_UpdateWorkflowAttributes{Call: _m.Call.Return(_a0)} +} + +func (_m *AdminUpdaterExtInterface) OnUpdateWorkflowAttributes(ctx context.Context, project string, domain string, name string, matchingAttr *admin.MatchingAttributes) *AdminUpdaterExtInterface_UpdateWorkflowAttributes { + c := _m.On("UpdateWorkflowAttributes", ctx, project, domain, name, matchingAttr) + return &AdminUpdaterExtInterface_UpdateWorkflowAttributes{Call: c} +} + +func (_m *AdminUpdaterExtInterface) OnUpdateWorkflowAttributesMatch(matchers ...interface{}) *AdminUpdaterExtInterface_UpdateWorkflowAttributes { + c := _m.On("UpdateWorkflowAttributes", matchers...) + return &AdminUpdaterExtInterface_UpdateWorkflowAttributes{Call: c} +} + +// UpdateWorkflowAttributes provides a mock function with given fields: ctx, project, domain, name, matchingAttr +func (_m *AdminUpdaterExtInterface) UpdateWorkflowAttributes(ctx context.Context, project string, domain string, name string, matchingAttr *admin.MatchingAttributes) error { + ret := _m.Called(ctx, project, domain, name, matchingAttr) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, *admin.MatchingAttributes) error); ok { + r0 = rf(ctx, project, domain, name, matchingAttr) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/flytectl/pkg/ext/task_fetcher_test.go b/flytectl/pkg/ext/task_fetcher_test.go new file mode 100644 index 0000000000..7f7476b2c0 --- /dev/null +++ b/flytectl/pkg/ext/task_fetcher_test.go @@ -0,0 +1,125 @@ +package ext + +import ( + "context" + "fmt" + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "google.golang.org/protobuf/types/known/timestamppb" +) + +var ( + adminFetcherExt AdminFetcherExtClient + adminClient *mocks.AdminServiceClient + ctx context.Context + taskListResponse *admin.TaskList +) + +func getTaskFetcherSetup() { + ctx = context.Background() + adminClient = new(mocks.AdminServiceClient) + adminFetcherExt = AdminFetcherExtClient{AdminClient: adminClient} + + sortedListLiteralType := core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + } + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, + } + + task1 := &admin.Task{ + Id: &core.Identifier{ + Name: "task1", + Version: "v1", + }, + Closure: &admin.TaskClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 0, Nanos: 0}, + CompiledTask: &core.CompiledTask{ + Template: &core.TaskTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }, + }, + } + + task2 := &admin.Task{ + Id: &core.Identifier{ + Name: "task1", + Version: "v2", + }, + Closure: &admin.TaskClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + CompiledTask: &core.CompiledTask{ + Template: &core.TaskTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }, + }, + } + + tasks := []*admin.Task{task2, task1} + + taskListResponse = &admin.TaskList{ + Tasks: tasks, + } +} + +func TestFetchAllVerOfTask(t *testing.T) { + getTaskFetcherSetup() + adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(taskListResponse, nil) + _, err := adminFetcherExt.FetchAllVerOfTask(ctx, "taskName", "project", "domain") + assert.Nil(t, err) +} + +func TestFetchAllVerOfTaskError(t *testing.T) { + getTaskFetcherSetup() + adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchAllVerOfTask(ctx, "taskName", "project", "domain") + assert.Equal(t, fmt.Errorf("failed"), err) +} + +func TestFetchAllVerOfTaskEmptyResponse(t *testing.T) { + taskListResponse := &admin.TaskList{} + getTaskFetcherSetup() + adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(taskListResponse, nil) + _, err := adminFetcherExt.FetchAllVerOfTask(ctx, "taskName", "project", "domain") + assert.Equal(t, fmt.Errorf("no tasks retrieved for taskName"), err) +} + +func TestFetchTaskLatestVersion(t *testing.T) { + getTaskFetcherSetup() + adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(taskListResponse, nil) + _, err := adminFetcherExt.FetchTaskLatestVersion(ctx, "taskName", "project", "domain") + assert.Nil(t, err) +} + +func TestFetchTaskLatestVersionError(t *testing.T) { + taskListResponse := &admin.TaskList{} + getTaskFetcherSetup() + adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(taskListResponse, nil) + _, err := adminFetcherExt.FetchTaskLatestVersion(ctx, "taskName", "project", "domain") + assert.Equal(t, fmt.Errorf("no tasks retrieved for taskName"), err) +} diff --git a/flytectl/pkg/ext/updater.go b/flytectl/pkg/ext/updater.go new file mode 100644 index 0000000000..ddf9f5841e --- /dev/null +++ b/flytectl/pkg/ext/updater.go @@ -0,0 +1,33 @@ +package ext + +import ( + "context" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" +) + +//go:generate mockery -all -case=underscore + +// AdminUpdaterExtInterface Interface for exposing the update capabilities from the admin +type AdminUpdaterExtInterface interface { + AdminServiceClient() service.AdminServiceClient + + // UpdateWorkflowAttributes updates workflow attributes within a project, domain for a particular matchable resource + UpdateWorkflowAttributes(ctx context.Context, project, domain, name string, matchingAttr *admin.MatchingAttributes) error + + // UpdateProjectDomainAttributes updates project domain attributes for a particular matchable resource + UpdateProjectDomainAttributes(ctx context.Context, project, domain string, matchingAttr *admin.MatchingAttributes) error +} + +// AdminUpdaterExtClient is used for interacting with extended features used for updating data in admin service +type AdminUpdaterExtClient struct { + AdminClient service.AdminServiceClient +} + +func (a *AdminUpdaterExtClient) AdminServiceClient() service.AdminServiceClient { + if a == nil { + return nil + } + return a.AdminClient +} From 36c1e4f86047bb3a23aacc0c8f817d0c3af42efb Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Wed, 12 May 2021 00:34:00 +0530 Subject: [PATCH 047/645] Added version support to workflow command (#64) Signed-off-by: Ketan Umare --- .../task_resource_attribute_file_config.go | 10 +- .../cmd/config/subcommand/workflow_config.go | 13 ++ .../config/subcommand/workflowconfig_flags.go | 47 ++++++ .../subcommand/workflowconfig_flags_test.go | 146 ++++++++++++++++++ .../matchable_task_resource_attribute.go | 7 +- flytectl/cmd/get/get.go | 2 +- flytectl/cmd/get/launch_plan.go | 13 ++ .../get/matchable_task_resource_attribute.go | 11 +- .../matchable_task_resource_attribute_test.go | 10 +- flytectl/cmd/get/task.go | 12 ++ flytectl/cmd/get/workflow.go | 72 ++++++--- flytectl/cmd/get/workflow_test.go | 65 ++++++++ .../matchable_task_resource_attribute.go | 15 +- ...lytectl_delete_task-resource-attribute.rst | 7 +- .../source/gen/flytectl_get_launchplan.rst | 13 ++ .../flytectl_get_task-resource-attribute.rst | 5 +- .../docs/source/gen/flytectl_get_task.rst | 12 ++ .../docs/source/gen/flytectl_get_workflow.rst | 24 ++- ...lytectl_update_task-resource-attribute.rst | 15 +- flytectl/pkg/ext/fetcher.go | 9 ++ .../ext/mocks/admin_fetcher_ext_interface.go | 123 +++++++++++++++ flytectl/pkg/ext/workflow_fetcher.go | 60 +++++++ flytectl/pkg/ext/workflow_fetcher_test.go | 120 ++++++++++++++ 23 files changed, 749 insertions(+), 62 deletions(-) create mode 100644 flytectl/cmd/config/subcommand/workflow_config.go create mode 100755 flytectl/cmd/config/subcommand/workflowconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/workflowconfig_flags_test.go create mode 100644 flytectl/cmd/get/workflow_test.go create mode 100644 flytectl/pkg/ext/workflow_fetcher.go create mode 100644 flytectl/pkg/ext/workflow_fetcher_test.go diff --git a/flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go b/flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go index d0c0a0656c..62fa2f7e3f 100644 --- a/flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go +++ b/flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go @@ -18,9 +18,9 @@ import ( // The shadow config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. // As the same structure is being used for both ProjectDomainAttribute/Workflowattribute type TaskResourceAttrFileConfig struct { - Project string `json:"project"` - Domain string `json:"domain"` - Workflow string `json:"workflow,omitempty"` + Project string + Domain string + Workflow string *admin.TaskResourceAttributes } @@ -28,7 +28,7 @@ type TaskResourceAttrFileConfig struct { func (t TaskResourceAttrFileConfig) WriteConfigToFile(fileName string) error { d, err := yaml.Marshal(t) if err != nil { - return fmt.Errorf("error: %v", err) + fmt.Printf("error: %v", err) } if _, err = os.Stat(fileName); err == nil { if !cmdUtil.AskForConfirmation(fmt.Sprintf("warning file %v will be overwritten", fileName)) { @@ -79,7 +79,7 @@ func (t TaskResourceAttrFileConfig) DumpTaskResourceAttr(ctx context.Context, fi logger.Warnf(ctx, "error dumping in file due to %v", err) return } - fmt.Printf("wrote the config to file %v", fileName) + fmt.Printf("written the config to file %v", fileName) } else { fmt.Printf("%v", t) } diff --git a/flytectl/cmd/config/subcommand/workflow_config.go b/flytectl/cmd/config/subcommand/workflow_config.go new file mode 100644 index 0000000000..b3c6452a62 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflow_config.go @@ -0,0 +1,13 @@ +package subcommand + +//go:generate pflags WorkflowConfig --default-var DefaultWorklfowConfig + +var ( + DefaultWorklfowConfig = &WorkflowConfig{} +) + +// WorkflowConfig commandline configuration +type WorkflowConfig struct { + Version string `json:"version" pflag:",version of the workflow to be fetched."` + Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` +} diff --git a/flytectl/cmd/config/subcommand/workflowconfig_flags.go b/flytectl/cmd/config/subcommand/workflowconfig_flags.go new file mode 100755 index 0000000000..cc5a1743d4 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowconfig_flags.go @@ -0,0 +1,47 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package subcommand + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (WorkflowConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (WorkflowConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in WorkflowConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg WorkflowConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("WorkflowConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultWorklfowConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), DefaultWorklfowConfig.Version, "version of the workflow to be fetched.") + cmdFlags.BoolVar(&(DefaultWorklfowConfig.Latest),fmt.Sprintf("%v%v", prefix, "latest"), DefaultWorklfowConfig.Latest, " flag to indicate to fetch the latest version, version flag will be ignored in this case") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/workflowconfig_flags_test.go b/flytectl/cmd/config/subcommand/workflowconfig_flags_test.go new file mode 100755 index 0000000000..105f884def --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowconfig_flags_test.go @@ -0,0 +1,146 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package subcommand + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsWorkflowConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementWorkflowConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsWorkflowConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookWorkflowConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementWorkflowConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_WorkflowConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookWorkflowConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_WorkflowConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_WorkflowConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_WorkflowConfig(val, result)) +} + +func testDecodeSlice_WorkflowConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_WorkflowConfig(vStringSlice, result)) +} + +func TestWorkflowConfig_GetPFlagSet(t *testing.T) { + val := WorkflowConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestWorkflowConfig_SetFlags(t *testing.T) { + actual := WorkflowConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_version", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("version"); err == nil { + assert.Equal(t, string(DefaultWorklfowConfig.Version), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("version", testValue) + if vString, err := cmdFlags.GetString("version"); err == nil { + testDecodeJson_WorkflowConfig(t, fmt.Sprintf("%v", vString), &actual.Version) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_latest", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vBool, err := cmdFlags.GetBool("latest"); err == nil { + assert.Equal(t, bool(DefaultWorklfowConfig.Latest), vBool) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("latest", testValue) + if vBool, err := cmdFlags.GetBool("latest"); err == nil { + testDecodeJson_WorkflowConfig(t, fmt.Sprintf("%v", vBool), &actual.Latest) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute.go b/flytectl/cmd/delete/matchable_task_resource_attribute.go index 57791d033d..00e8e51148 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute.go @@ -22,7 +22,7 @@ Here the command delete task resource attributes for project flytectldemo and d flytectl delete task-resource-attribute -p flytectldemo -d development -Deleting task resource attribute using config file which was used for creating it. +Deleting task resource attribute using config file Here the command deletes task resource attributes from the config file tra.yaml eg: content of tra.yaml which will use the project domain and workflow name for deleting the resource @@ -33,8 +33,9 @@ eg: content of tra.yaml which will use the project domain and workflow name for .. code-block:: yaml - domain: development - project: flytectldemo + Domain: development + Project: flytectldemo + Workflow: "" defaults: cpu: "1" memory: 150Mi diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index 0b7bd5da93..f5b414013f 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -33,7 +33,7 @@ func CreateGetCommand() *cobra.Command { "task": {CmdFunc: getTaskFunc, Aliases: []string{"tasks"}, Short: taskShort, Long: taskLong, PFlagProvider: taskConfig}, "workflow": {CmdFunc: getWorkflowFunc, Aliases: []string{"workflows"}, Short: workflowShort, - Long: workflowLong}, + Long: workflowLong, PFlagProvider: subcommand.DefaultWorklfowConfig}, "launchplan": {CmdFunc: getLaunchPlanFunc, Aliases: []string{"launchplans"}, Short: launchPlanShort, Long: launchPlanLong, PFlagProvider: launchPlanConfig}, "execution": {CmdFunc: getExecutionFunc, Aliases: []string{"executions"}, Short: executionShort, diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index e98029483c..22ff6660fe 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -28,6 +28,19 @@ Retrieves launch plan by name within project and domain. flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet + +Retrieves latest version of task by name within project and domain. + +:: + + flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --latest + +Retrieves particular version of launchplan by name within project and domain. + +:: + + flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --version v2 + Retrieves launchplan by filters. :: diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go index 09e8b5df99..bfa68d6edc 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -38,8 +38,9 @@ eg: content of tra.yaml .. code-block:: yaml - domain: development - project: flytectldemo + Domain: development + Project: flytectldemo + Workflow: "" defaults: cpu: "1" memory: 150Mi @@ -72,10 +73,11 @@ func getTaskResourceAttributes(ctx context.Context, args []string, cmdCtx cmdCor workflowAttr, err := cmdCtx.AdminFetcherExt().FetchWorkflowAttributes(ctx, project, domain, workflowName, admin.MatchableResource_TASK_RESOURCE) if err != nil { + taskResourceAttrFileConfig.DumpTaskResourceAttr(ctx, fileName) return err } if workflowAttr.GetAttributes() == nil || workflowAttr.GetAttributes().GetMatchingAttributes() == nil { - return fmt.Errorf("attribute doesn't exist") + return fmt.Errorf("invalid matching attribute returned with nil data") } // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. taskResourceAttrFileConfig.TaskResourceAttributes = workflowAttr.GetAttributes().GetMatchingAttributes().GetTaskResourceAttributes() @@ -84,10 +86,11 @@ func getTaskResourceAttributes(ctx context.Context, args []string, cmdCtx cmdCor projectDomainAttr, err := cmdCtx.AdminFetcherExt().FetchProjectDomainAttributes(ctx, project, domain, admin.MatchableResource_TASK_RESOURCE) if err != nil { + taskResourceAttrFileConfig.DumpTaskResourceAttr(ctx, fileName) return err } if projectDomainAttr.GetAttributes() == nil || projectDomainAttr.GetAttributes().GetMatchingAttributes() == nil { - return fmt.Errorf("attribute doesn't exist") + return fmt.Errorf("invalid matching attribute returned with nil data") } // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. taskResourceAttrFileConfig.TaskResourceAttributes = projectDomainAttr.GetAttributes().GetMatchingAttributes().GetTaskResourceAttributes() diff --git a/flytectl/cmd/get/matchable_task_resource_attribute_test.go b/flytectl/cmd/get/matchable_task_resource_attribute_test.go index 00f3efad26..22d82df983 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute_test.go @@ -68,7 +68,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { assert.Nil(t, err) u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) + tearDownAndVerify(t, `{"Project":"dummyProject","Domain":"dummyDomain","Workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { var args []string @@ -82,7 +82,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { assert.Nil(t, err) u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `wrote the config to file temp-output-file`) + tearDownAndVerify(t, `written the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { var args []string @@ -110,7 +110,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { assert.Equal(t, fmt.Errorf("failed to fetch response"), err) u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `{"Project":"dummyProject","Domain":"dummyDomain","Workflow":""}`) }) t.Run("successful get workflow attribute", func(t *testing.T) { var args []string @@ -124,7 +124,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) + tearDownAndVerify(t, `{"Project":"dummyProject","Domain":"dummyDomain","Workflow":"workflow","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { var args []string @@ -139,6 +139,6 @@ func TestGetTaskResourceAttributes(t *testing.T) { u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `{"Project":"dummyProject","Domain":"dummyDomain","Workflow":"workflow"}`) }) } diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 7be143d232..eb40e9cb23 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -28,6 +28,18 @@ Retrieves task by name within project and domain. bin/flytectl task -p flytesnacks -d development core.basic.lp.greet +Retrieves latest version of task by name within project and domain. + +:: + + flytectl get task -p flytesnacks -d development core.basic.lp.greet --latest + +Retrieves particular version of task by name within project and domain. + +:: + + flytectl get workflow -p flytesnacks -d development core.basic.lp.greet --version v2 + Retrieves project by filters. :: diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 2736fe9b11..3640a5f342 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -3,6 +3,8 @@ package get import ( "context" + "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" @@ -20,13 +22,25 @@ const ( Retrieves all the workflows within project and domain.(workflow,workflows can be used interchangeably in these commands) :: - bin/flytectl get workflow -p flytesnacks -d development + flytectl get workflow -p flytesnacks -d development Retrieves workflow by name within project and domain. :: - bin/flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet + flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet + +Retrieves latest version of workflow by name within project and domain. + +:: + + flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet --latest + +Retrieves particular version of workflow by name within project and domain. + +:: + + flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet --version v2 Retrieves workflow by filters. :: @@ -37,13 +51,13 @@ Retrieves all the workflow within project and domain in yaml format. :: - bin/flytectl get workflow -p flytesnacks -d development -o yaml + flytectl get workflow -p flytesnacks -d development -o yaml Retrieves all the workflow within project and domain in json format. :: - bin/flytectl get workflow -p flytesnacks -d development -o json + flytectl get workflow -p flytesnacks -d development -o json Usage ` @@ -66,25 +80,18 @@ func WorkflowToProtoMessages(l []*admin.Workflow) []proto.Message { func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { adminPrinter := printer.Printer{} if len(args) > 0 { - workflows, err := cmdCtx.AdminClient().ListWorkflows(ctx, &admin.ResourceListRequest{ - Id: &admin.NamedEntityIdentifier{ - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - Name: args[0], - }, - // TODO Sorting and limits should be parameters - SortBy: &admin.Sort{ - Key: "created_at", - Direction: admin.Sort_DESCENDING, - }, - Limit: 100, - }) + name := args[0] + var workflows []*admin.Workflow + var err error + if workflows, err = FetchWorkflowForName(ctx, cmdCtx.AdminFetcherExt(), name, config.GetConfig().Project, config.GetConfig().Domain); err != nil { + return err + } + logger.Debugf(ctx, "Retrieved %v workflow", len(workflows)) + err = adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows)...) if err != nil { return err } - logger.Debugf(ctx, "Retrieved %v workflows", len(workflows.Workflows)) - - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows.Workflows)...) + return nil } workflows, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListWorkflowIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) @@ -94,3 +101,28 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC logger.Debugf(ctx, "Retrieved %v workflows", len(workflows)) return adminPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, adminutils.NamedEntityToProtoMessage(workflows)...) } + +// FetchWorkflowForName fetches the workflow give it name. +func FetchWorkflowForName(ctx context.Context, fetcher ext.AdminFetcherExtInterface, name, project, + domain string) ([]*admin.Workflow, error) { + var workflows []*admin.Workflow + var workflow *admin.Workflow + var err error + if subcommand.DefaultWorklfowConfig.Latest { + if workflow, err = fetcher.FetchWorkflowLatestVersion(ctx, name, project, domain); err != nil { + return nil, err + } + workflows = append(workflows, workflow) + } else if subcommand.DefaultWorklfowConfig.Version != "" { + if workflow, err = fetcher.FetchWorkflowVersion(ctx, name, subcommand.DefaultWorklfowConfig.Version, project, domain); err != nil { + return nil, err + } + workflows = append(workflows, workflow) + } else { + workflows, err = fetcher.FetchAllVerOfWorkflow(ctx, name, project, domain) + if err != nil { + return nil, err + } + } + return workflows, nil +} diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go new file mode 100644 index 0000000000..93928eebc4 --- /dev/null +++ b/flytectl/cmd/get/workflow_test.go @@ -0,0 +1,65 @@ +package get + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config/subcommand" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func getWorkflowSetup() { + ctx = u.Ctx + mockClient = u.MockClient + cmdCtx = u.CmdCtx + subcommand.DefaultWorklfowConfig.Latest = false + subcommand.DefaultWorklfowConfig.Version = "" +} + +func TestGetWorkflowFuncWithError(t *testing.T) { + t.Run("failure fetch latest", func(t *testing.T) { + setup() + getWorkflowSetup() + mockFetcher := new(mocks.AdminFetcherExtInterface) + subcommand.DefaultWorklfowConfig.Latest = true + mockFetcher.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) + _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) + assert.NotNil(t, err) + }) + + t.Run("failure fetching version ", func(t *testing.T) { + setup() + getWorkflowSetup() + mockFetcher := new(mocks.AdminFetcherExtInterface) + subcommand.DefaultWorklfowConfig.Version = "v1" + mockFetcher.OnFetchWorkflowVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("error fetching version")) + _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) + assert.NotNil(t, err) + }) + + t.Run("failure fetching all version ", func(t *testing.T) { + setup() + getWorkflowSetup() + mockFetcher := new(mocks.AdminFetcherExtInterface) + mockFetcher.OnFetchAllVerOfWorkflowMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) + _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) + assert.NotNil(t, err) + }) + + t.Run("failure fetching ", func(t *testing.T) { + setup() + getWorkflowSetup() + subcommand.DefaultWorklfowConfig.Latest = true + args := []string{"workflowName"} + u.FetcherExt.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) + err = getWorkflowFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + }) +} diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go index 239a81d736..598eb98531 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -12,7 +12,7 @@ import ( const ( taskResourceAttributesShort = "Updates matchable resources of task attributes" taskResourceAttributesLong = ` -Updates task resource attributes for given project and domain combination or additionally with workflow name. +Updates task resource attributes for given project,domain combination or additionally with workflow name. Updating the task resource attribute is only available from a generated file. See the get section for generating this file. Here the command updates takes the input for task resource attributes from the config file tra.yaml @@ -20,8 +20,9 @@ eg: content of tra.yaml .. code-block:: yaml - domain: development - project: flytectldemo + Domain: development + Project: flytectldemo + Workflow: "" defaults: cpu: "1" memory: 150Mi @@ -33,14 +34,14 @@ eg: content of tra.yaml flytectl update task-resource-attribute -attrFile tra.yaml -Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other +Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain .. code-block:: yaml - domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + Domain: development + Project: flytectldemo + Workflow: core.control_flow.run_merge_sort.merge_sort defaults: cpu: "1" memory: 150Mi diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 4f19d5b32c..da97151fef 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -19,7 +19,7 @@ Here the command delete task resource attributes for project flytectldemo and d flytectl delete task-resource-attribute -p flytectldemo -d development -Deleting task resource attribute using config file which was used for creating it. +Deleting task resource attribute using config file Here the command deletes task resource attributes from the config file tra.yaml eg: content of tra.yaml which will use the project domain and workflow name for deleting the resource @@ -30,8 +30,9 @@ eg: content of tra.yaml which will use the project domain and workflow name for .. code-block:: yaml - domain: development - project: flytectldemo + Domain: development + Project: flytectldemo + Workflow: "" defaults: cpu: "1" memory: 150Mi diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 2f97de100f..fa45e3f85f 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -21,6 +21,19 @@ Retrieves launch plan by name within project and domain. flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet + +Retrieves latest version of task by name within project and domain. + +:: + + flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --latest + +Retrieves particular version of launchplan by name within project and domain. + +:: + + flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --version v2 + Retrieves launchplan by filters. :: diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 05046e2469..ea2356a8ca 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -35,8 +35,9 @@ eg: content of tra.yaml .. code-block:: yaml - domain: development - project: flytectldemo + Domain: development + Project: flytectldemo + Workflow: "" defaults: cpu: "1" memory: 150Mi diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 8a770670f9..494ee1b7a1 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -21,6 +21,18 @@ Retrieves task by name within project and domain. bin/flytectl task -p flytesnacks -d development core.basic.lp.greet +Retrieves latest version of task by name within project and domain. + +:: + + flytectl get task -p flytesnacks -d development core.basic.lp.greet --latest + +Retrieves particular version of task by name within project and domain. + +:: + + flytectl get workflow -p flytesnacks -d development core.basic.lp.greet --version v2 + Retrieves project by filters. :: diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 9a2288c75f..89e4c688db 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -13,13 +13,25 @@ Synopsis Retrieves all the workflows within project and domain.(workflow,workflows can be used interchangeably in these commands) :: - bin/flytectl get workflow -p flytesnacks -d development + flytectl get workflow -p flytesnacks -d development Retrieves workflow by name within project and domain. :: - bin/flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet + flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet + +Retrieves latest version of workflow by name within project and domain. + +:: + + flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet --latest + +Retrieves particular version of workflow by name within project and domain. + +:: + + flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet --version v2 Retrieves workflow by filters. :: @@ -30,13 +42,13 @@ Retrieves all the workflow within project and domain in yaml format. :: - bin/flytectl get workflow -p flytesnacks -d development -o yaml + flytectl get workflow -p flytesnacks -d development -o yaml Retrieves all the workflow within project and domain in json format. :: - bin/flytectl get workflow -p flytesnacks -d development -o json + flytectl get workflow -p flytesnacks -d development -o json Usage @@ -50,7 +62,9 @@ Options :: - -h, --help help for workflow + -h, --help help for workflow + --latest flag to indicate to fetch the latest version, version flag will be ignored in this case + --version string version of the workflow to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index a0aef81d04..6f60b7d50d 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -10,7 +10,7 @@ Synopsis -Updates task resource attributes for given project and domain combination or additionally with workflow name. +Updates task resource attributes for given project,domain combination or additionally with workflow name. Updating the task resource attribute is only available from a generated file. See the get section for generating this file. Here the command updates takes the input for task resource attributes from the config file tra.yaml @@ -18,8 +18,9 @@ eg: content of tra.yaml .. code-block:: yaml - domain: development - project: flytectldemo + Domain: development + Project: flytectldemo + Workflow: "" defaults: cpu: "1" memory: 150Mi @@ -31,14 +32,14 @@ eg: content of tra.yaml flytectl update task-resource-attribute -attrFile tra.yaml -Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other +Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain .. code-block:: yaml - domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + Domain: development + Project: flytectldemo + Workflow: core.control_flow.run_merge_sort.merge_sort defaults: cpu: "1" memory: 150Mi diff --git a/flytectl/pkg/ext/fetcher.go b/flytectl/pkg/ext/fetcher.go index d32421156b..8601ec7e71 100644 --- a/flytectl/pkg/ext/fetcher.go +++ b/flytectl/pkg/ext/fetcher.go @@ -35,6 +35,15 @@ type AdminFetcherExtInterface interface { // FetchTaskVersion fetches particular version of task in a project, domain FetchTaskVersion(ctx context.Context, name, version, project, domain string) (*admin.Task, error) + // FetchAllVerOfWorkflow fetches all versions of task in a project, domain + FetchAllVerOfWorkflow(ctx context.Context, name, project, domain string) ([]*admin.Workflow, error) + + // FetchWorkflowLatestVersion fetches latest version of workflow in a project, domain + FetchWorkflowLatestVersion(ctx context.Context, name, project, domain string) (*admin.Workflow, error) + + // FetchWorkflowVersion fetches particular version of workflow in a project, domain + FetchWorkflowVersion(ctx context.Context, name, version, project, domain string) (*admin.Workflow, error) + // FetchWorkflowAttributes fetches workflow attributes particular resource type in a project, domain and workflow FetchWorkflowAttributes(ctx context.Context, project, domain, name string, rsType admin.MatchableResource) (*admin.WorkflowAttributesGetResponse, error) diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index 95d3c99c92..902121ef88 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -133,6 +133,47 @@ func (_m *AdminFetcherExtInterface) FetchAllVerOfTask(ctx context.Context, name return r0, r1 } +type AdminFetcherExtInterface_FetchAllVerOfWorkflow struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchAllVerOfWorkflow) Return(_a0 []*admin.Workflow, _a1 error) *AdminFetcherExtInterface_FetchAllVerOfWorkflow { + return &AdminFetcherExtInterface_FetchAllVerOfWorkflow{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchAllVerOfWorkflow(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchAllVerOfWorkflow { + c := _m.On("FetchAllVerOfWorkflow", ctx, name, project, domain) + return &AdminFetcherExtInterface_FetchAllVerOfWorkflow{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchAllVerOfWorkflowMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchAllVerOfWorkflow { + c := _m.On("FetchAllVerOfWorkflow", matchers...) + return &AdminFetcherExtInterface_FetchAllVerOfWorkflow{Call: c} +} + +// FetchAllVerOfWorkflow provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminFetcherExtInterface) FetchAllVerOfWorkflow(ctx context.Context, name string, project string, domain string) ([]*admin.Workflow, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 []*admin.Workflow + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) []*admin.Workflow); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*admin.Workflow) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type AdminFetcherExtInterface_FetchExecution struct { *mock.Call } @@ -419,3 +460,85 @@ func (_m *AdminFetcherExtInterface) FetchWorkflowAttributes(ctx context.Context, return r0, r1 } + +type AdminFetcherExtInterface_FetchWorkflowLatestVersion struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchWorkflowLatestVersion) Return(_a0 *admin.Workflow, _a1 error) *AdminFetcherExtInterface_FetchWorkflowLatestVersion { + return &AdminFetcherExtInterface_FetchWorkflowLatestVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchWorkflowLatestVersion(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchWorkflowLatestVersion { + c := _m.On("FetchWorkflowLatestVersion", ctx, name, project, domain) + return &AdminFetcherExtInterface_FetchWorkflowLatestVersion{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchWorkflowLatestVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchWorkflowLatestVersion { + c := _m.On("FetchWorkflowLatestVersion", matchers...) + return &AdminFetcherExtInterface_FetchWorkflowLatestVersion{Call: c} +} + +// FetchWorkflowLatestVersion provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminFetcherExtInterface) FetchWorkflowLatestVersion(ctx context.Context, name string, project string, domain string) (*admin.Workflow, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 *admin.Workflow + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.Workflow); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Workflow) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminFetcherExtInterface_FetchWorkflowVersion struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchWorkflowVersion) Return(_a0 *admin.Workflow, _a1 error) *AdminFetcherExtInterface_FetchWorkflowVersion { + return &AdminFetcherExtInterface_FetchWorkflowVersion{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchWorkflowVersion(ctx context.Context, name string, version string, project string, domain string) *AdminFetcherExtInterface_FetchWorkflowVersion { + c := _m.On("FetchWorkflowVersion", ctx, name, version, project, domain) + return &AdminFetcherExtInterface_FetchWorkflowVersion{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchWorkflowVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchWorkflowVersion { + c := _m.On("FetchWorkflowVersion", matchers...) + return &AdminFetcherExtInterface_FetchWorkflowVersion{Call: c} +} + +// FetchWorkflowVersion provides a mock function with given fields: ctx, name, version, project, domain +func (_m *AdminFetcherExtInterface) FetchWorkflowVersion(ctx context.Context, name string, version string, project string, domain string) (*admin.Workflow, error) { + ret := _m.Called(ctx, name, version, project, domain) + + var r0 *admin.Workflow + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) *admin.Workflow); ok { + r0 = rf(ctx, name, version, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Workflow) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { + r1 = rf(ctx, name, version, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/flytectl/pkg/ext/workflow_fetcher.go b/flytectl/pkg/ext/workflow_fetcher.go new file mode 100644 index 0000000000..3abcb04fab --- /dev/null +++ b/flytectl/pkg/ext/workflow_fetcher.go @@ -0,0 +1,60 @@ +package ext + +import ( + "context" + "fmt" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +// FetchAllVerOfWorkflow fetches all the versions for give workflow name +func (a *AdminFetcherExtClient) FetchAllVerOfWorkflow(ctx context.Context, workflowName, project, domain string) ([]*admin.Workflow, error) { + wList, err := a.AdminServiceClient().ListWorkflows(ctx, &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + Name: workflowName, + }, + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + Limit: 100, + }) + if err != nil { + return nil, err + } + if len(wList.Workflows) == 0 { + return nil, fmt.Errorf("no workflow retrieved for %v", workflowName) + } + return wList.Workflows, nil +} + +// FetchWorkflowLatestVersion fetches latest version for given workflow name +func (a *AdminFetcherExtClient) FetchWorkflowLatestVersion(ctx context.Context, name, project, domain string) (*admin.Workflow, error) { + // Fetch the latest version of the workflow. + wVersions, err := a.FetchAllVerOfWorkflow(ctx, name, project, domain) + if err != nil { + return nil, err + } + w := wVersions[0] + return w, nil +} + +// FetchWorkflowVersion fetches particular version of workflow +func (a *AdminFetcherExtClient) FetchWorkflowVersion(ctx context.Context, name, version, project, domain string) (*admin.Workflow, error) { + lp, err := a.AdminServiceClient().GetWorkflow(ctx, &admin.ObjectGetRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_WORKFLOW, + Project: project, + Domain: domain, + Name: name, + Version: version, + }, + }) + if err != nil { + return nil, err + } + return lp, nil +} diff --git a/flytectl/pkg/ext/workflow_fetcher_test.go b/flytectl/pkg/ext/workflow_fetcher_test.go new file mode 100644 index 0000000000..91c6818c72 --- /dev/null +++ b/flytectl/pkg/ext/workflow_fetcher_test.go @@ -0,0 +1,120 @@ +package ext + +import ( + "context" + "fmt" + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "google.golang.org/protobuf/types/known/timestamppb" +) + +var ( + workflowListResponse *admin.WorkflowList +) + +func getWorkflowFetcherSetup() { + ctx = context.Background() + adminClient = new(mocks.AdminServiceClient) + adminFetcherExt = AdminFetcherExtClient{AdminClient: adminClient} + + sortedListLiteralType := core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + } + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, + } + + var compiledTasks []*core.CompiledTask + compiledTasks = append(compiledTasks, &core.CompiledTask{ + Template: &core.TaskTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }) + + workflow1 := &admin.Workflow{ + Id: &core.Identifier{ + Name: "task1", + Version: "v1", + }, + Closure: &admin.WorkflowClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + CompiledWorkflow: &core.CompiledWorkflowClosure{ + Tasks: compiledTasks, + }, + }, + } + workflow2 := &admin.Workflow{ + Id: &core.Identifier{ + Name: "workflow", + Version: "v2", + }, + Closure: &admin.WorkflowClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + CompiledWorkflow: &core.CompiledWorkflowClosure{ + Tasks: compiledTasks, + }, + }, + } + + workflows := []*admin.Workflow{workflow2, workflow1} + + workflowListResponse = &admin.WorkflowList{ + Workflows: workflows, + } +} + +func TestFetchAllVerOfWorkflow(t *testing.T) { + getWorkflowFetcherSetup() + adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) + _, err := adminFetcherExt.FetchAllVerOfWorkflow(ctx, "workflowName", "project", "domain") + assert.Nil(t, err) +} + +func TestFetchAllVerOfWorkflowError(t *testing.T) { + getWorkflowFetcherSetup() + adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchAllVerOfWorkflow(ctx, "workflowName", "project", "domain") + assert.Equal(t, fmt.Errorf("failed"), err) +} + +func TestFetchAllVerOfWorkflowEmptyResponse(t *testing.T) { + workflowListResponse := &admin.WorkflowList{} + getWorkflowFetcherSetup() + adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) + _, err := adminFetcherExt.FetchAllVerOfWorkflow(ctx, "workflowName", "project", "domain") + assert.Equal(t, fmt.Errorf("no workflow retrieved for workflowName"), err) +} + +func TestFetchWorkflowLatestVersion(t *testing.T) { + getWorkflowFetcherSetup() + adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) + _, err := adminFetcherExt.FetchWorkflowLatestVersion(ctx, "workflowName", "project", "domain") + assert.Nil(t, err) +} + +func TestFetchWorkflowLatestVersionError(t *testing.T) { + workflowListResponse := &admin.WorkflowList{} + getWorkflowFetcherSetup() + adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) + _, err := adminFetcherExt.FetchWorkflowLatestVersion(ctx, "workflowName", "project", "domain") + assert.Equal(t, fmt.Errorf("no workflow retrieved for workflowName"), err) +} From 34d76146a459a194d229784ee6a33139d4de518d Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Thu, 13 May 2021 10:26:44 +0530 Subject: [PATCH 048/645] Added cluster resource attribute support (#65) * Adding commands for task resource attributes support Signed-off-by: Prafulla Mahindrakar * Added cluster resource attribute support Signed-off-by: Prafulla Mahindrakar * Fixed update command to use cluster default config Signed-off-by: Prafulla Mahindrakar --- .../attrdeleteconfig_flags.go} | 14 +- .../attrdeleteconfig_flags_test.go} | 38 ++--- .../attrfetchconfig_flags.go} | 14 +- .../attrfetchconfig_flags_test.go} | 38 ++--- .../attrupdateconfig_flags.go} | 14 +- .../attrupdateconfig_flags_test.go} | 38 ++--- .../clusterresourceattribute/delete_config.go | 10 ++ .../clusterresourceattribute/fetch_config.go | 9 ++ .../clusterresourceattribute/file_config.go | 47 ++++++ .../file_config_test.go | 46 ++++++ .../clusterresourceattribute/update_config.go | 10 ++ .../matchable_attr_file_config_utils.go | 60 ++++++++ .../matchable_attribute_decorator.go | 13 ++ .../project_domain_workflow_getter.go | 40 +++++ .../task_resource_attribute_delete_config.go | 10 -- .../task_resource_attribute_fetch_config.go | 9 -- .../task_resource_attribute_file_config.go | 86 ----------- .../task_resource_attribute_update_config.go | 10 -- .../attrdeleteconfig_flags.go | 46 ++++++ .../attrdeleteconfig_flags_test.go | 124 ++++++++++++++++ .../attrfetchconfig_flags.go} | 15 +- .../attrfetchconfig_flags_test.go | 124 ++++++++++++++++ .../attrupdateconfig_flags.go | 46 ++++++ .../attrupdateconfig_flags_test.go | 124 ++++++++++++++++ .../taskresourceattribute/delete_config.go | 10 ++ .../taskresourceattribute/fetch_config.go | 9 ++ .../taskresourceattribute/file_config.go | 47 ++++++ .../taskresourceattribute/file_config_test.go | 53 +++++++ .../taskresourceattribute/update_config.go | 10 ++ .../subcommand/workflow/config_flags.go | 47 ++++++ .../config_flags_test.go} | 42 +++--- .../{ => workflow}/workflow_config.go | 10 +- flytectl/cmd/delete/delete.go | 8 +- flytectl/cmd/delete/delete_test.go | 20 +-- .../cmd/delete/matchable_attribute_util.go | 29 ++++ .../matchable_cluster_resource_attribute.go | 79 ++++++++++ ...tchable_cluster_resource_attribute_test.go | 134 +++++++++++++++++ .../matchable_task_resource_attribute.go | 70 ++++----- .../matchable_task_resource_attribute_test.go | 19 +-- ..._attribute.yaml => invalid_attribute.yaml} | 0 ...alid_project_domain_cluster_attribute.yaml | 5 + .../valid_project_domain_task_attribute.yaml | 5 +- .../valid_workflow_cluster_attribute.yaml | 6 + .../valid_workflow_task_attribute.yaml | 6 +- flytectl/cmd/get/get.go | 11 +- flytectl/cmd/get/get_test.go | 35 ++--- flytectl/cmd/get/matchable_attribute_util.go | 32 ++++ .../matchable_cluster_resource_attribute.go | 78 ++++++++++ ...tchable_cluster_resource_attribute_test.go | 138 ++++++++++++++++++ .../get/matchable_task_resource_attribute.go | 58 +++----- .../matchable_task_resource_attribute_test.go | 23 +-- flytectl/cmd/get/workflow.go | 8 +- flytectl/cmd/get/workflow_test.go | 12 +- .../cmd/update/matchable_attribute_util.go | 30 ++++ .../matchable_cluster_resource_attribute.go | 76 ++++++++++ ...tchable_cluster_resource_attribute_test.go | 94 ++++++++++++ .../matchable_task_resource_attribute.go | 62 +++----- .../matchable_task_resource_attribute_test.go | 16 +- ..._attribute.yaml => invalid_attribute.yaml} | 0 ...alid_project_domain_cluster_attribute.yaml | 5 + .../valid_project_domain_task_attribute.yaml | 5 +- .../valid_workflow_cluster_attribute.yaml | 6 + .../valid_workflow_task_attribute.yaml | 6 +- flytectl/cmd/update/update.go | 8 +- flytectl/cmd/update/update_test.go | 13 +- flytectl/docs/source/gen/flytectl_delete.rst | 1 + ...ectl_delete_cluster-resource-attribute.rst | 109 ++++++++++++++ ...lytectl_delete_task-resource-attribute.rst | 15 +- flytectl/docs/source/gen/flytectl_get.rst | 1 + ...lytectl_get_cluster-resource-attribute.rst | 107 ++++++++++++++ .../flytectl_get_task-resource-attribute.rst | 13 +- flytectl/docs/source/gen/flytectl_update.rst | 1 + ...ectl_update_cluster-resource-attribute.rst | 111 ++++++++++++++ ...lytectl_update_task-resource-attribute.rst | 31 ++-- flytectl/docs/source/nouns.rst | 11 ++ flytectl/pkg/ext/attribute_match_fetcher.go | 17 ++- .../pkg/ext/attribute_match_fetcher_test.go | 56 +++++-- 77 files changed, 2300 insertions(+), 483 deletions(-) rename flytectl/cmd/config/subcommand/{taskresourceattrdeleteconfig_flags.go => clusterresourceattribute/attrdeleteconfig_flags.go} (55%) rename flytectl/cmd/config/subcommand/{taskresourceattrfetchconfig_flags_test.go => clusterresourceattribute/attrdeleteconfig_flags_test.go} (64%) rename flytectl/cmd/config/subcommand/{taskresourceattrfetchconfig_flags.go => clusterresourceattribute/attrfetchconfig_flags.go} (55%) rename flytectl/cmd/config/subcommand/{taskresourceattrdeleteconfig_flags_test.go => clusterresourceattribute/attrfetchconfig_flags_test.go} (63%) rename flytectl/cmd/config/subcommand/{taskresourceattrupdateconfig_flags.go => clusterresourceattribute/attrupdateconfig_flags.go} (54%) rename flytectl/cmd/config/subcommand/{taskresourceattrupdateconfig_flags_test.go => clusterresourceattribute/attrupdateconfig_flags_test.go} (63%) create mode 100644 flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go create mode 100644 flytectl/cmd/config/subcommand/clusterresourceattribute/fetch_config.go create mode 100644 flytectl/cmd/config/subcommand/clusterresourceattribute/file_config.go create mode 100644 flytectl/cmd/config/subcommand/clusterresourceattribute/file_config_test.go create mode 100644 flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go create mode 100644 flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go create mode 100644 flytectl/cmd/config/subcommand/matchable_attribute_decorator.go create mode 100644 flytectl/cmd/config/subcommand/project_domain_workflow_getter.go delete mode 100644 flytectl/cmd/config/subcommand/task_resource_attribute_delete_config.go delete mode 100644 flytectl/cmd/config/subcommand/task_resource_attribute_fetch_config.go delete mode 100644 flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go delete mode 100644 flytectl/cmd/config/subcommand/task_resource_attribute_update_config.go create mode 100755 flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go rename flytectl/cmd/config/subcommand/{workflowconfig_flags.go => taskresourceattribute/attrfetchconfig_flags.go} (52%) create mode 100755 flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go create mode 100644 flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go create mode 100644 flytectl/cmd/config/subcommand/taskresourceattribute/fetch_config.go create mode 100644 flytectl/cmd/config/subcommand/taskresourceattribute/file_config.go create mode 100644 flytectl/cmd/config/subcommand/taskresourceattribute/file_config_test.go create mode 100644 flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go create mode 100755 flytectl/cmd/config/subcommand/workflow/config_flags.go rename flytectl/cmd/config/subcommand/{workflowconfig_flags_test.go => workflow/config_flags_test.go} (69%) rename flytectl/cmd/config/subcommand/{ => workflow}/workflow_config.go (51%) create mode 100644 flytectl/cmd/delete/matchable_attribute_util.go create mode 100644 flytectl/cmd/delete/matchable_cluster_resource_attribute.go create mode 100644 flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go rename flytectl/cmd/delete/testdata/{invalid_task_attribute.yaml => invalid_attribute.yaml} (100%) create mode 100644 flytectl/cmd/delete/testdata/valid_project_domain_cluster_attribute.yaml create mode 100644 flytectl/cmd/delete/testdata/valid_workflow_cluster_attribute.yaml create mode 100644 flytectl/cmd/get/matchable_attribute_util.go create mode 100644 flytectl/cmd/get/matchable_cluster_resource_attribute.go create mode 100644 flytectl/cmd/get/matchable_cluster_resource_attribute_test.go create mode 100644 flytectl/cmd/update/matchable_attribute_util.go create mode 100644 flytectl/cmd/update/matchable_cluster_resource_attribute.go create mode 100644 flytectl/cmd/update/matchable_cluster_resource_attribute_test.go rename flytectl/cmd/update/testdata/{invalid_task_attribute.yaml => invalid_attribute.yaml} (100%) create mode 100644 flytectl/cmd/update/testdata/valid_project_domain_cluster_attribute.yaml create mode 100644 flytectl/cmd/update/testdata/valid_workflow_cluster_attribute.yaml create mode 100644 flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst create mode 100644 flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst diff --git a/flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go similarity index 55% rename from flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags.go rename to flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go index fadea1f465..2ee35a7887 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package subcommand +package clusterresourceattribute import ( "encoding/json" @@ -14,7 +14,7 @@ import ( // If v is a pointer, it will get its element value or the zero value of the element type. // If v is not a pointer, it will return it as is. -func (TaskResourceAttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { +func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { if reflect.ValueOf(v).IsNil() { return reflect.Zero(t.Elem()).Interface() @@ -28,7 +28,7 @@ func (TaskResourceAttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { return v } -func (TaskResourceAttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { +func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { panic(err) @@ -37,10 +37,10 @@ func (TaskResourceAttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { return string(raw) } -// GetPFlagSet will return strongly types pflags for all fields in TaskResourceAttrDeleteConfig and its nested types. The format of the +// GetPFlagSet will return strongly types pflags for all fields in AttrDeleteConfig and its nested types. The format of the // flags is json-name.json-sub-name... etc. -func (cfg TaskResourceAttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("TaskResourceAttrDeleteConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultTaskResourceDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultTaskResourceDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") +func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go similarity index 64% rename from flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags_test.go rename to flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go index c2c77e82c2..798e81d2cf 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package subcommand +package clusterresourceattribute import ( "encoding/json" @@ -14,22 +14,22 @@ import ( "github.com/stretchr/testify/assert" ) -var dereferencableKindsTaskResourceAttrFetchConfig = map[reflect.Kind]struct{}{ +var dereferencableKindsAttrDeleteConfig = map[reflect.Kind]struct{}{ reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, } // Checks if t is a kind that can be dereferenced to get its underlying type. -func canGetElementTaskResourceAttrFetchConfig(t reflect.Kind) bool { - _, exists := dereferencableKindsTaskResourceAttrFetchConfig[t] +func canGetElementAttrDeleteConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrDeleteConfig[t] return exists } // This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the // object. Otherwise, it'll just pass on the original data. -func jsonUnmarshalerHookTaskResourceAttrFetchConfig(_, to reflect.Type, data interface{}) (interface{}, error) { +func jsonUnmarshalerHookAttrDeleteConfig(_, to reflect.Type, data interface{}) (interface{}, error) { unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || - (canGetElementTaskResourceAttrFetchConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + (canGetElementAttrDeleteConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { raw, err := json.Marshal(data) if err != nil { @@ -50,7 +50,7 @@ func jsonUnmarshalerHookTaskResourceAttrFetchConfig(_, to reflect.Type, data int return data, nil } -func decode_TaskResourceAttrFetchConfig(input, result interface{}) error { +func decode_AttrDeleteConfig(input, result interface{}) error { config := &mapstructure.DecoderConfig{ TagName: "json", WeaklyTypedInput: true, @@ -58,7 +58,7 @@ func decode_TaskResourceAttrFetchConfig(input, result interface{}) error { DecodeHook: mapstructure.ComposeDecodeHookFunc( mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToSliceHookFunc(","), - jsonUnmarshalerHookTaskResourceAttrFetchConfig, + jsonUnmarshalerHookAttrDeleteConfig, ), } @@ -70,7 +70,7 @@ func decode_TaskResourceAttrFetchConfig(input, result interface{}) error { return decoder.Decode(input) } -func join_TaskResourceAttrFetchConfig(arr interface{}, sep string) string { +func join_AttrDeleteConfig(arr interface{}, sep string) string { listValue := reflect.ValueOf(arr) strs := make([]string, 0, listValue.Len()) for i := 0; i < listValue.Len(); i++ { @@ -80,22 +80,22 @@ func join_TaskResourceAttrFetchConfig(arr interface{}, sep string) string { return strings.Join(strs, sep) } -func testDecodeJson_TaskResourceAttrFetchConfig(t *testing.T, val, result interface{}) { - assert.NoError(t, decode_TaskResourceAttrFetchConfig(val, result)) +func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(val, result)) } -func testDecodeSlice_TaskResourceAttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { - assert.NoError(t, decode_TaskResourceAttrFetchConfig(vStringSlice, result)) +func testDecodeSlice_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) } -func TestTaskResourceAttrFetchConfig_GetPFlagSet(t *testing.T) { - val := TaskResourceAttrFetchConfig{} +func TestAttrDeleteConfig_GetPFlagSet(t *testing.T) { + val := AttrDeleteConfig{} cmdFlags := val.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) } -func TestTaskResourceAttrFetchConfig_SetFlags(t *testing.T) { - actual := TaskResourceAttrFetchConfig{} +func TestAttrDeleteConfig_SetFlags(t *testing.T) { + actual := AttrDeleteConfig{} cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) @@ -103,7 +103,7 @@ func TestTaskResourceAttrFetchConfig_SetFlags(t *testing.T) { t.Run("DefaultValue", func(t *testing.T) { // Test that default value is set properly if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultTaskResourceFetchConfig.AttrFile), vString) + assert.Equal(t, string(DefaultDelConfig.AttrFile), vString) } else { assert.FailNow(t, err.Error()) } @@ -114,7 +114,7 @@ func TestTaskResourceAttrFetchConfig_SetFlags(t *testing.T) { cmdFlags.Set("attrFile", testValue) if vString, err := cmdFlags.GetString("attrFile"); err == nil { - testDecodeJson_TaskResourceAttrFetchConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags.go similarity index 55% rename from flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags.go rename to flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags.go index ebf6ec6220..477e57689f 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattrfetchconfig_flags.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package subcommand +package clusterresourceattribute import ( "encoding/json" @@ -14,7 +14,7 @@ import ( // If v is a pointer, it will get its element value or the zero value of the element type. // If v is not a pointer, it will return it as is. -func (TaskResourceAttrFetchConfig) elemValueOrNil(v interface{}) interface{} { +func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { if reflect.ValueOf(v).IsNil() { return reflect.Zero(t.Elem()).Interface() @@ -28,7 +28,7 @@ func (TaskResourceAttrFetchConfig) elemValueOrNil(v interface{}) interface{} { return v } -func (TaskResourceAttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { +func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { panic(err) @@ -37,10 +37,10 @@ func (TaskResourceAttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { return string(raw) } -// GetPFlagSet will return strongly types pflags for all fields in TaskResourceAttrFetchConfig and its nested types. The format of the +// GetPFlagSet will return strongly types pflags for all fields in AttrFetchConfig and its nested types. The format of the // flags is json-name.json-sub-name... etc. -func (cfg TaskResourceAttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("TaskResourceAttrFetchConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultTaskResourceFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultTaskResourceFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") +func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags_test.go similarity index 63% rename from flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags_test.go rename to flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags_test.go index 222fae2c50..4d8ae3e0e6 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags_test.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package subcommand +package clusterresourceattribute import ( "encoding/json" @@ -14,22 +14,22 @@ import ( "github.com/stretchr/testify/assert" ) -var dereferencableKindsTaskResourceAttrDeleteConfig = map[reflect.Kind]struct{}{ +var dereferencableKindsAttrFetchConfig = map[reflect.Kind]struct{}{ reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, } // Checks if t is a kind that can be dereferenced to get its underlying type. -func canGetElementTaskResourceAttrDeleteConfig(t reflect.Kind) bool { - _, exists := dereferencableKindsTaskResourceAttrDeleteConfig[t] +func canGetElementAttrFetchConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrFetchConfig[t] return exists } // This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the // object. Otherwise, it'll just pass on the original data. -func jsonUnmarshalerHookTaskResourceAttrDeleteConfig(_, to reflect.Type, data interface{}) (interface{}, error) { +func jsonUnmarshalerHookAttrFetchConfig(_, to reflect.Type, data interface{}) (interface{}, error) { unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || - (canGetElementTaskResourceAttrDeleteConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + (canGetElementAttrFetchConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { raw, err := json.Marshal(data) if err != nil { @@ -50,7 +50,7 @@ func jsonUnmarshalerHookTaskResourceAttrDeleteConfig(_, to reflect.Type, data in return data, nil } -func decode_TaskResourceAttrDeleteConfig(input, result interface{}) error { +func decode_AttrFetchConfig(input, result interface{}) error { config := &mapstructure.DecoderConfig{ TagName: "json", WeaklyTypedInput: true, @@ -58,7 +58,7 @@ func decode_TaskResourceAttrDeleteConfig(input, result interface{}) error { DecodeHook: mapstructure.ComposeDecodeHookFunc( mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToSliceHookFunc(","), - jsonUnmarshalerHookTaskResourceAttrDeleteConfig, + jsonUnmarshalerHookAttrFetchConfig, ), } @@ -70,7 +70,7 @@ func decode_TaskResourceAttrDeleteConfig(input, result interface{}) error { return decoder.Decode(input) } -func join_TaskResourceAttrDeleteConfig(arr interface{}, sep string) string { +func join_AttrFetchConfig(arr interface{}, sep string) string { listValue := reflect.ValueOf(arr) strs := make([]string, 0, listValue.Len()) for i := 0; i < listValue.Len(); i++ { @@ -80,22 +80,22 @@ func join_TaskResourceAttrDeleteConfig(arr interface{}, sep string) string { return strings.Join(strs, sep) } -func testDecodeJson_TaskResourceAttrDeleteConfig(t *testing.T, val, result interface{}) { - assert.NoError(t, decode_TaskResourceAttrDeleteConfig(val, result)) +func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(val, result)) } -func testDecodeSlice_TaskResourceAttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { - assert.NoError(t, decode_TaskResourceAttrDeleteConfig(vStringSlice, result)) +func testDecodeSlice_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) } -func TestTaskResourceAttrDeleteConfig_GetPFlagSet(t *testing.T) { - val := TaskResourceAttrDeleteConfig{} +func TestAttrFetchConfig_GetPFlagSet(t *testing.T) { + val := AttrFetchConfig{} cmdFlags := val.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) } -func TestTaskResourceAttrDeleteConfig_SetFlags(t *testing.T) { - actual := TaskResourceAttrDeleteConfig{} +func TestAttrFetchConfig_SetFlags(t *testing.T) { + actual := AttrFetchConfig{} cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) @@ -103,7 +103,7 @@ func TestTaskResourceAttrDeleteConfig_SetFlags(t *testing.T) { t.Run("DefaultValue", func(t *testing.T) { // Test that default value is set properly if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultTaskResourceDelConfig.AttrFile), vString) + assert.Equal(t, string(DefaultFetchConfig.AttrFile), vString) } else { assert.FailNow(t, err.Error()) } @@ -114,7 +114,7 @@ func TestTaskResourceAttrDeleteConfig_SetFlags(t *testing.T) { cmdFlags.Set("attrFile", testValue) if vString, err := cmdFlags.GetString("attrFile"); err == nil { - testDecodeJson_TaskResourceAttrDeleteConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + testDecodeJson_AttrFetchConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go similarity index 54% rename from flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags.go rename to flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go index d94413106f..60a9af145a 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package subcommand +package clusterresourceattribute import ( "encoding/json" @@ -14,7 +14,7 @@ import ( // If v is a pointer, it will get its element value or the zero value of the element type. // If v is not a pointer, it will return it as is. -func (TaskResourceAttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { +func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { if reflect.ValueOf(v).IsNil() { return reflect.Zero(t.Elem()).Interface() @@ -28,7 +28,7 @@ func (TaskResourceAttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { return v } -func (TaskResourceAttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { +func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { panic(err) @@ -37,10 +37,10 @@ func (TaskResourceAttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { return string(raw) } -// GetPFlagSet will return strongly types pflags for all fields in TaskResourceAttrUpdateConfig and its nested types. The format of the +// GetPFlagSet will return strongly types pflags for all fields in AttrUpdateConfig and its nested types. The format of the // flags is json-name.json-sub-name... etc. -func (cfg TaskResourceAttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("TaskResourceAttrUpdateConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultTaskResourceUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultTaskResourceUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") +func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go similarity index 63% rename from flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags_test.go rename to flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go index 73f272b45e..aa5d18dd07 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package subcommand +package clusterresourceattribute import ( "encoding/json" @@ -14,22 +14,22 @@ import ( "github.com/stretchr/testify/assert" ) -var dereferencableKindsTaskResourceAttrUpdateConfig = map[reflect.Kind]struct{}{ +var dereferencableKindsAttrUpdateConfig = map[reflect.Kind]struct{}{ reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, } // Checks if t is a kind that can be dereferenced to get its underlying type. -func canGetElementTaskResourceAttrUpdateConfig(t reflect.Kind) bool { - _, exists := dereferencableKindsTaskResourceAttrUpdateConfig[t] +func canGetElementAttrUpdateConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrUpdateConfig[t] return exists } // This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the // object. Otherwise, it'll just pass on the original data. -func jsonUnmarshalerHookTaskResourceAttrUpdateConfig(_, to reflect.Type, data interface{}) (interface{}, error) { +func jsonUnmarshalerHookAttrUpdateConfig(_, to reflect.Type, data interface{}) (interface{}, error) { unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || - (canGetElementTaskResourceAttrUpdateConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + (canGetElementAttrUpdateConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { raw, err := json.Marshal(data) if err != nil { @@ -50,7 +50,7 @@ func jsonUnmarshalerHookTaskResourceAttrUpdateConfig(_, to reflect.Type, data in return data, nil } -func decode_TaskResourceAttrUpdateConfig(input, result interface{}) error { +func decode_AttrUpdateConfig(input, result interface{}) error { config := &mapstructure.DecoderConfig{ TagName: "json", WeaklyTypedInput: true, @@ -58,7 +58,7 @@ func decode_TaskResourceAttrUpdateConfig(input, result interface{}) error { DecodeHook: mapstructure.ComposeDecodeHookFunc( mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToSliceHookFunc(","), - jsonUnmarshalerHookTaskResourceAttrUpdateConfig, + jsonUnmarshalerHookAttrUpdateConfig, ), } @@ -70,7 +70,7 @@ func decode_TaskResourceAttrUpdateConfig(input, result interface{}) error { return decoder.Decode(input) } -func join_TaskResourceAttrUpdateConfig(arr interface{}, sep string) string { +func join_AttrUpdateConfig(arr interface{}, sep string) string { listValue := reflect.ValueOf(arr) strs := make([]string, 0, listValue.Len()) for i := 0; i < listValue.Len(); i++ { @@ -80,22 +80,22 @@ func join_TaskResourceAttrUpdateConfig(arr interface{}, sep string) string { return strings.Join(strs, sep) } -func testDecodeJson_TaskResourceAttrUpdateConfig(t *testing.T, val, result interface{}) { - assert.NoError(t, decode_TaskResourceAttrUpdateConfig(val, result)) +func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(val, result)) } -func testDecodeSlice_TaskResourceAttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { - assert.NoError(t, decode_TaskResourceAttrUpdateConfig(vStringSlice, result)) +func testDecodeSlice_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) } -func TestTaskResourceAttrUpdateConfig_GetPFlagSet(t *testing.T) { - val := TaskResourceAttrUpdateConfig{} +func TestAttrUpdateConfig_GetPFlagSet(t *testing.T) { + val := AttrUpdateConfig{} cmdFlags := val.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) } -func TestTaskResourceAttrUpdateConfig_SetFlags(t *testing.T) { - actual := TaskResourceAttrUpdateConfig{} +func TestAttrUpdateConfig_SetFlags(t *testing.T) { + actual := AttrUpdateConfig{} cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) @@ -103,7 +103,7 @@ func TestTaskResourceAttrUpdateConfig_SetFlags(t *testing.T) { t.Run("DefaultValue", func(t *testing.T) { // Test that default value is set properly if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultTaskResourceUpdateConfig.AttrFile), vString) + assert.Equal(t, string(DefaultUpdateConfig.AttrFile), vString) } else { assert.FailNow(t, err.Error()) } @@ -114,7 +114,7 @@ func TestTaskResourceAttrUpdateConfig_SetFlags(t *testing.T) { cmdFlags.Set("attrFile", testValue) if vString, err := cmdFlags.GetString("attrFile"); err == nil { - testDecodeJson_TaskResourceAttrUpdateConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go new file mode 100644 index 0000000000..3b81cd0991 --- /dev/null +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go @@ -0,0 +1,10 @@ +package clusterresourceattribute + +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig + +// AttrDeleteConfig Matchable resource attributes configuration passed from command line +type AttrDeleteConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` +} + +var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/fetch_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/fetch_config.go new file mode 100644 index 0000000000..9da6d481f8 --- /dev/null +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/fetch_config.go @@ -0,0 +1,9 @@ +package clusterresourceattribute + +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig + +type AttrFetchConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` +} + +var DefaultFetchConfig = &AttrFetchConfig{} diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config.go new file mode 100644 index 0000000000..5bfece378d --- /dev/null +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config.go @@ -0,0 +1,47 @@ +package clusterresourceattribute + +import ( + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +// AttrFileConfig shadow Config for ClusterResourceAttributes. +// The shadow Config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. +// As the same structure is being used for both ProjectDomainAttribute/Workflowattribute +type AttrFileConfig struct { + Project string `json:"project"` + Domain string `json:"domain"` + Workflow string `json:"workflow,omitempty"` + *admin.ClusterResourceAttributes +} + +// Decorate decorator over ClusterResourceAttributes. +func (c AttrFileConfig) Decorate() *admin.MatchingAttributes { + return &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ClusterResourceAttributes{ + ClusterResourceAttributes: c.ClusterResourceAttributes, + }, + } +} + +// UnDecorate to uncover ClusterResourceAttributes. +func (c *AttrFileConfig) UnDecorate(matchingAttribute *admin.MatchingAttributes) { + if matchingAttribute == nil { + return + } + c.ClusterResourceAttributes = matchingAttribute.GetClusterResourceAttributes() +} + +// GetProject from the AttrFileConfig +func (c AttrFileConfig) GetProject() string { + return c.Project +} + +// GetDomain from the AttrFileConfig +func (c AttrFileConfig) GetDomain() string { + return c.Domain +} + +// GetWorkflow from the AttrFileConfig +func (c AttrFileConfig) GetWorkflow() string { + return c.Workflow +} diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config_test.go new file mode 100644 index 0000000000..f9510c7d07 --- /dev/null +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config_test.go @@ -0,0 +1,46 @@ +package clusterresourceattribute + +import ( + "testing" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" +) + +func TestFileConfig(t *testing.T) { + clusterAttrFileConfig := AttrFileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + ClusterResourceAttributes: &admin.ClusterResourceAttributes{ + Attributes: map[string]string{"foo": "bar"}, + }, + } + matchingAttr := &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ClusterResourceAttributes{ + ClusterResourceAttributes: clusterAttrFileConfig.ClusterResourceAttributes, + }, + } + t.Run("decorate", func(t *testing.T) { + assert.Equal(t, matchingAttr, clusterAttrFileConfig.Decorate()) + }) + + t.Run("decorate", func(t *testing.T) { + clusterAttrFileConfigNew := AttrFileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + } + clusterAttrFileConfigNew.UnDecorate(matchingAttr) + assert.Equal(t, clusterAttrFileConfig, clusterAttrFileConfigNew) + }) + t.Run("get project domain workflow", func(t *testing.T) { + clusterAttrFileConfigNew := AttrFileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + Workflow: "workflow", + } + assert.Equal(t, "dummyProject", clusterAttrFileConfigNew.GetProject()) + assert.Equal(t, "dummyDomain", clusterAttrFileConfigNew.GetDomain()) + assert.Equal(t, "workflow", clusterAttrFileConfigNew.GetWorkflow()) + }) +} diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go new file mode 100644 index 0000000000..2ff214af1f --- /dev/null +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go @@ -0,0 +1,10 @@ +package clusterresourceattribute + +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig + +// AttrUpdateConfig Matchable resource attributes configuration passed from command line +type AttrUpdateConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` +} + +var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go b/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go new file mode 100644 index 0000000000..c29b3f23a7 --- /dev/null +++ b/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go @@ -0,0 +1,60 @@ +package subcommand + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" + "sigs.k8s.io/yaml" +) + +// WriteConfigToFile used for marshaling the Config to a file which can then be used for update/delete +func WriteConfigToFile(matchableAttrConfig interface{}, fileName string) error { + d, err := yaml.Marshal(matchableAttrConfig) + if err != nil { + return fmt.Errorf("error: %v", err) + } + if _, err = os.Stat(fileName); err == nil { + if !cmdUtil.AskForConfirmation(fmt.Sprintf("warning file %v will be overwritten", fileName)) { + return fmt.Errorf("backup the file before continuing") + } + } + return ioutil.WriteFile(fileName, d, 0600) +} + +// String Dumps the json representation of the TaskResourceAttrFileConfig +func String(matchableAttrConfig interface{}) string { + tj, err := json.Marshal(matchableAttrConfig) + if err != nil { + fmt.Println(err) + return "marshaling error" + } + return fmt.Sprintf("%s\n", tj) +} + +// ReadConfigFromFile used for unmarshaling the Config from a file which is used for update/delete +func ReadConfigFromFile(matchableAttrConfig interface{}, fileName string) error { + data, err := ioutil.ReadFile(fileName) + if err != nil { + return fmt.Errorf("unable to read from %v yaml file", fileName) + } + if err = yaml.UnmarshalStrict(data, matchableAttrConfig); err != nil { + return err + } + return nil +} + +func DumpTaskResourceAttr(matchableAttrConfig interface{}, fileName string) error { + // Write Config to file if filename provided in the command + if len(fileName) > 0 { + if err := WriteConfigToFile(matchableAttrConfig, fileName); err != nil { + return fmt.Errorf("error dumping in file due to %v", err) + } + fmt.Printf("wrote the config to file %v", fileName) + } else { + fmt.Printf("%v", String(matchableAttrConfig)) + } + return nil +} diff --git a/flytectl/cmd/config/subcommand/matchable_attribute_decorator.go b/flytectl/cmd/config/subcommand/matchable_attribute_decorator.go new file mode 100644 index 0000000000..728be8582f --- /dev/null +++ b/flytectl/cmd/config/subcommand/matchable_attribute_decorator.go @@ -0,0 +1,13 @@ +package subcommand + +import "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + +// MatchableAttributeDecorator defines a decorator for any matchable attribute target. +type MatchableAttributeDecorator interface { + Decorate() *admin.MatchingAttributes +} + +// MatchableAttributeUnDecorator defines a undecorator to get the target. +type MatchableAttributeUnDecorator interface { + UnDecorate(*admin.MatchingAttributes) +} diff --git a/flytectl/cmd/config/subcommand/project_domain_workflow_getter.go b/flytectl/cmd/config/subcommand/project_domain_workflow_getter.go new file mode 100644 index 0000000000..ee77f9ca3f --- /dev/null +++ b/flytectl/cmd/config/subcommand/project_domain_workflow_getter.go @@ -0,0 +1,40 @@ +package subcommand + +import rootConfig "github.com/flyteorg/flytectl/cmd/config" + +// ProjectDomainWorkflowGetter defines a interface for getting the project domain workflow. +type ProjectDomainWorkflowGetter interface { + GetProject() string + GetDomain() string + GetWorkflow() string +} + +// PDWGetterCommandLine implements the command line way of getting project domain and workflow +type PDWGetterCommandLine struct { + Config *rootConfig.Config + Args []string +} + +// GetProject returns the cobra parsed Project from the Config +func (g PDWGetterCommandLine) GetProject() string { + if g.Config == nil { + return "" + } + return g.Config.Project +} + +// GetDomain returns the cobra parsed Domain from the Config +func (g PDWGetterCommandLine) GetDomain() string { + if g.Config == nil { + return "" + } + return g.Config.Domain +} + +// GetWorkflow returns the first argument from the commandline +func (g PDWGetterCommandLine) GetWorkflow() string { + if g.Args == nil || len(g.Args) == 0 { + return "" + } + return g.Args[0] +} diff --git a/flytectl/cmd/config/subcommand/task_resource_attribute_delete_config.go b/flytectl/cmd/config/subcommand/task_resource_attribute_delete_config.go deleted file mode 100644 index 34a6a4e466..0000000000 --- a/flytectl/cmd/config/subcommand/task_resource_attribute_delete_config.go +++ /dev/null @@ -1,10 +0,0 @@ -package subcommand - -//go:generate pflags TaskResourceAttrDeleteConfig --default-var DefaultTaskResourceDelConfig - -// TaskResourceAttrDeleteConfig Matchable resource attributes configuration passed from command line -type TaskResourceAttrDeleteConfig struct { - AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` -} - -var DefaultTaskResourceDelConfig = &TaskResourceAttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/task_resource_attribute_fetch_config.go b/flytectl/cmd/config/subcommand/task_resource_attribute_fetch_config.go deleted file mode 100644 index 34b1d435f4..0000000000 --- a/flytectl/cmd/config/subcommand/task_resource_attribute_fetch_config.go +++ /dev/null @@ -1,9 +0,0 @@ -package subcommand - -//go:generate pflags TaskResourceAttrFetchConfig --default-var DefaultTaskResourceFetchConfig - -type TaskResourceAttrFetchConfig struct { - AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` -} - -var DefaultTaskResourceFetchConfig = &TaskResourceAttrFetchConfig{} diff --git a/flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go b/flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go deleted file mode 100644 index 62fa2f7e3f..0000000000 --- a/flytectl/cmd/config/subcommand/task_resource_attribute_file_config.go +++ /dev/null @@ -1,86 +0,0 @@ -package subcommand - -import ( - "context" - "encoding/json" - "fmt" - "io/ioutil" - "os" - - cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" - - "sigs.k8s.io/yaml" -) - -// TaskResourceAttrFileConfig shadow config for TaskResourceAttribute. -// The shadow config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. -// As the same structure is being used for both ProjectDomainAttribute/Workflowattribute -type TaskResourceAttrFileConfig struct { - Project string - Domain string - Workflow string - *admin.TaskResourceAttributes -} - -// WriteConfigToFile used for marshaling the config to a file which can then be used for update/delete -func (t TaskResourceAttrFileConfig) WriteConfigToFile(fileName string) error { - d, err := yaml.Marshal(t) - if err != nil { - fmt.Printf("error: %v", err) - } - if _, err = os.Stat(fileName); err == nil { - if !cmdUtil.AskForConfirmation(fmt.Sprintf("warning file %v will be overwritten", fileName)) { - return fmt.Errorf("backup the file before continuing") - } - } - return ioutil.WriteFile(fileName, d, 0600) -} - -// Dumps the json representation of the TaskResourceAttrFileConfig -func (t TaskResourceAttrFileConfig) String() string { - tj, err := json.Marshal(t) - if err != nil { - fmt.Println(err) - return "marshaling error" - } - return fmt.Sprintf("%s\n", tj) -} - -// ReadConfigFromFile used for unmarshaling the config from a file which is used for update/delete -func (t *TaskResourceAttrFileConfig) ReadConfigFromFile(fileName string) error { - data, err := ioutil.ReadFile(fileName) - if err != nil { - return fmt.Errorf("unable to read from %v yaml file", fileName) - } - if err = yaml.UnmarshalStrict(data, t); err != nil { - return err - } - return nil -} - -// MatchableAttributeDecorator decorator over TaskResourceAttributes. Similar decorator would exist for other MatchingAttributes -func (t *TaskResourceAttrFileConfig) MatchableAttributeDecorator() *admin.MatchingAttributes { - return &admin.MatchingAttributes{ - Target: &admin.MatchingAttributes_TaskResourceAttributes{ - TaskResourceAttributes: t.TaskResourceAttributes, - }, - } -} - -func (t TaskResourceAttrFileConfig) DumpTaskResourceAttr(ctx context.Context, fileName string) { - // Dump empty task resource attr for editing - // Write config to file if filename provided in the command - if len(fileName) > 0 { - // Read the config from the file and update the TaskResourceAttrFileConfig with the TaskResourceAttrConfig - if err := t.WriteConfigToFile(fileName); err != nil { - fmt.Printf("error dumping in file due to %v", err) - logger.Warnf(ctx, "error dumping in file due to %v", err) - return - } - fmt.Printf("written the config to file %v", fileName) - } else { - fmt.Printf("%v", t) - } -} diff --git a/flytectl/cmd/config/subcommand/task_resource_attribute_update_config.go b/flytectl/cmd/config/subcommand/task_resource_attribute_update_config.go deleted file mode 100644 index d85944777d..0000000000 --- a/flytectl/cmd/config/subcommand/task_resource_attribute_update_config.go +++ /dev/null @@ -1,10 +0,0 @@ -package subcommand - -//go:generate pflags TaskResourceAttrUpdateConfig --default-var DefaultTaskResourceUpdateConfig - -// TaskResourceAttrUpdateConfig Matchable resource attributes configuration passed from command line -type TaskResourceAttrUpdateConfig struct { - AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` -} - -var DefaultTaskResourceUpdateConfig = &TaskResourceAttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go new file mode 100755 index 0000000000..b335257d99 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package taskresourceattribute + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrDeleteConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go new file mode 100755 index 0000000000..3c219496ae --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package taskresourceattribute + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrDeleteConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrDeleteConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrDeleteConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrDeleteConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrDeleteConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrDeleteConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrDeleteConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrDeleteConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(val, result)) +} + +func testDecodeSlice_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) +} + +func TestAttrDeleteConfig_GetPFlagSet(t *testing.T) { + val := AttrDeleteConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrDeleteConfig_SetFlags(t *testing.T) { + actual := AttrDeleteConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultDelConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/workflowconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags.go similarity index 52% rename from flytectl/cmd/config/subcommand/workflowconfig_flags.go rename to flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags.go index cc5a1743d4..761baa5c3a 100755 --- a/flytectl/cmd/config/subcommand/workflowconfig_flags.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package subcommand +package taskresourceattribute import ( "encoding/json" @@ -14,7 +14,7 @@ import ( // If v is a pointer, it will get its element value or the zero value of the element type. // If v is not a pointer, it will return it as is. -func (WorkflowConfig) elemValueOrNil(v interface{}) interface{} { +func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { if reflect.ValueOf(v).IsNil() { return reflect.Zero(t.Elem()).Interface() @@ -28,7 +28,7 @@ func (WorkflowConfig) elemValueOrNil(v interface{}) interface{} { return v } -func (WorkflowConfig) mustMarshalJSON(v json.Marshaler) string { +func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { panic(err) @@ -37,11 +37,10 @@ func (WorkflowConfig) mustMarshalJSON(v json.Marshaler) string { return string(raw) } -// GetPFlagSet will return strongly types pflags for all fields in WorkflowConfig and its nested types. The format of the +// GetPFlagSet will return strongly types pflags for all fields in AttrFetchConfig and its nested types. The format of the // flags is json-name.json-sub-name... etc. -func (cfg WorkflowConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("WorkflowConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultWorklfowConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), DefaultWorklfowConfig.Version, "version of the workflow to be fetched.") - cmdFlags.BoolVar(&(DefaultWorklfowConfig.Latest),fmt.Sprintf("%v%v", prefix, "latest"), DefaultWorklfowConfig.Latest, " flag to indicate to fetch the latest version, version flag will be ignored in this case") +func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags_test.go new file mode 100755 index 0000000000..1b91152a97 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package taskresourceattribute + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrFetchConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrFetchConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrFetchConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrFetchConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrFetchConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrFetchConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrFetchConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrFetchConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(val, result)) +} + +func testDecodeSlice_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) +} + +func TestAttrFetchConfig_GetPFlagSet(t *testing.T) { + val := AttrFetchConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrFetchConfig_SetFlags(t *testing.T) { + actual := AttrFetchConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultFetchConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrFetchConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go new file mode 100755 index 0000000000..b94b102bc6 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package taskresourceattribute + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrUpdateConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go new file mode 100755 index 0000000000..2672552de4 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package taskresourceattribute + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrUpdateConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrUpdateConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrUpdateConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrUpdateConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrUpdateConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrUpdateConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrUpdateConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrUpdateConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(val, result)) +} + +func testDecodeSlice_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) +} + +func TestAttrUpdateConfig_GetPFlagSet(t *testing.T) { + val := AttrUpdateConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrUpdateConfig_SetFlags(t *testing.T) { + actual := AttrUpdateConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultUpdateConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go new file mode 100644 index 0000000000..6c513cafe0 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go @@ -0,0 +1,10 @@ +package taskresourceattribute + +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig + +// AttrDeleteConfig Matchable resource attributes configuration passed from command line +type AttrDeleteConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` +} + +var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/fetch_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/fetch_config.go new file mode 100644 index 0000000000..6909229c30 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/fetch_config.go @@ -0,0 +1,9 @@ +package taskresourceattribute + +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig + +type AttrFetchConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` +} + +var DefaultFetchConfig = &AttrFetchConfig{} diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/file_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/file_config.go new file mode 100644 index 0000000000..6c31553f87 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/file_config.go @@ -0,0 +1,47 @@ +package taskresourceattribute + +import ( + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +// TaskResourceAttrFileConfig shadow Config for TaskResourceAttribute. +// The shadow Config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. +// As the same structure is being used for both ProjectDomainAttribute/Workflowattribute +type TaskResourceAttrFileConfig struct { + Project string `json:"project"` + Domain string `json:"domain"` + Workflow string `json:"workflow,omitempty"` + *admin.TaskResourceAttributes +} + +// Decorate decorator over TaskResourceAttributes. +func (t TaskResourceAttrFileConfig) Decorate() *admin.MatchingAttributes { + return &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{ + TaskResourceAttributes: t.TaskResourceAttributes, + }, + } +} + +// UnDecorate to uncover TaskResourceAttributes. +func (t *TaskResourceAttrFileConfig) UnDecorate(matchingAttribute *admin.MatchingAttributes) { + if matchingAttribute == nil { + return + } + t.TaskResourceAttributes = matchingAttribute.GetTaskResourceAttributes() +} + +// GetProject from the TaskResourceAttrFileConfig +func (t TaskResourceAttrFileConfig) GetProject() string { + return t.Project +} + +// GetDomain from the TaskResourceAttrFileConfig +func (t TaskResourceAttrFileConfig) GetDomain() string { + return t.Domain +} + +// GetWorkflow from the TaskResourceAttrFileConfig +func (t TaskResourceAttrFileConfig) GetWorkflow() string { + return t.Workflow +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/file_config_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/file_config_test.go new file mode 100644 index 0000000000..73b2248985 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/file_config_test.go @@ -0,0 +1,53 @@ +package taskresourceattribute + +import ( + "testing" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" +) + +func TestFileConfig(t *testing.T) { + taskAttrFileConfig := TaskResourceAttrFileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + TaskResourceAttributes: &admin.TaskResourceAttributes{ + Defaults: &admin.TaskResourceSpec{ + Cpu: "1", + Memory: "150Mi", + }, + Limits: &admin.TaskResourceSpec{ + Cpu: "2", + Memory: "350Mi", + }, + }, + } + matchingAttr := &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{ + TaskResourceAttributes: taskAttrFileConfig.TaskResourceAttributes, + }, + } + t.Run("decorate", func(t *testing.T) { + assert.Equal(t, matchingAttr, taskAttrFileConfig.Decorate()) + }) + + t.Run("decorate", func(t *testing.T) { + taskAttrFileConfigNew := TaskResourceAttrFileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + } + taskAttrFileConfigNew.UnDecorate(matchingAttr) + assert.Equal(t, taskAttrFileConfig, taskAttrFileConfigNew) + }) + t.Run("get project domain workflow", func(t *testing.T) { + taskAttrFileConfigNew := TaskResourceAttrFileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + Workflow: "workflow", + } + assert.Equal(t, "dummyProject", taskAttrFileConfigNew.GetProject()) + assert.Equal(t, "dummyDomain", taskAttrFileConfigNew.GetDomain()) + assert.Equal(t, "workflow", taskAttrFileConfigNew.GetWorkflow()) + }) +} diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go new file mode 100644 index 0000000000..d9ea24ab77 --- /dev/null +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go @@ -0,0 +1,10 @@ +package taskresourceattribute + +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig + +// AttrUpdateConfig Matchable resource attributes configuration passed from command line +type AttrUpdateConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` +} + +var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/workflow/config_flags.go b/flytectl/cmd/config/subcommand/workflow/config_flags.go new file mode 100755 index 0000000000..3db237e852 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflow/config_flags.go @@ -0,0 +1,47 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package workflow + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "version of the workflow to be fetched.") + cmdFlags.BoolVar(&(DefaultConfig.Latest),fmt.Sprintf("%v%v", prefix, "latest"), DefaultConfig.Latest, " flag to indicate to fetch the latest version, version flag will be ignored in this case") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/workflowconfig_flags_test.go b/flytectl/cmd/config/subcommand/workflow/config_flags_test.go similarity index 69% rename from flytectl/cmd/config/subcommand/workflowconfig_flags_test.go rename to flytectl/cmd/config/subcommand/workflow/config_flags_test.go index 105f884def..e3d3eae412 100755 --- a/flytectl/cmd/config/subcommand/workflowconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/workflow/config_flags_test.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package subcommand +package workflow import ( "encoding/json" @@ -14,22 +14,22 @@ import ( "github.com/stretchr/testify/assert" ) -var dereferencableKindsWorkflowConfig = map[reflect.Kind]struct{}{ +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, } // Checks if t is a kind that can be dereferenced to get its underlying type. -func canGetElementWorkflowConfig(t reflect.Kind) bool { - _, exists := dereferencableKindsWorkflowConfig[t] +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] return exists } // This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the // object. Otherwise, it'll just pass on the original data. -func jsonUnmarshalerHookWorkflowConfig(_, to reflect.Type, data interface{}) (interface{}, error) { +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || - (canGetElementWorkflowConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { raw, err := json.Marshal(data) if err != nil { @@ -50,7 +50,7 @@ func jsonUnmarshalerHookWorkflowConfig(_, to reflect.Type, data interface{}) (in return data, nil } -func decode_WorkflowConfig(input, result interface{}) error { +func decode_Config(input, result interface{}) error { config := &mapstructure.DecoderConfig{ TagName: "json", WeaklyTypedInput: true, @@ -58,7 +58,7 @@ func decode_WorkflowConfig(input, result interface{}) error { DecodeHook: mapstructure.ComposeDecodeHookFunc( mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToSliceHookFunc(","), - jsonUnmarshalerHookWorkflowConfig, + jsonUnmarshalerHookConfig, ), } @@ -70,7 +70,7 @@ func decode_WorkflowConfig(input, result interface{}) error { return decoder.Decode(input) } -func join_WorkflowConfig(arr interface{}, sep string) string { +func join_Config(arr interface{}, sep string) string { listValue := reflect.ValueOf(arr) strs := make([]string, 0, listValue.Len()) for i := 0; i < listValue.Len(); i++ { @@ -80,22 +80,22 @@ func join_WorkflowConfig(arr interface{}, sep string) string { return strings.Join(strs, sep) } -func testDecodeJson_WorkflowConfig(t *testing.T, val, result interface{}) { - assert.NoError(t, decode_WorkflowConfig(val, result)) +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) } -func testDecodeSlice_WorkflowConfig(t *testing.T, vStringSlice, result interface{}) { - assert.NoError(t, decode_WorkflowConfig(vStringSlice, result)) +func testDecodeSlice_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) } -func TestWorkflowConfig_GetPFlagSet(t *testing.T) { - val := WorkflowConfig{} +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} cmdFlags := val.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) } -func TestWorkflowConfig_SetFlags(t *testing.T) { - actual := WorkflowConfig{} +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) @@ -103,7 +103,7 @@ func TestWorkflowConfig_SetFlags(t *testing.T) { t.Run("DefaultValue", func(t *testing.T) { // Test that default value is set properly if vString, err := cmdFlags.GetString("version"); err == nil { - assert.Equal(t, string(DefaultWorklfowConfig.Version), vString) + assert.Equal(t, string(DefaultConfig.Version), vString) } else { assert.FailNow(t, err.Error()) } @@ -114,7 +114,7 @@ func TestWorkflowConfig_SetFlags(t *testing.T) { cmdFlags.Set("version", testValue) if vString, err := cmdFlags.GetString("version"); err == nil { - testDecodeJson_WorkflowConfig(t, fmt.Sprintf("%v", vString), &actual.Version) + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Version) } else { assert.FailNow(t, err.Error()) @@ -125,7 +125,7 @@ func TestWorkflowConfig_SetFlags(t *testing.T) { t.Run("DefaultValue", func(t *testing.T) { // Test that default value is set properly if vBool, err := cmdFlags.GetBool("latest"); err == nil { - assert.Equal(t, bool(DefaultWorklfowConfig.Latest), vBool) + assert.Equal(t, bool(DefaultConfig.Latest), vBool) } else { assert.FailNow(t, err.Error()) } @@ -136,7 +136,7 @@ func TestWorkflowConfig_SetFlags(t *testing.T) { cmdFlags.Set("latest", testValue) if vBool, err := cmdFlags.GetBool("latest"); err == nil { - testDecodeJson_WorkflowConfig(t, fmt.Sprintf("%v", vBool), &actual.Latest) + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Latest) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/workflow_config.go b/flytectl/cmd/config/subcommand/workflow/workflow_config.go similarity index 51% rename from flytectl/cmd/config/subcommand/workflow_config.go rename to flytectl/cmd/config/subcommand/workflow/workflow_config.go index b3c6452a62..d4890f84c2 100644 --- a/flytectl/cmd/config/subcommand/workflow_config.go +++ b/flytectl/cmd/config/subcommand/workflow/workflow_config.go @@ -1,13 +1,13 @@ -package subcommand +package workflow -//go:generate pflags WorkflowConfig --default-var DefaultWorklfowConfig +//go:generate pflags Config --default-var DefaultConfig var ( - DefaultWorklfowConfig = &WorkflowConfig{} + DefaultConfig = &Config{} ) -// WorkflowConfig commandline configuration -type WorkflowConfig struct { +// Config commandline configuration +type Config struct { Version string `json:"version" pflag:",version of the workflow to be fetched."` Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` } diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index 2c694db819..fe518f9ca0 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -1,7 +1,8 @@ package delete import ( - "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" @@ -30,7 +31,10 @@ func RemoteDeleteCommand() *cobra.Command { Long: execCmdLong}, "task-resource-attribute": {CmdFunc: deleteTaskResourceAttributes, Aliases: []string{"task-resource-attributes"}, Short: taskResourceAttributesShort, - Long: taskResourceAttributesLong, PFlagProvider: subcommand.DefaultTaskResourceDelConfig, ProjectDomainNotRequired: true}, + Long: taskResourceAttributesLong, PFlagProvider: taskresourceattribute.DefaultDelConfig, ProjectDomainNotRequired: true}, + "cluster-resource-attribute": {CmdFunc: deleteClusterResourceAttributes, Aliases: []string{"cluster-resource-attributes"}, + Short: clusterResourceAttributesShort, + Long: clusterResourceAttributesLong, PFlagProvider: clusterresourceattribute.DefaultDelConfig, ProjectDomainNotRequired: true}, } cmdcore.AddCommands(deleteCmd, terminateResourcesFuncs) return deleteCmd diff --git a/flytectl/cmd/delete/delete_test.go b/flytectl/cmd/delete/delete_test.go index dd3075edac..52ea0e9090 100644 --- a/flytectl/cmd/delete/delete_test.go +++ b/flytectl/cmd/delete/delete_test.go @@ -26,18 +26,20 @@ func TestDeleteCommand(t *testing.T) { assert.Equal(t, deleteCommand.Use, "delete") assert.Equal(t, deleteCommand.Short, deleteCmdShort) assert.Equal(t, deleteCommand.Long, deleteCmdLong) - assert.Equal(t, len(deleteCommand.Commands()), 2) + assert.Equal(t, len(deleteCommand.Commands()), 3) cmdNouns := deleteCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - assert.Equal(t, cmdNouns[0].Use, "execution") - assert.Equal(t, cmdNouns[0].Aliases, []string{"executions"}) - assert.Equal(t, cmdNouns[0].Short, execCmdShort) - assert.Equal(t, cmdNouns[0].Long, execCmdLong) - assert.Equal(t, cmdNouns[1].Use, "task-resource-attribute") - assert.Equal(t, cmdNouns[1].Aliases, []string{"task-resource-attributes"}) - assert.Equal(t, cmdNouns[1].Short, taskResourceAttributesShort) - assert.Equal(t, cmdNouns[1].Long, taskResourceAttributesLong) + useArray := []string{"cluster-resource-attribute", "execution", "task-resource-attribute"} + aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"task-resource-attributes"}} + shortArray := []string{clusterResourceAttributesShort, execCmdShort, taskResourceAttributesShort} + longArray := []string{clusterResourceAttributesLong, execCmdLong, taskResourceAttributesLong} + for i := range cmdNouns { + assert.Equal(t, cmdNouns[i].Use, useArray[i]) + assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) + assert.Equal(t, cmdNouns[i].Short, shortArray[i]) + assert.Equal(t, cmdNouns[i].Long, longArray[i]) + } } diff --git a/flytectl/cmd/delete/matchable_attribute_util.go b/flytectl/cmd/delete/matchable_attribute_util.go new file mode 100644 index 0000000000..6621ae85d8 --- /dev/null +++ b/flytectl/cmd/delete/matchable_attribute_util.go @@ -0,0 +1,29 @@ +package delete + +import ( + "context" + + "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" +) + +func deleteMatchableAttr(ctx context.Context, project, domain, workflowName string, + deleter ext.AdminDeleterExtInterface, rsType admin.MatchableResource) error { + if len(workflowName) > 0 { + // Delete the workflow attribute from the admin. If the attribute doesn't exist , admin deesn't return an error and same behavior is followed here + err := deleter.DeleteWorkflowAttributes(ctx, project, domain, workflowName, rsType) + if err != nil { + return err + } + logger.Debugf(ctx, "Deleted matchable resources from %v project and domain %v and workflow %v", project, domain, workflowName) + } else { + // Delete the project domain attribute from the admin. If the attribute doesn't exist , admin deesn't return an error and same behavior is followed here + err := deleter.DeleteProjectDomainAttributes(ctx, project, domain, rsType) + if err != nil { + return err + } + logger.Debugf(ctx, "Deleted matchable resources from %v project and domain %v", project, domain) + } + return nil +} diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go new file mode 100644 index 0000000000..18dfa582e8 --- /dev/null +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go @@ -0,0 +1,79 @@ +package delete + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + clusterResourceAttributesShort = "Deletes matchable resources of cluster attributes" + clusterResourceAttributesLong = ` +Deletes cluster resource attributes for given project and domain combination or additionally with workflow name. + +Deletes cluster resource attribute for project and domain +Here the command delete cluster resource attributes for project flytectldemo and development domain. +:: + + flytectl delete cluster-resource-attribute -p flytectldemo -d development + + +Deleting cluster resource attribute using config file which was used for creating it. +Here the command deletes cluster resource attributes from the config file cra.yaml +eg: content of cra.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete cluster-resource-attribute --attrFile cra.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" + +Deleting cluster resource attribute for a workflow +Here the command deletes cluster resource attributes for a workflow + +:: + + flytectl delete cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage +` +) + +func deleteClusterResourceAttributes(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var pwdGetter sconfig.ProjectDomainWorkflowGetter + pwdGetter = sconfig.PDWGetterCommandLine{Config: config.GetConfig(), Args: args} + delConfig := clusterresourceattribute.DefaultDelConfig + + // Get the project domain workflowName from the config file or commandline params + if len(delConfig.AttrFile) > 0 { + // Initialize TaskResourceAttrFileConfig which will be used if delConfig.AttrFile is non empty + // And Reads from the attribute file + pwdGetter = &clusterresourceattribute.AttrFileConfig{} + if err := sconfig.ReadConfigFromFile(pwdGetter, delConfig.AttrFile); err != nil { + return err + } + } + // Use the pwdGetter to initialize the project domain and workflow + project := pwdGetter.GetProject() + domain := pwdGetter.GetDomain() + workflowName := pwdGetter.GetWorkflow() + + // Deletes the matchable attributes using the taskResourceAttrFileConfig + if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), + admin.MatchableResource_CLUSTER_RESOURCE); err != nil { + return err + } + + return nil +} diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go new file mode 100644 index 0000000000..ef84023c45 --- /dev/null +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go @@ -0,0 +1,134 @@ +package delete + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func deleteClusterResourceAttributeSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + clusterresourceattribute.DefaultDelConfig = &clusterresourceattribute.AttrDeleteConfig{} + args = []string{} +} + +func TestDeleteClusterResourceAttributes(t *testing.T) { + t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { + setup() + deleteClusterResourceAttributeSetup() + // Empty attribute file + clusterresourceattribute.DefaultDelConfig.AttrFile = "" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + }) + t.Run("failed project domain attribute deletion", func(t *testing.T) { + setup() + deleteClusterResourceAttributeSetup() + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) + err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + }) + t.Run("successful project domain attribute deletion file", func(t *testing.T) { + setup() + deleteClusterResourceAttributeSetup() + // Empty attribute file + clusterresourceattribute.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_cluster_attribute.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_CLUSTER_RESOURCE) + }) + t.Run("successful workflow attribute deletion", func(t *testing.T) { + setup() + deleteClusterResourceAttributeSetup() + // Empty attribute file + clusterresourceattribute.DefaultDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_CLUSTER_RESOURCE) + }) + t.Run("failed workflow attribute deletion", func(t *testing.T) { + setup() + deleteClusterResourceAttributeSetup() + // Empty attribute file + clusterresourceattribute.DefaultDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) + err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_CLUSTER_RESOURCE) + }) + t.Run("successful workflow attribute deletion file", func(t *testing.T) { + setup() + deleteClusterResourceAttributeSetup() + // Empty attribute file + clusterresourceattribute.DefaultDelConfig.AttrFile = "testdata/valid_workflow_cluster_attribute.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_CLUSTER_RESOURCE) + }) + t.Run("workflow attribute deletion non existent file", func(t *testing.T) { + setup() + deleteClusterResourceAttributeSetup() + // Empty attribute file + clusterresourceattribute.DefaultDelConfig.AttrFile = "testdata/non-existent" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_CLUSTER_RESOURCE) + }) + t.Run("attribute deletion invalid file", func(t *testing.T) { + setup() + deleteClusterResourceAttributeSetup() + // Empty attribute file + clusterresourceattribute.DefaultDelConfig.AttrFile = "testdata/invalid_attribute.yaml" + // No args implying project domain attribute deletion + err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, + fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), + err) + u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_CLUSTER_RESOURCE) + }) +} diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute.go b/flytectl/cmd/delete/matchable_task_resource_attribute.go index 00e8e51148..dbd8293cfe 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute.go @@ -4,10 +4,10 @@ import ( "context" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytectl/cmd/config/subcommand" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" ) const ( @@ -22,7 +22,7 @@ Here the command delete task resource attributes for project flytectldemo and d flytectl delete task-resource-attribute -p flytectldemo -d development -Deleting task resource attribute using config file +Deleting task resource attribute using config file which was used for creating it. Here the command deletes task resource attributes from the config file tra.yaml eg: content of tra.yaml which will use the project domain and workflow name for deleting the resource @@ -33,15 +33,14 @@ eg: content of tra.yaml which will use the project domain and workflow name for .. code-block:: yaml - Domain: development - Project: flytectldemo - Workflow: "" + domain: development + project: flytectldemo defaults: - cpu: "1" - memory: 150Mi + cpu: "1" + memory: "150Mi" limits: - cpu: "2" - memory: 450Mi + cpu: "2" + memory: "450Mi" Deleting task resource attribute for a workflow Here the command deletes task resource attributes for a workflow @@ -55,44 +54,29 @@ Usage ) func deleteTaskResourceAttributes(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - delConfig := subcommand.DefaultTaskResourceDelConfig - var project string - var domain string - var workflowName string + var pwdGetter sconfig.ProjectDomainWorkflowGetter + pwdGetter = sconfig.PDWGetterCommandLine{Config: config.GetConfig(), Args: args} + delConfig := taskresourceattribute.DefaultDelConfig + // Get the project domain workflowName from the config file or commandline params if len(delConfig.AttrFile) > 0 { - // Read the config from the file - taskResourceAttrFileConfig := subcommand.TaskResourceAttrFileConfig{} - if err := taskResourceAttrFileConfig.ReadConfigFromFile(delConfig.AttrFile); err != nil { + // Initialize TaskResourceAttrFileConfig which will be used if delConfig.AttrFile is non empty + // And Reads from the attribute file + pwdGetter = &taskresourceattribute.TaskResourceAttrFileConfig{} + if err := sconfig.ReadConfigFromFile(pwdGetter, delConfig.AttrFile); err != nil { return err } - // Get project domain workflow name from the read file. - project = taskResourceAttrFileConfig.Project - domain = taskResourceAttrFileConfig.Domain - workflowName = taskResourceAttrFileConfig.Workflow - } else { - // Get all the parameters for deletion from the command line - project = config.GetConfig().Project - domain = config.GetConfig().Domain - if len(args) == 1 { - workflowName = args[0] - } } - - if len(workflowName) > 0 { - // Delete the workflow attribute from the admin. If the attribute doesn't exist , admin deesn't return an error and same behavior is followed here - err := cmdCtx.AdminDeleterExt().DeleteWorkflowAttributes(ctx, project, domain, workflowName, admin.MatchableResource_TASK_RESOURCE) - if err != nil { - return err - } - logger.Debugf(ctx, "Deleted task resource attributes from %v project and domain %v and workflow %v", project, domain, workflowName) - } else { - // Delete the project domain attribute from the admin. If the attribute doesn't exist , admin deesn't return an error and same behavior is followed here - err := cmdCtx.AdminDeleterExt().DeleteProjectDomainAttributes(ctx, project, domain, admin.MatchableResource_TASK_RESOURCE) - if err != nil { - return err - } - logger.Debugf(ctx, "Deleted task resource attributes from %v project and domain %v", project, domain) + // Use the pwdGetter to initialize the project domain and workflow + project := pwdGetter.GetProject() + domain := pwdGetter.GetDomain() + workflowName := pwdGetter.GetWorkflow() + + // Deletes the matchable attributes using the taskResourceAttrFileConfig + if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), + admin.MatchableResource_TASK_RESOURCE); err != nil { + return err } + return nil } diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go index 211aeb694b..16443ef270 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -17,7 +17,8 @@ func deleteTaskResourceAttributeSetup() { ctx = u.Ctx cmdCtx = u.CmdCtx mockClient = u.MockClient - subcommand.DefaultTaskResourceDelConfig = &subcommand.TaskResourceAttrDeleteConfig{} + taskresourceattribute.DefaultDelConfig = &taskresourceattribute.AttrDeleteConfig{} + args = []string{} } func TestDeleteTaskResourceAttributes(t *testing.T) { @@ -25,7 +26,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { setup() deleteTaskResourceAttributeSetup() // Empty attribute file - subcommand.DefaultTaskResourceDelConfig.AttrFile = "" + taskresourceattribute.DefaultDelConfig.AttrFile = "" // No args implying project domain attribute deletion u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -50,7 +51,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { setup() deleteTaskResourceAttributeSetup() // Empty attribute file - subcommand.DefaultTaskResourceDelConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" + taskresourceattribute.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" // No args implying project domain attribute deletion u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -63,7 +64,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { setup() deleteTaskResourceAttributeSetup() // Empty attribute file - subcommand.DefaultTaskResourceDelConfig.AttrFile = "" + taskresourceattribute.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -77,7 +78,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { setup() deleteTaskResourceAttributeSetup() // Empty attribute file - subcommand.DefaultTaskResourceDelConfig.AttrFile = "" + taskresourceattribute.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) @@ -92,7 +93,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { setup() deleteTaskResourceAttributeSetup() // Empty attribute file - subcommand.DefaultTaskResourceDelConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" + taskresourceattribute.DefaultDelConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" // No args implying project domain attribute deletion u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -106,7 +107,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { setup() deleteTaskResourceAttributeSetup() // Empty attribute file - subcommand.DefaultTaskResourceDelConfig.AttrFile = "testdata/non-existent" + taskresourceattribute.DefaultDelConfig.AttrFile = "testdata/non-existent" // No args implying project domain attribute deletion u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -120,7 +121,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { setup() deleteTaskResourceAttributeSetup() // Empty attribute file - subcommand.DefaultTaskResourceDelConfig.AttrFile = "testdata/invalid_task_attribute.yaml" + taskresourceattribute.DefaultDelConfig.AttrFile = "testdata/invalid_attribute.yaml" // No args implying project domain attribute deletion err = deleteTaskResourceAttributes(ctx, args, cmdCtx) assert.NotNil(t, err) diff --git a/flytectl/cmd/delete/testdata/invalid_task_attribute.yaml b/flytectl/cmd/delete/testdata/invalid_attribute.yaml similarity index 100% rename from flytectl/cmd/delete/testdata/invalid_task_attribute.yaml rename to flytectl/cmd/delete/testdata/invalid_attribute.yaml diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_cluster_attribute.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_cluster_attribute.yaml new file mode 100644 index 0000000000..c6c25fa904 --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_project_domain_cluster_attribute.yaml @@ -0,0 +1,5 @@ +domain: development +project: flytectldemo +attributes: + "foo": "bar" + "buzz": "lightyear" \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml index 0051a4c2cc..a16186c80b 100644 --- a/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml +++ b/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml @@ -1,6 +1,5 @@ -Domain: development -Project: flytectldemo -Workflow: "" +domain: development +project: flytectldemo defaults: cpu: "1" memory: 150Mi diff --git a/flytectl/cmd/delete/testdata/valid_workflow_cluster_attribute.yaml b/flytectl/cmd/delete/testdata/valid_workflow_cluster_attribute.yaml new file mode 100644 index 0000000000..f8e7b17f65 --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_workflow_cluster_attribute.yaml @@ -0,0 +1,6 @@ +Domain: development +Project: flytectldemo +Workflow: core.control_flow.run_merge_sort.merge_sort +attributes: + "foo": "bar" + "buzz": "lightyear" \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml b/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml index 2593cad309..3b8d08cc79 100644 --- a/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml +++ b/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml @@ -1,6 +1,6 @@ -Domain: development -Project: flytectldemo -Workflow: core.control_flow.run_merge_sort.merge_sort +domain: development +project: flytectldemo +workflow: core.control_flow.run_merge_sort.merge_sort defaults: cpu: "2" memory: 250Mi diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index f5b414013f..a03e4931b3 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -1,7 +1,9 @@ package get import ( - "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" @@ -33,14 +35,17 @@ func CreateGetCommand() *cobra.Command { "task": {CmdFunc: getTaskFunc, Aliases: []string{"tasks"}, Short: taskShort, Long: taskLong, PFlagProvider: taskConfig}, "workflow": {CmdFunc: getWorkflowFunc, Aliases: []string{"workflows"}, Short: workflowShort, - Long: workflowLong, PFlagProvider: subcommand.DefaultWorklfowConfig}, + Long: workflowLong, PFlagProvider: workflow.DefaultConfig}, "launchplan": {CmdFunc: getLaunchPlanFunc, Aliases: []string{"launchplans"}, Short: launchPlanShort, Long: launchPlanLong, PFlagProvider: launchPlanConfig}, "execution": {CmdFunc: getExecutionFunc, Aliases: []string{"executions"}, Short: executionShort, Long: executionLong}, "task-resource-attribute": {CmdFunc: getTaskResourceAttributes, Aliases: []string{"task-resource-attributes"}, Short: taskResourceAttributesShort, - Long: taskResourceAttributesLong, PFlagProvider: subcommand.DefaultTaskResourceFetchConfig}, + Long: taskResourceAttributesLong, PFlagProvider: taskresourceattribute.DefaultFetchConfig}, + "cluster-resource-attribute": {CmdFunc: getClusterResourceAttributes, Aliases: []string{"cluster-resource-attributes"}, + Short: clusterResourceAttributesShort, + Long: clusterResourceAttributesLong, PFlagProvider: clusterresourceattribute.DefaultFetchConfig}, } cmdcore.AddCommands(getCmd, getResourcesFuncs) diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index e277ba1624..1d0bebe97b 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -37,29 +37,24 @@ func TestCreateGetCommand(t *testing.T) { assert.Equal(t, getCommand.Use, "get") assert.Equal(t, getCommand.Short, "Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project.") fmt.Println(getCommand.Commands()) - assert.Equal(t, len(getCommand.Commands()), 6) + assert.Equal(t, len(getCommand.Commands()), 7) cmdNouns := getCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - assert.Equal(t, cmdNouns[0].Use, "execution") - assert.Equal(t, cmdNouns[0].Aliases, []string{"executions"}) - assert.Equal(t, cmdNouns[0].Short, "Gets execution resources") - assert.Equal(t, cmdNouns[1].Use, "launchplan") - assert.Equal(t, cmdNouns[1].Aliases, []string{"launchplans"}) - assert.Equal(t, cmdNouns[1].Short, "Gets launch plan resources") - assert.Equal(t, cmdNouns[2].Use, "project") - assert.Equal(t, cmdNouns[2].Aliases, []string{"projects"}) - assert.Equal(t, cmdNouns[2].Short, "Gets project resources") - assert.Equal(t, cmdNouns[3].Use, "task") - assert.Equal(t, cmdNouns[3].Aliases, []string{"tasks"}) - assert.Equal(t, cmdNouns[3].Short, "Gets task resources") - assert.Equal(t, cmdNouns[4].Use, "task-resource-attribute") - assert.Equal(t, cmdNouns[4].Aliases, []string{"task-resource-attributes"}) - assert.Equal(t, cmdNouns[4].Short, taskResourceAttributesShort) - assert.Equal(t, cmdNouns[4].Long, taskResourceAttributesLong) - assert.Equal(t, cmdNouns[5].Use, "workflow") - assert.Equal(t, cmdNouns[5].Aliases, []string{"workflows"}) - assert.Equal(t, cmdNouns[5].Short, "Gets workflow resources") + useArray := []string{"cluster-resource-attribute", "execution", "launchplan", "project", + "task", "task-resource-attribute", "workflow"} + aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"launchplans"}, {"projects"}, {"tasks"}, + {"task-resource-attributes"}, {"workflows"}} + shortArray := []string{clusterResourceAttributesShort, executionShort, launchPlanShort, projectShort, + taskShort, taskResourceAttributesShort, workflowShort} + longArray := []string{clusterResourceAttributesLong, executionLong, launchPlanLong, projectLong, taskLong, + taskResourceAttributesLong, workflowLong} + for i := range cmdNouns { + assert.Equal(t, cmdNouns[i].Use, useArray[i]) + assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) + assert.Equal(t, cmdNouns[i].Short, shortArray[i]) + assert.Equal(t, cmdNouns[i].Long, longArray[i]) + } } diff --git a/flytectl/cmd/get/matchable_attribute_util.go b/flytectl/cmd/get/matchable_attribute_util.go new file mode 100644 index 0000000000..cddfdab348 --- /dev/null +++ b/flytectl/cmd/get/matchable_attribute_util.go @@ -0,0 +1,32 @@ +package get + +import ( + "context" + + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +func FetchAndUnDecorateMatchableAttr(ctx context.Context, project, domain, workflowName string, + fetcher ext.AdminFetcherExtInterface, unDecorator sconfig.MatchableAttributeUnDecorator, rsType admin.MatchableResource) error { + if len(workflowName) > 0 { + // Fetch the workflow attribute from the admin + workflowAttr, err := fetcher.FetchWorkflowAttributes(ctx, + project, domain, workflowName, rsType) + if err != nil { + return err + } + // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. + unDecorator.UnDecorate(workflowAttr.GetAttributes().GetMatchingAttributes()) + } else { + // Fetch the project domain attribute from the admin + projectDomainAttr, err := fetcher.FetchProjectDomainAttributes(ctx, project, domain, rsType) + if err != nil { + return err + } + // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. + unDecorator.UnDecorate(projectDomainAttr.GetAttributes().GetMatchingAttributes()) + } + return nil +} diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute.go b/flytectl/cmd/get/matchable_cluster_resource_attribute.go new file mode 100644 index 0000000000..4ca0934cd4 --- /dev/null +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute.go @@ -0,0 +1,78 @@ +package get + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + clusterResourceAttributesShort = "Gets matchable resources of cluster resource attributes" + clusterResourceAttributesLong = ` +Retrieves cluster resource attributes for given project and domain combination or additionally with workflow name. + +Retrieves cluster resource attribute for project and domain +Here the command get cluster resource attributes for project flytectldemo and development domain. +:: + + flytectl get cluster-resource-attribute -p flytectldemo -d development + +eg : O/P + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} + +Writing the cluster resource attribute to a file. If there are no cluster resource attributes , command would return an error. +Here the command gets task resource attributes and writes the config file to tra.yaml +eg: content of tra.yaml + +:: + + flytectl get task-resource-attribute --attrFile tra.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" + +Usage +` +) + +func getClusterResourceAttributes(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var project string + var domain string + var workflowName string + + // Get the project domain workflow name parameters from the command line. Project and domain are mandatory for this command + project = config.GetConfig().Project + domain = config.GetConfig().Domain + if len(args) == 1 { + workflowName = args[0] + } + // Construct a shadow config for ClusterResourceAttribute. The shadow config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. + clusterResourceAttrFileConfig := clusterresourceattribute.AttrFileConfig{Project: project, Domain: domain, Workflow: workflowName} + // Get the attribute file name from the command line config + fileName := clusterresourceattribute.DefaultFetchConfig.AttrFile + + // Updates the taskResourceAttrFileConfig with the fetched matchable attribute + if err := FetchAndUnDecorateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminFetcherExt(), + &clusterResourceAttrFileConfig, admin.MatchableResource_CLUSTER_RESOURCE); err != nil { + return err + } + + // Write the config to the file which can be used for update + if err := sconfig.DumpTaskResourceAttr(clusterResourceAttrFileConfig, fileName); err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go new file mode 100644 index 0000000000..dd93934a91 --- /dev/null +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go @@ -0,0 +1,138 @@ +package get + +import ( + "fmt" + "os" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func getClusterResourceAttributeSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + clusterresourceattribute.DefaultFetchConfig = &clusterresourceattribute.AttrFetchConfig{} + // Clean up the temp directory. + _ = os.Remove("temp-output-file") +} + +func TestGetClusterResourceAttributes(t *testing.T) { + clusterResourceAttr := &admin.ClusterResourceAttributes{ + Attributes: map[string]string{"foo": "bar"}, + } + projectDomainResp := &admin.ProjectDomainAttributesGetResponse{ + Attributes: &admin.ProjectDomainAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ClusterResourceAttributes{ + ClusterResourceAttributes: clusterResourceAttr, + }, + }, + }, + } + workflowResp := &admin.WorkflowAttributesGetResponse{ + Attributes: &admin.WorkflowAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Workflow: "workflow", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ClusterResourceAttributes{ + ClusterResourceAttributes: clusterResourceAttr, + }, + }, + }, + } + t.Run("successful get project domain attribute", func(t *testing.T) { + var args []string + setup() + getClusterResourceAttributeSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getClusterResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","attributes":{"foo":"bar"}}`) + }) + t.Run("successful get project domain attribute and write to file", func(t *testing.T) { + var args []string + setup() + getClusterResourceAttributeSetup() + clusterresourceattribute.DefaultFetchConfig.AttrFile = "temp-output-file" + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getClusterResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + tearDownAndVerify(t, `wrote the config to file temp-output-file`) + }) + t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { + var args []string + setup() + getClusterResourceAttributeSetup() + clusterresourceattribute.DefaultFetchConfig.AttrFile = "non-existent-dir/temp-output-file" + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getClusterResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + tearDownAndVerify(t, ``) + }) + t.Run("failed get project domain attribute", func(t *testing.T) { + var args []string + setup() + getClusterResourceAttributeSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getClusterResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + tearDownAndVerify(t, ``) + }) + t.Run("successful get workflow attribute", func(t *testing.T) { + var args []string + setup() + getClusterResourceAttributeSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(workflowResp, nil) + err = getClusterResourceAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + admin.MatchableResource_CLUSTER_RESOURCE) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","attributes":{"foo":"bar"}}`) + }) + t.Run("failed get workflow attribute", func(t *testing.T) { + var args []string + setup() + getClusterResourceAttributeSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getClusterResourceAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + admin.MatchableResource_CLUSTER_RESOURCE) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go index bfa68d6edc..e27367e8a2 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -2,10 +2,10 @@ package get import ( "context" - "fmt" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytectl/cmd/config/subcommand" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) @@ -38,15 +38,14 @@ eg: content of tra.yaml .. code-block:: yaml - Domain: development - Project: flytectldemo - Workflow: "" + domain: development + project: flytectldemo defaults: - cpu: "1" - memory: 150Mi + cpu: "1" + memory: "150Mi" limits: - cpu: "2" - memory: 450Mi + cpu: "2" + memory: "450Mi" Usage ` @@ -64,38 +63,19 @@ func getTaskResourceAttributes(ctx context.Context, args []string, cmdCtx cmdCor workflowName = args[0] } // Construct a shadow config for TaskResourceAttribute. The shadow config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. - taskResourceAttrFileConfig := subcommand.TaskResourceAttrFileConfig{Project: project, Domain: domain, Workflow: workflowName} + taskResourceAttrFileConfig := taskresourceattribute.TaskResourceAttrFileConfig{Project: project, Domain: domain, Workflow: workflowName} // Get the attribute file name from the command line config - fileName := subcommand.DefaultTaskResourceFetchConfig.AttrFile - - if len(workflowName) > 0 { - // Fetch the workflow attribute from the admin - workflowAttr, err := cmdCtx.AdminFetcherExt().FetchWorkflowAttributes(ctx, - project, domain, workflowName, admin.MatchableResource_TASK_RESOURCE) - if err != nil { - taskResourceAttrFileConfig.DumpTaskResourceAttr(ctx, fileName) - return err - } - if workflowAttr.GetAttributes() == nil || workflowAttr.GetAttributes().GetMatchingAttributes() == nil { - return fmt.Errorf("invalid matching attribute returned with nil data") - } - // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. - taskResourceAttrFileConfig.TaskResourceAttributes = workflowAttr.GetAttributes().GetMatchingAttributes().GetTaskResourceAttributes() - } else { - // Fetch the project domain attribute from the admin - projectDomainAttr, err := cmdCtx.AdminFetcherExt().FetchProjectDomainAttributes(ctx, - project, domain, admin.MatchableResource_TASK_RESOURCE) - if err != nil { - taskResourceAttrFileConfig.DumpTaskResourceAttr(ctx, fileName) - return err - } - if projectDomainAttr.GetAttributes() == nil || projectDomainAttr.GetAttributes().GetMatchingAttributes() == nil { - return fmt.Errorf("invalid matching attribute returned with nil data") - } - // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. - taskResourceAttrFileConfig.TaskResourceAttributes = projectDomainAttr.GetAttributes().GetMatchingAttributes().GetTaskResourceAttributes() + fileName := taskresourceattribute.DefaultFetchConfig.AttrFile + + // Updates the taskResourceAttrFileConfig with the fetched matchable attribute + if err := FetchAndUnDecorateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminFetcherExt(), + &taskResourceAttrFileConfig, admin.MatchableResource_TASK_RESOURCE); err != nil { + return err } + // Write the config to the file which can be used for update - taskResourceAttrFileConfig.DumpTaskResourceAttr(ctx, fileName) + if err := sconfig.DumpTaskResourceAttr(taskResourceAttrFileConfig, fileName); err != nil { + return err + } return nil } diff --git a/flytectl/cmd/get/matchable_task_resource_attribute_test.go b/flytectl/cmd/get/matchable_task_resource_attribute_test.go index 22d82df983..2477661d70 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -18,7 +18,7 @@ func getTaskResourceAttributeSetup() { ctx = u.Ctx cmdCtx = u.CmdCtx mockClient = u.MockClient - subcommand.DefaultTaskResourceFetchConfig = &subcommand.TaskResourceAttrFetchConfig{} + taskresourceattribute.DefaultFetchConfig = &taskresourceattribute.AttrFetchConfig{} // Clean up the temp directory. _ = os.Remove("temp-output-file") } @@ -68,13 +68,13 @@ func TestGetTaskResourceAttributes(t *testing.T) { assert.Nil(t, err) u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `{"Project":"dummyProject","Domain":"dummyDomain","Workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { var args []string setup() getTaskResourceAttributeSetup() - subcommand.DefaultTaskResourceFetchConfig.AttrFile = "temp-output-file" + taskresourceattribute.DefaultFetchConfig.AttrFile = "temp-output-file" // No args implying project domain attribute deletion u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) @@ -82,21 +82,22 @@ func TestGetTaskResourceAttributes(t *testing.T) { assert.Nil(t, err) u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `written the config to file temp-output-file`) + tearDownAndVerify(t, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { var args []string setup() getTaskResourceAttributeSetup() - subcommand.DefaultTaskResourceFetchConfig.AttrFile = "non-existent-dir/temp-output-file" + taskresourceattribute.DefaultFetchConfig.AttrFile = "non-existent-dir/temp-output-file" // No args implying project domain attribute deletion u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) err = getTaskResourceAttributes(ctx, args, cmdCtx) - assert.Nil(t, err) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory`) + tearDownAndVerify(t, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { var args []string @@ -110,7 +111,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { assert.Equal(t, fmt.Errorf("failed to fetch response"), err) u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `{"Project":"dummyProject","Domain":"dummyDomain","Workflow":""}`) + tearDownAndVerify(t, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { var args []string @@ -124,7 +125,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `{"Project":"dummyProject","Domain":"dummyDomain","Workflow":"workflow","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { var args []string @@ -139,6 +140,6 @@ func TestGetTaskResourceAttributes(t *testing.T) { u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `{"Project":"dummyProject","Domain":"dummyDomain","Workflow":"workflow"}`) + tearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 3640a5f342..4de25ace61 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -3,7 +3,7 @@ package get import ( "context" - "github.com/flyteorg/flytectl/cmd/config/subcommand" + workflowconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" @@ -108,13 +108,13 @@ func FetchWorkflowForName(ctx context.Context, fetcher ext.AdminFetcherExtInterf var workflows []*admin.Workflow var workflow *admin.Workflow var err error - if subcommand.DefaultWorklfowConfig.Latest { + if workflowconfig.DefaultConfig.Latest { if workflow, err = fetcher.FetchWorkflowLatestVersion(ctx, name, project, domain); err != nil { return nil, err } workflows = append(workflows, workflow) - } else if subcommand.DefaultWorklfowConfig.Version != "" { - if workflow, err = fetcher.FetchWorkflowVersion(ctx, name, subcommand.DefaultWorklfowConfig.Version, project, domain); err != nil { + } else if workflowconfig.DefaultConfig.Version != "" { + if workflow, err = fetcher.FetchWorkflowVersion(ctx, name, workflowconfig.DefaultConfig.Version, project, domain); err != nil { return nil, err } workflows = append(workflows, workflow) diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go index 93928eebc4..bb9f88d356 100644 --- a/flytectl/cmd/get/workflow_test.go +++ b/flytectl/cmd/get/workflow_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/stretchr/testify/assert" @@ -15,8 +15,8 @@ func getWorkflowSetup() { ctx = u.Ctx mockClient = u.MockClient cmdCtx = u.CmdCtx - subcommand.DefaultWorklfowConfig.Latest = false - subcommand.DefaultWorklfowConfig.Version = "" + workflow.DefaultConfig.Latest = false + workflow.DefaultConfig.Version = "" } func TestGetWorkflowFuncWithError(t *testing.T) { @@ -24,7 +24,7 @@ func TestGetWorkflowFuncWithError(t *testing.T) { setup() getWorkflowSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) - subcommand.DefaultWorklfowConfig.Latest = true + workflow.DefaultConfig.Latest = true mockFetcher.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) @@ -35,7 +35,7 @@ func TestGetWorkflowFuncWithError(t *testing.T) { setup() getWorkflowSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) - subcommand.DefaultWorklfowConfig.Version = "v1" + workflow.DefaultConfig.Version = "v1" mockFetcher.OnFetchWorkflowVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching version")) _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) @@ -55,7 +55,7 @@ func TestGetWorkflowFuncWithError(t *testing.T) { t.Run("failure fetching ", func(t *testing.T) { setup() getWorkflowSetup() - subcommand.DefaultWorklfowConfig.Latest = true + workflow.DefaultConfig.Latest = true args := []string{"workflowName"} u.FetcherExt.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) diff --git a/flytectl/cmd/update/matchable_attribute_util.go b/flytectl/cmd/update/matchable_attribute_util.go new file mode 100644 index 0000000000..8717789574 --- /dev/null +++ b/flytectl/cmd/update/matchable_attribute_util.go @@ -0,0 +1,30 @@ +package update + +import ( + "context" + + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flytestdlib/logger" +) + +func DecorateAndUpdateMatchableAttr(ctx context.Context, project, domain, workflowName string, + updater ext.AdminUpdaterExtInterface, mcDecorator sconfig.MatchableAttributeDecorator) error { + matchingAttr := mcDecorator.Decorate() + if len(workflowName) > 0 { + // Update the workflow attribute using the admin. + err := updater.UpdateWorkflowAttributes(ctx, project, domain, workflowName, matchingAttr) + if err != nil { + return err + } + logger.Debugf(ctx, "Updated attributes from %v project and domain %v and workflow %v", project, domain, workflowName) + } else { + // Update the project domain attribute using the admin. + err := updater.UpdateProjectDomainAttributes(ctx, project, domain, matchingAttr) + if err != nil { + return err + } + logger.Debugf(ctx, "Updated attributes from %v project and domain %v", project, domain) + } + return nil +} diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute.go b/flytectl/cmd/update/matchable_cluster_resource_attribute.go new file mode 100644 index 0000000000..ff0b42c9ef --- /dev/null +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute.go @@ -0,0 +1,76 @@ +package update + +import ( + "context" + "fmt" + + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + cmdCore "github.com/flyteorg/flytectl/cmd/core" +) + +const ( + clusterResourceAttributesShort = "Updates matchable resources of cluster attributes" + clusterResourceAttributesLong = ` +Updates cluster resource attributes for given project and domain combination or additionally with workflow name. + +Updating to the cluster resource attribute is only available from a generated file. See the get section for generating this file. +Here the command updates takes the input for cluster resource attributes from the config file cra.yaml +eg: content of tra.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" + +:: + + flytectl update cluster-resource-attribute -attrFile cra.yaml + +Updating cluster resource attribute for project and domain and workflow combination. This will take precedence over any other +resource attribute defined at project domain level. +Update the cluster resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + attributes: + foo: "bar" + buzz: "lightyear" + +:: + + flytectl update cluster-resource-attribute -attrFile cra.yaml + +Usage + +` +) + +func updateClusterResourceAttributesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + updateConfig := clusterresourceattribute.DefaultUpdateConfig + if len(updateConfig.AttrFile) == 0 { + return fmt.Errorf("attrFile is mandatory while calling update for cluster resource attribute") + } + + clustrResourceAttrFileConfig := clusterresourceattribute.AttrFileConfig{} + if err := sconfig.ReadConfigFromFile(&clustrResourceAttrFileConfig, updateConfig.AttrFile); err != nil { + return err + } + + // Get project domain workflow name from the read file. + project := clustrResourceAttrFileConfig.Project + domain := clustrResourceAttrFileConfig.Domain + workflowName := clustrResourceAttrFileConfig.Workflow + + // Updates the admin matchable attribute from taskResourceAttrFileConfig + if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), + clustrResourceAttrFileConfig); err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go new file mode 100644 index 0000000000..1819c6cec4 --- /dev/null +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go @@ -0,0 +1,94 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + u "github.com/flyteorg/flytectl/cmd/testutils" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func updateClusterResourceAttributeSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + clusterresourceattribute.DefaultUpdateConfig = &clusterresourceattribute.AttrUpdateConfig{} +} + +func TestUpdateClusterResourceAttributes(t *testing.T) { + t.Run("no input file for update", func(t *testing.T) { + setup() + updateClusterResourceAttributeSetup() + err = updateClusterResourceAttributesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for cluster resource attribute"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update project domain attribute", func(t *testing.T) { + setup() + updateClusterResourceAttributeSetup() + clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_cluster_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = updateClusterResourceAttributesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update project domain attribute", func(t *testing.T) { + setup() + updateClusterResourceAttributeSetup() + clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_cluster_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updateClusterResourceAttributesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update workflow attribute", func(t *testing.T) { + setup() + updateClusterResourceAttributeSetup() + clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_cluster_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update workflow attribute", func(t *testing.T) { + setup() + updateClusterResourceAttributeSetup() + clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_cluster_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("non existent file", func(t *testing.T) { + setup() + updateClusterResourceAttributeSetup() + clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/non-existent-filel" + err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-filel yaml file"), err) + tearDownAndVerify(t, ``) + }) + t.Run("invalid update file", func(t *testing.T) { + setup() + updateClusterResourceAttributeSetup() + clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/invalid_attribute.yaml" + err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go index 598eb98531..84e3128145 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -4,15 +4,15 @@ import ( "context" "fmt" - "github.com/flyteorg/flytectl/cmd/config/subcommand" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytestdlib/logger" ) const ( taskResourceAttributesShort = "Updates matchable resources of task attributes" taskResourceAttributesLong = ` -Updates task resource attributes for given project,domain combination or additionally with workflow name. +Updates task resource attributes for given project and domain combination or additionally with workflow name. Updating the task resource attribute is only available from a generated file. See the get section for generating this file. Here the command updates takes the input for task resource attributes from the config file tra.yaml @@ -20,34 +20,33 @@ eg: content of tra.yaml .. code-block:: yaml - Domain: development - Project: flytectldemo - Workflow: "" + domain: development + project: flytectldemo defaults: - cpu: "1" - memory: 150Mi + cpu: "1" + memory: "150Mi" limits: - cpu: "2" - memory: 450Mi + cpu: "2" + memory: "450Mi" :: flytectl update task-resource-attribute -attrFile tra.yaml -Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other +Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain .. code-block:: yaml - Domain: development - Project: flytectldemo - Workflow: core.control_flow.run_merge_sort.merge_sort + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort defaults: - cpu: "1" - memory: 150Mi + cpu: "1" + memory: "150Mi" limits: - cpu: "2" - memory: 450Mi + cpu: "2" + memory: "450Mi" :: @@ -59,13 +58,13 @@ Usage ) func updateTaskResourceAttributesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - updateConfig := subcommand.DefaultTaskResourceUpdateConfig + updateConfig := taskresourceattribute.DefaultUpdateConfig if len(updateConfig.AttrFile) == 0 { return fmt.Errorf("attrFile is mandatory while calling update for task resource attribute") } - taskResourceAttrFileConfig := subcommand.TaskResourceAttrFileConfig{} - if err := taskResourceAttrFileConfig.ReadConfigFromFile(updateConfig.AttrFile); err != nil { + taskResourceAttrFileConfig := taskresourceattribute.TaskResourceAttrFileConfig{} + if err := sconfig.ReadConfigFromFile(&taskResourceAttrFileConfig, updateConfig.AttrFile); err != nil { return err } @@ -74,23 +73,10 @@ func updateTaskResourceAttributesFunc(ctx context.Context, args []string, cmdCtx domain := taskResourceAttrFileConfig.Domain workflowName := taskResourceAttrFileConfig.Workflow - // decorate the taskresource Attributes with MatchingAttributes - matchingAttr := taskResourceAttrFileConfig.MatchableAttributeDecorator() - - if len(workflowName) > 0 { - // Update the workflow attribute using the admin. - err := cmdCtx.AdminUpdaterExt().UpdateWorkflowAttributes(ctx, project, domain, workflowName, matchingAttr) - if err != nil { - return err - } - logger.Debugf(ctx, "Updated task resource attributes from %v project and domain %v and workflow %v", project, domain, workflowName) - } else { - // Update the project domain attribute using the admin. - err := cmdCtx.AdminUpdaterExt().UpdateProjectDomainAttributes(ctx, project, domain, matchingAttr) - if err != nil { - return err - } - logger.Debugf(ctx, "Updated task resource attributes from %v project and domain %v", project, domain) + // Updates the admin matchable attribute from taskResourceAttrFileConfig + if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), + taskResourceAttrFileConfig); err != nil { + return err } return nil } diff --git a/flytectl/cmd/update/matchable_task_resource_attribute_test.go b/flytectl/cmd/update/matchable_task_resource_attribute_test.go index 4ab7b84cab..75aca56c29 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/stretchr/testify/assert" @@ -15,7 +15,7 @@ func updateTaskResourceAttributeSetup() { ctx = u.Ctx cmdCtx = u.CmdCtx mockClient = u.MockClient - subcommand.DefaultTaskResourceUpdateConfig = &subcommand.TaskResourceAttrUpdateConfig{} + taskresourceattribute.DefaultUpdateConfig = &taskresourceattribute.AttrUpdateConfig{} } func TestUpdateTaskResourceAttributes(t *testing.T) { @@ -30,7 +30,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { t.Run("successful update project domain attribute", func(t *testing.T) { setup() updateTaskResourceAttributeSetup() - subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" + taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" // No args implying project domain attribute deletion u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -41,7 +41,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { t.Run("failed update project domain attribute", func(t *testing.T) { setup() updateTaskResourceAttributeSetup() - subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" + taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" // No args implying project domain attribute deletion u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) @@ -53,7 +53,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { t.Run("successful update workflow attribute", func(t *testing.T) { setup() updateTaskResourceAttributeSetup() - subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" + taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" // No args implying project domain attribute deletion u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -64,7 +64,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { t.Run("failed update workflow attribute", func(t *testing.T) { setup() updateTaskResourceAttributeSetup() - subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" + taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" // No args implying project domain attribute deletion u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) @@ -76,7 +76,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { t.Run("non existent file", func(t *testing.T) { setup() updateTaskResourceAttributeSetup() - subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/non-existent-filel" + taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/non-existent-filel" err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-filel yaml file"), err) @@ -85,7 +85,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { t.Run("invalid update file", func(t *testing.T) { setup() updateTaskResourceAttributeSetup() - subcommand.DefaultTaskResourceUpdateConfig.AttrFile = "testdata/invalid_task_attribute.yaml" + taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/invalid_attribute.yaml" err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) diff --git a/flytectl/cmd/update/testdata/invalid_task_attribute.yaml b/flytectl/cmd/update/testdata/invalid_attribute.yaml similarity index 100% rename from flytectl/cmd/update/testdata/invalid_task_attribute.yaml rename to flytectl/cmd/update/testdata/invalid_attribute.yaml diff --git a/flytectl/cmd/update/testdata/valid_project_domain_cluster_attribute.yaml b/flytectl/cmd/update/testdata/valid_project_domain_cluster_attribute.yaml new file mode 100644 index 0000000000..c6c25fa904 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_domain_cluster_attribute.yaml @@ -0,0 +1,5 @@ +domain: development +project: flytectldemo +attributes: + "foo": "bar" + "buzz": "lightyear" \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml b/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml index 0051a4c2cc..a16186c80b 100644 --- a/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml +++ b/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml @@ -1,6 +1,5 @@ -Domain: development -Project: flytectldemo -Workflow: "" +domain: development +project: flytectldemo defaults: cpu: "1" memory: 150Mi diff --git a/flytectl/cmd/update/testdata/valid_workflow_cluster_attribute.yaml b/flytectl/cmd/update/testdata/valid_workflow_cluster_attribute.yaml new file mode 100644 index 0000000000..f8e7b17f65 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_workflow_cluster_attribute.yaml @@ -0,0 +1,6 @@ +Domain: development +Project: flytectldemo +Workflow: core.control_flow.run_merge_sort.merge_sort +attributes: + "foo": "bar" + "buzz": "lightyear" \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml b/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml index 2593cad309..3b8d08cc79 100644 --- a/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml +++ b/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml @@ -1,6 +1,6 @@ -Domain: development -Project: flytectldemo -Workflow: core.control_flow.run_merge_sort.merge_sort +domain: development +project: flytectldemo +workflow: core.control_flow.run_merge_sort.merge_sort defaults: cpu: "2" memory: 250Mi diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index c842c0855b..203407d306 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -1,8 +1,10 @@ package update import ( - "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/spf13/cobra" ) @@ -36,8 +38,10 @@ func CreateUpdateCommand() *cobra.Command { Short: updateTaskShort, Long: updateTaskLong}, "workflow": {CmdFunc: updateWorkflowFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateWorkflowShort, Long: updateWorkflowLong}, - "task-resource-attribute": {CmdFunc: updateTaskResourceAttributesFunc, Aliases: []string{}, PFlagProvider: subcommand.DefaultTaskResourceUpdateConfig, + "task-resource-attribute": {CmdFunc: updateTaskResourceAttributesFunc, Aliases: []string{}, PFlagProvider: taskresourceattribute.DefaultUpdateConfig, Short: taskResourceAttributesShort, Long: taskResourceAttributesLong, ProjectDomainNotRequired: true}, + "cluster-resource-attribute": {CmdFunc: updateClusterResourceAttributesFunc, Aliases: []string{}, PFlagProvider: clusterresourceattribute.DefaultUpdateConfig, + Short: clusterResourceAttributesShort, Long: clusterResourceAttributesLong, ProjectDomainNotRequired: true}, } cmdCore.AddCommands(updateCmd, updateResourcesFuncs) return updateCmd diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index 33e9b9eb5e..abebad5236 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -26,16 +26,19 @@ func TestUpdateCommand(t *testing.T) { assert.Equal(t, updateCommand.Use, updateUse) assert.Equal(t, updateCommand.Short, updateShort) assert.Equal(t, updateCommand.Long, updatecmdLong) - assert.Equal(t, len(updateCommand.Commands()), 5) + assert.Equal(t, len(updateCommand.Commands()), 6) cmdNouns := updateCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - useArray := []string{"launchplan", "project", "task", "task-resource-attribute", "workflow"} - aliases := [][]string{{}, {}, {}, {}, {}} - shortArray := []string{updateLPShort, projectShort, updateTaskShort, taskResourceAttributesShort, updateWorkflowShort} - longArray := []string{updateLPLong, projectLong, updateTaskLong, taskResourceAttributesLong, updateWorkflowLong} + useArray := []string{"cluster-resource-attribute", "launchplan", "project", "task", + "task-resource-attribute", "workflow"} + aliases := [][]string{{}, {}, {}, {}, {}, {}} + shortArray := []string{clusterResourceAttributesShort, updateLPShort, projectShort, updateTaskShort, + taskResourceAttributesShort, updateWorkflowShort} + longArray := []string{clusterResourceAttributesLong, updateLPLong, projectLong, updateTaskLong, + taskResourceAttributesLong, updateWorkflowLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 49006715a4..be95495573 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -71,6 +71,7 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_delete_cluster-resource-attribute` - Deletes matchable resources of cluster attributes * :doc:`flytectl_delete_execution` - Terminate/Delete execution resources. * :doc:`flytectl_delete_task-resource-attribute` - Deletes matchable resources of task attributes diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst new file mode 100644 index 0000000000..bb342e1ed9 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -0,0 +1,109 @@ +.. _flytectl_delete_cluster-resource-attribute: + +flytectl delete cluster-resource-attribute +------------------------------------------ + +Deletes matchable resources of cluster attributes + +Synopsis +~~~~~~~~ + + + +Deletes cluster resource attributes for given project and domain combination or additionally with workflow name. + +Deletes cluster resource attribute for project and domain +Here the command delete cluster resource attributes for project flytectldemo and development domain. +:: + + flytectl delete cluster-resource-attribute -p flytectldemo -d development + + +Deleting cluster resource attribute using config file which was used for creating it. +Here the command deletes cluster resource attributes from the config file cra.yaml +eg: content of cra.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete cluster-resource-attribute --attrFile cra.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" + +Deleting cluster resource attribute for a workflow +Here the command deletes cluster resource attributes for a workflow + +:: + + flytectl delete cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage + + +:: + + flytectl delete cluster-resource-attribute [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for delete attribute for the resource type. + -h, --help help for cluster-resource-attribute + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index da97151fef..d31faa8b9f 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -19,7 +19,7 @@ Here the command delete task resource attributes for project flytectldemo and d flytectl delete task-resource-attribute -p flytectldemo -d development -Deleting task resource attribute using config file +Deleting task resource attribute using config file which was used for creating it. Here the command deletes task resource attributes from the config file tra.yaml eg: content of tra.yaml which will use the project domain and workflow name for deleting the resource @@ -30,15 +30,14 @@ eg: content of tra.yaml which will use the project domain and workflow name for .. code-block:: yaml - Domain: development - Project: flytectldemo - Workflow: "" + domain: development + project: flytectldemo defaults: - cpu: "1" - memory: 150Mi + cpu: "1" + memory: "150Mi" limits: - cpu: "2" - memory: 450Mi + cpu: "2" + memory: "450Mi" Deleting task resource attribute for a workflow Here the command deletes task resource attributes for a workflow diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index add9e81c9b..7a37881b50 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -71,6 +71,7 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_get_cluster-resource-attribute` - Gets matchable resources of cluster resource attributes * :doc:`flytectl_get_execution` - Gets execution resources * :doc:`flytectl_get_launchplan` - Gets launch plan resources * :doc:`flytectl_get_project` - Gets project resources diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst new file mode 100644 index 0000000000..db51d52098 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -0,0 +1,107 @@ +.. _flytectl_get_cluster-resource-attribute: + +flytectl get cluster-resource-attribute +--------------------------------------- + +Gets matchable resources of cluster resource attributes + +Synopsis +~~~~~~~~ + + + +Retrieves cluster resource attributes for given project and domain combination or additionally with workflow name. + +Retrieves cluster resource attribute for project and domain +Here the command get cluster resource attributes for project flytectldemo and development domain. +:: + + flytectl get cluster-resource-attribute -p flytectldemo -d development + +eg : O/P + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} + +Writing the cluster resource attribute to a file. If there are no cluster resource attributes , command would return an error. +Here the command gets task resource attributes and writes the config file to tra.yaml +eg: content of tra.yaml + +:: + + flytectl get task-resource-attribute --attrFile tra.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" + +Usage + + +:: + + flytectl get cluster-resource-attribute [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for generating attribute for the resource type. + -h, --help help for cluster-resource-attribute + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index ea2356a8ca..5c1d307eae 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -35,15 +35,14 @@ eg: content of tra.yaml .. code-block:: yaml - Domain: development - Project: flytectldemo - Workflow: "" + domain: development + project: flytectldemo defaults: - cpu: "1" - memory: 150Mi + cpu: "1" + memory: "150Mi" limits: - cpu: "2" - memory: 450Mi + cpu: "2" + memory: "450Mi" Usage diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index a30c1a9337..4692575169 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -73,6 +73,7 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_update_cluster-resource-attribute` - Updates matchable resources of cluster attributes * :doc:`flytectl_update_launchplan` - Updates launch plan metadata * :doc:`flytectl_update_project` - Updates project resources * :doc:`flytectl_update_task` - Updates task metadata diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst new file mode 100644 index 0000000000..96be5e1fa7 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -0,0 +1,111 @@ +.. _flytectl_update_cluster-resource-attribute: + +flytectl update cluster-resource-attribute +------------------------------------------ + +Updates matchable resources of cluster attributes + +Synopsis +~~~~~~~~ + + + +Updates cluster resource attributes for given project and domain combination or additionally with workflow name. + +Updating to the cluster resource attribute is only available from a generated file. See the get section for generating this file. +Here the command updates takes the input for cluster resource attributes from the config file cra.yaml +eg: content of tra.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" + +:: + + flytectl update cluster-resource-attribute -attrFile cra.yaml + +Updating cluster resource attribute for project and domain and workflow combination. This will take precedence over any other +resource attribute defined at project domain level. +Update the cluster resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + attributes: + foo: "bar" + buzz: "lightyear" + +:: + + flytectl update cluster-resource-attribute -attrFile cra.yaml + +Usage + + + +:: + + flytectl update cluster-resource-attribute [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for updating attribute for the resource type. + -h, --help help for cluster-resource-attribute + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. + diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 6f60b7d50d..fd4b141361 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -10,7 +10,7 @@ Synopsis -Updates task resource attributes for given project,domain combination or additionally with workflow name. +Updates task resource attributes for given project and domain combination or additionally with workflow name. Updating the task resource attribute is only available from a generated file. See the get section for generating this file. Here the command updates takes the input for task resource attributes from the config file tra.yaml @@ -18,34 +18,33 @@ eg: content of tra.yaml .. code-block:: yaml - Domain: development - Project: flytectldemo - Workflow: "" + domain: development + project: flytectldemo defaults: - cpu: "1" - memory: 150Mi + cpu: "1" + memory: "150Mi" limits: - cpu: "2" - memory: 450Mi + cpu: "2" + memory: "450Mi" :: flytectl update task-resource-attribute -attrFile tra.yaml -Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other +Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain .. code-block:: yaml - Domain: development - Project: flytectldemo - Workflow: core.control_flow.run_merge_sort.merge_sort + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort defaults: - cpu: "1" - memory: 150Mi + cpu: "1" + memory: "150Mi" limits: - cpu: "2" - memory: 450Mi + cpu: "2" + memory: "450Mi" :: diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index 78996e38ce..e65582ff28 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -12,8 +12,19 @@ Nouns gen/flytectl_get_project gen/flytectl_get_workflow gen/flytectl_get_task + gen/flytectl_get_task-resource-attribute + gen/flytectl_get_cluster-resource-attribute gen/flytectl_get_launchplan + gen/flytectl_update_launchplan + gen/flytectl_update_workflow gen/flytectl_update_project + gen/flytectl_update_task + gen/flytectl_update_task-resource-attribute + gen/flytectl_update_cluster-resource-attribute gen/flytectl_register_files + gen/flytectl_delete_execution + gen/flytectl_delete_task-resource-attribute + gen/flytectl_delete_cluster-resource-attribute gen/flytectl_version gen/flytectl_config_validate + gen/flytectl_config_discover diff --git a/flytectl/pkg/ext/attribute_match_fetcher.go b/flytectl/pkg/ext/attribute_match_fetcher.go index f3ea76b369..0af146e8e1 100644 --- a/flytectl/pkg/ext/attribute_match_fetcher.go +++ b/flytectl/pkg/ext/attribute_match_fetcher.go @@ -2,6 +2,7 @@ package ext import ( "context" + "fmt" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) @@ -14,7 +15,13 @@ func (a *AdminFetcherExtClient) FetchWorkflowAttributes(ctx context.Context, pro Workflow: name, ResourceType: rsType, }) - return workflowAttr, err + if err != nil { + return nil, err + } + if workflowAttr.GetAttributes() == nil || workflowAttr.GetAttributes().GetMatchingAttributes() == nil { + return nil, fmt.Errorf("attribute doesn't exist") + } + return workflowAttr, nil } func (a *AdminFetcherExtClient) FetchProjectDomainAttributes(ctx context.Context, project, domain string, @@ -25,5 +32,11 @@ func (a *AdminFetcherExtClient) FetchProjectDomainAttributes(ctx context.Context Domain: domain, ResourceType: rsType, }) - return projectDomainAttr, err + if err != nil { + return nil, err + } + if projectDomainAttr.GetAttributes() == nil || projectDomainAttr.GetAttributes().GetMatchingAttributes() == nil { + return nil, fmt.Errorf("attribute doesn't exist") + } + return projectDomainAttr, nil } diff --git a/flytectl/pkg/ext/attribute_match_fetcher_test.go b/flytectl/pkg/ext/attribute_match_fetcher_test.go index b91d18fe3a..ea7f29929a 100644 --- a/flytectl/pkg/ext/attribute_match_fetcher_test.go +++ b/flytectl/pkg/ext/attribute_match_fetcher_test.go @@ -12,38 +12,70 @@ import ( "github.com/stretchr/testify/mock" ) +var wResp *admin.WorkflowAttributesGetResponse + +var pResp *admin.ProjectDomainAttributesGetResponse + func getAttributeMatchFetcherSetup() { ctx = context.Background() adminClient = new(mocks.AdminServiceClient) adminFetcherExt = AdminFetcherExtClient{AdminClient: adminClient} + wResp = &admin.WorkflowAttributesGetResponse{Attributes: &admin.WorkflowAttributes{ + MatchingAttributes: &admin.MatchingAttributes{ + Target: nil, + }}} + pResp = &admin.ProjectDomainAttributesGetResponse{Attributes: &admin.ProjectDomainAttributes{ + Project: "dummyProject", + Domain: "dummyDomain", + MatchingAttributes: &admin.MatchingAttributes{ + Target: nil, + }}} } func TestFetchWorkflowAttributes(t *testing.T) { getAttributeMatchFetcherSetup() - resp := &admin.WorkflowAttributesGetResponse{} - adminClient.OnGetWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(resp, nil) + adminClient.OnGetWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(wResp, nil) _, err := adminFetcherExt.FetchWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", admin.MatchableResource_TASK_RESOURCE) assert.Nil(t, err) } func TestFetchWorkflowAttributesError(t *testing.T) { - getAttributeMatchFetcherSetup() - adminClient.OnGetWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) - _, err := adminFetcherExt.FetchWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", admin.MatchableResource_TASK_RESOURCE) - assert.Equal(t, fmt.Errorf("failed"), err) + t.Run("failed api", func(t *testing.T) { + getAttributeMatchFetcherSetup() + adminClient.OnGetWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", admin.MatchableResource_TASK_RESOURCE) + assert.Equal(t, fmt.Errorf("failed"), err) + }) + t.Run("empty data from api", func(t *testing.T) { + getAttributeMatchFetcherSetup() + wResp := &admin.WorkflowAttributesGetResponse{} + adminClient.OnGetWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(wResp, nil) + _, err := adminFetcherExt.FetchWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", admin.MatchableResource_TASK_RESOURCE) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("attribute doesn't exist"), err) + }) } func TestFetchProjectDomainAttributes(t *testing.T) { getAttributeMatchFetcherSetup() - resp := &admin.ProjectDomainAttributesGetResponse{} - adminClient.OnGetProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(resp, nil) + adminClient.OnGetProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(pResp, nil) _, err := adminFetcherExt.FetchProjectDomainAttributes(ctx, "dummyProject", "domainValue", admin.MatchableResource_TASK_RESOURCE) assert.Nil(t, err) } func TestFetchProjectDomainAttributesError(t *testing.T) { - getAttributeMatchFetcherSetup() - adminClient.OnGetProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) - _, err := adminFetcherExt.FetchProjectDomainAttributes(ctx, "dummyProject", "domainValue", admin.MatchableResource_TASK_RESOURCE) - assert.Equal(t, fmt.Errorf("failed"), err) + t.Run("failed api", func(t *testing.T) { + getAttributeMatchFetcherSetup() + adminClient.OnGetProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchProjectDomainAttributes(ctx, "dummyProject", "domainValue", admin.MatchableResource_TASK_RESOURCE) + assert.Equal(t, fmt.Errorf("failed"), err) + }) + t.Run("empty data from api", func(t *testing.T) { + getAttributeMatchFetcherSetup() + pResp := &admin.ProjectDomainAttributesGetResponse{} + adminClient.OnGetProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(pResp, nil) + _, err := adminFetcherExt.FetchProjectDomainAttributes(ctx, "dummyProject", "domainValue", admin.MatchableResource_TASK_RESOURCE) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("attribute doesn't exist"), err) + }) } From 4d43aee9efe4a2ae689630d3ffb8a81c4fb821a4 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Fri, 14 May 2021 07:13:52 +0530 Subject: [PATCH 049/645] Added support for execution queue attribute (#66) * Added support for execution queue attribute Signed-off-by: Prafulla Mahindrakar --- .../attrdeleteconfig_flags.go | 46 ++++++ .../attrdeleteconfig_flags_test.go | 124 ++++++++++++++++ .../attrfetchconfig_flags.go | 46 ++++++ .../attrfetchconfig_flags_test.go | 124 ++++++++++++++++ .../attrupdateconfig_flags.go | 46 ++++++ .../attrupdateconfig_flags_test.go | 124 ++++++++++++++++ .../executionqueueattribute/delete_config.go | 10 ++ .../executionqueueattribute/fetch_config.go | 9 ++ .../executionqueueattribute/file_config.go | 47 ++++++ .../file_config_test.go | 46 ++++++ .../executionqueueattribute/update_config.go | 10 ++ flytectl/cmd/delete/delete.go | 4 + flytectl/cmd/delete/delete_test.go | 16 +- .../matchable_cluster_resource_attribute.go | 15 +- ...tchable_cluster_resource_attribute_test.go | 4 +- .../matchable_execution_queue_attribute.go | 82 +++++++++++ ...atchable_execution_queue_attribute_test.go | 134 +++++++++++++++++ .../matchable_task_resource_attribute.go | 21 +-- .../matchable_task_resource_attribute_test.go | 4 +- ...ject_domain_execution_queue_attribute.yaml | 7 + ...id_workflow_execution_queue_attribute.yaml | 8 + flytectl/cmd/get/get.go | 4 + flytectl/cmd/get/get_test.go | 15 +- .../matchable_cluster_resource_attribute.go | 30 ++-- ...tchable_cluster_resource_attribute_test.go | 6 +- .../matchable_execution_queue_attribute.go | 92 ++++++++++++ ...atchable_execution_queue_attribute_test.go | 138 ++++++++++++++++++ .../get/matchable_task_resource_attribute.go | 33 +++-- .../matchable_task_resource_attribute_test.go | 6 +- .../matchable_cluster_resource_attribute.go | 32 ++-- ...tchable_cluster_resource_attribute_test.go | 6 +- .../matchable_execution_queue_attribute.go | 84 +++++++++++ ...atchable_execution_queue_attribute_test.go | 94 ++++++++++++ .../matchable_task_resource_attribute.go | 42 +++--- .../matchable_task_resource_attribute_test.go | 6 +- ...ject_domain_execution_queue_attribute.yaml | 7 + ...id_workflow_execution_queue_attribute.yaml | 8 + flytectl/cmd/update/update.go | 3 + flytectl/cmd/update/update_test.go | 16 +- flytectl/docs/source/gen/flytectl_delete.rst | 1 + ...ectl_delete_cluster-resource-attribute.rst | 15 +- ...tectl_delete_execution-queue-attribute.rst | 112 ++++++++++++++ ...lytectl_delete_task-resource-attribute.rst | 21 +-- flytectl/docs/source/gen/flytectl_get.rst | 1 + ...lytectl_get_cluster-resource-attribute.rst | 30 ++-- ...flytectl_get_execution-queue-attribute.rst | 121 +++++++++++++++ .../flytectl_get_task-resource-attribute.rst | 33 +++-- flytectl/docs/source/gen/flytectl_update.rst | 1 + ...ectl_update_cluster-resource-attribute.rst | 32 ++-- ...tectl_update_execution-queue-attribute.rst | 119 +++++++++++++++ ...lytectl_update_task-resource-attribute.rst | 42 +++--- flytectl/docs/source/nouns.rst | 3 + 52 files changed, 1911 insertions(+), 169 deletions(-) create mode 100755 flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go create mode 100644 flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go create mode 100644 flytectl/cmd/config/subcommand/executionqueueattribute/fetch_config.go create mode 100644 flytectl/cmd/config/subcommand/executionqueueattribute/file_config.go create mode 100644 flytectl/cmd/config/subcommand/executionqueueattribute/file_config_test.go create mode 100644 flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go create mode 100644 flytectl/cmd/delete/matchable_execution_queue_attribute.go create mode 100644 flytectl/cmd/delete/matchable_execution_queue_attribute_test.go create mode 100644 flytectl/cmd/delete/testdata/valid_project_domain_execution_queue_attribute.yaml create mode 100644 flytectl/cmd/delete/testdata/valid_workflow_execution_queue_attribute.yaml create mode 100644 flytectl/cmd/get/matchable_execution_queue_attribute.go create mode 100644 flytectl/cmd/get/matchable_execution_queue_attribute_test.go create mode 100644 flytectl/cmd/update/matchable_execution_queue_attribute.go create mode 100644 flytectl/cmd/update/matchable_execution_queue_attribute_test.go create mode 100644 flytectl/cmd/update/testdata/valid_project_domain_execution_queue_attribute.yaml create mode 100644 flytectl/cmd/update/testdata/valid_workflow_execution_queue_attribute.yaml create mode 100644 flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst create mode 100644 flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go new file mode 100755 index 0000000000..15852717de --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionqueueattribute + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrDeleteConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go new file mode 100755 index 0000000000..d42fa0c9c7 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionqueueattribute + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrDeleteConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrDeleteConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrDeleteConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrDeleteConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrDeleteConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrDeleteConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrDeleteConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrDeleteConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(val, result)) +} + +func testDecodeSlice_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) +} + +func TestAttrDeleteConfig_GetPFlagSet(t *testing.T) { + val := AttrDeleteConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrDeleteConfig_SetFlags(t *testing.T) { + actual := AttrDeleteConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultDelConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags.go new file mode 100755 index 0000000000..0eed381d70 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionqueueattribute + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrFetchConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags_test.go new file mode 100755 index 0000000000..449b82faae --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionqueueattribute + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrFetchConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrFetchConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrFetchConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrFetchConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrFetchConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrFetchConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrFetchConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrFetchConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(val, result)) +} + +func testDecodeSlice_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) +} + +func TestAttrFetchConfig_GetPFlagSet(t *testing.T) { + val := AttrFetchConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrFetchConfig_SetFlags(t *testing.T) { + actual := AttrFetchConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultFetchConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrFetchConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go new file mode 100755 index 0000000000..c858ca34c8 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionqueueattribute + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrUpdateConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go new file mode 100755 index 0000000000..dbe6642165 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionqueueattribute + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrUpdateConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrUpdateConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrUpdateConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrUpdateConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrUpdateConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrUpdateConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrUpdateConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrUpdateConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(val, result)) +} + +func testDecodeSlice_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) +} + +func TestAttrUpdateConfig_GetPFlagSet(t *testing.T) { + val := AttrUpdateConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrUpdateConfig_SetFlags(t *testing.T) { + actual := AttrUpdateConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultUpdateConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go new file mode 100644 index 0000000000..a6754eb4f4 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go @@ -0,0 +1,10 @@ +package executionqueueattribute + +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig + +// AttrDeleteConfig Matchable resource attributes configuration passed from command line +type AttrDeleteConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` +} + +var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/fetch_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/fetch_config.go new file mode 100644 index 0000000000..4c5c154f2b --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/fetch_config.go @@ -0,0 +1,9 @@ +package executionqueueattribute + +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig + +type AttrFetchConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` +} + +var DefaultFetchConfig = &AttrFetchConfig{} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/file_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/file_config.go new file mode 100644 index 0000000000..1726f0b693 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/file_config.go @@ -0,0 +1,47 @@ +package executionqueueattribute + +import ( + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +// AttrFileConfig shadow Config for ExecutionQueueAttributes. +// The shadow Config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. +// As the same structure is being used for both ProjectDomainAttribute/Workflowattribute +type AttrFileConfig struct { + Project string `json:"project"` + Domain string `json:"domain"` + Workflow string `json:"workflow,omitempty"` + *admin.ExecutionQueueAttributes +} + +// Decorate decorator over ExecutionQueueAttributes. +func (a AttrFileConfig) Decorate() *admin.MatchingAttributes { + return &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionQueueAttributes{ + ExecutionQueueAttributes: a.ExecutionQueueAttributes, + }, + } +} + +// UnDecorate to uncover ExecutionQueueAttributes. +func (a *AttrFileConfig) UnDecorate(matchingAttribute *admin.MatchingAttributes) { + if matchingAttribute == nil { + return + } + a.ExecutionQueueAttributes = matchingAttribute.GetExecutionQueueAttributes() +} + +// GetProject from the AttrFileConfig +func (a AttrFileConfig) GetProject() string { + return a.Project +} + +// GetDomain from the AttrFileConfig +func (a AttrFileConfig) GetDomain() string { + return a.Domain +} + +// GetWorkflow from the AttrFileConfig +func (a AttrFileConfig) GetWorkflow() string { + return a.Workflow +} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/file_config_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/file_config_test.go new file mode 100644 index 0000000000..8148d8b7cd --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/file_config_test.go @@ -0,0 +1,46 @@ +package executionqueueattribute + +import ( + "testing" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" +) + +func TestFileConfig(t *testing.T) { + executionQueueAttrFileConfig := AttrFileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + ExecutionQueueAttributes: &admin.ExecutionQueueAttributes{ + Tags: []string{"foo", "bar"}, + }, + } + matchingAttr := &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionQueueAttributes{ + ExecutionQueueAttributes: executionQueueAttrFileConfig.ExecutionQueueAttributes, + }, + } + t.Run("decorate", func(t *testing.T) { + assert.Equal(t, matchingAttr, executionQueueAttrFileConfig.Decorate()) + }) + + t.Run("decorate", func(t *testing.T) { + executionAttrFileConfigNew := AttrFileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + } + executionAttrFileConfigNew.UnDecorate(matchingAttr) + assert.Equal(t, executionQueueAttrFileConfig, executionAttrFileConfigNew) + }) + t.Run("get project domain workflow", func(t *testing.T) { + executionQueueAttrFileConfigNew := AttrFileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + Workflow: "workflow", + } + assert.Equal(t, "dummyProject", executionQueueAttrFileConfigNew.GetProject()) + assert.Equal(t, "dummyDomain", executionQueueAttrFileConfigNew.GetDomain()) + assert.Equal(t, "workflow", executionQueueAttrFileConfigNew.GetWorkflow()) + }) +} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go new file mode 100644 index 0000000000..11b319f1d1 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go @@ -0,0 +1,10 @@ +package executionqueueattribute + +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig + +// AttrUpdateConfig Matchable resource attributes configuration passed from command line +type AttrUpdateConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` +} + +var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index fe518f9ca0..5a64a58ce3 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -2,6 +2,7 @@ package delete import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdcore "github.com/flyteorg/flytectl/cmd/core" @@ -35,6 +36,9 @@ func RemoteDeleteCommand() *cobra.Command { "cluster-resource-attribute": {CmdFunc: deleteClusterResourceAttributes, Aliases: []string{"cluster-resource-attributes"}, Short: clusterResourceAttributesShort, Long: clusterResourceAttributesLong, PFlagProvider: clusterresourceattribute.DefaultDelConfig, ProjectDomainNotRequired: true}, + "execution-queue-attribute": {CmdFunc: deleteExecutionQueueAttributes, Aliases: []string{"execution-queue-attributes"}, + Short: executionQueueAttributesShort, + Long: executionQueueAttributesLong, PFlagProvider: executionqueueattribute.DefaultDelConfig, ProjectDomainNotRequired: true}, } cmdcore.AddCommands(deleteCmd, terminateResourcesFuncs) return deleteCmd diff --git a/flytectl/cmd/delete/delete_test.go b/flytectl/cmd/delete/delete_test.go index 52ea0e9090..3f5739c9cf 100644 --- a/flytectl/cmd/delete/delete_test.go +++ b/flytectl/cmd/delete/delete_test.go @@ -18,6 +18,12 @@ var ( mockClient *mocks.AdminServiceClient cmdCtx cmdCore.CommandContext ) + +const ( + testDataNonExistentFile = "testdata/non-existent-file" + testDataInvalidAttrFile = "testdata/invalid_attribute.yaml" +) + var setup = testutils.Setup var tearDownAndVerify = testutils.TearDownAndVerify @@ -26,16 +32,16 @@ func TestDeleteCommand(t *testing.T) { assert.Equal(t, deleteCommand.Use, "delete") assert.Equal(t, deleteCommand.Short, deleteCmdShort) assert.Equal(t, deleteCommand.Long, deleteCmdLong) - assert.Equal(t, len(deleteCommand.Commands()), 3) + assert.Equal(t, len(deleteCommand.Commands()), 4) cmdNouns := deleteCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - useArray := []string{"cluster-resource-attribute", "execution", "task-resource-attribute"} - aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"task-resource-attributes"}} - shortArray := []string{clusterResourceAttributesShort, execCmdShort, taskResourceAttributesShort} - longArray := []string{clusterResourceAttributesLong, execCmdLong, taskResourceAttributesLong} + useArray := []string{"cluster-resource-attribute", "execution", "execution-queue-attribute", "task-resource-attribute"} + aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"execution-queue-attributes"}, {"task-resource-attributes"}} + shortArray := []string{clusterResourceAttributesShort, execCmdShort, executionQueueAttributesShort, taskResourceAttributesShort} + longArray := []string{clusterResourceAttributesLong, execCmdLong, executionQueueAttributesLong, taskResourceAttributesLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go index 18dfa582e8..9dd6bc526b 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go @@ -22,8 +22,9 @@ Here the command delete cluster resource attributes for project flytectldemo an flytectl delete cluster-resource-attribute -p flytectldemo -d development -Deleting cluster resource attribute using config file which was used for creating it. +Deletes cluster resource attribute using config file which was used for creating it. Here the command deletes cluster resource attributes from the config file cra.yaml +Attributes are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete eg: content of cra.yaml which will use the project domain and workflow name for deleting the resource :: @@ -33,13 +34,13 @@ eg: content of cra.yaml which will use the project domain and workflow name for .. code-block:: yaml - domain: development - project: flytectldemo - attributes: - foo: "bar" - buzz: "lightyear" + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" -Deleting cluster resource attribute for a workflow +Deletes cluster resource attribute for a workflow Here the command deletes cluster resource attributes for a workflow :: diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go index ef84023c45..f9290ad6b7 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go @@ -107,7 +107,7 @@ func TestDeleteClusterResourceAttributes(t *testing.T) { setup() deleteClusterResourceAttributeSetup() // Empty attribute file - clusterresourceattribute.DefaultDelConfig.AttrFile = "testdata/non-existent" + clusterresourceattribute.DefaultDelConfig.AttrFile = testDataNonExistentFile // No args implying project domain attribute deletion u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -121,7 +121,7 @@ func TestDeleteClusterResourceAttributes(t *testing.T) { setup() deleteClusterResourceAttributeSetup() // Empty attribute file - clusterresourceattribute.DefaultDelConfig.AttrFile = "testdata/invalid_attribute.yaml" + clusterresourceattribute.DefaultDelConfig.AttrFile = testDataInvalidAttrFile // No args implying project domain attribute deletion err = deleteClusterResourceAttributes(ctx, args, cmdCtx) assert.NotNil(t, err) diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute.go b/flytectl/cmd/delete/matchable_execution_queue_attribute.go new file mode 100644 index 0000000000..2f11ce5c5b --- /dev/null +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute.go @@ -0,0 +1,82 @@ +package delete + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + executionQueueAttributesShort = "Deletes matchable resources of execution queue attributes" + executionQueueAttributesLong = ` +Deletes execution queue attributes for given project and domain combination or additionally with workflow name. + +Deletes execution queue attribute for project and domain +Here the command delete execution queue attributes for project flytectldemo and development domain. +:: + + flytectl delete execution-queue-attribute -p flytectldemo -d development + + +Deletes execution queue attribute using config file which was used for creating it. +Here the command deletes execution queue attributes from the config file era.yaml +Tags are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete +eg: content of era.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete execution-queue-attribute --attrFile era.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + tags: + - foo + - bar + - buzz + - lightyear + +Deletes execution queue attribute for a workflow +Here the command deletes the execution queue attributes for a workflow + +:: + + flytectl delete execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage +` +) + +func deleteExecutionQueueAttributes(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var pwdGetter sconfig.ProjectDomainWorkflowGetter + pwdGetter = sconfig.PDWGetterCommandLine{Config: config.GetConfig(), Args: args} + delConfig := executionqueueattribute.DefaultDelConfig + + // Get the project domain workflowName from the config file or commandline params + if len(delConfig.AttrFile) > 0 { + // Initialize AttrFileConfig which will be used if delConfig.AttrFile is non empty + // And Reads from the attribute file + pwdGetter = &executionqueueattribute.AttrFileConfig{} + if err := sconfig.ReadConfigFromFile(pwdGetter, delConfig.AttrFile); err != nil { + return err + } + } + // Use the pwdGetter to initialize the project domain and workflow + project := pwdGetter.GetProject() + domain := pwdGetter.GetDomain() + workflowName := pwdGetter.GetWorkflow() + + // Deletes the matchable attributes using the AttrFileConfig + if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), + admin.MatchableResource_EXECUTION_QUEUE); err != nil { + return err + } + + return nil +} diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go b/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go new file mode 100644 index 0000000000..ef5b2975c0 --- /dev/null +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go @@ -0,0 +1,134 @@ +package delete + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func deleteExecutionQueueAttributeSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + executionqueueattribute.DefaultDelConfig = &executionqueueattribute.AttrDeleteConfig{} + args = []string{} +} + +func TestDeleteExecutionQueueAttributes(t *testing.T) { + t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { + setup() + deleteExecutionQueueAttributeSetup() + // Empty attribute file + executionqueueattribute.DefaultDelConfig.AttrFile = "" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + }) + t.Run("failed project domain attribute deletion", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) + err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + }) + t.Run("successful project domain attribute deletion file", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + executionqueueattribute.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_execution_queue_attribute.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_QUEUE) + }) + t.Run("successful workflow attribute deletion", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + executionqueueattribute.DefaultDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_EXECUTION_QUEUE) + }) + t.Run("failed workflow attribute deletion", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + executionqueueattribute.DefaultDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) + err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_EXECUTION_QUEUE) + }) + t.Run("successful workflow attribute deletion file", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + executionqueueattribute.DefaultDelConfig.AttrFile = "testdata/valid_workflow_execution_queue_attribute.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_EXECUTION_QUEUE) + }) + t.Run("workflow attribute deletion non existent file", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + executionqueueattribute.DefaultDelConfig.AttrFile = testDataNonExistentFile + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_EXECUTION_QUEUE) + }) + t.Run("attribute deletion invalid file", func(t *testing.T) { + setup() + deleteTaskResourceAttributeSetup() + // Empty attribute file + executionqueueattribute.DefaultDelConfig.AttrFile = testDataInvalidAttrFile + // No args implying project domain attribute deletion + err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, + fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), + err) + u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_QUEUE) + }) +} diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute.go b/flytectl/cmd/delete/matchable_task_resource_attribute.go index dbd8293cfe..cafc354714 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute.go @@ -22,8 +22,9 @@ Here the command delete task resource attributes for project flytectldemo and d flytectl delete task-resource-attribute -p flytectldemo -d development -Deleting task resource attribute using config file which was used for creating it. +Deletes task resource attribute using config file which was used for creating it. Here the command deletes task resource attributes from the config file tra.yaml +defaults/limits are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete eg: content of tra.yaml which will use the project domain and workflow name for deleting the resource :: @@ -33,16 +34,16 @@ eg: content of tra.yaml which will use the project domain and workflow name for .. code-block:: yaml - domain: development - project: flytectldemo - defaults: - cpu: "1" - memory: "150Mi" - limits: - cpu: "2" - memory: "450Mi" + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: "150Mi" + limits: + cpu: "2" + memory: "450Mi" -Deleting task resource attribute for a workflow +Deletes task resource attribute for a workflow Here the command deletes task resource attributes for a workflow :: diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go index 16443ef270..204d46f8c7 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go @@ -107,7 +107,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { setup() deleteTaskResourceAttributeSetup() // Empty attribute file - taskresourceattribute.DefaultDelConfig.AttrFile = "testdata/non-existent" + taskresourceattribute.DefaultDelConfig.AttrFile = testDataNonExistentFile // No args implying project domain attribute deletion u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -121,7 +121,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { setup() deleteTaskResourceAttributeSetup() // Empty attribute file - taskresourceattribute.DefaultDelConfig.AttrFile = "testdata/invalid_attribute.yaml" + taskresourceattribute.DefaultDelConfig.AttrFile = testDataInvalidAttrFile // No args implying project domain attribute deletion err = deleteTaskResourceAttributes(ctx, args, cmdCtx) assert.NotNil(t, err) diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_execution_queue_attribute.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_execution_queue_attribute.yaml new file mode 100644 index 0000000000..d04a525b88 --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_project_domain_execution_queue_attribute.yaml @@ -0,0 +1,7 @@ +domain: development +project: flytectldemo +tags: + - foo + - bar + - buzz + - lightyear \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_workflow_execution_queue_attribute.yaml b/flytectl/cmd/delete/testdata/valid_workflow_execution_queue_attribute.yaml new file mode 100644 index 0000000000..7c69c43fec --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_workflow_execution_queue_attribute.yaml @@ -0,0 +1,8 @@ +domain: development +project: flytectldemo +workflow: core.control_flow.run_merge_sort.merge_sort +tags: + - foo + - bar + - buzz + - lightyear \ No newline at end of file diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index a03e4931b3..10f1e6bdb1 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -2,6 +2,7 @@ package get import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" cmdcore "github.com/flyteorg/flytectl/cmd/core" @@ -46,6 +47,9 @@ func CreateGetCommand() *cobra.Command { "cluster-resource-attribute": {CmdFunc: getClusterResourceAttributes, Aliases: []string{"cluster-resource-attributes"}, Short: clusterResourceAttributesShort, Long: clusterResourceAttributesLong, PFlagProvider: clusterresourceattribute.DefaultFetchConfig}, + "execution-queue-attribute": {CmdFunc: getExecutionQueueAttributes, Aliases: []string{"execution-queue-attributes"}, + Short: executionQueueAttributesShort, + Long: executionQueueAttributesLong, PFlagProvider: executionqueueattribute.DefaultFetchConfig}, } cmdcore.AddCommands(getCmd, getResourcesFuncs) diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index 1d0bebe97b..1f567dacc3 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -32,24 +32,29 @@ var ( var setup = testutils.Setup var tearDownAndVerify = testutils.TearDownAndVerify +const ( + testDataTempFile = "temp-output-file" + testDataNotExistentTempFile = "non-existent-dir/temp-output-file" +) + func TestCreateGetCommand(t *testing.T) { getCommand := CreateGetCommand() assert.Equal(t, getCommand.Use, "get") assert.Equal(t, getCommand.Short, "Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project.") fmt.Println(getCommand.Commands()) - assert.Equal(t, len(getCommand.Commands()), 7) + assert.Equal(t, len(getCommand.Commands()), 8) cmdNouns := getCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - useArray := []string{"cluster-resource-attribute", "execution", "launchplan", "project", + useArray := []string{"cluster-resource-attribute", "execution", "execution-queue-attribute", "launchplan", "project", "task", "task-resource-attribute", "workflow"} - aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"launchplans"}, {"projects"}, {"tasks"}, + aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"execution-queue-attributes"}, {"launchplans"}, {"projects"}, {"tasks"}, {"task-resource-attributes"}, {"workflows"}} - shortArray := []string{clusterResourceAttributesShort, executionShort, launchPlanShort, projectShort, + shortArray := []string{clusterResourceAttributesShort, executionShort, executionQueueAttributesShort, launchPlanShort, projectShort, taskShort, taskResourceAttributesShort, workflowShort} - longArray := []string{clusterResourceAttributesLong, executionLong, launchPlanLong, projectLong, taskLong, + longArray := []string{clusterResourceAttributesLong, executionLong, executionQueueAttributesLong, launchPlanLong, projectLong, taskLong, taskResourceAttributesLong, workflowLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute.go b/flytectl/cmd/get/matchable_cluster_resource_attribute.go index 4ca0934cd4..7df8190d09 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute.go @@ -21,28 +21,40 @@ Here the command get cluster resource attributes for project flytectldemo and d flytectl get cluster-resource-attribute -p flytectldemo -d development -eg : O/P +eg : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} +Retrieves cluster resource attribute for project and domain and workflow +Here the command get cluster resource attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +:: + + flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} + Writing the cluster resource attribute to a file. If there are no cluster resource attributes , command would return an error. -Here the command gets task resource attributes and writes the config file to tra.yaml -eg: content of tra.yaml +Here the command gets task resource attributes and writes the config file to cra.yaml +eg: content of cra.yaml :: - flytectl get task-resource-attribute --attrFile tra.yaml + flytectl get task-resource-attribute --attrFile cra.yaml .. code-block:: yaml - domain: development - project: flytectldemo - attributes: - foo: "bar" - buzz: "lightyear" + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" Usage ` diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go index dd93934a91..9991e3688d 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go @@ -20,7 +20,7 @@ func getClusterResourceAttributeSetup() { mockClient = u.MockClient clusterresourceattribute.DefaultFetchConfig = &clusterresourceattribute.AttrFetchConfig{} // Clean up the temp directory. - _ = os.Remove("temp-output-file") + _ = os.Remove(testDataTempFile) } func TestGetClusterResourceAttributes(t *testing.T) { @@ -67,7 +67,7 @@ func TestGetClusterResourceAttributes(t *testing.T) { var args []string setup() getClusterResourceAttributeSetup() - clusterresourceattribute.DefaultFetchConfig.AttrFile = "temp-output-file" + clusterresourceattribute.DefaultFetchConfig.AttrFile = testDataTempFile // No args implying project domain attribute deletion u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) @@ -81,7 +81,7 @@ func TestGetClusterResourceAttributes(t *testing.T) { var args []string setup() getClusterResourceAttributeSetup() - clusterresourceattribute.DefaultFetchConfig.AttrFile = "non-existent-dir/temp-output-file" + clusterresourceattribute.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile // No args implying project domain attribute deletion u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute.go b/flytectl/cmd/get/matchable_execution_queue_attribute.go new file mode 100644 index 0000000000..07e51e3d91 --- /dev/null +++ b/flytectl/cmd/get/matchable_execution_queue_attribute.go @@ -0,0 +1,92 @@ +package get + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + executionQueueAttributesShort = "Gets matchable resources of execution queue attributes" + executionQueueAttributesLong = ` +Retrieves execution queue attributes for given project and domain combination or additionally with workflow name. + +Retrieves execution queue attribute for project and domain +Here the command get execution queue attributes for project flytectldemo and development domain. +:: + + flytectl get execution-queue-attribute -p flytectldemo -d development + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} + +Retrieves execution queue attribute for project and domain and workflow +Here the command get execution queue attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +:: + + flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","tags":["foo", "bar"]} + +Writing the execution queue attribute to a file. If there are no execution queue attributes, command would return an error. +Here the command gets execution queue attributes and writes the config file to era.yaml +eg: content of era.yaml + +:: + + flytectl get execution-queue-attribute --attrFile era.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + tags: + - foo + - bar + - buzz + - lightyear + +Usage +` +) + +func getExecutionQueueAttributes(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var project string + var domain string + var workflowName string + + // Get the project domain workflow name parameters from the command line. Project and domain are mandatory for this command + project = config.GetConfig().Project + domain = config.GetConfig().Domain + if len(args) == 1 { + workflowName = args[0] + } + // Construct a shadow config for ExecutionQueueAttribute. The shadow config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. + executionQueueAttrFileConfig := executionqueueattribute.AttrFileConfig{Project: project, Domain: domain, Workflow: workflowName} + // Get the attribute file name from the command line config + fileName := executionqueueattribute.DefaultFetchConfig.AttrFile + + // Updates the taskResourceAttrFileConfig with the fetched matchable attribute + if err := FetchAndUnDecorateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminFetcherExt(), + &executionQueueAttrFileConfig, admin.MatchableResource_EXECUTION_QUEUE); err != nil { + return err + } + + // Write the config to the file which can be used for update + if err := sconfig.DumpTaskResourceAttr(executionQueueAttrFileConfig, fileName); err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute_test.go b/flytectl/cmd/get/matchable_execution_queue_attribute_test.go new file mode 100644 index 0000000000..92bf156d95 --- /dev/null +++ b/flytectl/cmd/get/matchable_execution_queue_attribute_test.go @@ -0,0 +1,138 @@ +package get + +import ( + "fmt" + "os" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func getExecutionQueueAttributeSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + executionqueueattribute.DefaultFetchConfig = &executionqueueattribute.AttrFetchConfig{} + // Clean up the temp directory. + _ = os.Remove(testDataTempFile) +} + +func TestGetExecutionQueueAttributes(t *testing.T) { + executionQueueAttr := &admin.ExecutionQueueAttributes{ + Tags: []string{"foo", "bar"}, + } + projectDomainResp := &admin.ProjectDomainAttributesGetResponse{ + Attributes: &admin.ProjectDomainAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionQueueAttributes{ + ExecutionQueueAttributes: executionQueueAttr, + }, + }, + }, + } + workflowResp := &admin.WorkflowAttributesGetResponse{ + Attributes: &admin.WorkflowAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Workflow: "workflow", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionQueueAttributes{ + ExecutionQueueAttributes: executionQueueAttr, + }, + }, + }, + } + t.Run("successful get project domain attribute", func(t *testing.T) { + var args []string + setup() + getExecutionQueueAttributeSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getExecutionQueueAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","tags":["foo","bar"]}`) + }) + t.Run("successful get project domain attribute and write to file", func(t *testing.T) { + var args []string + setup() + getExecutionQueueAttributeSetup() + executionqueueattribute.DefaultFetchConfig.AttrFile = testDataTempFile + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getExecutionQueueAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + tearDownAndVerify(t, `wrote the config to file temp-output-file`) + }) + t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { + var args []string + setup() + getExecutionQueueAttributeSetup() + executionqueueattribute.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getExecutionQueueAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + tearDownAndVerify(t, ``) + }) + t.Run("failed get project domain attribute", func(t *testing.T) { + var args []string + setup() + getExecutionQueueAttributeSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getExecutionQueueAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + tearDownAndVerify(t, ``) + }) + t.Run("successful get workflow attribute", func(t *testing.T) { + var args []string + setup() + getExecutionQueueAttributeSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(workflowResp, nil) + err = getExecutionQueueAttributes(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + admin.MatchableResource_EXECUTION_QUEUE) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","tags":["foo","bar"]}`) + }) + t.Run("failed get workflow attribute", func(t *testing.T) { + var args []string + setup() + getExecutionQueueAttributeSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getExecutionQueueAttributes(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + admin.MatchableResource_EXECUTION_QUEUE) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go index e27367e8a2..b3ba8023c4 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -21,11 +21,24 @@ Here the command get task resource attributes for project flytectldemo and deve flytectl get task-resource-attribute -p flytectldemo -d development -eg : O/P +eg : output from the command .. code-block:: json - {"Project":"flytectldemo","Domain":"development","Workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + +Retrieves task resource attribute for project and domain and workflow +Here the command get task resource attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +:: + + flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + Writing the task resource attribute to a file. If there are no task resource attributes a file would be written with basic data populated. Here the command gets task resource attributes and writes the config file to tra.yaml @@ -38,14 +51,14 @@ eg: content of tra.yaml .. code-block:: yaml - domain: development - project: flytectldemo - defaults: - cpu: "1" - memory: "150Mi" - limits: - cpu: "2" - memory: "450Mi" + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: "150Mi" + limits: + cpu: "2" + memory: "450Mi" Usage ` diff --git a/flytectl/cmd/get/matchable_task_resource_attribute_test.go b/flytectl/cmd/get/matchable_task_resource_attribute_test.go index 2477661d70..6df5479859 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute_test.go @@ -20,7 +20,7 @@ func getTaskResourceAttributeSetup() { mockClient = u.MockClient taskresourceattribute.DefaultFetchConfig = &taskresourceattribute.AttrFetchConfig{} // Clean up the temp directory. - _ = os.Remove("temp-output-file") + _ = os.Remove(testDataTempFile) } func TestGetTaskResourceAttributes(t *testing.T) { @@ -74,7 +74,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { var args []string setup() getTaskResourceAttributeSetup() - taskresourceattribute.DefaultFetchConfig.AttrFile = "temp-output-file" + taskresourceattribute.DefaultFetchConfig.AttrFile = testDataTempFile // No args implying project domain attribute deletion u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) @@ -88,7 +88,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { var args []string setup() getTaskResourceAttributeSetup() - taskresourceattribute.DefaultFetchConfig.AttrFile = "non-existent-dir/temp-output-file" + taskresourceattribute.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile // No args implying project domain attribute deletion u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute.go b/flytectl/cmd/update/matchable_cluster_resource_attribute.go index ff0b42c9ef..77b0821c7c 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute.go @@ -16,35 +16,39 @@ Updates cluster resource attributes for given project and domain combination or Updating to the cluster resource attribute is only available from a generated file. See the get section for generating this file. Here the command updates takes the input for cluster resource attributes from the config file cra.yaml -eg: content of tra.yaml +eg: content of cra.yaml .. code-block:: yaml - domain: development - project: flytectldemo - attributes: - foo: "bar" - buzz: "lightyear" + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" :: - flytectl update cluster-resource-attribute -attrFile cra.yaml + flytectl update cluster-resource-attribute --attrFile cra.yaml Updating cluster resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. +Also this will completely overwrite any existing custom project and domain and workflow combination attributes. +Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values +Refer to get cluster-resource-attribute section on how to generate this file Update the cluster resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain + .. code-block:: yaml - domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort - attributes: - foo: "bar" - buzz: "lightyear" + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + attributes: + foo: "bar" + buzz: "lightyear" :: - flytectl update cluster-resource-attribute -attrFile cra.yaml + flytectl update cluster-resource-attribute --attrFile cra.yaml Usage diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go index 1819c6cec4..8cb13ee340 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go @@ -76,16 +76,16 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { t.Run("non existent file", func(t *testing.T) { setup() updateClusterResourceAttributeSetup() - clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/non-existent-filel" + clusterresourceattribute.DefaultUpdateConfig.AttrFile = testDataNonExistentFile err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-filel yaml file"), err) + assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) tearDownAndVerify(t, ``) }) t.Run("invalid update file", func(t *testing.T) { setup() updateClusterResourceAttributeSetup() - clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/invalid_attribute.yaml" + clusterresourceattribute.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute.go b/flytectl/cmd/update/matchable_execution_queue_attribute.go new file mode 100644 index 0000000000..676c351396 --- /dev/null +++ b/flytectl/cmd/update/matchable_execution_queue_attribute.go @@ -0,0 +1,84 @@ +package update + +import ( + "context" + "fmt" + + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + cmdCore "github.com/flyteorg/flytectl/cmd/core" +) + +const ( + executionQueueAttributesShort = "Updates matchable resources of execution queue attributes" + executionQueueAttributesLong = ` +Updates execution queue attributes for given project and domain combination or additionally with workflow name. + +Updating to the execution queue attribute is only available from a generated file. See the get section for generating this file. +Also this will completely overwrite any existing custom project and domain and workflow combination attributes. +Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values +Refer to get execution-queue-attribute section on how to generate this file +Here the command updates takes the input for execution queue attributes from the config file era.yaml +eg: content of era.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + tags: + - foo + - bar + - buzz + - lightyear + +:: + + flytectl update execution-queue-attribute --attrFile era.yaml + +Updating execution queue attribute for project and domain and workflow combination. This will take precedence over any other +execution queue attribute defined at project domain level. +Update the execution queue attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain + +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + tags: + - foo + - bar + - buzz + - lightyear + +:: + + flytectl update execution-queue-attribute --attrFile era.yaml + +Usage + +` +) + +func updateExecutionQueueAttributesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + updateConfig := executionqueueattribute.DefaultUpdateConfig + if len(updateConfig.AttrFile) == 0 { + return fmt.Errorf("attrFile is mandatory while calling update for execution queue attribute") + } + + executionQueueAttrFileConfig := executionqueueattribute.AttrFileConfig{} + if err := sconfig.ReadConfigFromFile(&executionQueueAttrFileConfig, updateConfig.AttrFile); err != nil { + return err + } + + // Get project domain workflow name from the read file. + project := executionQueueAttrFileConfig.Project + domain := executionQueueAttrFileConfig.Domain + workflowName := executionQueueAttrFileConfig.Workflow + + // Updates the admin matchable attribute from executionQueueAttrFileConfig + if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), + executionQueueAttrFileConfig); err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go new file mode 100644 index 0000000000..5659a35696 --- /dev/null +++ b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go @@ -0,0 +1,94 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + u "github.com/flyteorg/flytectl/cmd/testutils" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func updateExecutionQueueAttributeSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + executionqueueattribute.DefaultUpdateConfig = &executionqueueattribute.AttrUpdateConfig{} +} + +func TestExecutionQueueAttributes(t *testing.T) { + t.Run("no input file for update", func(t *testing.T) { + setup() + updateExecutionQueueAttributeSetup() + err = updateExecutionQueueAttributesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for execution queue attribute"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update project domain attribute", func(t *testing.T) { + setup() + updateExecutionQueueAttributeSetup() + executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_queue_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = updateExecutionQueueAttributesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update project domain attribute", func(t *testing.T) { + setup() + updateExecutionQueueAttributeSetup() + executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_queue_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updateExecutionQueueAttributesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update workflow attribute", func(t *testing.T) { + setup() + updateExecutionQueueAttributeSetup() + executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_queue_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = updateExecutionQueueAttributesFunc(ctx, nil, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update workflow attribute", func(t *testing.T) { + setup() + updateExecutionQueueAttributeSetup() + executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_queue_attribute.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updateExecutionQueueAttributesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("non existent file", func(t *testing.T) { + setup() + updateExecutionQueueAttributeSetup() + executionqueueattribute.DefaultUpdateConfig.AttrFile = testDataNonExistentFile + err = updateExecutionQueueAttributesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) + tearDownAndVerify(t, ``) + }) + t.Run("invalid update file", func(t *testing.T) { + setup() + updateExecutionQueueAttributeSetup() + executionqueueattribute.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile + err = updateExecutionQueueAttributesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go index 84e3128145..3e351baa95 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -15,42 +15,46 @@ const ( Updates task resource attributes for given project and domain combination or additionally with workflow name. Updating the task resource attribute is only available from a generated file. See the get section for generating this file. +Also this will completely overwrite any existing custom project and domain and workflow combination attributes. +Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values +Refer to get task-resource-attribute section on how to generate this file Here the command updates takes the input for task resource attributes from the config file tra.yaml eg: content of tra.yaml .. code-block:: yaml - domain: development - project: flytectldemo - defaults: - cpu: "1" - memory: "150Mi" - limits: - cpu: "2" - memory: "450Mi" + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: "150Mi" + limits: + cpu: "2" + memory: "450Mi" :: - flytectl update task-resource-attribute -attrFile tra.yaml + flytectl update task-resource-attribute --attrFile tra.yaml Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain + .. code-block:: yaml - domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort - defaults: - cpu: "1" - memory: "150Mi" - limits: - cpu: "2" - memory: "450Mi" + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + defaults: + cpu: "1" + memory: "150Mi" + limits: + cpu: "2" + memory: "450Mi" :: - flytectl update task-resource-attribute -attrFile tra.yaml + flytectl update task-resource-attribute --attrFile tra.yaml Usage diff --git a/flytectl/cmd/update/matchable_task_resource_attribute_test.go b/flytectl/cmd/update/matchable_task_resource_attribute_test.go index 75aca56c29..a5dd5f7a02 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute_test.go @@ -76,16 +76,16 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { t.Run("non existent file", func(t *testing.T) { setup() updateTaskResourceAttributeSetup() - taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/non-existent-filel" + taskresourceattribute.DefaultUpdateConfig.AttrFile = testDataNonExistentFile err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-filel yaml file"), err) + assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) tearDownAndVerify(t, ``) }) t.Run("invalid update file", func(t *testing.T) { setup() updateTaskResourceAttributeSetup() - taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/invalid_attribute.yaml" + taskresourceattribute.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) diff --git a/flytectl/cmd/update/testdata/valid_project_domain_execution_queue_attribute.yaml b/flytectl/cmd/update/testdata/valid_project_domain_execution_queue_attribute.yaml new file mode 100644 index 0000000000..d04a525b88 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_domain_execution_queue_attribute.yaml @@ -0,0 +1,7 @@ +domain: development +project: flytectldemo +tags: + - foo + - bar + - buzz + - lightyear \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_workflow_execution_queue_attribute.yaml b/flytectl/cmd/update/testdata/valid_workflow_execution_queue_attribute.yaml new file mode 100644 index 0000000000..7c69c43fec --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_workflow_execution_queue_attribute.yaml @@ -0,0 +1,8 @@ +domain: development +project: flytectldemo +workflow: core.control_flow.run_merge_sort.merge_sort +tags: + - foo + - bar + - buzz + - lightyear \ No newline at end of file diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 203407d306..5ea12d3899 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -2,6 +2,7 @@ package update import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -42,6 +43,8 @@ func CreateUpdateCommand() *cobra.Command { Short: taskResourceAttributesShort, Long: taskResourceAttributesLong, ProjectDomainNotRequired: true}, "cluster-resource-attribute": {CmdFunc: updateClusterResourceAttributesFunc, Aliases: []string{}, PFlagProvider: clusterresourceattribute.DefaultUpdateConfig, Short: clusterResourceAttributesShort, Long: clusterResourceAttributesLong, ProjectDomainNotRequired: true}, + "execution-queue-attribute": {CmdFunc: updateExecutionQueueAttributesFunc, Aliases: []string{}, PFlagProvider: executionqueueattribute.DefaultUpdateConfig, + Short: executionQueueAttributesShort, Long: executionQueueAttributesLong, ProjectDomainNotRequired: true}, } cmdCore.AddCommands(updateCmd, updateResourcesFuncs) return updateCmd diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index abebad5236..953bc712ab 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -18,6 +18,12 @@ var ( mockClient *mocks.AdminServiceClient cmdCtx cmdCore.CommandContext ) + +const ( + testDataNonExistentFile = "testdata/non-existent-file" + testDataInvalidAttrFile = "testdata/invalid_attribute.yaml" +) + var setup = testutils.Setup var tearDownAndVerify = testutils.TearDownAndVerify @@ -26,18 +32,18 @@ func TestUpdateCommand(t *testing.T) { assert.Equal(t, updateCommand.Use, updateUse) assert.Equal(t, updateCommand.Short, updateShort) assert.Equal(t, updateCommand.Long, updatecmdLong) - assert.Equal(t, len(updateCommand.Commands()), 6) + assert.Equal(t, len(updateCommand.Commands()), 7) cmdNouns := updateCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - useArray := []string{"cluster-resource-attribute", "launchplan", "project", "task", + useArray := []string{"cluster-resource-attribute", "execution-queue-attribute", "launchplan", "project", "task", "task-resource-attribute", "workflow"} - aliases := [][]string{{}, {}, {}, {}, {}, {}} - shortArray := []string{clusterResourceAttributesShort, updateLPShort, projectShort, updateTaskShort, + aliases := [][]string{{}, {}, {}, {}, {}, {}, {}} + shortArray := []string{clusterResourceAttributesShort, executionQueueAttributesShort, updateLPShort, projectShort, updateTaskShort, taskResourceAttributesShort, updateWorkflowShort} - longArray := []string{clusterResourceAttributesLong, updateLPLong, projectLong, updateTaskLong, + longArray := []string{clusterResourceAttributesLong, executionQueueAttributesLong, updateLPLong, projectLong, updateTaskLong, taskResourceAttributesLong, updateWorkflowLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index be95495573..f766162a09 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -73,5 +73,6 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_delete_cluster-resource-attribute` - Deletes matchable resources of cluster attributes * :doc:`flytectl_delete_execution` - Terminate/Delete execution resources. +* :doc:`flytectl_delete_execution-queue-attribute` - Deletes matchable resources of execution queue attributes * :doc:`flytectl_delete_task-resource-attribute` - Deletes matchable resources of task attributes diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index bb342e1ed9..9971f0bc79 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -19,8 +19,9 @@ Here the command delete cluster resource attributes for project flytectldemo an flytectl delete cluster-resource-attribute -p flytectldemo -d development -Deleting cluster resource attribute using config file which was used for creating it. +Deletes cluster resource attribute using config file which was used for creating it. Here the command deletes cluster resource attributes from the config file cra.yaml +Attributes are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete eg: content of cra.yaml which will use the project domain and workflow name for deleting the resource :: @@ -30,13 +31,13 @@ eg: content of cra.yaml which will use the project domain and workflow name for .. code-block:: yaml - domain: development - project: flytectldemo - attributes: - foo: "bar" - buzz: "lightyear" + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" -Deleting cluster resource attribute for a workflow +Deletes cluster resource attribute for a workflow Here the command deletes cluster resource attributes for a workflow :: diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst new file mode 100644 index 0000000000..d016f47ced --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -0,0 +1,112 @@ +.. _flytectl_delete_execution-queue-attribute: + +flytectl delete execution-queue-attribute +----------------------------------------- + +Deletes matchable resources of execution queue attributes + +Synopsis +~~~~~~~~ + + + +Deletes execution queue attributes for given project and domain combination or additionally with workflow name. + +Deletes execution queue attribute for project and domain +Here the command delete execution queue attributes for project flytectldemo and development domain. +:: + + flytectl delete execution-queue-attribute -p flytectldemo -d development + + +Deletes execution queue attribute using config file which was used for creating it. +Here the command deletes execution queue attributes from the config file era.yaml +Tags are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete +eg: content of era.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete execution-queue-attribute --attrFile era.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + tags: + - foo + - bar + - buzz + - lightyear + +Deletes execution queue attribute for a workflow +Here the command deletes the execution queue attributes for a workflow + +:: + + flytectl delete execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage + + +:: + + flytectl delete execution-queue-attribute [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for delete attribute for the resource type. + -h, --help help for execution-queue-attribute + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index d31faa8b9f..c393da6c54 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -19,8 +19,9 @@ Here the command delete task resource attributes for project flytectldemo and d flytectl delete task-resource-attribute -p flytectldemo -d development -Deleting task resource attribute using config file which was used for creating it. +Deletes task resource attribute using config file which was used for creating it. Here the command deletes task resource attributes from the config file tra.yaml +defaults/limits are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete eg: content of tra.yaml which will use the project domain and workflow name for deleting the resource :: @@ -30,16 +31,16 @@ eg: content of tra.yaml which will use the project domain and workflow name for .. code-block:: yaml - domain: development - project: flytectldemo - defaults: - cpu: "1" - memory: "150Mi" - limits: - cpu: "2" - memory: "450Mi" + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: "150Mi" + limits: + cpu: "2" + memory: "450Mi" -Deleting task resource attribute for a workflow +Deletes task resource attribute for a workflow Here the command deletes task resource attributes for a workflow :: diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 7a37881b50..2852cda14a 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -73,6 +73,7 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_get_cluster-resource-attribute` - Gets matchable resources of cluster resource attributes * :doc:`flytectl_get_execution` - Gets execution resources +* :doc:`flytectl_get_execution-queue-attribute` - Gets matchable resources of execution queue attributes * :doc:`flytectl_get_launchplan` - Gets launch plan resources * :doc:`flytectl_get_project` - Gets project resources * :doc:`flytectl_get_task` - Gets task resources diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index db51d52098..5dfa50b3e1 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -18,28 +18,40 @@ Here the command get cluster resource attributes for project flytectldemo and d flytectl get cluster-resource-attribute -p flytectldemo -d development -eg : O/P +eg : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} +Retrieves cluster resource attribute for project and domain and workflow +Here the command get cluster resource attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +:: + + flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} + Writing the cluster resource attribute to a file. If there are no cluster resource attributes , command would return an error. -Here the command gets task resource attributes and writes the config file to tra.yaml -eg: content of tra.yaml +Here the command gets task resource attributes and writes the config file to cra.yaml +eg: content of cra.yaml :: - flytectl get task-resource-attribute --attrFile tra.yaml + flytectl get task-resource-attribute --attrFile cra.yaml .. code-block:: yaml - domain: development - project: flytectldemo - attributes: - foo: "bar" - buzz: "lightyear" + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" Usage diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst new file mode 100644 index 0000000000..db008340a4 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -0,0 +1,121 @@ +.. _flytectl_get_execution-queue-attribute: + +flytectl get execution-queue-attribute +-------------------------------------- + +Gets matchable resources of execution queue attributes + +Synopsis +~~~~~~~~ + + + +Retrieves execution queue attributes for given project and domain combination or additionally with workflow name. + +Retrieves execution queue attribute for project and domain +Here the command get execution queue attributes for project flytectldemo and development domain. +:: + + flytectl get execution-queue-attribute -p flytectldemo -d development + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} + +Retrieves execution queue attribute for project and domain and workflow +Here the command get execution queue attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +:: + + flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","tags":["foo", "bar"]} + +Writing the execution queue attribute to a file. If there are no execution queue attributes, command would return an error. +Here the command gets execution queue attributes and writes the config file to era.yaml +eg: content of era.yaml + +:: + + flytectl get execution-queue-attribute --attrFile era.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + tags: + - foo + - bar + - buzz + - lightyear + +Usage + + +:: + + flytectl get execution-queue-attribute [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for generating attribute for the resource type. + -h, --help help for execution-queue-attribute + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 5c1d307eae..7b4fa5ba74 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -18,11 +18,24 @@ Here the command get task resource attributes for project flytectldemo and deve flytectl get task-resource-attribute -p flytectldemo -d development -eg : O/P +eg : output from the command .. code-block:: json - {"Project":"flytectldemo","Domain":"development","Workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + +Retrieves task resource attribute for project and domain and workflow +Here the command get task resource attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +:: + + flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + Writing the task resource attribute to a file. If there are no task resource attributes a file would be written with basic data populated. Here the command gets task resource attributes and writes the config file to tra.yaml @@ -35,14 +48,14 @@ eg: content of tra.yaml .. code-block:: yaml - domain: development - project: flytectldemo - defaults: - cpu: "1" - memory: "150Mi" - limits: - cpu: "2" - memory: "450Mi" + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: "150Mi" + limits: + cpu: "2" + memory: "450Mi" Usage diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 4692575169..3fd3d51b06 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -74,6 +74,7 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_update_cluster-resource-attribute` - Updates matchable resources of cluster attributes +* :doc:`flytectl_update_execution-queue-attribute` - Updates matchable resources of execution queue attributes * :doc:`flytectl_update_launchplan` - Updates launch plan metadata * :doc:`flytectl_update_project` - Updates project resources * :doc:`flytectl_update_task` - Updates task metadata diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 96be5e1fa7..f17c81d62b 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -14,35 +14,39 @@ Updates cluster resource attributes for given project and domain combination or Updating to the cluster resource attribute is only available from a generated file. See the get section for generating this file. Here the command updates takes the input for cluster resource attributes from the config file cra.yaml -eg: content of tra.yaml +eg: content of cra.yaml .. code-block:: yaml - domain: development - project: flytectldemo - attributes: - foo: "bar" - buzz: "lightyear" + domain: development + project: flytectldemo + attributes: + foo: "bar" + buzz: "lightyear" :: - flytectl update cluster-resource-attribute -attrFile cra.yaml + flytectl update cluster-resource-attribute --attrFile cra.yaml Updating cluster resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. +Also this will completely overwrite any existing custom project and domain and workflow combination attributes. +Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values +Refer to get cluster-resource-attribute section on how to generate this file Update the cluster resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain + .. code-block:: yaml - domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort - attributes: - foo: "bar" - buzz: "lightyear" + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + attributes: + foo: "bar" + buzz: "lightyear" :: - flytectl update cluster-resource-attribute -attrFile cra.yaml + flytectl update cluster-resource-attribute --attrFile cra.yaml Usage diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst new file mode 100644 index 0000000000..e7aa206301 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -0,0 +1,119 @@ +.. _flytectl_update_execution-queue-attribute: + +flytectl update execution-queue-attribute +----------------------------------------- + +Updates matchable resources of execution queue attributes + +Synopsis +~~~~~~~~ + + + +Updates execution queue attributes for given project and domain combination or additionally with workflow name. + +Updating to the execution queue attribute is only available from a generated file. See the get section for generating this file. +Also this will completely overwrite any existing custom project and domain and workflow combination attributes. +Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values +Refer to get execution-queue-attribute section on how to generate this file +Here the command updates takes the input for execution queue attributes from the config file era.yaml +eg: content of era.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + tags: + - foo + - bar + - buzz + - lightyear + +:: + + flytectl update execution-queue-attribute --attrFile era.yaml + +Updating execution queue attribute for project and domain and workflow combination. This will take precedence over any other +execution queue attribute defined at project domain level. +Update the execution queue attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain + +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + tags: + - foo + - bar + - buzz + - lightyear + +:: + + flytectl update execution-queue-attribute --attrFile era.yaml + +Usage + + + +:: + + flytectl update execution-queue-attribute [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for updating attribute for the resource type. + -h, --help help for execution-queue-attribute + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. + diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index fd4b141361..8e13080509 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -13,42 +13,46 @@ Synopsis Updates task resource attributes for given project and domain combination or additionally with workflow name. Updating the task resource attribute is only available from a generated file. See the get section for generating this file. +Also this will completely overwrite any existing custom project and domain and workflow combination attributes. +Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values +Refer to get task-resource-attribute section on how to generate this file Here the command updates takes the input for task resource attributes from the config file tra.yaml eg: content of tra.yaml .. code-block:: yaml - domain: development - project: flytectldemo - defaults: - cpu: "1" - memory: "150Mi" - limits: - cpu: "2" - memory: "450Mi" + domain: development + project: flytectldemo + defaults: + cpu: "1" + memory: "150Mi" + limits: + cpu: "2" + memory: "450Mi" :: - flytectl update task-resource-attribute -attrFile tra.yaml + flytectl update task-resource-attribute --attrFile tra.yaml Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain + .. code-block:: yaml - domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort - defaults: - cpu: "1" - memory: "150Mi" - limits: - cpu: "2" - memory: "450Mi" + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + defaults: + cpu: "1" + memory: "150Mi" + limits: + cpu: "2" + memory: "450Mi" :: - flytectl update task-resource-attribute -attrFile tra.yaml + flytectl update task-resource-attribute --attrFile tra.yaml Usage diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index e65582ff28..3c546cbfab 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -14,6 +14,7 @@ Nouns gen/flytectl_get_task gen/flytectl_get_task-resource-attribute gen/flytectl_get_cluster-resource-attribute + gen/flytectl_get_execution-queue-attribute gen/flytectl_get_launchplan gen/flytectl_update_launchplan gen/flytectl_update_workflow @@ -21,10 +22,12 @@ Nouns gen/flytectl_update_task gen/flytectl_update_task-resource-attribute gen/flytectl_update_cluster-resource-attribute + gen/flytectl_update_execution-queue-attribute gen/flytectl_register_files gen/flytectl_delete_execution gen/flytectl_delete_task-resource-attribute gen/flytectl_delete_cluster-resource-attribute + gen/flytectl_delete_execution-queue-attribute gen/flytectl_version gen/flytectl_config_validate gen/flytectl_config_discover From 6cf6d1e042bfe3e9cfa42f1818cd7eaa0d7013f8 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Sat, 15 May 2021 06:30:44 +0530 Subject: [PATCH 050/645] Adding support for execution cluster label (#68) --- .../attrdeleteconfig_flags.go | 46 ++++++ .../attrdeleteconfig_flags_test.go | 124 +++++++++++++++ .../attrfetchconfig_flags.go | 46 ++++++ .../attrfetchconfig_flags_test.go | 124 +++++++++++++++ .../attrupdateconfig_flags.go | 46 ++++++ .../attrupdateconfig_flags_test.go | 124 +++++++++++++++ .../executionclusterlabel/delete_config.go | 10 ++ .../executionclusterlabel/fetch_config.go | 9 ++ .../executionclusterlabel/file_config.go | 47 ++++++ .../executionclusterlabel/file_config_test.go | 46 ++++++ .../executionclusterlabel/update_config.go | 10 ++ .../plugin_override/attrdeleteconfig_flags.go | 46 ++++++ .../attrdeleteconfig_flags_test.go | 124 +++++++++++++++ .../plugin_override/attrfetchconfig_flags.go | 46 ++++++ .../attrfetchconfig_flags_test.go | 124 +++++++++++++++ .../plugin_override/attrupdateconfig_flags.go | 46 ++++++ .../attrupdateconfig_flags_test.go | 124 +++++++++++++++ .../plugin_override/delete_config.go | 10 ++ .../plugin_override/fetch_config.go | 9 ++ .../subcommand/plugin_override/file_config.go | 47 ++++++ .../plugin_override/file_config_test.go | 58 +++++++ .../plugin_override/update_config.go | 10 ++ flytectl/cmd/delete/delete.go | 8 + flytectl/cmd/delete/delete_test.go | 10 +- .../matchable_cluster_resource_attribute.go | 2 +- .../matchable_execution_cluster_label.go | 78 +++++++++ .../matchable_execution_cluster_label_test.go | 134 ++++++++++++++++ .../matchable_execution_queue_attribute.go | 2 +- .../cmd/delete/matchable_plugin_override.go | 83 ++++++++++ .../delete/matchable_plugin_override_test.go | 134 ++++++++++++++++ .../matchable_task_resource_attribute.go | 2 +- ...roject_domain_execution_cluster_label.yaml | 3 + .../valid_project_domain_plugin_override.yaml | 8 + ...alid_workflow_execution_cluster_label.yaml | 4 + .../valid_workflow_plugin_override.yaml | 9 ++ flytectl/cmd/get/get.go | 10 +- flytectl/cmd/get/get_test.go | 18 +-- .../matchable_cluster_resource_attribute.go | 2 +- .../get/matchable_execution_cluster_label.go | 88 +++++++++++ .../matchable_execution_cluster_label_test.go | 138 ++++++++++++++++ .../matchable_execution_queue_attribute.go | 2 +- flytectl/cmd/get/matchable_plugin_override.go | 112 +++++++++++++ .../cmd/get/matchable_plugin_override_test.go | 148 ++++++++++++++++++ .../get/matchable_task_resource_attribute.go | 2 +- .../matchable_cluster_resource_attribute.go | 2 +- .../matchable_execution_cluster_label.go | 73 +++++++++ .../matchable_execution_cluster_label_test.go | 94 +++++++++++ .../matchable_execution_queue_attribute.go | 2 +- .../cmd/update/matchable_plugin_override.go | 86 ++++++++++ .../update/matchable_plugin_override_test.go | 94 +++++++++++ .../matchable_task_resource_attribute.go | 2 +- ...roject_domain_execution_cluster_label.yaml | 3 + .../valid_project_domain_plugin_override.yaml | 8 + ...alid_workflow_execution_cluster_label.yaml | 4 + .../valid_workflow_plugin_override.yaml | 9 ++ flytectl/cmd/update/update.go | 6 + flytectl/cmd/update/update_test.go | 16 +- flytectl/docs/source/gen/flytectl_delete.rst | 2 + ...ectl_delete_cluster-resource-attribute.rst | 2 +- ...lytectl_delete_execution-cluster-label.rst | 108 +++++++++++++ ...tectl_delete_execution-queue-attribute.rst | 2 +- .../gen/flytectl_delete_plugin-override.rst | 113 +++++++++++++ ...lytectl_delete_task-resource-attribute.rst | 2 +- flytectl/docs/source/gen/flytectl_get.rst | 4 +- ...lytectl_get_cluster-resource-attribute.rst | 2 +- .../flytectl_get_execution-cluster-label.rst | 117 ++++++++++++++ ...flytectl_get_execution-queue-attribute.rst | 2 +- .../gen/flytectl_get_plugin-override.rst | 141 +++++++++++++++++ .../flytectl_get_task-resource-attribute.rst | 2 +- flytectl/docs/source/gen/flytectl_update.rst | 2 + ...ectl_update_cluster-resource-attribute.rst | 2 +- ...lytectl_update_execution-cluster-label.rst | 108 +++++++++++++ ...tectl_update_execution-queue-attribute.rst | 2 +- .../gen/flytectl_update_plugin-override.rst | 121 ++++++++++++++ ...lytectl_update_task-resource-attribute.rst | 2 +- flytectl/docs/source/nouns.rst | 6 + 76 files changed, 3370 insertions(+), 42 deletions(-) create mode 100755 flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go create mode 100644 flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go create mode 100644 flytectl/cmd/config/subcommand/executionclusterlabel/fetch_config.go create mode 100644 flytectl/cmd/config/subcommand/executionclusterlabel/file_config.go create mode 100644 flytectl/cmd/config/subcommand/executionclusterlabel/file_config_test.go create mode 100644 flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go create mode 100755 flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go create mode 100644 flytectl/cmd/config/subcommand/plugin_override/delete_config.go create mode 100644 flytectl/cmd/config/subcommand/plugin_override/fetch_config.go create mode 100644 flytectl/cmd/config/subcommand/plugin_override/file_config.go create mode 100644 flytectl/cmd/config/subcommand/plugin_override/file_config_test.go create mode 100644 flytectl/cmd/config/subcommand/plugin_override/update_config.go create mode 100644 flytectl/cmd/delete/matchable_execution_cluster_label.go create mode 100644 flytectl/cmd/delete/matchable_execution_cluster_label_test.go create mode 100644 flytectl/cmd/delete/matchable_plugin_override.go create mode 100644 flytectl/cmd/delete/matchable_plugin_override_test.go create mode 100644 flytectl/cmd/delete/testdata/valid_project_domain_execution_cluster_label.yaml create mode 100644 flytectl/cmd/delete/testdata/valid_project_domain_plugin_override.yaml create mode 100644 flytectl/cmd/delete/testdata/valid_workflow_execution_cluster_label.yaml create mode 100644 flytectl/cmd/delete/testdata/valid_workflow_plugin_override.yaml create mode 100644 flytectl/cmd/get/matchable_execution_cluster_label.go create mode 100644 flytectl/cmd/get/matchable_execution_cluster_label_test.go create mode 100644 flytectl/cmd/get/matchable_plugin_override.go create mode 100644 flytectl/cmd/get/matchable_plugin_override_test.go create mode 100644 flytectl/cmd/update/matchable_execution_cluster_label.go create mode 100644 flytectl/cmd/update/matchable_execution_cluster_label_test.go create mode 100644 flytectl/cmd/update/matchable_plugin_override.go create mode 100644 flytectl/cmd/update/matchable_plugin_override_test.go create mode 100644 flytectl/cmd/update/testdata/valid_project_domain_execution_cluster_label.yaml create mode 100644 flytectl/cmd/update/testdata/valid_project_domain_plugin_override.yaml create mode 100644 flytectl/cmd/update/testdata/valid_workflow_execution_cluster_label.yaml create mode 100644 flytectl/cmd/update/testdata/valid_workflow_plugin_override.yaml create mode 100644 flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst create mode 100644 flytectl/docs/source/gen/flytectl_delete_plugin-override.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_plugin-override.rst create mode 100644 flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst create mode 100644 flytectl/docs/source/gen/flytectl_update_plugin-override.rst diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go new file mode 100755 index 0000000000..3dc56c9837 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionclusterlabel + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrDeleteConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go new file mode 100755 index 0000000000..02ec1217d1 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionclusterlabel + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrDeleteConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrDeleteConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrDeleteConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrDeleteConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrDeleteConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrDeleteConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrDeleteConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrDeleteConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(val, result)) +} + +func testDecodeSlice_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) +} + +func TestAttrDeleteConfig_GetPFlagSet(t *testing.T) { + val := AttrDeleteConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrDeleteConfig_SetFlags(t *testing.T) { + actual := AttrDeleteConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultDelConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags.go new file mode 100755 index 0000000000..0e1d0d060f --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionclusterlabel + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrFetchConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags_test.go new file mode 100755 index 0000000000..a99fd91933 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionclusterlabel + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrFetchConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrFetchConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrFetchConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrFetchConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrFetchConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrFetchConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrFetchConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrFetchConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(val, result)) +} + +func testDecodeSlice_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) +} + +func TestAttrFetchConfig_GetPFlagSet(t *testing.T) { + val := AttrFetchConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrFetchConfig_SetFlags(t *testing.T) { + actual := AttrFetchConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultFetchConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrFetchConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go new file mode 100755 index 0000000000..f2f0d84852 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionclusterlabel + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrUpdateConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go new file mode 100755 index 0000000000..ca7e09eb4d --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package executionclusterlabel + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrUpdateConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrUpdateConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrUpdateConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrUpdateConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrUpdateConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrUpdateConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrUpdateConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrUpdateConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(val, result)) +} + +func testDecodeSlice_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) +} + +func TestAttrUpdateConfig_GetPFlagSet(t *testing.T) { + val := AttrUpdateConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrUpdateConfig_SetFlags(t *testing.T) { + actual := AttrUpdateConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultUpdateConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go new file mode 100644 index 0000000000..5a96d6fdfa --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go @@ -0,0 +1,10 @@ +package executionclusterlabel + +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig + +// AttrDeleteConfig Matchable resource attributes configuration passed from command line +type AttrDeleteConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` +} + +var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/fetch_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/fetch_config.go new file mode 100644 index 0000000000..8e7f878ede --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/fetch_config.go @@ -0,0 +1,9 @@ +package executionclusterlabel + +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig + +type AttrFetchConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` +} + +var DefaultFetchConfig = &AttrFetchConfig{} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/file_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/file_config.go new file mode 100644 index 0000000000..c05c6ca167 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/file_config.go @@ -0,0 +1,47 @@ +package executionclusterlabel + +import ( + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +// FileConfig shadow Config for ExecutionClusterLabel. +// The shadow Config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. +// As the same structure is being used for both ProjectDomainAttribute/Workflowattribute +type FileConfig struct { + Project string `json:"project"` + Domain string `json:"domain"` + Workflow string `json:"workflow,omitempty"` + *admin.ExecutionClusterLabel +} + +// Decorate decorator over ExecutionClusterLabel. +func (t FileConfig) Decorate() *admin.MatchingAttributes { + return &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionClusterLabel{ + ExecutionClusterLabel: t.ExecutionClusterLabel, + }, + } +} + +// UnDecorate to uncover ExecutionClusterLabel. +func (t *FileConfig) UnDecorate(matchingAttribute *admin.MatchingAttributes) { + if matchingAttribute == nil { + return + } + t.ExecutionClusterLabel = matchingAttribute.GetExecutionClusterLabel() +} + +// GetProject from the FileConfig +func (t FileConfig) GetProject() string { + return t.Project +} + +// GetDomain from the FileConfig +func (t FileConfig) GetDomain() string { + return t.Domain +} + +// GetWorkflow from the FileConfig +func (t FileConfig) GetWorkflow() string { + return t.Workflow +} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/file_config_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/file_config_test.go new file mode 100644 index 0000000000..662f6658a4 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/file_config_test.go @@ -0,0 +1,46 @@ +package executionclusterlabel + +import ( + "testing" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" +) + +func TestFileConfig(t *testing.T) { + execClusterLabelFileConfig := FileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + ExecutionClusterLabel: &admin.ExecutionClusterLabel{ + Value: "foo", + }, + } + matchingAttr := &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionClusterLabel{ + ExecutionClusterLabel: execClusterLabelFileConfig.ExecutionClusterLabel, + }, + } + t.Run("decorate", func(t *testing.T) { + assert.Equal(t, matchingAttr, execClusterLabelFileConfig.Decorate()) + }) + + t.Run("decorate", func(t *testing.T) { + taskAttrFileConfigNew := FileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + } + taskAttrFileConfigNew.UnDecorate(matchingAttr) + assert.Equal(t, execClusterLabelFileConfig, taskAttrFileConfigNew) + }) + t.Run("get project domain workflow", func(t *testing.T) { + taskAttrFileConfigNew := FileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + Workflow: "workflow", + } + assert.Equal(t, "dummyProject", taskAttrFileConfigNew.GetProject()) + assert.Equal(t, "dummyDomain", taskAttrFileConfigNew.GetDomain()) + assert.Equal(t, "workflow", taskAttrFileConfigNew.GetWorkflow()) + }) +} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go new file mode 100644 index 0000000000..abd5600553 --- /dev/null +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go @@ -0,0 +1,10 @@ +package executionclusterlabel + +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig + +// AttrUpdateConfig Matchable resource attributes configuration passed from command line +type AttrUpdateConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` +} + +var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go new file mode 100755 index 0000000000..52fd144b99 --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package pluginoverride + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrDeleteConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go new file mode 100755 index 0000000000..7a5d60873c --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package pluginoverride + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrDeleteConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrDeleteConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrDeleteConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrDeleteConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrDeleteConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrDeleteConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrDeleteConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrDeleteConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(val, result)) +} + +func testDecodeSlice_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) +} + +func TestAttrDeleteConfig_GetPFlagSet(t *testing.T) { + val := AttrDeleteConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrDeleteConfig_SetFlags(t *testing.T) { + actual := AttrDeleteConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultDelConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags.go new file mode 100755 index 0000000000..1cf522b3ca --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package pluginoverride + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrFetchConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags_test.go new file mode 100755 index 0000000000..e94f54e982 --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package pluginoverride + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrFetchConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrFetchConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrFetchConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrFetchConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrFetchConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrFetchConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrFetchConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrFetchConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(val, result)) +} + +func testDecodeSlice_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) +} + +func TestAttrFetchConfig_GetPFlagSet(t *testing.T) { + val := AttrFetchConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrFetchConfig_SetFlags(t *testing.T) { + actual := AttrFetchConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultFetchConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrFetchConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go new file mode 100755 index 0000000000..21c58dbb9d --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go @@ -0,0 +1,46 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package pluginoverride + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrUpdateConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go new file mode 100755 index 0000000000..37ee0382c1 --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go @@ -0,0 +1,124 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package pluginoverride + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrUpdateConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrUpdateConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrUpdateConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrUpdateConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrUpdateConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrUpdateConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrUpdateConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrUpdateConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(val, result)) +} + +func testDecodeSlice_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) +} + +func TestAttrUpdateConfig_GetPFlagSet(t *testing.T) { + val := AttrUpdateConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrUpdateConfig_SetFlags(t *testing.T) { + actual := AttrUpdateConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + t.Run("DefaultValue", func(t *testing.T) { + // Test that default value is set properly + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + assert.Equal(t, string(DefaultUpdateConfig.AttrFile), vString) + } else { + assert.FailNow(t, err.Error()) + } + }) + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/plugin_override/delete_config.go b/flytectl/cmd/config/subcommand/plugin_override/delete_config.go new file mode 100644 index 0000000000..beec54fd95 --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/delete_config.go @@ -0,0 +1,10 @@ +package pluginoverride + +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig + +// AttrDeleteConfig Matchable resource attributes configuration passed from command line +type AttrDeleteConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` +} + +var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/plugin_override/fetch_config.go b/flytectl/cmd/config/subcommand/plugin_override/fetch_config.go new file mode 100644 index 0000000000..9976d8b33f --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/fetch_config.go @@ -0,0 +1,9 @@ +package pluginoverride + +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig + +type AttrFetchConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` +} + +var DefaultFetchConfig = &AttrFetchConfig{} diff --git a/flytectl/cmd/config/subcommand/plugin_override/file_config.go b/flytectl/cmd/config/subcommand/plugin_override/file_config.go new file mode 100644 index 0000000000..af40066dd4 --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/file_config.go @@ -0,0 +1,47 @@ +package pluginoverride + +import ( + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +// FileConfig shadow Config for PluginOverrides. +// The shadow Config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. +// As the same structure is being used for both ProjectDomainAttribute/Workflowattribute +type FileConfig struct { + Project string `json:"project"` + Domain string `json:"domain"` + Workflow string `json:"workflow,omitempty"` + *admin.PluginOverrides +} + +// Decorate decorator over PluginOverrides. +func (t FileConfig) Decorate() *admin.MatchingAttributes { + return &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_PluginOverrides{ + PluginOverrides: t.PluginOverrides, + }, + } +} + +// UnDecorate to uncover PluginOverrides. +func (t *FileConfig) UnDecorate(matchingAttribute *admin.MatchingAttributes) { + if matchingAttribute == nil { + return + } + t.PluginOverrides = matchingAttribute.GetPluginOverrides() +} + +// GetProject from the FileConfig +func (t FileConfig) GetProject() string { + return t.Project +} + +// GetDomain from the FileConfig +func (t FileConfig) GetDomain() string { + return t.Domain +} + +// GetWorkflow from the FileConfig +func (t FileConfig) GetWorkflow() string { + return t.Workflow +} diff --git a/flytectl/cmd/config/subcommand/plugin_override/file_config_test.go b/flytectl/cmd/config/subcommand/plugin_override/file_config_test.go new file mode 100644 index 0000000000..e2ecaa5d06 --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/file_config_test.go @@ -0,0 +1,58 @@ +package pluginoverride + +import ( + "testing" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" +) + +func TestFileConfig(t *testing.T) { + pluginOverride1 := &admin.PluginOverride{ + TaskType: "python_task", + PluginId: []string{"plugin-override1", "plugin-override2"}, + MissingPluginBehavior: admin.PluginOverride_FAIL, + } + pluginOverride2 := &admin.PluginOverride{ + TaskType: "java_task", + PluginId: []string{"plugin-override3", "plugin-override3"}, + MissingPluginBehavior: admin.PluginOverride_USE_DEFAULT, + } + pluginOverrides := []*admin.PluginOverride{pluginOverride1, pluginOverride2} + + pluginOverrideFileConfig := FileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + PluginOverrides: &admin.PluginOverrides{ + Overrides: pluginOverrides, + }, + } + matchingAttr := &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_PluginOverrides{ + PluginOverrides: pluginOverrideFileConfig.PluginOverrides, + }, + } + t.Run("decorate", func(t *testing.T) { + assert.Equal(t, matchingAttr, pluginOverrideFileConfig.Decorate()) + }) + + t.Run("decorate", func(t *testing.T) { + taskAttrFileConfigNew := FileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + } + taskAttrFileConfigNew.UnDecorate(matchingAttr) + assert.Equal(t, pluginOverrideFileConfig, taskAttrFileConfigNew) + }) + t.Run("get project domain workflow", func(t *testing.T) { + taskAttrFileConfigNew := FileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + Workflow: "workflow", + } + assert.Equal(t, "dummyProject", taskAttrFileConfigNew.GetProject()) + assert.Equal(t, "dummyDomain", taskAttrFileConfigNew.GetDomain()) + assert.Equal(t, "workflow", taskAttrFileConfigNew.GetWorkflow()) + }) +} diff --git a/flytectl/cmd/config/subcommand/plugin_override/update_config.go b/flytectl/cmd/config/subcommand/plugin_override/update_config.go new file mode 100644 index 0000000000..e2daefa8f3 --- /dev/null +++ b/flytectl/cmd/config/subcommand/plugin_override/update_config.go @@ -0,0 +1,10 @@ +package pluginoverride + +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig + +// AttrUpdateConfig Matchable resource attributes configuration passed from command line +type AttrUpdateConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` +} + +var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index 5a64a58ce3..94ce8e801f 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -2,7 +2,9 @@ package delete import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdcore "github.com/flyteorg/flytectl/cmd/core" @@ -36,9 +38,15 @@ func RemoteDeleteCommand() *cobra.Command { "cluster-resource-attribute": {CmdFunc: deleteClusterResourceAttributes, Aliases: []string{"cluster-resource-attributes"}, Short: clusterResourceAttributesShort, Long: clusterResourceAttributesLong, PFlagProvider: clusterresourceattribute.DefaultDelConfig, ProjectDomainNotRequired: true}, + "execution-cluster-label": {CmdFunc: deleteExecutionClusterLabel, Aliases: []string{"execution-cluster-labels"}, + Short: executionClusterLabelShort, + Long: executionClusterLabelLong, PFlagProvider: executionclusterlabel.DefaultDelConfig, ProjectDomainNotRequired: true}, "execution-queue-attribute": {CmdFunc: deleteExecutionQueueAttributes, Aliases: []string{"execution-queue-attributes"}, Short: executionQueueAttributesShort, Long: executionQueueAttributesLong, PFlagProvider: executionqueueattribute.DefaultDelConfig, ProjectDomainNotRequired: true}, + "plugin-override": {CmdFunc: deletePluginOverride, Aliases: []string{"plugin-overrides"}, + Short: pluginOverrideShort, + Long: pluginOverrideLong, PFlagProvider: pluginoverride.DefaultDelConfig, ProjectDomainNotRequired: true}, } cmdcore.AddCommands(deleteCmd, terminateResourcesFuncs) return deleteCmd diff --git a/flytectl/cmd/delete/delete_test.go b/flytectl/cmd/delete/delete_test.go index 3f5739c9cf..e26a1d7a9d 100644 --- a/flytectl/cmd/delete/delete_test.go +++ b/flytectl/cmd/delete/delete_test.go @@ -32,16 +32,16 @@ func TestDeleteCommand(t *testing.T) { assert.Equal(t, deleteCommand.Use, "delete") assert.Equal(t, deleteCommand.Short, deleteCmdShort) assert.Equal(t, deleteCommand.Long, deleteCmdLong) - assert.Equal(t, len(deleteCommand.Commands()), 4) + assert.Equal(t, len(deleteCommand.Commands()), 6) cmdNouns := deleteCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - useArray := []string{"cluster-resource-attribute", "execution", "execution-queue-attribute", "task-resource-attribute"} - aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"execution-queue-attributes"}, {"task-resource-attributes"}} - shortArray := []string{clusterResourceAttributesShort, execCmdShort, executionQueueAttributesShort, taskResourceAttributesShort} - longArray := []string{clusterResourceAttributesLong, execCmdLong, executionQueueAttributesLong, taskResourceAttributesLong} + useArray := []string{"cluster-resource-attribute", "execution", "execution-cluster-label", "execution-queue-attribute", "plugin-override", "task-resource-attribute"} + aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"execution-cluster-labels"}, {"execution-queue-attributes"}, {"plugin-overrides"}, {"task-resource-attributes"}} + shortArray := []string{clusterResourceAttributesShort, execCmdShort, executionClusterLabelShort, executionQueueAttributesShort, pluginOverrideShort, taskResourceAttributesShort} + longArray := []string{clusterResourceAttributesLong, execCmdLong, executionClusterLabelLong, executionQueueAttributesLong, pluginOverrideLong, taskResourceAttributesLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go index 9dd6bc526b..e6b41941c0 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go @@ -41,7 +41,7 @@ eg: content of cra.yaml which will use the project domain and workflow name for buzz: "lightyear" Deletes cluster resource attribute for a workflow -Here the command deletes cluster resource attributes for a workflow +Here the command deletes cluster resource attributes for a workflow core.control_flow.run_merge_sort.merge_sort :: diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label.go b/flytectl/cmd/delete/matchable_execution_cluster_label.go new file mode 100644 index 0000000000..65ab8f7405 --- /dev/null +++ b/flytectl/cmd/delete/matchable_execution_cluster_label.go @@ -0,0 +1,78 @@ +package delete + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + executionClusterLabelShort = "Deletes matchable resources of execution cluster label" + executionClusterLabelLong = ` +Deletes execution cluster label for given project and domain combination or additionally with workflow name. + +Deletes execution cluster label for project and domain +Here the command delete execution cluster label for project flytectldemo and development domain. +:: + + flytectl delete execution-cluster-label -p flytectldemo -d development + + +Deletes execution cluster label using config file which was used for creating it. +Here the command deletes execution cluster label from the config file ecl.yaml +Value is optional in the file as its unread during the delete command but can be kept as the same file can be used for get, update or delete +eg: content of ecl.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete execution-cluster-label --attrFile ecl.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + value: foo + +Deletes execution cluster label for a workflow +Here the command deletes execution cluster label for a workflow core.control_flow.run_merge_sort.merge_sort + +:: + + flytectl delete execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage +` +) + +func deleteExecutionClusterLabel(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var pwdGetter sconfig.ProjectDomainWorkflowGetter + pwdGetter = sconfig.PDWGetterCommandLine{Config: config.GetConfig(), Args: args} + delConfig := executionclusterlabel.DefaultDelConfig + + // Get the project domain workflowName from the config file or commandline params + if len(delConfig.AttrFile) > 0 { + // Initialize FileConfig which will be used if delConfig.AttrFile is non empty + // And Reads from the cluster label file + pwdGetter = &executionclusterlabel.FileConfig{} + if err := sconfig.ReadConfigFromFile(pwdGetter, delConfig.AttrFile); err != nil { + return err + } + } + // Use the pwdGetter to initialize the project domain and workflow + project := pwdGetter.GetProject() + domain := pwdGetter.GetDomain() + workflowName := pwdGetter.GetWorkflow() + + // Deletes the matchable attributes using the ExecClusterLabelFileConfig + if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), + admin.MatchableResource_EXECUTION_CLUSTER_LABEL); err != nil { + return err + } + + return nil +} diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label_test.go b/flytectl/cmd/delete/matchable_execution_cluster_label_test.go new file mode 100644 index 0000000000..fe90153dbf --- /dev/null +++ b/flytectl/cmd/delete/matchable_execution_cluster_label_test.go @@ -0,0 +1,134 @@ +package delete + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func deleteExecutionClusterLabelSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + executionclusterlabel.DefaultDelConfig = &executionclusterlabel.AttrDeleteConfig{} + args = []string{} +} + +func TestDeleteExecutionClusterLabels(t *testing.T) { + t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { + setup() + deleteExecutionClusterLabelSetup() + // Empty attribute file + executionclusterlabel.DefaultDelConfig.AttrFile = "" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + }) + t.Run("failed project domain attribute deletion", func(t *testing.T) { + setup() + deleteExecutionClusterLabelSetup() + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) + err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + }) + t.Run("successful project domain attribute deletion file", func(t *testing.T) { + setup() + deleteExecutionClusterLabelSetup() + // Empty attribute file + executionclusterlabel.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_execution_cluster_label.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + }) + t.Run("successful workflow attribute deletion", func(t *testing.T) { + setup() + deleteExecutionClusterLabelSetup() + // Empty attribute file + executionclusterlabel.DefaultDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + }) + t.Run("failed workflow attribute deletion", func(t *testing.T) { + setup() + deleteExecutionClusterLabelSetup() + // Empty attribute file + executionclusterlabel.DefaultDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) + err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + }) + t.Run("successful workflow attribute deletion file", func(t *testing.T) { + setup() + deleteExecutionClusterLabelSetup() + // Empty attribute file + executionclusterlabel.DefaultDelConfig.AttrFile = "testdata/valid_workflow_execution_cluster_label.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + }) + t.Run("workflow attribute deletion non existent file", func(t *testing.T) { + setup() + deleteExecutionClusterLabelSetup() + // Empty attribute file + executionclusterlabel.DefaultDelConfig.AttrFile = testDataNonExistentFile + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + assert.NotNil(t, err) + u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + }) + t.Run("attribute deletion invalid file", func(t *testing.T) { + setup() + deleteExecutionClusterLabelSetup() + // Empty attribute file + executionclusterlabel.DefaultDelConfig.AttrFile = testDataInvalidAttrFile + // No args implying project domain attribute deletion + err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, + fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), + err) + u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + }) +} diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute.go b/flytectl/cmd/delete/matchable_execution_queue_attribute.go index 2f11ce5c5b..392157a03f 100644 --- a/flytectl/cmd/delete/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute.go @@ -43,7 +43,7 @@ eg: content of era.yaml which will use the project domain and workflow name for - lightyear Deletes execution queue attribute for a workflow -Here the command deletes the execution queue attributes for a workflow +Here the command deletes the execution queue attributes for a workflow core.control_flow.run_merge_sort.merge_sort :: diff --git a/flytectl/cmd/delete/matchable_plugin_override.go b/flytectl/cmd/delete/matchable_plugin_override.go new file mode 100644 index 0000000000..09353a83f8 --- /dev/null +++ b/flytectl/cmd/delete/matchable_plugin_override.go @@ -0,0 +1,83 @@ +package delete + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + pluginOverrideShort = "Deletes matchable resources of plugin overrides" + pluginOverrideLong = ` +Deletes plugin override for given project and domain combination or additionally with workflow name. + +Deletes plugin override for project and domain +Here the command deletes plugin override for project flytectldemo and development domain. +:: + + flytectl delete plugin-override -p flytectldemo -d development + + +Deletes plugin override using config file which was used for creating it. +Here the command deletes plugin overrides from the config file po.yaml +Overrides are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete +eg: content of po.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete plugin-override --attrFile po.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + overrides: + - task_type: python_task # Task type for which to apply plugin implementation overrides + plugin_id: # Plugin id(s) to be used in place of the default for the task type. + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT + +Deletes plugin override for a workflow +Here the command deletes the plugin override for a workflow core.control_flow.run_merge_sort.merge_sort + +:: + + flytectl delete plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage +` +) + +func deletePluginOverride(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var pwdGetter sconfig.ProjectDomainWorkflowGetter + pwdGetter = sconfig.PDWGetterCommandLine{Config: config.GetConfig(), Args: args} + delConfig := pluginoverride.DefaultDelConfig + + // Get the project domain workflowName from the config file or commandline params + if len(delConfig.AttrFile) > 0 { + // Initialize AttrFileConfig which will be used if delConfig.AttrFile is non empty + // And Reads from the attribute file + pwdGetter = &pluginoverride.FileConfig{} + if err := sconfig.ReadConfigFromFile(pwdGetter, delConfig.AttrFile); err != nil { + return err + } + } + // Use the pwdGetter to initialize the project domain and workflow + project := pwdGetter.GetProject() + domain := pwdGetter.GetDomain() + workflowName := pwdGetter.GetWorkflow() + + // Deletes the matchable attributes using the AttrFileConfig + if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), + admin.MatchableResource_PLUGIN_OVERRIDE); err != nil { + return err + } + + return nil +} diff --git a/flytectl/cmd/delete/matchable_plugin_override_test.go b/flytectl/cmd/delete/matchable_plugin_override_test.go new file mode 100644 index 0000000000..d8ed34818f --- /dev/null +++ b/flytectl/cmd/delete/matchable_plugin_override_test.go @@ -0,0 +1,134 @@ +package delete + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func deletePluginOverrideSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + pluginoverride.DefaultDelConfig = &pluginoverride.AttrDeleteConfig{} + args = []string{} +} + +func TestPluginOverride(t *testing.T) { + t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { + setup() + deletePluginOverrideSetup() + // Empty attribute file + pluginoverride.DefaultDelConfig.AttrFile = "" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deletePluginOverride(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + }) + t.Run("failed project domain attribute deletion", func(t *testing.T) { + setup() + deletePluginOverrideSetup() + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) + err = deletePluginOverride(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + }) + t.Run("successful project domain attribute deletion file", func(t *testing.T) { + setup() + deletePluginOverrideSetup() + // Empty attribute file + pluginoverride.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_plugin_override.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deletePluginOverride(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_PLUGIN_OVERRIDE) + }) + t.Run("successful workflow attribute deletion", func(t *testing.T) { + setup() + deletePluginOverrideSetup() + // Empty attribute file + pluginoverride.DefaultDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deletePluginOverride(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_PLUGIN_OVERRIDE) + }) + t.Run("failed workflow attribute deletion", func(t *testing.T) { + setup() + deletePluginOverrideSetup() + // Empty attribute file + pluginoverride.DefaultDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) + err = deletePluginOverride(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_PLUGIN_OVERRIDE) + }) + t.Run("successful workflow attribute deletion file", func(t *testing.T) { + setup() + deletePluginOverrideSetup() + // Empty attribute file + pluginoverride.DefaultDelConfig.AttrFile = "testdata/valid_workflow_plugin_override.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deletePluginOverride(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_PLUGIN_OVERRIDE) + }) + t.Run("workflow attribute deletion non existent file", func(t *testing.T) { + setup() + deletePluginOverrideSetup() + // Empty attribute file + pluginoverride.DefaultDelConfig.AttrFile = testDataNonExistentFile + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deletePluginOverride(ctx, args, cmdCtx) + assert.NotNil(t, err) + u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_PLUGIN_OVERRIDE) + }) + t.Run("attribute deletion invalid file", func(t *testing.T) { + setup() + deletePluginOverrideSetup() + // Empty attribute file + pluginoverride.DefaultDelConfig.AttrFile = testDataInvalidAttrFile + // No args implying project domain attribute deletion + err = deletePluginOverride(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, + fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), + err) + u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_PLUGIN_OVERRIDE) + }) +} diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute.go b/flytectl/cmd/delete/matchable_task_resource_attribute.go index cafc354714..3f1a719ca7 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute.go @@ -44,7 +44,7 @@ eg: content of tra.yaml which will use the project domain and workflow name for memory: "450Mi" Deletes task resource attribute for a workflow -Here the command deletes task resource attributes for a workflow +Here the command deletes task resource attributes for a workflow core.control_flow.run_merge_sort.merge_sort :: diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_execution_cluster_label.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_execution_cluster_label.yaml new file mode 100644 index 0000000000..37f8a630c2 --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_project_domain_execution_cluster_label.yaml @@ -0,0 +1,3 @@ +domain: development +project: flytectldemo +value: foo \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_plugin_override.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_plugin_override.yaml new file mode 100644 index 0000000000..a8ffc0fef8 --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_project_domain_plugin_override.yaml @@ -0,0 +1,8 @@ +domain: development +project: flytectldemo +overrides: + - task_type: python_task + plugin_id: + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # 0 : FAIL , 1: DEFAULT diff --git a/flytectl/cmd/delete/testdata/valid_workflow_execution_cluster_label.yaml b/flytectl/cmd/delete/testdata/valid_workflow_execution_cluster_label.yaml new file mode 100644 index 0000000000..ccd978fa76 --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_workflow_execution_cluster_label.yaml @@ -0,0 +1,4 @@ +domain: development +project: flytectldemo +workflow: core.control_flow.run_merge_sort.merge_sort +value: foo \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_workflow_plugin_override.yaml b/flytectl/cmd/delete/testdata/valid_workflow_plugin_override.yaml new file mode 100644 index 0000000000..6fbb58eae0 --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_workflow_plugin_override.yaml @@ -0,0 +1,9 @@ +domain: development +project: flytectldemo +workflow: core.control_flow.run_merge_sort.merge_sort +overrides: + - task_type: python_task + plugin_id: + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # 0 : FAIL , 1: DEFAULT \ No newline at end of file diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index 10f1e6bdb1..b78bc4f67d 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -2,7 +2,9 @@ package get import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" cmdcore "github.com/flyteorg/flytectl/cmd/core" @@ -17,7 +19,7 @@ const ( Example get projects. :: - bin/flytectl get project + flytectl get project ` ) @@ -50,6 +52,12 @@ func CreateGetCommand() *cobra.Command { "execution-queue-attribute": {CmdFunc: getExecutionQueueAttributes, Aliases: []string{"execution-queue-attributes"}, Short: executionQueueAttributesShort, Long: executionQueueAttributesLong, PFlagProvider: executionqueueattribute.DefaultFetchConfig}, + "execution-cluster-label": {CmdFunc: getExecutionClusterLabel, Aliases: []string{"execution-cluster-labels"}, + Short: executionClusterLabelShort, + Long: executionClusterLabelLong, PFlagProvider: executionclusterlabel.DefaultFetchConfig}, + "plugin-override": {CmdFunc: getPluginOverridesFunc, Aliases: []string{"plugin-overrides"}, + Short: pluginOverrideShort, + Long: pluginOverrideLong, PFlagProvider: pluginoverride.DefaultFetchConfig}, } cmdcore.AddCommands(getCmd, getResourcesFuncs) diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index 1f567dacc3..5b513ccd47 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -42,20 +42,20 @@ func TestCreateGetCommand(t *testing.T) { assert.Equal(t, getCommand.Use, "get") assert.Equal(t, getCommand.Short, "Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project.") fmt.Println(getCommand.Commands()) - assert.Equal(t, len(getCommand.Commands()), 8) + assert.Equal(t, len(getCommand.Commands()), 10) cmdNouns := getCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - useArray := []string{"cluster-resource-attribute", "execution", "execution-queue-attribute", "launchplan", "project", - "task", "task-resource-attribute", "workflow"} - aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"execution-queue-attributes"}, {"launchplans"}, {"projects"}, {"tasks"}, - {"task-resource-attributes"}, {"workflows"}} - shortArray := []string{clusterResourceAttributesShort, executionShort, executionQueueAttributesShort, launchPlanShort, projectShort, - taskShort, taskResourceAttributesShort, workflowShort} - longArray := []string{clusterResourceAttributesLong, executionLong, executionQueueAttributesLong, launchPlanLong, projectLong, taskLong, - taskResourceAttributesLong, workflowLong} + useArray := []string{"cluster-resource-attribute", "execution", "execution-cluster-label", + "execution-queue-attribute", "launchplan", "plugin-override", "project", "task", "task-resource-attribute", "workflow"} + aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"execution-cluster-labels"}, + {"execution-queue-attributes"}, {"launchplans"}, {"plugin-overrides"}, {"projects"}, {"tasks"}, {"task-resource-attributes"}, {"workflows"}} + shortArray := []string{clusterResourceAttributesShort, executionShort, executionClusterLabelShort, executionQueueAttributesShort, launchPlanShort, + pluginOverrideShort, projectShort, taskShort, taskResourceAttributesShort, workflowShort} + longArray := []string{clusterResourceAttributesLong, executionLong, executionClusterLabelLong, executionQueueAttributesLong, launchPlanLong, + pluginOverrideLong, projectLong, taskLong, taskResourceAttributesLong, workflowLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute.go b/flytectl/cmd/get/matchable_cluster_resource_attribute.go index 7df8190d09..e29f61d5a1 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute.go @@ -28,7 +28,7 @@ eg : output from the command {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} Retrieves cluster resource attribute for project and domain and workflow -Here the command get cluster resource attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +Here the command get cluster resource attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort :: flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort diff --git a/flytectl/cmd/get/matchable_execution_cluster_label.go b/flytectl/cmd/get/matchable_execution_cluster_label.go new file mode 100644 index 0000000000..56e9e7b94c --- /dev/null +++ b/flytectl/cmd/get/matchable_execution_cluster_label.go @@ -0,0 +1,88 @@ +package get + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + executionClusterLabelShort = "Gets matchable resources of execution cluster label" + executionClusterLabelLong = ` +Retrieves execution cluster label for given project and domain combination or additionally with workflow name. + +Retrieves execution cluster label for project and domain +Here the command get execution cluster label for project flytectldemo and development domain. +:: + + flytectl get execution-cluster-label -p flytectldemo -d development + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","value":"foo"} + +Retrieves execution cluster label for project and domain and workflow +Here the command get execution cluster label for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +:: + + flytectl get execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","value":"foo"} + +Writing the execution cluster label to a file. If there are no execution cluster label, command would return an error. +Here the command gets execution cluster label and writes the config file to ecl.yaml +eg: content of ecl.yaml + +:: + + flytectl get execution-cluster-label --attrFile ecl.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + value: foo + +Usage +` +) + +func getExecutionClusterLabel(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var project string + var domain string + var workflowName string + + // Get the project domain workflow name parameters from the command line. Project and domain are mandatory for this command + project = config.GetConfig().Project + domain = config.GetConfig().Domain + if len(args) == 1 { + workflowName = args[0] + } + // Construct a shadow config for ExecutionClusterLabel. The shadow config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. + executionClusterLabelFileConfig := executionclusterlabel.FileConfig{Project: project, Domain: domain, Workflow: workflowName} + // Get the attribute file name from the command line config + fileName := executionclusterlabel.DefaultFetchConfig.AttrFile + + // Updates the taskResourceAttrFileConfig with the fetched matchable attribute + if err := FetchAndUnDecorateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminFetcherExt(), + &executionClusterLabelFileConfig, admin.MatchableResource_EXECUTION_CLUSTER_LABEL); err != nil { + return err + } + + // Write the config to the file which can be used for update + if err := sconfig.DumpTaskResourceAttr(executionClusterLabelFileConfig, fileName); err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/get/matchable_execution_cluster_label_test.go b/flytectl/cmd/get/matchable_execution_cluster_label_test.go new file mode 100644 index 0000000000..04231373a3 --- /dev/null +++ b/flytectl/cmd/get/matchable_execution_cluster_label_test.go @@ -0,0 +1,138 @@ +package get + +import ( + "fmt" + "os" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func getExecutionClusterLabelSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + executionclusterlabel.DefaultFetchConfig = &executionclusterlabel.AttrFetchConfig{} + // Clean up the temp directory. + _ = os.Remove(testDataTempFile) +} + +func TestGetExecutionClusterLabel(t *testing.T) { + executionClusterLabel := &admin.ExecutionClusterLabel{ + Value: "foo", + } + projectDomainResp := &admin.ProjectDomainAttributesGetResponse{ + Attributes: &admin.ProjectDomainAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionClusterLabel{ + ExecutionClusterLabel: executionClusterLabel, + }, + }, + }, + } + workflowResp := &admin.WorkflowAttributesGetResponse{ + Attributes: &admin.WorkflowAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Workflow: "workflow", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionClusterLabel{ + ExecutionClusterLabel: executionClusterLabel, + }, + }, + }, + } + t.Run("successful get project domain attribute", func(t *testing.T) { + var args []string + setup() + getExecutionClusterLabelSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getExecutionClusterLabel(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","value":"foo"}`) + }) + t.Run("successful get project domain attribute and write to file", func(t *testing.T) { + var args []string + setup() + getExecutionClusterLabelSetup() + executionclusterlabel.DefaultFetchConfig.AttrFile = testDataTempFile + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getExecutionClusterLabel(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + tearDownAndVerify(t, `wrote the config to file temp-output-file`) + }) + t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { + var args []string + setup() + getExecutionClusterLabelSetup() + executionclusterlabel.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getExecutionClusterLabel(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + tearDownAndVerify(t, ``) + }) + t.Run("failed get project domain attribute", func(t *testing.T) { + var args []string + setup() + getExecutionClusterLabelSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getExecutionClusterLabel(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + tearDownAndVerify(t, ``) + }) + t.Run("successful get workflow attribute", func(t *testing.T) { + var args []string + setup() + getExecutionClusterLabelSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(workflowResp, nil) + err = getExecutionClusterLabel(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","value":"foo"}`) + }) + t.Run("failed get workflow attribute", func(t *testing.T) { + var args []string + setup() + getExecutionClusterLabelSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getExecutionClusterLabel(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute.go b/flytectl/cmd/get/matchable_execution_queue_attribute.go index 07e51e3d91..b51517e595 100644 --- a/flytectl/cmd/get/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/get/matchable_execution_queue_attribute.go @@ -28,7 +28,7 @@ eg : output from the command {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} Retrieves execution queue attribute for project and domain and workflow -Here the command get execution queue attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +Here the command get execution queue attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort :: flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort diff --git a/flytectl/cmd/get/matchable_plugin_override.go b/flytectl/cmd/get/matchable_plugin_override.go new file mode 100644 index 0000000000..7c42a35219 --- /dev/null +++ b/flytectl/cmd/get/matchable_plugin_override.go @@ -0,0 +1,112 @@ +package get + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + pluginOverrideShort = "Gets matchable resources of plugin override" + pluginOverrideLong = ` +Retrieves plugin overrides for given project and domain combination or additionally with workflow name. + +Retrieves plugin overrides for project and domain +Here the command get plugin override for project flytectldemo and development domain. + +:: + + flytectl get plugin-override -p flytectldemo -d development + +eg : output from the command + +.. code-block:: json + + { + "project": "flytectldemo", + "domain": "development", + "overrides": [{ + "task_type": "python_task", + "plugin_id": ["pluginoverride1", "pluginoverride2"], + "missing_plugin_behavior": 0 + }] + } + +Retrieves plugin override for project and domain and workflow +Here the command get plugin override for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort + +:: + + flytectl get plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + { + "project": "flytectldemo", + "domain": "development", + "workflow": "core.control_flow.run_merge_sort.merge_sort" + "overrides": [{ + "task_type": "python_task", + "plugin_id": ["pluginoverride1", "pluginoverride2"], + "missing_plugin_behavior": 0 + }] + } + +Writing the plugin override to a file. If there are no plugin overrides, command would return an error. +Here the command gets plugin overrides and writes the config file to po.yaml +eg: content of po.yaml + +:: + + flytectl get plugin-override --attrFile po.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + overrides: + - task_type: python_task # Task type for which to apply plugin implementation overrides + plugin_id: # Plugin id(s) to be used in place of the default for the task type. + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT + +Usage +` +) + +func getPluginOverridesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var project string + var domain string + var workflowName string + + // Get the project domain workflow name parameters from the command line. Project and domain are mandatory for this command + project = config.GetConfig().Project + domain = config.GetConfig().Domain + if len(args) == 1 { + workflowName = args[0] + } + // Construct a shadow config for PluginOverrides. The shadow config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. + pluginOverrideFileConfig := pluginoverride.FileConfig{Project: project, Domain: domain, Workflow: workflowName} + // Get the plugin overrides from the command line config + fileName := pluginoverride.DefaultFetchConfig.AttrFile + + // Updates the pluginOverrideFileConfig with the fetched matchable attribute + if err := FetchAndUnDecorateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminFetcherExt(), + &pluginOverrideFileConfig, admin.MatchableResource_PLUGIN_OVERRIDE); err != nil { + return err + } + + // Write the config to the file which can be used for update + if err := sconfig.DumpTaskResourceAttr(pluginOverrideFileConfig, fileName); err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/get/matchable_plugin_override_test.go b/flytectl/cmd/get/matchable_plugin_override_test.go new file mode 100644 index 0000000000..b72ab6524e --- /dev/null +++ b/flytectl/cmd/get/matchable_plugin_override_test.go @@ -0,0 +1,148 @@ +package get + +import ( + "fmt" + "os" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func getPluginOverrideSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + pluginoverride.DefaultFetchConfig = &pluginoverride.AttrFetchConfig{} + // Clean up the temp directory. + _ = os.Remove(testDataTempFile) +} + +func TestGetPluginOverride(t *testing.T) { + pluginOverride1 := &admin.PluginOverride{ + TaskType: "python_task", + PluginId: []string{"plugin-override1", "plugin-override2"}, + MissingPluginBehavior: admin.PluginOverride_FAIL, + } + pluginOverride2 := &admin.PluginOverride{ + TaskType: "java_task", + PluginId: []string{"plugin-override3", "plugin-override3"}, + MissingPluginBehavior: admin.PluginOverride_USE_DEFAULT, + } + pluginOverrides := []*admin.PluginOverride{pluginOverride1, pluginOverride2} + projectDomainResp := &admin.ProjectDomainAttributesGetResponse{ + Attributes: &admin.ProjectDomainAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_PluginOverrides{ + PluginOverrides: &admin.PluginOverrides{ + Overrides: pluginOverrides, + }, + }, + }, + }, + } + workflowResp := &admin.WorkflowAttributesGetResponse{ + Attributes: &admin.WorkflowAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Workflow: "workflow", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_PluginOverrides{ + PluginOverrides: &admin.PluginOverrides{ + Overrides: pluginOverrides, + }, + }, + }, + }, + } + t.Run("successful get project domain attribute", func(t *testing.T) { + var args []string + setup() + getPluginOverrideSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getPluginOverridesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","overrides":[{"task_type":"python_task","plugin_id":["plugin-override1","plugin-override2"]},{"task_type":"java_task","plugin_id":["plugin-override3","plugin-override3"],"missing_plugin_behavior":1}]}`) + }) + t.Run("successful get project domain attribute and write to file", func(t *testing.T) { + var args []string + setup() + getPluginOverrideSetup() + pluginoverride.DefaultFetchConfig.AttrFile = testDataTempFile + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getPluginOverridesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, `wrote the config to file temp-output-file`) + }) + t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { + var args []string + setup() + getPluginOverrideSetup() + pluginoverride.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getPluginOverridesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, ``) + }) + t.Run("failed get project domain attribute", func(t *testing.T) { + var args []string + setup() + getPluginOverrideSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getPluginOverridesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, ``) + }) + t.Run("successful get workflow attribute", func(t *testing.T) { + var args []string + setup() + getPluginOverrideSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(workflowResp, nil) + err = getPluginOverridesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","overrides":[{"task_type":"python_task","plugin_id":["plugin-override1","plugin-override2"]},{"task_type":"java_task","plugin_id":["plugin-override3","plugin-override3"],"missing_plugin_behavior":1}]}`) + }) + t.Run("failed get workflow attribute", func(t *testing.T) { + var args []string + setup() + getPluginOverrideSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getPluginOverridesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go index b3ba8023c4..74c8a9a99d 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -28,7 +28,7 @@ eg : output from the command {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} Retrieves task resource attribute for project and domain and workflow -Here the command get task resource attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +Here the command get task resource attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort :: flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute.go b/flytectl/cmd/update/matchable_cluster_resource_attribute.go index 77b0821c7c..c41b74f23c 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute.go @@ -35,7 +35,7 @@ resource attribute defined at project domain level. Also this will completely overwrite any existing custom project and domain and workflow combination attributes. Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values Refer to get cluster-resource-attribute section on how to generate this file -Update the cluster resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +Update the cluster resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain .. code-block:: yaml diff --git a/flytectl/cmd/update/matchable_execution_cluster_label.go b/flytectl/cmd/update/matchable_execution_cluster_label.go new file mode 100644 index 0000000000..0a3eb6965c --- /dev/null +++ b/flytectl/cmd/update/matchable_execution_cluster_label.go @@ -0,0 +1,73 @@ +package update + +import ( + "context" + "fmt" + + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" + cmdCore "github.com/flyteorg/flytectl/cmd/core" +) + +const ( + executionClusterLabelShort = "Updates matchable resources of execution cluster label" + executionClusterLabelLong = ` +Updates execution cluster label for given project and domain combination or additionally with workflow name. + +Updating to the execution cluster label is only available from a generated file. See the get section for generating this file. +Here the command updates takes the input for execution cluster label from the config file ecl.yaml +eg: content of ecl.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + value: foo + +:: + + flytectl update execution-cluster-label --attrFile ecl.yaml + +Updating execution cluster label for project and domain and workflow combination. This will take precedence over any other +execution cluster label defined at project domain level. +Update the execution cluster label for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain + +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + value: foo + +:: + + flytectl update execution-cluster-label --attrFile ecl.yaml + +Usage + +` +) + +func updateExecutionClusterLabelFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + updateConfig := executionclusterlabel.DefaultUpdateConfig + if len(updateConfig.AttrFile) == 0 { + return fmt.Errorf("attrFile is mandatory while calling update for execution cluster label") + } + + executionClusterLabelFileConfig := executionclusterlabel.FileConfig{} + if err := sconfig.ReadConfigFromFile(&executionClusterLabelFileConfig, updateConfig.AttrFile); err != nil { + return err + } + + // Get project domain workflow name from the read file. + project := executionClusterLabelFileConfig.Project + domain := executionClusterLabelFileConfig.Domain + workflowName := executionClusterLabelFileConfig.Workflow + + // Updates the admin matchable attribute from executionClusterLabelFileConfig + if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), + executionClusterLabelFileConfig); err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/update/matchable_execution_cluster_label_test.go b/flytectl/cmd/update/matchable_execution_cluster_label_test.go new file mode 100644 index 0000000000..b22b444b7a --- /dev/null +++ b/flytectl/cmd/update/matchable_execution_cluster_label_test.go @@ -0,0 +1,94 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" + u "github.com/flyteorg/flytectl/cmd/testutils" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func updateExecutionClusterLabelSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + executionclusterlabel.DefaultUpdateConfig = &executionclusterlabel.AttrUpdateConfig{} +} + +func TestExecutionClusterLabel(t *testing.T) { + t.Run("no input file for update", func(t *testing.T) { + setup() + updateExecutionClusterLabelSetup() + err = updateExecutionClusterLabelFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for execution cluster label"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update project domain attribute", func(t *testing.T) { + setup() + updateExecutionClusterLabelSetup() + executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_cluster_label.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = updateExecutionClusterLabelFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update project domain attribute", func(t *testing.T) { + setup() + updateExecutionClusterLabelSetup() + executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_cluster_label.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updateExecutionClusterLabelFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update workflow attribute", func(t *testing.T) { + setup() + updateExecutionClusterLabelSetup() + executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_cluster_label.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = updateExecutionClusterLabelFunc(ctx, nil, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update workflow attribute", func(t *testing.T) { + setup() + updateExecutionClusterLabelSetup() + executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_cluster_label.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updateExecutionClusterLabelFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("non existent file", func(t *testing.T) { + setup() + updateExecutionClusterLabelSetup() + executionclusterlabel.DefaultUpdateConfig.AttrFile = testDataNonExistentFile + err = updateExecutionClusterLabelFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) + tearDownAndVerify(t, ``) + }) + t.Run("invalid update file", func(t *testing.T) { + setup() + updateExecutionClusterLabelSetup() + executionclusterlabel.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile + err = updateExecutionClusterLabelFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute.go b/flytectl/cmd/update/matchable_execution_queue_attribute.go index 676c351396..f48bfa2d3b 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute.go @@ -37,7 +37,7 @@ eg: content of era.yaml Updating execution queue attribute for project and domain and workflow combination. This will take precedence over any other execution queue attribute defined at project domain level. -Update the execution queue attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +Update the execution queue attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain .. code-block:: yaml diff --git a/flytectl/cmd/update/matchable_plugin_override.go b/flytectl/cmd/update/matchable_plugin_override.go new file mode 100644 index 0000000000..ceeaca0d96 --- /dev/null +++ b/flytectl/cmd/update/matchable_plugin_override.go @@ -0,0 +1,86 @@ +package update + +import ( + "context" + "fmt" + + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" + cmdCore "github.com/flyteorg/flytectl/cmd/core" +) + +const ( + pluginOverrideShort = "Updates matchable resources of plugin overrides" + pluginOverrideLong = ` +Updates plugin overrides for given project and domain combination or additionally with workflow name. + +Updating to the plugin override is only available from a generated file. See the get section for generating this file. +Also this will completely overwrite any existing plugins overrides on custom project and domain and workflow combination. +Would be preferable to do get and generate an plugin override file if there is an existing override already set and then update it to have new values +Refer to get plugin-override section on how to generate this file +Here the command updates takes the input for plugin overrides from the config file po.yaml +eg: content of po.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + overrides: + - task_type: python_task # Task type for which to apply plugin implementation overrides + plugin_id: # Plugin id(s) to be used in place of the default for the task type. + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT + +:: + + flytectl update plugin-override --attrFile po.yaml + +Updating plugin override for project and domain and workflow combination. This will take precedence over any other +plugin overrides defined at project domain level. +Update the plugin overrides for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain + +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + overrides: + - task_type: python_task # Task type for which to apply plugin implementation overrides + plugin_id: # Plugin id(s) to be used in place of the default for the task type. + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT + +:: + + flytectl update plugin-override --attrFile po.yaml + +Usage + +` +) + +func updatePluginOverridesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + updateConfig := pluginoverride.DefaultUpdateConfig + if len(updateConfig.AttrFile) == 0 { + return fmt.Errorf("attrFile is mandatory while calling update for plugin override") + } + + pluginOverrideFileConfig := pluginoverride.FileConfig{} + if err := sconfig.ReadConfigFromFile(&pluginOverrideFileConfig, updateConfig.AttrFile); err != nil { + return err + } + + // Get project domain workflow name from the read file. + project := pluginOverrideFileConfig.Project + domain := pluginOverrideFileConfig.Domain + workflowName := pluginOverrideFileConfig.Workflow + + // Updates the admin matchable attribute from pluginOverrideFileConfig + if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), + pluginOverrideFileConfig); err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/update/matchable_plugin_override_test.go b/flytectl/cmd/update/matchable_plugin_override_test.go new file mode 100644 index 0000000000..8ca9cff072 --- /dev/null +++ b/flytectl/cmd/update/matchable_plugin_override_test.go @@ -0,0 +1,94 @@ +package update + +import ( + "fmt" + "testing" + + pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" + u "github.com/flyteorg/flytectl/cmd/testutils" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func updatePluginOverrideSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + pluginoverride.DefaultUpdateConfig = &pluginoverride.AttrUpdateConfig{} +} + +func TestPluginOverride(t *testing.T) { + t.Run("no input file for update", func(t *testing.T) { + setup() + updatePluginOverrideSetup() + err = updatePluginOverridesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for plugin override"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update project domain attribute", func(t *testing.T) { + setup() + updatePluginOverrideSetup() + pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_plugin_override.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = updatePluginOverridesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update project domain attribute", func(t *testing.T) { + setup() + updatePluginOverrideSetup() + pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_plugin_override.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updatePluginOverridesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update workflow attribute", func(t *testing.T) { + setup() + updatePluginOverrideSetup() + pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_plugin_override.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = updatePluginOverridesFunc(ctx, nil, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update workflow attribute", func(t *testing.T) { + setup() + updatePluginOverrideSetup() + pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_plugin_override.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updatePluginOverridesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("non existent file", func(t *testing.T) { + setup() + updatePluginOverrideSetup() + pluginoverride.DefaultUpdateConfig.AttrFile = testDataNonExistentFile + err = updatePluginOverridesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) + tearDownAndVerify(t, ``) + }) + t.Run("invalid update file", func(t *testing.T) { + setup() + updatePluginOverrideSetup() + pluginoverride.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile + err = updatePluginOverridesFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go index 3e351baa95..1719dc9c40 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -38,7 +38,7 @@ eg: content of tra.yaml Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. -Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain .. code-block:: yaml diff --git a/flytectl/cmd/update/testdata/valid_project_domain_execution_cluster_label.yaml b/flytectl/cmd/update/testdata/valid_project_domain_execution_cluster_label.yaml new file mode 100644 index 0000000000..37f8a630c2 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_domain_execution_cluster_label.yaml @@ -0,0 +1,3 @@ +domain: development +project: flytectldemo +value: foo \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_project_domain_plugin_override.yaml b/flytectl/cmd/update/testdata/valid_project_domain_plugin_override.yaml new file mode 100644 index 0000000000..a8ffc0fef8 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_domain_plugin_override.yaml @@ -0,0 +1,8 @@ +domain: development +project: flytectldemo +overrides: + - task_type: python_task + plugin_id: + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # 0 : FAIL , 1: DEFAULT diff --git a/flytectl/cmd/update/testdata/valid_workflow_execution_cluster_label.yaml b/flytectl/cmd/update/testdata/valid_workflow_execution_cluster_label.yaml new file mode 100644 index 0000000000..ccd978fa76 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_workflow_execution_cluster_label.yaml @@ -0,0 +1,4 @@ +domain: development +project: flytectldemo +workflow: core.control_flow.run_merge_sort.merge_sort +value: foo \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_workflow_plugin_override.yaml b/flytectl/cmd/update/testdata/valid_workflow_plugin_override.yaml new file mode 100644 index 0000000000..6fbb58eae0 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_workflow_plugin_override.yaml @@ -0,0 +1,9 @@ +domain: development +project: flytectldemo +workflow: core.control_flow.run_merge_sort.merge_sort +overrides: + - task_type: python_task + plugin_id: + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # 0 : FAIL , 1: DEFAULT \ No newline at end of file diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 5ea12d3899..34ab70c21c 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -2,7 +2,9 @@ package update import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -45,6 +47,10 @@ func CreateUpdateCommand() *cobra.Command { Short: clusterResourceAttributesShort, Long: clusterResourceAttributesLong, ProjectDomainNotRequired: true}, "execution-queue-attribute": {CmdFunc: updateExecutionQueueAttributesFunc, Aliases: []string{}, PFlagProvider: executionqueueattribute.DefaultUpdateConfig, Short: executionQueueAttributesShort, Long: executionQueueAttributesLong, ProjectDomainNotRequired: true}, + "execution-cluster-label": {CmdFunc: updateExecutionClusterLabelFunc, Aliases: []string{}, PFlagProvider: executionclusterlabel.DefaultUpdateConfig, + Short: executionClusterLabelShort, Long: executionClusterLabelLong, ProjectDomainNotRequired: true}, + "plugin-override": {CmdFunc: updatePluginOverridesFunc, Aliases: []string{}, PFlagProvider: pluginoverride.DefaultUpdateConfig, + Short: pluginOverrideShort, Long: pluginOverrideLong, ProjectDomainNotRequired: true}, } cmdCore.AddCommands(updateCmd, updateResourcesFuncs) return updateCmd diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index 953bc712ab..3afcd4ae70 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -32,19 +32,19 @@ func TestUpdateCommand(t *testing.T) { assert.Equal(t, updateCommand.Use, updateUse) assert.Equal(t, updateCommand.Short, updateShort) assert.Equal(t, updateCommand.Long, updatecmdLong) - assert.Equal(t, len(updateCommand.Commands()), 7) + assert.Equal(t, len(updateCommand.Commands()), 9) cmdNouns := updateCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - useArray := []string{"cluster-resource-attribute", "execution-queue-attribute", "launchplan", "project", "task", - "task-resource-attribute", "workflow"} - aliases := [][]string{{}, {}, {}, {}, {}, {}, {}} - shortArray := []string{clusterResourceAttributesShort, executionQueueAttributesShort, updateLPShort, projectShort, updateTaskShort, - taskResourceAttributesShort, updateWorkflowShort} - longArray := []string{clusterResourceAttributesLong, executionQueueAttributesLong, updateLPLong, projectLong, updateTaskLong, - taskResourceAttributesLong, updateWorkflowLong} + useArray := []string{"cluster-resource-attribute", "execution-cluster-label", "execution-queue-attribute", "launchplan", + "plugin-override", "project", "task", "task-resource-attribute", "workflow"} + aliases := [][]string{{}, {}, {}, {}, {}, {}, {}, {}, {}} + shortArray := []string{clusterResourceAttributesShort, executionClusterLabelShort, executionQueueAttributesShort, updateLPShort, + pluginOverrideShort, projectShort, updateTaskShort, taskResourceAttributesShort, updateWorkflowShort} + longArray := []string{clusterResourceAttributesLong, executionClusterLabelLong, executionQueueAttributesLong, updateLPLong, + pluginOverrideLong, projectLong, updateTaskLong, taskResourceAttributesLong, updateWorkflowLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index f766162a09..d22416441d 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -73,6 +73,8 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_delete_cluster-resource-attribute` - Deletes matchable resources of cluster attributes * :doc:`flytectl_delete_execution` - Terminate/Delete execution resources. +* :doc:`flytectl_delete_execution-cluster-label` - Deletes matchable resources of execution cluster label * :doc:`flytectl_delete_execution-queue-attribute` - Deletes matchable resources of execution queue attributes +* :doc:`flytectl_delete_plugin-override` - Deletes matchable resources of plugin overrides * :doc:`flytectl_delete_task-resource-attribute` - Deletes matchable resources of task attributes diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 9971f0bc79..ee2e26a889 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -38,7 +38,7 @@ eg: content of cra.yaml which will use the project domain and workflow name for buzz: "lightyear" Deletes cluster resource attribute for a workflow -Here the command deletes cluster resource attributes for a workflow +Here the command deletes cluster resource attributes for a workflow core.control_flow.run_merge_sort.merge_sort :: diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst new file mode 100644 index 0000000000..9290a5444b --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -0,0 +1,108 @@ +.. _flytectl_delete_execution-cluster-label: + +flytectl delete execution-cluster-label +--------------------------------------- + +Deletes matchable resources of execution cluster label + +Synopsis +~~~~~~~~ + + + +Deletes execution cluster label for given project and domain combination or additionally with workflow name. + +Deletes execution cluster label for project and domain +Here the command delete execution cluster label for project flytectldemo and development domain. +:: + + flytectl delete execution-cluster-label -p flytectldemo -d development + + +Deletes execution cluster label using config file which was used for creating it. +Here the command deletes execution cluster label from the config file ecl.yaml +Value is optional in the file as its unread during the delete command but can be kept as the same file can be used for get, update or delete +eg: content of ecl.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete execution-cluster-label --attrFile ecl.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + value: foo + +Deletes execution cluster label for a workflow +Here the command deletes execution cluster label for a workflow core.control_flow.run_merge_sort.merge_sort + +:: + + flytectl delete execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage + + +:: + + flytectl delete execution-cluster-label [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for delete attribute for the resource type. + -h, --help help for execution-cluster-label + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index d016f47ced..20c4f4506c 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -40,7 +40,7 @@ eg: content of era.yaml which will use the project domain and workflow name for - lightyear Deletes execution queue attribute for a workflow -Here the command deletes the execution queue attributes for a workflow +Here the command deletes the execution queue attributes for a workflow core.control_flow.run_merge_sort.merge_sort :: diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst new file mode 100644 index 0000000000..f76d01d2f3 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -0,0 +1,113 @@ +.. _flytectl_delete_plugin-override: + +flytectl delete plugin-override +------------------------------- + +Deletes matchable resources of plugin overrides + +Synopsis +~~~~~~~~ + + + +Deletes plugin override for given project and domain combination or additionally with workflow name. + +Deletes plugin override for project and domain +Here the command deletes plugin override for project flytectldemo and development domain. +:: + + flytectl delete plugin-override -p flytectldemo -d development + + +Deletes plugin override using config file which was used for creating it. +Here the command deletes plugin overrides from the config file po.yaml +Overrides are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete +eg: content of po.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete plugin-override --attrFile po.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + overrides: + - task_type: python_task # Task type for which to apply plugin implementation overrides + plugin_id: # Plugin id(s) to be used in place of the default for the task type. + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT + +Deletes plugin override for a workflow +Here the command deletes the plugin override for a workflow core.control_flow.run_merge_sort.merge_sort + +:: + + flytectl delete plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage + + +:: + + flytectl delete plugin-override [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for delete attribute for the resource type. + -h, --help help for plugin-override + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index c393da6c54..91b3f785b0 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -41,7 +41,7 @@ eg: content of tra.yaml which will use the project domain and workflow name for memory: "450Mi" Deletes task resource attribute for a workflow -Here the command deletes task resource attributes for a workflow +Here the command deletes task resource attributes for a workflow core.control_flow.run_merge_sort.merge_sort :: diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 2852cda14a..4a0608a262 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -13,7 +13,7 @@ Synopsis Example get projects. :: - bin/flytectl get project + flytectl get project Options @@ -73,8 +73,10 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_get_cluster-resource-attribute` - Gets matchable resources of cluster resource attributes * :doc:`flytectl_get_execution` - Gets execution resources +* :doc:`flytectl_get_execution-cluster-label` - Gets matchable resources of execution cluster label * :doc:`flytectl_get_execution-queue-attribute` - Gets matchable resources of execution queue attributes * :doc:`flytectl_get_launchplan` - Gets launch plan resources +* :doc:`flytectl_get_plugin-override` - Gets matchable resources of plugin override * :doc:`flytectl_get_project` - Gets project resources * :doc:`flytectl_get_task` - Gets task resources * :doc:`flytectl_get_task-resource-attribute` - Gets matchable resources of task attributes diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index 5dfa50b3e1..0606779729 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -25,7 +25,7 @@ eg : output from the command {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} Retrieves cluster resource attribute for project and domain and workflow -Here the command get cluster resource attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +Here the command get cluster resource attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort :: flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst new file mode 100644 index 0000000000..e8752979d7 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -0,0 +1,117 @@ +.. _flytectl_get_execution-cluster-label: + +flytectl get execution-cluster-label +------------------------------------ + +Gets matchable resources of execution cluster label + +Synopsis +~~~~~~~~ + + + +Retrieves execution cluster label for given project and domain combination or additionally with workflow name. + +Retrieves execution cluster label for project and domain +Here the command get execution cluster label for project flytectldemo and development domain. +:: + + flytectl get execution-cluster-label -p flytectldemo -d development + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","value":"foo"} + +Retrieves execution cluster label for project and domain and workflow +Here the command get execution cluster label for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +:: + + flytectl get execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","value":"foo"} + +Writing the execution cluster label to a file. If there are no execution cluster label, command would return an error. +Here the command gets execution cluster label and writes the config file to ecl.yaml +eg: content of ecl.yaml + +:: + + flytectl get execution-cluster-label --attrFile ecl.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + value: foo + +Usage + + +:: + + flytectl get execution-cluster-label [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for generating attribute for the resource type. + -h, --help help for execution-cluster-label + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index db008340a4..b9eff077be 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -25,7 +25,7 @@ eg : output from the command {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} Retrieves execution queue attribute for project and domain and workflow -Here the command get execution queue attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +Here the command get execution queue attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort :: flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst new file mode 100644 index 0000000000..1735945a10 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -0,0 +1,141 @@ +.. _flytectl_get_plugin-override: + +flytectl get plugin-override +---------------------------- + +Gets matchable resources of plugin override + +Synopsis +~~~~~~~~ + + + +Retrieves plugin overrides for given project and domain combination or additionally with workflow name. + +Retrieves plugin overrides for project and domain +Here the command get plugin override for project flytectldemo and development domain. + +:: + + flytectl get plugin-override -p flytectldemo -d development + +eg : output from the command + +.. code-block:: json + + { + "project": "flytectldemo", + "domain": "development", + "overrides": [{ + "task_type": "python_task", + "plugin_id": ["pluginoverride1", "pluginoverride2"], + "missing_plugin_behavior": 0 + }] + } + +Retrieves plugin override for project and domain and workflow +Here the command get plugin override for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort + +:: + + flytectl get plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + { + "project": "flytectldemo", + "domain": "development", + "workflow": "core.control_flow.run_merge_sort.merge_sort" + "overrides": [{ + "task_type": "python_task", + "plugin_id": ["pluginoverride1", "pluginoverride2"], + "missing_plugin_behavior": 0 + }] + } + +Writing the plugin override to a file. If there are no plugin overrides, command would return an error. +Here the command gets plugin overrides and writes the config file to po.yaml +eg: content of po.yaml + +:: + + flytectl get plugin-override --attrFile po.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + overrides: + - task_type: python_task # Task type for which to apply plugin implementation overrides + plugin_id: # Plugin id(s) to be used in place of the default for the task type. + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT + +Usage + + +:: + + flytectl get plugin-override [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for generating attribute for the resource type. + -h, --help help for plugin-override + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 7b4fa5ba74..a49cb1f96d 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -25,7 +25,7 @@ eg : output from the command {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} Retrieves task resource attribute for project and domain and workflow -Here the command get task resource attributes for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +Here the command get task resource attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort :: flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 3fd3d51b06..1372e09809 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -74,8 +74,10 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_update_cluster-resource-attribute` - Updates matchable resources of cluster attributes +* :doc:`flytectl_update_execution-cluster-label` - Updates matchable resources of execution cluster label * :doc:`flytectl_update_execution-queue-attribute` - Updates matchable resources of execution queue attributes * :doc:`flytectl_update_launchplan` - Updates launch plan metadata +* :doc:`flytectl_update_plugin-override` - Updates matchable resources of plugin overrides * :doc:`flytectl_update_project` - Updates project resources * :doc:`flytectl_update_task` - Updates task metadata * :doc:`flytectl_update_task-resource-attribute` - Updates matchable resources of task attributes diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index f17c81d62b..1646cdfc90 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -33,7 +33,7 @@ resource attribute defined at project domain level. Also this will completely overwrite any existing custom project and domain and workflow combination attributes. Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values Refer to get cluster-resource-attribute section on how to generate this file -Update the cluster resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +Update the cluster resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain .. code-block:: yaml diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst new file mode 100644 index 0000000000..325dda91a6 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -0,0 +1,108 @@ +.. _flytectl_update_execution-cluster-label: + +flytectl update execution-cluster-label +--------------------------------------- + +Updates matchable resources of execution cluster label + +Synopsis +~~~~~~~~ + + + +Updates execution cluster label for given project and domain combination or additionally with workflow name. + +Updating to the execution cluster label is only available from a generated file. See the get section for generating this file. +Here the command updates takes the input for execution cluster label from the config file ecl.yaml +eg: content of ecl.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + value: foo + +:: + + flytectl update execution-cluster-label --attrFile ecl.yaml + +Updating execution cluster label for project and domain and workflow combination. This will take precedence over any other +execution cluster label defined at project domain level. +Update the execution cluster label for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain + +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + value: foo + +:: + + flytectl update execution-cluster-label --attrFile ecl.yaml + +Usage + + + +:: + + flytectl update execution-cluster-label [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for updating attribute for the resource type. + -h, --help help for execution-cluster-label + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. + diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index e7aa206301..85f28eec5b 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -35,7 +35,7 @@ eg: content of era.yaml Updating execution queue attribute for project and domain and workflow combination. This will take precedence over any other execution queue attribute defined at project domain level. -Update the execution queue attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +Update the execution queue attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain .. code-block:: yaml diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst new file mode 100644 index 0000000000..3cff796b1d --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -0,0 +1,121 @@ +.. _flytectl_update_plugin-override: + +flytectl update plugin-override +------------------------------- + +Updates matchable resources of plugin overrides + +Synopsis +~~~~~~~~ + + + +Updates plugin overrides for given project and domain combination or additionally with workflow name. + +Updating to the plugin override is only available from a generated file. See the get section for generating this file. +Also this will completely overwrite any existing plugins overrides on custom project and domain and workflow combination. +Would be preferable to do get and generate an plugin override file if there is an existing override already set and then update it to have new values +Refer to get plugin-override section on how to generate this file +Here the command updates takes the input for plugin overrides from the config file po.yaml +eg: content of po.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + overrides: + - task_type: python_task # Task type for which to apply plugin implementation overrides + plugin_id: # Plugin id(s) to be used in place of the default for the task type. + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT + +:: + + flytectl update plugin-override --attrFile po.yaml + +Updating plugin override for project and domain and workflow combination. This will take precedence over any other +plugin overrides defined at project domain level. +Update the plugin overrides for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain + +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + overrides: + - task_type: python_task # Task type for which to apply plugin implementation overrides + plugin_id: # Plugin id(s) to be used in place of the default for the task type. + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT + +:: + + flytectl update plugin-override --attrFile po.yaml + +Usage + + + +:: + + flytectl update plugin-override [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for updating attribute for the resource type. + -h, --help help for plugin-override + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) + --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) + --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. + diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 8e13080509..37c3439eff 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -36,7 +36,7 @@ eg: content of tra.yaml Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. -Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain .. code-block:: yaml diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index 3c546cbfab..89d3c74a3d 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -14,7 +14,9 @@ Nouns gen/flytectl_get_task gen/flytectl_get_task-resource-attribute gen/flytectl_get_cluster-resource-attribute + gen/flytectl_get_execution-cluster-label gen/flytectl_get_execution-queue-attribute + gen/flytectl_get_plugin-override gen/flytectl_get_launchplan gen/flytectl_update_launchplan gen/flytectl_update_workflow @@ -22,12 +24,16 @@ Nouns gen/flytectl_update_task gen/flytectl_update_task-resource-attribute gen/flytectl_update_cluster-resource-attribute + gen/flytectl_update_execution-cluster-label gen/flytectl_update_execution-queue-attribute + gen/flytectl_update_plugin-override gen/flytectl_register_files gen/flytectl_delete_execution gen/flytectl_delete_task-resource-attribute gen/flytectl_delete_cluster-resource-attribute + gen/flytectl_delete_execution-cluster-label gen/flytectl_delete_execution-queue-attribute + gen/flytectl_delete_plugin-override gen/flytectl_version gen/flytectl_config_validate gen/flytectl_config_discover From 7b0145f0df086201362740a0ccd6421fcebf184a Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Thu, 20 May 2021 08:39:49 +0530 Subject: [PATCH 051/645] Using the new pflags which has --bind-default-var functionality (#70) * Using the new pflags which has --bind-default-var functionality Signed-off-by: Prafulla Mahindrakar * Using released version of stdlib Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/create/projectconfig_flags.go | 10 +++++----- flytectl/go.mod | 2 +- flytectl/go.sum | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/flytectl/cmd/create/projectconfig_flags.go b/flytectl/cmd/create/projectconfig_flags.go index db17e4882b..55a3eb8eed 100755 --- a/flytectl/cmd/create/projectconfig_flags.go +++ b/flytectl/cmd/create/projectconfig_flags.go @@ -50,10 +50,10 @@ func (ProjectConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg ProjectConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("ProjectConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(projectConfig.ID), fmt.Sprintf("%v%v", prefix, "id"), *new(string), "id for the project specified as argument.") - cmdFlags.StringVar(&(projectConfig.Name), fmt.Sprintf("%v%v", prefix, "name"), *new(string), "name for the project specified as argument.") - cmdFlags.StringVar(&(projectConfig.File), fmt.Sprintf("%v%v", prefix, "file"), *new(string), "file for the project definition.") - cmdFlags.StringVar(&(projectConfig.Description), fmt.Sprintf("%v%v", prefix, "description"), *new(string), "description for the project specified as argument.") - cmdFlags.StringToStringVar(&(projectConfig.Labels), fmt.Sprintf("%v%v", prefix, "labels"), map[string]string{}, "labels for the project specified as argument.") + cmdFlags.StringVar(&projectConfig.ID, fmt.Sprintf("%v%v", prefix, "id"), projectConfig.ID, "id for the project specified as argument.") + cmdFlags.StringVar(&projectConfig.Name, fmt.Sprintf("%v%v", prefix, "name"), projectConfig.Name, "name for the project specified as argument.") + cmdFlags.StringVar(&projectConfig.File, fmt.Sprintf("%v%v", prefix, "file"), projectConfig.File, "file for the project definition.") + cmdFlags.StringVar(&projectConfig.Description, fmt.Sprintf("%v%v", prefix, "description"), projectConfig.Description, "description for the project specified as argument.") + cmdFlags.StringToStringVar(&projectConfig.Labels, fmt.Sprintf("%v%v", prefix, "labels"), projectConfig.Labels, "labels for the project specified as argument.") return cmdFlags } diff --git a/flytectl/go.mod b/flytectl/go.mod index cd987f766a..0f387bf4d7 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect github.com/flyteorg/flyteidl v0.18.40 - github.com/flyteorg/flytestdlib v0.3.15 + github.com/flyteorg/flytestdlib v0.3.21 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 github.com/google/uuid v1.1.2 diff --git a/flytectl/go.sum b/flytectl/go.sum index a1ceb251bd..b8d3df4f31 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -176,8 +176,8 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/flyteorg/flyteidl v0.18.40 h1:YuLBNpIotOFwyLSXSs0aj3B9N9vwPhzLRAQTWxYSI/w= github.com/flyteorg/flyteidl v0.18.40/go.mod h1:IJD02cc/95QMkGDBJNibsr5aWd6V7TlQiJ8Iz5mVZ28= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= -github.com/flyteorg/flytestdlib v0.3.15 h1:vzsfqriENyavv6EBwsIm55di2wC+j0jkmjw30JGHAkM= -github.com/flyteorg/flytestdlib v0.3.15/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= +github.com/flyteorg/flytestdlib v0.3.21 h1:AF+y6wI64DNfoi4WtZU/v18Cfwksg32fijy7PZJ8d+I= +github.com/flyteorg/flytestdlib v0.3.21/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= From 0f708dd43e103a24ce13cab4166a5ba9a2c469c8 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Mon, 24 May 2021 21:46:15 +0530 Subject: [PATCH 052/645] Added non zero return code on error and AlreadyExists as success condition (#71) * Added non zero return code on error and also made AlreadyExists as success condition Signed-off-by: Prafulla Mahindrakar * Added coverage Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/register/files.go | 2 +- flytectl/cmd/register/register_util.go | 16 ++- flytectl/cmd/register/register_util_test.go | 99 ++++++++++++++++-- .../69_core.flyte_basics.lp.greet_1.pb | Bin 0 -> 718 bytes flytectl/main.go | 7 +- 5 files changed, 109 insertions(+), 15 deletions(-) create mode 100644 flytectl/cmd/register/testdata/69_core.flyte_basics.lp.greet_1.pb diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index cf4f957e3a..78cf87a15c 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -94,5 +94,5 @@ func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.Co logger.Errorf(ctx, "unable to delete temp dir %v due to %v", tmpDir, _err) } } - return nil + return _err } diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 031b0e836d..3bb5a5d6f7 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -23,6 +23,8 @@ import ( "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) const registrationProjectPattern = "{{ registration.project }}" @@ -40,10 +42,10 @@ type HTTPClient interface { Do(req *http.Request) (*http.Response, error) } -var Client HTTPClient +var httpClient HTTPClient func init() { - Client = &http.Client{} + httpClient = &http.Client{} } var projectColumns = []printer.Column{ @@ -214,7 +216,7 @@ func DownloadFileFromHTTP(ctx context.Context, ref storage.DataReference) (io.Re if err != nil { return nil, err } - resp, err := Client.Do(req) + resp, err := httpClient.Do(req) if err != nil { return nil, err } @@ -320,7 +322,13 @@ func registerFile(ctx context.Context, fileName string, registerResults []Result } logger.Debugf(ctx, "Hydrated spec : %v", getJSONSpec(spec)) if err := register(ctx, spec, cmdCtx); err != nil { - registerResult = Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error registering file due to %v", err)} + // If error is AlreadyExists then dont consider this to be an error but just a warning state + if grpcError := status.Code(err); grpcError == codes.AlreadyExists { + registerResult = Result{Name: fileName, Status: "Success", Info: fmt.Sprintf("%v", grpcError.String())} + err = nil + } else { + registerResult = Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error registering file due to %v", err)} + } registerResults = append(registerResults, registerResult) return registerResults, err } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index f551efc80c..ce5805fd7b 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -10,26 +10,36 @@ import ( "strings" "testing" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) -type MockClient struct { +type MockHTTPClient struct { DoFunc func(req *http.Request) (*http.Response, error) } -func (m *MockClient) Do(req *http.Request) (*http.Response, error) { +func (m *MockHTTPClient) Do(req *http.Request) (*http.Response, error) { return GetDoFunc(req) } var ( - ctx context.Context - args []string - GetDoFunc func(req *http.Request) (*http.Response, error) + ctx context.Context + mockAdminClient *mocks.AdminServiceClient + cmdCtx cmdCore.CommandContext + args []string + GetDoFunc func(req *http.Request) (*http.Response, error) ) -func setup() { - ctx = context.Background() - Client = &MockClient{} +var setup = u.Setup + +func registerFilesSetup() { + httpClient = &MockHTTPClient{} validTar, err := os.Open("testdata/valid-register.tar") if err != nil { fmt.Printf("unexpected error: %v", err) @@ -41,10 +51,14 @@ func setup() { GetDoFunc = func(*http.Request) (*http.Response, error) { return response, nil } + ctx = u.Ctx + mockAdminClient = u.MockClient + cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) } func TestGetSortedFileList(t *testing.T) { setup() + registerFilesSetup() filesConfig.Archive = false args = []string{"file2", "file1"} fileList, tmpDir, err := getSortedFileList(ctx, args) @@ -56,6 +70,7 @@ func TestGetSortedFileList(t *testing.T) { func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { setup() + registerFilesSetup() filesConfig.Archive = true args = []string{"testdata/valid-parent-folder-register.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) @@ -72,6 +87,7 @@ func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { func TestGetSortedArchivedFileList(t *testing.T) { setup() + registerFilesSetup() filesConfig.Archive = true args = []string{"testdata/valid-register.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) @@ -88,6 +104,7 @@ func TestGetSortedArchivedFileList(t *testing.T) { func TestGetSortedArchivedFileUnorderedList(t *testing.T) { setup() + registerFilesSetup() filesConfig.Archive = true args = []string{"testdata/valid-unordered-register.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) @@ -104,6 +121,7 @@ func TestGetSortedArchivedFileUnorderedList(t *testing.T) { func TestGetSortedArchivedCorruptedFileList(t *testing.T) { setup() + registerFilesSetup() filesConfig.Archive = true args = []string{"testdata/invalid.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) @@ -116,6 +134,7 @@ func TestGetSortedArchivedCorruptedFileList(t *testing.T) { func TestGetSortedArchivedTgzList(t *testing.T) { setup() + registerFilesSetup() filesConfig.Archive = true args = []string{"testdata/valid-register.tgz"} fileList, tmpDir, err := getSortedFileList(ctx, args) @@ -144,6 +163,7 @@ func TestGetSortedArchivedCorruptedTgzFileList(t *testing.T) { func TestGetSortedArchivedInvalidArchiveFileList(t *testing.T) { setup() + registerFilesSetup() filesConfig.Archive = true args = []string{"testdata/invalid-extension-register.zip"} fileList, tmpDir, err := getSortedFileList(ctx, args) @@ -169,6 +189,7 @@ func TestGetSortedArchivedFileThroughInvalidHttpList(t *testing.T) { func TestGetSortedArchivedFileThroughValidHttpList(t *testing.T) { setup() + registerFilesSetup() filesConfig.Archive = true args = []string{"http://dummyhost:80/testdata/valid-register.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) @@ -185,6 +206,7 @@ func TestGetSortedArchivedFileThroughValidHttpList(t *testing.T) { func TestGetSortedArchivedFileThroughValidHttpWithNullContextList(t *testing.T) { setup() + registerFilesSetup() filesConfig.Archive = true args = []string{"http://dummyhost:80/testdata/valid-register.tar"} ctx = nil @@ -196,3 +218,64 @@ func TestGetSortedArchivedFileThroughValidHttpWithNullContextList(t *testing.T) // Clean up the temp directory. assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) } + +func TestRegisterFile(t *testing.T) { + t.Run("Successful run", func(t *testing.T) { + setup() + registerFilesSetup() + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} + var registerResults []Result + results, err := registerFile(ctx, args[0], registerResults, cmdCtx) + assert.Equal(t, 1, len(results)) + assert.Nil(t, err) + }) + t.Run("Non existent file", func(t *testing.T) { + setup() + registerFilesSetup() + args = []string{"testdata/non-existent.pb"} + var registerResults []Result + results, err := registerFile(ctx, args[0], registerResults, cmdCtx) + assert.Equal(t, 1, len(results)) + assert.Equal(t, "Failed", results[0].Status) + assert.Equal(t, "Error reading file due to open testdata/non-existent.pb: no such file or directory", results[0].Info) + assert.NotNil(t, err) + }) + t.Run("unmarhal failure", func(t *testing.T) { + setup() + registerFilesSetup() + args = []string{"testdata/valid-register.tar"} + var registerResults []Result + results, err := registerFile(ctx, args[0], registerResults, cmdCtx) + assert.Equal(t, 1, len(results)) + assert.Equal(t, "Failed", results[0].Status) + assert.Equal(t, "Error unmarshalling file due to failed unmarshalling file testdata/valid-register.tar", results[0].Info) + assert.NotNil(t, err) + }) + t.Run("AlreadyExists", func(t *testing.T) { + setup() + registerFilesSetup() + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, + status.Error(codes.AlreadyExists, "AlreadyExists")) + args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} + var registerResults []Result + results, err := registerFile(ctx, args[0], registerResults, cmdCtx) + assert.Equal(t, 1, len(results)) + assert.Equal(t, "Success", results[0].Status) + assert.Equal(t, "AlreadyExists", results[0].Info) + assert.Nil(t, err) + }) + t.Run("Registration Error", func(t *testing.T) { + setup() + registerFilesSetup() + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, + status.Error(codes.InvalidArgument, "Invalid")) + args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} + var registerResults []Result + results, err := registerFile(ctx, args[0], registerResults, cmdCtx) + assert.Equal(t, 1, len(results)) + assert.Equal(t, "Failed", results[0].Status) + assert.Equal(t, "Error registering file due to rpc error: code = InvalidArgument desc = Invalid", results[0].Info) + assert.NotNil(t, err) + }) +} diff --git a/flytectl/cmd/register/testdata/69_core.flyte_basics.lp.greet_1.pb b/flytectl/cmd/register/testdata/69_core.flyte_basics.lp.greet_1.pb new file mode 100644 index 0000000000000000000000000000000000000000..0fc9d10c8007969204f096939d5950dc43bdb597 GIT binary patch literal 718 zcmbtR&u8&kb`*yQc^D{tP1e(s^~wFj7Nw=E5eC^MRyNF`pX)i)5Pb#p_W-{+)S@hGuW zn+T=B3*(Ie7Vs<*nHQ(tLIar2Uy(mRXExgUa6R3auPUL2XG_w=*ltkuy_ZAJC)FL* zDZMVWzo7T1h3b-Tm{S&yDtg`;@BOSeT|7!e~tnEV)B29bh$0N;SW})k$vn zt+;8$mYTVQx0bl`AnSol#rCk|*e$Y*jOQxZ9g*?eC?-^5Y+s-~2_es8!-})BJ8PLz zQZFF7QZkQ$H2&2pdE_JsUjf;34Yy03WAx(e;`4mWCe!)&YC5`LZ)Vf8$@! Date: Mon, 24 May 2021 15:55:37 -0400 Subject: [PATCH 053/645] add mainnav icons (#72) Signed-off-by: cosmicBboy --- flytectl/doc-requirements.in | 1 + flytectl/doc-requirements.txt | 17 ++++++++++------- flytectl/docs/source/conf.py | 6 ++++++ flytectl/docs/source/index.rst | 12 ++++++------ 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in index 3cf9da6f2f..90287527fb 100644 --- a/flytectl/doc-requirements.in +++ b/flytectl/doc-requirements.in @@ -5,3 +5,4 @@ sphinx-prompt sphinx-material sphinx-code-include sphinx-copybutton +sphinx_fontawesome diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index 8df6e8b686..2517816f12 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -27,21 +27,21 @@ idna==2.10 # via requests imagesize==1.2.0 # via sphinx -jinja2==2.11.3 +jinja2==3.0.1 # via sphinx lxml==4.6.3 # via sphinx-material -markupsafe==1.1.1 +markupsafe==2.0.1 # via jinja2 packaging==20.9 # via sphinx -pygments==2.8.1 +pygments==2.9.0 # via # sphinx # sphinx-prompt pyparsing==2.4.7 # via packaging -python-slugify[unidecode]==4.0.1 +python-slugify[unidecode]==5.0.2 # via sphinx-material pytz==2021.1 # via babel @@ -49,7 +49,7 @@ readthedocs-sphinx-search==0.1.0 # via -r doc-requirements.in requests==2.25.1 # via sphinx -six==1.15.0 +six==1.16.0 # via sphinx-code-include snowballstemmer==2.1.0 # via sphinx @@ -59,6 +59,8 @@ sphinx-code-include==1.1.1 # via -r doc-requirements.in sphinx-copybutton==0.3.1 # via -r doc-requirements.in +sphinx-fontawesome==0.0.6 + # via -r doc-requirements.in sphinx-material==0.0.32 # via -r doc-requirements.in sphinx-prompt==1.4.0 @@ -69,19 +71,20 @@ sphinx==3.5.4 # furo # sphinx-code-include # sphinx-copybutton + # sphinx-fontawesome # sphinx-material # sphinx-prompt sphinxcontrib-applehelp==1.0.2 # via sphinx sphinxcontrib-devhelp==1.0.2 # via sphinx -sphinxcontrib-htmlhelp==1.0.3 +sphinxcontrib-htmlhelp==2.0.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-qthelp==1.0.3 # via sphinx -sphinxcontrib-serializinghtml==1.1.4 +sphinxcontrib-serializinghtml==1.1.5 # via sphinx text-unidecode==1.3 # via python-slugify diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 9874c85aa7..02a1bab91d 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -42,6 +42,7 @@ "sphinx-prompt", "sphinx_copybutton", "sphinx_search.extension", + "sphinx_fontawesome", ] # build the templated autosummary files @@ -98,6 +99,11 @@ "color-brand-primary": "#9D68E4", "color-brand-content": "#9D68E4", }, + # custom flyteorg furo theme options + "github_repo": "flytectl", + "github_username": "flyteorg", + "github_commit": "master", + "docs_path": "docs/source", # path to documentation source } html_context = { diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index d615f2fe7e..39399d4065 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -46,12 +46,12 @@ Basic Configuration :maxdepth: 1 :hidden: - Getting Started - User Guide - Tutorials - Concepts - API Reference - Community + |plane| Getting Started + |book-reader| User Guide + |chalkboard| Tutorials + |project-diagram| Concepts + |book| API Reference + |hands-helping| Community .. toctree:: :maxdepth: -1 From 514375fb72c0db2754591ad62e918014c0c30a1d Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Thu, 27 May 2021 10:03:22 +0530 Subject: [PATCH 054/645] Flytectl get started updated (#58) Signed-off-by: yuvraj --- flytectl/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/flytectl/README.md b/flytectl/README.md index 18d1afe748..b23d3cf373 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -24,7 +24,20 @@ Generating docs locally can be accomplished by running make gendocs from within $ brew tap flyteorg/homebrew-tap $ brew install flytectl ``` +## Get Started +### Create a sandbox cluster +```bash +$ docker run --rm --privileged -p 30081:30081 -p 30082:30082 -p 30084:30084 ghcr.io/flyteorg/flyte-sandbox +``` + +### Register your first workflow + +```bash +# Run Core workflows +$ flytectl register files https://github.com/flyteorg/flytesnacks/releases/download/v0.2.89/flytesnacks-core.tgz -d development -p flytesnacks --archive +# You can find all example at flytesnacks release page https://github.com/flyteorg/flytesnacks/releases/tag/v0.2.89 +``` ## Contributing [Contribution guidelines for this project](docs/CONTRIBUTING.md) From 852d7abc39edb7b2617fcae4e9fbeea074808cc3 Mon Sep 17 00:00:00 2001 From: Yuvraj <10830562+evalsocket@users.noreply.github.com> Date: Sat, 29 May 2021 20:03:24 +0530 Subject: [PATCH 055/645] Added boilerplate automation (#74) Signed-off-by: Yuvraj --- .../workflows/boilerplate-automation.yml | 36 + flytectl/.golangci.yml | 4 +- flytectl/Makefile | 3 +- .../golang_support_tools/go.mod | 8 +- .../flyte/golang_support_tools/go.sum | 1267 +++++++++++++++++ .../golang_support_tools/tools.go | 2 +- .../golang_test_targets/Makefile | 8 +- .../golang_test_targets/Readme.rst | 6 +- .../golang_test_targets/download_tooling.sh | 4 +- .../golang_test_targets/goimports | 4 +- .../golangci_file/.golangci.yml | 4 +- .../{lyft => flyte}/golangci_file/Readme.rst | 2 +- .../{lyft => flyte}/golangci_file/update.sh | 4 +- .../pull_request_template/Readme.rst | 2 +- .../pull_request_template.md | 10 +- .../pull_request_template/update.sh | 4 +- .../flyte/{ => welcome_bot}/Readme.rst | 0 .../flyte/{ => welcome_bot}/config.yml | 0 .../flyte/{ => welcome_bot}/update.sh | 6 +- .../lyft/golang_support_tools/go.sum | 558 -------- flytectl/boilerplate/update.cfg | 10 +- flytectl/boilerplate/update.sh | 18 +- flytectl/pull_request_template.md | 32 + 23 files changed, 1387 insertions(+), 605 deletions(-) create mode 100644 flytectl/.github/workflows/boilerplate-automation.yml rename flytectl/boilerplate/{lyft => flyte}/golang_support_tools/go.mod (61%) create mode 100644 flytectl/boilerplate/flyte/golang_support_tools/go.sum rename flytectl/boilerplate/{lyft => flyte}/golang_support_tools/tools.go (100%) rename flytectl/boilerplate/{lyft => flyte}/golang_test_targets/Makefile (82%) rename flytectl/boilerplate/{lyft => flyte}/golang_test_targets/Readme.rst (75%) rename flytectl/boilerplate/{lyft => flyte}/golang_test_targets/download_tooling.sh (92%) rename flytectl/boilerplate/{lyft => flyte}/golang_test_targets/goimports (56%) rename flytectl/boilerplate/{lyft => flyte}/golangci_file/.golangci.yml (72%) rename flytectl/boilerplate/{lyft => flyte}/golangci_file/Readme.rst (60%) rename flytectl/boilerplate/{lyft => flyte}/golangci_file/update.sh (67%) rename flytectl/boilerplate/{lyft => flyte}/pull_request_template/Readme.rst (55%) rename flytectl/boilerplate/{lyft => flyte}/pull_request_template/pull_request_template.md (54%) rename flytectl/boilerplate/{lyft => flyte}/pull_request_template/update.sh (61%) rename flytectl/boilerplate/flyte/{ => welcome_bot}/Readme.rst (100%) rename flytectl/boilerplate/flyte/{ => welcome_bot}/config.yml (100%) rename flytectl/boilerplate/flyte/{ => welcome_bot}/update.sh (55%) delete mode 100644 flytectl/boilerplate/lyft/golang_support_tools/go.sum create mode 100644 flytectl/pull_request_template.md diff --git a/flytectl/.github/workflows/boilerplate-automation.yml b/flytectl/.github/workflows/boilerplate-automation.yml new file mode 100644 index 0000000000..c6c8a2a53b --- /dev/null +++ b/flytectl/.github/workflows/boilerplate-automation.yml @@ -0,0 +1,36 @@ +name: Update Boilerplate Automation +on: + workflow_dispatch: + +jobs: + update-boilerplate: + name: Update Boilerplate + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: "0" + - name: Update Boilerplate + run: | + make update_boilerplate + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.FLYTE_BOT_PAT }} + commit-message: Update Boilerplate + committer: Flyte-Bot + author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> + signoff: true + branch: flyte-bot-update-boilerplate + delete-branch: true + title: 'Update Boilerplate' + body: | + Update Boilerplate + - Auto-generated by [flyte-bot] + labels: | + boilerplate + team-reviewers: | + owners + maintainers + draft: false \ No newline at end of file diff --git a/flytectl/.golangci.yml b/flytectl/.golangci.yml index a414f33f79..5d53f35295 100644 --- a/flytectl/.golangci.yml +++ b/flytectl/.golangci.yml @@ -1,7 +1,7 @@ # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: # -# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst run: skip-dirs: diff --git a/flytectl/Makefile b/flytectl/Makefile index 118f40cf06..69ab4e6c49 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -1,5 +1,5 @@ export REPOSITORY=flytectl -include boilerplate/lyft/golang_test_targets/Makefile +include boilerplate/flyte/golang_test_targets/Makefile GIT_VERSION := $(shell git describe --always --tags) GIT_HASH := $(shell git rev-parse --short HEAD) @@ -25,6 +25,7 @@ compile_debug: .PHONY: update_boilerplate update_boilerplate: + @curl https://raw.githubusercontent.com/flyteorg/boilerplate/master/boilerplate/update.sh -o boilerplate/update.sh @boilerplate/update.sh .PHONY: install-piptools diff --git a/flytectl/boilerplate/lyft/golang_support_tools/go.mod b/flytectl/boilerplate/flyte/golang_support_tools/go.mod similarity index 61% rename from flytectl/boilerplate/lyft/golang_support_tools/go.mod rename to flytectl/boilerplate/flyte/golang_support_tools/go.mod index 6816461a59..7afee48e45 100644 --- a/flytectl/boilerplate/lyft/golang_support_tools/go.mod +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.mod @@ -1,11 +1,11 @@ -module github.com/lyft/boilerplate +module github.com/flyteorg/boilerplate -go 1.13 +go 1.16 require ( github.com/alvaroloes/enumer v1.1.2 - github.com/golangci/golangci-lint v1.22.2 - github.com/lyft/flytestdlib v0.2.31 + github.com/flyteorg/flytestdlib v0.3.22 + github.com/golangci/golangci-lint v1.38.0 github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5 ) diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.sum b/flytectl/boilerplate/flyte/golang_support_tools/go.sum new file mode 100644 index 0000000000..49939b689d --- /dev/null +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.sum @@ -0,0 +1,1267 @@ +4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a h1:wFEQiK85fRsEVF0CRrPAos5LoAryUsIX1kPW/WrIqFw= +4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0 h1:XgtDnVJRCPEUG21gjFiRPz4zI1Mjg16R+NYQjfmU4XY= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.12.0 h1:4y3gHptW1EHVtcPAVE0eBBlFuGqEejTTG3KdIE0lUX4= +cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v51.0.0+incompatible h1:p7blnyJSjJqf5jflHbSGhIhEpXIgIFmYZNg5uwqweso= +github.com/Azure/azure-sdk-for-go v51.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= +github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= +github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= +github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= +github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/ashanbrown/forbidigo v1.1.0 h1:SJOPJyqsrVL3CvR0veFZFmIM0fXS/Kvyikqvfphd0Z4= +github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= +github.com/ashanbrown/makezero v0.0.0-20201205152432-7b7cdbb3025a h1:/U9tbJzDRof4fOR51vwzWdIBsIH6R2yU0KG1MBRM2Js= +github.com/ashanbrown/makezero v0.0.0-20201205152432-7b7cdbb3025a/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= +github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A= +github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= +github.com/bombsimon/wsl/v3 v3.2.0 h1:x3QUbwW7tPGcCNridvqmhSRthZMTALnkg5/1J+vaUas= +github.com/bombsimon/wsl/v3 v3.2.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.6 h1:Tsy7EppNow2pDC0jN7Hsmcb6mHd71ZbI1vFissRBtc0= +github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= +github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/daixiang0/gci v0.2.8 h1:1mrIGMBQsBu0P7j7m1M8Lb+ZeZxsZL+jyGX4YoMJJpg= +github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denis-tingajkin/go-header v0.4.2 h1:jEeSF4sdv8/3cT/WY8AgDHUoItNSoEZ7qg9dX7pc218= +github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0 h1:qxIJwfSemSCqhG3/lEw1Rm+wYbegjuKsqy0ZqnIpL14= +github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0/go.mod h1:KfdIkmkpVY3n2sc1ykFj01uMviOiXH2HMhUCvA5FYGg= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= +github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= +github.com/esimonov/ifshort v1.0.1 h1:p7hlWD15c9XwvwxYg3W7f7UZHmwg7l9hC0hBiF95gd0= +github.com/esimonov/ifshort v1.0.1/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/flyteorg/flytestdlib v0.3.22 h1:nJEPaCdxzXBaeg2p4fdo3I3Ua09NedFRaUwuLafLEdw= +github.com/flyteorg/flytestdlib v0.3.22/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fzipp/gocyclo v0.3.1 h1:A9UeX3HJSXTBzvHzhqoYVuE0eAhe+aM8XBCCwsPMZOc= +github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-critic/go-critic v0.5.4 h1:fPNMqImVjELN6Du7NVVuvKA4cgASNmc7e4zSYQCOnv8= +github.com/go-critic/go-critic v0.5.4/go.mod h1:cjB4YGw+n/+X8gREApej7150Uyy1Tg8If6F2XOAUXNE= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= +github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.38.0 h1:hgZsLRzZrjhpp44Ak+fhXNzgrbDF39ETf22a+Jd3fJQ= +github.com/golangci/golangci-lint v1.38.0/go.mod h1:Knp/sd5ATrVp7EOzWzwIIFH+c8hUfpW+oOQb8NvdZDo= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.3.5 h1:pLzmVdl3VxTOncgzHcvLOKirdvcx/TydsClUQXTehjo= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5 h1:c9Mqqrm/Clj5biNaG7rABrmwUq88nHh0uABo2b/WYmc= +github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gookit/color v1.3.6/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 h1:Nb2aRlC404yz7gQIfRZxX9/MLvQiqXyiBTJtgAy6yrI= +github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= +github.com/gostaticanalysis/analysisutil v0.4.1 h1:/7clKqrVfiVwiBQLM0Uke4KvXnO6JcCTS7HwF2D6wG8= +github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= +github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= +github.com/gostaticanalysis/comment v1.4.1 h1:xHopR5L2lRz6OsjH4R2HG5wRhW9ySl3FsHIvi5pcXwc= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 h1:rx8127mFPqXXsfPSo8BwnIU97MKFZc89WHAHt8PwDVY= +github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/graymeta/stow v0.2.7 h1:b31cB1Ylw/388sYSZxnmpjT2QxC21AaQ8fRnUtE13b4= +github.com/graymeta/stow v0.2.7/go.mod h1:JAs139Zr29qfsecy7b+h9DRsWXbFbsd7LCrbCDYI84k= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jgautheron/goconst v1.4.0 h1:hp9XKUpe/MPyDamUbfsrGpe+3dnY2whNK4EtB86dvLM= +github.com/jgautheron/goconst v1.4.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jingyugao/rowserrcheck v0.0.0-20210130005344-c6a0c12dd98d h1:BYDZtm80MLJpTWalkwHxNnIbO/2akQHERcfLq4TbIWE= +github.com/jingyugao/rowserrcheck v0.0.0-20210130005344-c6a0c12dd98d/go.mod h1:/EZlaYCnEX24i7qdVhT9du5JrtFWYRQr67bVgR7JJC8= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/julz/importas v0.0.0-20210226073942-60b4fa260dd0 h1:exZBMUS/kB/AhxSj/9lIIxhqkCpXXdKScjFWQUTbi3M= +github.com/julz/importas v0.0.0-20210226073942-60b4fa260dd0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.6.0 h1:YTDO4pNy7AUN/021p+JGHycQyYNIyMoenM1YDVK6RlY= +github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.4.0 h1:2Nx7XbdbE/BYZeoip2mURKUdtHQRuy6Ug+wR7K9ywNM= +github.com/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= +github.com/kunwardeep/paralleltest v1.0.2 h1:/jJRv0TiqPoEy/Y8dQxCFJhD56uS/pnvtatgTZBHokU= +github.com/kunwardeep/paralleltest v1.0.2/go.mod h1:ZPqNm1fVHPllh5LPVujzbVz1JN2GhLxSfY+oqUsvG30= +github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= +github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= +github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 h1:pWxk9e//NbPwfxat7RXkts09K+dEBJWakUWwICVqYbA= +github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= +github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 h1:QASJXOGm2RZ5Ardbc86qNFvby9AqkLDibfChMtAg5QM= +github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.0.3 h1:z3FL6IFFN3JKzHYHD8O1ExH9g/4lAGJ5x1+9rPZgsFg= +github.com/mgechev/revive v1.0.3/go.mod h1:POGGZagSo/0frdr7VeAifzS5Uka0d0GPiM35MsTO8nE= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EHf4= +github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= +github.com/mozilla/tls-observatory v0.0.0-20201209171846-0547674fceff/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20201221231540-e56b841a3c88 h1:o+O3Cd1HO9CTgxE3/C8p5I5Y4C0yYWbF8d4IkfOLtcQ= +github.com/nbutton23/zxcvbn-go v0.0.0-20201221231540-e56b841a3c88/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= +github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= +github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/exhaustive v0.1.0 h1:kVlMw8h2LHPMGUVqUj6230oQjjTMFjwcZrnkhXzFfl8= +github.com/nishanths/exhaustive v0.1.0/go.mod h1:S1j9110vxV1ECdCudXRkeMnFQ/DQk9ajLT0Uf2MYZQQ= +github.com/nishanths/predeclared v0.2.1 h1:1TXtjmy4f3YCFjTxRd8zcFHOmoUir+gp0ESzjFzG2sw= +github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.4 h1:NiTx7EEvBzu9sFOD1zORteLSt3o8gnlvZZwSE9TnY9U= +github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= +github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f h1:xAw10KgJqG5NJDfmRqJ05Z0IFblKumjtMeyiOLxj3+4= +github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU= +github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0 h1:Uehi/mxLK0eiUc0H0++5tpMGTexB8wZ598MIgU8VpDM= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.3.0 h1:A3OfpsK2ynOTbz/KMi62qWzignjGCOZVChATSf4P+A0= +github.com/quasilyte/go-ruleguard v0.3.0/go.mod h1:p2miAhLp6fERzFNbcuQ4bevXs8rgK//uCHsUDkumITg= +github.com/quasilyte/go-ruleguard/dsl v0.0.0-20210106184943-e47d54850b18/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.0.0-20210115110123-c73ee1cbff1f/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.2.0 h1:YWfhGOrXwLGiqcC/u5EqG6YeS8nh+1fw0HEc85CVZro= +github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6W5lnUepvuMMgQ= +github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sanposhiho/wastedassign v0.1.3 h1:qIMpTh4NGZYRbFJ+DSpLoVn8F4SLciX2afRvXPefC7w= +github.com/sanposhiho/wastedassign v0.1.3/go.mod h1:LGpq5Hsv74QaqM47WtIsRSF/ik9kqk07kchgv66tLVE= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/securego/gosec/v2 v2.6.1 h1:+KCw+uz16FYfFyJ/A5aU6uP7mnrL+j1TbDnk1yN+8R0= +github.com/securego/gosec/v2 v2.6.1/go.mod h1:I76p3NTHBXsGhybUW+cEQ692q2Vp+A0Z6ZLzDIZy+Ao= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shirou/gopsutil/v3 v3.21.1/go.mod h1:igHnfak0qnw1biGeI2qKQvu0ZkwvEkUcCLlYhZzdr/4= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU= +github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= +github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/go-diff v0.6.1 h1:hmA1LzxW0n1c3Q4YbrFgg4P99GSnebYa3x8gr0HZqLQ= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= +github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/ssgreg/nlreturn/v2 v2.1.0 h1:6/s4Rc49L6Uo6RLjhWZGBpWWjfzk2yrf1nIW8m4wgVA= +github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b h1:HxLVTlqcHhFAz3nWUcuvpH7WuOMv8LQoCWmruLfFH2U= +github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tetafro/godot v1.4.4 h1:VAtLEoAMmopIzHVWVBrztjVWDeYm1OD/DKqhqXR4828= +github.com/tetafro/godot v1.4.4/go.mod h1:FVDd4JuKliW3UgjswZfJfHq4vAx0bD/Jd5brJjGeaz4= +github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94 h1:ig99OeTyDwQWhPe2iw9lwfQVF1KB3Q4fpP3X7/2VBG8= +github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomarrell/wrapcheck v0.0.0-20201130113247-1683564d9756 h1:zV5mu0ESwb+WnzqVaW2z1DdbAP0S46UtjY8DHQupQP4= +github.com/tomarrell/wrapcheck v0.0.0-20201130113247-1683564d9756/go.mod h1:yiFB6fFoV7saXirUGfuK+cPtUh4NX/Hf5y2WC2lehu0= +github.com/tommy-muehle/go-mnd/v2 v2.3.1 h1:a1S4+4HSXDJMgeODJH/t0EEKxcVla6Tasw+Zx9JJMog= +github.com/tommy-muehle/go-mnd/v2 v2.3.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= +github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= +github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.22.6 h1:BdkrbWrzDlV9dnbzoP7sfN+dHheJ4J9JOaYxcUDL+ok= +go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 h1:55H5j7lotzuFCEOKDsMch+fRNUQ9DgtyHOUP31FNqKc= +golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201024232916-9f70ab9862d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181112210238-4b1f3b6b1646/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210102185154-773b96fafca2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.38.0 h1:vDyWk6eup8eQAidaZ31sNWIn8tZEL8qpbtGkBD4ytQo= +google.golang.org/api v0.38.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200831141814-d751682dd103/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 h1:uLBY0yHDCj2PMQ98KWDSIDFwn9zK2zh+tgWtbvPPBjI= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.2 h1:SMdYLJl312RXuxXziCCHhRsp/tvct9cGKey0yv95tZM= +honnef.co/go/tools v0.1.2/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= +k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= +k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= +k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 h1:d+LBRNY3c/KGp7lDblRlUJkayx4Vla7WUTIazoGMdYo= +k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= +k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +mvdan.cc/gofumpt v0.1.0 h1:hsVv+Y9UsZ/mFZTxJZuHVI6shSQCtzZ11h1JEFPAZLw= +mvdan.cc/gofumpt v0.1.0/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7 h1:HT3e4Krq+IE44tiN36RvVEb6tvqeIdtsVSsxmNPqlFU= +mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/flytectl/boilerplate/lyft/golang_support_tools/tools.go b/flytectl/boilerplate/flyte/golang_support_tools/tools.go similarity index 100% rename from flytectl/boilerplate/lyft/golang_support_tools/tools.go rename to flytectl/boilerplate/flyte/golang_support_tools/tools.go index a256d868f1..71163a57d9 100644 --- a/flytectl/boilerplate/lyft/golang_support_tools/tools.go +++ b/flytectl/boilerplate/flyte/golang_support_tools/tools.go @@ -4,7 +4,7 @@ package tools import ( _ "github.com/alvaroloes/enumer" - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/flyteorg/flytestdlib/cli/pflags" + _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/vektra/mockery/cmd/mockery" ) diff --git a/flytectl/boilerplate/lyft/golang_test_targets/Makefile b/flytectl/boilerplate/flyte/golang_test_targets/Makefile similarity index 82% rename from flytectl/boilerplate/lyft/golang_test_targets/Makefile rename to flytectl/boilerplate/flyte/golang_test_targets/Makefile index 5abd2ed607..21d8b5b776 100644 --- a/flytectl/boilerplate/lyft/golang_test_targets/Makefile +++ b/flytectl/boilerplate/flyte/golang_test_targets/Makefile @@ -1,12 +1,12 @@ # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: # -# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst .PHONY: download_tooling download_tooling: #download dependencies (including test deps) for the package - @boilerplate/lyft/golang_test_targets/download_tooling.sh + @boilerplate/flyte/golang_test_targets/download_tooling.sh .PHONY: lint lint: download_tooling #lints the package for common code smells @@ -16,7 +16,7 @@ lint: download_tooling #lints the package for common code smells # skips 'vendor' .PHONY: goimports goimports: - @boilerplate/lyft/golang_test_targets/goimports + @boilerplate/flyte/golang_test_targets/goimports .PHONY: mod_download mod_download: #download dependencies (including test deps) for the package diff --git a/flytectl/boilerplate/lyft/golang_test_targets/Readme.rst b/flytectl/boilerplate/flyte/golang_test_targets/Readme.rst similarity index 75% rename from flytectl/boilerplate/lyft/golang_test_targets/Readme.rst rename to flytectl/boilerplate/flyte/golang_test_targets/Readme.rst index 3466e30c55..f9d890fdd7 100644 --- a/flytectl/boilerplate/lyft/golang_test_targets/Readme.rst +++ b/flytectl/boilerplate/flyte/golang_test_targets/Readme.rst @@ -15,17 +15,17 @@ Provides a ``test_benchmark`` target for benchmark tests. **To Enable:** -Add ``lyft/golang_test_targets`` to your ``boilerplate/update.cfg`` file. +Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. Make sure you're using ``go mod`` for dependency management. Provide a ``.golangci`` configuration (the lint target requires it). -Add ``include boilerplate/lyft/golang_test_targets/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable +Add ``include boilerplate/flyte/golang_test_targets/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable :: REPOSITORY= - include boilerplate/lyft/golang_test_targets/Makefile + include boilerplate/flyte/golang_test_targets/Makefile (this ensures the extra make targets get included in your main Makefile) diff --git a/flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh similarity index 92% rename from flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh rename to flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh index bc51af5646..25d4ac3dc1 100755 --- a/flytectl/boilerplate/lyft/golang_test_targets/download_tooling.sh +++ b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh @@ -7,7 +7,7 @@ # pins. To facilitate this, we're maintaining two sets of go.mod/sum files - the second one only for tooling. This is # the same approach that go 1.14 will take as well. # See: -# https://github.com/lyft/flyte/issues/129 +# https://github.com/flyteorg/flyte/issues/129 # https://github.com/golang/go/issues/30515 for some background context # https://github.com/go-modules-by-example/index/blob/5ec250b4b78114a55001bd7c9cb88f6e07270ea5/010_tools/README.md @@ -24,7 +24,7 @@ tools=( tmp_dir=$(mktemp -d -t gotooling-XXX) echo "Using temp directory ${tmp_dir}" -cp -R boilerplate/lyft/golang_support_tools/* $tmp_dir +cp -R boilerplate/flyte/golang_support_tools/* $tmp_dir pushd "$tmp_dir" for tool in "${tools[@]}" diff --git a/flytectl/boilerplate/lyft/golang_test_targets/goimports b/flytectl/boilerplate/flyte/golang_test_targets/goimports similarity index 56% rename from flytectl/boilerplate/lyft/golang_test_targets/goimports rename to flytectl/boilerplate/flyte/golang_test_targets/goimports index 160525a8cc..ba0d6d8718 100755 --- a/flytectl/boilerplate/lyft/golang_test_targets/goimports +++ b/flytectl/boilerplate/flyte/golang_test_targets/goimports @@ -1,8 +1,8 @@ #!/usr/bin/env bash # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: # -# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*") diff --git a/flytectl/boilerplate/lyft/golangci_file/.golangci.yml b/flytectl/boilerplate/flyte/golangci_file/.golangci.yml similarity index 72% rename from flytectl/boilerplate/lyft/golangci_file/.golangci.yml rename to flytectl/boilerplate/flyte/golangci_file/.golangci.yml index a414f33f79..5d53f35295 100644 --- a/flytectl/boilerplate/lyft/golangci_file/.golangci.yml +++ b/flytectl/boilerplate/flyte/golangci_file/.golangci.yml @@ -1,7 +1,7 @@ # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: # -# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst run: skip-dirs: diff --git a/flytectl/boilerplate/lyft/golangci_file/Readme.rst b/flytectl/boilerplate/flyte/golangci_file/Readme.rst similarity index 60% rename from flytectl/boilerplate/lyft/golangci_file/Readme.rst rename to flytectl/boilerplate/flyte/golangci_file/Readme.rst index ba5d2b61ce..e4cbd18b96 100644 --- a/flytectl/boilerplate/lyft/golangci_file/Readme.rst +++ b/flytectl/boilerplate/flyte/golangci_file/Readme.rst @@ -5,4 +5,4 @@ Provides a ``.golangci`` file with the linters we've agreed upon. **To Enable:** -Add ``lyft/golangci_file`` to your ``boilerplate/update.cfg`` file. +Add ``flyteorg/golangci_file`` to your ``boilerplate/update.cfg`` file. diff --git a/flytectl/boilerplate/lyft/golangci_file/update.sh b/flytectl/boilerplate/flyte/golangci_file/update.sh similarity index 67% rename from flytectl/boilerplate/lyft/golangci_file/update.sh rename to flytectl/boilerplate/flyte/golangci_file/update.sh index 9e9e6c1f46..ab2f85c680 100755 --- a/flytectl/boilerplate/lyft/golangci_file/update.sh +++ b/flytectl/boilerplate/flyte/golangci_file/update.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: # -# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst set -e diff --git a/flytectl/boilerplate/lyft/pull_request_template/Readme.rst b/flytectl/boilerplate/flyte/pull_request_template/Readme.rst similarity index 55% rename from flytectl/boilerplate/lyft/pull_request_template/Readme.rst rename to flytectl/boilerplate/flyte/pull_request_template/Readme.rst index b85a4ea121..ee54437252 100644 --- a/flytectl/boilerplate/lyft/pull_request_template/Readme.rst +++ b/flytectl/boilerplate/flyte/pull_request_template/Readme.rst @@ -5,4 +5,4 @@ Provides a Pull Request template. **To Enable:** -Add ``lyft/golang_test_targets`` to your ``boilerplate/update.cfg`` file. +Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. diff --git a/flytectl/boilerplate/lyft/pull_request_template/pull_request_template.md b/flytectl/boilerplate/flyte/pull_request_template/pull_request_template.md similarity index 54% rename from flytectl/boilerplate/lyft/pull_request_template/pull_request_template.md rename to flytectl/boilerplate/flyte/pull_request_template/pull_request_template.md index d2becf38b7..d7699558be 100644 --- a/flytectl/boilerplate/lyft/pull_request_template/pull_request_template.md +++ b/flytectl/boilerplate/flyte/pull_request_template/pull_request_template.md @@ -1,3 +1,9 @@ +## Read then delete + +- Make sure to use a concise title for the pull-request. +- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version +will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump) + # TL;DR _Please replace this text with a description of what this PR accomplishes._ @@ -18,9 +24,9 @@ _Please replace this text with a description of what this PR accomplishes._ _How did you fix the bug, make the feature etc. Link to any design docs etc_ ## Tracking Issue -https://github.com/lyft/flyte/issues/ +https://github.com/flyteorg/flyte/issues/ ## Follow-up issue _NA_ OR -_https://github.com/lyft/flyte/issues/_ +_https://github.com/flyteorg/flyte/issues/_ diff --git a/flytectl/boilerplate/lyft/pull_request_template/update.sh b/flytectl/boilerplate/flyte/pull_request_template/update.sh similarity index 61% rename from flytectl/boilerplate/lyft/pull_request_template/update.sh rename to flytectl/boilerplate/flyte/pull_request_template/update.sh index 13f0c3b57d..051e9dbce0 100755 --- a/flytectl/boilerplate/lyft/pull_request_template/update.sh +++ b/flytectl/boilerplate/flyte/pull_request_template/update.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: # -# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst set -e diff --git a/flytectl/boilerplate/flyte/Readme.rst b/flytectl/boilerplate/flyte/welcome_bot/Readme.rst similarity index 100% rename from flytectl/boilerplate/flyte/Readme.rst rename to flytectl/boilerplate/flyte/welcome_bot/Readme.rst diff --git a/flytectl/boilerplate/flyte/config.yml b/flytectl/boilerplate/flyte/welcome_bot/config.yml similarity index 100% rename from flytectl/boilerplate/flyte/config.yml rename to flytectl/boilerplate/flyte/welcome_bot/config.yml diff --git a/flytectl/boilerplate/flyte/update.sh b/flytectl/boilerplate/flyte/welcome_bot/update.sh similarity index 55% rename from flytectl/boilerplate/flyte/update.sh rename to flytectl/boilerplate/flyte/welcome_bot/update.sh index 506c3221b7..120dbd365c 100755 --- a/flytectl/boilerplate/flyte/update.sh +++ b/flytectl/boilerplate/flyte/welcome_bot/update.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: # -# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst set -e @@ -11,4 +11,4 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" # Clone the config.yml file echo " - copying ${DIR}/config.yml to the root directory." -cp ${DIR}/config.yml ${DIR}/../../.github/config.yml +cp "${DIR}"/config.yml "${DIR}"/../../../.github/config.yml diff --git a/flytectl/boilerplate/lyft/golang_support_tools/go.sum b/flytectl/boilerplate/lyft/golang_support_tools/go.sum deleted file mode 100644 index 81e0469630..0000000000 --- a/flytectl/boilerplate/lyft/golang_support_tools/go.sum +++ /dev/null @@ -1,558 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.47.0 h1:1JUtpcY9E7+eTospEwWS2QXP3DEn7poB3E2j0jN74mM= -cloud.google.com/go v0.47.0/go.mod h1:5p3Ky/7f3N10VBkhuR5LFtddroTiMyjZV/Kj5qOQFxU= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v10.2.1-beta+incompatible h1:/x4W7ZQV4PHJYnLUgKubojM8T+zlFEDdaBazAnA/QCY= -github.com/Azure/azure-sdk-for-go v10.2.1-beta+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-autorest/autorest v0.9.2 h1:6AWuh3uWrsZJcNoCHrCF/+g4aKPCU39kaMO6/qrnK/4= -github.com/Azure/go-autorest/autorest v0.9.2/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0 h1:q2gDruN08/guU9vAjuPWff0+QIrpH6ediguzdAzXAUU= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/date v0.1.0 h1:YGrhWfrgtFs84+h0o46rJrlmsZtyZRg470CqAXTZaGM= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0 h1:Ww5g4zThfD/6cLb4z6xxgeyDa7QDkizMkJKe0ysZXp0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= -github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aws/aws-sdk-go v1.25.16 h1:k7Fy6T/uNuLX6zuayU/TJoP7yMgGcJSkZpF7QVjwYpA= -github.com/aws/aws-sdk-go v1.25.16/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bombsimon/wsl/v2 v2.0.0 h1:+Vjcn+/T5lSrO8Bjzhk4v14Un/2UyCA1E3V5j9nwTkQ= -github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coocood/freecache v1.1.0 h1:ENiHOsWdj1BrrlPwblhbn4GdAsMymK3pZORJ+bJGAjA= -github.com/coocood/freecache v1.1.0/go.mod h1:ePwxCDzOYvARfHdr1pByNct1at3CoKnsipOHwKlNbzI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0 h1:qxIJwfSemSCqhG3/lEw1Rm+wYbegjuKsqy0ZqnIpL14= -github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0/go.mod h1:KfdIkmkpVY3n2sc1ykFj01uMviOiXH2HMhUCvA5FYGg= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/structtag v1.1.0 h1:6j4mUV/ES2duvnAzKMFkN6/A5mCaNYPD3xfbAkLLOF8= -github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783 h1:SmsgwFZy9pdTk/k8BZz40D3P5umP5+Ejt3hAi0paBNQ= -github.com/fsnotify/fsnotify v1.4.8-0.20191012010759-4bf2d1fec783/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-critic/go-critic v0.4.0 h1:sXD3pix0wDemuPuSlrXpJNNYXlUiKiysLrtPVQmxkzI= -github.com/go-critic/go-critic v0.4.0/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0= -github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= -github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= -github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= -github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2XQaA= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b h1:ekuhfTjngPhisSjOJ0QWKpPQE8/rbknHaes6WVJj5Hw= -github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191002201903-404acd9df4cc h1:55rEp52jU6bkyslZ1+C/7NGfpQsEc6pxGLAGDOctqbw= -github.com/golang/groupcache v0.0.0-20191002201903-404acd9df4cc/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= -github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= -github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= -github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee h1:J2XAy40+7yz70uaOiMbNnluTg7gyQhtGqLQncQh+4J8= -github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.22.2 h1:iaihss3Tf6NvZVjun3lHimKSgofPV1+FqE/cbehoiRQ= -github.com/golangci/golangci-lint v1.22.2/go.mod h1:2Bj42k6hPQFTRxkDb7S3TQ+EsnumZXOmIYNqlQrp0FI= -github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= -github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= -github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= -github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= -github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= -github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3 h1:JVnpOZS+qxli+rgVl98ILOXVNbW+kb5wcxeGx8ShUIw= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/graymeta/stow v0.0.0-20190522170649-903027f87de7 h1:oIYi27Ruo2k5dxukdOisCSZrowkg70jxxuaPZck9+ic= -github.com/graymeta/stow v0.0.0-20190522170649-903027f87de7/go.mod h1:B24dekNjtWVeREK+dyMHtI22d85VzCT+sX5bVWDtjoA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lyft/flytestdlib v0.2.31 h1:JAOSGwy/wLprhq1KR9zxekBqnKdSlAQQG1x4KQe+hlI= -github.com/lyft/flytestdlib v0.2.31/go.mod h1:/fqNXKCGChEvMzcRapVq6vDM69Vlusl+bCj7foToaUQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE= -github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= -github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= -github.com/ncw/swift v1.0.49-0.20190728102658-a24ef33bc9b7 h1:2FttUGr9cza0JNOUDHeVWo4wVGk92m8bralgdbAeYJY= -github.com/ncw/swift v1.0.49-0.20190728102658-a24ef33bc9b7/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.5.0 h1:5BakdOZdtKJ1FFk6QdL8iSGrMWsXgchNJcrnarjbmJQ= -github.com/pelletier/go-toml v1.5.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/satori/uuid v1.2.0 h1:6TFY4nxn5XwBx0gDfzbEMCNT6k4N/4FNIuN8RACZ0KI= -github.com/satori/uuid v1.2.0/go.mod h1:B8HLsPLik/YNn6KKWVMDJ8nzCL8RP5WyfsnmvnAEwIU= -github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d h1:BzRvVq1EHuIjxpijCEKpAxzKUUMurOQ4sknehIATRh8= -github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d/go.mod h1:w5+eXa0mYznDkHaMCXA4XYffjlH+cy1oyKbfzJXa2Do= -github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs= -github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.6.1 h1:VPZzIkznI1YhVMRi6vNFLHSwhnhReBfgTxIPccpfdZk= -github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q= -github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tommy-muehle/go-mnd v1.1.1 h1:4D0wuPKjOTiK2garzuPGGvm4zZ/wLYDOH8TJSABC7KU= -github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ultraware/funlen v0.0.2 h1:Av96YVBwwNSe4MLR7iI/BIa3VyI7/djnto/pK3Uxbdo= -github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= -github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= -github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.1 h1:8dP3SGL7MPB94crU3bEPplMPe83FI4EouesJUeFHv50= -go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191021144547-ec77196f6094 h1:5O4U9trLjNpuhpynaDsqwCk+Tw6seqJz1EbqbnzHrc8= -golang.org/x/net v0.0.0-20191021144547-ec77196f6094/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191020212454-3e7259c5e7c2 h1:nq114VpM8lsSlP+lyUbANecYHYiFcSNFtqcBlxRV+gA= -golang.org/x/sys v0.0.0-20191020212454-3e7259c5e7c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 h1:xQwXv67TxFo9nC1GJFyab5eq/5B590r6RlnL/G8Sz7w= -golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181112210238-4b1f3b6b1646/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010171213-8abd42400456/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191204011308-9611592c72f6 h1:BP62y4oUl8+/CvHuvVqHIPmVRixgDl6y6a+tR7pXXIA= -golang.org/x/tools v0.0.0-20191204011308-9611592c72f6/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.11.1-0.20191020000718-bf72a15fd9e9 h1:DcDldKT1PaijNBNDNPaGtfl+LvUHR1xsw5DpipSI1CE= -google.golang.org/api v0.11.1-0.20191020000718-bf72a15fd9e9/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= -google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93 h1:tT6oQBi0qwLbbZSfDkdIsb23EwaLY85hoAV4SpXfdao= -k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/client-go v0.0.0-20181213151034-8d9ed539ba31 h1:OH3z6khCtxnJBAc0C5CMYWLl1CoK5R5fngX7wrwdN5c= -k8s.io/client-go v0.0.0-20181213151034-8d9ed539ba31/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4= -mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/flytectl/boilerplate/update.cfg b/flytectl/boilerplate/update.cfg index 468bf2cb80..2f61a97b0e 100644 --- a/flytectl/boilerplate/update.cfg +++ b/flytectl/boilerplate/update.cfg @@ -1,6 +1,6 @@ -lyft/golang_test_targets -lyft/golangci_file -lyft/golang_support_tools -lyft/pull_request_template -flyte/ +flyte/golang_test_targets +flyte/golangci_file +flyte/golang_support_tools +flyte/pull_request_template +flyte/welcome_bot diff --git a/flytectl/boilerplate/update.sh b/flytectl/boilerplate/update.sh index 374e4b930e..9173b662de 100755 --- a/flytectl/boilerplate/update.sh +++ b/flytectl/boilerplate/update.sh @@ -1,23 +1,21 @@ #!/usr/bin/env bash # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: # -# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst set -e DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" OUT="$(mktemp -d)" -trap "rm -fr $OUT" EXIT +trap 'rm -fr $OUT' EXIT -git clone git@github.com:flyteorg/boilerplate.git "${OUT}" +git clone https://github.com/flyteorg/boilerplate.git "${OUT}" echo "Updating the update.sh script." cp "${OUT}/boilerplate/update.sh" "${DIR}/update.sh" -echo "" - CONFIG_FILE="${DIR}/update.cfg" README="https://github.com/flyteorg/boilerplate/blob/master/Readme.rst" @@ -30,12 +28,12 @@ if [ ! -f "$CONFIG_FILE" ]; then fi if [ -z "$REPOSITORY" ]; then - echo '$REPOSITORY is required to run this script' + echo "$REPOSITORY is required to run this script" echo "See $README for more details." exit 1 fi -while read directory junk; do +while read -r directory junk; do # Skip comment lines (which can have leading whitespace) if [[ "$directory" == '#'* ]]; then continue @@ -63,8 +61,8 @@ while read directory junk; do echo "$directory is configured in update.cfg." echo "-----------------------------------------------------------------------------------" echo "syncing files from source." - rm -rf "${DIR}/${directory}" - mkdir -p $(dirname "${DIR}/${directory}") + rm -rf "${DIR:?}/${directory}" + mkdir -p "$(dirname "${DIR}"/"${directory}")" cp -r "$dir_path" "${DIR}/${directory}" if [ -f "${DIR}/${directory}/update.sh" ]; then echo "executing ${DIR}/${directory}/update.sh" diff --git a/flytectl/pull_request_template.md b/flytectl/pull_request_template.md new file mode 100644 index 0000000000..d7699558be --- /dev/null +++ b/flytectl/pull_request_template.md @@ -0,0 +1,32 @@ +## Read then delete + +- Make sure to use a concise title for the pull-request. +- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version +will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump) + +# TL;DR +_Please replace this text with a description of what this PR accomplishes._ + +## Type + - [ ] Bug Fix + - [ ] Feature + - [ ] Plugin + +## Are all requirements met? + + - [ ] Code completed + - [ ] Smoke tested + - [ ] Unit tests added + - [ ] Code documentation added + - [ ] Any pending items have an associated Issue + +## Complete description + _How did you fix the bug, make the feature etc. Link to any design docs etc_ + +## Tracking Issue +https://github.com/flyteorg/flyte/issues/ + +## Follow-up issue +_NA_ +OR +_https://github.com/flyteorg/flyte/issues/_ From 4bb967592ebf1f67cedf6a4f1f357202e4b17aa7 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Wed, 2 Jun 2021 11:55:29 +0530 Subject: [PATCH 056/645] Added transparent Get call when fetching latest version of workflow objects (#73) Signed-off-by: Prafulla Mahindrakar --- flytectl/pkg/ext/workflow_fetcher.go | 3 +-- flytectl/pkg/ext/workflow_fetcher_test.go | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/flytectl/pkg/ext/workflow_fetcher.go b/flytectl/pkg/ext/workflow_fetcher.go index 3abcb04fab..86fe88abda 100644 --- a/flytectl/pkg/ext/workflow_fetcher.go +++ b/flytectl/pkg/ext/workflow_fetcher.go @@ -38,8 +38,7 @@ func (a *AdminFetcherExtClient) FetchWorkflowLatestVersion(ctx context.Context, if err != nil { return nil, err } - w := wVersions[0] - return w, nil + return a.FetchWorkflowVersion(ctx, name, wVersions[0].Id.Version, project, domain) } // FetchWorkflowVersion fetches particular version of workflow diff --git a/flytectl/pkg/ext/workflow_fetcher_test.go b/flytectl/pkg/ext/workflow_fetcher_test.go index 91c6818c72..c18d04842a 100644 --- a/flytectl/pkg/ext/workflow_fetcher_test.go +++ b/flytectl/pkg/ext/workflow_fetcher_test.go @@ -16,6 +16,7 @@ import ( var ( workflowListResponse *admin.WorkflowList + workflowResponse *admin.Workflow ) func getWorkflowFetcherSetup() { @@ -80,6 +81,7 @@ func getWorkflowFetcherSetup() { workflowListResponse = &admin.WorkflowList{ Workflows: workflows, } + workflowResponse = workflows[0] } func TestFetchAllVerOfWorkflow(t *testing.T) { @@ -106,6 +108,7 @@ func TestFetchAllVerOfWorkflowEmptyResponse(t *testing.T) { func TestFetchWorkflowLatestVersion(t *testing.T) { getWorkflowFetcherSetup() + adminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(workflowResponse, nil) adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) _, err := adminFetcherExt.FetchWorkflowLatestVersion(ctx, "workflowName", "project", "domain") assert.Nil(t, err) @@ -115,6 +118,7 @@ func TestFetchWorkflowLatestVersionError(t *testing.T) { workflowListResponse := &admin.WorkflowList{} getWorkflowFetcherSetup() adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) + adminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(workflowResponse, nil) _, err := adminFetcherExt.FetchWorkflowLatestVersion(ctx, "workflowName", "project", "domain") assert.Equal(t, fmt.Errorf("no workflow retrieved for workflowName"), err) } From 712fdf8b9d6fa34bd17303ee3924208586217b11 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Thu, 3 Jun 2021 01:01:01 +0530 Subject: [PATCH 057/645] Added customizable fields during registration (#80) Signed-off-by: Prafulla Mahindrakar --- .../subcommand/register/files_config.go | 20 +++++ .../subcommand/register/filesconfig_flags.go | 23 ++++++ .../register/filesconfig_flags_test.go | 64 +++++++++------ flytectl/cmd/create/execution_util.go | 11 ++- flytectl/cmd/register/files.go | 36 +++++---- flytectl/cmd/register/files_test.go | 32 ++++++++ flytectl/cmd/register/filesconfig_flags.go | 48 ------------ flytectl/cmd/register/register.go | 6 +- flytectl/cmd/register/register_test.go | 16 ++++ flytectl/cmd/register/register_util.go | 29 +++++-- flytectl/cmd/register/register_util_test.go | 77 +++++++++++++------ flytectl/docs/source/gen/flytectl.rst | 2 + flytectl/docs/source/gen/flytectl_config.rst | 2 + .../source/gen/flytectl_config_discover.rst | 2 + .../source/gen/flytectl_config_validate.rst | 2 + flytectl/docs/source/gen/flytectl_create.rst | 2 + .../source/gen/flytectl_create_execution.rst | 2 + .../source/gen/flytectl_create_project.rst | 2 + flytectl/docs/source/gen/flytectl_delete.rst | 2 + ...ectl_delete_cluster-resource-attribute.rst | 2 + ...lytectl_delete_execution-cluster-label.rst | 2 + ...tectl_delete_execution-queue-attribute.rst | 2 + .../source/gen/flytectl_delete_execution.rst | 2 + .../gen/flytectl_delete_plugin-override.rst | 2 + ...lytectl_delete_task-resource-attribute.rst | 2 + flytectl/docs/source/gen/flytectl_get.rst | 2 + ...lytectl_get_cluster-resource-attribute.rst | 2 + .../flytectl_get_execution-cluster-label.rst | 2 + ...flytectl_get_execution-queue-attribute.rst | 2 + .../source/gen/flytectl_get_execution.rst | 2 + .../source/gen/flytectl_get_launchplan.rst | 2 + .../gen/flytectl_get_plugin-override.rst | 2 + .../docs/source/gen/flytectl_get_project.rst | 2 + .../flytectl_get_task-resource-attribute.rst | 2 + .../docs/source/gen/flytectl_get_task.rst | 2 + .../docs/source/gen/flytectl_get_workflow.rst | 2 + .../docs/source/gen/flytectl_register.rst | 2 + .../source/gen/flytectl_register_files.rst | 31 +++++++- flytectl/docs/source/gen/flytectl_update.rst | 2 + ...ectl_update_cluster-resource-attribute.rst | 2 + ...lytectl_update_execution-cluster-label.rst | 2 + ...tectl_update_execution-queue-attribute.rst | 2 + .../source/gen/flytectl_update_launchplan.rst | 2 + .../gen/flytectl_update_plugin-override.rst | 2 + .../source/gen/flytectl_update_project.rst | 2 + ...lytectl_update_task-resource-attribute.rst | 2 + .../docs/source/gen/flytectl_update_task.rst | 2 + .../source/gen/flytectl_update_workflow.rst | 2 + flytectl/docs/source/gen/flytectl_version.rst | 2 + flytectl/go.mod | 2 +- flytectl/go.sum | 14 ++-- 51 files changed, 347 insertions(+), 136 deletions(-) create mode 100644 flytectl/cmd/config/subcommand/register/files_config.go create mode 100755 flytectl/cmd/config/subcommand/register/filesconfig_flags.go rename flytectl/cmd/{ => config/subcommand}/register/filesconfig_flags_test.go (78%) create mode 100644 flytectl/cmd/register/files_test.go delete mode 100755 flytectl/cmd/register/filesconfig_flags.go diff --git a/flytectl/cmd/config/subcommand/register/files_config.go b/flytectl/cmd/config/subcommand/register/files_config.go new file mode 100644 index 0000000000..a384ec83d5 --- /dev/null +++ b/flytectl/cmd/config/subcommand/register/files_config.go @@ -0,0 +1,20 @@ +package register + +//go:generate pflags FilesConfig --default-var DefaultFilesConfig --bind-default-var + +var ( + DefaultFilesConfig = &FilesConfig{ + Version: "v1", + ContinueOnError: false, + } +) + +// FilesConfig containing flags used for registration +type FilesConfig struct { + Version string `json:"version" pflag:",version of the entity to be registered with flyte."` + ContinueOnError bool `json:"continueOnError" pflag:",continue on error when registering files."` + Archive bool `json:"archive" pflag:",pass in archive file either an http link or local path."` + AssumableIamRole string `json:"assumableIamRole" pflag:", custom assumable iam auth role to register launch plans with."` + K8ServiceAccount string `json:"k8ServiceAccount" pflag:", custom kubernetes service account auth role to register launch plans with."` + OutputLocationPrefix string `json:"outputLocationPrefix" pflag:", custom output location prefix for offloaded types (files/schemas)."` +} diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go new file mode 100755 index 0000000000..dce52b6c8b --- /dev/null +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go @@ -0,0 +1,23 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package register + +import ( + "fmt" + + "github.com/spf13/pflag" +) + +// GetPFlagSet will return strongly types pflags for all fields in FilesConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("FilesConfig", pflag.ExitOnError) + cmdFlags.StringVarP(&DefaultFilesConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), "v", DefaultFilesConfig.Version, "version of the entity to be registered with flyte.") + cmdFlags.BoolVarP(&DefaultFilesConfig.ContinueOnError, fmt.Sprintf("%v%v", prefix, "continueOnError"), "c", DefaultFilesConfig.ContinueOnError, "continue on error when registering files.") + cmdFlags.BoolVarP(&DefaultFilesConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), "a", DefaultFilesConfig.Archive, "pass in archive file either an http link or local path.") + cmdFlags.StringVarP(&DefaultFilesConfig.AssumableIamRole, fmt.Sprintf("%v%v", prefix, "assumableIamRole"), "i", DefaultFilesConfig.AssumableIamRole, " Custom assumable iam auth role to register launch plans with.") + cmdFlags.StringVarP(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), "k", DefaultFilesConfig.K8ServiceAccount, " custom kubernetes service account auth role to register launch plans with.") + cmdFlags.StringVarP(&DefaultFilesConfig.OutputLocationPrefix, fmt.Sprintf("%v%v", prefix, "outputLocationPrefix"), "l", DefaultFilesConfig.OutputLocationPrefix, " custom output location prefix for offloaded types (files/schemas).") + return cmdFlags +} diff --git a/flytectl/cmd/register/filesconfig_flags_test.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go similarity index 78% rename from flytectl/cmd/register/filesconfig_flags_test.go rename to flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go index 2a78db2a9a..56a85f9234 100755 --- a/flytectl/cmd/register/filesconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_FilesConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_FilesConfig(val, result)) } -func testDecodeSlice_FilesConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_FilesConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_FilesConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestFilesConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_version", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("version"); err == nil { - assert.Equal(t, "v1", vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -122,14 +114,6 @@ func TestFilesConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_continueOnError", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vBool, err := cmdFlags.GetBool("continueOnError"); err == nil { - assert.Equal(t, bool(*new(bool)), vBool) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -144,21 +128,55 @@ func TestFilesConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_archive", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("archive", testValue) if vBool, err := cmdFlags.GetBool("archive"); err == nil { - assert.Equal(t, bool(*new(bool)), vBool) + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vBool), &actual.Archive) + } else { assert.FailNow(t, err.Error()) } }) + }) + t.Run("Test_assumableIamRole", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("archive", testValue) - if vBool, err := cmdFlags.GetBool("archive"); err == nil { - testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vBool), &actual.Archive) + cmdFlags.Set("assumableIamRole", testValue) + if vString, err := cmdFlags.GetString("assumableIamRole"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vString), &actual.AssumableIamRole) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_k8ServiceAccount", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("k8ServiceAccount", testValue) + if vString, err := cmdFlags.GetString("k8ServiceAccount"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vString), &actual.K8ServiceAccount) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_outputLocationPrefix", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("outputLocationPrefix", testValue) + if vString, err := cmdFlags.GetString("outputLocationPrefix"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vString), &actual.OutputLocationPrefix) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 25721d14e4..13a1ab51a9 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -57,12 +57,11 @@ func createExecutionRequestForTask(ctx context.Context, taskName string, project Literals: variableLiterals, } var authRole *admin.AuthRole - if executionConfig.KubeServiceAcct != "" { - authRole = &admin.AuthRole{Method: &admin.AuthRole_KubernetesServiceAccount{ - KubernetesServiceAccount: executionConfig.KubeServiceAcct}} - } else { - authRole = &admin.AuthRole{Method: &admin.AuthRole_AssumableIamRole{ - AssumableIamRole: executionConfig.IamRoleARN}} + if executionConfig.KubeServiceAcct != "" || executionConfig.IamRoleARN != "" { + authRole = &admin.AuthRole{ + AssumableIamRole: executionConfig.IamRoleARN, + KubernetesServiceAccount: executionConfig.KubeServiceAcct, + } } ID := &core.Identifier{ ResourceType: core.ResourceType_TASK, diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index 78cf87a15c..f0762d89a0 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -5,26 +5,12 @@ import ( "encoding/json" "os" + rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flytestdlib/logger" ) -//go:generate pflags FilesConfig -var ( - filesConfig = &FilesConfig{ - Version: "v1", - ContinueOnError: false, - } -) - -// FilesConfig -type FilesConfig struct { - Version string `json:"version" pflag:",version of the entity to be registered with flyte."` - ContinueOnError bool `json:"continueOnError" pflag:",continue on error when registering files."` - Archive bool `json:"archive" pflag:",pass in archive file either an http link or local path."` -} - const ( registerFilesShort = "Registers file resources" registerFilesLong = ` @@ -70,6 +56,24 @@ Change the o/p format has not effect on registration. The O/p is currently avail bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -o yaml +Override IamRole during registration. + +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -i "arn:aws:iam::123456789:role/dummy" + +Override Kubernetes service account during registration. + +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -k "kubernetes-service-account" + +Override Output location prefix during registration. + +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -l "s3://dummy/prefix" + Usage ` ) @@ -81,7 +85,7 @@ func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.Co return _err } logger.Infof(ctx, "Parsing files... Total(%v)", len(dataRefs)) - fastFail := !filesConfig.ContinueOnError + fastFail := !rconfig.DefaultFilesConfig.ContinueOnError var registerResults []Result for i := 0; i < len(dataRefs) && !(fastFail && _err != nil); i++ { registerResults, _err = registerFile(ctx, dataRefs[i], registerResults, cmdCtx) diff --git a/flytectl/cmd/register/files_test.go b/flytectl/cmd/register/files_test.go new file mode 100644 index 0000000000..b1ead898a7 --- /dev/null +++ b/flytectl/cmd/register/files_test.go @@ -0,0 +1,32 @@ +package register + +import ( + "testing" + + rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func TestRegisterFromFiles(t *testing.T) { + t.Run("Valid registration", func(t *testing.T) { + setup() + registerFilesSetup() + rconfig.DefaultFilesConfig.Archive = true + args = []string{"testdata/valid-parent-folder-register.tar"} + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + err := registerFromFilesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + }) + t.Run("Invalid registration file", func(t *testing.T) { + setup() + registerFilesSetup() + rconfig.DefaultFilesConfig.Archive = true + args = []string{"testdata/invalid.tar"} + err := registerFromFilesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + }) +} diff --git a/flytectl/cmd/register/filesconfig_flags.go b/flytectl/cmd/register/filesconfig_flags.go deleted file mode 100755 index 2600e6024e..0000000000 --- a/flytectl/cmd/register/filesconfig_flags.go +++ /dev/null @@ -1,48 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package register - -import ( - "encoding/json" - "reflect" - - "fmt" - - "github.com/spf13/pflag" -) - -// If v is a pointer, it will get its element value or the zero value of the element type. -// If v is not a pointer, it will return it as is. -func (FilesConfig) elemValueOrNil(v interface{}) interface{} { - if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { - if reflect.ValueOf(v).IsNil() { - return reflect.Zero(t.Elem()).Interface() - } else { - return reflect.ValueOf(v).Interface() - } - } else if v == nil { - return reflect.Zero(t).Interface() - } - - return v -} - -func (FilesConfig) mustMarshalJSON(v json.Marshaler) string { - raw, err := v.MarshalJSON() - if err != nil { - panic(err) - } - - return string(raw) -} - -// GetPFlagSet will return strongly types pflags for all fields in FilesConfig and its nested types. The format of the -// flags is json-name.json-sub-name... etc. -func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("FilesConfig", pflag.ExitOnError) - cmdFlags.StringVarP(&(filesConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), "v", "v1", "version of the entity to be registered with flyte.") - cmdFlags.BoolVarP(&(filesConfig.ContinueOnError), fmt.Sprintf("%v%v", prefix, "continueOnError"), "c", *new(bool), "continue on error when registering files.") - cmdFlags.BoolVarP(&(filesConfig.Archive), fmt.Sprintf("%v%v", prefix, "archive"), "a", *new(bool), "pass in archive file either an http link or local path.") - return cmdFlags -} diff --git a/flytectl/cmd/register/register.go b/flytectl/cmd/register/register.go index 476080dd2c..0ae04aaaaa 100644 --- a/flytectl/cmd/register/register.go +++ b/flytectl/cmd/register/register.go @@ -1,7 +1,9 @@ package register import ( + rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdcore "github.com/flyteorg/flytectl/cmd/core" + "github.com/spf13/cobra" ) @@ -24,8 +26,8 @@ func RemoteRegisterCommand() *cobra.Command { Long: registercmdLong, } registerResourcesFuncs := map[string]cmdcore.CommandEntry{ - "files": {CmdFunc: registerFromFilesFunc, Aliases: []string{"file"}, PFlagProvider: filesConfig, Short: registerFilesShort, - Long: registerFilesLong}, + "files": {CmdFunc: registerFromFilesFunc, Aliases: []string{"file"}, PFlagProvider: rconfig.DefaultFilesConfig, + Short: registerFilesShort, Long: registerFilesLong}, } cmdcore.AddCommands(registerCmd, registerResourcesFuncs) return registerCmd diff --git a/flytectl/cmd/register/register_test.go b/flytectl/cmd/register/register_test.go index 476e7b31bc..6943979912 100644 --- a/flytectl/cmd/register/register_test.go +++ b/flytectl/cmd/register/register_test.go @@ -1,13 +1,29 @@ package register import ( + "context" "fmt" + "net/http" "sort" "testing" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/stretchr/testify/assert" ) +var ( + ctx context.Context + mockAdminClient *mocks.AdminServiceClient + cmdCtx cmdCore.CommandContext + args []string + GetDoFunc func(req *http.Request) (*http.Response, error) +) + +var setup = u.Setup + func TestRegisterCommand(t *testing.T) { registerCommand := RemoteRegisterCommand() assert.Equal(t, registerCommand.Use, "register") diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 3bb5a5d6f7..34afc816b2 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -14,6 +14,7 @@ import ( "strings" "github.com/flyteorg/flytectl/cmd/config" + rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -84,7 +85,7 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: launchPlan.Id.Name, - Version: filesConfig.Version, + Version: rconfig.DefaultFilesConfig.Version, }, Spec: launchPlan.Spec, }) @@ -97,7 +98,7 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: workflowSpec.Template.Id.Name, - Version: filesConfig.Version, + Version: rconfig.DefaultFilesConfig.Version, }, Spec: workflowSpec, }) @@ -110,7 +111,7 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: taskSpec.Template.Id.Name, - Version: filesConfig.Version, + Version: rconfig.DefaultFilesConfig.Version, }, Spec: taskSpec, }) @@ -177,7 +178,24 @@ func hydrateIdentifier(identifier *core.Identifier) { identifier.Domain = config.GetConfig().Domain } if identifier.Version == "" || identifier.Version == registrationVersionPattern { - identifier.Version = filesConfig.Version + identifier.Version = rconfig.DefaultFilesConfig.Version + } +} + +func hydrateLaunchPlanSpec(lpSpec *admin.LaunchPlanSpec) { + assumableIamRole := len(rconfig.DefaultFilesConfig.AssumableIamRole) > 0 + k8ServiceAcct := len(rconfig.DefaultFilesConfig.K8ServiceAccount) > 0 + outputLocationPrefix := len(rconfig.DefaultFilesConfig.OutputLocationPrefix) > 0 + if assumableIamRole || k8ServiceAcct { + lpSpec.AuthRole = &admin.AuthRole{ + AssumableIamRole: rconfig.DefaultFilesConfig.AssumableIamRole, + KubernetesServiceAccount: rconfig.DefaultFilesConfig.K8ServiceAccount, + } + } + if outputLocationPrefix { + lpSpec.RawOutputDataConfig = &admin.RawOutputDataConfig{ + OutputLocationPrefix: rconfig.DefaultFilesConfig.OutputLocationPrefix, + } } } @@ -186,6 +204,7 @@ func hydrateSpec(message proto.Message) error { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) hydrateIdentifier(launchPlan.Spec.WorkflowId) + hydrateLaunchPlanSpec(launchPlan.Spec) case *admin.WorkflowSpec: workflowSpec := message.(*admin.WorkflowSpec) for _, Noderef := range workflowSpec.Template.Nodes { @@ -229,7 +248,7 @@ If the archive flag is on then download the archives to temp directory and extra The o/p of this function would be sorted list of the file locations. */ func getSortedFileList(ctx context.Context, args []string) ([]string, string, error) { - if !filesConfig.Archive { + if !rconfig.DefaultFilesConfig.Archive { /* * Sorting is required for non-archived case since its possible for the user to pass in a list of unordered * serialized protobuf files , but flyte expects them to be registered in topologically sorted order that it had diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index ce5805fd7b..a30c6016e3 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -1,7 +1,6 @@ package register import ( - "context" "errors" "fmt" "net/http" @@ -10,9 +9,10 @@ import ( "strings" "testing" + rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" u "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -28,16 +28,6 @@ func (m *MockHTTPClient) Do(req *http.Request) (*http.Response, error) { return GetDoFunc(req) } -var ( - ctx context.Context - mockAdminClient *mocks.AdminServiceClient - cmdCtx cmdCore.CommandContext - args []string - GetDoFunc func(req *http.Request) (*http.Response, error) -) - -var setup = u.Setup - func registerFilesSetup() { httpClient = &MockHTTPClient{} validTar, err := os.Open("testdata/valid-register.tar") @@ -54,12 +44,16 @@ func registerFilesSetup() { ctx = u.Ctx mockAdminClient = u.MockClient cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) + + rconfig.DefaultFilesConfig.AssumableIamRole = "" + rconfig.DefaultFilesConfig.K8ServiceAccount = "" + rconfig.DefaultFilesConfig.OutputLocationPrefix = "" } func TestGetSortedFileList(t *testing.T) { setup() registerFilesSetup() - filesConfig.Archive = false + rconfig.DefaultFilesConfig.Archive = false args = []string{"file2", "file1"} fileList, tmpDir, err := getSortedFileList(ctx, args) assert.Equal(t, "file1", fileList[0]) @@ -71,7 +65,7 @@ func TestGetSortedFileList(t *testing.T) { func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { setup() registerFilesSetup() - filesConfig.Archive = true + rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-parent-folder-register.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) assert.Equal(t, len(fileList), 4) @@ -88,7 +82,7 @@ func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { func TestGetSortedArchivedFileList(t *testing.T) { setup() registerFilesSetup() - filesConfig.Archive = true + rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-register.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) assert.Equal(t, len(fileList), 4) @@ -105,7 +99,7 @@ func TestGetSortedArchivedFileList(t *testing.T) { func TestGetSortedArchivedFileUnorderedList(t *testing.T) { setup() registerFilesSetup() - filesConfig.Archive = true + rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-unordered-register.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) assert.Equal(t, len(fileList), 4) @@ -122,7 +116,7 @@ func TestGetSortedArchivedFileUnorderedList(t *testing.T) { func TestGetSortedArchivedCorruptedFileList(t *testing.T) { setup() registerFilesSetup() - filesConfig.Archive = true + rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/invalid.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) assert.Equal(t, len(fileList), 0) @@ -135,7 +129,7 @@ func TestGetSortedArchivedCorruptedFileList(t *testing.T) { func TestGetSortedArchivedTgzList(t *testing.T) { setup() registerFilesSetup() - filesConfig.Archive = true + rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-register.tgz"} fileList, tmpDir, err := getSortedFileList(ctx, args) assert.Equal(t, len(fileList), 4) @@ -151,7 +145,7 @@ func TestGetSortedArchivedTgzList(t *testing.T) { func TestGetSortedArchivedCorruptedTgzFileList(t *testing.T) { setup() - filesConfig.Archive = true + rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/invalid.tgz"} fileList, tmpDir, err := getSortedFileList(ctx, args) assert.Equal(t, 0, len(fileList)) @@ -164,7 +158,7 @@ func TestGetSortedArchivedCorruptedTgzFileList(t *testing.T) { func TestGetSortedArchivedInvalidArchiveFileList(t *testing.T) { setup() registerFilesSetup() - filesConfig.Archive = true + rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/invalid-extension-register.zip"} fileList, tmpDir, err := getSortedFileList(ctx, args) assert.Equal(t, 0, len(fileList)) @@ -177,7 +171,7 @@ func TestGetSortedArchivedInvalidArchiveFileList(t *testing.T) { func TestGetSortedArchivedFileThroughInvalidHttpList(t *testing.T) { setup() - filesConfig.Archive = true + rconfig.DefaultFilesConfig.Archive = true args = []string{"http://invalidhost:invalidport/testdata/valid-register.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) assert.Equal(t, 0, len(fileList)) @@ -190,7 +184,7 @@ func TestGetSortedArchivedFileThroughInvalidHttpList(t *testing.T) { func TestGetSortedArchivedFileThroughValidHttpList(t *testing.T) { setup() registerFilesSetup() - filesConfig.Archive = true + rconfig.DefaultFilesConfig.Archive = true args = []string{"http://dummyhost:80/testdata/valid-register.tar"} fileList, tmpDir, err := getSortedFileList(ctx, args) assert.Equal(t, len(fileList), 4) @@ -207,7 +201,7 @@ func TestGetSortedArchivedFileThroughValidHttpList(t *testing.T) { func TestGetSortedArchivedFileThroughValidHttpWithNullContextList(t *testing.T) { setup() registerFilesSetup() - filesConfig.Archive = true + rconfig.DefaultFilesConfig.Archive = true args = []string{"http://dummyhost:80/testdata/valid-register.tar"} ctx = nil fileList, tmpDir, err := getSortedFileList(ctx, args) @@ -279,3 +273,40 @@ func TestRegisterFile(t *testing.T) { assert.NotNil(t, err) }) } + +func TestHydrateLaunchPlanSpec(t *testing.T) { + t.Run("IamRole override", func(t *testing.T) { + setup() + registerFilesSetup() + rconfig.DefaultFilesConfig.AssumableIamRole = "iamRole" + lpSpec := &admin.LaunchPlanSpec{} + hydrateLaunchPlanSpec(lpSpec) + assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole"}, lpSpec.AuthRole) + }) + t.Run("k8Service account override", func(t *testing.T) { + setup() + registerFilesSetup() + rconfig.DefaultFilesConfig.K8ServiceAccount = "k8Account" + lpSpec := &admin.LaunchPlanSpec{} + hydrateLaunchPlanSpec(lpSpec) + assert.Equal(t, &admin.AuthRole{KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) + }) + t.Run("Both k8Service and IamRole", func(t *testing.T) { + setup() + registerFilesSetup() + rconfig.DefaultFilesConfig.AssumableIamRole = "iamRole" + rconfig.DefaultFilesConfig.K8ServiceAccount = "k8Account" + lpSpec := &admin.LaunchPlanSpec{} + hydrateLaunchPlanSpec(lpSpec) + assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole", + KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) + }) + t.Run("Output prefix", func(t *testing.T) { + setup() + registerFilesSetup() + rconfig.DefaultFilesConfig.OutputLocationPrefix = "prefix" + lpSpec := &admin.LaunchPlanSpec{} + hydrateLaunchPlanSpec(lpSpec) + assert.Equal(t, &admin.RawOutputDataConfig{OutputLocationPrefix: "prefix"}, lpSpec.RawOutputDataConfig) + }) +} diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index c878c96298..22fabc9f41 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -25,6 +25,8 @@ Options --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index a2f96c1e7a..aea876904b 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -34,6 +34,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index c5e86530a1..c1c625d72a 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -36,6 +36,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 7223e1a240..a55952f1de 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -38,6 +38,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index 7233aa611a..67aff79271 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -37,6 +37,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index ade3a51e11..2d99025dfa 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -110,6 +110,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index b99b60268f..994e53e825 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -61,6 +61,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index d22416441d..6795a572e4 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -37,6 +37,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index ee2e26a889..e29fb6b821 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -73,6 +73,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 9290a5444b..801b28f333 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -71,6 +71,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 20c4f4506c..43b59d3878 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -75,6 +75,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 60dda389ad..14a769ccb0 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -80,6 +80,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index f76d01d2f3..5431cb54f9 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -76,6 +76,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 91b3f785b0..19ee6daf95 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -76,6 +76,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 4a0608a262..2faf6997b8 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -37,6 +37,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index 0606779729..d650498f75 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -82,6 +82,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index e8752979d7..e2da0f360d 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -80,6 +80,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index b9eff077be..667fe0fd96 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -84,6 +84,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index fad935ec01..43e7134dba 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -66,6 +66,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index fa45e3f85f..fbbef2cace 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -106,6 +106,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index 1735945a10..25fbfbf288 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -104,6 +104,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index e47f0061c2..9d9eec43cf 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -66,6 +66,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index a49cb1f96d..613da8d7b3 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -86,6 +86,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 494ee1b7a1..e7c2c75968 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -105,6 +105,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 89e4c688db..e951129aa5 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -80,6 +80,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index f02dbed437..76ba262247 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -37,6 +37,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index c3c90edb5e..39f7601c8d 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -52,6 +52,24 @@ Change the o/p format has not effect on registration. The O/p is currently avail bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -o yaml +Override IamRole during registration. + +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -i "arn:aws:iam::123456789:role/dummy" + +Override Kubernetes service account during registration. + +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -k "kubernetes-service-account" + +Override Output location prefix during registration. + +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -l "s3://dummy/prefix" + Usage @@ -64,10 +82,13 @@ Options :: - -a, --archive pass in archive file either an http link or local path. - -c, --continueOnError continue on error when registering files. - -h, --help help for files - -v, --version string version of the entity to be registered with flyte. (default "v1") + -a, --archive pass in archive file either an http link or local path. + -i, --assumableIamRole string Custom assumable iam auth role to register launch plans with. + -c, --continueOnError continue on error when registering files. + -h, --help help for files + -k, --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. + -l, --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). + -v, --version string version of the entity to be registered with flyte. (default "v1") Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -83,6 +104,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 1372e09809..43dfbae8df 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -39,6 +39,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 1646cdfc90..3bc41ae646 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -78,6 +78,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 325dda91a6..8f22a1f327 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -71,6 +71,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 85f28eec5b..19d10aa050 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -82,6 +82,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index cc76a1ab93..f0e7838f61 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -56,6 +56,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 3cff796b1d..b4cf04600f 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -84,6 +84,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 8a2e2525ca..e7954f31dd 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -81,6 +81,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 37c3439eff..496a79779e 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -84,6 +84,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst index ba02121a13..9d4c95142b 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -56,6 +56,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst index 7320bb5423..5899dfa220 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -56,6 +56,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 84df72ed64..4ba5a821ef 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -41,6 +41,8 @@ Options inherited from parent commands --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") --admin.maxRetries int Max number of gRPC retries (default 4) --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. diff --git a/flytectl/go.mod b/flytectl/go.mod index 0f387bf4d7..56161e8041 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect - github.com/flyteorg/flyteidl v0.18.40 + github.com/flyteorg/flyteidl v0.18.51 github.com/flyteorg/flytestdlib v0.3.21 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 diff --git a/flytectl/go.sum b/flytectl/go.sum index b8d3df4f31..1049bf193a 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -84,7 +84,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -173,8 +172,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.18.40 h1:YuLBNpIotOFwyLSXSs0aj3B9N9vwPhzLRAQTWxYSI/w= -github.com/flyteorg/flyteidl v0.18.40/go.mod h1:IJD02cc/95QMkGDBJNibsr5aWd6V7TlQiJ8Iz5mVZ28= +github.com/flyteorg/flyteidl v0.18.51 h1:fp4Qq9WtO3QeDbFpKk0uQqB/cF78+Ul7D3DhvQPlV5Q= +github.com/flyteorg/flyteidl v0.18.51/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.21 h1:AF+y6wI64DNfoi4WtZU/v18Cfwksg32fijy7PZJ8d+I= github.com/flyteorg/flytestdlib v0.3.21/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= @@ -309,8 +308,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.2 h1:D0EVSTwQoQOyfY35QNSuPJA4jpZRtkoGYWQMB7XNg5o= -github.com/grpc-ecosystem/grpc-gateway v1.12.2/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -681,7 +680,6 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -902,7 +900,6 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -918,6 +915,7 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -944,7 +942,6 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -955,6 +952,7 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= From fdd1b15a6414be9e5dd28164a486ec8982be85f4 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Fri, 4 Jun 2021 01:49:32 +0530 Subject: [PATCH 058/645] Added error data and abort data in get execution output (#79) Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/get/execution.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 3f378b6c1d..e77bea6f61 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -53,6 +53,8 @@ var executionColumns = []printer.Column{ {Header: "Phase", JSONPath: "$.closure.phase"}, {Header: "Started", JSONPath: "$.closure.startedAt"}, {Header: "Elapsed Time", JSONPath: "$.closure.duration"}, + {Header: "Abort data", JSONPath: "$.closure.abortMetadata[\"cause\"]"}, + {Header: "Error data", JSONPath: "$.closure.error[\"message\"]"}, } func ExecutionToProtoMessages(l []*admin.Execution) []proto.Message { From 2d2c145d52f4c5e82a48b89bce3a3dac04a2aa24 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Sat, 5 Jun 2021 10:25:23 +0530 Subject: [PATCH 059/645] Added filters flag (#82) --- flytectl/cmd/config/config_flags.go | 11 +- flytectl/cmd/config/config_flags_test.go | 28 ++- .../subcommand/execution/config_flags.go | 58 ++++++ .../subcommand/execution/config_flags_test.go | 158 ++++++++++++++++ .../subcommand/execution/execution_config.go | 17 ++ .../subcommand/launchplan/config_flags.go | 62 +++++++ .../launchplan/config_flags_test.go} | 110 ++++++++---- .../launchplan/launchplan_config.go | 20 +++ .../config/subcommand/project/config_flags.go | 58 ++++++ .../subcommand/project/config_flags_test.go | 158 ++++++++++++++++ .../subcommand/project/project_config.go | 17 ++ .../config/subcommand/task/config_flags.go | 62 +++++++ .../subcommand/task/config_flags_test.go} | 110 ++++++++---- .../cmd/config/subcommand/task/task_config.go | 18 ++ .../subcommand/workflow/config_flags.go | 18 +- .../subcommand/workflow/config_flags_test.go | 70 ++++++-- .../subcommand/workflow/workflow_config.go | 11 +- flytectl/cmd/get/execution.go | 32 ++-- flytectl/cmd/get/get.go | 12 +- flytectl/cmd/get/launch_plan.go | 74 +++++--- flytectl/cmd/get/launch_plan_test.go | 86 ++++----- flytectl/cmd/get/launchplanconfig_flags.go | 48 ----- flytectl/cmd/get/named_entity.go | 11 -- flytectl/cmd/get/project.go | 21 ++- flytectl/cmd/get/project_test.go | 83 +++++++++ flytectl/cmd/get/task.go | 58 +++--- flytectl/cmd/get/task_test.go | 121 ++++++++----- flytectl/cmd/get/taskconfig_flags.go | 48 ----- flytectl/cmd/get/workflow.go | 45 ++++- flytectl/cmd/get/workflow_test.go | 59 +++++- flytectl/docs/source/gen/flytectl.rst | 2 - flytectl/docs/source/gen/flytectl_config.rst | 2 - .../source/gen/flytectl_config_discover.rst | 2 - .../source/gen/flytectl_config_validate.rst | 2 - flytectl/docs/source/gen/flytectl_create.rst | 2 - .../source/gen/flytectl_create_execution.rst | 2 - .../source/gen/flytectl_create_project.rst | 2 - flytectl/docs/source/gen/flytectl_delete.rst | 2 - ...ectl_delete_cluster-resource-attribute.rst | 2 - ...lytectl_delete_execution-cluster-label.rst | 2 - ...tectl_delete_execution-queue-attribute.rst | 2 - .../source/gen/flytectl_delete_execution.rst | 2 - .../gen/flytectl_delete_plugin-override.rst | 2 - ...lytectl_delete_task-resource-attribute.rst | 2 - flytectl/docs/source/gen/flytectl_get.rst | 2 - ...lytectl_get_cluster-resource-attribute.rst | 2 - .../flytectl_get_execution-cluster-label.rst | 2 - ...flytectl_get_execution-queue-attribute.rst | 2 - .../source/gen/flytectl_get_execution.rst | 25 ++- .../source/gen/flytectl_get_launchplan.rst | 32 +++- .../gen/flytectl_get_plugin-override.rst | 2 - .../docs/source/gen/flytectl_get_project.rst | 19 +- .../flytectl_get_task-resource-attribute.rst | 2 - .../docs/source/gen/flytectl_get_task.rst | 33 ++-- .../docs/source/gen/flytectl_get_workflow.rst | 26 ++- .../docs/source/gen/flytectl_register.rst | 2 - .../source/gen/flytectl_register_files.rst | 2 - flytectl/docs/source/gen/flytectl_update.rst | 2 - ...ectl_update_cluster-resource-attribute.rst | 2 - ...lytectl_update_execution-cluster-label.rst | 2 - ...tectl_update_execution-queue-attribute.rst | 2 - .../source/gen/flytectl_update_launchplan.rst | 2 - .../gen/flytectl_update_plugin-override.rst | 2 - .../source/gen/flytectl_update_project.rst | 2 - ...lytectl_update_task-resource-attribute.rst | 2 - .../docs/source/gen/flytectl_update_task.rst | 2 - .../source/gen/flytectl_update_workflow.rst | 2 - flytectl/docs/source/gen/flytectl_version.rst | 2 - flytectl/pkg/ext/deleter_test.go | 17 ++ flytectl/pkg/ext/fetcher.go | 14 +- flytectl/pkg/ext/fetcher_test.go | 17 ++ flytectl/pkg/ext/launch_plan_fetcher.go | 25 ++- flytectl/pkg/ext/launch_plan_fetcher_test.go | 32 +++- .../ext/mocks/admin_fetcher_ext_interface.go | 110 ++++++------ flytectl/pkg/ext/task_fetcher.go | 25 ++- flytectl/pkg/ext/task_fetcher_test.go | 34 +++- flytectl/pkg/ext/updater_test.go | 17 ++ flytectl/pkg/ext/workflow_fetcher.go | 25 ++- flytectl/pkg/ext/workflow_fetcher_test.go | 14 +- flytectl/pkg/filters/coverage.out | 68 +++++++ flytectl/pkg/filters/filters.go | 168 ++++++++++++++++++ flytectl/pkg/filters/filters_test.go | 73 ++++++++ flytectl/pkg/filters/operator.go | 12 ++ flytectl/pkg/filters/type.go | 17 ++ flytectl/pkg/filters/util.go | 54 ++++++ flytectl/pkg/filters/util_test.go | 111 ++++++++++++ 86 files changed, 2094 insertions(+), 624 deletions(-) create mode 100755 flytectl/cmd/config/subcommand/execution/config_flags.go create mode 100755 flytectl/cmd/config/subcommand/execution/config_flags_test.go create mode 100644 flytectl/cmd/config/subcommand/execution/execution_config.go create mode 100755 flytectl/cmd/config/subcommand/launchplan/config_flags.go rename flytectl/cmd/{get/taskconfig_flags_test.go => config/subcommand/launchplan/config_flags_test.go} (55%) create mode 100644 flytectl/cmd/config/subcommand/launchplan/launchplan_config.go create mode 100755 flytectl/cmd/config/subcommand/project/config_flags.go create mode 100755 flytectl/cmd/config/subcommand/project/config_flags_test.go create mode 100644 flytectl/cmd/config/subcommand/project/project_config.go create mode 100755 flytectl/cmd/config/subcommand/task/config_flags.go rename flytectl/cmd/{get/launchplanconfig_flags_test.go => config/subcommand/task/config_flags_test.go} (55%) create mode 100644 flytectl/cmd/config/subcommand/task/task_config.go delete mode 100755 flytectl/cmd/get/launchplanconfig_flags.go delete mode 100644 flytectl/cmd/get/named_entity.go create mode 100644 flytectl/cmd/get/project_test.go delete mode 100755 flytectl/cmd/get/taskconfig_flags.go create mode 100644 flytectl/pkg/ext/deleter_test.go create mode 100644 flytectl/pkg/ext/fetcher_test.go create mode 100644 flytectl/pkg/ext/updater_test.go create mode 100644 flytectl/pkg/filters/coverage.out create mode 100644 flytectl/pkg/filters/filters.go create mode 100644 flytectl/pkg/filters/filters_test.go create mode 100644 flytectl/pkg/filters/operator.go create mode 100644 flytectl/pkg/filters/type.go create mode 100644 flytectl/pkg/filters/util.go create mode 100644 flytectl/pkg/filters/util_test.go diff --git a/flytectl/cmd/config/config_flags.go b/flytectl/cmd/config/config_flags.go index 2722dde8f8..3a1616b7e6 100755 --- a/flytectl/cmd/config/config_flags.go +++ b/flytectl/cmd/config/config_flags.go @@ -28,6 +28,15 @@ func (Config) elemValueOrNil(v interface{}) interface{} { return v } +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (Config) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -43,6 +52,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) cmdFlags.String(fmt.Sprintf("%v%v", prefix, "project"), defaultConfig.Project, "Specifies the project to work on.") cmdFlags.String(fmt.Sprintf("%v%v", prefix, "domain"), defaultConfig.Domain, "Specified the domain to work on.") - cmdFlags.String(fmt.Sprintf("%v%v", prefix, "output"), defaultConfig.Domain, "Specified the output type.") + cmdFlags.String(fmt.Sprintf("%v%v", prefix, "output"), defaultConfig.Output, "Specified the output type.") return cmdFlags } diff --git a/flytectl/cmd/config/config_flags_test.go b/flytectl/cmd/config/config_flags_test.go index 1297f83032..88446ff3e3 100755 --- a/flytectl/cmd/config/config_flags_test.go +++ b/flytectl/cmd/config/config_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_Config(t *testing.T, val, result interface{}) { assert.NoError(t, decode_Config(val, result)) } -func testDecodeSlice_Config(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_Config(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_project", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("project"); err == nil { - assert.Equal(t, string(defaultConfig.Project), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -122,21 +114,27 @@ func TestConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_domain", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("domain", testValue) if vString, err := cmdFlags.GetString("domain"); err == nil { - assert.Equal(t, string(defaultConfig.Domain), vString) + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Domain) + } else { assert.FailNow(t, err.Error()) } }) + }) + t.Run("Test_output", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("domain", testValue) - if vString, err := cmdFlags.GetString("domain"); err == nil { - testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Domain) + cmdFlags.Set("output", testValue) + if vString, err := cmdFlags.GetString("output"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Output) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/execution/config_flags.go b/flytectl/cmd/config/subcommand/execution/config_flags.go new file mode 100755 index 0000000000..5fcc9b332c --- /dev/null +++ b/flytectl/cmd/config/subcommand/execution/config_flags.go @@ -0,0 +1,58 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package execution + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultConfig.Filter.FieldSelector), fmt.Sprintf("%v%v", prefix, "filter.field-selector"), *new(string), "Specifies the Field selector") + cmdFlags.StringVar((&DefaultConfig.Filter.SortBy), fmt.Sprintf("%v%v", prefix, "filter.sort-by"), *new(string), "Specifies which field to sort result by ") + cmdFlags.Int32Var((&DefaultConfig.Filter.Limit), fmt.Sprintf("%v%v", prefix, "filter.limit"), 100, "Specifies the limit") + cmdFlags.BoolVar((&DefaultConfig.Filter.Asc), fmt.Sprintf("%v%v", prefix, "filter.asc"), false, "Specifies the sorting order. By default flytectl sort result in descending order") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/execution/config_flags_test.go b/flytectl/cmd/config/subcommand/execution/config_flags_test.go new file mode 100755 index 0000000000..7be80b6d67 --- /dev/null +++ b/flytectl/cmd/config/subcommand/execution/config_flags_test.go @@ -0,0 +1,158 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package execution + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_Config(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_Config(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) +} + +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) +} + +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_filter.field-selector", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.field-selector", testValue) + if vString, err := cmdFlags.GetString("filter.field-selector"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.FieldSelector) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.sort-by", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.sort-by", testValue) + if vString, err := cmdFlags.GetString("filter.sort-by"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.SortBy) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.limit", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.limit", testValue) + if vInt32, err := cmdFlags.GetInt32("filter.limit"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt32), &actual.Filter.Limit) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.asc", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.asc", testValue) + if vBool, err := cmdFlags.GetBool("filter.asc"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Filter.Asc) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/execution/execution_config.go b/flytectl/cmd/config/subcommand/execution/execution_config.go new file mode 100644 index 0000000000..b0737aee64 --- /dev/null +++ b/flytectl/cmd/config/subcommand/execution/execution_config.go @@ -0,0 +1,17 @@ +package execution + +import ( + "github.com/flyteorg/flytectl/pkg/filters" +) + +//go:generate pflags Config --default-var DefaultConfig +var ( + DefaultConfig = &Config{ + Filter: filters.DefaultFilter, + } +) + +// Config +type Config struct { + Filter filters.Filters `json:"filter" pflag:","` +} diff --git a/flytectl/cmd/config/subcommand/launchplan/config_flags.go b/flytectl/cmd/config/subcommand/launchplan/config_flags.go new file mode 100755 index 0000000000..db572d98ea --- /dev/null +++ b/flytectl/cmd/config/subcommand/launchplan/config_flags.go @@ -0,0 +1,62 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package launchplan + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), DefaultConfig.ExecFile, "execution file name to be used for generating execution spec of a single launchplan.") + cmdFlags.StringVar(&(DefaultConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "version of the launchplan to be fetched.") + cmdFlags.BoolVar(&(DefaultConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), DefaultConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") + + cmdFlags.StringVar(&(DefaultConfig.Filter.FieldSelector), fmt.Sprintf("%v%v", prefix, "filter.field-selector"), *new(string), "Specifies the Field selector") + cmdFlags.StringVar((&DefaultConfig.Filter.SortBy), fmt.Sprintf("%v%v", prefix, "filter.sort-by"), *new(string), "Specifies which field to sort result by ") + cmdFlags.Int32Var((&DefaultConfig.Filter.Limit), fmt.Sprintf("%v%v", prefix, "filter.limit"), 100, "Specifies the limit") + cmdFlags.BoolVar((&DefaultConfig.Filter.Asc), fmt.Sprintf("%v%v", prefix, "filter.asc"), false, "Specifies the sorting order. By default flytectl sort result in descending order") + return cmdFlags +} diff --git a/flytectl/cmd/get/taskconfig_flags_test.go b/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go similarity index 55% rename from flytectl/cmd/get/taskconfig_flags_test.go rename to flytectl/cmd/config/subcommand/launchplan/config_flags_test.go index b945e78619..ec536464bc 100755 --- a/flytectl/cmd/get/taskconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package get +package launchplan import ( "encoding/json" @@ -14,22 +14,22 @@ import ( "github.com/stretchr/testify/assert" ) -var dereferencableKindsTaskConfig = map[reflect.Kind]struct{}{ +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, } // Checks if t is a kind that can be dereferenced to get its underlying type. -func canGetElementTaskConfig(t reflect.Kind) bool { - _, exists := dereferencableKindsTaskConfig[t] +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] return exists } // This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the // object. Otherwise, it'll just pass on the original data. -func jsonUnmarshalerHookTaskConfig(_, to reflect.Type, data interface{}) (interface{}, error) { +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || - (canGetElementTaskConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { raw, err := json.Marshal(data) if err != nil { @@ -50,7 +50,7 @@ func jsonUnmarshalerHookTaskConfig(_, to reflect.Type, data interface{}) (interf return data, nil } -func decode_TaskConfig(input, result interface{}) error { +func decode_Config(input, result interface{}) error { config := &mapstructure.DecoderConfig{ TagName: "json", WeaklyTypedInput: true, @@ -58,7 +58,7 @@ func decode_TaskConfig(input, result interface{}) error { DecodeHook: mapstructure.ComposeDecodeHookFunc( mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToSliceHookFunc(","), - jsonUnmarshalerHookTaskConfig, + jsonUnmarshalerHookConfig, ), } @@ -70,7 +70,7 @@ func decode_TaskConfig(input, result interface{}) error { return decoder.Decode(input) } -func join_TaskConfig(arr interface{}, sep string) string { +func join_Config(arr interface{}, sep string) string { listValue := reflect.ValueOf(arr) strs := make([]string, 0, listValue.Len()) for i := 0; i < listValue.Len(); i++ { @@ -80,85 +80,117 @@ func join_TaskConfig(arr interface{}, sep string) string { return strings.Join(strs, sep) } -func testDecodeJson_TaskConfig(t *testing.T, val, result interface{}) { - assert.NoError(t, decode_TaskConfig(val, result)) +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) } -func testDecodeSlice_TaskConfig(t *testing.T, vStringSlice, result interface{}) { - assert.NoError(t, decode_TaskConfig(vStringSlice, result)) +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) } -func TestTaskConfig_GetPFlagSet(t *testing.T) { - val := TaskConfig{} +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} cmdFlags := val.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) } -func TestTaskConfig_SetFlags(t *testing.T) { - actual := TaskConfig{} +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) t.Run("Test_execFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("execFile", testValue) if vString, err := cmdFlags.GetString("execFile"); err == nil { - assert.Equal(t, string(taskConfig.ExecFile), vString) + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.ExecFile) + } else { assert.FailNow(t, err.Error()) } }) + }) + t.Run("Test_version", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("execFile", testValue) - if vString, err := cmdFlags.GetString("execFile"); err == nil { - testDecodeJson_TaskConfig(t, fmt.Sprintf("%v", vString), &actual.ExecFile) + cmdFlags.Set("version", testValue) + if vString, err := cmdFlags.GetString("version"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Version) } else { assert.FailNow(t, err.Error()) } }) }) - t.Run("Test_version", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("version"); err == nil { - assert.Equal(t, string(taskConfig.Version), vString) + t.Run("Test_latest", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("latest", testValue) + if vBool, err := cmdFlags.GetBool("latest"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Latest) + } else { assert.FailNow(t, err.Error()) } }) + }) + t.Run("Test_filter.field-selector", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("version", testValue) - if vString, err := cmdFlags.GetString("version"); err == nil { - testDecodeJson_TaskConfig(t, fmt.Sprintf("%v", vString), &actual.Version) + cmdFlags.Set("filter.field-selector", testValue) + if vString, err := cmdFlags.GetString("filter.field-selector"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.FieldSelector) } else { assert.FailNow(t, err.Error()) } }) }) - t.Run("Test_latest", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vBool, err := cmdFlags.GetBool("latest"); err == nil { - assert.Equal(t, bool(taskConfig.Latest), vBool) + t.Run("Test_filter.sort-by", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.sort-by", testValue) + if vString, err := cmdFlags.GetString("filter.sort-by"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.SortBy) + } else { assert.FailNow(t, err.Error()) } }) + }) + t.Run("Test_filter.limit", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("latest", testValue) - if vBool, err := cmdFlags.GetBool("latest"); err == nil { - testDecodeJson_TaskConfig(t, fmt.Sprintf("%v", vBool), &actual.Latest) + cmdFlags.Set("filter.limit", testValue) + if vInt32, err := cmdFlags.GetInt32("filter.limit"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt32), &actual.Filter.Limit) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.asc", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.asc", testValue) + if vBool, err := cmdFlags.GetBool("filter.asc"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Filter.Asc) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go b/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go new file mode 100644 index 0000000000..5e245deb48 --- /dev/null +++ b/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go @@ -0,0 +1,20 @@ +package launchplan + +import ( + "github.com/flyteorg/flytectl/pkg/filters" +) + +//go:generate pflags Config --default-var DefaultConfig +var ( + DefaultConfig = &Config{ + Filter: filters.DefaultFilter, + } +) + +// Config +type Config struct { + ExecFile string `json:"execFile" pflag:",execution file name to be used for generating execution spec of a single launchplan."` + Version string `json:"version" pflag:",version of the launchplan to be fetched."` + Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` + Filter filters.Filters `json:"filter" pflag:","` +} diff --git a/flytectl/cmd/config/subcommand/project/config_flags.go b/flytectl/cmd/config/subcommand/project/config_flags.go new file mode 100755 index 0000000000..3a3e9bb5df --- /dev/null +++ b/flytectl/cmd/config/subcommand/project/config_flags.go @@ -0,0 +1,58 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package project + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultConfig.Filter.FieldSelector), fmt.Sprintf("%v%v", prefix, "filter.field-selector"), *new(string), "Specifies the Field selector") + cmdFlags.StringVar((&DefaultConfig.Filter.SortBy), fmt.Sprintf("%v%v", prefix, "filter.sort-by"), *new(string), "Specifies which field to sort result by ") + cmdFlags.Int32Var((&DefaultConfig.Filter.Limit), fmt.Sprintf("%v%v", prefix, "filter.limit"), 100, "Specifies the limit") + cmdFlags.BoolVar((&DefaultConfig.Filter.Asc), fmt.Sprintf("%v%v", prefix, "filter.asc"), false, "Specifies the sorting order. By default flytectl sort result in descending order") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/project/config_flags_test.go b/flytectl/cmd/config/subcommand/project/config_flags_test.go new file mode 100755 index 0000000000..50fcfad9d2 --- /dev/null +++ b/flytectl/cmd/config/subcommand/project/config_flags_test.go @@ -0,0 +1,158 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package project + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_Config(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_Config(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) +} + +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) +} + +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_filter.field-selector", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.field-selector", testValue) + if vString, err := cmdFlags.GetString("filter.field-selector"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.FieldSelector) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.sort-by", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.sort-by", testValue) + if vString, err := cmdFlags.GetString("filter.sort-by"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.SortBy) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.limit", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.limit", testValue) + if vInt32, err := cmdFlags.GetInt32("filter.limit"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt32), &actual.Filter.Limit) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.asc", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.asc", testValue) + if vBool, err := cmdFlags.GetBool("filter.asc"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Filter.Asc) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go new file mode 100644 index 0000000000..e5a7850595 --- /dev/null +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -0,0 +1,17 @@ +package project + +import ( + "github.com/flyteorg/flytectl/pkg/filters" +) + +//go:generate pflags Config --default-var DefaultConfig +var ( + DefaultConfig = &Config{ + Filter: filters.DefaultFilter, + } +) + +// Config +type Config struct { + Filter filters.Filters `json:"filter" pflag:","` +} diff --git a/flytectl/cmd/config/subcommand/task/config_flags.go b/flytectl/cmd/config/subcommand/task/config_flags.go new file mode 100755 index 0000000000..4c48a38e6c --- /dev/null +++ b/flytectl/cmd/config/subcommand/task/config_flags.go @@ -0,0 +1,62 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package task + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.StringVar(&(DefaultConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), DefaultConfig.ExecFile, "execution file name to be used for generating execution spec of a single task.") + cmdFlags.StringVar(&(DefaultConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "version of the task to be fetched.") + cmdFlags.BoolVar(&(DefaultConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), DefaultConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") + + cmdFlags.StringVar(&(DefaultConfig.Filter.FieldSelector), fmt.Sprintf("%v%v", prefix, "filter.field-selector"), *new(string), "Specifies the Field selector") + cmdFlags.StringVar((&DefaultConfig.Filter.SortBy), fmt.Sprintf("%v%v", prefix, "filter.sort-by"), *new(string), "Specifies which field to sort result by ") + cmdFlags.Int32Var((&DefaultConfig.Filter.Limit), fmt.Sprintf("%v%v", prefix, "filter.limit"), 100, "Specifies the limit") + cmdFlags.BoolVar((&DefaultConfig.Filter.Asc), fmt.Sprintf("%v%v", prefix, "filter.asc"), false, "Specifies the sorting order. By default flytectl sort result in descending order") + return cmdFlags +} diff --git a/flytectl/cmd/get/launchplanconfig_flags_test.go b/flytectl/cmd/config/subcommand/task/config_flags_test.go similarity index 55% rename from flytectl/cmd/get/launchplanconfig_flags_test.go rename to flytectl/cmd/config/subcommand/task/config_flags_test.go index 2b9271b278..bea2ff142e 100755 --- a/flytectl/cmd/get/launchplanconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/task/config_flags_test.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package get +package task import ( "encoding/json" @@ -14,22 +14,22 @@ import ( "github.com/stretchr/testify/assert" ) -var dereferencableKindsLaunchPlanConfig = map[reflect.Kind]struct{}{ +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, } // Checks if t is a kind that can be dereferenced to get its underlying type. -func canGetElementLaunchPlanConfig(t reflect.Kind) bool { - _, exists := dereferencableKindsLaunchPlanConfig[t] +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] return exists } // This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the // object. Otherwise, it'll just pass on the original data. -func jsonUnmarshalerHookLaunchPlanConfig(_, to reflect.Type, data interface{}) (interface{}, error) { +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || - (canGetElementLaunchPlanConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { raw, err := json.Marshal(data) if err != nil { @@ -50,7 +50,7 @@ func jsonUnmarshalerHookLaunchPlanConfig(_, to reflect.Type, data interface{}) ( return data, nil } -func decode_LaunchPlanConfig(input, result interface{}) error { +func decode_Config(input, result interface{}) error { config := &mapstructure.DecoderConfig{ TagName: "json", WeaklyTypedInput: true, @@ -58,7 +58,7 @@ func decode_LaunchPlanConfig(input, result interface{}) error { DecodeHook: mapstructure.ComposeDecodeHookFunc( mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToSliceHookFunc(","), - jsonUnmarshalerHookLaunchPlanConfig, + jsonUnmarshalerHookConfig, ), } @@ -70,7 +70,7 @@ func decode_LaunchPlanConfig(input, result interface{}) error { return decoder.Decode(input) } -func join_LaunchPlanConfig(arr interface{}, sep string) string { +func join_Config(arr interface{}, sep string) string { listValue := reflect.ValueOf(arr) strs := make([]string, 0, listValue.Len()) for i := 0; i < listValue.Len(); i++ { @@ -80,85 +80,117 @@ func join_LaunchPlanConfig(arr interface{}, sep string) string { return strings.Join(strs, sep) } -func testDecodeJson_LaunchPlanConfig(t *testing.T, val, result interface{}) { - assert.NoError(t, decode_LaunchPlanConfig(val, result)) +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) } -func testDecodeSlice_LaunchPlanConfig(t *testing.T, vStringSlice, result interface{}) { - assert.NoError(t, decode_LaunchPlanConfig(vStringSlice, result)) +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) } -func TestLaunchPlanConfig_GetPFlagSet(t *testing.T) { - val := LaunchPlanConfig{} +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} cmdFlags := val.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) } -func TestLaunchPlanConfig_SetFlags(t *testing.T) { - actual := LaunchPlanConfig{} +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) t.Run("Test_execFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("execFile", testValue) if vString, err := cmdFlags.GetString("execFile"); err == nil { - assert.Equal(t, string(launchPlanConfig.ExecFile), vString) + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.ExecFile) + } else { assert.FailNow(t, err.Error()) } }) + }) + t.Run("Test_version", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("execFile", testValue) - if vString, err := cmdFlags.GetString("execFile"); err == nil { - testDecodeJson_LaunchPlanConfig(t, fmt.Sprintf("%v", vString), &actual.ExecFile) + cmdFlags.Set("version", testValue) + if vString, err := cmdFlags.GetString("version"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Version) } else { assert.FailNow(t, err.Error()) } }) }) - t.Run("Test_version", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("version"); err == nil { - assert.Equal(t, string(launchPlanConfig.Version), vString) + t.Run("Test_latest", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("latest", testValue) + if vBool, err := cmdFlags.GetBool("latest"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Latest) + } else { assert.FailNow(t, err.Error()) } }) + }) + t.Run("Test_filter.field-selector", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("version", testValue) - if vString, err := cmdFlags.GetString("version"); err == nil { - testDecodeJson_LaunchPlanConfig(t, fmt.Sprintf("%v", vString), &actual.Version) + cmdFlags.Set("filter.field-selector", testValue) + if vString, err := cmdFlags.GetString("filter.field-selector"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.FieldSelector) } else { assert.FailNow(t, err.Error()) } }) }) - t.Run("Test_latest", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vBool, err := cmdFlags.GetBool("latest"); err == nil { - assert.Equal(t, bool(launchPlanConfig.Latest), vBool) + t.Run("Test_filter.sort-by", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.sort-by", testValue) + if vString, err := cmdFlags.GetString("filter.sort-by"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.SortBy) + } else { assert.FailNow(t, err.Error()) } }) + }) + t.Run("Test_filter.limit", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("latest", testValue) - if vBool, err := cmdFlags.GetBool("latest"); err == nil { - testDecodeJson_LaunchPlanConfig(t, fmt.Sprintf("%v", vBool), &actual.Latest) + cmdFlags.Set("filter.limit", testValue) + if vInt32, err := cmdFlags.GetInt32("filter.limit"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt32), &actual.Filter.Limit) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.asc", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.asc", testValue) + if vBool, err := cmdFlags.GetBool("filter.asc"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Filter.Asc) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/task/task_config.go b/flytectl/cmd/config/subcommand/task/task_config.go new file mode 100644 index 0000000000..241a1c1fab --- /dev/null +++ b/flytectl/cmd/config/subcommand/task/task_config.go @@ -0,0 +1,18 @@ +package task + +import "github.com/flyteorg/flytectl/pkg/filters" + +//go:generate pflags Config --default-var DefaultConfig +var ( + DefaultConfig = &Config{ + Filter: filters.DefaultFilter, + } +) + +// Config +type Config struct { + ExecFile string `json:"execFile" pflag:",execution file name to be used for generating execution spec of a single task."` + Version string `json:"version" pflag:",version of the task to be fetched."` + Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` + Filter filters.Filters `json:"filter" pflag:","` +} diff --git a/flytectl/cmd/config/subcommand/workflow/config_flags.go b/flytectl/cmd/config/subcommand/workflow/config_flags.go index 3db237e852..61f6245c05 100755 --- a/flytectl/cmd/config/subcommand/workflow/config_flags.go +++ b/flytectl/cmd/config/subcommand/workflow/config_flags.go @@ -28,6 +28,15 @@ func (Config) elemValueOrNil(v interface{}) interface{} { return v } +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (Config) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,7 +50,12 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "version of the workflow to be fetched.") - cmdFlags.BoolVar(&(DefaultConfig.Latest),fmt.Sprintf("%v%v", prefix, "latest"), DefaultConfig.Latest, " flag to indicate to fetch the latest version, version flag will be ignored in this case") + cmdFlags.StringVar(&(DefaultConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), *new(string), "version of the workflow to be fetched.") + cmdFlags.BoolVar(&(DefaultConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), *new(bool), " flag to indicate to fetch the latest version, version flag will be ignored in this case") + cmdFlags.StringVar(&(DefaultConfig.Filter.FieldSelector), fmt.Sprintf("%v%v", prefix, "filter.field-selector"), *new(string), "Specifies the Field selector") + cmdFlags.StringVar((&DefaultConfig.Filter.SortBy), fmt.Sprintf("%v%v", prefix, "filter.sort-by"), *new(string), "Specifies which field to sort result by ") + cmdFlags.Int32Var((&DefaultConfig.Filter.Limit), fmt.Sprintf("%v%v", prefix, "filter.limit"), 100, "Specifies the limit") + cmdFlags.BoolVar((&DefaultConfig.Filter.Asc), fmt.Sprintf("%v%v", prefix, "filter.asc"), false, "Specifies the sorting order. By default flytectl sort result in descending order") + return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/workflow/config_flags_test.go b/flytectl/cmd/config/subcommand/workflow/config_flags_test.go index e3d3eae412..86998d7788 100755 --- a/flytectl/cmd/config/subcommand/workflow/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/workflow/config_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_Config(t *testing.T, val, result interface{}) { assert.NoError(t, decode_Config(val, result)) } -func testDecodeSlice_Config(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_Config(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_version", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("version"); err == nil { - assert.Equal(t, string(DefaultConfig.Version), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -122,21 +114,69 @@ func TestConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_latest", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("latest", testValue) if vBool, err := cmdFlags.GetBool("latest"); err == nil { - assert.Equal(t, bool(DefaultConfig.Latest), vBool) + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Latest) + } else { assert.FailNow(t, err.Error()) } }) + }) + t.Run("Test_filter.field-selector", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("latest", testValue) - if vBool, err := cmdFlags.GetBool("latest"); err == nil { - testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Latest) + cmdFlags.Set("filter.field-selector", testValue) + if vString, err := cmdFlags.GetString("filter.field-selector"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.FieldSelector) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.sort-by", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.sort-by", testValue) + if vString, err := cmdFlags.GetString("filter.sort-by"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.SortBy) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.limit", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.limit", testValue) + if vInt32, err := cmdFlags.GetInt32("filter.limit"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt32), &actual.Filter.Limit) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_filter.asc", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.asc", testValue) + if vBool, err := cmdFlags.GetBool("filter.asc"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Filter.Asc) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/workflow/workflow_config.go b/flytectl/cmd/config/subcommand/workflow/workflow_config.go index d4890f84c2..8051d4547f 100644 --- a/flytectl/cmd/config/subcommand/workflow/workflow_config.go +++ b/flytectl/cmd/config/subcommand/workflow/workflow_config.go @@ -1,13 +1,18 @@ package workflow +import "github.com/flyteorg/flytectl/pkg/filters" + //go:generate pflags Config --default-var DefaultConfig var ( - DefaultConfig = &Config{} + DefaultConfig = &Config{ + Filter: filters.DefaultFilter, + } ) // Config commandline configuration type Config struct { - Version string `json:"version" pflag:",version of the workflow to be fetched."` - Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` + Version string `json:"version" pflag:",version of the workflow to be fetched."` + Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` + Filter filters.Filters `json:"filter" pflag:","` } diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index e77bea6f61..73c2e36b78 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -3,7 +3,10 @@ package get import ( "context" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -25,10 +28,17 @@ Retrieves execution by name within project and domain. bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r -Retrieves execution by filters +Retrieves all the executions with filters. :: + + bin/flytectl get execution -p flytesnacks -d development --filter.field-selector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" - Not yet implemented + +Retrieves all the execution with limit and sorting. +:: + + bin/flytectl get execution -p flytesnacks -d development --filter.sort-by=created_at --filter.limit=1 --filter.asc + Retrieves all the execution within project and domain in yaml format @@ -76,23 +86,17 @@ func getExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Command } executions = append(executions, execution) } else { - executionList, err := cmdCtx.AdminClient().ListExecutions(ctx, &admin.ResourceListRequest{ - Limit: 100, - Id: &admin.NamedEntityIdentifier{ - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - }, - }) + transformFilters, err := filters.BuildResourceListRequestWithName(execution.DefaultConfig.Filter, config.GetConfig().Project, config.GetConfig().Domain, "") + if err != nil { + return err + } + executionList, err := cmdCtx.AdminClient().ListExecutions(ctx, transformFilters) if err != nil { return err } executions = executionList.Executions } logger.Infof(ctx, "Retrieved %v executions", len(executions)) - err := adminPrinter.Print(config.GetConfig().MustOutputFormat(), executionColumns, + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), executionColumns, ExecutionToProtoMessages(executions)...) - if err != nil { - return err - } - return nil } diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index b78bc4f67d..6b3b077794 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -2,9 +2,13 @@ package get import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" + "github.com/flyteorg/flytectl/cmd/config/subcommand/project" + "github.com/flyteorg/flytectl/cmd/config/subcommand/task" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" cmdcore "github.com/flyteorg/flytectl/cmd/core" @@ -34,15 +38,15 @@ func CreateGetCommand() *cobra.Command { getResourcesFuncs := map[string]cmdcore.CommandEntry{ "project": {CmdFunc: getProjectsFunc, Aliases: []string{"projects"}, ProjectDomainNotRequired: true, Short: projectShort, - Long: projectLong}, + Long: projectLong, PFlagProvider: project.DefaultConfig}, "task": {CmdFunc: getTaskFunc, Aliases: []string{"tasks"}, Short: taskShort, - Long: taskLong, PFlagProvider: taskConfig}, + Long: taskLong, PFlagProvider: task.DefaultConfig}, "workflow": {CmdFunc: getWorkflowFunc, Aliases: []string{"workflows"}, Short: workflowShort, Long: workflowLong, PFlagProvider: workflow.DefaultConfig}, "launchplan": {CmdFunc: getLaunchPlanFunc, Aliases: []string{"launchplans"}, Short: launchPlanShort, - Long: launchPlanLong, PFlagProvider: launchPlanConfig}, + Long: launchPlanLong, PFlagProvider: launchplan.DefaultConfig}, "execution": {CmdFunc: getExecutionFunc, Aliases: []string{"executions"}, Short: executionShort, - Long: executionLong}, + Long: executionLong, PFlagProvider: execution.DefaultConfig}, "task-resource-attribute": {CmdFunc: getTaskResourceAttributes, Aliases: []string{"task-resource-attributes"}, Short: taskResourceAttributesShort, Long: taskResourceAttributesLong, PFlagProvider: taskresourceattribute.DefaultFetchConfig}, diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 22ff6660fe..994f0d84f2 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -3,14 +3,15 @@ package get import ( "context" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/adminutils" "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" - "github.com/golang/protobuf/proto" ) @@ -41,10 +42,22 @@ Retrieves particular version of launchplan by name within project and domain. flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --version v2 -Retrieves launchplan by filters. +Retrieves all the launch plans with filters. :: - - Not yet implemented + + bin/flytectl get launchplan -p flytesnacks -d development --filter.field-selector="name=core.basic.lp.go_greet" + +Retrieves launch plans entity search across all versions with filters. +:: + + bin/flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.field-selector="version=v1" + + +Retrieves all the launch plans with limit and sorting. +:: + + bin/flytectl get launchplan -p flytesnacks -d development --filter.sort-by=created_at --filter.limit=1 --filter.asc + Retrieves all the launchplan within project and domain in yaml format. @@ -86,18 +99,7 @@ Usage ` ) -//go:generate pflags LaunchPlanConfig --default-var launchPlanConfig -var ( - launchPlanConfig = &LaunchPlanConfig{} -) - -// LaunchPlanConfig -type LaunchPlanConfig struct { - ExecFile string `json:"execFile" pflag:",execution file name to be used for generating execution spec of a single launchplan."` - Version string `json:"version" pflag:",version of the launchplan to be fetched."` - Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` -} - +// Column structure for get specific launchplan var launchplanColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, @@ -106,6 +108,14 @@ var launchplanColumns = []printer.Column{ {Header: "Schedule", JSONPath: "$.spec.entityMetadata.schedule"}, } +// Column structure for get all launchplans +var launchplansColumns = []printer.Column{ + {Header: "Version", JSONPath: "$.id.version"}, + {Header: "Name", JSONPath: "$.id.name"}, + {Header: "Type", JSONPath: "$.id.resourceType"}, + {Header: "CreatedAt", JSONPath: "$.closure.createdAt"}, +} + func LaunchplanToProtoMessages(l []*admin.LaunchPlan) []proto.Message { messages := make([]proto.Message, 0, len(l)) for _, m := range l { @@ -133,15 +143,21 @@ func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comman } return nil } - - launchPlans, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListLaunchPlanIds, - adminutils.ListRequest{Project: project, Domain: domain}) + transformFilters, err := filters.BuildResourceListRequestWithName(launchplan.DefaultConfig.Filter, config.GetConfig().Project, config.GetConfig().Domain, "") + if err != nil { + return err + } + launchPlanList, err := cmdCtx.AdminClient().ListLaunchPlans(ctx, transformFilters) + if err != nil { + return err + } + launchPlans := launchPlanList.LaunchPlans if err != nil { return err } logger.Debugf(ctx, "Retrieved %v launch plans", len(launchPlans)) - return launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, - adminutils.NamedEntityToProtoMessage(launchPlans)...) + return launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplansColumns, + LaunchplanToProtoMessages(launchPlans)...) } // FetchLPForName fetches the launchplan give it name. @@ -150,28 +166,28 @@ func FetchLPForName(ctx context.Context, fetcher ext.AdminFetcherExtInterface, n var launchPlans []*admin.LaunchPlan var lp *admin.LaunchPlan var err error - if launchPlanConfig.Latest { - if lp, err = fetcher.FetchLPLatestVersion(ctx, name, project, domain); err != nil { + if launchplan.DefaultConfig.Latest { + if lp, err = fetcher.FetchLPLatestVersion(ctx, name, project, domain, launchplan.DefaultConfig.Filter); err != nil { return nil, err } launchPlans = append(launchPlans, lp) - } else if launchPlanConfig.Version != "" { - if lp, err = fetcher.FetchLPVersion(ctx, name, launchPlanConfig.Version, project, domain); err != nil { + } else if launchplan.DefaultConfig.Version != "" { + if lp, err = fetcher.FetchLPVersion(ctx, name, launchplan.DefaultConfig.Version, project, domain); err != nil { return nil, err } launchPlans = append(launchPlans, lp) } else { - launchPlans, err = fetcher.FetchAllVerOfLP(ctx, name, project, domain) + launchPlans, err = fetcher.FetchAllVerOfLP(ctx, name, project, domain, launchplan.DefaultConfig.Filter) if err != nil { return nil, err } } - if launchPlanConfig.ExecFile != "" { + if launchplan.DefaultConfig.ExecFile != "" { // There would be atleast one launchplan object when code reaches here and hence the length // assertion is not required. lp = launchPlans[0] // Only write the first task from the tasks object. - if err = CreateAndWriteExecConfigForWorkflow(lp, launchPlanConfig.ExecFile); err != nil { + if err = CreateAndWriteExecConfigForWorkflow(lp, launchplan.DefaultConfig.ExecFile); err != nil { return nil, err } } diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index 5933746acb..9757a35c1d 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -5,6 +5,9 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/pkg/filters" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" cmdCore "github.com/flyteorg/flytectl/cmd/core" u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext/mocks" @@ -18,6 +21,7 @@ import ( var ( resourceListRequest *admin.ResourceListRequest + resourceGetRequest *admin.ResourceListRequest objectGetRequest *admin.ObjectGetRequest namedIDRequest *admin.NamedEntityIdentifierListRequest launchPlanListResponse *admin.LaunchPlanList @@ -121,13 +125,15 @@ func getLaunchPlanSetup() { Id: &admin.NamedEntityIdentifier{ Project: projectValue, Domain: domainValue, - Name: argsLp[0], }, - SortBy: &admin.Sort{ - Key: "created_at", - Direction: admin.Sort_DESCENDING, + } + + resourceGetRequest = &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: argsLp[0], }, - Limit: 100, } launchPlanListResponse = &admin.LaunchPlanList{ @@ -147,11 +153,6 @@ func getLaunchPlanSetup() { namedIDRequest = &admin.NamedEntityIdentifierListRequest{ Project: projectValue, Domain: domainValue, - SortBy: &admin.Sort{ - Key: "name", - Direction: admin.Sort_ASCENDING, - }, - Limit: 100, } var entities []*admin.NamedEntityIdentifier @@ -170,9 +171,10 @@ func getLaunchPlanSetup() { Entities: entities, } - launchPlanConfig.Latest = false - launchPlanConfig.Version = "" - launchPlanConfig.ExecFile = "" + launchplan.DefaultConfig.Latest = false + launchplan.DefaultConfig.Version = "" + launchplan.DefaultConfig.ExecFile = "" + launchplan.DefaultConfig.Filter = filters.Filters{} } func TestGetLaunchPlanFuncWithError(t *testing.T) { @@ -180,9 +182,10 @@ func TestGetLaunchPlanFuncWithError(t *testing.T) { setup() getLaunchPlanSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) - launchPlanConfig.Latest = true + launchplan.DefaultConfig.Latest = true + launchplan.DefaultConfig.Filter = filters.Filters{} mockFetcher.OnFetchLPLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) _, err = FetchLPForName(ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -191,7 +194,8 @@ func TestGetLaunchPlanFuncWithError(t *testing.T) { setup() getLaunchPlanSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) - launchPlanConfig.Version = "v1" + launchplan.DefaultConfig.Version = "v1" + launchplan.DefaultConfig.Filter = filters.Filters{} mockFetcher.OnFetchLPVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching version")) _, err = FetchLPForName(ctx, mockFetcher, "lpName", projectValue, domainValue) @@ -201,9 +205,11 @@ func TestGetLaunchPlanFuncWithError(t *testing.T) { t.Run("failure fetching all version ", func(t *testing.T) { setup() getLaunchPlanSetup() + launchplan.DefaultConfig.Filter = filters.Filters{} + launchplan.DefaultConfig.Filter = filters.Filters{} mockFetcher := new(mocks.AdminFetcherExtInterface) mockFetcher.OnFetchAllVerOfLPMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) _, err = FetchLPForName(ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -211,23 +217,32 @@ func TestGetLaunchPlanFuncWithError(t *testing.T) { t.Run("failure fetching ", func(t *testing.T) { setup() getLaunchPlanSetup() - mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(nil, fmt.Errorf("error fetching all version")) + mockClient.OnListLaunchPlansMatch(ctx, resourceGetRequest).Return(nil, fmt.Errorf("error fetching all version")) mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(nil, fmt.Errorf("error fetching lanuch plan")) mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(nil, fmt.Errorf("error listing lanuch plan ids")) err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.NotNil(t, err) }) + + t.Run("failure fetching list", func(t *testing.T) { + setup() + getLaunchPlanSetup() + argsLp = []string{} + mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(nil, fmt.Errorf("error fetching all version")) + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + assert.NotNil(t, err) + }) } func TestGetLaunchPlanFunc(t *testing.T) { setup() getLaunchPlanSetup() - mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) + mockClient.OnListLaunchPlansMatch(ctx, resourceGetRequest).Return(launchPlanListResponse, nil) mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceListRequest) + mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceGetRequest) tearDownAndVerify(t, `[ { "id": { @@ -393,13 +408,13 @@ func TestGetLaunchPlanFunc(t *testing.T) { func TestGetLaunchPlanFuncLatest(t *testing.T) { setup() getLaunchPlanSetup() - launchPlanConfig.Latest = true - mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) + launchplan.DefaultConfig.Latest = true + launchplan.DefaultConfig.Filter = filters.Filters{} + mockClient.OnListLaunchPlansMatch(ctx, resourceGetRequest).Return(launchPlanListResponse, nil) mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) - mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceListRequest) + mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceGetRequest) tearDownAndVerify(t, `{ "id": { "name": "launchplan1", @@ -484,7 +499,7 @@ func TestGetLaunchPlanFuncLatest(t *testing.T) { func TestGetLaunchPlanWithVersion(t *testing.T) { setup() getLaunchPlanSetup() - launchPlanConfig.Version = "v2" + launchplan.DefaultConfig.Version = "v2" mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) @@ -577,23 +592,10 @@ func TestGetLaunchPlans(t *testing.T) { getLaunchPlanSetup() mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) - mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) argsLp = []string{} err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListLaunchPlanIds", ctx, namedIDRequest) - tearDownAndVerify(t, `[ - { - "project": "dummyProject", - "domain": "dummyDomain", - "name": "launchplan1" - }, - { - "project": "dummyProject", - "domain": "dummyDomain", - "name": "launchplan2" - } -]`) + tearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}}}},"numbers_count": {"var": {"type": {"simple": "INTEGER"}}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"}},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}}}},"numbers_count": {"var": {"type": {"simple": "INTEGER"}}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"}},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}}}},"numbers_count": {"var": {"type": {"simple": "INTEGER"}}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"}},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}}}},"numbers_count": {"var": {"type": {"simple": "INTEGER"}}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"}},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetLaunchPlansWithExecFile(t *testing.T) { @@ -602,10 +604,10 @@ func TestGetLaunchPlansWithExecFile(t *testing.T) { mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) - launchPlanConfig.Version = "v2" - launchPlanConfig.ExecFile = testDataFolder + "exec_file" + launchplan.DefaultConfig.Version = "v2" + launchplan.DefaultConfig.ExecFile = testDataFolder + "exec_file" err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) - os.Remove(launchPlanConfig.ExecFile) + os.Remove(launchplan.DefaultConfig.ExecFile) assert.Nil(t, err) mockClient.AssertCalled(t, "GetLaunchPlan", ctx, objectGetRequest) tearDownAndVerify(t, `{ diff --git a/flytectl/cmd/get/launchplanconfig_flags.go b/flytectl/cmd/get/launchplanconfig_flags.go deleted file mode 100755 index f4e37ea0c4..0000000000 --- a/flytectl/cmd/get/launchplanconfig_flags.go +++ /dev/null @@ -1,48 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package get - -import ( - "encoding/json" - "reflect" - - "fmt" - - "github.com/spf13/pflag" -) - -// If v is a pointer, it will get its element value or the zero value of the element type. -// If v is not a pointer, it will return it as is. -func (LaunchPlanConfig) elemValueOrNil(v interface{}) interface{} { - if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { - if reflect.ValueOf(v).IsNil() { - return reflect.Zero(t.Elem()).Interface() - } else { - return reflect.ValueOf(v).Interface() - } - } else if v == nil { - return reflect.Zero(t).Interface() - } - - return v -} - -func (LaunchPlanConfig) mustMarshalJSON(v json.Marshaler) string { - raw, err := v.MarshalJSON() - if err != nil { - panic(err) - } - - return string(raw) -} - -// GetPFlagSet will return strongly types pflags for all fields in LaunchPlanConfig and its nested types. The format of the -// flags is json-name.json-sub-name... etc. -func (cfg LaunchPlanConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("LaunchPlanConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(launchPlanConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), launchPlanConfig.ExecFile, "execution file name to be used for generating execution spec of a single launchplan.") - cmdFlags.StringVar(&(launchPlanConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), launchPlanConfig.Version, "version of the launchplan to be fetched.") - cmdFlags.BoolVar(&(launchPlanConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), launchPlanConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") - return cmdFlags -} diff --git a/flytectl/cmd/get/named_entity.go b/flytectl/cmd/get/named_entity.go deleted file mode 100644 index 617542f5ec..0000000000 --- a/flytectl/cmd/get/named_entity.go +++ /dev/null @@ -1,11 +0,0 @@ -package get - -import ( - "github.com/flyteorg/flytectl/pkg/printer" -) - -var entityColumns = []printer.Column{ - {Header: "Domain", JSONPath: "$.domain"}, - {Header: "Name", JSONPath: "$.name"}, - {Header: "Project", JSONPath: "$.project"}, -} diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 0fa2f70450..535cb16af4 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -3,6 +3,10 @@ package get import ( "context" + "github.com/flyteorg/flytectl/cmd/config/subcommand/project" + + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" @@ -26,10 +30,15 @@ Retrieves project by name bin/flytectl get project flytesnacks -Retrieves project by filters +Retrieves all the projects with filters. :: - - Not yet implemented + + bin/flytectl get project --filter.field-selector="project.name=flytesnacks" + +Retrieves all the projects with limit and sorting. +:: + + bin/flytectl get project --filter.sort-by=created_at --filter.limit=1 --filter.asc Retrieves all the projects in yaml format @@ -63,7 +72,11 @@ func ProjectToProtoMessages(l []*admin.Project) []proto.Message { func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { adminPrinter := printer.Printer{} - projects, err := cmdCtx.AdminClient().ListProjects(ctx, &admin.ProjectListRequest{}) + transformFilters, err := filters.BuildProjectListRequest(project.DefaultConfig.Filter) + if err != nil { + return err + } + projects, err := cmdCtx.AdminClient().ListProjects(ctx, transformFilters) if err != nil { return err } diff --git a/flytectl/cmd/get/project_test.go b/flytectl/cmd/get/project_test.go new file mode 100644 index 0000000000..2419ceda6c --- /dev/null +++ b/flytectl/cmd/get/project_test.go @@ -0,0 +1,83 @@ +package get + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/project" + + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/stretchr/testify/assert" +) + +var ( + resourceListRequestProject *admin.ProjectListRequest + projectListResponse *admin.Projects + argsProject []string + project1 *admin.Project +) + +func getProjectSetup() { + argsProject = []string{"flyteexample"} + resourceListRequestProject = &admin.ProjectListRequest{} + + project1 = &admin.Project{ + Id: "flyteexample", + Name: "flyteexample", + Domains: []*admin.Domain{ + { + Id: "development", + Name: "development", + }, + }, + } + + project2 := &admin.Project{ + Id: "flytesnacks", + Name: "flytesnacks", + Domains: []*admin.Domain{ + { + Id: "development", + Name: "development", + }, + }, + } + + projects := []*admin.Project{project1, project2} + + projectListResponse = &admin.Projects{ + Projects: projects, + } +} + +func TestProjectFunc(t *testing.T) { + setup() + getProjectSetup() + project.DefaultConfig.Filter = filters.Filters{} + mockClient.OnListProjectsMatch(ctx, resourceListRequestProject).Return(projectListResponse, nil) + err = getProjectsFunc(ctx, argsProject, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListProjects", ctx, resourceListRequestProject) +} + +func TestGetProjectFunc(t *testing.T) { + setup() + getProjectSetup() + project.DefaultConfig.Filter = filters.Filters{} + mockClient.OnListProjectsMatch(ctx, resourceListRequestProject).Return(projectListResponse, nil) + err = getProjectsFunc(ctx, argsProject, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListProjects", ctx, resourceListRequestProject) +} + +func TestGetProjectFuncError(t *testing.T) { + setup() + getProjectSetup() + project.DefaultConfig.Filter = filters.Filters{ + FieldSelector: "hello=", + } + mockClient.OnListProjectsMatch(ctx, resourceListRequestProject).Return(nil, fmt.Errorf("Please add a valid field selector")) + err = getProjectsFunc(ctx, argsProject, cmdCtx) + assert.NotNil(t, err) +} diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index eb40e9cb23..fd02d17b40 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -4,9 +4,10 @@ import ( "context" "github.com/flyteorg/flytectl/cmd/config" + taskConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/task" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/adminutils" "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flytectl/pkg/filters" "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" @@ -38,15 +39,24 @@ Retrieves particular version of task by name within project and domain. :: - flytectl get workflow -p flytesnacks -d development core.basic.lp.greet --version v2 + flytectl get task -p flytesnacks -d development core.basic.lp.greet --version v2 -Retrieves project by filters. +Retrieves all the tasks with filters. :: - - Not yet implemented + + bin/flytectl get task -p flytesnacks -d development --filter.field-selector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" + +Retrieve a specific task with filters. +:: + + bin/flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.field-selector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" + +Retrieves all the task with limit and sorting. +:: + + bin/flytectl get -p flytesnacks -d development task --filter.sort-by=created_at --filter.limit=1 --filter.asc Retrieves all the tasks within project and domain in yaml format. - :: bin/flytectl get task -p flytesnacks -d development -o yaml @@ -85,18 +95,6 @@ Usage ` ) -//go:generate pflags TaskConfig --default-var taskConfig -var ( - taskConfig = &TaskConfig{} -) - -// FilesConfig -type TaskConfig struct { - ExecFile string `json:"execFile" pflag:",execution file name to be used for generating execution spec of a single task."` - Version string `json:"version" pflag:",version of the task to be fetched."` - Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` -} - var taskColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, @@ -128,12 +126,18 @@ func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte logger.Debugf(ctx, "Retrieved Task", tasks) return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToProtoMessages(tasks)...) } - tasks, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListTaskIds, adminutils.ListRequest{Project: project, Domain: domain}) + transformFilters, err := filters.BuildResourceListRequestWithName(taskConfig.DefaultConfig.Filter, config.GetConfig().Project, config.GetConfig().Domain, "") + if err != nil { + return err + } + taskList, err := cmdCtx.AdminClient().ListTasks(ctx, transformFilters) if err != nil { return err } + tasks := taskList.Tasks + logger.Debugf(ctx, "Retrieved %v Task", len(tasks)) - return taskPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, adminutils.NamedEntityToProtoMessage(tasks)...) + return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToProtoMessages(tasks)...) } // FetchTaskForName Reads the task config to drive fetching the correct tasks. @@ -141,27 +145,27 @@ func FetchTaskForName(ctx context.Context, fetcher ext.AdminFetcherExtInterface, var tasks []*admin.Task var err error var task *admin.Task - if taskConfig.Latest { - if task, err = fetcher.FetchTaskLatestVersion(ctx, name, project, domain); err != nil { + if taskConfig.DefaultConfig.Latest { + if task, err = fetcher.FetchTaskLatestVersion(ctx, name, project, domain, taskConfig.DefaultConfig.Filter); err != nil { return nil, err } tasks = append(tasks, task) - } else if taskConfig.Version != "" { - if task, err = fetcher.FetchTaskVersion(ctx, name, taskConfig.Version, project, domain); err != nil { + } else if taskConfig.DefaultConfig.Version != "" { + if task, err = fetcher.FetchTaskVersion(ctx, name, taskConfig.DefaultConfig.Version, project, domain); err != nil { return nil, err } tasks = append(tasks, task) } else { - tasks, err = fetcher.FetchAllVerOfTask(ctx, name, project, domain) + tasks, err = fetcher.FetchAllVerOfTask(ctx, name, project, domain, taskConfig.DefaultConfig.Filter) if err != nil { return nil, err } } - if taskConfig.ExecFile != "" { + if taskConfig.DefaultConfig.ExecFile != "" { // There would be atleast one task object when code reaches here and hence the length assertion is not required. task = tasks[0] // Only write the first task from the tasks object. - if err = CreateAndWriteExecConfigForTask(task, taskConfig.ExecFile); err != nil { + if err = CreateAndWriteExecConfigForTask(task, taskConfig.DefaultConfig.ExecFile); err != nil { return nil, err } } diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index 7164840518..b72545487d 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -5,6 +5,10 @@ import ( "os" "testing" + taskConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/task" + + "github.com/flyteorg/flytectl/pkg/filters" + cmdCore "github.com/flyteorg/flytectl/cmd/core" u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext/mocks" @@ -17,13 +21,17 @@ import ( ) var ( - resourceListRequestTask *admin.ResourceListRequest - objectGetRequestTask *admin.ObjectGetRequest - namedIDRequestTask *admin.NamedEntityIdentifierListRequest - taskListResponse *admin.TaskList - argsTask []string - namedIdentifierListTask *admin.NamedEntityIdentifierList - task2 *admin.Task + resourceListRequestTask *admin.ResourceListRequest + resourceListFilterRequestTask *admin.ResourceListRequest + resourceListTaskRequest *admin.ResourceListRequest + resourceListLimitRequestTask *admin.ResourceListRequest + objectGetRequestTask *admin.ObjectGetRequest + namedIDRequestTask *admin.NamedEntityIdentifierListRequest + taskListResponse *admin.TaskList + taskListFilterResponse *admin.TaskList + argsTask []string + namedIdentifierListTask *admin.NamedEntityIdentifierList + task2 *admin.Task ) func getTaskSetup() { @@ -87,23 +95,44 @@ func getTaskSetup() { } tasks := []*admin.Task{task2, task1} + resourceListLimitRequestTask = &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: argsTask[0], + }, + Limit: 100, + } resourceListRequestTask = &admin.ResourceListRequest{ Id: &admin.NamedEntityIdentifier{ Project: projectValue, Domain: domainValue, Name: argsTask[0], }, - SortBy: &admin.Sort{ - Key: "created_at", - Direction: admin.Sort_DESCENDING, + } + + resourceListTaskRequest = &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, }, - Limit: 100, + } + + resourceListFilterRequestTask = &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + Name: argsTask[0], + }, + Filters: "eq(task.name,task1)+eq(task.version,v1)", } taskListResponse = &admin.TaskList{ Tasks: tasks, } - + taskListFilterResponse = &admin.TaskList{ + Tasks: []*admin.Task{task1}, + } objectGetRequestTask = &admin.ObjectGetRequest{ Id: &core.Identifier{ ResourceType: core.ResourceType_TASK, @@ -139,9 +168,9 @@ func getTaskSetup() { Entities: taskEntities, } - taskConfig.Latest = false - taskConfig.ExecFile = "" - taskConfig.Version = "" + taskConfig.DefaultConfig.Latest = false + taskConfig.DefaultConfig.ExecFile = "" + taskConfig.DefaultConfig.Version = "" } func TestGetTaskFuncWithError(t *testing.T) { @@ -149,9 +178,10 @@ func TestGetTaskFuncWithError(t *testing.T) { setup() getTaskSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) - taskConfig.Latest = true + taskConfig.DefaultConfig.Latest = true + taskConfig.DefaultConfig.Filter = filters.Filters{} mockFetcher.OnFetchTaskLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) _, err = FetchTaskForName(ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -160,9 +190,10 @@ func TestGetTaskFuncWithError(t *testing.T) { setup() getTaskSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) - taskConfig.Version = "v1" + taskConfig.DefaultConfig.Version = "v1" + taskConfig.DefaultConfig.Filter = filters.Filters{} mockFetcher.OnFetchTaskVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil, fmt.Errorf("error fetching version")) + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching version")) _, err = FetchTaskForName(ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -171,8 +202,9 @@ func TestGetTaskFuncWithError(t *testing.T) { setup() getTaskSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) + taskConfig.DefaultConfig.Filter = filters.Filters{} mockFetcher.OnFetchAllVerOfTaskMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) _, err = FetchTaskForName(ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -186,6 +218,18 @@ func TestGetTaskFuncWithError(t *testing.T) { err = getTaskFunc(ctx, argsTask, cmdCtx) assert.NotNil(t, err) }) + + t.Run("failure fetching list task", func(t *testing.T) { + setup() + getLaunchPlanSetup() + taskConfig.DefaultConfig.Filter = filters.Filters{} + argsTask = []string{} + mockClient.OnListTasksMatch(ctx, resourceListTaskRequest).Return(nil, fmt.Errorf("error fetching all version")) + mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(nil, fmt.Errorf("error fetching task")) + mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(nil, fmt.Errorf("error listing task ids")) + err = getTaskFunc(ctx, argsTask, cmdCtx) + assert.NotNil(t, err) + }) } func TestGetTaskFunc(t *testing.T) { @@ -193,7 +237,6 @@ func TestGetTaskFunc(t *testing.T) { getTaskSetup() mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) - mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "ListTasks", ctx, resourceListRequestTask) @@ -273,7 +316,7 @@ func TestGetTaskFuncLatest(t *testing.T) { mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) - taskConfig.Latest = true + taskConfig.DefaultConfig.Latest = true err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "ListTasks", ctx, resourceListRequestTask) @@ -318,7 +361,7 @@ func TestGetTaskWithVersion(t *testing.T) { mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) - taskConfig.Version = "v2" + taskConfig.DefaultConfig.Version = "v2" objectGetRequestTask.Id.ResourceType = core.ResourceType_TASK err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) @@ -363,23 +406,21 @@ func TestGetTasks(t *testing.T) { getTaskSetup() mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) - mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) - argsTask = []string{} err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListTaskIds", ctx, namedIDRequest) - tearDownAndVerify(t, `[ - { - "project": "dummyProject", - "domain": "dummyDomain", - "name": "task1" - }, - { - "project": "dummyProject", - "domain": "dummyDomain", - "name": "task2" + tearDownAndVerify(t, `[{"id": {"name": "task1","version": "v2"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}}},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}}}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}}},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}}}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) +} + +func TestGetTasksFilters(t *testing.T) { + setup() + getTaskSetup() + taskConfig.DefaultConfig.Filter = filters.Filters{ + FieldSelector: "task.name=task1,task.version=v1", } -]`) + mockClient.OnListTasksMatch(ctx, resourceListFilterRequestTask).Return(taskListFilterResponse, nil) + err = getTaskFunc(ctx, argsTask, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, `{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}}},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}}}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}`) } func TestGetTaskWithExecFile(t *testing.T) { @@ -388,10 +429,10 @@ func TestGetTaskWithExecFile(t *testing.T) { mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) - taskConfig.Version = "v2" - taskConfig.ExecFile = testDataFolder + "task_exec_file" + taskConfig.DefaultConfig.Version = "v2" + taskConfig.DefaultConfig.ExecFile = testDataFolder + "task_exec_file" err = getTaskFunc(ctx, argsTask, cmdCtx) - os.Remove(taskConfig.ExecFile) + os.Remove(taskConfig.DefaultConfig.ExecFile) assert.Nil(t, err) mockClient.AssertCalled(t, "GetTask", ctx, objectGetRequestTask) tearDownAndVerify(t, `{ diff --git a/flytectl/cmd/get/taskconfig_flags.go b/flytectl/cmd/get/taskconfig_flags.go deleted file mode 100755 index 525884466b..0000000000 --- a/flytectl/cmd/get/taskconfig_flags.go +++ /dev/null @@ -1,48 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package get - -import ( - "encoding/json" - "reflect" - - "fmt" - - "github.com/spf13/pflag" -) - -// If v is a pointer, it will get its element value or the zero value of the element type. -// If v is not a pointer, it will return it as is. -func (TaskConfig) elemValueOrNil(v interface{}) interface{} { - if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { - if reflect.ValueOf(v).IsNil() { - return reflect.Zero(t.Elem()).Interface() - } else { - return reflect.ValueOf(v).Interface() - } - } else if v == nil { - return reflect.Zero(t).Interface() - } - - return v -} - -func (TaskConfig) mustMarshalJSON(v json.Marshaler) string { - raw, err := v.MarshalJSON() - if err != nil { - panic(err) - } - - return string(raw) -} - -// GetPFlagSet will return strongly types pflags for all fields in TaskConfig and its nested types. The format of the -// flags is json-name.json-sub-name... etc. -func (cfg TaskConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("TaskResourceAttrConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(taskConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), taskConfig.ExecFile, "execution file name to be used for generating execution spec of a single task.") - cmdFlags.StringVar(&(taskConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), taskConfig.Version, "version of the task to be fetched.") - cmdFlags.BoolVar(&(taskConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), taskConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") - return cmdFlags -} diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 4de25ace61..c87cc3406b 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -3,6 +3,8 @@ package get import ( "context" + "github.com/flyteorg/flytectl/pkg/filters" + workflowconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flytestdlib/logger" @@ -10,7 +12,6 @@ import ( "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/adminutils" "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -42,10 +43,20 @@ Retrieves particular version of workflow by name within project and domain. flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet --version v2 -Retrieves workflow by filters. +Retrieves all the workflows with filters. :: - - Not yet implemented + + bin/flytectl get workflow -p flytesnacks -d development --filter.field-selector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" + +Retrieve specific workflow with filters. +:: + + bin/flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.field-selector="workflow.version=v1" + +Retrieves all the workflows with limit and sorting. +:: + + bin/flytectl get -p flytesnacks -d development workflow --filter.sort-by=created_at --filter.limit=1 --filter.asc Retrieves all the workflow within project and domain in yaml format. @@ -63,6 +74,18 @@ Usage ` ) +//go:generate pflags WorkflowConfig --default-var workflowConfig +var ( + workflowConfig = &WorkflowConfig{ + Filter: filters.DefaultFilter, + } +) + +// WorkflowConfig +type WorkflowConfig struct { + Filter filters.Filters `json:"filter" pflag:","` +} + var workflowColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, @@ -94,12 +117,18 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC return nil } - workflows, err := adminutils.GetAllNamedEntities(ctx, cmdCtx.AdminClient().ListWorkflowIds, adminutils.ListRequest{Project: config.GetConfig().Project, Domain: config.GetConfig().Domain}) + transformFilters, err := filters.BuildResourceListRequestWithName(workflowConfig.Filter, config.GetConfig().Project, config.GetConfig().Domain, "") + if err != nil { + return err + } + workflowList, err := cmdCtx.AdminClient().ListWorkflows(ctx, transformFilters) if err != nil { return err } + workflows := workflowList.Workflows + logger.Debugf(ctx, "Retrieved %v workflows", len(workflows)) - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), entityColumns, adminutils.NamedEntityToProtoMessage(workflows)...) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows)...) } // FetchWorkflowForName fetches the workflow give it name. @@ -109,7 +138,7 @@ func FetchWorkflowForName(ctx context.Context, fetcher ext.AdminFetcherExtInterf var workflow *admin.Workflow var err error if workflowconfig.DefaultConfig.Latest { - if workflow, err = fetcher.FetchWorkflowLatestVersion(ctx, name, project, domain); err != nil { + if workflow, err = fetcher.FetchWorkflowLatestVersion(ctx, name, project, domain, workflowConfig.Filter); err != nil { return nil, err } workflows = append(workflows, workflow) @@ -119,7 +148,7 @@ func FetchWorkflowForName(ctx context.Context, fetcher ext.AdminFetcherExtInterf } workflows = append(workflows, workflow) } else { - workflows, err = fetcher.FetchAllVerOfWorkflow(ctx, name, project, domain) + workflows, err = fetcher.FetchAllVerOfWorkflow(ctx, name, project, domain, workflowConfig.Filter) if err != nil { return nil, err } diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go index bb9f88d356..29f3274afc 100644 --- a/flytectl/cmd/get/workflow_test.go +++ b/flytectl/cmd/get/workflow_test.go @@ -4,17 +4,51 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext/mocks" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" + u "github.com/flyteorg/flytectl/cmd/testutils" +) + +var ( + resourceListRequestWorkflow *admin.ResourceListRequest + workflowListResponse *admin.WorkflowList ) func getWorkflowSetup() { ctx = u.Ctx mockClient = u.MockClient cmdCtx = u.CmdCtx + resourceListRequestWorkflow = &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: projectValue, + Domain: domainValue, + }, + } + + workflow1 := &admin.Workflow{ + Id: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: "workflow1", + }, + } + workflow2 := &admin.Workflow{ + Id: &core.Identifier{ + Project: projectValue, + Domain: domainValue, + Name: "workflow2", + }, + } + workflows := []*admin.Workflow{workflow1, workflow2} + workflowListResponse = &admin.WorkflowList{ + Workflows: workflows, + } workflow.DefaultConfig.Latest = false workflow.DefaultConfig.Version = "" } @@ -25,8 +59,7 @@ func TestGetWorkflowFuncWithError(t *testing.T) { getWorkflowSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) workflow.DefaultConfig.Latest = true - mockFetcher.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) + mockFetcher.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -37,7 +70,7 @@ func TestGetWorkflowFuncWithError(t *testing.T) { mockFetcher := new(mocks.AdminFetcherExtInterface) workflow.DefaultConfig.Version = "v1" mockFetcher.OnFetchWorkflowVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil, fmt.Errorf("error fetching version")) + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching version")) _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -47,7 +80,7 @@ func TestGetWorkflowFuncWithError(t *testing.T) { getWorkflowSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) mockFetcher.OnFetchAllVerOfWorkflowMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -58,8 +91,20 @@ func TestGetWorkflowFuncWithError(t *testing.T) { workflow.DefaultConfig.Latest = true args := []string{"workflowName"} u.FetcherExt.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) err = getWorkflowFunc(ctx, args, cmdCtx) assert.NotNil(t, err) }) + +} + +func TestGetWorkflowFunc(t *testing.T) { + setup() + getWorkflowSetup() + workflowConfig.Filter = filters.Filters{} + argsWorkflow := []string{} + mockClient.OnListWorkflowsMatch(ctx, resourceListRequestWorkflow).Return(workflowListResponse, nil) + err = getWorkflowFunc(ctx, argsWorkflow, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListWorkflows", ctx, resourceListRequestWorkflow) } diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 22fabc9f41..35598ae7a2 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -30,8 +30,6 @@ Options --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. -h, --help help for flytectl diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index aea876904b..5039c54e4f 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -39,8 +39,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index c1c625d72a..932addfa42 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -41,8 +41,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --file stringArray Passes the config file to load. diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index a55952f1de..984231c587 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -43,8 +43,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --file stringArray Passes the config file to load. diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index 67aff79271..b2463ade5f 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -42,8 +42,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 2d99025dfa..aac5479c3b 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -115,8 +115,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index 994e53e825..a0670e5f92 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -66,8 +66,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 6795a572e4..9cfd95edad 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -42,8 +42,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index e29fb6b821..17eae9ec87 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -78,8 +78,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 801b28f333..2524bc63e8 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -76,8 +76,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 43b59d3878..c9935a0f7f 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -80,8 +80,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 14a769ccb0..f87a174752 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -85,8 +85,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index 5431cb54f9..03b9f01b0e 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -81,8 +81,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 19ee6daf95..2d782bb68b 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -81,8 +81,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 2faf6997b8..82dcafb42f 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -42,8 +42,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index d650498f75..a713afac14 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -87,8 +87,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index e2da0f360d..0f043d8cd4 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -85,8 +85,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index 667fe0fd96..1f0593a125 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -89,8 +89,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 43e7134dba..1726008f38 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -21,10 +21,21 @@ Retrieves execution by name within project and domain. bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r -Retrieves execution by filters +Retrieves all the execution with filters. :: - - Not yet implemented + + bin/flytectl get execution -p flytesnacks -d development --filter.field-selector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" + +Retrieve specific execution with filters. +:: + + bin/flytectl get execution -p flytesnacks -d development y8n2wtuspj --filter.field-selector="execution.phase in (FAILED),execution.duration<200" + +Retrieves all the execution with limit and sorting. +:: + + bin/flytectl get execution -p flytesnacks -d development --filter.sort-by=created_at --filter.limit=1 --filter.asc + Retrieves all the execution within project and domain in yaml format @@ -50,7 +61,11 @@ Options :: - -h, --help help for execution + --filter.asc Specifies the sorting order. By default flytectl sort result in descending order + --filter.field-selector string Specifies the Field selector + --filter.limit int32 Specifies the limit (default 100) + --filter.sort-by string Specifies which field to sort results (default "created_at") + -h, --help help for execution Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -71,8 +86,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index fbbef2cace..23b06925cd 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -34,10 +34,22 @@ Retrieves particular version of launchplan by name within project and domain. flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --version v2 -Retrieves launchplan by filters. +Retrieves all the launch plans with filters. :: - - Not yet implemented + + bin/flytectl get launchplan -p flytesnacks -d development --filter.field-selector="name=core.basic.lp.go_greet" + +Retrieves specific launch plans with filters. +:: + + bin/flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.field-selector="version=v1" + + +Retrieves all the launch plans with limit and sorting. +:: + + bin/flytectl get launchplan -p flytesnacks -d development --filter.sort-by=created_at --filter.limit=1 --filter.asc + Retrieves all the launchplan within project and domain in yaml format. @@ -87,10 +99,14 @@ Options :: - --execFile string execution file name to be used for generating execution spec of a single launchplan. - -h, --help help for launchplan - --latest flag to indicate to fetch the latest version, version flag will be ignored in this case - --version string version of the launchplan to be fetched. + --execFile string execution file name to be used for generating execution spec of a single launchplan. + --filter.asc Specifies the sorting order. By default flytectl sort result in descending order + --filter.field-selector string Specifies the Field selector + --filter.limit int32 Specifies the limit (default 100) + --filter.sort-by string Specifies which field to sort results (default "created_at") + -h, --help help for launchplan + --latest flag to indicate to fetch the latest version, version flag will be ignored in this case + --version string version of the launchplan to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -111,8 +127,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index 25fbfbf288..fcc8e5c9be 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -109,8 +109,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 9d9eec43cf..ba86d53cd0 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -21,10 +21,15 @@ Retrieves project by name bin/flytectl get project flytesnacks -Retrieves project by filters +Retrieves all the projects with filters. :: - - Not yet implemented + + bin/flytectl get project --filter.field-selector="project.name=flytesnacks" + +Retrieves all the projects with limit and sorting. +:: + + bin/flytectl get project --filter.sort-by=created_at --filter.limit=1 --filter.asc Retrieves all the projects in yaml format @@ -50,7 +55,11 @@ Options :: - -h, --help help for project + --filter.asc Specifies the sorting order. By default flytectl sort result in descending order + --filter.field-selector string Specifies the Field selector + --filter.limit int32 Specifies the limit (default 100) + --filter.sort-by string Specifies which field to sort results (default "created_at") + -h, --help help for project Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -71,8 +80,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 613da8d7b3..dfd44d3c32 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -91,8 +91,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index e7c2c75968..f49501561d 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -31,15 +31,24 @@ Retrieves particular version of task by name within project and domain. :: - flytectl get workflow -p flytesnacks -d development core.basic.lp.greet --version v2 + flytectl get task -p flytesnacks -d development core.basic.lp.greet --version v2 -Retrieves project by filters. +Retrieves all the tasks with filters. :: - - Not yet implemented + + bin/flytectl get task -p flytesnacks -d development --filter.field-selector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" + +Retrieve a specific task with filters. +:: + + bin/flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.field-selector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" + +Retrieves all the task with limit and sorting. +:: + + bin/flytectl get -p flytesnacks -d development task --filter.sort-by=created_at --filter.limit=1 --filter.asc Retrieves all the tasks within project and domain in yaml format. - :: bin/flytectl get task -p flytesnacks -d development -o yaml @@ -86,10 +95,14 @@ Options :: - --execFile string execution file name to be used for generating execution spec of a single task. - -h, --help help for task - --latest flag to indicate to fetch the latest version, version flag will be ignored in this case - --version string version of the task to be fetched. + --execFile string execution file name to be used for generating execution spec of a single task. + --filter.asc Specifies the sorting order. By default flytectl sort result in descending order + --filter.field-selector string Specifies the Field selector + --filter.limit int32 Specifies the limit (default 100) + --filter.sort-by string Specifies which field to sort results (default "created_at") + -h, --help help for task + --latest flag to indicate to fetch the latest version, version flag will be ignored in this case + --version string version of the task to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -110,8 +123,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index e951129aa5..846afb9682 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -33,10 +33,20 @@ Retrieves particular version of workflow by name within project and domain. flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet --version v2 -Retrieves workflow by filters. +Retrieves all the workflows with filters. :: - - Not yet implemented + + bin/flytectl get workflow -p flytesnacks -d development --filter.field-selector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" + +Retrieve specific workflow with filters. +:: + + bin/flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.field-selector="workflow.version=v1" + +Retrieves all the workflows with limit and sorting. +:: + + bin/flytectl get -p flytesnacks -d development workflow --filter.sort-by=created_at --filter.limit=1 --filter.asc Retrieves all the workflow within project and domain in yaml format. @@ -62,9 +72,11 @@ Options :: - -h, --help help for workflow - --latest flag to indicate to fetch the latest version, version flag will be ignored in this case - --version string version of the workflow to be fetched. + --filter.asc Specifies the sorting order. By default flytectl sort result in descending order + --filter.field-selector string Specifies the Field selector + --filter.limit int32 Specifies the limit (default 100) + --filter.sort-by string Specifies which field to sort results (default "created_at") + -h, --help help for workflow Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -85,8 +97,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 76ba262247..98d8c02b4a 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -42,8 +42,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 39f7601c8d..8d79a9df13 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -109,8 +109,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 43dfbae8df..17ba39721e 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -44,8 +44,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 3bc41ae646..b8000b4d3c 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -83,8 +83,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 8f22a1f327..2431eedd01 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -76,8 +76,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 19d10aa050..a32e711f12 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -87,8 +87,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index f0e7838f61..aeb20a9f16 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -61,8 +61,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index b4cf04600f..657efbfb94 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -89,8 +89,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index e7954f31dd..742db693b9 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -86,8 +86,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 496a79779e..d4ae5db9c9 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -89,8 +89,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst index 9d4c95142b..26d9237800 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -61,8 +61,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst index 5899dfa220..b79c81977d 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -61,8 +61,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 4ba5a821ef..7d125dcfb9 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -46,8 +46,6 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --adminutils.batchSize int Maximum number of records to retrieve per call. (default 100) - --adminutils.maxRecords int Maximum number of records to retrieve. (default 500) --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") diff --git a/flytectl/pkg/ext/deleter_test.go b/flytectl/pkg/ext/deleter_test.go new file mode 100644 index 0000000000..17666b021d --- /dev/null +++ b/flytectl/pkg/ext/deleter_test.go @@ -0,0 +1,17 @@ +package ext + +import ( + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/stretchr/testify/assert" +) + +var deleterFetcherClient *AdminDeleterExtClient + +func TestAdminDeleterExtClient_AdminServiceClient(t *testing.T) { + adminClient = new(mocks.AdminServiceClient) + deleterFetcherClient = nil + client := deleterFetcherClient.AdminServiceClient() + assert.Nil(t, client) +} diff --git a/flytectl/pkg/ext/fetcher.go b/flytectl/pkg/ext/fetcher.go index 8601ec7e71..ecc3b6371c 100644 --- a/flytectl/pkg/ext/fetcher.go +++ b/flytectl/pkg/ext/fetcher.go @@ -3,6 +3,8 @@ package ext import ( "context" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" ) @@ -18,28 +20,28 @@ type AdminFetcherExtInterface interface { FetchExecution(ctx context.Context, name, project, domain string) (*admin.Execution, error) // FetchAllVerOfLP fetches all versions of launch plan in a project, domain - FetchAllVerOfLP(ctx context.Context, lpName, project, domain string) ([]*admin.LaunchPlan, error) + FetchAllVerOfLP(ctx context.Context, lpName, project, domain string, filter filters.Filters) ([]*admin.LaunchPlan, error) // FetchLPLatestVersion fetches latest version of launch plan in a project, domain - FetchLPLatestVersion(ctx context.Context, name, project, domain string) (*admin.LaunchPlan, error) + FetchLPLatestVersion(ctx context.Context, name, project, domain string, filter filters.Filters) (*admin.LaunchPlan, error) // FetchLPVersion fetches particular version of launch plan in a project, domain FetchLPVersion(ctx context.Context, name, version, project, domain string) (*admin.LaunchPlan, error) // FetchAllVerOfTask fetches all versions of task in a project, domain - FetchAllVerOfTask(ctx context.Context, name, project, domain string) ([]*admin.Task, error) + FetchAllVerOfTask(ctx context.Context, name, project, domain string, filter filters.Filters) ([]*admin.Task, error) // FetchTaskLatestVersion fetches latest version of task in a project, domain - FetchTaskLatestVersion(ctx context.Context, name, project, domain string) (*admin.Task, error) + FetchTaskLatestVersion(ctx context.Context, name, project, domain string, filter filters.Filters) (*admin.Task, error) // FetchTaskVersion fetches particular version of task in a project, domain FetchTaskVersion(ctx context.Context, name, version, project, domain string) (*admin.Task, error) // FetchAllVerOfWorkflow fetches all versions of task in a project, domain - FetchAllVerOfWorkflow(ctx context.Context, name, project, domain string) ([]*admin.Workflow, error) + FetchAllVerOfWorkflow(ctx context.Context, name, project, domain string, filter filters.Filters) ([]*admin.Workflow, error) // FetchWorkflowLatestVersion fetches latest version of workflow in a project, domain - FetchWorkflowLatestVersion(ctx context.Context, name, project, domain string) (*admin.Workflow, error) + FetchWorkflowLatestVersion(ctx context.Context, name, project, domain string, filter filters.Filters) (*admin.Workflow, error) // FetchWorkflowVersion fetches particular version of workflow in a project, domain FetchWorkflowVersion(ctx context.Context, name, version, project, domain string) (*admin.Workflow, error) diff --git a/flytectl/pkg/ext/fetcher_test.go b/flytectl/pkg/ext/fetcher_test.go new file mode 100644 index 0000000000..f0ddffebd4 --- /dev/null +++ b/flytectl/pkg/ext/fetcher_test.go @@ -0,0 +1,17 @@ +package ext + +import ( + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/stretchr/testify/assert" +) + +var fetcherClient *AdminFetcherExtClient + +func TestAdminFetcherExtClient_AdminServiceClient(t *testing.T) { + adminClient = new(mocks.AdminServiceClient) + fetcherClient = nil + client := fetcherClient.AdminServiceClient() + assert.Nil(t, client) +} diff --git a/flytectl/pkg/ext/launch_plan_fetcher.go b/flytectl/pkg/ext/launch_plan_fetcher.go index e7aa21b124..ad24b3abb5 100644 --- a/flytectl/pkg/ext/launch_plan_fetcher.go +++ b/flytectl/pkg/ext/launch_plan_fetcher.go @@ -4,24 +4,19 @@ import ( "context" "fmt" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) // FetchAllVerOfLP fetches all the versions for give launch plan name -func (a *AdminFetcherExtClient) FetchAllVerOfLP(ctx context.Context, lpName, project, domain string) ([]*admin.LaunchPlan, error) { - tList, err := a.AdminServiceClient().ListLaunchPlans(ctx, &admin.ResourceListRequest{ - Id: &admin.NamedEntityIdentifier{ - Project: project, - Domain: domain, - Name: lpName, - }, - SortBy: &admin.Sort{ - Key: "created_at", - Direction: admin.Sort_DESCENDING, - }, - Limit: 100, - }) +func (a *AdminFetcherExtClient) FetchAllVerOfLP(ctx context.Context, lpName, project, domain string, filter filters.Filters) ([]*admin.LaunchPlan, error) { + transformFilters, err := filters.BuildResourceListRequestWithName(filter, project, domain, lpName) + if err != nil { + return nil, err + } + tList, err := a.AdminServiceClient().ListLaunchPlans(ctx, transformFilters) if err != nil { return nil, err } @@ -32,9 +27,9 @@ func (a *AdminFetcherExtClient) FetchAllVerOfLP(ctx context.Context, lpName, pro } // FetchLPLatestVersion fetches latest version for give launch plan name -func (a *AdminFetcherExtClient) FetchLPLatestVersion(ctx context.Context, name, project, domain string) (*admin.LaunchPlan, error) { +func (a *AdminFetcherExtClient) FetchLPLatestVersion(ctx context.Context, name, project, domain string, filter filters.Filters) (*admin.LaunchPlan, error) { // Fetch the latest version of the task. - lpVersions, err := a.FetchAllVerOfLP(ctx, name, project, domain) + lpVersions, err := a.FetchAllVerOfLP(ctx, name, project, domain, filter) if err != nil { return nil, err } diff --git a/flytectl/pkg/ext/launch_plan_fetcher_test.go b/flytectl/pkg/ext/launch_plan_fetcher_test.go index 7b40fbde89..39d0121c93 100644 --- a/flytectl/pkg/ext/launch_plan_fetcher_test.go +++ b/flytectl/pkg/ext/launch_plan_fetcher_test.go @@ -5,6 +5,8 @@ import ( "fmt" "testing" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -16,6 +18,8 @@ import ( var ( launchPlanListResponse *admin.LaunchPlanList + lpFilters = filters.Filters{} + launchPlan1 *admin.LaunchPlan ) func getLaunchPlanFetcherSetup() { @@ -71,7 +75,7 @@ func getLaunchPlanFetcherSetup() { }, }, } - launchPlan1 := &admin.LaunchPlan{ + launchPlan1 = &admin.LaunchPlan{ Id: &core.Identifier{ Name: "launchplan1", Version: "v1", @@ -116,29 +120,45 @@ func getLaunchPlanFetcherSetup() { func TestFetchAllVerOfLP(t *testing.T) { getLaunchPlanFetcherSetup() adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(launchPlanListResponse, nil) - _, err := adminFetcherExt.FetchAllVerOfLP(ctx, "lpName", "project", "domain") + _, err := adminFetcherExt.FetchAllVerOfLP(ctx, "lpName", "project", "domain", lpFilters) + assert.Nil(t, err) +} + +func TestFetchLPVersion(t *testing.T) { + getLaunchPlanFetcherSetup() + adminClient.OnGetLaunchPlanMatch(mock.Anything, mock.Anything).Return(launchPlan1, nil) + _, err := adminFetcherExt.FetchLPVersion(ctx, "launchplan1", "v1", "project", "domain") assert.Nil(t, err) } func TestFetchAllVerOfLPError(t *testing.T) { getLaunchPlanFetcherSetup() adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) - _, err := adminFetcherExt.FetchAllVerOfLP(ctx, "lpName", "project", "domain") + _, err := adminFetcherExt.FetchAllVerOfLP(ctx, "lpName", "project", "domain", lpFilters) assert.Equal(t, fmt.Errorf("failed"), err) } +func TestFetchAllVerOfLPFilterError(t *testing.T) { + getLaunchPlanFetcherSetup() + lpFilters.FieldSelector = "hello=" + adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("Please add a valid field selector")) + _, err := adminFetcherExt.FetchAllVerOfLP(ctx, "lpName", "project", "domain", lpFilters) + assert.Equal(t, fmt.Errorf("Please add a valid field selector"), err) +} + func TestFetchAllVerOfLPEmptyResponse(t *testing.T) { launchPlanListResponse := &admin.LaunchPlanList{} getLaunchPlanFetcherSetup() + lpFilters.FieldSelector = "" adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(launchPlanListResponse, nil) - _, err := adminFetcherExt.FetchAllVerOfLP(ctx, "lpName", "project", "domain") + _, err := adminFetcherExt.FetchAllVerOfLP(ctx, "lpName", "project", "domain", lpFilters) assert.Equal(t, fmt.Errorf("no launchplans retrieved for lpName"), err) } func TestFetchLPLatestVersion(t *testing.T) { getLaunchPlanFetcherSetup() adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(launchPlanListResponse, nil) - _, err := adminFetcherExt.FetchLPLatestVersion(ctx, "lpName", "project", "domain") + _, err := adminFetcherExt.FetchLPLatestVersion(ctx, "lpName", "project", "domain", lpFilters) assert.Nil(t, err) } @@ -146,6 +166,6 @@ func TestFetchLPLatestVersionError(t *testing.T) { launchPlanListResponse := &admin.LaunchPlanList{} getLaunchPlanFetcherSetup() adminClient.OnListLaunchPlansMatch(mock.Anything, mock.Anything).Return(launchPlanListResponse, nil) - _, err := adminFetcherExt.FetchLPLatestVersion(ctx, "lpName", "project", "domain") + _, err := adminFetcherExt.FetchLPLatestVersion(ctx, "lpName", "project", "domain", lpFilters) assert.Equal(t, fmt.Errorf("no launchplans retrieved for lpName"), err) } diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index 902121ef88..8ae7cde8f8 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -7,6 +7,8 @@ import ( admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + filters "github.com/flyteorg/flytectl/pkg/filters" + mock "github.com/stretchr/testify/mock" service "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" @@ -59,8 +61,8 @@ func (_m AdminFetcherExtInterface_FetchAllVerOfLP) Return(_a0 []*admin.LaunchPla return &AdminFetcherExtInterface_FetchAllVerOfLP{Call: _m.Call.Return(_a0, _a1)} } -func (_m *AdminFetcherExtInterface) OnFetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string) *AdminFetcherExtInterface_FetchAllVerOfLP { - c := _m.On("FetchAllVerOfLP", ctx, lpName, project, domain) +func (_m *AdminFetcherExtInterface) OnFetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchAllVerOfLP { + c := _m.On("FetchAllVerOfLP", ctx, lpName, project, domain, filter) return &AdminFetcherExtInterface_FetchAllVerOfLP{Call: c} } @@ -69,13 +71,13 @@ func (_m *AdminFetcherExtInterface) OnFetchAllVerOfLPMatch(matchers ...interface return &AdminFetcherExtInterface_FetchAllVerOfLP{Call: c} } -// FetchAllVerOfLP provides a mock function with given fields: ctx, lpName, project, domain -func (_m *AdminFetcherExtInterface) FetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string) ([]*admin.LaunchPlan, error) { - ret := _m.Called(ctx, lpName, project, domain) +// FetchAllVerOfLP provides a mock function with given fields: ctx, lpName, project, domain, filter +func (_m *AdminFetcherExtInterface) FetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string, filter filters.Filters) ([]*admin.LaunchPlan, error) { + ret := _m.Called(ctx, lpName, project, domain, filter) var r0 []*admin.LaunchPlan - if rf, ok := ret.Get(0).(func(context.Context, string, string, string) []*admin.LaunchPlan); ok { - r0 = rf(ctx, lpName, project, domain) + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, filters.Filters) []*admin.LaunchPlan); ok { + r0 = rf(ctx, lpName, project, domain, filter) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*admin.LaunchPlan) @@ -83,8 +85,8 @@ func (_m *AdminFetcherExtInterface) FetchAllVerOfLP(ctx context.Context, lpName } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { - r1 = rf(ctx, lpName, project, domain) + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, filters.Filters) error); ok { + r1 = rf(ctx, lpName, project, domain, filter) } else { r1 = ret.Error(1) } @@ -100,8 +102,8 @@ func (_m AdminFetcherExtInterface_FetchAllVerOfTask) Return(_a0 []*admin.Task, _ return &AdminFetcherExtInterface_FetchAllVerOfTask{Call: _m.Call.Return(_a0, _a1)} } -func (_m *AdminFetcherExtInterface) OnFetchAllVerOfTask(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchAllVerOfTask { - c := _m.On("FetchAllVerOfTask", ctx, name, project, domain) +func (_m *AdminFetcherExtInterface) OnFetchAllVerOfTask(ctx context.Context, name string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchAllVerOfTask { + c := _m.On("FetchAllVerOfTask", ctx, name, project, domain, filter) return &AdminFetcherExtInterface_FetchAllVerOfTask{Call: c} } @@ -110,13 +112,13 @@ func (_m *AdminFetcherExtInterface) OnFetchAllVerOfTaskMatch(matchers ...interfa return &AdminFetcherExtInterface_FetchAllVerOfTask{Call: c} } -// FetchAllVerOfTask provides a mock function with given fields: ctx, name, project, domain -func (_m *AdminFetcherExtInterface) FetchAllVerOfTask(ctx context.Context, name string, project string, domain string) ([]*admin.Task, error) { - ret := _m.Called(ctx, name, project, domain) +// FetchAllVerOfTask provides a mock function with given fields: ctx, name, project, domain, filter +func (_m *AdminFetcherExtInterface) FetchAllVerOfTask(ctx context.Context, name string, project string, domain string, filter filters.Filters) ([]*admin.Task, error) { + ret := _m.Called(ctx, name, project, domain, filter) var r0 []*admin.Task - if rf, ok := ret.Get(0).(func(context.Context, string, string, string) []*admin.Task); ok { - r0 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, filters.Filters) []*admin.Task); ok { + r0 = rf(ctx, name, project, domain, filter) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*admin.Task) @@ -124,8 +126,8 @@ func (_m *AdminFetcherExtInterface) FetchAllVerOfTask(ctx context.Context, name } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { - r1 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, filters.Filters) error); ok { + r1 = rf(ctx, name, project, domain, filter) } else { r1 = ret.Error(1) } @@ -141,8 +143,8 @@ func (_m AdminFetcherExtInterface_FetchAllVerOfWorkflow) Return(_a0 []*admin.Wor return &AdminFetcherExtInterface_FetchAllVerOfWorkflow{Call: _m.Call.Return(_a0, _a1)} } -func (_m *AdminFetcherExtInterface) OnFetchAllVerOfWorkflow(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchAllVerOfWorkflow { - c := _m.On("FetchAllVerOfWorkflow", ctx, name, project, domain) +func (_m *AdminFetcherExtInterface) OnFetchAllVerOfWorkflow(ctx context.Context, name string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchAllVerOfWorkflow { + c := _m.On("FetchAllVerOfWorkflow", ctx, name, project, domain, filter) return &AdminFetcherExtInterface_FetchAllVerOfWorkflow{Call: c} } @@ -151,13 +153,13 @@ func (_m *AdminFetcherExtInterface) OnFetchAllVerOfWorkflowMatch(matchers ...int return &AdminFetcherExtInterface_FetchAllVerOfWorkflow{Call: c} } -// FetchAllVerOfWorkflow provides a mock function with given fields: ctx, name, project, domain -func (_m *AdminFetcherExtInterface) FetchAllVerOfWorkflow(ctx context.Context, name string, project string, domain string) ([]*admin.Workflow, error) { - ret := _m.Called(ctx, name, project, domain) +// FetchAllVerOfWorkflow provides a mock function with given fields: ctx, name, project, domain, filter +func (_m *AdminFetcherExtInterface) FetchAllVerOfWorkflow(ctx context.Context, name string, project string, domain string, filter filters.Filters) ([]*admin.Workflow, error) { + ret := _m.Called(ctx, name, project, domain, filter) var r0 []*admin.Workflow - if rf, ok := ret.Get(0).(func(context.Context, string, string, string) []*admin.Workflow); ok { - r0 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, filters.Filters) []*admin.Workflow); ok { + r0 = rf(ctx, name, project, domain, filter) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*admin.Workflow) @@ -165,8 +167,8 @@ func (_m *AdminFetcherExtInterface) FetchAllVerOfWorkflow(ctx context.Context, n } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { - r1 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, filters.Filters) error); ok { + r1 = rf(ctx, name, project, domain, filter) } else { r1 = ret.Error(1) } @@ -223,8 +225,8 @@ func (_m AdminFetcherExtInterface_FetchLPLatestVersion) Return(_a0 *admin.Launch return &AdminFetcherExtInterface_FetchLPLatestVersion{Call: _m.Call.Return(_a0, _a1)} } -func (_m *AdminFetcherExtInterface) OnFetchLPLatestVersion(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchLPLatestVersion { - c := _m.On("FetchLPLatestVersion", ctx, name, project, domain) +func (_m *AdminFetcherExtInterface) OnFetchLPLatestVersion(ctx context.Context, name string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchLPLatestVersion { + c := _m.On("FetchLPLatestVersion", ctx, name, project, domain, filter) return &AdminFetcherExtInterface_FetchLPLatestVersion{Call: c} } @@ -233,13 +235,13 @@ func (_m *AdminFetcherExtInterface) OnFetchLPLatestVersionMatch(matchers ...inte return &AdminFetcherExtInterface_FetchLPLatestVersion{Call: c} } -// FetchLPLatestVersion provides a mock function with given fields: ctx, name, project, domain -func (_m *AdminFetcherExtInterface) FetchLPLatestVersion(ctx context.Context, name string, project string, domain string) (*admin.LaunchPlan, error) { - ret := _m.Called(ctx, name, project, domain) +// FetchLPLatestVersion provides a mock function with given fields: ctx, name, project, domain, filter +func (_m *AdminFetcherExtInterface) FetchLPLatestVersion(ctx context.Context, name string, project string, domain string, filter filters.Filters) (*admin.LaunchPlan, error) { + ret := _m.Called(ctx, name, project, domain, filter) var r0 *admin.LaunchPlan - if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.LaunchPlan); ok { - r0 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, filters.Filters) *admin.LaunchPlan); ok { + r0 = rf(ctx, name, project, domain, filter) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*admin.LaunchPlan) @@ -247,8 +249,8 @@ func (_m *AdminFetcherExtInterface) FetchLPLatestVersion(ctx context.Context, na } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { - r1 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, filters.Filters) error); ok { + r1 = rf(ctx, name, project, domain, filter) } else { r1 = ret.Error(1) } @@ -346,8 +348,8 @@ func (_m AdminFetcherExtInterface_FetchTaskLatestVersion) Return(_a0 *admin.Task return &AdminFetcherExtInterface_FetchTaskLatestVersion{Call: _m.Call.Return(_a0, _a1)} } -func (_m *AdminFetcherExtInterface) OnFetchTaskLatestVersion(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchTaskLatestVersion { - c := _m.On("FetchTaskLatestVersion", ctx, name, project, domain) +func (_m *AdminFetcherExtInterface) OnFetchTaskLatestVersion(ctx context.Context, name string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchTaskLatestVersion { + c := _m.On("FetchTaskLatestVersion", ctx, name, project, domain, filter) return &AdminFetcherExtInterface_FetchTaskLatestVersion{Call: c} } @@ -356,13 +358,13 @@ func (_m *AdminFetcherExtInterface) OnFetchTaskLatestVersionMatch(matchers ...in return &AdminFetcherExtInterface_FetchTaskLatestVersion{Call: c} } -// FetchTaskLatestVersion provides a mock function with given fields: ctx, name, project, domain -func (_m *AdminFetcherExtInterface) FetchTaskLatestVersion(ctx context.Context, name string, project string, domain string) (*admin.Task, error) { - ret := _m.Called(ctx, name, project, domain) +// FetchTaskLatestVersion provides a mock function with given fields: ctx, name, project, domain, filter +func (_m *AdminFetcherExtInterface) FetchTaskLatestVersion(ctx context.Context, name string, project string, domain string, filter filters.Filters) (*admin.Task, error) { + ret := _m.Called(ctx, name, project, domain, filter) var r0 *admin.Task - if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.Task); ok { - r0 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, filters.Filters) *admin.Task); ok { + r0 = rf(ctx, name, project, domain, filter) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*admin.Task) @@ -370,8 +372,8 @@ func (_m *AdminFetcherExtInterface) FetchTaskLatestVersion(ctx context.Context, } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { - r1 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, filters.Filters) error); ok { + r1 = rf(ctx, name, project, domain, filter) } else { r1 = ret.Error(1) } @@ -469,8 +471,8 @@ func (_m AdminFetcherExtInterface_FetchWorkflowLatestVersion) Return(_a0 *admin. return &AdminFetcherExtInterface_FetchWorkflowLatestVersion{Call: _m.Call.Return(_a0, _a1)} } -func (_m *AdminFetcherExtInterface) OnFetchWorkflowLatestVersion(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchWorkflowLatestVersion { - c := _m.On("FetchWorkflowLatestVersion", ctx, name, project, domain) +func (_m *AdminFetcherExtInterface) OnFetchWorkflowLatestVersion(ctx context.Context, name string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchWorkflowLatestVersion { + c := _m.On("FetchWorkflowLatestVersion", ctx, name, project, domain, filter) return &AdminFetcherExtInterface_FetchWorkflowLatestVersion{Call: c} } @@ -479,13 +481,13 @@ func (_m *AdminFetcherExtInterface) OnFetchWorkflowLatestVersionMatch(matchers . return &AdminFetcherExtInterface_FetchWorkflowLatestVersion{Call: c} } -// FetchWorkflowLatestVersion provides a mock function with given fields: ctx, name, project, domain -func (_m *AdminFetcherExtInterface) FetchWorkflowLatestVersion(ctx context.Context, name string, project string, domain string) (*admin.Workflow, error) { - ret := _m.Called(ctx, name, project, domain) +// FetchWorkflowLatestVersion provides a mock function with given fields: ctx, name, project, domain, filter +func (_m *AdminFetcherExtInterface) FetchWorkflowLatestVersion(ctx context.Context, name string, project string, domain string, filter filters.Filters) (*admin.Workflow, error) { + ret := _m.Called(ctx, name, project, domain, filter) var r0 *admin.Workflow - if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.Workflow); ok { - r0 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, filters.Filters) *admin.Workflow); ok { + r0 = rf(ctx, name, project, domain, filter) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*admin.Workflow) @@ -493,8 +495,8 @@ func (_m *AdminFetcherExtInterface) FetchWorkflowLatestVersion(ctx context.Conte } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { - r1 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, filters.Filters) error); ok { + r1 = rf(ctx, name, project, domain, filter) } else { r1 = ret.Error(1) } diff --git a/flytectl/pkg/ext/task_fetcher.go b/flytectl/pkg/ext/task_fetcher.go index 96984549a2..2c3366a5c0 100644 --- a/flytectl/pkg/ext/task_fetcher.go +++ b/flytectl/pkg/ext/task_fetcher.go @@ -4,23 +4,18 @@ import ( "context" "fmt" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) -func (a *AdminFetcherExtClient) FetchAllVerOfTask(ctx context.Context, name, project, domain string) ([]*admin.Task, error) { - tList, err := a.AdminServiceClient().ListTasks(ctx, &admin.ResourceListRequest{ - Id: &admin.NamedEntityIdentifier{ - Project: project, - Domain: domain, - Name: name, - }, - SortBy: &admin.Sort{ - Key: "created_at", - Direction: admin.Sort_DESCENDING, - }, - Limit: 100, - }) +func (a *AdminFetcherExtClient) FetchAllVerOfTask(ctx context.Context, name, project, domain string, filter filters.Filters) ([]*admin.Task, error) { + transformFilters, err := filters.BuildResourceListRequestWithName(filter, project, domain, name) + if err != nil { + return nil, err + } + tList, err := a.AdminServiceClient().ListTasks(ctx, transformFilters) if err != nil { return nil, err } @@ -30,12 +25,12 @@ func (a *AdminFetcherExtClient) FetchAllVerOfTask(ctx context.Context, name, pro return tList.Tasks, nil } -func (a *AdminFetcherExtClient) FetchTaskLatestVersion(ctx context.Context, name, project, domain string) (*admin.Task, error) { +func (a *AdminFetcherExtClient) FetchTaskLatestVersion(ctx context.Context, name, project, domain string, filter filters.Filters) (*admin.Task, error) { var t *admin.Task var err error // Fetch the latest version of the task. var taskVersions []*admin.Task - taskVersions, err = a.FetchAllVerOfTask(ctx, name, project, domain) + taskVersions, err = a.FetchAllVerOfTask(ctx, name, project, domain, filter) if err != nil { return nil, err } diff --git a/flytectl/pkg/ext/task_fetcher_test.go b/flytectl/pkg/ext/task_fetcher_test.go index 7f7476b2c0..0bfc9ef8dd 100644 --- a/flytectl/pkg/ext/task_fetcher_test.go +++ b/flytectl/pkg/ext/task_fetcher_test.go @@ -5,6 +5,8 @@ import ( "fmt" "testing" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -19,6 +21,8 @@ var ( adminClient *mocks.AdminServiceClient ctx context.Context taskListResponse *admin.TaskList + taskFilter = filters.Filters{} + task1 *admin.Task ) func getTaskFetcherSetup() { @@ -90,29 +94,49 @@ func getTaskFetcherSetup() { func TestFetchAllVerOfTask(t *testing.T) { getTaskFetcherSetup() adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(taskListResponse, nil) - _, err := adminFetcherExt.FetchAllVerOfTask(ctx, "taskName", "project", "domain") + _, err := adminFetcherExt.FetchAllVerOfTask(ctx, "taskName", "project", "domain", taskFilter) + assert.Nil(t, err) +} + +func TestFetchTaskVersion(t *testing.T) { + getTaskFetcherSetup() + adminClient.OnGetTaskMatch(mock.Anything, mock.Anything).Return(task1, nil) + _, err := adminFetcherExt.FetchTaskVersion(ctx, "task1", "v1", "project", "domain") assert.Nil(t, err) } func TestFetchAllVerOfTaskError(t *testing.T) { getTaskFetcherSetup() adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) - _, err := adminFetcherExt.FetchAllVerOfTask(ctx, "taskName", "project", "domain") + _, err := adminFetcherExt.FetchAllVerOfTask(ctx, "taskName", "project", "domain", taskFilter) assert.Equal(t, fmt.Errorf("failed"), err) } +func TestFetchAllVerOfTaskFilterError(t *testing.T) { + getTaskFetcherSetup() + taskFilter = filters.Filters{ + FieldSelector: "hello=", + } + adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchAllVerOfTask(ctx, "taskName", "project", "domain", taskFilter) + assert.NotNil(t, err) +} + func TestFetchAllVerOfTaskEmptyResponse(t *testing.T) { taskListResponse := &admin.TaskList{} getTaskFetcherSetup() + taskFilter = filters.Filters{ + FieldSelector: "", + } adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(taskListResponse, nil) - _, err := adminFetcherExt.FetchAllVerOfTask(ctx, "taskName", "project", "domain") + _, err := adminFetcherExt.FetchAllVerOfTask(ctx, "taskName", "project", "domain", taskFilter) assert.Equal(t, fmt.Errorf("no tasks retrieved for taskName"), err) } func TestFetchTaskLatestVersion(t *testing.T) { getTaskFetcherSetup() adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(taskListResponse, nil) - _, err := adminFetcherExt.FetchTaskLatestVersion(ctx, "taskName", "project", "domain") + _, err := adminFetcherExt.FetchTaskLatestVersion(ctx, "taskName", "project", "domain", taskFilter) assert.Nil(t, err) } @@ -120,6 +144,6 @@ func TestFetchTaskLatestVersionError(t *testing.T) { taskListResponse := &admin.TaskList{} getTaskFetcherSetup() adminClient.OnListTasksMatch(mock.Anything, mock.Anything).Return(taskListResponse, nil) - _, err := adminFetcherExt.FetchTaskLatestVersion(ctx, "taskName", "project", "domain") + _, err := adminFetcherExt.FetchTaskLatestVersion(ctx, "taskName", "project", "domain", taskFilter) assert.Equal(t, fmt.Errorf("no tasks retrieved for taskName"), err) } diff --git a/flytectl/pkg/ext/updater_test.go b/flytectl/pkg/ext/updater_test.go new file mode 100644 index 0000000000..6e692c44cf --- /dev/null +++ b/flytectl/pkg/ext/updater_test.go @@ -0,0 +1,17 @@ +package ext + +import ( + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/stretchr/testify/assert" +) + +var updaterFetcherClient *AdminUpdaterExtClient + +func TestAdminUpdaterExtClient_AdminServiceClient(t *testing.T) { + adminClient = new(mocks.AdminServiceClient) + updaterFetcherClient = nil + client := updaterFetcherClient.AdminServiceClient() + assert.Nil(t, client) +} diff --git a/flytectl/pkg/ext/workflow_fetcher.go b/flytectl/pkg/ext/workflow_fetcher.go index 86fe88abda..734298a5d4 100644 --- a/flytectl/pkg/ext/workflow_fetcher.go +++ b/flytectl/pkg/ext/workflow_fetcher.go @@ -4,24 +4,19 @@ import ( "context" "fmt" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) // FetchAllVerOfWorkflow fetches all the versions for give workflow name -func (a *AdminFetcherExtClient) FetchAllVerOfWorkflow(ctx context.Context, workflowName, project, domain string) ([]*admin.Workflow, error) { - wList, err := a.AdminServiceClient().ListWorkflows(ctx, &admin.ResourceListRequest{ - Id: &admin.NamedEntityIdentifier{ - Project: project, - Domain: domain, - Name: workflowName, - }, - SortBy: &admin.Sort{ - Key: "created_at", - Direction: admin.Sort_DESCENDING, - }, - Limit: 100, - }) +func (a *AdminFetcherExtClient) FetchAllVerOfWorkflow(ctx context.Context, workflowName, project, domain string, filter filters.Filters) ([]*admin.Workflow, error) { + tranformFilters, err := filters.BuildResourceListRequestWithName(filter, project, domain, workflowName) + if err != nil { + return nil, err + } + wList, err := a.AdminServiceClient().ListWorkflows(ctx, tranformFilters) if err != nil { return nil, err } @@ -32,9 +27,9 @@ func (a *AdminFetcherExtClient) FetchAllVerOfWorkflow(ctx context.Context, workf } // FetchWorkflowLatestVersion fetches latest version for given workflow name -func (a *AdminFetcherExtClient) FetchWorkflowLatestVersion(ctx context.Context, name, project, domain string) (*admin.Workflow, error) { +func (a *AdminFetcherExtClient) FetchWorkflowLatestVersion(ctx context.Context, name, project, domain string, filter filters.Filters) (*admin.Workflow, error) { // Fetch the latest version of the workflow. - wVersions, err := a.FetchAllVerOfWorkflow(ctx, name, project, domain) + wVersions, err := a.FetchAllVerOfWorkflow(ctx, name, project, domain, filter) if err != nil { return nil, err } diff --git a/flytectl/pkg/ext/workflow_fetcher_test.go b/flytectl/pkg/ext/workflow_fetcher_test.go index c18d04842a..9ae96612a6 100644 --- a/flytectl/pkg/ext/workflow_fetcher_test.go +++ b/flytectl/pkg/ext/workflow_fetcher_test.go @@ -5,6 +5,8 @@ import ( "fmt" "testing" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -16,6 +18,7 @@ import ( var ( workflowListResponse *admin.WorkflowList + workflowFilter = filters.Filters{} workflowResponse *admin.Workflow ) @@ -87,14 +90,14 @@ func getWorkflowFetcherSetup() { func TestFetchAllVerOfWorkflow(t *testing.T) { getWorkflowFetcherSetup() adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) - _, err := adminFetcherExt.FetchAllVerOfWorkflow(ctx, "workflowName", "project", "domain") + _, err := adminFetcherExt.FetchAllVerOfWorkflow(ctx, "workflowName", "project", "domain", workflowFilter) assert.Nil(t, err) } func TestFetchAllVerOfWorkflowError(t *testing.T) { getWorkflowFetcherSetup() adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) - _, err := adminFetcherExt.FetchAllVerOfWorkflow(ctx, "workflowName", "project", "domain") + _, err := adminFetcherExt.FetchAllVerOfWorkflow(ctx, "workflowName", "project", "domain", workflowFilter) assert.Equal(t, fmt.Errorf("failed"), err) } @@ -102,7 +105,7 @@ func TestFetchAllVerOfWorkflowEmptyResponse(t *testing.T) { workflowListResponse := &admin.WorkflowList{} getWorkflowFetcherSetup() adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) - _, err := adminFetcherExt.FetchAllVerOfWorkflow(ctx, "workflowName", "project", "domain") + _, err := adminFetcherExt.FetchAllVerOfWorkflow(ctx, "workflowName", "project", "domain", workflowFilter) assert.Equal(t, fmt.Errorf("no workflow retrieved for workflowName"), err) } @@ -110,7 +113,7 @@ func TestFetchWorkflowLatestVersion(t *testing.T) { getWorkflowFetcherSetup() adminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(workflowResponse, nil) adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) - _, err := adminFetcherExt.FetchWorkflowLatestVersion(ctx, "workflowName", "project", "domain") + _, err := adminFetcherExt.FetchWorkflowLatestVersion(ctx, "workflowName", "project", "domain", workflowFilter) assert.Nil(t, err) } @@ -118,7 +121,6 @@ func TestFetchWorkflowLatestVersionError(t *testing.T) { workflowListResponse := &admin.WorkflowList{} getWorkflowFetcherSetup() adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) - adminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(workflowResponse, nil) - _, err := adminFetcherExt.FetchWorkflowLatestVersion(ctx, "workflowName", "project", "domain") + _, err := adminFetcherExt.FetchWorkflowLatestVersion(ctx, "workflowName", "project", "domain", workflowFilter) assert.Equal(t, fmt.Errorf("no workflow retrieved for workflowName"), err) } diff --git a/flytectl/pkg/filters/coverage.out b/flytectl/pkg/filters/coverage.out new file mode 100644 index 0000000000..937e698b18 --- /dev/null +++ b/flytectl/pkg/filters/coverage.out @@ -0,0 +1,68 @@ +mode: set +github.com/flyteorg/flytectl/pkg/filters/filters.go:18.41,19.18 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:22.2,22.19 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:19.18,21.3 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:26.50,28.28 2 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:47.2,47.25 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:28.28,29.39 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:29.39,31.18 2 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:34.4,34.36 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:31.18,33.5 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:34.36,36.29 2 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:36.29,38.6 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:38.11,40.6 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:41.10,44.5 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:51.37,53.34 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:56.2,56.14 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:53.34,55.3 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:64.47,66.2 1 0 +github.com/flyteorg/flytectl/pkg/filters/filters.go:70.46,72.36 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:76.2,78.22 3 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:104.2,104.13 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:108.2,108.24 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:72.36,74.3 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:78.22,79.14 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:92.3,92.12 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:79.14,80.13 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:88.4,89.12 2 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:81.24,83.19 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:84.12,86.72 1 0 +github.com/flyteorg/flytectl/pkg/filters/filters.go:93.13,94.18 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:95.17,97.34 1 0 +github.com/flyteorg/flytectl/pkg/filters/filters.go:98.11,99.18 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:104.13,106.3 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:116.39,118.2 1 0 +github.com/flyteorg/flytectl/pkg/filters/filters.go:121.58,122.24 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:144.2,144.26 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:122.24,125.36 3 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:125.36,126.22 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:126.22,127.40 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:127.40,130.6 2 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:131.10,131.23 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:131.23,132.34 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:132.34,136.6 3 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:137.10,138.41 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:138.41,140.6 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:148.44,149.12 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:167.2,167.11 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:150.25,151.45 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:152.22,153.45 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:154.19,155.44 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:156.16,157.44 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:158.16,159.50 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:160.17,161.44 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:162.14,163.44 1 1 +github.com/flyteorg/flytectl/pkg/filters/filters.go:164.10,165.50 1 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:7.116,9.16 2 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:12.2,20.19 2 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:23.2,23.49 1 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:26.2,26.21 1 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:9.16,11.3 1 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:20.19,22.3 1 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:23.49,25.3 1 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:29.76,31.16 2 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:34.2,39.21 2 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:31.16,33.3 1 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:42.49,44.11 2 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:47.2,50.3 1 1 +github.com/flyteorg/flytectl/pkg/filters/util.go:44.11,46.3 1 1 diff --git a/flytectl/pkg/filters/filters.go b/flytectl/pkg/filters/filters.go new file mode 100644 index 0000000000..629b6a25c8 --- /dev/null +++ b/flytectl/pkg/filters/filters.go @@ -0,0 +1,168 @@ +package filters + +import ( + "bytes" + "fmt" + "regexp" + "strings" +) + +var ( + InReg = regexp.MustCompile(` in `) + ContainsReg = regexp.MustCompile(` contains `) + InRegValue = regexp.MustCompile(`(?s)\((.*)\)`) + termOperators = []string{NotEquals, Equals, GreaterThanEquals, GreaterThan, LessThanEquals, LessThan, Contains, In} +) + +// SplitTerms split the filter string and returns the map of strings +func SplitTerms(filter string) []string { + if filter != "" { + return strings.Split(filter, ",") + } + return []string{} +} + +// Transform transform the field selector term from string to flyteadmin field selector syntax +func Transform(filters []string) (string, error) { + adminFilter := "" + for _, f := range filters { + if lhs, op, rhs, ok := parse(f); ok { + unescapedRHS, err := UnescapeValue(rhs) + if err != nil { + return "", err + } + if ok := validate(lhs, rhs); ok { + transformFilter := transform(lhs, op, unescapedRHS) + if len(adminFilter) > 0 { + adminFilter = fmt.Sprintf("%v+%v", adminFilter, transformFilter) + } else { + adminFilter = fmt.Sprintf("%v", transformFilter) + } + } else { + // TODO(Yuvraj): Add filters docs in error + return "", fmt.Errorf("Please add a valid field selector") + } + } + } + return adminFilter, nil +} + +// validate validate the field selector operation +func validate(lhs, rhs string) bool { + // TODO Add Validation check with regular expression + if len(lhs) > 0 && len(rhs) > 0 { + return true + } + return false +} + +// InvalidEscapeSequence indicates an error occurred unescaping a field selector +type InvalidEscapeSequence struct { + sequence string +} + +func (i InvalidEscapeSequence) Error() string { + return fmt.Sprintf("invalid field selector: invalid escape sequence: %s", i.sequence) +} + +// UnescapeValue unescapes a fieldSelector value and returns the original literal value. +// May return the original string if it contains no escaped or special characters. +func UnescapeValue(s string) (string, error) { + // if there's no escaping or special characters, just return to avoid allocation + if !strings.ContainsAny(s, `\,=`) { + return s, nil + } + + v := bytes.NewBuffer(make([]byte, 0, len(s))) + inSlash := false + for _, c := range s { + if inSlash { + switch c { + case '\\', ',', '=': + // omit the \ for recognized escape sequences + v.WriteRune(c) + default: + // error on unrecognized escape sequences + return "", InvalidEscapeSequence{sequence: string([]rune{'\\', c})} + } + inSlash = false + continue + } + + switch c { + case '\\': + inSlash = true + case ',', '=': + // unescaped , and = characters are not allowed in field selector values + return "", UnescapedRune{r: c} + default: + v.WriteRune(c) + } + } + + // Ending with a single backslash is an invalid sequence + if inSlash { + return "", InvalidEscapeSequence{sequence: "\\"} + } + + return v.String(), nil +} + +// UnescapedRune indicates an error occurred unescaping a field selector +type UnescapedRune struct { + r rune +} + +func (i UnescapedRune) Error() string { + return fmt.Sprintf("invalid field selector: unescaped character in value: %v", i.r) +} + +// parse parse the filter string into an operation string and return the lhs,rhs value and operation type +func parse(filter string) (lhs, op, rhs string, ok bool) { + for i := range filter { + remaining := filter[i:] + var results []string + for _, op := range termOperators { + if op == Contains { + if ContainsReg.MatchString(filter) { + results = ContainsReg.Split(filter, 2) + return results[0], op, results[1], true + } + } else if op == In { + if InReg.MatchString(filter) { + results = InReg.Split(filter, 2) + values := InRegValue.FindAllStringSubmatch(strings.TrimSpace(results[1]), -1) + return results[0], op, values[0][1], true + } + } else { + if strings.HasPrefix(remaining, op) { + return filter[0:i], op, filter[i+len(op):], true + } + } + } + } + return "", "", "", false +} + +// transform it transform the field selector operation and return flyteadmin filter syntax +func transform(lhs, op, rhs string) string { + switch op { + case GreaterThanEquals: + return fmt.Sprintf("gte(%v,%v)", lhs, rhs) + case LessThanEquals: + return fmt.Sprintf("lte(%v,%v)", lhs, rhs) + case GreaterThan: + return fmt.Sprintf("gt(%v,%v)", lhs, rhs) + case LessThan: + return fmt.Sprintf("lt(%v,%v)", lhs, rhs) + case Contains: + return fmt.Sprintf("contains(%v,%v)", lhs, rhs) + case NotEquals: + return fmt.Sprintf("ne(%v,%v)", lhs, rhs) + case Equals: + return fmt.Sprintf("eq(%v,%v)", lhs, rhs) + case In: + return fmt.Sprintf("value_in(%v,%v)", lhs, rhs) + } + return "" +} diff --git a/flytectl/pkg/filters/filters_test.go b/flytectl/pkg/filters/filters_test.go new file mode 100644 index 0000000000..cd988f0c58 --- /dev/null +++ b/flytectl/pkg/filters/filters_test.go @@ -0,0 +1,73 @@ +package filters + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +type TestCase struct { + Input string `json:"input"` + Output string `json:"output"` +} + +func TestTransformFilter(t *testing.T) { + tests := []TestCase{ + { + Input: "project.name=flytesnacks,execution.duration<200,execution.duration<=200,execution.duration>=200,name contains flyte,name!=flyte", + Output: "eq(project.name,flytesnacks)+lt(execution.duration,200)+lte(execution.duration,200)+gte(execution.duration,200)+contains(name,flyte)+ne(name,flyte)", + }, + { + Input: "execution.phase in (FAILED;SUCCEEDED),execution.name=y8n2wtuspj,execution.duration>200", + Output: "value_in(execution.phase,FAILED;SUCCEEDED)+eq(execution.name,y8n2wtuspj)+gt(execution.duration,200)", + }, + { + Input: `k=\\,,k2=v2`, + Output: "eq(k,\\)+eq(k2,v2)", + }, + } + for _, test := range tests { + filters := SplitTerms(test.Input) + + result, err := Transform(filters) + assert.Nil(t, err) + assert.Equal(t, test.Output, result) + } +} + +func TestTransformFilterError(t *testing.T) { + tests := []TestCase{ + { + Input: `\=\,\`, + Output: "", + }, + { + Input: `foo=bar,baz=blah,complex=\=value\\\,\\`, + Output: "", + }, + } + for _, test := range tests { + filters := SplitTerms(test.Input) + result, err := Transform(filters) + assert.NotNil(t, err) + assert.Equal(t, "", result) + } +} + +func TestParseFailed(t *testing.T) { + tests := []TestCase{ + { + Input: ``, + Output: "", + }, + } + for _, test := range tests { + lhs, op, rhs, ok := parse(test.Input) + result := transform(lhs, op, rhs) + assert.Equal(t, "", result) + assert.Equal(t, false, ok) + assert.Equal(t, "", lhs) + assert.Equal(t, "", rhs) + assert.Equal(t, "", op) + } +} diff --git a/flytectl/pkg/filters/operator.go b/flytectl/pkg/filters/operator.go new file mode 100644 index 0000000000..37d8c94d2e --- /dev/null +++ b/flytectl/pkg/filters/operator.go @@ -0,0 +1,12 @@ +package filters + +const ( + Equals string = "=" + In string = "in" + Contains string = "contains" + NotEquals string = "!=" + GreaterThan string = ">" + GreaterThanEquals string = ">=" + LessThan string = "<" + LessThanEquals string = "<=" +) diff --git a/flytectl/pkg/filters/type.go b/flytectl/pkg/filters/type.go new file mode 100644 index 0000000000..83b7d18a74 --- /dev/null +++ b/flytectl/pkg/filters/type.go @@ -0,0 +1,17 @@ +package filters + +var ( + DefaultLimit int32 = 100 + DefaultFilter = Filters{ + Limit: DefaultLimit, + Asc: false, + } +) + +type Filters struct { + FieldSelector string `json:"field-selector" pflag:",Specifies the Field selector"` + SortBy string `json:"sort-by" pflag:",Specifies which field to sort results "` + // TODO: Support paginated queries + Limit int32 `json:"limit" pflag:",Specifies the limit"` + Asc bool `json:"asc" pflag:",Specifies the sorting order. By default flytectl sort result in descending order"` +} diff --git a/flytectl/pkg/filters/util.go b/flytectl/pkg/filters/util.go new file mode 100644 index 0000000000..2c2515326a --- /dev/null +++ b/flytectl/pkg/filters/util.go @@ -0,0 +1,54 @@ +package filters + +import ( + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +func BuildResourceListRequestWithName(c Filters, project, domain, name string) (*admin.ResourceListRequest, error) { + fieldSelector, err := Transform(SplitTerms(c.FieldSelector)) + if err != nil { + return nil, err + } + request := &admin.ResourceListRequest{ + Limit: uint32(c.Limit), + Filters: fieldSelector, + Id: &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + }, + } + if len(name) > 0 { + request.Id.Name = name + } + if sort := buildSortingRequest(c); sort != nil { + request.SortBy = sort + } + return request, nil +} + +func BuildProjectListRequest(c Filters) (*admin.ProjectListRequest, error) { + fieldSelector, err := Transform(SplitTerms(c.FieldSelector)) + if err != nil { + return nil, err + } + request := &admin.ProjectListRequest{ + Limit: uint32(c.Limit), + Filters: fieldSelector, + SortBy: buildSortingRequest(c), + } + return request, nil +} + +func buildSortingRequest(c Filters) *admin.Sort { + sortingOrder := admin.Sort_DESCENDING + if c.Asc { + sortingOrder = admin.Sort_ASCENDING + } + if len(c.SortBy) > 0 { + return &admin.Sort{ + Key: c.SortBy, + Direction: sortingOrder, + } + } + return nil +} diff --git a/flytectl/pkg/filters/util_test.go b/flytectl/pkg/filters/util_test.go new file mode 100644 index 0000000000..6edcc79786 --- /dev/null +++ b/flytectl/pkg/filters/util_test.go @@ -0,0 +1,111 @@ +package filters + +import ( + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/stretchr/testify/assert" +) + +var ( + project = "flytesnack" + domain = "staging" + name = "test" + output = "json" +) + +func TestListRequestWithoutNameFunc(t *testing.T) { + config.GetConfig().Output = output + config.GetConfig().Project = project + config.GetConfig().Domain = domain + filter := Filters{ + Limit: 100, + SortBy: "created_at", + Asc: true, + } + request, err := BuildResourceListRequestWithName(filter, project, domain, "") + expectedResponse := &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + }, + Limit: 100, + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_ASCENDING, + }, + Filters: "", + } + assert.Nil(t, err) + assert.Equal(t, expectedResponse, request) +} + +func TestProjectListRequestFunc(t *testing.T) { + config.GetConfig().Output = output + config.GetConfig().Project = project + config.GetConfig().Domain = domain + filter := Filters{ + Limit: 100, + SortBy: "created_at", + } + request, err := BuildProjectListRequest(filter) + expectedResponse := &admin.ProjectListRequest{ + Limit: 100, + Filters: "", + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + } + assert.Nil(t, err) + assert.Equal(t, expectedResponse, request) +} + +func TestProjectListWithRequestFuncError(t *testing.T) { + config.GetConfig().Output = output + config.GetConfig().Project = project + config.GetConfig().Domain = domain + filter := Filters{ + FieldSelector: "Hello=", + Limit: 100, + } + request, err := BuildProjectListRequest(filter) + assert.NotNil(t, err) + assert.Nil(t, request) +} + +func TestListRequestWithNameFunc(t *testing.T) { + config.GetConfig().Output = output + filter := Filters{ + Limit: 100, + SortBy: "created_at", + } + request, err := BuildResourceListRequestWithName(filter, project, domain, name) + expectedResponse := &admin.ResourceListRequest{ + Id: &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + Name: name, + }, + Limit: 100, + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, + } + assert.Nil(t, err) + assert.Equal(t, expectedResponse, request) +} + +func TestListRequestWithNameFuncError(t *testing.T) { + config.GetConfig().Output = output + filter := Filters{ + Limit: 100, + SortBy: "created_at", + FieldSelector: "hello=", + } + request, err := BuildResourceListRequestWithName(filter, project, domain, name) + assert.NotNil(t, err) + assert.Nil(t, request) +} From caa38e5516f1d24cc5a73914715ee0825b656a96 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Sat, 5 Jun 2021 15:04:26 +0530 Subject: [PATCH 060/645] Added unit test for covarage (#83) Signed-off-by: Yuvraj --- flytectl/.github/workflows/build.yaml | 5 +- flytectl/.gitignore | 3 +- flytectl/cmd/config/config_test.go | 32 +++++++ .../matchable_attr_file_config_utils.go | 2 +- flytectl/cmd/get/execution_util.go | 2 +- flytectl/cmd/get/launch_plan.go | 5 +- flytectl/cmd/root.go | 7 +- flytectl/pkg/adminutils/config_test.go | 17 ++++ flytectl/pkg/adminutils/iterator.go | 71 ---------------- flytectl/pkg/commandutils/command_utils.go | 20 ++--- .../pkg/commandutils/command_utils_test.go | 51 ++++++++++++ flytectl/pkg/printer/printer_test.go | 83 +++++++++++++++++++ 12 files changed, 202 insertions(+), 96 deletions(-) create mode 100644 flytectl/cmd/config/config_test.go create mode 100644 flytectl/pkg/adminutils/config_test.go delete mode 100644 flytectl/pkg/adminutils/iterator.go create mode 100644 flytectl/pkg/commandutils/command_utils_test.go diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml index a7d933fed4..9f4ae2c1d6 100644 --- a/flytectl/.github/workflows/build.yaml +++ b/flytectl/.github/workflows/build.yaml @@ -2,7 +2,8 @@ name: build on: pull_request: - push: + branches: + - master jobs: build: @@ -23,7 +24,7 @@ jobs: with: args: make install && make test_unit_codecov - name: Push CodeCov - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v1.0.5 with: file: coverage.txt flags: unittests diff --git a/flytectl/.gitignore b/flytectl/.gitignore index 5f7a3898d1..1715663b54 100644 --- a/flytectl/.gitignore +++ b/flytectl/.gitignore @@ -5,5 +5,4 @@ bin .DS_Store _test ./config.yaml -docs/build/* -cmd/get/temp-output-file +docs/build/* \ No newline at end of file diff --git a/flytectl/cmd/config/config_test.go b/flytectl/cmd/config/config_test.go new file mode 100644 index 0000000000..f11ee07ae7 --- /dev/null +++ b/flytectl/cmd/config/config_test.go @@ -0,0 +1,32 @@ +package config + +import ( + "testing" + + "github.com/flyteorg/flytectl/pkg/printer" + "github.com/stretchr/testify/assert" +) + +func TestOutputFormat(t *testing.T) { + c := &Config{ + Output: "json", + } + result, err := c.OutputFormat() + assert.Nil(t, err) + assert.Equal(t, printer.OutputFormat(1), result) +} + +func TestInvalidOutputFormat(t *testing.T) { + c := &Config{ + Output: "test", + } + var result printer.OutputFormat + defer func() { + if r := recover(); r != nil { + assert.Equal(t, printer.OutputFormat(0), result) + assert.NotNil(t, r) + } + }() + result = c.MustOutputFormat() + +} diff --git a/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go b/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go index c29b3f23a7..b21e7832a9 100644 --- a/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go +++ b/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go @@ -17,7 +17,7 @@ func WriteConfigToFile(matchableAttrConfig interface{}, fileName string) error { return fmt.Errorf("error: %v", err) } if _, err = os.Stat(fileName); err == nil { - if !cmdUtil.AskForConfirmation(fmt.Sprintf("warning file %v will be overwritten", fileName)) { + if !cmdUtil.AskForConfirmation(fmt.Sprintf("warning file %v will be overwritten", fileName), os.Stdin) { return fmt.Errorf("backup the file before continuing") } } diff --git a/flytectl/cmd/get/execution_util.go b/flytectl/cmd/get/execution_util.go index da330af39e..2d70450af3 100644 --- a/flytectl/cmd/get/execution_util.go +++ b/flytectl/cmd/get/execution_util.go @@ -33,7 +33,7 @@ func WriteExecConfigToFile(executionConfig ExecutionConfig, fileName string) err fmt.Printf("error: %v", err) } if _, err = os.Stat(fileName); err == nil { - if !cmdUtil.AskForConfirmation(fmt.Sprintf("warning file %v will be overwritten", fileName)) { + if !cmdUtil.AskForConfirmation(fmt.Sprintf("warning file %v will be overwritten", fileName), os.Stdin) { return errors.New("backup the file before continuing") } } diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 994f0d84f2..9619bd1fde 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -75,7 +75,7 @@ Retrieves a launch plans within project and domain for a version and generate th :: - flytectl get launchplan -d development -p flytectldemo core.advanced.run_merge_sort.merge_sort --execFile execution_spec.yam + flytectl get launchplan -d development -p flytectldemo core.advanced.run_merge_sort.merge_sort --execFile execution_spec.yaml The generated file would look similar to this @@ -152,9 +152,6 @@ func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comman return err } launchPlans := launchPlanList.LaunchPlans - if err != nil { - return err - } logger.Debugf(ctx, "Retrieved %v launch plans", len(launchPlans)) return launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplansColumns, LaunchplanToProtoMessages(launchPlans)...) diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 200d6d4115..15533fd625 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -4,6 +4,8 @@ import ( "context" "fmt" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" + "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/create" @@ -12,7 +14,6 @@ import ( "github.com/flyteorg/flytectl/cmd/register" "github.com/flyteorg/flytectl/cmd/update" "github.com/flyteorg/flytectl/cmd/version" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/flyteorg/flytectl/pkg/printer" stdConfig "github.com/flyteorg/flytestdlib/config" "github.com/flyteorg/flytestdlib/config/viper" @@ -41,7 +42,7 @@ func newRootCmd() *cobra.Command { DisableAutoGenTag: true, } - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", f.FilePathJoin(f.UserHomeDir(), configFileDir, configFileName), "config file (default is $HOME/.flyte/config.yaml)") configAccessor.InitializePflags(rootCmd.PersistentFlags()) @@ -69,7 +70,7 @@ func newRootCmd() *cobra.Command { func initConfig(_ *cobra.Command, _ []string) error { configAccessor = viper.NewAccessor(stdConfig.Options{ StrictMode: true, - SearchPaths: []string{cfgFile, f.FilePathJoin(f.UserHomeDir(), configFileDir, configFileName)}, + SearchPaths: []string{cfgFile}, }) err := configAccessor.UpdateConfig(context.TODO()) diff --git a/flytectl/pkg/adminutils/config_test.go b/flytectl/pkg/adminutils/config_test.go new file mode 100644 index 0000000000..5a8fd5134d --- /dev/null +++ b/flytectl/pkg/adminutils/config_test.go @@ -0,0 +1,17 @@ +package adminutils + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGetConfig(t *testing.T) { + defaultConfig = &Config{ + MaxRecords: 500, + BatchSize: 100, + } + c := GetConfig() + assert.Equal(t, defaultConfig.BatchSize, c.BatchSize) + assert.Equal(t, defaultConfig.MaxRecords, c.MaxRecords) +} diff --git a/flytectl/pkg/adminutils/iterator.go b/flytectl/pkg/adminutils/iterator.go deleted file mode 100644 index 3e90690b43..0000000000 --- a/flytectl/pkg/adminutils/iterator.go +++ /dev/null @@ -1,71 +0,0 @@ -package adminutils - -import ( - "context" - - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/golang/protobuf/proto" - "google.golang.org/grpc" -) - -type NamedEntityIDLister func(ctx context.Context, in *admin.NamedEntityIdentifierListRequest, opts ...grpc.CallOption) (*admin.NamedEntityIdentifierList, error) - -type NamedEntityVisitor func(entities []*admin.NamedEntityIdentifier) error - -type ListRequest struct { - Project string - Domain string - Filters string -} - -func IterateThroughAllNamedEntities(ctx context.Context, lister NamedEntityIDLister, visitor NamedEntityVisitor, req ListRequest, opts ...grpc.CallOption) error { - adminReq := &admin.NamedEntityIdentifierListRequest{ - Project: req.Project, - Domain: req.Domain, - Filters: req.Filters, - SortBy: &admin.Sort{ - Key: "name", - Direction: admin.Sort_ASCENDING, - }, - Limit: uint32(GetConfig().BatchSize), - } - - i := 0 - for i < GetConfig().MaxRecords { - res, err := lister(ctx, adminReq, opts...) - if err != nil { - return err - } - if len(res.Entities) != 0 { - if err := visitor(res.Entities); err != nil { - return err - } - } - i = i + len(res.Entities) - if len(res.Entities) == 0 || res.Token == "" { - break - } - adminReq.Token = res.Token - } - return nil -} - -func GetAllNamedEntities(ctx context.Context, lister NamedEntityIDLister, req ListRequest, opts ...grpc.CallOption) ([]*admin.NamedEntityIdentifier, error) { - var allEntities []*admin.NamedEntityIdentifier - err := IterateThroughAllNamedEntities(ctx, lister, func(entities []*admin.NamedEntityIdentifier) error { - allEntities = append(allEntities, entities...) - return nil - }, req) - if err != nil { - return nil, err - } - return allEntities, nil -} - -func NamedEntityToProtoMessage(l []*admin.NamedEntityIdentifier) []proto.Message { - messages := make([]proto.Message, 0, len(l)) - for _, m := range l { - messages = append(messages, m) - } - return messages -} diff --git a/flytectl/pkg/commandutils/command_utils.go b/flytectl/pkg/commandutils/command_utils.go index acee518a5f..1593abf880 100644 --- a/flytectl/pkg/commandutils/command_utils.go +++ b/flytectl/pkg/commandutils/command_utils.go @@ -3,24 +3,20 @@ package commandutils import ( "bufio" "fmt" - "log" - "os" + "io" "strings" ) -func AskForConfirmation(s string) bool { - reader := bufio.NewReader(os.Stdin) - for { - fmt.Printf("%s [y/n]: ", s) - response, err := reader.ReadString('\n') - if err != nil { - log.Fatal(err) - } - response = strings.ToLower(strings.TrimSpace(response)) +func AskForConfirmation(s string, reader io.Reader) bool { + fmt.Printf("%s [y/n]: ", s) + r := bufio.NewScanner(reader) + for r.Scan() { + response := strings.ToLower(strings.TrimSpace(r.Text())) if response == "y" || response == "yes" { return true - } else if response == "n" || response == "no" { + } else if response == "n" || response == "No" { return false } } + return false } diff --git a/flytectl/pkg/commandutils/command_utils_test.go b/flytectl/pkg/commandutils/command_utils_test.go new file mode 100644 index 0000000000..57fc4f82f6 --- /dev/null +++ b/flytectl/pkg/commandutils/command_utils_test.go @@ -0,0 +1,51 @@ +package commandutils + +import ( + "io" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +type TestCase struct { + Input io.Reader `json:"input"` + Output bool `json:"output"` +} + +func TestAskForConfirmation(t *testing.T) { + tests := []TestCase{ + { + Input: strings.NewReader("yes"), + Output: true, + }, + { + Input: strings.NewReader("y"), + Output: true, + }, + { + Input: strings.NewReader("no"), + Output: false, + }, + { + Input: strings.NewReader("n"), + Output: false, + }, + { + Input: strings.NewReader("No"), + Output: false, + }, + { + Input: strings.NewReader("Yes"), + Output: true, + }, + { + Input: strings.NewReader(""), + Output: false, + }, + } + for _, test := range tests { + answer := AskForConfirmation("Testing for yes", test.Input) + assert.Equal(t, test.Output, answer) + } +} diff --git a/flytectl/pkg/printer/printer_test.go b/flytectl/pkg/printer/printer_test.go index 8f5f2f3dfd..5db910544c 100644 --- a/flytectl/pkg/printer/printer_test.go +++ b/flytectl/pkg/printer/printer_test.go @@ -2,9 +2,15 @@ package printer import ( "encoding/json" + "fmt" "testing" "time" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/golang/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" + "github.com/stretchr/testify/assert" ) @@ -13,6 +19,14 @@ type Inner struct { Y *time.Time `json:"y"` } +func LaunchplanToProtoMessages(l []*admin.LaunchPlan) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages +} + // TODO Convert this to a Testable Example. For some reason the comparison fails func TestJSONToTable(t *testing.T) { d := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) @@ -41,3 +55,72 @@ func TestJSONToTable(t *testing.T) { // | hello | | // 3 rows } + +func TestOutputFormats(t *testing.T) { + expected := []string{"TABLE", "JSON", "YAML"} + outputs := OutputFormats() + assert.Equal(t, 3, len(outputs)) + assert.Equal(t, expected, outputs) +} + +func TestOutputFormatString(t *testing.T) { + o, err := OutputFormatString("JSON") + assert.Nil(t, err) + assert.Equal(t, OutputFormat(1), o) +} + +func TestOutputFormatStringErr(t *testing.T) { + o, err := OutputFormatString("FLYTE") + assert.NotNil(t, err) + assert.Equal(t, OutputFormat(0), o) + assert.Equal(t, fmt.Errorf("%s does not belong to OutputFormat values", "FLYTE"), err) +} + +func TestIsAOutputFormat(t *testing.T) { + o := OutputFormat(4) + check := o.IsAOutputFormat() + assert.Equal(t, false, check) + + o = OutputFormat(1) + check = o.IsAOutputFormat() + assert.Equal(t, true, check) +} + +func TestMarshalJson(t *testing.T) { + o := OutputFormat(1) + check, err := o.MarshalJSON() + assert.Nil(t, err) + assert.Equal(t, []byte(`"JSON"`), check) + + result, err := o.MarshalYAML() + assert.Nil(t, err) + assert.Equal(t, "JSON", result) +} + +func TestPrint(t *testing.T) { + p := Printer{} + lp := []Column{ + {Header: "Version", JSONPath: "$.id.version"}, + {Header: "Name", JSONPath: "$.id.name"}, + } + launchPlan := &admin.LaunchPlan{ + Id: &core.Identifier{ + Name: "launchplan1", + Version: "v2", + }, + Spec: &admin.LaunchPlanSpec{ + DefaultInputs: &core.ParameterMap{}, + }, + Closure: &admin.LaunchPlanClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + ExpectedInputs: &core.ParameterMap{}, + }, + } + launchPlans := []*admin.LaunchPlan{launchPlan} + err := p.Print(OutputFormat(0), lp, LaunchplanToProtoMessages(launchPlans)...) + assert.Nil(t, err) + err = p.Print(OutputFormat(1), lp, LaunchplanToProtoMessages(launchPlans)...) + assert.Nil(t, err) + err = p.Print(OutputFormat(2), lp, LaunchplanToProtoMessages(launchPlans)...) + assert.Nil(t, err) +} From e2082c00b2a195b8f4c452653575756e55fecb49 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Mon, 7 Jun 2021 10:34:43 +0530 Subject: [PATCH 061/645] Supporting generic types through flytectl (#78) * Supporting generic types through flytectl Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/create/execution.go | 45 +++++++++++++++++++ flytectl/cmd/create/execution_test.go | 2 +- flytectl/cmd/create/execution_util.go | 9 ++-- .../task_execution_spec_with_iamrole.yaml | 15 +++++++ flytectl/docs/source/conf.py | 8 ++-- .../source/gen/flytectl_create_execution.rst | 45 +++++++++++++++++++ flytectl/docs/source/index.rst | 18 +++++--- flytectl/docs/source/nouns.rst | 2 +- flytectl/docs/source/verbs.rst | 4 +- flytectl/go.mod | 2 + flytectl/go.sum | 4 +- 11 files changed, 132 insertions(+), 22 deletions(-) create mode 100644 flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index d80f310b90..f765e786b2 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -78,6 +78,51 @@ Also an execution can be relaunched by passing in current execution id. flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development +Generic data types are also supported for execution in similar way.Following is sample of how the inputs need to be specified while creating the execution. +As usual the spec file should be generated first and then run the execution using the spec file. + +:: + + flytectl get task -d development -p flytectldemo core.type_system.custom_objects.add --execFile adddatanum.yaml + +The generated file would look similar to this. Here you can see empty values dumped for generic data type x and y. + +:: + + iamRoleARN: "" + inputs: + "x": {} + "y": {} + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.type_system.custom_objects.add + version: v3 + +Modified file with struct data populated for x and y parameters for the task core.type_system.custom_objects.add + +:: + + iamRoleARN: "arn:aws:iam::123456789:role/dummy" + inputs: + "x": + "x": 2 + "y": ydatafory + "z": + 1 : "foo" + 2 : "bar" + "y": + "x": 3 + "y": ydataforx + "z": + 3 : "buzz" + 4 : "lightyear" + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.type_system.custom_objects.add + version: v3 + Usage ` ) diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index d83d99ae96..00544c4f55 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -144,7 +144,7 @@ func TestCreateTaskExecutionFunc(t *testing.T) { }, } mockClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseTask, nil) - executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" + executionConfig.ExecFile = testDataFolder + "task_execution_spec_with_iamrole.yaml" err = createExecutionCommand(ctx, args, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 13a1ab51a9..94924fbfaa 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -57,11 +57,10 @@ func createExecutionRequestForTask(ctx context.Context, taskName string, project Literals: variableLiterals, } var authRole *admin.AuthRole - if executionConfig.KubeServiceAcct != "" || executionConfig.IamRoleARN != "" { - authRole = &admin.AuthRole{ - AssumableIamRole: executionConfig.IamRoleARN, - KubernetesServiceAccount: executionConfig.KubeServiceAcct, - } + if executionConfig.KubeServiceAcct != "" { + authRole = &admin.AuthRole{KubernetesServiceAccount: executionConfig.KubeServiceAcct} + } else { + authRole = &admin.AuthRole{AssumableIamRole: executionConfig.IamRoleARN} } ID := &core.Identifier{ ResourceType: core.ResourceType_TASK, diff --git a/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml b/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml new file mode 100644 index 0000000000..14cd2df32d --- /dev/null +++ b/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml @@ -0,0 +1,15 @@ +iamRoleARN: "iamRoleARN" +inputs: + sorted_list1: + - 0 + - 2 + - 4 + sorted_list2: + - 1 + - 3 + - 5 +kubeServiceAcct: "" +targetDomain: "development" +targetProject: "flytesnacks" +task: core.advanced.run_merge_sort.merge +version: v2 diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 02a1bab91d..b3c1bfbbab 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -99,6 +99,10 @@ "color-brand-primary": "#9D68E4", "color-brand-content": "#9D68E4", }, +} + +html_context = { + "home_page": "https://docs.flyte.org", # custom flyteorg furo theme options "github_repo": "flytectl", "github_username": "flyteorg", @@ -106,10 +110,6 @@ "docs_path": "docs/source", # path to documentation source } -html_context = { - "home_page": "https://docs.flyte.org", -} - # The default sidebars (for documents that don't match any pattern) are # defined by theme itself. Builtin themes are using these templates by # default: ``['localtoc.html', 'relations.html', 'sourcelink.html', diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index aac5479c3b..dc646888cb 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -76,6 +76,51 @@ Also an execution can be relaunched by passing in current execution id. flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development +Generic data types are also supported for execution in similar way.Following is sample of how the inputs need to be specified while creating the execution. +As usual the spec file should be generated first and then run the execution using the spec file. + +:: + + flytectl get task -d development -p flytectldemo core.type_system.custom_objects.add --execFile adddatanum.yaml + +The generated file would look similar to this. Here you can see empty values dumped for generic data type x and y. + +:: + + iamRoleARN: "" + inputs: + "x": {} + "y": {} + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.type_system.custom_objects.add + version: v3 + +Modified file with struct data populated for x and y parameters for the task core.type_system.custom_objects.add + +:: + + iamRoleARN: "arn:aws:iam::123456789:role/dummy" + inputs: + "x": + "x": 2 + "y": ydatafory + "z": + 1 : "foo" + 2 : "bar" + "y": + "x": 3 + "y": ydataforx + "z": + 3 : "buzz" + 4 : "lightyear" + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.type_system.custom_objects.add + version: v3 + Usage diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 39399d4065..2cf449aeb6 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -18,13 +18,7 @@ golang. To install simply copy paste the following into the command-line: Configure ========= Flytectl allows configuring using a YAML file or pass every configuration value -on command-line. The follow configuration is useful to setup. -Place this in $HOME/.flyte directory with name config.yaml. -This file is searched in -* $HOME/.flyte -* currDir from where you run flytectl -* /etc/flyte/config -* You can pass it commandline using --config +on command-line. The following configuration is useful to setup. Basic Configuration -------------------- @@ -34,6 +28,7 @@ Basic Configuration admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: dns:///flyte.lyft.net + authType: Pkce # Change insecure flag to ensure that you use the right setting for your environment insecure: true logger: @@ -42,6 +37,15 @@ Basic Configuration level: 1 +Place this in $HOME/.flyte directory with name config.yaml. +This file is searched in + +- $HOME/.flyte +- currDir from where you run flytectl +- /etc/flyte/config +- You can pass it commandline using --config + + .. toctree:: :maxdepth: 1 :hidden: diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index 89d3c74a3d..756ccc8b0b 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -1,10 +1,10 @@ Nouns ------ +Flytectl noun specify the resource on which the action needs to be performed eg: resources like project/workflow/task/execution .. toctree:: :maxdepth: 1 :caption: Nouns - :hidden: gen/flytectl_create_project gen/flytectl_create_execution diff --git a/flytectl/docs/source/verbs.rst b/flytectl/docs/source/verbs.rst index 49f90367b0..8fb0ba88f2 100644 --- a/flytectl/docs/source/verbs.rst +++ b/flytectl/docs/source/verbs.rst @@ -1,14 +1,14 @@ Verbs ------ +Flytectl verbs specify the actions to be performed on the resources like create/get/update/delete .. toctree:: :maxdepth: 1 :caption: Verbs - :hidden: gen/flytectl_create gen/flytectl_get gen/flytectl_update gen/flytectl_delete gen/flytectl_register - gen/flytectl_config \ No newline at end of file + gen/flytectl_config diff --git a/flytectl/go.mod b/flytectl/go.mod index 56161e8041..ace309880f 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -28,3 +28,5 @@ require ( gopkg.in/yaml.v2 v2.4.0 sigs.k8s.io/yaml v1.2.0 ) + +replace github.com/flyteorg/flyteidl => github.com/flyteorg/flyteidl v0.18.51-0.20210602050605-9ebebd25056e diff --git a/flytectl/go.sum b/flytectl/go.sum index 1049bf193a..2397a7141f 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -172,8 +172,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.18.51 h1:fp4Qq9WtO3QeDbFpKk0uQqB/cF78+Ul7D3DhvQPlV5Q= -github.com/flyteorg/flyteidl v0.18.51/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.18.51-0.20210602050605-9ebebd25056e h1:J3Uaju9mBrJhrU4kiv3ozpZNkDdjDepkn0X6ueB8iag= +github.com/flyteorg/flyteidl v0.18.51-0.20210602050605-9ebebd25056e/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.21 h1:AF+y6wI64DNfoi4WtZU/v18Cfwksg32fijy7PZJ8d+I= github.com/flyteorg/flytestdlib v0.3.21/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= From 052316d88afa9ab1892bc8eec65fada0bed9cee4 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 7 Jun 2021 11:33:57 +0530 Subject: [PATCH 062/645] Refactor get command (#84) * Refactor get command Signed-off-by: Yuvraj * Fix unit test Signed-off-by: Yuvraj --- flytectl/cmd/get/execution.go | 23 ++---- flytectl/cmd/get/launch_plan.go | 13 +-- flytectl/cmd/get/project.go | 9 +- flytectl/cmd/get/project_test.go | 18 +++- flytectl/cmd/get/task.go | 13 +-- flytectl/cmd/get/workflow.go | 35 ++------ flytectl/cmd/get/workflow_test.go | 12 --- flytectl/pkg/ext/execution_fetcher.go | 14 ++++ flytectl/pkg/ext/fetcher.go | 6 ++ .../ext/mocks/admin_fetcher_ext_interface.go | 82 +++++++++++++++++++ flytectl/pkg/ext/project_fetcher.go | 21 +++++ flytectl/pkg/ext/project_fetcher_test.go | 45 ++++++++++ 12 files changed, 209 insertions(+), 82 deletions(-) create mode 100644 flytectl/pkg/ext/project_fetcher.go create mode 100644 flytectl/pkg/ext/project_fetcher_test.go diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 73c2e36b78..e7164ca90e 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -3,8 +3,6 @@ package get import ( "context" - "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -85,18 +83,15 @@ func getExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Command return err } executions = append(executions, execution) - } else { - transformFilters, err := filters.BuildResourceListRequestWithName(execution.DefaultConfig.Filter, config.GetConfig().Project, config.GetConfig().Domain, "") - if err != nil { - return err - } - executionList, err := cmdCtx.AdminClient().ListExecutions(ctx, transformFilters) - if err != nil { - return err - } - executions = executionList.Executions + logger.Infof(ctx, "Retrieved %v executions", len(executions)) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), executionColumns, + ExecutionToProtoMessages(executions)...) + } + executionList, err := cmdCtx.AdminFetcherExt().ListExecution(ctx, config.GetConfig().Project, config.GetConfig().Domain, execution.DefaultConfig.Filter) + if err != nil { + return err } - logger.Infof(ctx, "Retrieved %v executions", len(executions)) + logger.Infof(ctx, "Retrieved %v executions", len(executionList.Executions)) return adminPrinter.Print(config.GetConfig().MustOutputFormat(), executionColumns, - ExecutionToProtoMessages(executions)...) + ExecutionToProtoMessages(executionList.Executions)...) } diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 9619bd1fde..9edff6ab92 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -3,8 +3,6 @@ package get import ( "context" - "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -126,11 +124,11 @@ func LaunchplanToProtoMessages(l []*admin.LaunchPlan) []proto.Message { func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { launchPlanPrinter := printer.Printer{} + var launchPlans []*admin.LaunchPlan project := config.GetConfig().Project domain := config.GetConfig().Domain if len(args) == 1 { name := args[0] - var launchPlans []*admin.LaunchPlan var err error if launchPlans, err = FetchLPForName(ctx, cmdCtx.AdminFetcherExt(), name, project, domain); err != nil { return err @@ -143,15 +141,12 @@ func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comman } return nil } - transformFilters, err := filters.BuildResourceListRequestWithName(launchplan.DefaultConfig.Filter, config.GetConfig().Project, config.GetConfig().Domain, "") - if err != nil { - return err - } - launchPlanList, err := cmdCtx.AdminClient().ListLaunchPlans(ctx, transformFilters) + + launchPlans, err := cmdCtx.AdminFetcherExt().FetchAllVerOfLP(ctx, "", config.GetConfig().Project, config.GetConfig().Domain, launchplan.DefaultConfig.Filter) if err != nil { return err } - launchPlans := launchPlanList.LaunchPlans + logger.Debugf(ctx, "Retrieved %v launch plans", len(launchPlans)) return launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplansColumns, LaunchplanToProtoMessages(launchPlans)...) diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 535cb16af4..4d13950e1e 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -5,8 +5,6 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/project" - "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" @@ -72,11 +70,8 @@ func ProjectToProtoMessages(l []*admin.Project) []proto.Message { func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { adminPrinter := printer.Printer{} - transformFilters, err := filters.BuildProjectListRequest(project.DefaultConfig.Filter) - if err != nil { - return err - } - projects, err := cmdCtx.AdminClient().ListProjects(ctx, transformFilters) + + projects, err := cmdCtx.AdminFetcherExt().ListProjects(ctx, project.DefaultConfig.Filter) if err != nil { return err } diff --git a/flytectl/cmd/get/project_test.go b/flytectl/cmd/get/project_test.go index 2419ceda6c..264aa35c1c 100644 --- a/flytectl/cmd/get/project_test.go +++ b/flytectl/cmd/get/project_test.go @@ -2,11 +2,15 @@ package get import ( "fmt" + "io" "testing" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/config/subcommand/project" "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) @@ -19,6 +23,10 @@ var ( ) func getProjectSetup() { + + mockOutStream := new(io.Writer) + cmdCtx = cmdCore.NewCommandContext(mockClient, *mockOutStream) + argsProject = []string{"flyteexample"} resourceListRequestProject = &admin.ProjectListRequest{} @@ -51,12 +59,17 @@ func getProjectSetup() { } } -func TestProjectFunc(t *testing.T) { +func TestListProjectFunc(t *testing.T) { setup() getProjectSetup() + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + project.DefaultConfig.Filter = filters.Filters{} mockClient.OnListProjectsMatch(ctx, resourceListRequestProject).Return(projectListResponse, nil) err = getProjectsFunc(ctx, argsProject, cmdCtx) + assert.Nil(t, err) mockClient.AssertCalled(t, "ListProjects", ctx, resourceListRequestProject) } @@ -64,6 +77,9 @@ func TestProjectFunc(t *testing.T) { func TestGetProjectFunc(t *testing.T) { setup() getProjectSetup() + + argsProject = []string{} + project.DefaultConfig.Filter = filters.Filters{} mockClient.OnListProjectsMatch(ctx, resourceListRequestProject).Return(projectListResponse, nil) err = getProjectsFunc(ctx, argsProject, cmdCtx) diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index fd02d17b40..e25206a55f 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -7,7 +7,6 @@ import ( taskConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/task" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flytectl/pkg/filters" "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" @@ -114,28 +113,22 @@ func TaskToProtoMessages(l []*admin.Task) []proto.Message { func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { taskPrinter := printer.Printer{} + var tasks []*admin.Task + var err error project := config.GetConfig().Project domain := config.GetConfig().Domain if len(args) == 1 { name := args[0] - var tasks []*admin.Task - var err error if tasks, err = FetchTaskForName(ctx, cmdCtx.AdminFetcherExt(), name, project, domain); err != nil { return err } logger.Debugf(ctx, "Retrieved Task", tasks) return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToProtoMessages(tasks)...) } - transformFilters, err := filters.BuildResourceListRequestWithName(taskConfig.DefaultConfig.Filter, config.GetConfig().Project, config.GetConfig().Domain, "") - if err != nil { - return err - } - taskList, err := cmdCtx.AdminClient().ListTasks(ctx, transformFilters) + tasks, err = cmdCtx.AdminFetcherExt().FetchAllVerOfTask(ctx, "", config.GetConfig().Project, config.GetConfig().Domain, taskConfig.DefaultConfig.Filter) if err != nil { return err } - tasks := taskList.Tasks - logger.Debugf(ctx, "Retrieved %v Task", len(tasks)) return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToProtoMessages(tasks)...) } diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index c87cc3406b..cdefe89410 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -3,8 +3,6 @@ package get import ( "context" - "github.com/flyteorg/flytectl/pkg/filters" - workflowconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flytestdlib/logger" @@ -74,18 +72,6 @@ Usage ` ) -//go:generate pflags WorkflowConfig --default-var workflowConfig -var ( - workflowConfig = &WorkflowConfig{ - Filter: filters.DefaultFilter, - } -) - -// WorkflowConfig -type WorkflowConfig struct { - Filter filters.Filters `json:"filter" pflag:","` -} - var workflowColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, @@ -102,30 +88,21 @@ func WorkflowToProtoMessages(l []*admin.Workflow) []proto.Message { func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { adminPrinter := printer.Printer{} + var workflows []*admin.Workflow + var err error if len(args) > 0 { name := args[0] - var workflows []*admin.Workflow - var err error if workflows, err = FetchWorkflowForName(ctx, cmdCtx.AdminFetcherExt(), name, config.GetConfig().Project, config.GetConfig().Domain); err != nil { return err } logger.Debugf(ctx, "Retrieved %v workflow", len(workflows)) - err = adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows)...) - if err != nil { - return err - } - return nil + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows)...) } - transformFilters, err := filters.BuildResourceListRequestWithName(workflowConfig.Filter, config.GetConfig().Project, config.GetConfig().Domain, "") - if err != nil { - return err - } - workflowList, err := cmdCtx.AdminClient().ListWorkflows(ctx, transformFilters) + workflows, err = cmdCtx.AdminFetcherExt().FetchAllVerOfWorkflow(ctx, "", config.GetConfig().Project, config.GetConfig().Domain, workflowconfig.DefaultConfig.Filter) if err != nil { return err } - workflows := workflowList.Workflows logger.Debugf(ctx, "Retrieved %v workflows", len(workflows)) return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows)...) @@ -138,7 +115,7 @@ func FetchWorkflowForName(ctx context.Context, fetcher ext.AdminFetcherExtInterf var workflow *admin.Workflow var err error if workflowconfig.DefaultConfig.Latest { - if workflow, err = fetcher.FetchWorkflowLatestVersion(ctx, name, project, domain, workflowConfig.Filter); err != nil { + if workflow, err = fetcher.FetchWorkflowLatestVersion(ctx, name, project, domain, workflowconfig.DefaultConfig.Filter); err != nil { return nil, err } workflows = append(workflows, workflow) @@ -148,7 +125,7 @@ func FetchWorkflowForName(ctx context.Context, fetcher ext.AdminFetcherExtInterf } workflows = append(workflows, workflow) } else { - workflows, err = fetcher.FetchAllVerOfWorkflow(ctx, name, project, domain, workflowConfig.Filter) + workflows, err = fetcher.FetchAllVerOfWorkflow(ctx, name, project, domain, workflowconfig.DefaultConfig.Filter) if err != nil { return nil, err } diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go index 29f3274afc..a3e47e8332 100644 --- a/flytectl/cmd/get/workflow_test.go +++ b/flytectl/cmd/get/workflow_test.go @@ -5,7 +5,6 @@ import ( "testing" "github.com/flyteorg/flytectl/pkg/ext/mocks" - "github.com/flyteorg/flytectl/pkg/filters" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" @@ -97,14 +96,3 @@ func TestGetWorkflowFuncWithError(t *testing.T) { }) } - -func TestGetWorkflowFunc(t *testing.T) { - setup() - getWorkflowSetup() - workflowConfig.Filter = filters.Filters{} - argsWorkflow := []string{} - mockClient.OnListWorkflowsMatch(ctx, resourceListRequestWorkflow).Return(workflowListResponse, nil) - err = getWorkflowFunc(ctx, argsWorkflow, cmdCtx) - assert.Nil(t, err) - mockClient.AssertCalled(t, "ListWorkflows", ctx, resourceListRequestWorkflow) -} diff --git a/flytectl/pkg/ext/execution_fetcher.go b/flytectl/pkg/ext/execution_fetcher.go index e96351c8b8..4e30a708bb 100644 --- a/flytectl/pkg/ext/execution_fetcher.go +++ b/flytectl/pkg/ext/execution_fetcher.go @@ -3,6 +3,8 @@ package ext import ( "context" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) @@ -20,3 +22,15 @@ func (a *AdminFetcherExtClient) FetchExecution(ctx context.Context, name, projec } return e, nil } + +func (a *AdminFetcherExtClient) ListExecution(ctx context.Context, project, domain string, filter filters.Filters) (*admin.ExecutionList, error) { + transformFilters, err := filters.BuildResourceListRequestWithName(filter, project, domain, "") + if err != nil { + return nil, err + } + e, err := a.AdminServiceClient().ListExecutions(ctx, transformFilters) + if err != nil { + return nil, err + } + return e, nil +} diff --git a/flytectl/pkg/ext/fetcher.go b/flytectl/pkg/ext/fetcher.go index ecc3b6371c..83a4753401 100644 --- a/flytectl/pkg/ext/fetcher.go +++ b/flytectl/pkg/ext/fetcher.go @@ -19,6 +19,9 @@ type AdminFetcherExtInterface interface { // FetchExecution fetches the execution based on name, project, domain FetchExecution(ctx context.Context, name, project, domain string) (*admin.Execution, error) + // ListExecution fetches the all versions of based on name, project, domain + ListExecution(ctx context.Context, project, domain string, filter filters.Filters) (*admin.ExecutionList, error) + // FetchAllVerOfLP fetches all versions of launch plan in a project, domain FetchAllVerOfLP(ctx context.Context, lpName, project, domain string, filter filters.Filters) ([]*admin.LaunchPlan, error) @@ -51,6 +54,9 @@ type AdminFetcherExtInterface interface { // FetchProjectDomainAttributes fetches project domain attributes particular resource type in a project, domain FetchProjectDomainAttributes(ctx context.Context, project, domain string, rsType admin.MatchableResource) (*admin.ProjectDomainAttributesGetResponse, error) + + // ListProjects fetches all projects + ListProjects(ctx context.Context, filter filters.Filters) (*admin.Projects, error) } // AdminFetcherExtClient is used for interacting with extended features used for fetching data from admin service diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index 8ae7cde8f8..23b64e3696 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -544,3 +544,85 @@ func (_m *AdminFetcherExtInterface) FetchWorkflowVersion(ctx context.Context, na return r0, r1 } + +type AdminFetcherExtInterface_ListExecution struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_ListExecution) Return(_a0 *admin.ExecutionList, _a1 error) *AdminFetcherExtInterface_ListExecution { + return &AdminFetcherExtInterface_ListExecution{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnListExecution(ctx context.Context, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_ListExecution { + c := _m.On("ListExecution", ctx, project, domain, filter) + return &AdminFetcherExtInterface_ListExecution{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnListExecutionMatch(matchers ...interface{}) *AdminFetcherExtInterface_ListExecution { + c := _m.On("ListExecution", matchers...) + return &AdminFetcherExtInterface_ListExecution{Call: c} +} + +// ListExecution provides a mock function with given fields: ctx, project, domain, filter +func (_m *AdminFetcherExtInterface) ListExecution(ctx context.Context, project string, domain string, filter filters.Filters) (*admin.ExecutionList, error) { + ret := _m.Called(ctx, project, domain, filter) + + var r0 *admin.ExecutionList + if rf, ok := ret.Get(0).(func(context.Context, string, string, filters.Filters) *admin.ExecutionList); ok { + r0 = rf(ctx, project, domain, filter) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.ExecutionList) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, filters.Filters) error); ok { + r1 = rf(ctx, project, domain, filter) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type AdminFetcherExtInterface_ListProjects struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_ListProjects) Return(_a0 *admin.Projects, _a1 error) *AdminFetcherExtInterface_ListProjects { + return &AdminFetcherExtInterface_ListProjects{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnListProjects(ctx context.Context, filter filters.Filters) *AdminFetcherExtInterface_ListProjects { + c := _m.On("ListProjects", ctx, filter) + return &AdminFetcherExtInterface_ListProjects{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnListProjectsMatch(matchers ...interface{}) *AdminFetcherExtInterface_ListProjects { + c := _m.On("ListProjects", matchers...) + return &AdminFetcherExtInterface_ListProjects{Call: c} +} + +// ListProjects provides a mock function with given fields: ctx, filter +func (_m *AdminFetcherExtInterface) ListProjects(ctx context.Context, filter filters.Filters) (*admin.Projects, error) { + ret := _m.Called(ctx, filter) + + var r0 *admin.Projects + if rf, ok := ret.Get(0).(func(context.Context, filters.Filters) *admin.Projects); ok { + r0 = rf(ctx, filter) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Projects) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, filters.Filters) error); ok { + r1 = rf(ctx, filter) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/flytectl/pkg/ext/project_fetcher.go b/flytectl/pkg/ext/project_fetcher.go new file mode 100644 index 0000000000..4367bef9a6 --- /dev/null +++ b/flytectl/pkg/ext/project_fetcher.go @@ -0,0 +1,21 @@ +package ext + +import ( + "context" + + "github.com/flyteorg/flytectl/pkg/filters" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +func (a *AdminFetcherExtClient) ListProjects(ctx context.Context, filter filters.Filters) (*admin.Projects, error) { + transformFilters, err := filters.BuildProjectListRequest(filter) + if err != nil { + return nil, err + } + e, err := a.AdminServiceClient().ListProjects(ctx, transformFilters) + if err != nil { + return nil, err + } + return e, nil +} diff --git a/flytectl/pkg/ext/project_fetcher_test.go b/flytectl/pkg/ext/project_fetcher_test.go new file mode 100644 index 0000000000..4b9c505485 --- /dev/null +++ b/flytectl/pkg/ext/project_fetcher_test.go @@ -0,0 +1,45 @@ +package ext + +import ( + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func TestAdminFetcherExtClient_ListProjects(t *testing.T) { + + project1 := &admin.Project{ + Id: "flyteexample", + Name: "flyteexample", + Domains: []*admin.Domain{ + { + Id: "development", + Name: "development", + }, + }, + } + + project2 := &admin.Project{ + Id: "flytesnacks", + Name: "flytesnacks", + Domains: []*admin.Domain{ + { + Id: "development", + Name: "development", + }, + }, + } + + adminClient = new(mocks.AdminServiceClient) + adminFetcherExt = AdminFetcherExtClient{AdminClient: adminClient} + + projects := &admin.Projects{ + Projects: []*admin.Project{project1, project2}, + } + adminClient.OnListProjectsMatch(mock.Anything, mock.Anything).Return(projects, nil) + _, err := adminFetcherExt.ListProjects(ctx, taskFilter) + assert.Nil(t, err) +} From bb499a90ca07dada4a75df035df6f6b620c7b0eb Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Tue, 8 Jun 2021 15:24:46 +0530 Subject: [PATCH 063/645] Added Github workflow for generating docs (#85) --- flytectl/.github/workflows/generate-docs.yaml | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 flytectl/.github/workflows/generate-docs.yaml diff --git a/flytectl/.github/workflows/generate-docs.yaml b/flytectl/.github/workflows/generate-docs.yaml new file mode 100644 index 0000000000..2a1b631b50 --- /dev/null +++ b/flytectl/.github/workflows/generate-docs.yaml @@ -0,0 +1,54 @@ +name: Generate Documentation + +on: + push: + branches: + - master + +jobs: + build: + name: Generate documentation + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + lfs: true + - uses: actions/setup-go@v1 + with: + go-version: '1.16' + - uses: actions/setup-python@v1 + with: + python-version: 3.9 + - uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: docs-pip-${{ runner.os }}-${{ hashFiles('doc-requirements.txt') }}-${{ hashFiles('doc-requirements.in') }} + restore-keys: docs-pip- + - name: Install Dependencies + run: | + # Install all requirments + pip install -r doc-requirements.txt + - name: Generate documentation + run: | + make -C docs gendocs + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.FLYTE_BOT_PAT }} + commit-message: Update documentation + committer: Flyte-Bot + author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> + signoff: true + branch: flyte-bot-update-documentation + delete-branch: true + title: 'Update documentation' + body: | + Update documentation + - Auto-generated by [flyte-bot] + labels: | + documentation + team-reviewers: | + owners + maintainers + draft: false From 38aae27c4998a3981e4dd4836457384ed470b6df Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Tue, 8 Jun 2021 18:14:47 +0530 Subject: [PATCH 064/645] downgrade python version (#87) --- flytectl/.github/workflows/generate-docs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/.github/workflows/generate-docs.yaml b/flytectl/.github/workflows/generate-docs.yaml index 2a1b631b50..818a154b1d 100644 --- a/flytectl/.github/workflows/generate-docs.yaml +++ b/flytectl/.github/workflows/generate-docs.yaml @@ -18,7 +18,7 @@ jobs: go-version: '1.16' - uses: actions/setup-python@v1 with: - python-version: 3.9 + python-version: 3.8 - uses: actions/cache@v2 with: path: ~/.cache/pip From 3a07da0e4ff8f5b2fc666d6613ac69b7f637f952 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Sun, 13 Jun 2021 02:12:32 -0700 Subject: [PATCH 065/645] Updated version of flyteidl and removed the pinned version (#90) --- flytectl/go.mod | 3 +-- flytectl/go.sum | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index ace309880f..07874fe435 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/dustin/go-humanize v1.0.0 // indirect - github.com/flyteorg/flyteidl v0.18.51 + github.com/flyteorg/flyteidl v0.19.2 github.com/flyteorg/flytestdlib v0.3.21 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 @@ -29,4 +29,3 @@ require ( sigs.k8s.io/yaml v1.2.0 ) -replace github.com/flyteorg/flyteidl => github.com/flyteorg/flyteidl v0.18.51-0.20210602050605-9ebebd25056e diff --git a/flytectl/go.sum b/flytectl/go.sum index 2397a7141f..039b42b856 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -174,6 +174,8 @@ github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v0.18.51-0.20210602050605-9ebebd25056e h1:J3Uaju9mBrJhrU4kiv3ozpZNkDdjDepkn0X6ueB8iag= github.com/flyteorg/flyteidl v0.18.51-0.20210602050605-9ebebd25056e/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.19.2 h1:jXuRrLJEzSo33N9pw7bMEd6mRYSL7LCz/vnazz5XcOg= +github.com/flyteorg/flyteidl v0.19.2/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.21 h1:AF+y6wI64DNfoi4WtZU/v18Cfwksg32fijy7PZJ8d+I= github.com/flyteorg/flytestdlib v0.3.21/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= From 517beb9a8771028cdddf300fb56851899c79847a Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 14 Jun 2021 00:06:13 +0530 Subject: [PATCH 066/645] Added flytectl config by env variable (#91) * Added flytectl config by env variable * remove -c short command from register flags Signed-off-by: Yuvraj --- .../config/subcommand/register/filesconfig_flags.go | 2 +- flytectl/cmd/register/files.go | 10 +++++----- flytectl/cmd/root.go | 13 ++++++++++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go index dce52b6c8b..ffcb0d7ec4 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go @@ -14,7 +14,7 @@ import ( func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("FilesConfig", pflag.ExitOnError) cmdFlags.StringVarP(&DefaultFilesConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), "v", DefaultFilesConfig.Version, "version of the entity to be registered with flyte.") - cmdFlags.BoolVarP(&DefaultFilesConfig.ContinueOnError, fmt.Sprintf("%v%v", prefix, "continueOnError"), "c", DefaultFilesConfig.ContinueOnError, "continue on error when registering files.") + cmdFlags.BoolVarP(&DefaultFilesConfig.ContinueOnError, fmt.Sprintf("%v%v", prefix, "continueOnError"), "", DefaultFilesConfig.ContinueOnError, "continue on error when registering files.") cmdFlags.BoolVarP(&DefaultFilesConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), "a", DefaultFilesConfig.Archive, "pass in archive file either an http link or local path.") cmdFlags.StringVarP(&DefaultFilesConfig.AssumableIamRole, fmt.Sprintf("%v%v", prefix, "assumableIamRole"), "i", DefaultFilesConfig.AssumableIamRole, " Custom assumable iam auth role to register launch plans with.") cmdFlags.StringVarP(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), "k", DefaultFilesConfig.K8ServiceAccount, " custom kubernetes service account auth role to register launch plans with.") diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index f0762d89a0..f8d07c969e 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -43,7 +43,7 @@ the continueOnError flag. Using short format of continueOnError flag :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -c + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError Overriding the default version v1 using version string. :: @@ -54,25 +54,25 @@ Change the o/p format has not effect on registration. The O/p is currently avail :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -o yaml + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -o yaml Override IamRole during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -i "arn:aws:iam::123456789:role/dummy" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -i "arn:aws:iam::123456789:role/dummy" Override Kubernetes service account during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -k "kubernetes-service-account" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -k "kubernetes-service-account" Override Output location prefix during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -l "s3://dummy/prefix" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -l "s3://dummy/prefix" Usage ` diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 15533fd625..cadeba379d 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "context" "fmt" + "os" f "github.com/flyteorg/flytectl/pkg/filesystemutils" @@ -42,8 +43,7 @@ func newRootCmd() *cobra.Command { DisableAutoGenTag: true, } - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", f.FilePathJoin(f.UserHomeDir(), configFileDir, configFileName), - "config file (default is $HOME/.flyte/config.yaml)") + rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file (default is $HOME/.flyte/config.yaml)") configAccessor.InitializePflags(rootCmd.PersistentFlags()) @@ -68,9 +68,16 @@ func newRootCmd() *cobra.Command { } func initConfig(_ *cobra.Command, _ []string) error { + configFile := f.FilePathJoin(f.UserHomeDir(), configFileDir, configFileName) + if len(os.Getenv("FLYTECTL_CONFIG")) > 0 { + configFile = os.Getenv("FLYTECTL_CONFIG") + } + if len(cfgFile) > 0 { + configFile = cfgFile + } configAccessor = viper.NewAccessor(stdConfig.Options{ StrictMode: true, - SearchPaths: []string{cfgFile}, + SearchPaths: []string{configFile}, }) err := configAccessor.UpdateConfig(context.TODO()) From c5ab11ae3bdc9bd5fc0c8c33cdf2b23af2bfab55 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 14 Jun 2021 15:33:32 +0530 Subject: [PATCH 067/645] Added sandbox command (#86) --- flytectl/README.md | 12 +- flytectl/cmd/register/examples.go | 44 +++ flytectl/cmd/register/files.go | 4 + flytectl/cmd/register/register.go | 2 + flytectl/cmd/register/register_test.go | 13 +- flytectl/cmd/register/register_util.go | 43 +++ flytectl/cmd/register/register_util_test.go | 8 + flytectl/cmd/root.go | 3 + flytectl/cmd/sandbox/sandbox.go | 45 +++ flytectl/cmd/sandbox/sandbox_test.go | 31 ++ flytectl/cmd/sandbox/sandbox_util.go | 160 ++++++++ flytectl/cmd/sandbox/sandbox_util_test.go | 100 +++++ flytectl/cmd/sandbox/start.go | 74 ++++ flytectl/cmd/sandbox/teardown.go | 53 +++ flytectl/config.yaml | 4 +- flytectl/docs/source/index.rst | 13 +- flytectl/go.mod | 16 +- flytectl/go.sum | 396 +++++++++++++++++++- 18 files changed, 988 insertions(+), 33 deletions(-) create mode 100644 flytectl/cmd/register/examples.go create mode 100644 flytectl/cmd/sandbox/sandbox.go create mode 100644 flytectl/cmd/sandbox/sandbox_test.go create mode 100644 flytectl/cmd/sandbox/sandbox_util.go create mode 100644 flytectl/cmd/sandbox/sandbox_util_test.go create mode 100644 flytectl/cmd/sandbox/start.go create mode 100644 flytectl/cmd/sandbox/teardown.go diff --git a/flytectl/README.md b/flytectl/README.md index b23d3cf373..9fb726e145 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -21,23 +21,21 @@ Generating docs locally can be accomplished by running make gendocs from within ## Installation ```bash -$ brew tap flyteorg/homebrew-tap -$ brew install flytectl +$ brew tap flyteorg/homebrew-tap/flytectl ``` ## Get Started ### Create a sandbox cluster ```bash -$ docker run --rm --privileged -p 30081:30081 -p 30082:30082 -p 30084:30084 ghcr.io/flyteorg/flyte-sandbox +$ flytectl sandbox start ``` -### Register your first workflow - +### Register flytesnacks example ```bash # Run Core workflows -$ flytectl register files https://github.com/flyteorg/flytesnacks/releases/download/v0.2.89/flytesnacks-core.tgz -d development -p flytesnacks --archive -# You can find all example at flytesnacks release page https://github.com/flyteorg/flytesnacks/releases/tag/v0.2.89 +$ flytectl register examples -d development -p flytesnacks ``` + ## Contributing [Contribution guidelines for this project](docs/CONTRIBUTING.md) diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go new file mode 100644 index 0000000000..9de4cfcf86 --- /dev/null +++ b/flytectl/cmd/register/examples.go @@ -0,0 +1,44 @@ +package register + +import ( + "context" + "fmt" + + rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" + cmdCore "github.com/flyteorg/flytectl/cmd/core" +) + +const ( + registerExampleShort = "Registers flytesnack example" + registerExampleLong = ` +Registers all latest flytesnacks example +:: + + bin/flytectl register examples -d development -p flytesnacks + + +Usage +` + githubOrg = "flyteorg" + githubRepository = "flytesnacks" + archive = true + snackReleaseURL = "https://github.com/flyteorg/flytesnacks/releases/download/%s/flytesnacks-%s.tgz" + flyteManifest = "https://github.com/flyteorg/flytesnacks/releases/download/%s/flyte_tests_manifest.json" +) + +func registerExamplesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + flytesnacks, tag, err := getFlyteTestManifest() + if err != nil { + return err + } + rconfig.DefaultFilesConfig.Archive = archive + for _, v := range flytesnacks { + args := []string{ + fmt.Sprintf(snackReleaseURL, tag, v.Name), + } + if err := Register(ctx, args, cmdCtx); err != nil { + return fmt.Errorf("Example %v failed to register %v", v.Name, err) + } + } + return nil +} diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index f8d07c969e..a33d7eea78 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -79,6 +79,10 @@ Usage ) func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + return Register(ctx, args, cmdCtx) +} + +func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { dataRefs, tmpDir, _err := getSortedFileList(ctx, args) if _err != nil { logger.Errorf(ctx, "error while un-archiving files in tmp dir due to %v", _err) diff --git a/flytectl/cmd/register/register.go b/flytectl/cmd/register/register.go index 0ae04aaaaa..ccc95a5127 100644 --- a/flytectl/cmd/register/register.go +++ b/flytectl/cmd/register/register.go @@ -28,6 +28,8 @@ func RemoteRegisterCommand() *cobra.Command { registerResourcesFuncs := map[string]cmdcore.CommandEntry{ "files": {CmdFunc: registerFromFilesFunc, Aliases: []string{"file"}, PFlagProvider: rconfig.DefaultFilesConfig, Short: registerFilesShort, Long: registerFilesLong}, + "examples": {CmdFunc: registerExamplesFunc, Aliases: []string{"example", "flytesnack", "flytesnacks"}, PFlagProvider: rconfig.DefaultFilesConfig, + Short: registerExampleShort, Long: registerExampleLong}, } cmdcore.AddCommands(registerCmd, registerResourcesFuncs) return registerCmd diff --git a/flytectl/cmd/register/register_test.go b/flytectl/cmd/register/register_test.go index 6943979912..33f48dddd3 100644 --- a/flytectl/cmd/register/register_test.go +++ b/flytectl/cmd/register/register_test.go @@ -29,13 +29,18 @@ func TestRegisterCommand(t *testing.T) { assert.Equal(t, registerCommand.Use, "register") assert.Equal(t, registerCommand.Short, "Registers tasks/workflows/launchplans from list of generated serialized files.") fmt.Println(registerCommand.Commands()) - assert.Equal(t, len(registerCommand.Commands()), 1) + assert.Equal(t, len(registerCommand.Commands()), 2) cmdNouns := registerCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - assert.Equal(t, cmdNouns[0].Use, "files") - assert.Equal(t, cmdNouns[0].Aliases, []string{"file"}) - assert.Equal(t, cmdNouns[0].Short, "Registers file resources") + + assert.Equal(t, cmdNouns[0].Use, "examples") + assert.Equal(t, cmdNouns[0].Aliases, []string{"example", "flytesnack", "flytesnacks"}) + assert.Equal(t, cmdNouns[0].Short, "Registers flytesnack example") + + assert.Equal(t, cmdNouns[1].Use, "files") + assert.Equal(t, cmdNouns[1].Aliases, []string{"file"}) + assert.Equal(t, cmdNouns[1].Short, "Registers file resources") } diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 34afc816b2..8f3883a573 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -4,6 +4,7 @@ import ( "archive/tar" "compress/gzip" "context" + "encoding/json" "errors" "fmt" "io" @@ -13,6 +14,8 @@ import ( "sort" "strings" + "github.com/google/go-github/github" + "github.com/flyteorg/flytectl/cmd/config" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -43,6 +46,21 @@ type HTTPClient interface { Do(req *http.Request) (*http.Response, error) } +var FlyteSnacksRelease []FlyteSnack + +// FlyteSnack Defines flyte test manifest structure +type FlyteSnack struct { + Name string `json:"name"` + Priority string `json:"priority"` + Path string `json:"path"` + ExitCondition Condition `json:"exitCondition"` +} + +type Condition struct { + ExitSuccess bool `json:"exit_success"` + ExitMessage string `json:"exit_message"` +} + var httpClient HTTPClient func init() { @@ -395,3 +413,28 @@ func getJSONSpec(message proto.Message) string { jsonSpec, _ := marshaller.MarshalToString(message) return jsonSpec } + +func getFlyteTestManifest() ([]FlyteSnack, string, error) { + c := github.NewClient(nil) + opt := &github.ListOptions{Page: 1, PerPage: 1} + releases, _, err := c.Repositories.ListReleases(context.Background(), githubOrg, githubRepository, opt) + if err != nil { + return nil, "", err + } + response, err := http.Get(fmt.Sprintf(flyteManifest, *releases[0].TagName)) + if err != nil { + return nil, "", err + } + defer response.Body.Close() + + data, err := ioutil.ReadAll(response.Body) + if err != nil { + return nil, "", err + } + + err = json.Unmarshal(data, &FlyteSnacksRelease) + if err != nil { + return nil, "", err + } + return FlyteSnacksRelease, *releases[0].TagName, nil +} diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index a30c6016e3..b7d66ada8c 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -310,3 +310,11 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { assert.Equal(t, &admin.RawOutputDataConfig{OutputLocationPrefix: "prefix"}, lpSpec.RawOutputDataConfig) }) } + +func TestFlyteManifest(t *testing.T) { + flytesnacks, tag, err := getFlyteTestManifest() + assert.Nil(t, err) + assert.Contains(t, tag, "v") + assert.NotEmpty(t, tag) + assert.Greater(t, len(flytesnacks), 1) +} diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index cadeba379d..a3e942b4fc 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -5,6 +5,8 @@ import ( "fmt" "os" + "github.com/flyteorg/flytectl/cmd/sandbox" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/flyteorg/flytectl/cmd/config" @@ -58,6 +60,7 @@ func newRootCmd() *cobra.Command { rootCmd.AddCommand(update.CreateUpdateCommand()) rootCmd.AddCommand(register.RemoteRegisterCommand()) rootCmd.AddCommand(delete.RemoteDeleteCommand()) + rootCmd.AddCommand(sandbox.CreateSandboxCommand()) // Added version command versioncmd := version.GetVersionCommand(rootCmd) cmdCore.AddCommands(rootCmd, versioncmd) diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go new file mode 100644 index 0000000000..995c6c6890 --- /dev/null +++ b/flytectl/cmd/sandbox/sandbox.go @@ -0,0 +1,45 @@ +package sandbox + +import ( + cmdcore "github.com/flyteorg/flytectl/cmd/core" + "github.com/spf13/cobra" +) + +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + sandboxShort = `Used for testing flyte sandbox.` + sandboxLong = ` +Example Create sandbox cluster. +:: + + bin/flytectl sandbox start + + +Example Remove sandbox cluster. +:: + + bin/flytectl sandbox teardown +` +) + +// CreateSandboxCommand will return sandbox command +func CreateSandboxCommand() *cobra.Command { + sandbox := &cobra.Command{ + Use: "sandbox", + Short: sandboxShort, + Long: sandboxLong, + } + + sandboxResourcesFuncs := map[string]cmdcore.CommandEntry{ + "start": {CmdFunc: startSandboxCluster, Aliases: []string{}, ProjectDomainNotRequired: true, + Short: startShort, + Long: startLong}, + "teardown": {CmdFunc: teardownSandboxCluster, Aliases: []string{}, ProjectDomainNotRequired: true, + Short: teardownShort, + Long: teardownLong}, + } + + cmdcore.AddCommands(sandbox, sandboxResourcesFuncs) + + return sandbox +} diff --git a/flytectl/cmd/sandbox/sandbox_test.go b/flytectl/cmd/sandbox/sandbox_test.go new file mode 100644 index 0000000000..fe3f964572 --- /dev/null +++ b/flytectl/cmd/sandbox/sandbox_test.go @@ -0,0 +1,31 @@ +package sandbox + +import ( + "fmt" + "sort" + "testing" + + "gotest.tools/assert" +) + +func TestCreateSandboxCommand(t *testing.T) { + sandboxCommand := CreateSandboxCommand() + assert.Equal(t, sandboxCommand.Use, "sandbox") + assert.Equal(t, sandboxCommand.Short, "Used for testing flyte sandbox.") + fmt.Println(sandboxCommand.Commands()) + assert.Equal(t, len(sandboxCommand.Commands()), 2) + cmdNouns := sandboxCommand.Commands() + // Sort by Use value. + sort.Slice(cmdNouns, func(i, j int) bool { + return cmdNouns[i].Use < cmdNouns[j].Use + }) + + assert.Equal(t, cmdNouns[0].Use, "start") + assert.Equal(t, cmdNouns[0].Short, startShort) + assert.Equal(t, cmdNouns[0].Long, startLong) + + assert.Equal(t, cmdNouns[1].Use, "teardown") + assert.Equal(t, cmdNouns[1].Short, teardownShort) + assert.Equal(t, cmdNouns[1].Long, teardownLong) + +} diff --git a/flytectl/cmd/sandbox/sandbox_util.go b/flytectl/cmd/sandbox/sandbox_util.go new file mode 100644 index 0000000000..d739e671a7 --- /dev/null +++ b/flytectl/cmd/sandbox/sandbox_util.go @@ -0,0 +1,160 @@ +package sandbox + +import ( + "bufio" + "context" + "fmt" + "io" + "io/ioutil" + "net/http" + "os" + "strings" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/mount" + "github.com/docker/docker/client" + "github.com/docker/go-connections/nat" + + "github.com/enescakir/emoji" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" +) + +var ( + Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") + FlytectlConfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "config.yaml") + SuccessMessage = "Flyte is ready! Flyte UI is available at http://localhost:30081/console" + ImageName = "ghcr.io/flyteorg/flyte-sandbox:dind" + SandboxClusterName = "flyte-sandbox" + Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} +) + +func setupFlytectlConfig() error { + response, err := http.Get("https://raw.githubusercontent.com/flyteorg/flytectl/master/config.yaml") + if err != nil { + return err + } + defer response.Body.Close() + + data, err := ioutil.ReadAll(response.Body) + if err != nil { + return err + } + + err = ioutil.WriteFile(FlytectlConfig, data, 0600) + if err != nil { + fmt.Printf("Please create ~/.flyte dir %v \n", emoji.ManTechnologist) + return err + } + return nil +} + +func configCleanup() error { + err := os.Remove(FlytectlConfig) + if err != nil { + return err + } + err = os.RemoveAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s")) + if err != nil { + return err + } + return nil +} + +func getSandbox(cli *client.Client) *types.Container { + containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{ + All: true, + }) + if err != nil { + return nil + } + for _, v := range containers { + if strings.Contains(v.Names[0], SandboxClusterName) { + return &v + } + } + return nil +} + +func startContainer(cli *client.Client) (string, error) { + ExposedPorts, PortBindings, _ := nat.ParsePortSpecs([]string{ + "127.0.0.1:30086:30086", + "127.0.0.1:30081:30081", + "127.0.0.1:30082:30082", + "127.0.0.1:30084:30084", + }) + r, err := cli.ImagePull(context.Background(), ImageName, types.ImagePullOptions{}) + if err != nil { + return "", err + } + + if _, err := io.Copy(os.Stdout, r); err != nil { + return "", err + } + + resp, err := cli.ContainerCreate(context.Background(), &container.Config{ + Env: Environment, + Image: ImageName, + Tty: false, + ExposedPorts: ExposedPorts, + }, &container.HostConfig{ + Mounts: []mount.Mount{ + { + Type: mount.TypeBind, + Source: f.FilePathJoin(f.UserHomeDir(), ".flyte"), + Target: "/etc/rancher/", + }, + // TODO (Yuvraj) Add flytectl config in sandbox and mount with host file system + //{ + // Type: mount.TypeBind, + // Source: f.FilePathJoin(f.UserHomeDir(), ".flyte", "config.yaml"), + // Target: "/.flyte/", + //}, + }, + PortBindings: PortBindings, + Privileged: true, + }, nil, + nil, SandboxClusterName) + if err != nil { + return "", err + } + + if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil { + return "", err + } + return resp.ID, nil +} + +func watchError(cli *client.Client, id string) { + statusCh, errCh := cli.ContainerWait(context.Background(), id, container.WaitConditionNotRunning) + select { + case err := <-errCh: + if err != nil { + panic(err) + } + case <-statusCh: + } +} + +func readLogs(cli *client.Client, id string) error { + reader, err := cli.ContainerLogs(context.Background(), id, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }) + if err != nil { + return err + } + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + if strings.Contains(scanner.Text(), SuccessMessage) { + fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, SuccessMessage, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) + fmt.Printf("Please visit https://github.com/flyteorg/flytesnacks for more example %v \n", emoji.Rocket) + fmt.Printf("Register all flytesnacks example by running 'flytectl register examples -d development -p flytesnacks' \n") + break + } + fmt.Println(scanner.Text()) + } + return nil +} diff --git a/flytectl/cmd/sandbox/sandbox_util_test.go b/flytectl/cmd/sandbox/sandbox_util_test.go new file mode 100644 index 0000000000..269152a9ba --- /dev/null +++ b/flytectl/cmd/sandbox/sandbox_util_test.go @@ -0,0 +1,100 @@ +package sandbox + +import ( + "context" + "io/ioutil" + "os" + "strings" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/client" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + u "github.com/flyteorg/flytectl/cmd/testutils" + + f "github.com/flyteorg/flytectl/pkg/filesystemutils" + + "github.com/stretchr/testify/assert" +) + +var ( + cmdCtx cmdCore.CommandContext +) + +func cleanup(client *client.Client) error { + containers, err := client.ContainerList(context.Background(), types.ContainerListOptions{ + All: true, + }) + if err != nil { + return err + } + for _, v := range containers { + if strings.Contains(v.Names[0], SandboxClusterName) { + if err := client.ContainerRemove(context.Background(), v.ID, types.ContainerRemoveOptions{}); err != nil { + return err + } + } + } + return nil +} + +func setupSandbox() { + mockAdminClient := u.MockClient + cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) + _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) + if os.IsNotExist(err) { + _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) + } + _ = setupFlytectlConfig() +} + +func TestConfigCleanup(t *testing.T) { + _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) + if os.IsNotExist(err) { + _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) + } + _ = ioutil.WriteFile(FlytectlConfig, []byte("string"), 0600) + _ = ioutil.WriteFile(Kubeconfig, []byte("string"), 0600) + + err = configCleanup() + assert.Nil(t, err) + + _, err = os.Stat(FlytectlConfig) + check := os.IsNotExist(err) + assert.Equal(t, check, true) + + _, err = os.Stat(Kubeconfig) + check = os.IsNotExist(err) + assert.Equal(t, check, true) + _ = configCleanup() +} + +func TestSetupFlytectlConfig(t *testing.T) { + _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) + if os.IsNotExist(err) { + _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) + } + err = setupFlytectlConfig() + assert.Nil(t, err) + _, err = os.Stat(FlytectlConfig) + assert.Nil(t, err) + check := os.IsNotExist(err) + assert.Equal(t, check, false) + _ = configCleanup() +} + +func TestTearDownSandbox(t *testing.T) { + setupSandbox() + cli, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + err := teardownSandboxCluster(context.Background(), []string{}, cmdCtx) + assert.Nil(t, err) + assert.Nil(t, cleanup(cli)) +} + +func TestStartContainer(t *testing.T) { + setupSandbox() + cli, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + assert.Nil(t, cleanup(cli)) + err := startSandboxCluster(context.Background(), []string{}, cmdCtx) + assert.Nil(t, err) +} diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go new file mode 100644 index 0000000000..6a620603dd --- /dev/null +++ b/flytectl/cmd/sandbox/start.go @@ -0,0 +1,74 @@ +package sandbox + +import ( + "context" + "fmt" + "os" + + "github.com/docker/docker/client" + "github.com/enescakir/emoji" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" +) + +const ( + startShort = "Start the flyte sandbox" + startLong = ` +Start will run the flyte sandbox cluster inside a docker container and setup the config that is required +:: + + bin/flytectl start + +Usage + ` +) + +type ExecResult struct { + StdOut string + StdErr string + ExitCode int +} + +func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + fmt.Printf("%v It will take some time, We will start a fresh flyte cluster for you %v %v\n", emoji.ManTechnologist, emoji.Rocket, emoji.Rocket) + cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + if err != nil { + fmt.Printf("Please Check your docker client %v \n", emoji.ManTechnologist) + return err + } + + if err := setupFlytectlConfig(); err != nil { + return err + } + + if container := getSandbox(cli); container != nil { + if cmdUtil.AskForConfirmation("delete existing sandbox cluster", os.Stdin) { + if err := teardownSandboxCluster(ctx, []string{}, cmdCtx); err != nil { + return err + } + } + } + + ID, err := startContainer(cli) + if err == nil { + os.Setenv("KUBECONFIG", Kubeconfig) + + defer func() { + if r := recover(); r != nil { + fmt.Println("Something goes wrong with container status", r) + } + }() + + go watchError(cli, ID) + if err := readLogs(cli, ID); err != nil { + return err + } + + fmt.Printf("Add (KUBECONFIG) to your environment variabl \n") + fmt.Printf("export KUBECONFIG=%v \n", Kubeconfig) + return nil + } + fmt.Println("Something goes wrong. We are not able to start sandbox container, Please check your docker client and try again \n", emoji.Rocket) + fmt.Printf("error: %v", err) + return nil +} diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go new file mode 100644 index 0000000000..9e0c9c5d50 --- /dev/null +++ b/flytectl/cmd/sandbox/teardown.go @@ -0,0 +1,53 @@ +package sandbox + +import ( + "context" + "fmt" + + "github.com/enescakir/emoji" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/client" + cmdCore "github.com/flyteorg/flytectl/cmd/core" +) + +const ( + teardownShort = "Teardown will cleanup the sandbox environment" + teardownLong = ` +Teardown will remove docker container and all the flyte config +:: + + bin/flytectl sandbox teardown + +Stop will remove docker container and all the flyte config +:: + + bin/flytectl sandbox stop + + +Usage +` +) + +func teardownSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + + cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + if err != nil { + return err + } + + container := getSandbox(cli) + if container != nil { + if err := cli.ContainerRemove(ctx, container.ID, types.ContainerRemoveOptions{ + Force: true, + }); err != nil { + return err + } + } + + if err := configCleanup(); err != nil { + fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) + } + fmt.Printf("Sandbox cluster is removed successfully %v \n", emoji.Rocket) + return nil +} diff --git a/flytectl/config.yaml b/flytectl/config.yaml index a4505fccf6..eccd8b7498 100644 --- a/flytectl/config.yaml +++ b/flytectl/config.yaml @@ -1,7 +1,7 @@ admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///flyte.myexample.com - authType: Pkce + endpoint: dns:///localhost:30081 + insecure: true logger: show-source: true level: 1 diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 2cf449aeb6..3ac81e83d6 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -8,12 +8,19 @@ Install ======= Flytectl is a Golang binary and can be installed on any platform supported by -golang. To install simply copy paste the following into the command-line: +golang + +Install flytectl with homebrew tap .. prompt:: bash - curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash + brew tap flyteorg/homebrew-tap/flytectl + +Install flytectl with shell script +.. prompt:: bash + + curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash Configure ========= @@ -29,8 +36,6 @@ Basic Configuration # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: dns:///flyte.lyft.net authType: Pkce - # Change insecure flag to ensure that you use the right setting for your environment - insecure: true logger: # Logger settings to control logger output. Useful to debug logger: show-source: true diff --git a/flytectl/go.mod b/flytectl/go.mod index 07874fe435..e5bac1bdc0 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -3,17 +3,25 @@ module github.com/flyteorg/flytectl go 1.13 require ( - github.com/dustin/go-humanize v1.0.0 // indirect - github.com/flyteorg/flyteidl v0.19.2 + github.com/Microsoft/go-winio v0.5.0 // indirect + github.com/containerd/containerd v1.5.2 // indirect + github.com/docker/docker v20.10.7+incompatible + github.com/docker/go-connections v0.4.0 + github.com/enescakir/emoji v1.0.0 + github.com/flyteorg/flyteidl v0.18.51 github.com/flyteorg/flytestdlib v0.3.21 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 - github.com/google/uuid v1.1.2 + github.com/google/go-github v17.0.0+incompatible + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/uuid v1.2.0 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/kr/text v0.2.0 // indirect github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/mapstructure v1.4.1 + github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect + github.com/morikuni/aec v1.0.0 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/sirupsen/logrus v1.8.0 github.com/spf13/cobra v1.1.3 @@ -26,6 +34,6 @@ require ( google.golang.org/protobuf v1.25.0 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.4.0 + gotest.tools v2.2.0+incompatible sigs.k8s.io/yaml v1.2.0 ) - diff --git a/flytectl/go.sum b/flytectl/go.sum index 039b42b856..5138a2d9b5 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -1,3 +1,4 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -39,16 +40,22 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 cloud.google.com/go/storage v1.12.0 h1:4y3gHptW1EHVtcPAVE0eBBlFuGqEejTTG3KdIE0lUX4= cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v51.0.0+incompatible h1:p7blnyJSjJqf5jflHbSGhIhEpXIgIFmYZNg5uwqweso= github.com/Azure/azure-sdk-for-go v51.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= @@ -57,6 +64,7 @@ github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8K github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= @@ -70,11 +78,31 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= @@ -84,27 +112,40 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -112,11 +153,16 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -124,14 +170,103 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.2 h1:MG/Bg1pbmMb61j3wHCFWPxESXHieiKr2xG64px/k8zQ= +github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -139,15 +274,40 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/danieljoos/wincred v1.1.0 h1:3RNcEpBg4IhIChZdFRSdlQt1QjCp1sMAPIrOnm7Yf8g= github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -159,6 +319,9 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/enescakir/emoji v1.0.0 h1:W+HsNql8swfCQFtioDGDHCHri8nudlK1n5p2rHCJoog= +github.com/enescakir/emoji v1.0.0/go.mod h1:Bt1EKuLnKDTYpLALApstIkAjdDrS/8IAgTkKp+WKFD0= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -172,10 +335,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.18.51-0.20210602050605-9ebebd25056e h1:J3Uaju9mBrJhrU4kiv3ozpZNkDdjDepkn0X6ueB8iag= -github.com/flyteorg/flyteidl v0.18.51-0.20210602050605-9ebebd25056e/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= -github.com/flyteorg/flyteidl v0.19.2 h1:jXuRrLJEzSo33N9pw7bMEd6mRYSL7LCz/vnazz5XcOg= -github.com/flyteorg/flyteidl v0.19.2/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.18.51 h1:fp4Qq9WtO3QeDbFpKk0uQqB/cF78+Ul7D3DhvQPlV5Q= +github.com/flyteorg/flyteidl v0.18.51/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.21 h1:AF+y6wI64DNfoi4WtZU/v18Cfwksg32fijy7PZJ8d+I= github.com/flyteorg/flytestdlib v0.3.21/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= @@ -183,15 +344,19 @@ github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTg github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -213,13 +378,22 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -264,6 +438,10 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= @@ -286,8 +464,9 @@ github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= @@ -295,9 +474,13 @@ github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3i github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graymeta/stow v0.2.7 h1:b31cB1Ylw/388sYSZxnmpjT2QxC21AaQ8fRnUtE13b4= github.com/graymeta/stow v0.2.7/go.mod h1:JAs139Zr29qfsecy7b+h9DRsWXbFbsd7LCrbCDYI84k= @@ -316,10 +499,12 @@ github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBt github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -342,9 +527,15 @@ github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmK github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -369,12 +560,16 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -387,11 +582,14 @@ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0U github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -402,9 +600,13 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -415,13 +617,25 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= @@ -432,23 +646,54 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -470,6 +715,7 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -479,15 +725,19 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -495,23 +745,30 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.3.0 h1:Uehi/mxLK0eiUc0H0++5tpMGTexB8wZ598MIgU8VpDM= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -520,13 +777,18 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -534,6 +796,7 @@ github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -547,7 +810,9 @@ github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= @@ -555,21 +820,26 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -579,22 +849,47 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zalando/go-keyring v0.1.1 h1:w2V9lcx/Uj4l+dzAf1m9s+DJ1O8ROkEHnynonHjTcYE= github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRzC8UFJH9+L8= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -613,7 +908,9 @@ go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -623,9 +920,11 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -664,6 +963,7 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -675,13 +975,16 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -697,13 +1000,15 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -738,23 +1043,38 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -764,19 +1084,29 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492 h1:Paq34FxTluEPvVyayQqMPgHm+vTOrIifmcYxFBx9TLg= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -810,6 +1140,7 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -861,6 +1192,7 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -893,11 +1225,13 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -907,6 +1241,7 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -929,12 +1264,14 @@ google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 h1:uLBY0yHDCj2PMQ98KWDSIDFwn9zK2zh+tgWtbvPPBjI= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -944,6 +1281,7 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -970,8 +1308,10 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= @@ -980,12 +1320,17 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -1001,6 +1346,11 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1010,22 +1360,44 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= -k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 h1:d+LBRNY3c/KGp7lDblRlUJkayx4Vla7WUTIazoGMdYo= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6 h1:R5p3SlhaABYShQSO6LpPsYHjV05Q+79eBUR0Ut/f4tk= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6 h1:nJZOfolnsVtDtbGJNCxzOtKUAu7zvXjB8+pMo9UNxZo= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= From c7d02dfdbe733bd834fbade8b5eae21fe716ce6e Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss <77798312+pmahindrakar-oss@users.noreply.github.com> Date: Tue, 15 Jun 2021 09:46:22 +0530 Subject: [PATCH 068/645] Bumped up flyteidl to 0.19.2 (#94) Signed-off-by: Prafulla Mahindrakar --- flytectl/go.mod | 2 +- flytectl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index e5bac1bdc0..badf4b152a 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -8,7 +8,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.18.51 + github.com/flyteorg/flyteidl v0.19.2 github.com/flyteorg/flytestdlib v0.3.21 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 diff --git a/flytectl/go.sum b/flytectl/go.sum index 5138a2d9b5..34735a6953 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -335,8 +335,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.18.51 h1:fp4Qq9WtO3QeDbFpKk0uQqB/cF78+Ul7D3DhvQPlV5Q= -github.com/flyteorg/flyteidl v0.18.51/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.19.2 h1:jXuRrLJEzSo33N9pw7bMEd6mRYSL7LCz/vnazz5XcOg= +github.com/flyteorg/flyteidl v0.19.2/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.21 h1:AF+y6wI64DNfoi4WtZU/v18Cfwksg32fijy7PZJ8d+I= github.com/flyteorg/flytestdlib v0.3.21/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= From 122d1628748dc92884b68342ed83f202b2a7fd7f Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Tue, 15 Jun 2021 22:34:33 +0530 Subject: [PATCH 069/645] new flytestd libe version added (#93) * new flytestd libe version added Signed-off-by: Yuvraj --- flytectl/.github/workflows/build.yaml | 2 + flytectl/README.md | 12 ++++- flytectl/docs/source/index.rst | 4 +- flytectl/go.mod | 2 +- flytectl/go.sum | 4 +- flytectl/pkg/filters/coverage.out | 68 --------------------------- 6 files changed, 19 insertions(+), 73 deletions(-) delete mode 100644 flytectl/pkg/filters/coverage.out diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml index 9f4ae2c1d6..43e996590c 100644 --- a/flytectl/.github/workflows/build.yaml +++ b/flytectl/.github/workflows/build.yaml @@ -12,6 +12,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + with: + fetch-depth: "0" - name: Run GoReleaser dry run uses: goreleaser/goreleaser-action@v2 with: diff --git a/flytectl/README.md b/flytectl/README.md index 9fb726e145..1dab7131eb 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -20,9 +20,19 @@ Generating docs locally can be accomplished by running make gendocs from within ## Installation +Install flytectl with homebrew tap ```bash -$ brew tap flyteorg/homebrew-tap/flytectl +$ brew install flyteorg/homebrew-tap/flytectl + +# Upgrade flytectl +$ brew upgrade flytectl ``` + +Install flytectl with shell script +```bash +$ curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash +``` + ## Get Started ### Create a sandbox cluster diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 3ac81e83d6..1113458744 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -14,7 +14,9 @@ Install flytectl with homebrew tap .. prompt:: bash - brew tap flyteorg/homebrew-tap/flytectl + brew install flyteorg/homebrew-tap/flytectl + # Upgrade flytectl + brew upgrade flytectl Install flytectl with shell script diff --git a/flytectl/go.mod b/flytectl/go.mod index badf4b152a..522426121a 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 github.com/flyteorg/flyteidl v0.19.2 - github.com/flyteorg/flytestdlib v0.3.21 + github.com/flyteorg/flytestdlib v0.3.24 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 github.com/google/go-github v17.0.0+incompatible diff --git a/flytectl/go.sum b/flytectl/go.sum index 34735a6953..a6fadab413 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -338,8 +338,8 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/flyteorg/flyteidl v0.19.2 h1:jXuRrLJEzSo33N9pw7bMEd6mRYSL7LCz/vnazz5XcOg= github.com/flyteorg/flyteidl v0.19.2/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= -github.com/flyteorg/flytestdlib v0.3.21 h1:AF+y6wI64DNfoi4WtZU/v18Cfwksg32fijy7PZJ8d+I= -github.com/flyteorg/flytestdlib v0.3.21/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= +github.com/flyteorg/flytestdlib v0.3.24 h1:Eu5TMKch9ihOavPKufgTBI677eVYjJpOAPPg9hfZIzU= +github.com/flyteorg/flytestdlib v0.3.24/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= diff --git a/flytectl/pkg/filters/coverage.out b/flytectl/pkg/filters/coverage.out deleted file mode 100644 index 937e698b18..0000000000 --- a/flytectl/pkg/filters/coverage.out +++ /dev/null @@ -1,68 +0,0 @@ -mode: set -github.com/flyteorg/flytectl/pkg/filters/filters.go:18.41,19.18 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:22.2,22.19 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:19.18,21.3 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:26.50,28.28 2 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:47.2,47.25 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:28.28,29.39 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:29.39,31.18 2 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:34.4,34.36 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:31.18,33.5 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:34.36,36.29 2 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:36.29,38.6 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:38.11,40.6 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:41.10,44.5 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:51.37,53.34 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:56.2,56.14 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:53.34,55.3 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:64.47,66.2 1 0 -github.com/flyteorg/flytectl/pkg/filters/filters.go:70.46,72.36 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:76.2,78.22 3 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:104.2,104.13 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:108.2,108.24 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:72.36,74.3 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:78.22,79.14 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:92.3,92.12 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:79.14,80.13 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:88.4,89.12 2 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:81.24,83.19 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:84.12,86.72 1 0 -github.com/flyteorg/flytectl/pkg/filters/filters.go:93.13,94.18 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:95.17,97.34 1 0 -github.com/flyteorg/flytectl/pkg/filters/filters.go:98.11,99.18 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:104.13,106.3 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:116.39,118.2 1 0 -github.com/flyteorg/flytectl/pkg/filters/filters.go:121.58,122.24 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:144.2,144.26 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:122.24,125.36 3 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:125.36,126.22 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:126.22,127.40 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:127.40,130.6 2 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:131.10,131.23 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:131.23,132.34 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:132.34,136.6 3 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:137.10,138.41 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:138.41,140.6 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:148.44,149.12 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:167.2,167.11 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:150.25,151.45 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:152.22,153.45 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:154.19,155.44 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:156.16,157.44 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:158.16,159.50 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:160.17,161.44 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:162.14,163.44 1 1 -github.com/flyteorg/flytectl/pkg/filters/filters.go:164.10,165.50 1 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:7.116,9.16 2 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:12.2,20.19 2 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:23.2,23.49 1 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:26.2,26.21 1 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:9.16,11.3 1 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:20.19,22.3 1 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:23.49,25.3 1 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:29.76,31.16 2 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:34.2,39.21 2 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:31.16,33.3 1 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:42.49,44.11 2 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:47.2,50.3 1 1 -github.com/flyteorg/flytectl/pkg/filters/util.go:44.11,46.3 1 1 From 400d4b6c6cd39f65021809f14b0676824219c484 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Wed, 16 Jun 2021 10:07:54 +0530 Subject: [PATCH 070/645] Added gpg sign commit for flyte-bot (#92) * Added gpg sign Signed-off-by: Yuvraj --- .../workflows/boilerplate-automation.yml | 6 +++ flytectl/.github/workflows/generate-docs.yaml | 6 +++ .../.github/workflows/release-automation.yml | 47 +++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 flytectl/.github/workflows/release-automation.yml diff --git a/flytectl/.github/workflows/boilerplate-automation.yml b/flytectl/.github/workflows/boilerplate-automation.yml index c6c8a2a53b..1692c7059e 100644 --- a/flytectl/.github/workflows/boilerplate-automation.yml +++ b/flytectl/.github/workflows/boilerplate-automation.yml @@ -10,6 +10,12 @@ jobs: - uses: actions/checkout@v2 with: fetch-depth: "0" + - uses: crazy-max/ghaction-import-gpg@v3 + with: + gpg-private-key: ${{ secrets.FLYTE_BOT_GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.FLYTE_BOT_GPG_PASSPHRASE }} + git-user-signingkey: true + git-commit-gpgsign: true - name: Update Boilerplate run: | make update_boilerplate diff --git a/flytectl/.github/workflows/generate-docs.yaml b/flytectl/.github/workflows/generate-docs.yaml index 818a154b1d..21c0aad628 100644 --- a/flytectl/.github/workflows/generate-docs.yaml +++ b/flytectl/.github/workflows/generate-docs.yaml @@ -24,6 +24,12 @@ jobs: path: ~/.cache/pip key: docs-pip-${{ runner.os }}-${{ hashFiles('doc-requirements.txt') }}-${{ hashFiles('doc-requirements.in') }} restore-keys: docs-pip- + - uses: crazy-max/ghaction-import-gpg@v3 + with: + gpg-private-key: ${{ secrets.FLYTE_BOT_GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.FLYTE_BOT_GPG_PASSPHRASE }} + git-user-signingkey: true + git-commit-gpgsign: true - name: Install Dependencies run: | # Install all requirments diff --git a/flytectl/.github/workflows/release-automation.yml b/flytectl/.github/workflows/release-automation.yml new file mode 100644 index 0000000000..0c16bd1c00 --- /dev/null +++ b/flytectl/.github/workflows/release-automation.yml @@ -0,0 +1,47 @@ +name: Update flyteidl version +on: + workflow_dispatch: + +jobs: + update-flyte-releases: + name: Update Flyteidl version + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: "0" + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.16 + - uses: crazy-max/ghaction-import-gpg@v3 + with: + gpg-private-key: ${{ secrets.FLYTE_BOT_GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.FLYTE_BOT_GPG_PASSPHRASE }} + git-user-signingkey: true + git-commit-gpgsign: true + - name: Update Flyte component + run: | + FLYTEIDL_VERSION=$(curl --silent "https://api.github.com/repos/flyteorg/flyteidl/releases/latest" | jq -r .tag_name) + go get -u github.com/flyteorg/flyteidl@$FLYTEIDL_VERSION + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.FLYTE_BOT_PAT }} + commit-message: Update Flyteidl version + committer: Flyte-Bot + author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> + signoff: true + branch: flyte-bot-update-flyteidl + delete-branch: true + title: 'Update Flyteidl version' + body: | + Update Flyteidl version + - Auto-generated by [flyte-bot] + labels: | + flyteidl + team-reviewers: | + owners + maintainers + draft: false \ No newline at end of file From d98708da2e4c4582b8adbf8c88b8bb657e0127be Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Wed, 16 Jun 2021 21:21:11 +0530 Subject: [PATCH 071/645] Release a new version for each master merge (#96) * release a new version in each master merge Signed-off-by: Yuvraj --- flytectl/.github/workflows/master.yml | 63 ++++++++++++++++++++++++++ flytectl/.github/workflows/release.yml | 19 -------- 2 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 flytectl/.github/workflows/master.yml delete mode 100644 flytectl/.github/workflows/release.yml diff --git a/flytectl/.github/workflows/master.yml b/flytectl/.github/workflows/master.yml new file mode 100644 index 0000000000..3e21b83bd7 --- /dev/null +++ b/flytectl/.github/workflows/master.yml @@ -0,0 +1,63 @@ +name: Master + +on: + push: + branches: + - master + +jobs: + bump-version: + name: Bump Version + if: github.event.head_commit.name != 'flyte-bot' + runs-on: ubuntu-latest + outputs: + version: ${{ steps.bump-version.outputs.tag }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: '0' + - name: Bump version and push tag + id: bump-version + uses: anothrNick/github-tag-action@1.17.2 + env: + GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} + WITH_V: true + DEFAULT_BUMP: patch + + goreleaser: + name: Release flytectl + runs-on: ubuntu-latest + needs: [ bump-version ] + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: "0" + - name: Run GoReleaser dry run + uses: goreleaser/goreleaser-action@v2 + with: + version: latest + args: release --rm-dist + env: + GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} + + test: + name: Run tests and lint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: "0" + - name: Unit Tests + uses: cedrickring/golang-action@1.5.2 + env: + GO111MODULE: "on" + with: + args: make install && make test_unit_codecov + - name: Lint + uses: cedrickring/golang-action@1.5.2 + env: + GO111MODULE: "on" + with: + args: make install && make lint \ No newline at end of file diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml deleted file mode 100644 index 6f27d86990..0000000000 --- a/flytectl/.github/workflows/release.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: releaser -on: - push: - tags: - - 'v*' - -jobs: - create-release: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v2 - with: - version: latest - args: release --rm-dist --debug - env: - GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} From 1cfb915554615a4e954a7b68eaa05c05e92926cd Mon Sep 17 00:00:00 2001 From: Haytham Abuelfutuh Date: Wed, 16 Jun 2021 16:24:44 -0700 Subject: [PATCH 072/645] Pass k8s account on LP Execution (#100) Signed-off-by: Haytham Abuelfutuh --- flytectl/cmd/create/execution_util.go | 67 ++++++++++++++++++--------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 94924fbfaa..4442301327 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -16,60 +16,79 @@ import ( func createExecutionRequestForWorkflow(ctx context.Context, workflowName, project, domain string, cmdCtx cmdCore.CommandContext) (*admin.ExecutionCreateRequest, error) { - var lp *admin.LaunchPlan - var err error - // Fetch the launch plan - if lp, err = cmdCtx.AdminFetcherExt().FetchLPVersion(ctx, workflowName, executionConfig.Version, project, domain); err != nil { + lp, err := cmdCtx.AdminFetcherExt().FetchLPVersion(ctx, workflowName, executionConfig.Version, project, domain) + if err != nil { return nil, err } // Create workflow params literal map - var paramLiterals map[string]*core.Literal workflowParams := cmdGet.WorkflowParams(lp) - - if paramLiterals, err = MakeLiteralForParams(executionConfig.Inputs, workflowParams); err != nil { + paramLiterals, err := MakeLiteralForParams(executionConfig.Inputs, workflowParams) + if err != nil { return nil, err } + var inputs = &core.LiteralMap{ Literals: paramLiterals, } - ID := lp.Id - return createExecutionRequest(ID, inputs, nil), nil + // Set both deprecated field and new field for security identity passing + authRole := &admin.AuthRole{ + KubernetesServiceAccount: executionConfig.KubeServiceAcct, + AssumableIamRole: executionConfig.IamRoleARN, + } + + securityContext := &core.SecurityContext{ + RunAs: &core.Identity{ + K8SServiceAccount: executionConfig.KubeServiceAcct, + IamRole: executionConfig.IamRoleARN, + }, + } + + return createExecutionRequest(lp.Id, inputs, securityContext, authRole), nil } func createExecutionRequestForTask(ctx context.Context, taskName string, project string, domain string, cmdCtx cmdCore.CommandContext) (*admin.ExecutionCreateRequest, error) { - var task *admin.Task - var err error // Fetch the task - if task, err = cmdCtx.AdminFetcherExt().FetchTaskVersion(ctx, taskName, executionConfig.Version, project, domain); err != nil { + task, err := cmdCtx.AdminFetcherExt().FetchTaskVersion(ctx, taskName, executionConfig.Version, project, domain) + if err != nil { return nil, err } // Create task variables literal map - var variableLiterals map[string]*core.Literal taskInputs := cmdGet.TaskInputs(task) - if variableLiterals, err = MakeLiteralForVariables(executionConfig.Inputs, taskInputs); err != nil { + variableLiterals, err := MakeLiteralForVariables(executionConfig.Inputs, taskInputs) + if err != nil { return nil, err } + var inputs = &core.LiteralMap{ Literals: variableLiterals, } - var authRole *admin.AuthRole - if executionConfig.KubeServiceAcct != "" { - authRole = &admin.AuthRole{KubernetesServiceAccount: executionConfig.KubeServiceAcct} - } else { - authRole = &admin.AuthRole{AssumableIamRole: executionConfig.IamRoleARN} + + // Set both deprecated field and new field for security identity passing + authRole := &admin.AuthRole{ + KubernetesServiceAccount: executionConfig.KubeServiceAcct, + AssumableIamRole: executionConfig.IamRoleARN, } - ID := &core.Identifier{ + + securityContext := &core.SecurityContext{ + RunAs: &core.Identity{ + K8SServiceAccount: executionConfig.KubeServiceAcct, + IamRole: executionConfig.IamRoleARN, + }, + } + + id := &core.Identifier{ ResourceType: core.ResourceType_TASK, Project: project, Domain: domain, Name: task.Id.Name, Version: task.Id.Version, } - return createExecutionRequest(ID, inputs, authRole), nil + + return createExecutionRequest(id, inputs, securityContext, authRole), nil } func relaunchExecution(ctx context.Context, executionName string, project string, domain string, @@ -88,8 +107,9 @@ func relaunchExecution(ctx context.Context, executionName string, project string return nil } -func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, +func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, securityContext *core.SecurityContext, authRole *admin.AuthRole) *admin.ExecutionCreateRequest { + return &admin.ExecutionCreateRequest{ Project: executionConfig.TargetProject, Domain: executionConfig.TargetDomain, @@ -101,7 +121,8 @@ func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, Principal: "sdk", Nesting: 0, }, - AuthRole: authRole, + AuthRole: authRole, + SecurityContext: securityContext, }, Inputs: inputs, } From f9dbf79d3e8ad7bddeeb6379c33e87cd90588b24 Mon Sep 17 00:00:00 2001 From: Haytham Abuelfutuh Date: Thu, 17 Jun 2021 09:34:00 -0700 Subject: [PATCH 073/645] Update Flyteidl to avoid having string literal when the value is a simple empty/nil string (#103) Signed-off-by: Haytham Abuelfutuh --- flytectl/go.mod | 2 +- flytectl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 522426121a..9c2e7a55d8 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -8,7 +8,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.19.2 + github.com/flyteorg/flyteidl v0.19.3 github.com/flyteorg/flytestdlib v0.3.24 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 diff --git a/flytectl/go.sum b/flytectl/go.sum index a6fadab413..3b2f083536 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -335,8 +335,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.19.2 h1:jXuRrLJEzSo33N9pw7bMEd6mRYSL7LCz/vnazz5XcOg= -github.com/flyteorg/flyteidl v0.19.2/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.19.3 h1:Rba35Qi3eG/lExzWUnjQOgX+HpHHLWj+N/QBw9TlFBo= +github.com/flyteorg/flyteidl v0.19.3/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.24 h1:Eu5TMKch9ihOavPKufgTBI677eVYjJpOAPPg9hfZIzU= github.com/flyteorg/flytestdlib v0.3.24/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= From 5e967f7146a9c1383d94097e0c4f641187189aeb Mon Sep 17 00:00:00 2001 From: Haytham Abuelfutuh Date: Thu, 17 Jun 2021 13:00:01 -0700 Subject: [PATCH 074/645] Only pass literals to execution if they users provided values (#105) * Only pass literals to execution if they users provided values Signed-off-by: Haytham Abuelfutuh * Adding unit tests and a bit of refactoring Signed-off-by: Haytham Abuelfutuh --- flytectl/cmd/create/serialization_utils.go | 49 +++++- .../cmd/create/serialization_utils_test.go | 148 ++++++++++++++++++ 2 files changed, 189 insertions(+), 8 deletions(-) create mode 100644 flytectl/cmd/create/serialization_utils_test.go diff --git a/flytectl/cmd/create/serialization_utils.go b/flytectl/cmd/create/serialization_utils.go index b9759ca7c1..53045d2c9e 100644 --- a/flytectl/cmd/create/serialization_utils.go +++ b/flytectl/cmd/create/serialization_utils.go @@ -1,29 +1,62 @@ package create import ( + "fmt" + "github.com/flyteorg/flyteidl/clients/go/coreutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) // TODO: Move all functions to flyteidl +// MakeLiteralForVariables builds a map of literals for the provided serialized values. If a provided value does not have +// a corresponding variable or if that variable is invalid (e.g. doesn't have Type property populated), it returns an +// error. func MakeLiteralForVariables(serialize map[string]interface{}, variables map[string]*core.Variable) (map[string]*core.Literal, error) { - result := make(map[string]*core.Literal) - var err error + types := make(map[string]*core.LiteralType) for k, v := range variables { - if result[k], err = coreutils.MakeLiteralForType(v.Type, serialize[k]); err != nil { - return nil, err + t := v.GetType() + if t == nil { + return nil, fmt.Errorf("variable [%v] has nil type", k) } + + types[k] = t } - return result, nil + + return MakeLiteralForTypes(serialize, types) } +// MakeLiteralForParams builds a map of literals for the provided serialized values. If a provided value does not have +// a corresponding parameter or if that parameter is invalid (e.g. doesn't have Type property populated), it returns an +// error. func MakeLiteralForParams(serialize map[string]interface{}, parameters map[string]*core.Parameter) (map[string]*core.Literal, error) { + types := make(map[string]*core.LiteralType) + for k, v := range parameters { + if variable := v.GetVar(); variable == nil { + return nil, fmt.Errorf("parameter [%v] has nil Variable", k) + } else if t := variable.GetType(); t == nil { + return nil, fmt.Errorf("parameter [%v] has nil variable type", k) + } else { + types[k] = t + } + } + + return MakeLiteralForTypes(serialize, types) +} + +// MakeLiteralForTypes builds a map of literals for the provided serialized values. If a provided value does not have +// a corresponding type or if it fails to create a literal for the given type and value, it returns an error. +func MakeLiteralForTypes(serialize map[string]interface{}, types map[string]*core.LiteralType) (map[string]*core.Literal, error) { result := make(map[string]*core.Literal) var err error - for k, v := range parameters { - if result[k], err = coreutils.MakeLiteralForType(v.GetVar().Type, serialize[k]); err != nil { - return nil, err + for k, v := range serialize { + if t, typeFound := types[k]; typeFound { + if result[k], err = coreutils.MakeLiteralForType(t, v); err != nil { + return nil, err + } + } else { + return nil, fmt.Errorf("no matching type for [%v]", k) } } + return result, nil } diff --git a/flytectl/cmd/create/serialization_utils_test.go b/flytectl/cmd/create/serialization_utils_test.go new file mode 100644 index 0000000000..5c7326493d --- /dev/null +++ b/flytectl/cmd/create/serialization_utils_test.go @@ -0,0 +1,148 @@ +package create + +import ( + "testing" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/stretchr/testify/assert" +) + +func TestMakeLiteralForTypes(t *testing.T) { + inputTypes := map[string]*core.LiteralType{ + "a": { + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + "x": { + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + "b": { + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_STRING, + }, + }, + "y": { + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_STRING, + }, + }, + } + + t.Run("Happy path", func(t *testing.T) { + inputValues := map[string]interface{}{ + "a": 5, + "b": "hello", + } + + m, err := MakeLiteralForTypes(inputValues, inputTypes) + assert.NoError(t, err) + assert.Len(t, m, len(inputValues)) + }) + + t.Run("Type not found", func(t *testing.T) { + inputValues := map[string]interface{}{ + "notfound": 5, + } + + _, err := MakeLiteralForTypes(inputValues, inputTypes) + assert.Error(t, err) + }) + + t.Run("Invalid value", func(t *testing.T) { + inputValues := map[string]interface{}{ + "a": "hello", + } + + _, err := MakeLiteralForTypes(inputValues, inputTypes) + assert.Error(t, err) + }) +} + +func TestMakeLiteralForParams(t *testing.T) { + inputValues := map[string]interface{}{ + "a": "hello", + } + + t.Run("Happy path", func(t *testing.T) { + inputParams := map[string]*core.Parameter{ + "a": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_STRING, + }, + }, + }, + }, + } + + m, err := MakeLiteralForParams(inputValues, inputParams) + assert.NoError(t, err) + assert.Len(t, m, len(inputValues)) + }) + + t.Run("Invalid Param", func(t *testing.T) { + inputParams := map[string]*core.Parameter{ + "a": nil, + } + + _, err := MakeLiteralForParams(inputValues, inputParams) + assert.Error(t, err) + }) + + t.Run("Invalid Type", func(t *testing.T) { + inputParams := map[string]*core.Parameter{ + "a": { + Var: &core.Variable{}, + }, + } + + _, err := MakeLiteralForParams(inputValues, inputParams) + assert.Error(t, err) + }) +} + +func TestMakeLiteralForVariables(t *testing.T) { + inputValues := map[string]interface{}{ + "a": "hello", + } + + t.Run("Happy path", func(t *testing.T) { + inputVariables := map[string]*core.Variable{ + "a": { + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_STRING, + }, + }, + }, + } + + m, err := MakeLiteralForVariables(inputValues, inputVariables) + assert.NoError(t, err) + assert.Len(t, m, len(inputValues)) + }) + + t.Run("Invalid Variable", func(t *testing.T) { + inputVariables := map[string]*core.Variable{ + "a": nil, + } + + _, err := MakeLiteralForVariables(inputValues, inputVariables) + assert.Error(t, err) + }) + + t.Run("Invalid Type", func(t *testing.T) { + inputVariables := map[string]*core.Variable{ + "a": { + Type: nil, + }, + } + + _, err := MakeLiteralForVariables(inputValues, inputVariables) + assert.Error(t, err) + }) +} From b5f332a6377ff7e221fade8bee403feb42e24f18 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Fri, 18 Jun 2021 15:18:31 +0530 Subject: [PATCH 075/645] Added dco signoff preecommit (#89) * Added dco signoff preecommit Signed-off-by: Yuvraj --- flytectl/Makefile | 2 + .../flyte/golang_support_tools/go.mod | 3 + .../flyte/golang_support_tools/go.sum | 26 ++++++++ .../flyte/golang_support_tools/tools.go | 1 + .../golang_test_targets/download_tooling.sh | 1 + flytectl/boilerplate/flyte/precommit/Makefile | 9 +++ .../flyte/precommit/hooks/pre-push | 41 +++++++++++++ .../flyte/precommit/hooks/prepare-commit-msg | 16 +++++ .../boilerplate/flyte/precommit/update.sh | 60 +++++++++++++++++++ .../boilerplate/flyte/welcome_bot/update.sh | 1 + flytectl/boilerplate/update.cfg | 1 + flytectl/boilerplate/update.sh | 2 +- flytectl/docs/CONTRIBUTING.md | 11 +++- 13 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 flytectl/boilerplate/flyte/precommit/Makefile create mode 100755 flytectl/boilerplate/flyte/precommit/hooks/pre-push create mode 100755 flytectl/boilerplate/flyte/precommit/hooks/prepare-commit-msg create mode 100755 flytectl/boilerplate/flyte/precommit/update.sh diff --git a/flytectl/Makefile b/flytectl/Makefile index 69ab4e6c49..8d1c049c43 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -1,5 +1,6 @@ export REPOSITORY=flytectl include boilerplate/flyte/golang_test_targets/Makefile +include boilerplate/flyte/precommit/Makefile GIT_VERSION := $(shell git describe --always --tags) GIT_HASH := $(shell git rev-parse --short HEAD) @@ -35,3 +36,4 @@ install-piptools: .PHONY: doc-requirements.txt doc-requirements.txt: doc-requirements.in install-piptools $(call PIP_COMPILE,doc-requirements.in) + diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.mod b/flytectl/boilerplate/flyte/golang_support_tools/go.mod index 7afee48e45..53f645159a 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.mod +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.mod @@ -6,7 +6,10 @@ require ( github.com/alvaroloes/enumer v1.1.2 github.com/flyteorg/flytestdlib v0.3.22 github.com/golangci/golangci-lint v1.38.0 + github.com/pseudomuto/protoc-gen-doc v1.4.1 // indirect github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5 ) replace github.com/vektra/mockery => github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0 + +replace github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.sum b/flytectl/boilerplate/flyte/golang_support_tools/go.sum index 49939b689d..261048f745 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.sum +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.sum @@ -75,8 +75,11 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -99,6 +102,8 @@ github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cv github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -164,6 +169,7 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/daixiang0/gci v0.2.8 h1:1mrIGMBQsBu0P7j7m1M8Lb+ZeZxsZL+jyGX4YoMJJpg= github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -191,6 +197,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java h1:bV5JGEB1ouEzZa0hgVDFFiClrUEuGWRaAc/3mxR2QK0= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= github.com/esimonov/ifshort v1.0.1 h1:p7hlWD15c9XwvwxYg3W7f7UZHmwg7l9hC0hBiF95gd0= @@ -204,6 +212,8 @@ github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4 github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flytestdlib v0.3.22 h1:nJEPaCdxzXBaeg2p4fdo3I3Ua09NedFRaUwuLafLEdw= github.com/flyteorg/flytestdlib v0.3.22/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= +github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= +github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -271,6 +281,7 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -355,8 +366,10 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= @@ -418,9 +431,13 @@ github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0m github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -543,6 +560,8 @@ github.com/mozilla/tls-observatory v0.0.0-20201209171846-0547674fceff/go.mod h1: github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw= github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= @@ -616,6 +635,7 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f h1:xAw10KgJqG5NJDfmRqJ05Z0IFblKumjtMeyiOLxj3+4= @@ -655,6 +675,8 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.3.0 h1:Uehi/mxLK0eiUc0H0++5tpMGTexB8wZ598MIgU8VpDM= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/quasilyte/go-ruleguard v0.3.0 h1:A3OfpsK2ynOTbz/KMi62qWzignjGCOZVChATSf4P+A0= github.com/quasilyte/go-ruleguard v0.3.0/go.mod h1:p2miAhLp6fERzFNbcuQ4bevXs8rgK//uCHsUDkumITg= @@ -737,6 +759,7 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -797,6 +820,7 @@ go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -905,6 +929,7 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1121,6 +1146,7 @@ google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= diff --git a/flytectl/boilerplate/flyte/golang_support_tools/tools.go b/flytectl/boilerplate/flyte/golang_support_tools/tools.go index 71163a57d9..eee691d8c3 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/tools.go +++ b/flytectl/boilerplate/flyte/golang_support_tools/tools.go @@ -7,4 +7,5 @@ import ( _ "github.com/flyteorg/flytestdlib/cli/pflags" _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/vektra/mockery/cmd/mockery" + - "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" ) diff --git a/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh index 25d4ac3dc1..c0ab06b063 100755 --- a/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh @@ -20,6 +20,7 @@ tools=( "github.com/flyteorg/flytestdlib/cli/pflags" "github.com/golangci/golangci-lint/cmd/golangci-lint" "github.com/alvaroloes/enumer" + "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" ) tmp_dir=$(mktemp -d -t gotooling-XXX) diff --git a/flytectl/boilerplate/flyte/precommit/Makefile b/flytectl/boilerplate/flyte/precommit/Makefile new file mode 100644 index 0000000000..3c6f17d6b2 --- /dev/null +++ b/flytectl/boilerplate/flyte/precommit/Makefile @@ -0,0 +1,9 @@ +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst + + +.PHONY: setup-precommit +setup-precommit: #setup the precommit + @boilerplate/flyte/precommit/update.sh diff --git a/flytectl/boilerplate/flyte/precommit/hooks/pre-push b/flytectl/boilerplate/flyte/precommit/hooks/pre-push new file mode 100755 index 0000000000..f161cfe856 --- /dev/null +++ b/flytectl/boilerplate/flyte/precommit/hooks/pre-push @@ -0,0 +1,41 @@ +DUMMY_SHA=0000000000000000000000000000000000000000 + +echo "Running pre-push check; to skip this step use 'push --no-verify'" + +while read LOCAL_REF LOCAL_SHA REMOTE_REF REMOTE_SHA +do + if [ "$LOCAL_SHA" = $DUMMY_SHA ] + then + # Branch deleted. Do nothing. + exit 0 + else + if [ "$REMOTE_SHA" = $DUMMY_SHA ] + then + # New branch. Verify the last commit, since this is very likely where the new code is + # (though there is no way to know for sure). In the extremely uncommon case in which someone + # pushes more than 1 new commit to a branch, CI will enforce full checking. + RANGE="$LOCAL_SHA~1..$LOCAL_SHA" + else + # Updating branch. Verify new commits. + RANGE="$REMOTE_SHA..$LOCAL_SHA" + fi + + # Verify DCO signoff. We do this before the format checker, since it has + # some probability of failing spuriously, while this check never should. + # + # In general, we can't assume that the commits are signed off by author + # pushing, so we settle for just checking that there is a signoff at all. + SIGNED_OFF=$(git rev-list --no-merges --grep "^Signed-off-by: " "$RANGE") + NOT_SIGNED_OFF=$(git rev-list --no-merges "$RANGE" | grep -Fxv "$SIGNED_OFF") + if [ -n "$NOT_SIGNED_OFF" ] + then + echo >&2 "ERROR: The following commits do not have DCO signoff:" + while read -r commit; do + echo " $(git log --pretty=oneline --abbrev-commit -n 1 $commit)" + done <<< "$NOT_SIGNED_OFF" + exit 1 + fi + fi +done + +exit 0 diff --git a/flytectl/boilerplate/flyte/precommit/hooks/prepare-commit-msg b/flytectl/boilerplate/flyte/precommit/hooks/prepare-commit-msg new file mode 100755 index 0000000000..8148d104b8 --- /dev/null +++ b/flytectl/boilerplate/flyte/precommit/hooks/prepare-commit-msg @@ -0,0 +1,16 @@ +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst +# $ ln -s ../../support/hooks/prepare-commit-msg .git/hooks/prepare-commit-msg + +COMMIT_MESSAGE_FILE="$1" +AUTHOR=$(git var GIT_AUTHOR_IDENT) +SIGNOFF=$(echo $AUTHOR | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') + +# Check for DCO signoff message. If one doesn't exist, append one and then warn +# the user that you did so. +if ! $(grep -qs "^$SIGNOFF" "$COMMIT_MESSAGE_FILE") ; then + echo "\n$SIGNOFF" >> "$COMMIT_MESSAGE_FILE" + echo "Appended the following signoff to the end of the commit message:\n $SIGNOFF\n" +fi diff --git a/flytectl/boilerplate/flyte/precommit/update.sh b/flytectl/boilerplate/flyte/precommit/update.sh new file mode 100755 index 0000000000..971c8386c1 --- /dev/null +++ b/flytectl/boilerplate/flyte/precommit/update.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst + +set -e + +# Helper script for Automatically add DCO signoff with commit hooks +# Taken from Envoy https://gitlab.cncf.ci/envoyproxy/envoy +if [ ! "$PWD" == "$(git rev-parse --show-toplevel)" ]; then + cat >&2 <<__EOF__ +ERROR: this script must be run at the root of the envoy source tree +__EOF__ + exit 1 +fi + +# Helper functions that calculate `abspath` and `relpath`. Taken from Mesos +# commit 82b040a60561cf94dec3197ea88ae15e57bcaa97, which also carries the Apache +# V2 license, and has deployed this code successfully for some time. +abspath() { + cd "$(dirname "${1}")" + echo "${PWD}"/"$(basename "${1}")" + cd "${OLDPWD}" +} +relpath() { + local FROM TO UP + FROM="$(abspath "${1%/}")" TO="$(abspath "${2%/}"/)" + while test "${TO}" = "${TO#"${FROM}"/}" \ + -a "${TO}" != "${FROM}"; do + FROM="${FROM%/*}" UP="../${UP}" + done + TO="${UP%/}${TO#${FROM}}" + echo "${TO:-.}" +} + +# Try to find the `.git` directory, even if it's not in Flyte project root (as +# it wouldn't be if, say, this were in a submodule). The "blessed" but fairly +# new way to do this is to use `--git-common-dir`. +DOT_GIT_DIR=$(git rev-parse --git-common-dir) +if test ! -d "${DOT_GIT_DIR}"; then + # If `--git-common-dir` is not available, fall back to older way of doing it. + DOT_GIT_DIR=$(git rev-parse --git-dir) +fi + +mkdir -p ${DOT_GIT_DIR}/hooks + +HOOKS_DIR="${DOT_GIT_DIR}/hooks" +HOOKS_DIR_RELPATH=$(relpath "${HOOKS_DIR}" "${PWD}") + +if [ ! -e "${HOOKS_DIR}/prepare-commit-msg" ]; then + echo "Installing hook 'prepare-commit-msg'" + ln -s "${HOOKS_DIR_RELPATH}/boilerplate/flyte/precommit/hooks/prepare-commit-msg" "${HOOKS_DIR}/prepare-commit-msg" +fi + +if [ ! -e "${HOOKS_DIR}/pre-push" ]; then + echo "Installing hook 'pre-push'" + ln -s "${HOOKS_DIR_RELPATH}/boilerplate/flyte/precommit/hooks/pre-push" "${HOOKS_DIR}/pre-push" +fi diff --git a/flytectl/boilerplate/flyte/welcome_bot/update.sh b/flytectl/boilerplate/flyte/welcome_bot/update.sh index 120dbd365c..2db64ac3f1 100755 --- a/flytectl/boilerplate/flyte/welcome_bot/update.sh +++ b/flytectl/boilerplate/flyte/welcome_bot/update.sh @@ -12,3 +12,4 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" # Clone the config.yml file echo " - copying ${DIR}/config.yml to the root directory." cp "${DIR}"/config.yml "${DIR}"/../../../.github/config.yml + diff --git a/flytectl/boilerplate/update.cfg b/flytectl/boilerplate/update.cfg index 2f61a97b0e..45cc5569cf 100644 --- a/flytectl/boilerplate/update.cfg +++ b/flytectl/boilerplate/update.cfg @@ -3,4 +3,5 @@ flyte/golangci_file flyte/golang_support_tools flyte/pull_request_template flyte/welcome_bot +flyte/precommit diff --git a/flytectl/boilerplate/update.sh b/flytectl/boilerplate/update.sh index 9173b662de..73de4dc91c 100755 --- a/flytectl/boilerplate/update.sh +++ b/flytectl/boilerplate/update.sh @@ -70,4 +70,4 @@ while read -r directory junk; do fi echo "***********************************************************************************" echo "" -done < "$CONFIG_FILE" \ No newline at end of file +done < "$CONFIG_FILE" diff --git a/flytectl/docs/CONTRIBUTING.md b/flytectl/docs/CONTRIBUTING.md index 5758d747b2..7aecdba71e 100644 --- a/flytectl/docs/CONTRIBUTING.md +++ b/flytectl/docs/CONTRIBUTING.md @@ -4,7 +4,6 @@ A local cluster can be setup via --> https://lyft.github.io/flyte/administrator/ Then, if having trouble connecting to local cluster see the following: - #1) Find/Set/Verify gRPC port for your local Flyte service: FLYTECTL_GRPC_PORT=`kubectl get service -n flyte flyteadmin -o json | jq '.spec.ports[] | select(.name=="grpc").port'` @@ -14,3 +13,13 @@ FLYTECTL_GRPC_PORT=`kubectl get service -n flyte flyteadmin -o json | jq '.spec. #3) Update config line in https://github.com/flyteorg/flytectl/blob/master/config.yaml to dns:///localhost:8081 #4) All new flags introduced for flytectl commands and subcommands should be camelcased. eg: bin/flytectl update project -p flytesnacks --activateProject + +# DCO: Sign your work + +Flyte ships commit hooks that allow you to auto-generate the DCO signoff line if +it doesn't exist when you run `git commit`. Simply navigate to the flytectl project root and run + +```bash +make dco +``` + From c6ef3e70bd7e9b048ea1e710137de1c0f6aa1580 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Fri, 18 Jun 2021 08:48:12 -0700 Subject: [PATCH 076/645] Visualize graphs on command line (#75) --- .../subcommand/workflow/config_flags.go | 13 +- .../subcommand/workflow/workflow_config.go | 6 +- flytectl/cmd/get/workflow.go | 12 + flytectl/cmd/root.go | 2 +- flytectl/docs/source/gen/flytectl.rst | 5 +- flytectl/docs/source/gen/flytectl_config.rst | 4 +- .../source/gen/flytectl_config_discover.rst | 4 +- .../source/gen/flytectl_config_validate.rst | 4 +- flytectl/docs/source/gen/flytectl_create.rst | 4 +- .../source/gen/flytectl_create_execution.rst | 4 +- .../source/gen/flytectl_create_project.rst | 4 +- flytectl/docs/source/gen/flytectl_delete.rst | 4 +- ...ectl_delete_cluster-resource-attribute.rst | 4 +- ...lytectl_delete_execution-cluster-label.rst | 4 +- ...tectl_delete_execution-queue-attribute.rst | 4 +- .../source/gen/flytectl_delete_execution.rst | 4 +- .../gen/flytectl_delete_plugin-override.rst | 4 +- ...lytectl_delete_task-resource-attribute.rst | 4 +- flytectl/docs/source/gen/flytectl_get.rst | 4 +- ...lytectl_get_cluster-resource-attribute.rst | 4 +- .../flytectl_get_execution-cluster-label.rst | 4 +- ...flytectl_get_execution-queue-attribute.rst | 4 +- .../source/gen/flytectl_get_execution.rst | 14 +- .../source/gen/flytectl_get_launchplan.rst | 10 +- .../gen/flytectl_get_plugin-override.rst | 4 +- .../docs/source/gen/flytectl_get_project.rst | 6 +- .../flytectl_get_task-resource-attribute.rst | 4 +- .../docs/source/gen/flytectl_get_task.rst | 6 +- .../docs/source/gen/flytectl_get_workflow.rst | 20 +- .../docs/source/gen/flytectl_register.rst | 5 +- .../source/gen/flytectl_register_examples.rst | 87 +++ .../source/gen/flytectl_register_files.rst | 16 +- flytectl/docs/source/gen/flytectl_sandbox.rst | 82 +++ .../source/gen/flytectl_sandbox_start.rst | 80 +++ .../source/gen/flytectl_sandbox_teardown.rst | 86 +++ flytectl/docs/source/gen/flytectl_update.rst | 4 +- ...ectl_update_cluster-resource-attribute.rst | 4 +- ...lytectl_update_execution-cluster-label.rst | 4 +- ...tectl_update_execution-queue-attribute.rst | 4 +- .../source/gen/flytectl_update_launchplan.rst | 4 +- .../gen/flytectl_update_plugin-override.rst | 4 +- .../source/gen/flytectl_update_project.rst | 4 +- ...lytectl_update_task-resource-attribute.rst | 4 +- .../docs/source/gen/flytectl_update_task.rst | 4 +- .../source/gen/flytectl_update_workflow.rst | 4 +- flytectl/docs/source/gen/flytectl_version.rst | 4 +- flytectl/go.mod | 3 + flytectl/go.sum | 16 + flytectl/pkg/printer/outputformat_enumer.go | 14 +- flytectl/pkg/printer/printer.go | 32 + flytectl/pkg/printer/printer_test.go | 134 ++++- flytectl/pkg/visualize/graphviz.go | 381 ++++++++++++ flytectl/pkg/visualize/graphviz_test.go | 470 +++++++++++++++ flytectl/pkg/visualize/graphvizer.go | 35 ++ flytectl/pkg/visualize/mocks/graphvizer.go | 273 +++++++++ .../compiled_closure_branch_nested.json | 553 ++++++++++++++++++ .../testdata/compiled_subworkflows.json | 482 +++++++++++++++ 57 files changed, 2849 insertions(+), 114 deletions(-) create mode 100644 flytectl/docs/source/gen/flytectl_register_examples.rst create mode 100644 flytectl/docs/source/gen/flytectl_sandbox.rst create mode 100644 flytectl/docs/source/gen/flytectl_sandbox_start.rst create mode 100644 flytectl/docs/source/gen/flytectl_sandbox_teardown.rst create mode 100644 flytectl/pkg/visualize/graphviz.go create mode 100644 flytectl/pkg/visualize/graphviz_test.go create mode 100644 flytectl/pkg/visualize/graphvizer.go create mode 100644 flytectl/pkg/visualize/mocks/graphvizer.go create mode 100644 flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json create mode 100644 flytectl/pkg/visualize/testdata/compiled_subworkflows.json diff --git a/flytectl/cmd/config/subcommand/workflow/config_flags.go b/flytectl/cmd/config/subcommand/workflow/config_flags.go index 61f6245c05..5765379fe6 100755 --- a/flytectl/cmd/config/subcommand/workflow/config_flags.go +++ b/flytectl/cmd/config/subcommand/workflow/config_flags.go @@ -50,12 +50,11 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), *new(string), "version of the workflow to be fetched.") - cmdFlags.BoolVar(&(DefaultConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), *new(bool), " flag to indicate to fetch the latest version, version flag will be ignored in this case") - cmdFlags.StringVar(&(DefaultConfig.Filter.FieldSelector), fmt.Sprintf("%v%v", prefix, "filter.field-selector"), *new(string), "Specifies the Field selector") - cmdFlags.StringVar((&DefaultConfig.Filter.SortBy), fmt.Sprintf("%v%v", prefix, "filter.sort-by"), *new(string), "Specifies which field to sort result by ") - cmdFlags.Int32Var((&DefaultConfig.Filter.Limit), fmt.Sprintf("%v%v", prefix, "filter.limit"), 100, "Specifies the limit") - cmdFlags.BoolVar((&DefaultConfig.Filter.Asc), fmt.Sprintf("%v%v", prefix, "filter.asc"), false, "Specifies the sorting order. By default flytectl sort result in descending order") - + cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "version of the workflow to be fetched.") + cmdFlags.BoolVar(&DefaultConfig.Latest, fmt.Sprintf("%v%v", prefix, "latest"), DefaultConfig.Latest, " flag to indicate to fetch the latest version, version flag will be ignored in this case") + cmdFlags.StringVar(&DefaultConfig.Filter.FieldSelector, fmt.Sprintf("%v%v", prefix, "filter.field-selector"), DefaultConfig.Filter.FieldSelector, "Specifies the Field selector") + cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sort-by"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") + cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") + cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/workflow/workflow_config.go b/flytectl/cmd/config/subcommand/workflow/workflow_config.go index 8051d4547f..34049e08b9 100644 --- a/flytectl/cmd/config/subcommand/workflow/workflow_config.go +++ b/flytectl/cmd/config/subcommand/workflow/workflow_config.go @@ -1,8 +1,10 @@ package workflow -import "github.com/flyteorg/flytectl/pkg/filters" +import ( + "github.com/flyteorg/flytectl/pkg/filters" +) -//go:generate pflags Config --default-var DefaultConfig +//go:generate pflags Config --default-var DefaultConfig --bind-default-var var ( DefaultConfig = &Config{ diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index cdefe89410..4174f96c1a 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -68,6 +68,18 @@ Retrieves all the workflow within project and domain in json format. flytectl get workflow -p flytesnacks -d development -o json +Visualize the graph for a workflow within project and domain in dot format. + +:: + + flytectl get workflow -p flytesnacks -d development core.flyte_basics.basic_workflow.my_wf --latest -o dot + +Visualize the graph for a workflow within project and domain in a dot content render. + +:: + + flytectl get workflow -p flytesnacks -d development core.flyte_basics.basic_workflow.my_wf --latest -o doturl + Usage ` ) diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index a3e942b4fc..40bc92ed69 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -53,7 +53,7 @@ func newRootCmd() *cobra.Command { // --root.project, this adds a convenience on top to allow --project to be used rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Project), "project", "p", "", "Specifies the Flyte project.") rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Domain), "domain", "d", "", "Specifies the Flyte project's domain.") - rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Output), "output", "o", printer.OutputFormatTABLE.String(), fmt.Sprintf("Specifies the output type - supported formats %s", printer.OutputFormats())) + rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Output), "output", "o", printer.OutputFormatTABLE.String(), fmt.Sprintf("Specifies the output type - supported formats %s. NOTE: dot, doturl are only supported for Workflow", printer.OutputFormats())) rootCmd.AddCommand(viper.GetConfigCommand()) rootCmd.AddCommand(get.CreateGetCommand()) rootCmd.AddCommand(create.RemoteCreateCommand()) diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 35598ae7a2..446c0f39a8 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -30,14 +30,14 @@ Options --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. -h, --help help for flytectl --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. @@ -64,6 +64,7 @@ SEE ALSO * :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. +* :doc:`flytectl_sandbox` - Used for testing flyte sandbox. * :doc:`flytectl_update` - Used for updating flyte resources eg: project. * :doc:`flytectl_version` - Used for fetching flyte version diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 5039c54e4f..918923db8b 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -39,13 +39,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 932addfa42..c8c73a0302 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -41,7 +41,7 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --file stringArray Passes the config file to load. If empty, it'll first search for the config file path then, if found, will load config from there. @@ -49,7 +49,7 @@ Options inherited from parent commands --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 984231c587..e0fe692b8a 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -43,7 +43,7 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --file stringArray Passes the config file to load. If empty, it'll first search for the config file path then, if found, will load config from there. @@ -51,7 +51,7 @@ Options inherited from parent commands --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index b2463ade5f..dea24a3367 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -42,13 +42,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index dc646888cb..d2f3f7e880 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -160,13 +160,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index a0670e5f92..e7f6580eae 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -66,13 +66,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 9cfd95edad..42881783d7 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -42,13 +42,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 17eae9ec87..29aac116f0 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -78,13 +78,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 2524bc63e8..daa247a473 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -76,13 +76,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index c9935a0f7f..5e6e03520f 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -80,13 +80,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index f87a174752..2a12a2b381 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -85,13 +85,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index 03b9f01b0e..e69560d99e 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -81,13 +81,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 2d782bb68b..17cb700393 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -81,13 +81,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 82dcafb42f..8442a4e4a0 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -42,13 +42,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index a713afac14..7cf9ff55b1 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -87,13 +87,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index 0f043d8cd4..58abf2ab26 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -85,13 +85,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index 1f0593a125..4b92076d7f 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -89,13 +89,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 1726008f38..4040492e0f 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -21,15 +21,11 @@ Retrieves execution by name within project and domain. bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r -Retrieves all the execution with filters. +Retrieves all the executions with filters. :: bin/flytectl get execution -p flytesnacks -d development --filter.field-selector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" - -Retrieve specific execution with filters. -:: - - bin/flytectl get execution -p flytesnacks -d development y8n2wtuspj --filter.field-selector="execution.phase in (FAILED),execution.duration<200" + Retrieves all the execution with limit and sorting. :: @@ -64,7 +60,7 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.field-selector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort results (default "created_at") + --filter.sort-by string Specifies which field to sort result by -h, --help help for execution Options inherited from parent commands @@ -86,13 +82,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 23b06925cd..37f816171a 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -39,7 +39,7 @@ Retrieves all the launch plans with filters. bin/flytectl get launchplan -p flytesnacks -d development --filter.field-selector="name=core.basic.lp.go_greet" -Retrieves specific launch plans with filters. +Retrieves launch plans entity search across all versions with filters. :: bin/flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.field-selector="version=v1" @@ -67,7 +67,7 @@ Retrieves a launch plans within project and domain for a version and generate th :: - flytectl get launchplan -d development -p flytectldemo core.advanced.run_merge_sort.merge_sort --execFile execution_spec.yam + flytectl get launchplan -d development -p flytectldemo core.advanced.run_merge_sort.merge_sort --execFile execution_spec.yaml The generated file would look similar to this @@ -103,7 +103,7 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.field-selector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort results (default "created_at") + --filter.sort-by string Specifies which field to sort result by -h, --help help for launchplan --latest flag to indicate to fetch the latest version, version flag will be ignored in this case --version string version of the launchplan to be fetched. @@ -127,13 +127,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index fcc8e5c9be..f608e680a0 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -109,13 +109,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index ba86d53cd0..2f7e622450 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -58,7 +58,7 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.field-selector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort results (default "created_at") + --filter.sort-by string Specifies which field to sort result by -h, --help help for project Options inherited from parent commands @@ -80,13 +80,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index dfd44d3c32..fb180a8a44 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -91,13 +91,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index f49501561d..dab41e7f72 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -99,7 +99,7 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.field-selector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort results (default "created_at") + --filter.sort-by string Specifies which field to sort result by -h, --help help for task --latest flag to indicate to fetch the latest version, version flag will be ignored in this case --version string version of the task to be fetched. @@ -123,13 +123,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 846afb9682..081ae99b7d 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -60,6 +60,18 @@ Retrieves all the workflow within project and domain in json format. flytectl get workflow -p flytesnacks -d development -o json +Visualize the graph for a workflow within project and domain in dot format. + +:: + + flytectl get workflow -p flytesnacks -d development core.flyte_basics.basic_workflow.my_wf --latest -o dot + +Visualize the graph for a workflow within project and domain in a dot content render. + +:: + + flytectl get workflow -p flytesnacks -d development core.flyte_basics.basic_workflow.my_wf --latest -o doturl + Usage @@ -75,8 +87,10 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.field-selector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort results (default "created_at") + --filter.sort-by string Specifies which field to sort results -h, --help help for workflow + --latest flag to indicate to fetch the latest version, version flag will be ignored in this case + --version string version of the workflow to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -97,13 +111,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 98d8c02b4a..0417174a1c 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -42,13 +42,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. @@ -71,5 +71,6 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_register_examples` - Registers flytesnack example * :doc:`flytectl_register_files` - Registers file resources diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst new file mode 100644 index 0000000000..e6df378e55 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -0,0 +1,87 @@ +.. _flytectl_register_examples: + +flytectl register examples +-------------------------- + +Registers flytesnack example + +Synopsis +~~~~~~~~ + + + +Registers all latest flytesnacks example +:: + + bin/flytectl register examples -d development -p flytesnacks + + +Usage + + +:: + + flytectl register examples [flags] + +Options +~~~~~~~ + +:: + + -a, --archive pass in archive file either an http link or local path. + -i, --assumableIamRole string Custom assumable iam auth role to register launch plans with. + --continueOnError continue on error when registering files. + -h, --help help for examples + -k, --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. + -l, --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). + -v, --version string version of the entity to be registered with flyte. (default "v1") + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. + diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 8d79a9df13..ada5a92813 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -39,7 +39,7 @@ the continueOnError flag. Using short format of continueOnError flag :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -c + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError Overriding the default version v1 using version string. :: @@ -50,25 +50,25 @@ Change the o/p format has not effect on registration. The O/p is currently avail :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -o yaml + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -o yaml Override IamRole during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -i "arn:aws:iam::123456789:role/dummy" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -i "arn:aws:iam::123456789:role/dummy" Override Kubernetes service account during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -k "kubernetes-service-account" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -k "kubernetes-service-account" Override Output location prefix during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -c -v v2 -l "s3://dummy/prefix" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -l "s3://dummy/prefix" Usage @@ -84,7 +84,7 @@ Options -a, --archive pass in archive file either an http link or local path. -i, --assumableIamRole string Custom assumable iam auth role to register launch plans with. - -c, --continueOnError continue on error when registering files. + --continueOnError continue on error when registering files. -h, --help help for files -k, --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. -l, --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). @@ -109,13 +109,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst new file mode 100644 index 0000000000..c33cfcc843 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -0,0 +1,82 @@ +.. _flytectl_sandbox: + +flytectl sandbox +---------------- + +Used for testing flyte sandbox. + +Synopsis +~~~~~~~~ + + + +Example Create sandbox cluster. +:: + + bin/flytectl sandbox start + + +Example Remove sandbox cluster. +:: + + bin/flytectl sandbox teardown + + +Options +~~~~~~~ + +:: + + -h, --help help for sandbox + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_sandbox_start` - Start the flyte sandbox +* :doc:`flytectl_sandbox_teardown` - Teardown will cleanup the sandbox environment + diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst new file mode 100644 index 0000000000..56716a9fa0 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -0,0 +1,80 @@ +.. _flytectl_sandbox_start: + +flytectl sandbox start +---------------------- + +Start the flyte sandbox + +Synopsis +~~~~~~~~ + + + +Start will run the flyte sandbox cluster inside a docker container and setup the config that is required +:: + + bin/flytectl start + +Usage + + +:: + + flytectl sandbox start [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for start + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_sandbox` - Used for testing flyte sandbox. + diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst new file mode 100644 index 0000000000..f7fccfd899 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -0,0 +1,86 @@ +.. _flytectl_sandbox_teardown: + +flytectl sandbox teardown +------------------------- + +Teardown will cleanup the sandbox environment + +Synopsis +~~~~~~~~ + + + +Teardown will remove docker container and all the flyte config +:: + + bin/flytectl sandbox teardown + +Stop will remove docker container and all the flyte config +:: + + bin/flytectl sandbox stop + + +Usage + + +:: + + flytectl sandbox teardown [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for teardown + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --root.domain string Specified the domain to work on. + --root.output string Specified the output type. + --root.project string Specifies the project to work on. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_sandbox` - Used for testing flyte sandbox. + diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 17ba39721e..9a513303c7 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -44,13 +44,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index b8000b4d3c..5f50268a61 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -83,13 +83,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 2431eedd01..957aeff750 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -76,13 +76,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index a32e711f12..e6ed419269 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -87,13 +87,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index aeb20a9f16..88b569d16f 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -61,13 +61,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 657efbfb94..bea5a1c6ac 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -89,13 +89,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 742db693b9..74252c4f52 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -86,13 +86,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index d4ae5db9c9..4f75f37eac 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -89,13 +89,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst index 26d9237800..a119d0118c 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -61,13 +61,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst index b79c81977d..347ecb1790 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -61,13 +61,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 7d125dcfb9..8a73ae4a75 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -46,13 +46,13 @@ Options inherited from parent commands --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML] (default "TABLE") + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. --root.domain string Specified the domain to work on. --root.output string Specified the output type. diff --git a/flytectl/go.mod b/flytectl/go.mod index 9c2e7a55d8..15c5c39675 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -4,6 +4,7 @@ go 1.13 require ( github.com/Microsoft/go-winio v0.5.0 // indirect + github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/containerd/containerd v1.5.2 // indirect github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 @@ -11,6 +12,7 @@ require ( github.com/flyteorg/flyteidl v0.19.3 github.com/flyteorg/flytestdlib v0.3.24 github.com/ghodss/yaml v1.0.0 + github.com/goccy/go-graphviz v0.0.9 github.com/golang/protobuf v1.4.3 github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.1.0 // indirect @@ -23,6 +25,7 @@ require ( github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 github.com/sirupsen/logrus v1.8.0 github.com/spf13/cobra v1.1.3 github.com/spf13/pflag v1.0.5 diff --git a/flytectl/go.sum b/flytectl/go.sum index 3b2f083536..3369537bf4 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -122,6 +122,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= +github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -269,6 +271,8 @@ github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA= +github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -340,6 +344,8 @@ github.com/flyteorg/flyteidl v0.19.3/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/e github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.24 h1:Eu5TMKch9ihOavPKufgTBI677eVYjJpOAPPg9hfZIzU= github.com/flyteorg/flytestdlib v0.3.24/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -378,6 +384,8 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/goccy/go-graphviz v0.0.9 h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ= +github.com/goccy/go-graphviz v0.0.9/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= @@ -395,6 +403,8 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -534,6 +544,7 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -650,6 +661,8 @@ github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY= +github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -919,6 +932,7 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -937,6 +951,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= diff --git a/flytectl/pkg/printer/outputformat_enumer.go b/flytectl/pkg/printer/outputformat_enumer.go index b10b45143f..ab56b2a009 100644 --- a/flytectl/pkg/printer/outputformat_enumer.go +++ b/flytectl/pkg/printer/outputformat_enumer.go @@ -8,9 +8,9 @@ import ( "fmt" ) -const _OutputFormatName = "TABLEJSONYAML" +const _OutputFormatName = "TABLEJSONYAMLDOTDOTURL" -var _OutputFormatIndex = [...]uint8{0, 5, 9, 13} +var _OutputFormatIndex = [...]uint8{0, 5, 9, 13, 16, 22} func (i OutputFormat) String() string { if i >= OutputFormat(len(_OutputFormatIndex)-1) { @@ -19,12 +19,14 @@ func (i OutputFormat) String() string { return _OutputFormatName[_OutputFormatIndex[i]:_OutputFormatIndex[i+1]] } -var _OutputFormatValues = []OutputFormat{0, 1, 2} +var _OutputFormatValues = []OutputFormat{0, 1, 2, 3, 4} var _OutputFormatNameToValueMap = map[string]OutputFormat{ - _OutputFormatName[0:5]: 0, - _OutputFormatName[5:9]: 1, - _OutputFormatName[9:13]: 2, + _OutputFormatName[0:5]: 0, + _OutputFormatName[5:9]: 1, + _OutputFormatName[9:13]: 2, + _OutputFormatName[13:16]: 3, + _OutputFormatName[16:22]: 4, } // OutputFormatString retrieves an enum value from the enum constants string name. diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index fa86127b9e..98282590fe 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -4,14 +4,19 @@ import ( "bytes" "encoding/json" "fmt" + "net/url" "os" + "github.com/flyteorg/flytectl/pkg/visualize" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/errors" + "github.com/ghodss/yaml" "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" "github.com/kataras/tablewriter" "github.com/landoop/tableprinter" + "github.com/pkg/browser" "github.com/yalp/jsonpath" ) @@ -22,8 +27,12 @@ const ( OutputFormatTABLE OutputFormat = iota OutputFormatJSON OutputFormatYAML + OutputFormatDOT + OutputFormatDOTURL ) +const GraphVisualizationServiceURL = "http://graph.flyte.org/#" + func OutputFormats() []string { var v []string for _, o := range OutputFormatValues() { @@ -137,6 +146,29 @@ func (p Printer) Print(format OutputFormat, columns []Column, messages ...proto. } fmt.Println(string(v)) } + case OutputFormatDOT, OutputFormatDOTURL: + var workflows []*admin.Workflow + for _, m := range messages { + if w, ok := m.(*admin.Workflow); ok { + workflows = append(workflows, w) + } else { + return fmt.Errorf("visualization is only supported on workflows") + } + } + if len(workflows) == 0 { + return fmt.Errorf("atleast one workflow required for visualization") + } + workflow := workflows[0] + graphStr, err := visualize.RenderWorkflow(workflow.Closure.CompiledWorkflow) + if err != nil { + return errors.Wrapf("VisualizationError", err, "failed to visualize workflow") + } + if format == OutputFormatDOTURL { + urlToOpen := GraphVisualizationServiceURL + url.PathEscape(graphStr) + fmt.Println("Opening the browser at " + urlToOpen) + return browser.OpenURL(urlToOpen) + } + fmt.Println(graphStr) default: // Print table rows, err := json.Marshal(printableMessages) if err != nil { diff --git a/flytectl/pkg/printer/printer_test.go b/flytectl/pkg/printer/printer_test.go index 5db910544c..08ed10c9f2 100644 --- a/flytectl/pkg/printer/printer_test.go +++ b/flytectl/pkg/printer/printer_test.go @@ -2,6 +2,7 @@ package printer import ( "encoding/json" + "errors" "fmt" "testing" "time" @@ -27,6 +28,14 @@ func LaunchplanToProtoMessages(l []*admin.LaunchPlan) []proto.Message { return messages } +func WorkflowToProtoMessages(l []*admin.Workflow) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages +} + // TODO Convert this to a Testable Example. For some reason the comparison fails func TestJSONToTable(t *testing.T) { d := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) @@ -57,9 +66,9 @@ func TestJSONToTable(t *testing.T) { } func TestOutputFormats(t *testing.T) { - expected := []string{"TABLE", "JSON", "YAML"} + expected := []string{"TABLE", "JSON", "YAML", "DOT", "DOTURL"} outputs := OutputFormats() - assert.Equal(t, 3, len(outputs)) + assert.Equal(t, 5, len(outputs)) assert.Equal(t, expected, outputs) } @@ -77,7 +86,7 @@ func TestOutputFormatStringErr(t *testing.T) { } func TestIsAOutputFormat(t *testing.T) { - o := OutputFormat(4) + o := OutputFormat(5) check := o.IsAOutputFormat() assert.Equal(t, false, check) @@ -123,4 +132,123 @@ func TestPrint(t *testing.T) { assert.Nil(t, err) err = p.Print(OutputFormat(2), lp, LaunchplanToProtoMessages(launchPlans)...) assert.Nil(t, err) + err = p.Print(OutputFormat(3), lp, LaunchplanToProtoMessages(launchPlans)...) + assert.NotNil(t, err) + err = p.Print(OutputFormat(4), lp, LaunchplanToProtoMessages(launchPlans)...) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("visualization is only supported on workflows"), err) + + sortedListLiteralType := core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + } + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, + } + + var compiledTasks []*core.CompiledTask + compiledTasks = append(compiledTasks, &core.CompiledTask{ + Template: &core.TaskTemplate{ + Id: &core.Identifier{ + Project: "dummyProject", + Domain: "dummyDomain", + Name: "dummyName", + Version: "dummyVersion", + }, + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }) + + workflow1 := &admin.Workflow{ + Id: &core.Identifier{ + Name: "task1", + Version: "v1", + }, + Closure: &admin.WorkflowClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + CompiledWorkflow: &core.CompiledWorkflowClosure{ + Tasks: compiledTasks, + }, + }, + } + + workflows := []*admin.Workflow{workflow1} + + err = p.Print(OutputFormat(3), lp, WorkflowToProtoMessages(workflows)...) + assert.Nil(t, err) + workflows = []*admin.Workflow{} + err = p.Print(OutputFormat(3), lp, WorkflowToProtoMessages(workflows)...) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("atleast one workflow required for visualization"), err) + var badCompiledTasks []*core.CompiledTask + badCompiledTasks = append(badCompiledTasks, &core.CompiledTask{ + Template: &core.TaskTemplate{}, + }) + badWorkflow := &admin.Workflow{ + Id: &core.Identifier{ + Name: "task1", + Version: "v1", + }, + Closure: &admin.WorkflowClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + CompiledWorkflow: &core.CompiledWorkflowClosure{ + Tasks: badCompiledTasks, + }, + }, + } + workflows = []*admin.Workflow{badWorkflow} + err = p.Print(OutputFormat(3), lp, WorkflowToProtoMessages(workflows)...) + assert.NotNil(t, err) + + assert.Equal(t, fmt.Errorf("no template found in the workflow task template:<> "), errors.Unwrap(err)) + + badWorkflow2 := &admin.Workflow{ + Id: &core.Identifier{ + Name: "task1", + Version: "v1", + }, + Closure: &admin.WorkflowClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + CompiledWorkflow: nil, + }, + } + workflows = []*admin.Workflow{badWorkflow2} + err = p.Print(OutputFormat(3), lp, WorkflowToProtoMessages(workflows)...) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("empty workflow closure"), errors.Unwrap(err)) + + var badSubWorkflow []*core.CompiledWorkflow + badSubWorkflow = append(badSubWorkflow, &core.CompiledWorkflow{ + Template: &core.WorkflowTemplate{}, + }) + + badWorkflow3 := &admin.Workflow{ + Id: &core.Identifier{ + Name: "task1", + Version: "v1", + }, + Closure: &admin.WorkflowClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 1, Nanos: 0}, + CompiledWorkflow: &core.CompiledWorkflowClosure{ + Tasks: compiledTasks, + SubWorkflows: badSubWorkflow, + }, + }, + } + workflows = []*admin.Workflow{badWorkflow3} + err = p.Print(OutputFormat(3), lp, WorkflowToProtoMessages(workflows)...) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("no template found in the sub workflow template:<> "), errors.Unwrap(err)) } diff --git a/flytectl/pkg/visualize/graphviz.go b/flytectl/pkg/visualize/graphviz.go new file mode 100644 index 0000000000..314c325148 --- /dev/null +++ b/flytectl/pkg/visualize/graphviz.go @@ -0,0 +1,381 @@ +package visualize + +import ( + "fmt" + "strings" + + "github.com/flyteorg/flyteidl/clients/go/coreutils" + + graphviz "github.com/awalterschulze/gographviz" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +const ( + // node identifiers + StartNode string = "start-node" + EndNode string = "end-node" + + // subgraph attributes + SubgraphPrefix string = "cluster_" + + // shape attributes + DoubleCircleShape string = "doublecircle" + BoxShape string = "box" + DiamondShape string = "diamond" + ShapeType string = "shape" + + // color attributes + ColorAttr string = "color" + Red string = "red" + Green string = "green" + + // structural attributes + LabelAttr string = "label" + LHeadAttr string = "lhead" + LTailAttr string = "ltail" + + // conditional + ElseFail string = "orElse - Fail" + Else string = "orElse" +) + +func operandToString(op *core.Operand) string { + if op.GetPrimitive() != nil { + l, err := coreutils.ExtractFromLiteral(&core.Literal{Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: op.GetPrimitive(), + }, + }, + }}) + if err != nil { + return err.Error() + } + return fmt.Sprintf("%v", l) + } + return op.GetVar() +} + +func comparisonToString(expr *core.ComparisonExpression) string { + return fmt.Sprintf("%s %s %s", operandToString(expr.LeftValue), expr.Operator.String(), operandToString(expr.RightValue)) +} + +func conjunctionToString(expr *core.ConjunctionExpression) string { + return fmt.Sprintf("(%s) %s (%s)", booleanExprToString(expr.LeftExpression), expr.Operator.String(), booleanExprToString(expr.RightExpression)) +} + +func booleanExprToString(expr *core.BooleanExpression) string { + if expr.GetConjunction() != nil { + return conjunctionToString(expr.GetConjunction()) + } + return comparisonToString(expr.GetComparison()) +} + +func constructStartNode(parentGraph string, n string, graph Graphvizer) (*graphviz.Node, error) { + attrs := map[string]string{ShapeType: DoubleCircleShape, ColorAttr: Green} + attrs[LabelAttr] = "start" + err := graph.AddNode(parentGraph, n, attrs) + return graph.GetNode(n), err +} + +func constructEndNode(parentGraph string, n string, graph Graphvizer) (*graphviz.Node, error) { + attrs := map[string]string{ShapeType: DoubleCircleShape, ColorAttr: Red} + attrs[LabelAttr] = "end" + err := graph.AddNode(parentGraph, n, attrs) + return graph.GetNode(n), err +} + +func constructTaskNode(parentGraph string, name string, graph Graphvizer, n *core.Node, t *core.CompiledTask) (*graphviz.Node, error) { + attrs := map[string]string{ShapeType: BoxShape} + if n.Metadata != nil && n.Metadata.Name != "" { + v := strings.LastIndexAny(n.Metadata.Name, ".") + attrs[LabelAttr] = fmt.Sprintf("\"%s [%s]\"", n.Metadata.Name[v+1:], t.Template.Type) + } + tName := strings.ReplaceAll(name, "-", "_") + err := graph.AddNode(parentGraph, tName, attrs) + return graph.GetNode(tName), err +} + +func constructErrorNode(parentGraph string, name string, graph Graphvizer, m string) (*graphviz.Node, error) { + attrs := map[string]string{ShapeType: BoxShape, ColorAttr: Red, LabelAttr: fmt.Sprintf("\"%s\"", m)} + eName := strings.ReplaceAll(name, "-", "_") + err := graph.AddNode(parentGraph, eName, attrs) + return graph.GetNode(eName), err +} + +func constructBranchConditionNode(parentGraph string, name string, graph Graphvizer, n *core.Node) (*graphviz.Node, error) { + attrs := map[string]string{ShapeType: DiamondShape} + if n.Metadata != nil && n.Metadata.Name != "" { + attrs[LabelAttr] = fmt.Sprintf("\"[%s]\"", n.Metadata.Name) + } + cName := strings.ReplaceAll(name, "-", "_") + err := graph.AddNode(parentGraph, cName, attrs) + return graph.GetNode(cName), err +} + +func getName(prefix, id string) string { + if prefix != "" { + return prefix + "_" + id + } + return id +} + +type graphBuilder struct { + // Mutated as graph is built + graphNodes map[string]*graphviz.Node + // Mutated as graph is built. lookup table for all graphviz compiled edges. + graphEdges map[string]*graphviz.Edge + // lookup table for all graphviz compiled subgraphs + subWf map[string]*core.CompiledWorkflow + // a lookup table for all tasks in the graph + tasks map[string]*core.CompiledTask + // a lookup for all node clusters. This is to remap the edges to the cluster itself (instead of the node) + // this is useful in the case of branchNodes and subworkflow nodes + nodeClusters map[string]string +} + +func (gb *graphBuilder) addBranchSubNodeEdge(graph Graphvizer, parentNode, n *graphviz.Node, label string) error { + edgeName := fmt.Sprintf("%s-%s", parentNode.Name, n.Name) + if _, ok := gb.graphEdges[edgeName]; !ok { + attrs := map[string]string{} + if c, ok := gb.nodeClusters[n.Name]; ok { + attrs[LHeadAttr] = fmt.Sprintf("\"%s\"", c) + } + attrs[LabelAttr] = fmt.Sprintf("\"%s\"", label) + err := graph.AddEdge(parentNode.Name, n.Name, true, attrs) + if err != nil { + return err + } + gb.graphEdges[edgeName] = graph.GetEdge(parentNode.Name, n.Name) + } + return nil +} + +func (gb *graphBuilder) constructBranchNode(parentGraph string, prefix string, graph Graphvizer, n *core.Node) (*graphviz.Node, error) { + parentBranchNode, err := constructBranchConditionNode(parentGraph, getName(prefix, n.Id), graph, n) + if err != nil { + return nil, err + } + gb.graphNodes[n.Id] = parentBranchNode + + if n.GetBranchNode().GetIfElse() == nil { + return parentBranchNode, nil + } + + subNode, err := gb.constructNode(parentGraph, prefix, graph, n.GetBranchNode().GetIfElse().Case.ThenNode) + if err != nil { + return nil, err + } + if err := gb.addBranchSubNodeEdge(graph, parentBranchNode, subNode, booleanExprToString(n.GetBranchNode().GetIfElse().Case.Condition)); err != nil { + return nil, err + } + + if n.GetBranchNode().GetIfElse().GetError() != nil { + name := fmt.Sprintf("%s-error", parentBranchNode.Name) + subNode, err := constructErrorNode(prefix, name, graph, n.GetBranchNode().GetIfElse().GetError().Message) + if err != nil { + return nil, err + } + gb.graphNodes[name] = subNode + if err := gb.addBranchSubNodeEdge(graph, parentBranchNode, subNode, ElseFail); err != nil { + return nil, err + } + } else { + subNode, err := gb.constructNode(parentGraph, prefix, graph, n.GetBranchNode().GetIfElse().GetElseNode()) + if err != nil { + return nil, err + } + if err := gb.addBranchSubNodeEdge(graph, parentBranchNode, subNode, Else); err != nil { + return nil, err + } + } + + if n.GetBranchNode().GetIfElse().GetOther() != nil { + for _, c := range n.GetBranchNode().GetIfElse().GetOther() { + subNode, err := gb.constructNode(parentGraph, prefix, graph, c.ThenNode) + if err != nil { + return nil, err + } + if err := gb.addBranchSubNodeEdge(graph, parentBranchNode, subNode, booleanExprToString(c.Condition)); err != nil { + return nil, err + } + } + } + return parentBranchNode, nil +} + +func (gb *graphBuilder) constructNode(parentGraphName string, prefix string, graph Graphvizer, n *core.Node) (*graphviz.Node, error) { + name := getName(prefix, n.Id) + var err error + var gn *graphviz.Node + + if n.Id == StartNode { + gn, err = constructStartNode(parentGraphName, strings.ReplaceAll(name, "-", "_"), graph) + gb.nodeClusters[name] = parentGraphName + } else if n.Id == EndNode { + gn, err = constructEndNode(parentGraphName, strings.ReplaceAll(name, "-", "_"), graph) + gb.nodeClusters[name] = parentGraphName + } else { + switch n.Target.(type) { + case *core.Node_TaskNode: + tID := n.GetTaskNode().GetReferenceId().String() + t, ok := gb.tasks[tID] + if !ok { + return nil, fmt.Errorf("failed to find task [%s] in closure", tID) + } + gn, err = constructTaskNode(parentGraphName, name, graph, n, t) + if err != nil { + return nil, err + } + gb.nodeClusters[name] = parentGraphName + case *core.Node_BranchNode: + branchSubGraphName := SubgraphPrefix + n.Metadata.Name + err := graph.AddSubGraph(parentGraphName, branchSubGraphName, nil) + if err != nil { + return nil, err + } + gn, err = gb.constructBranchNode(branchSubGraphName, prefix, graph, n) + if err != nil { + return nil, err + } + gb.nodeClusters[name] = branchSubGraphName + case *core.Node_WorkflowNode: + if n.GetWorkflowNode().GetLaunchplanRef() != nil { + attrs := map[string]string{} + err := graph.AddNode(parentGraphName, name, attrs) + if err != nil { + return nil, err + } + } else { + subGraphName := SubgraphPrefix + name + err := graph.AddSubGraph(parentGraphName, subGraphName, nil) + if err != nil { + return nil, err + } + subGB := graphBuilderFromParent(gb) + swf, ok := gb.subWf[n.GetWorkflowNode().GetSubWorkflowRef().String()] + if !ok { + return nil, fmt.Errorf("subworkfow [%s] not found", n.GetWorkflowNode().GetSubWorkflowRef().String()) + } + if err := subGB.constructGraph(subGraphName, name, graph, swf); err != nil { + return nil, err + } + gn = subGB.graphNodes[StartNode] + gb.nodeClusters[gn.Name] = subGraphName + } + } + } + if err != nil { + return nil, err + } + gb.graphNodes[n.Id] = gn + return gn, nil +} + +func (gb *graphBuilder) addEdge(fromNodeName, toNodeName string, graph Graphvizer) error { + toNode, toOk := gb.graphNodes[toNodeName] + fromNode, fromOk := gb.graphNodes[fromNodeName] + if !toOk || !fromOk { + return fmt.Errorf("nodes[%s] -> [%s] referenced before creation", fromNodeName, toNodeName) + } + if !graph.DoesEdgeExist(fromNode.Name, toNode.Name) { + attrs := map[string]string{} + // Now lets check that the toNode or the fromNode is a cluster. If so then following this thread, + // https://stackoverflow.com/questions/2012036/graphviz-how-to-connect-subgraphs, we will connect the cluster + if c, ok := gb.nodeClusters[fromNode.Name]; ok { + attrs[LTailAttr] = fmt.Sprintf("\"%s\"", c) + } + if c, ok := gb.nodeClusters[toNode.Name]; ok { + attrs[LHeadAttr] = fmt.Sprintf("\"%s\"", c) + } + err := graph.AddEdge(fromNode.Name, toNode.Name, true, attrs) + if err != nil { + return err + } + } + return nil +} + +func (gb *graphBuilder) constructGraph(parentGraphName string, prefix string, graph Graphvizer, w *core.CompiledWorkflow) error { + if w == nil || w.Template == nil { + return nil + } + for _, n := range w.Template.Nodes { + if _, err := gb.constructNode(parentGraphName, prefix, graph, n); err != nil { + return err + } + } + + for name := range gb.graphNodes { + upstreamNodes := w.Connections.Upstream[name] + downstreamNodes := w.Connections.Downstream[name] + if downstreamNodes != nil { + for _, n := range downstreamNodes.Ids { + if err := gb.addEdge(name, n, graph); err != nil { + return err + } + } + } + if upstreamNodes != nil { + for _, n := range upstreamNodes.Ids { + if err := gb.addEdge(n, name, graph); err != nil { + return err + } + } + } + } + return nil +} + +func (gb *graphBuilder) CompiledWorkflowClosureToGraph(w *core.CompiledWorkflowClosure) (FlyteGraph, error) { + dotGraph := FlyteGraph{graphviz.NewGraph()} + _ = dotGraph.SetDir(true) + _ = dotGraph.SetStrict(true) + + tLookup := make(map[string]*core.CompiledTask) + for _, t := range w.Tasks { + if t.Template == nil || t.Template.Id == nil { + return FlyteGraph{}, fmt.Errorf("no template found in the workflow task %v", t) + } + tLookup[t.Template.Id.String()] = t + } + gb.tasks = tLookup + wLookup := make(map[string]*core.CompiledWorkflow) + for _, swf := range w.SubWorkflows { + if swf.Template == nil || swf.Template.Id == nil { + return FlyteGraph{}, fmt.Errorf("no template found in the sub workflow %v", swf) + } + wLookup[swf.Template.Id.String()] = swf + } + gb.subWf = wLookup + + return dotGraph, gb.constructGraph("", "", dotGraph, w.Primary) +} + +func newGraphBuilder() *graphBuilder { + return &graphBuilder{ + graphNodes: make(map[string]*graphviz.Node), + graphEdges: make(map[string]*graphviz.Edge), + nodeClusters: make(map[string]string), + } +} + +func graphBuilderFromParent(gb *graphBuilder) *graphBuilder { + newGB := newGraphBuilder() + newGB.subWf = gb.subWf + newGB.tasks = gb.tasks + return newGB +} + +// RenderWorkflow Renders the workflow graph on the console +func RenderWorkflow(w *core.CompiledWorkflowClosure) (string, error) { + if w == nil { + return "", fmt.Errorf("empty workflow closure") + } + gb := newGraphBuilder() + graph, err := gb.CompiledWorkflowClosureToGraph(w) + if err != nil { + return "", err + } + return graph.String(), nil +} diff --git a/flytectl/pkg/visualize/graphviz_test.go b/flytectl/pkg/visualize/graphviz_test.go new file mode 100644 index 0000000000..56b8621e2f --- /dev/null +++ b/flytectl/pkg/visualize/graphviz_test.go @@ -0,0 +1,470 @@ +package visualize + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + "github.com/flyteorg/flytectl/pkg/visualize/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + graphviz "github.com/awalterschulze/gographviz" + "github.com/golang/protobuf/jsonpb" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func TestRenderWorkflowBranch(t *testing.T) { + // Sadly we cannot compare the output of svg, as it slightly changes. + file := []string{"compiled_closure_branch_nested", "compiled_subworkflows"} + + for _, s := range file { + t.Run(s, func(t *testing.T) { + r, err := ioutil.ReadFile(fmt.Sprintf("testdata/%s.json", s)) + assert.NoError(t, err) + + i := bytes.NewReader(r) + + c := &core.CompiledWorkflowClosure{} + err = jsonpb.Unmarshal(i, c) + assert.NoError(t, err) + b, err := RenderWorkflow(c) + fmt.Println(b) + assert.NoError(t, err) + assert.NotNil(t, b) + }) + } +} + +func TestAddBranchSubNodeEdge(t *testing.T) { + attrs := map[string]string{} + attrs[LHeadAttr] = fmt.Sprintf("\"%s\"", "innerGraph") + attrs[LabelAttr] = fmt.Sprintf("\"%s\"", "label") + t.Run("Successful", func(t *testing.T) { + gb := newGraphBuilder() + gb.nodeClusters["n"] = "innerGraph" + parentNode := &graphviz.Node{Name: "parentNode", Attrs: nil} + n := &graphviz.Node{Name: "n"} + + mockGraph := &mocks.Graphvizer{} + // Verify the attributes + mockGraph.OnAddEdgeMatch(mock.Anything, mock.Anything, mock.Anything, attrs).Return(nil) + mockGraph.OnGetEdgeMatch(mock.Anything, mock.Anything).Return(&graphviz.Edge{}) + err := gb.addBranchSubNodeEdge(mockGraph, parentNode, n, "label") + assert.NoError(t, err) + }) + + t.Run("Error", func(t *testing.T) { + gb := newGraphBuilder() + gb.nodeClusters["n"] = "innerGraph" + parentNode := &graphviz.Node{Name: "parentNode", Attrs: nil} + n := &graphviz.Node{Name: "n"} + + mockGraph := &mocks.Graphvizer{} + // Verify the attributes + mockGraph.OnAddEdgeMatch(mock.Anything, mock.Anything, mock.Anything, attrs).Return(fmt.Errorf("error adding edge")) + err := gb.addBranchSubNodeEdge(mockGraph, parentNode, n, "label") + assert.NotNil(t, err) + }) +} + +func TestConstructBranchNode(t *testing.T) { + attrs := map[string]string{} + attrs[LabelAttr] = fmt.Sprintf("\"[%s]\"", "nodeMetadata") + attrs[ShapeType] = DiamondShape + t.Run("Successful", func(t *testing.T) { + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + expectedGraphvizNode := &graphviz.Node{ + Name: "brancheName_id", + Attrs: map[graphviz.Attr]string{"label": fmt.Sprintf("\"[%s]\"", "nodeMetadata"), + "shape": "diamond"}, + } + // Verify the attributes + mockGraph.OnAddNodeMatch(mock.Anything, mock.Anything, attrs).Return(nil) + mockGraph.OnGetNodeMatch(mock.Anything).Return(expectedGraphvizNode) + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_BranchNode{ + BranchNode: &core.BranchNode{}, + }, + } + resultBranchNode, err := gb.constructBranchNode("parentGraph", "branchName", mockGraph, flyteNode) + assert.NoError(t, err) + assert.NotNil(t, resultBranchNode) + assert.Equal(t, expectedGraphvizNode, resultBranchNode) + }) + + t.Run("Add Node Error", func(t *testing.T) { + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + // Verify the attributes + mockGraph.OnAddNodeMatch(mock.Anything, mock.Anything, attrs).Return(fmt.Errorf("unable to add node")) + mockGraph.OnGetNodeMatch(mock.Anything).Return(nil) + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_BranchNode{ + BranchNode: &core.BranchNode{}, + }, + } + resultBranchNode, err := gb.constructBranchNode("parentGraph", "branchName", mockGraph, flyteNode) + assert.NotNil(t, err) + assert.Nil(t, resultBranchNode) + }) + + t.Run("Add ThenNode Error", func(t *testing.T) { + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + attrs := map[string]string{} + attrs[LabelAttr] = fmt.Sprintf("\"[%s]\"", "nodeMetadata") + attrs[ShapeType] = DiamondShape + + // Verify the attributes + mockGraph.OnAddNodeMatch(mock.Anything, "branchName_id", attrs).Return(nil) + mockGraph.OnAddNodeMatch(mock.Anything, "branchName_start_node", mock.Anything).Return(fmt.Errorf("unable to add node")) + mockGraph.OnGetNodeMatch(mock.Anything).Return(nil) + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_BranchNode{ + BranchNode: &core.BranchNode{ + IfElse: &core.IfElseBlock{ + Case: &core.IfBlock{ + Condition: &core.BooleanExpression{}, + ThenNode: &core.Node{ + Id: "start-node", + }, + }, + }, + }, + }, + } + resultBranchNode, err := gb.constructBranchNode("parentGraph", "branchName", mockGraph, flyteNode) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to add node"), err) + assert.Nil(t, resultBranchNode) + }) + + t.Run("Add Condition Node Edge Error", func(t *testing.T) { + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + attrs := map[string]string{} + attrs[LabelAttr] = fmt.Sprintf("\"[%s]\"", "nodeMetadata") + attrs[ShapeType] = DiamondShape + + parentNode := &graphviz.Node{Name: "parentNode", Attrs: nil} + thenBranchStartNode := &graphviz.Node{Name: "branchName_start_node", Attrs: nil} + + mockGraph.OnAddNodeMatch(mock.Anything, "branchName_id", attrs).Return(nil) + mockGraph.OnAddNodeMatch(mock.Anything, "branchName_start_node", mock.Anything).Return(nil) + mockGraph.OnGetNodeMatch("branchName_id").Return(parentNode) + mockGraph.OnGetNodeMatch("branchName_start_node").Return(thenBranchStartNode) + mockGraph.OnAddEdgeMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("unable to add edge")) + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_BranchNode{ + BranchNode: &core.BranchNode{ + IfElse: &core.IfElseBlock{ + Case: &core.IfBlock{ + Condition: &core.BooleanExpression{ + Expr: &core.BooleanExpression_Comparison{ + Comparison: &core.ComparisonExpression{ + Operator: core.ComparisonExpression_EQ, + LeftValue: &core.Operand{ + Val: &core.Operand_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 40, + }, + }, + }, + }, + RightValue: &core.Operand{ + Val: &core.Operand_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 50, + }, + }, + }, + }, + }, + }, + }, + ThenNode: &core.Node{ + Id: "start-node", + }, + }, + }, + }, + }, + } + resultBranchNode, err := gb.constructBranchNode("parentGraph", "branchName", mockGraph, flyteNode) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to add edge"), err) + assert.Nil(t, resultBranchNode) + }) +} + +func TestConstructNode(t *testing.T) { + + t.Run("Start-Node", func(t *testing.T) { + attrs := map[string]string{} + attrs[LabelAttr] = "start" + attrs[ShapeType] = DoubleCircleShape + attrs[ColorAttr] = Green + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + expectedGraphvizNode := &graphviz.Node{ + Name: "start-node", + Attrs: map[graphviz.Attr]string{"label": "start", "shape": "doublecircle", "color": "green"}, + } + // Verify the attributes + mockGraph.OnAddNodeMatch(mock.Anything, mock.Anything, attrs).Return(nil) + mockGraph.OnGetNodeMatch(mock.Anything).Return(expectedGraphvizNode) + flyteNode := &core.Node{ + Id: "start-node", + } + resultNode, err := gb.constructNode("", "", mockGraph, flyteNode) + assert.NoError(t, err) + assert.NotNil(t, resultNode) + assert.Equal(t, expectedGraphvizNode, resultNode) + }) + + t.Run("End-Node", func(t *testing.T) { + attrs := map[string]string{} + attrs[LabelAttr] = "end" + attrs[ShapeType] = DoubleCircleShape + attrs[ColorAttr] = Red + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + expectedGraphvizNode := &graphviz.Node{ + Name: "end-node", + Attrs: map[graphviz.Attr]string{"label": "end", "shape": "doublecircle", "color": "red"}, + } + // Verify the attributes + mockGraph.OnAddNodeMatch(mock.Anything, mock.Anything, attrs).Return(nil) + mockGraph.OnGetNodeMatch(mock.Anything).Return(expectedGraphvizNode) + flyteNode := &core.Node{ + Id: "end-node", + } + resultNode, err := gb.constructNode("", "", mockGraph, flyteNode) + assert.NoError(t, err) + assert.NotNil(t, resultNode) + assert.Equal(t, expectedGraphvizNode, resultNode) + }) + + t.Run("Task-Node-Error", func(t *testing.T) { + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_TaskNode{ + TaskNode: &core.TaskNode{ + Reference: &core.TaskNode_ReferenceId{ + ReferenceId: &core.Identifier{ + Project: "dummyProject", + Domain: "dummyDomain", + Name: "dummyName", + Version: "dummyVersion", + }, + }, + }, + }, + } + resultNode, err := gb.constructNode("", "", mockGraph, flyteNode) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to find task [%s] in closure", + flyteNode.GetTaskNode().GetReferenceId().String()), err) + assert.Nil(t, resultNode) + }) + + t.Run("Branch-Node-SubGraph-Error", func(t *testing.T) { + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + // Verify the attributes + mockGraph.OnAddSubGraphMatch("", SubgraphPrefix+"nodeMetadata", + mock.Anything).Return(fmt.Errorf("unable to create subgraph")) + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_BranchNode{ + BranchNode: &core.BranchNode{}, + }, + } + resultBranchNode, err := gb.constructNode("", "", mockGraph, flyteNode) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to create subgraph"), err) + assert.Nil(t, resultBranchNode) + }) + + t.Run("Branch-Node-Add-Error", func(t *testing.T) { + attrs := map[string]string{} + attrs[LabelAttr] = fmt.Sprintf("\"[%s]\"", "nodeMetadata") + attrs[ShapeType] = DiamondShape + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + + // Verify the attributes + mockGraph.OnAddSubGraphMatch(mock.Anything, SubgraphPrefix+"nodeMetadata", mock.Anything).Return(nil) + mockGraph.OnAddNodeMatch(mock.Anything, mock.Anything, attrs).Return(fmt.Errorf("unable to add node")) + mockGraph.OnGetNodeMatch(mock.Anything).Return(nil) + + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_BranchNode{ + BranchNode: &core.BranchNode{}, + }, + } + resultBranchNode, err := gb.constructNode("", "", mockGraph, flyteNode) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to add node"), err) + assert.Nil(t, resultBranchNode) + }) + + t.Run("Workflow-Node-Add-Error", func(t *testing.T) { + attrs := map[string]string{} + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + + // Verify the attributes + mockGraph.OnAddNodeMatch(mock.Anything, mock.Anything, attrs).Return(fmt.Errorf("unable to add node")) + mockGraph.OnGetNodeMatch(mock.Anything).Return(nil) + + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_WorkflowNode{ + WorkflowNode: &core.WorkflowNode{ + Reference: &core.WorkflowNode_LaunchplanRef{ + LaunchplanRef: &core.Identifier{ + Project: "dummyProject", + Domain: "dummyDomain", + Name: "dummyName", + Version: "dummyVersion", + }, + }, + }, + }, + } + resultWorkflowNode, err := gb.constructNode("", "", mockGraph, flyteNode) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to add node"), err) + assert.Nil(t, resultWorkflowNode) + }) + + t.Run("Workflow-Node-SubGraph-Error", func(t *testing.T) { + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + // Verify the attributes + mockGraph.OnAddSubGraphMatch("", SubgraphPrefix+"id", + mock.Anything).Return(fmt.Errorf("unable to create subgraph")) + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_WorkflowNode{ + WorkflowNode: &core.WorkflowNode{}, + }, + } + resultWorkflowNode, err := gb.constructNode("", "", mockGraph, flyteNode) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to create subgraph"), err) + assert.Nil(t, resultWorkflowNode) + }) + t.Run("Workflow-Node-Subworkflow-NotFound-Error", func(t *testing.T) { + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + + // Verify the attributes + mockGraph.OnAddSubGraphMatch(mock.Anything, SubgraphPrefix+"id", mock.Anything).Return(nil) + + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_WorkflowNode{ + WorkflowNode: &core.WorkflowNode{ + Reference: &core.WorkflowNode_SubWorkflowRef{ + SubWorkflowRef: &core.Identifier{ + Project: "dummyProject", + Domain: "dummyDomain", + Name: "dummyName", + Version: "dummyVersion", + }, + }, + }, + }, + } + resultWorkflowNode, err := gb.constructNode("", "", mockGraph, flyteNode) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("subworkfow [project:\"dummyProject\" domain:\"dummyDomain\" name:\"dummyName\" version:\"dummyVersion\" ] not found"), err) + assert.Nil(t, resultWorkflowNode) + }) + + t.Run("Workflow-Node-Subworkflow-Graph-Create-Error", func(t *testing.T) { + gb := newGraphBuilder() + mockGraph := &mocks.Graphvizer{} + + // Verify the attributes + mockGraph.OnAddSubGraphMatch(mock.Anything, SubgraphPrefix+"id", mock.Anything).Return(nil) + mockGraph.OnAddNodeMatch(mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("unable to add node")) + mockGraph.OnGetNodeMatch(mock.Anything).Return(nil) + + gb.subWf = make(map[string]*core.CompiledWorkflow) + subwfNode := &core.Node{ + Id: "start-node", + } + sbwfNodes := []*core.Node{subwfNode} + + gb.subWf["project:\"dummyProject\" domain:\"dummyDomain\" name:\"dummyName\" version:\"dummyVersion\" "] = + &core.CompiledWorkflow{Template: &core.WorkflowTemplate{Nodes: sbwfNodes}} + flyteNode := &core.Node{ + Id: "id", + Metadata: &core.NodeMetadata{ + Name: "nodeMetadata", + }, + Target: &core.Node_WorkflowNode{ + WorkflowNode: &core.WorkflowNode{ + Reference: &core.WorkflowNode_SubWorkflowRef{ + SubWorkflowRef: &core.Identifier{ + Project: "dummyProject", + Domain: "dummyDomain", + Name: "dummyName", + Version: "dummyVersion", + }, + }, + }, + }, + } + resultWorkflowNode, err := gb.constructNode("", "", mockGraph, flyteNode) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to add node"), err) + assert.Nil(t, resultWorkflowNode) + }) + +} diff --git a/flytectl/pkg/visualize/graphvizer.go b/flytectl/pkg/visualize/graphvizer.go new file mode 100644 index 0000000000..7fcb24ee08 --- /dev/null +++ b/flytectl/pkg/visualize/graphvizer.go @@ -0,0 +1,35 @@ +package visualize + +import graphviz "github.com/awalterschulze/gographviz" + +//go:generate mockery -all -case=underscore + +type Graphvizer interface { + AddEdge(src, dst string, directed bool, attrs map[string]string) error + AddNode(parentGraph string, name string, attrs map[string]string) error + AddSubGraph(parentGraph string, name string, attrs map[string]string) error + AddAttr(parentGraph string, field string, value string) error + SetName(name string) error + GetEdge(src, dest string) *graphviz.Edge + GetNode(key string) *graphviz.Node + DoesEdgeExist(src, dest string) bool +} + +type FlyteGraph struct { + *graphviz.Graph +} + +// GetNode given the key to the node +func (g FlyteGraph) GetNode(key string) *graphviz.Node { + return g.Nodes.Lookup[key] +} + +// GetEdge gets the edge in the graph from src to dest +func (g FlyteGraph) GetEdge(src, dest string) *graphviz.Edge { + return g.Edges.SrcToDsts[src][dest][0] +} + +// DoesEdgeExist checks if an edge exists in the graph from src to dest +func (g FlyteGraph) DoesEdgeExist(src, dest string) bool { + return g.Edges.SrcToDsts[src][dest] != nil +} diff --git a/flytectl/pkg/visualize/mocks/graphvizer.go b/flytectl/pkg/visualize/mocks/graphvizer.go new file mode 100644 index 0000000000..e36204ed77 --- /dev/null +++ b/flytectl/pkg/visualize/mocks/graphvizer.go @@ -0,0 +1,273 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + gographviz "github.com/awalterschulze/gographviz" + mock "github.com/stretchr/testify/mock" +) + +// Graphvizer is an autogenerated mock type for the Graphvizer type +type Graphvizer struct { + mock.Mock +} + +type Graphvizer_AddAttr struct { + *mock.Call +} + +func (_m Graphvizer_AddAttr) Return(_a0 error) *Graphvizer_AddAttr { + return &Graphvizer_AddAttr{Call: _m.Call.Return(_a0)} +} + +func (_m *Graphvizer) OnAddAttr(parentGraph string, field string, value string) *Graphvizer_AddAttr { + c := _m.On("AddAttr", parentGraph, field, value) + return &Graphvizer_AddAttr{Call: c} +} + +func (_m *Graphvizer) OnAddAttrMatch(matchers ...interface{}) *Graphvizer_AddAttr { + c := _m.On("AddAttr", matchers...) + return &Graphvizer_AddAttr{Call: c} +} + +// AddAttr provides a mock function with given fields: parentGraph, field, value +func (_m *Graphvizer) AddAttr(parentGraph string, field string, value string) error { + ret := _m.Called(parentGraph, field, value) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, string) error); ok { + r0 = rf(parentGraph, field, value) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type Graphvizer_AddEdge struct { + *mock.Call +} + +func (_m Graphvizer_AddEdge) Return(_a0 error) *Graphvizer_AddEdge { + return &Graphvizer_AddEdge{Call: _m.Call.Return(_a0)} +} + +func (_m *Graphvizer) OnAddEdge(src string, dst string, directed bool, attrs map[string]string) *Graphvizer_AddEdge { + c := _m.On("AddEdge", src, dst, directed, attrs) + return &Graphvizer_AddEdge{Call: c} +} + +func (_m *Graphvizer) OnAddEdgeMatch(matchers ...interface{}) *Graphvizer_AddEdge { + c := _m.On("AddEdge", matchers...) + return &Graphvizer_AddEdge{Call: c} +} + +// AddEdge provides a mock function with given fields: src, dst, directed, attrs +func (_m *Graphvizer) AddEdge(src string, dst string, directed bool, attrs map[string]string) error { + ret := _m.Called(src, dst, directed, attrs) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, bool, map[string]string) error); ok { + r0 = rf(src, dst, directed, attrs) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type Graphvizer_AddNode struct { + *mock.Call +} + +func (_m Graphvizer_AddNode) Return(_a0 error) *Graphvizer_AddNode { + return &Graphvizer_AddNode{Call: _m.Call.Return(_a0)} +} + +func (_m *Graphvizer) OnAddNode(parentGraph string, name string, attrs map[string]string) *Graphvizer_AddNode { + c := _m.On("AddNode", parentGraph, name, attrs) + return &Graphvizer_AddNode{Call: c} +} + +func (_m *Graphvizer) OnAddNodeMatch(matchers ...interface{}) *Graphvizer_AddNode { + c := _m.On("AddNode", matchers...) + return &Graphvizer_AddNode{Call: c} +} + +// AddNode provides a mock function with given fields: parentGraph, name, attrs +func (_m *Graphvizer) AddNode(parentGraph string, name string, attrs map[string]string) error { + ret := _m.Called(parentGraph, name, attrs) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, map[string]string) error); ok { + r0 = rf(parentGraph, name, attrs) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type Graphvizer_AddSubGraph struct { + *mock.Call +} + +func (_m Graphvizer_AddSubGraph) Return(_a0 error) *Graphvizer_AddSubGraph { + return &Graphvizer_AddSubGraph{Call: _m.Call.Return(_a0)} +} + +func (_m *Graphvizer) OnAddSubGraph(parentGraph string, name string, attrs map[string]string) *Graphvizer_AddSubGraph { + c := _m.On("AddSubGraph", parentGraph, name, attrs) + return &Graphvizer_AddSubGraph{Call: c} +} + +func (_m *Graphvizer) OnAddSubGraphMatch(matchers ...interface{}) *Graphvizer_AddSubGraph { + c := _m.On("AddSubGraph", matchers...) + return &Graphvizer_AddSubGraph{Call: c} +} + +// AddSubGraph provides a mock function with given fields: parentGraph, name, attrs +func (_m *Graphvizer) AddSubGraph(parentGraph string, name string, attrs map[string]string) error { + ret := _m.Called(parentGraph, name, attrs) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, map[string]string) error); ok { + r0 = rf(parentGraph, name, attrs) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type Graphvizer_DoesEdgeExist struct { + *mock.Call +} + +func (_m Graphvizer_DoesEdgeExist) Return(_a0 bool) *Graphvizer_DoesEdgeExist { + return &Graphvizer_DoesEdgeExist{Call: _m.Call.Return(_a0)} +} + +func (_m *Graphvizer) OnDoesEdgeExist(src string, dest string) *Graphvizer_DoesEdgeExist { + c := _m.On("DoesEdgeExist", src, dest) + return &Graphvizer_DoesEdgeExist{Call: c} +} + +func (_m *Graphvizer) OnDoesEdgeExistMatch(matchers ...interface{}) *Graphvizer_DoesEdgeExist { + c := _m.On("DoesEdgeExist", matchers...) + return &Graphvizer_DoesEdgeExist{Call: c} +} + +// DoesEdgeExist provides a mock function with given fields: src, dest +func (_m *Graphvizer) DoesEdgeExist(src string, dest string) bool { + ret := _m.Called(src, dest) + + var r0 bool + if rf, ok := ret.Get(0).(func(string, string) bool); ok { + r0 = rf(src, dest) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +type Graphvizer_GetEdge struct { + *mock.Call +} + +func (_m Graphvizer_GetEdge) Return(_a0 *gographviz.Edge) *Graphvizer_GetEdge { + return &Graphvizer_GetEdge{Call: _m.Call.Return(_a0)} +} + +func (_m *Graphvizer) OnGetEdge(src string, dest string) *Graphvizer_GetEdge { + c := _m.On("GetEdge", src, dest) + return &Graphvizer_GetEdge{Call: c} +} + +func (_m *Graphvizer) OnGetEdgeMatch(matchers ...interface{}) *Graphvizer_GetEdge { + c := _m.On("GetEdge", matchers...) + return &Graphvizer_GetEdge{Call: c} +} + +// GetEdge provides a mock function with given fields: src, dest +func (_m *Graphvizer) GetEdge(src string, dest string) *gographviz.Edge { + ret := _m.Called(src, dest) + + var r0 *gographviz.Edge + if rf, ok := ret.Get(0).(func(string, string) *gographviz.Edge); ok { + r0 = rf(src, dest) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*gographviz.Edge) + } + } + + return r0 +} + +type Graphvizer_GetNode struct { + *mock.Call +} + +func (_m Graphvizer_GetNode) Return(_a0 *gographviz.Node) *Graphvizer_GetNode { + return &Graphvizer_GetNode{Call: _m.Call.Return(_a0)} +} + +func (_m *Graphvizer) OnGetNode(key string) *Graphvizer_GetNode { + c := _m.On("GetNode", key) + return &Graphvizer_GetNode{Call: c} +} + +func (_m *Graphvizer) OnGetNodeMatch(matchers ...interface{}) *Graphvizer_GetNode { + c := _m.On("GetNode", matchers...) + return &Graphvizer_GetNode{Call: c} +} + +// GetNode provides a mock function with given fields: key +func (_m *Graphvizer) GetNode(key string) *gographviz.Node { + ret := _m.Called(key) + + var r0 *gographviz.Node + if rf, ok := ret.Get(0).(func(string) *gographviz.Node); ok { + r0 = rf(key) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*gographviz.Node) + } + } + + return r0 +} + +type Graphvizer_SetName struct { + *mock.Call +} + +func (_m Graphvizer_SetName) Return(_a0 error) *Graphvizer_SetName { + return &Graphvizer_SetName{Call: _m.Call.Return(_a0)} +} + +func (_m *Graphvizer) OnSetName(name string) *Graphvizer_SetName { + c := _m.On("SetName", name) + return &Graphvizer_SetName{Call: c} +} + +func (_m *Graphvizer) OnSetNameMatch(matchers ...interface{}) *Graphvizer_SetName { + c := _m.On("SetName", matchers...) + return &Graphvizer_SetName{Call: c} +} + +// SetName provides a mock function with given fields: name +func (_m *Graphvizer) SetName(name string) error { + ret := _m.Called(name) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(name) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json b/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json new file mode 100644 index 0000000000..baae3d9926 --- /dev/null +++ b/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json @@ -0,0 +1,553 @@ +{ + "primary": { + "template": { + "id": { + "resourceType": "WORKFLOW", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.run_conditions.so_nested", + "version": "v1" + }, + "metadata": {}, + "interface": { + "inputs": { + "variables": { + "my_input": { + "type": { + "simple": "FLOAT" + }, + "description": "my_input" + } + } + }, + "outputs": { + "variables": { + "o0": { + "type": { + "simple": "FLOAT" + }, + "description": "o0" + } + } + } + }, + "nodes": [ + { + "id": "start-node" + }, + { + "id": "end-node", + "inputs": [ + { + "var": "o0", + "binding": { + "promise": { + "nodeId": "n0", + "var": "o0" + } + } + } + ] + }, + { + "id": "n0", + "metadata": { + "name": "fractions", + "retries": {}, + "interruptible": false + }, + "inputs": [ + { + "var": ".my_input", + "binding": { + "promise": { + "nodeId": "start-node", + "var": "my_input" + } + } + } + ], + "branchNode": { + "ifElse": { + "case": { + "condition": { + "conjunction": { + "leftExpression": { + "comparison": { + "operator": "GT", + "leftValue": { + "var": ".my_input" + }, + "rightValue": { + "primitive": { + "floatValue": 0.1 + } + } + } + }, + "rightExpression": { + "comparison": { + "operator": "LT", + "leftValue": { + "var": ".my_input" + }, + "rightValue": { + "primitive": { + "floatValue": 1 + } + } + } + } + } + }, + "thenNode": { + "id": "n0-n0", + "metadata": { + "name": "inner_fractions", + "retries": {}, + "interruptible": false + }, + "inputs": [ + { + "var": ".my_input", + "binding": { + "promise": { + "nodeId": "start-node", + "var": "my_input" + } + } + } + ], + "branchNode": { + "ifElse": { + "case": { + "condition": { + "comparison": { + "operator": "LT", + "leftValue": { + "var": ".my_input" + }, + "rightValue": { + "primitive": { + "floatValue": 0.5 + } + } + } + }, + "thenNode": { + "id": "n0-n0-n0-n0", + "metadata": { + "name": "flytekit.core.python_function_task.core.control_flow.run_conditions.double", + "retries": {}, + "interruptible": false + }, + "inputs": [ + { + "var": "n", + "binding": { + "promise": { + "nodeId": "start-node", + "var": "my_input" + } + } + } + ], + "taskNode": { + "referenceId": { + "resourceType": "TASK", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.run_conditions.double", + "version": "v1" + } + } + } + }, + "other": [ + { + "condition": { + "conjunction": { + "leftExpression": { + "comparison": { + "operator": "GT", + "leftValue": { + "var": ".my_input" + }, + "rightValue": { + "primitive": { + "floatValue": 0.5 + } + } + } + }, + "rightExpression": { + "comparison": { + "operator": "LT", + "leftValue": { + "var": ".my_input" + }, + "rightValue": { + "primitive": { + "floatValue": 0.7 + } + } + } + } + } + }, + "thenNode": { + "id": "n0-n0-n0-n1", + "metadata": { + "name": "flytekit.core.python_function_task.core.control_flow.run_conditions.square", + "retries": {}, + "interruptible": false + }, + "inputs": [ + { + "var": "n", + "binding": { + "promise": { + "nodeId": "start-node", + "var": "my_input" + } + } + } + ], + "taskNode": { + "referenceId": { + "resourceType": "TASK", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.run_conditions.square", + "version": "v1" + } + } + } + } + ], + "error": { + "failedNodeId": "inner_fractions", + "message": "Only \u003c0.7 allowed" + } + } + } + } + }, + "other": [ + { + "condition": { + "conjunction": { + "leftExpression": { + "comparison": { + "operator": "GT", + "leftValue": { + "var": ".my_input" + }, + "rightValue": { + "primitive": { + "floatValue": 1 + } + } + } + }, + "rightExpression": { + "comparison": { + "operator": "LT", + "leftValue": { + "var": ".my_input" + }, + "rightValue": { + "primitive": { + "floatValue": 10 + } + } + } + } + } + }, + "thenNode": { + "id": "n0-n1", + "metadata": { + "name": "flytekit.core.python_function_task.core.control_flow.run_conditions.square", + "retries": {}, + "interruptible": false + }, + "inputs": [ + { + "var": "n", + "binding": { + "promise": { + "nodeId": "start-node", + "var": "my_input" + } + } + } + ], + "taskNode": { + "referenceId": { + "resourceType": "TASK", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.run_conditions.square", + "version": "v1" + } + } + } + } + ], + "elseNode": { + "id": "n0-n2", + "metadata": { + "name": "flytekit.core.python_function_task.core.control_flow.run_conditions.double", + "retries": {}, + "interruptible": false + }, + "inputs": [ + { + "var": "n", + "binding": { + "promise": { + "nodeId": "start-node", + "var": "my_input" + } + } + } + ], + "taskNode": { + "referenceId": { + "resourceType": "TASK", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.run_conditions.double", + "version": "v1" + } + } + } + } + } + } + ], + "outputs": [ + { + "var": "o0", + "binding": { + "promise": { + "nodeId": "n0", + "var": "o0" + } + } + } + ], + "metadataDefaults": {} + }, + "connections": { + "downstream": { + "n0": { + "ids": [ + "end-node" + ] + }, + "start-node": { + "ids": [ + "n0" + ] + } + }, + "upstream": { + "end-node": { + "ids": [ + "n0" + ] + }, + "n0": { + "ids": [ + "start-node" + ] + }, + "n0-n0": { + "ids": [ + "start-node" + ] + }, + "n0-n1": { + "ids": [ + "start-node" + ] + }, + "n0-n2": { + "ids": [ + "start-node" + ] + }, + "n0-n0-n0-n0": { + "ids": [ + "start-node" + ] + }, + "n0-n0-n0-n1": { + "ids": [ + "start-node" + ] + }, + "n1": { + "ids": [ + "start-node" + ] + }, + "n2": { + "ids": [ + "start-node" + ] + } + } + } + }, + "tasks": [ + { + "template": { + "id": { + "resourceType": "TASK", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.run_conditions.double", + "version": "v1" + }, + "type": "python-task", + "metadata": { + "runtime": { + "type": "FLYTE_SDK", + "version": "0.0.0+develop", + "flavor": "python" + }, + "retries": {}, + "interruptible": false + }, + "interface": { + "inputs": { + "variables": { + "n": { + "type": { + "simple": "FLOAT" + }, + "description": "n" + } + } + }, + "outputs": { + "variables": { + "o0": { + "type": { + "simple": "FLOAT" + }, + "description": "o0" + } + } + } + }, + "container": { + "image": "flytecookbook:core-d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59", + "args": [ + "pyflyte-execute", + "--inputs", + "{{.input}}", + "--output-prefix", + "{{.outputPrefix}}", + "--raw-output-data-prefix", + "{{.rawOutputDataPrefix}}", + "--resolver", + "flytekit.core.python_auto_container.default_task_resolver", + "--", + "task-module", + "core.control_flow.run_conditions", + "task-name", + "double" + ], + "resources": {}, + "env": [ + { + "key": "FLYTE_INTERNAL_CONFIGURATION_PATH", + "value": "/root/sandbox.config" + }, + { + "key": "FLYTE_INTERNAL_IMAGE", + "value": "flytecookbook:core-d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59" + } + ] + } + } + }, + { + "template": { + "id": { + "resourceType": "TASK", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.run_conditions.square", + "version": "v1" + }, + "type": "python-task", + "metadata": { + "runtime": { + "type": "FLYTE_SDK", + "version": "0.0.0+develop", + "flavor": "python" + }, + "retries": {}, + "interruptible": false + }, + "interface": { + "inputs": { + "variables": { + "n": { + "type": { + "simple": "FLOAT" + }, + "description": "n" + } + } + }, + "outputs": { + "variables": { + "o0": { + "type": { + "simple": "FLOAT" + }, + "description": "o0" + } + } + } + }, + "container": { + "image": "flytecookbook:core-d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59", + "args": [ + "pyflyte-execute", + "--inputs", + "{{.input}}", + "--output-prefix", + "{{.outputPrefix}}", + "--raw-output-data-prefix", + "{{.rawOutputDataPrefix}}", + "--resolver", + "flytekit.core.python_auto_container.default_task_resolver", + "--", + "task-module", + "core.control_flow.run_conditions", + "task-name", + "square" + ], + "resources": {}, + "env": [ + { + "key": "FLYTE_INTERNAL_CONFIGURATION_PATH", + "value": "/root/sandbox.config" + }, + { + "key": "FLYTE_INTERNAL_IMAGE", + "value": "flytecookbook:core-d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59" + } + ] + } + } + } + ] +} \ No newline at end of file diff --git a/flytectl/pkg/visualize/testdata/compiled_subworkflows.json b/flytectl/pkg/visualize/testdata/compiled_subworkflows.json new file mode 100644 index 0000000000..8bbf441367 --- /dev/null +++ b/flytectl/pkg/visualize/testdata/compiled_subworkflows.json @@ -0,0 +1,482 @@ +{ + "primary": { + "template": { + "id": { + "resourceType": "WORKFLOW", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.subworkflows.parent_wf", + "version": "d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59" + }, + "metadata": {}, + "interface": { + "inputs": { + "variables": { + "a": { + "type": { + "simple": "INTEGER" + }, + "description": "a" + } + } + }, + "outputs": { + "variables": { + "o0": { + "type": { + "simple": "INTEGER" + }, + "description": "o0" + }, + "o1": { + "type": { + "simple": "STRING" + }, + "description": "o1" + }, + "o2": { + "type": { + "simple": "STRING" + }, + "description": "o2" + } + } + } + }, + "nodes": [ + { + "id": "start-node" + }, + { + "id": "end-node", + "inputs": [ + { + "var": "o0", + "binding": { + "promise": { + "nodeId": "node-t1-parent", + "var": "t1_int_output" + } + } + }, + { + "var": "o1", + "binding": { + "promise": { + "nodeId": "n1", + "var": "o0" + } + } + }, + { + "var": "o2", + "binding": { + "promise": { + "nodeId": "n1", + "var": "o1" + } + } + } + ] + }, + { + "id": "node-t1-parent", + "metadata": { + "name": "flytekit.core.python_function_task.core.control_flow.subworkflows.t1", + "retries": {}, + "interruptible": false + }, + "inputs": [ + { + "var": "a", + "binding": { + "promise": { + "nodeId": "start-node", + "var": "a" + } + } + } + ], + "taskNode": { + "referenceId": { + "resourceType": "TASK", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.subworkflows.t1", + "version": "d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59" + } + } + }, + { + "id": "n1", + "metadata": { + "name": "flytekit.core.workflow.core.control_flow.subworkflows.my_subwf", + "retries": {}, + "interruptible": false + }, + "inputs": [ + { + "var": "a", + "binding": { + "promise": { + "nodeId": "node-t1-parent", + "var": "t1_int_output" + } + } + } + ], + "upstreamNodeIds": [ + "node-t1-parent" + ], + "workflowNode": { + "subWorkflowRef": { + "resourceType": "WORKFLOW", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.subworkflows.my_subwf", + "version": "d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59" + } + } + } + ], + "outputs": [ + { + "var": "o0", + "binding": { + "promise": { + "nodeId": "node-t1-parent", + "var": "t1_int_output" + } + } + }, + { + "var": "o1", + "binding": { + "promise": { + "nodeId": "n1", + "var": "o0" + } + } + }, + { + "var": "o2", + "binding": { + "promise": { + "nodeId": "n1", + "var": "o1" + } + } + } + ], + "metadataDefaults": {} + }, + "connections": { + "downstream": { + "n1": { + "ids": [ + "end-node" + ] + }, + "node-t1-parent": { + "ids": [ + "end-node", + "n1" + ] + }, + "start-node": { + "ids": [ + "node-t1-parent" + ] + } + }, + "upstream": { + "end-node": { + "ids": [ + "n1", + "node-t1-parent" + ] + }, + "n1": { + "ids": [ + "node-t1-parent" + ] + }, + "node-t1-parent": { + "ids": [ + "start-node" + ] + } + } + } + }, + "subWorkflows": [ + { + "template": { + "id": { + "resourceType": "WORKFLOW", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.subworkflows.my_subwf", + "version": "d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59" + }, + "metadata": {}, + "interface": { + "inputs": { + "variables": { + "a": { + "type": { + "simple": "INTEGER" + }, + "description": "a" + } + } + }, + "outputs": { + "variables": { + "o0": { + "type": { + "simple": "STRING" + }, + "description": "o0" + }, + "o1": { + "type": { + "simple": "STRING" + }, + "description": "o1" + } + } + } + }, + "nodes": [ + { + "id": "start-node" + }, + { + "id": "end-node", + "inputs": [ + { + "var": "o0", + "binding": { + "promise": { + "nodeId": "n0", + "var": "c" + } + } + }, + { + "var": "o1", + "binding": { + "promise": { + "nodeId": "n1", + "var": "c" + } + } + } + ] + }, + { + "id": "n0", + "metadata": { + "name": "flytekit.core.python_function_task.core.control_flow.subworkflows.t1", + "retries": {}, + "interruptible": false + }, + "inputs": [ + { + "var": "a", + "binding": { + "promise": { + "nodeId": "start-node", + "var": "a" + } + } + } + ], + "taskNode": { + "referenceId": { + "resourceType": "TASK", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.subworkflows.t1", + "version": "d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59" + } + } + }, + { + "id": "n1", + "metadata": { + "name": "flytekit.core.python_function_task.core.control_flow.subworkflows.t1", + "retries": {}, + "interruptible": false + }, + "inputs": [ + { + "var": "a", + "binding": { + "promise": { + "nodeId": "n0", + "var": "t1_int_output" + } + } + } + ], + "upstreamNodeIds": [ + "n0" + ], + "taskNode": { + "referenceId": { + "resourceType": "TASK", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.subworkflows.t1", + "version": "d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59" + } + } + } + ], + "outputs": [ + { + "var": "o0", + "binding": { + "promise": { + "nodeId": "n0", + "var": "c" + } + } + }, + { + "var": "o1", + "binding": { + "promise": { + "nodeId": "n1", + "var": "c" + } + } + } + ], + "metadataDefaults": {} + }, + "connections": { + "downstream": { + "n0": { + "ids": [ + "end-node", + "n1" + ] + }, + "n1": { + "ids": [ + "end-node" + ] + }, + "start-node": { + "ids": [ + "n0" + ] + } + }, + "upstream": { + "end-node": { + "ids": [ + "n0", + "n1" + ] + }, + "n0": { + "ids": [ + "start-node" + ] + }, + "n1": { + "ids": [ + "n0" + ] + } + } + } + } + ], + "tasks": [ + { + "template": { + "id": { + "resourceType": "TASK", + "project": "flytesnacks", + "domain": "development", + "name": "core.control_flow.subworkflows.t1", + "version": "d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59" + }, + "type": "python-task", + "metadata": { + "runtime": { + "type": "FLYTE_SDK", + "version": "0.0.0+develop", + "flavor": "python" + }, + "retries": {}, + "interruptible": false + }, + "interface": { + "inputs": { + "variables": { + "a": { + "type": { + "simple": "INTEGER" + }, + "description": "a" + } + } + }, + "outputs": { + "variables": { + "c": { + "type": { + "simple": "STRING" + }, + "description": "c" + }, + "t1_int_output": { + "type": { + "simple": "INTEGER" + }, + "description": "t1_int_output" + } + } + } + }, + "container": { + "image": "flytecookbook:core-d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59", + "args": [ + "pyflyte-execute", + "--inputs", + "{{.input}}", + "--output-prefix", + "{{.outputPrefix}}", + "--raw-output-data-prefix", + "{{.rawOutputDataPrefix}}", + "--resolver", + "flytekit.core.python_auto_container.default_task_resolver", + "--", + "task-module", + "core.control_flow.subworkflows", + "task-name", + "t1" + ], + "resources": {}, + "env": [ + { + "key": "FLYTE_INTERNAL_CONFIGURATION_PATH", + "value": "/root/sandbox.config" + }, + { + "key": "FLYTE_INTERNAL_IMAGE", + "value": "flytecookbook:core-d5fa3ecfaca02f9b83957c68fd5fe3c9082ccc59" + } + ] + } + } + } + ] +} + From 179da66ab537de12529c995ef3d7dde99e9f3185 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Fri, 18 Jun 2021 23:08:45 +0530 Subject: [PATCH 077/645] Added source flags in sandbox (#99) * added flags in sandbox Signed-off-by: Yuvraj * Set false debug defualt value Signed-off-by: Yuvraj * Remove debug flag Signed-off-by: Yuvraj * changes sandbox config name Signed-off-by: Yuvraj * Added test Signed-off-by: Yuvraj * Update sandbox logic to not overright user config Signed-off-by: Yuvraj * Added more unit test for sandbox Signed-off-by: Yuvraj * more unit test added Signed-off-by: Yuvraj * fixed unit test Signed-off-by: Yuvraj * more unit test Signed-off-by: Yuvraj * more unit test fix Signed-off-by: Yuvraj * more unit test fix Signed-off-by: Yuvraj * added more unit test Signed-off-by: Yuvraj * more changes Signed-off-by: Yuvraj --- flytectl/.github/workflows/build.yaml | 9 +- .../config/subcommand/sandbox/config_flags.go | 55 +++++++++ .../subcommand/sandbox/config_flags_test.go | 116 ++++++++++++++++++ .../subcommand/sandbox/sandbox_config.go | 11 ++ flytectl/cmd/sandbox/sandbox.go | 3 +- flytectl/cmd/sandbox/sandbox_util.go | 81 ++++++------ flytectl/cmd/sandbox/sandbox_util_test.go | 52 ++++++-- flytectl/cmd/sandbox/start.go | 64 ++++++---- flytectl/cmd/sandbox/teardown.go | 20 +-- 9 files changed, 321 insertions(+), 90 deletions(-) create mode 100755 flytectl/cmd/config/subcommand/sandbox/config_flags.go create mode 100755 flytectl/cmd/config/subcommand/sandbox/config_flags_test.go create mode 100644 flytectl/cmd/config/subcommand/sandbox/sandbox_config.go diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml index 43e996590c..2b70c73f27 100644 --- a/flytectl/.github/workflows/build.yaml +++ b/flytectl/.github/workflows/build.yaml @@ -12,17 +12,22 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + - uses: actions/cache@v2 with: - fetch-depth: "0" + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - name: Run GoReleaser dry run uses: goreleaser/goreleaser-action@v2 with: version: latest - args: --snapshot --skip-publish --rm-dist + args: --snapshot --skip-publish --rm-dist - name: Unit Tests uses: cedrickring/golang-action@1.5.2 env: GO111MODULE: "on" + CI_ENV: "true" with: args: make install && make test_unit_codecov - name: Push CodeCov diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go new file mode 100755 index 0000000000..3c1cd8d74e --- /dev/null +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -0,0 +1,55 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package sandbox + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.StringVar(&DefaultConfig.SnacksRepo, fmt.Sprintf("%v%v", prefix, "flytesnacks"), DefaultConfig.SnacksRepo, " Path of your flytesnacks repository") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go new file mode 100755 index 0000000000..c6bf24684c --- /dev/null +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -0,0 +1,116 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package sandbox + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_Config(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_Config(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) +} + +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) +} + +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_flytesnacks", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("flytesnacks", testValue) + if vString, err := cmdFlags.GetString("flytesnacks"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.SnacksRepo) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go new file mode 100644 index 0000000000..e9f8098828 --- /dev/null +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -0,0 +1,11 @@ +package sandbox + +//go:generate pflags Config --default-var DefaultConfig +var ( + DefaultConfig = &Config{} +) + +// Config +type Config struct { + SnacksRepo string `json:"flytesnacks" pflag:", Path of your flytesnacks repository"` +} diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go index 995c6c6890..cf666b9a48 100644 --- a/flytectl/cmd/sandbox/sandbox.go +++ b/flytectl/cmd/sandbox/sandbox.go @@ -1,6 +1,7 @@ package sandbox import ( + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" ) @@ -33,7 +34,7 @@ func CreateSandboxCommand() *cobra.Command { sandboxResourcesFuncs := map[string]cmdcore.CommandEntry{ "start": {CmdFunc: startSandboxCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: startShort, - Long: startLong}, + Long: startLong, PFlagProvider: sandboxConfig.DefaultConfig}, "teardown": {CmdFunc: teardownSandboxCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: teardownShort, Long: teardownLong}, diff --git a/flytectl/cmd/sandbox/sandbox_util.go b/flytectl/cmd/sandbox/sandbox_util.go index d739e671a7..e6c0d43944 100644 --- a/flytectl/cmd/sandbox/sandbox_util.go +++ b/flytectl/cmd/sandbox/sandbox_util.go @@ -10,26 +10,32 @@ import ( "os" "strings" + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" + "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" "github.com/docker/docker/client" "github.com/docker/go-connections/nat" - "github.com/enescakir/emoji" f "github.com/flyteorg/flytectl/pkg/filesystemutils" ) var ( - Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") - FlytectlConfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "config.yaml") - SuccessMessage = "Flyte is ready! Flyte UI is available at http://localhost:30081/console" - ImageName = "ghcr.io/flyteorg/flyte-sandbox:dind" - SandboxClusterName = "flyte-sandbox" - Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} + Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") + FlytectlConfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "config-sandbox.yaml") + SuccessMessage = "Flyte is ready! Flyte UI is available at http://localhost:30081/console" + ImageName = "ghcr.io/flyteorg/flyte-sandbox:dind" + flyteSandboxClusterName = "flyte-sandbox" + Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} + flyteSnackDir = "/usr/src" + K3sDir = "/etc/rancher/" ) func setupFlytectlConfig() error { + + _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) + response, err := http.Get("https://raw.githubusercontent.com/flyteorg/flytectl/master/config.yaml") if err != nil { return err @@ -41,11 +47,7 @@ func setupFlytectlConfig() error { return err } - err = ioutil.WriteFile(FlytectlConfig, data, 0600) - if err != nil { - fmt.Printf("Please create ~/.flyte dir %v \n", emoji.ManTechnologist) - return err - } + _ = ioutil.WriteFile(FlytectlConfig, data, 0600) return nil } @@ -62,21 +64,31 @@ func configCleanup() error { } func getSandbox(cli *client.Client) *types.Container { - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{ + containers, _ := cli.ContainerList(context.Background(), types.ContainerListOptions{ All: true, }) - if err != nil { - return nil - } for _, v := range containers { - if strings.Contains(v.Names[0], SandboxClusterName) { + if strings.Contains(v.Names[0], flyteSandboxClusterName) { return &v } } return nil } -func startContainer(cli *client.Client) (string, error) { +func removeSandboxIfExist(cli *client.Client, reader io.Reader) error { + if c := getSandbox(cli); c != nil { + if cmdUtil.AskForConfirmation("delete existing sandbox cluster", reader) { + err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ + Force: true, + }) + return err + } + os.Exit(0) + } + return nil +} + +func startContainer(cli *client.Client, volumes []mount.Mount) (string, error) { ExposedPorts, PortBindings, _ := nat.ParsePortSpecs([]string{ "127.0.0.1:30086:30086", "127.0.0.1:30081:30081", @@ -87,38 +99,23 @@ func startContainer(cli *client.Client) (string, error) { if err != nil { return "", err } - - if _, err := io.Copy(os.Stdout, r); err != nil { - return "", err - } - + _, _ = io.Copy(os.Stdout, r) resp, err := cli.ContainerCreate(context.Background(), &container.Config{ Env: Environment, Image: ImageName, Tty: false, ExposedPorts: ExposedPorts, }, &container.HostConfig{ - Mounts: []mount.Mount{ - { - Type: mount.TypeBind, - Source: f.FilePathJoin(f.UserHomeDir(), ".flyte"), - Target: "/etc/rancher/", - }, - // TODO (Yuvraj) Add flytectl config in sandbox and mount with host file system - //{ - // Type: mount.TypeBind, - // Source: f.FilePathJoin(f.UserHomeDir(), ".flyte", "config.yaml"), - // Target: "/.flyte/", - //}, - }, + Mounts: volumes, PortBindings: PortBindings, Privileged: true, }, nil, - nil, SandboxClusterName) + nil, flyteSandboxClusterName) + if err != nil { return "", err } - + go watchError(cli, resp.ID) if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil { return "", err } @@ -127,6 +124,7 @@ func startContainer(cli *client.Client) (string, error) { func watchError(cli *client.Client, id string) { statusCh, errCh := cli.ContainerWait(context.Background(), id, container.WaitConditionNotRunning) + select { case err := <-errCh: if err != nil { @@ -136,7 +134,7 @@ func watchError(cli *client.Client, id string) { } } -func readLogs(cli *client.Client, id string) error { +func readLogs(cli *client.Client, id, message string) error { reader, err := cli.ContainerLogs(context.Background(), id, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, @@ -147,9 +145,10 @@ func readLogs(cli *client.Client, id string) error { return err } scanner := bufio.NewScanner(reader) + for scanner.Scan() { - if strings.Contains(scanner.Text(), SuccessMessage) { - fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, SuccessMessage, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) + if strings.Contains(scanner.Text(), message) { + fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, message, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) fmt.Printf("Please visit https://github.com/flyteorg/flytesnacks for more example %v \n", emoji.Rocket) fmt.Printf("Register all flytesnacks example by running 'flytectl register examples -d development -p flytesnacks' \n") break diff --git a/flytectl/cmd/sandbox/sandbox_util_test.go b/flytectl/cmd/sandbox/sandbox_util_test.go index 269152a9ba..ab7e981b98 100644 --- a/flytectl/cmd/sandbox/sandbox_util_test.go +++ b/flytectl/cmd/sandbox/sandbox_util_test.go @@ -8,7 +8,9 @@ import ( "testing" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/mount" "github.com/docker/docker/client" + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" u "github.com/flyteorg/flytectl/cmd/testutils" @@ -29,8 +31,10 @@ func cleanup(client *client.Client) error { return err } for _, v := range containers { - if strings.Contains(v.Names[0], SandboxClusterName) { - if err := client.ContainerRemove(context.Background(), v.ID, types.ContainerRemoveOptions{}); err != nil { + if strings.Contains(v.Names[0], flyteSandboxClusterName) { + if err := client.ContainerRemove(context.Background(), v.ID, types.ContainerRemoveOptions{ + Force: true, + }); err != nil { return err } } @@ -41,10 +45,6 @@ func cleanup(client *client.Client) error { func setupSandbox() { mockAdminClient := u.MockClient cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) - _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) - if os.IsNotExist(err) { - _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) - } _ = setupFlytectlConfig() } @@ -81,6 +81,7 @@ func TestSetupFlytectlConfig(t *testing.T) { check := os.IsNotExist(err) assert.Equal(t, check, false) _ = configCleanup() + } func TestTearDownSandbox(t *testing.T) { @@ -89,12 +90,47 @@ func TestTearDownSandbox(t *testing.T) { err := teardownSandboxCluster(context.Background(), []string{}, cmdCtx) assert.Nil(t, err) assert.Nil(t, cleanup(cli)) + + volumes = []mount.Mount{} + _ = startSandboxCluster(context.Background(), []string{}, cmdCtx) + err = teardownSandboxCluster(context.Background(), []string{}, cmdCtx) + assert.Nil(t, err) + } -func TestStartContainer(t *testing.T) { - setupSandbox() +func TestStartSandbox(t *testing.T) { cli, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + assert.Nil(t, cleanup(cli)) + setupSandbox() + volumes = []mount.Mount{} + sandboxConfig.DefaultConfig.SnacksRepo = "/tmp" err := startSandboxCluster(context.Background(), []string{}, cmdCtx) assert.Nil(t, err) + + assert.Nil(t, cleanup(cli)) + setupSandbox() + sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + err = startSandboxCluster(context.Background(), []string{}, cmdCtx) + assert.NotNil(t, err) + + assert.Nil(t, cleanup(cli)) + _, err = startContainer(cli, []mount.Mount{}) + assert.Nil(t, err) + + assert.Nil(t, cleanup(cli)) + ImageName = "" + _, err = startContainer(cli, []mount.Mount{}) + assert.NotNil(t, err) +} + +func TestGetSandbox(t *testing.T) { + cli, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + assert.Nil(t, cleanup(cli)) + setupSandbox() + sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + _ = startSandboxCluster(context.Background(), []string{}, cmdCtx) + + container := removeSandboxIfExist(cli, strings.NewReader("y")) + assert.Nil(t, container) } diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 6a620603dd..082c12a54c 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -5,10 +5,12 @@ import ( "fmt" "os" + "github.com/docker/docker/api/types/mount" "github.com/docker/docker/client" "github.com/enescakir/emoji" + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" - cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" ) const ( @@ -17,12 +19,24 @@ const ( Start will run the flyte sandbox cluster inside a docker container and setup the config that is required :: - bin/flytectl start + bin/flytectl sandbox start + +Mount your flytesnacks repository code inside sandbox +:: + bin/flytectl sandbox start --flytesnacks=$HOME/flyteorg/flytesnacks Usage ` ) +var volumes = []mount.Mount{ + { + Type: mount.TypeBind, + Source: f.FilePathJoin(f.UserHomeDir(), ".flyte"), + Target: K3sDir, + }, +} + type ExecResult struct { StdOut string StdErr string @@ -41,34 +55,36 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm return err } - if container := getSandbox(cli); container != nil { - if cmdUtil.AskForConfirmation("delete existing sandbox cluster", os.Stdin) { - if err := teardownSandboxCluster(ctx, []string{}, cmdCtx); err != nil { - return err - } - } + if err := removeSandboxIfExist(cli, os.Stdin); err != nil { + return err } - ID, err := startContainer(cli) - if err == nil { - os.Setenv("KUBECONFIG", Kubeconfig) + if len(sandboxConfig.DefaultConfig.SnacksRepo) > 0 { + volumes = append(volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.SnacksRepo, + Target: flyteSnackDir, + }) + } - defer func() { - if r := recover(); r != nil { - fmt.Println("Something goes wrong with container status", r) - } - }() + os.Setenv("KUBECONFIG", Kubeconfig) + os.Setenv("FLYTECTL_CONFIG", FlytectlConfig) - go watchError(cli, ID) - if err := readLogs(cli, ID); err != nil { - return err + defer func() { + if r := recover(); r != nil { + fmt.Println("Something goes wrong with container status", r) } + }() - fmt.Printf("Add (KUBECONFIG) to your environment variabl \n") - fmt.Printf("export KUBECONFIG=%v \n", Kubeconfig) - return nil + ID, err := startContainer(cli, volumes) + if err != nil { + fmt.Println("Something goes wrong. We are not able to start sandbox container, Please check your docker client and try again ") + return fmt.Errorf("error: %v", err) } - fmt.Println("Something goes wrong. We are not able to start sandbox container, Please check your docker client and try again \n", emoji.Rocket) - fmt.Printf("error: %v", err) + + _ = readLogs(cli, ID, SuccessMessage) + fmt.Printf("Add KUBECONFIG and FLYTECTL_CONFIG to your environment variable \n") + fmt.Printf("export KUBECONFIG=%v \n", Kubeconfig) + fmt.Printf("export FLYTECTL_CONFIG=%v \n", FlytectlConfig) return nil } diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index 9e0c9c5d50..8afced1178 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -4,9 +4,9 @@ import ( "context" "fmt" + "github.com/docker/docker/api/types" "github.com/enescakir/emoji" - "github.com/docker/docker/api/types" "github.com/docker/docker/client" cmdCore "github.com/flyteorg/flytectl/cmd/core" ) @@ -18,12 +18,7 @@ Teardown will remove docker container and all the flyte config :: bin/flytectl sandbox teardown - -Stop will remove docker container and all the flyte config -:: - - bin/flytectl sandbox stop - + Usage ` @@ -36,15 +31,12 @@ func teardownSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.C return err } - container := getSandbox(cli) - if container != nil { - if err := cli.ContainerRemove(ctx, container.ID, types.ContainerRemoveOptions{ + c := getSandbox(cli) + if c != nil { + _ = cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ Force: true, - }); err != nil { - return err - } + }) } - if err := configCleanup(); err != nil { fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) } From e569acbb665be4d6470ecaf1a6364e13958b01bd Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Fri, 18 Jun 2021 14:34:07 -0700 Subject: [PATCH 078/645] Fixes in Flytectl (#109) - Show the latest entity based on created at - Optional truncation of large strings in table printing Signed-off-by: Ketan Umare --- flytectl/cmd/get/execution.go | 10 ++++++---- flytectl/cmd/get/execution_test.go | 17 +++++++++++++++-- flytectl/cmd/sandbox/start.go | 8 ++++---- flytectl/cmd/sandbox/teardown.go | 2 +- flytectl/go.mod | 1 - flytectl/go.sum | 14 -------------- flytectl/pkg/filters/type.go | 5 +++-- flytectl/pkg/printer/printer.go | 11 ++++++++++- flytectl/pkg/printer/printer_test.go | 7 ++++--- 9 files changed, 43 insertions(+), 32 deletions(-) diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index e7164ca90e..e7cd122c9c 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -54,6 +54,8 @@ Usage ` ) +var hundredChars = 100 + var executionColumns = []printer.Column{ {Header: "Name", JSONPath: "$.id.name"}, {Header: "Launch Plan Name", JSONPath: "$.spec.launchPlan.name"}, @@ -61,8 +63,8 @@ var executionColumns = []printer.Column{ {Header: "Phase", JSONPath: "$.closure.phase"}, {Header: "Started", JSONPath: "$.closure.startedAt"}, {Header: "Elapsed Time", JSONPath: "$.closure.duration"}, - {Header: "Abort data", JSONPath: "$.closure.abortMetadata[\"cause\"]"}, - {Header: "Error data", JSONPath: "$.closure.error[\"message\"]"}, + {Header: "Abort data (Trunc)", JSONPath: "$.closure.abortMetadata[\"cause\"]", TruncateTo: &hundredChars}, + {Header: "Error data (Trunc)", JSONPath: "$.closure.error[\"message\"]", TruncateTo: &hundredChars}, } func ExecutionToProtoMessages(l []*admin.Execution) []proto.Message { @@ -78,11 +80,11 @@ func getExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Command var executions []*admin.Execution if len(args) > 0 { name := args[0] - execution, err := cmdCtx.AdminFetcherExt().FetchExecution(ctx, name, config.GetConfig().Project, config.GetConfig().Domain) + exec, err := cmdCtx.AdminFetcherExt().FetchExecution(ctx, name, config.GetConfig().Project, config.GetConfig().Domain) if err != nil { return err } - executions = append(executions, execution) + executions = append(executions, exec) logger.Infof(ctx, "Retrieved %v executions", len(executions)) return adminPrinter.Print(config.GetConfig().MustOutputFormat(), executionColumns, ExecutionToProtoMessages(executions)...) diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go index 5940c3d17a..87e970231b 100644 --- a/flytectl/cmd/get/execution_test.go +++ b/flytectl/cmd/get/execution_test.go @@ -6,6 +6,8 @@ import ( "io" "testing" + "github.com/stretchr/testify/mock" + "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/clients/go/admin/mocks" @@ -25,6 +27,10 @@ func TestListExecutionFunc(t *testing.T) { cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) execListRequest := &admin.ResourceListRequest{ Limit: 100, + SortBy: &admin.Sort{ + Key: "created_at", + Direction: admin.Sort_DESCENDING, + }, Id: &admin.NamedEntityIdentifier{ Project: projectValue, Domain: domainValue, @@ -58,7 +64,9 @@ func TestListExecutionFunc(t *testing.T) { executionList := &admin.ExecutionList{ Executions: executions, } - mockClient.OnListExecutionsMatch(ctx, execListRequest).Return(executionList, nil) + mockClient.OnListExecutionsMatch(mock.Anything, mock.MatchedBy(func(o *admin.ResourceListRequest) bool { + return execListRequest.SortBy.Key == o.SortBy.Key && execListRequest.SortBy.Direction == o.SortBy.Direction && execListRequest.Filters == o.Filters && execListRequest.Limit == o.Limit + })).Return(executionList, nil) err := getExecutionFunc(ctx, args, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "ListExecutions", ctx, execListRequest) @@ -75,6 +83,9 @@ func TestListExecutionFuncWithError(t *testing.T) { cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) execListRequest := &admin.ResourceListRequest{ Limit: 100, + SortBy: &admin.Sort{ + Key: "created_at", + }, Id: &admin.NamedEntityIdentifier{ Project: projectValue, Domain: domainValue, @@ -104,7 +115,9 @@ func TestListExecutionFuncWithError(t *testing.T) { Phase: core.WorkflowExecution_SUCCEEDED, }, } - mockClient.OnListExecutionsMatch(ctx, execListRequest).Return(nil, errors.New("executions NotFound")) + mockClient.OnListExecutionsMatch(mock.Anything, mock.MatchedBy(func(o *admin.ResourceListRequest) bool { + return execListRequest.SortBy.Key == o.SortBy.Key && execListRequest.SortBy.Direction == o.SortBy.Direction && execListRequest.Filters == o.Filters && execListRequest.Limit == o.Limit + })).Return(nil, errors.New("executions NotFound")) err := getExecutionFunc(ctx, args, cmdCtx) assert.NotNil(t, err) assert.Equal(t, err, errors.New("executions NotFound")) diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 082c12a54c..913e752d62 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -44,10 +44,10 @@ type ExecResult struct { } func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - fmt.Printf("%v It will take some time, We will start a fresh flyte cluster for you %v %v\n", emoji.ManTechnologist, emoji.Rocket, emoji.Rocket) + fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { - fmt.Printf("Please Check your docker client %v \n", emoji.ManTechnologist) + fmt.Printf("%v Please Check your docker client %v \n", emoji.GrimacingFace, emoji.Whale) return err } @@ -72,13 +72,13 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm defer func() { if r := recover(); r != nil { - fmt.Println("Something goes wrong with container status", r) + fmt.Printf("%v Something went horribly wrong! %s\n", emoji.GrimacingFace, r) } }() ID, err := startContainer(cli, volumes) if err != nil { - fmt.Println("Something goes wrong. We are not able to start sandbox container, Please check your docker client and try again ") + fmt.Printf("%v Something went horribly wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) return fmt.Errorf("error: %v", err) } diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index 8afced1178..9f2a217f25 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -40,6 +40,6 @@ func teardownSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.C if err := configCleanup(); err != nil { fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) } - fmt.Printf("Sandbox cluster is removed successfully %v \n", emoji.Rocket) + fmt.Printf("%v %v Sandbox cluster is removed successfully. \n", emoji.Broom, emoji.Broom) return nil } diff --git a/flytectl/go.mod b/flytectl/go.mod index 15c5c39675..e324ae6220 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -12,7 +12,6 @@ require ( github.com/flyteorg/flyteidl v0.19.3 github.com/flyteorg/flytestdlib v0.3.24 github.com/ghodss/yaml v1.0.0 - github.com/goccy/go-graphviz v0.0.9 github.com/golang/protobuf v1.4.3 github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.1.0 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index 3369537bf4..2638b091b6 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -271,8 +271,6 @@ github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA= -github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -344,8 +342,6 @@ github.com/flyteorg/flyteidl v0.19.3/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/e github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.24 h1:Eu5TMKch9ihOavPKufgTBI677eVYjJpOAPPg9hfZIzU= github.com/flyteorg/flytestdlib v0.3.24/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= -github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -384,8 +380,6 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= -github.com/goccy/go-graphviz v0.0.9 h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ= -github.com/goccy/go-graphviz v0.0.9/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= @@ -403,8 +397,6 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -544,7 +536,6 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -661,8 +652,6 @@ github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY= -github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -932,7 +921,6 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -951,8 +939,6 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= diff --git a/flytectl/pkg/filters/type.go b/flytectl/pkg/filters/type.go index 83b7d18a74..5dbad76923 100644 --- a/flytectl/pkg/filters/type.go +++ b/flytectl/pkg/filters/type.go @@ -3,8 +3,9 @@ package filters var ( DefaultLimit int32 = 100 DefaultFilter = Filters{ - Limit: DefaultLimit, - Asc: false, + Limit: DefaultLimit, + SortBy: "created_at", + Asc: false, } ) diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index 98282590fe..208b063195 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -44,6 +44,8 @@ func OutputFormats() []string { type Column struct { Header string JSONPath string + // Optional Truncation directive to limit content. This will simply truncate the string output. + TruncateTo *int } type Printer struct{} @@ -65,7 +67,14 @@ func extractRow(data interface{}, columns []Column) []string { if err != nil || out == nil { out = "" } - tableData = append(tableData, fmt.Sprintf("%s", out)) + s := fmt.Sprintf("%s", out) + if c.TruncateTo != nil { + t := *c.TruncateTo + if len(s) > t { + s = s[:t] + } + } + tableData = append(tableData, s) } return tableData } diff --git a/flytectl/pkg/printer/printer_test.go b/flytectl/pkg/printer/printer_test.go index 08ed10c9f2..faa11a1978 100644 --- a/flytectl/pkg/printer/printer_test.go +++ b/flytectl/pkg/printer/printer_test.go @@ -38,6 +38,7 @@ func WorkflowToProtoMessages(l []*admin.Workflow) []proto.Message { // TODO Convert this to a Testable Example. For some reason the comparison fails func TestJSONToTable(t *testing.T) { + trunc := 5 d := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) j := []struct { A string `json:"a"` @@ -45,7 +46,7 @@ func TestJSONToTable(t *testing.T) { S *Inner `json:"s"` }{ {"hello", 0, &Inner{"x-hello", nil}}, - {"hello", 0, &Inner{"x-hello", &d}}, + {"hello world", 0, &Inner{"x-hello", &d}}, {"hello", 0, nil}, } @@ -53,8 +54,8 @@ func TestJSONToTable(t *testing.T) { assert.NoError(t, err) p := Printer{} assert.NoError(t, p.JSONToTable(b, []Column{ - {"A", "$.a"}, - {"S", "$.s.y"}, + {"A", "$.a", &trunc}, + {"S", "$.s.y", nil}, })) // Output: // | A | S | From 1230679497082e0d9445b7ea74dcad260842a291 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Sat, 19 Jun 2021 13:44:44 +0530 Subject: [PATCH 079/645] Removed parent flags which are not required as of now (#107) Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/root.go | 2 - flytectl/docs/source/gen/flytectl.rst | 44 ++-------------- flytectl/docs/source/gen/flytectl_config.rst | 42 ++------------- .../source/gen/flytectl_config_discover.rst | 46 +++-------------- .../source/gen/flytectl_config_validate.rst | 46 +++-------------- flytectl/docs/source/gen/flytectl_create.rst | 42 ++------------- .../source/gen/flytectl_create_execution.rst | 42 ++------------- .../source/gen/flytectl_create_project.rst | 42 ++------------- flytectl/docs/source/gen/flytectl_delete.rst | 42 ++------------- ...ectl_delete_cluster-resource-attribute.rst | 42 ++------------- ...lytectl_delete_execution-cluster-label.rst | 42 ++------------- ...tectl_delete_execution-queue-attribute.rst | 42 ++------------- .../source/gen/flytectl_delete_execution.rst | 42 ++------------- .../gen/flytectl_delete_plugin-override.rst | 42 ++------------- ...lytectl_delete_task-resource-attribute.rst | 42 ++------------- flytectl/docs/source/gen/flytectl_get.rst | 42 ++------------- ...lytectl_get_cluster-resource-attribute.rst | 42 ++------------- .../flytectl_get_execution-cluster-label.rst | 42 ++------------- ...flytectl_get_execution-queue-attribute.rst | 42 ++------------- .../source/gen/flytectl_get_execution.rst | 42 ++------------- .../source/gen/flytectl_get_launchplan.rst | 42 ++------------- .../gen/flytectl_get_plugin-override.rst | 42 ++------------- .../docs/source/gen/flytectl_get_project.rst | 42 ++------------- .../flytectl_get_task-resource-attribute.rst | 42 ++------------- .../docs/source/gen/flytectl_get_task.rst | 42 ++------------- .../docs/source/gen/flytectl_get_workflow.rst | 44 ++-------------- .../docs/source/gen/flytectl_register.rst | 42 ++------------- .../source/gen/flytectl_register_examples.rst | 42 ++------------- .../source/gen/flytectl_register_files.rst | 42 ++------------- flytectl/docs/source/gen/flytectl_sandbox.rst | 42 ++------------- .../source/gen/flytectl_sandbox_start.rst | 51 ++++--------------- .../source/gen/flytectl_sandbox_teardown.rst | 49 ++---------------- flytectl/docs/source/gen/flytectl_update.rst | 42 ++------------- ...ectl_update_cluster-resource-attribute.rst | 42 ++------------- ...lytectl_update_execution-cluster-label.rst | 42 ++------------- ...tectl_update_execution-queue-attribute.rst | 42 ++------------- .../source/gen/flytectl_update_launchplan.rst | 42 ++------------- .../gen/flytectl_update_plugin-override.rst | 42 ++------------- .../source/gen/flytectl_update_project.rst | 42 ++------------- ...lytectl_update_task-resource-attribute.rst | 42 ++------------- .../docs/source/gen/flytectl_update_task.rst | 42 ++------------- .../source/gen/flytectl_update_workflow.rst | 42 ++------------- flytectl/docs/source/gen/flytectl_version.rst | 42 ++------------- 43 files changed, 182 insertions(+), 1612 deletions(-) diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 40bc92ed69..52bc75722c 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -47,8 +47,6 @@ func newRootCmd() *cobra.Command { rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file (default is $HOME/.flyte/config.yaml)") - configAccessor.InitializePflags(rootCmd.PersistentFlags()) - // Due to https://github.com/flyteorg/flyte/issues/341, project flag will have to be specified as // --root.project, this adds a convenience on top to allow --project to be used rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Project), "project", "p", "", "Specifies the Flyte project.") diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 446c0f39a8..f740989c59 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -16,45 +16,11 @@ Options :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -h, --help help for flytectl - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -h, --help help for flytectl + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 918923db8b..818b172c65 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -25,44 +25,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index c8c73a0302..690a450336 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -27,46 +27,12 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --file stringArray Passes the config file to load. - If empty, it'll first search for the config file path then, if found, will load config from there. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index e0fe692b8a..447d666d25 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -29,46 +29,12 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --file stringArray Passes the config file to load. - If empty, it'll first search for the config file path then, if found, will load config from there. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index dea24a3367..4e09d5b6e4 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -28,44 +28,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index d2f3f7e880..142fc4f60d 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -146,44 +146,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index e7f6580eae..cd5f345d39 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -52,44 +52,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 42881783d7..17edc03f9b 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -28,44 +28,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 29aac116f0..226d2e4246 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -64,44 +64,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index daa247a473..a48e9ef376 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -62,44 +62,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 5e6e03520f..64182f6389 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -66,44 +66,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 2a12a2b381..365bd014d1 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -71,44 +71,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index e69560d99e..bb20597c78 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -67,44 +67,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 17cb700393..20ee8d9f6f 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -67,44 +67,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 8442a4e4a0..f969fbd5e9 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -28,44 +28,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index 7cf9ff55b1..b79674a7c8 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -73,44 +73,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index 58abf2ab26..57b27f7293 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -71,44 +71,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index 4b92076d7f..e03a50f183 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -75,44 +75,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 4040492e0f..77249157ce 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -68,44 +68,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 37f816171a..f50798c59c 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -113,44 +113,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index f608e680a0..4943aa9e5d 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -95,44 +95,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 2f7e622450..7aafa4e606 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -66,44 +66,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index fb180a8a44..8689c6d030 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -77,44 +77,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index dab41e7f72..c94f945b18 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -109,44 +109,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 081ae99b7d..63a55c3a4e 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -87,7 +87,7 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.field-selector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort results + --filter.sort-by string Specifies which field to sort results (default "created_at") -h, --help help for workflow --latest flag to indicate to fetch the latest version, version flag will be ignored in this case --version string version of the workflow to be fetched. @@ -97,44 +97,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 0417174a1c..27120f811e 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -28,44 +28,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index e6df378e55..24454a32e6 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -41,44 +41,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index ada5a92813..8f58aa349f 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -95,44 +95,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index c33cfcc843..523c26c84a 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -34,44 +34,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 56716a9fa0..402b8b5ad9 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -13,8 +13,12 @@ Synopsis Start will run the flyte sandbox cluster inside a docker container and setup the config that is required :: - bin/flytectl start + bin/flytectl sandbox start + +Mount your flytesnacks repository code inside sandbox +:: + bin/flytectl sandbox start --flytesnacks=$HOME/flyteorg/flytesnacks Usage @@ -27,51 +31,18 @@ Options :: - -h, --help help for start + --flytesnacks string Path of your flytesnacks repository + -h, --help help for start Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index f7fccfd899..2b7f63cb25 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -14,12 +14,7 @@ Teardown will remove docker container and all the flyte config :: bin/flytectl sandbox teardown - -Stop will remove docker container and all the flyte config -:: - - bin/flytectl sandbox stop - + Usage @@ -40,44 +35,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 9a513303c7..0493254ff5 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -30,44 +30,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 5f50268a61..9f72793199 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -69,44 +69,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 957aeff750..046ff1ea20 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -62,44 +62,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index e6ed419269..a915e427c7 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -73,44 +73,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 88b569d16f..9c98daa2ef 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -47,44 +47,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index bea5a1c6ac..fa2114ae8e 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -75,44 +75,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 74252c4f52..e7b4665448 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -72,44 +72,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 4f75f37eac..bfe1b96d5c 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -75,44 +75,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst index a119d0118c..954071ee2a 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -47,44 +47,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst index 347ecb1790..14f28a4082 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -47,44 +47,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 8a73ae4a75..0e7165621b 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -32,44 +32,10 @@ Options inherited from parent commands :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --root.domain string Specified the domain to work on. - --root.output string Specified the output type. - --root.project string Specifies the project to work on. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. SEE ALSO ~~~~~~~~ From 7a43a97c0b2d5ffd1de62cdb5bc2df67ef79bc5d Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 21 Jun 2021 10:08:57 +0530 Subject: [PATCH 080/645] Added latest version check added (#111) * WIP: added latest version check added in version command Signed-off-by: Yuvraj --- flytectl/cmd/version/version.go | 70 ++++++++++++++--- flytectl/cmd/version/version_test.go | 108 ++++++++++++++++++++++++--- flytectl/go.mod | 1 + flytectl/go.sum | 2 + flytectl/pkg/util/util.go | 43 +++++++++++ flytectl/pkg/util/util_test.go | 51 +++++++++++++ 6 files changed, 253 insertions(+), 22 deletions(-) create mode 100644 flytectl/pkg/util/util.go create mode 100644 flytectl/pkg/util/util_test.go diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go index 57c7ddac08..4510c88aad 100644 --- a/flytectl/cmd/version/version.go +++ b/flytectl/cmd/version/version.go @@ -6,8 +6,11 @@ import ( "fmt" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/util" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" stdlibversion "github.com/flyteorg/flytestdlib/version" + hversion "github.com/hashicorp/go-version" "github.com/spf13/cobra" ) @@ -20,6 +23,11 @@ Example version. bin/flytectl version ` + latestVersionMessage = "Installed flytectl version is the latest" + upgradeVersionMessage = "A newer version of flytectl is available [%v] Please upgrade using - https://docs.flyte.org/projects/flytectl/en/latest/index.html" + flytectlAppName = "flytectl" + controlPlanAppName = "controlPlane" + flytectlReleasePath = "/repos/flyteorg/flytectl/releases/latest" ) type versionOutput struct { @@ -44,39 +52,79 @@ func GetVersionCommand(rootCmd *cobra.Command) map[string]cmdCore.CommandEntry { } func getVersion(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - - v, err := cmdCtx.AdminClient().GetVersion(ctx, &admin.GetVersionRequest{}) + latest, err := getLatestVersion(flytectlReleasePath) if err != nil { - return fmt.Errorf("err %v: ", err) + return err } + message, err := compareVersion(latest, stdlibversion.Version) + if err != nil { + return err + } + fmt.Println(message) // Print Flytectl if err := printVersion(versionOutput{ Build: stdlibversion.Build, BuildTime: stdlibversion.BuildTime, Version: stdlibversion.Version, - App: "flytectl", + App: flytectlAppName, }); err != nil { return err } + // Print Flyteadmin version if available + if err := getControlPlaneVersion(ctx, cmdCtx); err != nil { + logger.Debug(ctx, err) + } + return nil +} + +func printVersion(response versionOutput) error { + b, err := json.MarshalIndent(response, "", " ") + if err != nil { + return err + } + fmt.Print(string(b)) + return nil +} + +func compareVersion(latest, current string) (string, error) { + semanticVersion, err := hversion.NewVersion(latest) + if err != nil { + return "", err + } + currentVersion, err := hversion.NewVersion(current) + if err != nil { + return "", err + } + if currentVersion.LessThan(semanticVersion) { + return fmt.Sprintf(upgradeVersionMessage, latest), nil + } + + return latestVersionMessage, nil +} +func getControlPlaneVersion(ctx context.Context, cmdCtx cmdCore.CommandContext) error { + v, err := cmdCtx.AdminClient().GetVersion(ctx, &admin.GetVersionRequest{}) + if err != nil || v == nil { + logger.Debugf(ctx, "Failed to get version of control plane %v: \n", err) + return err + } // Print Flyteadmin if err := printVersion(versionOutput{ Build: v.ControlPlaneVersion.Build, BuildTime: v.ControlPlaneVersion.BuildTime, Version: v.ControlPlaneVersion.Version, - App: "controlPlane", + App: controlPlanAppName, }); err != nil { - return err + return fmt.Errorf("not able to get control plane version..Please try again: %v", err) } return nil } -func printVersion(response versionOutput) error { - b, err := json.MarshalIndent(response, "", " ") +func getLatestVersion(path string) (string, error) { + response, err := util.GetRequest("https://api.github.com", path) if err != nil { - return fmt.Errorf("err %v: ", err) + return "", err } - fmt.Print(string(b)) - return nil + return util.ParseGithubTag(response) } diff --git a/flytectl/cmd/version/version_test.go b/flytectl/cmd/version/version_test.go index acaf34a829..2366a3a856 100644 --- a/flytectl/cmd/version/version_test.go +++ b/flytectl/cmd/version/version_test.go @@ -2,33 +2,119 @@ package version import ( "context" + "errors" "fmt" "io" + "sort" "testing" + "github.com/spf13/cobra" + cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + stdlibversion "github.com/flyteorg/flytestdlib/version" "github.com/stretchr/testify/assert" ) -func TestListExecutionFunc(t *testing.T) { - ctx := context.Background() - var args []string - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) - versionRequest := &admin.GetVersionRequest{} - versionResponse := &admin.GetVersionResponse{ +var ( + versionRequest = &admin.GetVersionRequest{} + testVersion = "v0.1.20" + versionResponse = &admin.GetVersionResponse{ ControlPlaneVersion: &admin.Version{ Build: "", BuildTime: "", - Version: "", + Version: testVersion, }, } +) + +func TestVersionCommand(t *testing.T) { + rootCmd := &cobra.Command{ + Long: "flytectl is CLI tool written in go to interact with flyteadmin service", + Short: "flyetcl CLI tool", + Use: "flytectl", + DisableAutoGenTag: true, + } + versionCommand := GetVersionCommand(rootCmd) + cmdCore.AddCommands(rootCmd, versionCommand) + fmt.Println(rootCmd.Commands()) + assert.Equal(t, len(rootCmd.Commands()), 1) + cmdNouns := rootCmd.Commands() + // Sort by Use value. + sort.Slice(cmdNouns, func(i, j int) bool { + return cmdNouns[i].Use < cmdNouns[j].Use + }) + + assert.Equal(t, cmdNouns[0].Use, "version") + assert.Equal(t, cmdNouns[0].Short, versionCmdShort) + assert.Equal(t, cmdNouns[0].Long, versionCmdLong) +} + +func TestVersionCommandFunc(t *testing.T) { + ctx := context.Background() + var args []string + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + stdlibversion.Build = "" + stdlibversion.BuildTime = "" + stdlibversion.Version = testVersion mockClient.OnGetVersionMatch(ctx, versionRequest).Return(versionResponse, nil) err := getVersion(ctx, args, cmdCtx) - fmt.Println(err) - assert.Nil(t, nil) + assert.Nil(t, err) + mockClient.AssertCalled(t, "GetVersion", ctx, versionRequest) +} + +func TestVersionCommandFuncErr(t *testing.T) { + ctx := context.Background() + var args []string + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + stdlibversion.Build = "" + stdlibversion.BuildTime = "" + stdlibversion.Version = testVersion + mockClient.OnGetVersionMatch(ctx, versionRequest).Return(versionResponse, errors.New("error")) + err := getVersion(ctx, args, cmdCtx) + assert.Nil(t, err) mockClient.AssertCalled(t, "GetVersion", ctx, versionRequest) } + +func TestVersionUtilFunc(t *testing.T) { + stdlibversion.Build = "" + stdlibversion.BuildTime = "" + stdlibversion.Version = testVersion + t.Run("Get latest release with wrong url", func(t *testing.T) { + tag, err := getLatestVersion("h://api.github.com/repos/flyteorg/flytectreleases/latest") + assert.NotNil(t, err) + assert.Equal(t, len(tag), 0) + }) + t.Run("Compare flytectl version when upgrade available", func(t *testing.T) { + message, err := compareVersion("v1.1.21", testVersion) + assert.Nil(t, err) + assert.Equal(t, fmt.Sprintf(upgradeVersionMessage, "v1.1.21"), message) + }) + t.Run("Compare flytectl version", func(t *testing.T) { + message, err := compareVersion(testVersion, testVersion) + assert.Nil(t, err) + assert.Equal(t, latestVersionMessage, message) + }) + t.Run("Error in compare flytectl version", func(t *testing.T) { + _, err := compareVersion("vvvvvvvv", testVersion) + assert.NotNil(t, err) + }) + t.Run("Error in compare flytectl version", func(t *testing.T) { + _, err := compareVersion(testVersion, "vvvvvvvv") + assert.NotNil(t, err) + }) + t.Run("Error in getting control plan version", func(t *testing.T) { + ctx := context.Background() + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + mockClient.OnGetVersionMatch(ctx, &admin.GetVersionRequest{}).Return(nil, fmt.Errorf("error")) + err := getControlPlaneVersion(ctx, cmdCtx) + assert.NotNil(t, err) + }) +} diff --git a/flytectl/go.mod b/flytectl/go.mod index e324ae6220..728371c428 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -16,6 +16,7 @@ require ( github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.2.0 + github.com/hashicorp/go-version v1.3.0 // indirect github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/kr/text v0.2.0 // indirect github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 diff --git a/flytectl/go.sum b/flytectl/go.sum index 2638b091b6..d07374e6d8 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -514,6 +514,8 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= +github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go new file mode 100644 index 0000000000..6496f0fdd3 --- /dev/null +++ b/flytectl/pkg/util/util.go @@ -0,0 +1,43 @@ +package util + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" +) + +type githubversion struct { + TagName string `json:"tag_name"` +} + +func GetRequest(baseURL, url string) ([]byte, error) { + response, err := http.Get(fmt.Sprintf("%v%v", baseURL, url)) + if err != nil { + return []byte(""), err + } + defer response.Body.Close() + + data, err := ioutil.ReadAll(response.Body) + if err != nil { + return []byte(""), err + } + return data, nil +} + +func ParseGithubTag(data []byte) (string, error) { + var result = githubversion{} + err := json.Unmarshal(data, &result) + if err != nil { + return "", err + } + return result.TagName, nil +} + +func WriteIntoFile(data []byte, file string) error { + err := ioutil.WriteFile(file, data, 0600) + if err != nil { + return err + } + return nil +} diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go new file mode 100644 index 0000000000..f4e0792428 --- /dev/null +++ b/flytectl/pkg/util/util_test.go @@ -0,0 +1,51 @@ +package util + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +const flytectlReleaseURL = "/repos/flyteorg/flytectl/releases/latest" +const baseURL = "https://api.github.com" +const wrongBaseURL = "htts://api.github.com" + +func TestGetRequest(t *testing.T) { + t.Run("Get request with 200", func(t *testing.T) { + _, err := GetRequest(baseURL, flytectlReleaseURL) + assert.Nil(t, err) + }) + t.Run("Get request with 200", func(t *testing.T) { + _, err := GetRequest(wrongBaseURL, flytectlReleaseURL) + assert.NotNil(t, err) + }) +} + +func TestParseGithubTag(t *testing.T) { + t.Run("Parse Github tag with success", func(t *testing.T) { + data, err := GetRequest(baseURL, flytectlReleaseURL) + assert.Nil(t, err) + tag, err := ParseGithubTag(data) + assert.Nil(t, err) + assert.Contains(t, tag, "v") + }) + t.Run("Get request with 200", func(t *testing.T) { + _, err := ParseGithubTag([]byte("string")) + assert.NotNil(t, err) + }) +} + +func TestWriteIntoFile(t *testing.T) { + t.Run("Successfully write into a file", func(t *testing.T) { + data, err := GetRequest(baseURL, flytectlReleaseURL) + assert.Nil(t, err) + err = WriteIntoFile(data, "version.yaml") + assert.Nil(t, err) + }) + t.Run("Error in writing file", func(t *testing.T) { + data, err := GetRequest(baseURL, flytectlReleaseURL) + assert.Nil(t, err) + err = WriteIntoFile(data, "/githubtest/version.yaml") + assert.NotNil(t, err) + }) +} From b11a9e8e68036306ff34f4926f3cf976e3cd9cc3 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 21 Jun 2021 10:20:45 +0530 Subject: [PATCH 081/645] Added unit test for docker (#110) Added unit test for docker Signed-off-by: Yuvraj --- flytectl/.github/workflows/generate-docs.yaml | 2 +- flytectl/.github/workflows/sandbox.yaml | 28 ++ flytectl/cmd/sandbox/sandbox_util.go | 159 -------- flytectl/cmd/sandbox/sandbox_util_test.go | 136 ------- flytectl/cmd/sandbox/start.go | 79 ++-- flytectl/cmd/sandbox/start_test.go | 355 ++++++++++++++++++ flytectl/cmd/sandbox/teardown.go | 20 +- flytectl/cmd/sandbox/teardown_test.go | 59 +++ flytectl/go.mod | 1 + flytectl/pkg/docker/docker.go | 28 ++ flytectl/pkg/docker/mocks/docker.go | 293 +++++++++++++++ flytectl/pkg/docker/sandbox_util.go | 194 ++++++++++ flytectl/pkg/docker/sandbox_util_test.go | 315 ++++++++++++++++ 13 files changed, 1333 insertions(+), 336 deletions(-) create mode 100644 flytectl/.github/workflows/sandbox.yaml delete mode 100644 flytectl/cmd/sandbox/sandbox_util.go delete mode 100644 flytectl/cmd/sandbox/sandbox_util_test.go create mode 100644 flytectl/cmd/sandbox/start_test.go create mode 100644 flytectl/cmd/sandbox/teardown_test.go create mode 100644 flytectl/pkg/docker/docker.go create mode 100644 flytectl/pkg/docker/mocks/docker.go create mode 100644 flytectl/pkg/docker/sandbox_util.go create mode 100644 flytectl/pkg/docker/sandbox_util_test.go diff --git a/flytectl/.github/workflows/generate-docs.yaml b/flytectl/.github/workflows/generate-docs.yaml index 21c0aad628..1c442ea4f8 100644 --- a/flytectl/.github/workflows/generate-docs.yaml +++ b/flytectl/.github/workflows/generate-docs.yaml @@ -6,7 +6,7 @@ on: - master jobs: - build: + generate-docs: name: Generate documentation runs-on: ubuntu-latest steps: diff --git a/flytectl/.github/workflows/sandbox.yaml b/flytectl/.github/workflows/sandbox.yaml new file mode 100644 index 0000000000..35c10cee19 --- /dev/null +++ b/flytectl/.github/workflows/sandbox.yaml @@ -0,0 +1,28 @@ +name: Test Getting started + +on: + pull_request: + branches: + - master + +jobs: + sandbox: + name: Test Getting started + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - uses: actions/cache@v2 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} + - name: Build Flytectl binary + run: make compile + - name: Create a sandbox cluster + run: bin/flytectl sandbox start + - name: Register cookbook + run: bin/flytectl register examples -d development -p flytesnacks || true + - name: Teardown Sandbox cluster + run: bin/flytectl sandbox teardown diff --git a/flytectl/cmd/sandbox/sandbox_util.go b/flytectl/cmd/sandbox/sandbox_util.go deleted file mode 100644 index e6c0d43944..0000000000 --- a/flytectl/cmd/sandbox/sandbox_util.go +++ /dev/null @@ -1,159 +0,0 @@ -package sandbox - -import ( - "bufio" - "context" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "strings" - - cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/client" - "github.com/docker/go-connections/nat" - "github.com/enescakir/emoji" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" -) - -var ( - Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") - FlytectlConfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "config-sandbox.yaml") - SuccessMessage = "Flyte is ready! Flyte UI is available at http://localhost:30081/console" - ImageName = "ghcr.io/flyteorg/flyte-sandbox:dind" - flyteSandboxClusterName = "flyte-sandbox" - Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} - flyteSnackDir = "/usr/src" - K3sDir = "/etc/rancher/" -) - -func setupFlytectlConfig() error { - - _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) - - response, err := http.Get("https://raw.githubusercontent.com/flyteorg/flytectl/master/config.yaml") - if err != nil { - return err - } - defer response.Body.Close() - - data, err := ioutil.ReadAll(response.Body) - if err != nil { - return err - } - - _ = ioutil.WriteFile(FlytectlConfig, data, 0600) - return nil -} - -func configCleanup() error { - err := os.Remove(FlytectlConfig) - if err != nil { - return err - } - err = os.RemoveAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s")) - if err != nil { - return err - } - return nil -} - -func getSandbox(cli *client.Client) *types.Container { - containers, _ := cli.ContainerList(context.Background(), types.ContainerListOptions{ - All: true, - }) - for _, v := range containers { - if strings.Contains(v.Names[0], flyteSandboxClusterName) { - return &v - } - } - return nil -} - -func removeSandboxIfExist(cli *client.Client, reader io.Reader) error { - if c := getSandbox(cli); c != nil { - if cmdUtil.AskForConfirmation("delete existing sandbox cluster", reader) { - err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ - Force: true, - }) - return err - } - os.Exit(0) - } - return nil -} - -func startContainer(cli *client.Client, volumes []mount.Mount) (string, error) { - ExposedPorts, PortBindings, _ := nat.ParsePortSpecs([]string{ - "127.0.0.1:30086:30086", - "127.0.0.1:30081:30081", - "127.0.0.1:30082:30082", - "127.0.0.1:30084:30084", - }) - r, err := cli.ImagePull(context.Background(), ImageName, types.ImagePullOptions{}) - if err != nil { - return "", err - } - _, _ = io.Copy(os.Stdout, r) - resp, err := cli.ContainerCreate(context.Background(), &container.Config{ - Env: Environment, - Image: ImageName, - Tty: false, - ExposedPorts: ExposedPorts, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: PortBindings, - Privileged: true, - }, nil, - nil, flyteSandboxClusterName) - - if err != nil { - return "", err - } - go watchError(cli, resp.ID) - if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil { - return "", err - } - return resp.ID, nil -} - -func watchError(cli *client.Client, id string) { - statusCh, errCh := cli.ContainerWait(context.Background(), id, container.WaitConditionNotRunning) - - select { - case err := <-errCh: - if err != nil { - panic(err) - } - case <-statusCh: - } -} - -func readLogs(cli *client.Client, id, message string) error { - reader, err := cli.ContainerLogs(context.Background(), id, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }) - if err != nil { - return err - } - scanner := bufio.NewScanner(reader) - - for scanner.Scan() { - if strings.Contains(scanner.Text(), message) { - fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, message, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) - fmt.Printf("Please visit https://github.com/flyteorg/flytesnacks for more example %v \n", emoji.Rocket) - fmt.Printf("Register all flytesnacks example by running 'flytectl register examples -d development -p flytesnacks' \n") - break - } - fmt.Println(scanner.Text()) - } - return nil -} diff --git a/flytectl/cmd/sandbox/sandbox_util_test.go b/flytectl/cmd/sandbox/sandbox_util_test.go deleted file mode 100644 index ab7e981b98..0000000000 --- a/flytectl/cmd/sandbox/sandbox_util_test.go +++ /dev/null @@ -1,136 +0,0 @@ -package sandbox - -import ( - "context" - "io/ioutil" - "os" - "strings" - "testing" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/client" - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - u "github.com/flyteorg/flytectl/cmd/testutils" - - f "github.com/flyteorg/flytectl/pkg/filesystemutils" - - "github.com/stretchr/testify/assert" -) - -var ( - cmdCtx cmdCore.CommandContext -) - -func cleanup(client *client.Client) error { - containers, err := client.ContainerList(context.Background(), types.ContainerListOptions{ - All: true, - }) - if err != nil { - return err - } - for _, v := range containers { - if strings.Contains(v.Names[0], flyteSandboxClusterName) { - if err := client.ContainerRemove(context.Background(), v.ID, types.ContainerRemoveOptions{ - Force: true, - }); err != nil { - return err - } - } - } - return nil -} - -func setupSandbox() { - mockAdminClient := u.MockClient - cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) - _ = setupFlytectlConfig() -} - -func TestConfigCleanup(t *testing.T) { - _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) - if os.IsNotExist(err) { - _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) - } - _ = ioutil.WriteFile(FlytectlConfig, []byte("string"), 0600) - _ = ioutil.WriteFile(Kubeconfig, []byte("string"), 0600) - - err = configCleanup() - assert.Nil(t, err) - - _, err = os.Stat(FlytectlConfig) - check := os.IsNotExist(err) - assert.Equal(t, check, true) - - _, err = os.Stat(Kubeconfig) - check = os.IsNotExist(err) - assert.Equal(t, check, true) - _ = configCleanup() -} - -func TestSetupFlytectlConfig(t *testing.T) { - _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) - if os.IsNotExist(err) { - _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) - } - err = setupFlytectlConfig() - assert.Nil(t, err) - _, err = os.Stat(FlytectlConfig) - assert.Nil(t, err) - check := os.IsNotExist(err) - assert.Equal(t, check, false) - _ = configCleanup() - -} - -func TestTearDownSandbox(t *testing.T) { - setupSandbox() - cli, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - err := teardownSandboxCluster(context.Background(), []string{}, cmdCtx) - assert.Nil(t, err) - assert.Nil(t, cleanup(cli)) - - volumes = []mount.Mount{} - _ = startSandboxCluster(context.Background(), []string{}, cmdCtx) - err = teardownSandboxCluster(context.Background(), []string{}, cmdCtx) - assert.Nil(t, err) - -} - -func TestStartSandbox(t *testing.T) { - cli, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - - assert.Nil(t, cleanup(cli)) - setupSandbox() - volumes = []mount.Mount{} - sandboxConfig.DefaultConfig.SnacksRepo = "/tmp" - err := startSandboxCluster(context.Background(), []string{}, cmdCtx) - assert.Nil(t, err) - - assert.Nil(t, cleanup(cli)) - setupSandbox() - sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() - err = startSandboxCluster(context.Background(), []string{}, cmdCtx) - assert.NotNil(t, err) - - assert.Nil(t, cleanup(cli)) - _, err = startContainer(cli, []mount.Mount{}) - assert.Nil(t, err) - - assert.Nil(t, cleanup(cli)) - ImageName = "" - _, err = startContainer(cli, []mount.Mount{}) - assert.NotNil(t, err) -} - -func TestGetSandbox(t *testing.T) { - cli, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - assert.Nil(t, cleanup(cli)) - setupSandbox() - sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() - _ = startSandboxCluster(context.Background(), []string{}, cmdCtx) - - container := removeSandboxIfExist(cli, strings.NewReader("y")) - assert.Nil(t, container) -} diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 913e752d62..33c91ea354 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -1,16 +1,18 @@ package sandbox import ( + "bufio" "context" "fmt" + "io" "os" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/client" "github.com/enescakir/emoji" sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" ) const ( @@ -29,14 +31,6 @@ Usage ` ) -var volumes = []mount.Mount{ - { - Type: mount.TypeBind, - Source: f.FilePathJoin(f.UserHomeDir(), ".flyte"), - Target: K3sDir, - }, -} - type ExecResult struct { StdOut string StdErr string @@ -44,47 +38,66 @@ type ExecResult struct { } func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + cli, err := docker.GetDockerClient() if err != nil { - fmt.Printf("%v Please Check your docker client %v \n", emoji.GrimacingFace, emoji.Whale) return err } - if err := setupFlytectlConfig(); err != nil { + reader, err := startSandbox(ctx, cli, os.Stdin) + if err != nil { return err } + docker.WaitForSandbox(reader, docker.SuccessMessage) + return nil +} - if err := removeSandboxIfExist(cli, os.Stdin); err != nil { - return err +func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio.Scanner, error) { + fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) + if err := docker.SetupFlyteDir(); err != nil { + return nil, err + } + + if err := docker.GetFlyteSandboxConfig(); err != nil { + return nil, err + } + + if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { + return nil, err } if len(sandboxConfig.DefaultConfig.SnacksRepo) > 0 { - volumes = append(volumes, mount.Mount{ + docker.Volumes = append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.SnacksRepo, - Target: flyteSnackDir, + Target: docker.FlyteSnackDir, }) } - os.Setenv("KUBECONFIG", Kubeconfig) - os.Setenv("FLYTECTL_CONFIG", FlytectlConfig) + os.Setenv("KUBECONFIG", docker.Kubeconfig) + os.Setenv("FLYTECTL_CONFIG", docker.FlytectlConfig) + if err := docker.PullDockerImage(ctx, cli, docker.ImageName); err != nil { + return nil, err + } - defer func() { - if r := recover(); r != nil { - fmt.Printf("%v Something went horribly wrong! %s\n", emoji.GrimacingFace, r) - } - }() + exposedPorts, portBindings, _ := docker.GetSandboxPorts() + ID, err := docker.StartContainer(ctx, cli, docker.Volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, docker.ImageName) + if err != nil { + fmt.Printf("%v Something went wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) + return nil, err + } - ID, err := startContainer(cli, volumes) + _, errCh := docker.WatchError(ctx, cli, ID) + logReader, err := docker.ReadLogs(ctx, cli, ID) if err != nil { - fmt.Printf("%v Something went horribly wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) - return fmt.Errorf("error: %v", err) + return nil, err } + go func() { + err := <-errCh + if err != nil { + fmt.Printf("err: %v", err) + os.Exit(1) + } + }() - _ = readLogs(cli, ID, SuccessMessage) - fmt.Printf("Add KUBECONFIG and FLYTECTL_CONFIG to your environment variable \n") - fmt.Printf("export KUBECONFIG=%v \n", Kubeconfig) - fmt.Printf("export FLYTECTL_CONFIG=%v \n", FlytectlConfig) - return nil + return logReader, nil } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go new file mode 100644 index 0000000000..1f29fe5464 --- /dev/null +++ b/flytectl/cmd/sandbox/start_test.go @@ -0,0 +1,355 @@ +package sandbox + +import ( + "context" + "fmt" + "io" + "io/ioutil" + "os" + "strings" + "testing" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/mount" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func TestStartSandboxFunc(t *testing.T) { + p1, p2, _ := docker.GetSandboxPorts() + + t.Run("Successfully run sandbox cluster", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: docker.Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err := startSandbox(ctx, mockDocker, os.Stdin) + assert.Nil(t, err) + }) + t.Run("Successfully run sandbox cluster with flytesnacks", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + volumes := append(docker.Volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.SnacksRepo, + Target: docker.FlyteSnackDir, + }) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err := startSandbox(ctx, mockDocker, os.Stdin) + assert.Nil(t, err) + }) + t.Run("Error in pulling image", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + volumes := append(docker.Volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.SnacksRepo, + Target: docker.FlyteSnackDir, + }) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err := startSandbox(ctx, mockDocker, os.Stdin) + assert.NotNil(t, err) + }) + t.Run("Error in removing existing cluster", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + volumes := append(docker.Volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.SnacksRepo, + Target: docker.FlyteSnackDir, + }) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: "FlyteSandboxClusterName", + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("error")) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err := startSandbox(ctx, mockDocker, strings.NewReader("y")) + assert.NotNil(t, err) + }) + t.Run("Error in start container", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + volumes := append(docker.Volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.SnacksRepo, + Target: docker.FlyteSnackDir, + }) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, fmt.Errorf("error")) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err := startSandbox(ctx, mockDocker, os.Stdin) + assert.NotNil(t, err) + }) + t.Run("Error in reading logs", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + volumes := append(docker.Volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.SnacksRepo, + Target: docker.FlyteSnackDir, + }) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, fmt.Errorf("error")) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err := startSandbox(ctx, mockDocker, os.Stdin) + assert.NotNil(t, err) + }) + t.Run("Error in list container", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + volumes := append(docker.Volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.SnacksRepo, + Target: docker.FlyteSnackDir, + }) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, fmt.Errorf("error")) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err := startSandbox(ctx, mockDocker, os.Stdin) + assert.Nil(t, err) + }) + t.Run("Successfully run sandbox cluster command", func(t *testing.T) { + mockOutStream := new(io.Writer) + ctx := context.Background() + cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + mockDocker := &mocks.Docker{} + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: docker.Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + stringReader := strings.NewReader(docker.SuccessMessage) + reader := ioutil.NopCloser(stringReader) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(reader, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + docker.Client = mockDocker + sandboxConfig.DefaultConfig.SnacksRepo = "" + err := startSandboxCluster(ctx, []string{}, cmdCtx) + assert.Nil(t, err) + }) + t.Run("Error in running sandbox cluster command", func(t *testing.T) { + mockOutStream := new(io.Writer) + ctx := context.Background() + cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + mockDocker := &mocks.Docker{} + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: docker.Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, fmt.Errorf("error")) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + stringReader := strings.NewReader(docker.SuccessMessage) + reader := ioutil.NopCloser(stringReader) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(reader, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + docker.Client = mockDocker + sandboxConfig.DefaultConfig.SnacksRepo = "" + err := startSandboxCluster(ctx, []string{}, cmdCtx) + assert.NotNil(t, err) + }) +} diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index 9f2a217f25..9d05a2581b 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/docker/docker/api/types" "github.com/enescakir/emoji" - "github.com/docker/docker/client" cmdCore "github.com/flyteorg/flytectl/cmd/core" ) @@ -25,19 +26,24 @@ Usage ) func teardownSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + cli, err := docker.GetDockerClient() if err != nil { return err } - c := getSandbox(cli) + return tearDownSandbox(ctx, cli) +} + +func tearDownSandbox(ctx context.Context, cli docker.Docker) error { + c := docker.GetSandbox(ctx, cli) if c != nil { - _ = cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ + if err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ Force: true, - }) + }); err != nil { + return err + } } - if err := configCleanup(); err != nil { + if err := docker.ConfigCleanup(); err != nil { fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) } fmt.Printf("%v %v Sandbox cluster is removed successfully. \n", emoji.Broom, emoji.Broom) diff --git a/flytectl/cmd/sandbox/teardown_test.go b/flytectl/cmd/sandbox/teardown_test.go new file mode 100644 index 0000000000..01511d926e --- /dev/null +++ b/flytectl/cmd/sandbox/teardown_test.go @@ -0,0 +1,59 @@ +package sandbox + +import ( + "context" + "fmt" + "io" + "testing" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + + "github.com/docker/docker/api/types" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +var containers []types.Container + +func TestTearDownFunc(t *testing.T) { + container1 := types.Container{ + ID: "FlyteSandboxClusterName", + Names: []string{ + docker.FlyteSandboxClusterName, + }, + } + containers = append(containers, container1) + + t.Run("Success", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + + err := tearDownSandbox(ctx, mockDocker) + assert.Nil(t, err) + }) + t.Run("Error", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("err")) + err := tearDownSandbox(ctx, mockDocker) + assert.NotNil(t, err) + }) + +} + +func TestTearDownClusterFunc(t *testing.T) { + mockOutStream := new(io.Writer) + ctx := context.Background() + cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + docker.Client = mockDocker + err := teardownSandboxCluster(ctx, []string{}, cmdCtx) + assert.Nil(t, err) +} diff --git a/flytectl/go.mod b/flytectl/go.mod index 728371c428..ad4c8f90cc 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -25,6 +25,7 @@ require ( github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/opencontainers/image-spec v1.0.1 // indirect github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 github.com/sirupsen/logrus v1.8.0 github.com/spf13/cobra v1.1.3 diff --git a/flytectl/pkg/docker/docker.go b/flytectl/pkg/docker/docker.go new file mode 100644 index 0000000000..f33b3b5219 --- /dev/null +++ b/flytectl/pkg/docker/docker.go @@ -0,0 +1,28 @@ +package docker + +import ( + "context" + "io" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/network" + "github.com/docker/docker/client" + specs "github.com/opencontainers/image-spec/specs-go/v1" +) + +//go:generate mockery -all -case=underscore + +type Docker interface { + ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *specs.Platform, containerName string) (container.ContainerCreateCreatedBody, error) + ContainerStart(ctx context.Context, containerID string, options types.ContainerStartOptions) error + ImagePull(ctx context.Context, refStr string, options types.ImagePullOptions) (io.ReadCloser, error) + ContainerWait(ctx context.Context, containerID string, condition container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error) + ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) + ContainerRemove(ctx context.Context, containerID string, options types.ContainerRemoveOptions) error + ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) +} + +type FlyteDocker struct { + *client.Client +} diff --git a/flytectl/pkg/docker/mocks/docker.go b/flytectl/pkg/docker/mocks/docker.go new file mode 100644 index 0000000000..917546fbee --- /dev/null +++ b/flytectl/pkg/docker/mocks/docker.go @@ -0,0 +1,293 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + container "github.com/docker/docker/api/types/container" + + io "io" + + mock "github.com/stretchr/testify/mock" + + network "github.com/docker/docker/api/types/network" + + types "github.com/docker/docker/api/types" + + v1 "github.com/opencontainers/image-spec/specs-go/v1" +) + +// Docker is an autogenerated mock type for the Docker type +type Docker struct { + mock.Mock +} + +type Docker_ContainerCreate struct { + *mock.Call +} + +func (_m Docker_ContainerCreate) Return(_a0 container.ContainerCreateCreatedBody, _a1 error) *Docker_ContainerCreate { + return &Docker_ContainerCreate{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *v1.Platform, containerName string) *Docker_ContainerCreate { + c := _m.On("ContainerCreate", ctx, config, hostConfig, networkingConfig, platform, containerName) + return &Docker_ContainerCreate{Call: c} +} + +func (_m *Docker) OnContainerCreateMatch(matchers ...interface{}) *Docker_ContainerCreate { + c := _m.On("ContainerCreate", matchers...) + return &Docker_ContainerCreate{Call: c} +} + +// ContainerCreate provides a mock function with given fields: ctx, config, hostConfig, networkingConfig, platform, containerName +func (_m *Docker) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *v1.Platform, containerName string) (container.ContainerCreateCreatedBody, error) { + ret := _m.Called(ctx, config, hostConfig, networkingConfig, platform, containerName) + + var r0 container.ContainerCreateCreatedBody + if rf, ok := ret.Get(0).(func(context.Context, *container.Config, *container.HostConfig, *network.NetworkingConfig, *v1.Platform, string) container.ContainerCreateCreatedBody); ok { + r0 = rf(ctx, config, hostConfig, networkingConfig, platform, containerName) + } else { + r0 = ret.Get(0).(container.ContainerCreateCreatedBody) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *container.Config, *container.HostConfig, *network.NetworkingConfig, *v1.Platform, string) error); ok { + r1 = rf(ctx, config, hostConfig, networkingConfig, platform, containerName) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type Docker_ContainerList struct { + *mock.Call +} + +func (_m Docker_ContainerList) Return(_a0 []types.Container, _a1 error) *Docker_ContainerList { + return &Docker_ContainerList{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnContainerList(ctx context.Context, options types.ContainerListOptions) *Docker_ContainerList { + c := _m.On("ContainerList", ctx, options) + return &Docker_ContainerList{Call: c} +} + +func (_m *Docker) OnContainerListMatch(matchers ...interface{}) *Docker_ContainerList { + c := _m.On("ContainerList", matchers...) + return &Docker_ContainerList{Call: c} +} + +// ContainerList provides a mock function with given fields: ctx, options +func (_m *Docker) ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) { + ret := _m.Called(ctx, options) + + var r0 []types.Container + if rf, ok := ret.Get(0).(func(context.Context, types.ContainerListOptions) []types.Container); ok { + r0 = rf(ctx, options) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]types.Container) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, types.ContainerListOptions) error); ok { + r1 = rf(ctx, options) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type Docker_ContainerLogs struct { + *mock.Call +} + +func (_m Docker_ContainerLogs) Return(_a0 io.ReadCloser, _a1 error) *Docker_ContainerLogs { + return &Docker_ContainerLogs{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnContainerLogs(ctx context.Context, _a1 string, options types.ContainerLogsOptions) *Docker_ContainerLogs { + c := _m.On("ContainerLogs", ctx, _a1, options) + return &Docker_ContainerLogs{Call: c} +} + +func (_m *Docker) OnContainerLogsMatch(matchers ...interface{}) *Docker_ContainerLogs { + c := _m.On("ContainerLogs", matchers...) + return &Docker_ContainerLogs{Call: c} +} + +// ContainerLogs provides a mock function with given fields: ctx, _a1, options +func (_m *Docker) ContainerLogs(ctx context.Context, _a1 string, options types.ContainerLogsOptions) (io.ReadCloser, error) { + ret := _m.Called(ctx, _a1, options) + + var r0 io.ReadCloser + if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerLogsOptions) io.ReadCloser); ok { + r0 = rf(ctx, _a1, options) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.ReadCloser) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, types.ContainerLogsOptions) error); ok { + r1 = rf(ctx, _a1, options) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type Docker_ContainerRemove struct { + *mock.Call +} + +func (_m Docker_ContainerRemove) Return(_a0 error) *Docker_ContainerRemove { + return &Docker_ContainerRemove{Call: _m.Call.Return(_a0)} +} + +func (_m *Docker) OnContainerRemove(ctx context.Context, containerID string, options types.ContainerRemoveOptions) *Docker_ContainerRemove { + c := _m.On("ContainerRemove", ctx, containerID, options) + return &Docker_ContainerRemove{Call: c} +} + +func (_m *Docker) OnContainerRemoveMatch(matchers ...interface{}) *Docker_ContainerRemove { + c := _m.On("ContainerRemove", matchers...) + return &Docker_ContainerRemove{Call: c} +} + +// ContainerRemove provides a mock function with given fields: ctx, containerID, options +func (_m *Docker) ContainerRemove(ctx context.Context, containerID string, options types.ContainerRemoveOptions) error { + ret := _m.Called(ctx, containerID, options) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerRemoveOptions) error); ok { + r0 = rf(ctx, containerID, options) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type Docker_ContainerStart struct { + *mock.Call +} + +func (_m Docker_ContainerStart) Return(_a0 error) *Docker_ContainerStart { + return &Docker_ContainerStart{Call: _m.Call.Return(_a0)} +} + +func (_m *Docker) OnContainerStart(ctx context.Context, containerID string, options types.ContainerStartOptions) *Docker_ContainerStart { + c := _m.On("ContainerStart", ctx, containerID, options) + return &Docker_ContainerStart{Call: c} +} + +func (_m *Docker) OnContainerStartMatch(matchers ...interface{}) *Docker_ContainerStart { + c := _m.On("ContainerStart", matchers...) + return &Docker_ContainerStart{Call: c} +} + +// ContainerStart provides a mock function with given fields: ctx, containerID, options +func (_m *Docker) ContainerStart(ctx context.Context, containerID string, options types.ContainerStartOptions) error { + ret := _m.Called(ctx, containerID, options) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerStartOptions) error); ok { + r0 = rf(ctx, containerID, options) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type Docker_ContainerWait struct { + *mock.Call +} + +func (_m Docker_ContainerWait) Return(_a0 <-chan container.ContainerWaitOKBody, _a1 <-chan error) *Docker_ContainerWait { + return &Docker_ContainerWait{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnContainerWait(ctx context.Context, containerID string, condition container.WaitCondition) *Docker_ContainerWait { + c := _m.On("ContainerWait", ctx, containerID, condition) + return &Docker_ContainerWait{Call: c} +} + +func (_m *Docker) OnContainerWaitMatch(matchers ...interface{}) *Docker_ContainerWait { + c := _m.On("ContainerWait", matchers...) + return &Docker_ContainerWait{Call: c} +} + +// ContainerWait provides a mock function with given fields: ctx, containerID, condition +func (_m *Docker) ContainerWait(ctx context.Context, containerID string, condition container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error) { + ret := _m.Called(ctx, containerID, condition) + + var r0 <-chan container.ContainerWaitOKBody + if rf, ok := ret.Get(0).(func(context.Context, string, container.WaitCondition) <-chan container.ContainerWaitOKBody); ok { + r0 = rf(ctx, containerID, condition) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(<-chan container.ContainerWaitOKBody) + } + } + + var r1 <-chan error + if rf, ok := ret.Get(1).(func(context.Context, string, container.WaitCondition) <-chan error); ok { + r1 = rf(ctx, containerID, condition) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(<-chan error) + } + } + + return r0, r1 +} + +type Docker_ImagePull struct { + *mock.Call +} + +func (_m Docker_ImagePull) Return(_a0 io.ReadCloser, _a1 error) *Docker_ImagePull { + return &Docker_ImagePull{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnImagePull(ctx context.Context, refStr string, options types.ImagePullOptions) *Docker_ImagePull { + c := _m.On("ImagePull", ctx, refStr, options) + return &Docker_ImagePull{Call: c} +} + +func (_m *Docker) OnImagePullMatch(matchers ...interface{}) *Docker_ImagePull { + c := _m.On("ImagePull", matchers...) + return &Docker_ImagePull{Call: c} +} + +// ImagePull provides a mock function with given fields: ctx, refStr, options +func (_m *Docker) ImagePull(ctx context.Context, refStr string, options types.ImagePullOptions) (io.ReadCloser, error) { + ret := _m.Called(ctx, refStr, options) + + var r0 io.ReadCloser + if rf, ok := ret.Get(0).(func(context.Context, string, types.ImagePullOptions) io.ReadCloser); ok { + r0 = rf(ctx, refStr, options) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.ReadCloser) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, types.ImagePullOptions) error); ok { + r1 = rf(ctx, refStr, options) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/flytectl/pkg/docker/sandbox_util.go b/flytectl/pkg/docker/sandbox_util.go new file mode 100644 index 0000000000..4ce230581b --- /dev/null +++ b/flytectl/pkg/docker/sandbox_util.go @@ -0,0 +1,194 @@ +package docker + +import ( + "bufio" + "context" + "fmt" + "io" + "os" + "strings" + + "github.com/flyteorg/flytectl/pkg/util" + + "github.com/docker/docker/client" + + "github.com/enescakir/emoji" + + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/mount" + "github.com/docker/go-connections/nat" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" +) + +var ( + Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") + FlytectlConfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "config-sandbox.yaml") + SuccessMessage = "Flyte is ready! Flyte UI is available at http://localhost:30081/console" + ImageName = "cr.flyte.org/flyteorg/flyte-sandbox:dind" + FlyteSandboxClusterName = "flyte-sandbox" + Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} + FlyteSnackDir = "/usr/src" + K3sDir = "/etc/rancher/" + Client Docker + Volumes = []mount.Mount{ + { + Type: mount.TypeBind, + Source: f.FilePathJoin(f.UserHomeDir(), ".flyte"), + Target: K3sDir, + }, + } +) + +// SetupFlyteDir will create .flyte dir if not exist +func SetupFlyteDir() error { + if err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755); err != nil { + return err + } + return nil +} + +// GetFlyteSandboxConfig download the flyte sandbox config +func GetFlyteSandboxConfig() error { + response, err := util.GetRequest("https://raw.githubusercontent.com", "/flyteorg/flytectl/master/config.yaml") + if err != nil { + return err + } + + return util.WriteIntoFile(response, FlytectlConfig) +} + +// ConfigCleanup will remove the sandbox config from flyte dir +func ConfigCleanup() error { + err := os.Remove(FlytectlConfig) + if err != nil { + return err + } + err = os.RemoveAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s")) + if err != nil { + return err + } + return nil +} + +// GetSandbox will return sandbox container if it exist +func GetSandbox(ctx context.Context, cli Docker) *types.Container { + containers, _ := cli.ContainerList(ctx, types.ContainerListOptions{ + All: true, + }) + for _, v := range containers { + if strings.Contains(v.Names[0], FlyteSandboxClusterName) { + return &v + } + } + return nil +} + +// RemoveSandbox will remove sandbox container if exist +func RemoveSandbox(ctx context.Context, cli Docker, reader io.Reader) error { + if c := GetSandbox(ctx, cli); c != nil { + if cmdUtil.AskForConfirmation("delete existing sandbox cluster", reader) { + err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ + Force: true, + }) + return err + } + return nil + } + return nil +} + +// GetSandboxPorts will return sandbox ports +func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, error) { + return nat.ParsePortSpecs([]string{ + "127.0.0.1:30086:30086", + "127.0.0.1:30081:30081", + "127.0.0.1:30082:30082", + "127.0.0.1:30084:30084", + }) +} + +// PullDockerImage will Pull docker image +func PullDockerImage(ctx context.Context, cli Docker, image string) error { + r, err := cli.ImagePull(ctx, image, types.ImagePullOptions{}) + if err != nil { + return err + } + _, err = io.Copy(os.Stdout, r) + return err +} + +//StartContainer will create and start docker container +func StartContainer(ctx context.Context, cli Docker, volumes []mount.Mount, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, name, image string) (string, error) { + resp, err := cli.ContainerCreate(ctx, &container.Config{ + Env: Environment, + Image: image, + Tty: false, + ExposedPorts: exposedPorts, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: portBindings, + Privileged: true, + }, nil, + nil, name) + + if err != nil { + return "", err + } + + if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil { + return "", err + } + return resp.ID, nil +} + +// WatchError will return channel for watching errors of a container +func WatchError(ctx context.Context, cli Docker, id string) (<-chan container.ContainerWaitOKBody, <-chan error) { + return cli.ContainerWait(context.Background(), id, container.WaitConditionNotRunning) +} + +// ReadLogs will return io scanner for reading the logs of a container +func ReadLogs(ctx context.Context, cli Docker, id string) (*bufio.Scanner, error) { + reader, err := cli.ContainerLogs(context.Background(), id, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }) + if err != nil { + return nil, err + } + return bufio.NewScanner(reader), nil +} + +// WaitForSandbox will wait until it doesn't get success message +func WaitForSandbox(reader *bufio.Scanner, message string) bool { + for reader.Scan() { + if strings.Contains(reader.Text(), message) { + fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, message, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) + fmt.Printf("Please visit https://github.com/flyteorg/flytesnacks for more example %v \n", emoji.Rocket) + fmt.Printf("Register all flytesnacks example by running 'flytectl register examples -d development -p flytesnacks' \n") + fmt.Printf("Add KUBECONFIG and FLYTECTL_CONFIG to your environment variable \n") + fmt.Printf("export KUBECONFIG=%v \n", Kubeconfig) + fmt.Printf("export FLYTECTL_CONFIG=%v \n", FlytectlConfig) + return true + } + fmt.Println(reader.Text()) + } + return false +} + +// GetDockerClient will returns the docker client +func GetDockerClient() (Docker, error) { + if Client == nil { + cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + if err != nil { + fmt.Printf("%v Please Check your docker client %v \n", emoji.GrimacingFace, emoji.Whale) + return nil, err + } + return cli, nil + } + return Client, nil +} diff --git a/flytectl/pkg/docker/sandbox_util_test.go b/flytectl/pkg/docker/sandbox_util_test.go new file mode 100644 index 0000000000..b39e03f4f6 --- /dev/null +++ b/flytectl/pkg/docker/sandbox_util_test.go @@ -0,0 +1,315 @@ +package docker + +import ( + "bufio" + "context" + "fmt" + + "github.com/docker/docker/api/types/container" + + //"github.com/docker/go-connections/nat" + "io/ioutil" + "os" + "strings" + "testing" + + "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/stretchr/testify/mock" + + "github.com/docker/docker/api/types" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + u "github.com/flyteorg/flytectl/cmd/testutils" + + f "github.com/flyteorg/flytectl/pkg/filesystemutils" + + "github.com/stretchr/testify/assert" +) + +var ( + cmdCtx cmdCore.CommandContext + containers []types.Container +) + +func setupSandbox() { + mockAdminClient := u.MockClient + cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) + _ = SetupFlyteDir() + container1 := types.Container{ + ID: "FlyteSandboxClusterName", + Names: []string{ + FlyteSandboxClusterName, + }, + } + containers = append(containers, container1) +} + +func TestConfigCleanup(t *testing.T) { + _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) + if os.IsNotExist(err) { + _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) + } + _ = ioutil.WriteFile(FlytectlConfig, []byte("string"), 0600) + _ = ioutil.WriteFile(Kubeconfig, []byte("string"), 0600) + + err = ConfigCleanup() + assert.Nil(t, err) + + _, err = os.Stat(FlytectlConfig) + check := os.IsNotExist(err) + assert.Equal(t, check, true) + + _, err = os.Stat(Kubeconfig) + check = os.IsNotExist(err) + assert.Equal(t, check, true) + _ = ConfigCleanup() +} + +func TestSetupFlytectlConfig(t *testing.T) { + _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) + if os.IsNotExist(err) { + _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) + } + err = SetupFlyteDir() + assert.Nil(t, err) + err = GetFlyteSandboxConfig() + assert.Nil(t, err) + _, err = os.Stat(FlytectlConfig) + assert.Nil(t, err) + check := os.IsNotExist(err) + assert.Equal(t, check, false) + _ = ConfigCleanup() +} + +func TestGetSandbox(t *testing.T) { + setupSandbox() + t.Run("Successfully get sandbox container", func(t *testing.T) { + mockDocker := &mocks.Docker{} + context := context.Background() + + mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return(containers, nil) + c := GetSandbox(context, mockDocker) + assert.Equal(t, c.Names[0], FlyteSandboxClusterName) + }) + + t.Run("Successfully get sandbox container with zero result", func(t *testing.T) { + mockDocker := &mocks.Docker{} + context := context.Background() + + mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + c := GetSandbox(context, mockDocker) + assert.Nil(t, c) + }) + + t.Run("Error in get sandbox container", func(t *testing.T) { + mockDocker := &mocks.Docker{} + context := context.Background() + + mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(context, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + err := RemoveSandbox(context, mockDocker, strings.NewReader("y")) + assert.Nil(t, err) + }) + +} + +func TestRemoveSandboxWithNoReply(t *testing.T) { + setupSandbox() + t.Run("Successfully remove sandbox container", func(t *testing.T) { + mockDocker := &mocks.Docker{} + context := context.Background() + + // Verify the attributes + mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(context, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + err := RemoveSandbox(context, mockDocker, strings.NewReader("n")) + assert.Nil(t, err) + }) + + t.Run("Successfully remove sandbox container with zero sandbox containers are running", func(t *testing.T) { + mockDocker := &mocks.Docker{} + context := context.Background() + + // Verify the attributes + mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerRemove(context, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + err := RemoveSandbox(context, mockDocker, strings.NewReader("n")) + assert.Nil(t, err) + }) + +} + +func TestPullDockerImage(t *testing.T) { + t.Run("Successfully pull image", func(t *testing.T) { + setupSandbox() + mockDocker := &mocks.Docker{} + context := context.Background() + // Verify the attributes + mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + err := PullDockerImage(context, mockDocker, "nginx") + assert.Nil(t, err) + }) + + t.Run("Error in pull image", func(t *testing.T) { + setupSandbox() + mockDocker := &mocks.Docker{} + context := context.Background() + // Verify the attributes + mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) + err := PullDockerImage(context, mockDocker, "nginx") + assert.NotNil(t, err) + }) + +} + +func TestStartContainer(t *testing.T) { + p1, p2, _ := GetSandboxPorts() + + t.Run("Successfully create a container", func(t *testing.T) { + setupSandbox() + mockDocker := &mocks.Docker{} + context := context.Background() + + // Verify the attributes + mockDocker.OnContainerCreate(context, &container.Config{ + Env: Environment, + Image: ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(nil) + id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", ImageName) + assert.Nil(t, err) + assert.Greater(t, len(id), 0) + assert.Equal(t, id, "Hello") + }) + + t.Run("Error in creating container", func(t *testing.T) { + setupSandbox() + mockDocker := &mocks.Docker{} + context := context.Background() + + // Verify the attributes + mockDocker.OnContainerCreate(context, &container.Config{ + Env: Environment, + Image: ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "", + }, fmt.Errorf("error")) + mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(nil) + id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", ImageName) + assert.NotNil(t, err) + assert.Equal(t, len(id), 0) + assert.Equal(t, id, "") + }) + + t.Run("Error in start of a container", func(t *testing.T) { + setupSandbox() + mockDocker := &mocks.Docker{} + context := context.Background() + + // Verify the attributes + mockDocker.OnContainerCreate(context, &container.Config{ + Env: Environment, + Image: ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) + id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", ImageName) + assert.NotNil(t, err) + assert.Equal(t, len(id), 0) + assert.Equal(t, id, "") + }) +} + +func TestWatchError(t *testing.T) { + setupSandbox() + mockDocker := &mocks.Docker{} + context := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker.OnContainerWaitMatch(context, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err := WatchError(context, mockDocker, "test") + assert.NotNil(t, err) +} + +func TestReadLogs(t *testing.T) { + setupSandbox() + + t.Run("Successfully read logs", func(t *testing.T) { + mockDocker := &mocks.Docker{} + context := context.Background() + mockDocker.OnContainerLogsMatch(context, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + _, err := ReadLogs(context, mockDocker, "test") + assert.Nil(t, err) + }) + + t.Run("Error in reading logs", func(t *testing.T) { + mockDocker := &mocks.Docker{} + context := context.Background() + mockDocker.OnContainerLogsMatch(context, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, fmt.Errorf("error")) + _, err := ReadLogs(context, mockDocker, "test") + assert.NotNil(t, err) + }) +} + +func TestWaitForSandbox(t *testing.T) { + setupSandbox() + t.Run("Successfully read logs ", func(t *testing.T) { + reader := bufio.NewScanner(strings.NewReader("hello \n Flyte")) + + check := WaitForSandbox(reader, "Flyte") + assert.Equal(t, true, check) + }) + + t.Run("Error in reading logs ", func(t *testing.T) { + reader := bufio.NewScanner(strings.NewReader("")) + check := WaitForSandbox(reader, "Flyte") + assert.Equal(t, false, check) + }) +} + +func TestDockerClient(t *testing.T) { + t.Run("Successfully get docker mock client", func(t *testing.T) { + mockDocker := &mocks.Docker{} + Client = mockDocker + cli, err := GetDockerClient() + assert.Nil(t, err) + assert.NotNil(t, cli) + }) + t.Run("Successfully get docker client", func(t *testing.T) { + Client = nil + cli, err := GetDockerClient() + assert.Nil(t, err) + assert.NotNil(t, cli) + }) + +} From 0229fb90abc0dce99ebf09f362608dddd98a4269 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Thu, 24 Jun 2021 06:12:47 -0700 Subject: [PATCH 082/645] Update Boilerplate (#98) Signed-off-by: Flyte-Bot Co-authored-by: flyte-bot From 59860c47ddd3889da53bfe31d39b5567610abead Mon Sep 17 00:00:00 2001 From: Haytham Abuelfutuh Date: Thu, 24 Jun 2021 14:50:57 -0700 Subject: [PATCH 083/645] Rename flytesnacks flag to sourcesPath (#116) Signed-off-by: Haytham Abuelfutuh --- flytectl/Makefile | 2 -- .../config/subcommand/sandbox/config_flags.go | 2 +- .../subcommand/sandbox/config_flags_test.go | 2 +- .../subcommand/sandbox/sandbox_config.go | 4 +-- flytectl/cmd/sandbox/start.go | 6 ++-- flytectl/cmd/sandbox/start_test.go | 28 +++++++++---------- .../source/gen/flytectl_sandbox_start.rst | 4 +-- 7 files changed, 23 insertions(+), 25 deletions(-) diff --git a/flytectl/Makefile b/flytectl/Makefile index 8d1c049c43..43c7aab1ca 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -9,8 +9,6 @@ PACKAGE ?=github.com/flyteorg/flytestdlib LD_FLAGS="-s -w -X $(PACKAGE)/version.Version=$(GIT_VERSION) -X $(PACKAGE)/version.Build=$(GIT_HASH) -X $(PACKAGE)/version.BuildTime=$(TIMESTAMP)" - - define PIP_COMPILE pip-compile $(1) --upgrade --verbose endef diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index 3c1cd8d74e..644a091b91 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -50,6 +50,6 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&DefaultConfig.SnacksRepo, fmt.Sprintf("%v%v", prefix, "flytesnacks"), DefaultConfig.SnacksRepo, " Path of your flytesnacks repository") + cmdFlags.StringVar(&DefaultConfig.SourcesPath, fmt.Sprintf("%v%v", prefix, "flytesnacks"), DefaultConfig.SourcesPath, " Path of your flytesnacks repository") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index c6bf24684c..a9dea063aa 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -106,7 +106,7 @@ func TestConfig_SetFlags(t *testing.T) { cmdFlags.Set("flytesnacks", testValue) if vString, err := cmdFlags.GetString("flytesnacks"); err == nil { - testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.SnacksRepo) + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.SourcesPath) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index e9f8098828..87b1ea9cb0 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -5,7 +5,7 @@ var ( DefaultConfig = &Config{} ) -// Config +// Config represents the config parameters exposed for the `sandbox` command. type Config struct { - SnacksRepo string `json:"flytesnacks" pflag:", Path of your flytesnacks repository"` + SourcesPath string `json:"sourcesPath" pflag:",Path to your source code path where flyte workflows and tasks are."` } diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 33c91ea354..559c623a08 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -26,7 +26,7 @@ Start will run the flyte sandbox cluster inside a docker container and setup the Mount your flytesnacks repository code inside sandbox :: - bin/flytectl sandbox start --flytesnacks=$HOME/flyteorg/flytesnacks + bin/flytectl sandbox start --sourcesPath=$HOME/flyteorg/flytesnacks Usage ` ) @@ -65,10 +65,10 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu return nil, err } - if len(sandboxConfig.DefaultConfig.SnacksRepo) > 0 { + if len(sandboxConfig.DefaultConfig.SourcesPath) > 0 { docker.Volumes = append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SnacksRepo, + Source: sandboxConfig.DefaultConfig.SourcesPath, Target: docker.FlyteSnackDir, }) } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index 1f29fe5464..7bb7ce0a0d 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -61,10 +61,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SnacksRepo, + Source: sandboxConfig.DefaultConfig.SourcesPath, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -97,10 +97,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SnacksRepo, + Source: sandboxConfig.DefaultConfig.SourcesPath, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -133,10 +133,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SnacksRepo, + Source: sandboxConfig.DefaultConfig.SourcesPath, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -177,10 +177,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SnacksRepo, + Source: sandboxConfig.DefaultConfig.SourcesPath, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -213,10 +213,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SnacksRepo, + Source: sandboxConfig.DefaultConfig.SourcesPath, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -249,10 +249,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SnacksRepo = f.UserHomeDir() + sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SnacksRepo, + Source: sandboxConfig.DefaultConfig.SourcesPath, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -312,7 +312,7 @@ func TestStartSandboxFunc(t *testing.T) { }).Return(reader, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) docker.Client = mockDocker - sandboxConfig.DefaultConfig.SnacksRepo = "" + sandboxConfig.DefaultConfig.SourcesPath = "" err := startSandboxCluster(ctx, []string{}, cmdCtx) assert.Nil(t, err) }) @@ -348,7 +348,7 @@ func TestStartSandboxFunc(t *testing.T) { }).Return(reader, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) docker.Client = mockDocker - sandboxConfig.DefaultConfig.SnacksRepo = "" + sandboxConfig.DefaultConfig.SourcesPath = "" err := startSandboxCluster(ctx, []string{}, cmdCtx) assert.NotNil(t, err) }) diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 402b8b5ad9..201a3d4e59 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -18,7 +18,7 @@ Start will run the flyte sandbox cluster inside a docker container and setup the Mount your flytesnacks repository code inside sandbox :: - bin/flytectl sandbox start --flytesnacks=$HOME/flyteorg/flytesnacks + bin/flytectl sandbox start --sourcesPath=$HOME/flyteorg/flytesnacks Usage @@ -31,7 +31,7 @@ Options :: - --flytesnacks string Path of your flytesnacks repository + --sourcesPath string Path to your source code path where flyte workflows and tasks are. -h, --help help for start Options inherited from parent commands From efffd5772112b1966001c41e50dc6c09124bd977 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Thu, 24 Jun 2021 15:15:24 -0700 Subject: [PATCH 084/645] Sandbox status & Bash completion (#115) * Sandbox status command Signed-off-by: Ketan Umare * bash completion Signed-off-by: Ketan Umare * goimported Signed-off-by: Ketan Umare * fixed lint Signed-off-by: Ketan Umare * added unit test for status Signed-off-by: Yuvraj Co-authored-by: Yuvraj --- flytectl/cmd/completion.go | 83 ++++++++++++++++++++++++++++ flytectl/cmd/root.go | 1 + flytectl/cmd/sandbox/sandbox.go | 3 + flytectl/cmd/sandbox/sandbox_test.go | 12 ++-- flytectl/cmd/sandbox/start_test.go | 2 +- flytectl/cmd/sandbox/status.go | 43 ++++++++++++++ flytectl/cmd/sandbox/status_test.go | 43 ++++++++++++++ flytectl/go.mod | 4 +- 8 files changed, 184 insertions(+), 7 deletions(-) create mode 100644 flytectl/cmd/completion.go create mode 100644 flytectl/cmd/sandbox/status.go create mode 100644 flytectl/cmd/sandbox/status_test.go diff --git a/flytectl/cmd/completion.go b/flytectl/cmd/completion.go new file mode 100644 index 0000000000..7c705c2e00 --- /dev/null +++ b/flytectl/cmd/completion.go @@ -0,0 +1,83 @@ +/* +Copyright © 2021 NAME HERE + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package cmd + +import ( + "os" + + "github.com/spf13/cobra" +) + +// completionCmd represents the completion command +var completionCmd = &cobra.Command{ + Use: "completion [bash|zsh|fish|powershell]", + Short: "Generate completion script", + Long: `To load completions: + +Bash: + + $ source <(flytectl completion bash) + + # To load completions for each session, execute once: + # Linux: + $ flytectl completion bash > /etc/bash_completion.d/flytectl + # macOS: + $ flytectl completion bash > /usr/local/etc/bash_completion.d/flytectl + +Zsh: + + # If shell completion is not already enabled in your environment, + # you will need to enable it. You can execute the following once: + + $ echo "autoload -U compinit; compinit" >> ~/.zshrc + + # To load completions for each session, execute once: + $ flytectl completion zsh > "${fpath[1]}/_flytectl" + + # You will need to start a new shell for this setup to take effect. + +fish: + + $ flytectl completion fish | source + + # To load completions for each session, execute once: + $ flytectl completion fish > ~/.config/fish/completions/flytectl.fish + +PowerShell: + + PS> flytectl completion powershell | Out-String | Invoke-Expression + + # To load completions for every new session, run: + PS> flytectl completion powershell > flytectl.ps1 + # and source this file from your PowerShell profile. +`, + DisableFlagsInUseLine: true, + ValidArgs: []string{"bash", "zsh", "fish", "powershell"}, + Args: cobra.ExactValidArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + switch args[0] { + case "bash": + return cmd.Root().GenBashCompletion(os.Stdout) + case "zsh": + return cmd.Root().GenZshCompletion(os.Stdout) + case "fish": + return cmd.Root().GenFishCompletion(os.Stdout, true) + case "powershell": + return cmd.Root().GenPowerShellCompletionWithDesc(os.Stdout) + } + return nil + }, +} diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 52bc75722c..70691d1751 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -59,6 +59,7 @@ func newRootCmd() *cobra.Command { rootCmd.AddCommand(register.RemoteRegisterCommand()) rootCmd.AddCommand(delete.RemoteDeleteCommand()) rootCmd.AddCommand(sandbox.CreateSandboxCommand()) + rootCmd.AddCommand(completionCmd) // Added version command versioncmd := version.GetVersionCommand(rootCmd) cmdCore.AddCommands(rootCmd, versioncmd) diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go index cf666b9a48..7ee1f37cb6 100644 --- a/flytectl/cmd/sandbox/sandbox.go +++ b/flytectl/cmd/sandbox/sandbox.go @@ -38,6 +38,9 @@ func CreateSandboxCommand() *cobra.Command { "teardown": {CmdFunc: teardownSandboxCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: teardownShort, Long: teardownLong}, + "status": {CmdFunc: sandboxClusterStatus, Aliases: []string{}, ProjectDomainNotRequired: true, + Short: statusShort, + Long: statusLong}, } cmdcore.AddCommands(sandbox, sandboxResourcesFuncs) diff --git a/flytectl/cmd/sandbox/sandbox_test.go b/flytectl/cmd/sandbox/sandbox_test.go index fe3f964572..8537f434e9 100644 --- a/flytectl/cmd/sandbox/sandbox_test.go +++ b/flytectl/cmd/sandbox/sandbox_test.go @@ -13,7 +13,7 @@ func TestCreateSandboxCommand(t *testing.T) { assert.Equal(t, sandboxCommand.Use, "sandbox") assert.Equal(t, sandboxCommand.Short, "Used for testing flyte sandbox.") fmt.Println(sandboxCommand.Commands()) - assert.Equal(t, len(sandboxCommand.Commands()), 2) + assert.Equal(t, len(sandboxCommand.Commands()), 3) cmdNouns := sandboxCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { @@ -24,8 +24,12 @@ func TestCreateSandboxCommand(t *testing.T) { assert.Equal(t, cmdNouns[0].Short, startShort) assert.Equal(t, cmdNouns[0].Long, startLong) - assert.Equal(t, cmdNouns[1].Use, "teardown") - assert.Equal(t, cmdNouns[1].Short, teardownShort) - assert.Equal(t, cmdNouns[1].Long, teardownLong) + assert.Equal(t, cmdNouns[1].Use, "status") + assert.Equal(t, cmdNouns[1].Short, statusShort) + assert.Equal(t, cmdNouns[1].Long, statusLong) + + assert.Equal(t, cmdNouns[2].Use, "teardown") + assert.Equal(t, cmdNouns[2].Short, teardownShort) + assert.Equal(t, cmdNouns[2].Long, teardownLong) } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index 7bb7ce0a0d..36e0399b51 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -154,7 +154,7 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ { - ID: "FlyteSandboxClusterName", + ID: docker.FlyteSandboxClusterName, Names: []string{ docker.FlyteSandboxClusterName, }, diff --git a/flytectl/cmd/sandbox/status.go b/flytectl/cmd/sandbox/status.go new file mode 100644 index 0000000000..c9493b4509 --- /dev/null +++ b/flytectl/cmd/sandbox/status.go @@ -0,0 +1,43 @@ +package sandbox + +import ( + "context" + "fmt" + + "github.com/enescakir/emoji" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/docker" +) + +const ( + statusShort = "Get the status of the sandbox environment." + statusLong = ` +Status will retrieve the status of the Sandbox environment. Currently FlyteSandbox runs as a local docker container. +This will return the docker status for this container + +Usage +:: + + bin/flytectl sandbox status + +` +) + +func sandboxClusterStatus(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + cli, err := docker.GetDockerClient() + if err != nil { + return err + } + + return printStatus(ctx, cli) +} + +func printStatus(ctx context.Context, cli docker.Docker) error { + c := docker.GetSandbox(ctx, cli) + if c == nil { + fmt.Printf("%v no Sandbox found \n", emoji.StopSign) + return nil + } + fmt.Printf("Flyte local sandbox cluster container image [%s] with status [%s] is in state [%s]", c.Image, c.Status, c.State) + return nil +} diff --git a/flytectl/cmd/sandbox/status_test.go b/flytectl/cmd/sandbox/status_test.go new file mode 100644 index 0000000000..fa5fbf424a --- /dev/null +++ b/flytectl/cmd/sandbox/status_test.go @@ -0,0 +1,43 @@ +package sandbox + +import ( + "context" + "io" + "testing" + + "github.com/docker/docker/api/types" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/stretchr/testify/assert" +) + +func TestSandboxStatus(t *testing.T) { + t.Run("Sandbox status with zero result", func(t *testing.T) { + ctx := context.Background() + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + docker.Client = mockDocker + err := sandboxClusterStatus(ctx, []string{}, cmdCtx) + assert.Nil(t, err) + }) + t.Run("Sandbox status with running sandbox", func(t *testing.T) { + ctx := context.Background() + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + docker.Client = mockDocker + err := sandboxClusterStatus(ctx, []string{}, cmdCtx) + assert.Nil(t, err) + }) +} diff --git a/flytectl/go.mod b/flytectl/go.mod index ad4c8f90cc..93af1fc05b 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -16,7 +16,7 @@ require ( github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.2.0 - github.com/hashicorp/go-version v1.3.0 // indirect + github.com/hashicorp/go-version v1.3.0 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/kr/text v0.2.0 // indirect github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 @@ -25,7 +25,7 @@ require ( github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/opencontainers/image-spec v1.0.1 // indirect + github.com/opencontainers/image-spec v1.0.1 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 github.com/sirupsen/logrus v1.8.0 github.com/spf13/cobra v1.1.3 From 9460d715539ae40d2ddf8d5d03bb209435a2978c Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Thu, 24 Jun 2021 20:52:06 -0700 Subject: [PATCH 085/645] Update documentation (#117) Signed-off-by: Flyte-Bot Co-authored-by: kumare3 --- flytectl/docs/source/gen/flytectl.rst | 1 + .../docs/source/gen/flytectl_completion.rst | 77 +++++++++++++++++++ flytectl/docs/source/gen/flytectl_sandbox.rst | 1 + .../source/gen/flytectl_sandbox_start.rst | 4 +- .../source/gen/flytectl_sandbox_status.rst | 48 ++++++++++++ 5 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 flytectl/docs/source/gen/flytectl_completion.rst create mode 100644 flytectl/docs/source/gen/flytectl_sandbox_status.rst diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index f740989c59..a2317e1182 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -25,6 +25,7 @@ Options SEE ALSO ~~~~~~~~ +* :doc:`flytectl_completion` - Generate completion script * :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. * :doc:`flytectl_create` - Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst new file mode 100644 index 0000000000..bedc92ff41 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -0,0 +1,77 @@ +.. _flytectl_completion: + +flytectl completion +------------------- + +Generate completion script + +Synopsis +~~~~~~~~ + + +To load completions: + +Bash: + + $ source <(flytectl completion bash) + + # To load completions for each session, execute once: + # Linux: + $ flytectl completion bash > /etc/bash_completion.d/flytectl + # macOS: + $ flytectl completion bash > /usr/local/etc/bash_completion.d/flytectl + +Zsh: + + # If shell completion is not already enabled in your environment, + # you will need to enable it. You can execute the following once: + + $ echo "autoload -U compinit; compinit" >> ~/.zshrc + + # To load completions for each session, execute once: + $ flytectl completion zsh > "${fpath[1]}/_flytectl" + + # You will need to start a new shell for this setup to take effect. + +fish: + + $ flytectl completion fish | source + + # To load completions for each session, execute once: + $ flytectl completion fish > ~/.config/fish/completions/flytectl.fish + +PowerShell: + + PS> flytectl completion powershell | Out-String | Invoke-Expression + + # To load completions for every new session, run: + PS> flytectl completion powershell > flytectl.ps1 + # and source this file from your PowerShell profile. + + +:: + + flytectl completion [bash|zsh|fish|powershell] + +Options +~~~~~~~ + +:: + + -h, --help help for completion + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - flyetcl CLI tool + diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 523c26c84a..bb687e27d5 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -44,5 +44,6 @@ SEE ALSO * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_sandbox_start` - Start the flyte sandbox +* :doc:`flytectl_sandbox_status` - Get the status of the sandbox environment. * :doc:`flytectl_sandbox_teardown` - Teardown will cleanup the sandbox environment diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 201a3d4e59..a4d171c7b8 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -18,7 +18,7 @@ Start will run the flyte sandbox cluster inside a docker container and setup the Mount your flytesnacks repository code inside sandbox :: - bin/flytectl sandbox start --sourcesPath=$HOME/flyteorg/flytesnacks + bin/flytectl sandbox start --sourcesPath=$HOME/flyteorg/flytesnacks Usage @@ -31,7 +31,7 @@ Options :: - --sourcesPath string Path to your source code path where flyte workflows and tasks are. + --flytesnacks string Path of your flytesnacks repository -h, --help help for start Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst new file mode 100644 index 0000000000..0f85f86437 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -0,0 +1,48 @@ +.. _flytectl_sandbox_status: + +flytectl sandbox status +----------------------- + +Get the status of the sandbox environment. + +Synopsis +~~~~~~~~ + + + +Status will retrieve the status of the Sandbox environment. Currently FlyteSandbox runs as a local docker container. +This will return the docker status for this container + +Usage +:: + + bin/flytectl sandbox status + + + +:: + + flytectl sandbox status [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for status + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_sandbox` - Used for testing flyte sandbox. + From bc3df4dcf4f2f0171041e1bde7540423783f1877 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Fri, 25 Jun 2021 20:27:25 +0530 Subject: [PATCH 086/645] Rename flag in sandbox (#119) * Rename flag name in sandbox Signed-off-by: Yuvraj Date: Mon, 28 Jun 2021 11:22:38 -0700 Subject: [PATCH 087/645] Update CONTRIBUTING.md (#118) Fixing broken link on line 3 Signed-off-by: wild-endeavor --- flytectl/docs/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/docs/CONTRIBUTING.md b/flytectl/docs/CONTRIBUTING.md index 7aecdba71e..1f93087df8 100644 --- a/flytectl/docs/CONTRIBUTING.md +++ b/flytectl/docs/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Developing FlyteCtl -A local cluster can be setup via --> https://lyft.github.io/flyte/administrator/install/getting_started.html#getting-started +A local cluster can be setup via --> https://docs.flyte.org/en/latest/getting_started.html Then, if having trouble connecting to local cluster see the following: From 8b1c8446fbe4131df9c2ecb4c46a98940c99f323 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Thu, 1 Jul 2021 00:41:57 +0530 Subject: [PATCH 088/645] Added exec command in sandbox (#122) * Added exec command Signed-off-by: Yuvraj --- flytectl/cmd/sandbox/exec.go | 45 +++++++ flytectl/cmd/sandbox/exec_test.go | 72 +++++++++++ flytectl/cmd/sandbox/sandbox.go | 3 + flytectl/cmd/sandbox/sandbox_test.go | 24 ++-- flytectl/go.mod | 2 + flytectl/go.sum | 6 +- flytectl/pkg/docker/docker.go | 3 + .../{sandbox_util.go => docker_util.go} | 31 +++++ ...ndbox_util_test.go => docker_util_test.go} | 57 +++++++++ flytectl/pkg/docker/mocks/docker.go | 117 ++++++++++++++++++ 10 files changed, 348 insertions(+), 12 deletions(-) create mode 100644 flytectl/cmd/sandbox/exec.go create mode 100644 flytectl/cmd/sandbox/exec_test.go rename flytectl/pkg/docker/{sandbox_util.go => docker_util.go} (87%) rename flytectl/pkg/docker/{sandbox_util_test.go => docker_util_test.go} (83%) diff --git a/flytectl/cmd/sandbox/exec.go b/flytectl/cmd/sandbox/exec.go new file mode 100644 index 0000000000..804d54b6c6 --- /dev/null +++ b/flytectl/cmd/sandbox/exec.go @@ -0,0 +1,45 @@ +package sandbox + +import ( + "context" + "fmt" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/docker" +) + +const ( + execShort = "Execute any command in sandbox" + execLong = ` +Execute command will Will run non-interactive commands and return immediately with the output. + +:: + bin/flytectl sandbox exec -- ls -al + +Usage` +) + +func sandboxClusterExec(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + cli, err := docker.GetDockerClient() + if err != nil { + return err + } + if len(args) > 0 { + return Execute(ctx, cli, args) + } + return fmt.Errorf("missing argument. Please check usage examples by running flytectl sandbox exec --help") +} + +func Execute(ctx context.Context, cli docker.Docker, args []string) error { + c := docker.GetSandbox(ctx, cli) + if c != nil { + exec, err := docker.ExecCommend(ctx, cli, c.ID, args) + if err != nil { + return err + } + if err := docker.InspectExecResp(ctx, cli, exec.ID); err != nil { + return err + } + } + return nil +} diff --git a/flytectl/cmd/sandbox/exec_test.go b/flytectl/cmd/sandbox/exec_test.go new file mode 100644 index 0000000000..4aa0e2148a --- /dev/null +++ b/flytectl/cmd/sandbox/exec_test.go @@ -0,0 +1,72 @@ +package sandbox + +import ( + "bufio" + "context" + "fmt" + "io" + "strings" + "testing" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/stretchr/testify/assert" + + "github.com/docker/docker/api/types" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/stretchr/testify/mock" +) + +func TestSandboxClusterExec(t *testing.T) { + mockDocker := &mocks.Docker{} + mockOutStream := new(io.Writer) + ctx := context.Background() + cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + reader := bufio.NewReader(strings.NewReader("test")) + + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + docker.ExecConfig.Cmd = []string{"ls -al"} + mockDocker.OnContainerExecCreateMatch(ctx, mock.Anything, docker.ExecConfig).Return(types.IDResponse{}, nil) + mockDocker.OnContainerExecInspectMatch(ctx, mock.Anything).Return(types.ContainerExecInspect{}, nil) + mockDocker.OnContainerExecAttachMatch(ctx, mock.Anything, types.ExecStartCheck{}).Return(types.HijackedResponse{ + Reader: reader, + }, fmt.Errorf("Test")) + docker.Client = mockDocker + err := sandboxClusterExec(ctx, []string{"ls -al"}, cmdCtx) + + assert.NotNil(t, err) +} + +func TestSandboxClusterExecWithoutCmd(t *testing.T) { + mockDocker := &mocks.Docker{} + mockOutStream := new(io.Writer) + ctx := context.Background() + cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + reader := bufio.NewReader(strings.NewReader("test")) + + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + docker.ExecConfig.Cmd = []string{} + mockDocker.OnContainerExecCreateMatch(ctx, mock.Anything, docker.ExecConfig).Return(types.IDResponse{}, nil) + mockDocker.OnContainerExecInspectMatch(ctx, mock.Anything).Return(types.ContainerExecInspect{}, nil) + mockDocker.OnContainerExecAttachMatch(ctx, mock.Anything, types.ExecStartCheck{}).Return(types.HijackedResponse{ + Reader: reader, + }, fmt.Errorf("Test")) + docker.Client = mockDocker + err := sandboxClusterExec(ctx, []string{}, cmdCtx) + + assert.NotNil(t, err) +} diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go index 7ee1f37cb6..233f4f0eba 100644 --- a/flytectl/cmd/sandbox/sandbox.go +++ b/flytectl/cmd/sandbox/sandbox.go @@ -41,6 +41,9 @@ func CreateSandboxCommand() *cobra.Command { "status": {CmdFunc: sandboxClusterStatus, Aliases: []string{}, ProjectDomainNotRequired: true, Short: statusShort, Long: statusLong}, + "exec": {CmdFunc: sandboxClusterExec, Aliases: []string{}, ProjectDomainNotRequired: true, + Short: execShort, + Long: execLong, PFlagProvider: sandboxConfig.DefaultConfig}, } cmdcore.AddCommands(sandbox, sandboxResourcesFuncs) diff --git a/flytectl/cmd/sandbox/sandbox_test.go b/flytectl/cmd/sandbox/sandbox_test.go index 8537f434e9..640390c137 100644 --- a/flytectl/cmd/sandbox/sandbox_test.go +++ b/flytectl/cmd/sandbox/sandbox_test.go @@ -13,23 +13,27 @@ func TestCreateSandboxCommand(t *testing.T) { assert.Equal(t, sandboxCommand.Use, "sandbox") assert.Equal(t, sandboxCommand.Short, "Used for testing flyte sandbox.") fmt.Println(sandboxCommand.Commands()) - assert.Equal(t, len(sandboxCommand.Commands()), 3) + assert.Equal(t, len(sandboxCommand.Commands()), 4) cmdNouns := sandboxCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - assert.Equal(t, cmdNouns[0].Use, "start") - assert.Equal(t, cmdNouns[0].Short, startShort) - assert.Equal(t, cmdNouns[0].Long, startLong) + assert.Equal(t, cmdNouns[0].Use, "exec") + assert.Equal(t, cmdNouns[0].Short, execShort) + assert.Equal(t, cmdNouns[0].Long, execLong) - assert.Equal(t, cmdNouns[1].Use, "status") - assert.Equal(t, cmdNouns[1].Short, statusShort) - assert.Equal(t, cmdNouns[1].Long, statusLong) + assert.Equal(t, cmdNouns[1].Use, "start") + assert.Equal(t, cmdNouns[1].Short, startShort) + assert.Equal(t, cmdNouns[1].Long, startLong) - assert.Equal(t, cmdNouns[2].Use, "teardown") - assert.Equal(t, cmdNouns[2].Short, teardownShort) - assert.Equal(t, cmdNouns[2].Long, teardownLong) + assert.Equal(t, cmdNouns[2].Use, "status") + assert.Equal(t, cmdNouns[2].Short, statusShort) + assert.Equal(t, cmdNouns[2].Long, statusLong) + + assert.Equal(t, cmdNouns[3].Use, "teardown") + assert.Equal(t, cmdNouns[3].Short, teardownShort) + assert.Equal(t, cmdNouns[3].Long, teardownLong) } diff --git a/flytectl/go.mod b/flytectl/go.mod index 93af1fc05b..f944444102 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -13,9 +13,11 @@ require ( github.com/flyteorg/flytestdlib v0.3.24 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 + github.com/google/go-cmp v0.5.6 // indirect github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.2.0 + github.com/gorilla/mux v1.8.0 // indirect github.com/hashicorp/go-version v1.3.0 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/kr/text v0.2.0 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index d07374e6d8..6658e96614 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -438,8 +438,9 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -479,8 +480,9 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/flytectl/pkg/docker/docker.go b/flytectl/pkg/docker/docker.go index f33b3b5219..1cc53b6285 100644 --- a/flytectl/pkg/docker/docker.go +++ b/flytectl/pkg/docker/docker.go @@ -21,6 +21,9 @@ type Docker interface { ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) ContainerRemove(ctx context.Context, containerID string, options types.ContainerRemoveOptions) error ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) + ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) + ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) + ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) } type FlyteDocker struct { diff --git a/flytectl/pkg/docker/sandbox_util.go b/flytectl/pkg/docker/docker_util.go similarity index 87% rename from flytectl/pkg/docker/sandbox_util.go rename to flytectl/pkg/docker/docker_util.go index 4ce230581b..03e220879f 100644 --- a/flytectl/pkg/docker/sandbox_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -40,6 +40,15 @@ var ( Target: K3sDir, }, } + ExecConfig = types.ExecConfig{ + AttachStderr: true, + Tty: true, + WorkingDir: FlyteSnackDir, + AttachStdout: true, + Cmd: []string{}, + } + StdWriterPrefixLen = 8 + StartingBufLen = 32*1024 + StdWriterPrefixLen + 1 ) // SetupFlyteDir will create .flyte dir if not exist @@ -192,3 +201,25 @@ func GetDockerClient() (Docker, error) { } return Client, nil } + +// ExecCommend will execute a command in container and returns an execution id +func ExecCommend(ctx context.Context, cli Docker, containerID string, command []string) (types.IDResponse, error) { + ExecConfig.Cmd = command + r, err := cli.ContainerExecCreate(ctx, containerID, ExecConfig) + if err != nil { + return types.IDResponse{}, err + } + return r, err +} + +func InspectExecResp(ctx context.Context, cli Docker, containerID string) error { + resp, err := cli.ContainerExecAttach(ctx, containerID, types.ExecStartCheck{}) + if err != nil { + return err + } + s := bufio.NewScanner(resp.Reader) + for s.Scan() { + fmt.Println(s.Text()) + } + return nil +} diff --git a/flytectl/pkg/docker/sandbox_util_test.go b/flytectl/pkg/docker/docker_util_test.go similarity index 83% rename from flytectl/pkg/docker/sandbox_util_test.go rename to flytectl/pkg/docker/docker_util_test.go index b39e03f4f6..65004a2b0b 100644 --- a/flytectl/pkg/docker/sandbox_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -311,5 +311,62 @@ func TestDockerClient(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, cli) }) +} + +func TestDockerExec(t *testing.T) { + t.Run("Successfully exec command in container", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + Client = mockDocker + c := ExecConfig + c.Cmd = []string{"ls"} + mockDocker.OnContainerExecCreateMatch(ctx, mock.Anything, c).Return(types.IDResponse{}, nil) + _, err := ExecCommend(ctx, mockDocker, "test", []string{"ls"}) + assert.Nil(t, err) + }) + t.Run("Failed exec command in container", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + Client = mockDocker + c := ExecConfig + c.Cmd = []string{"ls"} + mockDocker.OnContainerExecCreateMatch(ctx, mock.Anything, c).Return(types.IDResponse{}, fmt.Errorf("test")) + _, err := ExecCommend(ctx, mockDocker, "test", []string{"ls"}) + assert.NotNil(t, err) + }) +} + +func TestInspectExecResp(t *testing.T) { + t.Run("Failed exec command in container", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + Client = mockDocker + c := ExecConfig + c.Cmd = []string{"ls"} + reader := bufio.NewReader(strings.NewReader("test")) + + mockDocker.OnContainerExecInspectMatch(ctx, mock.Anything).Return(types.ContainerExecInspect{}, nil) + mockDocker.OnContainerExecAttachMatch(ctx, mock.Anything, types.ExecStartCheck{}).Return(types.HijackedResponse{ + Reader: reader, + }, fmt.Errorf("err")) + + err := InspectExecResp(ctx, mockDocker, "test") + assert.NotNil(t, err) + }) + t.Run("Successfully exec command in container", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + Client = mockDocker + c := ExecConfig + c.Cmd = []string{"ls"} + reader := bufio.NewReader(strings.NewReader("test")) + + mockDocker.OnContainerExecAttachMatch(ctx, mock.Anything, types.ExecStartCheck{}).Return(types.HijackedResponse{ + Reader: reader, + }, nil) + + err := InspectExecResp(ctx, mockDocker, "test") + assert.Nil(t, err) + }) } diff --git a/flytectl/pkg/docker/mocks/docker.go b/flytectl/pkg/docker/mocks/docker.go index 917546fbee..9655d46a9c 100644 --- a/flytectl/pkg/docker/mocks/docker.go +++ b/flytectl/pkg/docker/mocks/docker.go @@ -62,6 +62,123 @@ func (_m *Docker) ContainerCreate(ctx context.Context, config *container.Config, return r0, r1 } +type Docker_ContainerExecAttach struct { + *mock.Call +} + +func (_m Docker_ContainerExecAttach) Return(_a0 types.HijackedResponse, _a1 error) *Docker_ContainerExecAttach { + return &Docker_ContainerExecAttach{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) *Docker_ContainerExecAttach { + c := _m.On("ContainerExecAttach", ctx, execID, config) + return &Docker_ContainerExecAttach{Call: c} +} + +func (_m *Docker) OnContainerExecAttachMatch(matchers ...interface{}) *Docker_ContainerExecAttach { + c := _m.On("ContainerExecAttach", matchers...) + return &Docker_ContainerExecAttach{Call: c} +} + +// ContainerExecAttach provides a mock function with given fields: ctx, execID, config +func (_m *Docker) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) { + ret := _m.Called(ctx, execID, config) + + var r0 types.HijackedResponse + if rf, ok := ret.Get(0).(func(context.Context, string, types.ExecStartCheck) types.HijackedResponse); ok { + r0 = rf(ctx, execID, config) + } else { + r0 = ret.Get(0).(types.HijackedResponse) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, types.ExecStartCheck) error); ok { + r1 = rf(ctx, execID, config) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type Docker_ContainerExecCreate struct { + *mock.Call +} + +func (_m Docker_ContainerExecCreate) Return(_a0 types.IDResponse, _a1 error) *Docker_ContainerExecCreate { + return &Docker_ContainerExecCreate{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnContainerExecCreate(ctx context.Context, _a1 string, config types.ExecConfig) *Docker_ContainerExecCreate { + c := _m.On("ContainerExecCreate", ctx, _a1, config) + return &Docker_ContainerExecCreate{Call: c} +} + +func (_m *Docker) OnContainerExecCreateMatch(matchers ...interface{}) *Docker_ContainerExecCreate { + c := _m.On("ContainerExecCreate", matchers...) + return &Docker_ContainerExecCreate{Call: c} +} + +// ContainerExecCreate provides a mock function with given fields: ctx, _a1, config +func (_m *Docker) ContainerExecCreate(ctx context.Context, _a1 string, config types.ExecConfig) (types.IDResponse, error) { + ret := _m.Called(ctx, _a1, config) + + var r0 types.IDResponse + if rf, ok := ret.Get(0).(func(context.Context, string, types.ExecConfig) types.IDResponse); ok { + r0 = rf(ctx, _a1, config) + } else { + r0 = ret.Get(0).(types.IDResponse) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, types.ExecConfig) error); ok { + r1 = rf(ctx, _a1, config) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type Docker_ContainerExecInspect struct { + *mock.Call +} + +func (_m Docker_ContainerExecInspect) Return(_a0 types.ContainerExecInspect, _a1 error) *Docker_ContainerExecInspect { + return &Docker_ContainerExecInspect{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnContainerExecInspect(ctx context.Context, execID string) *Docker_ContainerExecInspect { + c := _m.On("ContainerExecInspect", ctx, execID) + return &Docker_ContainerExecInspect{Call: c} +} + +func (_m *Docker) OnContainerExecInspectMatch(matchers ...interface{}) *Docker_ContainerExecInspect { + c := _m.On("ContainerExecInspect", matchers...) + return &Docker_ContainerExecInspect{Call: c} +} + +// ContainerExecInspect provides a mock function with given fields: ctx, execID +func (_m *Docker) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) { + ret := _m.Called(ctx, execID) + + var r0 types.ContainerExecInspect + if rf, ok := ret.Get(0).(func(context.Context, string) types.ContainerExecInspect); ok { + r0 = rf(ctx, execID) + } else { + r0 = ret.Get(0).(types.ContainerExecInspect) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, execID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type Docker_ContainerList struct { *mock.Call } From 19ba5fd4f0b2c5cd1f1ec9524db8760543db1cf2 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Thu, 1 Jul 2021 19:22:33 +0530 Subject: [PATCH 089/645] Added fast register functionality (#112) --- flytectl/.github/workflows/build.yaml | 2 + .../subcommand/register/files_config.go | 1 + .../subcommand/register/filesconfig_flags.go | 1 + .../register/filesconfig_flags_test.go | 14 ++ .../config/subcommand/sandbox/config_flags.go | 39 +---- .../subcommand/sandbox/config_flags_test.go | 8 +- .../subcommand/sandbox/sandbox_config.go | 4 +- flytectl/cmd/register/examples.go | 8 +- flytectl/cmd/register/examples_test.go | 26 +++ flytectl/cmd/register/files.go | 60 +++++-- flytectl/cmd/register/files_test.go | 110 ++++++++++++- flytectl/cmd/register/register_util.go | 153 ++++++++++++++++-- flytectl/cmd/register/register_util_test.go | 144 +++++++++++++---- .../cmd/register/testdata/flyte-package.tgz | Bin 0 -> 162434 bytes .../register/testdata/flytesnacks-core.tgz | Bin 0 -> 51076 bytes .../cmd/register/testdata/invalid-fast.tgz | Bin 0 -> 56964 bytes .../register/testdata/valid-fast-register.tgz | Bin 0 -> 57086 bytes flytectl/cmd/sandbox/start.go | 4 +- flytectl/cmd/sandbox/start_test.go | 28 ++-- flytectl/config.yaml | 13 +- flytectl/go.mod | 4 +- flytectl/go.sum | 114 ++++++++++++- 22 files changed, 611 insertions(+), 122 deletions(-) create mode 100644 flytectl/cmd/register/examples_test.go create mode 100644 flytectl/cmd/register/testdata/flyte-package.tgz create mode 100644 flytectl/cmd/register/testdata/flytesnacks-core.tgz create mode 100644 flytectl/cmd/register/testdata/invalid-fast.tgz create mode 100644 flytectl/cmd/register/testdata/valid-fast-register.tgz diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml index 2b70c73f27..efdceac3d7 100644 --- a/flytectl/.github/workflows/build.yaml +++ b/flytectl/.github/workflows/build.yaml @@ -12,6 +12,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + with: + fetch-depth: "0" - uses: actions/cache@v2 with: path: | diff --git a/flytectl/cmd/config/subcommand/register/files_config.go b/flytectl/cmd/config/subcommand/register/files_config.go index a384ec83d5..b43232e6c1 100644 --- a/flytectl/cmd/config/subcommand/register/files_config.go +++ b/flytectl/cmd/config/subcommand/register/files_config.go @@ -17,4 +17,5 @@ type FilesConfig struct { AssumableIamRole string `json:"assumableIamRole" pflag:", custom assumable iam auth role to register launch plans with."` K8ServiceAccount string `json:"k8ServiceAccount" pflag:", custom kubernetes service account auth role to register launch plans with."` OutputLocationPrefix string `json:"outputLocationPrefix" pflag:", custom output location prefix for offloaded types (files/schemas)."` + SourceUploadPath string `json:"sourceUploadPath" pflag:", Location for source code in storage."` } diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go index ffcb0d7ec4..a28aead6e5 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go @@ -19,5 +19,6 @@ func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVarP(&DefaultFilesConfig.AssumableIamRole, fmt.Sprintf("%v%v", prefix, "assumableIamRole"), "i", DefaultFilesConfig.AssumableIamRole, " Custom assumable iam auth role to register launch plans with.") cmdFlags.StringVarP(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), "k", DefaultFilesConfig.K8ServiceAccount, " custom kubernetes service account auth role to register launch plans with.") cmdFlags.StringVarP(&DefaultFilesConfig.OutputLocationPrefix, fmt.Sprintf("%v%v", prefix, "outputLocationPrefix"), "l", DefaultFilesConfig.OutputLocationPrefix, " custom output location prefix for offloaded types (files/schemas).") + cmdFlags.StringVar(&DefaultFilesConfig.SourceUploadPath, fmt.Sprintf("%v%v", prefix, "sourceUploadPath"), DefaultFilesConfig.SourceUploadPath, " Location for source code in storage.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go index 56a85f9234..9b2340ca5d 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go @@ -183,4 +183,18 @@ func TestFilesConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_sourceUploadPath", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("sourceUploadPath", testValue) + if vString, err := cmdFlags.GetString("sourceUploadPath"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vString), &actual.SourceUploadPath) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index 8e84ee97fe..ebecc0a5b9 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -4,52 +4,15 @@ package sandbox import ( - "encoding/json" - "reflect" - "fmt" "github.com/spf13/pflag" ) -// If v is a pointer, it will get its element value or the zero value of the element type. -// If v is not a pointer, it will return it as is. -func (Config) elemValueOrNil(v interface{}) interface{} { - if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { - if reflect.ValueOf(v).IsNil() { - return reflect.Zero(t.Elem()).Interface() - } else { - return reflect.ValueOf(v).Interface() - } - } else if v == nil { - return reflect.Zero(t).Interface() - } - - return v -} - -func (Config) mustJsonMarshal(v interface{}) string { - raw, err := json.Marshal(v) - if err != nil { - panic(err) - } - - return string(raw) -} - -func (Config) mustMarshalJSON(v json.Marshaler) string { - raw, err := v.MarshalJSON() - if err != nil { - panic(err) - } - - return string(raw) -} - // GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&DefaultConfig.SourcesPath, fmt.Sprintf("%v%v", prefix, "sourcesPath"), DefaultConfig.SourcesPath, "Path to your source code path where flyte workflows and tasks are.") + cmdFlags.StringVar(&DefaultConfig.Source, fmt.Sprintf("%v%v", prefix, "source"), DefaultConfig.Source, " Path of your source code") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index 9f4775e8e5..09d41aa631 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -99,14 +99,14 @@ func TestConfig_SetFlags(t *testing.T) { cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) - t.Run("Test_sourcesPath", func(t *testing.T) { + t.Run("Test_source", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("sourcesPath", testValue) - if vString, err := cmdFlags.GetString("sourcesPath"); err == nil { - testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.SourcesPath) + cmdFlags.Set("source", testValue) + if vString, err := cmdFlags.GetString("source"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Source) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index 87b1ea9cb0..afe85beddf 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -5,7 +5,7 @@ var ( DefaultConfig = &Config{} ) -// Config represents the config parameters exposed for the `sandbox` command. +//Config type Config struct { - SourcesPath string `json:"sourcesPath" pflag:",Path to your source code path where flyte workflows and tasks are."` + Source string `json:"source" pflag:", Path of your source code"` } diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index 9de4cfcf86..0952571c12 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -19,19 +19,21 @@ Registers all latest flytesnacks example Usage ` +) + +var ( githubOrg = "flyteorg" githubRepository = "flytesnacks" - archive = true snackReleaseURL = "https://github.com/flyteorg/flytesnacks/releases/download/%s/flytesnacks-%s.tgz" flyteManifest = "https://github.com/flyteorg/flytesnacks/releases/download/%s/flyte_tests_manifest.json" ) func registerExamplesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - flytesnacks, tag, err := getFlyteTestManifest() + flytesnacks, tag, err := getFlyteTestManifest(githubOrg, githubRepository) if err != nil { return err } - rconfig.DefaultFilesConfig.Archive = archive + rconfig.DefaultFilesConfig.Archive = true for _, v := range flytesnacks { args := []string{ fmt.Sprintf(snackReleaseURL, tag, v.Name), diff --git a/flytectl/cmd/register/examples_test.go b/flytectl/cmd/register/examples_test.go new file mode 100644 index 0000000000..1c004a74a9 --- /dev/null +++ b/flytectl/cmd/register/examples_test.go @@ -0,0 +1,26 @@ +package register + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRegisterExamplesFunc(t *testing.T) { + setup() + registerFilesSetup() + args = []string{""} + err := registerExamplesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) +} +func TestRegisterExamplesFuncErr(t *testing.T) { + setup() + registerFilesSetup() + githubRepository = "testingsnacks" + args = []string{""} + + err := registerExamplesFunc(ctx, args, cmdCtx) + // TODO (Yuvraj) make test to success after fixing flytesnacks bug + assert.NotNil(t, err) + githubRepository = "flytesnacks" +} diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index a33d7eea78..d758adce98 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -3,7 +3,9 @@ package register import ( "context" "encoding/json" + "fmt" "os" + "path/filepath" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -19,7 +21,18 @@ If there are already registered entities with v1 version then the command will f :: bin/flytectl register file _pb_output/* -d development -p flytesnacks + +There is no difference between registration and fast registration, In fast registration, the input provided by the user is fast serialized proto that is generated by pyflyte. If Flytectl finds any source code in users's input then it will consider registration as fast registration. Flytectl finds input file by searching an archive file whose name starts with fast and has .tar.gz extension When the user runs pyflyte with --fast flag then pyflyte creates serialize proto and it also archive create source code archive file in the same directory. +SourceUploadPath is an optional flag. By default, flytectl will create SourceUploadPath from your storage config. In case of s3 flytectl will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 + +In case of fast registration, If the SourceUploadPath flag is defined then In this case flytectl will not use the default directory for uploading the source code, it will override the destination path on the registration +:: + bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 --SourceUploadPath="s3://dummy/fast" + Using archive file.Currently supported are .tgz and .tar extension files and can be local or remote file served through http/https. Use --archive flag. @@ -33,8 +46,7 @@ Using local tgz file. bin/flytectl register files _pb_output.tgz -d development -p flytesnacks --archive -If you want to continue executing registration on other files ignoring the errors including version conflicts then pass in -the continueOnError flag. +If you want to continue executing registration on other files ignoring the errors including version conflicts then pass in the continueOnError flag. :: @@ -73,9 +85,10 @@ Override Output location prefix during registration. :: bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -l "s3://dummy/prefix" - + Usage ` + sourceCodeExtension = ".tar.gz" ) func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { @@ -83,17 +96,42 @@ func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.Co } func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - dataRefs, tmpDir, _err := getSortedFileList(ctx, args) - if _err != nil { - logger.Errorf(ctx, "error while un-archiving files in tmp dir due to %v", _err) - return _err + var _err error + var dataRefs []string + + // getSerializeOutputFiles will return you all proto and source code compress file in sorted order + dataRefs, tmpDir, err := getSerializeOutputFiles(ctx, args) + if err != nil { + logger.Errorf(ctx, "error while un-archiving files in tmp dir due to %v", err) + return err + } + logger.Infof(ctx, "Parsing file... Total(%v)", len(dataRefs)) + + // It will segregate serialize output files in valid proto,Invalid files if have any and source code(In case of fast serialize input files) + sourceCode, validProto, InvalidFiles := segregateSourceAndProtos(dataRefs) + + // If any invalid files provide in input then through an error + if len(InvalidFiles) > 0 { + return fmt.Errorf("input package have some invalid files. try to run pyflyte package again %v", InvalidFiles) + } + + // In case of fast serialize input upload source code to destination bucket + var sourceCodeName string + if len(sourceCode) > 0 { + logger.Infof(ctx, "Fast Registration detected") + _, sourceCodeName = filepath.Split(sourceCode) + if err = uploadFastRegisterArtifact(ctx, sourceCode, sourceCodeName, rconfig.DefaultFilesConfig.Version); err != nil { + return fmt.Errorf("please check your Storage Config. It failed while uploading the source code. %v", err) + } + logger.Infof(ctx, "Source code successfully uploaded %v/%v ", rconfig.DefaultFilesConfig.SourceUploadPath, sourceCodeName) } - logger.Infof(ctx, "Parsing files... Total(%v)", len(dataRefs)) - fastFail := !rconfig.DefaultFilesConfig.ContinueOnError + var registerResults []Result - for i := 0; i < len(dataRefs) && !(fastFail && _err != nil); i++ { - registerResults, _err = registerFile(ctx, dataRefs[i], registerResults, cmdCtx) + fastFail := rconfig.DefaultFilesConfig.ContinueOnError + for i := 0; i < len(validProto) && !(fastFail && _err != nil); i++ { + registerResults, _err = registerFile(ctx, validProto[i], sourceCodeName, registerResults, cmdCtx) } + payload, _ := json.Marshal(registerResults) registerPrinter := printer.Printer{} _ = registerPrinter.JSONToTable(payload, projectColumns) diff --git a/flytectl/cmd/register/files_test.go b/flytectl/cmd/register/files_test.go index b1ead898a7..c79c1259d2 100644 --- a/flytectl/cmd/register/files_test.go +++ b/flytectl/cmd/register/files_test.go @@ -3,12 +3,21 @@ package register import ( "testing" + "github.com/flyteorg/flytestdlib/contextutils" + "github.com/flyteorg/flytestdlib/promutils/labeled" + "github.com/flyteorg/flytestdlib/storage" + rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" + "github.com/flyteorg/flytestdlib/promutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) +const ( + s3Output = "s3://dummy/prefix" +) + func TestRegisterFromFiles(t *testing.T) { t.Run("Valid registration", func(t *testing.T) { setup() @@ -21,12 +30,107 @@ func TestRegisterFromFiles(t *testing.T) { err := registerFromFilesFunc(ctx, args, cmdCtx) assert.Nil(t, err) }) - t.Run("Invalid registration file", func(t *testing.T) { + t.Run("Valid fast registration", func(t *testing.T) { setup() + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"testdata/invalid.tar"} - err := registerFromFilesFunc(ctx, args, cmdCtx) + rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output + rconfig.DefaultFilesConfig.SourceUploadPath = s3Output + mockStorage, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + assert.Nil(t, err) + Client = mockStorage + + args = []string{"testdata/flytesnacks-core.tgz"} + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + + err = registerFromFilesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + }) + t.Run("Failed fast registration while uploading the codebase", func(t *testing.T) { + setup() + registerFilesSetup() + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + rconfig.DefaultFilesConfig.Archive = true + rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output + s, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + assert.Nil(t, err) + Client = s + args = []string{"testdata/flytesnacks-core.tgz"} + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + err = Register(ctx, args, cmdCtx) + assert.Nil(t, err) + }) + t.Run("Failed registeration because of invalid files", func(t *testing.T) { + setup() + registerFilesSetup() + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + rconfig.DefaultFilesConfig.Archive = true + rconfig.DefaultFilesConfig.SourceUploadPath = "" + s, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + Client = s + assert.Nil(t, err) + args = []string{"testdata/invalid-fast.tgz"} + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + err = registerFromFilesFunc(ctx, args, cmdCtx) assert.NotNil(t, err) }) + + t.Run("Valid registration of fast serialize", func(t *testing.T) { + setup() + registerFilesSetup() + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + rconfig.DefaultFilesConfig.Archive = true + + rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output + rconfig.DefaultFilesConfig.SourceUploadPath = s3Output + s, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + Client = s + assert.Nil(t, err) + args = []string{"testdata/flytesnacks-core.tgz"} + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + err = registerFromFilesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + }) + + t.Run("Registration with proto files ", func(t *testing.T) { + setup() + registerFilesSetup() + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + rconfig.DefaultFilesConfig.Archive = false + rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output + rconfig.DefaultFilesConfig.SourceUploadPath = "" + s, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + Client = s + assert.Nil(t, err) + args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + err = registerFromFilesFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + }) } diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 8f3883a573..14dfa4be62 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -11,9 +11,14 @@ import ( "io/ioutil" "net/http" "os" + "path/filepath" "sort" "strings" + "github.com/flyteorg/flytestdlib/contextutils" + "github.com/flyteorg/flytestdlib/promutils" + "github.com/flyteorg/flytestdlib/promutils/labeled" + "github.com/google/go-github/github" "github.com/flyteorg/flytectl/cmd/config" @@ -31,10 +36,14 @@ import ( "google.golang.org/grpc/status" ) +// Variable define in serialized proto that needs to be replace in registration time const registrationProjectPattern = "{{ registration.project }}" const registrationDomainPattern = "{{ registration.domain }}" const registrationVersionPattern = "{{ registration.version }}" +// Additional variable define in fast serialized proto that needs to be replace in registration time +const registrationRemotePackagePattern = "{{ .remote_package_path }}" + type Result struct { Name string Status string @@ -47,6 +56,7 @@ type HTTPClient interface { } var FlyteSnacksRelease []FlyteSnack +var Client *storage.DataStore // FlyteSnack Defines flyte test manifest structure type FlyteSnack struct { @@ -200,6 +210,21 @@ func hydrateIdentifier(identifier *core.Identifier) { } } +func hydrateTaskSpec(task *admin.TaskSpec, sourceCode string) error { + if task.Template.GetContainer() != nil { + for k := range task.Template.GetContainer().Args { + if task.Template.GetContainer().Args[k] == "" || task.Template.GetContainer().Args[k] == registrationRemotePackagePattern { + remotePath, err := getRemoteStoragePath(context.Background(), Client, rconfig.DefaultFilesConfig.SourceUploadPath, sourceCode, rconfig.DefaultFilesConfig.Version) + if err != nil { + return err + } + task.Template.GetContainer().Args[k] = string(remotePath) + } + } + } + return nil +} + func hydrateLaunchPlanSpec(lpSpec *admin.LaunchPlanSpec) { assumableIamRole := len(rconfig.DefaultFilesConfig.AssumableIamRole) > 0 k8ServiceAcct := len(rconfig.DefaultFilesConfig.K8ServiceAccount) > 0 @@ -217,7 +242,7 @@ func hydrateLaunchPlanSpec(lpSpec *admin.LaunchPlanSpec) { } } -func hydrateSpec(message proto.Message) error { +func hydrateSpec(message proto.Message, sourceCode string) error { switch v := message.(type) { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) @@ -242,8 +267,13 @@ func hydrateSpec(message proto.Message) error { case *admin.TaskSpec: taskSpec := message.(*admin.TaskSpec) hydrateIdentifier(taskSpec.Template.Id) + // In case of fast serialize input proto also have on additional variable to substitute i.e destination bucket for source code + if err := hydrateTaskSpec(taskSpec, sourceCode); err != nil { + return err + } + default: - return fmt.Errorf("Unknown type %T", v) + return fmt.Errorf("unknown type %T", v) } return nil } @@ -261,29 +291,30 @@ func DownloadFileFromHTTP(ctx context.Context, ref storage.DataReference) (io.Re } /* -Get file list from the args list. -If the archive flag is on then download the archives to temp directory and extract it. +Get serialize output file list from the args list. +If the archive flag is on then download the archives to temp directory and extract it. In case of fast register it will also return the compressed source code The o/p of this function would be sorted list of the file locations. */ -func getSortedFileList(ctx context.Context, args []string) ([]string, string, error) { +func getSerializeOutputFiles(ctx context.Context, args []string) ([]string, string, error) { if !rconfig.DefaultFilesConfig.Archive { /* * Sorting is required for non-archived case since its possible for the user to pass in a list of unordered * serialized protobuf files , but flyte expects them to be registered in topologically sorted order that it had * generated otherwise the registration can fail if the dependent files are not registered earlier. */ + sort.Strings(args) return args, "", nil } + tempDir, err := ioutil.TempDir("/tmp", "register") if err != nil { return nil, tempDir, err } - dataRefs := args var unarchivedFiles []string - for i := 0; i < len(dataRefs); i++ { - dataRefReaderCloser, err := getArchiveReaderCloser(ctx, dataRefs[i]) + for _, v := range args { + dataRefReaderCloser, err := getArchiveReaderCloser(ctx, v) if err != nil { return unarchivedFiles, tempDir, err } @@ -295,6 +326,7 @@ func getSortedFileList(ctx context.Context, args []string) ([]string, string, er return unarchivedFiles, tempDir, err } } + /* * Similarly in case of archived files, it possible to have an archive created in totally different order than the * listing order of the serialized files which is required by flyte. Hence we explicitly sort here after unarchiving it. @@ -338,10 +370,11 @@ func readAndCopyArchive(src io.Reader, tempDir string, unarchivedFiles []string) } } -func registerFile(ctx context.Context, fileName string, registerResults []Result, cmdCtx cmdCore.CommandContext) ([]Result, error) { +func registerFile(ctx context.Context, fileName, sourceCode string, registerResults []Result, cmdCtx cmdCore.CommandContext) ([]Result, error) { var registerResult Result var fileContents []byte var err error + if fileContents, err = ioutil.ReadFile(fileName); err != nil { registerResults = append(registerResults, Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error reading file due to %v", err)}) return registerResults, err @@ -352,12 +385,15 @@ func registerFile(ctx context.Context, fileName string, registerResults []Result registerResults = append(registerResults, registerResult) return registerResults, err } - if err := hydrateSpec(spec); err != nil { + + if err := hydrateSpec(spec, sourceCode); err != nil { registerResult = Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error hydrating spec due to %v", err)} registerResults = append(registerResults, registerResult) return registerResults, err } + logger.Debugf(ctx, "Hydrated spec : %v", getJSONSpec(spec)) + if err := register(ctx, spec, cmdCtx); err != nil { // If error is AlreadyExists then dont consider this to be an error but just a warning state if grpcError := status.Code(err); grpcError == codes.AlreadyExists { @@ -369,6 +405,7 @@ func registerFile(ctx context.Context, fileName string, registerResults []Result registerResults = append(registerResults, registerResult) return registerResults, err } + registerResult = Result{Name: fileName, Status: "Success", Info: "Successfully registered file"} logger.Debugf(ctx, "Successfully registered %v", fileName) registerResults = append(registerResults, registerResult) @@ -383,10 +420,12 @@ func getArchiveReaderCloser(ctx context.Context, ref string) (io.ReadCloser, err if err != nil { return nil, err } + var dataRefReaderCloser io.ReadCloser + if ext != "tar" && ext != "tgz" { return nil, errors.New("only .tar and .tgz extension archives are supported") } - var dataRefReaderCloser io.ReadCloser + if scheme == "http" || scheme == "https" { dataRefReaderCloser, err = DownloadFileFromHTTP(ctx, dataRef) } else { @@ -414,13 +453,16 @@ func getJSONSpec(message proto.Message) string { return jsonSpec } -func getFlyteTestManifest() ([]FlyteSnack, string, error) { +func getFlyteTestManifest(org, repository string) ([]FlyteSnack, string, error) { c := github.NewClient(nil) opt := &github.ListOptions{Page: 1, PerPage: 1} - releases, _, err := c.Repositories.ListReleases(context.Background(), githubOrg, githubRepository, opt) + releases, _, err := c.Repositories.ListReleases(context.Background(), org, repository, opt) if err != nil { return nil, "", err } + if len(releases) == 0 { + return nil, "", fmt.Errorf("Repository doesn't have any release") + } response, err := http.Get(fmt.Sprintf(flyteManifest, *releases[0].TagName)) if err != nil { return nil, "", err @@ -437,4 +479,89 @@ func getFlyteTestManifest() ([]FlyteSnack, string, error) { return nil, "", err } return FlyteSnacksRelease, *releases[0].TagName, nil + +} + +func getRemoteStoragePath(ctx context.Context, s *storage.DataStore, remoteLocation, file, identifier string) (storage.DataReference, error) { + remotePath, err := s.ConstructReference(ctx, storage.DataReference(remoteLocation), fmt.Sprintf("%v-%v", identifier, file)) + if err != nil { + return storage.DataReference(""), err + } + return remotePath, nil +} + +func uploadFastRegisterArtifact(ctx context.Context, file, sourceCodeName, version string) error { + dataStore, err := getStorageClient(ctx) + if err != nil { + return err + } + var dataRefReaderCloser io.ReadCloser + remotePath := storage.DataReference(rconfig.DefaultFilesConfig.SourceUploadPath) + if len(rconfig.DefaultFilesConfig.SourceUploadPath) == 0 { + remotePath, err = dataStore.ConstructReference(ctx, dataStore.GetBaseContainerFQN(ctx), "fast") + if err != nil { + return err + } + } + rconfig.DefaultFilesConfig.SourceUploadPath = string(remotePath) + fullRemotePath, err := getRemoteStoragePath(ctx, dataStore, rconfig.DefaultFilesConfig.SourceUploadPath, sourceCodeName, version) + if err != nil { + return err + } + raw, err := json.Marshal(file) + if err != nil { + return err + } + dataRefReaderCloser, err = os.Open(file) + if err != nil { + return err + } + dataRefReaderCloser, err = gzip.NewReader(dataRefReaderCloser) + if err != nil { + return err + } + if err := dataStore.ComposedProtobufStore.WriteRaw(ctx, fullRemotePath, int64(len(raw)), storage.Options{}, dataRefReaderCloser); err != nil { + return err + } + return nil +} + +func getStorageClient(ctx context.Context) (*storage.DataStore, error) { + if Client != nil { + return Client, nil + } + testScope := promutils.NewTestScope() + // Set Keys + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + s, err := storage.NewDataStore(storage.GetConfig(), testScope.NewSubScope("flytectl")) + if err != nil { + logger.Errorf(ctx, "error while creating storage client %v", err) + return Client, err + } + Client = s + return Client, nil +} + +func isFastRegister(file string) bool { + _, f := filepath.Split(file) + // Pyflyte always archive source code with a name that start with fast and have an extension .tar.gz + if strings.HasPrefix(f, "fast") && strings.HasSuffix(f, sourceCodeExtension) { + return true + } + return false +} + +func segregateSourceAndProtos(dataRefs []string) (string, []string, []string) { + var validProto, InvalidFiles []string + var sourceCode string + for _, v := range dataRefs { + if isFastRegister(v) { + sourceCode = v + } else if strings.HasSuffix(v, ".pb") { + validProto = append(validProto, v) + } else { + InvalidFiles = append(InvalidFiles, v) + } + } + return sourceCode, validProto, InvalidFiles } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index b7d66ada8c..b4b11563a4 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -9,6 +9,13 @@ import ( "strings" "testing" + "github.com/flyteorg/flytestdlib/contextutils" + "github.com/flyteorg/flytestdlib/promutils" + "github.com/flyteorg/flytestdlib/promutils/labeled" + "github.com/flyteorg/flytestdlib/storage" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" u "github.com/flyteorg/flytectl/cmd/testutils" @@ -50,24 +57,12 @@ func registerFilesSetup() { rconfig.DefaultFilesConfig.OutputLocationPrefix = "" } -func TestGetSortedFileList(t *testing.T) { - setup() - registerFilesSetup() - rconfig.DefaultFilesConfig.Archive = false - args = []string{"file2", "file1"} - fileList, tmpDir, err := getSortedFileList(ctx, args) - assert.Equal(t, "file1", fileList[0]) - assert.Equal(t, "file2", fileList[1]) - assert.Equal(t, tmpDir, "") - assert.Nil(t, err) -} - func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { setup() registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-parent-folder-register.tar"} - fileList, tmpDir, err := getSortedFileList(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -84,7 +79,7 @@ func TestGetSortedArchivedFileList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-register.tar"} - fileList, tmpDir, err := getSortedFileList(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -101,7 +96,7 @@ func TestGetSortedArchivedFileUnorderedList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-unordered-register.tar"} - fileList, tmpDir, err := getSortedFileList(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -118,7 +113,7 @@ func TestGetSortedArchivedCorruptedFileList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/invalid.tar"} - fileList, tmpDir, err := getSortedFileList(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) assert.Equal(t, len(fileList), 0) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -131,7 +126,7 @@ func TestGetSortedArchivedTgzList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-register.tgz"} - fileList, tmpDir, err := getSortedFileList(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -147,7 +142,7 @@ func TestGetSortedArchivedCorruptedTgzFileList(t *testing.T) { setup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/invalid.tgz"} - fileList, tmpDir, err := getSortedFileList(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -160,7 +155,7 @@ func TestGetSortedArchivedInvalidArchiveFileList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/invalid-extension-register.zip"} - fileList, tmpDir, err := getSortedFileList(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -173,7 +168,7 @@ func TestGetSortedArchivedFileThroughInvalidHttpList(t *testing.T) { setup() rconfig.DefaultFilesConfig.Archive = true args = []string{"http://invalidhost:invalidport/testdata/valid-register.tar"} - fileList, tmpDir, err := getSortedFileList(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -186,7 +181,7 @@ func TestGetSortedArchivedFileThroughValidHttpList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"http://dummyhost:80/testdata/valid-register.tar"} - fileList, tmpDir, err := getSortedFileList(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -204,7 +199,7 @@ func TestGetSortedArchivedFileThroughValidHttpWithNullContextList(t *testing.T) rconfig.DefaultFilesConfig.Archive = true args = []string{"http://dummyhost:80/testdata/valid-register.tar"} ctx = nil - fileList, tmpDir, err := getSortedFileList(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) assert.Equal(t, len(fileList), 0) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -220,7 +215,7 @@ func TestRegisterFile(t *testing.T) { mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], registerResults, cmdCtx) + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx) assert.Equal(t, 1, len(results)) assert.Nil(t, err) }) @@ -229,7 +224,7 @@ func TestRegisterFile(t *testing.T) { registerFilesSetup() args = []string{"testdata/non-existent.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], registerResults, cmdCtx) + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) assert.Equal(t, "Error reading file due to open testdata/non-existent.pb: no such file or directory", results[0].Info) @@ -240,7 +235,7 @@ func TestRegisterFile(t *testing.T) { registerFilesSetup() args = []string{"testdata/valid-register.tar"} var registerResults []Result - results, err := registerFile(ctx, args[0], registerResults, cmdCtx) + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) assert.Equal(t, "Error unmarshalling file due to failed unmarshalling file testdata/valid-register.tar", results[0].Info) @@ -253,7 +248,7 @@ func TestRegisterFile(t *testing.T) { status.Error(codes.AlreadyExists, "AlreadyExists")) args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], registerResults, cmdCtx) + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx) assert.Equal(t, 1, len(results)) assert.Equal(t, "Success", results[0].Status) assert.Equal(t, "AlreadyExists", results[0].Info) @@ -266,7 +261,7 @@ func TestRegisterFile(t *testing.T) { status.Error(codes.InvalidArgument, "Invalid")) args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], registerResults, cmdCtx) + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) assert.Equal(t, "Error registering file due to rpc error: code = InvalidArgument desc = Invalid", results[0].Info) @@ -312,9 +307,100 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { } func TestFlyteManifest(t *testing.T) { - flytesnacks, tag, err := getFlyteTestManifest() + _, tag, err := getFlyteTestManifest(githubOrg, githubRepository) assert.Nil(t, err) assert.Contains(t, tag, "v") assert.NotEmpty(t, tag) - assert.Greater(t, len(flytesnacks), 1) +} + +func TestUploadFastRegisterArtifact(t *testing.T) { + t.Run("Successful upload", func(t *testing.T) { + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + s, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + assert.Nil(t, err) + Client = s + err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacks-core.tgz", "flytesnacks-core.tgz", "") + assert.Nil(t, err) + }) + t.Run("Failed upload", func(t *testing.T) { + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + s, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + assert.Nil(t, err) + Client = s + err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacks-core.tgz", "", "") + assert.Nil(t, err) + }) + t.Run("Failed upload", func(t *testing.T) { + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + s, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + assert.Nil(t, err) + Client = s + err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacksre.tgz", "", "") + assert.NotNil(t, err) + }) +} + +func TestGetStorageClient(t *testing.T) { + t.Run("Failed to create storage client", func(t *testing.T) { + Client = nil + s, err := getStorageClient(ctx) + assert.NotNil(t, err) + assert.Nil(t, s) + }) +} + +func TestGetFlyteTestManifest(t *testing.T) { + t.Run("Failed to get manifest with wrong name", func(t *testing.T) { + _, tag, err := getFlyteTestManifest("no////ne", "no////ne") + assert.NotNil(t, err) + assert.Equal(t, len(tag), 0) + }) + t.Run("Failed to get release", func(t *testing.T) { + _, tag, err := getFlyteTestManifest("flyteorg", "homebrew-tap") + assert.NotNil(t, err) + assert.Equal(t, len(tag), 0) + }) + t.Run("Failed to get manifest", func(t *testing.T) { + flyteManifest = "" + _, tag, err := getFlyteTestManifest("flyteorg", "flytesnacks") + assert.NotNil(t, err) + assert.Equal(t, len(tag), 0) + }) +} + +func TestRegister(t *testing.T) { + t.Run("Failed to register", func(t *testing.T) { + setup() + registerFilesSetup() + node := &admin.NodeExecution{} + err := register(ctx, node, cmdCtx) + assert.NotNil(t, err) + }) +} + +func TestHydrateNode(t *testing.T) { + t.Run("Failed hydrate node", func(t *testing.T) { + setup() + registerFilesSetup() + node := &core.Node{} + err := hydrateNode(node) + assert.NotNil(t, err) + }) + + t.Run("hydrateSpec with wrong type", func(t *testing.T) { + setup() + registerFilesSetup() + task := &admin.Task{} + err := hydrateSpec(task, "") + assert.NotNil(t, err) + }) } diff --git a/flytectl/cmd/register/testdata/flyte-package.tgz b/flytectl/cmd/register/testdata/flyte-package.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8ae02691bee9aed1e65bfb1cce060e6b15db8037 GIT binary patch literal 162434 zcmV(+K;6F|iwFq1VcB2;|7L7?bY(4YVPk7yXJsyQXLT<8SouJvlhIdHzfJcReR34=)#p(hc+vAZI6t zk>lg=|6eci|0l#HKxqT9v@sRs8zV>4f1B@-&CKloJpE_;-@^WL z|7-it`Ir6whuDAqf6M-JadYtgW&Zy&5Qm|SyOF&;o2#9pm6^4js}q~4n~{yZwJDpE zk-MRVskOD8At#&t`~OkZ;N#)>_v}9>7a!Mut^ZtHoScvLpW`2?|NlwtKU(<{G&dAD zTw+g8N=H+3ODBk<5yaBYmd)PL?t`f@gworanCM@&nb_GFS=v4}QB(bg(!=zxzU*S^ z==At}?2e0W?+&rBvt@-CIav`?;1WGf1e1g9@yBdp>SAhbXHSguHx4F{IEeZg8VDB~ z?I{|(9S1H78axUD?qiAT5CM(t&n$#ExJ`|XjX90YI5{|tOx~La81wLR^O(Fh65!)C z;Wjfdeb3LuVPwQl{LJ3n%-S7d%4%lh1YtFGGc|UGm=Y7QvKpC~SpJ@)ku|Hy?+IJJ zcmDlK{Cf>-j;1zt5K}{YBV#Kg^WRU1#qZrgV`Vilef*4xr6V!cZ@%AehL3N*8{t`5 ziLw4Z+TRC4VP&CI#5j+Qf2&dbQ}M_{ z$ja(y?^Ox4-ea;hOn7?{Lk_KJp9~` zX!BqAe-2(Aj=%i>KY}PCP*A=b&AfvL{(B_>w6BjUpuPZ;RSTpw{U9LEMdq35JtVfJ z8b?(X876JcBg~~@Ns043g+|IO74zlmY-ux@LTTKQtkJBK)`Y{UDc7S1=#uyCc=M%C zM%|!be$CX(<&pPP$=(5@bS<07^Dk?8OdR-ACq#^MBfCK=O!V@$|@k;w0Ay{GJW?k z{F?|NBxtxsn#s=#lO2G5lFzObX%cB|z)zGzV>C@C3Eq`($Q67iLKa(o&~vVNfBO*Y z%G;txw$_{`K!n8I1+H2%{`a|Dbbb-&*dbfjn|<T^&o&y#0 z-ZB^1Q*y33fVIfB0mXp)H$V(_;)e1#pr8dJQoKU$=njTRkc98C08`2UZ+Les z5yulG6gOKWfJU7`q2&pg_w3 z>{Hw#;H|xNUWEu@np?dn;USBP9D8C2IDTVA;pEiF%}uCso}-upgvCEL62v)j5_7+~ zu`;;4@>Ti#y!;0TBU?s~9UF^hctiwpz|Mhkz8j|qa8kj(uvQ(W43x7s(6m; zfm~fVzH4~M?RdW$CR;RcoFhmH=)%%kFaIgGaBQNk zVbtOk7&4czVgx?9;}3e}bqV#QdJV+f0!w>f-zUc)l&l9}Ob#H^Vlf|XWk=sH--51C zkv<&+Bp)dHfVW40*cq7o=J|8qold}zOaGa^=m8LX4Y=ON1hm=#?by-2x2=T&d9-I`01e!`D52XMpCCE6&upbpqVfR)12SNd-;*MIuGTikTvS7BV~ zX(=~%d4yNB>5{3|*20xD)6<63nK+VS9xftZdXHub3bM|E>Q>Fy*JbVO1gw72g+6e} z3#TagUbs5nctj0v^pZ}&JTh2Z503iND;Os(2f}mOBc|JXI`o`t5UlF^6kRKfS`vjh zIiq%doL;Eia#i&$%#E$|tMe^YM;OfW-@jjN3awmw*gEal$^%;Nwbho=P~Sj;hbp$E zp4NF$n)6K#=5<($v<|M_>U%pAka&rzOlod5-hRgvZ2mA&xLJS2R1N8tz=B=$>Ay^x zapM820I7srfWCV$bH*ccV*cIT=`%i7L$0_)a>nvue)dH7e9DB02_q@h`6L%U_jK75)yR&iqVFjHZ-zW9 zE~d^*1Z7*%Iw|E?;dnZ3z^y@Ql<-XpOQ(scuko?{15X}(dqQe zbgyl0;$MsrUG?v;9DOH*l{a3k{IL})NsxADd%Z7N~ zMX#|YXbV`%c9liI$>AYsD^qIsYQyn~U32t?Cx^zbcV zJSYHK2!{4-Tsf-%buIn7L!HA8&6XUP$>P2qoXx8%s&w;*Caao;c#ru4v&9c*$W2~c2|8tx6d z8cDYM>eL4)`JrZ)b@e#!Vqk^2+bfou3)4Z?uAe^)#hz)pW`Omdga*q&0s{kHLWJbs ztxDkHfh@6cd>Jv25)^VI5s8(uabaHiM!2zocV%VY%MQs|DDpg(TnvmvEXkt}4Md>d z(cFCHjl~gtpK>ugTUTCtM~6W9=xjp0*qKh9w@>ta>&qMTwFSnDavH)FgvRbw>(B*6$*-oNdL;)$W$)hoQK%d+sN}zq=kR;V zxr4!kgRIK%v-R{zPurF2ouWA#8TX7t&slzXcz}gca_15K4A{Cbl;DzFSE39EfNt^U-&&1AD|X@(4t#_5+r@r zns0mu?9Fb2MPR_{H5MGwuM>)D0C@voJOENGQsPmyuun`8A$LhT13euD_)_ZbJpBU*uBIxz5=-E^v$l*UVbDEfVj1~q3G1&f5sH?G zEpO?DYKu~NrzR(bWCT$QJS=+}xLgaIU2$zSQp{|&n*>pxl6#g>_?BX6^;Frn93rdO z2#AH`PY=T?KXdioAeyg+>(33k$}AM$=TVa9ff>TRKQB!IA3VFe54zLuD3JKKTi5ie zHAPHX3BT|*s@>qYIW5Nx8gGfQOg;S6h5I2mNVbS75cCEXq5`JvZ~3f?Q&T|{rTZwT zw*db&_+ucA5f!ckxehuw=2s$_HYNTZ1d_kzMu0WAPoe5oApMWDZhssjAaVJfZJKIx3U=EUW#wPo2A z#_1W7PDi3o`D*(0=tqvlAC^9CgJ*%ev2(!n3;@AL`*z?;kdo`eyoq+Aku?FzFw71#0UQq~f%r_5!##F#$a$NMYi}{^u0?z`Oga zH7F%cMd0IlaDlqs>d^zfwz+!-EWGp%Qz69&KT+^61IJ zjQPE5mdWC_G&5J(rej;a_mz!GZFsj=v~ZWZlRX)GA;+8MJtkdg8iy~&^1?JcW-}?H zm%E^OZ^}!)40U5d>v#vps;q|v2KOfZkkX$Bd4~e+mg_V6T z!F!UWd}9PYM?1zOxS`mtXGFteZ@6n^`{_f!iU;Rn&+YmD3VKf(Hm?&NSd2N;mgZfQ zwl&-}Cxi59uF*Ur)YcUZN4dzFf|25oBeV5A7SR4pu92&H62m>zIja0(!b{f`v^1?K z5bJuGxBzqh8ChenAV_^7*CD>Iy{D@hFt7e$&w1`D{XOyxmPU!GD2jKhRdN@>`R$h< z@|PQx%O1*O$^J8|HC^v9IkWAQE!-E{o(KyNL%?&%(^EPw_YIN(B{R#r1y=@lAuZFu-4TbdX80p9&OEX0T+;K;0#dwpi%N~$Ho4FF z5X$>V7CUV!OjE!F6njggT-~o|t2!ocJhmK*{mxGh6XSRyFq+8~lUkZ&GzrpL>WQj2 z62{VHb11xKzr?8jnwy=kxOef=3o@LzQ{%sz?yy&XUW3_2qNQl#wQh?IL+ zIv<0svabQZE;9clKk`q&fsf%fEHn5qE`y^cf7hl2FWtE&FYOCIDnS>E_?Aw?{U_dI zXrkonQv%Sm1%jgiiAU8S2I$#~%`MG1ooNi7BM|-gzx@*wfvWsg=?lydkHEr=*K0N)tzV9w-U-KhcGUnEK zP&V8{lf;?Ghm)P+s3g8;qQy!diNAj#?X6z+Ec<)%R&aTJ&taffPx~AVjD09kUyI)JydyG`)goeNLsVMn>{01fP@gau{&maJtZjKs(dfH_{rhQ z3HCVub8kF>txrphiS;~iYfi5w`NrcoQ+zyvdjsb6$Y%zBDsr6+AkWlrVL5)lOWKHL z`G&kW=OS{dK@N_CIMwyd2g#NDw)b(F;|o90A>o9e+lczxl&17ieK;OV^+uJ7h&jR7 z@7n8}(F}^YJ6V|XY0P$^mz$0wxUr7q%HRi!2|Y9woo)y1UJ;c?o%ZTHX>^RMK^uB@ zt!Rk$(SUOBE~kp=K*Q`C`6p;o*R{bY5m>|GfR8Vu{`}SN5EW3|1*YyPJ_aK96u?x3 zAMybv7}n<=K;pO6V*r3>FnV7B2tw9Q4K*;u+?I94K*aET zerQVX&h|i8w5jK)q@J?JtgU0pnrzQEN{A_uDv`jZ?95tb1Jt1RdOX6ggVO`Ee~W`< ze73rF1W}dm?YQ#QxM z4Vn|}!Jv8|<67P18~3jirn22i@=l#ZB~$1LkmfzbT=J!1?xml8gY8sc0IxH4TOj zm>(7j`cE$RGV5TkTKJZ}vn7mcGHty{*Zh2FK@kiISLnO^a=5<9r+v<3IdX@e=9Dg{ zQWcrgD2gN&-g5bif|X3TlYYc$0tzxrO}*OeOp}f>cj8+)_%VVl`v;lj0kj}moC-vd zXr;i{2m%M^6aacD0ROm88_-Vx6c^|~#1(?^lidKr2aPwm4-_yg7?$`HG(`y5(g?u$ zC3Gj=6R+>d{YzKNZTet8*7x8UPMVc9C)FuJd0yDf^P>YX8~u$>PMJ&Jh0D>33fnBU z$b7OHKS4gdqc$r|W84YX4C5!)b|{&5;-tIzy0jamSXF|RTre46a1fVKr5@tK7-)G> zn|`zj^|&*sX=Z@w{o36P@yTYNL~xOvB3{=l2)){J>mjM$>nl^&{(5TJ!lBrx@RrrM zxesAu8PCe@QzrQe`lXe7Xz9dZY%z0B`;o`h59PDCHw*!60kWLG^HBik0cZm7LZ47k zqf%L@0r_b#ytYRKoW1rppjCC9=^OAGc-)0dg{}ZZ+!Te}j||wc@_E=2T=K{}CZtgc zW|Gn%WR3#p-94BzRPG9zObzf4ZUQOHUrMqxwBqGfzDMxqNnb21B96G%y5_$~)+S?6 zQhKGLByZa#&EG5>`-1FSqrA7?`|@S+N?i2`zQ91iDB+X}{r5Ji1DlE5W_wXNi6M+L zo&iN8Uu39|2Ukn@Nvp$!lO2DJo`-%Ze97D9A>wFuVoxr%UdmN|-m=~^W#zm${2m>m zq8;(uPqo&<)_M?m0Q1`&fc+EjQu@(Xtw4Ez-!AGT^AzkWl>|*myvM?2#AEguwZI^L zlC$gpLRq2uC_zW#gAF1A$%hb1cg0*lDbKr4z@#`A(6>84C1Aat+F{3#k5ftn?>f za=P4m@Z*_);>1besN=V3g)o2MF!Cfv)^jHN({nQ_QHLSnVdq>|z_3E-VGe*R@U^Ff_bYSiNn5;?~;ULbZ7!NtMsMj*zKiCxrL~93|3yE|7w~Z{7JbB&j%vDNSbj zmqu3;me5 ztwGQ8J>N{=kg$M4S;GnMtpPiTs880?m0VmQD-giOaB(O z!4%ca{r2hb#1@I(oJgui)r|D!{me2}3~Nv(SnOT$TF+RDH9CbVd&C0M-Tg`96#1Mw zP2V;36taM8(xBq`;&H{pEWOOWyU#;z$T_5A>spc5{YR0;a6=R|-?ebs0kfi?0wl5P z;#qYwZ$l#WU{MT&S-5M|r1`sb+>*QwO#Ypw2vlXjelvKFeaV*5X;Voa%VmTI$!b)n zgZXOzMZ^BWXx|G121_DcLkmmiSarzs>vU4_0w0&<&fB4esUM9?U7c3q%EdY1kbrxG zdZ@?gddesJu!;Bw#m&OVe!i&LQO~EN!V3_BmjgD&tGr&+gQ6Oxx-HWe;c@~#uN>o5 zKS*g+5a4yVTToKTF|Ky50mlhLLZutSAX(E zc+Q`^j+Sn}(VCotrmA6MAfby3xaTO0ZrqR?W~#oF<& z$c@?Ya3Q^L2zhh~i{eX2W0NhT5%~8F+_IQaWxDLu+PgN&R57l%6?#3+)g+Ud&*0|_ ze+7Kg*V}4J|NcenGC}KNIS@0jgssNLoEwJXIhj^K+z~N%J#$T+sk8Pf)A77!(ETBh zAv32Xa>tR`^c7yKwH@AK3WtwFCZ;{*{%BfhbU!9OOBjvadXS2JP1*ux3 zgZ-_qr-zN^aq{kco{k!s%NGnD&wti@mP0gew<@oc;N)1}oi;V!LYT2*Q(rJ_=3Dly zEL?P+(MQTiJDQtJVxuCkzbWg1(F)RoRWLn#k`6Op`&^RSn09>;HYqzen(ef@mfzai zDK&BUe0d^5=5#-OqoOl7KS=H5m?RM2I864Y7sbVq+oAFfyJW;zgM_Wt!a?eY?oMwZ z!H-jld+_RmoRghDR?6p*xv~bGPVPE}brlPkEqci!XR`x!6m+W2JqO@JxtoLWwdm<;C_NR zPE1CcF#nFEh{bMNW3d85{+Eh&fyT-53j+&*!K*JsaxM{@By~Yi{6iPD8tgdBjpG31 zE@IBr(?v@&mFH#EVVnvfYbJDjO0SvXfqZkD4EDxZoN8M2DcM`uZ@K!P{XJF>51=vJw9VVpd@V`(H;gx9L z?$C-Tg&cFBz*8#a#r1%z9{`m}0EC0!Ukl`aeSlgR#xG*1S{!_pn4x#V*iEZ7MNe-@ zifG8UmAY~x{t_FERmBhD@+NH-3*D_&N~Eq`k);mu?}XQG^K{=qS3(J5oUwNiS!by53Flw?g9U zLsgunyXF4bN7~7jKb1}}Yh1_Ec8E{hX#r3a0pKja?)?KhHBN**FKY0w3yS*G+&JWdIa90=xN zaZdv9SIjL_oB|*5c7d-yfrL~;$esqC+decy$jdP6(tHDcAJ;9FeKTC*00{^Rjw+jeDv~r+yI4eQH?Qa?5u9xZUA` zJlB0~pu~aGomZfj(x$hh(TIYSscM?<2`f(mHt~n=C8H!pTKE+Un={I?gm+BZOEWfW zLwUNhgm!kEy-wWM9^G>H_KKJpEiG$&zUO%oeN8;`?f!p%Sy!h5=(cnyK4pR zw>23}#pU2xPu4groiB@J{UQ!l;*}*eZUIBfYsTxkyCpr!3oII|6Zc|+aScS)akz9- zX77h(&Rm}sQt%L0$ai!fiD;XfxHZ(X_GDG67JKC@iKT9RI5?M*O5gqQbVweV>+j`ZBk{=KRMg zf=_`%AIS_iy}uibXA7?9n`=-S5^OloXn*8cEKl_4blEHpXusKE{aV>9D7{5LilZ%N zpyKJ|_&o9wZMW$S=W5ss=67OjE%#K0)5i~mQ3P}5>;_`fE(aG+7qd>oyGMajsoTDdfJs0$q;cD-WjBl;fkp#kG0Rc+^cM&9^anOCB+-7BeNF3Oz! zW)x)03Qq~VXrE6~;^2~Ptj~H_o1CxLgxKKkGrN=w*MGe4t8^<@^vmVjdV%qpt>504 z8S9gp*PD8Q>|7zdMxXT_iHl<&>amAWxu-+x+r&wL3y{e(F z$eBy(M1pLpne};oqO-7vfUnPh)oWkDL>GmvI;I%pbUhBG3C&N1or7^7zYnKiH~Nk@ z5sAb{*F=8Wu@PC>xpJ&|^7UYbRKCrfa_Rb2ME6&uA+ANy19H@n^0G7(mbedK>&QAo zUmP1E>zO5hXOi}ov0ikwK59tm^)T91(9`pdv=1*w(Nn5GR|*W9o8 zKa}np%$;df;7ZCTTd zWR|#~H^@L)%tTKaH@6yDj>PXBhRR!~MfyGp8a8D@tMqEoo>G+kdaJdl!0a*A8 zS@-J~r$xd}Z(kZ7I+yx1G)P)~%0bRGAV}9wvpS@AjwU|%G@rH>>!HHplzrqZ_F&%J zEGd(*r~g9oPK^>rVyu|&l1g)S)pLv8w&juqorI5=iS3=s!aJjkQt!#e1kb`9%miL; z$X$@&6odD=juzxzu&>|Z4$B63_;g9}wCjf(H4a@4I!L+kl46H|7(jjv#QeTz1cw19 zCfFOl#orAr;AI;g11+dKYs4s7Iar)JwkvN16%h>w>lY*F0XYUhK)lA&#)3onP!w9NaqIX9xIjMNb!@|<-+m4h=SLI1xohoY;iEb)U#r7WU8_O=EdPIsJT+fJT=GWtj&Pq zTG|Wktv5Y6d}yqDf3}u5i@{I_ewK4;cfzM`^GdjhyXMmOW*|mX__>Feq#)O4$&%He zFzRrM-IqB}9n8_t#@%fR#l{9-()Ei)94C3xk)3cX$1&IyZYZ`wY&SajMrvz4KW2hMJ-9_m)XkQlzZpT$^U9?T038RVbPVtg3?&{l& zn_hP|c{NojQ)}LpITOvZxY{W@1bt`?b-#x-tx`AQol+s&#ay=v=<4hYzle7=$J5>% zoAaa1zDFQbv@sIy@0*k4<`%}&XQgO$6I!)?N4ifA&WSh2S1xNV6E4HA59yXtT~a%L zwfy<5&ymjRC}QL=ulAg(VwcJ74iO!eqm#P{KOTGUPi_j6sXmdO!dH5U!j*009GVK+ z5~bhhVtzOi*vW_OHa4T?oLL_!D{@o`sU|0as3#tr$$j@1W z{yrUw4JfI!_+ynEET1z}+82=%#N{Xbg0d?{x_zYA1ef2SZG#VEZn3g%!7pyH05$+Q1_4!z ziwGI-^+jgz?eOob!+*M|$)5xsx&Z9JGJucuhQbJrDMgujC6os(TB$9TkQNuwpOzQ{ zM}j&`nbI#0+8+S;0SL!XJs>Icww3V|dW(6nrv%s3JTw9SWZ|n>P<&^gM!`Dqcz^pQ zrKlAzF*PuE^5+j;&}0BE?qnM_Jf;eyv_=B~uYr(%GLJ@}1;FZ2{(rvv1;<2=%*E&i z9|q59f&JW!D@=)wNX1CCM~ON>+!tB`AW$uP0>~ZGJ#AE33RR1LS&{hkjiK9c!fAw;t2j}9zCCi3T!Uv&@_FxC~X2qd` z-C#@L6DT4m9k?=F29(o?*11-P;MBk5ZRzdR59PO(a5VOjUrO|$MzN>?uOEQ&G3ZBW z_zDzl6>PpDVC)rO8EDuI;QW0jLIA2{rQkpJL&NXhSgHx7`{i?>V3W(eh$k`;!QVSV1%}|}hT7Y)3Bkc7GN`o^O zdsJF?d%?$ib{1UvX~P2X_g?`4tWjWT5}@m#e2i-{VI8f?FnZs=T`2y}ZpBmb0LDV6 z;8>*)6gTP=R0POJWnX)aHrf$!>L5w~LO0?t@wTyTC~%u8fO7FWul052Hd9Ku@PPK~ zsd22$LGYL0BdzB?F?QE14rtYU@3--1JrL(~xD%wtm-Bh=aD(wF)`+H~rXs4!(I~Fg z8tWchqz;s$zrA2TouM`rvGehQ+`6l8jG#{(aT}04>|lc0b3@qvnE6M0&JiX~y;gyu zD}_z24`(*J0}g-{UxP`X{+CO7>UjC>>)*HIT;xCEjgqB*a?4{&=c`h}r%1qCNaMEs zp(`C*YrvSui_=`=!N;;JZ8CCrIQoDa$1)3Y`AaYzo!pq^Yqr zFa6U$ST@U)&xPzy!w_NEP9}q%hPp>W`evxIm0{9~EKIwoUOOfWb`O^}XnXgK9o@3Q z&pYozDh<}jp+DXO8$!#C-X|^Xb{ZEM9%q;#iis8I|I(M{Pe$ zC@G{oh_>O<^g~}}`-yYEB=_T{QA@Tr5{q6)^@E<-hAhJm$U%u?}7=x zkPAW^a_<@ltX2ZmGkWe&T3G;dm>L>cXGjz*QZ?#_g(ttoxP#s@v;8x zoiBZ1qRkq*#?FuyReuc!#Pg%(XT|=wQbxYM*=fga^N z>a6qiNZg@n?$75|cCsO zBzbM*(rPo`7er`;^F=63_&e2y&66g(@>7ls^7ohy^rA_zL+KB6kq)|UEjPTTcbNR5 z@}%M?&sVU}d{T{aFt2#WqIjd5-SToS_x)s~^hJhd*=xMzmZNJ%i0{}h9WsQMdqt~) zFx}wVN2MI^@DEACCKQslYD=6YMoh(y8?I|sd-UW!Ypt!+jVut?tzR5n?QHY#w z%|Wr-soYg?za{fCRuIK!t173cY%kS0J!u#uYEhqniCtm%^}LM`P&6JcyXp!r&?#M3 zdrcgxXVNfiY4IGwGi-R$aWckFV9LiS^V~Rfj@`Oy_nFd^ck6c+pSMs4NlO>06q%aR zi`&SBRo7ws2ALCbk*NjVB#98~vbbnIo;>|owaOxD+9g|~METd9*k85OFa1}2ItSsS z!eh%fI+|Z4U5933bWM;bIO{pGbr;GZ8V+HO#GKQnp&V-F$#_gnX;C1#2|kOdXpPcV zcivii-s3SD>OC^=`9y_?7anK-f;%C><+Fu*qc@M7sNPP!SA8hAU1i&zg^kU;g0|-E z4hD?mD{~i^%YU8ZF6E8i`Rc$z6?n0VM2lYHUb@m8dp?)uvT_!J5CIx)eQZ zy#0HmbCGTof; zH25ihy=^*(TQ!bK4lu0~TE#twR6pD58*YgmOrQD2a?;fv&l#gTcj;ZklxY8n;@!1z z83s~w%bMp^w85!=)`@RYjPNdUd6%K$C+LrtYlaEl8%VCk$y*G_GB@+1Uy;dNk|#aa z6B=3FgA$>$jlXED)K}YMOv2+kpOA;A^gU%WpXlbg@Jm(aCo5tbZsFptZOLuDS_nI* zX^|v~W!-hm7D?cLFe_zgK^^8#tP<76H0i-ORs2|YI@7u~u$V;unryl+R-;B`v$L~e z*+%zB&qdUS=jhPCvD^cBA))h%O}$W1gxPW^^0vYGG^*K{J$+L)wRP!Ja}Vo%?o7Cx zm^tK`ot;43!;gIC!I~JNnZmSAg{D-|ENw3SfLCw&)@KJcoks4{rFM~RkXc6+)?716 zxVf72=J8Ebck;Ab^kv$Cg6OB{Gz8;aHkt04wp}k1RBWW~N)=|!`pZHuK1F*tSTwO5 zT8fFGPT9IHK-x!@=!uS=P{GQ=m7UhQ69?bU-lMs3-#ysARK#;CPvDY~dip>&&t%4J zB9vG?bf{and9FcCC)$1P&s}_0D|QhYGc`7t`|aC+;*d*#Ox^DGyc1;KWoWki`C!sC zFS}7^&Y?p{z|r_X6PPZq)Kud;X5&$b5g2Ob5D=feB$fa5IMD@P8^;`wmZ=vuQ*)WO= zfB{e`1u~bR*ou@mz1V@bfMqvu_$>8|{Rgmp3;Z1bpekcao&jI!0hRk)6c8=89Q{Yo z=uZ!TmN;GZ$q59_4}+$>jU$6I76oNYqJ(DQNF}JN^$>VswBB%61`w$D!c_yVOwlR^ zdlo%mYiUVll*`f_XTk%iKdlkxfp|lGjcA+R?CsT7seIxgK;g5+@LT429ZjII& z+gkD+f7oDrmKOpO{46bKUx|LH*J)C-~cU1P7KNG|9T~<*u1F_&+ z?UrLGK@!WY;=gG9TRZp=g|YXgvHjl>_;VmO(&KQ3iN=Sf{xm?m!`_#}j-oWfMaHI8 zqPE0E#>w*zz(CYqq9l}hz{WPlrSZLUel1$Hvgu}XkTf=U zx}NxX5R&~j8ts&Hv)U}m(6#Sz80gG`mmbzG{c;owuKncB1L+cRtpp|VxWz34yqehz zeVfkWOG-mGy~&ehS>b~UJM7-F6y!RV&arKU%oO8fBElSQAtZTK6JSdf$(>Fu#msizSQ}Bi8zHrz$P&O%9*FJ5i}urO-69^-#g&ttP=$%Yoh^0i{8> zVZEDQIym#7usODdm{`A?B*_V}B-C@Fyg3HUzk<=_{xYRH&L7@0FgQqOckb@KMh!DF zz$rTTK!;#1sps{0goB9jmWBQv^Lz~?`axEM`h!L6-afW zVCfmm;i?A1Qy-uALxmU(!F3S|{TH%d0ufzBF&bM^oi#0Gs@0C1GiFhoomRar`-^Wg z`h-gjYnSVt`@hwswheuJa&u*l!9A$BZZNYCu7e22lpmNz2UT}7B2CUg_R8Jxr)>l? zXuLQ*r+%Qrp|jLMrxc@l~;bx@Ei;hL%$qWaMpG<4YHjVU1Ju@cK;Ly^)NYUK1Gg4Ib|hx4K}) z&pP~OT=pk+((Hp|yy~iPUh-&)3ZtXb-?pbGV)1atr-bc9Mqjn4lFvF^XicxCedc*f_SWlSRg$O$(e@+Pnu*sGi+1w*?vxi9=$Ltk>!jfmqsy7 zqSDSQ8!^rW>hol{bav9BuQ$+N9N0b+&ppyU60= zbdEhtQ_~~!$|?eLPh0HlCF^I7#-*OJey3JkLnZbl>?W^Xc^!|uCb6X^t<7|QH4V)W zOz(!f!R*wKj5o#aBV9l1$MM)XtomM_7S&0mXB3k+d)S9eRSB3Y#v z%5%VuwuKeCL^`_8X!!cQQcH?ImSg*7>{zjlw=*$KQg6%t$~R%5tNoPAHF(5UQA>03 z9ePH$uLo62eO3F^?;J;fnMzEy?k6_SXU>&bNuCkM33@eIN8Hd{i5;DVJX74ZGY_Y@ zvAFBfLrEJnM%SGDz%=PcrzXzrCwhIdvg%>0P~!LN?f&U$DxRj~CfOH6hC#H2xvi7c zP$s^^F9pjrU$x2#zG(&QMEk!S}>uxJ_%%H&c& z+f2^v-&m}%AKv!*7V4Z4%sRuMUN?U~*(*?Za?m8RJVI=qulGf?Lq%DDzZMdCK)=h{ z#rlI5U-}}H@IY(cLu4SV&Z23b#r6v!@29HC*Yh+Prd@XGUNTBHpDpqz`oSI1YZZ>p zDX;e5$U2^SvW@1<17NvTAYyeC^v%gc* z5J99i$4RF6IgKy!&Am3t?F(O*bdgks9v;puWG4N%1ammbcHujNbf+T<6FOa{yVvlk zfVbyWCssM z$`qQ5yaHygNqX5FT5K7HPQ&&FoHiVbsgW}wc>`rthMtqLv(1|g24~y&>J)ygG3`T~ zA!}-Lj*=5;-$ILiO!R*y*kEzDJJ5gM^!oBm^}<6;Uc`s+;?YnS)K^HwZO4~bA!1QS zO;;~z)`s#g6lnu86RxXT6F8%llHTBskC)ZVYgDY{?AydLKL{IYeE5KMXYo=*@O(w9 zXd`z^Y8N61~lF!motAyT-&Yk%r;oLBs2Ijm|fBV^rI-^a%Q_T|Tdm-aGr< zeMn#-%WcCrY@6^iKo>Hbio87{ndE5BA}Mh_B{Yncne0xn!dDcH)6OENFPRH-PQqew z0FRVN4({;!RM}h#+bqmIe`8fF8zfMUItXGjLbNS4Xw^9?n0xp0D+xTLp@1i1rrRy4 z*?pim6BJ`MKNJcDTW#z{>_IAA0;6S+WR5mK?joDDKv`}}&y8y$gISLwGr7OqFBm%6+LTZ7MFkQ?bLt^76 z^1{`{7cW`ud&;|Y!1u;habI7NJPy-#=xpgmFSES(Dlv2Ru0mP2?3IUj748gglA!a> zzv0zeEbHrfhkTy*`X0H3n=5!XWmZ`|YHKW!%B|n7lVxbaNf}bhcqh4cc&zJ)!gl=S zF~y~=INAd46u&F=rsKl+OB^|N`!5uJU{y;$E`7Ug^S7SUAK-sXrt&Im01(XQ-N2t5@Ripdp@)OgU<5D^3ul{mzOP;y#wi zeBHbCrFM*Jo19Ogt(KnM;azdHWt)AxRc4*lTYsg~b|_kQh>OU>T;T8XLFHqX*74;t z7KSI4W~lSbbj>{N$H;6+WWHrMleO3?xOlQRS zH}tM&e6qXXnX=6DOiV{$W$t)aklpTqnCe0!e^`7P+l^RcuAuxyq+3=Vhq1hYyfzlq*ql+e`7*l{j?(c0R*uB{z1@pW$YeRzChI%%B z36Z_aR}T34@9&`uBz{VAGA|xHg}?kO};Im6i2qgd%Ch27k0Lpq}rZYQ8aiF zI~aMGtFCrn4Oe;TuC!+|$F>mWU*MRio8|>Tk~P(B+~m$=W`5^kgMuDpUWskP6w!rOph9&W1%`nFpf^u~k3ViotY9zcOdz0aIlpbe?%+A>TwnvEOgwD1^V`}PDwf;~qjkGQ0#>_ho27EV zPj$(q8uIHK!DHvRW8d?tCM`cY;Jv^GeC{IZ8O0#y!i_vz~ z(Kv&TOP>(d$Oh_R>en4h^Rj*&HOlh8y*g)+TXf=+J69vULqEhVQtd0p0T*KLCY-!M zIMft$cHrh>c40*`O97qGr^UsYtJgK1IP$^gxvW~t{mZp46AP#x?5*)FZ>_})K2+~B zZQ<$vr24^>)?Bu=6%(t+?|PIahokLLkam3-lo{~in!XFC-YK@x$P)9#`B6STa_it0wwDUT+C>JmOwY zPGxb6u}EF#CdpLyJJDlh=_l9qL5@+2j@}OU|43ZAHMoD_9AlwneaE_1hQB*w9(7V< z>>yrhZ1J{;yn9bR_$Mz@KeBw+p%sr+g({Z}D0$uI@jOV&$57LnYy||iY+w#ONnS7z zRuEPtJ7ZTH&vubwlZC7khATB69J-fss;yH)KT`IXul0@U`%z{w4_e70mQgm+z1$xx zcexMAnx6P5JGepk|JZxWpgOv)TeNW}xCD21cXuafaCdiiC%Ain;4Z;ExCeI&5Zv9) zexCQMI;YOBTXn1Mk6SN)cJI}_=9qKLu~*O4J*$9Tj>{;Au@mMlPk`n$wfMUB*T||m z!>C!uCznBHYVh3+!lQ=cul4PMV&63&Xa~ z-TJ1CBP&9|8fBz<@kA1L83PgCvtg6aV;oP^Fp67Cw^oxhi3G0a547&(lSTD*_|xKV zp7=BiLYqw-t{)YaC%ZaV&=?yfLI%}mb>F8P9s8!GPt#A3)Rf9^MivgTQGh0v{h{57 zGYQJ_NzWo-Ekiuvz05M^JDAItiw^kO#Q86e10+&H1q1ZeHK@H-m(MFVH^uL})ykPj zpLoK?AgjLqxFZI4rOQ+7(YUJ9-%S6A)(il=?yM(5r2`~U_-nn|Fd3}TU~-W#?y0`5 zzEMVw!g7l^qr`=OWA26vzHd)lR_c_J4x4f8J3@>jZF>@SeV`;xUQure!|(T#pWU^P z7H#}#{2+Prqmpi@0ew3#ud=1`-L*E1_o22G4nsi#$zA3Ig(^wsUhcyB_OWYmqe}&@ zv;R@>i~HGMI381Vw5RMz&#OyZG@IUMyf#|e%XO^|#TV9_w+9}_Q`84xjnKRl7vT$4 zf|nST-s;vK44^@3dlPQ&V(RQ~{;QNa&aAV5eu1SZuGS+($7SUa>HGVIY#nb$`k_|> zqGS1T=R95(Ro$INkczed!HK4XAommDry7J8q&~kz_ftYLNQ{vl56RAC&Ao$CzTFRE zhVZT0wbyEwoM(HOHZLQ`qLi5ROZA-wt$A0|$eC;JY?Xhv@(w}zpKE$Bx9*dKbmtDiNZ`e zPe?qi{YInN5?%g{IAz^?^B#cYV7$Ow>6nqL$&JF;G}TBR^u(%V9#&41%|dh-Vn)5n z&bHh~pk}{1FWxm~h&9BcDOuUPM6zE*7mdDwz`i|tYc<p+H+20kBnc%c*nV5k z9;e|R6qTz(3C7T+Y`mg@s1;D>Y}s{6AJ$Mh-4furp+>SFWr$?kk7A#^eO-Gs99t*C z;S#XgJzgaXCgNxW3-K!BE|1%7AjPpC85wA>vqP}4)^n`emdXl7&XN(Vp{2DGzK|o3 zz-^^^m=tszYuK_)Swqj4n+&{ei(-nC-%R8!REF~RAquAg^2etdj z+6ksJt#?>Lj{oLBF;r5RV8l$^A6Y@=4WXF5Qc!GG^3!5+4alz?U zIJ{rznLWe}qBsK_Z(4MyH&)X`QlkvIr@O2ZSnWx;q67``fAVdzB;@29FjuGQ-TT?5 zwTvgD@iu*$>ExMzVUtPz*ds2Vx1k4Rg3 zzQqr0rdRFa)~1Xm(|K`nvYd%Kp(d9OsAq0WUh` z%W0ALwIz*^{$v3c`j(!*OdmiQ>$DhRtac~3$2D3idu1-jY*J?(j9b5*A3UbOW`^xh zd!>A7)^#_VPALQvlX#)L;>q8w+Q$~p_iX3@452WoBX0su)n&=}Ew9ydpl06_jA03=8QfCLu+c+~+wW;*~>kAaQ}LFdyzbK3wQkQo5d zqCobP0U-V>07U-+*&_!4bm@S3;@Jf0HCk&pLaO%#h`1TK(;3U05cCXHx2-zKsX^q0Pqb70EEo}Am|(b>T&=; z3gmyzEdUTC0f2lf093#MfNvlG5LjZtC6Lj1G0JOmXpo##BX9i?{761yhKsK8J zAXpv*c>;><0)!a>05P9H{(@{&5P;5sVu=y}fch3tjN1Sp28ttO5j6h|vni;PV*(lpFzo24pV<#8GbIe_jJ*z=L81@te^A043}Iz>)v}4IqAGRRMqr zG@gJ5`o0MO+4Ug)yg~S&BxD!>fV2l_+y!Kx73A+f=RtheM*~1*D#)%Wh;L9l*aLS>4W?O`ICGA0AD~(M4^CiK%B631Ar)q*Tz@?aJK}2h+I%S zptxnKLA-%{C+r1)GEb1*5fHy1EH?%KXrcxHohlG6$VSOe0MPsn0Lthf8z3Il<3X_+ zgLng77Xiv~QoD3kH zrGvPM>;!-skiUdfAdEf$5J?8vumN)FJ~B(D-qB&g&>@10Qe5_U+f(K^gw=9f$$+gIrYv20L3K$U(7OcN| z?0UVzk2F|!)03K^S&u3no`PTbcMA$x?yKGxRyobchX22R|Nr0q|Nr*?|L^`Ec4jUv zMphOM?*IP#xBvG4{6Fdc`RD5YSN%UMY^*Hotp9ia4;RaS`+xpF`BN4Vll!0kpFbIl zo;iMreKeACWp;2Q^^vx( z(hc+@m`P>gYND8JYHD%1!|f+Qb6=pVY{uci^9ra*B<7*=QVsrmw>GGOIE&C;ySw%6 zoYrDnT=La$EzK96Cs$d7LM6E*78cnSJSxYPdTv{dJ?DT?3TRIMus)p#4-bmiVzC=W z5dIrVe3jEH%~k(4$kQA2&_^#nz+7)6Zr)^Q!G+^w`&_q4capvCa}n-TnrLCDDb*Go z^Mtu)PgdGJGdkI{CyXU`KN^>=lPe(^q&RGw^vod0UeYyRPq4ajzj^A+rI#U*yvOzh1?f>yzF%BG>`to*y+rVpf4L(%)tGJxLE+$TK zT&^fK8Y$xC+Y+~OMXl9HC)eiOSj+%|iE$L%CiQ{o;EJEg;u#r#xQ(wgf$vJc=rSi! zQX>+?846sK7&r0rJ55C?%jx!ZQSl*F&ZfAnwu>KZD!n!BJApzZKC~T^YJi9DH$Eh< zog*^p-zZ1;uw!k0O6M*dN+mOl8t1 zR`s%5zfLnDrZ^MP&bi+Un^e!hb+` z;@_^zXY$PXmZXrJC5#e&@fuw|MnN;q-HRw~&4q~~u7)AvddE3(`Ms!aAdsj>(EdIH z|9ASicYAxsrnioxESNlNB=aKc8S$sN*y5~06>Tc#Bty*6tei0%i*}NQ(7703eg-kK zB1IX|C~E{3w}JHJGpl2`Y3j^vfz2_BOfja!posXC1Pv@RF4=Zif`zrmVckoExSv|h#ux9htjob>jp7R)$%b)r>G)dIWFst5;sb*4W4Y{Qo}4?j*xzUd~I zMb9m?j-QEs<&t4fmmWG}6bWNvzh>+zu+q;J9$ax)zcXIk+i_ewt(E=44eb=0kg~@S zpIpXz=Fy)&H6K3NuCmL++uUqC;1v?EZjw7jH-Fw(Ntw0V|KrcD_ef^U!@ocLC8k5N zKDz{o!~INRJn4~*4+Bk09|CID{QMO96!omZbN#WruqT3!Dm&5BFF$P8XyQI*-PZcl z*4imD>~mXjPSz$N7Mk$b@n4hXO}lIJ0JC%5lQv@>ZGj)(v;_$H_MH=Ur%nVq2?t^r z{~VA+@1*8GyeG_^my7ag>Mips(`p$R?=%y@K`KW_401~GMik&%>TPp z&sc-M^T$0ldVLZDgWtt-3TqPR)vo6gJP+$W#j+^iqtq$k?N#L_49XD2XfnU8mdV`cQIU>l zuPI~`kl~dQI)hmkhOM`Y@_vvaA(@d@!mFFgTrlmSkmQb;=&1y0YO-KE<|b5yhNo-F z9PD4(yvH)VYQ72>>nG_!=J=!{!MQnOLvbv^M{Aw9v8fZS*J=Isw3!(UbdUYw@ttK^vMCdglI|DqsIC7n6THxSUDM%5C@H z!tguojC!g1tBv_Gn?>%X^~=cuseyg<-ewOjH%TB8)5ckml#a}bjL5no?_vzm?O6zG zWNqrC)%SP@#aK406xE)FJ)cp=FdGEB0`cK4c;bFhp>0MCx*ggk+KEffo&!STgA#F% z^f@x7a3zkPb8@t$p9NeS-~1`b0@74#HnXGvrIas57m=g1G3@PHiXB#1B}0s!u4G~& zaYl0ut;Lka?c=S}gsr>=Q|Z^1Wp&#%V0HGQcb4~fYg+F{Jz1L(GD0ZsjZ~f2Rszda z(Z=lZ@OEG5ontwXl0Ti1B-)SmqB3@aUmo}6Z-k^zl-S%%M+IqL!)B(VWtl?yzcN2V z_FCZl(kDd4Nv7Yc+b2bs?!{fEP*Lo6Q9Nqf@(TiE(niA(ym-F?&-d!N9czi2m-wsx z$L@15ySQ2czjxKhh{SAHe6yx@mK!FG3zM{*))n^S>hU)u%lzLCa~H;(+dOAIx8tuL zm5&hV%t`nuLY_If$uhN-k|<#hukiPae)gZ4FH^9?yjo+SZBKK9%vonLMwfd86&of= zWzUXN)OgjOr}#<53&oHvgLbv!rk4>LV1e%=LImSrzr=#VXsA&zB6m0o{VCZ5#Sqh3 zq4Warf0qH^1Ex@g@S&Dz-wQ5rH;IYu$8~oSCobm~GE;W3pL7h0+@BLSpWEym-iXXR zD%Xf`&;6;&2Zq5UScHjt00`hprNcXK_CsG8d0#F4&yoQ}dHYdP_j&U7@(yDRqJ62mEms}Y zbd@MVZ7EH7`f$80_jF2cPWUw~-nmI|d|#b?9OrWh>DXhF{^cfC&1u!>mXyrskvQ>) zGpcNn34fUNY_Q9`y7j8(56tNwCRM@KzEd0K978!f*Ce&)Z^QOg#didZa?V@4!M5j0 z9$Xe({?<(d^T+xGp#=hU+je~ySBCZYeyf#JyRw$Lxe8J0_Didzwe{vmxs5Ujy1V$l zCER0T0(4&(|G4sUol?MMk#~zvpoH-`Y)M{xUBfujD&k?JD?lJrqYq`gR7k+PC(~dz zbXRX%3|!CCaOG%%rj4ro>gHmKK7kax$&94)EsLF*)VqjiLZ(ik;!2S48G4)CD{l&` zm{9)S+x&cnkR9?@6kHBuk6PT?z!OLG;$NRue}2E7Cdxbg-jL>a!GPYjvz*+jJ6Cu8 zMBHUA@0io2FHB)`RWpjrLq9b4C%fnJ_N=)+Iki%mtPd)F?vTAe{nH!Tb~*(MHLCNb zNJnn#Y0K>&CL?lTax<$D6=PszcV~>G`1fnn_&^Kp73^<4a!1Ih2Bh}%JB+I&9HO`+ zTh4*6vrV`U2-u1i7A`CfMerk2Ou?_14WyLsJ8EvJ0Yxb|v(ZCJw~hwB2~!n12Bg8T zCk;|h*o@J&w|6%^`=O8M?k&Q<@&x~p_~=xTBoKPRFR@kq;nCP;loHjCJOtgz#8uD% zmhH!~T^euUJV_!;aH5V$4xtekqli*!dFI z-!Oe$_ew|8PyZ2DxvSJ$qa|ayBYV(`jX`WGXrFi|@U#Uclk2Jt-t8~LK|c%;gc%rO z;x%^F#O42jXej)%Q9xZqO+m$zjSW$$;+B_jsd(ATiV9bWoF}^mLm5KhhjLhGh{qb* z$%~n{L$upiVA=Xoq8TzD!b6MPrXBnR<{5_On$7T11|pjuB17}{pDCC~_vt53D81`y z>HTbWz6~bA#06#-Rry(|B^|n&nIOH<#RzvB{dfZ8u{`9J|F8o;GJz@g(Mp3yJ?tnU}QD-RwV;>47 zw9w@zXq<~cKJMbF4Jl=5?-a%oukOqiIwoH&H6};S?A;FAHS?#3y z6b+cPW_{x3m3X+@%<-BFTX?HcTfW1-QAyc+oG}v>SkIIN$H~{m6bgk$m}ni z8ubuhn;?;s4ep_p?J0a34)B4!;ll3{vQ8HMN8CKgMH)b;i~r!bdgFTfct^9YF*i&C zAcH#$k;hFqK=Iw+qMpia+u7m`N{_&m2|YA0Sz^SDCs(9m!Z~kx8D14!YK~%{KN!_2 z&%`tiD~ct1yDqSym{zu?ICz@vvxY9E3#-&DD@I1n3n_iJdJ-ZosZKhyQbDgvJUquR z-=m9gU3S2qmAV2(JpU!X@OC1o^8m1~1r&KDkg|{t7*Z;~u+L^2dOrx1znql37=*&vWGd?$M>_`8`oZR2x;T6tPamqYJJ=cN@=Y)RMVy} z@=(5v%>Dhj^GSl9$UYKa--UK~(7?@gvx&o`dU(zLD3f-;Q)p$C!CKV`=qgl~RZiGz z%ffFgB|95Xf0|K)HN-(qIR|1 zSa?Y2bjBiD-INb>oDY}7|8_V2L`=Y09dPc@sjh;{(MffCTRrBa~ zAN~to+re~$by(p|eYIYdJS<)X^b>*(nezUpWYo{gU-=0(N%45ISbsPf5Ro3z935~g zz)w4l>n2lyw|>=x`SfBIE2TqIK7Tcht}g+Xm48-LCg6u_9K-os`pNG{HD?6HG#yRs zpxzD9o7UonRXkZLvM17@D>|e-`2+t32(FX3UDzP%=5e; zQ$_=V%dR`lcL2$)UnlrS=~9k|FLu-K@A(@^b)RC?#CR%>cB#PpDMeCHw)i-F-?lVl zqFQ?a+C#nuaPttbhQeC~Q*aYfdQ|yjwHdXHNL_-K)>DzB0=!)P(+V7#3@EG+4 zB6=^J&EjdTo_}vDpvsPMBr1!udWk3oB_1+=nJLAzzS5bnFbJv)zC#9+S~dV?5)een z!3i%VvG)S+TVUF`ZtM_5JxvXqH86_V=&h}I)37z&ciAq15VxnEbOTzM;q^`BW?o;L zYgF0>Pfz!A%>~paH#~k6bIx!s%Z@=GjjxQ{X+GvX*k-#B)4cJnEDv}k->Yc3`W$>4 zU0KfT#*MAD%@{GUoHns!yj3yA>|FhOpjDL=PAwGmlm+3J2TA3n|5;-jHfrq|X8$T2 zp^G6*V!Af=M84Y4ql#Ie8u4P?{0-yJik2)kg*8*8qp)f|>XF9UZutC0BG>WGrE*Ky z6D2R4*XZ#8Guj+V7T+S)g^z$Y|Lv;Qf%;`edG0{k950F zlF!sj>pB8IgER})q+eGor(XM%8s1BT4cdzzuM6?saJ|5V?JMG2$RCcW@T1qeILll{ z7Y4)f_nDMTjW+#$Vkz~VU*y+{Z}%)hNpqXe_SaCkmVd(5R_v`TTJFwg{>B`B!;dw} zF_;WZ4Piw(f{yOq)Vlzis;T%`zHuGq^=fr8yr-P4ir}~#keh(5*E*6fF$<4ywVr8p zgtAacF>j*jf!6_Xp_a=CwrAoaJ? zd8Nx%{|`T(Gf@h`nrrH+tbRKLGLOqV2#Tsd**rw?!G%|)`)*jjo>!?|ZyD`J8!Y9P z^4xM%eZIf_>78CXZCw}QYwo=3sZO!Eid-Yy_Lw*Z4_HJO_R=+P-D^ddl+E#13-u+R zi~n%PI(N{KmB>y56)dUAJafB}fcVW5X7ZOU)^=fMFTF)SKomP-#5FcF)Z7(fcge@j zp*3h@2cezUQveBPz%FivQbI>i&g&OdSc+NsFWE>?)uaH$Y33=poeb$Z8h8Y$U5?@$ ztMy&lS*_TLcHdT&ITHP6VTLq!s^d^;5^R!Jdke(GYNA?Z(oclfT#Z)To*!_z6_not z(#XrR9JJ-$11G{!y^v+-gAF33U|$Q0vnXE!;6sV%xDPBuR#HvW`)hlO{+67HPTv|@ zX4l~7g1-?V69=X`v_;d?RnWUg{y3>ww$_s*koSEMjD9wuTYX8qUL(Y1Re5ai+@SyR z*FOEhLMewYkOrxJp51(FqV(~1tk16C7lY06pw9vZ`<)nf{C}9l^yIqKg(}?nPKRDX zZnb>suF$}^=QsOT#)a>7wY1)=Hbed%%-EE{$S85r(iE~T{aEwDB*$Lr8gwr7DLp4( zP)Ciaqzde^9WCxxdl0I$Ox4NOs?n4ubJlsWtxUopRZ#IU?fw+&Cmv0$`7J;Ql1&LI zS6maJw?S@~-26bm`P4Qy7rgsNp*)lS^6BwgQeqTaqs8o_MHNdL7k(YO=j6A;PLV2( zL70SlB^Lab+3j^F`WBB_-I;dI4&H3Zj!finYaEP#8*TlNoGWoq>=2Akr|W+ok?F-1on72afF9VQDO#$D(q zTq4UgOp&!Em7yOVBcrFkx3Mm#69~DI6U~=zOt`IoX zncQFvyCb8hfyc#?1* zF#7~@3Y`zw(TWiseyrA9{t_Y<^5UP?Oqe#CUyF5zij^Vfs1~UC=|8|Fw;V6)yp4{a zL`n~SBMQ+xFSQ&j9Bp*!CFGgNl%E;i%U#2?^qqO=NE4TO+l|;)dJUBX_%FzbKLN9lAz)VC$Kr zUajba+(>B{Wu$SUO>>x>Znh<^elSnNQxrXRl&-GxPlEeaMUKppF{gTl^!H-8|45n1r8zKq<_nl(S}M%6!8aNi3`k!D07sifoY@A3@H|A z%~h}sBx!lHf}q-#yso?cov-SDNE-`x|F}{?3ag>SQHiSj=~PP)-IP{Fkq+l}Y9tBP zBF=ME`!$iUA;SeGok)(w6QQmD$22YiG8!C{I7Toglm}Ubnnc93!K>n#kNUa3I>v6Z zr|&{fA?r#i&+W^G=|;X;_QGU*p~DB@2w@iVf^uGmn(tdy zwYioc>^GEOX*+Z>pREE;KwHi(uD9w!TXl(@yRUP;ZCgkZ7Rl}xnnhK56f4fdiV5~r zHBCC3;j1g`zjl0m8SHH|5l1>KN09tB@jQ76vS;nyq`EcnIaHH}8*{d9S+}fQRF*`S z{C%LQS~F>;o#pYXb&&`l!nYT7sET5eesCgg;ZhVDdWuY&32P&Ky3&a#XCA?-plA~v zg(PxAUG|}i#Y4;u1Pjl{N3*#qY~o_6X>r`BtUuvyiIUK5u&k9c;CXKovtdcp$;pKs z^1#!PTTZxgN5Z|lR?`1-RlX8ARTVyqi=Jvw>E-%`7 z^6gzGSQ9#->iSyFh+B&Bc;i9C$OUc2(z2NAC-Th6ZT;7>TB%b$}rk(KZSiirgg2Q3Jfhmc|t9cMzLb= zL%GsQ!(73p!JteKjTIYvLDQT|OBL`$$*30=*6LF>mo_xUkVQ)>l7SQpvp@-#m&_;< z%U5Hlv)n47fU?J&L+i}#*_Yyhd}1(Vvbw{*%#cDEQx@HRswc))lSsT5un9`MkLiPP zFk5Kg?eY6%m5=y74)M4{U$e*ft?y>Zk}YJ}(8M-S3Q=d{e0?P#9|FJC{cAyaMM-5v z5s$fTQb&1576nCSU3Wp6t~!SKZr1eQ(HxipO^KPGvYM;XiQ96qE~6e39G@HGD_`sCy9 zrfkHaIk7#Z=I12h#ddEzB(CIGc5J}H3eFaM3!CfHT6eO$!MB934S(WCf{$ub2tVWmBUnO1mn7iqZRT=i z(1_VJ<)d`=+`*r3`i!0^EFh~P$f^&aw0VQOrl=~S;ReG%7xpVcH@eI<>qMzZe2ER} zJfI~_)xGlklPJQy7b&5F6!7d~b3fHJNw+r4d1cL1D;ALAFxP+c!f!vm!0QYP;4}z` zfHOwTR^2EmBd2bvk-LXPdo`)*I3!zhfnv8|^nf9o%cB}1cu?5%i)p{%;55r4 z&O>rW@B?i!V=@ZWK>n2_K@Gom4PuM?A$;j!Tn{GWL;sUoipG>Mf038BPiLLwoE3rRf(7+W_LRLf3gLQ-`rr{2TA;umNvRINtioi z2E`be)O2&*^#m&tjMNx&dg`eRNA9j%l(r4=Pthl06v=`7_x0>97l)gn`+B9$mGP4q zqFKAIUiwpJ2DOVtpTtuv>!{Lm*`)Li|Dh{I!fVdF+mcA!Jrxz?)`XnmFJ=_TnJ%SS zIjz9ed{0|A60OEPXuFQwddeuWQdCDDR!u`q_1|>36M^!A&lpJ0#XMeYnbr-XWn!-G zS@=V`QMs#Dmz0M5-Up|r<;-<%{0q))%gPFaXdGl%$cuE(Nj5~6BCM;Dmn#;l+xzZ| zKG6<0vUXlmetuAA%~34gL_2U0g}h76QI|q(-b_%m1mGcu?&|@eLlfYisFr2Ee#Pm| z*4-(nE`Emyd-(A|7=Qff(n~`=k>Q_JYt%Vg7!bek9aP&-N})B!L6J+%y$;k0Lm@UY zwWl8-g-g&1-8tF&rTI|Z@toTp5r@+2LYjO{FN#8vHjc6*!T5~_cF#4}xl{TVh6p&S zTMXZCL}Dealt!;Kger33BvyGwN5?lA8S!1nv=DLwGRmS|C+an1+r96VSvZe&s9f7m z*JcLUEL~H$UKOiCfjhY5GT`H6mw3@As#ZEn3(N_~e-{j6;XLhEW9zF7Pe=3Awb}*fx;rt)*jfVW za(Rq$a7&`9q4IACjqR@$Dez9u0NktdZ{XUEYXg39UxcpyZVqdDOMji4|3)S^B&N7U zG03|1C+jBID|F0HkT3T)7C5?<26rPa)VWoY&bmuO-TUM=rDT;9OBa{BsbRJ*gQaU% zBl?k7!0PcK6hR7#b-Ek(NDTeTX*Cih^ME zdN((x&*zYNr7te&E5j!mNH5Bm2$g5yrH{g*WJ*mbZK|Cj9Yrk$j-E$BKiyPD#sLK@ znqjP>%2Pg}~{oS0&M1yh-`V$gN&rmtez0ip>6u&$So7U8Gcx zzep;=lBQ~BDuW5jY`GN=`f+xE>D8X#(PEtCLq6}irm{1{sW|zsa50N~i#`ETSWuB+ z`3(HAGsApt)o_QiQv*Hp_9VBdYb%3V-cof?@~Sl~LJ0mH`G&c^C$&RzVGUu6t3Lj% z-`A85KjjjiO+V`CXLjZSTJbh{@~Jl1X%aWc&`y%%p@?!zrKQ~?^P~07j<)`*V|!XI z?EC@@>8=}fOLp)3T(AqT#uXMO^YOD?3*(9I!ALY_pPl?q3LY|*=B?9v-DQ_sKYI=v zufDRx&dM8fka>QN?+FZ(%qpUr+09e4QhLGf+^;=_@O!ync!TKRyJ`N9uH;+_h5vn? z*``B#ZBDlWkAp)DN2*e!|1%s{KbW~cHnPXxV~@k{q~?5XsY>pPAvNu93cX~BVj7y? z#ZYN*iBr4W(8ZM4DEbPm#&EIfb4H}GkQ$_;YD~y5 zQ7k0Zg1COQH;541yUYic9vc~ajyp*#Zftl%!dew&Rq!*CHl+PrNWFdU%ZMw-2gn^< zLGp9hrT_N!9hK9#G`+9A9H1}tGB_}NHuwqgh9b@ko-c@4J;~|b?E(gC_}9)>C#|cg zs<{jK8hB1Nv+X$=l+o7PpCY1<@$7bh+O%)z=9}N>A1RB9uh6&mRR9vL6|$O9HSS5m zTVsQ79Mw{>F7DA@ZKIv`%*i&IG`pFVVxDT4kPT8Bia)dK3*Z_t1~&f5<0i=zSfPVc zDpshXy*Xc=Ci7%{+hL|jLWn|L-?!fIYN#)^9=R~TG-CdWAw>zGi@mUGoG|n(+9hbE zK)3jz#jO6&dYCOSSjjrYWlS&QojQrrtwjEjKA~ljxUnXV)muzxO{bd#7GAN{-Nm;) zZ8CCwKETr@dB^8Gdv@af!W^&XTCYYGaVDVJvN?*GdMW!Iu%D>COzZmc&G<;mCJt{n zUu3JAT`*ME0cna-5ISAG+Z!oPmI6)ts%F(s>2AOjV$cGN-$HQ*{*$@l<1-tJksO>c zO@_ebbi~ifhIWEyum16@*YBN7=6h{ep=Nx3uZ$FPrms-^>UYaG~{pjx!zW%k@uFvHf~5U ziS6u)`i%l@Vm}hX&w;SzJH^FeNj^98bcFvxZbD;AQEdoo)D348$i2 ze@k`G7DPRYBOb%_Z2zU!K6AaC1v;$cbv}|Ps4&x3nX6?JOoYNOp_}WIk3RN790MLd zTlQw~>0Rny{`5v|@%}!dz77>S)SS-A+Tc+xZw!L*-?~0YbgUk4)~L9z(Kun%3l&Mz zF$$4%@x8?u0aGUf|2#q*ksy!slZR#sn=VgjvAToAENFtS)K>gwWv@J|L4g+g&lA&> zU;113HRsOT)P$LQ^v~ZIGzkKJ?hZuOt}$1gbXq+el*IsjbkNptVKR?7d$lmuRZfglVfNZNBrAA)3Pq~pz`?nw!`KKTSE;@~c3XHI+ zLFM~Kwvg7CyhOsMaLwaJ#*_l^E7F+7H}66$&{?~cKzu8&83j84Q) zMHu^o-#Q{nxoyfkMx;WoZo2P1ZYZpb4n=#1GMfub$&H z9UnI3^c^a&m;((Lb25H~{UQ{r2|`QTjl_)*MkUQq$YR`B>@&G*p8vxWWPWH(3VS79 zB|nO8iS#!*(IcR0azH<;zCtc|dRJ+ek!Ae9h>w?Q zJ6v+R-84Oj+9k5h0?o^(U|BO25jjLM_HmA3GvVjTWm!#y!$i!BRmIk-(0XSIYEb&? zGBe<27jlHFzKd(BRh+bCQlXfIijvPNo}OUIms`d}2bUc*fjbN{J*&8l9_5+WO1$9- zLsW$JTHt!B$V((9wbLVzG+?!cWw;`Cs=EM1K)SzWbCkZoF#YN_sZ|=_V%fZu>+2gA zS|(f43G7AcEj?tcTHyWswnRZ3^lnV`(`+TqEX@6{OF(g$qN&o=dtjPo^_};)ELEO` z_O*X=5|Lo6{kpEIm+l=ezXJuz4hj)MU#c42LUtzKdoUzN&EC9)6se@<@hIC|*wxu_ zQV{1%T6C;mkHg?+sNr(@Ad_kKbi`&i{+7}md-r=}=h*1Q4DB7>CDG!lY@Z9s4etn4 zJSl}f+B_=#V(#%Y?@Egh^t-rSET3uoVXH^4L*Ji;YuAC{A>=63*$I4v`G^JyET#dAtSm%?p%J$K?PwREU3e%q;7-5^=d%D@_3 z+^mQbvo#Z%iqN}e40>QK4!XTtv1ECDXR+ESRx=fz8AqMZwd4h({c65__~|U2{0-`y zbfGfwAH5{XcvLV0VGpm-rviRxh+MzQ=C6q(*}#8&}}cbK-JZL+2(~~Oeqv8R>WoGon8um#ql2;3SYk@6||aLtN!u% z%Zjx7q!v>gJn^E@7UGwrGfo#37Sgq=YbSNSGATWRvsUz<(yUZY5N^#W5vt~^{`LwN zQ@TEuHh46|O=pDmI!f@~4n*`t=RN~5Zkqaq3z`ACu+H%jDL6-U$U@vY?k8XFc|w+n ztUH25H38a$?<+5aOmy*tg0wtO#>)cy(ZhZ0d-y$g;j+3sejY71-%7HhcJ%r;6}e!* zN-MUg4LQ+g1)LI`-u|Sks~1I8gw?lPN8062OSJ0@hO=$G*zL>@*IS`^_j=Pg9t-5W zO6p@=I^ThRd2&CHoSGg=aUCiDBmCP1;#mc`2$DeHN+_6bksyoi-$lh4RC0h86_-*p z7#x&}r0UD0^v}Ymx6p{Ng`HG^20bg29DaW*&X3RK;{DRV$amPIw2|Rt(!`)eLT9;L z@a4U*SW&2Srx0`%o1O9($hKL=VPQ)UBL+Ff4EyVUdoviu^3aSLMSHQBn@AQIvtlWH z%JDoM=Y{rn`DSye@ir2lRr~;DQEPSs!wfz^8f3(c+9`}GN^3_L?~LC_h_i2*1lhTu zkl*~UzxOo`N=Cm2qG!J5%#FHsd!Gnnqwc3|>AYiMFAttl^X< z&yR!Squ@EZkutroMJvn=tr9}e$n{`3iYVGWrR@9q@;EXkg5d~mL8Q3B9-6DGY)<& zABtu3j?-S4r-Wv@wr9pjYsA}))P@cyQ~Q;cyY6K@c{1Hx`g~_>q7FHaS{AMIkuI5& zEG2P%I@c~6fY%<}1NWyaJLuF$;wRg?CB6+LWqH5cv61xqVQ)*ElU=A@4AzCu8>?n}uX&`6Kko z4?sJ>_xF$T!jP>b8X53%ChQ>|yP$#AHLC5l3Z2!IJ)5b=a-}@NAO~x&WDk0no{zpP zK7Bxx3X*RcZe~p|>*E26IPiO8WLSb3SyS`R@%3Cge!d3ZJy#7bt{->Mp{h$a2@Ltz zOF531KAPP9D{dpsFpJ>ad26GpHIf>eE>Lk{xdgFBe%6L9eBLvn7U~#6*rnR`k}v)Q zxcAz(IfWb58W%OFL=a%~?dQ>N)XEz2ypgaPeV%luwD-;sc#SqqOoNjYF;x1EC3dGw z5wSEUw9QS^YXXWj^}y}>**bfbyuB|!hW6hrZLhrcK_o@aO6BoO0qv=hb19a{WcN)c z(vCmwiMjo*9VAndVC1b=n zfl4}NMDYinFead3?vdXn<;emv*Y75wck8`ax{S$Dw(9Q zDxGNcp}XY2QqZ~aso0|j0cYP(QGG*35xEn>OYVaLNC+Hw(S8YE`F-+!l;KLq7#6h9 zgpibU2uhsiDytyeTRVN2Uc27~(4Ph$p4C37@C>?Uas>doB7`omE;#huQF|F>K06VOw@L0^@L2gpWm)x5Kg~nBzS~6|b{uO?0no9z zXf&bJHlp~0UJ4wRc8fK}(JQzYHDw%2N3O|{7MEZt&pgj2VulasQV8VkYzZhEG zF!dMis^FQ-^WTRd8XVK^u)}NYfF2dWl6tt))#l6`YF{!;C4ah^CF%Tg6$*xJys=p2 zRg9j!VamjXlxuRLEj26oIzyxGpp#+d@B(nS+}_*lmFsX~CU9B5;na*3m8EO*GVLX^J9wcpu$@1< znf`_Ifd(T0CBt)fi`=7lono{&xx2>lnW_JXi`goGYohi%FBqmZiCpH7=}#O%h+B5o zrn9sU{;%(cvj&+_m$v^Am5fKBFoqkio!|K;jEGPLRP3>FHJ| z#qJte^V{;eusc8dED9LGMv;jmk%#Z$2$?2~$f1%YMN%XnkV?Z&{{olVcnw!0xYSN8 z*~>sSM5(8rW)`JR9C<*!k!RVHBl!ktP)O5r@w*)?ZHq&DAEH$86~6Oe>#FN`z&Lt@ zv@!r9l6YX2o{p5cG=HnSj&Z!|L>l6@itQQb)Nm8CAH2;o)mw#$Iqd&rG0I@o2szOs zso^#U&F2S$Tw=dhbW#@J1FvjoyRST?rNO*8{-RzehCmZ%3wM;dhHPsRha(kkW!xBl z`^h|i|7+_z;^!+cBE08dn(gzY&W&EV5ql@!kU5HtcB7|}=kp&pvESk!wbe$XbO~QO z7giOVS+Q+aQn77272CFx zyLavLpL5T>Z|iN1w#Mw3eT=qjymj;##;1A2!B%sE$xzV@j_$RFo7z(D;P=AD*yS4! z@|}%6V)o4y-M1-kngz^hAE#uS(gaY7Hgpc$K?jEx6DU5Yr;($S&t6+hNHZZ87z`7x ztkQM(`M_!sBMT{K=V`Bdpr5+zr55PFJR4tTiUfFtZ%H!I{-sYII}j#V(RV&D9u4^i zGBOg#c?c^f5a|g$hE4%Wm)-Rd_IQ|LZ^7)9qtSm=a5C*TwKP9Y;wb zFby9e7d(T>Gsq*I0ktR84s=7SK%u~S&YyE?qMll(3dQpozSVa^K zHlcjFT(W?6C)b}9?}qU@3Ol%b%n?q1;`*`cN{UU9ohox1K#e$77@`U~Tu2@TY&Crx ziPxko4F9xVR9V zxz7ewov|JwvazlUZ=!j%)B#n=7|`zCp7(9)e39lFTq@A^?atq)WOEnM)ocf7dR^1l zl`lpQVAgDs>i*H+>1S60aiSJk5s0I=v0n|t5SCEBAKa|2*GtD2c;!A_cr zc8yMPC|NU&`!K0bXRKFqY;_)$_8U)dTKnYZ`DQaYrd1r!%gj3!gSP?Z&9(63q{+ zaa|b`_(}fl`2fM%a z6vfDagc~cIh-}Z=TLn#xnSgAGjBe%%q)@Fz$J>A{q#~jO?&re0 z?{KY6e9ztO-X1m{B~G2TJ$&)fx^tRt!SM(^ix3cj7WG?PbwsjpCkxos|5L7_6gjwnc&vgl>&T5O{Q_ttL%wNU_B){Xj%jb-!CLW zeKMt^qs6W1CZs#xd(d=%8qwvjT!_>a&31N0q6x0eNFzq^4))$89-;l!8F{# z;a}HV7>kY_)V=)%X3vr|c|yGAd0hw@s3|=injHlpi-i29=`fvY2(Ps`tammm89DTV z=tI>_8Z0;`2bnNx-iyf+E{uiNGg9=IO2^-puXGoEo|(cvyTY){?!i`;O6^_Eac_BD7dK$3h5x; z@r|Of*WSGNR8BOytT$2^J*hXb7E(4KxkdukXmqENZn`2ii&hVZiAd!)7IcEx0XAbj z7GYu$HRhCIo2F9d^YPk4j&~ON@=wU%X4K@$`)g*Q;p{5Wof zu8F*kwU%+chvCDaBA-Q!Y$$Q7|6j(deIh9JH+pu-Kl%S;yz0EA3H3Ov#3Qnxea8n0 zx`)4+m4k=~D_4t8=WXHWov4(fVJ5kNyvbwW15-dS5Q>D2EeE=0sx!H@~d!fwH3sMOqMbm8oJ2)w&n?-Rc-XVjI7HKv)CpDdiOk+Gy1tXw_jVU@Y zf&~=`^(99O8i@~GfBnhqcC>dj^W8Sre?0Wuu^&3`bnwl&Z;n}mUw)Njhkr92#dQ5s z@2IIUVBKxvGNZrH>-kzR)C`%v4#7xVA%#)k^T4t)@fvOe39!ZP0JMIDWS`P$OHa;GCv9cS&!CV|cZ$5qX*>g)B%Dt>|RuYX=2 zdVZeXa##q|7Z=le5*#^Pe*1rV%0?pmC-eVeS}}e={lc)+e@yFk_LpgIeAgHp*72+) z)+;MZM4?y7@Ohs@rNW8O#t^~qOm33zW{ILaotE0PsK)uEp}>4$g@gco?&%qwh|;7H zq@i#<>$Vk7lQnTH>l03gtN2&eo66jJ6!--1ow5?qA-_b9f&bu%0vhJ6Y~;SPvnunH zdfXPO^9+t4#uFrt|Mx8Ie}uqkgEW@xKOs0vg&h; z>b1=>4gJTrZtqPrj(+ei+j0dfZ> zWCez@VN~%&kk>Zj<0WFrDTs-LjcLuZ?uFWq4D{bEyyM0SKlS_<^@g=dkC_f%ZS))> zPU5rq03hjI(<(J@$9BstF+c80&9WX$x|iR?i!zY^DK4H#9+U}I?43)jy+$z3BwJKC z0)Nf{gyOe_1Y?HU=vH3A4zSC&Z`bw*m#UsrP;x}PqR-x}Q*0_yzR(lx57<@Cr9*O& zcbAe3Cwf$EQhKF;rWZq`pjuTn(ff@*xnDj{nUJ8>gr%j%i-oGyP{3;J{YN!Iy<%7Q zUa-&P&Ng}*Bfq8HXYwe%NV5f^P5d2m`G|o*+8`tW6RTJ2*>5wicfU;dYBA@} zm-OTt3^taJce`D;>?aVgZ?(#E{#WSszmc4I#PZ*Qre(T0>9`>xNA6YzO{=$>6q&t? zxs*81VbegQ9=NQKggn#qNi2tYa1IGslvZc?J$JEsdQMoflH5NwEDTuG+L#!kPv?-= zOi_E*VnZiQ1G}r5)ZVs0Ef*i>ibgk8`p{FhCbz^18mZ5V24M$i(A*j;_k`L7H93!Cxz;pPxTce{^XDZGe(TyP*rEkt*(?Y~|C4f!XL zX}#n{HUS=q&LUwhTbSmZX+lM@;nlp$DdN3gB8faFId*pbo*-HAo(eUo$znE{7xUdk zT2r5rS5^$a~u{Fdulb?HuuWETam0eD{1{AIw?B7 z=b+CIj0Ac3QmX$gx&FV2XP^BKvhYURZ7`=}K@htd>VL?dv#~edN>8E|5ga$oqynF# z3ipW0FI){OgzvYLnOeS*iHiyoWoCv|6`zvD42dXBpujYSQh(z2eQRL%m+6|azI%R? ztP<#P`=D#%Pi5`-*+!4?6G=oc0rCp~yW`d|*|nbM-mbzShuUgvel{ z%i~bk*A{}zRRni1kSpp`ib!Fd-BLmbFSOGkunf*|VOt6L>^cZt<~gz*mFC!Y>N$Dt z1kOfTld{s+D+Eq8WS3Uq{&i3POSI0Yq|wi?FQdQ&r_Fv3#!*NHGl%K#kjt(}5YTat zMsmsYV*u8^LN7%lAS9j@N@{JLaT1`l1#8v6V&Af~b(Te^(`>q>0?jHNIcyq5Rw@lj zL7jr7f+EGFDkY&@SrHk9RtiaXWi=Hjge8hyik*x~iKM2ATv(zSk{O81RS;Q?L#a0B z-xES8R9IjnLO~VUF6#=ppgJh4p+@V+&P<||B-%?dlZ9W+cpZ%$te3Ql&HMRU%J3*T z?k!CaeZ&z!Eec6pUl|OcgdrBls;1^3@4bVzL4b0j%E4zl@h+o&<0FeN04Fe5&yEuX z%li?0=p_W&yoG)N!oZAhJN-EiMi}t3k2uvzyV0(YaP#hf*U^k(asruTierXJ8z^qfqumo zMV7YvjU}%`d57~B{>YRd3^|cQ0;t;DD?xwt15`nODSgBn19Q!%vx^Pp8uufLP$18o0lm z6wQOnccrCrX69!QU-TQttnDVF%S0Wa$2@sv>A~Y6aeJH;Vuan6%8l|;BHQtZ4pqB| zLf$v9z{YrKXB0B;C(Kju5VlP)T?Bd`w(oGkx4%XJu$@M>NyrUq0p3LdnC2qjL}ltps32j+}97Y0Y)q7aa?tWM44XeGwnyKkMVbg|?_#Yd}Z zykDr<*vTIBLb9K%`RKW?N{m?DEuyGgzj-FGcrKYfKL(w~?bQh+vSf!`lr6G9@&v+p zhD6m;t;~aEaP>;IwsUHDlnI5V~t$jbY`5tD6dL+hXi#@1t-W85Vn$NI%` zxasKmHRJzs_p5IrsoDGGCSybCd9YV_nSP1A%Z2VmAb#T z^a+_?|7djRE?1QyNM@l2#W1J)5qxEV5PR zv! zcE#Al_V{&F%V++Zzx-#b^dV|teE^{XB4BX7XnIUwYe?T>Q-^?-pV3ED_wOw#n&)5h zAm}aM2gb_6$S7kR6PlC50dP~?`x36ZdHSVM=Y369%Yh^p1ma1E3e(IOK+#A>VSXH? zn9wUb7PMxZRB}!T1}978 z|Ji@YG{XJwRhZ3-6`YE583GfqsDHfH@zGXQGp2g{X-(j(cQ2z|kyOs$86<_6PWcbC zl*g2-{}Q-wi|SK}w883BH{<|wk%x&bCZ?cedS9)7_wmw3qBML($fOz=s@5bZ|1mX{ z1y?tsb!wSRWECg({$Xa7*stl7cExfVvMEjw4iaY`Q$lP<_JFdh@NQV^xofk>**Jdy z2{Y{kBk@R}w|1#jB_=~!YWxpybD3&32!#Po4V9jrom5uquN&JJvM`FyM$CnmO}ljTvk7Nt!&Bt5oGpwhgqI!^#2)PzbH`w?uM2 z2}m(}B3B<8ohrR<@vM?hXGfWb#A)GUbOnw^S7UHt1Qa5Zm8gDmn`Fw|sH92!RL1tX zk0){jU2p=*g05NnFQa>iVPl)2^725mulHa2V)7_6ZdFIn~#+=pRD0(kU4a6)eCzh zx8~iDz-G0@^gBZm)0iB48+pvRRk_z+hbulZi3&q+!jeYv+5- zBce~WJ{CwzUC-u8$JfVU;Na%um~h zJi#c+HubnDzTXbhQOl9H2QO6Xm=^@2}6TWflD#QqCpIR3h4-{#Z!83W`KQJ0Z&`W4(C8)O)_DmIOBdPu0D@*od5Nfj1xW18c$a!$Q5wI{kTQ%){_3(f^={lG2k`4+N zEecbO1t`5>3Qh(FwO>B!Lew&&g}L$p$`{kG!3B<`a)CYjt5z3Gfv2y+OjPCge{#H@e={6Zdl;SIfsU8>e^h<}n5JHaDuMq`pQ)!N zr6L(9>85A@?R7dzi;BtPeX!R|2gYxFfxE>7*O6s)fQ$w*ZU>h~wyTPq{W>FT*SiMd zmiz!J0*D(EWBz5PFW{ZB{-Q3aU^J#=D1kRY8XfiZI;nb*jh&SujCh-5yQpTv1dgNc zflhM0Uyl&3MgDSjpsed6KB|AU9e^pk&4KR^K`Q^9A~BXu3`oU0gcR)E6;t|f!Wq{q z7PHU{m!q#E*_9lC=lAhx!Cv6kL{5P0C)b28{P|~aUnN=x%PSYs_*4Ya!Nt$QhC+K^ z>GypZHu}8z5mJ`nW8Sj*t>+3+qwTVWL@7H6m)eRpV4uNh4 z4TIVq+Fc)d3*TVUDEvl+r%k=uZ!0FLYVxF#+zD)a2nlknKdnWvg}F0J%>qnUu+h7N zYg&D+1oLJe;phl;VLmJj7U{)iAsH4o0jVS_>_^AeqAXdOiGhE@xk7tdwM5EN3@|yo zarA6%5WH6<33`AjLnGo~@guj$^Iy-#wc?roK#1l^Nna)~Dds z=UfP=b$fs7!_QLu-V7VEY$&>HMq8n#^~b*YMqb$t5yL7|LEe+zlJ*)qNHWXYNp7XQ zwi%yua}Gm44QBV|(-wek(z=W5Ix#fR#g3@~kQ?4L~W8|T3!E^QJDD$Bwre7HLC-jJT2i=*4AtO=F2~WzG8~egD zhVlKR^TS#S>vh2OCzp&^I7dhsZUx8$qkWf4V9qSZ!>846`Ro819%OXpXA@8IBx}$}fHN+#x0Zlsqh% z+kr=LaFBP$J@+xhI*=zAM}b!Ajjy0`Xbxtpr{FE6u%{&(yRGt`@{f9;l{-kzbcW72 zQjGT|S@An4#^@|a{HmhO&jp|QVz>d>f#iG0g?oNXspU-MJI9ymf*!Ys`9& z^?7{jFgVEGiD?r2q3YD=$>A>exwuuZ)cxu)vE@7%g^f#azNhC-UQ+L!aDuKHOA!yH z!hmA(mC)JTk_Vv_!~E0Kxl7^z{b>IHY23+hBFz(zlKto z=8E9Em-q={>GZQwr$m{MwzmfK?aYq*UdHefbwJ9X)&fhZ$2tEyGE&jNL+)KT`P-pP z&d|onRvTcYHhr(G=-XCt3@T|5akEML=eMWO+&DfW+|>Sd;0p%e-jaL=EX>*?+xnPi zrX?_EGgwBeZ(%4!hJl5QP01h{X4G|}f>uh6Ql4&Hc5|U>G9q?twfd(yIMVY<}N!OtMYdbG(VV zOM^{!yG`J^X*Z7>xV#Jxn&&159kih2i{d_7b~=rZq{Qy~q3H@2e(;Dz9cb8Q9;Q2p zl?`mmdFULl>}6LVvLaYvS#Uu4a~8`bPDYWU-AuAjX=aBz*)vc&iUCelc&usp|Z*MEJeIe zaGt)-YV6q{DIBs_=7W=6y5)CcKTWeC-kHQlqsL_0W5&{@Z7N~V)NAk{E064RGw+dR zqAaFJ87(5pMFpa^MoI~x7S2BsL`B8L`G2GhdN|2+7`P~USj8Cl1O)gf)EKw~Gz!Ft zsD5*Tl#eVi$P)E34GySFfr)CJVjLc)ortKO1vQ-l!_6v;PpYhC546T30S>K5ZMufQ zJhC^nb)46S(fpok|2UPZSb>-3uv+09NB%wts}ZphZL=d!3MZ>0Yyqzur6-K~eB?{( z3M@8te^Zw$Ws|yCZ8*Nmxy}wn%zM>&sNbNv)laK*J{w|D_!7}7lcVU)?V%ssHsz4^ zMl|U0`&Jm25}kcpZ6RTeyyt_@H?GOUL3z^`&ubP5GW>(_4jB zF>7i#iKJw;zP@&vtOQvgDN1gZ2=NwdcL)J)6$Ecs1__)X73w;_Q9k5@p&Jmf(Qj>g z37MW?9qg38k*OmCMCh{0iL2i2K%U{SyQ1dOP=bk^3&HbvLPWHj0SYrn%D2*60&60$ ztnfj!1rRSRiII@TQ#SHsqQeiS7DOlq@E0$q9o(*+VuYA2_(O-Q=E`|x*l>P z<=j!_llm6M&6?3cC|Z4w8+@-cQloL5R9KRcNeFT)FlijGJOX&m`VtS=5^6KbbFWrT z?6|-Qnp$fqCs5X7W5s$EqH0TIaC?5z3AfeWTJZU0gD{yjd=>)v_J?X?KMES5|Y=ZuA+Xt^32$tBvL)9zhsyJ2&WGBWIC_w9*P`%2n zLFZBuQZ2n?+TwtY(F&%@C1)^DzZ{~?wK_6$?D|;;8?6cgWeFGH7^weeG;Gh(-ce8D zz~rLy5zJi3&Lssl)D2r#8oj=UCYMeOspF1sr>7W&u+YxI5hNM8*o=%unaJHC_=g_+ zuA;L|BD38ANsl>pJh>R=r3p|ZR^Pro0e*aH&QlMN}c=9IdjJ=L9V&Wyau zON7CQNjU5W?co?)#LFLiTWYubNpT@wAT!mFgM6261!>_jKO7=I?2TqtLwouaNsopH z6T&wy`md-)=oVj`p9JYCnm=`QeXDbA&Ffhwl(d9WP%{ESg&|L5Y2!SA;zc;g7(4ah z3^Ne@0KRffE2C`O3tgl$Je*8^K2X&ocE25&Ay#3-)0)(7q(FXqGm-(nO0hkE64+t3 z(`f>6Et}xx5$Xlq`)%}U*AavM*p`HRc!4{aELoo8$kjaX)sep^K}XTzU%i#(qOdW7 z_+)aPtr4C56u6lNqgD9~fC8r*L8L^cJZU9rN9D_7yT_k(MQlz&h|<(ojCiwDSsA_0 zhb#x*N&Ch?9QqT8hvL|aVm1Q}W!^tF3wlvhS9S3YzAm>AxG**zp{L(epMZTaHDewQ zLX#N3(T>EyGpc`Fyp){N1oi-h7dv0@bQtNsOJ4xTo^ywWw1a>tW%}57;UUC{=-%4B z7W5{2S33Sm_jD4acz$H8RrGDbZ~&-aEG<$2?=nL>P~V#Yb?SEPkp!c0vbN6lmI5Cz zNj4Y#8qDjvS7vp(7U$bh!f84r2B5=?Q^-4nM9l!?LDm~~&pq&C6Rqae5`pmTx!o3eh73^fSwW_?D zTFUFR+{MRVVuk`BTzA+}c)h|76J+Aq`^`xLaEFkXv0waAXzm(qkC4AW6VWQrh=Yq~ zf20^Qtds`kMx1;1{^BT@)*qGOKZQ(a7V}l&yW;4r!H$c_Pf^+agSWRmCPcOrzAwM$ zOBI8QeoJWUE zFbFM>!-9_26(WD`cDFuuKa7eHda_Ox4~Ae9tlzjKo&yalBOeh@x&5`_7IH6!emp%D#Fg6hgK}ejU zPoy3T(=naT@-I{y!Xl-4Bc2q6)6c}@8o?OD1r8xOEEm~kdGt)t6mRwLYiGthP_5jR z1)$_v*M2P8jCEBYg+m;jY;7&@Uukk}KK2g7(vM1|h=Bp{@i}0?wvWgNo)O)r4*U>s zEXXiq1yEhvju>Gtu0M_@w?*+=Q{qJUPl%N7qhQS{<7ViDs|QTk2`0j-sXtnV{3w2o z%1SG4>YT_h7Z{%NIEea@pOrauDydag4YSWKOAUe=?tU?}-eWF|_8LV1nR8~zvepFU zMtTO|{oMZvcfZ&*q=i!QE69=t?mPp43)ju8k&oyfr)!2gW@TD~lIk7SS2nkmK|_L` zw27AS7Q-$kot2q6G=Neg$)6KlA$sRYu&#k z46oQC&*T5*sL3ePDmF)Fqz$UDMzbUE{2YgErQF(5^j*cY8)vj_S==(hB3jyjJnXHI zz7<0(6*@xhL27`(j}JmKk!cLgjRXGPVF}@8ek>n{-GlNd5~^O4o_LlX=?d?Gc|j30 zA|!-2V%nceAv(ZKce3CRw)F5X7=9qrH5o-eHcyz_S(I6Y$Uc4lnVh-MVjy~2c5n`5xb$;4jviqYzHwr9%lt##!Q$EwBP;Gjx3a+ z%%>;)ug0QfCi`(bJGw74JBb*(H?6`IpWVu#lGn4sbAy$eMpfdQ`gT#t*qWUsKnBh)?t)3qG z-m|K-iKUK?!?W5I0lnHQnA?TN&2<8yi6MlE=ZW_`s*o+ZYmF6aKVQRLvkm&IUL%4n zhO5EL@Q(GYM>Y+eZaSMAbD)Q7BNe$8co&udysldQ@7t7|PQ>@0)ET=oWBZ~u&eV?$-#2mOgyyOTSg$P^90 z=PCGnuvxDL92}33#7Sd=l1%GZ5CHowL8z=b7W_%Aa)Nlv4I@d(F8jlWeTyNTa!0mj z4u{yKcmw?y>2{0QhHD20GR|&f<`|;rxY%b$k-W8fuJLysWW2Q*P0Ion|1bDj(Bd=@ z-P#*Fz7F585Mbj84Jb)NkJ4xiCw)sn%j~wmEzV!fJ{ECmyvsj2+4${T#xhL?(-V5; za@@_ss$K_o_Evdr^U?4-m~iWKOe(wV?pAjxD91~$$>gCDP-4nG=v-N}e~H&ujL;|G zPzPCTf%fSDV7E5#JAXSNa$<%{&i;gO)ECDsoj4O(AhWtO*bacb5r<^p@VLze+MXIJ z9Lx+*ha8ROVNfoZPTbpvuXtzG`^f;4*JTGo+qi)>prV-RB2T|=bp+j6qaH#5a4jyl zkRA#@@q|5_yB2gTTZ1>ClLBF4w?=WnFkg6~LcLAZfaDqVd94JS4u0Kxr@=#HWyciA z4uZR4x>AxG)-y_bHLk_BKOK45oxGR$W1GOTlw&@2oMZTb5J9pUgD|+Bha+K~hJYhzp%C}z(=f%f+d*d$t5!W!LT-YJsSIUYl^0t*AUO))|RDrYI z04zY$zmDK)8w>Y_beb!G#}_7pa7Bd$7=XgiX#XZCD(}g8K49;Gb_7loi&@>SBf|Wt z05iO5DOS3+dKS)Vc5t^Ji&7%kdTNZ^DWrGdmVZl!exqafRuu(`Dj~hVLr4c-*Vh>IL-`reF`4AmUnA-|r`}ut1Pt@8QJH z8IahO9D5NcY!gwjC=%rrdv;d3q@)BrNK>v5hwlxVvg^Q(+T|4nAv5heGT2Y5tKDrb z5vEni%Lh1$PS#NZkEp=!pAS5U_RQDyj0Te zEBP5V|62k--3#-E43xecFkV$7O5vm zmIV+zgoUK5KHA&6&1<#i8|zES1o;G;!3R}$HH|K>S`VS3jQWtC&=e*)b=67IineqB z20;10=}cNx>?#{+c4lgZ(NR(C3^5xDm9AJjCka;-Ty` zd+StX? zEgMjW_2B;zRaOM*#A3J%vDDwr)4^z3ymNUcnV-tE_o}r=$V?_E{Zo`FdqV9xj?iEf z_1%w0wc#B^O{6;{+P(g)C|cwy+LgxQ%cZ0&OnqH5Twtkm@(L_^*||>Y9%VF=>R0m0 zOk&br1Jj4^LS<-`gb`+i%u?=~9k*uRPrtkupqx^|6LOEKQ&jmpwTc*Z4^&8uBke~g zMRl-7VRV66x+q!dN`v?jmjGs*EJqTeA?aslbWl3i2Vh?c{BZEzqjQafM)7LFX zgFcn`z(;6RCMs1?Rdd*k)CD7{xu$rr_cO8B(+P(oK@8$@Xa5~{RZ>B-DXAef=V1qP z)+h>z?7pj=u6LsgNHM*0=dQ@LEGiY;JTh-`*1jo8_|=MztJl-hhIKtFMpwyiC%Y1R zwtuz6ZAi)Av)@Y{og#Az`RW6VP0G7MO>_28TFpvb?Fd$+m>z1j*fxR5wG!^JZbOz5 zKYFh!rkm{L;CpYhh}CnBAW@@Qyl*`b_klx} z&u{_M75L{hcN)oz^<5GmOA1H#(SChXp9Z{LCC3?uza)87vX`Jbaf~b_ZYIM>Nc#Qr zJnDiQvN7_x`GyoG)%j4y1)3b4Y-h zse`)D|CmL&z(Cie=zD-MRbO6kdN8&3I||th)7K2Rte&zJ3$dE27q8A`N)-xoNxsg8 zo+O1bVhXvFD6#<0u0EPBL0sl{WnjIKH&csXC!hP5t_pr?=GGe=Y)^Bs#*u6KggvK33z3#1ImhgxI zF)d@olXUr=9Hj7@-RvS3?BbY2VImtkO9Q>lm^uC;q35Z0q+~>d;8fqx)T~5eEtxJ2XVO|zayc~E4`lQ0-v1}a|hC*jMArI#R?SA(T?$w zp=d}?`I37uQ_=CcE}$5aDti4#|8f$5243}ACH*k z#-0iz_W68#Ud87`ULDHXs+O@Olr+=R`bjTX2K>wt8V22^V^^mHwHc@i${BLet593Z zCpwwY3T$5ipI^~zf!z+|2YK?S`g@dO+l_yqx^r@t0)!Y{gwgs_K4_H=()IGahztCe zyP*{>Ss3VlJfwV*Rb@9UID=O43(wq2o$v3A<}tEiNIGZy(UeD5k>ud#sHov2Bf@u? zwf3%8rgAng>MI1PVj#8YVxxl~#%|i)tGly$_9Ah9j|#t96F)}vxB&0%o%ro9Sl#ut z`M%q+EJF~HHv!-O*ag&nt21oJ*^3)ia50{f)%yEj&iQq%rSW=)?wS*RNU>D3@@ogH zKLEu80HlS437dDqnA;ySsuly~vhc1ii4DdIKYSa`a) zgkmGcDH(*=gIgk2CZ|s&hN70iI{t1>2{VdQeG-Tm?wJY*0lawzc_MT8)wCKT=6v`R zo}C`7gNK0M&QRZX@BrGapY8a0OR8=5PmXk+0Ld#%jIMbcWiB?WygPZD29c$VpFk5L znXKev3HvjYgRy5bgAr;N^?+_RTD-Z{i%wx_!Tx#JTzm0IyTOQ~Uv_FqD^wTb)QeL z(*Xsuq%*nAB69{n``agNchT#UGQ|i-keBgjp~uqfyZdK#^4l zN(CC(eM4hSMmQ$E=Gs3Bg2JN0$_(nNoGs(4O5=p3l&mVrF(_mQ)j5)A*cixIVxwV7 z|I7#wvi<=nK<#f~6D^;Rk&;t^bc2JwcX5k#cX4|{c!b&A6Gf?$lRA`_p`D@%JX!aN zza=PwUYxPxPayhri~rR}1pU+u&GkAK$%XYgM5aCr4vrp{bg794TL29b^wFi8(^om~ zL@lGNLWArKOlE|-o(`Kk- zrqvUxg`32Hc~G$H;G?r~@?omX(QlT?s_KiuD8q5Do#{>ug#0 z8U~~uqv%O5C#FMw>~IRi18tV<4pk*`g9HK@aw8n&$dvZ+fw4t7usAG z%-yx-1jgRgsm%e{?#<0fLFb_r7QuNH&FD2G@<(=hWlJ`!YhucAfbwg`Py%91G4O5c z_%iB?lR6UHE%i(iLG(Ybi^R|$3BBcN*X4~&t}0}ocCZ)%nFb4{IyRYE`F&hixF$cm z=R+&6_2wGtm1XIWutxb*Qov7fsaQN$H^7Q$%zv7H2V0{R(ZVU$U5?3w*rE&?7BC~p zgcA|9A8Z`*X8<4+(r}qbP(utK38m>BH_5Y=j&JFc&vjg*B4m?1vihSb3Qar9b`@R@ z{m2e-ddxP0XDWE@cT?KL;n32dGQN36aYP^91!KA#gI7ibND138WUv#`C_^fScM5|A z#4g3-De;8ghXGu$PaQgLxKcf9^)S?CvJ$`2oWp@Q^H}tB_+{Arc!kj!lA3J>r2({N z{e8Ajs>)3LegQdw=^zCP9kxC0J4&BtP^q3y5tvO`Op2Zv-SY>f3;CYSj8OZB^-SHb zs+7TGm0P6k^avF<*6+*TYcE9PSlnTIAT=%WysCv;=*LN&B-@nLc=agq2}NC+rBz>JsPtP1?UCB4wb z?D0g^F#qo@Z`-;xzE96X(A=ODjwjuO+!8xWLql`pLPhQPM9sv?wCvPr#@(T29qWe$ zV!!tCYhR^%Q~8M5MiW7`qta4FwIM9nBfqVr*Yy32Ep5CtbQUds*P}^+YQRq-+N1)A z|Gkg|DJ>^ECb#teu=geKP<8#|GnUd+Qj~Vnh_cMij1jWSz7rMCEO!{j%$ONliY$fF zBBeyMpeU8JsHjj%+1htWQd+2#QsjT{9on9HpXXhk=l#FG=6*iLz2~0uJ==Fb=YEfl zHjW;t;X31H(Fcv4Vw=}`H%7Fd`ZV&z3A%#o#_Zfp8JYXMGqb8+ih6FXT&p&7`N1)L z>zfPn-#&0U!<)NJ8`|;)b4L$o$J?^0>Stfz?(I1iHoZQYNQ*hLY3soWh&C;(!!cB3 zwg}$p<}J8bXY1K?%~Qd--nOC9(Nk~%|DdRPL|K{4%GVc3?ry8bj~hR3-1ff|Ewab~S|h(^IUNLbWYTJ5&6Cq3vqM}K1y>PNmNxD$+p}Xz9lNn=*tLSmyB%$H zFwE2#%LVhYE?Xy!8u)m*VK{vx^{$|y_L$nv;Y*(SW@qS6csuEGo{rMw%7zEX(O#nD z8+tNpKgc;W8^o1ja80LMb&WxLIBAD^))p{7tfKX6KBV4QoQ+d_@46R_==S{?e)t=7AhC$nW{YdK)b)) zZghK-T~(zx&eCi4fo*fi7L-i~O{(7C*-+6sr`W5y%S-FtJ2a{I_NtKWdwXq`Sa740 z?{{=XzL9+rnAS**%(jQ;;IRy1aHgDqM74GsZoDEnBg_ru$XCF*3lZoASow_@Ndo`(ge)*+#!I zLXLAw)glAdA#tUK&VJvQTl1gMj?6`KBTP;pqg!NK880qu>&7Weg!e!HOZAuSO%Y4dLb9lE0v z%FIub<4gxW1#TXre$sPuZCF;n=>p~Pw+Ad^2+3r^{_b^!mV3?4D&$XZ*_OOrfwg{5 z97nFVJ0rpLIo7el;b5+>`<%en^o3>Jg`%ka-TI5^6D@lJw0Esz)!>@Ll_OPekyB3(*@_Q#)BvGmb0cl*FSkeV)o5srA1@jfDR-l!R4*VQU% z>>h<`n>af%H66V|AyZpp!r~cYk$8)#n-AD@kKMjt&rIiWmmM&PyXRM}y4~S@;lh6F z4bS!749r;LcyIcMCx<7DnYcdI2X!#N)^KUXz?pbfTDWcHwYT=>-_! zzGk-pr^oeR=dwM^pQYcQX&c>U6rIO7U+5O*F^q8Sk)!9%X>aN#A8-oS$c-7%;-@oh ztKpM-{OG<}rI%yRQWWGjF1bdU+?D9Nd(i|#Uyr$a-Cg6d?q9hoyopduc@rbp61Dnu z=i|AK)F;yuk1EC-3s!Jc4?ev1Q)BGpmkb@5rF+HEJ2W*)RaWlZfb^1kBR^y3Qj3_( z<6;ZulgCZQ{6!Au3O?ky-RZiR@TOvgFSYoJ-<=z0LVI563g#(>_~ z-3nI}-j;lPan`CEzv1bgg*k#ad~0h=?Ql%(~j7ssR?XD4XvWt zgo_HB&6tg$Z8y%fmrThwHIG?>Z`7goceN__JvXw*K64IXl-6B5YgmUuft4ZF>B-`9 zPDtl$*ACfva+(hN5-6IRnNRP`Xc#qdvQnF$&AZ!6kGV}}9H)MoR%2PS>&*ru#ZP1O zo7&o{LpHvmFr3#mPbo84V|Vs!rOrXI5U6Q)0F}RGCpISy3zFHSV1>PQ@j@`+ z{hFB5i_uL>uunhfBupWV)GAhtjJu^%v2TxwqkjC3Cp$Rv{1hguBvQ_X-rN7yI?p&` zH(k+BHrgaNW=ZTPnIOxfi$=xW4VqXj+(th=b2vi63~ZdN4a-KFP_s{3it5yAU()*cUiV(a|UQdt)5GP@Cf!RcZx9?ver zhWU|2EBf;@C!E`fRTXzTC~Vf7hDiH_9z}@EmPLRUviP3?Z;^cP>dG^Bn@oR)n=>57^X>rf)$H_BlaOYIYN=+Q>3In$6-l98MbA48r zk)8hL98_u*t(^95Qs>$YBbQHfc>MtBb?W@bbxhh_os4_Op32?cKH|Ej#dw>OCo!(( z{P>eq>E)FnCE>v7-i0$jyjX$W$ecU0lOd~S;PW_w2(D+-H zx%0P|pSkOyv%GaZMt*^O{_DOS*&9-hj-PL~<4F4WN%;uMCPhUKIWjxCDl#S1{O+0f zaftD=<))S*2PJQPgKo)T{U-9ECh|N|n+(E2NxrarX(V!~=K|qFv{K(=6_4Hss}B0C zTg8{LJu(wlGb!T^ENcyPK9w+CVceWgC98eApL9%DY%`7Z&)=zfOZF_^WN|+VrTebw zQn%%5z2!{_m5-5oIsy%s^d#JN?Z*r^s&*cRxf}iL_7R*a7<-hMx>sySJ|Od9vTiqeqsq$L~p3*c9{nrKa&%FP)Cc zBO%LY?QhyQysF5@9CV+WR8u4_3Z2X+_!Rn$by2^=p%G7?ElyMB0d*eYy;=KjV>wS>&VWn;!%uq}2e&}cYlThlTtVUda(O}0w; zY{iuco)bMX^v1i}d^)nBWC6Fyp;V<)wRrUGSALso{SU8vHOhNh#K-$73-<75$_|&u z@Sne5uM!jR#D1^m>JfSwfn}#wn8=RaeMoLxebC;X4@Q3Mo=Yp|u=}k#rYg#3smTq; z^*^?-;0!yuIlpAvuGAcj+pmS_0)=PnH{)KoJl3xfueCW)&(auQm?1mSV}>E}T&>%u za5v3?G3gthR6N|tvsjuN&$m_xyPjF3PAa(RcerI#k zhY+>co7e?O2ED|H99m!K(u+>Xja2OO;icgZlUt*nYvyqC(^@p2Bzoo8mj_f?z3Rxh zdFNH2$-;tqrs++Cc>F`l8O0q{A>Dw+-WsQh`v)F(-OI%%nCk4i-L*dTNY|rdnb@Ss z^QMl^On&hKGoN4H|C{^SdSSwe;rUy%Fg3ULXGf}34-CI6uykrgCeDk@K2aT;6kE-) zwtiSUJo6Fd6r=A93SnnFJngZJ8uWHx6a2Px@a^4(3+ZWFwlIT(w*_zu0`!ihxw2l% zgik?eC5&dZAVE_4c=1$9tOd5at+uW;tBZWG1c5NzDgXA-u&E$jp1F@ZK-b z#55k8$5>p%Gs`b7j?3Aev%Rv-+8WSgDx)=MQFGOY?^&K>w*EmoIkmm+X-DDsBS)-< zS+7{Exma@{%5>XamyFEa%h;DSuRA&*6sXf$%VZ+6-My|lU#Pp{Y^U4M(rV|}aNgVH z(!54p*V%U1E7*Cu+D@J?1!3Y#AR+f8jC}VeQL%h zR<_Zr>#hjlbZk`@GM@u-Fzt6%;mi(OYfAq59hW`wYn>dPy0o`1EKoB-oHiV3{CJoq zI5(J&ZvO#q+=G#7h#V^oZl27beGT%}=ZCWUUNctorgczJYn&e*U(ynFUbt&g@1uKO zm5BcGF@9aLaXe^njB=x@<|tQa`D-lSm)$RpIc&Rb(leQ^+m7r~$5G2nXB;J!Y+F{j z&tcok;s=NElb)rwhHvitcXt4&0iq1 zLw~JPa_sBI))qML$!Vi*{~LmKcE!tUOLyF}Dn8f|y3g;`D&JjGZ)G45nHlKY|FV3& zht)cDGw(*PaG4Ojr2zB9>|r=m0h=8CHJ~bvVh@r zr^2v5AclU4n;7lIOFK-{levbU#m8aZynCb2_$l1>P7AKPJ5qnvo?iZ zJcvM;M9bfOrZPP;d%^5(+wf{i&4;=}SIy-|k00%P>NoGlO=xe&Y4R|hYB=JYHg7KG zX?h3w*|8_9syZCYjWrECF#I4RIk|X-IpAj(w8i{Du*>FMrNQMpOG{&S`zxr!4n*vQxRc1Y@!Ap>bb=h061g@tV1eo*PLQ&5cxTY*~kP-qob!96J|1OJQ$OJa$Ej zd;a9s<+tm-X;quwub-j$Oylw6e4v1Ty{*AaHEVC}G-9v*{z(YNmH^K-*$fe^G-ifa zXr~LpIc`C&enGZDp?^Ysl%*@P{tawZTJ$Qh*VFg>gknCiKe}y7*@cH|h)6`5sany$ zimgRmyxdLuuA3aOeQ#D>e(jF;fR4}oAbG?Ck@~oYa*22lT`dshgXl`zlS1~$Kgrso zJ4$i$#%+^q*YB%;LnII=dU|L#D>F++D_jT*vAQwgwfvsmA^H{Itin5yM_rsGA_1g9JwvHF;>>ZJlsZn!F^>i%nJGSF>v-XGXCKD&{ zKV8hP8imMuj^DR`QY7-*k9yVDq_esvKj*53MDK8!#@HG8y6EKgxVX%e5%X=?i~V9; zwX5q6-k3teO*a-EDXJj*zq-BfZSxrWZAA-TrM)B&> zmG7(e?rSs{=K1Jh$MdJE&o6A#e7Cr{j~BxCtE}ZjcsJCZilJ%B7oDLJ=Zxp3?rA-7 zEcQlyO5c)D67}NiL-nLgj*pAJ*}gTnllvAQ(;8LrIBRZ+-;!-z0S7KLkvwmIdbD!& zZ5OL=zSw2d@&i6vUW?8#axEvF6!g2jO0f5JJUwIGg3S3Yr+?eO9$V_s>Fm*wu`IBD zr*dmnKoQQ( z@5Y8Z?7$4hyZD>WZ8J}oC0@C>Z$;YS zr=9e%zMV+yw|O1%w(6+A%6oq>_Q+;8r6=25OXUxNd2hy#nfCx$O@g>xtkWR3n=!=g z%zcJYI*|!;z6G`NU;u`htut7Zqc@6-dv^J?Y924 zj^?}WExznF)lGQ?v&$e~ySAyuo3ah#L+*;R&KOUu=i&jUxwbpTd=C%w8eKPwZNZCv! z--~$5f4qt=M)6P(=ANdT%4o}Z>7y5M)7R$(n$Dj!r}WnLtgSEVxL0Ot%w2-i*x$k* z`vGOL%p?i_;NGn*_-BnYQTyHK#$(;RJ!^;GfAzHOMi{MGYl6R#e(GpeQu0W1dAF%& z*JH-mKT^0I;D$6{U9gdzKw4vMWSuZyTP1Y6!`f9dCdg^!Vrgb)uG#txSU=z_5H%4&<>zvzTSk6M;&2{FB&b57iQ6L^K+N)W*^l#@iAkk z+M}Z`Q{!{(R?W2_DMI_LYJF$oS@jnY52Mloohwc zcysm_?_=J$&~dl)&JoWLpRF{v3+q;nyt`}I=$VT;+gg8n%LPVJB9>^TrS86HWUVpz zgGZiUR%}Iq+_7vIxpD)PfhJ5kgO zomq|iXgX^yzd6+7c)5&Cs@%>=%BGZtz|KlIVFbyucC`T(JRIKs+gxMQnas@ISDbJgcCCPw?-O0n(S z*(X~I-_)z(7S7SszP3snV&`p_vlHv_aMIka8LKYuw@_8&XO+Djj~KpbivJJ#v&6O7 znY(si@$QOiUj1b~Q)2zv!fg=GPbp^nygx3&8=f(X15;{}rrsK<`*G&+5A7$%$suri z$9#H-{G<+dDCKj9&Yd0VQ1fu_R=G8^e$=6i4LNHLWvtF=ZX7t<6PfCqb1mRqKV-KZ zr{wEsG+vre^eQ#?-8!p|8{0=F9d*3>0fj)nm~!KpjPsA6o!o!FQmggZg$3=szNSmv z-cY;V`S??`uaRUBdWB=Ue=rRDQ4SinyZd^Qmfls0;C~p{_j2(HJH)H_F~fd73`%oc zG#3B%>4a8kW59EAWW(e9w=Ydi5EcewWBALKX+y(cvV7^#Fm$W15t=Bu_~0qvi>gma zA=QftYW*|YWf5v?<-LC2q+zSE$P8*g*44Hr*rVC8v-jP7=x`K;cpNZ#;O9-+J#SHD z%;MYoucl6${;rv5vg(q5zxFtU!_{#{t#WBIel%7y(_f3XY;riJj^Vtt!`S8N_%6f8 z?r^J^ccVa@-$uJ_uAlR&d-}oI{f6QPFOQ@w@JAvp4xhB}2V>YjvX5QLKi+ZrbfodS zAlp^0c10bwh!=K>vwz;;b!@jH3$Uh-k6%_eWk(L$5T8Cp;TtqZ*H|o_gN*w){nNj!rJq0f&gii7MgCR0O`Gg> z15n3V<+tZ9S>DQ}CGdo>8CQo(lnPYBD zUwU4q3pbU?dv&n+&ZL%+SCXr`!S}>CGQmwY?RVxv{eivx;jgt!8{2BmyxmmD z=nwGKODj8@HF4UbPNdtQ79|1rWe@^_xl={&jTMD)o$3tkw+zm-F7L~X-fcg@fnqcVDSI4uoQ%No18$=y$`s-@rLADamfF&CPJe9H?b^aVRj}vML|01o z7{__8>FeIDb$4_7u<9Okn+%%b;=*izQ`VPU0D~QHcoD3Co<0a>rtpv`MApU zbaB}!6~sZCmgW%;yBc0R$xUn7D!*$Sx^?&=rO51QwNT7=B{|a(R#!_pQieI5bQD(I zJa2MmL)@8!f+x%Un=O|FG(T>9)3In-uNwIYi+x9C6Ic z%BH(QLy{J+*zin=?JShlfZND2rRAN)j#}ZolZo%T)Y@;oHgQ@q;YvhN|YI| zZr2-`CskNH^CiZ<-bzoR49+>58zlyCOg@jz2|xtwxNf<{k*=Elz8Kfpbc1V|=;;b} z!gQKiS|`%;>kj9s`~*dmL&uE^UKR@K&eg(|K(%g7t!N?@ftV(iyU>ZW_;$>k8%~+r zJ@NQPWmwq?oWY#8@~>y6fYl-IDQ$T$EKU!C@p?m4e0FS2Y3^2J4x0IFh7;Q}Xr;Lw$Cd4O+?<`m6UO-2GT44WV;35h%p}is z=C^L2lKz;m!ja8*ErZa0s*(O284#HreW7n-R5jNcxxBS4_3B;A zsz79$qI}wA;~=D`AZjH|H&A)L>Dg!x=fdvu*V?m`5Qm75YFg{k9G3m8OX?%1ZS6u@ z4f4c67*B$Fn&wr>wDu$(j@u$s^fJ7$xu(Q{h?KuHCbttQ{C2GJ>?jwO)t#GCvF93Z ztbA6H!n!@o;HM?KG zd5+4~1+o|*ZcWqh`AgX5!=nx#NHJb^`0@SrE{1=3%$OyMJeO6nZW^gNTJ@)6# z>@p(|GaAb_hsLKFdW#txTWekK&wiy6p2V+I#A67BF&w{?5W67Wr!y%%chSp_@KR`J z3l}0PiYDZAAZ;SE7t|S~hsMjr@&JZeoZlc8N4>JF#vnw|BSId^$Ik_a-W{=bXy^^5 z-Yv?rIi6BH?@~$fA9nC^|#tb3)d*@Dy>hNw2A11qf@q)CmmZpch+1QahCe2vNIQMo<3bAD8*m2Z2wSK{=TiR zeEpfa@~b=Ew_e>*cP6{8=<0ik^g!YIE_*G^mfr~bTTsW3n}%^RJ5V32dV4iK{AOmn zTWMkL5Wk2jiRW#JkFn*&?TCrt*qU)hsBZFGmUPNLZ=<Y3aEo!NSwD zzNwdAAJ0S`mq%$|Lz;c^+t)DTFzUD#N~;hkr1i=}fz;Av4Rklq3+NvdaHL-26F1xP zr(P=8>aD$1Xoa%Mk3t;>($$2?ujj{Q4-321X5bX{2-+tn-$zFxR5Fr6TE@qXh|Jb^ zs<)GIRk2>AU_PY-sW?;K;y8EXssm}7b{4y=l+J{8PO1zf zD%B_Yw{4zH-yW^?K+y8>{io(F&-&lKdy0skDBL)WlW57gvSyFmE`T_A2{I&G<-j^SACyHq}m!dP+<|Q7vJ-${0PjPS5a4Q}jxVz$T<895| zbJdQlT(oe+3pwAj^?{Kc@61<~S;f*H_3VoA?UmP!5!bd2i_?Ty%Y`3 zFGQKTxMXIy`>Ze8wr$UXbzA-R!j80U-Z}mowq~UJ`|Wkf_T7-VIo(IzD=jl?bB~Ma4O;{R{hFD85XE_;*1tW%HosOeGwr`LK%K`ZZT)u zwH2q=)GnDyL$pPXn$(G0F>6pwHLp0|tq^)-%2Kk|!N-R4_hz4FXRMzd7TwzBji@&n zy#dVnosLxNye~)W`!4k*KkDw>{HeTkn>z1-gz@gWQg0XJm4d;>FHb)4fSRW4{c-=E zdF9bn4;zj?pmWzE3Kj1bju zWd~G|D$|N)jm{WBq|26UyfIvh11mY7Z zA>+6F8QOmY(*CTGV_K1A)?ck+Uio?z({*?{D3VmZ6-kXBd?!2fSFLetL_HiZ>33r` z99f!{?xQlf*=E>)tMXKx1J%L9Ok_GYHtp$Ik6ijTVRBB3%yMm5`NAEXksc)+(LL!? zc3<0>Y-kUv4pUZkWOe;X-6S96N&d)D|Bhu4=r^f+1>UsfQdjjkHD9^C>*h`}Rz_sp zK=ef0mUc}o0n|*o~ ztDif&)26}ea74R~U)G-HkMxuomK*J%gB^*ik&h2VhA`eYRcKg-TQ&MDP5DTA;1c$Is7ag6 z#nm+T{=PdJMbAY~Zxzq-yje?^M4DvWvti!v{gQS z!@CVYO>MtHLgm2=(HYs*ijVT=?ztLVojZ(UN1c*25fS&9uM?|pZMo;nzd%~~Y*^CB z$V27#%cHhe%tgqo*znuK;c>r#2q;3N4#dgE$$~P^@xrymn_6}tANc1ybH&EVmt+i- zq_wE3*bHnXUmb9;wF1^o3M(~NYBR0ir?sf0t0A=w)~HnN3V-V<6D?HV7ax+Eox|&z zELri3;0uGBf@dzu|M=hQI9CYUER?pH4;EIcH5( z?v!7)Q5K^6;D9Wb?FD<4)~EUGMOa1^))t;Un_{&Q#p$&|^~x7U)dDDuUeu#rt6Rz! z4||A6=_^I`D$6{qf~-a)x^CFAX}xb=)_UK9br~58)@?BfHM`cnutq)=VcdhMdLpw0 zq_vOdOV))|&C;}}NXgx(8BNr7z_IosUu&LX>M|}plp*yH7dTPaC9(+ZzR}n}!!6oD zZlOMM^mh4wk~-%(W3_7Q?APLPwz}H3j`a5>?{43#h|7*v>_0FP7yU8*3Q5C50U<0` zzx8j@C_{ZpVcvuc^~}pw?%fH!7;5f1;rkJYm3}h>rJ%yH+RZWeE&=;)LVk1Sb^mLPiL)FXtZpw}kTSEcFupWw*0np`(W7=nSvGF$3|&6=>{WLK zLXT3R!w#7Z*z4m)Ou2mh>S_WT_Xcf#=;-R?%7j_oRWJHITTY|1=g-eNl5xB8m2X*Q zwuMC)bMynew%tkO3exrZ6qBB+--=Tw5}G1T4J>gQ`^oUgoPB$z$c>+(x%MdE}f9v^Fh9+Eb@-mOTfSKUW~uYl6YQEqGCml>7w`HM>d&kI-tB- z`5Gtr){d#Y%WRJAzx&3z;KDSlvtV92`NlDm`*IJm)XvV{J%=|R*)Sa!J>f?C0+-$` zM{16D1rhzTObt%QUIz}h%1(*6`()!Cr}P^CExc)cocOVzO;{J67?MCHtE(c$YRGK- zGg#OLVxii|k?hS%kV^l4O=#5|#7Lg3-+@0-Rt{0CG7@?8&+l@PLp)6#`QqQk_|2aE z+>J&LwfEa4FkfW!+}X8je33r_;Ua@E`FEv~?E_8o3u)5|@tHSf-*dl5(71H$p)O)W z8pf^@nK~gdJD9~|&nY*Vy~^~O+%d!B?~gxyR6x)zuRGLQzra5&%YU+BVb`%3 ztNd3ka4_UEsx!|%-jt!TA%kFmFZ(#x!KtwGVTN6e|5N0>?u~DkZ_|`~$|KnVL0)!a{SOAlFcKOpagZumoV^ zJ6&4RvkY7PL*$dz^(7xMFl3E4NIt&H}Y-fHln1wg@sj`1^z4y7hszk)?BK2K+fb!Lcp+8ffHA9gxw#w=VL^qPT^s1pKMlMx*Oxhm|%w_nh-AvgX6dqO0tv>BZEp2ul~P zeAC_Fl`^wTG-H+K@7S|**Q-O6v_g|cWYE5`8?*fmnFU^XgFSvQJr?V=DX92<@muB{ z)XHMSmS<6p`%O@B#jyqHvrvc@n6@4& z?e4F8GUfG)vAxHy+}zHsFd?nW)0iAr=*6SI2}pkVms0GR*8aT3JD3n|^O$Z~qi)^TLhY=dR*^v-{{9eB6KUOD~-@JF-hBPap#r<2RrmME0>zBW66npeGX%ueQ~7U&JAoCcV|Gu12g=3-vajD%BZ51@)@anZ}2>CPnjm%ry3aS zH!=CjoSv)kW42x_qSLSqtLO6~-L~Caw;+SNowL0B=xOUK`)K&u?$TAyZq1(R%-*@j zRxtKtmQzE``FTmxp5Rs31_jGD{xF#8aT8+vm=osnkoWj=!{I$4<@MV7tXd_CdBmLfaVE z$lGTOCn3@=qYxdVz%;gEeG9$g!)Q4ZOR2*sDow8=jl6_hog}6eE!di`9s|OtA zXDrdgyt=XtWh!N5WRda}_lM+el%0K|+_B9Do0q#J%9Xt@+x&WTqCwf_LlYC1>E?$y zEOdw(W`1j7A?y>mm8r2fB`T^{BSoW7Yq9)BjY+*xuQ>TpwHleG*0zk$Bh8jJa~y}s z4%4#2nIvC=zPd$oX2fXusXR+9AUm;ga62>*N7C(A%5ulA3ptBGxaH5ucp#HF^K);F z{!wpVppa#Xk=elN3RIP;QlhhtZDzx7Gcqb?2C6&=3R!}@C}^iVsB65?9Hdk`a{l|e zoCyiWW-1T)TZ&yF~IDJyST0)BIO%F|5(JJobY4|Al?6%}Cwjgn4?Fi`&-%$ozQvQ=6`Bxx{T+zwx>^8pA~J& zs&YAKJ&X3Szp%(+j>i3(Mz5nyO1s}65%nork)UBeYS6Hclf4BQ_PO?Ysaa{fiR;>y za|>ndW|gO64yUE-rafMvvL(8`NDWzJ7e%N^qRl>87q%ymGz6vK2dup!?wQZ^y#`YmS%Y4(wSsqkQZ;H-$^IEijFVeACz%5 z^lGeLA#KC@h~OQ!(`p&14Ty^r<=hTr9EfrkFJ>ue9DGT-vXaVQYQ>A;804LN{9*jY z8UQUo(!YzPh{9o`&m!Wm^A%z|Q}32I=4U8`v!3m%xrC5j{~upCJPvQ_LXVsW&{=@+ zuc?C|xqkK^Br&}&_fR^KsHaatpdBrH)^K{z0jW7too(01GPw*rLCR{y_;3|EE&)B_u-nO!Gv79`QT+ z*C!J|`X~II^dAg}>AbKII;ej9@B*{3+5h+GUmXoiK0Nj42#z?=5G?=zF2F*w!?@fi z?BIilFBF6SP;3I5&Z4o&Y%*Ps4FDuMOP@fa5m*E^nP#BRq!aY$Ono|C9}U673xN>6 z7!cw4LQVjOhqsxBr8C7GK2L-q6X`4_nZlsZ=@b&%fDX_BfI*-zm`o;{MP}<6u*p(*+JYnXH&{!EBiee|V1n@&U0;CoH@u;{DpKPD8PAY*VH6L^FoQw$@m6B& z`9u*z6nIeuoMa`gM)oKfyM?ggcCcXu-S&Bh3~2<%8p^1wGhIl&Np^skEpjnyL8Oy15+fM9jr)R9KF4u~8Bec9Vb?FQx>z=^XGZi6|BCKr=!KpXznK2FP; zj`}YtvtzrH?H{=SK#nCvJw8h>GcB?BUm{}%=&IAafvBoeAOPUN!SrLmPbKezPMvn$ ztXL0|4IrmH69CeF{kZ6V&l(jC7}4CIQ1+|UyJzyJXqA*`;N0fnuOswR!<@%};tF6# z1LhY2d;Q4ufAj6^K%SsoTr$G~?fgEFzS#bxa(R9Wc*$N)Yj0n&Gj*mK8G;IV6<1&K zft*M@*e7#`dJV}1$RX}sqmh6#8_6C+D+se^qC=ktG4aTd?OCUh=}srnPYlGph&Q*D z6-F&At}^4Eo}%1QZ^fozu@}Q(V_{^Q2O0&+#(Qv3dM6_$8LBPbAeu4=_aMfB#dnzY z2WP(6bGm>~U_Vt;P;5C=9R_g$>wr*})ggC{zCAT;GlRu|NQhmnQjA7kCzOd?>d+uD zNv~1F+)i|kXDN$^`svu;>3gA1H{|g$EaIJ#gCKDj%t#~?KwO?6b`Z{+toInk;|>RD z@iyto;OW`~BIy5W5GA-vd_RE$Fi2`XUhGkHd93=hbV?_Ldx(WI87^+5=W6JqrK0O9 z>E-Eo2wKxGB(JDb#X@8=g$m(Bs0+@I=z#R&O_xZEfsRLy;KURZ6$Kd%vZf#+B>Iy_ zq9$u73@@n7(>QuI&KJcz?4FNAl~R0pG)-j(HNSb0f5DOK?zd2aFwir}rUG{4y!H2I z*+m!VVN|X;oUwQv6H&NvWVWa`qgFoN10O01E3SUuXx^P=4`gjb{pVlPmo~SK?I0(y z`|ZQNcg}#FGrAmwS>W9N7aRer4*`a2`vE==L8U=Alr+Psbr_V^NBbeO3H&*UV#oRe zfDli*FvO{5b>#WWbv^EB`16MiQbl}B$k9fzeb9)%(N0)~BeMrlj6arPQQg>R*n$2p zCf%oWIfCsKRHj(=~R0@%dF_?JOj?hIF1+R$YF6udMQbqjTZgKN4t<4cdeginC z2Kb#q8p_>p4sN8u!rBgJwj%#hbLcDM;wz;y8eDoB4N~XTSh>_`?uNleZ=um8qXC#N zOkMRLFz2?g5h((3aFwS`7}|u!S&!bq&4hW3`}$>0OF)i7gbU$$(aMF#k&n#&^LHNm!%PmVeT+P zjHFr|D00@M4~kelOG(bORNEPmgTxUMphdEx-+})+IFL!B+XAFBagXd7Y>OnBK|8P4 zq6n}4oO%BcS&QY2Uk_t)*3NKhibTicA;NA59h|nU?*X4 z4kjuJ%USc~@MOt$S_?Z4kuLgxEZ4t+ioF?(y$W`v#}G={D2WvH#|?MI4YK{{&0YP5 zkXCT41t;fPnc#Cqg=5<~P|r(59=Z;L!6PFemeK9SZKM^WyZttqUeA|B@;dQRvX4Tu z@k*Qob8+)TTnj2a2?+x!YvRsreh>-U$j9uwElC zMBf{N(?NT^=*(P81c#mnym>RDU(C{MJjJq#im~>yw&e{Kfxi(*1oiuskmX0%4AXc8 znfe)0$_yG3= z=Zs{Di#sMD*d<~z(?Y31d%SRi)RYJ3x15)>3~hs3 zpopX zIyW04>hSoqyjJ@kulUvs87lEQvPWhG!)?E_rwOl$)W8whlY7WvDDrKG=0 z#q(kn_?uYkCQ&wHPq#ZB5NKG97DEkZg>XVMk|fzg*O+@v^wv9&j;pibzUcSpK=$A@ zm#>~pmowfZYX^+v({-2N7lv6m7(2S$W)0yUpC0rv^d>^NfvC48mRsnmvwz)ywN&Q5 zoR)l!g+}p6+28qEcYrLoUHfLqZ4$U7ZSgM(Fg$hR2iDtrfc9j-3sbgWrV*+39Wy|S z5~2Y=9)ST_8Z^=H@a$;*ksUBUzXZI`)?ygRJQ7i3-YLc42YX&pQo-UQg-@D%Nxwr> zZ*;M8sDU+pTY!gb41Tj5ztvj~ycfThNS)VPpm-8SY8*ydM02t6DPv*6!b*OON_5j! zdJXA(vGLp&XAwnIy9&wwux}Soeh*0Q7MWFSj3$hoxwWUA0#kRG1b?C5L4T(&x6l3C zw-#qdj_u9UatHmCWE0{~_j-86)9_fRp0vpBiNH-g{hD`({AOv{mnef}$GFH>J-j?3 z>0w_l)6%}?7P4H+S1vzL8OhVTIN~W@L}z~2?_7pz4}AiTnEYwy$kSAZb)1`syR4;b z&9uVA5uB<@MeyrAu7K6Gm%sUG#l(-!&r*iLv$?DlQuqVl@jOVRwkO`Zmw`q%B{`6E zUc~7-86(0IhIs~a;Cpcnf*9mmK!4=>ea>~vk>mfs5^%GlZ3@^hm9gO6%xL#QN9yGp zdRD|84Y5`!jy7Vj(R8@6Lx=9}Oah(S902Itb*rB{nRVJ0&3(#*xXkNxC9aimUIAbUV=X>#I~57CA(2q9 zkh{gIt3}GX%gLmu?=9Q81VDL{>%aNvKft<7yJE&EkL3qWemnsdtVZ2@X+YxHeEWMq z&Z`OlqU>nlswTNcqfo(h2za>@PynQc*M=A1ZCO8fH4@@`cm>i9dw)~T+RgN!0g=(g02?7@5WP$V!(Na z{9V4R&~b{$Rz9xi*KcOX`Fps=qp8b@LA%56KRo>fqJI2 zmwzt@`7C&Bdanej4u9$I86Z#0E?HmQa$o(kuFU4j4aFn;0@GYE2V7bx9~EgAWSq_=-O7- z34xF*2?a^mTmOW6M({S@@j9==;iQ<7BjN@MLWy{9g*bDzkA(E&kzdE$cWoMjkjQZ; zFSX-?S0VZ#9kBG>)&7=$~MJ7fXN4HTc1v~uXVg~7)N7iF3eGl)loPwUyy%6h&T)2#`>FoS6Ge6t; zrE}nnu_bl{E?q>pAONOndXhm2FVcJ(FY{*AE@}&q6;E{FRs_D@JaTTz&xd@eRF%o$ ztBdF#w}^QS+oq}Tsu?y=JhQ!^aoTfGC?}9{6YxD1vjf`40pQaf+RvE(l64CJTyJVK zehqAH9Cq%Z+vWk*?x+fjEuej={=vNmf+?2+%zF6TOIS`%rT=JwXA^N5LRwvj#ZJ11>Xmh0`HH!8Y^E2o;v6cL{YicM322wO~?W z)AqC1(0-SOhUJXNSKrxY%Jw;6V7D9u&GqKUW<5ABFZG~@8d-zjEfug(W`T{Uj{*O9 zUx(OdZ15k+h-t(#ay)A#ky|v*P`z^@wj>v+1=-C@c*`b^66gGu&C#(i7CR%Wg$m?E z2jrr3FdQ-NHy0p659Am)I^qdTe?bProMVP1S@slM6MF)1!j~xFY`@+?++o99_egR1Sfy6>SX097a$JH0j8DKN0w?cadhpcx< zr_$87vG0>v`Qzg|{^5uqK`U+saeb{V!p$@9$FZ3_?SsnN*X=>3-{Y8=DvzuT7uXs4#PqLdhYcMXcsyvE;k!9(q2aoX_%Q44*bnVYcve*1;E(-el2* z)Flzx-@JU9%JoS4@LCH^;yXa&*+;XR7fI^_OV^tO0~BkX&%B|H>CoQMOiNMiXdu;0 zdeid156@X?U*v`lM7C0AI=T}UDh@he4SvM@c*wkiEoAgThKvhutTY?)5n2%@hbg9U zu(3tI?EFqS>;UOqx647YzJR79yenVoPJiiV4_x@|b&K(hPSeXbFJ?yy|6FVF(>%wc z>1%1tDC@}c)%(`wp9P=WEXvj-P=Z#U>A=EW3WqqZl04y#2q$8bA!1i0Va0py=RtP# z#&r?CyI~6Ea)(yIHn&G&Sw5q79X;weu0BL@X6GFo$jOATHH^VGxa#B=m5!cYBTC0m zV^8bw7>!H8I{LpXZBDj-cJt8QdRWa#L3sMvqpc4|1U(QX?v%F)Bk#4HGD}a9Yeh0={KQUT(Qy50itLrfboLW*7=JduF^*VxJ_X)nba+I3CzVEApg+}UrwaBKg1q_%vEO>rmI-tu_e^PV(+Xl z96FAHL|DFBklK$if^_E$AslNl>qZpllCUtu4U92%&V*bngET>o$7Z|N&T$(#c zlvDxP^QwuW*7!o%RJQQ>oyvyfSj@c5l9r<3ehxQ&aR$|G(}fg@@KH?CSaJLZO zfDeYOUMn-pN<%QQ&C#vH71`_UZ%aO{YDd9?>0H7tn&r&(i7|n zL|xJK7}@wfiE79=o9f$LjvCP+wT79qEq^StJ?1sjeb#|bG7Rn&tfZuNgfcMWpN8=~_zR7sUeg2zw)t5d7x#GnOeVU-9M{thftHK+qp!z&x-gTs--oO}H8 zh#tcsBQxj|>N$^JUzFoeB28pctp6uu4iut*%3g9)5bAzz6kGQhqy&lKPryQAF4GXj ze6IfVBbvtU*sYJYoe}klaim>keVUJUd;p^!cEFy)E19VD@oXNgn@PGYtCGZ0^BpVc zO+-qPSe|f-qlC|W{|&|o`F&yKi;1xjP897+?>RceYq2`OYfe|Mgw8TgJ0OS1Ue1pE;cMbG!$sP^m>!dNb^=lucR7muB@ zSWLJBMTvckpGDEyFhndPx$(`!u1$ zbX94De@*65X9dPY*dx9)jj7-02H`-uKX=Rb9BdM+LI1O+&NPa!TPz3mkQi}PabFhI zhOjYH0j=Gn*0I32JZgKLS3T!-q$kp(0b(N?nj4AZCCSA6c$m30<|%e^)sAXL0Gsc@ z*WvwyGiG%fBq-VP&X^;b!M>A@M>(O6Ku?*#-y8j7_mdl@h(+IGG?0 zYhv{ay~nq#&tBO=cS+E(jC^4sHEE7YB0sqH_qWM+bzv@;Y`y}$=9Ok@#zTwbz2T=HA_ZOlURRPZcSx5XFxh8*+$mL5qydMZ z@N`IP?h(;BXBI&(t*|?F?h!0Cf0#jxoa{J5p;LEdrs~WS#)7I<0SIf|xl1g&U;|ip z7@TduA~>N1?pQ=OZ)HT~9^v^PxCDCbUMW1L4{E~%fg)^?Y_2gX~3Xk+j%L5l-D;U;1{{mMZU~e+1Qp5PNyV+ zx<18OJVaC0Q;r9)@I4;yKR4cKd8RWR>MPSovJljHt41 zk}k(*JoAKnMjNP=7(E`fyb$OhDY%tNQ1C@DHCL$_j$G5$DnWGe*zrU8Ks`f!35b+O zB~&qYtD-|07I{UM0hLn~b3b#=LA%n+#+o@zFPU=b-LW#Ddl04dk!(ZLTcmvrGiLso z4#Xe!J;}@PsdbRVhxRUC^J(K}ns)F4w>(h(m5p5_hXy$K1*z-}YX=*t2;|n$Z-J5i zt}ckx`vkRPXma3G2Mvkey&@*ZAZ__nrSuPnY?(z&LkyNsbi;n*6`8t{)Sm-ca>DoX zs5Y27Oec$`Fl{MrnSZ(85K>n+wT{PWG`v@Dcu=SD!E|!c_SH(@7gXHD<%Gc832D#_ zwv&&dqM~C_oC0H>;tHx(kuxC_YsqDLz3KqV@OW}9qZXphzXPcYDF`(d3_x5y=Du&Z z@czG}`9bZ&gA5agr_<5C0zyow3Ll+yw6Nk{KI`s*{;WYFDw2&JxBcj>CckdQJwX0^ z@u2a--wLWfqc5YXyAQY+jauVm_7*Ds!t|T#EhmrrDzyot$4~qEKcw zDkm5yi2_-{Sn|Byj>7utIdHCi^#x1<_dN@_l6vf9oTBdgcualEprc8@QXxDmHZ-#cb4uDnrFGD{fH?c3cdqFu+4VjO6iHSmZw6%Durh zAZ7ZPR?=$OfdQwi-yA7K6%!Kn;7e@Ft?;TrQ5+ovJdg&sqTM%}J&!;HwKBQR;*zvP zHn5-n6EH>2a)a04@WL%ikoP@MsJYHFb}y(f9VY{*5ho9Zso<=5toqmlq#XTJRuLo2 zaj$o9Uj<#d`){AmKTn$)jcwwyYE>HT@Lss#X1#zu$$~4Z61|Sxxe|iK`nTq}jqS zIE*$7d^{YjQs# zctkV8^~EN0B-NP~Wv+H+?_hPE>UgUIkbL(zzKPqQ@($1YnaTNZmhu?tWGgUqmtGM! zvG>HJ&=U+ers*1oi#s}xS$2BjzX$|nvr^uYfVqBn?3I#*(;8tKudv2s@z` zjVZj^hyXQ84&kf3pmEOG`8&V)F2e+}!LbCvVrn+is!>(h6NU?!x1!;bro$> zS&nB%Cb&bpfM9qywiw5q|B>cJ?F{>yC2`@i=%W~gy8_(dW6#2TMO2*($(uyC zUMb)ghz!J>6w#goNB3yIe(a&E`IDkH+D~O7ep@kLsGrhDv zd{h)QXv(>B{m0Aqb-dzcfbY0BMTH-Uf=8p|L@Wb8Kv(Fa~TRI2DtmDkCbpJ084tx78AG~+t^Pr&oK|@;Ux_^IEUuu?A4kePYw}0e33RQZ zgHd|IRBjONwGJBWl2mT=jp;(Gj5Qt?Y^z% z(mP=3Dk<4yrVR0x-AG%$$w_hukbRYspg}r5*~7al?o&mR;#eq((A~7Iz7ptxSu6NR zF}3cc4Siv=%u|HTRR5=e%JHmfR;FnYrV67^$_vb{83u%cpT+yS8UmuM*8_4HWiBp= zF@Qfv4KhZw&UN(6VXxCgT(!2Oi*RI}#+ms@OG-y^AEFNdRvMtZ6y<&1+KB-+;&ofc5~uQD^CAfc1MIW3QY#{}KSs zpVU^rtvKza0q_3r7LamweazbGSVtlacu%|b|87W*bnkVxVfFjSUe>=I-zYcrUrVTr3LKtp@QNT z-YDO2)K>AuIm$1*~EcHMV-!)u63R8mQbTIsk@`fo&(?{Q2># zKn(yq*+h5i00k3KCQ|oT+$N%~en4*m?MqPC_d*yQ?sfXWN|`^{h7S_L0{^g32OAa* z_VGLw%#UKsIZdgb!!ahY)6;CKuy;2UVGhk*WY)xkc(q5AI8a?F`*R68+y^}x4Lh8;gXWY*O>=_o-?|--F}!Y%dbsL23ZwEP6f77+ud;Z= zN@NUMV8+R&a~YKIvexnoO-}@q88hJvaKx7oLIGcb3{>A12et8~Ik?CoR<;-ewQ`Im zUq+H=KXr+a1L-Jo^5(jnAsXY1<*~R6s*TwETC2^IQo?DBKDl6)3mK}c9R!!%s-+~7 z!{lM2t{&+sDwoi zdfH}D9;*850^?iKJ#P0OGD$QAYhatwjy{M2dZ|UnK}$eVl7H0xCYl3ayAc#K-);{8 zO0-&<<(bI+^Cmgy!|nMPfXEd?A6iFZZ0cuus|~GLPm6mnkvp;KgrsA%3@1Kad2j_r z1+K+S#I06HBQ0-J!mkjCPnfBM7h4aE=&sOHn6~YsgoWpipC=(xOdRJV*HM%`4|1h;xZ(l_3 zQT4ndtt*Q5pV6&OO&#wiPZu3W0k<~MQfsu@A3*yc0Gg+j0sj8ZwB;z8q6qKane73Z z2K=u~tfzoCC5OIe0P76^h%E%rE5PeY*)td5(j}8EYuc}L0BD~B==`8RkyN_(myy~* zlux31YACT7R!rX!h0T)$6-R!X&1F$gXrp*o$~u8g2l0l@+^|v7`(pcXLYuxB1NE`w z2&jf+`foYMr-^XfLI!w;D|Wv6GxAWK6H^>v62QMk=$`DE{xUWr^jvwiNEqgV zVB!5bT+)TtpWy0B& zc#4M}UF6gFE~RASC>s=f1g4JNJ1mV9;Z&35Wu0fg-1@}S6^6aT+^S*1BrN5U##Ga{ z$~^ZkRgCl^4*b5fZ;>FKhE;+TKN0`f&V-5C=;h*!DOZj$hjSONXB`5@CbBy^>SdZz z4~UZjDF;6;h7!vCjM@Iu)-b!NrtXLwd)mBIqmMAm;BEM5D5}<%9?J7Vw-3B_y^;iVP)4-jhd5d<=7pM<(5=|A;_hTf zD%p-AXtFUV=}fphZJ;)41)&$4>yRMrX=cOg0c8;!j~I}Q){immCx;gm-=3?Jt%I?^hqoE4i1*tSX@4bn$K==zC~<(k|B9$PJz+;sm0oq;)SU;Wo}Xt48EwD@l7yxLIriV9`hg(Z(|f?T z|LTP~OY>Yq{;@|;^-6Indv(u;$erQLuh_RV)va&pqhZlx%S8TnOz)i{b$Y@iT!|hnD zISGOc@$=v|&1ZHeFu7P!O(e<9na)Ue&nz%-cRN&WH}vsIcmk(qUe$}w<*5fjQGc_< zOA%|i@`|AKfJ9@h!6PADu90{MXm^$zz22+?^|PdFi$#cBrYXTnjA{<6e_6Ecb7QeK zm=hPXpYf55d)v@p{sL)q~-FiH#)WqdiSaorH%=Y54bWIQrKPgV0#a4=Uuy0cNfOgrxt^6GGU5Pajeb*IZKN4a1DgO!CeKt{4Bch+TiW3p$ zK%H&F-0YgGDn*_oo+h21XYfpw_`#0gbjTgkzk5$@<^q}3yhS(vP(w?lzSS~jc*$0b z@|^^7Xzh)gpRe_Pp-iZn_6cA4}p_k06oy(HcW!@ra- z-O}Za`rhQ^1o%WhQH z`rLV4^vvy!D@)O9hQStQ@x^qJJ&yl|J#Zr!@46+ z<|F-hdHMJE3|R_3i+r5Yx%!T3OijL8d(qnO(^jzg^>3Vi#(kGb?p?byzrY1&?Hrjq zg(bE6Ph8|>alR|d>$2Fj#}g-xRnPZp zQudoU9zLTtm-{C(yVR^^KRg0-L8Xhj6T-Ead_lXy8Ez%m4FHE=SBAqnlqBa zoi``NJZ8f+%6JC<9aV;E|5Yy%C>rL?-L9GZHN4o_*;HwZ9;Ta=`UO7NyLrHnJ36|b zSVb39q)iUpUid6?^WIC%Xg zX*UJw+^2c}!KP}!(bVk2KLIIi8qR`$kM14wKDeM|98+}guH~m=+*H;mO*glQPM#Ni zOK4B<`A0Hq^3CqN?nV(Ct&xX+oD+|zFCNA&eOLbZXMQU{B>9nd7|wC*Uda*eTh`x` zyW2R|nxqp$dit`3Gz4S$u7>|uc=O1YYHmZJ9Ode7~9+-Yo7*j+$v4~{xa+$-_;b^Y7vJ2jqPKQDe>el)bVl;8U?R%le@8aknI zVz_#MNw-epQ)g_DZM({-hIepTNPxZMBlqSu)fP>i`^|KRuM9fXmg+Yb`}+FSHpl9j zwyV73R;b?7&5d+!ce7&uoG~O1CY~Jxg`kx`-yZiZNayA~FMB~yWBEdZx`nDbhw6<` z-G!zGCV*#_Q|Lp#O;Al?v)D0Z{Bcj=@3sKnw2f$A7bh{!;qI(jN+!tgW_gdb?&i3i8$ba`U<2TH(E%njW}+_1PRrOC}_1A)svS zfd}>x^!Ap-dLrN5-O`66(hti;mR;>9ZMOp^ay;*KoenTk2Dqj!C*+$RaDjH}|!M%VpVJ4*Tzi?;}+1@J=;U{Y(0`|Ef>A zsQO>MdW!d@nj1eRp}F3-{?^J5EcP>Ei{JZ&;@+jy`qO!;z&{my8?=5E*4iOckyh-T zrbzE*5;7%>{h2+%ROfcU{L`CE=?;k+jv*Ep#xB^GseU}Z?I!o{!>*>kyzchX(C_}Y zZU-Jr2H$eI^1g1EhwqX4>pPa~Y6hiW2q(mK&Q7ghC8_=|dksCVtM!BBZqol0tS(PX zG&t)H1%~_TY3Z&#QJzpVdZyrA zSv`X>C5%n-O8>uytm-={-^QMV=2XNTFeEqaeqH+BDf3mays#j5tZ3D2V$yX-M{z@@ z#k6SaewAKiW!$s<3jQO;PS#)AfrV#vJcZcnT-HTyT86VDxb`cmsJe33_I7G&Yw zxFft88pj;#?=;R<5B_G@?SHwtEB51Jx^P*?*8SJDkN)h`PkNVx+PO58m8pxnhrPj4%l zb~QYhper&Mo`2RB_@U$gH+geV;;m4iMc5tNBDaRhi<-DGs<7F2wT<~7wAee)OX$}} zyJA_(FrJH0m-0P*s(=Yv~u;mm;a1>-Zz$rx)1U8OKl++< zr^#WXxv1`T@J-!dg^@1_zN5P_PHbE69`T=RkmBchYIvwD_~Q3;R^1B!rSX4dO}DuO-+sDqJt*Y*f_m-Gr|TgRxGf*s(WULA2X}9T zPTGc@4fQ>E^T{MW(=Kva{@C@Uw_4Ag2BDA^mmP;I$t(90GW%z7t{f{8`wU7l&HH~7 z8H^d8-d+FP^W0PI)x!;4hu1wJt3v|AdqKt{x94*IAbHRJ2sdsvS(vL8QYnl-tFG`I zR|vMa5V|dzB6SlUu^QvG;Obcm#QRJyIFiBmd~Nn{$ime0asPuF2X?r(Qef zWx&-JT`GZ2H?qDR>=1?>dwOdapF&eR>QDBE`xx&szZ*JMk#ur2^$wso=N);r&%Gbh zapU75D*b#k_@nlkP*lDwO4(g&2y^YR2=g5nr#}LbO&TZSK5jAJkTs z4B|d++WnL)qhIQOmHn%}zQu(t;wIv`QRv&Tm5Jn(mtQ81hl^4NZ(MHJtQcJgJ>9pe zl60;Q@1l65USf+6c|LEI*K02jKiB)_x^j}-NEFp@HT+l1GulDpxmRgz6g56u$4DQi ziXT0Xc9U}q#KM;Q&nT?~+QVcO=Bmr4Gw>{pGmU@gk6S-i8y~L={h8_b#0Z)B^qTiG zg!|4Pj?B*u>Az@-jY?CESr!i^PY#$)AvX-lg3wQaOrVEtLh00_D!<|zwCH{$%>ReQ zKUoLr+o3~yPpfc1cRO?aomYvk!7wsW_d8K2va@YF;KgI-mQ~(wA3L)k4_*Eu4BS4{ za7CS&-z3g8V*6((Ww#3oanoDvYP8YJ$iF46_6w4olr$k0H1``NJ(v4cPF6GPH2cdO zOP{A?lutg6rv=>%aMly^lRuChX#cSJ{=K!Q=T^#-U*m&$O3yWWSsQNr@d(kLwfz=h z*nnn0t$ow!k4>h2&;OZs)!v&cXhiqt z{}_@0JV3+0y48=q9DIBDtKHnX$j58jE3+~Wd@9aX9$w3vrfUlb3Qe1@Z*_~R{IaxJ zo}rzV*CygpDEN58Um?&_{NUwVD|NM-pNMU?`(d9s2|*7Y1YPQtnt|~A75tupMz@{V zEq0xMprmb=%=&KyIoms}|hIo|w}y#4mW zz{j+8;l`!fM@u)t{?15<%a0s5{@-C1d4p_R0U=nBAWjwMC!bSY$Z8K{dH>@hbez?LTJv+zf%}9_=Yj>8$V{x6yOD$b~k}Yfx-QO}xv7Xw` zbw>D|vY&K$<%KtiSTn_>`Er4)L{=GG33>qnoPe#x!hd?>O*N zcIjN4gGy;%Y#B{Y%Sekx9?dqC?icCuNxmy`WthdjMvuT@e?(XZgLxHjp|oN#>&B@5 zh+xRnRks_h3%s|QuBC0~N!%VI*0HcdH%n1oj9y}k%H8BgjK#OdP8;ODFu$2Hp=_5H zv=u8Qf9LJqXC9fOd^S^Tdkn*(-#hV_7x2H^b8ph6ZO@(j{`!jr7gqJySuwATbIw3; z7<{;CoMA5Cmi^`EapwC)YpOh6S;a)9qfPG%v%6Kkn+?qWSa5!R;|E#0kq3(Ym#QuZ zrP`QS`-`Wew!C0bU0W3wSRER;oB3I1zLv9#?bBo9ECcg(A1Bu@IEQfP+rUR9ag3f!2goOOCqzTLC*m7vC_uJTD+8=a1f`T+R zIvlRYc<^A*rBN45X=#Md9PTy9kI`8dM!zbo=_~iX>(#AKn&XgEk>^YlwRn(_i(_1pb zlK1lSXT8svoTQ^(NYqud(s8L8Ah}`^MIJKErM#e#L+wjSSB+8L)DV5xgx2Ei+Y@1} z8X^+XRvMxcw6rGH*Z7VrveCa}4Jo~BG@^aIdhDxy%pJy}OQ8sz#ojOef%-JJ9Nr$X zrPF;e5+*c26S#_L>_lqJf+0Rp?qM1;1LLFe_!>g!(Xsg<^Lzt?HAzNVya&xUzEh`h zem_qW6q70wKPp3$RXfj_e`_jdQMDhqERvTY|r{C8ipeAbOl|; zqSnBfh6W|X1b559*isIf4~ltL8oslC|HRw!+PS*-@ftdY0o&7~W?|_$oL2q1rLwzq zZ_zBr$VNsdRmf{SIKaP-Zt{eE$MM&*2j(R`!o$1TKI}TKDgW$xJ;BVe1WyS0zFAa8 zG=+Uc6nWdK;FIzFR^g+`+2-rx(o$2G%=v};K=uVYCZTm6y=?NfAy^9Y80z5L;V!t^gbeT**#Xx6ixeRgVQ zjs8|{(@zpbbcdAhnsA1#uI#UjSw&}?uz8C}_>Zghmo26Z7?q9070QZsckdgr&!@4) zoYuOk`IP<=`*cIAt>5aH?~{Hk-5X}svESjy+-)$B9r1V~XIF2PR8r%M4>O@VZ}xnb z**f#YDfJq!e?8`-{pe zb|T_zqK~CijGwx=zZf$3VIc7Gfw5B_4$YraU@#-H(fm}6&!-HioR-Bn(#dtTC>_Y<%w@J-nqg7A4J>}Z`TC6TEu-KVkR2WyF5vvT>O=aaSu zo@n%UM*I4z@di|B(#J2QS;n5`vtSQelZr`sm^hyTz=345hb;DbKTqEG! zX9W#A=`A<5ukPHyib_5D20Itn)w{u>f;n(hKln!Xg^e9qKa6|KW2XdSQie|7RbvaY zXJ$s)(zFc}_0i(38tYg(Er)uglt-~o`w=P(suNYpv*PCdf(^QHd1x;$jm-+kTif?f z2Lv%$xCH9z=54lYTVv20>)UdDG*VLH`riDhu>tyR$J!D+WY)O#qmcr(7i~onmsw68 zkrT_>Qar1`?WSE~?R5VOSMs}udIg%wV|QG)Zs?PJ@mS3yN1JzXW4fE59sxU<8D$%J z!7y;pF1)p-6k&mT*Pey`^0~5cqxID7%|=%@3Erto9}_H;J2qH!>3P!)?=R~r#UJrI zKb^i7VUqteSj@@+$+Hh%XrOm}ezn#aLj7=klMdULyBj6O-MqJINU3Pnwv=ZrTKm!{ zYuIwd9}!=VH7W>vbIqPP$fzc^M>lYj>;SK=bG&DdZ_k#AGXk7im(q6od#u{y9b{uC z))C(({75B_@zLgztTdhV7V9l0j>Q~6h#%R=T;29|j%#mojp!N4?H3j-lJ^PUm)|T= z@pN3;Os1S8=YU*K-?7r-r|ha5`sySGZil?Xzj5f*dAntC2%I$rvy;)%kHkIn?4 zk~av6yvh>a5;WZz8n#xA@5rz{8-`wtLG?l^0qa?E{7C<-TlwlA(;N|x=+1o)FFTd2 zcfhjw%b@^uAy3Eb_C6ni&g7=3DIM_vHsAVy3jbXavSVXG$kuAbm+=-++W9SS(qj_s zIAw+DmUjec3EtX&(|%KE_rj<1SC!6v3iAG8&4oX{BpdKNdb@sSV(u>53U`O5CmGXX zM{~YjPn66*{$6JAFZ?JM=sMJplgQXG5%)kI&$2)Ed+5$L z_7)xQk2h^Qtgd6l^1WhTT`xM}l%~zI8ny?4PcYowPIEK6ScJR8Qyi`mnvL|5j^Q>w z%oh@z-{gLNms)qwCOw4&xY4-Ep83CHM5^@FW>4jix7$L`S^be>f%CwhuM?`~qJ_>7-(ua`er_1~m->>Q1R$Ur@Zf081S<#8WKOPWk7q*X~-Rc$> zj~U~`NyU1@wj1jMj2w_pj=D6T%8Na8MJ%y5=lWNvk`_n75^l*?opk5E9caPr%x-kb z3KM;^hOnp0s+@(h%Fe+y=~~qM(XeaZkK5cZwtNR~D>=fgPT$NuRup7PggNeoEdW3_F zm%gfO(KZwH@a?g$q)ckpJ#di_%tDOkjH}fuwGWoLFm`>`Hk*7O^#K3OH-LEq{%+ua?w@f zq&-^hJkOw7{=8#c+XJB^JbRLNmPK^V=1FIi%35WgbG}12i9S-C+SZ=x%=d272hZ(e z-Kp|xXlJ{yqL0>;;!YOan~ui1#9{dzoBN#0%k@tZ8U{4>Gvq*x7G^9z`+zL?DCB5<>;MM6 z-sofd{%mPxUp7oK)2UgS`f0OnQTxNZyqL}+T?Ujy7|7gy9HfB9^f%E3`S84O}m}qBJ>nnCc zC{IuPhN#xISCRrkw=178$sPQ(bm+Y1 zB&l1^S>NULl~&5BCf#&X(QEh=!qk6&Rq|28u~x^T12nc__`>3XIQqg8W91Hyu!JWW zPV~)}_gM%X*b`!QclT-QBc4TT8q7ru?UE2jKU!DC*qxj$hb*hw7fdYq5H$9 z;OOnn7sa9V?o+R_T;+UIc6OO2#9kbosW#L*bklk4i|!FRm4=;n*TfWxiAFL$ovgY~ zfA(dOOKtQCo@Smco0}rb&{h`(69$S$&33yUr&^%&l8~ z{xy`rjY0J8`iY?Uj4g#mg>Q2U_ns-Pdt}l#S6(`LSa)r8{cbjs*BfukYn^Vy%houV zNX&4a3U$`(+Ltx!9nAmb#CA)ZV%6O4m%DcDne$M#-=HR+W{396;X5j6c5IKP<4#S9 z4Vz~_=WISI``Dtc^qxc6cv!6R@+Y3D+qwzgWVH1Lg|=0cOboagCi~miym_&ek;7Kv z+Izh`)uDTX)ed>(Au~2x>jn4nZ+xEX-^laa)9>ZtS64&suOEdX258#yS8e&|=B3xn zzJ1d{$j@I~^0kt9a*GZxo0mH(Dc=1$ z;-++kQ2SR2Z(6Pk4_@|18rV(geXKDrJ~l0Hm2u_%-NX!^>i3E-_BVbW9@%(|BNjJW z!|?vt=^K(|$5e0bPiM96+t4;ZuXT3yF1DhyL9WJ{Z0&&4vk_ftMkuODcf-WK*f8S^lAMBd!zJN|3RYuB55W@grZzQq)ZlQ{4} z?EbKdZHda8T-hg+uX26avk&FeJmm|0HuAxL^ltgG8`F)cNAHZI3NseiT*K|w%3l0x z%ba!lHur)bOGn+r-s?GHBd;SK3KX~(>fQ}z=O1$A^Dngzu!_@jmRw+ZZ}aF=IcHI= zV+;Z3+nw~yq%!U5EL}?rOV+{1#jm6Ev}WC_dp>Tv+Hv;u%biWA$C5(>dGD@=M~TT2 zhSbm|4_pQKRf9LSy+Dn$2(6}UpTtK$>W^OnHYz?NF3hYk1Heyz+zLJdWVk(vmd>~uwyb>H#+R; zZ27QKXVuzI?2zaA?7`PjdC$rXv8OKKcc=wQ2I_pd z=J4$EA*ljokIf6IS8ZO^_WI0}wO@X}2#DeF;5b5T_tyshOY_cQan1(ciaV~KQcqva z=qw*+SOrv-F%qiM!e1l`^#f_CHY&=sD3K&Z2N31Z4*B5*<7)*1SeSIt+wrOPI>C~Y=?IYnKe2G*-%woh|D-DGQDO`p!iW+f(M?we>N{X#7{nx#8~ zGi8oYTzhF=-z}zoUUnpVu_p1|>)yux$n!Ntf+GaCj&Sjur4+{vGcirU%{eKt!Y{&R z1M_Z~z4yBrerAf^T1%~|R(oIa^UjRX*Wtr4>u+Cqcxvr~Fl7nWJN25!j0|&}eV(YV z9p6xra9{n$vG(!xTzBL}hcon4)Wp{Cv6)@_IIeidCQ`20d4^f*)y|;#d?VVOpN-c) ze(^OV;>s7}*d@t>=ouav&QkenrLRvf;q(| za|MHgn#^*3&1>#GUK6;;Q}Y$MH=FjFx^0L31pTUR#UMKI0Q~y1f?o{QJ8W0C+q&xT zyB71p>T{VxS)6)ZTa*kY7J8IE@LC+GW91E^yErb4Wva=z{Z03}=^{di{-wKU_L
jr}1LRpSK_=hs@yyC3CC=0uIkv?n-N~(Xj1*k>@POr^ zXMNB)9Seev{OH~4t(o@kFNbbzroU-99EWA~2 zn=O7$*SsJ$$naX#?fVuj`Tg@>HchasJ3Y(wHhjAR7Q<-x?2x!m!I<^AlJrDNMt{xk zmK&r4KJBya^&eO94!zUKV$XHV%O$FCCy&0G$7&JhU3Viso6iOvO^I3j*!rz1qi}vc zA~@m4^~hZrN;i+*n_gn6*!XgoGgdBQpr7Lyj#t9!r8Riiz_ zu9w=0A~R1o`#*XZuKeL^o!Rwcw=o==myN#B4>uaIEL>M?f9yY?d9X0;{$K}cL(#e) z2||kM>g)x+MdnU#)sGq{D}vIuCH)xsSn{3s?b@=U_=$$xk7aX91r07QeEVkWB&K_722<|2 zN+j)bmCBD-G_ zZisSMR?f5g$S+QLc5Mr9wQTA;pR2m?WI*O!Tk7Q2b~mr78Ji1dUzNSTsP=8~QshhP z+n+k*<6ewjVJ@?IwmH?kRXsx~++z^!HY3_;z9dnp{>gVM8r#}l`SftS1uBZP(!M5quLvegR+NMgnBj4PYz)sY-jfG*cpfxDqWX!^n?dztm(8= zgvtk8s>xHAwZctf=V-rv?YM>0*FAfX6D5E;E_kixK@PTVAwN9xOR=~QpUR*-ZROs* z+3aU}l#6rjbe`|XJTBSV!y#Yssb<}wCkuifl$on0^G8;-Rwe3O;GbyG=+J#4)Bkcw zRU^XShG$;rDQ}sZ+&Ayv%b$Jl{ie_9=vMiby3`>9Zmqn7QHORn87Ku#j0fAsu(#)k zeC3lo%h;8-Z(U}mp14R>VvA{BQf86K!_4yu%7e-elPvi}PR8Hk44Zr0&rP%K91md5 zZ_zh&3Gy=ab>6+neY7E_dwt+c^^9{UN7HP}v_~%2^$)_woqQkB*~b$0%k*^z?$h4E zazSv&dq<$1-f6Y=skN<|uQD>e%&^{EJ}j3RxwEE)wLbkwi&rT4)q@< zgAKGUwK}3EP1X0OjkMc6f4p1Fn?(e1V zoV(3%<2oxtnc*Z_uQ+f=PmCXP{GvsRUf;)#&x?TORv*9xOmw61VP>|{Q~n`91TNg zjP*JRn+BDMak<- zM@jXLG4op)eeHUx8elw)!he*XWuIgM{<}dXq&Iy zuXHNm1a4%<%O_Rbd7@r!D%Ue4e7TOX`^OhgpR;;0BlGsY@3?Za(orj1d966}x*abs z>>Xvk#wJtk!rsGQP)dK|9(z2Fb-UmWHT{C`He5c}>b}X0PKUb$l)Gf+d3W}$B{Kwg{_R;F>sg8pzJCEkpl|0Qzdw8q= zS>?{tFAL>zZ%S;?m#U||*A()SdHmV4oW3Y2Zoe}E2bB9ltqliTYZ?{Z>(06oYA4?2 z%012KKheg2Y`E^MWOsRydg+_muJAkW@DYlKPaM+TVP~#?Nr%so`9g=5w!-V)h|W4W zSHif&lCo}l0Ij|I28K`cW|Ft1&U_mvq&>0~FD z?K}P62uz#{?y(sak=-*@9P{pQbaOA#Dbo|FVOjg2!R_p7b(Hlv*@863xn%M64|mLD zHE_6}#E!{1l`xzed(Nc%s&xIUwMD^KTOORwfVqGTtsk{49;{2OG%_u?C%0x4+fV?$46BAwIkMcB(AhT$EAm8d*()m}) zDe2SZih10fWWC4YKi_Z}lN0P5Q}~r$z&Kas#|v{W7ur6-AA^dEC(h03kJQDmuXFP( zTU@K6y%@qU%uauQX}WdurcY{gN?B~S`fQCm^|`h>VD^_yh}lUGu{x#{YuXg@?@GF{ zS$OpZmM3iNcMaTX=y{Y67-@7j9PL8(n_bap2%ouLbFrpNdHLkx^TK9@fRm-Hta2ra z$vUr3JctVCtrX&6Ih%W&HS1Hf;m}*UOu87Ety8DP1k3~k=VcKr`fbUpWIc+W%`G%q zXfT@XI_|5>x+8KKZ@F4i4u`UXTZn*84L7>asiTOMKcwTsHTbl`2sDnv2O zp0feFS!3wJTG{PPIp+qWfEW8BI^W6f^WaiDL(ohqS&s`?8qwLP!pdc2zE0}RD9@r5 z{i%0>rDm)=hGHg5kzxtRuz+Em(K>85XNnd zXcK!RcbH|S@5|sW-E~9vw0NQ>4&_;o9Mf%VV3PaL8Y1g@0xvH2u+wNMGyYsiE{&*| z-H9J~wJl7K?E6YwJHD*hs{Eq|@qYjYK>5GwPZmO7<^4LpmXkMRWHU=qMTH_qW2!y1 z2iFs?pYmF04&+C@txwnN$7Waeg~QgZx@SPo^P5`SRQN3`xsEmG<1(z1Ls1tMC@sNU z(pG-$?S%*H*;#n$+YM{9yx(JlHx4ZQ0vI}|?n7b@qN7C>!5H{2mXbon2bkSEW0GKWE8UnRO_+4>S1-~i$<~Q&C~%u2gmD4AADM!g+nnd|%m;J@r)FaZ z2jThQM=zf?Cpda>I^%p3Fx`GOU57sNk~cMEa=DQIZY|;&Xp3YzWGbe*7>n#`qp^0) zK z!C5wMnsmzNGWSOjXb60Nw;^8;S-FUjC8k_Ol*|hzwtY;m9qR>0_@zD19;}hJM?U;1 z(IuWmbFc78XuglX8hy(su_7DeW>#WT?Cy2{&uhFe9 zz{s3tzt&#tW>u27@e03!c9i#5y+xlugY;aAd@zaM$rcedI>*^h=9ujokrZ-!(8aN; zHn6wCdfxHEv-#PRsD9(n%JQU==1WqBcaZ)H;i~X!aQD?o&AZh-B~@$U7!1vuqRZWy%pS;QOE(5DtY+V!j_rqH?GjVW6HYE z4I;$`cWa}J>XB$^inJM>G5iptTbD`|K5EBiD6fC@j9!T zZ^)cfFMSjofM7T+_p6gL!}Mw_BI8Ze9L^uQOLl&h{gBUXHRWp}t5d4$ zRKyggz)>-OBvgeZlD1cPz0$dp8N>7booV#g&;e16fjd^gPBX;lS#5obP%~d~?%=1{ zZXf^K>@d%fXAN?vlp<3L{OM8=0!H){w$=(wRrTgNvQF6t!OCOp(bUS{i}oLMp+*~^ zkv^q09*FSH;5ae%;=#~!WSVsD`$}F&N$Doc_!8V6Vn^d8ne=Q$2V&-rw!EP(HjEJP z(V5Ij(4*SZr}YSPJ=y?U{KN>YoEp*Aoz?$&>d|9et1>Aar}~l zE_v%cq~ky~jL06yI{+Z1@C0I{&sh-al*e+JC~sKNNKo|_i0D!|I-7P>m9 z@^T?iQtjmOMRWrHC%n{!-N?A9i80L&tl&GjXP$B$6`^Dis&Zfl`#Ioi(aUzJfWVcA zdLH8I+xU?MQ6I(jpfv<1$nz(jaa>~>6%d-z-NLfh|LCw=JwXFE`m{b@1y96|yY#A; z_3Gs*7CTVo805QI6#5+0_e4GhTkHvMYL=mDQG&%TDqpd~te#P}zlEi;zdZD)@l#cv zg!B#p`>qSMSgN4ERViCD=7?ZgrLg{^&jUE8FA{4{W}4OpXLDFJC`S8}UR6UjySl!A zJeWH)^bmGtyDB?g&}#~D=*PZd*ZC^U!|FU7dt2{*8rNjTNwFpOu4U;%bua&Z-b}Ro zqLtedM@OOe7wwI#llciGV_!4-lQM6d&sW&V$CC~ zgqP=s;ruge^_?&J&Cg}qj^4%NV$%{$ciX2s>p65QrmERLM=w#DwHzpmJV}iAbN2ed zcKL=A({-q!p;SsV;#kslxLoOjJvUP<(C!K{s* z!O4iHFRi@OEfQ`{jZ_^FXj<;v{ZXnWzI$-vHo(M2bCz7W@OrFNMC6K`V$P@%*IM?3 z-fbub^8JhNJYrOopSL{W(AARmZ`Hu(Fjbeg_AmD!bon zTFPiYN_*lhMz!{F}5F zTgceuQqCJd3Tg)gS>HJ-%|bhuHlWgIG+f+3f&$vu=2Dd{AY8|zuLM3O{Wl2+Y^fGeAS}D_^w7cQ&NnXLVa!<IDLGfh#w8Tl!)J>g?sHj<@Q+#qojbhP*sC&WVz3`2r%_;o6#dz}WNC*f-C zWI;!Q$Iq7&sFopAPJ~iRCZfSv7#`FZa^J|Ln1aPqFmgH<6=hUSLBVhgT&hTEeDSCd zj8(=Yp{VB=nk`Zy!Gn&8VN||^!Wb?sQj3DU^6G&f@!K@edKjGj2pRF8P%|MInWWTj zAF0wZ<#c8!e#q(+MoV4FwISRhFucYkBG9J&BBg%!h=cY^X6IA13yd-vYnjpDk58q@ zf^pHN@C|ch7=z28!I>Bi)Z0={L{dj|ht%6Sop4MiV$hqin4xd6NerL5^TGg9`yHV3ylB)pbtq^yJc^$_wn7lS#W2Bv;OgLRecTCgwb|w$F|7t+Vp5Aa&Q5g$3GsV1d&c45q%*ZZPbalg;1o$kR($6sxOVv6&zgvkPrT`9vi z)|Wy@h**;X@2L4=74%{Dg|;;_*9*Z8zj*AxwHSBk^(m*c+V3+EMJ zDJA16=0-)mA|-o9(ITQrC*|L?*G;?d8GD18LN6hLV^OxAVCb3hw5`Zu{khhU*~3%G zo-Pv)N9p*Bb+%`w=lt4Y(TW0HdYl}ID=}LSnR!*a-G`FhUpm62XkSO!uo&k}@LoG8 zmVaOAVSpk(c)F91nWX|bRv6o`lxLnJ@#{fZ13LLP>ji9pPGrgyWJ;F&qiVGv(e`^I#nmb zl`jal*j0%~jg2onzD$@+=IP-b9{aeVFKI7*^wJ7{;m}cMUYlC5Ae;0fC`>Sd&%0mm zEpdt?!y0PV_xklJ8!}K~G*!jQOc0X!6`&C_u=L;f}ji}LH;LCpzUBgQ+! zbKe@fkTXmvGFgEpt$~MO;pXulnC5H{y`>|2Fq1CA+qn$vgn%kxb`Z>V z5PfVWV$ayo*&$%RJS|Ccw+DLlNtYv4{E)M9$fZ@=!-Pv_n2rk^S&0drKDQG+QL?X! z(vA?TXAoQ8sSq{EAj>9OXmHnvjNZW4ex@vPcAdR}c^iL7VnPHNAqc#tWKOs~Eajt2 zFgCB+$Tu73ZIS?J>scNZyiX6lqnsq+I1l!B6G6cf4lwkdTCS6|M{Df7X~=y!z{tTn zk~&ZtP3$+GB-S|WaG;NFbM=19XDH7=r|ChB#6!`ZeKmFaeoP%l>5gJ7T~60mZ=2Se zs`a8y1xZR!I%dJ-2)^dMMaH;u(VSnLNjN^bt33$aZXp^K zB}H|u#$PVJUEwhmwX)^sM?U&rzl!gd(x0p!N31dHa?YA=I&JdA5D9ZpRJZ9#>y?4F zUoqUSOOy*h+tA6LzBo{e$hFPEajPaq@B9%x`QWfvr@}23WxO6$7u^fXbFhr$Vh&tl z;v*%faJ25+EFCkLz&pj3=0itYLdp7RF3LRxkI9+UMmN{;inL`$;x4P^@Br&;wN9S& zhpA9Yq;xKnTHSI;spp_Om*3eVYtFSc#lwr$%^cI>?W^>>OXrkipV zD|=Hf)q{*o{D((vZ z;~ezLtQuNbBde>Yv>7`S2ti}+>z}g9UHv7bNU#D?#IDHSRP*6EkWszqI&-FKpNDtd zd9I2dNmkK)?A1%V{eSs+oqUUG9 zt6+GJTeHrLY}7VqYd5@Cz06A~#<*r#<*G-xIe=yfDKjF|~^+N2bU>Y9>T20I76(yLkErAd2U} z^^3sC4*R~d@s=g}8jvc00AB^Ghv==2~^if1YT!u=c6>kF$LT z8``v2M^69w=h(gS`12IDarU#bl7`TUzHESf1NOm zl+xa*A?k^*lKgt3=B=vOuoR3Dw!Cj^X(t6zH) zFHN=mIcoP2>nkf~ZY9f3i9{kLr?ZULDQa|QGl|g2Uk2XIB;I4dZ+ogLu1K)X=xX-T zkM}2Oyr;c%XOFV(=tcjUd2q1?!r-+q9BstCi%Dzf&n+G8wgmNf{bHHt6uIf*hztkw zB9!wAe3EaqFqwxoO@mB z(^N{amW~0&w`rIBZe?0<)u}$B)~s9AJ=LfmrqSgM$|cT)%+|(-X0O}PwDuXPWij4L zpP-r+I(sHSq$#1YyIt~W$Jp#PGce*Fz~UVua%T)OtuDQ+ufFL$DVLZ^%z#;LowYee z_1@aqQc5elXy$56sjs+seIqZbOJnuY&8z7I-O z0&L?g(Ti|#wb6KIrO*BT=}p}~)3NQ578m>@X-2E_&3IS*^?Hz=swmAmo*V)UBm=i}=o9H@H5oXEE9}cnK$-Ac?Ovz;u{%KoQ^Et~!Xi)L zKGoOBnU!v(;A-GXv%BT9)Gi5yd7Eyf?ZY0*Y~ndDZIeCgl|p}TP{}p8mtX%0-|yK)}Q&nL2@l4)g|8oLhEFy@vV4d;2)`4Uc03T#r*4Y7%`QXHQC1r-<< zy6;|}NVO(6%iSD59VtQqK4o16LVW zqc<(}S3#$Rp5nz+4X^0b>JXNIS=U)`;Fm$LTVK#D9cOT6W4yC#d@mHksWU@#;TWwuG!weBUUQ>G&fH3$Q>2#*w4jjoE zOI%EYl3Z^O(eSuGX;Y2PcxH6Degdz|U8IlDn&<4<)-sIgyz`jN3#Onhc+AA+(63o? zj#xVtKVzKv$t(9!uTbtB#vr*YwC@MiFMxUY+vPYkrm8pWW&A$wFDphB&v#2SMpj-b zQ@7qxPt!*@@YB$lJ>OXT^_jPuzFLOQ`gE_uC$*)AX*T+r>O)B3p(T!(p{Py zu?I(b4qs@mRpTsXH12QWFqx#H;8aum0efv9c$EBGh<07OqKlsiXDb}q^@ZDpj!35| z1bEVFp4{(qxEa4*qr|~KH!$4#YHT;ud!aIf+56LvRej_>C4HNAcb*6p`?cooBag2M zyUXu!rOgq1TCV&%l%A^QtJCZG$61(p;!aGzACH7 z%R|PNQBI+xb*$ED-I%uOcrk2m?N3mKF*X7CrG7g=75S^Rgd*C$t*R!B4skNx4rjJO znq!e`;+0+}TnD04yRQkHkRjPXb4WXSGYm!6Ce(Q-Pc5D71}|OZg$0D&Inx!bTm4$! zjClEP1M?VrPis26`vR{%OBnfIiWP*?=F>*onsiJ)zcgc7E?nEXpysKee%N1(wWl1e zXSs$L@#J)d*(e(&B!=rK3-7J4LD`bOVxnTV&HtmfGW za#VU$^d7QZ;;Z=fPQD10wuEf_0UT2w#)H?(G>Kc)pMIO1!q0&?9fX`eGC zkz~g2omNH&$Iq#P6oYrqChF*Im{F^)cB%gyyHMEFQr(<%362pv&ev}k`{IU6wt_w| zrkT*SR^7X;P1n0vP7^5DM&S=iM$zpN=6YU_gY_4gpNpp43G{#(s^v}-0f}e6_;Di5 zys&I76XJpfR}iQ3Nu&pX^I!AS8(3Xi9&X|2S+oXdShdSO4sUu76|Hh`-+wob_*Xe9 z?<6wC1T4s+w8ZTaZ%=*arLoYKn&oU*pOb-t{PS8@-PYmQN*37J{l@4yWfg&oyBe@D9ryxsa*I4h*GG(y}d zjn40##|k3*4amu5=K8@5wa)H*ltz=#2oGSJ7JC6jk=?OCk#?I5ljelMp55M-4()T_SYd>-WN~W=&{8S7xYg$|ama)rR?J=Z%5d>MOH1UJ zC=$?XwQcIob-41@dG*~+p$$-~3{VLu^eQxM;;w!s0mt9NERmteEX6>4HvukZm zxz@msV60}fLE?`oFGCu}%y*+=9KfgsrD3M*UasQ9<_lSQquAXUU0&P&R3&rIRyPIs z1(s0Ou9Aq2nVukBe13-7;Mq%j6sUs~8oxW8@#>+g?&OHaN45e6B1%IDUr`RqutPA4 z`TN9Pm4%rlqZ9BECT2}$dV-aDcMy!i?rSz%)~wR9&Arpv8A!$olhdDNo^v2-Jk^)R z^D&jm?Zky3pkUm}Yy6%;ZW)cG5=P_r+alLyksx(Srs-rI@hf;*bC{)lF@NSDF*k~N zP4+9And6xIs``6LjVojXGM&*P2LEx(OY+uyix+Jm>;A-Wn(lZ%;s+cXboc9Aq$gBO z#0;*pu1MlP4Og1ttH~wJ2)ke!iT6y-wr)%0oAq%s?6R4KvkezfX>N3jHtLIF#PkOC z_wspJvu!Es;y*m;>~7?304-8dpw%Zv!1J)tr`Y@RHb8sLuM(0axx(fr#(G<>XHe96%Ru#B+ zkoP+Z#2X1r!%ep0jPkmDb-meewJ8P8BMk&tSQhn7 zBJ~Zc&edC~lhER`iAdE2B`qku@g(v6wk2Nas4lqH>y5ISB6De3u-$gYklnCOY?e7t zrCP*GXrA0tJe8KTWO(95>-*x6EuRycP^Bz2?i#|e&6u7INl_M!e-UWEw>N7KUgBV} zi@JDF9%Qvm#=OTof;={1vKZDK2QJh&yYSdQZpBtqu(G*2McHhj4;|%|!;?>>cipgk?g!YNk4i*H) z8of^w>g-7K%Tljuq_l-{Y_7UENo}v*5d@o3^_#=h(rEG}Pe-T5>fp`N@y4BRJEmI-eyWHIqSCVwzKQgi$M5eQ;kHDel8yHT`{ zv1w6zo6?WlD4F9$Yxm_4@Rs(Qh21E4m-tw&x^iU6QGuZ(c@%UXPVCiej-k)J+MEMm z3mE%*v^TpzSsQn)j`k3zg8HRlj-pIj%o@CU!*PbB%qvuB+a!^GD2sNjx6ByCa5%I7 z_5EBJy7ZGsr-d%3BJ%GgOx%}cUTf>A)_Fp~a}GztNwbNwZ7)iCR)g|RsqPk+EvJ4k zOgiD#ZDv{6cWD76AwdHQQ32s(paF-TfWLVl04bh%%msgZ4v9p7;13~yR1!1*3bO6C{@Q{Q*fb0}NybLU0SObt>2h4Nl1dile=L@z{001lqtQ_!w zLP1U6d+{g58*j3;L-^o2z~57O9wzC{S)9r15oMz6JSpWIPM6F6#)cDqPT4T z0W=Q)@*@F}<`5?S=m6*zLH4Xagc|r@o*fDd$q z=>L6yh$JyVV*Q0XX8BtM#02yUJt_+sb8!RqAF%+*xPJm5Oc=n273~iF^*~MfgN?v} zSqlIF*)^a)5deTA^fOWY69C1U8vyyy3kBGCCj99Zddnv@!2|>}Lt1Quo8+M#-wB)v z`K(ER3Yt=n*HVSsEAVa@63PkomTZ6urZR-9E5v&I1k7Fpe}TRy`2Ya=f^wn-0SXF2(@LT4Kp%>0@Bn7{_#Gs~K0;a!2!KT)1R#eRk$zl! zLLM;x1rL}!C&VGdUpW$Lzz+5R)y4QT>3D)0en$t`hj3KU1Zf1Fl-1%7hhafe<=Q6Y@x2Ovs8Y}7-XK!ilBf=;sG0QTPk z9R$6kAblf)ed^{R0F&m30tWy<94r8wkZ!3wU^Gjx^Bv~!0SRDmF1ROz=~@IJ1RT;~ z7IR_6$MOe0sBI!V5SR#rf({e>WiZD~ra_u#3nk391iZmN=wIUjo&^0=1Mi81xSnUh z03&1o1IPM5I9y~| zN8JeVWleN4b#owjPH3%LgnJ@Mmoh!HDonSvvU2Pkx}gwq*3Yl989f+ygf5pNJuP@p zg8T7lV=oWnjGEW$>UzG(UNzFzd026vo59GXP}d9*ChH(YN8do_r5;Q1veS;?I}1>R zwvhX+=g;|zfDpNE)PN(7_=6+uld?oJqx#D}zJ&8MFTo(tuVYVYw`*cC5PD?tsnaIq zp4fBijC8A#X<=ASwStcK7}8-bueQm@!oAT<5l!YUfSp#GL_>sC%xRPLG)*|Jx5%b1 zU*GA}=Xp6@l17x!qjxrxH_Gp6Z?|I{Hav>5j=WUcr#F&$m9)!AdgWNI(b4Dm@!%G; z)o<+v$FK5U)t=o;PcG-EQ%lK?O?7y(h1}*OR-OWSK&qX=xMd)RJx z0);3uuiAz{AUqm+27H@5YYKBLE#CS!@lzN|MCyLT`CNzS$HjL=d zYmCe3y{FucFuq)3{)Zp**Zrfz-P?Ptv@N!XHl5d+^pW@q3s}~%epoGxW=nlWDl)xL zoy~+B<(3#a-+^i12f@@tEQYl}X$^+n7Wj0`Qf1t3c{yzxIKveAkEwJxKm08j433tC ze#1>8D70nY=BBFq`a8?XPVk;65UN@eYvNzH+WOrwFBh^ErZ=`UkAtuHv{Gzr91~Yc zsUj#!A2ZXXZ`%xNZr`7R&zh|L_!q!Mv)(9F+f^4y_R~ux`ZTAvYoV&_3P{&{u!PJ{G<0 zEk_-mnw0NBxEs{0_{K4$Je^Um(}g?%HUj>Q+QzA&t!*3LeKh2HyF?yw4*y*Zsf?Db z-=n$OS4p$!p+12xvQm*o{w}bHq3?f2ycY>E2%xeu1Rz$cUtg#nsL#~{&fg8)^%Oy| z)I1AI3<5T57Ki+1JF6edtD98J*Us9Ga;xM-=$ZHHK>egs*)HoxK$G)M61y?JZ6Lv3 zGx*>4mmCzgGC44AC`cpBU)*@nyW&%UZi?xgw5SKmYiN^0N5yu662C zdktFE=Lfql<}97T>EABZIgQ}H$1&A_MNs_1Pfyd{LUXz2G{-X=vuHS+$+)0@pQ?Ao zf}(P3v?KLishq*Kw;!W?$c&80UcShn!Fwal(ALQ3E461Rya-qPBaM{%MaxtNH>xM( zu#<=*7R-G$sT14hiV3k6byOxO@dqi$+`*a{VKr@04}S5)L>UQcgH>6RI*d03@yD?l z=M`XR=v=eR}>dQr*EM;X`b=%o{Fy>1g!RCZAdb-A0reCtKHAjsELc@L#I$k85(u#&FsG}&GQXF+b2pi?mzu$OQdjc zwkH`oNOTH{?@lMKuie1V@}`*z`GyzVo3&IDXT5Hx(<|`aOAo?3YheA75KbnV*Xd6- zwf-+1Mv^~od$!c{r0whe;62Yxv{%JPRm?kcme_6S^V9@LMWFBVt{DP7hZG_5(x_%a za_n?u^mr%noe}K9jpko#6Whz;l~)hQ5e@b#)Ro*YzC6WIMjWs%5a0p5$DyBMfvq@f zC*CIcW`xXaE~xNPFtTIZ6Bl!-16gdIvr}_P9=Hz9-WSyb$fAlhds8u>B$+`RBcZ67 z>H0=15>HKoOe8wD*2IX|QQR4>W+Zv^=BQ>Vq^27}`C={A)OCx^!1bljJ@wVYTI)`n zPcsXNS(x%RMkQxW4P;7nVf6ap-cA2J$CxW2Q6MLQbTjUykl8I*AOH2lKBQPad42nz z1h}RCkXdPwX@>AeAG3hSi`M?vB8BLPROw#T7KK>)?TBuvg5tHiBCplf0}P1qqWBO} zw?`ky-0Niro^?cK+FRAn*sU{TSGyKSpZm&q_^^$-PgAK|Dh_!JOj2|9D%#7@C6I%3 z>T3_)8Dlhii`Sg5?Wm3*B@XdoTI!8TIG3wqg1IFnk zR^B;yTGO0aJk1*n4ToIHbS_qT*<&TI>`iI}W+a|2*sbNLGz|&IAn=Yv80^TPZ#Zbs zqFj-Y*qsyRn`#4W1aV2T;0XlipY~@Tv{WJVz97|d4~E{6BO>Bv%+(#4g8mGHS=p^2 z&jmJeI}e2;Z|fRwH+-6xdM(^x?z>_VGHifUBP7Bb@ONLjWQfQ9MMNLVQ=jg8F7c0; z=cl65tLMY(1H3V8VJLo^!2^<>nJyMAv@L9v72NaFK|=^nwefu_?Oazy6>=cYFeIV1 zrnujLit;q^;qa6>ojTr%OA4j1EtRatheJ2rtBbU~+#4I+ZikeEkA99X?wK>x#kz6Q z&k4EOjOEICYV!1X0w*w>rP3w=%0KgajkM*= ze&|JY#2qZ!X;!;?p!G}|Uk6?HXH^#LaqI)E035`1%gq-yBZe8Ov+J#oY}?of#6=(TxBbB>N2%X5!97YoKLp5SBc?)~<(0KfV-H=GuJE(F_2m;5kN2RCssnElr?tJ=k0SAOsGq0i@7I@0KFRaF z8-MCC5U|_Yl)YWaqwfAKx@}5-m%dcO@Xyd$l_hdoM1b{`qU-G8rMiQkt3@fJ8iCsH zHoiyjdkJULjT;<>t@5!{Qo`=aa_WYFoW#k{iKPk&&Dg-i-8{PZ?bUkuO%Uc5?b@Et zNn*SlqWI;BC%TFhx3Ha5dp5AHNwyu~?|LLUIz27C*gc8zzk#}RxZ>nH9xJ(L7>ZSEX=p9OK}w{(Mj4`9CuZ|5orq=;Sv3=OK^ z2MgaRtQg6l@b+PRac%_JC9161;v>mHSphe>io+NICAgsZqj)vOE zBp1IUA>xF|$|OjN*r2p_}VoQTS36KUSkFxdD|D#T(Y7!--xF2(x-Kg9|=&78Scf*{T! zAQpLi&7(?}e7&HMr|h}1y7;zn>xCm990oVTP<_{|Aj9j-JVCk0vd>{Euw8%iJzL-F znLB$-Wo`07Ecs=Q#h;VugfbD&PHcicTN73&X+e>Siye#mk0Wh6pK&8@=EXU=ZhW#eGwv4CUSubw0;e$aCHfcn3R|TK8W}YNY^mrK zV})YH67|-;)izl(j`%Xcz~(`wjZHhp5{^f9Pfi7&ovo~VQ@C?k*H4S~d4)m=7@q`0 zp_d_!m%z5SWFhA0)x0VGK!r?h+zws zNB!=%dmVXwct|wWGI9I^Aq?h$O&F8q6a?<<7v@gdZfzXGNyqi4K=H9MY8nkkQ>Ygk z4RYCgVdgUXGyafIxAKe+%Fx+V`LuC3WGWWN)$XGeQh~tyYgZ{DFgLH*LgNG`5Lo(BEM?pzF z>6EuWwQRtqdcqIcR-fo@)-{G%>Uw=y^M>`?xypK}hsrZ!Y5b3CeeAVq8)r?=<*(&Y zeKq`?ik0s+th8kfr^-?(!-GO^^z`?4$D>qG?l?cP!Ct7F$9(^cYg5Efv6sip4`q^D zzp{mC%7E4i)H$_EnyTEo_0*s}Eg27vf`6uBFx#+*99?~ZftFn~&6FwWQAYwEz1>q+ zxSy5M4&~wy%2N{EVWC^gwuXn~xyvZA)=n~lOEyB<(61ZEkLbUC&7+pS-!u6p?MV-g zBQNn$&6r#TT(LJ&Q`N_FcY+@ny{!S4U{{R;S>G1D6kb|A@F$cY_>702GLz-GDgAdS zb}67olZHPh7GeVaA}*c-O}{)(>=n6kV4L4c$orEKI!%d)GQU4tOfAEov=o0e74rT6 ztZ|3lbv`EUB-qTsMp*G=uk&}|7LGX{`lopt`DOH{1Hjk*n`RQ%v2dj7qy8EDKBF06n&45 zqrJB}1`lQ5^aSm|ggO1#O{gpm8Z=eQGwTkRsL`i*lekcd{g1(I>F(|wN6IzNXnEL! zI@YbC|BFgYNul+P(`T=h)#Ldo4P=L2FjJgOlSs&d>^f%Vy*{xUKsS(o$;-=E-7 zEAPbA&wqP3d_Ce;2zT8}+^d}2(^Lse!{t&5NT%$7qU5FWZqkC)5-q74l)9>%Pz+MT z#iG;+ad;lNFS>bGka~~#3{LFDkUeu~S(EE;Pn|y*>qtr+)#MdH2|?4Ln3(%ie4 zQP23d61GO2F!Ou@nHhw41*KtB~LL=aOKy=}>V%C~OT zg}BrWtffWpAls|5==i|(!O_*6y&jFJX_>)fYRG19FzHrh8ok!}_Rd#LL6xIJeNF~H zNQ0C*Df!hj#$mU*!7}@$#w~~<`e)S1{vz7DIbRg1nU4)L+WCSznu|=OWe;UjE-tFK z;=fE7-L!lA5+_~*&XzdItfP=IWUrkA0W6!i(&&4{tD$iL9KSbJ;B~#qc&fXU=~avT z-(Q|$aY{D#`MyWb#c?iO@`-cHGFRLn0>P{>tHt{2v}Jmq$=JIx!El>V1a&aLU5B3j z&>NaV?Qw$Giu2^`v!)Q4>+72n>z?~5Eg9$Q_EL+jh_s|vY>jz}Gn?U!^;2m}pL zjF&|=`yFes^yC?!I?OX!UevF{7`OX;Ldv)tC>m|W1g~>fV!+!BirGUN-Kv|RIYW<_ zfFLT5(J&i3>+&|5k^98hYyq2vF=Ro`nlb>&yr14KOi5TmVfG3`RU=aKonb>#VWk)_ zVtGo{kpp|djqL$ep&NUMTlK8Fsadlg>9(hq!iD^8ZWzYuUU{ToiENXo?hP|MY*nab zwkRL6rW2#KolD@*ftI`nx;Q@7gxh?w3raDl*b{Gh9t=lZVxSKb*+i)ix-SxO-i|;k zs-`5n{AukS`IDL*A-9LEWwy3|7SxACgaTR0-7L1Wq&nXv`NLVE*}9rU8vp8x812Vi zpzSNwtw%C!s_JQTzn%a4u*UyAAWZciLp(%S1xy?U;8A0v3?A%6}8;xh-+ z{mVan`02QFIh1<)UG6_UVY?Qe%i8(=_A`!8_0iBf*OunpDt3_{{OR@NfpJR5#YNOc z`frWLLDDh3OKcbVCn`P)0|kkgiel*NMm)M(b#KJV=6@>_tCb7M6wa%j4K@D;iBuJU zOgBHMR}}cNHSctSe-mY)sMK{(3fhG1(zd?@``?$@IWW3EB?@?xejhG?+Db;K+C?MR zMPg_&*cg6zooB~wLvjh!u|nw~-el-sX&X1L6d&kunmZY8v+%n%6G!2aU00CKI2mm} z_`~X=q*7+0NyQ1*^Pzw3@`+r9*k4_ntEMe0p3G#kCO)2ZsHBASe2%nPzLTo1BB>#Q zdB_Juzj&tc`P3*S8f`VX0q?w zAFFA3c>IiCe3`2zjQ;Xk+Bu|1k~37Mds8AET6gWCW8clj==abB;47I(-Q60#XZ~tD zBq%y{ORykhSq>jWz_A(&I1d%G`;@ejt@L6mUrseG)+EcK1TB~9qP$4uDpOnrdiWUE z6ng4>G&bzpizh7%nQU>1;kIkE* zf&|?@x^xBL{M?BCc$R>_9bsXY=)Cpzm}Gp+##Z)q*O=t26H1b}hJWl?4=#E-#LdX@ z3Yo+t@X>Zn4DrZe2u5|!DRhXZ*#0H7kfjt5;FFYGigl}qvyd>HP>_T}5eE^aKm$m?Vj)@o0qgkZ zTfIa3dm052(q6g|E}S|&;rmsu>ii%Rqdy$xt^P}A&(e=_{Vy_w z=&T&Q{QW|ppR5g+;i@|(HeXa4!H)!bftR5LmloI7<+)4G72nJc3MMLgZ7#3&Ac`Bv z+;N-rAFjxd(!{oarhFL|)stqFi!*JrOUQT+5g~`R<9K(uosZ(xYjtBkA7E*XHge~v z`}}XmHEr8xY)HOa$N5?3?reMj39{}{2~!@#tkiqG;$wt?YU_ZO@RXE%_(GJ-Kh`@9 z(ykuXHuIQl4p+sp?mt|@p^1Er^)xt379ODGx!4N_eakP8s7~my#V8O3@v=ONpYmYAl+j)k($>DhLzWVL>b@so z%C8F*8N{7rHSq-aGdC+zs8!-wXO&O3gnFVOaPl0<*b$V1n%^;2dJtx8+$2tMM)G7x z&CpEI;pTy=!;H9(j$ZCjyQZ=`VR@n}Y3jL~sjv(2Ud@+56Q6=1$o;>D=ubf+K3sq0 z1#WqMS>hf#AuX?YexNe%wAETVQVFj)lJzZlT$uA}K;#6qXX$I(E`_ySBXYXxoO^Ax zC6Uo5ZZR^&RJ~AXW``o7UR2p+xw8(cXs-L*e0;I4ZCQ~dxM?Ngzu1Aio=}bEH@n51 zY(OrRr2lZ7TkSO4s&!OSMbo}~^DDGiEK74vfK{#ue+dWMFkH(cjS~GFi0uxPP_ext z|7Ag0llXKlMo^mL4^-w`px}j)I*I7M6hw`POv8b}%#BGjbx_+J8dX?2ZkJaJ9N0x9 z&fC^kr?BjM+M_fXN-a-JgyKE)FC}QpwL3`+_H?T){yMAnB6F#t@kd4FS}9z^r05Vh z9SQU}5*iu@w;f&Vw88Pxfb~0p zLP3(Z@j8J$Tdro!_duuM>$!csf&0+*Mm(!7DhtR(xWFAsMSES%%i7{Zz)tzfy8*X~ zvekw92)2Vns-xDPt-U>L;qV9l=a?~;V9%E3Ny8B0j#nYaAl<7ZtiSZxA%`vY|EW1T zAy+}@&Hh6!tLLtK$HPZ*(MNG1M}$6IJATSf-$UUZ@y1AX-X4M6h0 zQkgxCopm%`Oolo!5EZ6L5GpNgni6?R-MGAIo4O#NaV%TpYWij)?J&^Ch|#pMbEtPZ zUKmRmeaEkoVpJ_jvKylwO1eAlBG{2p+hYF)_-UFF_r?zoY!}gQ8hfj`Gn+`HGufCQ zW>09}>7V;F6G8IFL>#$Xl@RUFY7ci4&l^ibt5+EJh!?4{PmMvs57riEK_B<@MZHW}yQ`y4P!A9Vb1J$x6fB+>DfO_k0s9Rd%U^HHK1v z+%sJQYw8Afv@EBjP!8C&7POE_E^KsrhgE67TpIX z>uO2My|HVcEu;?4|426pi_8U{&91Dy!MZDNpuaj|)IV_uE;O1TSh*ld zV7ziT-%`jp1k#98?*Uq&BuUf&tf%7v)Cq9m`OH>rhmwk<%&sz_>pxL%wu(zmQf=oz zqc+2*0HUm^B5Yz0h4rT>%f5qs)+v%%5hw9`P+MkWX6O~cpA<47xIT9{qo_|Jp9@1B z1o9)1-z4qG(PYLT;o=huf^@-y$er?uy{}dh%8ks{f8?#I5$UAIzfm=U*x|>&^&`|~ z?%ZGgjo>kR+XlOkQeP>l?44{<={zP7BbXV>F3vm8U^K|l%b3nymld!Qx3xOSt#Cm3 z1qvh7iNLSd=WBY5|FQ}`y-H?NfJs<|nq75zAIfGBEm2~5!^*T*<%`Z6#ZU0R1vFxV z*0bGPiIUrVXlTc)A=!rvW~k#C^d*{HHT^3-^4grpHKTkMU9sC0vLdq2 zdoJxLfe%4*n38iNym~ent8hi8Mzyz^Zz7$F9aU;+$zfl+kY!~j)2?=3FtfH(lhDBy zxF#CoQ7&^*?4oJJ)m4dUH0V`ZpSMx`3-BC`ZhFdoehTI@inP0;JPwGV-7+(ZX~MR< z{}h_R_KE(xz4}uig0i1io@(0bH*zt%xC?jrvKN)qKpWC!a<&@^)i<> zCSu<`p30WIbOGC#P=d@%5BxH;2oXDTOBn%SsLVX{4%fzK$-BZ1FnbFh>A%G*;Y=S{ zhDhN=_Si;}fwve)w>h@84&@Jwu)my@+OT`}qDEvj$>MdaA=FL>q-vhx5@Q@#SU}zJ zW<)1Y=E*``ic2<=t)9CSP0l#Ca-A*tH8Y3}T3zLKJ+vy}K%Vwv=KUj+G>-+!N;Pg7 zm}#hSe+*dT1Ku0;qg87=8L806Y`4 z*V)*V@l_S9yu{;j%O?1FClAxux)#W#lV`M(gG^y%!GrzZn43B@s(ZOPz;@N6{r+Z* zHK?DXen{<)9lW)djDJqnuQ)jeX=%F{(|G3##TEHFjmxxrJi{voI%j7JggXiSa))Zt zY^RLK&gU_EiAf5o3`Sa4g<&gwaEY}#$wz{E|0R$JRR}uLwG-!6683x2QrD2MjLaRT zAZ!(s_`{+|S350!h{C03C_T9g2J6ccSwL>ojzQL(|Ib!?R7^{R+LhKoHl;%dFJvc2 zV_nB+Q;~cbHqt)qZY;zhLJ=!+);4MeFK(?L$rZtQV~lG^c-eZxUfbnSOk4 zLnNj+D1Qjyg>Xc$m$0+&(f&^ zG?A92vaQS^#uKB1h|QG{64+4@AN>PPlWAC8IH@dI8(LXe2tX?ah{=gt5f?CplZaSV zR=X&J7?SKNQcBrORiZC4^WO^Gm3`0|6MqC)Z?VcL^U;Q|6%h^4HnqzV2&qAs5x-Rt z9G*HtW#IkSN40z$b=I?W5-?l%4oWq=J$Cn$NMC+i6tBbcX(mHFijQGoHnf^lj$QR~ zrzRA#ok8AxP(H?v`VSd{wDuKTZ3@mUX?DC&x$)AZYnBrRg!iXA!ebg-afy^7!;ewe z4VDYkMEgZ5coRSE$8Jex#eeMCqHmIXLoJ`A@;&~_Qp;XCYC1Iv()-HOA1P0FBrPcNix71lJtTDwZF z3J;ZRw8DRX@ZQ5ZdMR2&oDAU%qpJ9SYWCKW;RQ~R^JE1sFU;LeL9~GEo(~o5>z2qI zdv%H)yd1!p*l+&6e?;X=LZ2@n1oVwn|;n_(Xmv~RV*gGiLq-pBHtc@AvCMBKHZZ(F%GkhowGScyud;$IeAb%FE_0rtkR zJ>$5cyW&$Hy9(*sC?d8Sd*~jM2qWywy%7aVhp2Q#sCbV8&P5s5J(2;kC$$XFm5Z?% znfa0Ab;=Luno);_OK0)ohIs7aBCCJnjEc0Rt3mC4Ega#9TV2zTsrWcpKCwJfw01Tg zB7<6JrmFWWiR{JSI+8uUcT?dsW02!`IzkW5>m|Q0FL)_S?W{d@J-GP{&&-^RKJ0H$ zz%b%j*j$Ei4Zews-5U@H>$kO8HHw<5ipma{cWe(i_NE&y?Bs>jtvuqwIN-Hgz-F`k z`DxbPIRRBvWZit*t11Aw2CXquk?mG$P}?}z9(P5lf&O+u&$cM%WqN`=leH@&#VFS* zJswU8CsLs43T7Xh34;A+;)r|#RihwSnOd#9u!l=Om;BMhcgwI;N;q6tcdu>t-m09T z6~BYAkJacWl1L0HKdPtRI-Bu{c9YDaM6m6xV5ItI-YcDsNn?V0#PlD-Q4V*+QjO?O z0)K&NVtWI5?27h33)!+PFm%0!m7S3`ep_ZIU;h3jGS9IyUT?RNC)Q{?dWocbnJnYxTBtA8vbl@Pggd$w?>{QH|z7qW6RyA%BuO4v$!Hq7rbknPkKIPh5uQCd1r<%^(HX#UQtLUlQgtDceN|f{(WW(!1b(0my@&TB75L+Vw2<9JU3eaC(VcZ15xTmE5%%HRA zTjuMOSN? z)N@?4_;8c2@b;dua?*`{kZSBX;LM^XtkE;mT5PV4f;U{|R~-zQ}W^%X)VpW?0YtLZ(u$}Qv8b9jTLT&Aa`9t?Oo zl|Eq&G}aXT}#}e|(wZ8?NFWM#>!rgdF4Hewk9eb$_7=j}mFP>Hgig z3us0Et=KoUgk6wb<+00$Dt{eDSO~7mJz~WpU_W`nqpnW}g~M=W_6z+cMy-Mpmf4CK zjzJVBn^71y+Sa&c>9EfI9YQhjvyg@MCetGmh_s7%;^1B&$+vQ9Y9E1K855NLe5$x1 z{Yh|-Y@wN@NwZWWHX=p^;^%{4r*+3Z^RH6SsZrEVWQ(aV|7^5XMN^1?I(JvTc#zLe)WaNrCIUlICbr?@`Z1bHO_#{OqCgEvY;Vxi88-9 z#u~C5oK2c)%7zY!PDiPZtX9r@nL}GCd|WZJ?3-aYg;e!MSy!rNH=8OIq=!Z(&Qa&) z8cd{VkBUO3;jsqtz_RdFwa4I}WUNVdA3%wyguH0&dsU9hkdn77k;Jnaw1kjf3=DV;Xc{@dtS03o28xp zu9FdTOfRfhT=6!@G<(i@ZKqYu4Si|xcScSysQ&J(txUVcW9S0~pM-}-64tN8-Vt^q z-}7c9m6+M>4n?gfJ_S;4>8!78I4U8Y{nK)(){h(7H!nYM`XEfQd~q2zHk#Pfdj zHaS~AAA!BW+a+5#thC94nSi_dtHMha%D>4={cUs$WWAG)LVW6K*QL#~{4%VPs1w=C z3$&*4?fSM`>b1$&8%uGK2Lppo8!1(QYvD^fhnTq*P-; z%f*t&nQJ))FZ#CX^?kdb&G~}6%yubY1`_m;PI{;?f*K;!EtG-yS%e!Yt7)r25g$^! zT3LJT8??vgiJV%24r_IC`;_vrJ~BBGj_NqY{L}n<-y1e%ZSwyB1wi`0C`*l~W-4+_ zB!a0!XC~4?V0I?=W{BtwW@KuZn`teuX6sqYh(`hQ(bkBcQ0#RKx`r zGg-mpWnVn6e$)1ueyXkbKq>&^i2V+wa9RAdqQdm;NKIxG>XNPv2iNo5yD#GY{j0_` zcY{Gd5Rv`9a$Y4G|69!2vk2tRcdS!zAyNmc-S;ibg20oNDO=G~9+G+jrtu#L={LWS zCr!R_rf0&|g#L*kCf;GKYVnXmH*5FSi8WGFoIhIA28*K5Z7;V#)zyC4=7nQSDHJJI z#AW22UJ8H3@gE!tU%w<3w3=J1{_*+CinRNr7E>HN@uJZd;+Lc|P8Ssx(zUB=Cw0Cu zDLsO-R`j3JtW-`AZp|qXs^+Wy_6iqMx;~aRcr?UKXN2}TO7PweMD#`HJ_9jsn)-zc zngP17&hZf`I7fBJLfks;CtvP)LY9fFJAy?u0osJ`D=&mhbn%3Ov^-D7%L4q-!+q>~ z_&s>xvbsEe9xXTDO0uJN^!hgyxnRIbE4HW&InieYoD!Vg{-mp`7e!Ts)wf(n+T~A6 zwCfCpvu(ZD?aU9?TcLUPdeb=`3*@{?>SJ6w-+_O5azBuqnjT7V9V!1K{M!ZMSp~TW zl0e`}D41`NAdBwbMa3CZa)1^Umr^ts9F&Tr>dU0`&%&s;(1@^wom7DaJu8zOet#>@ zkI&`e{nEh5ci5w}k>O<0#Gpk&XSrPP<-M?2QK)pM5Ofuro$?pRwpqquVM`Dr206wI z`|E#uGZ@D5(2N>Id$E|CNER5gVkvye@jM;ph4y#(W^<|WHWHsz`~YQ9Yjy*}3_d^_ zWWYT(_WaTgl4+7XU0ft#M_P3h7KrG`<0fv z?qxlBGTmJId}nN;4mpon7OnG~}_7MSu$R6>7@v{^RY?f?&y$UXo`yJ*qg6y()D0xo8ic@1CdJmaFw}441+iFB@!q zy{NB-rY^6-6z(il#YxmDZ`sX_FvslNb7RKzCBxgb)own-<>b){S#rG<&qfA2e!Ac^2~-e7!bPTwfx z?7y^8Z%75hM3MM~!_s1e;|K|6l(0Ql+tF5{w4t}LvRk5eA{UDj0M zw<#&!oP2nN`7xwWq+}R$OVh4!dU?65))*S>WXi6*0+Kv23xx!QcS*n6l&VY+`1w=0 zeNepDI4xo!?=Yq(WA`7Mg=A;>BlOA-Ks&(q_mA?zkgX&d8Sru@>>(bzpn=vks_nK4 zoz;{*o2kcgr98qQ2Wzin4|ZX?bxi{RXOYon?)k{X*XP;p_o z1hGbb)`l&7-ZP>W>KH=UrP}tAFa89$_u98Pg&Wlx7d5Cv5McD}=h1J}${O;#k+2$l zo^+?Q_s$S_jW$h8gOe07RQio2cBf1cu{0;N%}vv50*W>D!0r3lI(wD8y)Qq8_TMdS zue|m_Bt_0j|3u zqx%nvv|Dvb+AsPR-xCJ+@hFWL(m4CaD0XNWG&S!e0H$mfqR`sOgTB+3LCBPnK=oKQ zU2sJvg(w~U?-3;&ir%?~nc3 zH=*){sATXmPNSC{8$aPK?A`Qn8P`%Zxz~MOe|xqw@(bNJFh~{5l!8;*7)8L%-nwV% z%n9A)Z%ubkzy!HUAgBGiw;H!E5=N2u=fz&40Q&|G4n+|=G8p(zun-fA;Uce$^nn4K zZvPxptVZdxC#v9C$ z@O!gMP0pN>=P9)nVh5pO{cM5h9W4Vss?a_wefy10P1#jzqkAG5dWBz~H5~n{CCYjV zKbd(%`i6Xiodbrco z=FA*wUouQ3f4Z3^>HKpQ3WjaGu~_9*jGnz=%EX0~YjUD3H7of#L!<7XlVRrY0&uw8 z-rMYz>u_QwaBhm@q8Awg?m6iTv*@RyoNVMhixT;Ai*c5O_z|Q0S&x6VA$-;MH>?N` zNV{@gn!kK4!^?GNB!=irwzAY%=Sa z5Cii|5~N9x!N8P2;tMxUkiiY<=~gJk?iyM1+w!`wJ3sp@3K+pgk%=UchwtGCnI??L zp^_y?9+a9-?Ec$tSD}^h#1QMi;Q=Q z&TNaiMZeg#ZQHhOJE_>VS+Q+aQn77272CFxyLavLpL5T>Z|iN1w#Mw3eT=pgiFZa& zY`k^!7{;f0#KBf`g2_5AvOjJ!1CF72UTfZ<+OkR(f*}R9y<^wSkZSrFdhy02Qo4e$ax4WClKigJ%&yJN|)XB z5%zePVsDmoh!}Px!s3(Y0%c%{>WUG{#Ck`q#K>G&k~PV;^|rA}K{ohEQgaZg05zJUq5i8@z zJ^ki_s(V`GNaOMYq-qB^E9n#2rxk)5X7N{+@5gtoN1(fPk?sEg{jb+S4SnVnyQYKNB-~MDMpHa! zK@_^RSaIP16%w>5e0eY-Z%7xry2|BtckcP=9s`7iJgH18l8h8|0BdYTz7QkCn^OQ= z!90y93JXPdr8yq?4Ek)0}Y8$gXXRv4lRI$TH|1#C5a9OS$VRJG%l7qrrTs;L8a?b#>r z=5j~-;gH($+BDktVhy|C1dOOn6oE%G%dtNCkp&|NXsHr{)#Es7?`B`NvlCj$kO(XD z%RX2tTjb)HVTfI5L#Jc7X~f|C#xW7-XgcMBlO`x9ge&zBU@#r8eA&S_U+E!r(|;%(ba4RXnI}K*p)9v4`9}8lIs4^-|1&p0&$`i zSrLe%x3OOh!w{BGz8~DIuGdS)7vr7WtOC$~^}$Y>igt}oaVS|cjr%aEPiL%Gb8K}U zmG&D?a9aE1=lNzcIi^({(96s_6@#|{=FPS6hzCQl+%E?9M(?OqpC8ND;=D5^kdY%iJq_MhCg9auZCcps^ z5z9c5n^O^Ww5aQ35|D@o#gYCT+?@`A4$Ah%XO@oQ-U*1=bFu!}^j6iZjsDo;IzN<` z+wn!ISE@B}p1$&W!9@5d$W$i~0BG%+E@69jc3-ftK0NI18Wk4%>(Zj7;DL$$jRb=b zEHlH*rDATcrU+O?ics(vLBFqG!0gph7IBF)2NHds#uUZKfrJ|?oaCp2c9CbD8;8Ii zkBDr~+FJ!pjhTRKiHvUM3Zzi2MaSEKEusdh)HE2S{UtdANE5A{~4w*-puh1Pg1xC%8^iuPV!ir>Fvt`8OT4(H(?!LHzhHPZg_mC(Pg7WCRPQ~*%FKPX2U((1eqA)h1&W~&7G zUG@pwvYFu4*p&i&Mop%1(W~rfEv-| zuw01L70rHdGR&!3wEd-tqubPCrPNyEuDA2BahAJx$bbI89e3^nj$98<7aa})F4{2X zdDiv8#gWN!5qEhr@&V`t5q(Ymzw+IGni)W6!@)G%!Qo%mTNsOu9n`)324>HaG<5-yB| z)-zJ{mrBRqmalXlPutFao;VqJdg7_*%&dW*2T;nEBbc*`U%KiI#|yYGX>77roECLI zLWr4W{w-|mpR=kxK}LymVA z`tncL12F^r@Gr{E;f%89w(5H|6G0OcF@-l!(EK=Vg|3ObjFU^*4HU$v^r3WW4IUr3v*oti&U-pnb;&3A%^BnU#Zx2rE~MPv>pn=$)vP zqhThwfV|0L-~&@YFc6A_jV%r~39K75PHnXZx0X9-pZcL>*-+Q6V(F;-uBSq6~ z0XsM;rJF@@Dc&K2juvS)IVUxphfHHUPz58PhK(sYF@gmZ3H2pM3mS~^$w zHS^sz*MB_p+_4`z?{x6Zxo?hHgI|7?WQTt<9mRD0Q}RUbzqM3$bq3?SBO?2^tT-uX z;s23q(-YYLP$~cYh5djK60!0REH|ryf>yF3j%?&$@u9)4MJAK7Vh0SPQHr4~CX#76 z%iMm{yUArpljh<&$WsPXXu`6@Tfh@Witmy&6uSG{$Qe|$v?q4kx@$k4a^1AtI2n|8 z$92+K*cQ3sk08xLB*iKX&^NiivS{SBS24Ww2sb4l{9D!p+yEhF@U?6oaD@j%aphT8 zi;dw--RRCl0HL>|{xFktB zd=6#+VmH)~Pw$8IgGG)UE1?Dc4EJ$hToFNS`YMLuwhZ`x2;hSM7XjWq{RDs-ygX## z2bT}S2K{hK3}%_WYpHHQ4wiXIlVv2%Qe8?FLkqb}xuzVVGcTRa%g9*^hm1uSoZ3P> zV<;cq?qpL!&ge*HZv-f;(e}(%0M*B+v-Mlt{4m<1368^3n$=41ovo%r_Dmz4hHcPq zy*PfiH&7_SOIIwhml?e&$`5qCMjen-~}w16y{hEWZ4Y zQz7lD0&=G#Q5|RP%O-)&0>@R&uj=dd$tr$<@UMSfA9{YC-f~z7)E5`idlDQuTz>n1 zddfy3{3rAOVp=hNK>fn7)PGFtcJ`NPZ+zDn9Mw5Z1Uq@lokVTFVMeeUTQoruz;5u~ATJ?pj=Pm?uqEb9|ahpYHk z)|<-QdKCBs@13#|(ILM?j)DK+i2@qtt!(7Jv$HDmlzQA2s`CtvAjT6Uj{o;8?SF*8 zX@fMD>^~tmONCx5H2hL{1#Zc~s$o;xK_1bC4h;~wc9!I4DvVGzH13Pa04M13mReW> zG=+&4oG;)(4oF57Yi zE96EHI|hN6i?*zru`dW*Us09X2N#lG!5DOihW`H~{ZA%7vPq}+J%rpsoM<>x#O-^W z!Hv3_R4jcVkqJN{oiLgVau}V|i3%EQrUKJVH!9vsIgPz>Ms`QoFuhaLXjsuk{050h zc8G)`$^}jA+EJ&2f8nGlp}U%e&9~M5t;i)4qw*(T?S#_0WsdW*$UF}VR#9{NBGbW) z9@{JLkEFCW;L$TNg^d68$%6jDz_qWKK>n&-K?muu$MX?Fvzbt#q6&Ngk95R_vWiti47s&Lmq@I0App0fgeWg#=@U+UQnZ!49y? zw{O?>2bZdzR8Vq6yrR$EtW#_%Qohg=?GM;h&ZR?gk$0Dp3@3V2ZBlxrfTkBiq@Y?= zHqrZyKe=B%PnnRQ)r6&`#*2lj)lk4{?EObILcL;F_g=8i)CHJuXn#p_-Zld&zJP%8w@s zbN*N8_P>#wdBpPHf~IAExG=`iD#ev z53=w^+iftXV?hwR8tQ+@p0lwx-%3xS77-jb&7=aKqYC$k$}e0EDunO1lbKq+l8K87 z6J=(GRTZC-#SDokO`yOuhEjjx_kC+%_m}CKvc7wMldKZxar>Za<4pG|HY{&WwH4Lp$`7zXn(q} ztRB2jfYNBu32gAS2F+X~Cp~XMj23z8iAdOqt8%ic@q~#868jK?ivklZ_kGM4Rhd;D zGzSag#BR%Gbb@)F)iuIK*l(fJjsttp>=*hUUFFxELib%TXT4E&i-VWX>SQkUz9!W& zJ##>}Dweti>dll4Ko%sflKwV!;$MpgcKyp32k?rsjx6kOBo1MH%`HjeNb-VVgWsYgKHhneS#Z4{L#)Cep}nqYddeGI)Q%07e$t~`;8^9LwSeu7XHYTAPhN? zLjtJU+$%wU^#fEve<^*$8v}FAr?ZO<<{Ofx?1xlnsSTPwxl={^GjsdVT&ctxBSQWX z8nAB+daM`SvL1~Vzc62VU`z)YEZ zbm;ZW#^~!SlabteOpqI`%UK^bRFIpLrI>V@ut zR>x1ZHw?4jm#@F0)PymoBF2BWw?eN}prSQp)tJ%73@`rN0vkEnAxmoNYnt}58wkk! zI@NLS;_s4Y2FD$C3eSoWv>V7)%*x1KN7eoXM*&WYo3%E$mpYF)Rteu4a~>v=UL+zD z-d3Z<>JD9c8fUGT#QZ~Ex2O&-^kK6g)liC?iW<1TofOT3%Xg)va%Sdd5MT5g$E@up zqsv4cp~pOVX6eD>A#r=06k>$kmdcItQX<>&hz?b|h(g{su)xN6X=fBN?S6ZJ>maIsp3%rCgi(p$Tk?JG{Ob8`T*OWza zwg={nITr>;-=YwZv#d_dc;o3j zVv=#ti8zq>TD|pwlpX;v??cu8(R5ix8Z*{)p<-(aokfUwH}0|xt~iF8#4}!5oQdbL z$YLvWgg7&{70Al_z!8&eYD4Rw2gcT8n`7K1A;L_nRIJC`4tt3j zII@GdeReZ$A9-*H`D$T2;fO8NEA0tip6@8nloHOE#CFBl#P;}gRLf`no4@>LtMnmi zVSNCh0wQ2=zG!+(U~5Rl_RQK;KDw^kC^C0Lg-v`FZ!pJCN921(8!vSzp z-1`!)yLtMhQRjV4R?C4T7X;!-hzirp7(mfTMqz#&rI^qwI~KHNoK$j72nHu%)Ch0; zw4;2a1mH>+l|qK=i`goFxteJ@)w!slSK3~Y(0w>!$TY(J?^T%1ixr%Ta~T2? zu&95$*74C+RWqh~{Ao?#t9LJ>U6EAI;29)^m`?c*w3Nq`tN#+XZ;R?viL}A$R5#=R zbCHLMEheU*WqMz&fA{gyMxr!)MaZNY7^>DJDE~1vl?7KfqIGJSOk@=&_x@pKmDsQ8 zly=2(8?q@*5DpS&9#cYWNA`fStMG1E>$z*Q$Jsc400}eg1S9cCptp9ZRV5}vT59|c zaC4bzHVB0QP7Rfwo}E-y>#rNz7qT#l&PL3QZ;*MpbqI)ifbsf+kyFgWH#ZoigPvj_ zp(u3-5j37nracFn@UO+}SHpetcW5K4Rd!ZhZjp@2r|$Su_n#@`9C;(WW!*Az;_a{3 zE1Eg;XN?(a^hugLm8(?cO|}iRnZwEg2~Y^F^tVKEJ_$%Mdm>jK8l5V=Zt<*=PiIG& zhs0^&V{`?MMpt8SVFVN+la;7`bDLz!+^D2U{8YyFxsNAu1YK|f%7U(0`!Az=h+$)! zq4M%Tw6FJUcDYLGc}a@7laB)8_>kicfO#q>Kv64RI*dmDMu zAdC7A&fs?M-LP;J1oM`zZl+g=d^Otf#?q5!Qk$$8-5)HVc@dIU6$P?RyPw{TlldBp zr@U^QV|rMl#;8hgJ+fJt0Ki~f50i;8^Q2+TscYwZ%_E{uwLTU|OI^?ANypd6Vc_8A zzEdBiRGDZsH7h%S9$4bFM85mT;BZ4GYK^$Fbp)hHc-I}meXuCF7L0;tz{Mc98%6D z%TyxTp#E4$y$Xs%K|3MKC}X{N!_<4c&m`v}Dt1n3>l!ycQ0$wQD_L=+kX3k%y?R<@ zoWkP!Ex~YBT~^76GC1RYDXu<`bDaPN8#l%WgMh)kQ*1Iyocs%=TR=sv@pBNr5AueD z%DKcULQ68lD%vVM$%ec#JYgqtS}jgGKb|zlr(dFlADOo0Dms3dsAwxI_1DE~_`GK5 zXxE+}`NK;;WIun)PLSy5Ydfo`gw`(>?oEF1cJ0B2@h6B(Omv4at6@;pT9035urOSA zp#mHboA)X~|LF}YBO?owlH~M^%!KSp)#Q}X3)j2N&i z6Z)R- z2Iiu(=>T+Z4n>_HRNN!n7l#SVp2;yn8AhjnCkON@=>@S5ULp?|xFX_l<+qc|pB92q z*sXaI_h=2Y8^6;HJ^7IXkPqp&O;{~XW4U3)&a>#jbyb-W4JXO#~q zqlLNh0m>KCufYY5rE-Bi`>R$LOyx=1sSy*Yrh$_@@hp#P!3r3zM`m zXB?SZgN%zNEXN)TINKb}3pwHD#oo;AnTi&cPP8NDdkjtU>~5XyYpP2_J)864*lyjU zkTOQgivEkgqk}2oOC<}auYJ9ZQykQFbfTw!8V)6M?6%!c0`< z_0hp#2{4?!ybogy)oP7FxJJA@SM-4#>%aKahaD;BfR440#?BiWT4famw|X~ACL z*F;W$>?hZRFZ}sua9<@_2g@rL()d&a(!s^g!iGY7U+MRK88-UTi*(F@O}U^Xo8-{2 zR%NnylXGA#d@Vu2Uh>agfR1U2ShR?&$ZKVGzB$cg3idM=M<|+G*q=P|#!0_L`L#+s z??G}adgKa4=4p~U8;x)d1^EY9R%hKxY0Spadivyb4a+K_O1-N9d zW+53CHvy?6E9^(d)}ky~nu&pb!ns0wTD3&VQVcLTym9nwZVoz+qxQwkpM!RKM{S#r9~=iqi@;6&EFC7>10b zeyp6;UXwK8*hJw^;!RUnJZ!y4ck3~;g_RlNJ=Uk-*5_OZsC9dP>%-4d{N4;3vTP{2 zY(`t5ruE0Z`bJ*a4iUpDQ$gO7-jenjJ4iCi+evPvytWyib8`+uKMiL0=F=8{ZqmAo z>pC$%e^Y;OAsi_vaFlH&f~FwoGT9XQUAgqOZ?gi8EATZNm2VQpSAztBr{lPR#B~w` zCzp~HS%2lae6xNkXOYA67K%2kS8sYb+~(g zn9qT4M@sFM46I5&Trer7{h{*hR< zkwgL@y0-b@g`*U(uUr%Hd0{*3tTGJ2>XTnCk(dB%@?e}s0YOHd_6k;3d%P-F-cbCD z2m=yo2C7L}{>;p2FS<+jmxlXC*kP%5$QoTiV+L(E>LQtw4oXu=t%A~f2ve>ghhyZS zZozZ)=P2``C#GK*_9yg+cn95?g&`wR&IwP-mmB-SGluc~r1QgC3hQ;i^(U8%SU5*W z8Eys04ON-BEzBOePx6d3ip-cBFk9LQ~f!RxqY6@R)a zC0K22fDE%IOBn8$BWRAR02z)PkIFB7^xPpO|CBr|ncIO!aBz@!$36Ek#5#~C7)OCt z>W#0Ua%c`_tEb>CrLdo7RT-ic`v{Gsa9=*i(O z__?@Mu+;tPF|p-57=?{XaK5MKPF_;)op6G#8cPumrNV%BxK9MwXuHD2hQcYKDQ1ijq#q7?=$ha5RJc zvy1T`?npGSUt>fa+PYK!UT=L^c0>`Y&H7khQG-`0N{&8Sg?HO!QCpK! z(9QL-$}yFZq+l2#?(Ts+CDN+>PHcYPb4;>L+H<^#x=Vvice_pCxoJ0#8@Rj-51QvD z2OYGa2eP%Oy@mk)qv9vQTMehdbFd71wH-rI|7v>6oXNgOlca)!~MnlXij5Gw`uE z{?Y+tB|lWUi7v@CzBW$c94|^??i(@AFnrjPJRqP@slH?_IoJ{ zG}*uo+)TUB2NUA-NP&0#i+54iS<6|As70xL^~#8u?W03tV1SaxQD9?sJYbK+-G(0K z`vSp4xg?TJt+$fjujB{+i-8Qj5K;uETQNCg>N2n=+~J|_HtnDBd^f}hSIHC~k~kk!GSSrbrnrBFaStqP9j# z385CwKN3Vm#l`u5qz!sF$#fXFD0*1M82AJP_$bsExCAr`#EGbWbAptQEHTIu^)d|( zs7rx~YMo*n9;cm%sGbEiodUznDvVF6tYr_h#v=g^tw?RUhQK_sH??(~*N4&ko@@U& zm8w{Qm*%iq;T%W)J_xH3u@Y^wBTot^t0QayuN$Q&jQV`!OX~_OHg$hfmn&tHx>#*E zzRS7J4n@p+)p@Ajpt{vht8_jaVo~@K(JGUp=+5n-AKW(OkoHD2=<)lUN{V(HnC*G}YCwu%0Y1EN+`zQvr~TT@1XqjkpE04{ zQXLv2qn48JPCRC?MRoSQOwl|_CN~ekd3`9Y#N>RibfDZvV_4oDw8in;Wy9IN%u>Yp z%9{eB5*S`MKOQ$US{k|a%xRfBgs3ijH`;KH>}dDlMEp-nZxE!UYHU1wAJ%(ia~D(! z`Uf%wHg7W+hdeNb0_666e+*;B!sHznpJ|!hyis8F#`+|k(CGo+P0g!L^_LB@OFTzB7|N! z^)^BzQ9D%#aZ0vUCt|(@mbMQImgzyT>LLHtRkJJC7X;h8{3;|ft%Q+qjC_0{ol8Ze z*^Z@YrCyb6N91@Nd0|_)j+FSIc>PPq;z#wRacxcco@LWpg;p_ZYB-6cWVOD&cABgN zSs*D&Zk7n~7HoG20d5rpZ&(HioFEnII=@jqoso?sp9l)jOvBLhU} zvdW38-t9o1;jp`+=F(7tiJS|;^LRo;w44D7Gf2v}(pv&+BCxFRL9_)BFD!|Xkj7Is z@?@gJ52hAGCw7e*A9ISg3Hud1dGm zdR!86K-M%tRSFtlEO;??gO%u;MVA^;jtL-hDk3GW3wZ)=9uQ8_`MYGtNX|TEAfPFf z7Paw_n0^Ovrqs-L0Sg1PMl|V3#NT$}4aOrN%*G8v#i+}+H!NWutHljn*+t?v$*k`<8xns`umubZftQMl#YQRS2R7RJq*(LpF$ zeUBS_uQXDlah+6Hl95RWaw{-t9IreAc+UC~57-iFGs<(XR!;1=zzLdKYbhsC)?;JE zdKIE-OJs0+e$olI)!th0`DKGJnKgVC0{QlbYGXeN8lmJV!fND3f=Y$iid5}9mnAdQ z7h@tm!r5$s{&Cv}uNw%K*ug{9E9R;=RtaP$#uX?)>zh!$%B?}?QW8=vy=2#Iyvj?2!H7vX><8`P7+l25 zAADPCxBN+QAzmOe)sTaHmu>}V;W9rQB0ubnW>!Oc`V~o!h6fYEH!u3Hs7B}(U!0!= z=_#5&b#;BKb8XG*StpdVgi=s50zri#Ph@H1Jb>awILR10_2CRN5d8qYa!o6vY}^Z7 zq%%C6OnyF4)gyMl9ho6kVZ+m!)NZ6eetR>L0l!MIJ%19|VYbt00&y*y;N}tP1>O5? z^lH};gZ|i-gnW2`JDDt5p5w^XJn+?#zb8RQ(c)jdmF1$aF@pGHa-OXbo&6NJnFga( z`3!&pryD_}M5a7xC2B|I%VWF8pLIoSPC|&%)K`pnvs76bz0Zd%2j5Bi#y}kU6Nrc6 z*o$H|0}W-~KQ;?`QB+rT@eaN&w-C56HXfm;-&CJ~eK9p-9u7j27{Aeu#KAMFe_Xtj zoYMsM0EHJjU+{Do>Ay=~0LPwlhlaF+fGK7A*m&U~#EIzM+PxO^CVN*p{z~_B5~X;4 zWUN*6ZNhK>s9-EDQUUKWLpxC4n*nv|cI=S^qj9pf&i0l9A23Na7yTN{>$_KGb-EVk z+fl-4IwS_5!;DkNJA_2d0O2lys&Bli^Ndj?Im7R2_7TuAsUZ%i+F(ZpGKZQkT1Z>6 zD#yJhVrZgiK*%aR=trQP0vlEBOd$HqwG+a<4@MR2WVN-byqa3d>$Kd($6sQG0w7#> z*im@B!VVK;;@SJnNdj<(keIPw{84D`8f}k|zd#ewD$t07i)VkN7&EMt2IfYbd-wk0 zD45nCmEk{yOlTJKRpPti=&iwyi^xw=+5UsKw>>6AwiLcEzvoR|WHck!Oo3pBoHEQ0 z{qBx`rU^@AN#GLh*uPmc(JT=WO%%)g+jTpU33VdlO4po6hfOdDEs(>4j@K0;f9`g- zK6XEhiV%9TP8AP^U=yt0xFntf4J#ub5l^}Owc!?WFNS|4KFU9`jmZlft60}8Vpce% z&!muxYyTo18YAzZQB@&UU60sO?E8HfL61*obAw@9e}?cCAEKV4G-n%x%Dq`3R}Tv` zdn_4cBC&^Aso*hrM?_2MXGV~G4jWBS;vknj`EW2c5ePv@oT5*p9t+bkozLQR+Fi^JKFA;DyxdUZ^@h*nKQ0L!RR>JvUu^51-Mc}fpKxZ zEeNJQ8?`z^Vy9+n?jdFBAdI|^9bk%{4AWZ0JRh4=Gk$B`za*dov4|K_O4DAOu7 zM`xrBs<1}0Bk=qjhi#?Y+EVmg#k3n|v~5}3GQuKS+JHRlt&qMILo5|KLheCofWeOs zLNk$R49$%L{@!5;;bwj;ABWw8@+cCjUXz}9mLBN}?}2$i5i}wsgg0W^pGzS+z)g3u z;1IU-@GlsCAk#G&ML#xAnA=&DS%t_xegB!C^wY?X6V!H=Q&jqgO3jg_dKeQExK!s6>C3V!(Fot`m0_ef-Q!t!OQTD^{huW4V`W} zn;UbWhifAhxfXaAmI1w8R^49bsSx~`z}GKtT`6^Nv(2%c*_kVNy#qz!-su~A)RtZwr389*rj*_{TS(Xi`a&1 z2M03FZe->dqUgBTXGf8|wR*1ccOGQCwHZyz0v7)-_*&57G!Wg|8#}%Z->?v1;|UEY zNkfm)XbdNPOF_%*w!kgUU(G%iacaEFKRVg??Oet(O$O5wdggN6&BLl*2Y2>Xd2aL3 z@H?1r>vT*iyX@{(cPS{xORve~p%PGH%01{@S+swN*H?_tC*V*AS!{v!=>TB2Ht;)t zJ0WsnhD*-=gmBas$1R;W6Ivj%x-{4hfV~liWZ>|)%?8?@8Y&#j3{Zz0jpkucE|^Z- z+lQ}sXVv@30F&2c2SeMqfi<9_nCT)l0=C~>>hNPr;`?bV5J)G@0|(xZ86Wb&qB_7%(Ge=*Ic0r zcL`k!FxSn&%8^+|Mh0`jt4W{tY-Ha|eH~*mWOh0HQ+L*51(sO41zZcJXV@8 zdEH<+X=$<;3i9IR8tVGEVeRnnzW0QVul02g*B)OA7EliH{U-c%hW{mAd9kmD{ITi3 z8`R$;&XhwAs%=YXP20FDlKum=BB{3N2Q@{$pkO`AiTzEgvXJSt->WNn;7@Xt?lnAN zMx@HOUkvBP$9sF@F8&eMFs5ACA>UWZiY@ZCl^|X~2>?`qv)zv1Y8wmphIE=MfX5dm zgK$NK1sH(B&}jcAC@SyCc|Kt8fp!E=6pLBit|P+ysQ@#)YAIH_wt5!MYIbn9AB$2V z*m`gWYdPw4s?7ftY$>F7;g)|(hkm1D_*NF%NmA$PW;ipLNRRx>DWJz-h@qI{#M5Qs zjfU?kxOm*F)anKG6{cVhm>}X>SKsd^v9LgpVDI6?&l!-|l^lB!C~Ol^u_zMd6?=A8 zx}>B8JxEio5Qpy#nzHM_j@soF1|c);J2Kc$s;k{?E)k|x$;$^gicZ#10*|P`@1GAm zi1y6u+7*$|M5B?*f|I>-?U#^15XpdXVfPR7yu4J>?ko8jHvd}!Kiv!Sh7TYQpe7A} zdtwRX&-HsMY1)L?OQ7o-m-ad$isj)BQg+Q=@)oHlNtOi=JcNa$t3KM>yUlC0=Ns!w z$prZXo52TFcQuVJuUZeGqKx{Gp3oE~Id#=Z(u%fp=}cNx>?#{+c4lgZ(NR(C3^5xD zm9AcnEW46)ST z&eOqYTD)_4Cz+qhwD+pDN61VjDE(8EDSJZgI*!m_6!qPYN44P{L`|eSB-*|HtSDOK zD%zFC;>)F^EKGe}GhAS)bn*%;dfB;7>KJhh4#bq`cXj3ezwCq;FzMqzm-HtK!~9oxEdV*3aR zB8;C*>OBZy4(-mtre#TH>|zgb86$&Dm5loQ=F`_LNP|9=_`pYKRVFG`QB`x;jMN1q zskx?jvG+5v*wYDzBS8$}a%cY?cU4kBvni<|HRoXmbJi#diR`|sovwGI3rI1&bLXze zwJa(X+&nUGa@M{nN%+-@j;q(x(}s0DD@IqzZzsDFd$xbI#BE5)-?QIK9i1X`3i;{- zj7`eBLQQk_P+HAOUF`@~q?jIRw%9g-$+Z&hv2H__5^IKQ>G_~pdJv;*f?_r1|Z*N<13>o`FcIPRj`=}{fc zSqzW5>Q5uU2A@GHH^&=?1AZVY<+Ahc3%qYV5%+;Zmd|hj)D`&WHFp}xjP+d-AWI5I z_tAcRQ=bOBT_wjEhrc9wRI-<#I&q9FC2l6eNJ#qq^E~Q;8?rI-x%q|^Ce`^+#s!)j z;x6-M_oAOtZJl#qDyJVS(HMT&;OW3xxhfzr09EqF;!n) zaC$Jc_d5#N4Aa*PxU8PC6$`PNsu!=$Wl9wab4k9=hMpvaGGYq3lPIzP&#pe2Eg-;)II)fSGgWxw3yp`m9H zuIliW8~3oyDKcWaeAaJs+St7}v4qAQMZNB=VwUiT0x>OP#glaTogAd_o89ap7VP4f zL}4NuI!gn+&6qjT6Xtot;C%iN zhX--FAipD_&nvy2=K`Od6mtjCqKwj~V8sd)(9w?ZlA&lwOo{uZ9trzGZ+k@XSpJ2@ z(d>SByzgfVq^~)6|8~e8{BVMq%*O@)9uJ|%g&&WY=Ej~1Blh`xd|t)pL|z@r+NzeZ zC6qMN)A~s-SO)ye5*h~GrDIp81hpBc3d$LB(W_8f%O^US(F$x|0iR#dY=PYl>pt^H%mI8zrU4+s4Q$A>w4$}4Vy@(6^m%E`AE?F4pe>|jol2v6lEI5N! z@e9w~N}ccTjOH=2VMsb>{Lz$0SCQo4=cuURBqPFinYH$=SEh0{FzPD=sbV0t>0+aU zAjWRm-mAN_diEl5evb;jS`$A;^|%1!kF71GpZH? z<+AXuFXStb%DTfj3sq&3(8U$E?hhdUaE)tQavW91_cw#EM1*C~KdJuk?HjQ7%_;%m zf`iY^{HnWz8;4dWKp?g2(%ZtosQ%{>{VC!#;8=LNxP)RO#wi(u*n?XlRwk!UC5EDw z!8-nKP6;!LQ+*PM819)02m!o#26-ZL_|>!;Bj$Yg6rPPu-_B6qcklq(t)K1q zc}uEo_D_yM@6GlK@FR}uG?n}hb|^Kc7sez3lGv~ zxUOh+PA4v|Y|JkK*)Rmk=dfR2#dqnz?4nI_x^OPUMAO@)L#<)TERY`p@1SOx_so%Xb;80fnI z2>v~iG@m!X}a3Orf&iN7T%f?k}l<4+*^b&LPiM+E)U z49)dA7RiP6Iz*;E3=WPSmUO9!2U`FQ67qmGx)u82?{->Zn3C%-PtGCd7)g+x$t&+&EeA8yAWTw>)@laaq?lR z%+o1-c91;pC^CIx!X6x86dX0!tmpw0s@iAwcSnH+@}RC%a_>PMbv>ZKx}^XFy86vs!*?0$+(Wa(Yx^Lhog^drO z5)t@^!O96VZExjP3#cCmv|R~AzKZn(1rQDa-0N&v_!<(2Wa)Sf{8FC{W<;axw@qw{LIj}e^i6+Vi!6Iw$RRp?&8VUMcK;_PQy>utXmiD&e zBlX1eE)Dzg^MDXBK9=R>cCS}W^`+3Fm-zMWFFg|nNzC1~<^;yx)v3(^*zV2ENkQkK z6&AsH70u{1B=SdgdSy#CtZQP*ae(q`#!v!cOfm3n>-aM2i<3GM+b#7>5<&DouZzUc z9|^tXYS-nBOs*Xl{bkg!JiR8qiC zaj955S2w_lXv}|_e+OHm716>e*IkaugxI1C8Wu1k$%GRTwI6I8@@D`b6w+{+NKiuz z9|@)D9XH9dm5y)elh1WrqatLJJhJ+uDGE(H%XSrB4*kdua(c`*f@dmt?RQh!#Np7= zp)$UCMsY+R-UVa29D`Rz1V{%O<7Eeo*CWq2c--7p3RI<`-k;R-LI;Y!DN+Nr0w(w6*s%g znfHvb#+ls}9vN`{50QgfKxK0L>@6_?QnPt9;wP+eN1SQ7ocFw%xW?#_5VI6;zhl+P zFx6_!K^ZjXhoVOxf>qn+>-+7|!Ru^S@92tl&9h2)jqN z^?v&dmylPX>fxXi2l+8`xTtmzxMKLU!{9f z`H0y@6G643(o#mXAuQMU7qLtzrW^wKE}Q0p7TB1cR%NTkE27a<24;^96eIQb;ix2 z4;nkgHm~(=jA%dgY2=F&bOqOq*}0oCGWU6BW>vow_1s#yR&D0;gJb&EHy7r=ec*J4 zH+P#hwB-%vjvmmCw`Eh+&%VIj+jA^zdVMsJ7IS3N)`JreZCY4|W2ne%5xmvSTX36^-ByhsH-6l>^_A==p6%^3XU@(;I$nO* zdigS{)>}|-?{LBP@a4;`twIM|WRU~3Mt;r4)qnkdmrQ?OxeX2%h6iD_&)dprYhmXh z-4@q!Itc2>q}9fnC#Oedhqx>Xt|F)`ZQNhBXUCK}c4O7BYXy^cJKE}Cn5i+A3+82A zwoV!~@bPlPaQaBY4G)l`y+p}3^kmk4kaK7@ zh%3e5nohUK6^vvnO#k5IP;lDz{OJ)3=O0`**|l!jr15IW$u+6&<8IYt$$y%jZ2xeM zXl?1}=ev=->z|rey;2*fWY48)YJQNRkKzXJ8-Axr|KO8J81rpS$2;05s@X5fcAMiq zK4VitO`&#v;FQe3IQK%gg&JEYVB0aZI`pGkt#>O=X3Naj^x8YPPr*lV>4l3&oV4l9 z_eak1jkV@p+|<_p=wVQ0x;)=NHDFE0VB-x_LpKRR`Puj7Fcc^jRs`7FD2?-sSIzOErBZ12H!*R{t^SUG%t35JqN zes9#%-q0shxahoQjC%lEwqk!x_p5wkWPnpQ<&DYlLoHbL!~A=)jecc>9Oss*MFy-x z;z|vj{k|`^=0BqynTzH|n4CaHx9Tovac``MZ&Y-AzAb=yB|j|Dzw+*=5s4Hd)Rm=v7GGUe64{23i2BczmOm*9Fw_%dgih z*HUC{AGOm|eyLt+%EQ%loiw=_PrNtJt8~j7xNowi-}&9i=ogD_9zAu}IP>N8#QVic zYPzmMMSipCr-_&I=t|VpX*`tz+8c{4?&}}@c0uJsS|V=J=HCW7bVnzYnV%-dnGSpk z+&o78r03?^u&jR51c ztYd}4!CYVWIf1X~3(L9-MN#{^^%v78S_WTv`TSMe$_yvDfene?<4kkbEAX~kATcJ` zU7B~7HeF6cx|9a(k3X+s>7!-t_JMmKHC+ZH9PuXOeMIKGQ8UJ_t5wq2Jqpz}adu>C zI(mgdrnbg}#WTht@fK4zAF$~jyM4i)na<-bJ75xb&#zi_yTkj!h5gnWp6k6Cn6bw3 z-t-Yq4o?^}aeb^0>R^7Y;nIqMGx4mnaNEjjZ|%*=$CjV6E9phhtqTHL`0J<6w$eh$ z8;za$sa(yr5NZFqr%W@|x@pd{ii8u^no38uZP85| zb|$b(csBE<%Vgi({SGff>K}M6xzacG!`{oM(?@$*ES^5m*<2?;d)WEFUFA2%?)I9r z-08;Xkur7T7lbYulixC5j}jx1i`?d{%{Cp?**iYt^1{5+6Yf~19kEMO6WE3tT1B%77Zo;}F&jhM zZk%f`nUZg69t<{ZK(t-E;EunvU+D?_Z)lf~tnkj~kz9kTP} zG#&OOP&79)pWd0#Flyptr8YmCcej@wbDPdMPW?2k#xe?5gw^rA{ z>{UKf*rSpvHLrBm-ko;dRITkGP}A-JDu2sPY)%>$B(q7u3VZG1gTA<32v37GihCQb-d)na3= z5IT{d5|nj;vNc3jy>vb=pI1`CbK?lZgHmFIF)`ueltf5Gy4i?#d%kQ^PhQ(tcTqQG z?G2sXtVqhcOV1ru_tT;yg7@jHJs$eR*7>ESvMkzVb|e0R)5Tgmo?V6w^COE^^yg zdFy(N`~vy>*L^#(H>4aLKi_P}k@WGC@)49xii#X^WOj5_WJ;*{-81py5aVadO)W(Z zO5XYg-IBxlP2@vO6otAW*Y0Czf<*=>{-6a;(ioL_g&MaZp+nr%bOA^ zA0zj41R5^sNx1FWj~Q-M?K})~H~QJ_BRHRGyKy;cPfoO59kH)m9xbzXlj#c}9@!q91im9yg6rbt{AI+;)KDfAobqJD=%Bc488d_u9j>uoVYUvb7Qt%R7I;kJI9JHy;} zCbYw%x0&bH-sY<76@#xvF{5IG6A71%tl=rlVkM~m+?BUOp9WIaIKYzboB_`mB z{a(-2BlI!?%TBE@ksZDJkleWXpuIgGjQrR=msZYU_gi&LRg}+ClN*lfe{5mF8FqAY ze#y37sW}?AUklL%3eVVY#=UTPtY0HuYjdEUr7^xRLw2Ia3`69(TDMQ(ZkhvQ(l52&(w)sb`a&Z|I^g$4CY z)0+nI_=lD=iaV-8x&e*7HBJ@x4?OO=my1s@)!BEuYklgGu1Ci*u}PEXO&y<^{Ne>> zKEJ&GH}|vk!h{pU^S5YWYHsh(j#Q~07=Bk^>C}o$oEMpWqB=GywwhyY{jhd;<|E1} zM&B6}!p?Yj+G80t=Pm$N-*du5xoHK557Rrj#v+~Ua?qnvF1XQ z>9)Nt8JWA6u`g?0cXU7~P^Yz)$wX$mdtG(DPTDah5#iD9cP8_PGFz#quGtSqzgsLv|<)QnH8Y@=7#T@k|R z*s3mMJ_qDr+V8BwnH{#)l>GHOE_>wHIypRbX>VUxpk{!706I6pkTq$TRSaMz^XNB6uc5&h+3{JLc0 zc+lV&W#zd&Y({#vKx*w>A% zEpXnG(?;F?Hw5kMikH`x?zm@Fe6S;QpWmxhzPqO0%0M78GtjsHW%+s!t99yT-i^Lh zAID;L98J_|;C78wMV#zc>wGMqI3_Y1>5bSukSm)jyKcKm?sc1F0mJJ~g<*d{4E+)} zG1`llc9^Coa}7U>kHfrq_eP=dQ@HKNna{6`0oy_#phKeQ0s*4uc-l?pa+`U}n*@~| zqt;-K^_q&)G03IEhRrVTl4bv=X5j(y7(_q1r(D?8i`wg*_CDoiZ3?}35P>j>mcRQ< zWqM@xg4x}+;nkFy4|RvGn#+$KKic`!Z{Cla(B6*ILA_pOr*d}*#$w?^K>O~ zy6V`rgM%*H+IqIGp##c=ZlkK28>!mZvJUOMt4YZ@b}o9B!rr2I?1~ik{K>7$Z`XU% zsy4r0KST4G#^cBNKmq@HTZ5Tu*52A_#9saVlMsw80iJEL86sF|%nY&6P8Wo8+=5*F zf^36A|AhJ|OIK$78`!F}=v88`r|Gj767e9qS|G{?(UrC*h3t`klC?*7l;Y-%+a}qr z-&g;JNFY%3^w4frW|odtxDXa%bz{P7`AaQ$CqfaC227dTvAaYk?e^IXrBhx%8j;`v zq0ANZ3Hp?s_JjU@>ljz|Vs=ja7q@@B8|3$24>|tpV8{P1gYmYBu>U`#+pH!wb#kEQ zv0lp+Wi`?7hbJNGwd?I|9WU0|J0d4jqvn?C=~&)(Y{%TL;?<=q-&gJ3*Jv=z z^U=eO=TB9iU)ZMkZgF!TFNE(`S<8v=Zm2yKL(`NmIzuJS8P84K(|Y1q?2Y=Az9pd~ z>c!WG>PeX#9~XVIeQR(h_booAHLBuq*4z@mCEL0J4qRv=dEWl?XyxkLE>_=svCF9C z2Yj@=7M)|{T24AC=y!XSVDIaAdd9j1ne$yv|F(ZUw$!83*`p(4Sz!H6<<{K3QUeA3 zU9%4#&?}v-Pu1U_Hy=-4yB)7-LaPX~TF`Q@phbNT&m+QX>FP5Dhw^qL(ql`6-EY^v z%lGQ>?KALuOK-5Mr5-Uo++I+C0t&6pX7)xcK09gDQcP0Drlq5SBAlDwjSY9m0e;QV zS_nP=!n-Xpaf`oj^z%m-Df8cVg}w`{a1p%JaL&ElkgKSXzHwqO^0}Jg+TUsCdRIX0 z{2{2FE6VTfM8<3l@5w2zpHizL2+G^CH}CEa__anGkWKAJZ*Ud z<~@CDjB|^^87-*Vxn?X2OgCHYx=Ky$_PVzY6NY8oqHW2%xk|a)ZT)K<&3D~feA#WP zoAL@~mqEUEZBvamWgEuFlSLzi+T&N+b*qdMDwn#CU+H#*9A~$xm41Bg>jLM7HuCtU zdKZ_%@a~jRp{w7$9HUscwXP9=JW4qit&VtWt>gU6Z5a~!WcEdnvYAT07x9+=cokiY z;-MhSJxw>2(U$YlM=#>0ug?oKoj+?%>8_Pf!I$GUra)(*e_>S^1JFj}+L1b-v_)X}V@$$BeOmq;NaH z4Qar-U?V$$w8q-VI$^%HO6YcnwX0@KkkiV=*q+rAadrrPqdqTS>IWq`p16br9MM;+ zL$@7qIlXA=`-MfJ9YD!^y$KzUI>HuTG+G=l%%b7u=PuvPKB{x#W5!OkM@L^lWwksE;s8qL9vU|@O33R*NU$3=Ik%t$GmZ& z<8JAlBc35XTWM|=)~y_Qch|7dGZ%HXwf^>&3yh*fEYVC$-F?x>T4VADk37Gu*op$V zW7#fp5K0K@366Qg^*>GXto=f}%!5{M_Dl4g$349Rg>H+k(a zJ&)w1^CPWM2BsaaO2=KDF|k3r16#FD?`rxIQ)H8HzL`d%!`6zm&RUaE!^RwV=B5?5 zG^!X-uT-BbcR&xPxZU5uMe)Lwbz)`x-8pY&MIzKSr@3cRwGZDuDSIs3x2Mzf9FNk{ zq^WQDLr@!!q6X)Zh=#nj7Mh=@G-08LH>}PA3s|Q15Tt9;@0v zAY-&(fuiVO&ap9tZ*S})JnKE%Rad=n?(&Q?2CZ_dhDmtQw_5!4eJ6NVUPTAYYqWlh zFLl^(>iqQxT<&fU{N=-1i?pKF9C2A4&{v+MYj;XveC0`1!Q+KT?wKncdrB zU$Flc?H)DQ`W8y@aOSHN#Oppqzn_27uHdszDL}a~v@AHn<6-N#0%P57pEn4t7{%QW zk$sTWQU57^=%Z)ru1tsY0Yd$7gq6u~$5y#iuOId2s?T9ejP|{iV%xd1Pqr4msaM4< zoTI6IZIw90&f6|$C)VTPq`6%)R$bn2p{mHwDtkK~F?`b${~z>ciEFVlckRI9-4)lo z`pbHz#QL>`+aR8wQq1^ye_Vt&JYyCIrqm=&y){zzQnGSxZfTEM%0$Zk7M$=A_nyfmTc zRch|LbygiWwvS9Y>Uj493W0tx<;F7^=N~~kx&MBpR_n713)*{qO_#d8p?1CV@uz5C zBgr823deN+U>NqJ95ils_w^(#y{i<#|1hxc<>D1~h*$ArhW&gPl;*f-EdK4&39Zt` zfam1MhR6ADUz(aAEDXlR@Ru#qhK9jp`O=|b=vHAPG*NQ#!BfB&RiBbVsuva1`e(Mw zBGlH(d;Pvi!&YOF8PtHRt8GuPN3&yR@4NfZ;V266IAHX^&zrP+-lE8u#kcogO`SIV zT{F>S)g}La?QsZ)tK*DX<GVs!((r=>jYtI5D3z}F+01E>p|K;sv%lHQQI$*hKc=| zT&{nj__z~^gZvk7HgT$^q$MwUy~jvD#=E!k;q}myC$F_XrkpLZO+AcgP9FX5cyG@O z=d!EHjvTZhK7ES9H)xKou~<3>8TWDer+-;XKY#L_(P8I{{Hu1GHreY2ppLW3qjeBx z`qAslM@43PuC7E?5tJ;uK909=n(%atiuUyWky>JR`}Nio9ji03)H?~+jO(iEUe?$< zy?j+Tm3=n5(?`W{LldKZ+>$z-v0Ll6rx|O~uUC_1cDi^>p6c8)$K05{^t?R|JoNi8GE=j&U854V=>Y^n~)_?YzCAhhto$-7y4r&cXUG6}afKlo5CZsDN0&@a<3 zvo4kvl{y|txV|f|Bv*BV?}>3_f}3pG@63hz1AF_!Uu&5*w$+?@yQz@TAKPN&@i5Gn@YO@&(0#$1-Q#puGtn&X>?t$vc}_u@e^cw4N#7kk_}e)>t>c z{FRHMx4F5DDq>99Xs=cjhzFjjC2)A?ReI-TT?PwQ?d2-K*=#zUEyfBD=D~H^O+J?REnxQvFW%TTDS}4*hxfbnQELb<` zWvcE?RLIsj8G+>o+(u87Da36`TfvGgwWZ~p{@ASBwS|4EV9%wAu9WOCj`Lj8*S%Zo z{PqL#>D)OlxakTY<)JU@ls}k#kv-vah2=o;<8gJh=VpQ z%_AOmHN1F|o7S>be%Cm3>+nNLk=fH~p_uPVa;77!u9kG940Af^D6G19-sH}PxHAa_ zPnP>PTP_J`e%$z`Z{MbR?G39AJ=v{$PiDr9wv4GZDca+6h{9ty;+U6}O?QQcBrRUC z;h7TKStzRk!)$IU(ZYdt3%#X+VWsnoE`+@^@gbU?AR!4ws3`cRE%r5uT#u1b2El8oUu5l#5~kG zhU2u-+^xtQH1pXEC$?wMN^?7oE8Fk5IXj0ZjPbK&u>FF@E;KBeNuKM>Z{0p6{V`#M zBb)JB2BG~_BmFrtATm4pLf^)yYOXbMd23th)w`C<&y=ey&&%%1t1X>Wfyg#R`LxT% zK}b(Q)JmFepz?gvv(X;Th27_`wPz_I4iO*KwAQ6LEc;oP)JIO++J&?lPMhVfT`7|(rd22J?MSe zV^N2C&^_|G&hrl(zV0Mi>-0dj>z!<;8>LYdLMqyDXJ7Vw9&>Kv>Ta;&WJf(Qv zrIO^y$qVPp%r{7Dp{n@MR7|5W6xL*iZ8H`O&?d|+tvtIPsWMR-Q>3{>6CxoMswGo#q7`#=PAk4(sN6Kg{NtKQ!l?ho{2gx zkJ7$|H2dVYuVKbv)Nw78Rv}PG>y?KBsin&r=x(4F&_5{PNWI1OjE@@;nXT_sZztobV!cSg zd`bsWai#zWK=;4A#c}S&RR_{E?JRa#DV+)HoKzt&jwln^Oj%LssdQ-Ul9UM{RjN<) zZ`(YZzCBv&fuQB%`%leVp7pzWdnB6q&_RhPlfsSj(sny=?rxV}c*p^kSCGox04jNV@-kGl|vx=oZ>e&_J+bgddBd%>57N-fZnAeLUtBreV&8B{6Ux+ew zammbZ_gP=GZQGs&>$dvsg&k?zymS0FY|Tjb_uK1|?Ykj!bGnbbS6XJ)<{ZP`sk_Pz z%;R`l%$JzCErBP$w!L=h;Z(#^tooIQGAvN<#2GD$l*K2l`yxV?gfjf>++xnQYb#E# zsa-OahG>f%HK`N1V%DIVYF=@^TOstwl%-^^gO3g8@6A5V&R9P^EV{ML8&PjEdIOmC zI~}Rkd0&p$_g(5se$?H$`BQo8Hg(?rwjcBtUy)kIn>QPXLloNG^+ZhiF0yPn;=j8OB%bJ0e86m3S$_}U^ zRi+iq8l5qMNS7_ycw@L0$IG|hB6^5V$gFb2ZK$53dx7})N~R%_={~-23B)H-LdI|T zGqnE*r2SbV$Fw5LtiM{tyz=!brt9!@P$a2*E0P*N_)d1{uUg~QhII=V? z-A83|v(2ypSLLZX2daaInaFf*Y}(Va9=Y^w!sMJ5ndREB@`XD%BRxtuqI=S(?7p@$ z+0Y(T9j2`8$m;r&x=B9Bll+mR{vFF8&~H-t3cP8{rLO98YQA!N*Ug<|tc=LGf$qtZ z|0hj@4R5Z#-*9#P)wcC@eMakAe{3NXiPe3!PmDwkLT<8e)U9=Byok30Hv9A}RzG)k zr%i*`;fQt}zpOpYAL%JGEH~Oi3%9PmY$t7tGC|Ki=h})(+XKoTX*hS4uDRZ^RpHNh zwMX&q7BqLNH#FS1k?YDVy1e=Ii;`$H565+TcCOmL$B&1y=x9FPDqnw z{e5>dik^#}-YTBud9#)-i8RT$XT!YT{b~P&$IGeN3j#wgZ>LmG*?s-)Rgdkuhj$x* zn%aJYgvx^#qBF9q6(8l#-E%d#I(Hbyjyff4A|mcHUnf@I+H%jCe}S~}*|4OMk%!9f zmq%@{n2V5EvEjFe!{dGf5m1Ck9f*^SlLcj-&!CR(VzFFqtSJBQabS+e36 z!50Rzx%>zbqB*~!w9#eax$BEC*@AoP-WXk2yss&IQy{JdMR=1Qd9`+EC z(pQS=RhD^J1zC+qbltFJ(|X^$to6PH>oPJHtlMG|YId!CVU2t$!ng-h^+aY1NNXR@ zm#hn`nx$z`k&?SnGn%OFfMe}NzSca&)MZ?HC`0NYE^wl-OJot+eWS5|hFi3Q+(Lci z=e(T?) zQHJ`I!n_F?>Y10V+`AKcG1T03!uKN(EB$5&N<6#Z&$pOK31JQ5kU53le#U=XP%~_YSTpJV#$4=hBZ%evlD3dgI z)|)doh5Y8u>;Bgo6K6R(SlwQ{AZ2D>VSH)WtZR3=qetzEvTWSg8M=J#*{kjfgdU|r zhaEB-u-C_pm~#30)zt(x?hV@f(9zY&l?k)Ft6ubbwwy+1&!3-lB;$7FE8nurYzvDp z=I94_ZM&1m6{PF+DJDHtzZIuWBs4{w8d%~q_LJd}Is5ibksCinbM0x8>h-I|`(Cx= zPrKB2MKq!+VJ|wLvQhiyR{wCVV4JWgJ0rJs3ajUJx}4upeulgzcdMo@W;aV~R}$rP z^?|bK;~p)_Tsk4S=YxDtS>zqBmwL)CGotTM8%38(?##Yk8Cp8bU=Bv@-<*5zXN}wtQ?|NWhCly* zGIc^^b});_$~j<}$6DKnG|k!a&>MoZ~F|F4sz%@Tg3T}(MjwMEacgF%F1pU zff%kUqX(89QhH#1m#4D*ip=ikFC0~Fy;)W@tNg~*nQ>KX(#mQdRwy~18Wx#tTt`$) zM61X(HM=_;Je+iM=WkOtynmoPv050db2R$eNAzu#{dtF-w)%Myy+^jbK5K8uf3m@i zCh(SfrfIZgwa!QSQSjqDG_qoLKMVFSmd4wEwR_kHGOizdzI-mxnqXM-yeVasDPkbUU#Uqet~~lmj7hM!meX6R{5`7 z;9$sSRA-)jyeUIvLk7VBU-ogXgHvJW!wkC`|EI`%-5cL7-=-<~lt;1!g1qom1O3(Q zGcUJC+b2I?nN#{<+&iFZ`_q+fBkjqn+(ho(b}QeKx+kt7EJzX+eCR!D?{Vw#)zSsd zMF-NWB}>O=kFTvc`MBSIW8+A^!O^DHJd2PORF~pog@xumL9U_fm>j>*VF|#-ce=Es zX&3Bcy$Wxvm^=FN1|DU_`#hslv*%!Eohsk_fLq_WiwaCS8d(!psez6XQvn;!^t`(G-c!RN_LE* zk2QkZGkjyQ`scYLB;$wFwCncY638WcM_cFB&bC-vM_g@Pqs7CTS+m+7c|HXS^4d4D z3V?zM9ph&b9ZF5Oeg%tMe4fq{>&y@zsoFJimHMbc=Gdk;j=cj>ev3Zs0T$lT?GLFu zG|G0*DrtDDE8=W(k!HgcZ9ziK|_bVxHPPAj(*Ud&UcH(owPl~F}2m9$9e-)bj-8sh!FG#_?1OBBgtjrRk+;tn zPC}$#Mj<*z$1~ybnadM`Wk!0dsSm$msW{TQJ7vw5CHu5G3UP%Rg|!;JRu4GJ&sd^~ zd39wQ%2dkA$Rgz{?hnb`C_DQ^xnr9RHZONclq-8*w)yqwM1!);hbAU2)6EZaSm+Qn z%>35ELf9vAD^p`}N>o&@Mv6wE)?)dM8k2gXUUBlHYBe%Vt!){hN182d<~RQ@jxbV=I7oT{iEK# zKq1Q%BeQ|k6{spxr9@{P+suaFW@J>(3{-g#6tV<)QP56#P}g{&IY_B?fT4$51od*zz% zxa;dw-mZS|ar&fuwS*Man;x3BqE+0<)9_L9*=@CwmJr>~rn)QnS){6W6sZ=N8J^ z%_>jD98OEuO?$jTWlMB>ks7kdE{af-M4Nkb6FYQPQ_`}D8oXVj;2tNfN(-(wE2!U< zxo0y%GgcnaD(e@SeWLbIhHZV*>C<&*EY0x7r8CLKATQoXzmraS6&+u`KPcmB=+#)g zLfVG)5y3ldr`0l28xR*M%DElLI1uG7Ud&R`IQWuuWhIrr)QT6wF~~dl_`~>(H5N+| zg~LXlMZ{s}E5vxF-Ys#=&rk?wJ=<4v2_e1yKfZ8y9NyH09yt%7vjE{=QwKqE{p>$T zVtQZhp>!fqPoIQ9NB$iH5GE4Sg<$pn=}!KSTqFZ@h?o-s7!xTZJv{dk@e^VfWo4)C~Oj)Ornqt=p-gdpTYuYR3@EBrL)OD2E~cQhR}ln zHizxHRaD%+AO1Om41>G76?b>H;uI*>BBeNm;!t34EfjaRBBf~YGPuj21zL)>KykNW zKKtGO*}dEQz4^UPa!zuRo8%pNo|E8~?CT^jjNPu-XvbmDC~}CHlcA$2E`Lrn6AeL& ztk?f+6mNV($czaED^6`;mS~c3hpVCE<=8jA6OPw$n2USBKxc_m!f=A9vZSh&qdf#I zGAd)2dIxZ#L*gq4Q&x4Vz|nnnL{4rIU~)S5GB74nDijg~%2j3)#8!x6LL0J0Bg<8_ zj~G<0T)@lWZ7g8`El=4I@4KPnMC;kiQ@hbb4%i@xRCB`ADA6~e3+BvW#!$^`IQ%uh z3jCL!|5sE4%25VDIkiD$1~9n~Yb3in{1e)4bqQ3$-)-#P9&R`j+$_s050OkP@<5jb9jRO%E z)E7gU#LJH`*xdfWlcm`y8`qdU|gzlHNZ<3 zKpWn# zMYsh?I1eaX0jXRYm#~nuMc}sGYIBhmg?xd*6@o1O46AwK_y&Y}0I64%HyaIn01$~A z4j>;GwLU3l{-1$V9>R?71u_AndtepCu?Y>rKo{2f2fF*V3(sLVqYS~g6ZirUSI=K7 z{GVwB(12JZ90FmhHU9HxatE`aLI++hpU+;xgrm8iP?i%wB@%!S12sVp^QUkaJ4!&R z0*{h>;K_9#U>t_A8jiz%0vhbkpJ1@j%H+1q*eH;!kj0dS2&gqoAcE!ld7u-e1aThU zZfwaaU8&~B=o}21A(Ez)K`7~EG>d3#Z1Q$2_M9?^cLC_Qo#w~qUZ3u1_+45PsEQgu?I%Eldl;-jl>Q}1VY=GJg_fSAw_cF7LgDairr2?uStl7 z@TvZlBJ+VDZ&3a6&hAyCB(xZv0vd@0<{kpEfi@>10+CSuJ{*vzpr^kch%i{xaG)MzkpeR=Gmc#&vAfrHaMm&76WsYg@q*9KaLhm`7qL(YsCZvbC@6~csLHN z8-JFGrl?<#m`SyNmj7L{L6%3=c*HC&(R}|rlOz-*s^uxcPSjgmE5@bZP6FNJ>Dh`? zwV{T}xs`S+d}6jXAs7UmD?$}b9Np6sIBHNFO8|=I>63ct{8c5!4ekM~c=p!=u=7aB zZQcdE{C@+E54Ar)6Cmd&CZ;Txi6{* zH^zyMArzM;Ct~((V~Q4!uqt6p)~EXzGxjIKH9(hb>#CZpOkRrywEc1pfatG3 zPJUHD0Amk96{kD!^zr#i7%EGf-kku)&g}R5lJw9sr(V!5R>APu_sU50R#`Oea1<(n z(=7M=cC@_peMB{;j=U@J^AA-_IHS7}wP-ygVGuReKGJ?iq|=USFy|aeS`Q+RI0q*p zgOd}XB_&B|c2#Zz{-}Y^53>mm0}&|IntzrHHuD1k}8dy zN-M;P_{A7;9Q&lp)vUH55gDWp;(X@1LNct{Jbdj{c1CL6rv4Z{tK1M!WA z7&AFV*@YpO_{8HF zA+^(1(2rtq8~rKgLFlT%23%Ry_Xei^RVn;&G!u!W{h!Wo!PO-i$_aK< zt$#5kC@~Kn0stjstPrmFP@jCHEEkAqFy7DBAUoQLqnFC&?7p8V0;enh54M6JKI_+t zb)NN0$-_{VkBUS^wvjUor*0Mjn>g?asR+(6N&>=Xs*p`i6;WLHCbUF?Nxf`3N5|kP z_J{Mm4H!%>5Lok7Ujz|Np(DjYgq3r~!l2!ZGrlF%Y0FELB!yN@ycs4ES?aspkHdC2 z8q7}+qwt9loYrGNInh@U**fSLN!?*39VrksszGT{hF=k@q8kRqtVki^jhdkokHx0> zgjW5UAswBB&iZaz1P|88_UThhc0!X16QWEI9M#zsS*R9^C`Ux90({2rndsR>_X~ln}8viZEGF7-aLX*@hC%fDzzVZ-sb(R7j<$K?J7IIzV&}JTGQR+yrqC z-TL>!FR1JdQxqT$Jt|cULm!yManou&iN+0d?!v){VKd@5k}raYle@GSQcp9%hwuSs zIGD#_`h#u7lqa0hHFh0(djg_$ErWps${FH|Kq9{cMS0v(4aqB9RJa>C>YLZafXb{S zM9wVjS!d+A49<|HXk3V(2Thqk3dSa7{3o!tud_t`9dNw--DY`!Mp zfs5dW%ci65)07E=MpGLI9gUl#Dn8iPU*G}@7^gm(DAnqv8lYjeMX-4C%7I1~wB+^L zx1P>FFV(7chwr$N6qosKZ^sMg{PoU*O$kEtfyfY}6GRTmBxA%U=gPElJ_z98JA_G+ z_=T`$MI}o1Tl#6^ko>Fr7er*@uLQl@37K_9j4SK*l_B8`X`JuYvubje+FQ$E4Wz5? z1FV9L67D*);^TD4hIzw2SiH~oOru0MI0CMDL3nC*N1A)}gLtyS`rfqkHW4K)l-3hS zF6Nkj$PfNkLz#Qk%L^ZhFW;cG_#k!q;cEG1E(ep6UR2-w^UVt6++Z!kI>vaB{(}5e z8s?!E`8=5yNE$SAwF!KB2XJP$n`sHC967LIoieeMX$*`eb)cLdKVVQ3NOZ$C!r1)UI2#T zoWg*1*+&aBLpG4APN%(8ws>2*DJo6UkvSI@m|` z4|Rs5L&xuoLt;(1;bn#<|IDM|2X>=td#|djyk7#t$a{aiix!8;q!NHD3g6_X_p&?7 z7aP0)V0<&A#((0fK2yutO&iH!OJV1O9t5FUuZ|IK zIE~H~JN9z%2u3?G%=w5#w(5756qFLMI0Kv#^LTXjhCW8d?w&5DM?gM8BY7PH^5%G} zTRyC(={DJ6?|EUJy=xCCK%0zS{p!Hb910(PA^(L8A<8`isv9l8#(|B91l{sqxc%~Q z-WoG|JNLGrath#uq{0Jvvc*Wm>FZCY>Ck&tYzf~eM@C$A5aUy0v6#f1#ad1<7FVPP z%=;keg%qlIOuGY2w>|eRi0)A~-RKHwlnMc?v=Zc`eaEY5z~ z4|1s?Z2OrfoeEbyLy_Pb4Nl(Y2)`*CVUr6~x#CI1lsgb=2aFuB{UBkI1cr zK|pAdIy_){o6NOR9ed}1u`2>c5jEby zzr0%&db+n8SH%VyR4qB*f-WyAmjq!K$br~!L5E0s@l{EvWam}g`_9jtBC-&*Nn}UX zI?$OG-seUS zEU<}IzF}=ebRSx3TCo@cId>RzVWl}dV)6CGEe8KiwRkA@Tl9}PTK)-2|KmhDZDix; z?q_Oa;2jbTnVt)Q$D#=MpXy|7La$P&3dApxU7G%A$-C`oKxfnX*I zikl?0iv_8Ex={rFdG(~$h7Awq`=#^2W&zTJ9f46Nj}27YJOH0mDP$e&Lzd7!xq1xc zsdZ|bm9Z2bCSrNhYu9!I4&(g9dfUF3fP@Bcn7=ka1rz&bA3ey2bBsCyoV+0KG@`U_5ho~*U zlEAUZQK}&??!(Iaw_&q&-(un-mo9rnZV?CYjnwOne7S&%V`Fj_HU~OXZ9$?avuFIX zXua&Dy9xtg@7Af_a5Nf4D1uMT%UMYn<4|?VX6s}^UMsaHmb84KQ<7^M0k-tsaf|<* zV2hOJQKTxDAtcFI9&oj+3{S1n;x^pbEX>!4Z~7LcKZj=yd*xjykA0J-d80@GcRR4I z70G?zn-toYt@3?`d<+{&&}x%m0$USzhVY*}=h(s5N>S1wzi=*OTBhUR=s?@W&&ADs zmpTvCjj16`JZ4B}KW9bp7A?WZ{v?NRFL1>)|L$*$dW0|4ptNbq7;1R3`W@ zCzSZ%A;xe-YjSE0$DRWaUIQ6Gw2PYh9;H95(86m*@)bsqKI+{$MOu8 zu|;v6HSQ-FRPLOVwAoTQOlw*4-#?Q27%TIH900wd2Z@`yF7K~qG%0(MXIA)ZOM@TJ z!Ja1PBf>qeovjC*;20R-H7<0HesYw=!=V`UEzOM)`O=1O7^s)-KVo~v9(rC@5+!9| zMqRK7L5(AA86>6IrqolMe_{Q>xVG)bHf*vLWK|wCf+yxio3siJc5CQ{%*pLO_hCb$ z@6L>7XF^(BF?iTQg|1Sg86so0P0}gO>e(t^~HRMfB$L?3Rf>PLgAc zCl~RYxl%Jv;0d@U(aao)M4gq&2eLGRal2Rrv6#yKQqz(R3`$dr@GsDklmVeoxm%oh+ z4uzDX=&l74ARxZ!49ZUv#g7IF8W-;G<>bx+I2w5b6pi;UtBk3a^l3T_ZdqSv(||j2 z8Ytnytbv0^Uk@Muo>+D+i&d!lF}E|J~h%?+V1KlHZUd#!t-Gz*YHFGK~Gc z>7(b`rgmJTw4&%avMAwK26?w(su25Qj|oO<%y2zwvd2n(P9cq_FXHAxd}0K(&H4GF zAD3<1LPA8~SNtx-+Y;fs|J#-s8T~0fG4kRfEy9aT1!r^Ch-Y-9N(CtfLUBT9r4PI* z8OVU(Od^T#0`)R^f5hLh48`t+Zfj@$S~ZZb`-LGl6!Z+`&-S8> z#se&IQXET8??LL#*g;d3BvweL;MXpH9y;`8J}D9lC)F>#JiPw5vYwu(A3E z^N<)w1J7p4+-Q45+g0WkUu=owF z#fhDJczi;^P&`IUFRV8sH)FR|>;$ub4p1stg??8raJVZ{8Ay=__X?5jhl^QHuU^49 zV6o`RW)kOrIZdY_ma=eVo-!AHOMyMP)1MsPXDT5_Vr3gC{q!LcZ>S{1P)v;1bI$#{ zn`88qCIMWUyfgf-629JCd7Yy!(2Jk;ZCOcOeX zBcOvS`<+ruxynDo%wxISqUzkhM;)eZ5?FhA1W~KJu3~n?rR%akG00LSOyg-^Q3Ju5 zn`7B20eF8~a;Q+$MGwmo{tlQ{)ZPhWs{0N9=%(jIxT*C;la-g`Q$^IZ(Ipd6PIol; zY>fRRNU2kZ!%9&PVA#6zO583rb-k!_>IQS!m4zn)#z-lu{+_~4DYzwwV}3A6^57&W z-*pN4oVSum=^>kx8VP0DlSq$AdNVtr+)w^O!Klx;OzkE(;4x6InnchJo7~F5$sIp9 zV3U`YjiU{mNYOLmE@uDi`>Th+;hW~fH=up{k^8A?4*Gf)Gi0=jCuw>`!ico2lrDBy z5(xu1<{tMqia|*ZvQoJ&cqk~5zqFau7+J}J!fGjB44e#L870m|m~zveOjLEYc|*_s z_QE~8D8sI%IQB_IBV!o8n%*%l!EjBUluYLWm+ZBlQ-i8Ou73G|FL@)*s$g6=nhIwk zw#s!y;LVYLijAhwR353%*(0q%%jTM8@FS?r{vyQFszY{t7%sWq*P&Q z`=_3p4JE@~hpEnhvCf$N;&8{d&zyq>osky-H*4pTx<7tn3u%nAtLa(7f8b7Iqv<|RAxhC9;* z4H}+mL@PU7Uwc%OIJbNqCu?UtN4$7zgN6L{QCqIl;5^a`-s+R5mkYzT5%JQA6jdYj zJ27tcvhjbu`0IW0g;6_^-L_87-aw~}pPIt0QnIeqd<4O1D)@H9)#8H3-^+;{F`%=y ztSGR$XFaldH@9oa>@FC51@-)318t*J=(#{D+-?}Ld=2HheG@+Soj|a9PA@@%8G%0~ z5u<;9q<&2UCh9(_e{-sVR@(;mo$FxUeA^<`UJ*?=T?jp6i-tR~hKk(`CDnW<#ON5C zQjI=f7}&DeRzlU!k~(j3 z&^e<-Z{1IR zrR|kg*1Z6(!B>q2S0sYMyaJ55xW|Gc?$R29RM4jj)6r?uBTaiQ(^*2(`7FBYDm(^F z{_c{Ow%5dp#_|Ywrx*iSFBR)-9r8hjT1gS{5BglitqJN?e{`9R74Aq*h^VetWZ$<5 z`3I+nVr!~vU^{j3gJ@i4<(Uh>S*MR%flJ@^n0L`FUU?)uH6z$p4JcT?(`gp^-~`d- zSX;7$*tdWncQ{m~S3U1F!-M(wZ+e2n&G{fcev%Z2zW!$OX+t9fUbPIwWW$rdf5z6t za5g$Ju5NG9kr5hKVt0hcYAd-r(^oz{TJRBArnB`S?pvs&BM?s&sg##g@T>%lQX>4N zoqFQT$+xfFbc8@{YAL>$Ox{wM{n3BUXZLO1cu-uM))SuU$HlBjk3*H8C ze5-e?S6Xe}E_!>l`#qEwiq2iS`1Q8poQ{Hes-hp433}Ru; zI1d^&mcMWgs+Hh}@k&P00XZitwha0N%3x=5j>N-YL;mw3kMgQCsm`8d8SQ%*&3_o_ zN^d?*4g>&tZ0oyWKNiu3F+ISZWsBTL__q3c;lmaSesT{@LXuro?vr>CEjAOy=ZIQa z5z9eap1-B-22{lCBp;O1vNS+?gqG}9WavG9PQZ9rwH7ti^k#_+F*l`agkxP?OSbM( z{*LkuIaT7U&&=P5;RInHJHfiqdG?8}CH*IdtF6R-Q|F)K@T1_s5tJ7?d%bgcT8nQp z*S$V8mKuyRItE~MunwGD{EYsCJlvr*~ytq5EwPxDj1ctR`w3#HaYV#{;g9%cyqx3DOo({+y$T>Cdc#G}|GjQY@48hWy`J z<5hhu^yX1h@TDTM5*burf}1#V-fGc{dJx$qQUvu87)PD&DdH7YZBs1Kc-lCN5Qddi zDuH7L!iBlXKRKSOJpaZl=PfZX60KWjm{^bEe`iSazIEy6y~kch)?1f6^5mGQ$7SjY z_)iL}*==ocOwxV}*kcqqwK~#rY*B(wa?QzY5GfqlK$dBuI8HH1`(mlfeq{l!VtJx* z4H$1<1CD&h@9*TDUmvZ~y(^#C1l51y053NaPglx=jLCz!W-fW0r6jMXvj-I;(}8gdf;!Zxsx=X-qsE(aS3Do& z+#!h4n#rP^lSLjSo|LEeU0#C62Cwdv(Y;06&%i@3(YR{?-kL{c-~*kWm4n*?yxcy= zXB!NC;I+7d0qC#+XTh(6xom!~mZE;KUL_pngtdg0me{eDS7AHR@9uxu7~-ngG<5D( zFxu~zlo%2)=NXFTlDIyb%5PIA)7w>N4APPwiHt>2?3vUJ?3>vET%V7R51RH7bx(`U zExfF$pb))a--*VfZUzBXg!Xy*{VL$)#wJPMhmt^LTIw6K83Rg{`Zaozr-w_36o$_Z zIZ5p-zrR$0In5FUFd7$}QueWj-za0P8y8t6tpk^8X= zhwUQBr2R=-j|aA%)tNE?c>sm7=Ac3Q&JIO4c~+FspKRYi9&Hzf)tZ-MFHtID!ed77bC&e2T!vi8`|mE>ehL^T>KxYx0w;S=&&! z0+f(~Ltif8j2gONEAt7t;{L@5Zg|gKY$m~l%8y(I1k%N^EXk7}>-rR4ip*-6R^^{?<8qXXX>hOFba zY&-^1!$85fi&W|niUW`ZDz+kd9}DcB#g3W8&7@Dx_ziRTfyUW^Rr-$7 zzhf}Tv7zz|zJD<@)yE3?QXTLai9I~6B=xbpBeXpyz_g6 zdE4WV)QrameXK`At~pCvJW6{!AyD09z}50@i)MUluC_MIrPSlPKF5QOecSM;V#y*W zWhb`V5b2O-!exret)e1e$<+z;dzekA1~5$ASmyb$aYFfLU6iC+Ys4x@-KPHxL1puWZ<0nscPTvMUO`C^>d8WXsP9bfN%y!Vym@7gx>p>3>7M=#l#~7hr8U=K(Q)m$f?3t| zp?rcXMvw(rUWzk<(v9Fd#;5EZ6b!9*0r%NT-FJ74)m$hgO(`Q;$>HaTr|q=vV_6sR zN}bA=vSgs%IW2~C{l{2S{fTBNGHIRH_Qy9usc|*iC@sa-6bBpvYnZmfJ^x_~pd`FB z)_O7Mz0aPXy{Nrr$hpzAS(ft*)~YRXlm~10;7RkxxC}%uU+9Bz;GLI<MB?7>B+<+|C5EU+{|kp4QF*RbnP+VW%ZWysA%v+lgHt0ULw&p{+D<{GrAh zB4e;oaqc8`*hc2FWM4a`mG^c;G*H0R>PO31YzuRfXmp<73_Z@uf2CQ`G4-oC4#SlL zwsdigL;`m7xj0?N zbnF~JtUF$?0<$lmxF7k3>u+2kSk3Xu*Zr2raN`WXw*oWI9;R;TFe^r3$p;9v*GXL| zW;w=(bo*>4XPLc8q|rJ5;{*=(6WBa_9*n`QhskLSXgl z5nq61?gE|uldYr0OYL6ZZUUaGjK8>iamsllbB5QBw-pFgSy=K&H+(R*03WRKcIeAl z&K>jw@Pfxumki2s#4H`eYM9BE+5-U=;0Q4rc5#8 zn9b6yk!)`Ikcs?_(BX+D<+yA(-PGCnK%o?&IcC^pJ`Hpu~7>AxPy$=+Sah>G3CK6-tah$Va zLRr626R*ZLo85}Cnc1#OkB?9UB;_1^F1$fj2|r4@Y<7m**@xDBg4)=2<=@8Hl8G9B zOy&{K2^ZqyGB9$tin;jF=wkZ-JjYXtVC1Ixearo>nm~^F!UmEk=&9_neq^kk^qae?tIN!B`EIBkp|9Gz@nn+>CkV7FD8SA+|h=N zc3Ysy`~UQNNkS1yI7{6go@?*m;fX$OTPj-P&Alk(9ORyP2IPbnhqLeyz#fSyORV+! zkT$zgiT!9TD3kobu3<>IkuVVk2wtIG%;ybh@s+eDD{T5Nx!nXP>fg@Pp^96Z14}-~ z`rZbP3p;Jqf7Q*O1f@)lkz3HRT7IqDdnkWR$+uq*&CX_)9t#$uwQu;0>jVGZnj0<$ zv6KVM1Uw5$)eO1PIB+}qW8DLujE{Z-LI(U=h*~s9on==u_%1!GmHsK6ZAWx1&nikA zICDRqZ0Rm4wF^2Aecw0#3vQrmDo5M)1MThJu$~d9UtbFcG;z>|dcVz$!~xz~0?ZTW zXqSJ!zH+@58-*x$mMTq$J^ek@n)nNa;LjYXb~mv=37*G=E{2x23GT{~&urfu$EE7g ze}foOK>GWZWJnQWXaqk|hJy#~i(Nt@U;aWzZ3ekg|95`=`Sc8VghKn>>;(-W)(&QL zU-D4jIp@<`4@OW%5NlzJFyl~@5J@iMExl?zs*}DAT4T+hWqF-hYl@R&6S_mrrl}yP z%{}+WuF8Z^+94|_`eqKM%f_e%&A8a4z|oOV+_%7(+OX_)DbA`J^LH(}J@hC+OdUPy z`N$iYRtxJzJ8ig!tG_ikOnIM+6}O8j*#+(RoU2z_)>Iz3uju&qNC&~_=iuwOTA4JN zd-?uf7oEsp?$cPgF+dFeM%TRhesKLpM&(FibAB-+U~AU$4bt*?UO9I&7TUfw^$#`5 z%Zh=zTVD0wQ-+h4Y@S;@jQ^{}fGX z%nF7U+7w^p1#ThZYej@5FJUcR#2jLz9I2Du@;Foo6Zz+iYs`ZapqLDjm0 z&JY60c*6g;hdpM{>X-_sroh7L_lO2xx93M6JAN%mBVQ@q-!%c8}NQXy`x+sCkS3U7 z!OtLDbTY)YVG>uDQlX4sH7V?dV=bhm&)E9UA#V_w?S+Lt%Xpz{w-Zw|0Agj3XE= zz>b&*o0yCM1>F3-&|eQbAu^zL!PTp=y(r&)&^L!am4kBGlmp;1}xA- zhv?o2uy>4a9ojId{Of0{;v1bk&2VA~j?lU(4^j1Ky`)xa7RY>C?E14&RqkRMY3DBk z02WfsQaWUU2dHS6XsO6C%7KpvbWDPdnx+~bsG2aT`+B6ZeTws+hmX-a#wZK|AvVRl zo9TN2V~L`lFKslCjdO^kTrA)Owix|{aQa6(oZx=BXp+vDH{*v}I8ro*XS!87xcKD>V|tCU}FSVcDntZXl+jIRLfRkdAK_C0S>FioSw<= z@(;D}4yXt=S}Q4SmZ{WoeLH%)ir z67+y&2QTKU-5qOw5&FsS{r$^lbT{sueMd&>o+s6&Fg#SiV$F?go4RpkMNAA^E2{_E z(cy&SUEcXhP6l4fr`SI4z%^U2OJUeU;2t}d`GZ8l{`->cr4ke2s?26uYa zEmya^pXYJjnbYV5?^%Y42QC0_v#onwuiy79hM^u@m*?QHhmb_5?7~V8SAjhWm|$!v z0&rhDt0JKSsW_vCAs)fC<~M}}g5FVeW+|nNQj5O(O@^+)xv!d@iG7=vgJ*pO#n zNk7rHfFxBXNA%t(XH{RNgdlWh(>Z!-(itWyRjt>bxU z{v!x~1+~H05a87~%j9HAzR8_B=V-gRXNK;OS*q_#VZqrqXcA_w1vB34YC1AszANYfuB4Lg3s$7R*4M~}h|5N{1X}BK^3L42)ZO`|sxz?Z@pU;b; zgjA=6|1L@PfOR2PpR#Xn(#5f098J{bwV-BGX|a{Dg3HBMs6>3}i-)G^^JZhct`L5yH3C_YK zTx{)a=OnDl?VIDnYXN(ElkLLG!pzz6J>!yY7rp*e$gsJ<0%JzzW;@oXxqx504SsE8 zyo~Oq28WU;*0w*pGOq||M&Lh-Rc3ft-kO)r|UK+zLECZgd_e| zzf0DmjM#VfbJcX(l(x>(W9%x*F+q2?9uOvzB`>t&j30;H7TD=Xs2S#%y}aJdVOk;b9+w^D18R_StWWXI(vd^T~gA3%|3i^R)3VjWY8Ka&L2m_^a(~b@Zd;q6qtV ze3*uGc_n8U_YWiAtDC0g;;3H@yCRf=KhvmU$DIY$Z+mPXKAQKAfAopacFSXXNZ}a< zn+tqzPFgZvKT&zggH@rYz1nB)pA-2L>C|;M;h0y`jy#*!T35f34PPyMJ$jP^F<*mV zhCLG>!;6@WwOyVc3uXv3xJEj62f3_nTs>xEX7h$jW+i`|XJl9k_W$#FPOW z!lo%J;WKs7n2NXEYW&YD#s%x@zf-$O^eFrCw7;&?hDK$vPjA{0WL8AWE#lqgoZ~3r zJNP$DGg?IHN6&4q$;pfQIX^91I^>#kCvaw=EB(E1w zda2qM`J^1wkA0IUk%G&*Oi}1d?*H4#+z2~$?IEIkZ`nLiBo|3LdHBoJeMSVW^p_~-ql)W!} zcdZW6AsR&pQ)zR!t#tzfru()PJe21LwwuZOp2#m!@!ppYbIV%z%x^Hyx*RS;$#GzV zj0u0@kOdLj1G>4@mRo_C;#1LF1qx2Jhx@4Q=p^#ka}Dqr$1JX)-f}@r^bNx97J*4@TXoefuXzm9%n@wsnW4oqgLwyH_d_e0J1zAcnaT7;II1OLLzKip0}+~)Pw zlDCIB4ub4UG>FJ;M)V!6?Y_YU)9?9#diin(_Eadm?54+-zUR%nwebsEarH7paU?XW z>nRINZ#Dht0kr%fsBWtd7r;$<#|={cc5+I0m%RT7OifDz7uc^?p+lqs2Ox#i^-=vz zEcNDo2MuKAtuhifp$gCFE~%>hL=qb5pFcpK@YL_tC9vW9l2kDp@<+<*r2m3AzezJdf(Rzg_B@lw!WkyeDZFk);{BYQ>No9kxq>Qh49E zdC=zbi>yU$d8#(T_SQXYY!SWFsk`wg6>}X*+fsJ!e&uZzHGb+vA6)!Xgopvzc*^!o zOrGw|<~K<~z!r^{N4;zJp8C94*4t`XtYw1rY&;J(Q#+OMI8X`m;n$44&DY}han((n z&SUKzb+-5lZPkOhbcEcrU*exu>N||D(h30L-UHLriXOg3>-5L=6QdzFX%~51mXoHf zTUo%O%{JGU?3`)C!P+%LHD)4RG|hIK9dJJ~=h|xW@wj@Vf0Eoz4~1!vz8!&@&%1+7y9xnOkNq5XiPAS0%=>R~w?KptN0DHK3!waT z){(k`nJ{lLVc< zGcr5+N_G!zv(WjjHP^)HV+fFV96)|#`(SJs-oahuEKQWx{rT*Dij~+nM|#lQ^Q&p!>Ztx7q1`mO!ZXYW4l~=nR13xL~@*n zo*_)Wa8s!_P+2xD7{yz z%L=*L7(3=16JY03s}Ve3&XE>=LIE9RozmOSh8_17oc@+c;V8eFUs*=*#kaA;AvSfu-k3z+B6`8UKW_{4yypsAo84dx{WIv|8q#{GXU$oPjZAbU9aDso37D zKKW-NUapol?aAj+1{z===2y=VypwiZsjGUz8Xv!YcScs^ra&@x?Rgw~bXa?8LiQot z2AD(rI0Z~0E&%XrPS}OwQM;LUyb|E9E`tXAz*RqGN5rTDUu;ZFX3qi@2{_r!nP!%W z4BHZkSn`6HjeZRAj{>8!v_(urs3h#Be2rL>*d0d9>7*vBoR8%v@F!4@b4JWFD@3V@+`wIEP+2n*EYTk?d@Ty( zuiF`*P2O!^MmZe)E9wC<4S854_)rxf8f|ybg0R+O$MC7!~V|10BA*tleidovpZ3U zPD~oKdt!!P_e|gvLQ;AV=9y|>p93N&(-_3ae;Kh$I>-_4#R^GL;&h0}h`NxopfbUL zZ>0r7aE9k#6lBOzNN7xC14_*9{Fr1Qpr=m1ASTdZgoiS+aku6SEue#i23Cw_$)OWr zu`;N9`p7Tg(b9CyaD=Qs56ePJgICf#P$t!F{shnSpCdce@115W;y%Ru>Ie8>1dnm@(y+vU`&}x8Q@@3TuI3>!Jp^Jix7*&}iFC<=09}1d)te>CX1<^LZSLK($+SixB6FE3lo~0P$AvJ^< zO5)|Z#kYnw;p@+=X~8XEUn0cvS1zj-JbP5tCeWYct-CeoNq-QFha`+8Yq&0BCqmb~kqmq}Q^bsQ&JU1**RR z9XEiwSz1iBa_axTA$R~6TSjtZ_#r$G3;uP<@$vCnBUt1kY+$M z7G=OiVCXKs2?#Ni#(nJPtxI(W7-CS6i;`f;|FGpSu=(@6v1^irq*(@`fxBZz6oZSQ zWcP-HlZp5tql{93l9NtgpzHn$9%)n(2_lRkCyrzmKy1BNYC@+7(<_paqN3`CQlctf zqLL9Wm^4rn8j0{%Sp3j)A+m-U_(cdROx#yR{1|pej0hEpVaLeAiie1=6N8FA1Cb+2 ze?ZEI9twlb8umM7HHZUS0fj~AL|P{Xd^=qjPmRHs3x^0k2}whYvMu4fEt}RqEr%=#u7D2CTm>ONl)q|fv5_5lAI+P z8c)5xRP9F?{mC;5kB?F7ph_IJSCj5b^VlQkyUwQfA)Jm?WUsQ1B}f0x8Z2BEd~TCpFUiWdV6< zeDl;P9$^wD#V0JeL@a58VU2E;a=;R%=o0;=b~v!ijV0GIbenHG(WT6i5M*;fpN`LO z1P`BwRQ0!ylLtQ81R600DRnnhjV2qF%+E+pYSu|{fWPc1Se(TvDn}V{ROJA~zHcX% zxNt6A7CxOQjJguMWckR5DbY+F#bCMg^+LV8X%0_G5~U$XlLcjAsR%kEct{9NnMHM3 ze=*4{`8m#)5qbz2Q(PRHP8mmYaasx$qr8xZU@*N<+=%5L*s&$jO%NTxwQ5n15C|6< z&NWo=<|>38g+e(+H}W|K6UYckGU~fh3ewTQ-3j8%oDEKgUV?t~B;+0#;M<~5R4GS; z0h7+gs5ds6jKJa|=euEiE5|3SvP~tJgsun|p|^Xh$HRt6 zxp06_ueN%0<~vG^Pf=x~1|#e)@D$5d!6qJ=K@4q1udbC!QOn)ew=s@*^c9-4!Wjdk zvQw_Sk4#$eggQ5TAvW7jn&}C8VMq#2{l04x(l(nM-gRbC+ik`$+Yd)2T+Y1;AYO>Y z_V0jYiB`cX&E=yf)Iy<^{>S;J_&l83HFfE<%9viaTfJ^L4la3n@Br*xwCQ&H?)=c8ZmMj_T?rtWEpF+MHpizDHV}DLdi53OO|1by|Pn; zXqTlVWG@LJq7sUbO0tFQOLkf2KQpSg;!Sz`^nTyp`TgcM_dfT|+~>K^Ip;agS%pPR zktl=+%-#fsbVA!Zp+yLOJ3t^1DG3Qq{I}%7Hv}ra@cjumMa3bK;*#Rn8^k#wq7stg zq6C~0zrQPs!O0N~M`62yaE9ABB2BFk=%w$&-ezw8ga7$7jxXQ;B_OxF%t= zn>_;N=;nw<*y4}PV2-Ai2wS)?8VVB?wm13tXJFrlq`3Is&OdhQCBB`1s00)WA>f4k z=Z5_k{6C+6z=sTQp&$f-Jv=y32n#DmGzyNkLfQ%2qmV}trfAON$HC0sUo%76!maGE zm$*2WLluEVf9#AvIby%DzXq+dcSBnu?S#;9M{6(>2!!ni8AMoAMpzU~ws1*+UZ+iw-GYK4adsF33m#{jZhecutlN~FnhSEHQWOCjkd(SIzULs41xU{GbBj40w15;}5a7(g+DHkf)G63Sn;L3f_RdxX_}7 zZ@}KeBqW4_yL`US4336>zL^PoGxm}u{>pCbg)hIs_78<{MA~2{1uTQ_h_w}37(b~C z699udp^;dIV28%eIQ9*iA2H2#eW~jRdrlO&{M@M6)8f=%QhLVc1p3Y8P6-^D8)=u5MAbJrL5{VXZ zgxi^!AYHM&v@^G|5Ksi@zx%0*`cCCNpkJ8tKTU*x5Ek=)37G}{kAG7z6S$+5siUxs zy|Aqt%*7lA{Uy%70L$=yh$KYnJN}Pd5hT|5|7rl>M+`Vn5UrH|gZ~~?e#rR=z`Otm zpaqDrZyiJl5Men#{*V@+#p3AnWCsE52DUHBp3I%>OmTmXXGp?J_Quh{ z364St5I_jP)C&(J2b1C-2So#@m9Kp)KYH2^1}{L1A0hyzz>f@jEc@r?e=+@wL1CZy zBX%%0R%nEnup`{o-UjiDV&4~7PX3b+7yXL<#jx}*CMGGmM*ph;Kr4S?7QWd%|O@3BOq?Hy%BL`==>J`Ep@6_!v|a2sJe ztf=8)FNBku5O!!0Cwm(t+{{q~3K5kSfryEiT3XrRUYfg=J(dXqrbt_?q~_>|Far^B z5<)A9flU^crg+f>&t8xy3z5&2HL{ z&y(`4G`SJ`VBBThPgk|D0yXxjkS|X{xMJtY@eA7F|98K(8tz0Fd%Oq#Qjn-M+49G* znE#6}CI6WtZOpI)jHP@RI~*#*uu`DM|B3ydxYYObFCno;|EmIk&p)7l!Cyd> zAJW`qB3wUKO#Q#D9|T}OLO>b-;eKs{G=LQWW-CJ`;!8 z*#8WHF9XZ2|DxjG>3>9_Yx+5&Zp|pH>|j>5SjG(k;g%2V`}xwcnp?9~fhG2TOX+`c z{Mqc&9gd$|0e*U8xa|H9`u+Y-QcP^k|7%qMIJR=~=lLl-`60oD5Mn#9V!Hng9r*vH z?OhB@`2Q@m{#)7FBXBPdE1h8}-x2L*gAhiG{p1F4x&5D*l=%1iKPjmA8vU;Z0Mn#^ z=gRkg{6C8-zheW)4dAwOgm4fgev?NG!XAFT!6U|R@RHUxc&om_TY?cUfd=2YeTuE^ z@csp`1pgOZg8y40Y;2G?8QR9|*BwEZwf{lBxBp2UjHK|A+fgqTNMD1E8qVy{T-hCkm9ifh+H|tS=lrHzwh$? z9+seg$P)CAb9z|t=Y-(`c^rj*MFLoE{|6OaWd9SBkXobv)c_!n^q*^BmP3^lNdWH_ zBmiAN<7Xv+A9uq7VTaq0-~&OR{&A>`Kd`h5^)C++yE$@n zvRw#vp#ccZzLqk$u-{NWLcseU3|!zB`tY+Nkmw&4f&O2^681mH68k^=*B2YgFNT0G zumAhr|64**V$J@yDgexoV)uV5<_Amc{}!Rj?@;|g09Jqsr}`rY78HNDGn3C}CQGOR zudk^AS6vOrxg0jE1%ChAUQ7`2Qsm{+e~~zX6uu|57kpx38vG_=_nY;ku9p_E)`tm$(0Yum6#NtnvTV z0j%)9V*4NakMZP(EdMqk_Q@+Y`~8zA6M(k@^Z>Dy9WIFoC0=oaJ7FSRXoY^=3jLpp z_x>K1$p0g~g#F(ZZolAzh&{l*b{HInJAj*DxdDFZfc!`lTu%OjN_TE-M$rmZ|@=tm73kc1yo>*(R=vh4>E@VAs!vM*Mvl zDp7pUhueR$($xAFi?DS2mP0VSl@?u{6~lRLq*P7SjT@IED`@F{`c{} zE2;kU6a4>s`5!7Ku@?WoIskN${E2Yf??e6;YCV-MuzXoS{D);e{;uZCLeSf%LNN;t zyk=1Q)h=(t4wh;Uez+(Ong)A5UVGl%lVoA1W!asQ!Z}WG()C zRRHiO13XvG|M`CwRhC%~6u)-u!>e&1->(k%bI~uZexmqu=$CUSPR6FTLz*Fk(4s;M z&jqOhyMLAk|NR&ib`M|x*FEh11lu{NJK(xQcOI|6)o^jN;{__av%>$M2q0{yB*RF(h~ zPx>#2LxL_M1I{JU{_8vmuNQ=-|3y^qU)VMO&Y^*EL)!?Z!@sldkQ^sM{lVc1(BNm5 z5=@To9HA+`LG)9DD7N80AVe*({);WQ{@WoO(FilxUt+*A2H|Dxzu)Ko6oZJb<$qco z00RC&{%?_AM3f(LzhpvOUslY4e`{X|z&I-smQ$?z5)t}8Y6)I~{w0^t|9npHf-^4J z+c;TR+2M2heJ%p<<9)!g_TTU8KZ-#lp=M%$PV(WxUvl0@dNY#2q3{Z z+<^eRjI(gOI6qYNg50AF$o^y(gpek<0b#G85JHX!J4Ymnib^}kjH{(1d}f0X?1chrCQhuH`J ze`f|=LjDu|dHwItv4CaiU*dcEmlB0Q*XVyW0PtKn{r?{2Zye#jK>_{$Wxw}5ED`@J z`M2@E76|lzB>wlC{U1L5S88qlw>ki{|7YTV7f|K5XMG_2F6+Zu^zXkr`gZ{h{ zpQf^ZFDw!NA@!s94^t%E2H|M>oAbXdivL=x|Fud04E=`uZ$Czr-&p#~;TvSN^=y#0so(%4WD9u|7yZs z2k@9_WoL$P#R`bH%U`#A8ymckFF0XMX#6(_ji1rxYoT%7S17b5H~vRp3H`6wV*T$Y zi`u7^9-rLrKUV(-r~j3Nh_2QDSrzy#^?!bhD!;M*j~iYIObH@%!=1T)K6Cv>7eKkD z3;089onskn_?ov9V_)nVPygevnEy*kFOmNdH)Up@?r{9o3gFA}f2hRw^*!AT%mRf#phZDc_?`TxvoGz?Z`z?;%?tjYI)K`WDujRA z&2MXj`w{|P|G*n^%g;aUNA94_3(+tCvjY@h{4(R~!RzpoNs2%Jasm43g6O9UYmT75 z9hS)dvxNNreg2VkUJ(p1;gx+LfJy)W$V{y4;3zlR1#3>qn%ZyG)qY&dvg{0_bk z1y}(vKyGDgfn%s38h}KA2+Q)nG<;>*$6vs$1@UWZ!K$wX%zujzUoQc`U&yhx2>el4 zBK})u3I31&`jW%p=S%|2bH~|4aIBy>cBa+YeD?8SU#&MD}vke$Mi=b0vinz70nHKDDLGABueDdb?oR z|7U~xRAHF_pSlW{68!r*5dWFsEnnDqErHX25iAk^A^xNIkN*Jwhe$!b%m0Vv|59uI zzpDa3De*t&|9^)n%lducvl}~p$!_e3&u;AaC8;;|XmOE<`Gplh7tmNyQs6J$`&7)p z5{`nKqOsk=b5bgNcgVmbxX$3upr6j5P=CVTU@7^@zWgkEh5S?Yx`h2-a=H4izsdlX zp?@fjUcRsYx|aWGbpV(n|8s>{(Eu*4A76C!uac_^Euw$5h=SArUVwT5Jz?f3oJ~m- zM32AxT`Rx^tozi04-upLlr7-vMy{R(2BHn@TajPolJ(6+KXDJ7FbgKd_ZsR=xEht! zf1E+RaY54jtz*U4A6uo-{jl5^*92~K(BC^cG5kz2<7Sc`1Oh(K=H~I^2L0L0&kL~J{vRs-z5P#0OmdC? zuL=OMq=5H7$p0+x^SH9iV!*vbE#JjipT|CX{i}XU@?T}0`Sp6lMEr!`sRlv_|5a6y zxjGm4xEi3eBB6J2PM(EYX@n+=v?{@*aooYL#e04a%gKKdq7vWne<)O9P5xUI z04!D>|3&*fp8SyGHxm9aL31xwto$sHF#z9+jSF?c2?6eJMY@f^V$qX{kPGLqfENUD zzv3kP?++eZ!v9}vDgS>f?B4yeOZV^2|1ZAC{v$30S&RQ(6#(XbL;nB2MU~$n0&WBN zapoT@Tb#^ggEYne&u8<`cdcIuh5~Dq0sd@dfW=7hjcmApAZxPWABM&JABXt}GjX^i z)I`EmTued+Ap=L4Nr_9C!$n19q~J0LI7ArBGlebOfASeWJ>@X(2ND(j zQxVL4ioxgT8ym^DUS)U!U8lEK&zrVCO@2adETazjLi0JM`s`Ri+CD-~9=^L#yLXs` z?@l}TD(`)ywefvsJ3kgr=}=?OgzE;39CO^U>hngEj*gDjm2;sjIgO2S17R=v!kSAh zbPi|}KEu5Bot2wLPrOJ{Rl3*MJYa(yvMGHU7#-b|HX!#vIi*@*-lARpj`s|FC}B2-SQeP+=m$yr=U<5Revk z$1BS$LG|z!SJPekz9A0bG-q`Kdn=C-Idz;B4^S0M;;DOXSOzO4C@%LM0{f4>3-xiMdOx_yg(|*Zf)H*p+WOeM|jLF=yBIABc-xy3m zFQ;|mV7qyuZ&O*!={RO_xhKk-Z4&N1f36t$zK&Z?-zuUubup|>RtTRp~@_YDX8k% zBwee9!t)n;_fLKln%o-gnQ-vtq-%K{u`3m+#z^>q>roeogB5eGr))a~e{xa!o;H!0 z=grFFhYUq~n+24T&*y$5Zy!v1kULS|o$O(a-UCZ>?NT7Yz{))Zr^7mm2Ga6fWaSzU z9TJ=#+Vuv5633h#;b48zI6BfYQ8l4D?|~eNeZJ!`LBU1MAT?i3F|e{;t!8#49pO&N zj|bC^yAQQ?WJ!!a^V~JPW!<^Bj6=Kl^xdn^0Zo&`lMu>Q%!9oby9D-QCXmSjyzY;V zALzpL&Uy}YVeBkMt6oktYgjnVdunxIQtv&o+v3KJc%H$@R_IMp_|AQYC;nQ4OL_Rz~inKo33hrq+ zK6~gzU}+dPOZ+tfzBy@*Jt_xE^nDeT?Th?clxq48pwm4W>1)KdX(k7&c$>AxYx}C4XWE<6o)uCvw5#4on5d0B zFoQw9n{9bxybU9lGKwjT!nnMhE~;<1@7OhH{yHz~mEF)_s&g6nup8)bZ>%AvvEl7u zX-tlbeiz1LI*N6>f~@PYvHCXO<`0F2H#h+Cz@%gz)Ln`jy4X zdwlG?5000uAo}Q{FvTSF_>tD}H@WFC;~|YZ?MqGfx0PM5l-{CieQf{XbVklC+}e@H z5{YLT=R=Suw#BTkGrX}e@_iN@l`d(&N2-E9cxJj!>;9eWn^wj~)OE)W#tF|vf7I0*zW&tlZPb(w3g9CK?SI_p)jl z4)(d8XN@l#o<4*Kq{Ogz%vE!^MQ4r_9l4dH>HO%Zr_fl-A-Q97vhwqCa^7@u6kD8O{FoR@cx@^yI+_E7xs_9x6@;0xpTY>t4_UNhPRzEv zJUlB^PTGMj=7T~CDqkglr~V+tcn?p*Dc)m&uJJY2R0`#r8n$J(h_CVQFm4#nYXhrX$p*y4NVTd zKYJpw>*kz%Z;{&Aoyk7TF@@@6{&MtA5x!diT$qmnKA>S(&v~w zF$cSkIpJZQbJJPUrA54c(naoyIw`EcZS+INe1@l;OIVds*3f-Sjud8I!SAl;Cf^x_ zF0vVnk<{yyvt0W|`=cn`#tn}jh^_D9nA@B>sE?UBDu6w+7&k28I5#`%J3C7=KfTUv ze&6)8X0u$;g;>=S^E*$>lVfK6&&}MJo#mUJ7Mz~8p1#@9#nI8_`NAw8_N23&v35kH zBVZ&LR;kIOfXO^qhWo>bY0cU8SFZCM#-141!Xu}nFp1=RG=s;{g@f%ExhSICe7r>{ zrWA`s3=OAX1w;Bi#l2Y{Q@5v7w>+`v#AJ_P4xYrkZtSti)+Z?DC<*Mx(2P8|A$;OC zgVCYVTICJ(#x{)ByWA;PCw<>~1Asl@+ zM^dv9mrlnyvR#;tXR>tC)@w(3nwI(>vO80>t)Q&voS}H`R^Qh8tgcv7GfJ5;@<2^k z^2MoYrS0jG>1gLYF!}ASANMxVz@oO>G_{EgPExZgq#t*h?d-9rj$!ABI>GBi8k@A= z?~EVD!u@I`RKT1*Pj&9T;@Ga!v=lK#uE}u@^|G(dN1kp^s_li%KRR*NYzJVKd{FE> z?;Pq*u!3>ltBn|)ZYqr@2U0U$*h_=^9P4Abt={^)M<3wP4r-E)kfq%>(prD2aWxSld z#acHb@X|EO+vZF+G#Ar9wQo+DCb;lkkIcf2oP3>xCKCCLD_WFv{ znLG-*eTH`(YrGO%&XhG<>u}5;Ezb<93a76uca7quO7I_|%S%FOakmFS_9s%RslifI zPBA6PJcW$8ld#=*w}Su?VWHJCMnq9^8aNdnR8e`mC(bxh_b^!f_5*)#qV@qY@@fva zf@QdjWM_9zPuplBd6+r3R z^Ya!rFw-8dFg61Nc4^KdfvEXOca;meg~rk`bGkE_gi%lC`Su9_Gfn&slQPrNQZk41 z@UTE;6w=utkvTce`u&*FHcb18u$_A(PbAM_O5YXbG)C*qPO8r1)@1?A%xqDeF&hB~ z7e?7jkPWGvA3a}n#KXEP{XR>NE7HS)DZ9~SGA>{C4Hdl1ud8JaJ>r>|6+FcuIPLie zqd$w0AMr%zciRMdpy z9*oNY0xb?G#`A>haBDf-;9PxJHU=4iacPuuobg0v6;@!zjJHpAUD$5 zd~1Z(plV71lTr6=fo>taPPaF@-QAOCo?j{76;kWncrK#5=aQMgmQnisUi{Uuy3xj# zPR>fraTisboEb8!<7C~2^J)!WC|^Q6Ee#p;(!Lxo_Q=@%tk1DdrH+1;Eh>;$>3fe4 zTTb2AQgKSreZ*b)+*Vj;kGRvo?IDEj7#-6d(RI(mHdPD{pi;@p?Uhd5=Ce9~dVlo? zt?)_fQ+dxe>nUD-;q5Qg)`%RxS|YVip8vVOXgOs1u168&{zTp>6Rl832f1ft_ozIn z1M+1tSXm%ql*7Rb`%UgKPxq=%^!iL+G*L5ZerV7(r)$jf%AtImY;o-6%a=Y7UHPZY zH`-&0hG%vTKa4tYKut@zxyPj>u|-g3j=?POio(uefUWUE|HDyG9dmq7>Zz*P?%fJ3 zd}E|aYE(|%iUctjNqVCBQBz9Y?Piomj5=INu6)!rrGNJEp0g25NJ%v{us2DE-qDLW zW54AUKZgEIs_b?ADX*11quz_zQEn!rXB&JTSWxS&53}5?^UYk-m4BE&{b#ZYLqpt0Bwct(-zr05~W~f$Zm~yYSsc35HF(l#J!{U zx=47BGI?CltP(LBv?3GVlX`mewwhV5jMsyzcdY7OoD6yiay)4?60Kz+;&WtXK@LRZ zjHm9GfI*Q_4jUe%QlXhh_?f94S(%@aKJkF0Lj%bY7_)e?;hek4bo8!iN0kPcUTxP@ zbRwAhknc0lVW^&7Xet4|!^=n*nM@j;*&kRR-Ld%sYEQ9x<~}Rb&H8d_0pTmX zB!G#%YE8*D_gk_;SIL-&%Z_e)?w-otm&Ezt9OK8D55W-~`r!&^302cwr4LzM%oR(0 zxywL)PPRnvDA_sv!`ZoT2CsUK>nVHRdB?Q&n-_S!vEjJ9wM!wR-0fa0{Cd3= zFFuZS*7$C|dY9{g7rnb6Ukz9zRMD5@%A-3TXSY+-NN0%qOh0Z#z9kml&0WY;7F#j3 zYus?V|2TOK)6oEv+@}R6?-ZH3^XN>5!Tg*v&E5SA+-lzLeY(Sp_Y~d3duml;yHLdP zWWC;uqO#V0*Q9thRLIApnq70Zo)wQk=ojzZ8t%G5{*L17U9&;^6tiX7$etL&S=~Kj z8B``_DZ5+^%W|(8&}?qKm3i6W{o6BcVtX!RgEsF}(|s>h>2lN?SMgdj90jGN%lKYO3K=?1^Cv6?wshEE>^|H2jJr&ano~`Wun;xV*L^QEO z1}^s$p9{?lCgw6QXuJG|qk4jT%ZozfkjEzFOY-!_uE6@}O_+=8$ue}(o}145e59lU zm9mR)Ip)MqR8`G;?WwAITFQD7kRvoAGT7vA_Uy=^Hh+-hBQ>^EQ5qkr{+H{GrrWpQp^;A!pscuu<9jK zbT&yLBP}fM#5!IJ350FqndqD(m3j6o+VEwdzht0iz{JG9j)b%;a=XbRn~?4#$KI)C zB|H>n-rLrUQrQ+a+j)TK?rZ+!3F7Xnwj(*`yd-9AbsZx4=JKVGnKcabCCWRP?x;TO zx+ObXyY==N#QQmIITr)Xvd@;DUA^*8hZVa5=~73k?H_NrAw-?vtQC=2tSxxVAeT2OCo2AcdJsB2 zw3JqZU)lM(Ax+C$SNWOHeBQqN=kip7 zYOi6dtFBp;+qE&X)x*`M=lZ-0Z{$|b?l<#!#|{zCc*pX3zm?m`^;P~Aa92I{F39z% zi$u-kL=o5IjMm-L&o*l*-KCBQm%W}>yZ@L#1Z0flGUQkYh+Ladqw>VLXA{-kdpQVc zNZflj^!31BzTX55zbzHuNXa|fZ>t)09y3{i@i>K1o*5LF8zN7|2*%wEj2wO?K+qD0 zX>4wMd*u~oz$RlD)|@h*ard3QS`p{@hohFg!j}>DA>c4!iTATU`Q>-wgEtCV93!pu z8=Npfj#7D{g=!K% zP}J1g)TSl94IVc(sPvjR=}h5~IWX~N)jY-x8VP%o^UM<%%UerK+|OOopiCyoQ@LZH zOYugWLPXmt98S*@VOtwwtrp4O|4>ht`?b`Ce8aanj8GDl2i6x;67r5Xs(>(Hyqx0|#@nuWltzduLRve)T!3EP;zLT-#Fp zc1JaxN8ZkYm=d7untK~PiOsYgV!O$P^`yrRQiIan9dx{+T0TZUXO`bG5O?K98p`c# zxm8b!TE!Tzb!L*qtWRq*H)5j>Up#Ydp$cK0_PxUfouSwCUe@a}()m38pewthjg*$) z%)Y2Iw@JI$EI?jgB_~AAJsq6}zaNxpZpre`OASFdD6N0hHn;Ddb@T@%mqeYc z?VWeG4n$cV(K{JmTz#f40VSjVSaFvI55?|BqZI10q`CVopRX5-F>OT*lUMSz@!mXY zVT+XAecNtG@F2}p_O7Dz%_&~7GvWqjm8ioaAub_orFthQZFO4q%n2Olu$tO%F{v&+ zm60ks`LQ%v;(GS2Nk{Be-|}Ye>vmER0u|lqJ-qv^qWWIem-qC#kLp}?cOpSQvhkV_ zptfNG6yq8QRO+iTCHY+udedA14~!R$LaJ2vOs^oAiK$K_Ep( z`jo;Z+m1LhAKzpe395)|z2o+<3HRhiJ?lbtfs^iq62=jttT}q7xf4e3$7hUbG&_xl zLP}6@rt~xq(g9(6dR=u2^^F(@BJ7GLwlb-kcVv8e@tc(Z49&cm|RyLpW&G8sH zB7ur2Qsnu#^BOW~cv35MhMI%lS;sM)N3MZ;bMe#C88&}D48eMG&LOq}S<3nbqv;kf z`i;k|@L zFEqXP&j(ME9ZtBXEi=_*7}g<5OHm#XakHGMGbsNGCbgm)5P5&{NTfxYLD=3#ZSLHx z?xPAP)6v|#;YlD43MsPi(Z}1)Cg~Q-f$zP)8cQr!z^`Tq;I5&czSLB@QWb02AipApDK z9w6*H!g8Q3O1d>6EM`x0a^AIT9XFhKO2pKuobL@XHtCYzu^$meCtf<;0~n3QOzbn{ z*1Jnn18s}T3=J51x?QE=pmyesP2R<@Yh~1THeZjcx$Y4lEWeA(FfpG0Ns*R^9}HmV za|?KMaG|`SZuZ#Y z@!0MlVIl}(Jh`pGvuJRaJ4-9~48u#=D)M5P-nYa6!Fk(E9v9+l^0OYI$1VU6jUc1ykq9W(aLyB;9fUtyDpF%CA+wC;c00^MVIX2-=O#VfjQ zDSizlAE4*OsWsTsvI1ytrC;e_I7zMcI9&T3B=ufWYM#u2J*d!lKX&;iyoJ=RFH8rn z`kkHv`M`E|LpDges4f=q-t{Mr zKh!`yI^9=Lu;0#}yn}q}Yre1{n;iC*0fLmF>7e$C-RVy!PqGp{&bu+e&)&(*wsmF( zt=h~r$G7#|RL)_!x}u9hBdP`3!F|ECTTG^v&K?a*1}Zn?Z+z^>&eARpJ~Nc+!8|RR zu6B+I;}bDE)GuRAe|onWJk$O?2eXoDbR5gvAsUZePhu)*JtTOtD*~+0!h^gHsis{B zZR5D(+uLsPL?}uX@n?rJr5>$sklAIe98XYO==CPsLQ4poE^^&e)HBu3W-bWTYa6W4zFzv` z$X&M3HZrIQ?~bE(KKYXtj0wH{{dX>PXJtjcdU}HPjPhYq0>|qf?y13u|^v1`2s40nL zLjMH9$lN2^3H;Wzc8|*5(W?%MLYR57F6eW=$eif+)0>+VucfQq8xnQGv#uuRTt&>) zr<~Wt3YxO`ibVsSZVIMTOVASD&}=DS?Wmldt{EFm~!$4)Zn0~N5@go zrsTzx-IpS}wH_Lrdv@qXRRxJl{dQUATO#O3ay*rZ4_OTkB=2CjUwcP{@ACMWFemUc zRR%)M*4_GnrJH0Kht686H8EOjb(QwT{zu`F{t7O5!&0s)1sIDkbyCrVwDpTayM`!j> zX->#;#YO4*jXxdjpFY=Y|4!uLuHqgD^GW(}{d4Ts;w3}wO*a<61n$?Lxh5#6qHXOV z=olIowO?$MloYw2fBxLyRc|)8kNpqCq!r2u@+X)ZA+ddgyic`gv^ix)5>jX9z+@&m zW__v+S+$t-v7(^_OjA?SVHvOExgTNDr0$@i`OQZZTT(FtcP8&L&KAiYN|~yjOu+Dv zLk#WuK02ASt=ply!<#4fz;xxvrpGTk>AT45Z?z!NYH15GC(iiPzI5P z>F8RW-MJB!6cKU-74z@Xa((d|F8;HBXTu;r!bj_Ua zC}Zs0hoi&Yhz8Fw)Wj4zf81@xn7JsZY_7k2u%@l9K|h1t?t~L+=tEX@OjHq5;cR-* zIErkX>SH-!f#*>0yoE?scYT%1)L{F?N%Ofh4=YSfA9~n!@VuwPi8s^ju|@9V=+OY@ zz9DC0J9f7F_oq-}w^^T3D=7!k@XggUJrlu<9eX>}f6T>J{t8WEO=V&a=S)!Vv`Jss zmV&eFY|ZL%HI>Nr8S-g;KDmZ=l8?>PCN{m(?=&YLKYzcKy6x9(?5E;pBhNKJD}_$62|_x=i>F?loN@mp+!x?@9+D{99yrDGSNC;n2PDP8|h4W z)iRekSw}fJ)4b(rOMi;OafkUwDbXsPebakp`3rrVWHGZf!R7i{1EXh$gztMC!!)O0 zdwl!!5K{BVX{*`p@{ZAq8GNssYf3*}vV3OzqN`8$@zln2+pauAi|HPWi!OV}o1P;t z?w>S19=@$IIX`R&b4%XUZ_a&sI7PX~+_R70P4Z)J9HyZTJw<9I4e``cWpzin)@?e=i>&^dvjES98uljNLaB z?~WHU?eMuhCU7*i!->xK>DB#F@u<_l9WHo3ITBtY%XG`3YDl=&lla8_c#7gEE#3f? z({I?c4>`Jmi>@na2Y63fit}4QZiin(GJ5A$ozzdL?4R9!e&_8X_DBuWh^^N~lX6AD zoGEF_E!&|nd%d{0OdxioviHUEt~!C@i_mw|leb8o3>wFf#gjz^QXZ1e6j4-o)7Sr^ z8QkTtPxb}Wk#MMAjChKnnXK)$xH+57ULrSoJ6c1XY%;J}Qd%8 z)_L!HVIQAvBGkP)ek6H|4eLFNcT}1ju}R)Air&p;M6RbjVZF=`&T459maS(o5T!bP zE<1c)n7O&ZkO_U^bn_Js<^riY^9ToZs*sX=lU-7po5%gcgB$YBlAb3J=2 zQy-ucc9=4eQrjB9syf;Q2^vfM{{=O2Hy^!G52idyOSl)TAu7x-*Nhcyawe4(sm)P zEQ9x#Hl=U5veT8u_-@HG%f2Y8Q=9ZVk~LdN`QD@GHUy9!Jxn}hr^8)ORR|mJ3)<#+ zgXO+gZMuMo&)1M5}Eoc~V`anp%lk$LSPJE9mw97&mi!Cu@g4gbPfq%{Tb+ zdGN#Y1`!3~MVF^&Q(CjL%B?)Zi|vb9=rv7Pi8QFB4wa7DZQ_TPWG;8EHhGhIgERut|B!X7`EgqtDN$Dg@0h^DB;2Iy zVRY|=#!Lk6h_Rl3d-0L~@bN3xnhdgL$c3TstRuT1{U&4~_vXxG-}?$k)aRVNo%|>= zD*6M7KM`LhZLsa})>B?5r=<(7pAgS|!DL(_+OXrCvF_c|^n$!{yEn;FdfUBgX*lNM z98i5oMe=Elv744>MT~}heokx1EK^w@M1AW;_@TS*lIF1)X!EC~+6Uj8@V--gJX@X^ z@!(AE^PWo@8C(_`-5MU-)2}tXDY-rMu!M>H<@NEsv}f)Rknm>+frz`bLiRRt=D(SC z%Jt%}lMD46xn=5_tTw*W9_5OeZnGNdd2n`Dy`FXR(~Qd&VKE9G4mRwycQRzi=M#6# zm~WI1I^X{GUTLOF18T5qcKd}#p={v%=ePFs%2+Fw9@z1C5BKG#wiAS6JA!WeK0EcS zO&GH~wc%}8Opno|bwV$hkmD;3CpyiRbSdS&mdx{qlCSnYxwM{~nI)^UeB)T6wFkW_ zy`rZ3O9Ptqmy3DwwUM>R(B#?OY+@8UqUbhd9)EkqRy0tvVMw^@6qRFh5tsGp*Ra!} z+ZZpl%H|ud>&%3a-~W*I{#LzW;ag4<-)7p--S^&hObE2PziK_XPVipb&gX_R&*w8W z-lp=Sf-1Mh#hdAGD{%)UROGYdLAIWHt3$$B0heapyk)Oc)9%7$dJMi82hBljz zYESD6dlCc(dZZXPAB1*nx~mL<^OT(!x!vmUSR`;;LeS9t8ys*M3G);8 z45%oe)ii}qXYtUON#`#V@x~mA|nT|KJhXx2YFfw#zMUZay-)3dE zS3Ubl!OJTZ9&o!$`(U*1&H1X@k?Wb9=mPH>n>sqn&np^BNu72o8vGzWzb_@4rJu(1 zI@t;T28(Eyfb8y!p)T__^+}IclTy}|uE|^8j4AaboxbI;cWgK(D2wzp`$T70MCjJ<+SDFsaGLfd6O*O1N>9X@xW}*R#&(~-d~?$^KB2TbBn$)3Wv`>i zK)^{cV$0yy8oucjNgRi0grupjOM^M&9BiOdr_UEtR(U;Y)sE0b(S;n{oGz2!*mfvD z$+(_4dZ*NA?KH@(Wb3nQBBx*+uAzK_89USsczb}(3aa#r`h&t_`umulJ*slrGjhU* zMg#t#q%={)Lxd)#T7{e5-*xV;zhD*JqnbWx1Y_}eos=Eo`>Nezd?w#@M^A8`XH%>} z`8C!s(chFq(jkw6=!!7Tr%t+@hiAS%Ezj^)Yp>6TiPp?K-8+ULeYtS!yzxwKYna~* zDRoKSndTa`$BkmJYW4ZI3bz?D9CGios`N*@eC`ULZD-Y`FK(4kWQ2e*o9*Rb*^S#s!TwzL5>Oq2 z*_+xO!W;WEB$>U{@^@Ym?&x5;cwp$AB7{mYy%N5m%_+(QO(xRj4ZVpvnr8qeYBTFv zuaCMeaHpB++K|O9xB&O@48hU-EcW1r*v>s8Y#%k>N>f7DHMa`s2*nLWcoS$4atG+L zv2xt(LcI*%?)PBM^1}04Q4oi&CZE0TF1~PP31yI={k7xLMC2EHPP5gC7?nLr%s<86 zW#)U^+k?KDpj5>6A(6A!5SiAs#P`n6F4EZuZxU@S-qGKj+QfV4eEqYwQ#I(x6q&T` z;?_bgjPaX-$@U2Q?K)?okxth>t0+5hLpsu|vPXG~vhDEh>2VpQV2PG9hGzbloD$5T zrU}efkn}+7W!>Xe07dIx0$vwJJ+3o$3`k{n* zW|zKCftmnHK()VAe4-oToKV60S9ye;MjPD&Un3lX20@WXE9wx?jrF7+7BBb2Wn4QF zv7bP+zT?iEFWQGlz`2_Cpf_P(xcZwNz9erTzT7ocoRN+wDP0bsDRo2c2MPB=Hn=p; zXR)1}W*Oy?Ru-?L3!XGA~&!!Gg zF(%7tY`%NMmEWjAZ#yJ!2S2~`NL(V(0so856jFP6x(|}x4n_vws*zBPE0j(W@A4|r zvVCmUbGk9=QX=P_fik0N(U+q{>O#F|Hd;Jbe`4c~m`l4XJYlmNnAi%^H!$t=zVmQj zHHC7OJ7LUI^AP!(d=0@}!{`q2VKZ~-L%uEv{4n~wUjJDxqd+$Sckzvfhtke8oX5Pq z=JtWrC2v>A&?_Y|Ig2q%TUgrob(6GH>V<|bM_ijx=tB68jotKTEvDX;w>@|l{2DS9-$aiTJoX6}O z!E^@l3XG=m|VYkBW%;bMmwA|f{E!8EVK(CBGi;L!I}pcov5^|mQ0!6^M` zx1B$DJKgbN(XI>(m-4ntIt6B0Tj*eW=#_Xs(A{twdMZ0*a!)Z-S=w#bEs5ym{HgZ! z$%?ejDGdHyuO6{$3x(#fACcAZwie+#p2B9G?0R9(b+fAl8A>$4cT|`mQIr9!PKy5SWHeZyVJ%Vu+;Sg7sKa&zJnl0owPT@mr@mlGXJ|Y!hKF zuOnBt%+t67b9s-f2uwUI5RAcui8sxXPTamiEzDIRdElI68ISDq19jUn8(6wV5A5nJ zjpw(Wx>qh^wTnYWmv^Tp%@!Z)v(e<0r7Z{#7z<`zw<4TQ%uMQZ-$NY=H|v%!?Zmc;dN4OkOE>vmd|3 zpyG8=W8Yk825YKYUbV56507zFuY>o^ort99rVA`W&g|i1Wz((^N(>t<_HM6l@Uow< zA9`8Tgce+Jh$-e3ISiNA2 zW#il%iII?x>iXH%;j#(3TG!QqhpG?vN6rn9zMG0Fk3kLHRdH;w%FQ zF>e~#V44ec-Nebaj~yCPb9g*Gn5-VdbovBu^)$cStB|U6!XZ-iXmd##ARP1n6G)J?MGWD47SZx@l?Ch@J?y^A?-A37g(jp+2w-9(b5pEOV1vQoQhaPKnbQ+59b8&pC!)N3mgMP%Ax!&!))@0_14c?Qrxki`_R)-;9QSnxxL3o|-yGXN6B0`8YV zgT0%TV~F~8B>RxszSb2TB`$rTxck{%QJ?#ps0tzoOzqE;oPVb1uqlyM1EA(HFKFOZ zg^^qeII^uXz6F)yV|;;CkG`6RBkl}W+&)=V%01iTgc?(wTu!U#20guMKw-D;kjxR| zY)ZBWtun1>dC`~tE>GaZrSE4YT%2WHWb<9(s+uevkx7$dP2TtA-m=&=Gxu6fRvpQ2 zY6)?cni-V1R~!;2>hE0=yadrP}#cS3JHsj`J$t%cppSa8>=V3hpU>C3yv!WZn;Z!wjeyJ zD*OrJ%C+sX{Q+CycWz2nZ)w;Uxw}P0hkUzE5B6zl{-JA-jq);KDkEIV8y>JpV&EADH<+`PQluFF7gdT*p!`a)!(!4Yn^XvN0k|#IC#`%jtl@ zDUwdR1n+AIFxu4CnAT9|!{6M3Lc|)4!(=-k(~2X4~{=`^h?;M>s-k#kVw`g z5RoFq7d~hm7-w}W0sJClgv*3)qK%u4_k{&*`_!ceVkrj7(;YG9Mx3A{w8XUUQ*J_b zhDg^2w+5739l6(bHH*{6EcC*VX!wS0Vq=6Onu@JTiFpJ<_5(XM4ZlAbC~$v*_dxE@ z5xC)96Q=bsu2V-N)YomZ7ap^m_cOgoXBynJMYDv(!L_0rbeQi1v*;}mx;AR7vB$z2 zTuzb&Z9I9p2Xa(ipwXzO6A2CnKOLEA5U#&WOx~mVW>43U*BaOs}OqB_mt{R zJxitJUwe69Y`+9Hs5;PqKzs_;TS_0+o}8yb~ypE zN2#ag(=ty;6X`#iC(QUi04_k$zrh{-P6^LxWZku6P2TeG?%H7la@gAX`pRCg^8Z-b z|Nar|e|wwl&CcFxKYx(+KkqL2e*8Z=d!6=z{jamPvj4p=`yXm5C?#P~xAz(UNR=Wa z7^2sZYD@B3I!y_R$1KoUx!=I2SYam1W0UF5CfOiK-Kdpg zxLhnHu;iRx2LKfoP(>2>y|Hegl)Ez} zaGT1Hg+--Q3uLd-WrRJ$l(6>@@bTJ|^L>2E!RD;+O3EPOu9mFQkfcZM4r8!~a?ZmJ zllq;uCc<|y_Tj2Nk-%s2ckQv&Z{GIjpnOeyxKT&a&6wBHS*ND@7Krzh;xbd56rQKd zB63?K@o_}}r$ipUu8_XvdmL&F)9OMl;t9u@>(^rnsy2c?+h(2VCIZ=XJjSJE{Ikee zsVoj}k|7*e1h+4~)3c1sFw9;2s{tkI2#u~p5O}Q(a#)9Qpd0X3J?ZBe&z`ap#&;zyKuUy~p7r?>lThM2t17eCDo41}T-U))~Q; z!~Q@NyH8|Q>4I74vD}atNC=JEa5J{v-saNg!^QHo9FZi^7L02Ac{`cpY_^<&HRnta z^rAs-#hrY1Hn*^NLtB8_!y#JKvgjJqoLv&EPscrE9$mW!8guP5EkHom-!u(I<}SPK z_4P*7jn)?y*^x%qHFWKQzvYU>S3E{%s}HjKHQdxXO|{ij+fB72iXn?a$}b|`=t}-y z$^U<;{O{s_x7v4B{(m2){0|~f&xO(a7`K2Q?El@_+(i7hmHfZb|E&1``{Vy!{LkIZ z?K>;}|H1PAkuJ`4uY@b)PtX5hv$xxe{C}1I`Mv3XFb3F!>3U1Q9|T9}%}hQQ*|~ax zPt*xK30gPjfUo$|(`zP}u<9rW(MqqQeng4B1I(MCnvGgt?kjd67V;*bW+{ zm!yv}?f@oBnoR@!0G+o8elGT=0XmELZ`H*J^&Y4a!Bj(>X@)%ojT9AlY5#05CF_yc z{m8a?t}`umOyj#`^O%k}A6lA>lFBC6`rto}@gF;WDKY>739VfxOI&gSq_8PYY-je#kTa3nBRNHoR12 zdhQDcW{Jx&4BDwoIQK6#}oz1`q`l-DRE8jG&Qi{GFUYv0!%I1DqX{p-zry!4|-ihQ%KHdJT* zo905vrRDa$f=dfDEpD02(X)&Yt#OtT!w{GPQDuV+0|$X>AxV~7=qP0uLzl;gHGAZj zMl6O?m6T|dAF-nq=?oFr8k!tjOfq!7G!FbD4HeJ)8K+7lNe*THBS)B}4&2`JC4St& z4X*80AM^D$^!M}vJ5A0&UYqOccWRS{F!!WGPxd{Rq5Bsacpt_ba2gGzc{(YB7CAsi zMG;Z*g>n>;t0Pciwyd}~HB)(V^_}Um=`}^kLTiY?qPMw+T&}g&}@0bvsdD*-`4w6tOo=cR+$Y_um zYomqdafQ)LoHx^OzR*h-!p_WM1b|}LYlh&cH0@Ps^N6C9DDQwhYQ3JCTpvg)6j4C< zs?1Y|3Fit}+~C+?PnviOXT5IovQD4IXIWe@7hE;xi7Ihz!lTN$Q~s5l6HR{JqUV(H znU;|}mxt^}#3kSr;{e6y3>rHmOMwMKvCc{!+N3Z{dmc%iXPDwBwqgP$HIJww&w)GQ zGu3%mGjQ@JYTL^qi?*}U^VN#PUkjK*PKygQ`ND#G^CG9r4U&i|!rbZuLa`lkesj(t zD%r!)B^(~0D&06ijx`1fh%;MMa5_L_|3%EP4<61f+JX|sCKuPPQS>?)O-3#^76t$U zp9EqW%{c=*Nw#N3#plJf#MHzoV4CYi75hMvUFoJXf(W858@toQjLba~)>9J;x|Rgp zp@lB2uAd8Meb-bje{;oM+r+XCcNf2s1Kl;-d6#B8KVq}87x~ckxp7zKp?*rsx4xh0 z@x*dX3W3beHJ(zItWTfQy;1MxWF|^(eVw9OX$ylt}j2ipf`|fjE6q z;3_QV{Qb+QP;<`y%iZxPPAPaxkszTumoNeht*?2j$8R+j7x9KwvKM#aU+%*2iR(=5 zuIj>5H(M^kqUQn*YOQ-=pqv??OE)*Jv9Ydh0}a8)%~QQQMp~wK>*8&_U_Diwh-r4V zY&r(Q){d=1wwG}|4ByR(c)0dl*2B}LJeJi6!?pEVaBOGOCd->&B#%D0=GXoo-j+3# z_j>+N;~G9#=jE0CXJ!9c;{Us|+g|zqewg+jA2##H@d18|{b#eYyEC`{_jWf|_W$>0 z|2gqiJgA#<9=r4~ct0pSj92TNc`quH!5l0s%Jpz@36)+gE$21ml1(dl69}^>g-)i<~v_1G?}H zsYy0c&Cid`Rxj7LfWko0hL&W5bb>2XOD*JKB!J8=i)g>O*W@t7dm!Icq;qVdd$*o0 z$)(f`Ftw+yL??Y+F?IC7)WMpn7e{cb%g~4<*^8i+a7n+tZc?D2H}cvjmi4(>A~hc{ z{1p)bZWI)8gF!w{XafPUyBf{vuzG@_t~hj&qiRieMKf?j8eQ067Pss7!GC|tCqO#^ zjCLy7w#b_3>(HDBe=QCXwY0pRs28aLE7x{7d*0*f4^j>5K8mC-ltR zDE!DyGCD|#aicRpKqQdT7 zJ>Xr-_p`iDDldt1jR{;}P!U~XR_}~W^!H)td8#+)4`4@1SA$SJ0cijY!3OPx=U*@{ zIBRVaZrqe~7FW(?gfqSJNy$xb83wO3YlUS6N^SE7C*RRluqn-W#_Y5*1LCP?HckgY zG{06b-r(%){zU>?!|n(Q@MW4W{H(te*NpX!CTW$lBqtqe{3hcj>+!j!8eI5{Rf>FC zk;6c)N?6(`wt59h%v&2k;H%N$1!@uXZY~ktJI8Ze7q@XLvGIy|Id&2=04ltP$0l4p z^ujx)+CrG1wh*XCY#>kZjnm1P!3#WcLoH#Gze6M$XmpHm#F(eJA;B9-WoXdQc#;9n z)$2h%hP%6HPFxF(wP)P3d-vC1(%W#UuX^0sF6qn$U5uNqMPgKKKhz^1*OX-WxIxh# zO|?eWXCG>fIFI27#A51s^qBmY^FpGIkIC%oh91apv`(A zk8{yN2wH{qS9Bdt2ZK=Al=A^a95RH`t{@i@ zMCdXAOlN1==GhtjY~xQtbb*$$(8544@L{GgPQ^?+A`D=cF9cQqD>0egDdl%b#(=>E zs`a@0(sKuT24XJJ1e}v3Y~{*K1ntR|h%ig?fFn+zrj8=+5GQe$BhGY`M+MAoATxLL zpav^pPl&}6jU*R)XqOZ1vcHpbi{nF9iGAUYOD|Az^~FDK9oR%^Gfpl&$xP(y4^GMK>!F&2to0Wrd#HO2Gp`~gME#lPC)V*qMjfG5B?Fw;sG_c z(U`h>cBkc=udS-x;;Pqbo6_y;xvdGcPinjKO9@^ya#T%N z7cK1%)ysN=?QX5B@9TfR@j0tu4xKu4@H$4MoFV>Lt!o%ONQ`m*c7fYJv$1~$pwO`A z(9uDY_=CH=eqxv~nYI{~FGo8wou+jz3|wBL$xp0Qa}W8hS^*P?QoMzd_=F&<>JZKS zHjb?}8uoF5+i|L8LD+4~0{x{kFOw^skKUs>a>M!3aqk_dZVBmm#3QVJ1Z=RWa(L!1 zWmGrMav7-Ndg3AuMqN`2L}rbMKakiKhe|ZJ^y|MM#%=ZaTi5?@E$aWyr6-R-V>o` z5WU%0cnr{!SQ;4i6lU!9?JPG1Vc;~Aw{M3*(4GGTuP$cl&@1-)C1ry92+-5sS4Y;~ zhdQ$n#jXr6{P7fBf18Rj=fKz4?*}lO4>6~XBD}0>vEIMeo>r#oJ z(CpCS5Jc9>yO#-g-MmwZBRC-nae2`N1w5N(UORW(_qCy@w~Kk7*X)RUr%Ksr+s)G(4diAOP>PXXJ&~^oGaP$Z4RS=DmpLn$yjj3lM!VOU}QE^HEfm~H+3jcyJ%-( zcwUTdV(0FXeG#M@+k#93EkkW~Y>AQ|;#A&G8OxsyZht&^_EcQv(UK1({b<4w8i@}w zJ67XNg6!lfN>ajdgJFmbGrvSH6V+1tWfkwo`C$JH_2V13K0T&_4W6Q&zzCx~5GRwJ z-Z@M_V3|c{=sG0`-qd5LdxDn3(#wh=wxDpC&d8DeSpz0HZq3* z&{9g)3+)m_xX4RbLc{f$V*a-8Oa22|lg$>1PH2M9VKKQb8JUWtV*()Fu%sro#X-L0xgsWFy?Sl3`mv{qZ$bvKsQmA zd>3)R5n9y(V=qU^2h#{Sa7(gkGC|=Phn`W7g^5O|=zzjHfg(9~UdCl%~2{VFUxn_*P!8L~`x(?V$wEdIjeR1He2P|$-e(x-F z(xC_g#_4&?96+WGT{hT@6E2~gGGvB#73UKIjCR2HV^mOp)K_t`QP^a+kBhv#eH-rS zp*pG8ESD=MEW%jEB3*h;B$NunOWv{UqKBc0pm*{vtH}Ncmi*f7cgCB zLd`75gh~PSPV}tbE{mzjt~L`c=|Fg*aT3loXYv?o&Y;xd(c_=iB<&F&P96F^%G5nZ z-&ZtaqZ=GhgF}rr5&D>`E&=AvCry&^Z58%yQ_+1)uJho)E!VpM#kF3D;PX)ak4w;h3{I3fI|_Vu+T*oKvErD z&fgw~-s+VmCfNv7>W_FHveU6UxQvgQl|N8YiC~?hVWsP_mGC~TAQPM9;eoNjt)tRj zRklGqoPj3kCOx4XJ(!etrX;epqKs{!I`&4YUyqTqT%l)_Oik(KAC_JcDai0R0F~Nm zp|*qEMh=pK9no^Di7_K#>3E#S9=td)I=4N@BMhS+t~7aypg@5dpvya!gayi(m=^nE zMky&RvRvIieo=}eOW!3K!d%Lv3&1#U+|A;B59{1=xai`KTNTL_ObAWS0SHUyz&T!< z-B}={2ja9{xw^iqy2Ta-IN4JJ!ObrNq*pFMcCuU=8-;KGU(i60|%7;j(oF=HmA zIleCUro2d)g8-KzBn|RmW~Z5{-Nh{=z?{%opz9GO)Ouo&GYaOu{3g97>tC9_*E`cB zIs$qsn-+B+smN?`cefay7ZI?l$Ch^s4}1X3!FVXbtViQ(abd)(D4bukgq5;*#{`Oa zlq19BJa@E>h>zl_fyrM-AWWv>mnCwQ)kC`)eIF)_mcCWG9G@_20#ZP(hqa^9@h-Oq zFtlMZwgm_5OK(@B;ayLFsMs?S^L`q&T^zIbB?}OUb+AZd=BUA|%HUEIa1>x-SP-`V zd|_YGu?=sa605{4>zrZCc)i=}ES)QMf9I4pK@k1XV;RpP*h}W1nman5I`>ikluJ;k z!&gihWIS{0Krnznu($1u-}Y;CEXR;CWn9lkniQAr!WZRQiMiUEm2LOb_}*)%Mfk3k&Mna7OZ^~@`)+Is&EX;hBuV`D1{r& zv&-7mJ0g{l;SYE*7nl>cT>Kv7iGW&s@_Bj%5e`U7*JM{lp#sB|o{vS*6pZ7X@CxYv7c`M;L<|LyK5EY1B_SLk8ljU z#s9CfyR|cq|KHx(T=D<+@iF-SOad)l^cGPXQol^ z<*_u~WKDE<9*QaPw(`qk1_MF_#kzc-3#HKM;lvoeo67T|FuoH_b$}Q3$oW-}9%V^8 zd4cHEm0%B-x{@>pM$brdN`NdduhjerTHw)Vim+GwJPOtX4;TK=Cw*OH8r8Io32MTu zvq0oOV_(a>Shs!Sw23r<)`aCc>HJN(Gd4-*#^L>wCYow45@3MiTk2^(isHFiJ)~=F zKs4&ErpM8!AH$@5{!|Q$ta~EwGSp{?#Rk`gRHsXq2WG4tMyh2zFq}IGkKgL2JS8{l zL3x%W@?IjDiJTDtvtp|uVzb_xzyhOwPmLn>-6InGYS0uRrFBp%%6xE-xE|UTkmQCMKLYS^) znGX``9tKxmhz}Z@PdUn*DaerqZFPZEF_yP)^L|Olubhj3^uJ$vs;@%h%Q8ZLlTOBQ zWYcFDvvoZ`0cL$lOM&BpE*~Hi=cUo;>*c7TOnBZ5ydcmSD3{YOF>9!+!uFuyDbLiwoR5HWJ3zHO@EdAr z3!|Q^G6;^WM~ZQNp_RHmqs&9n3o^0wz-j9#}P zXX{xs0y?I`4k#__l-Jj@Txd=3QXEb-6fFp>t5q9@!A|VxM9=S|%MKNOB2wR3!tNl8^$t;CzDUd392tID;{z zNTzv?pjHesu=Puys8#3+CXGIBj<+;QMqlXGhvIws@L zWY|>C*gABA1|(QC^2B5G8R^H2`?PGn;H*PGGZsb>=T9&9{yRGpAFLCfubdfwbCQGb zWwsC5p_ooGl$7g>nS3h~ln4p*u8zq`oYozanXv6MH|1mTq zk82$yqA||bW)BOzo81`*PUkTY_7ris4xF>gi$9TsbdJZ}NK3{fsB%^pV%SlFCB@QX zq;4CDh=aSFhRQ++Zjo50XtuL78wxsjtj=@jC$l#4T;>*PyvYvB=ZDb#c#?9SGxJ<{ zR-G|Ak6UXkcDv86YRg1yMSfrcUzlq5z{F2yC!-BjS9By~uAo6yIig6S!nnyJyHvYpVUwf_JQ} z=}>q6+SmtTDI0U{fATG5XuvRt-ECqwe0EaD$%_?OQwfe`r553Oob;Q^ zaJewF@RGN~8HgO>Dr(rl518G-W@mG6C*I!c^mlgd?8WW7cXzio`-9zFBW!gQp9wLUmpwTbPoEEO@KTEiN;W1@T`? z^c3uA?$Z;zDQ2jWKvqSZYL3OqyX=o(Ffg5afP;_n9rsoD(hx>GC{0 z&%;<>`Ae40h854dkoh03Hp88;v%7Jg6RnrBD@JAz8*pX$ge!*y;SRjgeTA+o_NsGs zP|mW!Ptf>O_oH$02~}@9feh&Ebo35uC%G30NVY8ah6%r;VH5s;}rxCGVp$s)a#BE#(b1P>L`?SN6Y^{qH^6 z|2+JUt(}$o#|LWvTa0S?YfXS}%m2N(w~+sPud}tX|GiK9-wi=c`+>FZeTinaXVc6{ z$X@hW`PPecJxll{>lyg^YW;~FEP`C8`iS^xkwoK|?#`_AtHmjtd>WehYzX0U?uPYC@R7Zm#ejLQKu`Qg#bZo zMOkflVMl$P>0v@v76T6q0!2-;J~i>HayvD#baUdhz23G&AbCh>z1YDPhlaV-IGo#h zG3(5WTC){y%wNZT|HBfiv$+=N=mb_6l|$9cD*Kxzd1D=1VH$}dDdNo0gtm{M3VaJ@ zcn3~;jBfEGjY+<2Wb)8?DAT0d>ym)fPbi#lD$kB&h%qF;~gEXJS zR%KQCU?2udBM4-;BIV7cW;lS$rT3Ud%n>c5xaWum(!*goH#CP~@HHxxFAcSliUP0l z97)CdCeB5d#}qit3xs^{6DZAv4)F9R8ul&JR!A0 z5XdM%5UvgM=J;Qkfv$Q5gMXM8&uCdsa8)0|syB@FqHBI>NcX#I?a$UQ1gXM6ly2K5 zf?kZ`#d+<);Cj&U272i46Mim+^1>a{&(?j4dg2jhF+d{-$MA@%OHlPm<02_^%iP5G z5=k=N1cfP+Vvokg7hiei;nDkhhI28>*4O@-qII)M|vBaifSz^;B z%9+MWx=WvbGJ|C*6K>4Bh_S2jH#z~Q0$#=CNh@E5wqx{5@8!Ys-qV98hqT9lcGr*` z(YHLf&`8>(}=e2myhA z2hz1Iz=EJma7`oiED{T?(LvK#LU*C;axeJ+87x_txlcPw@wP6P9Sq(H0gvq^1Z307 zIs0*pns7+sbEr&@O*AlhRY>HhY-Y9)kgVwtZV0@^q1j-56X_t3G6j@-ux~bmJ>!&j z5jx1!0z}z#cM)ABi1Fix9OLzY@EIhCj+$@|1TG=Se3UQY&}GK)tkl+qndO|>jw_oK z7O=?HFQ*0GSF)KIzOj%Nm>WnG`u2`eF3srijB`~vSO8~m!O9<@%`_QUpEBHR8c2aM zM%n8dd5Gy)`HQi%wNvkOudj|QvGI;VbERD?d(S(Pxw61#Q-*EuK$|$<68GOk)tfWd zUNju}6X%O;Nhmw#JwjgtBMy6P-;Pp#eVf;jH6r)R@KPO0S$=nZCvs-;0RdIXM17KCAfORs8P~`_InKDgnp`YX5-~ss==U1}$|J;LV7vLZb9GXv0*eOFs;9xXB-llGYLoa#z+i zWTD25LZ3X8brDb^ZNe|nW4^bU^wJR8Ld+1Am@rvse&wtTjzINDD7@ zCQAXP{k#m-0-$X|hM=>vCo_aYg}FOBTdwi<2lRt9{@C+FNdhs4RzCM0t!o+L5futn zI#+Qo&HFR~OUtJTLQto*(oOo;StuTJnWj2{nU1b$xYnk;!SgP9dOJxC-q~|%d3mUu zZC4^DhqMs1Z8$}w$!bARkIXtbmt-{NBn9dT<*CLXCWU^XjA!g9q^5MQ>D5^iOa7ox z+^FGE{p@KA;c{t8U`O$3U6shnIJjO?k*=lo5FNd91QmQ>`qEfm@}{l5Tdyj_8|{+v zJVRaewbSCliY)DvSGD=IR?1YBBW08oJZ_kB>o>Iw%+5Q&wc(8D1&+Ej#wbI*p>H=d>d0DfjD9^%F--JAybP#* zYu>diF6K53xVYew68A-W2R9by(#}*ng(WJ63cq`KSi7&5HJ>opU+}jej#Wppz zDb<%;7=$#Z>Is9EHvWk^0j`Z%uTl*4os82wipfLEvSo^qv!KunwC+cl_9fceTR|)- zLdLxP7553t?LAj+K@^&Qi~Hpjb;}mI^VLmVth<5F4gO_&7_X`%7%0! zp!vLpMC&Z1Bni38g7TtA0+BMZxW=SNx~|ctvkUp6cY}N==1IRUh^;SUN3bW{6ixKJ zzsTZ-Q0djalk*Kh_imzpN8k3lC=ptvG*iU5oTkWwZK>zDStg$G6*w&PIr_R3XO@=2V9Dd9M}K3z<_N)pCwWKH zIcj^4sk3G_cvldNOd<-aG?4)1ypW`e83Ha9A~;IOGSXSaH(+OnHIdDYWjiMZ;&Thh z6oFMHxHbiXp)|HUIcGSA@^NTyD#Nwc-zRT8{}9idId=BUVf|t_6r1L7?LG%vmFD`u zmHF1(xHc9Ub|d!A&ieHT?}oB5?L9E2ZBp(p>m~PZJa=0^L-;iO+Gr!mQFFl?%?aqfb*}Si>^dgF~NY`DQRWLaJAx}Vuq4j; zEgr+D4G`Q!M^{KTvH~uyRWc{mGDPzPw3N96QVwa8!iWs9BON3DB_=IGBRPc$vMV`T zkZa&8*fWd!B-y(x7%X{On6A&5pdFJ0{B`%^e6z&sp z?li7Iri(qFn?C*8i_JW>o3wx8(0~?{lfi`^MG_=~{`iIxrqii3Yn-Ry0$OeGSFMt^ zSu2*T#T#?oW*@1N>-KHq+*}YG{^{V!@#DkZgL`;$G;I#zY+0MraZB()HdsSgZge)= zcQ!V+HW0of&o9I8lJS}yw#zbC8c4f2+#~`4QU@vJDwO2z&I7`}BME^$OB&_RGl~Bw z_l`~Q{R!64FboKRyo&Vzj}DW#)h&?kL_Uyw?RJfMYQ>FQlBNo9Sa(g*2AyL1t0Q3T zPcbTzJt6QbWTPYKhRgR#e`CVez>Aa;+H26mE{sCl&6x^%ylx!W<*nM+<~3;@U*sNi z(OxQwazCD{Mxvw&b?e?F+(gXBrQdv{e@z(axqpcz6e`5f z-rV$6BS*X`B2LL@PVU&KIl_0-T@2Triy-rTk5pK_-W$R>bg^9X1@Wo+9>+tvDUU1& zsxC**9vu}R4;4$mm8riD-VaY^#!|~tjMVmwyY>0w?Y1zBl)rdk|Gw)U{t5Q+JM85j zYd`Ml%l6O-Ttn9|iBtg45h(obGoLNUGOpD?F#SZ1-4T@O%sELj_iM!2$HD^^|tUGj7 z@-$2A^g>=K=&qs>J_9qMqt9`GH};7DWF=l^sj$|wmb9zmB@MEY-^&b!W-GFMSZ|m~ zMtQ4XR%YaG7LZ!r#8+Ar7US+k4&iJPqLf_>Bocdx(g-_WVQ%zF7hX7=ER33JT$YOB z`Z&u9LOJsKuwrQFjBu>C$a&dDHt-0`a;godj00Is&SCm7elnH|mjbeh{#dDJ?En9rzw>jF_}$^pnY z+4hDlS*6)^!a0IkESz9~7)Ok_f=EIG$-63u083zr*cG#%$1@J6#4@+MXux8Uk!$K2 z#n}LNU2Cc&)S zkYX5N>FSCSLCrt=g)4?J#n^xC0I^?b!W zteAk=r`KboPN6I(i)v9}uE?;S8j~)`)(?&(1~BW`uuDo`bc(APXBb|yO6c7(D} zfpvsP%z2^;y+p$*UxU#c66^`n?8cf{B_m|L^mw;XsA!YP|9Bgan5!{AlF0<598qx| zVP9)BkSt3TTgVK;I#+!%f%`_36^$jlbo_ueF@i`*xIBTcN|5QB*s3irj-&W%{JZV~=Z~FD$J5Z|f|5g6K?epJWue0B;48TWe|1o~oeP#gOV*l;+4@%B| zEC1hv+JE>C`~`EX2qdyrj_FE3M`&>s)9XOha2;YF3RqW2OcHsxQ7Dq0;uez5V@Z&)fI9ooC%%XWpGo z`-9oDr=4kcHh1PQOP#?%f0y{clk90)BMMd0reD8%)9)jNxkA!O=&%&qM(4YlHElv* zjfBVXAgvU{W^Ur(0Gn8=5l4!q*r3KNQTIE;q&%=gU7>(liLo-7u(6^U)OC&^sOsKT z+UBdux^%rT63tYIpi;&<;{>s7sMK{F1pd^5Z4v-P0&FJAZF>ap{I~KSD=!o8&iNOy?3594;IH0?Z{Ut#QkE~M$^Hj5i)4=RY|J0+vX2F79wNR2bIl?5gX|ef2#QKaXM55Vn@seGk=9SUjzF_G%NMNbg>t90}OZB|Ia5nOoeHj0G?RKQmWJTOY^cTT!^1GW>)ds;!WC}7tS z)VvVvT~5zT5FUjITNoW$bzts?ezKrk$3>Plt7sF+R&l}9nyFfio@VHdQx7X+Az@PU z99;{H?<9;q8B}tfxUI2H*zOWUvW}h5O2a7VUqSz+0QuRPmDg**Ze+` zZ@hXA<5FfEJj0o~?8sAj#*{b>9rb9NCm=Ru?Kvvtm>WXSN|Hb}nVfz^{J+=}G#Tij z+O4<~Li6cH;geMIfHBRnWtL9Tr>w>)C23D4^*RP3WxfqwtPNU!ACz17m*{dtQ=z{F2|k0@S7Vu`Nb2+qls{{bfijs<4RGYCO=g>af*E z2yspel^qZHjo5~-%-VBNltIg^hM)D9XNW6y(X;&}!5A5Lv@A(}f?>h?wjhOL2l0Vk zT%p$uif`1>v=@if^%p=6Rk=3}gcCB8^THycq zF&uGjAI!P;5qn2}bf9}zy`u&{*}_4Af0P?0ktZ&lcy%~OOl^?E8Ad+AOln+0`GQmz zt<$k^&)pz#9)8ylIE#zHsZ<$=@|WZsL3*B@*74DgOuD1)Z*E~haXn*@aK_W)hddP5 z&R(gjbjpv^)6H!M6uimqHw7)j{?bp})S*%Sg?ZZf*t9->pg1cJTf0h5I^8b|h ze+J!7uUZ|C)Bh6%NZNRh9-!O&KQP&f{+~gw!hiaW{69SWwQG2N1L+fykS{Z#o;CU*q5C~v8jF9Sp2{Z-z8}x#uPX-?QkCw#9N>&ga=dmHD^kzYY zKT$a1=qh@WQS=bVH@ARHcM}JBvdoieB)@@=X0L-j8oQiR2Gu=K&>zrmqHT+u^F(ud z7&Pq828AyH4a8V)u87S?fZ8K)FA1A5suZrb_R{wMzvQtIDsS`%GZcj`6 zCz6kVx+^}#LoPP3qEV1|isgT@bLB+495Nx2ckeP12{PwBN0)?A*k)0|1d1I*NNO4G zD1MX-8f}o{nrSh+Y<>=iv`xEN14A=SNoH>7hlclI>aGwRSk?qNYZ^D1yENo=G1yis zdwGsrEadVTN9T;$k--tWR~l_ySwYx&FGLVzw2<;s$$%`ry8+HEf-RB%9DjydzZllx zEhc%Pc?Fw%%Ye)XdDwisi>UI`YvBd3H5*9&j&hQQPvmZW)Xs~wGwXe~Oib~n``;DRbD01e>$`^O-mUd50K-z1`chi=@Mx|YP%uq*_ z|EKc*Wd5J0&$>?scBgajv^&_Z{6CM<{{vcI5TP4AaPP?nbc_F|*WWM3{~Yu?2bKTl zq5MCuaKtgHIB;`rpBgEG90Xx7ERvQdLECg1tc=LIQBXaz)=5=Myi{U>1n?OYT=f0u z+ygVW!2b0S@>#6;Y=P`DcUzk*QC6)eP z>HpjMzk&a;*Lzy=|2$6pAKra*9(Uovjy+D&4bfhF%k$rUznK5s?dP2%51NunbA8BniwsM+CPJlyIT2U#yo7;nJahUR2KY z3MGYk_jaxJ5;MJt-GvDvE^`t`;zw!$NOu)SXP|syzOjJPVaeH8ayz&Uq+U@&KocZJ zBgK@x(An=CbsaE|=oGW!LG$)QCS3CT*aBfNKMnk_LK5Y0h9oTbT#fF}MjjPWQuuVp zFX7{z)r7RH* z#ySi$V;4zO)>QT+DI}pRh3pB1A`zusi!2eMF#nlR-NKFBzV7{f{_}b~YUX|3Z*$Ih zpVxW5mh(EVbBK<8&B?4YB{$Yx`DoLW!r#&PkkA+oVKKbfPNV=Y@T}P4SP=(98 zb^ceMyyb3D(b#(@`L0M3uggv9QO?eq3ner1>-OF^$Fv-Z(OFgN{hZC`mdJGj>-TQ8!1si8tU*}k!@g?7)?_LM5Gb?_s+(36dlUE|u}Rg~2^`}C_18GFGJzSxvp zDM%_@RTam#7S$E=f*?OFxl_ zbjV@seShyMq`6h2hq=t7rT#8@m)m>taQUQ3e{=)WI>c>MkOk#Ys_fTW&TWmjFF~sz zdeinW_Wq7C!y4LLh(V*so+-$s(Gtas_PQ{8YUv};iwPA{N8(34J0~(U_D$%!Jv*!A zaXPeJ-rPbnb1ciI`1!h;H4P;LoUdN7qB$r{Vl>TFrf;h5cNZ3+3;P7BOWTSu1{)pT zO2zB+Lg@Wad$Ph?_%3rqgXtA)OJbj^2>E!DdZ;xZWu#hT&T^&4VVl^5f;mN^?L|4W zgN9ixK^N;c?AkP7cl{EbG-rl)%=p1z6?a655Ii`b7p@YIjCS^CHdt$D9QNtK_P~)^ zOIe-bOoV}+4u9dyctqdJ2t{#y5!064#gN?FW3L^8ydS*~RFML$5yt|4wOkC%R6Jwv z?Z892(4Kq-I$uTc6gMaS@sIH#`;U+ZB&K9uPmx~V(KC^j+5Gq#HLd;4ianIwbbjfd zw}ka^92u>Q#AVjtzBErM(Oj5GomS?U!R?q&~o#%=Ee+bv^#%xP0fnu7mE z(au<5)zjSC?@XS*4E=22HSvx!j{M=N{W_c7Gm6d?P-6R;&%S(pb24SDM@B%A26^(X zx|pq5{o7Y2*Mcd>8pEX-ZgOxZmrkCqgu{hd(+3^9Ag2YoHV3B3UhTVu#R3OkkD)6K9keH$}!t~7h!+XB^&{Wvz7dfA8Kj)KC#3pks! z@I(6TAs2f?-#jWjt-6=i)T8xO+5^N46DFMNZJ5@LkCt1*SflQB9|G&W9w-U4lWE_T zG0CF&7Czc$b~1+Qc4BkMeTT9v>R0NkUdDCh2_>H1jV!Xz;CSP(m$>Y;hc1MuIWsJ>jCn5*ABnu&p7!hW+xT@L#|ak&-gbQU)VsI zAP_S~WplUwvs~#GjYgT`5%Il`IbXTm>b~W0+%9BS@3dW1o80Q0hyZ@B5uV#`jPiLq8an^^orjQ)H=A7ujHz&VBRJ@*0jWB}^d?j&wW= zAACR-mTtZJbK9AU!v`KaC&6;4&h(_Dlmr$PoP1B;`9S3!D^<91K#s5@oa@k2sF26# z9q5$EI7oZ!aa&sWi!0c~9+bY@JLC!X=(5WhZ96{S?X`INh2Lw>9vbLGl&YfC6OF-l zoP)|~Sn0GI=9#Zt$)EG8aOqPffBNjjdwF23S=seO!^V*2z55SC`N6(MECHHtKXX-- z$vVE>GkU`3W)Q7pVR!{-f?w0;-UEG#3)W2sZZ~YrO^-g-Ax2%7FR^vVKf(O*==N2E ze3~C2(@j~K&%tXwD5vk6Fa;| zf5sTyD(&I#r=atK@><`M5KXRTaY4V^**FuvaUR#l9mW{W$ja=^_ddikweRg~dn)Q^ zJ9Qc09meH1#1yD?Mq!wmf!ooN{GVY0amth)XxK z*20)xB?Jq+tPf1x8il)Vd0cU0t1bHoXY{#OG^es1(~rBal@C!uPL{V$W$j8qn_N~h z^)pkU{n8kw(j0kqiwKW~{PU~zt-|4%?jN#`@?mKtJB|&lyYV6G!o8|j#oe}hN6n3W z%40<=Cvl>H)h^arJJX3?2w%|2YMSAwRzwb>i5giZ7X-4yJ?RbU9Uxv5zlopu4X!wVmdHKqrpUj)ICZLui1!fcQM<^JhKW>8*0F=zs}YPq_^85PLyk_<5_L=Tb*kUoVz@;P!#kx%T%QA zbyhoen`PyEk?H1_k>#Fj@6HE{m_BFfX-4i)DvD#$FbleTVgkvUILfUP_KtSTz4w{# z3#2KYAH7U35F{{d0DM+au-$f}DaB-uIMfNW@+TsXhp5K)o=|o zf@hPb*-R+4TyI6bOrjQf45j?%+b1Ukg!MSm!zYj4zTK!^*w8~qwa=}Pq9bv#I*anQ zX5x(laxreSd&!JTGuVN5;$A0q>OvfLb#AApH(86Em*Q61b5i2Y zNi--ih)&~pmYJWPl3#Xu53AYmsF%UmUQMyKtMnxjO0D7UYcDgy6_WgPisi4m9`^$K ziSRf~@Fq4*?hs*!Xcao6%W#xmG{pYw+9TBc&TkUCZ)^9m9rBQm%w>5g8`~vze=}En zZ{{(srtqSNA#U6ppgZ*8G$DS~%-y~(UhgXSa1!2Aqf%WRa%^7}7j)XF(8g9`+q9+i zkdjuxWrzH)4g>=E<(;%=ANAu}o*3f`D~-Bv z%m`fSehO_p^{LYdN!Be$8$~Ke$9CMECN(JEK(`<2bxvqPXLCn|O}=8n(Nro5Lni44 zZ&mI>onGtx38hTO&8VEEe9SJr@J|Md>1nSW)+)j#gs#Uvnj#AkJvMM6g)zJD;b5qS zrF_8lTM4ZS`2)3LZvv>Ig4`{gfaD!Ywe{%i1CPmu?=<1=Ir#KwGWi=D|)Bfb61$2M|`)Au6<$0MRX?<@w)`J~mXX=Sma z{Lt+E9oE!Qz2nbPZ7bQqDoRsw3AHLaeqM-=iRZVf(*)X3YBXmeI%EypH%BleW-r_pIsilzLM z4qVZqcg!+l^xF@gfQ0Cp`3bM3l zq0yMgoe$neHG03?U=(+b)4D;K{GMw5T60*BDYu&=lunop;^vMy? z^n2BH%lMg{#*o$%>hL&)qQo?Rs7ilX;yWkx$kLQP|B9=)$_vw0&nu_w#sd{__4n;l z0Nn6!H|{0Rjj|hGMkpR5abBCHhQr?AQp&?{W7Yk*H&PG1OP!?3PiUkW1ZuIJ{v4F* zDnIO3{2@%_eaR{oC~sUCss78z2bJQqt~^K_nWEZzJ14v7}=qH++DKv zS;?80h5<<)PU;x5-KJHD(1%9e?2a2*%-oc3UlrU|QzV_QU+_wBm1^|Z_`_tMimEf* z6j=|hZr=-is>dpJ0H(&+9lJ>s!o{$8N^zBe^u8yJvUi_JgnB{lhhwV8*qqjByYf4AIMR4o6E?&KC7yNRJw`TqnKE7=#F3ZEp~@WgWqPBl zh^fBeq+{Z-^0iNI?Uzfx1Mp}UiQjpd%e=Xu>#%3+DWRRi_lkMk{dZute{OR;!{eQI zw(8aU+GB}|+a!@;=FbF9wcZ(`&p};E)8&k?zaV}4b>q>a*E)pFLQm`s37O8f%x%x< zk>D=FMtQQoCJU;2Qx-uTXz}5i)h{(c4Wl zM|3Zvi=(mJ)U5jK*Rx&Gda$?jF_DEi7Bm`Txjh%j*@o=2E$SPWe&Zo z>;~@#J*V5JUL2#^%sy~l{DmdP`a=9nQvvu1l|9dAHIc31>FXflhA(@Ron4$!F51TY zgY{>~HN?!z)*(crHcg40cC@reii>bE7P`LP6q{k-r*&FQB-F3yk+JGCa|Sb!P-dHq z`0@`)o*VKMY6}u}I89i;s8d(t^G%7}Pf>735vp}1{h`uYTLeDUL6q7#nJK5`o$g?8jJ&Eya0 z=7!z}%5_g%I((aMC`xO?wy?WNYh9SCM_o568rYjF=IZp{Y2d>u2d0I-0IGNy-{i{Y zB#C2&j7;03&eoqoc06V`7f*tUOPZ{!9rH2E5x^KHx5gy&4eYxL+s9`i;=09@SzGYJ zqw=T^HuYT6&#?`e&CO34yRPJZfd*wtkNW_qY8CSgiWfWsH6u=W=Kmr!uH^z zNSa&Ydu#hQeD+O){e{o&>^xi$gA35#_c?KOWBd*)1!M7A=Z$qKd>W6sySfyuwDUHb zUtK?G(W!Je^FphMtH5r8N=!&G}jI^SpZ*)( zh4e1Ti^0H0#&9Q>E(y^_^HH0wb~<@x_Dp)ED3wD`jb+}10;@lSAJX5n52DeKOrBr~ z6^|T-cCvO0w^y8k6det^=&yESOKq8@IS=BchnUHjxYC;)rM~5pTA|W{PVj)?$6MA+ zHf=0RgqbSs%X~c^+O4HCdP27#O$xnXR}(wA&vfrl_ns{yrP76ab5b2q&m9fMg%3^k zHXB@#_AcF?e7otcTFoVq`<3f&Wu?1uoKg(gQ$%@gtGT%KleRVD3G{2q>#w2Sk2BL=mVt zdc)Yy!^q4`jJ+w^BHCom)DN2k~u?4mHr<)PjbC9K}8!>R9)*-;;ZzYc|ILJd`Ip` z;EamO(MN=jy!0Bfy5T<^ zSn*i4MH}Q@DBbe;49@rN%flhKu$>_~U%A;kTWRbx0+V}beCyrw@(&h+pxP*39!1A9IP7U4|3;A#hOinxzF z5!;J!N-fiYTQnNp4^PaXx1)w}r}}YU{DN=ej0SKIW^m>MxbnfXBRHjV)2THM3R%_6 zgkg8Y4S9yo;I?{G?f!yO_3yrdcvQv=RGzD$tN%YPp`Sn-yE>L?5j9u_61}j5nXt&6_=PGceB=&4a9|NZ;W>%sqkA_YS-~ z@9m{(@Nbse9eIuRNw1xK)O`p!J(PyPCli8K=aO$RYGu<;w+3?)@>wmohO zN*?d8@ZsWoyWVkEviRwTV{NSt`@Q-{Hd6$8ZUgf@G(0(628`x4zt}ixB*`CHYN&S2 z%J;4v=QF+!eid;SPUark$T;Q5m>zB)baI_#+l(J5#9OYgG)JCs016&ZPPvP2)_=+P zI6rLb3;KHFv3^&_JNuL@^%~P~x?SW45#Wh~4G#Xo;YHU4qx|62HRkFNYIq2o}q24h3 zd~bNV^CV6cet@^*>g|?k9i?N3==r|{3~sR5AFqFUQ=FP-$9T;c2=(Mn4_*QL7}H7% zv@k|bAzYL)0ycJ--q{;m$B1T|lsIJNYMfjgTBYqaL0xjOF~7h?=_boiA*Z4v#fjH@ zj6^p(aI^>~oaQSKOsC%)(6{S}x1os%ZBvS^m7G4WX1tG1ux5$<5Xa|z`L@m$oRW#k zW|vI#ORM8h9HwbS4E>Z|(gX9^t*-K#fA-%fdA@3re@ z&$HtzY_6n?^j_)C+3)nBFqC!6^^61S3S|c$y>Dm!@FepBo1x2rN0)EFxe--oL5AzD zDDZnU1nhnCY?N*AS$;Z0F55}7RCazp`zNveQ^Ai7IXw%Lx>x6)EH7`fbln5;YXnaE zUg4h%mn{sKbkz$EmfIp07?gD}_}VKkaMxMqV}a_>ZaGbv)l|ME7Edjn$Vjs`_Djd< zx?a~Qy_ow}D=PdE#)I9V=Ke+O?Vy@d8zfp9XFTMdZ40m3apQxcoJ+*jy9wqyQ#n-! zuhh7n!i8BssVs@};H`=nF!I~4|JZ$3gN~iKe?0x&^iS4-mDnp!5j0P-KS4c>MViB$ zEt&RGJq#E>S-E#Oyy~>eBUJrfJRtYuHc#Ma?kdKvde-_7H~Fj^b#(?cg8Sr0Q#X-X z9;}SODcyVnbHA(9v3qLNySJ%DIa*soUQ*44*UI~O-Hvjnx8|2U`*QBr)q`(Xcj_GG z;{MWtjwq~HE6jAH1pz%wUkm?q7Kgp}u78Y)x_r${lc|wesKDzt8;pcg#Pb=?)+4$~ zT%Ni+U%`k(P}%qgMk;jpoEkk+R#t6yrZ_(4Jr(7~{<;shB3m*)SQUBfnZfl<`ssdLwT0M7WxrP`P3-h1!7r6Ak#x$@M*>YRt#M2B(0z)=<`scK zTXJnE50j@m^Lf{%soM$7R8_yUvDv`L5wS_x;M{PBrv&Ty*Ka@E1s9;WAZK#_u_NvbDYxKZI?$YH80|N0zY@= zHR8adW%#>9kYC+}E4Qcd!++!cgyY$C)IlLCBT#to&=+s|$DFwGPLbTe(?R&VECM%c zaR-NkJ1}7Hy6cm1^-6EZHwK&vO3g9hwm)^8DpGyAcVfW60IF;MqAvfkK!+o}Ub7m5 zA-Rm^eRE};w85&qr?;VP1P5~sRTMFjJ%!lo!=5QyP+h+9jpoQIjHe|_0dRuDR@s^Y z%g-gE;2a2b1>3CS=~)-MR;$hfTf*~Fje5@py>;(c)>U>!)Zov1bkktZjC-Z)D$9UnpW% z_R9Xi#bOV7xwGB^`^wLRT(|&v#ITK%y*K7$ZhXJAP?cY2@|QI+xn~dOIVd_*0_mK2 zY#FDkE}k8_Q{wJTv7JMy#`DOlba9)54JpcZK|DJKs~ITF{2UWI|Ck2`tH{JC;l6g~J(E%{$Q7_8eZYkhHUzyA(E;Q0(EHc2}ol8GU2tuwF!S zA^?25yC8bX%vZaK<-?_Jt5CTFs}o855gWH{5&H#}Q8f6>C1;A1_I7a#A@# zXJ=_Xvs^CJ8UU$VQXVl23CmK2MBIGB^SXOS-UEy3Y2c<>8HLjR_?>zA?Rgp|;?B~C zZozVs#NXe4`;p@qb;SY4L$p`N6?4PIFVyedxc&3{Qe!R$OU#Uo>DnDif=C6enoHqc zSB{f4j-4;$n54#tRiD;5Zbgw;-PUzT{*+I*LO_j0CDUv5G!2(V?FO0mw`XiIGrMhU z0-fS+*H&B&K)E1K+=(qulU&W-%&{%azE1LLAoND1mfgAPSI&WL$(yu4pe0oGUX;Nb zq9b@Zs>&~w$h0Q(DWhJafM+C)~bzgzr9VYY?u&bQfn?suex z98Zv{DfTFgYAlL+$~fi!xR^)rsf8L3950dYnd_t29>2aAFAo`+R#A>Bj5p!tMVS-ER9?osfgOCNDG1-P-{t)X6- zF+Qg%vBp_ReFgshB4I}k(#|-^l~K>ojHcfhRM&jAiy~R!LpDbnUlMW(ZLnp7LmPWx zE{&buSvrUF`}Wi7RZ|)buG+FUkCi4$$W*&!n&Xk)F6(gYgM&=Z`PMy2eq$c|dMl?T zgQB3$)AR0njfXl1Fgbxa(_JMYw|YZ{cA8Ser1kAme-ESk)KGMVOr4>9lcl>cEr+GI zo_MV6PWPZ{)}Yr0gzmMse?d`Jfu(f6n@Eu`Iac^kyKgR$$&v?qE^zoHmG5#G7b2qS+yRja$ji2dcn!-$N zo{gxheF_!Q@BZ{bBY8YIo>uRi@g5dE_sb`kUpRlUe`)cu3!1pYFG5yOIMq8YZQ2K| z6D*lzB4CfWdoH3g4jeHgNLRZ4DAOjRED@ zj|VzA5-2vlSE|U2Wti9}df(X`$WET1MvHg8IjHnjya1gEITutllu^%^Tbz?RWsjr--T)y{C*FSt@ZRm=&J`#8raH{`C$*?j_)E|x-q3{Fpdqp z_q4aCPm9a+hZ*75lA%TL=Z{`>7Jp1-8=dq$7QRYtAmeEL{dc@rCVj;ec;-jBI~)j} zSGX{7J77&FChKPR&h8;5X_HH3Ue6v3Qc0AL>OZaYe=_tb^#C%9ZGgS?CGx4x8*Fa* zj`(WVEve7-jEy)0&qW=cK3}Zg@yh9Vr`VJI1N~DR+mvR!vDlHm2OsJMj?~u&KI#f$ z%o?V)tZ8q~1-0n9@l>?K}tT-Gp?_G?;*U!3 zRaq^8{IWAAn=`JmrKlWF_o51;xs`ZtwLk>SUExDhTGI}u>_+vc$He6zi0eZQJuAH6)+)ARN5? zQAs^#Wr5b+nU^zt7 zELB0tbTS2d@bck-53JQ~nASB+9$_Q;+j?W!a5e)MK0G}AS**IYB+=>S=@g%L4^!k$ zZ`zyvu-$)uTj~WPc?It)Z(~I1BSbkn1j%0B9W!Ic?mXbR*O=MEe&Wf=q2Oq%B*cqX z4K@)zO+uVSj}G37Nvau4u`uNGyqCg!4U9Q5$e(M>uUK`Q?{JNs@{H*9FvVuLky80q zAIK|dUhD*7O;X5?lEcxyTingz=lLf0Z|um`4H$gvnMD`*XkAGsg16eSQjlqSi_`{t&oEg``(xfAOrl%Fpi@*Bl9g+KGcp^OH zQ&;gmRNRw|HQbE8dhZK{dv(gqMABoYO}YY^IdRvX3hbVI8r?Rtc3*&hp7Ar6@u&L( z^Ad2KPxD491ziU>49z+2aJ7DlA|-qyMAW4VdN_iU5k)!3~~ zF4Fvs*WQ>WHz$N=^y{U&b*RvnxOVf0WXhU(0>aq!`=95hm2FpLS69$!;l3p#7&HsI16y+u6#3AbvZe}u=u$qh1vO_~pEyJRcipVxJ{Rq2xX$R+ta z`m}rS*#+Hk(>8}QOpkh^uj^k!R}OZ#iCBi)9%g%*&+?RgSGK%HJ;O&<&4Vqe=R)Ep z9e^{1*eju1J>N-A^OT9m8^Y?m*XXh&=NfgFV|4rg{C+hFYCwg;J?cc=Cl&0a*m{D>o0Q4QTj=C+EA zME@p9NZO##2uUk9Yb%ro*3APeDF?M86iHxx+z?h69}E`ZB4Oi!!J=HOP}WWe8!Scw zgGD>K+B@3$SV1J*tQW0AN=ix=1`{NF%E`(QKc%3v*93w{%gG2rVEAWbVfY7Nf>Ka9 zsGJO$pwtTVpA6qKI2zv+geM${LD@JXunRwjf6UJA7r!&x7s2nJ|Bn#xnF=^aPD>5~ z`}ql?5%!Mwv4vwDQLYkhXcS?z1rHnm^US?xi*kWGy5esMi7c5{MCaAui9loUpZK2v z(YyIz9Z;^~SUAQR%nbtJ8$>N70a1{EfT?G1iIQz66A}WL00w~E8$<(8;2*(%VZoPB zprk;w_yRf*{u}fnB_L``7)Z2)BTDkGVU@H)`d|?@D3r4`{+}YD-Qu1QFuR)%@rJk^ z9D@}{cq42)um~`ZxH#O_){)RmI8xk}&}K(#55gsw&M%oZMLUpAvdPPbd<1 zLD_mB5nzEuxByH?eA*T6f&kNf=LjJ(Q3YU)hOXIebt^6X-Risam36ID4fHj%H23UM z-mPVzZ)K>wdk2VJ5{*J(B{6VUTWgdzzPYY;j`pG|0Q;Oj)zVYeR0sXW;Q!l`?>|8E z@n1%27XOKF%*q;$akRlmI3SQnl$93>jkJ}(z*ywR%L}m*$^8DVgLhwwE*e`cr0I3@-NbWU%VVq7GlQ% zFfFma`0t8;YW(NVe_5y%9O(u3!B|19kZxAeOVjawMT^aUX*toD57!xKE<_^B?k6{u8u9Gzw`&KyC@NhpUwf0*!}83<`~v`0K0HtZIz>l`C*D z`%eZc{j>a+hTy-F=Ko3%aE}@Y{|Ej**m8K~PgsN2fG!{bfC!Zlq&3nCj>Yq>hbtDu zP4o>ea0jnl(71ZISmWygF$0uf!eieHK)_ca`}GFFwk#ysmMd;s3NFS_Kbn_p3osYS z(EJ@*K>u6F|MyMcE=wI;O#g%7FMihlU{Ww?68^6Q;T5xG>wn8t%o6@3b&wNapH&7K z0Xm|LAY5>h3z7Z*SSwt>{{vlM{u4jG8}h%21&hvqxq1G77>wlqUl9ThEPwuQSQ?-F za#mg?$G2eFSnwxWKn7liSN+K0AbQ~Isxq9LoKRx@wPY2D-1>hOB^H?f@(cNYQAk_- zE5pBfFIOZAZfk|tnykLM_!jj5FJ}KirDW&&f8}II{+|^gAeag`{15!U;=jc!iwbD6 zAMG$v3KpUrCiH05&$|=QS)QMFZi9$^SAxeE8bl5RF5mdwxa7Ki(QlyvLhm3TJwWpx z_3rCzgd>qeUp5ConhM zkMPDK@DrCf(%-^)h_<^M(!<`-l_*)iEdu^p6I@LHlaYeW@&8H5LP`F=6(QgV`SKM& zso!OkU*i82azbO4Es6eYW5~eV04G36@Wz3d0D!0l60iQpG{FVtKXd{AKgPrQ+iSx} zxFRrEgsqhu9F1_r5)8pbG{8mXKMV?$nLGbsFw*>A5dvOP0ipk3)=B;*uPid@cFhL( z!oLOh!a>`KtNzm8Bfg}G*U<0R&>tegh}t6Y8uI-zK>^EubHYol_E);&qgmZi9Z*_c-~Jkxxt$9l2L&#_a~qdj z?{8^}#1hC4B@ki>^oJ5Cu|)a@r5B<|20BlOa{O0^3eViodCV<1ms#hAHwrzRWnOJS zZK=k=-!~HrnLEl*U%-3$rofuT>-!b&_RsR}pX?f#&@~P)8}XenVj)(JcqW^bYedWE zU+k_ZGjU|;z%<0hk=qapAYTh0_yRnehEN0l_N2q}smeS)m0ApB=Yq1(D{_Fz6=jPM z$3nzs>;0eP;SdVq;QbldvVqX4HDG~xZ*C4J&$;~{kVB%vMD|#`?ehR!Y94??NbZ0Y zqy^%Cq!*9>AuhNRgDZX+`16$(^Z&x;>;DiblK#IU1e~BI_|8kQc;qL_P&?px{ETIS^NUTrr8$@Fyh}Q=W z0Q$fx540ml6Rhrl#kye>B_(ZaUB7l8i^o#5BOEE=ibo(XH*o^2B3!YO9&Q8>#7IJ= zAo7w@(vmg~j;@54=IiK&muG+t$^{SP7!1M|L?K8Hy|W5fWA9)?L^L9dq0sh{->_TJ zllZ=*{!4;IZ$ZH_yZY+ri?IDmyv+Leev&cY2IXgA!-21uaC`UHyM}mqi?3Dcdrb&$ z{5WC0vmNnwjdto1E_UO;s}o-e3QZC@zorHJKT-?$e_Y^hvqR_NV@3GB#K@0XS~UJw z7B)BjPg+)rg#Rl+K+r#k{}5d|qx@1JWReq_v1||apK1mfm>mESeDH+*0kh5{LM-tA zRJ_MrT44S!6#uc{p1!53gNyoqW#`%dGExxI{9g$I3aEht%h&%lER9wE)P~P>0MSv1 z*C>$qpMrwezfRMiO6NQUS@0>yf_~x*k|*K6?I)%p7L$~^KSm4Szszs#|NrOtfAB_; z+`Rlhr2StjLqG)WAISf+G+tRm`8rAtpntWp_uJe3*8z-Q|McslY{WcKwCM%>h1{oSf{@=>9@qd_AibVgf(0utXCHpJ?51e35yTPrI zh*`aEDK_Au>%VgIcu<2$-TG_+FNcO26{G%;A+km;n5T(A4=EVY5j_+=?4< z;J;^sAI&%BIV?dkoG0{cG+n#Q-?bUtnf3}FZ`9xhAs0WRwQgUrkS3M1|R zTp0pFss8}}FNs(F1paRV2-`BrZ9%L6gD3z{TjOmrv=0kj64;U?!GA&$2rbSKKS~6e zugpP`1pf{#fd4W}+yC!|CT!~<#C0tu1Qy4Cxq174rAX_)D?&g7HDUknvhiQ?H+khx z2!V|NVV!n%Z~hNE^A`{Rc_aa_;sRjZQaIvA5di$f9V98R(zL+(4`d1Zzub_H*gv=a zFC#T?{U1tN|5*_NF8m*_{}Wl|PoVzpMfQEc=C9-Yuq&CIm@4Ay?$hs2Ku9b8|M?Yv zA_I{G!~YR2kpEeF;r!3`Xar*EnExX!ivQBkdHJ8EN%3DRLO?t<;J$qPUpN7829Ws~ zGm%yP1m;@;+5`-TyAUy)5`_N-2mVVb0sjxi9Vs!phh`aP04#$4Qm}dXe_?WR zr1jqwA;4q#;s5-<=96CvfKYOL&C8BD`zJLMj)nSPj_ChATHyS5*rMmZFP`%8Ct6JZ zla-!({=1AU>HOc7As~qc@LB#u6k42BmT>AL13>QcEuzC`u>;Stv*s(D(zL#p~q6 zZZZ?P`9qK+p}^6`W8V6oER1yi&x#NbLJb5gAO06e9=jl`{F%g${CHb|&c*?bhTC8fXb>~ekNZQx zd@+zo5(EE*SnzK=@l(pjANhkM0RAOf0RI=t|NDJXe-+!`rreTJKrV{^bI<>V%E9DF z_`f0q9H%Di|6R5KSYZF}-}1_z5CSlOcxD3Td#-s5@c%xk)4bGc=aDj!vB>ZV1V-93&dat$mT2SLbbE&yNUqpm&soLF7xp0n%~!S!PEdH z{&#JmZY!PSSSV;VGtF{_ln!5mu7PeL(cUx6mVQ zazcssUnSoEq1qd;SAVMoyZ9|0_Xw@L#t6$M;J<`6c*YCdXI2Y}M}{R7?im2!M#|g$%&=6+^t< z2O_R1{#6G3pV$0mX@T<}Aq(h##Etq1{?RKS7d z&%_N&W0ggw>T)2n-@4_{txU8Sfs{ZITJt3 z?gIH!-GdUl$3*BJ9hipr=E!Xb-L;v9-~WfPaX`4hC2Z}Mv;B8*{SPWT&;FMst^cnG z{d4{A@A%}Gm>>TK^uJ|QOa>;L_kah!?>@f&^%K5+P4nl!ywv>pPxx+Y_4OtHZurmQ z`rl9azli>SD1@~CcSQ*3r2@Q`FXjaoW0gPQ0u%(uK!n_11ciVdU;;6KR{`YSU@Cyz zhlPUZ06a@_0Is+La6SnCIP|2rp8q#!f%s4P#o|BlCLQ5=$qsu|VEP#A1fZz*AM*ja9Es+0F=5O*p zqO4|9K>l(2Uj{Z;|A*lX022PM1pRaS|L^$ZmyrMb57__9s+bIH0dNyDN`ipzIVESq zL8~fIQ`(Ji${x3O*ENTDeiV!eD^#?LPErnP9geL$DkbyV>c3?I|D2SdoJ7+JT7fC*V l754!MEHe5(dI9LZa{|d3Kq3;6h(!NB{eO+GC1C(;0syF~aW?<} literal 0 HcmV?d00001 diff --git a/flytectl/cmd/register/testdata/invalid-fast.tgz b/flytectl/cmd/register/testdata/invalid-fast.tgz new file mode 100644 index 0000000000000000000000000000000000000000..28216a03e55716bc8689f82f375c07a5c1448209 GIT binary patch literal 56964 zcmagFRan&B8#YRJcejAFl=P4iqI7pi2uesv4c!gW-QChKba$tOB1m@*^ZVxgfBV{p zdmqfPu#JFJ{kidWq#cp0r`X$U0TzGeADy;?o`b9|32aO_rj@KUR-|Uwa{xX8rP4w2f41+Z)3$$a-S2GqY>OV` zemkQKG^Sg~AfuB09fm18fHGaajUYl3r^31s5l3=KsK^i*PgLKR>`a1{5i{~zSy)6O zL;h8P<0zy^V4h%@eD=G#Uiz+^a2~Zt<<)R2_(6&j1ai zE@Z*=B9xUO&j(3ZaHJPLku+L?7d!*At^xflz#jLw24r|FTfuV*jG>m`~$DV-y#?snPA2Y%Aa8@2rpv= z2X+*Pf9v;j@3*=gOcN`RP;XgA2<=1SB&;zHaA8BZLDHuY;~mGrUBI!3$2%mEU`#j| z+!KrL7}!UR2BEmNCnM#9^x8(^9Lqtzh|5fZDsFRcBBsej_?a^TEs$7SLW`K?Yq;8? z-CCHD&v-c*aHNL%<(&84$h8rih0i0i%?0lknIlPj=$%VMd||&qrCTQH!IvtMvAs~> zR#dFEzg?)Lx86A%-IKN+83{VHW1CYv)YVc{d?O?lc9kwut>mb6SlITdyd1G(WPC1B zF}}PfUWRhKJn}Fa#2b$ciE=>Z zhOb3>(8*rNEL71F<*jI#Go^(i>$2_}Jab$Hvz=MFd>Osp!Q7Qvdb2Gv`5OM+_AlKp z-uTydH1fwngPm$X4}f!ha|{~H5?)-WqaW_i7}>|lessfQ4xq+#PbVJ4I$I>xSMvJ_ zn9uZdzrpo-0cSo?A&y>vB@`wB3$7iPwb|!C?;_0D(wJE>d$ce@NUGI^qsNK}Q~1!? z=YcW)C(sWS=?BO=gh|<|uL#bL1f`1;u=s-A-16%1@&-2cYTSA>G)4_ULQt44r4nMG zx9);vC@lH}o&QFyFY=$+prAdXn-nKJKL#!3jz!`*)ph?=AxHfIB@M!iCSZzvgoIBk zC;=)a1f?AhwkDw3a=E=@JemMWK8w)aLb5Ds_9xmHRQcp}ihs+7!$BX}6D8UZ6VZiu z@Pz?P%|$Y#+d+(=hyXB!^)0xP{|Owd+8gx%LR3rG14xiacL6Fyf;#NdN*>RjdRTfS zqef&2AI&x8 z?92a|TFOG4&4P?d6$lOV{47nMBIL0rWOE`fjb{A-3ar)#!pSsR^vN~H>7{pJAe|_H z*u@L05vU_XXadUso}Vd77dvrIWCu(%zB6jt>Z$AF@F5=}#1ICwGP?5}20&B}>Tnyc z%=8R@X5&0-*Q2Nw66etojqA!>rUfuP#;f+f9|OxH{fL=`up<09M2tJSlD^K{QR%)Z zVe4t7%YlIEQOKmzrm!q988|{r5Lwu!dkGKaD%py|uHLldil2Ge&@t zFg;;4xAu{yv{#gAk?`+p)wo_!u9T?~frn`nnqNbdif(w>y?edLdHq#`gS<8gs1Y{@TM1)FOAY4^#3QGzEHPG^WsDxFxLD{r z!lM6TucXJIUxn&5sE=m$TSNI6BT(1GJVK6MS2?KLp-EEooUpZvrSPO9NRsMZvnZkM z&pis+u|1iX<;h$`(%-bV+G(~)4ECynM$dp9(g`qh%)%}A>Ns%k1#JJ!8ydvS05u~< zP;rx~K7vAmliCXLcx)C+20WvIv8Fo4ejShqNz(l~>YG1xjxOkz8Oz0I#(%SI1=WLwzdsmOD_W}3UM${;F!%fdqQKntX&c&6{OjO66r*! zVxLCIJ_w645?I0rFjzN_f`>ncsI4&Reueo`laB;PJv9>6Ozi7T^1+Sg3Yr-PbN6W_ ziq}jP-GlLcOW6W6`hl{K(0I#_@M9Jwl-z^MwIyWX(XRghxkUNZ+m2BGQ`V^%$;tZO z$MO6y%5Ic|0`2mUDUN|G$q+%VEVGW%sxO}YU%Li5%TbUu_bjoOdG(u`d^7%jXdATy z3QiVlbtvNyEw;uicf4AL*PqsDQ zy7En>&rQc3bbAH^RSwH6;xS;mWs-BJb+MKHk1;jdD5bIG4#JEC=M9+VvH%L9D(eWE zEi&esuva!KIflVwJPR)@dcsEfcSRgRQPUc(3!2s-pe#c9Oiy|V%;O*w@I>h5NS&ng zk-DF}5Xip|mf~cg_@y35(esgwTR^b16!C7AgfR9GQWtqM=^FO@gQdps~`e_20tv@EmTn%I;VCwhLvfLa>kFH(% z5&|LBKjkA+S`FeN0*`{)=xAgl24FO!!+^(2Vg zg&BVVUteh%`Ay|D*k|8af%d&L0tHHguhoMhBVsb{3kjkXqFX)ROx*&9JGtqZ$-_Ds zbM+u%Xg#d~9o74XQGAlhZi&OF%tTVzFANR#I;V@J5za;RBPAAM;JC10F@t9C3?|H z`~iTvK%QLm3IyWHH#GPy9yRvJ!=f0yfmc zX6X^1j*(yb4iYcOE6*?Zp4Zg8pB{0OePgO&WJs~Z#s9$Ul8yAq)8<#%OC#tcbD%h- ziuVADM6Qy;njMM@?Dvh@;93ZVKBMYeiBRby71ktY?Xp^v3Tvbv(r$?04o?i|*8~G# zsppBa5G?WnQucls(IR*>(+W7F9PTYrzi|B;Kt!)`dF3RO038d^y>*HN^0yfZg47Y& z(Xir~I5zMPXYiiLXonOrk9l6Dtd*m&-4q!XRYIlOrS;%o??FoJCP(@(9_#1q zb5naDqT|;9Yw6O9Jawe;k2pve3;_s87|{IyGJ2dCnB!XlX@tOc7<}ORL>ft!5&J!6 zLsygcu8S47v;t#u?_6&ZXv!kv?Z*5JlZxX0*fEG^D#r;Y6@~v1`QV$v$K5RdDE&S+ zCe@DJE;5kl3$v)Vpxr12!$ltAm&-mJQ^2RlzY<`E|04KJzI&H%w|C)Z5+uri6+`Mn zC*M=v7kP|XB5LfK&s(IXxNh*f{2&(Q|lA_9%(aj3A{RoG>i4=v+YVV{cULzDmFNO8YU8f4S72smc z_M%wD%=Jm@)r(0_pv8`niN`z#1b!Y9BPF94{S)07OITV2?hXs$pQ*IHs*hjH)Z&bo zwiKZJ{64*Wun1;G#0vYwU<4!sOo#R${F79Q0G?>UhupGFAxN5L`d5kCg5c`6Xz2I8$W1=twArc^J0sWGT*fR!U) zb(9G2Z+m0RW`X}0&>|yBQUER&(iP^Cp;R7&*vLxu?|qC&9|A^=-?B`12k9C{5`xLY zMDps3ETeyc;g@3Ax!QODM*|Z3AAtXszCs&I6Ods>u=yvHl-V#|i{QNUl~@DUI09m& zPVtb;HL@M<>>K+HYUAosAl&2xBkq#+g5@EtLF7O8E{>3<)ILm@rIG5U!Xj@MfltoN zB91&cjIPV-(+|;_Hh@_v3_CRB0r-s4>$7DRZ=#N*x5)TnfRwT+1`#KWtV>*e6sm|u ziRfK9l=cAPIcx#m5IRFz5&7_6R_4f2;DVG2fKv;|k(K}7DHmUEpW<(SM?J;#z|nX? zxnWw1n_d3u7J0?lDtpUg<(vFF6?64i+)=98a_MClry5`zE{6KezK}|SLnP$&BA~2! zxs5^;8SntMLkW;}zlFGWM`-eH%*e^%>l$nWq3A{RR)Ms9ma|26n+%31$)cDGID(`# z3_q!BW)ZM&L@XE)Rq2{%DWWH*lD-{glFk-}OLs&Bva8a$kuN0Jhahm^5q|I^kQ%b`@p$NVHft^S~egmsvQun@iY z1TTkMkPuS7CVfc7N6%$=fRJQ~5%lX8Y+NoV=n@!2#TSM9k&oUIN3$ zg{aG4QSN%>U8x3xi*R@QXD&Wy*0eZLXQP+K6<=DlIbSjVKVVtmyIssKk?WJb$(+by z66w1PwiP`&L8ENacQsb8%DE3>;myj)&1`p$a8X>W@bE)Rz;-d};B(cs%`JLR7@Fxh z)l$U|oXQoIxP=NU6U#o!YU!GZq!|Ulj&bQ(>Gqk3d|JxsrGR4F*szGay>RoQ&a})Wj6Z z2DOn(m%uoEG|uh)H=_9S0nkw5zXY+!!xnJL`v5gj_%%J(EolY=c~nn<{nN6@8=$fsUqf{fY?!1 zb$sE)7EC)#jEFZo@xj#qy#gK_zEZ&9E2Llp6m<{AfS(JF)GYsF5fznH!08X!6z?^F zNpKPI#}9lVH-z~bU_OU-A71~8kxyzr{VM#mpuD7WaAXG=fU%Kl`GcW#R8N=NS1-Xb z%P`(}*rNsF5);j~a)499U70FO(H;QtCx*Lz_H;r zenJfpq*o0nA0<}u0?{!q;VSP=;Ed-&7x&T3zro|Qjx<1~5hCb%0P@4cVrVpBMp=XM zhCCgC_|hdrJ}P8)>6zR@7+QF>0Bm>wkj;PQW*&pbhDhD(!Mp*;snTyFMzU3V1rr}8 zBh{)lF5Nfwe*{S%g$hN{ytz`5p;#HFu>LuVF?s>Os|s9^GEHy??ufe0&Km||h%Ecx<^!q+6jUa zlYc&Y8uCpb1A@fTN>A#oTdXyaAhVEHtLW-Kau(tlwEvk;*cz^9m3 z#r1Kq~e#Rpxe+AYP_ex z1Dy?1Ar6#c zI#?*VjP$R#Th~Ri)sNCP8R^|XZF*CN0-HZ&&UZf)BV)Ps5^<}a6X&*DNk!=O6_^J! zV!!iq3i*%1%7+M}+I`&mNLX61)WygE{JUk8Y1H*QFY(s(zcUSzzcA!?@N%CrpkBh7c~jk}VYr4+{-n z#&O`u6nM=N9%}=3Zp%?sa9Ss*;yt1fQ(p{76Wl2X+hzzI8wP&+YXXYe&@ziaFp*sw zK%b~0zYI^l6X30ZdrTSxC~L!sPx?v^Ge?*_KV(eLR1xoOEag$lsg&p~{i;L1mMP_$ zG|0m6k%`Kas39So|EHv!o5Er6Lzo?k^)2Z89k{(QX5Jzo3JOvp`S;+2g?b6h;z-NZ zjbDO46MB2*QwMH-L9O9PFkWpgMG9akaVUdGsi+IXwLGfatu`dfwmgr-hy>*#0E!o zeV&d>y7Gb@VW98N;M*lYhYN{g9bhK-bOh44jDVIAB2?i}tL<)ub^343eW^cQd1sPP zj(y}Atg(KJ?J_Bw9Zn)cP>eDg(~NOGr%jxbl$E zOV4KkU9F0=yOE4a>?bv?@omh;JF`Md0N+K!?2xn}!!6DdJ3#g&Pc`u`U@Z?@!3k)G z7>*WDV%hdDPLso3;ip&fW!gO4hd-4#6T>jo25_S*eBUb4MuZ!kR$@yR3FRi>)r%Z zzv!7l^;|ps8OBmx@DGXxc0+0! zXZBW^i*0*lXiZe3DWgGc0+*grY83=)DUnMLA~`{d1VUbW*shH_hPO@&D{tHXzBr42L ztem_hiP1)k2fzM%`I!<&W^j)?Ah%71HTSp`FF9b)=Nk8-%%<}IAL<9#8m6QnIJHUl#g^fo3D!P#@)pEiwRAx+il5gl3o_%8}tbapT zV37Z7_eQenoG3E$?Bi4+`<9_82Sn|IC;@yXy#K(QdF9cSnNJD9f7wn*brdj8luspg zVU~vYX&?02?-rt?f1mlfGNUs)qsme^Znxa=hx5VTcEVL%RkV}WY|1I_d zb?t%v`{i~FyHb9zZRQ9`$fbxNS$JQJwjsH8F_3t{{|FjYg0|Wq)B+{HPRv|g6lgmb z5cPv~d-%2Eug#IYuaM#3c7P{bNj40?1$puK&dX*2rMVjmpFJ^F7e^ki`R5gwks!Pi);ccH3 ze`3A+K0)S$3YT@p&vKWy3mC|nu zD&1ZFd2s2o>c*U88PPm|EHB^<8qv9?R38@i=Yf^a1AyWQQsW(nh?}KS_huPC-ob`N zk|kxzQ3P3C2_X6Rq{hOr2b57FSX3@R;1;?jFD>0WIW^r3MCf?3#wt%eZNd6vH$3^6C!kZwP3; zHc)SXvef_@m?T7SppEE!srCa^+MN{G4E)L>q{Pi2N$`POIbiAW56l%)eHq4F2lJeA zQ#rWOQX$f22Q(_?Z{ihC-~?Npu@ZhM2>SG=%8b!s@-jvlvleS8(w&4B^>0odVP?fY zpbLNQM`Xf)&Yk^d04@>qNw8|o&hD6{SU$#cFat7q1kZWz5Pauh?(d;9&I*Ce`}k-G z)aHZvigRr;%^0lTh)OFWqF25mrAn)1FVI?X?L8(5q@OOx$vc{%BZHG_NI`P%n@`uU z+bWtHu<+#tvAo2W^lteARlc%Q`&_g%$Ts?f^mNO3k>Fpf?g^70W6-~hYcgqgfJ_A%Z()#{I zCvNi8x|t8hzd@9?{z{PZ@(H#BPm&aJfVXu#em+hbz6O%AHxMpc!0_KT1dpQBudoXu zyPp%H)Rh$2QT$1*A0b^2Ad#xC7|H1Nvc5cOJ19W>@PAUq3Hz%U1h^Bg+yditWBafA z%-eIRx=?>8klhvshFJC84oNNf##FFq)|D3MBE50^sn#nsXp`@f6&TAjS)Pp3D4fa= zhCCIB1F)%s`+)+qH&-hp?yxyc2&!}ejMoH+j2IzIcu<2k_j~LoP{D4x<~f!#7Otn_ zr%&=*TQdLC76aTU2=T*o$&}CoJMqMm{hTN&hMyw*Lr3;^1=V1!%PaoJK&byv!aTh~)h8Ht^^ukEXFYl=JiC zgL>VBCsW}sd*kk=6yPtR?K!}kumub)$QIJHBl2Bdqh7FFWzZ;z>s4HpQINo`fBR?p zz=$HIM|!wpCrnkZa{x^J*;DEE-8S}xSe^2kZ;bv1{$KgVjxyj|izUl*!%q*ZH?Bs& zO)-o<&=ICbuJCB~g?pZ^UymYdxw&w5E zHM2*XR0y&l&c{FBll5d6vjFgu2AJZ4zy#L6L4St8(Re~}T1kfaDhG&~<-qSt{#)?a z|L{4vyG+cHjp%>&T%g}Ha&wS76d^ILE>;Fzu$NLPTi`HqmC_FW>`1ecw?b;d1wFI! zFZ=g3w&eo?Z59s<&6Nv`!rhGCf#+R!Wc;_%5}OE#?`O~HT)P`(%2Es8a&22Fr|4tE zv%nn!xH$gmbvbZDeFYj{1eg;OpiY^H2?b%$cn)1lCPYH3gB3oHo`{BPOrZl5(SN&@ zgVn$Ay{i7u7%WICQ#Bp!H9(I9BY1(fZXrQd%G+{}63CEpesn@J zx}zk<6|iVT7d`E<$A>yiSP;kO$1jR>P_HgxOR=31FwiOTJ7PMJSf9o#T}!{foPdvz ztu5qcU0pwTu+7rsK~-47Bq`UeA@JFPc<^`FD#i|LPi#3Lyd);Mt?Wiej68{e@h1#U zDDq~k&38WRJFMr|`0kThderU~KK2W-PV||#XY14W4P-KTv=MIL4;r_}5f*q89UBs7 z%HW6bJ}cMam0+_5iPFR68P?+`<-!TlJMX+a4+IF!nRR{VA~)mj#s!GI{-oC z*dmyL@d;vsz$F+^LIt0@qMB1`i3))tBILMUy_n`Z=g|^@_HKb9Yh1%B%_yVont5y@ z^~fJs=wE@Xc%CRL-igBYT6o3Ox2Zcb)B6Ix|pDS363HvR>Sp9tN(}g-WShbdL zx!%TdDcM4w_6_oC@*da3?_LadRcY=X)|P`65dJEUYvL^%Z$>=@E*Z4HI#K(mXP5*N z1x_tmVAL8702qU%s{t;=E9GhpJjJsme!2oByNo`;UtIXy_>VmCk{ggz10ovcEBKy1 zuWg^jN*OfP)HWPx2@m+;f=~Uf{GVC;>tnLs*^0jo!}=G$6}`_E5jWhV8_5naCHR)p zb?b@w{*G+vGn=mpT5#jMKGT2bs6BDNoFx5E)k)iit2*OVYBiCT&I3p+x7eBec=7IH zAJfBNw-T``65TyRxyT zLZFPGg8$KsT?q;o+FQJ>7YQt}~rsRTR{(DGicO1@fRDXs2QJ88u0s+XWk~?+{Z74y9Y(yxHrlFH9g2 znMUhbLdVg@PQ$~-u~uRIEcUdbHT3$r`e`{|@v}*A&>@#_G9%UIxv4Wt{Ab5~*Z;b7 zBP@@|smHuDU>M``gK&Z@K%eo%%YsFi2uJ@rp*$E`wC8Z8^~bj96=^V0yVqA~V+oD)KzPVVG6DQ`TeE?=IbW=sPgkn?*xMO7KM?`e!u=mVKH_adj6r>!kb4Da zx$;|NBV16W&ytmBRJ4JtS?gxOT3a%DH`)aZlbKh+{tegEN*LM{A9eiD6s+=)l0z<~es2Pm2NnH~IPJOQZ8U#`pc!&-U{ohbDkq`r+=Fdgg=xd?N*(QtyPtCPe$>{kOIV%w(f=tgRPL;^$r#&%?THA4)0xeH_vLxKsZ8rY<%5-K&aAkgpGh zdgk%@d)d$2nmV^W@2|(+nZw0HOWcF$cg zV+_o9TKMyKGQ-gFGgEz3m6` zDLab42A@o=-JRioy=}HLi#gsswz~D7Jt5EX(GkmDzg?>uBdqS8xe{$ZZ}Q&UQlah& z610rGPhor?#Z zf78Y@*{kU*8O1NxpsDQwGi%i4jg0fAw{DBA*;8|7Tic)B8Lc@TKA8YLvWWwDv!!- zM#|0NREgu!PWpMfoYg_+7oTewEV3krI2b*}gq@qi{qagQ{WmGirhVH5XX`@3PI8@3 zO3GYP$QKR{S5V_OSGoghNOuhfbN_zTU&vX zEYpGC)?zlhX=aa!dl<>yN(mre^Q&QOPUg1nigp_&_y3rH?Eey~N z?jh+&`{|#SxUw?dOdFe#eO9j<-XrBFAC~8Dw_a`hd?Ps^*E&M_^*wm+tF|%J4qDk7 zBy^xfcD-?;rfQi-9AsryixZD0EC%xAYgL>N3ZD`0`eI>l_VZR|Z={a)W2^!BR>#E9 z4`ej3v2xG7$*7-c;`1sbyxvGTWA?g~?^)Jhy<4&3&9>9mnGd4Z0b2Ub_lwaU+Z|aV zeq)=Q&`};|6%w1gp!3r?MyYQNk?zOo>7&gN6(jE%@UMD@i-_V)NQsL3YbY>D^hcyZqwIKal2au6pyQ#5_Y?GI8- zVBqgxVOrbohJ$p@&$%Y`!EppHg^wdD&L|Tlru*wW^#;*vahVn}__pVH=cEtmkjWpZohXXYt8? z(h@9APJfo(y03QELljp_bZ5disP|>}{2~3AQsetD=`H_7)+H8b*Q6^p^g`X$C0^}I zVN++Q&P_MsZk@B1!DhuD@)71ZdLJ4WN6Q}<>KfVgmEZys->=omB^AFqc1!x7cl*%K zu*<$qy79EF9az2p?3mnK>FM1crAK?mRZgWYRNA%YVURI*=JEPLYr=J9^CRaN?_`$f zYv5njO$h6ZUEdGyA;*>WiMg#%7jI9RT5ykxoc_8*jb+3|w9lu~i}k=&y&rmzgWSJ( z?d^rtklTqr_}L{50>2H9(|&v(?7%nmZy#S@1uv&$pTFwYKlnZ*j6HxRGSccW-+4s3 z@OkX2u?%P8Re1aH?ZWuEyAtQN;gjh@d)J?1zc}8ItcvO_d?w=++~ty-IF26I{LjiX zY?jK8QP?HuA@okgn9Ra{#U}o`L$-7zsW5?S)q5B(&EHS822cJ<`#kqaP~jh^cVsaH zA6*@E8;g#`7V{^L{&|V-zr?H;h!g4$9jx$^R zfu?5%xU-@0QQ~ff*WUDRTxOU9hbHEJ)K!?R?B0Y;{p^10T_(pl9OXiqhgNLDZFK7S zy7{0%YJY&t#IT_%{CrYFH~QVSA*7As?Y;R#&%h1xlTqH;nU#X^Q|iy=gLJN%uOWS} zPStdW;|n(pvJx6R(`;vgCva;!amEf|JF^IEVo&DlIkU-=TB$3M;!VQ|1@0Z9l8oQp zLENY$ce|EWoBkM`i*%m(%smJH)yT_xOF8eaE0pvqQ38$V=8I zy!_2L8hdlI5>1f%L=WlpQYSubcdoLJ`|6p8axb6RK$^IoiJ{IcEbeSa(KM@xOX`L` zQnYo3^J+MM+G(~5@2UH>DXeh6uP|jJH}#y$4&BdiyE}-}PFG~q-r?Ib{#(Nv2k;rR zUWa~Uuchb9mu;TBt_i_2cB@!_XUJpxYHhUl(Uz#5m{T?VCv~(5pQ&0)f#>|#`;Hs_ zo+@H%p`kBNdlt!GO5G_*>a_?Q3gylPHXPbvMZfMl9q-gGsBK+dzMHDZ($Cy#JY_5+ zo)M?Imvni5+y7$fivIFS>xt*h&z4^~1~gQx%FL4PC zO-aED-}tA?icc(imdX}OMwWI)F6EuweIDu)AF|hs{*Ko<^cAU7-nkc-Zvy+K*5coX z;wUJ}ZZOvFtClxE)a1j-pT=lBKTi|s8=tuO zwGXT{FK>y5eOLq3))O$Lrv8bB&S5Klx#fx2V6poY(|Nh(@nu0*E^T`HD3U&5t>op` zZP>z=MA@?mMfV_17D%|rjhx-I)kFH?PbhllM|wU1j)~W^2KO~nTzNI`N|R%4_4j{m zN)3H>xpsO>nOb+H)MbB3mSv~vOxU#WP^ou5pm3)JVKaol$eJa4tkkO39(dzda(~jN zq$jlY=JD&ZbtT_+9{1PkW~W!8KlVQkxe$tf#exWZAj;*$w);yvOYtCa0!u?Zw02H@BG|=(W#QJ8c>S`_q6+tNKV2D(>z4-^M~3rTAu#d4 zka&vB=dW7n{(JR!9v_mfFFLQ3$5r$;b=XLS>nzqJ7eqA`*63rL#*tmnn zkt%+i-Vsl}@LEUV==T1_u%4(&<()oF6)J}Q=m=T6J8F`tF0 zht6Sg*_C%fpN6=ayI}^mqy9a9qK3Lo_=o)6@{m$ zmil%k*Gsc@X^ez~yr1tw!f!tJR-B5K<^wyNgzFILmx^?sz1d{ z7QZ#)`&MM6c6TCPLi%~^gc>`NIc7!EZzTRGX2dwp^CwgJ;Gg$VXP9bkzbu#MVm&D2 zfLtWKWYKsn@1v&^wHrKtqT*J9lClY>X$l2Cn^+1}*6D32DxvE?&Df{aVG6YpeNx3B zcCk@+-_-K~?Bx%gC)`JmE=t$ulxXL!acLc|gm6Dw?QHtpWnWFm{++y$^v{7*D{oNv zd|mFpeD9&EMk&D6(O5ZE;BRm2;DZkd51Zk$4cxura}#!k-J7ehO4^}_3sMN|-noV2 z4~%kdYnsx4B|g8M@x9+fcEG_|#qYc@Zh89>u$$Q>?y}-$?99@X&^%#p5dDZ$EBV{P z!b5#6OSIO+R}8dJ;B$)6%c89CicAdkPuXNT8;eEAn@c7>99;G85aBfam&y-TGM0v^Ioe!zm{-@=cH*ovF?`L zm{g&7XL&`&FR970@@`i9VpJ0f?v9}spQhUj@m9l@Jg*{pmE+AvSeX-LM)$v>EHO&Y zDd<#O@Jy-S2c}0Sj9=ZQsxwZfgC$!&U%U8xMl&ABVCNi62T-jNpM_7?iF*HlOq^bQ zLt2xs9p+8Do$+XFxVEfcuGd=H^r+8s1f*7Z>py;Y6ue9}8r*p%>@37>o^fn}P*0qU zXG&eIcaP+?=MaDR_XQ>ju^ZrwR+^U^S!>GM7N(=Us?U4LVKNl|Z94UrNGeX>^6k@| zt=>F}<7Tl{nhC9(a%rjqdSklY0+A^%=eAdg!+hF?QzjnNLw=_3+j=#b-(f|Yc+&`v zl$ZE}#yH&y=`uxuzpR>x__iE%RG#goaE9sNIz z&eXUR)6TF--rz=MR%L+>I3)R__{@Ft)TTSi^bXf=qeLuTi|}2leD?M2*V*9f{?YoV zCC)wKH)jx?)qzoTzOeahSeZf0Z zbj}@PpGFQnhxd%Gd$>q)r*sJGJG1XB^-I!W8mPhl-o*8e*W_g7C1EJ+vVgwsFI%%2 z==?+8Tg3CCvgu7{;fDAA=B>B~rc)OnQM>D+>zbq!_t;GdTOaPMoVmr^gqe(eVO$CR z4hU~_+uC{Z=^g2dz{l+#)4A@Yu#?+mZX{N(+UA1kCSwGNl{H%&7A+6``xM}0IUvd+!b+LUn?EMTI zbB4i4Hb*9(RicHQQax>6T3C!bO|GYn6wR`_*(@I&w#bgtj6m4>o5r(!&cDWsSO;D} zxDpq8^w(>0TIgaK$2a1hygn|vZNC@h zFWaqOH&fJ7l-#^OA=B?&zxY_$_nFt*T%N`sh$&EauY3cfJ8RKvASv*D`%QwV<47cyJAGJ8 zd?;=9e|%~|iT_=7=h5Q>gk0K`h3=}|e~CeH*$V4gcRJmFwuv`Gf38G2`X$xGuNW@= zsYlcq(A}3_P`yslFcOxG-uG$uTQ8oO`ab|UK*qn>Ic8w)-UEB$d{gdUZLL%FZ+U9S zl=mC*naNj<5?$7frN$gtm&3%QJUi-J26pV;W$9i#HFZYH_kG2s0W7D1fulC~WQ0Wu zmluq_bUJH+@2*iBcw<(Dd*hCD@*4K+(q&e=l=YnhH?`e?8RT`L*kG_FDC)V%lX~4} z_VnPKHjb-jt=rlu@#vW{t1BnZ9GKwt?14$;$;ErMVhiq!U*>o%%#D~s4mVzXMfXVm znC2yWzQk=MZ8N$(RfeYUYpK`Xq}qnAAHyL)4)AB7Z#4$Y1pD{ z8)utq(zc!ciKub-mK)E^*B;Z?wsYKrQ4zyAQOuF1-jyv~OuV*dp1r$o!@3W>GsX`H zb}7QY?P#2AHs)@qo>8;>rt8lqEvN8C5z;+Z#=ncs8(A{tgmbjpy^p((`kOZMI+KHS zzGAUB`!wD^+P=8_~ln2pU4z4f!KIy%;=P9H4)Zw>1BjV?6Je9oPKW*RnmK&-{ z+Qg37QyDi=nAEHk($~FP3rj!c2($2qM!48ltpwAKKM_J|!Li+?!ZRQDl~)Nj6$qz3 zaGy@jb@4vBVG!Tda>@1bXm07t^ocLK$ITn?Wu_m^H?Pgck)^GB4E?b6rR~7*!=nZn z5={%kEH+g1BDI=!I-= z2@X-L#05oz%x5M#eeX@Zhjv_l+URNjVBeEkt55HEI*hWSQ+E7>wV^&E`({K0t=`Js z=kW0MQjceuS%LbGm-%G9$#UxzytwVMy}rXNUeb2Dopo;C{Qal|RO_WH`?fARd2rMF zNq!}_d|wnVcQkihGW}`7!D0JDI1A&vGfo_9Z;QH;^pCzN`C!=BJ?-?5G`nG^9Z>b0 zxnlY1{(TcOLW%cmw0(^Ur^60Sn>1+ofMd_cqe}7j9{JtMZ1JA|Ftx{B+|4x~l9Ja< zbr||;yz!NbZ2LL=DC@Frx^*fURMD=ya^+Z^kj(DpriHDqG1~j^jy)?MBJggGUUQgt zujm8qK>5-fJ(nw~gD1HSm~*!4)hF5jwKC*j`v~o$eNBV&`kD7-8O~!=MfI4sv&S2M zpIqF4pmxG8{cqY1Ub(3hd%ZRJ2z^A*%*xWy=ckOm6HwvkJ4??{Ft5{*Q5%jB);P9u z_U-@T*~>iFNe1`_VJn_!Wlg{0LKx6$&OgnW?Wvc#H_2T3@2xHRkG9@H$4}WCL%R2& z!|Vr791N$qC5*j%?)2rwT}O`R@@|fAb#Zgn)fN2~1g>+4zOtkD6YJR0`(K{lnGmiw z?y<*_(nU{iq$hsNEBKf_FJEJ_ zsxrp4J$HGPx#fV0?EUNCx?i@8>X@_h?Y-V_Ee=iH(*LM_)Z$ljpMt=iOBS&#jITr- zi)>Mb-#^FgqVPl4Nfrye7^%kvuiLcfGazwu%gQmP(Y-D&zGfCpp1tkrMW0an z0{bn?teg2;KGJ=h-)qBY+m3=_Bir|L({~SVoiusk$7vR*6U~Q?A$5PSr3J6W-PO2e zjEfoLeOx2ftx5|FDt-4h@JY-TM$U|k&kM&2ZjZXW|5&8I>2%?-g*cC=+xm5)t$g?o zOYcCyKPOIM?!Lj1*M!6eo|v<6jp5RSb+@0MN;dMnSD3V&__T2K>7cJ}OS-?q_FB{O zsd-v_!Hussf>P!#BCZ8Ny<&8SgGjhwWE;m}Ioa_-b z1z3bzo18lx@Mi7yD}Fn=c3p7l-9Odz3rmRny${EEIL_sim|j~>b<3#I^XQ)Gby?=fAQwAn}S{&ft>9_E3V9+sTcn8 z?VayK@+$1KKRnK7XH4B5Z+OtY1f{#YUGUYz?tAGr_PvkYzq(g4SaOUzR?4`WywPW4$ncIh3nfU)ZjIa*&h5|c2Nm-x_G;9-7Zqki6H(-#XC zh4PMVY93e4xfNyEI%f5(jGGHaY+3CbL<{q8rRUt{e8!cT6`7{TGZz=MUhgKX7_vGe z-uZBPM)L)IcVzE#ejJgUbuCL^=APr`I`#0k@>er&92ip2V@i41i{$(j&2vqU`FGj4 zA-ZuHPzpw>tf#%sMyb%kzSOgJD!`_o>aAqzzpEIWyC{TU`0I2hK@s|2v$r zr#Bbe*pe|KpElT^k#QmY<(r~(HZCQ(>|RpRVEx3z!UKDQi_^PDezL<}r1`qhIF%h| zL~P!Y(T$Fa`t`?LU z)tE=KHmhNOUj-VcgXrS@btfh+JUnc za0VYEKdO4V)UhYny7S1yfw;XV`nJsuI=a`q<&rKH3$oV^(EFhGuG8Lm*H*mhGZ;ha zJ+xm%=di*@G52m+U1~o$=h6b-Sv@BX(|O=}flBun>hd(-DD}wI#TzD5h=*{h`-9qWS&rn-=6a45Hg^o{i^uj+)Z!=#bAR=XnO*>exwl&pP`%B*q8* zV0xCT)xpU(KRVrx(~eEuXmEDcQ2UE{21mPXKK8nZ6x(<33@h!ztO-jU$1}`(<@VNj z?%K|Oty6OG_py3cs-{eEZM}?PnArEiqAb*?5V!KL%RYH&Su|}rb8_cfpAxU=?pt9~ z*?U3Q%FIKaetU&f8}hU6gC4$1jcHn*wQv-qg#795}Oy@>_MDX_$nn|E#e8F0m zj5~chOnhTGqugLE%KAla^C_N1b{2kTCuislH}2Jj8L~C4^PC5T-~EFxyh$uumfnpR zV&CGy`CAUBJ5vP3q@hdtCtD@;UmMN2jC*A2Gn={&L~q088OJ+^XWR<7yot2r=84(6 zQqH$?>NkC$UhwgO+Ci8%uf0$9Om($6&~GOGdWSBj9Sltk``z?sFSgp%WTwjjVZUkD ztn?N>Ib}f!SUPs8zcaP+>xQ(lF)el(&doZoy=mLc<4^Y5Jwu*M< z(86pb4N z*2HDKSHLVm_jQ-Um-IbCCmPw&AI|GK@_PB>hn#?-gIaF-rwsZ5Y^v?~F>fyTO$c_m ze8TyfQC>Nv*Qs_l3fi2wJnP1cCg}(7=#oZ%=x_($+;7*e)OF0Lj`z3b<{N(2^&a2R zGQ0e&Il5_a$D+l0=|w#QBMmPxw0&HC9ubD^UGu?g*Bd*Xlk?(&i^ruc$s9xP?tRNY zYG~}$4c?)rjz3#eVRdQD_=J&88OPWqf~!4fS?AWo&vY1ge$e^Z3(HmvX+N{=zQemhT(+gfHD*B|R=ymupZ*)h-Xu)GI8I$mpY zCReOj&^p7Hxx4fQS;WNmu^E0(H!=%OZs9zCn;rIgLgkoayn)U9TDM5fvk445);(obl^|rv)OkJM z^v}e;Pi<>{f?29p10{6_Gl0rYLcLv{To*E+q<{x4VAqI`7ctiUfP^wzuIfw2m2(=Tgq#{E_c zLOdKhtp>Db=dA-Sm0uJL=*I2WkA88_#Ac_O4z};4OP|(amvQs?S#KsdT)&V-+6EC_xSRBjmy19KH>wst-^Hq~SbZ|DZ4z4(y8F;mF!{n{_i`|T#=#BHb_>%PGrEgXddGpAK86(*POPFh}6ZHNECP3N0 zCu8W6ePK~9D_P=G$df8VYN}=Cwcb?D3zcE6d_kC-oj8ZTHDJ_D9Qt~R&Dr(%fxNCV zjCHr}>3sAK>CpJHQN-G;+;!sebUkK&<5i-eFJ$}xixI*a0|Sj`5nU1@)c87@o**|fH74|= zm6c||q6@UnAX|Wh0^-aN+9I~opsO9O9#>Y+^n+!f@A zgVKmg&hB>jmZ6bX^-#yq%_J*)i5y{;=FpYIuMRxNla*JXBrKD3g>q#K*UQV|F7#JR z8O`O+bw%=ij1Nv>@%+OlFM2Nyo>e3gibA}4+rky+vEt};oU(J^N|99{nx$twPs)37 z@=kk@%8sFEHo@&^42sm9w~03;iHYBTyF|ph$}m`L#vTjBP)LGt_Tad=QnXnSS38qy zx%IFlYhQr-1rEYWNbh7J07w0eGd<+JeVgKUN2s9mf9WU zt0vXaq|)UBjP07h)!^Pii;lm`sm5}f!Qu)9g@7*26+UwXcfl4U@`C{s=xzkNT>_Dv z?TS#kAc7_3JG!5XHo0_H&mIdkzAYpddI)nAQ~TF>R-_WI~B(P9*y~O_n}AHaL6|P&x~Keex@6yLelpZWq#l9v6%gNl7`=-|HQSEAhX~M-Xhf^`Yss=;1ob& zh}6OHk$NU)9qB_D+>d4nEgci_L3MNjMu#`ha+%!5iQs;{k-V7_;feX z%=&}kdA#Njwac120_G88$3~NeFdY%ny<+$Qse*C_hS-M*#Far1U+^W=sA|;AK(xAmiYgzot}@)|%{H83DU{l?~h&$)~TX+Qx5GBnw4$fB$ z9WD0+4+v6LA|^p1$VGJxP^ddYVN@J8s!QTfy))Jo{$8dT*NRbu>Q1A8Ef@|8SA3Za zO)d}$3J#p;DUVg*nKQx-QVABV0@;mjiLtS0ghYFBP-#|xzff()WLX%uIWbR4Xxopt zo@1=%IhtD3AuGC zrtZtt$e7wzxq5isL1EZN*Kix~k)cU!X!90p0j?nb#>Fs#M`vj;J-?Z$#{Gkb>rU(x zRD(hNF-8O8%`S{|3we>RK2PSDm9Xg*@f(y5&!l%mfCeh+~s{a6_tnpf`O*^Kj?dO(e>q@D!dg1J?%YQ}N$aN4a9lj{ z!wjYZV+IP_w1iY7>8R))Rr^$2{1r`-&Og`1|kZ|^J?<|~QIg>t{j>w7*wKVV@`fXoG#(xBVd;_!gZIjyJ zwJG4btEI}z^CU5AQ|e4H@ur|{_nV@TZ`E(Rs$GiIF{Qi`ZBigsD4x>nZ!ZwXSL`r~ ziJvD$e$-+z7=NWl8x2|acyE^LDQ#`Z`d5y0P(|vu&BH9j&<{5zMaw*bbJM=*^CqgT&gd#aTF2smm-`pC)_cKtBn-3!(W3$pelrh z#U~ILM0_)sGZX_7Gz4``y0AbaD-rZItHR?GxpZYm6p2osE` z4hG4kgoX1d&A|`k1%^@oiY6V;*@Y^wyD17`kRgPaS%xUYY@3m|kx49SO87lZ?4%q` zrG7dod>Ih{-l`tZbli|PBCHlBjl}5^Zpt`NrX+(E}sy9eR1zIVg z5zI(LG4pETG%%T@6fH!BqPR#jsu5fSC7`2qs-@?v!z?q1?M2A(TtZ>1V>D@+Gu3LT zF#jL_@!vCNUQMUeHIpW?0V`#uz+{2~=#WjnwB?4e} z!pW>y>yL3uu#iTMJO$Q)R0Rv#u&H9I1H;rpM9sD_g1#XPyo>;2aFqm=%|dY@ryS2x z4kc#1*(OR~1ek_kJlSl}Dpm!(EIF!ZR7pNWAw@)&bd(Z`d_Y^aS?cZ-lc=PzL9r0r z7PfN0ylN9VB%zMJ>OVHtg?Gqd1H!JHgU+2`b8oEo^qrx;Gu|6--X7~< z_x5nRJ=hI)HwVRQbb*@$QwjrxI~#f$!x?dQPVv!XH7PoWKy5mu^e!a7V%V`}b`;~m zGGdGh!hyosqj^4du%dvJ=!a}j7e?ogl8HrjZj%9x{t|6u2$Ziep62o{9q4rM^$O+*$H>0K+;*-LEQ#Zlq-q|fWOlGpFLan<%P`3s z$>|)4oV6M1qr+~<5=I+o^PG~sL}Bo~Bz52;l}=HCnUY*tAgA&(kV6TB%48T8X2s`Q z5KYg60m7<~w94=%Q;f64MP0WtRvQG1Z#KVGx1e78Wyk$e`e)807f?qI%dEXhG6At3 zPiPQNtbFpR$l;X3jT$!z;AlQViP0ze3OM=tBm@$)74YlbE3O6ItZk(ncYG`5*)BbG zW!NtLyZ$Z%?p!(G&b0&X{MZBTEDgAG?SMPi40vb(3s&7mUDaVmaP~@ zgC`!on#J=J51ey7sh)5wbz*FBamthMMjW0px&&8=Uq(zE$V3!}G@0yLPO}TOQtBI}AV$TU%eR?FF^}M{WQ6$MFAeZ+7~-2p_P@?vZU6gF_CM5AP)b6tZ0|Gvkt#w+Fhs8*)t2P7EHou39hRelL0!z;6g|JS>+^1`Ck>-?9 zv#}6L(F}vaDsRF|IYT&ZUp-*`5voW$w>Q=;lyY}Q1a6bNv9PF=YJu#P6&Ydsm=g9b z0zO`ua(;kMIoO;PUSZ}1+|`U#8j|#=xWgFip@j3W!=!$%t%>kmjD5JOk0tP#{9Su& z^{d+c3MgL_A8yo5}xO@HcVh0vY~Da%61?q|82QVQxaQPTl2q5!niT07-yt}1I(7tWCq2K ztK!Zzsel1U#(PhJkGx-C^C4oaS>=9lJu*nCbhVBNwjA~cqS$>Zt4bHlR8QrG#6Uu5 z)P|d}_4YQGHWx0IujPm&iMC)=<5%rulC#-z3f7!6LC}i^xfOSEzh7BcyrC^Y?coqD zYFTiFY0fSQ)~823WFB3+2O5=jnie3S>u#C`BXein_WF7w=mzUci(HUKw`l0f1%JyG zi?4W$&Q=~|_ZzsWb((6cskWPHM-)RAg_K`JywO_zujT(ADE~YD-+S<><^PXT{s$4L zSA^007`K48`2TJ1?(J0bf41RAE&qQY`Tw3>?TX`{XVtwnxo1Hc25}j^HY7WX$)ah* zwkU|tW(2!mGyx*Om~IXNK%42v8tw(Q!yBXl=h`IyGJA&@1gMJUltSoo2=anan&Me) zL`%}-yXtW$H$=#OlzuYDYkF@n5sUF zy+2B3Ab0T}W%#Ib&Fkik6gFG!bzIsw$tnNANDo6o38TvuK^GG> zxwi)HMI+wF)U5$u7wEULQohJDQutp%i~P=hDF;H~e`gwL$HEM#5*&e;y_qgAnn?_E)@RSGR&`4JeHn z`MkKjG40!t6-YUyxfCHdR<~4Kx>GR`)NAqK*P>(AqI|F7Tp^)O8*uxe`M6?fq?(4~ zn`rq+W6kW)Y^^X}`{B6Pu+^&Hch#m3yZ1M$`0jUI)%G{nop;a=s9~t2YYMt0(CxO@ zsJ>!0dG(cdHgS#Do>~v`6|>Ua0=j#>`hm&#@NN}t`a4%ug^%92uEK^5ciw{ybMC5` ze4Nb^v4zwohOtL25*51EqC;PZX{$;{Jt6evl9dix)vu;xltlx-yZY;NHgi@p-VHsD z+0J#36n~_-1FE&TEo=vJ#Wx763aZ7lrBBM7zfV zFD}cs?8oD7JXX8U1{wJsv)0_dnv}NQMoOsM`g@?GpNEXt17l>5V9AYH4nMMjE*|fy z{73|1>!e*?%(1wI6z*x*MQN2;X0z(f!wCX0{V=-G_$8+)2*CcD|t8aY1SmnC^38jrDb5vSy6yhNbfNW{!(PR~W(5@i3XCnHG<{r7UM;q$;+)b>5`J zrEU%;N%4D?fT)Xb4pWzSPvRD!Th*D|s?JG`#XHe#2Fm~n5zaV3x>bh8-c8MxbQU)K zC~U`bih;r5QVKf8T?4gUr3vUHb7Lfk!9IOa zr3P#D5kV^c+M7+a;{?x{ zBke9$WY-TW5Uen0~BME^Sbtndu`OO;#`QA2AUXJcn@0JhF z1Kc3XxjhZgc^EA?&!@A52A&I(g2o8c&KC{u)0KsM^$ad+6m`~GS)j1yQ}SuC-u7|X z`m2fdBFQ?5mt{1qwNc=RxbeSO0Gw?IT7Ll~k!ceHl zWFNIeUnYNk>KHQqc5Y53e|7-jIJKF#6Y;NDK?f)OG{ePm~0)!_edNC*3ESX4RI(u9=**1z_qD{u&ihcBga4v zQb#{uUm$FAxB{kl*Wx(1AiAK#-RRp8kA+=~IbE*0kHPzterV)O19TSi|K#Tr^m|2@ zSd?l(Sinvuj?E?WM7fVwSKCV{h>eH~16>TybgU(g&0Lkl{6HpqG(V8Dfux^gMbt=7 z^K&zwMeTXw1(!((0}rznxt9{;MQ$JmRKSo45)_Jd5j4!ec8~&GA<#bFM zISfZ7lmP=UB!BZ$*4L<#Hv*<$MsLWs`y^ZgR)kfU+66a5W)H5y_^@F*;>VcV)`xo1 zgpoj8;m#~^HibbKF0-8b9NlEKbzWsSp*dc|qf1>vlA*U7+>h)Eht$S0w9N81=)`=* zg+yxqW^*59M~q08Z`Rd@>a2g;Tq?P;+`dzAWr60B)+VNmrZ`KXVF*ltc=tnwfrDTr zCIJq>g)L%;33J~Qd<(`UAQr=^>N5<=oQT>omc*ubS3RG_sNOXIPH;y}(uF(YR0&T` zM*3U|gkA~Y<2+x1b6b$aPxsF#T_Vp=0>ClsXCuIB{>OaXI z%W2f%=Fi4b*lg@d6{KlE$+xpfKu{MziSer90%}9$$%?ShS<`6>7+|VPm715?v3|%| z<;%@tw6d?BqQ-!XoS35fnM-7xK6;M}dSs6C2hg z3l4*d5U1cA=j0~`yksokJ)zidSPRVfOB8JZ?IOsJ;M@q7hmN`Cgo0M&-svNl3o8x@ zAOq^ebLl&@XBqV+W39LFJkAl#j>c{|pYNoLXD}NH0)b-KYh%u*y((=U5lS89owi4< z(^He{9chISr6|81^VD(3xuTahI5yamCf>qXuiCsE(?R32EY7Qd>s63Q1lLe_R8~3V zU&=YrW<%zFid+M5mkk3u(DzT z>fJC;8bZDm06wBpE)aG&aptFL8xAydzQi@b*s08k)ej_IADBWyi;Lb0j<8U?d7e<_ zZk9^&;6kI0FeQOU$JvaGUX&OR)!qmR1P{nPQ$R4L8iArj9Us8m#fY}{<;U7GFu zh|S7g!vB<*gD^1iP$ga(IMz@R z;PFj1;@U?j;BsR62-B$&#tfN;@#aGtl1yTfHe-YeaokwGx+{*y#IQ7aNiX{#8{`s^ ze9@KAx*s8b%C0D1aR_rP>2y?7th||F_eOT12@;+sGs>1Vl;}T|qIoMBkLBVBdhmtuXBml9HUEG3<9#w_dpjHXkluzps0_mBfddYXDvR|&@BBgCZ4CG4AqR zd;2MNrHvNRY@t##7FTT(rEZ|Z)p8$}H0Uc1UCX!Ls!T6QYOC09rN(#UBULLw>H2oA zBSgL`E^bM2Jc>^Q-ckf4uFNHj07L6*-eMhl)>vM|YgWl#+=+h`7lu!Z&Xn$|1w83y zt3cT56$Z>w>y9OpJwm#4bF;n>w}6J=Q_NGjJ4RZjcgx~!xu6q~T8L?dP1~g7ChNz@ z0`e5*c+7eFj)o6o+I6%kk7PA`e{H=4j@n^#RK&`vE|NnZT=OgU4`<67%6nBk)VPL^ z7QCjm|J3%M75FbZyX`vu^W(JtxM|aV91NJZ*nc)VyOsFQ_TKJhySD#)DErTev*KRa zob!m1s*{!h?+2-qNMmig& z;ee1K$sj{8plCx2<6$(z6>_KE#mEMkT^7-PbGOMbly}iLnskm$g!j>N2N2lY)SF(a zNdd|FpsR|hqx+@~)>J(|f?HjTMkMjrhgSR*{dT$;us80YaON9d-{*XV)O^6{Plyn3 zqmXydFqww5fq>YH8qMmkdV*7(u=5}LrJC-FX5ff4y0F1)-j+Xj|N54Xhjs!O?OY<8 z$(rcu&-!((QKOY?-& z$s})m#DpIf?vWHM%5XOYv=5P~ho*=$E}^uB#iTb4xo4Odq>M*(bl-%O<7krssk{W| zbVT6N!<^_cM+*;|=?IYeqA zpJdxBmz0X>&3x~rX05QS03~?k0f*nyR=9-gpFs$4r$B@hO`OMY1Y$8| z#*PGHQVuuOV3u=ch!Pl@LzRqr91GBd#XaM5h3sw6X1S2Vxo9CIVU{p`TQdeE3{W#P z(!&UMoZ0y>{D2~kmhiA}C}WuynCR^e`x`L&Fw7uN(yOLg;4-ueAgftZU7D|6l{EDr zM_jJJfY>iZaQ&;9S5dz&ap)u9VVq5BX!2IsaoXXLZq_$dvC zETlX}+&>e%FEKQYBz0GG-N!KeP&CJUKA?z0hEUoSZS zEyuov0cW6qSR+oEnRY~ ==tTa|ayaCt+v@s7eG6oFKQLVQGJHWf~ZiXos>GtqXK3(l$kraUxF34C&coJMv{v?w6mEm zf~iTm#qlAl#J+IHO(+*guCDmUtpl6Lv^^tNon$OLp+*{s+@72fz`_=GH z(=j4t3REd|%?80&Zx^`zV~hP*jgIyUI%pDqC@!y`8YWDpEl$gnWF~gB%!Pr=Yc%X#mPW%qPK3WB3&L(=HqleWXRTGCmmaN-V0j0s zTS0mb@d&G*02^$o1fID|8I;YlTn4JRnz)FAl|yeb*AzfT#P=k&<)ISIt^E2&ihHO( ze@puRt!4dxyVn1I5dHt&D*b;>7Q+vdhkv;X&YcCOz4)!*COK#Dii zPObm1`G3v-e-8fN-s;r+|KsHU&khgnKR)!+EdMe0|26jCovlu%n*XD{Roj0*4FC64 zZyL?c!Z_gu<1plw{++*KWb^@1hHSu&M-|e)d;(@kwQ_Nc?q@FXN zQ%;DK!v~54oN|e$+;-OQ7sJ~qhjqZt<>nqeT&Vj851R(b1vPT!n%ZZuEt^+?Yz`R6 zW#j$CAy&L={Tj( z5_?YfFo{o)`If2lEv8q~7)eUJsec?`b3u_sY06*tsF#P%!a8Jrm~7~HBcm0feAjRo z7=BF2RqgOBSQ9L{KrtcZj-@#5smM@@7>ShraS|uTY=UVS zcooHknQ#+=Vp6AQgJgLoGK4C-Xq)C?WG$!FJ@t$|b8k^J_fa zNgiM>&_a0tV-9EOkYpJ#s*%tEbQ8qk_W=hSp;gT@_HvYb;COP9n~_zM2@203=TF!) z7<7kzJ0=JYyMn8LRPOXfHWf7b^!-}{uc^OSj?Ef5%&=??EgkUo_Ff&R> z3N~?X=y(;`rdg&NqOna_E1v-6ELQ(+IT$CcauUenLFv+#wd;9KPhpe0u^mOuEAn2z z)br}QWT5CsL|_J-yi}1}3cdr+L<%d=oeHVyCgY4+41|~3g!fucme9tQ$?CAX6b3Iu zBg*dJ0Jn{jvPp})3UP*71d6f0FR~}Q7?RgR1OGu3sBw7KeZ075MCwB$QR5yiB5$}8 zJ#)y*i@l)h`+oCnr3U3v7|ucQHf$s!^von_z}IAif}i`PvYvMT7V~i<-?tbS%kwZAL&u9zaGOp9lUUkdjtEI{ zH13YZXiI%h2JF4G5GBOJkD2y>%7MA__fLes{{Z$bdz&Pq4sbNS-r!gJl^a`$Pnm5V zh%F!Gffy3)^G;5Rt1A<1aHPOt`4o3sFa7S6(H|2!7>?F?t7A z9G>VpU?i6}pqWebq%B`#1o} zedeFNMr{sSnc`ypf&5beRb?vmg^H1=u^$v3|Qa_$(DI3}U1O;R&XpUujNc zK9sO<9a}tl!jLv5X@~f5>d@~|rtXoX?IAZfpoSuAXo0Y*Fgd53G-1rQRoJ(fD4@8` zqhB!z5?Jf!fsq{SBH(B-=P1^|sY>llmyeE&x7x}5FBCaOn@L0J#yXE;&b5eFFnHe5 zgxmwYa9s-#a46st7P`m+NTh>{>g{pttX^hfl8r#6{)FdY6>-$~s9E^~C6xfyIT(}w zjC20N`?P{gY(oMxP%u`wb>!Nq$~K6HGtea6q#0fo?!xFP$&sx&rGfC(u`^OkJ^`HN z5b0itRxjVHovr zsmW6W1q##vUEH=LEU7$+X|X?M5RuX%PSm~Q=b1RN7++|*V8eh>7l3izxSPfM9@e>4 z5}k8AzeZ*X7=nq#<(St3_iJ#%)Z6(l>eZq}zpA6OaOOJuDrS1@9{M0ERZqrncaaed+CLG@R=R5EXkyCh@ve+l@w& zEsg{T#5!1}F>}=5RfQq*Ww9&^!uFpn?Mphg;SE$`Wr$Zl31YnVh}XNl&eFMJ_jf{h zvn8W5dMx8v1bfLGRF$LiN#Q=~o^l}yb@+-YgN&!L4g>=T1bfTQ_${}_g5?-eR)kSB z(WJO6PEL|sV3P7=FmBSV`{4M<5+DO&a6OA*q2HNczU~achXq(`yh4)9-dh~+dY{ul zqK+gDoxxxVa`OH~n4CYncb&*eNOKF9B%_N;gSpT8DBOk=p%LdRR8t$ABe7+OHrog% zXB$h_J_`99o(Bl@3Co5zl>H!r8_v^<($za4m672Ocrh246S!Rb0pyE_L01UDo9i=& zU@RFP`BWkmON>D!aG{=JE_3g>I9B5(1Toz?m$0rDSBAnKMMX)}1zC#Beqg74jzrt9 z&DMX1{vUPx|Igptn&Zc-Px+~pKJfW zn*V=L|38QSZ*SNBe;+CT7iEC)3i}a`fw%bob#}LQs`&ryoz0s6e~6F4|7Q|t@uIhg z5?VqD%MO9nkF`b_UEiVA$i4Md?}>ry#H$^F2}A+8YoS6{Vu#V3E7?%pg8J2YFr!d3 zwy#euet@`JMaS{fsc6pjemd zbD9u$5Rq(@oNPLd)zbuQS$na(B6fzdP4oDv`l%qum2 zf);r6nIh~JH;;lf!NZ0Bi`hV@u|_p*gK{ldXMw@ZL!iO*Q8sFu>_e^(2`Dqe`s~(ls_98ug;4N5Nz;f=T=0i5M1H_w+z= zxf_cOu8m~8T(LYbV{JcBE#rYvxP$Qct$xZ;a#CNLMG@&JKlAn4X9F z(&PoqhCqF3m67XmUjQUuIz{4=1)|T~*_UsntLWDHg*pkUG*$acv@V8?91+xiPW= zo5ZSFPwszl6YUGEwhh!Q4zbxFGFBsx;lDiVm|#uJJW1B^Rg`>_DG+y@3(8By^doz| zaLbeLTZ&EZGQJl1^|UT-XMJ^0@ewH84p1!*{DxZEqFjZU=N(y(6yy9tD|K~7o9D98 zxD{u!5QIV)v(u_g86vj1AyTBc96PQ9TnTw)7%#Hlkq$fCK*z=nLE}sHJ{l&Br`hlO z>>65n&mCRhG2nv?jnk!&;~%A0cl$4#wzp>vOiAWg}q0RM-KfWu5W{dXWgN z30_KpQw>E^0_$p(hGDtGJB>s&ULGC8T>gb1lh)Y}4p=H20VSu}d(K#!iron(L7JVz z)(P0B*p8M-M+lN!f(xpW0nJHB0bX!6L-f2dDNvlj6l>yn=0vkj{n96D6}p1SBqXb+ z0Sj@gII@#kjz1d~L5onaeGOiDY6O+36;v!nh_m+*i4Q%stv8|BeVKLfw!QT|P78h> zo}H6FHncin4}NiIEP0lZ>pA0&1J|0JS>w<#8HZ-$rh3ZOp%XM9!J?5T9;44lKNj4l zRr3XB9r~HEFp4;TdbRgozb`&mCoW&<8-H_>gYadx580uZPBN5K(HArMRwl?066jqW zlfzL|c1&i%w$F^CGVxKLp8mey>j^MXXxUh-@q`GNm6OPgeUpI}(`6`kWL@)*?mr^Y zeMISNQFJ9Io^VJAg<3=-O6~whKME%ZvvD>z$ufwrtoJV2G>gNZU^Q5zVm|{H^LuE( zU8XX#uDjUrs#E$(-fz!<ZE{+GPcZU>2IjPteG!vgPScLsvfIShn7 zMT%Spg|o}^Ka+%XhR5AROU5Lqa#0py*inKd#mr%(#WoTV2X{FQm4y)8A|oB4+0N3e zFX-SSb(TOsLnlcuRZ-$ic33Vyg!ZSii1VD8=fbnfjIr>zwbtTd_t{l#nTV~x4NTw* zQ|TTUy6Nm>w7zOQFp*xiYCae799Z{>ztgmkC-AxP>n*u=RXiSnNUw>};BXI|rhe1L zyCIV!j=btce&d1oHq)EHCF9aPLvC7g?S>Y-V`a?(b?2{*eIS;yQE~s1Zz)3qhC%FZ z6T9KFlR8dbtVrCIS+yr##Y0mz3_61Px5`W3#VwA!_wc$pDHG zrx+%fq7V^e9Uo2#Qy5D8(wvRim^U!|zHriSuEOQQ(83Ge4t)?g#8uR=gZG%-;bv!Z zZ)dc<*BR{W+}<0t@7&ql+8hkW!@cpHJ6n6Zdt1ZZU{e>bk>G+I@7d|@?CfydiC1;T zDEnr;g$&xB*tUEx&8|Mf;lIOAf$^k|19xG`qEvpXfe)t-i6Hnc)98C_?_L2 zvxI0plU*?}gV=y8%cop9EC_etr5-4BU9nf4{z0~ghd)8%b3F*A;ipu+?F2HQ{>e|; z;ECHF-LIdf=!Y6R%ftyt0#jbJ2C{~j{NAGj7*_X;DcwL2LV8ZU6g#_CE*zV{4~&|M*Dlf6GxVf2|4dZTY`9 z_m=X1?{&6n``?GO|6LQ*wC`E_-dAX5dpeH`3E7E0%iemCE@uh9U_Aq0U#&lJ0gE8l zsR1H>S|riYi0;m;^ee~k3ycC?q9h=eLIql6nDD&O5RX{Us}b3qX+*cDP)vjf*;60WAawS}U@A!wEYY=va?Kva%R>U=S!un)SJf zUzOXbiKVNE*Y&2{NCu+@BxKX{1{o(x*tFyTl=;#Di z7?nf$!YcclCV68STwxxFA}Qd^(S){-pbC5oW_SlqdW>%I6OBo}Y-IAd@KB~nx7Q^B zsh?3e6)ofPWe)Yv++~?a(vhPNy_ijKQHN178(EcA=7ND3EDg_-;fj=3NzHHomrLg{ zjhG`^NO8{*52S~~bZ%%4!{BRFDqk3CB^3o;{5JV_DqeL$cz=i0;5 zpKMTWI@m!e2}u$DE!I?yX_5>WCTNP|<3=-5D|nua0tDgGK(CMgl^N)&moWGTN&1wQ z^#oV-0jzq%STDNfmxgq|yVm}E4MUJ}3`FU+Z6fI9C|;b`9t^Gr9dDqA{yyR7Vkj@% zG2Lw4r>G~Ma25kJf^ZCvsJaAIpENF#LN`lHd@qqC<4sVQGAZ_GY<%&RXAT~{o4Fe; zbtb4B`d5T)V>m%qDx$7;@t>vW;!)B=AA7e1-6zT^2B>2ulG$b$fZsRCEJ?GPrl9nOD8bB&M}^U

VH9>WLl)ucS^ISW&WDteX-Zy+xir$cms} z12JE=JG&MKTtc%wWOV~Yur&rpO7;7zDH5^ON%a7YB8WJ`Nzr)UQS;_zPxL+&w3aJ~ zznCBad&V^-Ty!`U4L}WBjp#VBhv2cqreRrP(!L#0zgU5%o$AEU%kR0V9Zbsv6Tp$=QXF>4jeFnFl!u0e= zQGFRi`vrv}!n*mr!MW*a<2TinJ8|9#Og{V^Qs{ z@l>^Fs#-itYt2$&0(ZxMn#*+vlEafEt~|A>_^#a(AJ%|@Bi+z$5I}fu4i`E`UNmEFg zIhBBDZ6w~P$`HAgZ_1SV&XM4I~PE zdq>GuX7qT&F2>5%PMy=eygIVP z#ybklm3FP{J?}{7$^xIw8MeUzZQ^`O+n!g2Mht@Xo$#erRi!JOO z%Z6+wg$rY2jA^mf)+tFxaZt>Cy4*L`KGz_HV&=4HgbdkDqg|Pr?s&b-wpPijL0mw&c|A7;#1ReU<2Y|iB{QwDN+rScP`_Ip5|G}kqEI;DDCl2i7 zKl64A4;wTXng|`Q;5AIe20{$suah=^mY*ja++YFUi}dpxypmfm!Yl-NmV>;k^2vIG zW;*xqW<*vYQFPf|zio;^p3wXbRk0QmJu_QWLzzIjQgq{B)cH32@4EFu`~u zBo&|wJIxH^U4Vw66P=?$*7&;vdM}MX_WV$iKvdAmEAP>|W0G6tMc(iyP`bLP*;6ZXmMdhR(8s%+WcB7WvWV$ zGO`>VH%z(p>sp5Lc-i&8OTyT`(NyDgVvJ(~7R9pPik)$aUbShyuuEXxp(QA55*%$p zc@S6CMJ*K-i7x#SjOQDu^xG?HrMC*2i1nP+78MiAa^Flzp0;8d%AMsZs+Iz3)F&JD zs9`EvGEtfbg{q{)bIJ^?v~5HoLdTIfdGZUK_%~z1)^yVb3P)>8<-=fFv+ooy}LFDW1xYxCeY16!od z`J>aLL(v!&7Aj`+Qnr9|j&-nI2PWhKiR^HRRGDVr7Vknkc*H>m~?Nt|6SD3gIJBqGh&(!4Ub%kqgIj zW~hNjc$e9wB{FB~^Tf=2#VqccH22FQSYZ>Tt3;1%<#zU#9^))6tz=OOA(n>#DL~f0 zAQ$hu-4=7Yv)tD#wS>ADQJ0Jv@g*E;>>hCzV(x8;+hUs<+my;nE(}7NQ{{v~D;xh* zodDOytXC0+`p%|N5{$@0%d%yPk+Y!C47Bb>nGPh{+gU*@DMCio{)+pA<@R1tZb=lX zzQz4=iWbY}7w2nH;d*s|9T}idSHSp~PF$+fX`4wM^OcS1MnLm<1&NkfNJbKJmj&fz zj|3uRWO0pI8g`3Dn}uD-6}=neLs2FDvLLp;iXFk8D5hwptNtR(8$v~w`-Plu2)cJ2 z{TK9Yzgtb=hOO9aBhFEUzzPzhp6b^5Vw9S|NC^THLZ@xOvc4g28ri#0HNsU8T?-9! zHZHLgnRn>#w-c=`_EwrTtvZFHOP}e(M>_C<1e!&=t7z7V6SZ?}4(kdv7Pl+2A-Yc0 zR&Kn@Zjgc#gdxI3#b_O$rL0TG-%SK`=6j zD6G;%0+f?fk}k#wxRi?EC?U&8XF1=13p=cdY;LUDIU^vxVj-C#u*wkECPgrm#+D=J zjHgh3=n% z^7RPshO#m3J#a+ZB->xrOYYzF|8MVGyW2*NwBN76ufWpTV^Sd@UUlJyIZ-S-<6V2~ zwdKt2YJEtMXo`qHfB`^JwAcUrtxI>K0Yb7oku}K(IL8(VHu_p!sH(1ds-U^rzZ=0# zN@`Zrm+`0C|AsZQlgZ9;^=4i#J)G797-h?1P{~iiIE6;zrqY{Kx(pI@Fhm@vRl8A> z?{Vg3j!*k(rikf{MEVYf zAknoi+0ESp1+b|7T*{Ev4d=k}Y*!}QbpuMdh1h|yKa;>RDvAit?pk=j8u;wfDX}G+ z@Te3-48Tba6hot+2a>%8$gzx*MnXHxaLpuI4hFa}j+;7mMDU}qWncwzY8a4~81W~b z`YB~kQYd2VsjlEHT9y)|T?%?q$2;T?pV&B+m=@4inUN8P^F=u7egzz^qI1AMro@*v#ch0BgQ){DI%@h;)3rE^8ZibKPJ~`gYB}ZF@>Sz%X zlU88t_deR66=6`mHWcn;K%Bx6)F=2xE-*4)2Z21kue)f;N2l2&Gt96%c%x}?{#A6* zm626UFd%ozw6ZHutvNrbUa)2c$)r$T&dn%4F7>f~ckGp`w$nLw+WV)`>{7&Z+_l>F zjv6`-AzKC4i2;_xIlraHFj@m7Zem7PNH%f>vba{6IWdNUIb^bP&4~ z9^zkO(jq)0r!YZwCFc|59QX?MOyfSu>|GiRmOL#~*J%5fRY4JM8b-x255hTzX8BR^ zWl1BOSRN_C%y`vL+KfxO6iUA>zSKP4h)u9r%W(#CGk zWr%rchxSfd++2jLv^NAIgu>_E+>wu-w?BR~26v_iRE~fS142A@k;yqtXZR)svZ&XT zrcGYT8w?=D4&6MWk)lvZ44rn{G>yFEP2qA%M)l_Ql$pc1o9$v=dnW~%&to!SjmKXI z=P--qDi*|F?aw$KvP~IeK~QxOdiDr626-qh0avE}X7GOaW@aq4Fu+J{<8U`Wf4tpx zW|8t2@9f{Z?&0sSkMFRT?`uE*y?dHY4-DeEBUy3+=zk0<%%}osu~LsK`(I`MdqnXc zM@PMG*Eu*o?sX3jtL^_-?0=jJbV@+}``>5(9}WiJkpHdUNBiHPvj0{5zvBN7$p3Zx z-%;nF;{T76|G#^Fa{BtY6DR2do&R(??So?e&rZ8jo&P)t|95O&_@U0^Bad#Bk6R*U z46eS7)=z`L4ul(r3JYy5lXp`UZ0ts5lAzr(h(meyFwu@sm=?qQ#t!Au8x*nj(Gu-( z5_g>it8l8oSa;~EWLTEi>4m&f&|O6!dS1TITTaebU+1)&^yeb_KG&ko_(ZV~aaEp^}#mgQ6%nK91N8QjrLscA3W z(C4%ba@uF|+{UTi6qWv8$$!5h|DU7wLAzh=>PIR6{bS^R?^O8T75}gJ|1YHfciWwA zl>q*6@_+iH0pIT9E$|io-|P3=Mf{(3yIb-9hq%y%>nEk=TBhgb8+7zTo&O49LD7ee z5#b3yLAOtpuRj>YiX+3uksz`spUpsq(0G3NhbO z{n`a06_f*zak90BEwf6q>qO=VsO zYD5FZ>yTViYZPY#+_l!UeMdM7d*wfl5~a^K4ZloTjdm53Inq=!mUhjO-h5>7Ao$qK zu%RO230g))-kOPKwH<&uWZ=|86O&2Wk;a&ioh~fC+r_&D;L52$_JD3G$$GZn+7|w@sQ1@?&H)*&0oYW4{e37pRd@Raj;@%E8D$QJ&|sy(E_&7r`tsjyxg1R35vI z6L*npT8QF+Zh#cS2uqhYlt|QEgl<9%f-EmE5W{SpP&&uo6N4Oj=x`;(s-=e43L{S> zf0#JdR4jaxL~iM_Q-;M~?l@WSmox*_(oWqSqT7y%2Z9bQ-r0H;h%c}}_Z@9Zwd)FA|DE#F!fTO%~~>CM2XQ>ehrTv?QFE2dRX4N6P0 zO@qsaUd!4cY(p`NZgC4EnUUMJL9a+Hz!a|B*hd2#0zTs|T`SWTW~en_ad{gjvMI-Y zFG?dc)nrdf;9=)-%5#%YryJR1UN`M60_4E@jNFEffy5acA!x~Hn)3^S;$Ajo&!u-S z4)Z7N6epd7r!uW1p+KcafW#aUxCtlIjdl8zEbZz> zFi%m~XOqc)h%HQ!r;$C9$poe~qUr=8Tx-maEEW}e$a#WwMEYa`^nP_1k@aQDxFHc`Jv*HNYL8AWzp=C zeJ_xyw1pTP98A07Ky=#2oo;*HnNEBC+3`_(+L_JWIZ&zFKkV&OKJX-an)Zl7m2~LW zC$D-vOku8&bP_r&#lF$`uFje^A+Scm<9Lu>O2lUFV*e1kXjzmaMW@)H&MZ+XyuhG5 z&_g|$0%|3dmC1ya6`es{#|VPdF0RuS-&NYBC&Ea|tTGW)%2;O{AhrvYx{iaupE?*O zCz4bbm|b<%Mj*OP>`zh19tM={()C z;4K&>RhkUwm|eIq9ZdhAZ3KRZ`n1O6p@1o$^zEh%E8$YOo>Wha{BRUdh{}ZvQtjAZ z614EhK4&mbMJ*f#=4|{+pThkdj8nvKEBv;Ps8vyz?7RE!(f$jB;d6uWY74Ty?>T>6 zUC1bkZ>1H^SCG#iKF+8oKI)6j&Hzd)mC31WMd_I@B{g-JMqE5T-?Sf&A$ z;Hv~47$weIH(k5}tqSO#cF-&e*mMLfFC_LZhi4`TkHQIC7#&&-VD5*0vY=SUMHV)z z(k7A?_{!&CngE0vqE=!l33knid$}NoMrPppx^6+v@9tEg$cDji$mr(;JiQ zD{iVQVkWE+CW)6ye#Q}hQXN!d&GV6b=hbuQmoj7L8IIItL!OE=rod?!s30~^Kx|46 zbXCYPcZ8soWB}P@a{dwV|6(E0WMG7fTk#-dnolnZpQbVn7{eT!X6-cl6xBGTAnnPd zRzpXm%*?@?wN6`ctY#@w_4RlQFu&%;XIwj~!PxxxI_Mm=VeKzsA(GtV8-Dvrpf1hF zb~2JVMnMDhmm#sJ!6I6#@j%nA0jrM?;+!@r+aU6c*nzK{wdblh2TijXe%4=JAg-qwQ*efA}$6aqb_`+`EXaqpw{U-gWo1&QCURQQ$vikxAqe z8#i8^%n?%?=HUW8pMa9;8>n9*)kW)cEOXD@GUL4bo-yG(T?|g8>OhpgBxe)Sbar0D zM?Z4X9aX-ug9XLyjA4eeJUxEMOK~Ih%C<^Lex#mm?3$+FO?JN_Xc_jGe&V(Pjq)$d z^Y+Jv{rMXo_)?R&tCjv&*?%hgPl^4f-)UFp|BuxE69t&G@g6NeU$g%Ju@&t<{ceT- z^b6U4c=@dx^7_aFTSkHrtlxnw6>srun@xxI$sDCJ`hvjoRA0dnz%&?Pssm1-DWShX zE?D}c;IaK^Nf}v53&N8#XS(vAJA^1b&H(wMCbM}(y+T*oP6ofKpE?e>^u5^59LjJ20}YY+l-m) z$4M&luS(4cwf^ZkWTT3LQzwjW-JhnkpU8LwlwI*DUUI1et27GIpJMrIHm;m$lS4L% zWZm0Dat1l)J$sjgQP|?C0s@L%L`Z5H<|uxY6dJ9N${T&(}6Uq?sGE`XnQd?K{AbKKK^idlh zp4^N1Ava@WfhgfE2>ebd?T|gh;>wTKm?2H=cXB^tM!^wbLBM6D;Vbh^AzlO@&~mOo z1j`DNSyr!k7IG%HBhd%>9g-a{mmH^*OUbMVp5kltqM}-M?S5nEK2AC3$;wxEBTKs{ zBOvi0B-XHycuMxCX2wNm;y>TKk z$zinfKG-!lnR7kTk75_TFTPRfkRCJCQDy(B>^~*=Ki&S}L1q7Wl=dHTejJk%@IBdp zzGDCB_6|CQ{eRf2;y)hF{__K_IQkn0Ue4@eks!!U5JrYYlJcbgHk}45C9-BzRLit= z64ersN}nJJ_zVIr+J1EGff-xi{Cp4j%Q=`N!H9vkj#peI>^`PH(NW{|2iDyztfbnPj=aKmpJAZryG?iV=;09D5gZM z9PYob!@c&k*Ut5Ma9iot7h*Q-IVf+^c9`TrW+>VVbjP&{(}_8id4?>b{7T$d$2I8~ z99BvL7Y&QhBxrqMQbCne@_!}&-yr`R_#cDrQI-GaamxSj?xXX#D*O;$VsqfllLE`4Ya2C2v?_vwo7!hp^i65y4FuSWbx&Yx5 zdM|6r&@gRBoAtziCer&^JaDE#2 zVTDPQ!x<)F!RIV0pRGI!q9pZcmtVriyTsG|I`nYiu2>4>F=5gQLI6bV&jq>g!kulU zqd!Q96Fld-pSzmg{xI=&a7*{+<(*5LHMM-(J`Ej8EI`XpOZH^ z>WFn1E$)Slx&PQDTBo<>m<1!22A1*4r{qm?I-#W=X5J?1pz~imYrtkRSO8}y68)x_ za11K1+2tYS4O3^R8N(q>!6@3p7G#Y3E9lHQwDK|EoH|HRTMy<)c3Twd?PgXtZAQ!%mGu^Rt)~WIdn} zM>C&K4%vXDRQVl{ivY1e70n~s!#M50#K;CQ7$M!((+<=yf_t2&D{4mp?Xc`JHds6F4d3>sdJ7r9i7*rw%LcX2$vvdwp);qMK36C9rvr6a>Y*MCH()xhst+!j=MdHSsX(?^MiOv@j`F88TKZopYvoSZV^h zjbeskaxha%!Yqig-ROK)@N>2WvYDmPWDY{1ItQi^n@F+5&5*0f%vc!WMbZN<3i*}g zsssl8gTR0;$sX7E9-c-ZtQ5;xAV2wGH=~kWvg|6dbyu&u$`%HV_lW$ z&D9ekcBg|9g3%PxMklv7e8CVc$W_0I(wH+za>F{L)6;n=!6`cI!@Q4&x3NaT zXXyf@Cn-&4$6z3|@ezy(Ef3;K1j;uVdo=7oybfE)itGrK{@6!U0z{VMv&fVZ`${-J z%<|{0$;laQDG~aa8XZ-gSfUt9XJ{@Tipu-Sk|B*4O6XVa?~rm zJ)H{KP_@>n3d#2TIgOM~<*}vQ^s0)I1z{@|I)P8fY2?~M4(Py04O~`b3(=7t_yg&^ ze5QKo6XN5XP83yc;oFh0HL1DN3u&&z?TH%p%dnu^cCTKOB*7D>UkK2 z22_e?KI!&o4Rc#Whq)lxq0-M#fchL+H>(GqV3hlb{Zu-bKULd>D4C97VMNM`>ZyLA z%?`5$`=8i3w$5fr136J59yTy?f~^2lnc8l6zD?UXq>X@07gZVBUFPpVTf9M6oWwhC z)gvF_2(>L}(agL(_b=?a+R8)^afB8|k7EKr`=oCl4%i|RmrYGB>ktUiEO!3fRUKp2z1tzo_ES8k9&F&6XD!jJYI{=eg1%je=ZJxnL> zBclmCurE3?KpCi3g(d_TACZj(eb2}GH@ZE>nXB)_TQs>Zn8O)c8>2#+RZ5Nb8o89d z*w;Q>>=%SkR&3aF`tGHPy2|l&HzB zH+6qyuGr5tsH`@$`(N~^`cNHJTi3S+`WB9H&@j`m7V_-w?alq`y}jI6xUD9Fjwo0R zvSU3>3tR|(%Mz)hU6$cbag%CxKeg=RRfR9?#XsMC%oUV%QrY zE{D0zO%K$e>^Pc_>1PH&4cF+YBY{BO<F$=6LI{H`+aF!~OulqQlKzX8Mo2y*{Yr842l@r}6~6B& zS|vsqp?)ZjIruSt{CC;o_@5_&)WsQ1Mj^9!oJxK`iJA^hGBSd5_~6Lj>y3{p)G2q@ z{=GfO0z%kMR-Dw_3d$#Cgb@;4_Bh&P@iY!z6|sxv;Ke%e-GnzD^%Odoe62M}7QLoj z-fpFeSN6Zk{`ZU8{|x+(gTqd>BOj;z58pAKJpH*J6p*jj|N7l-w;2C%Fc?(!zlXB_ z{pc>W&1NU?0P`4R+HdRbmvv%j?oH`ffy9;Er6uX6h4_Ikia(zJ3Dg8~2nuDOLlEdn z$Si|&Yau9X)M?sL7yf~;;lLGz6X`NFi6+V~OVx{(G!P}(^`+D7HXSF_g+K!l*Qf^i z+Br=d3zc@iM%}|=g^^FK4Xu%!749(HOo#MSd+DN=73eC7&l-`L9%D&99f1J3e!9N6 zAP|n&zVZ?H(f_2NFO)&%!^_MY4eeHD-w;xhTseYm2BAqE(e@G0vaWoFhqdwt_;j4tLQDk>-E(IQJHqvKp`yCg8GEMLjnT9Z{vnVIB?tu+cz!=N?}Oq5t~@kgTRT%~Gpm(P2-e{=x<-uKR8p@b@0?$jpC%%h7h7=( z?l8(FmNynJ3Xg&xbTr}SLbLG7ux??a;Nk*d7x0Bl`xJ4E%*3bPOKkn8*=(ts_Z#4DM!a-!-y2n24W+1fc9@kmU_w&@L5= zfo|&BL1q=KLFHwsisNl87Mheq;*)6UavGM}*gq$9gw(^2+rCQpSwI zfo^}YJ7QT`m((>7v8)bAsRiG9SI&zOi>3k(WOf9oo#ZM*aGdKDof6`Ka}^Xy_;lQ& z>b0Ka8`nyw%$8B;Mw4bwIA~pY|DUhyzpW8E0B(_^3(Mw|Bz3A>#7Wb9?_LND8H-VG z#1%}j4{mS~0a+}TAgszNB&q@SgaQf3_k~l;oVn{!dtvh zGsxcmZ&-g&=|d<+O?%4Vu{(RD1TLzsvZaKhzoayaURUVZl3Q4cijpVDbkV=7pVrYIVLIOIavb#y!O(k32Nm%C0Q9jFO4 zV+fhj_ReT(Uxul;z(aj}{vGLYS@&^}H21)`M4-DXtt91*us5WP$<1{}HLnLI*BhBk zS%_MQE(Zlv4~ZSwBy!`)fLoJEIGIQV7nvh9JDEWDF$K$$Y>p=rUP&E-Nb^gF$FdR= zx0azFeV!q^&X0O*mTi>cuDnn?m&Pm|LkpI*d_a~q(Xqj80=L_f303woq=;Nxdi{#h zQB<5ID!&jskj!C@!V9S?6hl&lXKlA-Fs^gqASrXBO{}d$|98oe7@5Ezo-6R;lKQ1`hR);kE7#uh5z_?_5bk<-d*CptN^#` z|D84vUh(|DJ*e`(KA8Uh3>F(tSB*@sBvI(oUy=l;e&DBD4*Z@iL@{JNcK||)!&2qj zFmP6k5_3196VVe;3xc3E6{xLxhA^W*>@Gw|5d0d0#b@6`Zkw^THMX~*!*D`IDf774 zdC=ui5u*VR!U`S6%-4a!V4>gy%q}ajDwn7u8hzGEkJ%O;*GIG2IxYaH;PI1>=n?tD zbkVNZ++u&m6HmehB1ij_PXq6F>9C@QHg z7<%|k3ZBk%c_-aGgS!~sMNKc#g6AjHOGYPReE=~B@U+`rhp1(Q9($oMJlaeVb8^57`}^ zG-pU%uRI0_f@;)YaNzs^>1!FEBb>_228Wqi<=H-_!!Q!zM1iN;CeuWnzEHA}rkxwW zsMc}XwZ=cP?ZPPDX^ptsnAqvYp9#Az zt~kojr ztDfOKoW;F8M%&uk+c{rKZ#r9YWbnCee+W;@PUA8W0wPIRGNKpf7EhFvbRq{+7$t-B z$xv$bq>Mc#QJyiOV1Ijv>xZPm8yW?mbb~;F>M3}?E~Tt6qen9=YFH^3v7qDiN}Uh1 z^yJ|{Fv?rtYYbOEl+ba zyL!L*Nrp2Z#lrmNxt$>S%qS~N60D!DQ)F)Xzk^S5u^aQ!1mb!c|b>6gJhA5bfD+k?JiS z(t^4W(t9kcHzT4FHqy+AYgj)~Ev2$FMRNO6Y`%b^x z=^hNK0Ki9M|Mx?}0s-+!#Ln{ad+h()@;|i?3i$7x{^6j?|MVc&`{(aop1gYbKhICc zZ~ruY^Wp66hqLkN%Xjv0WbdcTmDCO`%X$05n;-vsNWMU!MgI@2-^5G170>P8)^Dn( zvA<_oxBRRs{0*h&wOgy(>dJbdV19(9KMikv@;9q3De|BUN<^Z4T+#gmq{nG=?Z}(D zHUnL~HNRV*7=1~^mil0J^EcFbYZmyrT#NHGw-)wqKfieO-)GOqKfHN=_65GZ{PF$s zXCK}@AHR5Y^5-u!DWBiId-LzlpTW;91X;flLA0VwKdmeH@h{Kcy?^=UNBFUIxt@wR z1W`3__@>X_j~`(9#ryw#s4e*|8V?Y z$A2Ef3RL|6aq|E17$L96+Zs@)8 zLva>GL9)M2;{B-~?o(V~k>sEvH%;SYH0pMouG6+S^T3sl5pZsp#zI&#%mqI8p-3AF z4V<1?3M&*znpm@i8+#%hjrva8DK8QDv&+%w(1DhW-<6}kHH)LrPenW$b)bq)ue8i| z7GMeZJ>SaGO;6${E2 zj=kzSozk9re!Os#1vUglN=rnuOA)vHrF$VjYNG+b5Xy?u2j2^*%#kzb-B<`dP@&^o zn|Bc{FXGkAk8nu6Bd4?%z8AW%;`u)6rR2CinC#Y4q%KZ4uKOTY)uq^C{tiq2h01!k ztYwW|`Wruqf-7G8UapX_uuC^i7E4NY))L`*iG>Hb!o{UG9~q6H;@tAcPxkI(>W5;B zR@NJ=uAd|1yG;CYyV|xi1XhB}*UynA!_Kz+5M8`eD|FKYW}0_R>D)oDke+}z+h#?^ z5cK@1TY2R{-CZFtcanYGx^WzB@|p&(a@QFY#$C{4Ev}2VOuwwxD>q%>2yp_Aas$(B z2RI+C+EIZo83S6yQ5sFxb6VO%b20QV)Nab(pf1p?b&AXicfA}tR@*M$9;@vNNQ225 zR`BqK{?VkhkZ-S3Kftm_r39#0-)=8&Sw^{F&lnTp7sJwn4C&U4g{t& z@sK8aHx)oWi@->{@!GdBM#*PPR@9@-kbA7ajq+b{nh$PoWgQ1Vu|4V!(8L{yLcU~n zr*E?mg5Hb0gVN1@7Y@AB?k09uDN)4@F9$6G>^}R+U#<8>U{c%e+tI4*|CRoK2m62j zxLp|l9*zE=cdq>|`~Nokf3JI3^#2(g_ACAWA+GbpyZmS=|LO6{on3+)m5h)sq}VvV z65-WIy=v&2Wu3e0bn(%GSL}L;@B(AsU5+uW@5qhAp}R?jaAP>^9QKa-?e?I1*zXSU zXU3Y!BK$BuH<`NWY=M0MIWCLNZTYTe#qLICEEwbaYs|jRqog<7-w(F)w6%;p5fGrT zh~bSJT~6U&#k&5v?El@}_kX*3|3Aq4|DXi_@1WB?si7S%lV?9XKYjVmIXn6DcYgo(+C}^S zVXs%ke?G{SLA%;VZvXIbJ~%$~x<_8;uzPrPJZ~Qy9UUCC52mxhV8>HfLX3KTEM{pG zV>ZPL2{vnp6OK&t;D-pY${^;P>#^kVq={)HhSrncEYfr}+~419HqI0t^c;MCp8-n! zcpn{qoJG0}DlS#M|Eu@^J-`2t4hP583E-oC|G#^Fa{BtYv-Iv~|KIlh@Ar%TKZl)e z<^S_Q`oC2Ai!b9RGEsAOM>+>548Wgd4WZ`&YaEp0pGstMnW0;y<<6xLo3vWNT;?-s zwdU|KA_RZLa8C$@9sg2EnYC!{Uvm-$3-SFCRD5rb@>lt(%rqP6R30*&5|n)}gnf?H zc+o8RSVu`B0Z{_KNg8*e_+np#`w1nvW~qXti3Vk%q0GdFyz(o?Ag}EImHofu{XaPF zSFis^{rUKM!)9f2{VvW4@~Q zfA#(^dH){`dcErXU%mguev*pS#!tlGxi!A={eRf4@PDiKe|1&w|LXn!uey3>vg$Jtl|3h315obpVO4UX{Oayn7 zUz7E86-P6XB$h5gVxmP3KnfMeVO%?jIA;g$I-D)WtH2El)#9A8FheQ28MW4NP;2VnT>?NF)shqjXWWN2-F1+TevCqq-Cc-aHLAU!w7G9( zh4zPcujGTOv(R@=@igZ7txJGI*<0uVj$Qg)V{+MG5hdxc*KQwmYE;CZD^NrU6^8R6 z$5uWhS$9_djnC_HH_wkQ(x6YVNY`(nQnye8A(SZ5yA>4Vkc z$I)NK42XDS8;>~wlo_kv#w+*257Aw|9{5W?9Sxdx8eNKz7MMqgAeOjO1Q3^etYQCt zWDm^V$^E7}Q&?GU8ai?#1yHeI1x1XV>%8|aU(wgM_-!uI*}@=UbMIudnAXim1 zK~-#$pips)8Ed&4Hx~Bk$)D{6!?@RhA703Y9s6t{>_5luYGM0nB7!+S2d^amN_crh znk@7T6-qmrb3ht~m0?VnH47qmev9cE#Bz!WD;H4AwKLFZRL(DAce%v&LASkFyBES< zQN9SSY%0=?5TU&k=_2wH$FfeT4IDryk_0=qiZ&wVNOv0O)5MN8p>51&)8;5R)uW}m zO6+Bnq@^85XbuuVHNc#~%x)HL%I)YTmhOc=gF(aewruJY%%XtD;p=O$jQmd&vIgHy zVA9YA1#>2X?Dl(qxeEOG7MpfwXxYOkI!X>9pUKjHJ$v<%=9SF=_J^02^)j_VUydku zPhziE(7hz_r#@)XKJ*$^W4^|iJ&NsH%4QR%dYM%6UnT$jW6OU={*S}XQ6>L9O8IX* z_Cr4%kMHgD?=Jp7JMn-0UZ;}(D*j*b|6fS|?;amk@qdq!|Ic7UM9XnBrK84sc?*0k z|MQ?--2X^{75{&Tt5&O7A25HY{frjgeoHx@>^HprISWAXQVM>uUZKlHLK-wy_3!WB z{0OS5Qle8gxdi3*PwNzqx9vnKprpdD6I8tsbcMf(I3bPGM=%#}J!5USmAG?}ZksyY z@NSz-x2(NO;w^UI85=J^5syOn&qxvpjf0|%#tE5-8FXJfPqzMO6dGeDNh%~87oHTU@V}c(R(T2?pJd&9k+VH`5LH`!2i!?ikJCo~y>T9wlo!q|?+-;}{hljHxu4e*t z`7pI6JKg%dLb+LOS3bepNN<7tVlK@6KTPa^vvpgz`qE#9Q);q{joB~xv%Y2R6yXjO z%hBDu$Brt4<7(Qo=q z@ochnB#ADUGvhD;KohTl-9=aE6O=6wnKS5Ff)vU<==t-xK%&X4G(?{Cj32Jnh(i=d z>x%`g5bcLq6eba@t_ww>$=Kb{k~@?u-Ek1bNDNix^fyR}5j-1bR3!~Sa&)0c@SY!X z_h@pPv||+2`6-npqL#iCvdYQikNE|eOsG{igia8Z=azbIZ=@$EYK*NY+7$6~l~(IF4egFa^eUi~eVlt25J(E;G0> z@b7au#nBuFM~q8vV}6zxhmTf0PXuVGRK`wjK-EPbu7}9h=;L;1Cn;z6{WO$&&pGvH z>A8=-Mey6lY+t+yXT+ES;5}Y5w`7t=*cFPK=WKcKHzxDmD&^ZmtcmqU+zRA4#94ZQ z57)V04ZHORo{IbwoMa6umn)iSYWBj7JvC}YE6A^4nusg#15U0&Sqabj_2{~3Z%5FX z`gNmee;R$hrm2B%U(f+7>#ys1*i(9}i4#blZtC?5#dD~ydHXT!kt=lDA@nkwN7`M? z#X=w{HzP{NemSRd(53YZ?V7+KV2fcI?AfAes|I4%PXxOJ+3`9=iQ1MsA=j;I=aaKu zVPfX`*7?*Zoe$^Q{++#bXkM!Rou|fQ zdo;3Z<1vnCJg(*YM=uK9wCdVAw8?8R*gE#Hn4fU!wo_yZs9P;Zf@Ue2yzK|B@j3ciRAN z*Z(`6Zl_(0|2*hd=l>6;|Lfy>Oz)gV=28CAU7={I&+_r5C@lo&Cvc;EK$iaxzmQFa zkHBROtmeS0mg{C>5j`%9*cg^!^wb>4Ay2n}9|hMtwyI)wK!C>#+;{g$PG0CnT9uvtkhm6O$D zXA7D^RUL?gZklz+`0}%=Q(78)d{5%)-&Gq%pQ!SGg3rPY|GxS#v|%6rcjMUIsz;}O zh}IqX?Z+t1NJ8CwC9rb)G6Wj+=e$MG=t3%x05vB?!hq&yE_$S(maF#EOq z;P;q4U}85+Flq{C`C|$k!pldID z|5>$v2z|1tz}9;OjKJPk76ts4Z9C9xn5&+19UpIO^h0@jws0=&$;7Dq{Oltd<6uSX zGo^?{p-^nP+^|KaEWsRfGSM3s(~9iVpH|>s;^!!F-n!}H6@Sx#f6Vu=phNuT1$@%G zDu|}ISIGwPt>bf$)|gr*6WJf550ihkEA^ll+ z^FhrP=}gV?sfKgknNW@N&aei z7Su5D4dmIL&klbuS~4O6Gq*3r7JfG^Zg970|3z*wtcvvRdb{_?Xni7l=K z8Z^1&X*Q}l8;2X&F8UCr#i6(8i|RU>bL={svz*nm@iWJWRZb?E0c?thfE!{1ehhc>`?iSBLq&H!}l4j1d{Ep3P&&j5%sM)aMn6_@75Bbtw&wd7} zqOiv{&&(+8+AB0VU%A0r{fNCZ3gm6pW{;@kjxk=pepc|an>aY07qOeY4&KieV(ET+ z_uo=|F#W-LX^OTu*(-F6jj#A+OO0<65SlOVuk~lQHVb?p1f>g>7MQGLL7X)rX;DXj z&+>Q4Emr= zcWRi;w8CurD^0f6_V3qm_y@Zc^I>7DWusx%-ok%Q+fGKc9|S0DHG4Wbi`N2lxCo8X zu`lp=6}EWnUo28Pi*mL<#NqH4nz=LJZn;TAjT6rds0}2`Tv16W^y5?bEw4LQ_}Aq4P;N1-h)@W z2t0b}oxgkWtk>%uXL(yd_YD%q7wMeNwJ}Z0emtLHA-f?rf1-|r{lr=)Yce&+*DIkR z?Ct$GT(4iBo}T^i!|?U%;rsXhv$qEfsQwAhK(J4rFytOsvKIJJ4l(M0m)hPQ3=1Bs zqeus228=&W8hFx%zr5euv*=^@6w7${Mgz&KaffBfPyYYv;Pt{Xlr5Z5cx?x(p;6J$ zcy`D#9=Z1WGw09z*Ce;0N~B}dh@5U2nRi;YJ9_%L=GKNFT+-eGDRWBS@DvCL1N1Ds zH-mfUHBw7atgU(Q{d0}w6)a9~(b|_UPc8C7s4TJ7`A>EJ^UI$98215Ai^m)uY7PZ-c){(lx=AE2V9S+c&4|h6qhvA;ARss!R(UJ#>^RJw%Xwd97 z_2Zkf=R-cjL4#lBqFL~iOZccqNV64s+K~;0eC^8S&zn0gb)o*XnH)4hUo)qYZ+vOw zCR1ciWjvo`%2Y(6D=)gXv%y-qhq{?hx}I^;Y?q))#oK~Uo;M$FzJb8rqA4-&+HCDx z30M=?77hq89S}lTgou_!!~zLPSR$xwiUCv>MeBmh%QAsLn8C?}h*S}+ic+M4R211n zK&7%+cTg%8wNjCyAXW>4VpS-vs4T*p3AMFq)%yH=eedIZPbbDyZ*q_?Ecsrd#6)P{4(P=-fi72+<&=J1qsmob=!teGVI>A1<6^D9xq!^ zap;>c`C-#JJG$qL)|j%dZ>&YHi+6GMmHqkQu3p_!H&1HFm<5Ho z-q12AQOpW~R%&@63GeuUVlXU9tg-EV@I`@B} z<)=;#T-LVOgVgrcH#5m5w-N>Q1+K$ zognp6PIF3$WqG`2RqEv8+%h*Am22&r4%^#CnsvsIucSdGO~Bf2_TzEd zWZ^KoBWnj+7EvZYyhG8bI#r!(5dN9**3-2vRGadDt!NTy%zO~wX;XHF`=wtpW4OQS z4~nB3FD^R=ebjVjN0LR?$?lT+?)YBJ@=-fHdUJjICq||%qv)-L9$xyrH`8F3I%@W{ zg3w&ZaqCJ8#-gv|PBEY6xeD#nC$7)GY5Tc~;Jn=DiuH+${qSwent<7tGdAh8+BJQZ zqWPfL`n;!g-yL9}?0R3Z0-LuhHmRjjle*ld)^qIQy7q@LzYbi!3u0NS#Hk<3*5vFOMCKdPj zZ_62evEO;!FRP-p`dI&d;NSlg-w+KIYw&H!LRmp0lx- zy=82JG%ii;R_F!APrlLXzRg;+VcJ@)eWJdislspro@xFtqeN$a&w@`Eh$m{4sP$zc z>N~E@q2{G|?20d6nU`}Bs`qZ(LJ2c=OFwlOF1Tj^thiu*!r^$ZJi}LVZn7)6B{pt^ z`^GvN@q2tm?5*JVhOp_wR+w(m&(l6O(tnG2NNrgu^|Ne`Q->WFvO~e%ZH8gZL3a$A zWqq|r;y<->tu*c0u&plmN$}0e^}qD)+?<>mp4MSN>0*8|ucUKT(45VJ>2VA1+XgnA zfEeK&b81Bof8gDx}S2iH?1e9 zaeHbPxv>2gN;gxt;!4p0hNCPyb=cgd$6nrv35@xnMhx~LrLfsUTULMC`@ zTakO^Tl>o@HN3*8z^l_wt{C4ZI+A(5Zp_w%oV7Vov-`>NIPsp@qPd6K+Zs!Mit2te zFM?fdnBwsD)s_)YbG^e&o5`cCUU3bx>ERdT>&B^y2~R&aHlE-!kT2m}PDwr0>Jc=( zruiHLip!n9o_p1#Y*k%Ar@bn03y6yQHtM>iAoM5-&rDdQzM&d4S&x-?WuEsUM_BYb zoc%HG@a{`iwbgAmIyo1A$oHC+RSKcii#RjnJl$vyF)L%8H6OLIaH6KweK%!m$IpSJ zZkuW1`zOPjPa0ZevF8UQIZo*;Rpp+Et&+GLI+`jsCRIJ!>FTDd7z=bKU&=Uk)`POt z_K}tkw|CKmyS`=Vjf?W8>T}DD_fblEJ1k@Ow~mbSjwnNTg~b1|2hwX|M?9^Fy;7t} zN^0@B+U1;B1i94QIXHlv80eI1YxGvEt+IYPpfY$HvnzKcaT{ZHx-Fho=B1ZytrMJR z@20u@o3CYx45rHhy$1=VXNbF)YvZZrT&=a8 zP{5Z-gfgaBB86m36v6m-9|A+50zt#YQbYlAn2~}vjlp8E9PRB*h?48*pe$LO!M0Ky zxoi`*Jz-3fj3X#Y#l#fXem>G#8VUQ3rS+i3-HH%|KRZbkBQ(1|M|6jttll>t6vFJz$lts%hD1s>yhC&g1 zCSN21MPiWs7LfmwyaE4gI|tSa__uf9It=0eLkQ5O{+|c+U&hL75w9@_QwD)fx*?5* zdqHL~*-lJ0ojj2IrT7CVU7N5YS|Hvcl&TB{UHjQ+&jz9}7!nwV zn~V;`#4wdr+*F&v7(^i>5{1N)C3GEJIoRW`?7(dd84Q%KcxET!WBg~vhPW}V@>6Q2 z;)>s&!Tm!a86w5kp6>KYrsT^p1cyD0;oAzKxc_3lT#6}q6a4*AVkR0y7b5}@$)yl| zz){UfCn%#VQRlr}+6!^XAQ&sZNSx;_c4?Z{mM@2hNN9Z^s=v|9=nx3dq2+cjy0cZx<`?gZ}3NZon7- zP==la7C}pJ`d7tmpX23iLP~g(t-KmHmm%j8RF5NAHq$mvn z(kW6>A|MT-fFdp3-EsdHop~|y-ssGCzVqJy`*Q)GbI#uToW0iGYpuOvZ%iRh<{Tgg z6A;7&>fi$9K=@w(AP~sU%S-p=%J=mO zw>JY>*m^+C*_|D2*&SWXojgEp79ehR2b15`2Yfu>bNlb-A3pW}JpWug{6J0wI^h2j z&Hn`dkIz5A1p}FY!pn=!$sBCu40SSwT0!jD9h@N6=B7|OA0GbKLCzk|P;)zWQ@D^o>_8Bc%c*f@hwA{Y-=hP*A^)6w+`PY#e_mdG{vY!HR{$Ux z9pLfD1(E*Syz&iU1Oli4*Z@R#0(1Zp1|k8X`{k3z&rco%cmNy#5(G$q0WZKLfZx%t zAOeu=fdpCrl`oQSV+CdZf`x+z)DmJ3vT(6Cz3c`AHFmaP{}z65q^#`0Ru&$t2tWi1 zz$GH66v%KixPlM?{)liK{@}>4e1FfsF+g95<@{eJ*5ki~*po|Qxd>DMa(@D`#%5+; z$i%%Q6F`CSg=ygYb6Mc=Qvv4}hJshX|2Vn40iJ(+2pGNxpWh&!74Hk1f5nUI5-*{@ zLjHfH|9SqE{paLj5BiCmOA4LY!RGena1zWxoZqn!d`tgx^Z!!+^Yiclf9U_e0stqd zfWZHOEOyGY)ml(6z!trs2 zQV=5d4=K*4PCKfs4OA6h6D=PH_A!j9qM@U-T{LZ?9fbf^}KM zW(P5Iu{Ecl|27X$V19YQ-q;RK^w0c2kH9JjxGJZjry~neRMU~wQj=5xNvo^LDazl{ zlGIUDR|9EC>L?HpaX3LBP!4BfdovS=I~-wq3o9_I6oBX#uPUla%F7b`j_LnT3*UbM z{7V0G@_p6+mt5ckv4zhk#O>>JLhQeagfqJxoGGjvY^}_lKwRGu4)~V;&-*L?pP!%W zhyMRd01%A$#{&Rtzl&3TQ~g&XUSjfx{g6Kq69fu601W`c&I9yCAH!D}xB~*m>~AGx zi2sM;2fvbkKHyjR|DrTOCdSTIrq1jZR<`hU+zA5xUX$;i;9K?|&oAS@TyXP``-lAh z6#zI#1-Sfi^N;4YdF9Wr_(TBA044yAmEEPOWeYL=@*M&qxJ)7w{Ic{Pf(5JyU+ls3 zANJs1ZV!_F8>aY2BM|K?gZwZ7|HJTW|DXSR{Qut-0{)i%=i=o0h5qN`;{T!l{}KR% zp#r@BxZQQ_yLjar_7)M`r~k(=FY=eD+~==hULAni_XY#MGYWwKMBoZR{I7_5(C>c@ z?`i{7{~RLWiqYA{&iv=Vr`bOSJ}={(T)~Kdfd2vEtiJYyfn)>j`&5oeAgxqy)qim;iJgC%EgaXa+YYP}JbwB_0yN&uv)C5#h27 zFooE`-C<{Eb29=YIz)gP0NKUKia?%1))ESJa2Dd=Fg3IPi3BLz=XJ6&wq>_BhjO?% zuwCjDb9*R-OrA`Gy9ikA0MtBWWd#b?ZLwBLm}5M;|2V0 z3LgAxbag!c;kTTgHs)XCWS zZ*2GFyV{y6mk&Ddd)Y680&)5gVEAqLb^eF*+xDNcql>ZA_pb-v&j0^1{>#S){Ln1)@r*JR4;4<8s_aofxcjU zmjK`p72x;B^*{6X^2(pM02qH+0FVjbH@}J+bLIb70RHj?;M#XF!9T77NKnonE5LsR z{QCR{*Y}+N_+4kfz8U}J`=$Qp<>lx5q5uC10C@cI@bCZh@JA`)fA;7J<7JfB{ii7J z<9`**zZJ5&B&Ht*B7eogrc0eF5h%=hnN&R>(>KLv`>04VV9nsGV&)!}XW0HiNT z?b`s2Ka|tI96tvqD|;viZt}oo(FJ~I3bA#uvv>YNAu#~S%z^-y;>wq?`Z>=1CAlB= zWfScmrk3sZA@d`@|9=2}z5iF>U-Cw){Ncm%Rd45Jxjs2>_0vr|1a%7 zKHeYafBzBy1S11H|G55V_zqtAL%Y95zb*wD0HyC$qW=~NXJZf0m*+1#zx)yZ=kf0E z=<0iwBk(`09Dkkv`HuZR|8)N6+nV58_8%YbFY`bA{G31J|1SZ+GxYzSgEyD|3xMJu zj^6y@;LWe|J@oHUzsL|S0Mo+B_=`sPY9x^ZFxmh18a4&s?;nxML40=_Bb$yB_*X6vzqbE){?+*}h^-l%o}W*E8Qa?ap3Pw2 z(*HcbU&a6Uf9(JIYXAU41$g~&`C$AWUimX}KU`my26QVs@MS^;uJBP?gssA~-_;~n!wf~o&`-lGjOMo^41H+%^ zoe>i3duJYDtx?~NvMYg|`E;+h)@h`8HcZc^-<0Zh6>7Ic90G(O+BhYSnfTtzav3G3 zTQ0mY2uNlmgh>t-fp|(KhUa|ZM(O=$*~h56z89UnO|oWYNI5x93EkBMuHlSaT&2RU zYagFLPAM_Jyr&fJ0>_K%o{x`@e`59R*c@A5Pdm7>zw!qCsQ0;u!qa0~ zuNc4U8U5+Wb2Bn-WA$n4C5>q%C2W3`jg576ixc_cu%nEJxNp%m!Wvf({PquBy_{>D zrPsYX&oh`5eec!Ph{A*?U>8$Ju+260U06vn%n$Ekiu0_wvfc;0dN6rV+N@W35xp>r z8@MJyeKB|D=jL@x!j^!`q7bsM`vCOp>lo19gh%lxA+~<*O_L zCO^JCb}&t5ngzaVI$=$cr0%*&A^A*jh``2@T^yI2H-aI}+#2!Pf@ErurU1>V&Md@} zsy9m{yJ=eJXp5d_yzzK+HI^n=a-1@K_VBdX&inR>$$4LM>L#q`3?!z_KSR7RYmpZ; z(UGnah{_|Z!bE7xB>v&86w$R^pqREM*{Vv&Y?kynbA7>%%#{}uOqy|_Q>%kwLpdPT zcplwoHBa?u_2_gl!R1NYs(cy##Cgo>VvZn%l6`q&r77?^?-AGi*L2#NBaP(dE0v%3 zQ`#%@PgJVt7q=hep>L4^QW*(Lm@wJUNkZ(=pC}3hUIk4rF8K)fIx1_pFTR$wW%L@=4)B8Vv8O`7zA;IC`#my+pW1Sa{4GR(5#MQ3;#3yda+! z7l^4T+L=1&cV&b50FTuzGjAeHs#;hTOU5Lr1c^||+`T0u5%aJ~(vPsy=mB_3>eIM8+HI;RR_OZ5ZgZnWx#09&ZgFFCnrBm zjx7%@!sJ~pICgd!H(IWUsK0Ahce`kQa^dIY45<-=*<65jVYpqeu^I?uYO-J-MoSFK z$XIT0NuM7baD$C~D%ybc)13GXox!BXVPfKfqMCMo+CKQ#cklS5Be3Ob#-KYWzt3^< zJDRKW#54=EK5W%YETWSyaW5?Qrm!GAns!^hUTK|?C&Og`nOC+jC!rXp zw&=F%pgS}NPcgL=-FC?J+kDnCE{?UkJ8JZJ8JgHu7v)S_nwDYv8V0D|>$>d)#%jB- z3K7eQ`1twyGC9eKOwNb2^@Hp6`YB%2H{T>EsjesR4xhpxpUEI402-6Nh4w5spH)Gk8l2 z!9KH(7w_$U)H&*!Ga=CEfYN*yQqTra@~u}mMtYtUYK=s&*gKF z<$q2`b0to<$=k|CdzZ11OukD*`rd)?KFcuJ`0?rxcXRE;S@2!RmF%~VZDyK+RtAQ_ zWwatED|_XK$M56c^KX3^jE`^i8pxnNpb-&rKMG}<-`}px^Al=7kJe}4efLC2DR-{w z?aSaW4xEfMDp4OKTz%5Y05#LJ)ne2VP^k0-AhgvCO;+6NO18TrbhF&eVRQ2RqI&sr zk}}8*rBF#4CP$lOByo3C^FA_MHC)e*0UTPY^W(m;k(2Fx4n9m#Nn>S-5S2p8&y0+hPej06Lucnqk zJ>e5&$S9x*(O*6pFP?|py@1Kb!#FRpo%7bGB;C#%g%IXUkFeu)U_+dAM6im=U9oLi zuQ6elGx~8iopEP-ZS^^^!33GNt@5qVSD1|1F)Vl-}&?I)2RlCdVl<}BF$Xo znthCKkRLVr@v(%jxN2PI1r4@gu;=9IKFpURe3vfLMTsMf;fn0Vyg6BP-0_4NN%V6_ zDthzD@b%`CoWoVv&dL74h`lzPH=C>qKe!2{sG@=zJa)UvE~5SH-J(z8+YifN>wV2I zx2Nl%&glzh^K#hXt)NB`#aZU?fy9_q_45Mp{YBbyhT;ufn2jj$e%{4U2Jx9>*MNBU z0Bky=IcBl>Q3hK^cm%V>uGKF(0`z0mZ%kXNie4KWb& zy~+lYvS)5Ssyfrz*^S;88p$}RT-nVy>L}Yj6K^=V0Qs$`pC8MMEy9*By3XtQOGkXp zv`_+?7|3b^{coV0#U+Hm+K-z^P*%R;2AR_ygV~(Iw9Yyv)xbqQ_0=#x6x!#oDfLiN zq4TcS5|g2@+8QEQc+~x>bC|R@jfmID9Y^5&#bdwv1lgG!-o#klv+SVyuxOpQ^y4m_ z4r$YpzB31cR4Z|1i)D?XU6BlnQ%XwN+Ih6&o>s3jWfJt(h~8a8F`olexyLcm&2C3? zA)Wy+TgLa^vsxWb_J*^AuHz1i!j6}NM(i#=8*WYyX1~+z0Hyg}>~(FoEH7$3IV=#8 z#ZWx*D-ILt34}_<77cAG%ZRsOAa0KCUS~~QDB(^k8if+g-92C6KS%+hY2BwEzMIcX zWfp($Y+I?h`}m1Yhl5nL+=B-DamOrM z#YpK7A_;S;?q7R(9;V0lJ}J4ixIj{>JPxB*K)qGuLxmE%F=Bc1dxw|i^(4LA`Gfkr z@O7HhIC&sYp#@}|+(u^biudh`eZh!~u_A!fW9Rb~^=m37ZmLbAWWn1P;G^MW;m4+) zpoe=zU^<#mq1_Ep(F-N~O@)1sg>hj;Rqp_3{yF2jeG@Hh%(?u>9gjDzy+>6YmB|_; zT2s73@VZ3Cy-(%F65``>ou%ElS<3RQx_6Q!D@34jP3oa8;0E!g3VRMI(^?<7!nN0J zT94NafH}+5Obm;>1-O1yW{K!vg$JXyLJy_T-oHK!H_+izX|+;IEZD_kvdA31DUCgZ zVnOC98W5%BNauf3#UvlImuKH^Z^Y^SC6A)4g=kB>Fs3;vt>#ZDG2+tN+Ux4hnBTRK;e1TC z8#>9j3)?*`g^hk1E14A+OWtk%fHe!;+&^3Xoc9U#Aq`fvMO$NYwwMh2a0Uz7fvuN} z)f`s4p1Usg_owx{_QAv{F2t$#$aKtR;q5m`VT}_TL)%llu(D%V*aFPUO~~tFVZ{El zU#$e;jO-Yujt{uF*q#!uPjNXr3_B^l4{O@?D`h_!Iobq`1089{_}}oO@yqdl;;){p zqTQMTZ{2oasE>UzNjvqi;VERTlfUL^8(z~y(3E{^JmOi{Jd!&Y1Ge76-=g^l`=+iW-njZzb->jHt=GY1{%rG?XWcDym+UB5>7`ED)((d?t^8fyr}!^U-|$LF zP{Z!|eUWXy`ixH(pfQ;4vETao`p5w+dRn^*W*S%|=>Zg2ln-%*0_g(V`+m? zlWXInjg>Wvtx?+pO@3u1+lCj-Y5lk1U)zPjZClHW=9>4*wx?e8HEyo1LcB28oulR} zF}Tfnk%5%r7Z-lwu&K0?Pq3N=7`(3hY$_Z!wme?C3-f6>gN@F#oOguzCeMqHTr{g) zOxbPf9Ka?mylNi9#M>4P&6gW*&(C_GCjkKCX}7WG*{hV^&D8bpJet(9M`4+{XhDM?CT$H;QQ0Hq+0L3UFP z)MdJ0%^WOTN9;hdss3C~vMAD{elwE!86GG9Frud*bHE#deC%!++2>nK-lu6a3r7~Y zVJuQ)A)I@kl3p>Xq$STp81kv2xU$l$^uh$m?0qgiEW#e_`nl!x!;bJXU~T)Jy-OFK z8vZq@uzIht^#>OaXB)WrC*BFRv+LXS85UOO5_sgb@p{v1($x7xk5iIbFmDPo!j6y`puj8ffNNjT8MOdfbvZb_d=8@R-ld(|i4ez<8`7M}lNbBI(h%;2VELZlv2 zVlF04ORm^(B1%L6JN1VrJqqEgO+wwo#yEjgz=xT31b55Bm_2%f1i+C^R*!DhUXwx6 zf!0dX#u<32`83JqP%Rk)dtM~J!j3RN@iFEs;7o6qCdu4t5ptDC_J5!JV3V* z`%VWF8fPwEyup}M{^$mh{r!6nUSpN0Ri{rYhigmLMP$f@t(-qpA&d{)~6(I zB^F1EK*i%JEsgkqf-mtgH&xc$gRsg3*KpxhYf=B<_hm>1&vF-8&R*0SllTv31olX5 zNzl%&y=n0OWJ{aG;)}X;^`1&R(BhRUbHeiY(8*l;;5kEPHIIyhlIM-9gA{5}IzcFu z(Uymy$aqAyR$UHKPjrdXGaoeXWyJk46xLKS-*zFEU9{5&%(Mt&u6T-e5 zV=c+c#5)VJH{?vv=(!bBjdCitZt^km4{2x8xZ@A%UB_rl!hbq0%ewe5tcNQCNzWBE zvW*}-Xi4!#uxMLZEu&6Rc12h!@tdcIhgPv>0~t$u1oyqD9VO*GsSu(=`Xae?v6J|< zjr4AC67+_5pIPkV?A4*xN+QlgSyg2+5?~riL4|NaKh;U0YL=#{fyXV-A`#F~ok`8~ zxUj8sRe8A|ehYTL&9ybp8pz6@uO<&T|c4RfVy{Y&1RQ130)O8kUs5nUlk7UNn;}Pv^WUR$YOcP z^L&GX*2_217Qqyw^87;?YSi7rt@#OlNb3?~#5WN2Z3*U1X`pZUj_b*+j~Ze1 zbOZ147Vg0=`Y3H*poVPWrH1kBV z!cih1A*+hRjmW}WS;u&Z8I$=g5ci-&@ z@mNy$*;IE5u{rSIk|ZfxnRhoQFT|c?b_r(ey<5UpK6-)1Ea@LiE@#{Xd>>*ERsIe< zT2~|#PeTAhPnJSu)UHV1{oMKvCt%Ae)4g(A>=x{7U~7Qk(P}`WZ0*3fwpr+B8X!;J zXPb}O79RIe7el*^-95OJjO4aCP#fY=8KvE7NuXucT}@$O$=&oWXbJC}y;|#{rmfSa*{NWvEgQoEUC)Cne!SJN9(gq3Yb?2O#aeL zxHxs+_p<`JJ!d+r0=%kOf>j^#9TuK6r>(>7i=Y*l(hZ!BJ!dUN5v+ywYuvk~8nc7X z-lT#Y_>;iU3X}QBB8lX|3BxtJD8!g39gzy6bR&oL?#1M5so_gWwKk~P{!mBECHB`O&r6C2Ws&&0K8A1vw*7{wYX8RX8=*{08pS8Q!~*Lx;H zl|GhALvCUznLx)MP7(o-OkrwOjv4I*0@ zy)RG{>+|MeK2J9%zrupoKxC=}5=k)~Mt}#G3jJLq6_X&e4t$U=A@NLO>az?WLqT{O zjaN@dkz3pXDtT%g&9q4rDfBvKctRD=_vq5FQ^y|_T`KL zPQI&$Qs6zt$_V?%eCl(mOnC`qTrBTXid(YMx3S_5nR=Zvgs%3*Y^VYfqu#B*W_80Z zd0xsSo}p;qAp)OKNt9rU&R^_!xRPaV7xuv#i;MLc?v&*+8xUTUiWOj^h zlsbl2G5Op|f3fiiZRkY{ax6hYS1di3M9t&k8$%t+>t#Qk_H~vK-F}J=natN$o+>UY^3$#x>83`x zcy!Wa=ee4`XkOV>#VwFx!0+=SWzw9WZn{eQ7?4+3Kq9{D-4s}NTC#g+V#Tg(s+X?W z>f#QI+qm1&Fc_g-pqK8X|JYRx_<~hNYr3P;ilHv`hUwF*c?2pl?YkJNB!Dfcr;_}= znjrz;Nm{li!6`YcX;qEKWL+;C%Pd8wKj56dj4DR*-FR;l%hux}%00>Jiv6Su^@XAj z>3-3kPu5HavviuPeWTHm4(}UI0lO_DNmS{lZFWfY!G_==`fcT+$@WP7d`$A=XZFv8 zGM?odrXk$pq|9u5fUGZ1f5Y#Cp4)AE5A!>?YUh*!I5N2duZBv}Q`Tf#jg-IwTb#=* z*p+ztLk?(I#EbZ;Z5eTVPI_D|k_lleUNd+0J!?67tLe-IDgof1&1N>_0f zB8l!j@q!%AwOG%I_=PL&1?hmaXJ|9;98!yEtmVwnE4x0|Q^DlM-E<*JKa=L6@^5h4 z+G*20S2~_bT6@tVvKyqhB}%oH`1Cfeu*@8#9~l~pf&#gLqdqcTsI%yH&>(Y8z2+X> z5WW~HLDy!h>^YIZJS3HWiEH@E^O?<4(YOu?I!0xsVhim@H#Tf9D!T)f8xl>?-ZR=i z+zWm|ZFOHbqV%A38t%CgU^;CFFu$R5ntTK%NC3FYOMjr+b2bVi#f$pPUAsR^J+Q*_ zX3o;qzU@w*2QV!VDw6#4ZR^1U{S~tMtcwo6GtdzEj$-blaaez61O`WfWbcMZ{PZn> z0DWxY?Seor3*vH|YU5`igy`dYgO#0nRVJ3q9#&})TPlP>Y3!%6{KJTBsSQ{YieT-R zNKYE_CbanCS;xXGlN>bf$hW##Jjt;wVgC3oMq+wk&=mbstmfd-pr|xB>S}DUwieMG zC|~py$2HPby<`OHm;`z1t(WCbS8a6m-)hh9#<39!MF&hImur>U*+=@RwboW&qetk< zxP^|(TkdjD#DM;SxQ`Lp@N6RH3&>&9Cuyh+G+ndGt0LeKhAi zVwh*K56|%0^^gza%$WY7$p)RT8#b<`-r`YqHkR_MZM!YvMNWrUIZHEz}X{QYrP zDE85s#f-1lL0eo5$NTwek#~?u*51q4)aXZVK>ddg4cZ;;>2(W5>BIc3ObSHFRO1qH z9-sRNU4z735RxdJjg_V@i+7TEuuSGJ56dnSRd{DBR-t=D&EKB@m`X)Iv?9Xpa;tVH zKjth|!J~i$MxJf13EB`v%9u6PKo@Aq<&@I0D9`nAy`(#%dhon>L!NcN(R5(iV9JiA zAvPo#Mg6oWoqm^|1-gqxzk0u=@HTaZqxHH!5kf7ghCYwThiq~u@}Va{VzW1`Mw&uy zDUX{?Ee=mq0$^*>EsgkNl$qgnYvtLN|=oWzs@mABv#zE(P4F>2YAw^e z!pw7JunjeWOI|PD^@bQpo`zF&Kv!pCRRiPG&?@lt;+5v2*z_1VrMbPZ)u^TfodYs+ zH1f2W^(axqC{8n+ZDy(&y;>>v?1Gzp)O9b#JUjtJt~5BW8%&mxa=Uc$1O+4N=k6M# zzrtKfOtu2G-FeifpA=Pz=Qb=RL|(xG?H9hLw$Mg(=XSRwNz>2^4sgYO4DB-W9kZKA z>94{|aXL()?333A6JK)l-`R3NLLSbqY`<$2P!4+$ytYkiF{+|$7cIeKL*7nXlAsNy zF?f}FHmPv0=_IulMPHyVlkm})wlZwZC9+>k;buA2cuI^;&MuwwE+dfPIob33Go6O= zGLI@#okVvC#&Zzr4W*Z5^uWV^(#rSn<#D}P3`^5+%+nkF3Ys=vH=Lug z44zsnU;!p`HO{&o1fjXkEx$iipE+YhUi-9Y+v=SghFQ+EkAND-0PcP+UTjRqBwIbw zoqiXlzv?%o3ahWL*BAEpX*dB1pn4KCUogxCHyOgltTyd9j{RJ!SB?g7b79xefqM3< zCoU#4SQ0uC0qyl#$2~h&-;6Li+!1!bawdBE7Esz=Lph($RCI-ElSAN@dXsm~1=o8b z2|0d&s95?d8gd&F#jVna@yRxlHw^1=vQrpzORp;2NNOar$R($6U8)!n!OiGZIX1%{YUY_jo1-sTFKA?JsL2rEQiKgLhj*+_xDi-hi}4LH6e?fo@sZ zt-{7YkL`)2Ny(l4F10h};3l`G)MU@5v)u`n7jTz+pyo4euBCCsj8OC^ zLE_D?4j9G`T7^mFapeYe<9B-`ulGbZkEz|5YN2Wh%<%AX-?SHTcfWqNGGDYgwRvv& z=Df)Zuv>Fu_;O{H5FBysn>b?86Pa z0i(#lrJ31LQVzqu^2TiRdCtLPQI3HR1(Dk}24nr)mHj*K&o`NclV4=dz z$#{ZJ%P$rQ`PIE4MMH+U6<1u&_U49Y1~ukec-kZ^4|H5fWJp@a4ugViv zXzs5z_1Vrkh*S@FwLcSBSNl1#aVW@HAccGRU0?6{h}t#EWN%2vo_7IW$oLG4cuHX< zGkHvM2-V=={@q-(XN1()1ATiv4iN-RJFYCfkVvMA1t)I8k<+IUlgui{^jRUCPLg__ z#8v7$FT*7*-mlw8?QMx#%4>; zV^Cv7^~fS}C7BHx7gMaX-Bz#J-Xsk^SOc#pA? z1}o!PWXL?4GmP&&)<-BXq_SVot!?!zK&7r<# z`r#Q_hrUtr9ro60+kI%a7-;ZyVptHfa+^w9NaS(6`n8~|j-}ZwX@*v>Q_BU`k849+ zm9ct06JnWC-H9Gykd%0bgqN9Gt$FP4`K@&wLY0~j5K7zVc+r03w;WF2a zqwb}SLql6wde_;)w@<|DXl;4dbT=l~r^I2}59tNu_TbYyg8e1J*j`Uc7JNgdIto8l zNSl%hRV#>|Gx6A>ni?>2>f5R_k!im1GTZ+1 z@|eql<+*;flQOXmHF@O>ovCTHNL}y+)GpdPTxv;ifMT`jDq*b|f4Az(KFx%TLQ^zE zvTHIJwzO^*`n@yG2lbTKWI{1FL9x6{YaDX&hWJl3pstNX-Nwxa2DAEIrbQv1b;hsI z8ab)Lp>>LDw=$RR1u?J}FFinOdHpHuAk5{ng;lbKfdxe{dHrYnk$B*($%)PoW5v10 z^az@$q4At?T(W2**UcVt(kTq8wvJFm*h#RlJ^_HH+h|NWPToM3gdqwF#&3$OiRKu&uj^dZXESupFG9F2(= z3gKhNwd)*MG~l!61E$@_8!2`8kDW~y@*>(}=yu27_Izv{<0;w9sAYM{5rjdQ4eg;Y z`1JB^-ip9SKA%_UDdfPq1Iyux_y;#TX*%3*$u*E`+nX)K2un6#k0uMfa=k|q$=%xg5HN_FBH z-Z#2`6wpx073os5vFyDkT~va7aQ-nr0Azfiw~*$`a9nyvo9Q(NCxEAB^<57w;2&_4~{su9c1vAFQZW=BPIvYE&uMVy5g4 zfmlYI?vH}&#$|%u-B<44a6NkbG*)+CqvLHK;|=d{D&xlsZxhp##z^Xk;jHbeXu;Iwy}ZM( zQ7DtSC5k8Qd8NfCf&h{Fij8>j^A+;Lk{f<|7s<&*9pg2nTc1Y^vM`xnJTNJsqo6ff z0S%%E6L%hBo%r6GdiLs2$LJPm&MPu39r;6c1F6Y@@pQeahqZ@7g_1|E34FNby`=fJ zveQ}~b_o$e#3HB^A@nbEoaSy+U7fW`{y(o zQy7DTJ3iY-&hv()+9N3c;B2a`2A@OpYf7V|q=$E2;cQJHutJB%Wp_uhQ?L}V1%P<< zA8cy6ZkxL}yPNPtoZgZx!tJ};Ga+cz8EBl0F@yIkF@Cj8pgAVW=UNogs1urGnQ;|T zJNT19n?@5|1o~auh9>vYI|cc8A$Vy?S(X9m_!%N&5>tUa8Uy@{T?$x5mfIC+b`GkP zRBy?n8=6*u+YCdSI`R*X(%n``)Hh1>c^Yf%1MB;id23x!T{wpTCOi3iWM9DZyFkYWv9c5wkc<%&kWu(Yub6vvi;e}Z~(gAN!Y6FcmM!S>Jm%zt(he5*H^SKNlK7LAKHgkR9FVf zcsXiV-S%(RuzO>sM^+=qsjg%>7G0ZeTD&Nje0S*Tjs6CkGgf~Q&anQArXvQRkh>lO zFaSw2^hr8qRO&vGNKzkxSC$)A33ki-*!QnyLuPEROeSS{Yt9ue?nXFJFBB{d>Oj+K zye)J$c9Hrb7HfN`ts4weZmy*cW>@)C@nO8HV&dDkXhdjrew@9Eja(>^m&o{rR2>KR zF{q85d+Ec2sMEm5BmP<%ukNaq89r=YyfrOp$c^Pk*&~AkbU6c2!wwG#U^O*$K3?GZ zCInxV!)Bgv&rUGEZ}NF_O{MexMcKt990E?K)O=t?$9{boama33KsAooaoiDhq* zDG!lsRQN{y9c)3>YtsAi6Hs>=jp_=XN3x%T`t+|PM7Q!(&a5&m=3Mca z(@4TQ7tO&aRrOvd!SQ>t?qhy-N_ftiC!nS1xGa(B2$f_yCX{o)&HLys%sMP!>C=e+ zqUri|z|y2Sp4Gw1$2LD9;Z-sDHx3j$g{AVmytda)iD)Xgjz>l1x}UIAl{o2AtX(&~ z>L+NV`1-C;{l>VwgyL%MI|l=iomT8zBvUlN*o$Bt#^wAa255BC9W2II%JNCR9lAIp zspDV{-WCE5^?jc9p-ir!e)}RaHdmV1y}T|c2`ULOSVe4jJI3L_Ve@9Hv0%JdN>t|q zoGP9z>JvMV!W%ynKX2s91H1T7GgU0pFN>aa_v|uq+Gww+aBk;j+8w53#X^Q5^@aBy z3~@edAh6S-yUm>bZVkeL*P*)xd=Q>-UDkKVgp17YnLK5JMRub#)0QOoxW$^HQT>($ zWHpVYUtsE9RTp8<;J}<9Z5#OI;Hb+|jPh$n#KX@`zJ$sBEs$qNw5+SaL`v?E$Ez%M zc3mgBQPA1^4RuZwoTtm21vgI-RCA9_P_H~MyUj$I%Ik^aa+ME-0be2^I?l|xb^peY zUd{_y_Ku<)3O%nhWbdS2mypu??2~mXD%pnR`SrU|F1sd8Y41p&-lzqmkwmBlg&dWR zMEHA8=u^3_k8_3>JtV4X1qI1uvId8?U&kYp@#cQQO@vG^ZB4=n&?V8 z*GRWW=QZ1r%NbyDyBEdSo)tR^gD^552d(Q_aL6u8UkmOWYN#gc0TcDWXb5Y0Jqy4% z=4x=FUMO>$ZAxrytl~{;r6W<*wHzwdXTCx#-sJcQlZ7;Iq2n?9^u;7h58IXr?7Iat zav6g(GQ+OTLKld}3nzw@3;7k~Q17xl#qU*+;oP0w9bQwmroSHbV35ej&u_QX4Q!VTopuHyUu5 zrCEIe68t=gYHImPf4nspxt%wn@*0wn>+7!KJFC%-%H=U~Q6i`#0XnEypUMkN3Xxlf zq-6T4IRl%nVmCx0m^vh&B=ku+Ud^K#(89T9(J;!S1VTv+H4+)Meam_qwehB4p{0(Z zn9NmKnJ3Uk1P{C=^sDt&Hi+W$b1Eb&@Wx51onAFq6ACdtjcQsE=Nk!e>oi7gT{z>d zaTBT$uCEE|Pcw3c6d&%TJ#FHiq=Zb;tQs92IMj=NyyD7_-fja8NI}sCAcqK3dQ!BK zJG!cE51R3^2!%=52|e3mXKXh4SYhExG~2>u5(#)6@Om`cL(H{2%m2|*n5_n>++uWG zxU8#vJmSL(0y{H|N3|_8Q>o>F&uAoF@5mD2sB?)V)W))qxN^w0rxYKYRKdC6gMhyAy&|+TjHq~d+!u<&OB;;NWqUeZ7C)dK6w2E zAaH!bh(hp!cx!dyMk(qo3@mHw*-)`>T*Q&ORb<+`Llj zyzVdj0o&aY5$pDZ+`UmpJtn?NMLP%O4dPJ$Zuc4@ma&){!QS<}UU#=3IZ3AJS1_Lj zN9<*9NexK1Wn8T-W0kig3GcQ~mYE+idPZO8=}fR3z^=i=Hlh>sGByo;txYUlb~fe& z+k}di+uh>XDs#s8a3q!t61EA#Yj0j+rhI&PPyBJ9;1v~qDkw?t!`{IiQ6{cHaHyEX z1t#YB5)XbRYAH1{%4F)6M*D}!HUKW*&Yj04WO6~*X_}JTcZqOQoka`M9d5dq*g86P z$8X6|rE|SR(G3U5sZe#w5QXu0nu6~O%OJM{WZv8aT5DdEcLb%<2iEs14zUQvFd)AS zXLv#~k^>`oXR?1~(V~n-{#gr3QYOQ^?2zW*1btO+5YR%=wzO|hC!s9#AT>WO57ZKr z7(I2mq$h-26gIF^!QjZ>zdoWN--S5UNc9;}?7X?}vG*3X4)!jUMmYq3)q81jn454 z6+~+IN7x=Yxyhl}$JbYs=RdLzSW6%#H$F`yIABK-GfZ;w^;Z}Cm`ZGDynqUy!dnz^ zd-=7kWNS}@cgtIIe9KD0x9&yy)D}ix+e$jS=ViNJ^yvb?3?ihpABu%?FI3$u)^_$G zZ1YlbB)_2s7|^!BuVafl;<@gxO^>Uqt1z`Aic=M;>B~;K9W&dzU&MlXi&8Sft}sroyGH^~Xa_{4}W@znEMW6e53;Yok-gv18L^ptp zcCVTg>&^Q*igGCwK&zrKtEmpqvp)K;7AcYT>Zs3$wn<1?4uz&v>>uzw;Ui^#TsD87 zF}&JHXI6LJEUt3Y2{4k%E%`PAt&Z5usTrhqr{O7^zI`aYUJWWdCg%vqQ?-0+(d# zqJruaYk4ARl8{FrnTEl;7iIG>T4tE=#gx}p!8|Nl>jE7=UpIL0jI74L<_KoDxv{RZ z>sLJ^&j$0OJBFp-TYoT{0UmDTs{>1tqdAf{@-YfWbY)q!RWsiout2E?@gUN_O0>s8 zl1N$Zq}V{MZl%mYT>QicQ~q9CB$ku_06)?B2&=%{r} zPEwcDW^9Z|xf>x3CDk%vw-IE5(I8BsjiFEQ!$7T7&RNsFM|3Mim?}~^eftO&PLEVd zYiR^F@A+KEnldx#}T33=;k&^BZlCOd{o5J99% zHP5x0I=QuuK#~z>{k|;dQZs(m{&Ep>?3TW9*r1W~7M~~R7M!iOj!jW*Qk3(95dhL@ zS4!+KW?pf_nER_F*L~$)g9rU+m?(qrw%;7+Hkj+y1X^8Ten@`YP}|74J{C)?Ao#3~ z=&Hc&8Xbd|+MM`9Hrq2FvP?&^yvsftTz#rW>2R8PTx(*LlN>smVtK4!+PC)BwghN+ zI#c_he7JDRZ8#UV{*b@$Xv6K^@B#maG`F|7`NsJJxj3eheLsf0(dO8Pqg1=tTVVyJvJ>Rb=|c?I zb6@a>7V~Gv_j_(qPK#3Q-J-1gaJ*cz@F4A2n$M!@cCm?7Go&>CuyCT@^Zx@GK<2;0 zBe^!#PAvnUV8Ry6cP7r?o3s|~&9xte1vvBHZEu#hZspm^y}R`udl!Z2*+jd?0xvGh zx9rE`Zah}I&juO!9kbTlznYY`-bPBO-1>W3`d$ z|9`c~j@&#)l#e9DYu_MAB8?^)L-i!xn2cG4clK#Iqm)Mv0$5c^csirom*b};u2-0e zk#Dk;k`u10IsmRe<)lzX#oiCI9^7Mfze&H2v0_?7{Ht$#zF6hD`ixR96U?=STN<5_ zW!c50>rCg8ok-H6kVZXlZDpl5${A;i{CdW)XN34z8M%$jM9 zD@_UV$QvKXnq6LTRHeG07+++4{sC?N4j9bNQp^<+gG=~C6s2ni?jt>FtoFv@KD&Wf zEQ*k(Lox@V)nk=Z-D;QG$!4@lKcFFb^U8)cmqhnLkcGpZY?$7BTxrx=6`VDD2WbJf z;@Ud#b)j|H7mf9GVX|h7>xQNB_hycZLsuBV)A2BwrI{9wyrnE>WTYy#zIEQD#HDTy zCQ0#om4K*=a1K+Kcu(RMpj*|M+^Wt=jm10BYzE5!3K7mYK)O|i#@L@TkOYHa&Y4kApto60s9giKU8M==By(dVh`~O6QKbv9 zPpw|`!4Ft(H*yuT`-%=m_?->Nc()^H?HNaQEYUa4nx0dTiV;C7{@R;Owc`ZOnIr8k zR%F)?DiS{XdU*%Eabz3&x>(@lSyNb~j8 z6x_u!Kfu;s+y86(|2x|M?`&@0uI>LHt^I$Z(=*-6;GX;e?EmfUb~XRg=H||BZU6sJ z_J72HH88Et((ilT5z1;5a|=@VV|=1c;E8v2@+Z=jAB`f8IUmpBQGoBGFgOb%(z=sW zXzXqrara0Z1=h`V2Muv3O-|F~EDa_TPT0eREc)xd=N`Sy0>HJYhOn$?3nRxs4pK)y zUtb_>bGQPgc-P`MxFEWq!`^H0dmO1U*&X68aWI{ zC6oaJFeHETQ`Xn0k~adTU`B7qxBDbq16G7pnA!z5LuL=I!uYUZI^xHe+t!DA(u9#f zT;a|vaW;iP7cR4$`yAb5wRK))IH5US!=p=GLXx4k8{CiV3WwCjGPKO{H|WHC#f3y_ z|7LR^Wk-ximT%V8hU%<;+gvKSvfRE?aAkq!lGY}sjHWnCpNf%AAPWGM2=qcvn52#i-sj08Vg6P11!s<5USxPDc7% z3WQz>;Nv`Bf#c&{18rnAXWx8Ff6vdc(-aKuw7HH~DE9R!Kk3kueJ5o69_l~I9?NOe z;pWfAQrK+lN)@DOK*_hWNkC8+K#B3H;sR?;k zVzjcao}$KpjGUOG8@(jRXzaFFkkGg^{|GJcyV8uqH~XdApePej1s0D=6X{QrX~VtN zm2tJMeYs;_c2-VQ*yYu_{&~k%K--VY6?@?!@fgCro9f_#P8agHFh_xeJ`)?(B?}IN ziV&yZ9OvXG2fSn~;60((Z&(Y=_)8RR0qr8lkKo)0mWPhH=7fS)m6x@5Tz);9`n?3$ho4IH#j!flP2E6S+Cl>9MeJLvnFsKyfgtp&oj!Rn6RjxbDn9uZZAY_PIo0_xo` zPZ~nL6#zb>QZ5j7IC18uY8wtTbiTwj!Pu$HiPaAzULTl3LW_&u3XZT)ym_8b=5Cfs z^58(W%_OK2UBgVdR@*H9;P{_Gy zCA5DMyb33?Nudr!r!U}>KunVg7)&9__ROgGyttB>nm7eabG;yE3=E1Zy6%i1f@sUe z?le`b=RE`KRuT)kmIRAK3n5I3elDH$T~oRI%@ucT6RSGhUH-}|G;G{#=UtlZ{D{rU zUgSgD<;Go^hw>>c-?}&>$1}?{2?8@YBUjO8DN?Nr*Ffea460-A8eu)?-Ak;|B{g3? z3@n1e7d@=zsS8aUQa5#aGn zHsabxDByBp`Uumh62=UfhVkY@84KoBP0N^kX_t@j2=~m*q~Mk*pyG}5d!I%qk74Arm|nI;UcANLk#3f&Z5u_%6t1M zcBPFL(QKhoG!|EF6QypT!_{&hmNe)q4qeN)-l|M5NouRuZ>7d}J7JDUW0|e1C1d1diHabX3I3sxFd4A6)Y*_YY^w8p?ZBJ=C~{j~2Y9 zw*S=jpB4BoJG<>V{`2Fs|F~(>ejEߟ+JG+(m&-UK#X1likd?@?RiL>Hf*_`u; zlB$!I0q+N?ljF~VbC6S2B`qMz^>A_Vm0LI88p25!1u4JGK6(oY&A?28nFj*gMMwss zF@c0w`Gd>_;?oqwmr%z|0nif_#ZdnNFC;P9m?C!oAgQ3;0 z26oN>H!ciffMy%QFVwHlShW05iBlxyY$P`-pYa!saz=tvIZl_FWFu8|envVQrs05) zA;};^Fra8d3*%ul!xeI;-o?lUnOzpqesj0UFqC)EH=1;gO@#N+a|aOE+|-+1s!0LK z`kXw1I%wiyF=9uzG@1ov`yC`=y%hie})5G`g_CY~GeXc>nsAkB4>w80}mlo5`B! z>d*=VrxFe&YH4{rQ7=+TtXbOOjJ$-aKV%onVBxX)7dQJ#cUl|v?IL@U(ZM*;7U7+! zMsTs*XBjDjSeZ$|;!fW@v(g-w&PqhFC*=v6r0oNXz+Y*@p%3gWbHih1hD-B=)5#=n zeZ+(x7VeQ0EXr^<1+)*5sfVVBG%lgEhQ*{e4Y_BS7^I9xb#&i^l;dcV0jazM=X6Bi z(!-qSGDiy!o9OSs(341S&>z5#l+K5~dJNJ)VuIW4{0ruJb`FyR9btcFS~)~&BA;a2 zE0>gt>CJrarDmz_dgaHo|S5Kld`aXJWs>RQ2gy?+1Rc?es> z?g#>SWtvaXP#z@~?eOogIBn(h9G}6Ne zcbwVzF#Lcbj+XGSa42J$7ntbn4*MH0`Y_BOPtvQVTHrFY3m~gmQ(c;`UX?WUAV*xT zz<}5T$8k#5#ERk6|@WFtyYKtd918e~c-9xS9h zM%+IWye}~{jU;tfblt}={7^Ktqu-A=`+fS^#-D`f4=u;O zg#l-vfLJ3=nVEJ(n8q%j3#>F&Lc9Uk1+*~_GcpDY&rz+n1UtaScMx-lCg7YTVJor0 zF|;RJBEqntu7nAId7?CRRD!5brJa;I%A*2iHx?h47w5y*pvd&<;TkGm|`R~=p1pC$SPSY_W zWeQX&bA$w9JKp%WE|GiIuAI zkngHFFo7V#TPTT7m}E~KqPgGV7?wuEK2C(cBMZWAV>Z!K#AmHlp_d-5j$nBQs#`&N z4)F-9p8y+dssx_7OBs~Svs?zMxSF_#gOx*XGS?J9M#T3dw&kG`&8__UM~Zu>KYvU5 z|E*>Hf4kQIe-Qou-YWfndwZ`A|M+ar<(txy;a+PKMeo(Rc{*2 z&cZnBF&XT`)vx^V4(S2j)CB*p^4w$JRdxcGa5eFCCEx9|q~d|LbW_Y*CZwJ-pi@qW zl*0##1e|h-r`&ed?-#?{D2H{x&gJGFJzS{!2M?PD$ptlX=9=1Puq~Tcfou*K$YtaG z#35F^YN03J1($)zu_rk>JVE+0IkcCO0fwnU?FE7k2do-H1v~@NiiO7{`VdP4r@ez2 zyLBs0OhFhp&E&0HzUOtTAMfS)LLEBA{;;BqcMnmm+WYFr+WSyvHd$Dx8G7 z_%-(XKFsC=#8FiQfSfPa`-4Ahd1|r}R?-Hp4De)KDiIW#9aWsWZJzp!f9ED3IE-z#vwIXxprHyOZh@w;3?`!8cDPV;$*VZJBJBKT29d!7M+p|uGC|wdxn<7%*l!^ zvC5W|n9wpVaI;K{=wxDpC&d8DeSpz0W+{gN&{9g)b6q3|FCs5t39kWb!ySE^260A+ z;%VPwXm(2T&iHZoP%?On5rX^Og~Rl!8Kr#uEWRAn%spn#2^)V&qFOY2PgAD=qMrcSiyGW#L6YBJ@ack-ANu` zF3>`G0Amhk>5ya@F{+W!0dy0@;r9Ut9HCXsGxllmG#GS; zemf=z4!eS@fK=}EMm7~S9*%Ti*}Es*;=_u#F?ktHP3-?1jnEh%T7+OTH!w3wND4M_ zZ|Hax*``^h8=|pISSz0Zz|`~V zyJVo~NJL-;oV-+#TME7d&qN9<(47jY>L%liS`37j+JyI7PnOWemdWa{yA%d5L?g=X z-~hLclCnvQyb5uKS_F!*zb~>UyBLz!Lj(Uo6sU1{)_uIVXGH2lBT?fXE+TKZ6Fqat z%Zt6B>-&E5ZKVd~QW(xb@iuHEBJ|88X~5THgo2;@rLvxPD@kt^%M>#=7zeWdX|}E( z@?UUQQ$jA)Rd&PEUT@H|?%D|@3{kiE#CjzciB~>hQ2b84e(g(Q5B%cIo3*Bd0d*Us z=P;-c>rIL6&brk@N4LzyARCE_<6KqYiL1zTV(h`;{A8iBFkr9*BGZ z`-qT8+%ruW71nSD`$6le#EesYm=KYx65}s3C``Dh*$YueV^>}!%m{wviZOZzR~(+` zI$$T!_D`C3#eugTu((0_y}kn$FT#LvdY&=|kZD7g4ff)MODHFuK!ioF@CgA%JLLN@ zCwxJ{_;XkR*krek(6SsynWS09s4){$$uo# z+Df7Xj4y@EdZ`c78N895!*rPmHM1ZSDh1d((XoEJIQT3TEev9$1>p&%p>}W3G3O}Oz^O{@O_z_3jJMj!{Vx}P>c%>cV$QXQS1@?q(uCXt zy>ML%5pXEr6BfG20!XBTi|Xxh?5tj9Vv>zOrT&EHVHI)I_^4U=10|IJ);SoH|BQ3~ z!uzy>Ol(5}G*B>BxOL>(smeBphcnP5-J}^_7Vg66DanzoIi-Q{)v+^DOg;ge3EuqobpA^-SFmKt2r6^$n z8PB6n04I4K5e|wiG))px8Q_-i?h5lhUdg2~&#+s*`wg`t<(O zef5$$2NzbXNc$fC-_qK-b~= z1r%SC1_379MyXn1k_9 zgjo-!SK`8$99`8#3t1_PcTAv&hY2!Fs)Dx>@liZAl4ObwR~W}aepw<{Sv_=7qwB+j z(b6}0^rYK`Srd=~ay={^l?CrA_5g-9%%-;BkbUXxYBZed2@n-~MkevPRojh5k}Zw| z2*f&ArZIEW;8leo^JTFt3&QrFE$vG>w&4v_Vr7U|KM7*I_K4TJz0T6PV)u7Kd9x*> zGkPrJSp<8@98{H~^GV@8>Yj2T3U&C3DT9osvJM0T2n2h}&iF02#)9P-QdWdfG|{BE zEKW|6Tws#&WH4^ht^45k$Pyp}VsJf+VWHodV7~4Q!G{G{YrH~|%-&lZ?|PrpL86W% z4V}SY3Uc!PMVOpFymy_*N=S1Hmn5T$N`tx2`Y7Cn6rmC4D^yb(oFlPih&I~@CubW= z);Ph(T8f!JF$dhhQuj z9{E%v6-$gkC2*mhVlH#t z3Cj+F)sMAC8C~C@)yTc|Rqu&`>%^-afeAzbxoe?9S7L|JoGaN--Gchnc`&0;G`6o# zEq;Ku9*bmK3gW!#SI5p!s8wSppwTEJ-I&$ggd9xDx;<<3mb_*dHIMj|8j3dw`(>`J zMaS{fsc6pjemdbD9u$5Rq(@oNPLd)zbuQS$na(B6fzdP4oDv`l%qum2f);r6nIh~J zH;;lf!NZ0Bi`hV@u|_p*gK{ldXMw z@ZL!iO*Q8sFu>_e^(2`Dqe`s~(ls_98ug;4N5Nz;f=T=0i5M1H_w+z=xf_cOu8m~8 zT(LYbV{JcBE#rYvxP$Qct$xZ;a#CNLMG@&JKlAn4X9F(&PoqhCqF3 zm67XmUjQUuIz{4=1)|T~*_UsntLWDHg*pkUG*$acv@V8?91+xiPW=o5ZSFPwszl z6YUGEwhh!Q4zbxFGFBsx;lDiVm|#uJJW1B^Rg`>_DG+y@3(8By^doz|aLbeLTZ&EZ zGQJl1^|UT-XMJ^0@ewH84p1!*{DxZEqFjZU=N(y(6yy9tD|K~7o9D98xD{u!5QIV) zv(u_g86vj1AyTBc96PQ9TnTw)7%#Hlkq$fCK*z=nLE}sHJ{l&Br`hlO>>65n&mCRh zG2nv?jnk!&;~%A0cl$4#wzp>vOiAWg}q0RM-KfWu5W{dXWgN30_KpQw>E^ z0_$p(hGDtGJB>s&ULGC8T>gb1lh)Y}4p=H20VSu}d(K#!iron(L7JVz)(P0B*p8M- zM+lN!f(xpW0nJHB0bX!6L-f2dDNvlj6l>yn=0vkj{n96D6}p1SBqXb+0Sj@gII@#k zjz1d~L5onaeGOiDY6O+36;v!nh_m+*i4Q%stv8|BeVKLfw!QT|P78h>o}H6FHncin z4}NiIEP0lZ>pA0&1J|0JS>w<#8HZ-$rh3ZOp%XM9!J?5T9;44lKNj4lRr3XB9r~HE zFp4;TdbRgozb`&mCoW&<8-H_>gYadx580uZPBN5K(HArMRwl?066jqWlfzL|c1&i% zw$F^CGVxKLp8mey>j^MXXxUh-@q`GNm6OPgeUpI}(`6`kWL@)*?mr^YeMISNQFJ9I zo^VJAg<3=-O6~whKME%ZvvD>z$ufwrtoJV2G>gNZU^Q5zVm|{H^LuE(U8XX#uDjUr zs#E$(-fz!<ZE{+GPcZU>2IjPteG!vgPScLsvfIShn7MT%Spg|o}^ zKa+%XhR5AROU5Lqa#0py*inKd#mr%(#WoTV2X{FQm4y)8A|oB4+0N3eFX-SSb(TOs zLnlcuRZ-$ic33Vyg!ZSii1VD8=fbnfjIr>zwbtTd_t{l#nTV~x4NTw*Q|TTUy6Nm> zw7zOQFp*xiYCae799Z{>ztgmkC-AxP>n*u=RXiSnNUw>};BXI|rhe1LyCIV!j=btc ze&d1oHq)EHCF9aPLvC7g?S>Y-V`a?(b?2{*eIS;yQE~s1Zz)3qhC%FZ6T9KFlR8db ztVrCIS+yr##Y0mz3_61Px5`W3#VwA!_wc$pDHGrx+%fq7V^e z9Uo2#Qy5D8(wvRim^U!|zHriSuEOQQ(83Ge4t)?g#8uR=gZG%-;bv!ZZ)dc<*BR{W z+}<0t@7&ql+8hkW!@cpHJ6n6Zdt1ZZU{e>bk>G+I@7d|@?CfydiC1;TDEnr;g$&xB*tUEx&8|Mf;lIOAf$^k|19xG`qEvpXfe)t-i6Hnc)98C_?_L2vxI0plU*?} zgV=y8%cop9EC_etr5-4BU9nf4{z0~ghd)8%b3F*A;ipu+?F2HQ{>e|;;ECHF-LIdf z=!Y6R%ftyt0#jbJ2C{~j{NAGj7*_X;DcwL2LV8ZU6g#_CE*zV{4~&|M*Dlf6GxVf2|4dZTY`9_m=X1?{&6n z``?GO|6LQ*wC`E_-dAX5dpeH`3E7E0%iemCE@uh9U_Aq0U#&lJ0gE8lsR1H>S|riY zi0;m;^ee~k3ycC?q9h=eLIql6nDD&O5RX z{Us}b3qX+*cDP)vjf*;60WAawS}U@A!wEYY=va?Kva%R>U=S!un)SJfUzOXbiKVNE z*Y&2{NCu+@BxKX{1{o(x*tFyTl=;#Di7?nf$!Yccl zCV68STwxxFA}Qd^(S){-pbC5oW_SlqdW>%I6OBo}Y-IAd@KB~nx7Q^Bsh?3e6)ofP zWe)Yv++~?a(vhPNy_ijKQHN178(EcA=7ND3EDg_-;fj=3NzHHomrLg{jhG`^NO8{* z52S~~bZ%%4!{BRFDqk3CB^3o;{5JV_DqeL$cz=i0;5pKMTWI@m!e z2}u$DE!I?yX_5>WCTNP|<3=-5D|nua0tDgGK(CMgl^N)&moWGTN&1wQ^#oV-0jzq% zSTDNfmxgq|yVm}E4MUJ}3`FU+Z6fI9C|;b`9t^Gr9dDqA{yyR7Vkj@%G2Lw4r>G~M za25kJf^ZCvsJaAIpENF#LN`lHd@qqC<4sVQGAZ_GY<%&RXAT~{o4Fe;btb4B`d5T) zV>m%qDx$7;@t>vW;!)B=AA7e1-6zT^2B>2ulG$b$fZsRC zEJ?GPrl9nOD8bB&M}^U

VH9>WLl)ucS^ISW&WDteX-Zy+xir$cms}12JE=JG&MK zTtc%wWOV~Yur&rpO7;7zDH5^ON%a7YB8WJ`Nzr)UQS;_zPxL+&w3aJ~znCBad&V^- zTy!`U4L}WBjp#VBhv2cqreRrP(!L#0zgU5%o$AEU%kR0V9Zbsv6Tp$=QXF>4jeFnFl!u0e=QGFRi`vrv} z!n*mr!MW*a<2TinJ8|9#Og{V^Qs{@l>^Fs#-it zYt2$&0(ZxMn#*+vlEafEt~|A>_^#a(AJ%|@Bi+z$5I}fu4i`E`UNmEFgIhBBDZ6w~P z$`HAgZ_1SV&XM4I~PEdq>GuX7qT< zxvC0SfWqK{l|MwAX*je#Ww_ZikOF0lve!5A5Yr>&F2>5%PMy=eygIVP#ybklm3FP{ zJ?}{7$^xIw8MeUzZQ^`O+n!g2Mht@Xo$#erRi!JOO%Z6+wg$rY2 zjA^mf)+tFxaZt>Cy4*L`KGz_HV&=4HgbdkDqg|Pr?s&b-wpPijL z0mw&c|A7;#1ReU<2Y|iB{QwDN+rScP`_Ip5|G}kqEI;DDCl2i7Kl64A4;wTX zng|`Q;5AIe20{$suah=^mY*ja++YFUi}dpxypmfm!Yl-NmV>;k^2vIGW;*xqW<*vY zQFPf|zio;^p3wXbRk0QmJu_QWLzzIjQgq{B)cH32@4EFu`~uBo&|wJIxH^ zU4Vw66P=?$*7&;v zdM}MX_WV$iKvdAmEAP>|W0G6tMc(iyP`bLP*;6ZXmMdhR(8s%+WcB7WvWV$GO`>VH%z(p z>sp5Lc-i&8OTyT`(NyDgVvJ(~7R9pPik)$aUbShyuuEXxp(QA55*%$pc@S6CMJ*K- zi7x#SjOQDu^xG?HrMC*2i1nP+78MiAa^Flzp0;8d%AMsZs+Iz3)F&JDs9`EvGEtfb zg{q{)bIJ^?v~5HoLdTI zfdGZUK_%~z1)^yVb3P)>8<-=fFv+ooy}LFDW1xYxCeY16!od`J>aLL(v!&7Aj`+Qnr9|j&-nI2PWhKiR^HRRGDVr7Vknkc*H>m~?Nt|6SD3gIJBqGh&(!4Ub%kqgIjW~hNjc$e9w zB{FB~^Tf=2#VqccH22FQSYZ>Tt3;1%<#zU#9^))6tz=OOA(n?A7w@~>7IV6@+}A9% zgt{0}my8+lB^+w(9&r|8?rn+NVw)PR}qH#&Zbck zjL1XFvSo^qv!KunwC+Zk4kX&!SwSo*LPpj8iu;7+_FhqLNffHS#r<-M7R%-r=W9{n zdUb#u8K6*C!1$O>T&mM)n@Jt>m5u2}K=XM8iI!PNMiO$D1?6Rr1R`Z*agA9Tc8f-v zgGdAhy1W9l@R`rf8el&Ul$yXu2?7&Br)|Kpz9DZK*}G6R!c`Dm3k`ENF0mAucj)i86Rj=w zR+=@fI)$T4pXtL#I`Dx6nnk;-Xx51nwR3C^>k2g%w=1(Dx=z(rZoJEGkb)D0A;Lw) zXdR!WtXgWiUS2SZ#f=uj;a8nEMXV=Dl_NrQz@S8EmC{TR<0>>o4s1&~$IUA7jIY3c zs?X5ZCGA^U^1T(0S04S1^^zk53!da1P3NfXJ*LiD*x+43FfxfKtkOgRl#^7FF2)GB zl#1XeA zjpHBUm@}t^J#$>X7>>oJIbOTR!B&~MK5%8OHFs1RiwwIla?Z~3^$72VvN7#Fa75cA z+h5g7?%(wPZ|_^X+eVJG-><>1z|z@cQXwH;b>W6NQ7k*-U3=`c<;?DCeMpdKiikjf z0YFi-*Z=*kOLwCILb5!OHOUA##})}T`dVG6s;+vfpt;(=8^KLVYF5;j@u%AVhBdR3 z$#D9yHS(xapq-?Py1=6i0O?) z`VNNU#xtK$ouNq#w~nPF>(@@P`Mep&Rvj=`=fBnY@57$|8u*__{obJ3fsgY1H~Cv| zf6&i&IR9-Qw2Szkoxwq;I{$sp^Iu5tZ14_At*nzP>lfW`6iU`l{T6n-3`0Uduu_c@Es1!sDz)21iL!+Pv zlD!7Vv5b>OLOaZG%_Le52DmYfn>uzx@T0J0UPmC}QlXuHY?N zmJ+003VKqVR$%P+KH8rZVNkv{ z6z*g|oWc>*C-_D#Ffv{TfjqviyJ*Qrr`aSk%&Zq9`=`SCp{XY-F>_c^VYZbf0gv z653`hPi8INFLaxIq!O;%JR9fcEbIAyoxFbg>iPKePpCPnHfLT~*5+o_lK3F|Y#~hc zyY0@=e!I7i@Fh`n>3s56H9hPs%Uq%$?FzU_1OjBA1eB{#CU?&~AoMdbA+T|hM)~tp z;y=p0qZ52T!5Zp{0U?lA+_3P~p%S-d3uHQx&t$%Ky~aGX(v4guO_ji5qnb<`bcX4# zUIJ_X5u+m669R7`8(l&-vV5=f9TUDOay*m9kf>B6!bEbkZuNwz;8LM`#9+R!( zgWQ7=o|j5Pxf#!uBT+JiX6xQ0+(gXBCA<*^2T50UxrQf+_80Q#l$#NijP7U>BqTxf_skmBDm%G_x|kBZTaZ4?PCM&Z0HNKLzV$hIXFJ_%mhpxrWvLwWWv(T-4<7Q_6;4&~At6tVWv676vkcbx^RaH_yqcj&5Q zSeDr7g}hSGT}2>#24+G>pJNL(_O%4a@{P<=POfJy*{<+P8e}8Ckr@n+t?1-Kd&8_l z%3B4qvL$yji_G#WzEY#GD0eS%2I<}+nsKe0RD0EfBK^V-|pir z@D={w>-XD5{GWEaTk-#gxX^{`C#B|Ersw7xbo4`={|aG2(T9x@;R!%Q2UMZ*y_DeE z25yh4lGJ4aLnke>%uJxI1fbgLo?u)HXLeNj=_b;t@~CwRG2c@C+65vNlmn1)vbBaS zvr4n;MCJ&pv2d&zVjMBz3L**3WZqSY2v7n`#IBgr$lG!_C6;+=L<7d_kX%!16lVk6 zwbrzKM>q<5Sp69c@B$pl+!7MS3JR!eS9=nbccadybh~j{5fE2?B zOP4p4NYq?}ZbA%#EH5w+!)%>UI>+A=gB*J3a3#d5rH0oEBTpoMm^ju{EPRthZt1d9 zhQ(j*I9c$QGy~PrPTd`%+m49`f(|X-*?JX-dhHEkf&b|lM*4RUS#`_{&Au-)a(u~o zPPz8)>@LRCAp~eG-&z-2BQ*Bu&A_NrsKCu!S(I-prd3Z3N=vd$gUg3r%i1AqLothP zaSJ1vk=wRGuShMx6t3LZM*|!JKI1N3E7KNcs5M}5c^fCPDaU>h1g15j>I5NNYs`-<78QHQd4hFB`eXv-Mil#uHN0^BfLIj)p(I?N1gT0epEu>C zwnZFA@wa+I$yFQ;+PD%=7YKR#v|)cPzyBCqpep^Z(*H{Izi#`WSLuI`QvYN8uKSDt z{EGfJ=pB}v|5o~RgUROKu4%?6~pU52=QFXJ`}JNk(f#3p`?`O zG>lhMAu6#3H(v*tXkj4m=p^SaPhT~&;t1G5qW=V;WlGa&XZe7AFOaFUg%}(hOuOPh zblS(AZhPLDPJ8{?@lku)na$lfP^sHL?Cn!N@FaVh_J~52bm-S7uX;U9VXlyL5;`o! zzR~%v&YCtMutvh;c#vL7#Afbd{}8)qS(GD1r`Vv*EKw@Fz@R+PLp_-SY9*DG$%K^^ zok3m42!hluuG1FZRobN|!br-jG7(hDSZ5p{whNWIj)TCTIv6G=l2jL%U3Jw*C63=o zEh>x0;;b`9G}a5k8kA!8D}lJKAc=x>N&qoSpA|iY)VTubJl(S3Ef^(LnhfZeUAQnE zO#h&51b&G6w8rG2fGMB!?WPSY;ZnGsR8Nfja1>C8%7qJ3?bu%uwD8D2XE0AiEgS~s zZ2U`~!u=eKQ^ap8{I-v%RZ*DiyZi3Z{tJZRbA$0}3$niNIe%SU$S8_$tqv%3ImJr7 z{eNEvz8j9`TsPLa-yIyRu3Ni5Kw}>Zsd*^z9cXSYnI9z2P?Mli>F8)rBC*LtuNdhA z#C0Sz8;9cB9Lc8B(1en|K%;00VtbYLejsLrNjQQl!DgdarU8}Us{|exCC*znUAzLV z3h178&@2krbObFgB=#g1&8{g$9pAMbmOroukc8_;~zvjkgTsx}4*!=i9=p40S?Jr^>lHB7Pe)~$GF3rbwGLkt)K?C)dA+e~z zB3i5QK+~=PtB(-koHi=kAo7gZfv=pk=c+gdO|uz()?Z#AuGm%A@s|W+WRz&yGWZFW z1srun@xxI$sDCJ`hvjoRA0dnz%&?Pssm1-DWShXE?D}c;IaK^ zNf}v53&N8 z#XS(vAJA^1b&H(wMCbM}(y+T*oP6ofKpE?e>^u5^59LjJ20}YY+l-m)$4M&luS(4c zwf^ZkWTT3LQzwjW-JhnkpU8LwlwI*DUUI1et27GIpJMrIHm;m$lS4L%WZm0Dat1l) zJ$sjgQP|?C0s@L%L`Z5H<|uxY6dJ9N${T&(}6Uq?sGE`XnQd?K{AbKKK^idlhp4^N1Ava@W zfhgfE2>ebd?T|gh;>wTKm?2H=cXB^tM!^wbLBM6D;Vbh^AzlO@&~mOo1j`DNSyr!k z7IG%HBhd%>9g-a{mmH^*OUbMVp5kltqM}-M?S5nEK2AC3$;wxEBTKs{BOvi0B-XHy zcuMxCX2wNm;y>TKk$zinfKG-!l znR7kTk75_TFTPRfkRCJCQDy(B>^~*=Ki&S}L1q7Wl=dHTejJk%@IBdpzGDCB_6|CQ z{eRf2;y)hF{__K_IQkn0Ue4@eks!!U5JrYYlJcbgHk}45C9-BzRLit=64ersN}nJJ z_zVIr+J1EGff-xi{Cp4j%Q=` zN!H9vkj#peI>^`PH(NW{|2iDyztfbnPj=aKmpJAZryG?iV=;09D5gZM9PYob!@c&k z*Ut5Ma9iot7h*Q-IVf+^c9`TrW+>VVbjP&{(}_8id4?>b{7T$d$2I8~99BvL7Y&Qh zBxrqMQbCne@_!}&-yr`R_#cDrQI-GaamxSj?xXX#D*O;$VsqfllLE`4Ya2C2v?_vi@}6p@6GHA0qTXZ|zje!J<$?Yi#$-`_mt zbIy6sIdk4~-sgR`_gS1oBr>F_MuW+=IX>CVv0X|`cC^ulGPnHDOSlzSP{{98S6q;= z_%^uP~#a{9xu_pFB*B+cGRz0p7C(O0ugO7rCxz!B*D z#Q8iRu3pkn$GNXkK#H^E?-I2$bw&yZbG}KuE-(=~qXJ{~A>~)Cbh-pX zNnyqm1Fb0%wJ{NM~AAArOO}VZFT;%`ad=61w zQT(WGPGQWWJ;xI0f+A}HH6o3{YOM zzH4{?P%(v#<29nIzFJ1)06P!;XR&UBR1i#eN_yklJZ2bL#WAOcN{Cd|a+AXO_pQ&~ z&m7I#iGG>wQuZ#m?zQUVrP5c>#7K5$H)zTk_?C~yeApyD9gQr)z7^P&S=bX#wmFVG zZlp4^%g{?9ErZLURq$i#XM~c=eFtevB1a+6+~s%=8qwUwZr*NMGsi3J4|xqA2sb@s zwLdu{)?2mZ)+n?sQ9;LaH+_%J{!f~i2lwf0MGm%wlpIoFx;n7;{3iDoCrOYbn_{y7 zr-rga)^BVpU+U;(a8`7&>XaM4bRxgtTz~N{q>${2Hglgwa^K1NRH~5e7ur8ekoF62 zr|^wC!x5UtD&um1ybByrH*>aRCqF`<$11NN|A?qnuhIKr*xqm&*qLX>?134Edk^p3 zbwR|b=9)&5cd&S&(VG}KBKa7*u6jinVpy>K?AzpXN#*QpptHpZ$6g&8!3;1(A3W%B zsWu7WIcS2qWBR~=4)Z2tx}bk3-szUj=Z8j->YwxDneDfxGHOew7}GT#y0l}8^VA8V zn<^|XHa9(#AH4tQDLIslx8+S8-D}9&1vACi2= z)iBAGti_Yf{M?F1c?t>u2|gI?rgiO%*LNmtQ!*0Fsr>Y4a_Gebd# zUoqEe2^GQ*JYbM`y0h$fZM?Lu*F%L%b#?wC4@49Oy4|0XD$)!;Z}g8CNHnu;kx(AH zb$Z4;{2BXAHRi93IGGEtRfW?T;RENF|rqdr(rkJao!=7#mK3u;w zGkAXA{0DUA{&~e-i%BfKBi3J2o4>b?lQmm0ZaR|ActC`LFa2Rjba>%St#Zdcl1oA& zh7J{bd2Wp`o}`kX@6aQygtG_A45*aQ?S2|DKzVllt@aKQjkwPIr)NPkdh*IuqaUt6 zd&cf2!Z@7(=G>WNd67-u(Mgg!qH?A(hBuN;uh-&JXV|2%z$}L1IT1#$CZk3E%&u3K zB(QOcQ=Z;+Q;&kY9%_C#B#~F-6e7;SmNfe@s7B);$TKYD4hhQ4FQp5fJs@s-YiknF zXj1UzD)4N4c1z@0qwbp-@5Zi0#E>DySQSEypE`FnsnPY`*P-2Gj-q~bnrm`HU+IC% z0ewszory-wJJIdU7pmYlF}e!ImY<2zlB=}y^tazXN7|Lf)RQ>I(tc2%gYU>kf3~CK zJ0cvn^^H5xdhgZ^icv-vWI~70UYgReAI{*L+#0&GQc( z@T~?yLz~m7lx|2Vz*N|;m>(4+W#c{_Np`ThVj6yT>yw16p+~!AilpKnvhU_dS3AE` zFLDB0boO4OEvoN>=NbJjvU71o8S-a~TyJIAcf0ZmX_MNk8@Jb)WnUh$tV!$eh~M;4 zwmyH`*(=X-;6A~qoVV4oSF+`9%^=3EOq+1-+}%(}KFu2CSp%uN!8$tdY4F8de`)DE z%RAQv4@U`G(&X7~HKg7{8T1@};x|d`M+x}cJ9S<6feMmYtSbLe-jmHjDQc9V63yJ!GY0oCnlbYy zVzqR(ZJyKf9HW>f8)vyUB(h6Di#;t!IC{$@G-%eZv2!v-=e&5 zr!#`V4tr0&f7;d`87=x+#IIq#bn8}yhi}A9``H2%vSen`B(1%6^o4GUR=-Z&lN^?cr z%%^hSVy9csg=|<)2-}YFvhY0YT(4xo3kRWLqR(vhP44}l&iU9neKPE`40#m$E<>R2 z^3ll<$q40SEY)jLFG>KFs?N}>_f$L-{gHI=L+39ZM3?V8Cx_j>q4@1=3d!vk#udtU=rOvAMJbYfoK|5&f(8jR+ z%$_ZW-N@5)IbV%4*5u_J2n#P5rRWw-?>Fi>{_IG8`i-M1E_=5~6Ti^YJxOhKZb*Rg zSkl%TW_LNSqVtrwoYRPHz3%F=av%e|P>kY6Rz*?rO<;D&)uI^%zsABmhy*f663L`7yn7k83eM zmh@Z42C2PjnztVYF?ouW||nQ#IqN40E3!P4bwr|&Vg$ozFL)eWQb6=!Zj4NOk6Qk4 zeqIq1&6s6Bs)x-T!y?{d zKits6j#_>R_PSAOL7$r2haG$ng{?;BTK8e;Gq5R0qKFKopqB=^(9GMO3S?KaLuSui zJ$^|+;f*5H+d`e@lY?8EY@R~=v6Q2vsRItDx@nO$k}M}e&>x#r9ayqeyHQsoI^D!s z&!5%kIOEjk1&*t68QIWvjo;_ofUAjYMF1Q#TKQ$e_9rJFgrI}-6m6}n&b^jpxS36- zbCs+uz~bcz#uJxG=kbUrP|~oUFm->#VsMil?ZHTFB_79< zT`9_cjd=VB3Dwhyqh?i!B?m>Q#2H0f>FFP~yx;z0YNL)}`R)=E>8Gt&cgtXtK6PO& z!@$b-Hx&afkxE|6$;&vBUUo_5gpEaSW6W;Lh=>@Wrf)c%Y&0zLpr*4JR)|YmQk05!6EWpYK=Y^#nD9h|KcJ^=XD@uTWOFG58#odStd8wE zCP_iIgZ?;YBfnSYvqQVj=*lPPkZnxZEUTEHG65xfe#SLQh{;Bm^RUim{qTxB5L01X z8u!6u-r|?h0j_awXFGCAOcc*O5$9B=jw?8z5-0cS<^wm9!satnJI7&{j_uhKFc(p4 zx+76Qw2VRNR24F+ocgLLv-8@!DeK(Z0nWLvTgD6SQ=IiV~a?GTz=EuIz$X}Q%7I8d0X~&VcJ6vH7$|P zci#Hfbel4!6El1#=qx|NJVdYMpdIpC8-S5$pa=Kg~zAogwdjwMhsKV7jzG52XTb9o)i?T zGP&ksW#f17ZGtJ&$DMhseJu0`FPKKrH*&@w+~RbZMqJEv@8}>e@^Vf!$AwweNs5fI z(HWBF=00H|>L>ZN?3$nLk00|J7jh1R-2%jB>H>P3g?&E90nRovTDnd3fLJy&mspiTYgFQ#L17R*{D%?CNgZcKIO$)UFYd*(6w} zk#x@_@ATy)j{8^Mcs3P0QO+AI7XeGTx^++8o$63*mOSqto-iY`mog!T&#tQm=C9}+ zd8ax4ZQqj=s$$6;`O2Eiv$gs1dZ5s7@DN>-i(*LuZ~EvdZt4vu&GUTO&tCPiZ_o6& z{J8^U1-oYT?2&|Oy0lx9ex>f&i^UdMs0M)pC!iLh55raaP*NpfXI?ZUwp$tS%N~G^ z^jy^73`mLHOOpRg0d~e#`)07})0)~Y^^kHaxO@+-+c_uQsxx5@B;?X(`ZtH%%xm6P zQDOURk0G7ulg&-=-J3=#6w!l1l~c}+fej)}VdFWz^B#$=Hniz1yAtfPL4Z&d=NZ@O zr^+r-&fb)l{q$S?6`E?lC{^A&SrnSn%cLiqOd6lw{q7ujmR4QYLEuDFY%f%x>U?p> z6+<(@?(S>$ceb6Ln)ZCTuTBx9Uivu9v99iAZ0$*k8C63ak>UofAlLo;H7+sChnmju z?08WKFVWenM;yK0V<*qdqqaC*n3cOpKo& z?v_#8*HvBZq!Zk3G%68e(VCUqzBTc2=~k`grsn1?2t9X&-Cp*?Md)Bk$HD2*A9WzQeC|}nO`D!=YI8@X&%rLU zqV|d+PV=X@tkx?1C| zh1sQGGtu;%@|`9f%yRW-83r5Cr$0(?)*imgP#Y+o1>bxTBv)H?+{IGaR3al!M$>C% zyQ|;qInyYyQ^)O-VvhMfV$(gV`|0s@p4L5@Pj0~5upTj-%3=%*2sK_O3cq(He0$w^ zDz_po=UZsqt(-?RV!7|nw{c*i=%Qzg%9{JQXs!|6*S5n>sF#xvkLW&nIXW6RfNdUC zE}#b{hmz*oQ!BA!JPk7+hHR2c0;ZI!jVs)-GC`l)2L{9QNBW-ojeFP+Wj>F6O(*f( zf9Bx@Zfu~=J(V;~EdBMiNBYGq)q`zs+^=QcEOWFfoXr-UrOo(Iusf^yV`V_v-k>8H z%CznWN8wo#BBQA^dKwoG?s+vwda1%0Gx+qvUAYa`rLtwaQ`ipbK8l;(>-!o0I>3c> z^6s7!pJfVJ$K937_J3(}tgcWl@edv+yH`3pGWXe$yLBsf*?ynV4^lEBDQ))xKMz%> zJgAl+wJHOt-nwX@d|hmEM5?;2GRC3R95G z!TwVNQ0I=w}{J+k(vPl(s0cmmQp#ef%6dJzC&nE*+w+*y%bj zl{-;lWI0uBDgN<{&CPd(N%I^o;bpfz`4g87#T4vv+Fx0_cfURfZm?C8v3VT!Sl zG2+3y66L^&QDg3xhmLt%ymz~{J}^H9D>j9-5W;eEZSsktPxPJWP4zP&CQ=4ZaT`-? zhhA=YH$Tyc4G(?rVy0}esBUN?5L?Z)V>I|NR%{;YF^i}O=6VS1n8kXIVn^6`b1OP$ zP7u#U%w-74e+yQL#G3*%*2}Rk-_KCOH!V#=drV|cB#8Nx3 z^qvK_&7R|p0!rEx68AosILu72vFCW-V&XEr1!~VPvz&DFt?!U;i?Exmvu2q$K8iIP zogd=lG`}$Ac@JCHKZb0>&OHphI1ld~7n@C?D3YIvN_o3KPM25KrRwnmMn7h%f>8^J z1l6R^Penh>@8{h2=+T_Tyo_(>;JiqRYs7vm`%`*!Z|SJIC#$AvUYSwH+*R&RW_$LY z?n>o@8+O{ueDqDssk<%z`F?CPqX#5M$OoZ<&9TBan|X za@wd_M2c}T|M{!lnvl4YZL#TPvM17Oj5U?OKB*B#xwoo(S@%*+Zf&cqHMCGYOFsWv zZK%WQz2I@3UBQMI8T8e2pI@u1kxYL@)TH#%M=`R{WG@SK<;JMej|xe($$>#79%snp zNHz8JHS+Zt3uiL|c~$nM6W?d3jHsn(qrOsgTDrHzl5(3#TIZe%evA@Q9rabw9y+C) zGjDCYxAE?cj;U=QGrI09!21`Qhgc)u#m?zPvrlU|nJ+hN&ZUIPYiJ_f9qURPrJDW(UnD3}drbcl&p% zwpjB*{9+Ea-1Xe#HhP{s*QM6wR9@+qkj@0iDoiVDsVOu=!V) z3QoD_nknDU)6O8hV%dh4a<|ed+FL_O8S|D?b%R$_rD9@`8XeuHjNm$%gu!Q(cAmUB z0w0Dx#O2+8CH|Ph<5Y`kpRgbJxMp5?s*S655MS6Eu@7%<$y>g^GfQ?+hvG!nmPq>= z^A1GaCeHY*^VdmA_n<#XdcSau;QzwDTd?q*z{4GWGN(IxSd+&|4C52^bm>Sh%Z!{7 z41}|&Y&&sZr(~q55UTae(ZKw5`ioP6+4mzy5uWGi(e5Zt3YD8%KhoDc;ykW)&)zrF zJ)hxl>xt6P+803^=}PK83Hn-ym_DYJqL3gN*f#SFaeY#A@Al?T&9ANvU}NWlDQ1GP zcdXfoxFY9M{Bq_bXRvZJ!MTB!V_5c0<6?7I-ki^mif5ffuze$yN!Euq#hyGRdFieE zJy3hSPU*hh3#g>xe$2?L!xjSp$A?Mm+N`6X*N2`)K1?gt4fC**AJ{Y=H9a_<8u)gI zZp87)`AWW7$ToPw-9FclgG5^-PrP)S%5i-BNy|Z;t#ihu>fX!rOYnDX^tV6XDmbac z$dG#DSbHRgwNX3b@!k2N0c=alL~wBcR{7}+HkA}Rlv=m-+U=T7e=HMID;Di`pcw0( zTemHHHkg|pr_7cGlg{O~x%k~3%<+cEqbH)o=7vs>1XDaZIC=kV?#x69wk#4$Pd7YU z*ny2cinW+mE@Q(gi+5tRE9O)m&vVOS{Um2!mr=HV2yDa_J_#P9P@F0&4v(E1;>{5n zmsSh6v*6}Cq?CQxZfE;^Sw~haR&*}c0IR5wGa9V)aRQrv#!*>G`QX&cEs9g0{erL) zO`0=UWUj^I;B8N1Rg0Un(b!>+ZSvd3?rPh7xDmJ?qvX!LiIa0v0sZCt2YV~bEY(g1 z1c^I1Guz2Mrlyi}ImQ%a@cDf><;_Z-p2Yr}T_cx{JM)LVInyRyi;;cT*5)erl9_94 z(}AEAV!gTj+?>IQns;eLC3lu$vnH@x%dpXO6czPU@6&_6`qAZ&eR9OMjn5BFoS0V* zPeONNKdVfa?U+6x)hPrs_4d_Ppb(X^S{ALnTn;aP{z|AjMIv&Zk--Mcms{AFIs zAInV}Q2KEWQHp&W6cbVZ#Q0HLk?g&Zx!||ghl8^wf_-)lVL#4cZwz5u@ArKP2oLp* z#de=A#Zo1plzf zEZWki`Qs#2Z7*ulsQ@fbk$V)6%R5qhQb?3|l69Y!x|=db=v6m^OD%1TEh;2>um82z zN@2M+HzclCssg?T=(&bJ+&fmUF7+kp@|+R>D~06a`Gb0vaR!g}MGt`MV~>0qfL*o9 zbhk+9??}vpsEgcXFL>i=;_|W0nnVR$AHz)U_%2+o#phI1&`Gt^E!M~O%3do?y;bCn zIyxTim)jM3Ex*RkXhf!G>bm|R^~T-3#8KAM)^=Wvdl?1#ZZx2|efI5mlpJcPis>}*m?M_4t{In{?|guC4zPBmX2I+ z`a3LY3gvC3kd>-qk5L!t*YdRXtKEWc?SNaLN zdq7#mMRTTFwb-n^Oo;~THvp9^d+}WPmbgsJ+o8S-^)Sijhx1a^D^j;eYan88%4k%ZA+J~HR<~zJ) z8$~WZR&T$*#(D8E8Wugp^WG}puvnx)yeu`}{-6_m;748&RAL)VstTlQoOisGvh^!^ zG_G1$YFWIo+{W}CWsa+8Z6rflDRUp+D5xUO=ql|d72z0C#li?Vz8)PvaBtnCD7iGZ zDu=orVfp&>jAFe3)Y(fJoH|Z)AXVA>i4UsKtmw+YUctCeN0mcWACBF2{m5K(@lZv3 zzst>&v&PJM{!D!6J09LtNbEBf-%z*y_FN z8qYmtGSZ&}`cof}zzlB<5WIGU) zXOs3^Qw=O*{$*&WZI<%dwe1(p;6-L*DxkJI%+2~L>;e12(b!NZb*x!MK9A?35EpeUaP~*m0NqK zJ{PH6e3mVvkvw*iJLkqw>hh}Hb z7+mK#qY{VX4gp#fFHD-wa5A^ogp=2WTXxL#QzEef7vt_R=T$!Iik>1%Fu1Z4e#D3& z_Cs6%+C9CX)Dw9Jk_1r?kV7$6Y&)JA6mcsZ{a_mvi4(Ve@pxa&j^V+rSz1C9?ma7$4Hs92FqZ+~T z@Z>T1DBCOu*%QAL^NulD(sidKrSCw8hrG8uezl2Q`=q|RT~Hibc(nOeV^XK9JDwP! zRq8dlbHbm#>FxA&5)yHooRc{lSiR+oV_#A9J`(i^UnLm%OkhS z?$Z=|n!ES>F|pwdMmcI$RMpd8dha^BYu6-9`=mPugAd-jd^N-!Q9~@&pWE;M)+`|V zIFn8a`r{Ys$KF?R{b!&9r^PVMykoFL?I!E0$7(zx@XdM^L0dAtYBIji44%Kwv-boN zJkWU2Ig8x3!I-p|v~fg1<9Jh?B5%WWmk($1ZIHG-({H9;3n$TkXqrzd^>MPvNs>6& z*ztN#C)0V+pqSY+j1~va4+ym9-<0M*SwEfbkS8B{p=i&(^Y?bg&Av{(p)i{Bgf5NI z&QF%ff(V@zNDmt-^Spf?%CO5PbIWDL1(D))$7Cp8EGac}8-*drVGM&NyA8{Ao0`kk@PHPPV&) zPm~Licl6<8Z^T9HMDZMeZ8!ahJrE@(jg8@%_G>0WH((W$(3#dJu}ZxbAF%Y7vHhKa z21AKjJ*M-u)@e@Hsz*mMge6FOg*?&^s>EUG%T5`FMc+r!X7}9BitBfs(S9D+4w%?PQW9c`{(>i?KXM@6#a606{ zqSn-a=-7=(bUJm~>Y7A+6e3-h9`w%_jkmp-AE?#p9)u932$Q5na`Kki;45Kd{4D`f|^Fm$@E;9`b?=g|7Z2k zf-|4BK609GI>kX$t*lvb2qXP&(&nyCm<%z-PPJTBEK1I!P`$D$xdlcQ(lWUF==tH7 z(qK8hF$cf6-h;XOOhp+F9ALlPq4wxw|M6W!KApKYtaK$}&(zyFQlD4d$$9Ju`n*rY z>(Up|y**7T~0o+6SJ(kwsJ<0u($DK#!@{I$V_SC<~Eoxk#aB7W;$Tetya zAH|y%Q|s8Kv`?>}DVtB22&iv)`T(mEYiwQ5Vj}R?r)S7Y*t&E&)kW$6)~XltPTp^|U?rQ4b5pEwjn7K<=HzyF9aHxYyzL=5@a)l*+1Y{3;Lg381JW7CG}BC6 z@4maCd0G6yCJgKq$Huydfw~m)_lS-U!k(>n`#M;H>q3I7CT^sv&-RcVs4W&fcKMFQ zGxCw^o!+P3#P1ShYUEC*KXd%HxH`6dXZgFR*V^m};U{DLxbJ~$omk1H2Q@gg0!a!} zi-T;;G+nr#T|9IonZIAah;94r0Jh*$-r;@5kUOvHUdZ2(kFuWW|48yM(VTbAYX4`| z7p#2-FGjD1dAB8)M2@}8zoyT6d0dvJE|^-X(LJSQ_N~u`9@4Xs+--IH=q9a2pSk$4 zzJ`p@b~Pqf(*;9z!T3m|3#A^j2EirJ9)-?WP4_UINVLEI!ytXWSAp*QXujNWi5ya} zOi`D!+%*M`aE?aFX@<*>(+Yb}d{j8^J)m$QKe7JSh;+rVokoHQ#IB;FF1H!0PSToj zY&$#?Iv^t6BheypJ{)-z{)x3(LN^&brcgqa*${I+=c|)}}g$ z{OZLU6>`;8!h=m>G75;I2fOBumC68JZf_i-uXII0ZOVeohx0GU%O`KVd7+eUA+Rkd zaH4JdLCD;L0OyF?@{MAclaaZTDE&xxCWiA;L%ClZ3+1Q}@Q`Lu$Fas|+p8wZ@;RGo zAF3YpdnRE%ujdoXM&Z|=xVt@{p|_!8sM)3TL6y3QXx45(HtVe8RmZSPBe6YJr>TxA zJ+m!Pk zt4Z3>5(8@Sg)O62vG3z|(Uj5c-hRM%;7z66Vdp_sj|B1fH}lFfe5_(KZYNJyr9MoI zKwWZu?YA%f#jSGJ88O4#Z^nljJSQoNSw16?S*Ud6o7VDRqh=$m0&Y@aSJ^-Xg%b@V zm^+k_wKt`P_p{vIKY$S5u6V-hw(_I);f?2uq~D{9bk!r7swJh0a=BaQboP)=ghjfa zNolSwbH6Cnp#N?Yq~1p1_-W~^P{cFV9SY>2Fb7jLHbl}D{+wL@IA z_QtWTp%%rIN&$UIWq~8v4gH*s{<~EsXh9Vl`x0LkKnEg1?W1TdmgMK`8 zuBnxahMFrYU5CP+{G_rGcz?X20)K7+2BwjP!@<*#`c?G`&l9ua707*%SPB-Bt{kF6wy`#@)xQc`}x5 z9$OJQ?pYwj-8p5fR{MEt05-TDo8Qn9i6tdBNx~{+V}-H|Q9=r2LfW3Rhbg8LYB;#h z$~b%NtxS8W<9qFyf19o~`c4y_?glQS2nDHL@g^5XDmC}RPsrTpRZgEcI9}6t!a$q3 zQFD4JYmR&SRGnD6Ko4VpKoS^U)0OGj*HarmDvtGul7S zRO5{8p&Q&d=c|2wul(_g!Hl*qAJ)qqYR|vU6&J6jA+qzc0>6-cP7Y;*AgwtF5+x+i zu;amFrs8X%1|z-McZ@D^4%hNA-jMB);gGJN5Gy|8dm|RDctGO@GZ*+#nxRO^8AJc> zC&9Z`?re;}&6lx>oUkjLJ>v5wZ0*$9lcp zSjjk$9)68}qMHVl8Mq^yc*4@}8tbGfuji3-o>p-r?=Z z+2$m)dtb#+M10Oo%yOz3ko(ekA^(H=wuh>rh@Oj9!)Ns;uW0M!vjjAqrVTqVSlLs3 zK~d5tZN4C3lZ+}tIy1)ofOD6inY|H8DaF2WhsH%Qsk^uHAM7d$znfruH`%k+^<1jn zdm;B*FN#2inp|J{#fS~O5a{8E8Gh=*}_=DHV1yEzuPSSMd+>M%PVunHW8}(&qLyB~l8pFH(=~`dFDBHV}d> z3$-bWzy_V2=6*KX8CXwJb{YGHp8WA-S*t1wb}n^3xF=7afyX%c*y-VpYjy?A<;3o$ zOoNG0PUL9S?gaO=2(JglyUOn5@AE0*-FazhCnvS~tyzA7nQgkcsqYFdyC~~S=@{+F zFLrx8|mYp|D=$S0e0ef;qkihx3`S_YAI*8LzF&l$ zx19srk)@`?GSeH6-d4+y+L`H;j*>fnSU|!$JETH#E<@Q)noKd`a<9}8V%s_&y?0^{ z8|Kj;gMLa^xCh<$p85L6zeFhaJpOevpE`eF09(Tmp8CS zDwt?yTI_OAq`pBqo9s?@sdFboM!ee9V z`@qI0$;i2St1@|ea0spH=~@sz9$zB3&*s>hefk>?@t$SLpue}#Bw@2-P4P{J1F32i zMRL2LPKcRAwta1ThFIIYXKU^rvyfIU=lv3uSZgzB(_0?#Vdl!Ym{^zi0anT{k|LHj zK85btdCpcpWcR4ljyDfc5-tO^ZIimpdq$cjypEncDv)|efb;cjjXO5B?W#E*o_#O0 zwKiXoFH{;mQ#unro%Z%(>=*K^{tuK>l1ydqa&Ak=d8fv1IG3BU*^tiGDP%gYyl#+T zhi$xbt89ihMX6ctFiSu>K|MDG8OV^ z)9w(Ymvsqh8ddrP<0!9|cqskdeVJzBm)cprJKpO*IV3!5e>b_Vmh1e9wD2@vvw3o# z5Qpn#_U3o`yWiey@|_yDbb~%;J0qL@zMXb1UDt)Tjhs{T2g@*L$4-)WZHo1ipF6T? zle`}GvNNptOl(Dm+8+IvZPgN}kaVjE_&|1?^G9*AB;2Uz^w@b*@sniQ?cp{W6 z>N$cZ0&_zrxlV`NO<-R3#jB8_YmK5c&%1j*!5XSA>ugWCiSl}G4Kwi3X7X2afFvCk zLwbn{Y+;D6eWZSVpk)Wql(?3|=o6Q=Cu{;KP%G1DIrUFBN#K>ikDa&ODUJ2nMD%$4 zin0omA3rb^)0lMcg&Jjm)Ht0Ue8yUS*r@ozTk8xB7I?{~Ta-6u284nOIyQ#rx)r-? zXW?zx*b6U%Y3Is<-{sH{MYrp{|Dq6?gWC3Ts1WP^5c|o8o_eM%{IS>^mUwYB=4$$3 z{Avu})9z!SVjbpGF-Dt685NqK{A_Q(B*|^Nm_MK3t;DazbP6+UhSP|#4x8^Ufs*-KSl zy@2?1Uq$2Hq$S6+3x}rVDFIeKDZ6z=w22!H`7}&Xcp`;KV zwg`70jE4_K3L-Cqz_&>{xcXyI2wSALvz@mj8tI0zU%JFw(i`cIa6-Adx+9>H9=0n# z0|J4_$;j~Fw{SVxg)IcOc#H?AG_DaUgTF=^27^F&ATT%t4khA&{Qa*_MC9X*L3-i3 zg7QVWdb``XpfEqa4tJS@!%u!^@m+X++x~w7z$h7Th?tTX1P%=3@j^K|dtL z%mxDCIz$eUgl>_9g2@+8i4v(0@qqy%5G%k8kU4sxP#6$3Ktj0zw0Ho!N(zWNI@x(i zI=f3P^vB)HadF4a-QC3&_osmGtAr~OgYw3JnLYd$PD(f+y)hD~{U|#h3<}IHA%V2F zcgA-Q=_+B5@2j(|5B?C0@4loL%FP}3rXEN;7o;P8i*dq#AV5OG9`~cT8@#~u`0MaT z2;33=B#DFsnEvb2zCMUjLc$r1|3F|MFi>(~7k4SWgv8=^lko6DIXLeJGvZDzwwNq5 z;I3hlknlqKeZ9^ei9vq7m<@L^?v(Mu84cWt-|oTn&kN=4?uz^3;4KRsadE~-E)3n` z*F_+GFz&dCkH+A}73GENzXQ_86@$Q!2jaI|@oz$nZ<26xxA$>Hfw@;0eK6I+)%Z3r z)o+-AxXrK`PjyXp>IVJA+cvy_*+J4VVI ziMF?O-;e7q+QHdTR1IMM?p9qxRc%espBVgqdeZ%iU>W_FmHPqxU)Ui0+`U{JT;2U7 zG0;^~{zX`c{>$JFeoy~paX_H|>jA)Nav$^Yh6;L2JMel36wpaF=HAPOAGCkEkm zWB`7E7Kez=Xv`Asf|wT0{k{=@m)*i$8$iT%uyg{GSa&ADvl5Pc%OyxKPy%~cM_5Mx zVOtjIKYp0K++7h1li14#jc`MG;gH$e-3ueRxVvf=up<4JllzYT%gI0q^nYCd$R`I5 z{yO~^Tpg~g1q-kR3~(f$2LGct0n-)tQ!o%SKnljw{NJ^HcNO%9S3yA_fB_(Jhk$^k zv$%cOWdeKnhuFhUQ0QCsK(^3K;1FvD%k4k1E82hD{1JW*2-vDMfR*S!Ocwq<{f9{t z=>NI^kWB_0pd|TK`Y*65T=^;aCj!d=L?8&j3Xm@vazHc-()!ZTZ|%_EwL|$@i2)Kc z1hgG6_#rWJ@Il+*AGJV!Bv)^xB7zXXLW%zcHnGJQg#LG5P;}#OBTEaWUKq?pQ{HbU zU`r>UOD7cm>Dlt%gJtwzTK)&}zqgO=S7psx(gW#*!s*vI79hPk7O(>Shsel&Z~uWq zpmGHIza9Vt<4Ec+k^$k>BFazc|3zY4AAXqutxX?@z<6zd7zv^Vz8aX=i1~siuhVZyyoZV1cp>i-8 zX?ge-7+exJ9?&haa1Fx%9UTNWT8o;veoeWQZJyY>DiNphVKE?Fa6UA9oj$$eRfByZar8 zAVer4*`*eF+!c1XRyb}?9(TqT_lLg@iMz)R_Xo$dAaz~c?QC7$ZI@n%9{-13g4KQ) z0uX=z1Rwwb{^LNrxS^!}XS+cF0ubO|2zdIyv$R!N+8$cm5-*)6S=y3*a}UGPmS<_J zva~(4xFue?j$~;|y0oQS+A=I{d6u>+OWQ+>+a;n!yrg^(FFl!fNkbuCGEfrpENxZ( z)GHH!0RLxT!{UYk&;K=v{!srX009W_9|mGl4KocjqTdvPWq{|kJh;ET-`?~GLIBC4 zv5@VX>v)#7Dofi#i(7&qKmY;|fB@?a%j17!{viGb*RUAW;4NwEjytgsZ?Gyy@D=^P z|L6a+=>I1Tfyxs6f7S(n0y5wz@vr;eN&Y!xS-}gBZ!yf%b|GMs6olJhz_s9`bSQzP z7#+Uh4GXTq06>b5#K5~V<9&oBZ9!z<4Y)hhYBm5bHUOW90Xh&3h!li7111GXc!)vG ziw@(afc|Rzsekrb-adAAC~xltcj^$l3*#?)Q~$t)@eiK$laB{(T=W(<0rb}5?HrKK zt|XvG7IO1rJBglTuvjOj4L*Hur+O5k*sKTWWU^tw@%- zEiMeCExfJ5iGY*Ek*albbu%!N<1e`JO+)oLhHqAMCJ@|@rec*J@q$)WM3fYzVw^Jm zEcy<{tMx2f&IPG$kdvhXM2P_ddWSMByp|L!f6fThqQ9sl*e`XnSZCJ?B zRMasJ`Olz=6A_A)05-cSrPQo$`J+rl*p6O=OOgNQarf&lJkKz=x-$8@8ec+;Gxpuk zm14Er9^?e_ixh`A&s|9w8q?v>oTSCqZQSgSSyuUX(`TjIGed=Ea$T~yT1sJ_=kOe? zWI7D!3sdcuI~TAoK{}0{o&afEmiex9%v@cqQ-_Z4f-rengO1+Yg2tA&!le1AeRf~hn4k}zD z;K_0-j+E_`(2Uh#S=k?t!TYDnv&}st-NS@F2qmB^$tZ#+5puPSgR!cJOSR`|#p6=LL zrBfdvWVHUsT(@mu?HpUes%i^<_vRp^s*B!~{iJhTHi3#BQbPEh`RZeaxt9Y9Fp5^|1-!1Qz95=v-e z>gGudW~fIz;uKq+Ha~M4!IfDSJ>z@DMc3T4(beDOTyLQ}lVzsAu5&`L^d)gDcHXYn zbPp7Uxc;Ih!*AfRFvD4Y-H!Rqg};w>Oe|~TB&vJ?#RVkyuo;{t0dgA^s>JiqXYkw@`iA0w<5NbZ&%*7L3^Pjx%!h z;#EI%!jp_lB8VsiQ6^6HSOANL%Dq_J8OAuo>}W~6kl}A$G)V*+39F8ZhR*SP!^=Ge z?W%@{Pjz~60w+>qRhLUjx^gqi5YJUU_5J6O==l9PWN-RDLPP1>e;rD`--G9>{y3r{ z+k&XmT@(BNUJ02$6GuJ!ru!R&XkoWHC)U3}U(3vNR7{Bh&z4fss4)!~W8Y4lirjs- z^oR#J6v+QD7H+OP^kesXi`aW7(3QQ65+OB^Z0^N@RWc%wF!=@5H7@{0F%gby&=Dr?8)A;`==EE;P*V-Gp<2Y0a- zYE^-#OC9_d`6=#v;E6+?ld=cVu#V%sZYo*`F*<-DVAY9Ikf5V|9#r|`U#~;ESMM0h zG5cT4spYQ7s1SGdfMdrkxJhSh=U(!k;A4?8b4@C*xJvJKirGz>YOt!pjZ{J`O8c(3 zw4?fjBjdD#&kyp^hy#MX%AazFR}4&?IRAwdo@Q3P%hcKdMpB#akgdswRjg3XG?=I7 zQN6B-2;w0utfZu5aRWFCA?{3c0{m)AgWy9Ha%vCTjR=nyt81BP2v3kBF~aG-jHs@p z06#`KVc{-eLPk$8K($H^LsZN!HRnaz-CW4t1;j=d1M4Fvt?NJyCxSJ`nI?2YfG!nO z3;v~Zgu$RSigyWhgF1yF4JkB89qY6@o22zGk|k^3>CLS z>*)!mfQ&!??`HXa+~jAX+5N_O@1SDvKwe43G!M|3O73hOm?Wa+1cE$O-lM9&yjSb5 zy@#gHX;SNF9cV*G=2^Xhyi#@4R2DV72Dacf^Bc#Fi|<=J5LSp>WHZ#kL*Nx+=0CXg}(pnIKfV+vRb=D{xhGE)b`fg8IPESbD=h>BST zyG=85#Y42%256@_1nK8iyaX5&o^dIPL9Ri95DdJE1{wK0C! ztR;p?(EuCCSCgeo`m>8nLcwR}LtTYCHzp$_`-X}>II)KHqc-O|Zo$u;Re_4g_&@QO z$H*$V|IhP4e?Q+Jx>O9GCr@f_)A(wtj2KBdDjSd{Z9BU?a16Wela=w;y8`f>TT1D^ zfIh-`4AF_o;Cd8xJo%8p5Nk+jwGW>fVvL?sxwCTUqn0??o#T?`RwDLW2k9yOdKDkh zUf##g7!HfpMbT{hSBNOB%MZ+dL1R1jU(>sz+@$`PTwr>fBbJYfr3X5w)wzwGf5=YR z?QdXo=&U5q2Sll3cRQ(tDV7bw>>q`{Tk_bRo%iWi)pyrO70O-?Xdc1D0$Pfb3_=dk z$tLoW*?7w!oZ^)9qP7b!X?qMx zLLSPYM00D=D;d3C+!!9_bR2(B-SJz;`!k9#Zf~zdBIPbfri=*x`#V&Ie44N;#VjEAv1oS^8+OeZk; zHf6w*kO?BA5xQ1Kkl-WffCye~w0ip_>51wccE>xsG?m4e#Nxhf5$bm7iV-ik z`pI?66TNlt^k@{W&|cS!i-R0eb;yuG4ibWT%Mt{K-Bvo()HT2EsZJZe@dW4CL28Sgle?%<@)&Ux+gbkr!& zx-IQu6$Q^(_%;tCoV_uN$6*#l-v}ydnddK1J_Zi&$3hngt2FRxVH8RCbC?6LOAUDh zw#m4!p5gZE`)*8Y3+v*e+LUt-A#%PiY{z;oG|&gu@QVd`dBdZ(e>f59$puM;}6G;Q;G|xl4;s z?9BJ1rBk}CncK}Ah>MEO=fUokxWOe2qgrNvNI8+|$--u&|ibG*QMd;zt^Gup$nl4!IT zxf1(6ZPMwEnEsF`!910kyrmN^a5%P4!^+Empo$N#$oz)-GaOhxIubG7iK_eTy??3$> zgIvB+-0A#>x7dJCm7uMGt!0!fdFi1eOpCE%J%s`JMITHWG5~N1<_35HA zH~yt1==wq-@u5!SPUC>@8EfnJ&L5=Tjn+)=-mQ50F6mnNd+W*^^A&bw{KGT#=RW92 z1U%<{{PUP?I)^0z<8{c#?;W3ZDqB*TLCrEd9FxmY^zJ3cH4e37O^gzmyn*<_dV``! zgE0Lf@yIZIgr&ZF?dsgd{UHM^Za@V#m>_Nkj&r$4VtY|h9sJ&4IHd-(wcTh?%{}w4 z)am_%tQSRVdk^{u-y9H;0eXCK*=uCr!c&Hn5Jf*vvUAt{pvy!le1_^P)~oj+QeDg@ zp@PK&(D?M+q=hO%2M(~^mUNy6a;Ai@a<|fB$i-}ZN-DcJQe1Kk3?EVy4r^D#x1r{jmCspzjPbR? zxVSAmctigwCBAMyAftpCj1IP%*B~6fXDsY^@ll9!Ti?Y?t6;AicpgBZPtN#gT8b{O zLrL!rHz4g;kjd3`^EqJ=@zmddqw#aek($m{sSw_VZ>m4qBXtM4RtOa)XT|(h0&}`< znOxsYUZbkz(1xsC*dMS2?qa#dYk`24G&m~V@>JsOCHaWgDjI3!=4J0+45(*dw)Ny5 zuobv2KMLUtmLCERZ#$5Oz8Bw@#^TktzhV~sXf7^Y=awiVNvhXuF7(VP>OJ=YwY@_i z@IP{CasTOy+8wMIA0QfmrRpTW#avySOjE!LSHQ18M&}T`WFir_CBAR1@tO5O*Uf2n z%hQeozc;bT4{x6SZaw(zOw$yZen|y+8`h@LirKob?rY#^oWr8}VYC3F;+;gy8mktv z`q@ZIeizGZyF^pTMpn;UWSP->kb4~nh=B!9#QkM#%{vwWFpy3KW^8lT8CR!P?2aM6 zipb12eZWlS=^DipNU5m~PaE)lmSy-8p7z-sfxNr@`nlpm)QqT~eo!GUqb>gBC}3id(@4mY0!pLioQLd1sc zQm_ZV7!y{(l?M>5xa6G-(BX@t&&>QvqS*^SUvGA{P7B#Eq zk80d>uU?ro(|oK<)YV++C!zFC8|DnWG5ai;bYYd{`cPB(*tPTGlTT!<;8pw``cB~g za<2CosoMYYLr&T_3+uoYCxRn2(AB z%_&mt<-+@Nh#US?n}a^^;QT!Hq$#0dPyL}(68B-^CjZ-*i%6O|Pk+eh0u$e=s9Wg< zc7}@HwHm9+PWQM{sDHd7Tk{O-rZ4)q6dIK6pxzhM(P0#R@*{juZ~KTpoGa?Q2~$cH zL$5k!wuWhxjFzTbBstwo_yB9Kj)Wa#kh!IF+;@uM#Q4Sf`E)nmJfoD9UD_J{_@mBj z64d?04(3~y^eD}$=Zijes=um~?_e?=r%$nQP@vMci$L1UEp>TdSa4#C0+j0#Dbw3#3mYKX+{B#Ft+LAb#sb z(&d!U2w6y!c+%-(*EU)}d$kWzTHfsjbi}QWY0P7jJOyjw&iqlq>7R`m9*AgLPl%ID zPVO5ZJ z&Fq8Nd}r@Uixa^%+cS2dsc6hTSpV|(b;ZNV=Rtlhiq|Jq8X<!Pu{a_=4TAcHH+)?nw8-U+(m{=}O^cFLb}qvdm|_Aj(UO?EaqH zlAqzWdUB-5&fxS&2VkNY^0mV>iU;YV^2G6BtsG1Fo!VbGbqN6E$ zQU;GUjozARbqW^E9GOJi13Z-=Eb=VvMofv8aSiOCKsvz6P{9B%HF*y_u0pWVK29{rBL z9woix@Sv8o+IwMYmp=M&)m6YI;TvPJ-NDle>pT68r*~(|iUv0E$2C=dg!FN}FsSCM zJaa28X1HNYqIGaa!0-FWh`l!uJtqrr9Uh))etD0-s|TWwZSSE@;19t1VVv|n#E-<= za4o0s{1K>W)iz(*@X4sv1)j@2==g)fp z^rHa?muW7~9i($TVPqet*bB=~0PlOmQW0iW%mx^w&>(XcJ|a4mm#WF_P^QGm#dRdj zp_@YU?`dznQH0Vi_qZ>9fUaJFD>bYPJJe>N)Hd*hxjq(y6m}~mqU>q4LJobZeu9M? zEq{R)1k|(x6imRyg!$U_t_?u?#BZ_LhgY#o<-nG_hWE(h?K?3azcZLDXUL7f=%!?# zbBfG_gC{v+4r|v-VLg$!hYxmv*Z&G=f5>X>#ZzvY*U*gfnP?PU$Lkic--<4K`_iyl z=0L3koG>AT%FwWkZt*>*Fh?yJ#E#P1KU{#+u6spIW4x#+dnz{ZO;W4J?C%!aw|t%D znU3@Nw4wg>YrtUyXo$qEvZjD#@=8{x-Mj_A#3hgK>T_L>JfC#)<#ooP4G~5&+{@m{ zEAe&|wEH;FY@;SzMlP;H@3u0)@@~Zcj#nQQFPVBgT(D_4!e{j$fnQ5uWT*H#NWKzM zd56i-B(#0x+ai=^AKm2Pm@i#`&_AplqoGIS6R9?F^Bd1KJUEj)bHZJvf>cOZ&+YsM zHT}z7C`qhF%41*I!<|W7{0Ab+1l=-DuF=60-9edRS9Z`UdzoM@sfYUS^^ZcmE(t^p z4UY$}6whA&37s?{lrwBXP0(d_eTEptg$1)S=8F$qd6={LMc z7j);G>vUKjlq_6f7yRuRY4NghYPeeVnP7c>+%d+*4d#3K0kFmde0K%#S(q*#37jFR z%>wJ8bTZbA?EvyI*8#%QqdiI*GKR?4QIJJmSZaQl#T53F<^G%t-8y974!QrfBTff9 z`#Ie!U)!V5;xBcb*9MGHVbt|O0VM1$gTy}XOj8A`d7tji!N z$9()aYl;t0;ur^$|En}4_Hs|tnt$ujh493sVm+q5y2n@(Uuu?e_1;siWmgtj*9Dey zti>rv;)b<^Gy zC(q6v+9V%wbz#JE;OW1GR`om8f9gXy|L}1qck2JYPq^OD}~dg1hmt|ES^sTNPKL0=UDvGzrdp7m9JbN}SG64s^W zp*Fmsy|;^*&39&#IKyqy*{C3i_Ksp@t9I!q&Mvc6sFF&>{}{CWEoA|hshAU?;Y1qU z3FjWTR-bHO>>u`ic$(8fJjytZ#lyH4vN;`_UjCZtjFRLD3&c|4%S(Z}M<}zoTa(|O z)o#yvET^k={U>)_v+>*G6V*`aqRIj0drj|C4U#yY;6@#d*@wUN`yaCAzc<9G>pj zJ2s!PEKXmbIy{K)hRy^pQf(6Elb_!Vf;C?x-iKE$-5lg+=W=~Yki6l1$niu6}EXcXG?yi4x$ur#BxtJFd z6TpHkevJ#W--?f1!Jh5IyAy1e$NCy=SIE6-)7W|5%i){HTgX*fx|iKkDpWxJ?Z-ww_@jW=92P+XtCgAy`!Ey8*Y zr1E~sPkOu-g_8WHbaQU!x`eD^5l%p{D77MdZgi;v{|*s6WrTDy&sl?cl&LuF2cf?l zn-?6~?}WaTbSHr29cGA%eVGpP(CwA7Ks=BaYfRV$QqHYc&okzbpsT^Fzh(Dr`0KGG zA&c>7grS6@%BY@gX~0kq!;ZpYYag_(d%{W9R*fg-+P*|*;4QxQaK*t-FudNPO)fSj zLfU39`ZN;n_ZVI!Sc#EwK~kdFPZOgD!%8I#{-WH&ZpadbCki9mSY8+{Z_kScwQ*>8 zmD{wR-k-q&rl7WK(ducYQ7_F>YN=Fo%8S7uH2md;ejv%XfR+B(7cGPT8fdI{>9sFR z+&2r?!xRJhp+C(4-h<8mQg_qZ4lvVoNj0US*zdYZVCr1T?a$OoZD)vg7wN6h)|-+d zQuXZ&mrp);=wDwKix#jjU$iiPtur0Ylin^N$S 0 { + if len(sandboxConfig.DefaultConfig.Source) > 0 { docker.Volumes = append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SourcesPath, + Source: sandboxConfig.DefaultConfig.Source, Target: docker.FlyteSnackDir, }) } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index 36e0399b51..a0bef27c8d 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -61,10 +61,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SourcesPath, + Source: sandboxConfig.DefaultConfig.Source, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -97,10 +97,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SourcesPath, + Source: sandboxConfig.DefaultConfig.Source, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -133,10 +133,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SourcesPath, + Source: sandboxConfig.DefaultConfig.Source, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -177,10 +177,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SourcesPath, + Source: sandboxConfig.DefaultConfig.Source, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -213,10 +213,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SourcesPath, + Source: sandboxConfig.DefaultConfig.Source, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -249,10 +249,10 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.SourcesPath = f.UserHomeDir() + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.SourcesPath, + Source: sandboxConfig.DefaultConfig.Source, Target: docker.FlyteSnackDir, }) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -312,7 +312,7 @@ func TestStartSandboxFunc(t *testing.T) { }).Return(reader, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) docker.Client = mockDocker - sandboxConfig.DefaultConfig.SourcesPath = "" + sandboxConfig.DefaultConfig.Source = "" err := startSandboxCluster(ctx, []string{}, cmdCtx) assert.Nil(t, err) }) @@ -348,7 +348,7 @@ func TestStartSandboxFunc(t *testing.T) { }).Return(reader, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) docker.Client = mockDocker - sandboxConfig.DefaultConfig.SourcesPath = "" + sandboxConfig.DefaultConfig.Source = "" err := startSandboxCluster(ctx, []string{}, cmdCtx) assert.NotNil(t, err) }) diff --git a/flytectl/config.yaml b/flytectl/config.yaml index eccd8b7498..b3710406ef 100644 --- a/flytectl/config.yaml +++ b/flytectl/config.yaml @@ -4,4 +4,15 @@ admin: insecure: true logger: show-source: true - level: 1 + level: 3 +storage: + connection: + access-key: minio + auth-type: accesskey + disable-ssl: true + endpoint: http://localhost:30084 + region: us-east-1 + secret-key: miniostorage + type: minio + container: "my-s3-bucket" + enable-multicontainer: true \ No newline at end of file diff --git a/flytectl/go.mod b/flytectl/go.mod index f944444102..43025c7c76 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,6 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 + github.com/flyteorg/datacatalog v0.3.6 github.com/flyteorg/flyteidl v0.19.3 github.com/flyteorg/flytestdlib v0.3.24 github.com/ghodss/yaml v1.0.0 @@ -29,6 +30,7 @@ require ( github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/opencontainers/image-spec v1.0.1 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 + github.com/pkg/errors v0.9.1 // indirect github.com/sirupsen/logrus v1.8.0 github.com/spf13/cobra v1.1.3 github.com/spf13/pflag v1.0.5 @@ -36,7 +38,7 @@ require ( github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 github.com/zalando/go-keyring v0.1.1 golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 - google.golang.org/grpc v1.35.0 + google.golang.org/grpc v1.36.0 google.golang.org/protobuf v1.25.0 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.4.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 6658e96614..46b9491b38 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -78,6 +78,8 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -102,6 +104,7 @@ github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Selvatico/go-mocket v1.0.7/go.mod h1:4gO2v+uQmsL+jzQgLANy3tyEFzaEzHlymVbZ3GP2Oes= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= @@ -113,6 +116,7 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -170,6 +174,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= @@ -267,6 +273,7 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -337,6 +344,9 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/flyteorg/datacatalog v0.3.6 h1:eMA9FK1m7bmOp0LRPt3oT7N+Ki2k6R2IzsqmC69/O8Q= +github.com/flyteorg/datacatalog v0.3.6/go.mod h1:BFc3bTKlvQAGRN0aZDvCt8u1tOX39yN9bcI3R7C4hTY= +github.com/flyteorg/flyteidl v0.18.17/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= github.com/flyteorg/flyteidl v0.19.3 h1:Rba35Qi3eG/lExzWUnjQOgX+HpHHLWj+N/QBw9TlFBo= github.com/flyteorg/flyteidl v0.19.3/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= @@ -386,6 +396,8 @@ github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68Fp github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= @@ -497,6 +509,7 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.2/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -540,6 +553,62 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= +github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.8.1 h1:ySBX7Q87vOMqKU2bbmKbUvtYhauDFclYbNDYIE1/h6s= +github.com/jackc/pgconn v1.8.1/go.mod h1:JV6m6b6jhjdmzchES0drzCcYcAHS1OPD5xu3OZ/lE2g= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2 h1:JVX6jT/XfzNqIjye4717ITLaNwV9mWbJx0dLCpcRzdA= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.6 h1:b1105ZGEMFe7aCvrT1Cca3VoVb4ZFMaFJLJcg/3zD+8= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= +github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= +github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= +github.com/jackc/pgtype v1.7.0 h1:6f4kVsW01QftE38ufBYxKciO6gyioXSC0ABIRLcZrGs= +github.com/jackc/pgtype v1.7.0/go.mod h1:ZnHF+rMePVqDKaOfJVI4Q8IVvAQMryDlDkZnKOI75BE= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= +github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= +github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= +github.com/jackc/pgx/v4 v4.11.0 h1:J86tSWd3Y7nKjwT/43xZBvpi04keQWx8gNC2YkdJhZI= +github.com/jackc/pgx/v4 v4.11.0/go.mod h1:i62xJgdrtVDsnL3U8ekyrQXEwGNTRoG7/8r+CIdYfcc= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -578,11 +647,17 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= @@ -597,10 +672,17 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -732,6 +814,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -780,6 +863,9 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -789,6 +875,9 @@ github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc h1:jUIKcSPO9MoMJBbEoyE/RJoE8vz7Mb8AjvifMMwSyvY= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -890,6 +979,7 @@ github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPS github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zalando/go-keyring v0.1.1 h1:w2V9lcx/Uj4l+dzAf1m9s+DJ1O8ROkEHnynonHjTcYE= github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRzC8UFJH9+L8= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= @@ -909,9 +999,12 @@ go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -919,12 +1012,15 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -990,6 +1086,7 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1044,7 +1141,9 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1059,6 +1158,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1141,6 +1241,7 @@ golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -1149,6 +1250,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1193,6 +1295,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1242,6 +1346,7 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -1301,8 +1406,9 @@ google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0 h1:o1bcQ6imQMIOpdrO3SWf2z5RV72WbDwdXuK0MDlc8As= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1327,6 +1433,7 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= @@ -1336,6 +1443,7 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= @@ -1352,6 +1460,10 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.1.0 h1:afBljg7PtJ5lA6YUWluV2+xovIPhS+YiInuL3kUjrbk= +gorm.io/driver/postgres v1.1.0/go.mod h1:hXQIwafeRjJvUm+OMxcFWyswJ/vevcpPLlGocwAwuqw= +gorm.io/gorm v1.21.9 h1:INieZtn4P2Pw6xPJ8MzT0G4WUOsHq3RhfuDF1M6GW0E= +gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= From 29740e0b62160d92cb68a06cdd3655bcb24ca931 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Thu, 1 Jul 2021 21:07:44 +0530 Subject: [PATCH 090/645] Bumped up idl to use insecureVerify flag for remote and fixed docs (#125) * Bumped up idl to use insecureVerify flag for remote Signed-off-by: Prafulla Mahindrakar * Fixed the doc links Signed-off-by: Prafulla Mahindrakar * Added sphinx-tabs Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/sandbox/start.go | 1 + flytectl/doc-requirements.in | 1 + flytectl/doc-requirements.txt | 28 +++-- flytectl/docs/source/conf.py | 1 + .../source/gen/flytectl_register_examples.rst | 1 + .../source/gen/flytectl_register_files.rst | 17 ++- flytectl/docs/source/gen/flytectl_sandbox.rst | 1 + .../docs/source/gen/flytectl_sandbox_exec.rst | 46 +++++++ .../source/gen/flytectl_sandbox_start.rst | 5 +- flytectl/docs/source/index.rst | 115 ++++++++++++++---- flytectl/docs/source/nouns.rst | 6 +- flytectl/docs/source/verbs.rst | 3 + flytectl/go.mod | 4 +- flytectl/go.sum | 115 +----------------- 14 files changed, 184 insertions(+), 160 deletions(-) create mode 100644 flytectl/docs/source/gen/flytectl_sandbox_exec.rst diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 807cfe52fc..122b87f7cc 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -27,6 +27,7 @@ Mount your flytesnacks repository code inside sandbox :: bin/flytectl sandbox start --sourcesPath=$HOME/flyteorg/flytesnacks + Usage ` ) diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in index 90287527fb..42d006319a 100644 --- a/flytectl/doc-requirements.in +++ b/flytectl/doc-requirements.in @@ -6,3 +6,4 @@ sphinx-material sphinx-code-include sphinx-copybutton sphinx_fontawesome +sphinx_tabs diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index 2517816f12..cd582290d0 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile +# This file is autogenerated by pip-compile with python 3.8 # To update, run: # # pip-compile doc-requirements.in @@ -20,7 +20,9 @@ chardet==4.0.0 css-html-js-minify==2.5.5 # via sphinx-material docutils==0.16 - # via sphinx + # via + # sphinx + # sphinx-tabs git+git://github.com/flyteorg/furo@main # via -r doc-requirements.in idna==2.10 @@ -39,6 +41,7 @@ pygments==2.9.0 # via # sphinx # sphinx-prompt + # sphinx-tabs pyparsing==2.4.7 # via packaging python-slugify[unidecode]==5.0.2 @@ -55,6 +58,16 @@ snowballstemmer==2.1.0 # via sphinx soupsieve==2.2.1 # via beautifulsoup4 +sphinx==3.5.4 + # via + # -r doc-requirements.in + # furo + # sphinx-code-include + # sphinx-copybutton + # sphinx-fontawesome + # sphinx-material + # sphinx-prompt + # sphinx-tabs sphinx-code-include==1.1.1 # via -r doc-requirements.in sphinx-copybutton==0.3.1 @@ -65,15 +78,8 @@ sphinx-material==0.0.32 # via -r doc-requirements.in sphinx-prompt==1.4.0 # via -r doc-requirements.in -sphinx==3.5.4 - # via - # -r doc-requirements.in - # furo - # sphinx-code-include - # sphinx-copybutton - # sphinx-fontawesome - # sphinx-material - # sphinx-prompt +sphinx-tabs==3.1.0 + # via -r doc-requirements.in sphinxcontrib-applehelp==1.0.2 # via sphinx sphinxcontrib-devhelp==1.0.2 diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index b3c1bfbbab..3b8bfae9ab 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -43,6 +43,7 @@ "sphinx_copybutton", "sphinx_search.extension", "sphinx_fontawesome", + "sphinx_tabs.tabs", ] # build the templated autosummary files diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 24454a32e6..1a32690879 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -34,6 +34,7 @@ Options -h, --help help for examples -k, --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. -l, --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). + --sourceUploadPath string Location for source code in storage. -v, --version string version of the entity to be registered with flyte. (default "v1") Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 8f58aa349f..2e3207d832 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -15,7 +15,18 @@ If there are already registered entities with v1 version then the command will f :: bin/flytectl register file _pb_output/* -d development -p flytesnacks + +There is no difference between registration and fast registration, In fast registration, the input provided by the user is fast serialized proto that is generated by pyflyte. If Flytectl finds any source code in users's input then it will consider registration as fast registration. Flytectl finds input file by searching an archive file whose name starts with fast and has .tar.gz extension When the user runs pyflyte with --fast flag then pyflyte creates serialize proto and it also archive create source code archive file in the same directory. +SourceUploadPath is an optional flag. By default, flytectl will create SourceUploadPath from your storage config. In case of s3 flytectl will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. +:: + + bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 + +In case of fast registration, If the SourceUploadPath flag is defined then In this case flytectl will not use the default directory for uploading the source code, it will override the destination path on the registration +:: + bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 --SourceUploadPath="s3://dummy/fast" + Using archive file.Currently supported are .tgz and .tar extension files and can be local or remote file served through http/https. Use --archive flag. @@ -29,8 +40,7 @@ Using local tgz file. bin/flytectl register files _pb_output.tgz -d development -p flytesnacks --archive -If you want to continue executing registration on other files ignoring the errors including version conflicts then pass in -the continueOnError flag. +If you want to continue executing registration on other files ignoring the errors including version conflicts then pass in the continueOnError flag. :: @@ -69,7 +79,7 @@ Override Output location prefix during registration. :: bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -l "s3://dummy/prefix" - + Usage @@ -88,6 +98,7 @@ Options -h, --help help for files -k, --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. -l, --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). + --sourceUploadPath string Location for source code in storage. -v, --version string version of the entity to be registered with flyte. (default "v1") Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index bb687e27d5..6c0e229781 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -43,6 +43,7 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl` - flyetcl CLI tool +* :doc:`flytectl_sandbox_exec` - Execute any command in sandbox * :doc:`flytectl_sandbox_start` - Start the flyte sandbox * :doc:`flytectl_sandbox_status` - Get the status of the sandbox environment. * :doc:`flytectl_sandbox_teardown` - Teardown will cleanup the sandbox environment diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst new file mode 100644 index 0000000000..2822ad5c34 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -0,0 +1,46 @@ +.. _flytectl_sandbox_exec: + +flytectl sandbox exec +--------------------- + +Execute any command in sandbox + +Synopsis +~~~~~~~~ + + + +Execute command will Will run non-interactive commands and return immediately with the output. + +:: + bin/flytectl sandbox exec -- ls -al + +Usage + +:: + + flytectl sandbox exec [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for exec + --source string Path of your source code + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_sandbox` - Used for testing flyte sandbox. + diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index a4d171c7b8..d96f6cab80 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -19,6 +19,7 @@ Mount your flytesnacks repository code inside sandbox :: bin/flytectl sandbox start --sourcesPath=$HOME/flyteorg/flytesnacks + Usage @@ -31,8 +32,8 @@ Options :: - --flytesnacks string Path of your flytesnacks repository - -h, --help help for start + -h, --help help for start + --source string Path of your source code Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 1113458744..4148e3eb3e 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -10,19 +10,32 @@ Install Flytectl is a Golang binary and can be installed on any platform supported by golang -Install flytectl with homebrew tap -.. prompt:: bash +.. tabs:: - brew install flyteorg/homebrew-tap/flytectl - # Upgrade flytectl - brew upgrade flytectl + .. tab:: OSX -Install flytectl with shell script + .. prompt:: bash $ -.. prompt:: bash + brew install flyteorg/homebrew-tap/flytectl - curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash + *Upgrade* existing installation using the following command: + + .. prompt:: bash $ + + brew upgrade flytectl + + .. tab:: Other Operating systems + + .. prompt:: bash $ + + curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash + +**Test** if Flytectl is installed correctly (your Flytectl version should be > 0.2.0) using the following command: + +.. prompt:: bash $ + + flytectl version Configure ========= @@ -32,25 +45,73 @@ on command-line. The following configuration is useful to setup. Basic Configuration -------------------- -.. code-block:: yaml - - admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///flyte.lyft.net - authType: Pkce - logger: - # Logger settings to control logger output. Useful to debug logger: - show-source: true - level: 1 - - -Place this in $HOME/.flyte directory with name config.yaml. -This file is searched in - -- $HOME/.flyte -- currDir from where you run flytectl -- /etc/flyte/config -- You can pass it commandline using --config +.. tabs:: Flytectl configuration + + .. tab:: Local Flyte Sandbox + + Automatically configured for you by ``flytectl sandbox`` command. + + .. code-block:: yaml + + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:///localhost:30081 + insecure: true + authType: Pkce # if using authentication or just drop this. If insecure set insecure: True + storage: + connection: + access-key: minio + auth-type: accesskey + disable-ssl: true + endpoint: http://localhost:30084 + region: my-region-here + secret-key: miniostorage + container: my-s3-bucket + type: minio + + .. tab:: AWS Configuration + + .. code-block:: yaml + + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:/// + authType: Pkce # if using authentication or just drop this. If insecure set insecure: True + storage: + kind: s3 + config: + auth_type: iam + region: # Example: us-east-2 + container: # Example my-bucket. Flyte k8s cluster / service account for execution should have read access to this bucket + + .. tab:: GCS Configuration + + .. code-block:: yaml + + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:/// + authType: Pkce # if using authentication or just drop this. If insecure set insecure: True + storage: + kind: google + config: + json: "" + project_id: # TODO: replace with the GCP project ID + scopes: https://www.googleapis.com/auth/devstorage.read_write + container: # Example my-bucket. Flyte k8s cluster / service account for execution should have access to this bucket + + .. tab:: Others + + For other supported storage backends like Oracle, Azure, etc., refer to the configuration structure `here `__. + + + Place this in $HOME/.flyte directory with name config.yaml. + This file is searched in + + * $HOME/.flyte + * currDir from where you run flytectl + * /etc/flyte/config + You can pass it commandline using --config aswell .. toctree:: diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index 756ccc8b0b..bb1feb587a 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -28,12 +28,16 @@ Flytectl noun specify the resource on which the action needs to be performed eg: gen/flytectl_update_execution-queue-attribute gen/flytectl_update_plugin-override gen/flytectl_register_files + gen/flytectl_register_examples gen/flytectl_delete_execution gen/flytectl_delete_task-resource-attribute gen/flytectl_delete_cluster-resource-attribute gen/flytectl_delete_execution-cluster-label gen/flytectl_delete_execution-queue-attribute gen/flytectl_delete_plugin-override - gen/flytectl_version gen/flytectl_config_validate gen/flytectl_config_discover + gen/flytectl_sandbox_start + gen/flytectl_sandbox_status + gen/flytectl_sandbox_teardown + gen/flytectl_sandbox_exec diff --git a/flytectl/docs/source/verbs.rst b/flytectl/docs/source/verbs.rst index 8fb0ba88f2..e9185691cf 100644 --- a/flytectl/docs/source/verbs.rst +++ b/flytectl/docs/source/verbs.rst @@ -7,8 +7,11 @@ Flytectl verbs specify the actions to be performed on the resources like create/ :caption: Verbs gen/flytectl_create + gen/flytectl_completion gen/flytectl_get gen/flytectl_update gen/flytectl_delete gen/flytectl_register gen/flytectl_config + gen/flytectl_sandbox + gen/flytectl_version diff --git a/flytectl/go.mod b/flytectl/go.mod index 43025c7c76..67218d1ca6 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,8 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/datacatalog v0.3.6 - github.com/flyteorg/flyteidl v0.19.3 + github.com/flyteorg/flyteidl v0.19.8 github.com/flyteorg/flytestdlib v0.3.24 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 @@ -30,7 +29,6 @@ require ( github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/opencontainers/image-spec v1.0.1 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 - github.com/pkg/errors v0.9.1 // indirect github.com/sirupsen/logrus v1.8.0 github.com/spf13/cobra v1.1.3 github.com/spf13/pflag v1.0.5 diff --git a/flytectl/go.sum b/flytectl/go.sum index 46b9491b38..9708005305 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -78,8 +78,6 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -104,7 +102,6 @@ github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Selvatico/go-mocket v1.0.7/go.mod h1:4gO2v+uQmsL+jzQgLANy3tyEFzaEzHlymVbZ3GP2Oes= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= @@ -116,7 +113,6 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -174,8 +170,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= @@ -273,7 +267,6 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -344,11 +337,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/datacatalog v0.3.6 h1:eMA9FK1m7bmOp0LRPt3oT7N+Ki2k6R2IzsqmC69/O8Q= -github.com/flyteorg/datacatalog v0.3.6/go.mod h1:BFc3bTKlvQAGRN0aZDvCt8u1tOX39yN9bcI3R7C4hTY= -github.com/flyteorg/flyteidl v0.18.17/go.mod h1:b5Fq4Z8a5b0mF6pEwTd48ufvikUGVkWSjZiMT0ZtqKI= -github.com/flyteorg/flyteidl v0.19.3 h1:Rba35Qi3eG/lExzWUnjQOgX+HpHHLWj+N/QBw9TlFBo= -github.com/flyteorg/flyteidl v0.19.3/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.19.8 h1:jWWIEnFMgJCZm/XK25Xts4+kQhoOrd5dWgLj/fLsbIg= +github.com/flyteorg/flyteidl v0.19.8/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.24 h1:Eu5TMKch9ihOavPKufgTBI677eVYjJpOAPPg9hfZIzU= github.com/flyteorg/flytestdlib v0.3.24/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= @@ -396,8 +386,6 @@ github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68Fp github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= @@ -509,7 +497,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.2/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -553,62 +540,6 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= -github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.8.1 h1:ySBX7Q87vOMqKU2bbmKbUvtYhauDFclYbNDYIE1/h6s= -github.com/jackc/pgconn v1.8.1/go.mod h1:JV6m6b6jhjdmzchES0drzCcYcAHS1OPD5xu3OZ/lE2g= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2 h1:JVX6jT/XfzNqIjye4717ITLaNwV9mWbJx0dLCpcRzdA= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.6 h1:b1105ZGEMFe7aCvrT1Cca3VoVb4ZFMaFJLJcg/3zD+8= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= -github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= -github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= -github.com/jackc/pgtype v1.7.0 h1:6f4kVsW01QftE38ufBYxKciO6gyioXSC0ABIRLcZrGs= -github.com/jackc/pgtype v1.7.0/go.mod h1:ZnHF+rMePVqDKaOfJVI4Q8IVvAQMryDlDkZnKOI75BE= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= -github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= -github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= -github.com/jackc/pgx/v4 v4.11.0 h1:J86tSWd3Y7nKjwT/43xZBvpi04keQWx8gNC2YkdJhZI= -github.com/jackc/pgx/v4 v4.11.0/go.mod h1:i62xJgdrtVDsnL3U8ekyrQXEwGNTRoG7/8r+CIdYfcc= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= -github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -647,17 +578,11 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= -github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= @@ -672,17 +597,10 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -814,7 +732,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -863,9 +780,6 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -875,9 +789,6 @@ github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc h1:jUIKcSPO9MoMJBbEoyE/RJoE8vz7Mb8AjvifMMwSyvY= -github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -979,7 +890,6 @@ github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPS github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zalando/go-keyring v0.1.1 h1:w2V9lcx/Uj4l+dzAf1m9s+DJ1O8ROkEHnynonHjTcYE= github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRzC8UFJH9+L8= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= @@ -999,12 +909,9 @@ go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1012,15 +919,12 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1086,7 +990,6 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1141,9 +1044,7 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1158,7 +1059,6 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1241,7 +1141,6 @@ golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -1250,7 +1149,6 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1295,8 +1193,6 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1346,7 +1242,6 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -1433,7 +1328,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= @@ -1443,7 +1337,6 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= @@ -1460,10 +1353,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/postgres v1.1.0 h1:afBljg7PtJ5lA6YUWluV2+xovIPhS+YiInuL3kUjrbk= -gorm.io/driver/postgres v1.1.0/go.mod h1:hXQIwafeRjJvUm+OMxcFWyswJ/vevcpPLlGocwAwuqw= -gorm.io/gorm v1.21.9 h1:INieZtn4P2Pw6xPJ8MzT0G4WUOsHq3RhfuDF1M6GW0E= -gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= From 2a25558b1d0760c3a7bbf680331793b2ad9b4696 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Thu, 1 Jul 2021 16:26:31 -0700 Subject: [PATCH 091/645] Absolute path for Source dir (#126) Signed-off-by: Ketan Umare --- flytectl/cmd/sandbox/start.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 122b87f7cc..6a78d639e4 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "os" + "path/filepath" "github.com/flyteorg/flytectl/pkg/docker" @@ -67,19 +68,25 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu } if len(sandboxConfig.DefaultConfig.Source) > 0 { + source, err := filepath.Abs(sandboxConfig.DefaultConfig.Source) + if err != nil { + return nil, err + } docker.Volumes = append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, + Source: source, Target: docker.FlyteSnackDir, }) } + fmt.Printf("%v pulling docker image %s\n", emoji.Whale, docker.ImageName) os.Setenv("KUBECONFIG", docker.Kubeconfig) os.Setenv("FLYTECTL_CONFIG", docker.FlytectlConfig) if err := docker.PullDockerImage(ctx, cli, docker.ImageName); err != nil { return nil, err } + fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) exposedPorts, portBindings, _ := docker.GetSandboxPorts() ID, err := docker.StartContainer(ctx, cli, docker.Volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, docker.ImageName) if err != nil { From 9deb2ecc8a321b0cb8930725349bbaf372502140 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Thu, 1 Jul 2021 20:46:22 -0700 Subject: [PATCH 092/645] Add deployment docs (#127) Signed-off-by: Ketan Umare --- flytectl/docs/source/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 4148e3eb3e..c3b2a58db1 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -122,6 +122,7 @@ Basic Configuration |book-reader| User Guide |chalkboard| Tutorials |project-diagram| Concepts + |rocket| Deployment |book| API Reference |hands-helping| Community From 6a1e06b796e55268c38abce1b8b1497f08682d29 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Fri, 2 Jul 2021 10:10:47 +0530 Subject: [PATCH 093/645] Node executions (#113) Signed-off-by: Prafulla Mahindrakar --- .../subcommand/execution/config_flags.go | 10 +- .../subcommand/execution/config_flags_test.go | 28 ++ .../subcommand/execution/execution_config.go | 8 +- flytectl/cmd/get/execution.go | 31 ++ flytectl/cmd/get/execution_test.go | 23 +- flytectl/cmd/get/node_execution.go | 202 +++++++++++ flytectl/cmd/get/node_execution_test.go | 322 ++++++++++++++++++ flytectl/go.mod | 1 + flytectl/go.sum | 2 + flytectl/pkg/ext/execution_fetcher.go | 33 ++ flytectl/pkg/ext/execution_fetcher_test.go | 29 ++ flytectl/pkg/ext/fetcher.go | 6 + .../ext/mocks/admin_fetcher_ext_interface.go | 82 +++++ 13 files changed, 768 insertions(+), 9 deletions(-) create mode 100644 flytectl/cmd/get/node_execution.go create mode 100644 flytectl/cmd/get/node_execution_test.go diff --git a/flytectl/cmd/config/subcommand/execution/config_flags.go b/flytectl/cmd/config/subcommand/execution/config_flags.go index 5fcc9b332c..467fbd7f6c 100755 --- a/flytectl/cmd/config/subcommand/execution/config_flags.go +++ b/flytectl/cmd/config/subcommand/execution/config_flags.go @@ -50,9 +50,11 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultConfig.Filter.FieldSelector), fmt.Sprintf("%v%v", prefix, "filter.field-selector"), *new(string), "Specifies the Field selector") - cmdFlags.StringVar((&DefaultConfig.Filter.SortBy), fmt.Sprintf("%v%v", prefix, "filter.sort-by"), *new(string), "Specifies which field to sort result by ") - cmdFlags.Int32Var((&DefaultConfig.Filter.Limit), fmt.Sprintf("%v%v", prefix, "filter.limit"), 100, "Specifies the limit") - cmdFlags.BoolVar((&DefaultConfig.Filter.Asc), fmt.Sprintf("%v%v", prefix, "filter.asc"), false, "Specifies the sorting order. By default flytectl sort result in descending order") + cmdFlags.StringVar(&DefaultConfig.Filter.FieldSelector, fmt.Sprintf("%v%v", prefix, "filter.field-selector"), DefaultConfig.Filter.FieldSelector, "Specifies the Field selector") + cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sort-by"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") + cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") + cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") + cmdFlags.BoolVar(&DefaultConfig.Details, fmt.Sprintf("%v%v", prefix, "details"), DefaultConfig.Details, "gets node execution details. Only applicable for single execution name i.e get execution name --details") + cmdFlags.StringVar(&DefaultConfig.NodeID, fmt.Sprintf("%v%v", prefix, "nodeId"), DefaultConfig.NodeID, "get task executions for given node name.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/execution/config_flags_test.go b/flytectl/cmd/config/subcommand/execution/config_flags_test.go index 7be80b6d67..7fbd9e51f7 100755 --- a/flytectl/cmd/config/subcommand/execution/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/execution/config_flags_test.go @@ -155,4 +155,32 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_details", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("details", testValue) + if vBool, err := cmdFlags.GetBool("details"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Details) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_nodeId", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("nodeId", testValue) + if vString, err := cmdFlags.GetString("nodeId"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.NodeID) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/execution/execution_config.go b/flytectl/cmd/config/subcommand/execution/execution_config.go index b0737aee64..a149179908 100644 --- a/flytectl/cmd/config/subcommand/execution/execution_config.go +++ b/flytectl/cmd/config/subcommand/execution/execution_config.go @@ -4,14 +4,16 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" ) -//go:generate pflags Config --default-var DefaultConfig +//go:generate pflags Config --default-var DefaultConfig --bind-default-var var ( DefaultConfig = &Config{ Filter: filters.DefaultFilter, } ) -// Config +// Config stores the flags required by get execution type Config struct { - Filter filters.Filters `json:"filter" pflag:","` + Filter filters.Filters `json:"filter" pflag:","` + Details bool `json:"details" pflag:",gets node execution details. Only applicable for single execution name i.e get execution name --details"` + NodeID string `json:"nodeId" pflag:",get task executions for given node name."` } diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index e7cd122c9c..f547789349 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -9,6 +9,7 @@ import ( "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" + "github.com/golang/protobuf/proto" ) @@ -50,6 +51,31 @@ Retrieves all the execution within project and domain in json format. bin/flytectl get execution -p flytesnacks -d development -o json + +Get more details for the execution using --details flag which shows node executions along with task executions on them. Default view is tree view and TABLE format is not supported on this view + +:: + + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details + +Using yaml view for the details. In this view only node details are available. For task details pass --nodeId flag + +:: + + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml + +Using --nodeId flag to get task executions on a specific node. Use the nodeId attribute from node details view + +:: + + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodId n0 + +Task execution view is also available in yaml/json format. Below example shows yaml + +:: + + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodId n0 -o yaml + Usage ` ) @@ -86,6 +112,11 @@ func getExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Command } executions = append(executions, exec) logger.Infof(ctx, "Retrieved %v executions", len(executions)) + + if execution.DefaultConfig.Details || len(execution.DefaultConfig.NodeID) > 0 { + // Fetching Node execution details + return getExecutionDetails(ctx, config.GetConfig().Project, config.GetConfig().Domain, name, cmdCtx) + } return adminPrinter.Print(config.GetConfig().MustOutputFormat(), executionColumns, ExecutionToProtoMessages(executions)...) } diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go index 87e970231b..bda18d0acf 100644 --- a/flytectl/cmd/get/execution_test.go +++ b/flytectl/cmd/get/execution_test.go @@ -3,17 +3,20 @@ package get import ( "context" "errors" + "fmt" "io" "testing" - "github.com/stretchr/testify/mock" - "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" cmdCore "github.com/flyteorg/flytectl/cmd/core" + u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" ) func TestListExecutionFunc(t *testing.T) { @@ -168,6 +171,22 @@ func TestGetExecutionFunc(t *testing.T) { err := getExecutionFunc(ctx, args, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "GetExecution", ctx, execGetRequest) + +} + +func TestGetExecutionFuncForDetails(t *testing.T) { + setup() + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockClient = u.MockClient + mockFetcherExt := u.FetcherExt + execution.DefaultConfig.Details = true + args := []string{dummyExec} + mockFetcherExt.OnFetchExecutionMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(&admin.Execution{}, nil) + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nil, fmt.Errorf("unable to fetch details")) + err = getExecutionFunc(ctx, args, mockCmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to fetch details"), err) } func TestGetExecutionFuncWithError(t *testing.T) { diff --git a/flytectl/cmd/get/node_execution.go b/flytectl/cmd/get/node_execution.go new file mode 100644 index 0000000000..5d58e39b01 --- /dev/null +++ b/flytectl/cmd/get/node_execution.go @@ -0,0 +1,202 @@ +package get + +import ( + "context" + "fmt" + "sort" + "strconv" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/printer" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" + + "github.com/disiqueira/gotree" + "github.com/golang/protobuf/proto" +) + +var nodeExecutionColumns = []printer.Column{ + {Header: "Name", JSONPath: "$.id.nodeID"}, + {Header: "Exec", JSONPath: "$.id.executionId.name"}, + {Header: "Duration", JSONPath: "$.closure.duration"}, + {Header: "StartedAt", JSONPath: "$.closure.startedAt"}, + {Header: "Phase", JSONPath: "$.closure.phase"}, +} + +var taskExecutionColumns = []printer.Column{ + {Header: "Name", JSONPath: "$.id.taskId.name"}, + {Header: "Node ID", JSONPath: "$.id.nodeExecutionId.nodeID"}, + {Header: "Execution ID", JSONPath: "$.closure.nodeExecutionId.executionId.name"}, + {Header: "Duration", JSONPath: "$.closure.duration"}, + {Header: "StartedAt", JSONPath: "$.closure.startedAt"}, + {Header: "Phase", JSONPath: "$.closure.phase"}, +} + +const ( + taskAttemptPrefix = "Attempt :" + taskExecPrefix = "Task - " + taskTypePrefix = "Task Type - " + taskReasonPrefix = "Reason - " + taskMetadataPrefix = "Metadata" + taskGeneratedNamePrefix = "Generated Name : " + taskPluginIDPrefix = "Plugin Identifier : " + taskExtResourcesPrefix = "External Resources" + taskExtResourcePrefix = "Ext Resource : " + taskExtResourceTokenPrefix = "Ext Resource Token : " //nolint + taskResourcePrefix = "Resource Pool Info" + taskLogsPrefix = "Logs :" + taskLogsNamePrefix = "Name :" + taskLogURIPrefix = "URI :" + hyphenPrefix = " - " +) + +func NodeExecutionToProtoMessages(l []*admin.NodeExecution) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages +} + +func NodeTaskExecutionToProtoMessages(l []*admin.TaskExecution) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages +} + +func getExecutionDetails(ctx context.Context, project, domain, name string, cmdCtx cmdCore.CommandContext) error { + adminPrinter := printer.Printer{} + + // Fetching Node execution details + nExecDetails, nodeExecToTaskExec, err := getNodeExecDetailsWithTasks(ctx, project, domain, name, cmdCtx) + if err != nil { + return err + } + + // o/p format of table is not supported on the details. TODO: Add tree format in printer + if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { + fmt.Println("TABLE format is not supported on detailed view and defaults to tree view. Choose either json/yaml") + if len(execution.DefaultConfig.NodeID) == 0 { + nodeExecTree := createNodeDetailsTreeView(nExecDetails, nodeExecToTaskExec) + if nodeExecTree != nil { + fmt.Println(nodeExecTree.Print()) + } + } else { + nodeTaskExecTree := createNodeTaskExecTreeView(nil, nodeExecToTaskExec[execution.DefaultConfig.NodeID]) + if nodeTaskExecTree != nil { + fmt.Println(nodeTaskExecTree.Print()) + } + } + return nil + } + + if len(execution.DefaultConfig.NodeID) == 0 { + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), nodeExecutionColumns, + NodeExecutionToProtoMessages(nExecDetails)...) + } + + taskExecList := nodeExecToTaskExec[execution.DefaultConfig.NodeID] + if taskExecList != nil { + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), taskExecutionColumns, + NodeTaskExecutionToProtoMessages(taskExecList.TaskExecutions)...) + } + return nil +} + +func getNodeExecDetailsWithTasks(ctx context.Context, project, domain, name string, cmdCtx cmdCore.CommandContext) ( + []*admin.NodeExecution, map[string]*admin.TaskExecutionList, error) { + // Fetching Node execution details + nExecDetails, err := cmdCtx.AdminFetcherExt().FetchNodeExecutionDetails(ctx, name, project, domain) + if err != nil { + return nil, nil, err + } + logger.Infof(ctx, "Retrieved %v node executions", len(nExecDetails.NodeExecutions)) + + // Mapping node execution id to task list + nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} + for _, nodeExec := range nExecDetails.NodeExecutions { + nodeExecToTaskExec[nodeExec.Id.NodeId], err = cmdCtx.AdminFetcherExt().FetchTaskExecutionsOnNode(ctx, + nodeExec.Id.NodeId, name, project, domain) + if err != nil { + return nil, nil, err + } + } + return nExecDetails.NodeExecutions, nodeExecToTaskExec, nil +} + +func createNodeTaskExecTreeView(rootView gotree.Tree, taskExecs *admin.TaskExecutionList) gotree.Tree { + if taskExecs == nil || len(taskExecs.TaskExecutions) == 0 { + return gotree.New("") + } + if rootView == nil { + rootView = gotree.New("") + } + // TODO: Replace this by filter to sort in the admin + sort.Slice(taskExecs.TaskExecutions[:], func(i, j int) bool { + return taskExecs.TaskExecutions[i].Id.RetryAttempt < taskExecs.TaskExecutions[j].Id.RetryAttempt + }) + for _, taskExec := range taskExecs.TaskExecutions { + attemptView := rootView.Add(taskAttemptPrefix + strconv.Itoa(int(taskExec.Id.RetryAttempt))) + attemptView.Add(taskExecPrefix + taskExec.Closure.Phase.String() + + hyphenPrefix + taskExec.Closure.StartedAt.AsTime().String() + + hyphenPrefix + taskExec.Closure.StartedAt.AsTime(). + Add(taskExec.Closure.Duration.AsDuration()).String()) + attemptView.Add(taskTypePrefix + taskExec.Closure.TaskType) + attemptView.Add(taskReasonPrefix + taskExec.Closure.Reason) + if taskExec.Closure.Metadata != nil { + metadata := attemptView.Add(taskMetadataPrefix) + metadata.Add(taskGeneratedNamePrefix + taskExec.Closure.Metadata.GeneratedName) + metadata.Add(taskPluginIDPrefix + taskExec.Closure.Metadata.PluginIdentifier) + extResourcesView := metadata.Add(taskExtResourcesPrefix) + for _, extResource := range taskExec.Closure.Metadata.ExternalResources { + extResourcesView.Add(taskExtResourcePrefix + extResource.ExternalId) + } + resourcePoolInfoView := metadata.Add(taskResourcePrefix) + for _, rsPool := range taskExec.Closure.Metadata.ResourcePoolInfo { + resourcePoolInfoView.Add(taskExtResourcePrefix + rsPool.Namespace) + resourcePoolInfoView.Add(taskExtResourceTokenPrefix + rsPool.AllocationToken) + } + } + + sort.Slice(taskExec.Closure.Logs[:], func(i, j int) bool { + return taskExec.Closure.Logs[i].Name < taskExec.Closure.Logs[j].Name + }) + + logsView := attemptView.Add(taskLogsPrefix) + for _, logData := range taskExec.Closure.Logs { + logsView.Add(taskLogsNamePrefix + logData.Name) + logsView.Add(taskLogURIPrefix + logData.Uri) + } + } + + return rootView +} + +func createNodeDetailsTreeView(nodeExecutions []*admin.NodeExecution, nodeExecToTaskExec map[string]*admin.TaskExecutionList) gotree.Tree { + nodeDetailsTreeView := gotree.New("") + if nodeExecutions == nil || nodeExecToTaskExec == nil { + return nodeDetailsTreeView + } + // TODO : Move to sorting using filters. + sort.Slice(nodeExecutions[:], func(i, j int) bool { + // TODO : Remove this after fixing the StartedAt and Duration field not being populated for start-node and end-node in Admin + if nodeExecutions[i].Closure.StartedAt == nil || nodeExecutions[j].Closure.StartedAt == nil { + return true + } + return nodeExecutions[i].Closure.StartedAt.Nanos < nodeExecutions[j].Closure.StartedAt.Nanos + }) + + for _, nodeExec := range nodeExecutions { + nExecView := nodeDetailsTreeView.Add(nodeExec.Id.NodeId + hyphenPrefix + nodeExec.Closure.Phase.String() + + hyphenPrefix + nodeExec.Closure.StartedAt.AsTime().String() + + hyphenPrefix + nodeExec.Closure.StartedAt.AsTime(). + Add(nodeExec.Closure.Duration.AsDuration()).String()) + taskExecs := nodeExecToTaskExec[nodeExec.Id.NodeId] + createNodeTaskExecTreeView(nExecView, taskExecs) + } + return nodeDetailsTreeView +} diff --git a/flytectl/cmd/get/node_execution_test.go b/flytectl/cmd/get/node_execution_test.go new file mode 100644 index 0000000000..e01325240e --- /dev/null +++ b/flytectl/cmd/get/node_execution_test.go @@ -0,0 +1,322 @@ +package get + +import ( + "fmt" + "testing" + "time" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/event" + + "github.com/disiqueira/gotree" + "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/types/known/durationpb" + "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + dummyProject = "dummyProject" + dummyDomain = "dummyDomain" + dummyExec = "dummyExec" +) + +func TestCreateNodeDetailsTreeView(t *testing.T) { + + t.Run("empty node execution", func(t *testing.T) { + var nodeExecutions []*admin.NodeExecution + var nodeExecToTaskExec map[string]*admin.TaskExecutionList + expectedRoot := gotree.New("") + treeRoot := createNodeDetailsTreeView(nodeExecutions, nodeExecToTaskExec) + assert.Equal(t, expectedRoot, treeRoot) + }) + + t.Run("successful simple node execution full view", func(t *testing.T) { + nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} + + nodeExec1 := createDummyNodeWithID("start-node", true) + taskExec11 := createDummyTaskExecutionForNode("start-node", "task11") + taskExec12 := createDummyTaskExecutionForNode("start-node", "task12") + + nodeExecToTaskExec["start-node"] = &admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec11, taskExec12}, + } + + nodeExec2 := createDummyNodeWithID("n0", false) + taskExec21 := createDummyTaskExecutionForNode("n0", "task21") + taskExec22 := createDummyTaskExecutionForNode("n0", "task22") + + nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec21, taskExec22}, + } + + nodeExec3 := createDummyNodeWithID("n1", false) + taskExec31 := createDummyTaskExecutionForNode("n1", "task31") + taskExec32 := createDummyTaskExecutionForNode("n1", "task32") + + nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec31, taskExec32}, + } + + nodeExecutions := []*admin.NodeExecution{nodeExec1, nodeExec2, nodeExec3} + + treeRoot := createNodeDetailsTreeView(nodeExecutions, nodeExecToTaskExec) + + assert.Equal(t, 3, len(treeRoot.Items())) + }) + + t.Run("empty task execution only view", func(t *testing.T) { + taskExecutionList := &admin.TaskExecutionList{} + treeRoot := createNodeTaskExecTreeView(nil, taskExecutionList) + assert.Equal(t, 0, len(treeRoot.Items())) + }) + + t.Run("successful task execution only view", func(t *testing.T) { + taskExec31 := createDummyTaskExecutionForNode("n1", "task31") + taskExec32 := createDummyTaskExecutionForNode("n1", "task32") + + taskExecutionList := &admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec31, taskExec32}, + } + + treeRoot := createNodeTaskExecTreeView(nil, taskExecutionList) + assert.Equal(t, 2, len(treeRoot.Items())) + }) +} + +func createDummyNodeWithID(nodeID string, startedAtEmpty bool) *admin.NodeExecution { + // Remove this param startedAtEmpty and code once admin code is fixed + startedAt := timestamppb.Now() + if startedAtEmpty { + startedAt = nil + } + + nodeExecution := &admin.NodeExecution{ + Id: &core.NodeExecutionIdentifier{ + NodeId: nodeID, + ExecutionId: &core.WorkflowExecutionIdentifier{ + Project: dummyProject, + Domain: dummyDomain, + Name: dummyExec, + }, + }, + InputUri: nodeID + "inputUri", + Closure: &admin.NodeExecutionClosure{ + OutputResult: &admin.NodeExecutionClosure_OutputUri{ + OutputUri: nodeID + "outputUri", + }, + Phase: core.NodeExecution_SUCCEEDED, + StartedAt: startedAt, + Duration: &durationpb.Duration{Seconds: 100}, + CreatedAt: timestamppb.Now(), + UpdatedAt: timestamppb.Now(), + TargetMetadata: &admin.NodeExecutionClosure_WorkflowNodeMetadata{ + WorkflowNodeMetadata: &admin.WorkflowNodeMetadata{ + ExecutionId: &core.WorkflowExecutionIdentifier{ + Project: dummyProject, + Domain: dummyDomain, + Name: dummyExec, + }, + }, + }, + }, + } + return nodeExecution +} + +func createDummyTaskExecutionForNode(nodeID string, taskID string) *admin.TaskExecution { + taskLog1 := &core.TaskLog{ + Uri: nodeID + taskID + "logUri1", + Name: nodeID + taskID + "logName1", + MessageFormat: core.TaskLog_JSON, + Ttl: &durationpb.Duration{Seconds: 100}, + } + + taskLog2 := &core.TaskLog{ + Uri: nodeID + taskID + "logUri2", + Name: nodeID + taskID + "logName2", + MessageFormat: core.TaskLog_JSON, + Ttl: &durationpb.Duration{Seconds: 100}, + } + + taskLogs := []*core.TaskLog{taskLog1, taskLog2} + + extResourceInfo := &event.ExternalResourceInfo{ + ExternalId: nodeID + taskID + "externalId", + } + extResourceInfos := []*event.ExternalResourceInfo{extResourceInfo} + + resourcePoolInfo := &event.ResourcePoolInfo{ + AllocationToken: nodeID + taskID + "allocationToken", + Namespace: nodeID + taskID + "namespace", + } + resourcePoolInfos := []*event.ResourcePoolInfo{resourcePoolInfo} + + taskExec := &admin.TaskExecution{ + Id: &core.TaskExecutionIdentifier{ + TaskId: &core.Identifier{ + Project: dummyProject, + Domain: dummyDomain, + Name: dummyExec, + ResourceType: core.ResourceType_TASK, + }, + }, + InputUri: nodeID + taskID + "inputUrlForTask", + Closure: &admin.TaskExecutionClosure{ + OutputResult: &admin.TaskExecutionClosure_OutputUri{ + OutputUri: nodeID + taskID + "outputUri-task", + }, + Phase: core.TaskExecution_SUCCEEDED, + Logs: taskLogs, + StartedAt: timestamppb.Now(), + Duration: &durationpb.Duration{Seconds: 100}, + CreatedAt: timestamppb.Now(), + UpdatedAt: timestamppb.New(time.Now()), + Reason: nodeID + taskID + "reason", + TaskType: nodeID + taskID + "taskType", + Metadata: &event.TaskExecutionMetadata{ + GeneratedName: nodeID + taskID + "generatedName", + ExternalResources: extResourceInfos, + ResourcePoolInfo: resourcePoolInfos, + PluginIdentifier: nodeID + taskID + "pluginId", + }, + }, + } + return taskExec +} + +func TestGetExecutionDetails(t *testing.T) { + t.Run("successful get details default view", func(t *testing.T) { + setup() + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockFetcherExt := u.FetcherExt + nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} + + nodeExec1 := createDummyNodeWithID("n0", false) + taskExec1 := createDummyTaskExecutionForNode("n0", "task21") + taskExec2 := createDummyTaskExecutionForNode("n0", "task22") + + nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + } + + nodeExecutions := []*admin.NodeExecution{nodeExec1} + nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} + + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(nodeExecToTaskExec["n0"], nil) + + err = getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, mockCmdCtx) + assert.Nil(t, err) + }) + + t.Run("failure node details fetch", func(t *testing.T) { + setup() + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockFetcherExt := u.FetcherExt + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nil, fmt.Errorf("unable to fetch details")) + err = getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, mockCmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to fetch details"), err) + }) + + t.Run("failure task exec fetch", func(t *testing.T) { + setup() + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockFetcherExt := u.FetcherExt + nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} + + nodeExec1 := createDummyNodeWithID("n0", false) + taskExec1 := createDummyTaskExecutionForNode("n0", "task21") + taskExec2 := createDummyTaskExecutionForNode("n0", "task22") + + nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + } + + nodeExecutions := []*admin.NodeExecution{nodeExec1} + nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} + + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(nil, fmt.Errorf("unable to fetch task exec details")) + err = getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, mockCmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to fetch task exec details"), err) + }) + + t.Run("successful get details non default view", func(t *testing.T) { + setup() + config.GetConfig().Output = "table" + execution.DefaultConfig.NodeID = "n0" + + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockFetcherExt := u.FetcherExt + nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} + + nodeExec1 := createDummyNodeWithID("n0", false) + taskExec1 := createDummyTaskExecutionForNode("n0", "task21") + taskExec2 := createDummyTaskExecutionForNode("n0", "task22") + + nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + } + + nodeExecutions := []*admin.NodeExecution{nodeExec1} + nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} + + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(nodeExecToTaskExec["n0"], nil) + + err = getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, mockCmdCtx) + assert.Nil(t, err) + }) + + t.Run("Table test successful cases", func(t *testing.T) { + tests := []struct { + outputFormat string + nodeID string + want error + }{ + {outputFormat: "table", nodeID: "", want: nil}, + {outputFormat: "table", nodeID: "n0", want: nil}, + {outputFormat: "yaml", nodeID: "", want: nil}, + {outputFormat: "yaml", nodeID: "n0", want: nil}, + {outputFormat: "yaml", nodeID: "n1", want: nil}, + } + + for _, tt := range tests { + setup() + config.GetConfig().Output = tt.outputFormat + execution.DefaultConfig.NodeID = tt.nodeID + + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockFetcherExt := u.FetcherExt + nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} + + nodeExec1 := createDummyNodeWithID("n0", false) + taskExec1 := createDummyTaskExecutionForNode("n0", "task21") + taskExec2 := createDummyTaskExecutionForNode("n0", "task22") + + nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + } + + nodeExecutions := []*admin.NodeExecution{nodeExec1} + nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} + + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(nodeExecToTaskExec["n0"], nil) + + got := getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, mockCmdCtx) + assert.Equal(t, tt.want, got) + } + }) +} diff --git a/flytectl/go.mod b/flytectl/go.mod index 67218d1ca6..e32bd02bf7 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -6,6 +6,7 @@ require ( github.com/Microsoft/go-winio v0.5.0 // indirect github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/containerd/containerd v1.5.2 // indirect + github.com/disiqueira/gotree v1.0.0 github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 9708005305..03fa6c149d 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -292,6 +292,8 @@ github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8l github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/disiqueira/gotree v1.0.0 h1:en5wk87n7/Jyk6gVME3cx3xN9KmUCstJ1IjHr4Se4To= +github.com/disiqueira/gotree v1.0.0/go.mod h1:7CwL+VWsWAU95DovkdRZAtA7YbtHwGk+tLV/kNi8niU= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= diff --git a/flytectl/pkg/ext/execution_fetcher.go b/flytectl/pkg/ext/execution_fetcher.go index 4e30a708bb..47535cc1e3 100644 --- a/flytectl/pkg/ext/execution_fetcher.go +++ b/flytectl/pkg/ext/execution_fetcher.go @@ -23,6 +23,39 @@ func (a *AdminFetcherExtClient) FetchExecution(ctx context.Context, name, projec return e, nil } +func (a *AdminFetcherExtClient) FetchNodeExecutionDetails(ctx context.Context, name, project, domain string) (*admin.NodeExecutionList, error) { + ne, err := a.AdminServiceClient().ListNodeExecutions(ctx, &admin.NodeExecutionListRequest{ + WorkflowExecutionId: &core.WorkflowExecutionIdentifier{ + Project: project, + Domain: domain, + Name: name, + }, + Limit: 100, + }) + if err != nil { + return nil, err + } + return ne, nil +} + +func (a *AdminFetcherExtClient) FetchTaskExecutionsOnNode(ctx context.Context, nodeID, execName, project, domain string) (*admin.TaskExecutionList, error) { + te, err := a.AdminServiceClient().ListTaskExecutions(ctx, &admin.TaskExecutionListRequest{ + NodeExecutionId: &core.NodeExecutionIdentifier{ + NodeId: nodeID, + ExecutionId: &core.WorkflowExecutionIdentifier{ + Project: project, + Domain: domain, + Name: execName, + }, + }, + Limit: 100, + }) + if err != nil { + return nil, err + } + return te, nil +} + func (a *AdminFetcherExtClient) ListExecution(ctx context.Context, project, domain string, filter filters.Filters) (*admin.ExecutionList, error) { transformFilters, err := filters.BuildResourceListRequestWithName(filter, project, domain, "") if err != nil { diff --git a/flytectl/pkg/ext/execution_fetcher_test.go b/flytectl/pkg/ext/execution_fetcher_test.go index add301a6da..98da15871d 100644 --- a/flytectl/pkg/ext/execution_fetcher_test.go +++ b/flytectl/pkg/ext/execution_fetcher_test.go @@ -8,6 +8,7 @@ import ( "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) @@ -66,3 +67,31 @@ func TestFetchExecutionError(t *testing.T) { _, err := adminFetcherExt.FetchExecution(ctx, "execName", "dummyProject", "domainValue") assert.Equal(t, fmt.Errorf("failed"), err) } + +func TestFetchNodeExecutionDetails(t *testing.T) { + getExecutionFetcherSetup() + adminClient.OnListNodeExecutionsMatch(mock.Anything, mock.Anything).Return(&admin.NodeExecutionList{}, nil) + _, err := adminFetcherExt.FetchNodeExecutionDetails(ctx, "execName", "dummyProject", "domainValue") + assert.Nil(t, err) +} + +func TestFetchNodeExecutionDetailsError(t *testing.T) { + getExecutionFetcherSetup() + adminClient.OnListNodeExecutionsMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchNodeExecutionDetails(ctx, "execName", "dummyProject", "domainValue") + assert.Equal(t, fmt.Errorf("failed"), err) +} + +func TestFetchTaskExecOnNode(t *testing.T) { + getExecutionFetcherSetup() + adminClient.OnListTaskExecutionsMatch(mock.Anything, mock.Anything).Return(&admin.TaskExecutionList{}, nil) + _, err := adminFetcherExt.FetchTaskExecutionsOnNode(ctx, "nodeId", "execName", "dummyProject", "domainValue") + assert.Nil(t, err) +} + +func TestFetchTaskExecOnNodeError(t *testing.T) { + getExecutionFetcherSetup() + adminClient.OnListTaskExecutionsMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchTaskExecutionsOnNode(ctx, "nodeId", "execName", "dummyProject", "domainValue") + assert.Equal(t, fmt.Errorf("failed"), err) +} diff --git a/flytectl/pkg/ext/fetcher.go b/flytectl/pkg/ext/fetcher.go index 83a4753401..118e889e07 100644 --- a/flytectl/pkg/ext/fetcher.go +++ b/flytectl/pkg/ext/fetcher.go @@ -19,6 +19,12 @@ type AdminFetcherExtInterface interface { // FetchExecution fetches the execution based on name, project, domain FetchExecution(ctx context.Context, name, project, domain string) (*admin.Execution, error) + // FetchNodeExecutionDetails fetches the node execution details based on execution name, project, domain + FetchNodeExecutionDetails(ctx context.Context, name, project, domain string) (*admin.NodeExecutionList, error) + + // FetchTaskExecutionsOnNode fetches task execution on a node , for give execution name, project, domain + FetchTaskExecutionsOnNode(ctx context.Context, nodeID, execName, project, domain string) (*admin.TaskExecutionList, error) + // ListExecution fetches the all versions of based on name, project, domain ListExecution(ctx context.Context, project, domain string, filter filters.Filters) (*admin.ExecutionList, error) diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index 23b64e3696..6932ee5c1b 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -299,6 +299,47 @@ func (_m *AdminFetcherExtInterface) FetchLPVersion(ctx context.Context, name str return r0, r1 } +type AdminFetcherExtInterface_FetchNodeExecutionDetails struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchNodeExecutionDetails) Return(_a0 *admin.NodeExecutionList, _a1 error) *AdminFetcherExtInterface_FetchNodeExecutionDetails { + return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchNodeExecutionDetails { + c := _m.On("FetchNodeExecutionDetails", ctx, name, project, domain) + return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDetailsMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchNodeExecutionDetails { + c := _m.On("FetchNodeExecutionDetails", matchers...) + return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: c} +} + +// FetchNodeExecutionDetails provides a mock function with given fields: ctx, name, project, domain +func (_m *AdminFetcherExtInterface) FetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string) (*admin.NodeExecutionList, error) { + ret := _m.Called(ctx, name, project, domain) + + var r0 *admin.NodeExecutionList + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.NodeExecutionList); ok { + r0 = rf(ctx, name, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.NodeExecutionList) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type AdminFetcherExtInterface_FetchProjectDomainAttributes struct { *mock.Call } @@ -340,6 +381,47 @@ func (_m *AdminFetcherExtInterface) FetchProjectDomainAttributes(ctx context.Con return r0, r1 } +type AdminFetcherExtInterface_FetchTaskExecutionsOnNode struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchTaskExecutionsOnNode) Return(_a0 *admin.TaskExecutionList, _a1 error) *AdminFetcherExtInterface_FetchTaskExecutionsOnNode { + return &AdminFetcherExtInterface_FetchTaskExecutionsOnNode{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchTaskExecutionsOnNode(ctx context.Context, nodeId string, execName string, project string, domain string) *AdminFetcherExtInterface_FetchTaskExecutionsOnNode { + c := _m.On("FetchTaskExecutionsOnNode", ctx, nodeId, execName, project, domain) + return &AdminFetcherExtInterface_FetchTaskExecutionsOnNode{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchTaskExecutionsOnNodeMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchTaskExecutionsOnNode { + c := _m.On("FetchTaskExecutionsOnNode", matchers...) + return &AdminFetcherExtInterface_FetchTaskExecutionsOnNode{Call: c} +} + +// FetchTaskExecutionsOnNode provides a mock function with given fields: ctx, nodeId, execName, project, domain +func (_m *AdminFetcherExtInterface) FetchTaskExecutionsOnNode(ctx context.Context, nodeId string, execName string, project string, domain string) (*admin.TaskExecutionList, error) { + ret := _m.Called(ctx, nodeId, execName, project, domain) + + var r0 *admin.TaskExecutionList + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) *admin.TaskExecutionList); ok { + r0 = rf(ctx, nodeId, execName, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.TaskExecutionList) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { + r1 = rf(ctx, nodeId, execName, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type AdminFetcherExtInterface_FetchTaskLatestVersion struct { *mock.Call } From cf69eafaa3c3cb5a4291d696bb8a37e7fce401c9 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Fri, 2 Jul 2021 13:56:56 -0700 Subject: [PATCH 094/645] Update documentation (#128) Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- .../source/gen/flytectl_get_execution.rst | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 77249157ce..174ba88661 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -45,6 +45,31 @@ Retrieves all the execution within project and domain in json format. bin/flytectl get execution -p flytesnacks -d development -o json + +Get more details for the execution using --details flag which shows node executions along with task executions on them. Default view is tree view and TABLE format is not supported on this view + +:: + + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details + +Using yaml view for the details. In this view only node details are available. For task details pass --nodeId flag + +:: + + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml + +Using --nodeId flag to get task executions on a specific node. Use the nodeId attribute from node details view + +:: + + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodId n0 + +Task execution view is also available in yaml/json format. Below example shows yaml + +:: + + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodId n0 -o yaml + Usage @@ -57,11 +82,13 @@ Options :: + --details gets node execution details. Only applicable for single execution name i.e get execution name --details --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.field-selector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort result by + --filter.sort-by string Specifies which field to sort results (default "created_at") -h, --help help for execution + --nodeId string get task executions for given node name. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From dafa5d7f2e9377b851593281dedbf3ac039a4c59 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Sat, 3 Jul 2021 06:07:22 +0530 Subject: [PATCH 095/645] Changing the default log level which is used by sandbox (#129) --- flytectl/config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flytectl/config.yaml b/flytectl/config.yaml index b3710406ef..82b0ed8704 100644 --- a/flytectl/config.yaml +++ b/flytectl/config.yaml @@ -4,7 +4,7 @@ admin: insecure: true logger: show-source: true - level: 3 + level: 0 storage: connection: access-key: minio @@ -15,4 +15,4 @@ storage: secret-key: miniostorage type: minio container: "my-s3-bucket" - enable-multicontainer: true \ No newline at end of file + enable-multicontainer: true From a2ac19f64d6ea984b151c086002a834eab262ba4 Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Sat, 3 Jul 2021 15:37:10 +0530 Subject: [PATCH 096/645] algolia search (#130) Signed-off-by: Samhita Alla --- flytectl/doc-requirements.in | 1 - flytectl/doc-requirements.txt | 8 +++----- flytectl/docs/source/conf.py | 1 - 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in index 42d006319a..3982ec86e6 100644 --- a/flytectl/doc-requirements.in +++ b/flytectl/doc-requirements.in @@ -1,5 +1,4 @@ git+git://github.com/flyteorg/furo@main -readthedocs-sphinx-search sphinx sphinx-prompt sphinx-material diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index cd582290d0..aabe778a3d 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -13,7 +13,7 @@ beautifulsoup4==4.9.3 # furo # sphinx-code-include # sphinx-material -certifi==2020.12.5 +certifi==2021.5.30 # via requests chardet==4.0.0 # via requests @@ -48,8 +48,6 @@ python-slugify[unidecode]==5.0.2 # via sphinx-material pytz==2021.1 # via babel -readthedocs-sphinx-search==0.1.0 - # via -r doc-requirements.in requests==2.25.1 # via sphinx six==1.16.0 @@ -70,7 +68,7 @@ sphinx==3.5.4 # sphinx-tabs sphinx-code-include==1.1.1 # via -r doc-requirements.in -sphinx-copybutton==0.3.1 +sphinx-copybutton==0.3.3 # via -r doc-requirements.in sphinx-fontawesome==0.0.6 # via -r doc-requirements.in @@ -96,7 +94,7 @@ text-unidecode==1.3 # via python-slugify unidecode==1.2.0 # via python-slugify -urllib3==1.26.4 +urllib3==1.26.6 # via requests # The following packages are considered to be unsafe in a requirements file: diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 3b8bfae9ab..b429faea57 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -41,7 +41,6 @@ "sphinx.ext.coverage", "sphinx-prompt", "sphinx_copybutton", - "sphinx_search.extension", "sphinx_fontawesome", "sphinx_tabs.tabs", ] From a87e20be8469e1bdea0e2e690bd988c9cf8c082e Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Sun, 4 Jul 2021 22:08:16 -0700 Subject: [PATCH 097/645] Update Flyteidl version (#114) Signed-off-by: Flyte-Bot Co-authored-by: flyte-bot --- flytectl/go.mod | 2 +- flytectl/go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index e32bd02bf7..67f26af2a7 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -10,7 +10,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.19.8 + github.com/flyteorg/flyteidl v0.19.9 github.com/flyteorg/flytestdlib v0.3.24 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 diff --git a/flytectl/go.sum b/flytectl/go.sum index 03fa6c149d..b5433777b6 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -341,6 +341,8 @@ github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v0.19.8 h1:jWWIEnFMgJCZm/XK25Xts4+kQhoOrd5dWgLj/fLsbIg= github.com/flyteorg/flyteidl v0.19.8/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.19.9 h1:1j4/YbV/G1m2hrK017F9K0JYZYxCCwf4qtEkiNnUiEw= +github.com/flyteorg/flyteidl v0.19.9/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.24 h1:Eu5TMKch9ihOavPKufgTBI677eVYjJpOAPPg9hfZIzU= github.com/flyteorg/flytestdlib v0.3.24/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= From b5d78aa97eb81b4e55f30f2061bcf65caa8740be Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 5 Jul 2021 13:15:34 +0530 Subject: [PATCH 098/645] #minor Documentation fix and refactoring in sandbox (#131) * Documentation fix Signed-off-by: Yuvraj --- flytectl/.github/PULL_REQUEST_TEMPLATE.md | 28 +++++++----- flytectl/cmd/sandbox/exec.go | 4 +- flytectl/cmd/sandbox/sandbox.go | 19 ++++++-- flytectl/cmd/sandbox/sandbox_test.go | 2 +- flytectl/cmd/sandbox/start.go | 12 ++--- flytectl/cmd/sandbox/start_test.go | 53 ++++++++++++++++++++--- flytectl/cmd/sandbox/teardown.go | 2 +- flytectl/pkg/docker/docker_util.go | 4 +- 8 files changed, 92 insertions(+), 32 deletions(-) diff --git a/flytectl/.github/PULL_REQUEST_TEMPLATE.md b/flytectl/.github/PULL_REQUEST_TEMPLATE.md index d2becf38b7..97321913f9 100644 --- a/flytectl/.github/PULL_REQUEST_TEMPLATE.md +++ b/flytectl/.github/PULL_REQUEST_TEMPLATE.md @@ -1,26 +1,32 @@ +## Read then delete + +- Make sure to use a concise title for the pull-request. +- Use #patch, #minor #majora or #none in the pull-request title to bump the corresponding version. Otherwise, the patch version + will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump) + # TL;DR _Please replace this text with a description of what this PR accomplishes._ ## Type - - [ ] Bug Fix - - [ ] Feature - - [ ] Plugin +- [ ] Bug Fix +- [ ] Feature +- [ ] Plugin ## Are all requirements met? - - [ ] Code completed - - [ ] Smoke tested - - [ ] Unit tests added - - [ ] Code documentation added - - [ ] Any pending items have an associated Issue +- [ ] Code completed +- [ ] Smoke tested +- [ ] Unit tests added +- [ ] Code documentation added +- [ ] Any pending items have an associated Issue ## Complete description - _How did you fix the bug, make the feature etc. Link to any design docs etc_ +_How did you fix the bug, make the feature etc. Link to any design docs etc_ ## Tracking Issue -https://github.com/lyft/flyte/issues/ +https://github.com/flyteorg/flyte/issues/ ## Follow-up issue _NA_ OR -_https://github.com/lyft/flyte/issues/_ +_https://github.com/flyteorg/flyte/issues/_ diff --git a/flytectl/cmd/sandbox/exec.go b/flytectl/cmd/sandbox/exec.go index 804d54b6c6..63a17e8884 100644 --- a/flytectl/cmd/sandbox/exec.go +++ b/flytectl/cmd/sandbox/exec.go @@ -9,9 +9,9 @@ import ( ) const ( - execShort = "Execute any command in sandbox" + execShort = "Execute non-interactive command inside the sandbox container" execLong = ` -Execute command will Will run non-interactive commands and return immediately with the output. +Execute command will run non-interactive command inside the sandbox container and return immediately with the output.By default flytectl exec in /root directory inside the sandbox container :: bin/flytectl sandbox exec -- ls -al diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go index 233f4f0eba..9be32bbba4 100644 --- a/flytectl/cmd/sandbox/sandbox.go +++ b/flytectl/cmd/sandbox/sandbox.go @@ -8,18 +8,31 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - sandboxShort = `Used for testing flyte sandbox.` + sandboxShort = `Used for sandbox interactions like start/teardown/status/exec.` sandboxLong = ` -Example Create sandbox cluster. +The Flyte Sandbox is a fully standalone minimal environment for running Flyte. provides a simplified way of running flyte-sandbox as a single Docker container running locally. + +Create sandbox cluster. :: bin/flytectl sandbox start -Example Remove sandbox cluster. +Remove sandbox cluster. :: bin/flytectl sandbox teardown + + +Check status of sandbox container. +:: + + bin/flytectl sandbox status + +Execute command inside sandbox container. +:: + + bin/flytectl sandbox exec -- pwd ` ) diff --git a/flytectl/cmd/sandbox/sandbox_test.go b/flytectl/cmd/sandbox/sandbox_test.go index 640390c137..ee615c08ce 100644 --- a/flytectl/cmd/sandbox/sandbox_test.go +++ b/flytectl/cmd/sandbox/sandbox_test.go @@ -11,7 +11,7 @@ import ( func TestCreateSandboxCommand(t *testing.T) { sandboxCommand := CreateSandboxCommand() assert.Equal(t, sandboxCommand.Use, "sandbox") - assert.Equal(t, sandboxCommand.Short, "Used for testing flyte sandbox.") + assert.Equal(t, sandboxCommand.Short, "Used for sandbox interactions like start/teardown/status/exec.") fmt.Println(sandboxCommand.Commands()) assert.Equal(t, len(sandboxCommand.Commands()), 4) cmdNouns := sandboxCommand.Commands() diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 6a78d639e4..5853ee5060 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -17,17 +17,19 @@ import ( ) const ( - startShort = "Start the flyte sandbox" + startShort = "Start the flyte sandbox cluster" startLong = ` -Start will run the flyte sandbox cluster inside a docker container and setup the config that is required +The Flyte Sandbox is a fully standalone minimal environment for running Flyte. provides a simplified way of running flyte-sandbox as a single Docker container running locally. + +Start sandbox cluster without any source code :: bin/flytectl sandbox start -Mount your flytesnacks repository code inside sandbox +Mount your source code repository inside sandbox :: - bin/flytectl sandbox start --sourcesPath=$HOME/flyteorg/flytesnacks + bin/flytectl sandbox start --source=$HOME/flyteorg/flytesnacks Usage ` @@ -75,7 +77,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu docker.Volumes = append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, Source: source, - Target: docker.FlyteSnackDir, + Target: docker.Source, }) } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index a0bef27c8d..042860ed60 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -6,6 +6,7 @@ import ( "io" "io/ioutil" "os" + "path/filepath" "strings" "testing" @@ -56,7 +57,7 @@ func TestStartSandboxFunc(t *testing.T) { _, err := startSandbox(ctx, mockDocker, os.Stdin) assert.Nil(t, err) }) - t.Run("Successfully run sandbox cluster with flytesnacks", func(t *testing.T) { + t.Run("Successfully run sandbox cluster with source code", func(t *testing.T) { ctx := context.Background() errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) @@ -65,7 +66,7 @@ func TestStartSandboxFunc(t *testing.T) { volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, - Target: docker.FlyteSnackDir, + Target: docker.Source, }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -92,6 +93,44 @@ func TestStartSandboxFunc(t *testing.T) { _, err := startSandbox(ctx, mockDocker, os.Stdin) assert.Nil(t, err) }) + t.Run("Successfully run sandbox cluster with abs path of source code", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Source = "../" + absPath, err := filepath.Abs(sandboxConfig.DefaultConfig.Source) + assert.Nil(t, err) + volumes := append(docker.Volumes, mount.Mount{ + Type: mount.TypeBind, + Source: absPath, + Target: docker.Source, + }) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startSandbox(ctx, mockDocker, os.Stdin) + assert.Nil(t, err) + }) t.Run("Error in pulling image", func(t *testing.T) { ctx := context.Background() errCh := make(chan error) @@ -101,7 +140,7 @@ func TestStartSandboxFunc(t *testing.T) { volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, - Target: docker.FlyteSnackDir, + Target: docker.Source, }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -137,7 +176,7 @@ func TestStartSandboxFunc(t *testing.T) { volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, - Target: docker.FlyteSnackDir, + Target: docker.Source, }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -181,7 +220,7 @@ func TestStartSandboxFunc(t *testing.T) { volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, - Target: docker.FlyteSnackDir, + Target: docker.Source, }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -217,7 +256,7 @@ func TestStartSandboxFunc(t *testing.T) { volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, - Target: docker.FlyteSnackDir, + Target: docker.Source, }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -253,7 +292,7 @@ func TestStartSandboxFunc(t *testing.T) { volumes := append(docker.Volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, - Target: docker.FlyteSnackDir, + Target: docker.Source, }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index 9d05a2581b..1c9e634351 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -15,7 +15,7 @@ import ( const ( teardownShort = "Teardown will cleanup the sandbox environment" teardownLong = ` -Teardown will remove docker container and all the flyte config +Teardown will remove sandbox cluster and all the flyte config created by sandbox start :: bin/flytectl sandbox teardown diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 03e220879f..c1b39bd182 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -30,7 +30,7 @@ var ( ImageName = "cr.flyte.org/flyteorg/flyte-sandbox:dind" FlyteSandboxClusterName = "flyte-sandbox" Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} - FlyteSnackDir = "/usr/src" + Source = "/root" K3sDir = "/etc/rancher/" Client Docker Volumes = []mount.Mount{ @@ -43,7 +43,7 @@ var ( ExecConfig = types.ExecConfig{ AttachStderr: true, Tty: true, - WorkingDir: FlyteSnackDir, + WorkingDir: Source, AttachStdout: true, Cmd: []string{}, } From 5c7133784a18ffbd3d67b4c9ef4e5320fa624f88 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 5 Jul 2021 16:58:39 +0530 Subject: [PATCH 099/645] Added separate release workflow for releasing the binary (#132) * Divide release workflow Signed-off-by: Yuvraj --- flytectl/.github/workflows/master.yml | 42 ++------------------------ flytectl/.github/workflows/release.yml | 23 ++++++++++++++ 2 files changed, 25 insertions(+), 40 deletions(-) create mode 100644 flytectl/.github/workflows/release.yml diff --git a/flytectl/.github/workflows/master.yml b/flytectl/.github/workflows/master.yml index 3e21b83bd7..320f92c4ce 100644 --- a/flytectl/.github/workflows/master.yml +++ b/flytectl/.github/workflows/master.yml @@ -1,4 +1,4 @@ -name: Master +name: Bump Version on: push: @@ -22,42 +22,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} WITH_V: true - DEFAULT_BUMP: patch - - goreleaser: - name: Release flytectl - runs-on: ubuntu-latest - needs: [ bump-version ] - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - fetch-depth: "0" - - name: Run GoReleaser dry run - uses: goreleaser/goreleaser-action@v2 - with: - version: latest - args: release --rm-dist - env: - GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} - - test: - name: Run tests and lint - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - fetch-depth: "0" - - name: Unit Tests - uses: cedrickring/golang-action@1.5.2 - env: - GO111MODULE: "on" - with: - args: make install && make test_unit_codecov - - name: Lint - uses: cedrickring/golang-action@1.5.2 - env: - GO111MODULE: "on" - with: - args: make install && make lint \ No newline at end of file + DEFAULT_BUMP: patch \ No newline at end of file diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml new file mode 100644 index 0000000000..1e4c78aa08 --- /dev/null +++ b/flytectl/.github/workflows/release.yml @@ -0,0 +1,23 @@ +name: Release Flytectl + +on: + push: + tags: + - 'v*' + +jobs: + releaser: + name: Release flytectl + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: "0" + - name: Run GoReleaser dry run + uses: goreleaser/goreleaser-action@v2 + with: + version: latest + args: release --rm-dist + env: + GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} From bb6225539e920fcb262ca44ba1d452e990c0e511 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Thu, 8 Jul 2021 16:45:44 -0700 Subject: [PATCH 100/645] Update documentation (#133) Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- flytectl/docs/source/gen/flytectl.rst | 2 +- flytectl/docs/source/gen/flytectl_sandbox.rst | 23 +++++++++++++++---- .../docs/source/gen/flytectl_sandbox_exec.rst | 6 ++--- .../source/gen/flytectl_sandbox_start.rst | 12 ++++++---- .../source/gen/flytectl_sandbox_status.rst | 2 +- .../source/gen/flytectl_sandbox_teardown.rst | 4 ++-- 6 files changed, 32 insertions(+), 17 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index a2317e1182..e11b06d619 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -31,7 +31,7 @@ SEE ALSO * :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. -* :doc:`flytectl_sandbox` - Used for testing flyte sandbox. +* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. * :doc:`flytectl_update` - Used for updating flyte resources eg: project. * :doc:`flytectl_version` - Used for fetching flyte version diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 6c0e229781..313bbf85b2 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -3,23 +3,36 @@ flytectl sandbox ---------------- -Used for testing flyte sandbox. +Used for sandbox interactions like start/teardown/status/exec. Synopsis ~~~~~~~~ -Example Create sandbox cluster. +The Flyte Sandbox is a fully standalone minimal environment for running Flyte. provides a simplified way of running flyte-sandbox as a single Docker container running locally. + +Create sandbox cluster. :: bin/flytectl sandbox start -Example Remove sandbox cluster. +Remove sandbox cluster. :: bin/flytectl sandbox teardown + + +Check status of sandbox container. +:: + + bin/flytectl sandbox status + +Execute command inside sandbox container. +:: + + bin/flytectl sandbox exec -- pwd Options @@ -43,8 +56,8 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl` - flyetcl CLI tool -* :doc:`flytectl_sandbox_exec` - Execute any command in sandbox -* :doc:`flytectl_sandbox_start` - Start the flyte sandbox +* :doc:`flytectl_sandbox_exec` - Execute non-interactive command inside the sandbox container +* :doc:`flytectl_sandbox_start` - Start the flyte sandbox cluster * :doc:`flytectl_sandbox_status` - Get the status of the sandbox environment. * :doc:`flytectl_sandbox_teardown` - Teardown will cleanup the sandbox environment diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index 2822ad5c34..9fbb77971c 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -3,14 +3,14 @@ flytectl sandbox exec --------------------- -Execute any command in sandbox +Execute non-interactive command inside the sandbox container Synopsis ~~~~~~~~ -Execute command will Will run non-interactive commands and return immediately with the output. +Execute command will run non-interactive command inside the sandbox container and return immediately with the output.By default flytectl exec in /root directory inside the sandbox container :: bin/flytectl sandbox exec -- ls -al @@ -42,5 +42,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for testing flyte sandbox. +* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index d96f6cab80..21b02b2161 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -3,22 +3,24 @@ flytectl sandbox start ---------------------- -Start the flyte sandbox +Start the flyte sandbox cluster Synopsis ~~~~~~~~ -Start will run the flyte sandbox cluster inside a docker container and setup the config that is required +The Flyte Sandbox is a fully standalone minimal environment for running Flyte. provides a simplified way of running flyte-sandbox as a single Docker container running locally. + +Start sandbox cluster without any source code :: bin/flytectl sandbox start -Mount your flytesnacks repository code inside sandbox +Mount your source code repository inside sandbox :: - bin/flytectl sandbox start --sourcesPath=$HOME/flyteorg/flytesnacks + bin/flytectl sandbox start --source=$HOME/flyteorg/flytesnacks Usage @@ -48,5 +50,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for testing flyte sandbox. +* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 0f85f86437..6295dff615 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -44,5 +44,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for testing flyte sandbox. +* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index 2b7f63cb25..bc41b259eb 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -10,7 +10,7 @@ Synopsis -Teardown will remove docker container and all the flyte config +Teardown will remove sandbox cluster and all the flyte config created by sandbox start :: bin/flytectl sandbox teardown @@ -43,5 +43,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for testing flyte sandbox. +* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. From dd369af3856f015c0098e9cfcbc26025e974f023 Mon Sep 17 00:00:00 2001 From: Sean Lin Date: Thu, 8 Jul 2021 19:51:29 -0700 Subject: [PATCH 101/645] Bind pflags to default variable fields && Remove short flags as they're not supported by pflags (#124) * * Bind pflags to default variable fields * Remove short flags as they're not supported by pflags Signed-off-by: Sean Lin * Add --default-var to config.go Signed-off-by: Sean Lin * * merge change from master branch * remove config_test as the generated test conflicts with it Signed-off-by: Sean Lin * Add config_test.go to commit Signed-off-by: Sean Lin * Update command help doc Signed-off-by: Sean Lin * Use camelCase for flags Signed-off-by: Sean Lin * Remove short flags from docs Signed-off-by: Sean Lin * Update docs Signed-off-by: Sean Lin --- flytectl/cmd/config/config.go | 2 +- flytectl/cmd/config/config_flags.go | 6 +-- .../attrdeleteconfig_flags.go | 11 +++- .../attrdeleteconfig_flags_test.go | 10 +--- .../attrfetchconfig_flags.go | 11 +++- .../attrfetchconfig_flags_test.go | 10 +--- .../attrupdateconfig_flags.go | 11 +++- .../attrupdateconfig_flags_test.go | 10 +--- .../clusterresourceattribute/delete_config.go | 2 +- .../clusterresourceattribute/fetch_config.go | 2 +- .../clusterresourceattribute/update_config.go | 2 +- .../subcommand/execution/config_flags.go | 4 +- .../subcommand/execution/config_flags_test.go | 12 ++--- .../attrdeleteconfig_flags.go | 11 +++- .../attrdeleteconfig_flags_test.go | 10 +--- .../attrfetchconfig_flags.go | 11 +++- .../attrfetchconfig_flags_test.go | 10 +--- .../attrupdateconfig_flags.go | 11 +++- .../attrupdateconfig_flags_test.go | 10 +--- .../executionclusterlabel/delete_config.go | 2 +- .../executionclusterlabel/fetch_config.go | 2 +- .../executionclusterlabel/update_config.go | 2 +- .../attrdeleteconfig_flags.go | 11 +++- .../attrdeleteconfig_flags_test.go | 10 +--- .../attrfetchconfig_flags.go | 11 +++- .../attrfetchconfig_flags_test.go | 10 +--- .../attrupdateconfig_flags.go | 11 +++- .../attrupdateconfig_flags_test.go | 10 +--- .../executionqueueattribute/delete_config.go | 2 +- .../executionqueueattribute/fetch_config.go | 2 +- .../executionqueueattribute/update_config.go | 2 +- .../subcommand/launchplan/config_flags.go | 15 +++--- .../launchplan/config_flags_test.go | 12 ++--- .../launchplan/launchplan_config.go | 2 +- .../plugin_override/attrdeleteconfig_flags.go | 11 +++- .../attrdeleteconfig_flags_test.go | 10 +--- .../plugin_override/attrfetchconfig_flags.go | 11 +++- .../attrfetchconfig_flags_test.go | 10 +--- .../plugin_override/attrupdateconfig_flags.go | 11 +++- .../attrupdateconfig_flags_test.go | 10 +--- .../plugin_override/delete_config.go | 2 +- .../plugin_override/fetch_config.go | 2 +- .../plugin_override/update_config.go | 2 +- .../config/subcommand/project/config_flags.go | 8 +-- .../subcommand/project/config_flags_test.go | 12 ++--- .../subcommand/project/project_config.go | 2 +- .../subcommand/register/filesconfig_flags.go | 49 ++++++++++++++--- .../config/subcommand/sandbox/config_flags.go | 37 +++++++++++++ .../subcommand/sandbox/sandbox_config.go | 2 +- .../config/subcommand/task/config_flags.go | 15 +++--- .../subcommand/task/config_flags_test.go | 12 ++--- .../cmd/config/subcommand/task/task_config.go | 2 +- .../attrdeleteconfig_flags.go | 11 +++- .../attrdeleteconfig_flags_test.go | 10 +--- .../attrfetchconfig_flags.go | 11 +++- .../attrfetchconfig_flags_test.go | 10 +--- .../attrupdateconfig_flags.go | 11 +++- .../attrupdateconfig_flags_test.go | 10 +--- .../taskresourceattribute/delete_config.go | 2 +- .../taskresourceattribute/fetch_config.go | 2 +- .../taskresourceattribute/update_config.go | 2 +- .../subcommand/workflow/config_flags.go | 4 +- .../subcommand/workflow/config_flags_test.go | 12 ++--- flytectl/cmd/create/execution.go | 2 +- flytectl/cmd/create/executionconfig_flags.go | 21 +++++--- .../cmd/create/executionconfig_flags_test.go | 52 +++++-------------- flytectl/cmd/get/execution.go | 4 +- flytectl/cmd/get/launch_plan.go | 6 +-- flytectl/cmd/get/project.go | 4 +- flytectl/cmd/get/task.go | 6 +-- flytectl/cmd/get/workflow.go | 6 +-- flytectl/cmd/register/files.go | 12 ++--- flytectl/cmd/update/named_entity.go | 2 +- .../cmd/update/namedentityconfig_flags.go | 17 ++++-- .../update/namedentityconfig_flags_test.go | 26 +--------- flytectl/cmd/update/project.go | 25 +++------ flytectl/cmd/update/project_test.go | 12 ++--- flytectl/cmd/update/projectconfig_flags.go | 13 ++++- .../cmd/update/projectconfig_flags_test.go | 18 +------ flytectl/cmd/update/update.go | 2 +- .../source/gen/flytectl_get_execution.rst | 18 +++---- .../source/gen/flytectl_get_launchplan.rst | 22 ++++---- .../docs/source/gen/flytectl_get_project.rst | 14 ++--- .../docs/source/gen/flytectl_get_task.rst | 22 ++++---- .../docs/source/gen/flytectl_get_workflow.rst | 20 +++---- .../source/gen/flytectl_register_examples.rst | 10 ++-- .../source/gen/flytectl_register_files.rst | 22 ++++---- .../source/gen/flytectl_update_launchplan.rst | 6 +-- .../source/gen/flytectl_update_project.rst | 21 ++------ .../docs/source/gen/flytectl_update_task.rst | 6 +-- .../source/gen/flytectl_update_workflow.rst | 6 +-- flytectl/pkg/adminutils/config.go | 6 +-- flytectl/pkg/adminutils/config_flags.go | 13 ++++- flytectl/pkg/adminutils/config_flags_test.go | 18 +------ flytectl/pkg/adminutils/config_test.go | 17 ------ flytectl/pkg/filters/type.go | 4 +- 96 files changed, 504 insertions(+), 502 deletions(-) delete mode 100644 flytectl/pkg/adminutils/config_test.go diff --git a/flytectl/cmd/config/config.go b/flytectl/cmd/config/config.go index 6c212d1cf9..d038c316f5 100644 --- a/flytectl/cmd/config/config.go +++ b/flytectl/cmd/config/config.go @@ -9,7 +9,7 @@ import ( "github.com/flyteorg/flytectl/pkg/printer" ) -//go:generate pflags Config +//go:generate pflags Config --bind-default-var var ( defaultConfig = &Config{} diff --git a/flytectl/cmd/config/config_flags.go b/flytectl/cmd/config/config_flags.go index 3a1616b7e6..f219394ffb 100755 --- a/flytectl/cmd/config/config_flags.go +++ b/flytectl/cmd/config/config_flags.go @@ -50,8 +50,8 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.String(fmt.Sprintf("%v%v", prefix, "project"), defaultConfig.Project, "Specifies the project to work on.") - cmdFlags.String(fmt.Sprintf("%v%v", prefix, "domain"), defaultConfig.Domain, "Specified the domain to work on.") - cmdFlags.String(fmt.Sprintf("%v%v", prefix, "output"), defaultConfig.Output, "Specified the output type.") + cmdFlags.StringVar(&defaultConfig.Project, fmt.Sprintf("%v%v", prefix, "project"), defaultConfig.Project, "Specifies the project to work on.") + cmdFlags.StringVar(&defaultConfig.Domain, fmt.Sprintf("%v%v", prefix, "domain"), defaultConfig.Domain, "Specified the domain to work on.") + cmdFlags.StringVar(&defaultConfig.Output, fmt.Sprintf("%v%v", prefix, "output"), defaultConfig.Output, "Specified the output type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go index 2ee35a7887..447d2e0471 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go @@ -28,6 +28,15 @@ func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrDeleteConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go index 798e81d2cf..63cb34732b 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrDeleteConfig(val, result)) } -func testDecodeSlice_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultDelConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags.go index 477e57689f..47dfb88623 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags.go @@ -28,6 +28,15 @@ func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrFetchConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + cmdFlags.StringVar(&DefaultFetchConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags_test.go index 4d8ae3e0e6..dbcbb814fb 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrfetchconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrFetchConfig(val, result)) } -func testDecodeSlice_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrFetchConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultFetchConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go index 60a9af145a..7b19fc93f4 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go @@ -28,6 +28,15 @@ func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrUpdateConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go index aa5d18dd07..9856912248 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrUpdateConfig(val, result)) } -func testDecodeSlice_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultUpdateConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go index 3b81cd0991..1112003923 100644 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go @@ -1,6 +1,6 @@ package clusterresourceattribute -//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig --bind-default-var // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/fetch_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/fetch_config.go index 9da6d481f8..88afae90ac 100644 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/fetch_config.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/fetch_config.go @@ -1,6 +1,6 @@ package clusterresourceattribute -//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig --bind-default-var type AttrFetchConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go index 2ff214af1f..fcbbe04d2a 100644 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go @@ -1,6 +1,6 @@ package clusterresourceattribute -//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig --bind-default-var // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { diff --git a/flytectl/cmd/config/subcommand/execution/config_flags.go b/flytectl/cmd/config/subcommand/execution/config_flags.go index 467fbd7f6c..f9a96f5261 100755 --- a/flytectl/cmd/config/subcommand/execution/config_flags.go +++ b/flytectl/cmd/config/subcommand/execution/config_flags.go @@ -50,8 +50,8 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&DefaultConfig.Filter.FieldSelector, fmt.Sprintf("%v%v", prefix, "filter.field-selector"), DefaultConfig.Filter.FieldSelector, "Specifies the Field selector") - cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sort-by"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") + cmdFlags.StringVar(&DefaultConfig.Filter.FieldSelector, fmt.Sprintf("%v%v", prefix, "filter.fieldSelector"), DefaultConfig.Filter.FieldSelector, "Specifies the Field selector") + cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sortBy"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") cmdFlags.BoolVar(&DefaultConfig.Details, fmt.Sprintf("%v%v", prefix, "details"), DefaultConfig.Details, "gets node execution details. Only applicable for single execution name i.e get execution name --details") diff --git a/flytectl/cmd/config/subcommand/execution/config_flags_test.go b/flytectl/cmd/config/subcommand/execution/config_flags_test.go index 7fbd9e51f7..88cfd5fca0 100755 --- a/flytectl/cmd/config/subcommand/execution/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/execution/config_flags_test.go @@ -99,13 +99,13 @@ func TestConfig_SetFlags(t *testing.T) { cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) - t.Run("Test_filter.field-selector", func(t *testing.T) { + t.Run("Test_filter.fieldSelector", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("filter.field-selector", testValue) - if vString, err := cmdFlags.GetString("filter.field-selector"); err == nil { + cmdFlags.Set("filter.fieldSelector", testValue) + if vString, err := cmdFlags.GetString("filter.fieldSelector"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.FieldSelector) } else { @@ -113,13 +113,13 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_filter.sort-by", func(t *testing.T) { + t.Run("Test_filter.sortBy", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("filter.sort-by", testValue) - if vString, err := cmdFlags.GetString("filter.sort-by"); err == nil { + cmdFlags.Set("filter.sortBy", testValue) + if vString, err := cmdFlags.GetString("filter.sortBy"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.SortBy) } else { diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go index 3dc56c9837..bbaa014f79 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go @@ -28,6 +28,15 @@ func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrDeleteConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go index 02ec1217d1..2c669643d9 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrDeleteConfig(val, result)) } -func testDecodeSlice_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultDelConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags.go index 0e1d0d060f..97bf9e8ff1 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags.go @@ -28,6 +28,15 @@ func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrFetchConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + cmdFlags.StringVar(&DefaultFetchConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags_test.go index a99fd91933..495e5024d6 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrfetchconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrFetchConfig(val, result)) } -func testDecodeSlice_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrFetchConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultFetchConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go index f2f0d84852..bb592423db 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go @@ -28,6 +28,15 @@ func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrUpdateConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go index ca7e09eb4d..fa011c6c1b 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrUpdateConfig(val, result)) } -func testDecodeSlice_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultUpdateConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go index 5a96d6fdfa..cbd1a09018 100644 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go @@ -1,6 +1,6 @@ package executionclusterlabel -//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig --bind-default-var // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/fetch_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/fetch_config.go index 8e7f878ede..68a27ea6fb 100644 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/fetch_config.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/fetch_config.go @@ -1,6 +1,6 @@ package executionclusterlabel -//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig --bind-default-var type AttrFetchConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go index abd5600553..ba3e9d3d88 100644 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go @@ -1,6 +1,6 @@ package executionclusterlabel -//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig --bind-default-var // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go index 15852717de..d3ab937c61 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go @@ -28,6 +28,15 @@ func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrDeleteConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go index d42fa0c9c7..46875fd457 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrDeleteConfig(val, result)) } -func testDecodeSlice_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultDelConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags.go index 0eed381d70..05a277f93a 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags.go @@ -28,6 +28,15 @@ func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrFetchConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + cmdFlags.StringVar(&DefaultFetchConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags_test.go index 449b82faae..73e37ab447 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrfetchconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrFetchConfig(val, result)) } -func testDecodeSlice_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrFetchConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultFetchConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go index c858ca34c8..ffd725ff3e 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go @@ -28,6 +28,15 @@ func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrUpdateConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go index dbe6642165..fafee300fb 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrUpdateConfig(val, result)) } -func testDecodeSlice_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultUpdateConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go index a6754eb4f4..48dedc581b 100644 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go @@ -1,6 +1,6 @@ package executionqueueattribute -//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig --bind-default-var // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/fetch_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/fetch_config.go index 4c5c154f2b..62a76d6ba1 100644 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/fetch_config.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/fetch_config.go @@ -1,6 +1,6 @@ package executionqueueattribute -//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig --bind-default-var type AttrFetchConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go index 11b319f1d1..8dd3e595a4 100644 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go @@ -1,6 +1,6 @@ package executionqueueattribute -//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig --bind-default-var // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { diff --git a/flytectl/cmd/config/subcommand/launchplan/config_flags.go b/flytectl/cmd/config/subcommand/launchplan/config_flags.go index db572d98ea..e41777eebc 100755 --- a/flytectl/cmd/config/subcommand/launchplan/config_flags.go +++ b/flytectl/cmd/config/subcommand/launchplan/config_flags.go @@ -50,13 +50,12 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), DefaultConfig.ExecFile, "execution file name to be used for generating execution spec of a single launchplan.") - cmdFlags.StringVar(&(DefaultConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "version of the launchplan to be fetched.") - cmdFlags.BoolVar(&(DefaultConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), DefaultConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") - - cmdFlags.StringVar(&(DefaultConfig.Filter.FieldSelector), fmt.Sprintf("%v%v", prefix, "filter.field-selector"), *new(string), "Specifies the Field selector") - cmdFlags.StringVar((&DefaultConfig.Filter.SortBy), fmt.Sprintf("%v%v", prefix, "filter.sort-by"), *new(string), "Specifies which field to sort result by ") - cmdFlags.Int32Var((&DefaultConfig.Filter.Limit), fmt.Sprintf("%v%v", prefix, "filter.limit"), 100, "Specifies the limit") - cmdFlags.BoolVar((&DefaultConfig.Filter.Asc), fmt.Sprintf("%v%v", prefix, "filter.asc"), false, "Specifies the sorting order. By default flytectl sort result in descending order") + cmdFlags.StringVar(&DefaultConfig.ExecFile, fmt.Sprintf("%v%v", prefix, "execFile"), DefaultConfig.ExecFile, "execution file name to be used for generating execution spec of a single launchplan.") + cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "version of the launchplan to be fetched.") + cmdFlags.BoolVar(&DefaultConfig.Latest, fmt.Sprintf("%v%v", prefix, "latest"), DefaultConfig.Latest, " flag to indicate to fetch the latest version, version flag will be ignored in this case") + cmdFlags.StringVar(&DefaultConfig.Filter.FieldSelector, fmt.Sprintf("%v%v", prefix, "filter.fieldSelector"), DefaultConfig.Filter.FieldSelector, "Specifies the Field selector") + cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sortBy"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") + cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") + cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go b/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go index ec536464bc..d2ccb2715d 100755 --- a/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go @@ -141,13 +141,13 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_filter.field-selector", func(t *testing.T) { + t.Run("Test_filter.fieldSelector", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("filter.field-selector", testValue) - if vString, err := cmdFlags.GetString("filter.field-selector"); err == nil { + cmdFlags.Set("filter.fieldSelector", testValue) + if vString, err := cmdFlags.GetString("filter.fieldSelector"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.FieldSelector) } else { @@ -155,13 +155,13 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_filter.sort-by", func(t *testing.T) { + t.Run("Test_filter.sortBy", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("filter.sort-by", testValue) - if vString, err := cmdFlags.GetString("filter.sort-by"); err == nil { + cmdFlags.Set("filter.sortBy", testValue) + if vString, err := cmdFlags.GetString("filter.sortBy"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.SortBy) } else { diff --git a/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go b/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go index 5e245deb48..7c8245256a 100644 --- a/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go +++ b/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go @@ -4,7 +4,7 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" ) -//go:generate pflags Config --default-var DefaultConfig +//go:generate pflags Config --default-var DefaultConfig --bind-default-var var ( DefaultConfig = &Config{ Filter: filters.DefaultFilter, diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go index 52fd144b99..7003e5e1dd 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go @@ -28,6 +28,15 @@ func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrDeleteConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go index 7a5d60873c..0129073516 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrDeleteConfig(val, result)) } -func testDecodeSlice_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultDelConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags.go index 1cf522b3ca..e7c79a92b4 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags.go @@ -28,6 +28,15 @@ func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrFetchConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + cmdFlags.StringVar(&DefaultFetchConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags_test.go index e94f54e982..d5206f1d33 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrfetchconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrFetchConfig(val, result)) } -func testDecodeSlice_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrFetchConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultFetchConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go index 21c58dbb9d..1edf682879 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go @@ -28,6 +28,15 @@ func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrUpdateConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go index 37ee0382c1..c23184f43b 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrUpdateConfig(val, result)) } -func testDecodeSlice_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultUpdateConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/plugin_override/delete_config.go b/flytectl/cmd/config/subcommand/plugin_override/delete_config.go index beec54fd95..de00f5cf7f 100644 --- a/flytectl/cmd/config/subcommand/plugin_override/delete_config.go +++ b/flytectl/cmd/config/subcommand/plugin_override/delete_config.go @@ -1,6 +1,6 @@ package pluginoverride -//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig --bind-default-var // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { diff --git a/flytectl/cmd/config/subcommand/plugin_override/fetch_config.go b/flytectl/cmd/config/subcommand/plugin_override/fetch_config.go index 9976d8b33f..e2283e7c80 100644 --- a/flytectl/cmd/config/subcommand/plugin_override/fetch_config.go +++ b/flytectl/cmd/config/subcommand/plugin_override/fetch_config.go @@ -1,6 +1,6 @@ package pluginoverride -//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig --bind-default-var type AttrFetchConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` diff --git a/flytectl/cmd/config/subcommand/plugin_override/update_config.go b/flytectl/cmd/config/subcommand/plugin_override/update_config.go index e2daefa8f3..aa0d9af0b2 100644 --- a/flytectl/cmd/config/subcommand/plugin_override/update_config.go +++ b/flytectl/cmd/config/subcommand/plugin_override/update_config.go @@ -1,6 +1,6 @@ package pluginoverride -//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig --bind-default-var // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { diff --git a/flytectl/cmd/config/subcommand/project/config_flags.go b/flytectl/cmd/config/subcommand/project/config_flags.go index 3a3e9bb5df..ca18dca630 100755 --- a/flytectl/cmd/config/subcommand/project/config_flags.go +++ b/flytectl/cmd/config/subcommand/project/config_flags.go @@ -50,9 +50,9 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultConfig.Filter.FieldSelector), fmt.Sprintf("%v%v", prefix, "filter.field-selector"), *new(string), "Specifies the Field selector") - cmdFlags.StringVar((&DefaultConfig.Filter.SortBy), fmt.Sprintf("%v%v", prefix, "filter.sort-by"), *new(string), "Specifies which field to sort result by ") - cmdFlags.Int32Var((&DefaultConfig.Filter.Limit), fmt.Sprintf("%v%v", prefix, "filter.limit"), 100, "Specifies the limit") - cmdFlags.BoolVar((&DefaultConfig.Filter.Asc), fmt.Sprintf("%v%v", prefix, "filter.asc"), false, "Specifies the sorting order. By default flytectl sort result in descending order") + cmdFlags.StringVar(&DefaultConfig.Filter.FieldSelector, fmt.Sprintf("%v%v", prefix, "filter.fieldSelector"), DefaultConfig.Filter.FieldSelector, "Specifies the Field selector") + cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sortBy"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") + cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") + cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/project/config_flags_test.go b/flytectl/cmd/config/subcommand/project/config_flags_test.go index 50fcfad9d2..52668bcf14 100755 --- a/flytectl/cmd/config/subcommand/project/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/project/config_flags_test.go @@ -99,13 +99,13 @@ func TestConfig_SetFlags(t *testing.T) { cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) - t.Run("Test_filter.field-selector", func(t *testing.T) { + t.Run("Test_filter.fieldSelector", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("filter.field-selector", testValue) - if vString, err := cmdFlags.GetString("filter.field-selector"); err == nil { + cmdFlags.Set("filter.fieldSelector", testValue) + if vString, err := cmdFlags.GetString("filter.fieldSelector"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.FieldSelector) } else { @@ -113,13 +113,13 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_filter.sort-by", func(t *testing.T) { + t.Run("Test_filter.sortBy", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("filter.sort-by", testValue) - if vString, err := cmdFlags.GetString("filter.sort-by"); err == nil { + cmdFlags.Set("filter.sortBy", testValue) + if vString, err := cmdFlags.GetString("filter.sortBy"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.SortBy) } else { diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go index e5a7850595..8692a746cd 100644 --- a/flytectl/cmd/config/subcommand/project/project_config.go +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -4,7 +4,7 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" ) -//go:generate pflags Config --default-var DefaultConfig +//go:generate pflags Config --default-var DefaultConfig --bind-default-var var ( DefaultConfig = &Config{ Filter: filters.DefaultFilter, diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go index a28aead6e5..9ddea3a547 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go @@ -4,21 +4,58 @@ package register import ( + "encoding/json" + "reflect" + "fmt" "github.com/spf13/pflag" ) +// If v` is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (FilesConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (FilesConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (FilesConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + // GetPFlagSet will return strongly types pflags for all fields in FilesConfig and its nested types. The format of the // flags is json-name.json-sub-name... etc. func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("FilesConfig", pflag.ExitOnError) - cmdFlags.StringVarP(&DefaultFilesConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), "v", DefaultFilesConfig.Version, "version of the entity to be registered with flyte.") - cmdFlags.BoolVarP(&DefaultFilesConfig.ContinueOnError, fmt.Sprintf("%v%v", prefix, "continueOnError"), "", DefaultFilesConfig.ContinueOnError, "continue on error when registering files.") - cmdFlags.BoolVarP(&DefaultFilesConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), "a", DefaultFilesConfig.Archive, "pass in archive file either an http link or local path.") - cmdFlags.StringVarP(&DefaultFilesConfig.AssumableIamRole, fmt.Sprintf("%v%v", prefix, "assumableIamRole"), "i", DefaultFilesConfig.AssumableIamRole, " Custom assumable iam auth role to register launch plans with.") - cmdFlags.StringVarP(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), "k", DefaultFilesConfig.K8ServiceAccount, " custom kubernetes service account auth role to register launch plans with.") - cmdFlags.StringVarP(&DefaultFilesConfig.OutputLocationPrefix, fmt.Sprintf("%v%v", prefix, "outputLocationPrefix"), "l", DefaultFilesConfig.OutputLocationPrefix, " custom output location prefix for offloaded types (files/schemas).") + cmdFlags.StringVar(&DefaultFilesConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultFilesConfig.Version, "version of the entity to be registered with flyte.") + cmdFlags.BoolVar(&DefaultFilesConfig.ContinueOnError, fmt.Sprintf("%v%v", prefix, "continueOnError"), DefaultFilesConfig.ContinueOnError, "continue on error when registering files.") + cmdFlags.BoolVar(&DefaultFilesConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), DefaultFilesConfig.Archive, "pass in archive file either an http link or local path.") + cmdFlags.StringVar(&DefaultFilesConfig.AssumableIamRole, fmt.Sprintf("%v%v", prefix, "assumableIamRole"), DefaultFilesConfig.AssumableIamRole, " custom assumable iam auth role to register launch plans with.") + cmdFlags.StringVar(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), DefaultFilesConfig.K8ServiceAccount, " custom kubernetes service account auth role to register launch plans with.") + cmdFlags.StringVar(&DefaultFilesConfig.OutputLocationPrefix, fmt.Sprintf("%v%v", prefix, "outputLocationPrefix"), DefaultFilesConfig.OutputLocationPrefix, " custom output location prefix for offloaded types (files/schemas).") cmdFlags.StringVar(&DefaultFilesConfig.SourceUploadPath, fmt.Sprintf("%v%v", prefix, "sourceUploadPath"), DefaultFilesConfig.SourceUploadPath, " Location for source code in storage.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index ebecc0a5b9..b727f8a04d 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -4,11 +4,48 @@ package sandbox import ( + "encoding/json" + "reflect" + "fmt" "github.com/spf13/pflag" ) +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + // GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index afe85beddf..833a950495 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -1,6 +1,6 @@ package sandbox -//go:generate pflags Config --default-var DefaultConfig +//go:generate pflags Config --default-var DefaultConfig --bind-default-var var ( DefaultConfig = &Config{} ) diff --git a/flytectl/cmd/config/subcommand/task/config_flags.go b/flytectl/cmd/config/subcommand/task/config_flags.go index 4c48a38e6c..3138439017 100755 --- a/flytectl/cmd/config/subcommand/task/config_flags.go +++ b/flytectl/cmd/config/subcommand/task/config_flags.go @@ -50,13 +50,12 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), DefaultConfig.ExecFile, "execution file name to be used for generating execution spec of a single task.") - cmdFlags.StringVar(&(DefaultConfig.Version), fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "version of the task to be fetched.") - cmdFlags.BoolVar(&(DefaultConfig.Latest), fmt.Sprintf("%v%v", prefix, "latest"), DefaultConfig.Latest, "flag to indicate to fetch the latest version, version flag will be ignored in this case") - - cmdFlags.StringVar(&(DefaultConfig.Filter.FieldSelector), fmt.Sprintf("%v%v", prefix, "filter.field-selector"), *new(string), "Specifies the Field selector") - cmdFlags.StringVar((&DefaultConfig.Filter.SortBy), fmt.Sprintf("%v%v", prefix, "filter.sort-by"), *new(string), "Specifies which field to sort result by ") - cmdFlags.Int32Var((&DefaultConfig.Filter.Limit), fmt.Sprintf("%v%v", prefix, "filter.limit"), 100, "Specifies the limit") - cmdFlags.BoolVar((&DefaultConfig.Filter.Asc), fmt.Sprintf("%v%v", prefix, "filter.asc"), false, "Specifies the sorting order. By default flytectl sort result in descending order") + cmdFlags.StringVar(&DefaultConfig.ExecFile, fmt.Sprintf("%v%v", prefix, "execFile"), DefaultConfig.ExecFile, "execution file name to be used for generating execution spec of a single task.") + cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "version of the task to be fetched.") + cmdFlags.BoolVar(&DefaultConfig.Latest, fmt.Sprintf("%v%v", prefix, "latest"), DefaultConfig.Latest, " flag to indicate to fetch the latest version, version flag will be ignored in this case") + cmdFlags.StringVar(&DefaultConfig.Filter.FieldSelector, fmt.Sprintf("%v%v", prefix, "filter.fieldSelector"), DefaultConfig.Filter.FieldSelector, "Specifies the Field selector") + cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sortBy"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") + cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") + cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/task/config_flags_test.go b/flytectl/cmd/config/subcommand/task/config_flags_test.go index bea2ff142e..844d031a5a 100755 --- a/flytectl/cmd/config/subcommand/task/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/task/config_flags_test.go @@ -141,13 +141,13 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_filter.field-selector", func(t *testing.T) { + t.Run("Test_filter.fieldSelector", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("filter.field-selector", testValue) - if vString, err := cmdFlags.GetString("filter.field-selector"); err == nil { + cmdFlags.Set("filter.fieldSelector", testValue) + if vString, err := cmdFlags.GetString("filter.fieldSelector"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.FieldSelector) } else { @@ -155,13 +155,13 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_filter.sort-by", func(t *testing.T) { + t.Run("Test_filter.sortBy", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("filter.sort-by", testValue) - if vString, err := cmdFlags.GetString("filter.sort-by"); err == nil { + cmdFlags.Set("filter.sortBy", testValue) + if vString, err := cmdFlags.GetString("filter.sortBy"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.SortBy) } else { diff --git a/flytectl/cmd/config/subcommand/task/task_config.go b/flytectl/cmd/config/subcommand/task/task_config.go index 241a1c1fab..1e0d6a2bec 100644 --- a/flytectl/cmd/config/subcommand/task/task_config.go +++ b/flytectl/cmd/config/subcommand/task/task_config.go @@ -2,7 +2,7 @@ package task import "github.com/flyteorg/flytectl/pkg/filters" -//go:generate pflags Config --default-var DefaultConfig +//go:generate pflags Config --default-var DefaultConfig --bind-default-var var ( DefaultConfig = &Config{ Filter: filters.DefaultFilter, diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go index b335257d99..d1128e5e9e 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go @@ -28,6 +28,15 @@ func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrDeleteConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultDelConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go index 3c219496ae..f41f531f3f 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrDeleteConfig(val, result)) } -func testDecodeSlice_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultDelConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags.go index 761baa5c3a..0efc338768 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags.go @@ -28,6 +28,15 @@ func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrFetchConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultFetchConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + cmdFlags.StringVar(&DefaultFetchConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags_test.go index 1b91152a97..038f8a893c 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrfetchconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrFetchConfig(val, result)) } -func testDecodeSlice_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrFetchConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultFetchConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go index b94b102bc6..e57de741e7 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go @@ -28,6 +28,15 @@ func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (AttrUpdateConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,6 +50,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(DefaultUpdateConfig.AttrFile), fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go index 2672552de4..06f17f631c 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_AttrUpdateConfig(val, result)) } -func testDecodeSlice_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_attrFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("attrFile"); err == nil { - assert.Equal(t, string(DefaultUpdateConfig.AttrFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go index 6c513cafe0..6d88a180a7 100644 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go @@ -1,6 +1,6 @@ package taskresourceattribute -//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig --bind-default-var // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/fetch_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/fetch_config.go index 6909229c30..1fe6de9937 100644 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/fetch_config.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/fetch_config.go @@ -1,6 +1,6 @@ package taskresourceattribute -//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig --bind-default-var type AttrFetchConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go index d9ea24ab77..2dd2451e9c 100644 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go @@ -1,6 +1,6 @@ package taskresourceattribute -//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig --bind-default-var // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { diff --git a/flytectl/cmd/config/subcommand/workflow/config_flags.go b/flytectl/cmd/config/subcommand/workflow/config_flags.go index 5765379fe6..29bc7fca54 100755 --- a/flytectl/cmd/config/subcommand/workflow/config_flags.go +++ b/flytectl/cmd/config/subcommand/workflow/config_flags.go @@ -52,8 +52,8 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "version of the workflow to be fetched.") cmdFlags.BoolVar(&DefaultConfig.Latest, fmt.Sprintf("%v%v", prefix, "latest"), DefaultConfig.Latest, " flag to indicate to fetch the latest version, version flag will be ignored in this case") - cmdFlags.StringVar(&DefaultConfig.Filter.FieldSelector, fmt.Sprintf("%v%v", prefix, "filter.field-selector"), DefaultConfig.Filter.FieldSelector, "Specifies the Field selector") - cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sort-by"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") + cmdFlags.StringVar(&DefaultConfig.Filter.FieldSelector, fmt.Sprintf("%v%v", prefix, "filter.fieldSelector"), DefaultConfig.Filter.FieldSelector, "Specifies the Field selector") + cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sortBy"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") return cmdFlags diff --git a/flytectl/cmd/config/subcommand/workflow/config_flags_test.go b/flytectl/cmd/config/subcommand/workflow/config_flags_test.go index 86998d7788..4011d8e4f3 100755 --- a/flytectl/cmd/config/subcommand/workflow/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/workflow/config_flags_test.go @@ -127,13 +127,13 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_filter.field-selector", func(t *testing.T) { + t.Run("Test_filter.fieldSelector", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("filter.field-selector", testValue) - if vString, err := cmdFlags.GetString("filter.field-selector"); err == nil { + cmdFlags.Set("filter.fieldSelector", testValue) + if vString, err := cmdFlags.GetString("filter.fieldSelector"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.FieldSelector) } else { @@ -141,13 +141,13 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_filter.sort-by", func(t *testing.T) { + t.Run("Test_filter.sortBy", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("filter.sort-by", testValue) - if vString, err := cmdFlags.GetString("filter.sort-by"); err == nil { + cmdFlags.Set("filter.sortBy", testValue) + if vString, err := cmdFlags.GetString("filter.sortBy"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Filter.SortBy) } else { diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index f765e786b2..4fdea5214d 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -127,7 +127,7 @@ Usage ` ) -//go:generate pflags ExecutionConfig --default-var executionConfig +//go:generate pflags ExecutionConfig --default-var executionConfig --bind-default-var // ExecutionConfig hold configuration for create execution flags and configuration of the actual task or workflow to be launched. type ExecutionConfig struct { diff --git a/flytectl/cmd/create/executionconfig_flags.go b/flytectl/cmd/create/executionconfig_flags.go index 974c284b0b..5fb13bbbe8 100755 --- a/flytectl/cmd/create/executionconfig_flags.go +++ b/flytectl/cmd/create/executionconfig_flags.go @@ -28,6 +28,15 @@ func (ExecutionConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (ExecutionConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (ExecutionConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,11 +50,11 @@ func (ExecutionConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("ExecutionConfig", pflag.ExitOnError) - cmdFlags.StringVar(&(executionConfig.ExecFile), fmt.Sprintf("%v%v", prefix, "execFile"), executionConfig.ExecFile, "file for the execution params.If not specified defaults to <_name>.execution_spec.yaml") - cmdFlags.StringVar(&(executionConfig.TargetDomain), fmt.Sprintf("%v%v", prefix, "targetDomain"), executionConfig.TargetDomain, "project where execution needs to be created.If not specified configured domain would be used.") - cmdFlags.StringVar(&(executionConfig.TargetProject), fmt.Sprintf("%v%v", prefix, "targetProject"), executionConfig.TargetProject, "project where execution needs to be created.If not specified configured project would be used.") - cmdFlags.StringVar(&(executionConfig.KubeServiceAcct), fmt.Sprintf("%v%v", prefix, "kubeServiceAcct"), executionConfig.KubeServiceAcct, "kubernetes service account AuthRole for launching execution.") - cmdFlags.StringVar(&(executionConfig.IamRoleARN), fmt.Sprintf("%v%v", prefix, "iamRoleARN"), executionConfig.IamRoleARN, "iam role ARN AuthRole for launching execution.") - cmdFlags.StringVar(&(executionConfig.Relaunch), fmt.Sprintf("%v%v", prefix, "relaunch"), executionConfig.Relaunch, "execution id to be relaunched.") + cmdFlags.StringVar(&executionConfig.ExecFile, fmt.Sprintf("%v%v", prefix, "execFile"), executionConfig.ExecFile, "file for the execution params.If not specified defaults to <_name>.execution_spec.yaml") + cmdFlags.StringVar(&executionConfig.TargetDomain, fmt.Sprintf("%v%v", prefix, "targetDomain"), executionConfig.TargetDomain, "project where execution needs to be created.If not specified configured domain would be used.") + cmdFlags.StringVar(&executionConfig.TargetProject, fmt.Sprintf("%v%v", prefix, "targetProject"), executionConfig.TargetProject, "project where execution needs to be created.If not specified configured project would be used.") + cmdFlags.StringVar(&executionConfig.KubeServiceAcct, fmt.Sprintf("%v%v", prefix, "kubeServiceAcct"), executionConfig.KubeServiceAcct, "kubernetes service account AuthRole for launching execution.") + cmdFlags.StringVar(&executionConfig.IamRoleARN, fmt.Sprintf("%v%v", prefix, "iamRoleARN"), executionConfig.IamRoleARN, "iam role ARN AuthRole for launching execution.") + cmdFlags.StringVar(&executionConfig.Relaunch, fmt.Sprintf("%v%v", prefix, "relaunch"), executionConfig.Relaunch, "execution id to be relaunched.") return cmdFlags } diff --git a/flytectl/cmd/create/executionconfig_flags_test.go b/flytectl/cmd/create/executionconfig_flags_test.go index bf7ab9c47b..9e35676125 100755 --- a/flytectl/cmd/create/executionconfig_flags_test.go +++ b/flytectl/cmd/create/executionconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_ExecutionConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_ExecutionConfig(val, result)) } -func testDecodeSlice_ExecutionConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_ExecutionConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_ExecutionConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestExecutionConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_execFile", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("execFile"); err == nil { - assert.Equal(t, string(executionConfig.ExecFile), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -122,14 +114,6 @@ func TestExecutionConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_targetDomain", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("targetDomain"); err == nil { - assert.Equal(t, string(executionConfig.TargetDomain), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -144,14 +128,6 @@ func TestExecutionConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_targetProject", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("targetProject"); err == nil { - assert.Equal(t, string(executionConfig.TargetProject), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -166,14 +142,6 @@ func TestExecutionConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_kubeServiceAcct", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("kubeServiceAcct"); err == nil { - assert.Equal(t, string(executionConfig.KubeServiceAcct), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -188,21 +156,27 @@ func TestExecutionConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_iamRoleARN", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("iamRoleARN", testValue) if vString, err := cmdFlags.GetString("iamRoleARN"); err == nil { - assert.Equal(t, string(executionConfig.IamRoleARN), vString) + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.IamRoleARN) + } else { assert.FailNow(t, err.Error()) } }) + }) + t.Run("Test_relaunch", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("iamRoleARN", testValue) - if vString, err := cmdFlags.GetString("iamRoleARN"); err == nil { - testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.IamRoleARN) + cmdFlags.Set("relaunch", testValue) + if vString, err := cmdFlags.GetString("relaunch"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Relaunch) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index f547789349..2e8232ca7e 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -30,13 +30,13 @@ Retrieves execution by name within project and domain. Retrieves all the executions with filters. :: - bin/flytectl get execution -p flytesnacks -d development --filter.field-selector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" + bin/flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" Retrieves all the execution with limit and sorting. :: - bin/flytectl get execution -p flytesnacks -d development --filter.sort-by=created_at --filter.limit=1 --filter.asc + bin/flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc Retrieves all the execution within project and domain in yaml format diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 9edff6ab92..ec90a62fd2 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -43,18 +43,18 @@ Retrieves particular version of launchplan by name within project and domain. Retrieves all the launch plans with filters. :: - bin/flytectl get launchplan -p flytesnacks -d development --filter.field-selector="name=core.basic.lp.go_greet" + bin/flytectl get launchplan -p flytesnacks -d development --filter.fieldSelector="name=core.basic.lp.go_greet" Retrieves launch plans entity search across all versions with filters. :: - bin/flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.field-selector="version=v1" + bin/flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="version=v1" Retrieves all the launch plans with limit and sorting. :: - bin/flytectl get launchplan -p flytesnacks -d development --filter.sort-by=created_at --filter.limit=1 --filter.asc + bin/flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc Retrieves all the launchplan within project and domain in yaml format. diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 4d13950e1e..10148a1c07 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -31,12 +31,12 @@ Retrieves project by name Retrieves all the projects with filters. :: - bin/flytectl get project --filter.field-selector="project.name=flytesnacks" + bin/flytectl get project --filter.fieldSelector="project.name=flytesnacks" Retrieves all the projects with limit and sorting. :: - bin/flytectl get project --filter.sort-by=created_at --filter.limit=1 --filter.asc + bin/flytectl get project --filter.sortBy=created_at --filter.limit=1 --filter.asc Retrieves all the projects in yaml format diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index e25206a55f..49c586f433 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -43,17 +43,17 @@ Retrieves particular version of task by name within project and domain. Retrieves all the tasks with filters. :: - bin/flytectl get task -p flytesnacks -d development --filter.field-selector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" + bin/flytectl get task -p flytesnacks -d development --filter.fieldSelector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" Retrieve a specific task with filters. :: - bin/flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.field-selector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" + bin/flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.fieldSelector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" Retrieves all the task with limit and sorting. :: - bin/flytectl get -p flytesnacks -d development task --filter.sort-by=created_at --filter.limit=1 --filter.asc + bin/flytectl get -p flytesnacks -d development task --filter.sortBy=created_at --filter.limit=1 --filter.asc Retrieves all the tasks within project and domain in yaml format. :: diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 4174f96c1a..8fba30d2cd 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -44,17 +44,17 @@ Retrieves particular version of workflow by name within project and domain. Retrieves all the workflows with filters. :: - bin/flytectl get workflow -p flytesnacks -d development --filter.field-selector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" + bin/flytectl get workflow -p flytesnacks -d development --filter.fieldSelector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" Retrieve specific workflow with filters. :: - bin/flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.field-selector="workflow.version=v1" + bin/flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="workflow.version=v1" Retrieves all the workflows with limit and sorting. :: - bin/flytectl get -p flytesnacks -d development workflow --filter.sort-by=created_at --filter.limit=1 --filter.asc + bin/flytectl get -p flytesnacks -d development workflow --filter.sortBy=created_at --filter.limit=1 --filter.asc Retrieves all the workflow within project and domain in yaml format. diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index d758adce98..210bb1bba2 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -26,12 +26,12 @@ There is no difference between registration and fast registration, In fast regis SourceUploadPath is an optional flag. By default, flytectl will create SourceUploadPath from your storage config. In case of s3 flytectl will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 + bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 In case of fast registration, If the SourceUploadPath flag is defined then In this case flytectl will not use the default directory for uploading the source code, it will override the destination path on the registration :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 --SourceUploadPath="s3://dummy/fast" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" Using archive file.Currently supported are .tgz and .tar extension files and can be local or remote file served through http/https. Use --archive flag. @@ -60,7 +60,7 @@ Using short format of continueOnError flag Overriding the default version v1 using version string. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 + bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 Change the o/p format has not effect on registration. The O/p is currently available only in table format. @@ -72,19 +72,19 @@ Override IamRole during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -i "arn:aws:iam::123456789:role/dummy" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -i "arn:aws:iam::123456789:role/dummy" Override Kubernetes service account during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -k "kubernetes-service-account" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -k "kubernetes-service-account" Override Output location prefix during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -l "s3://dummy/prefix" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -l "s3://dummy/prefix" Usage ` diff --git a/flytectl/cmd/update/named_entity.go b/flytectl/cmd/update/named_entity.go index 5c3391d708..da5380554e 100644 --- a/flytectl/cmd/update/named_entity.go +++ b/flytectl/cmd/update/named_entity.go @@ -10,7 +10,7 @@ import ( "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) -//go:generate pflags NamedEntityConfig --default-var namedEntityConfig +//go:generate pflags NamedEntityConfig --default-var namedEntityConfig --bind-default-var var ( namedEntityConfig = &NamedEntityConfig{} diff --git a/flytectl/cmd/update/namedentityconfig_flags.go b/flytectl/cmd/update/namedentityconfig_flags.go index 3d61711bec..e1bd681341 100755 --- a/flytectl/cmd/update/namedentityconfig_flags.go +++ b/flytectl/cmd/update/namedentityconfig_flags.go @@ -28,6 +28,15 @@ func (NamedEntityConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (NamedEntityConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (NamedEntityConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -39,10 +48,10 @@ func (NamedEntityConfig) mustMarshalJSON(v json.Marshaler) string { // GetPFlagSet will return strongly types pflags for all fields in NamedEntityConfig and its nested types. The format of the // flags is json-name.json-sub-name... etc. -func (n NamedEntityConfig) GetPFlagSet(prefix string) *pflag.FlagSet { +func (cfg NamedEntityConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("NamedEntityConfig", pflag.ExitOnError) - cmdFlags.BoolVar(&(namedEntityConfig.Activate), fmt.Sprintf("%v%v", prefix, "activate"), *new(bool), "Activates the named entity specified as argument.") - cmdFlags.BoolVar(&(namedEntityConfig.Archive), fmt.Sprintf("%v%v", prefix, "archive"), *new(bool), "Archives the named entity specified as argument.") - cmdFlags.StringVar(&(namedEntityConfig.Description), fmt.Sprintf("%v%v", prefix, "description"), namedEntityConfig.Description, "description of the namedentity.") + cmdFlags.BoolVar(&namedEntityConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), namedEntityConfig.Archive, "archive named entity.") + cmdFlags.BoolVar(&namedEntityConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), namedEntityConfig.Activate, "activate the named entity.") + cmdFlags.StringVar(&namedEntityConfig.Description, fmt.Sprintf("%v%v", prefix, "description"), namedEntityConfig.Description, "description of the named entity.") return cmdFlags } diff --git a/flytectl/cmd/update/namedentityconfig_flags_test.go b/flytectl/cmd/update/namedentityconfig_flags_test.go index 1f9506481b..528f913d63 100755 --- a/flytectl/cmd/update/namedentityconfig_flags_test.go +++ b/flytectl/cmd/update/namedentityconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_NamedEntityConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_NamedEntityConfig(val, result)) } -func testDecodeSlice_NamedEntityConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_NamedEntityConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_NamedEntityConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestNamedEntityConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_archive", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vBool, err := cmdFlags.GetBool("archive"); err == nil { - assert.Equal(t, bool(namedEntityConfig.Archive), vBool) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -122,14 +114,6 @@ func TestNamedEntityConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_activate", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vBool, err := cmdFlags.GetBool("activate"); err == nil { - assert.Equal(t, bool(namedEntityConfig.Activate), vBool) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -144,14 +128,6 @@ func TestNamedEntityConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_description", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vString, err := cmdFlags.GetString("description"); err == nil { - assert.Equal(t, string(namedEntityConfig.Description), vString) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 0a1f5415d7..86d7bb616a 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -11,7 +11,7 @@ import ( "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) -//go:generate pflags ProjectConfig +//go:generate pflags ProjectConfig --default-var DefaultProjectConfig --bind-default-var // Config hold configuration for project update flags. type ProjectConfig struct { @@ -34,40 +34,29 @@ Archives project named flytesnacks. bin/flytectl update project -p flytesnacks --archiveProject -Activates project named flytesnacks using short option -t. -:: - - bin/flytectl update project -p flytesnacks -t - -Archives project named flytesnacks using short option -a. - -:: - - bin/flytectl update project flytesnacks -a - Incorrect usage when passing both archive and activate. :: - bin/flytectl update project flytesnacks -a -t + bin/flytectl update project flytesnacks --archiveProject --activateProject Incorrect usage when passing unknown-project. :: - bin/flytectl update project unknown-project -a + bin/flytectl update project unknown-project --archiveProject Incorrect usage when passing valid project using -p option. :: - bin/flytectl update project unknown-project -a -p known-project + bin/flytectl update project unknown-project --archiveProject -p known-project Usage ` ) -var projectConfig = &ProjectConfig{} +var DefaultProjectConfig = &ProjectConfig{} func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { id := config.GetConfig().Project @@ -75,8 +64,8 @@ func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comma fmt.Printf(clierrors.ErrProjectNotPassed) return nil } - archiveProject := projectConfig.ArchiveProject - activateProject := projectConfig.ActivateProject + archiveProject := DefaultProjectConfig.ArchiveProject + activateProject := DefaultProjectConfig.ActivateProject if activateProject == archiveProject { return fmt.Errorf(clierrors.ErrInvalidStateUpdate) } diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index e3eac5ff84..9db9f8cf46 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -37,7 +37,7 @@ func modifyProjectFlags(archiveProject *bool, newArchiveVal bool, activateProjec func TestActivateProjectFunc(t *testing.T) { setup() updateProjectSetup() - modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) + modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), false, &(DefaultProjectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) err = updateProjectsFunc(ctx, args, cmdCtx) assert.Nil(t, err) @@ -48,7 +48,7 @@ func TestActivateProjectFunc(t *testing.T) { func TestActivateProjectFuncWithError(t *testing.T) { setup() updateProjectSetup() - modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) + modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), false, &(DefaultProjectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) err = updateProjectsFunc(ctx, args, cmdCtx) assert.NotNil(t, err) @@ -59,7 +59,7 @@ func TestActivateProjectFuncWithError(t *testing.T) { func TestArchiveProjectFunc(t *testing.T) { setup() updateProjectSetup() - modifyProjectFlags(&(projectConfig.ArchiveProject), true, &(projectConfig.ActivateProject), false) + modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), true, &(DefaultProjectConfig.ActivateProject), false) projectUpdateRequest = &admin.Project{ Id: projectValue, State: admin.Project_ARCHIVED, @@ -74,7 +74,7 @@ func TestArchiveProjectFunc(t *testing.T) { func TestArchiveProjectFuncWithError(t *testing.T) { setup() updateProjectSetup() - modifyProjectFlags(&(projectConfig.ArchiveProject), true, &(projectConfig.ActivateProject), false) + modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), true, &(DefaultProjectConfig.ActivateProject), false) projectUpdateRequest = &admin.Project{ Id: projectValue, State: admin.Project_ARCHIVED, @@ -90,7 +90,7 @@ func TestEmptyProjectInput(t *testing.T) { setup() updateProjectSetup() config.GetConfig().Project = "" - modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), true) + modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), false, &(DefaultProjectConfig.ActivateProject), true) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) err = updateProjectsFunc(ctx, args, cmdCtx) assert.Nil(t, err) @@ -101,7 +101,7 @@ func TestEmptyProjectInput(t *testing.T) { func TestInvalidInput(t *testing.T) { setup() updateProjectSetup() - modifyProjectFlags(&(projectConfig.ArchiveProject), false, &(projectConfig.ActivateProject), false) + modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), false, &(DefaultProjectConfig.ActivateProject), false) mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) err = updateProjectsFunc(ctx, args, cmdCtx) assert.NotNil(t, err) diff --git a/flytectl/cmd/update/projectconfig_flags.go b/flytectl/cmd/update/projectconfig_flags.go index f56579fe9f..2139fb0563 100755 --- a/flytectl/cmd/update/projectconfig_flags.go +++ b/flytectl/cmd/update/projectconfig_flags.go @@ -28,6 +28,15 @@ func (ProjectConfig) elemValueOrNil(v interface{}) interface{} { return v } +func (ProjectConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (ProjectConfig) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,7 +50,7 @@ func (ProjectConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg ProjectConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("ProjectConfig", pflag.ExitOnError) - cmdFlags.BoolVarP(&(projectConfig.ActivateProject), fmt.Sprintf("%v%v", prefix, "activateProject"), "t", *new(bool), "Activates the project specified as argument.") - cmdFlags.BoolVarP(&(projectConfig.ArchiveProject), fmt.Sprintf("%v%v", prefix, "archiveProject"), "a", *new(bool), "Archives the project specified as argument.") + cmdFlags.BoolVar(&DefaultProjectConfig.ActivateProject, fmt.Sprintf("%v%v", prefix, "activateProject"), DefaultProjectConfig.ActivateProject, "Activates the project specified as argument.") + cmdFlags.BoolVar(&DefaultProjectConfig.ArchiveProject, fmt.Sprintf("%v%v", prefix, "archiveProject"), DefaultProjectConfig.ArchiveProject, "Archives the project specified as argument.") return cmdFlags } diff --git a/flytectl/cmd/update/projectconfig_flags_test.go b/flytectl/cmd/update/projectconfig_flags_test.go index 4a13ad3aff..c6bc6b262c 100755 --- a/flytectl/cmd/update/projectconfig_flags_test.go +++ b/flytectl/cmd/update/projectconfig_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_ProjectConfig(t *testing.T, val, result interface{}) { assert.NoError(t, decode_ProjectConfig(val, result)) } -func testDecodeSlice_ProjectConfig(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_ProjectConfig(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_ProjectConfig(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestProjectConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_activateProject", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vBool, err := cmdFlags.GetBool("activateProject"); err == nil { - assert.Equal(t, bool(*new(bool)), vBool) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -122,14 +114,6 @@ func TestProjectConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_archiveProject", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vBool, err := cmdFlags.GetBool("archiveProject"); err == nil { - assert.Equal(t, bool(*new(bool)), vBool) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 34ab70c21c..8485f32043 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -35,7 +35,7 @@ func CreateUpdateCommand() *cobra.Command { updateResourcesFuncs := map[string]cmdCore.CommandEntry{ "launchplan": {CmdFunc: updateLPFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateLPShort, Long: updateLPLong}, - "project": {CmdFunc: updateProjectsFunc, Aliases: []string{}, ProjectDomainNotRequired: true, PFlagProvider: projectConfig, + "project": {CmdFunc: updateProjectsFunc, Aliases: []string{}, ProjectDomainNotRequired: true, PFlagProvider: DefaultProjectConfig, Short: projectShort, Long: projectLong}, "task": {CmdFunc: updateTaskFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateTaskShort, Long: updateTaskLong}, diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 174ba88661..e81e77ac7c 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -24,13 +24,13 @@ Retrieves execution by name within project and domain. Retrieves all the executions with filters. :: - bin/flytectl get execution -p flytesnacks -d development --filter.field-selector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" + bin/flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" Retrieves all the execution with limit and sorting. :: - bin/flytectl get execution -p flytesnacks -d development --filter.sort-by=created_at --filter.limit=1 --filter.asc + bin/flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc Retrieves all the execution within project and domain in yaml format @@ -82,13 +82,13 @@ Options :: - --details gets node execution details. Only applicable for single execution name i.e get execution name --details - --filter.asc Specifies the sorting order. By default flytectl sort result in descending order - --filter.field-selector string Specifies the Field selector - --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort results (default "created_at") - -h, --help help for execution - --nodeId string get task executions for given node name. + --details gets node execution details. Only applicable for single execution name i.e get execution name --details + --filter.asc Specifies the sorting order. By default flytectl sort result in descending order + --filter.fieldSelector string Specifies the Field selector + --filter.limit int32 Specifies the limit (default 100) + --filter.sortBy string Specifies which field to sort results (default "created_at") + -h, --help help for execution + --nodeId string get task executions for given node name. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index f50798c59c..51c936f264 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -37,18 +37,18 @@ Retrieves particular version of launchplan by name within project and domain. Retrieves all the launch plans with filters. :: - bin/flytectl get launchplan -p flytesnacks -d development --filter.field-selector="name=core.basic.lp.go_greet" + bin/flytectl get launchplan -p flytesnacks -d development --filter.fieldSelector="name=core.basic.lp.go_greet" Retrieves launch plans entity search across all versions with filters. :: - bin/flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.field-selector="version=v1" + bin/flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="version=v1" Retrieves all the launch plans with limit and sorting. :: - bin/flytectl get launchplan -p flytesnacks -d development --filter.sort-by=created_at --filter.limit=1 --filter.asc + bin/flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc Retrieves all the launchplan within project and domain in yaml format. @@ -99,14 +99,14 @@ Options :: - --execFile string execution file name to be used for generating execution spec of a single launchplan. - --filter.asc Specifies the sorting order. By default flytectl sort result in descending order - --filter.field-selector string Specifies the Field selector - --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort result by - -h, --help help for launchplan - --latest flag to indicate to fetch the latest version, version flag will be ignored in this case - --version string version of the launchplan to be fetched. + --execFile string execution file name to be used for generating execution spec of a single launchplan. + --filter.asc Specifies the sorting order. By default flytectl sort result in descending order + --filter.fieldSelector string Specifies the Field selector + --filter.limit int32 Specifies the limit (default 100) + --filter.sortBy string Specifies which field to sort results (default "created_at") + -h, --help help for launchplan + --latest flag to indicate to fetch the latest version, version flag will be ignored in this case + --version string version of the launchplan to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 7aafa4e606..541f9e9a2d 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -24,12 +24,12 @@ Retrieves project by name Retrieves all the projects with filters. :: - bin/flytectl get project --filter.field-selector="project.name=flytesnacks" + bin/flytectl get project --filter.fieldSelector="project.name=flytesnacks" Retrieves all the projects with limit and sorting. :: - bin/flytectl get project --filter.sort-by=created_at --filter.limit=1 --filter.asc + bin/flytectl get project --filter.sortBy=created_at --filter.limit=1 --filter.asc Retrieves all the projects in yaml format @@ -55,11 +55,11 @@ Options :: - --filter.asc Specifies the sorting order. By default flytectl sort result in descending order - --filter.field-selector string Specifies the Field selector - --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort result by - -h, --help help for project + --filter.asc Specifies the sorting order. By default flytectl sort result in descending order + --filter.fieldSelector string Specifies the Field selector + --filter.limit int32 Specifies the limit (default 100) + --filter.sortBy string Specifies which field to sort results (default "created_at") + -h, --help help for project Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index c94f945b18..49148043bb 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -36,17 +36,17 @@ Retrieves particular version of task by name within project and domain. Retrieves all the tasks with filters. :: - bin/flytectl get task -p flytesnacks -d development --filter.field-selector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" + bin/flytectl get task -p flytesnacks -d development --filter.fieldSelector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" Retrieve a specific task with filters. :: - bin/flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.field-selector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" + bin/flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.fieldSelector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" Retrieves all the task with limit and sorting. :: - bin/flytectl get -p flytesnacks -d development task --filter.sort-by=created_at --filter.limit=1 --filter.asc + bin/flytectl get -p flytesnacks -d development task --filter.sortBy=created_at --filter.limit=1 --filter.asc Retrieves all the tasks within project and domain in yaml format. :: @@ -95,14 +95,14 @@ Options :: - --execFile string execution file name to be used for generating execution spec of a single task. - --filter.asc Specifies the sorting order. By default flytectl sort result in descending order - --filter.field-selector string Specifies the Field selector - --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort result by - -h, --help help for task - --latest flag to indicate to fetch the latest version, version flag will be ignored in this case - --version string version of the task to be fetched. + --execFile string execution file name to be used for generating execution spec of a single task. + --filter.asc Specifies the sorting order. By default flytectl sort result in descending order + --filter.fieldSelector string Specifies the Field selector + --filter.limit int32 Specifies the limit (default 100) + --filter.sortBy string Specifies which field to sort results (default "created_at") + -h, --help help for task + --latest flag to indicate to fetch the latest version, version flag will be ignored in this case + --version string version of the task to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 63a55c3a4e..6c8ec19195 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -36,17 +36,17 @@ Retrieves particular version of workflow by name within project and domain. Retrieves all the workflows with filters. :: - bin/flytectl get workflow -p flytesnacks -d development --filter.field-selector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" + bin/flytectl get workflow -p flytesnacks -d development --filter.fieldSelector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" Retrieve specific workflow with filters. :: - bin/flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.field-selector="workflow.version=v1" + bin/flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="workflow.version=v1" Retrieves all the workflows with limit and sorting. :: - bin/flytectl get -p flytesnacks -d development workflow --filter.sort-by=created_at --filter.limit=1 --filter.asc + bin/flytectl get -p flytesnacks -d development workflow --filter.sortBy=created_at --filter.limit=1 --filter.asc Retrieves all the workflow within project and domain in yaml format. @@ -84,13 +84,13 @@ Options :: - --filter.asc Specifies the sorting order. By default flytectl sort result in descending order - --filter.field-selector string Specifies the Field selector - --filter.limit int32 Specifies the limit (default 100) - --filter.sort-by string Specifies which field to sort results (default "created_at") - -h, --help help for workflow - --latest flag to indicate to fetch the latest version, version flag will be ignored in this case - --version string version of the workflow to be fetched. + --filter.asc Specifies the sorting order. By default flytectl sort result in descending order + --filter.fieldSelector string Specifies the Field selector + --filter.limit int32 Specifies the limit (default 100) + --filter.sortBy string Specifies which field to sort results (default "created_at") + -h, --help help for workflow + --latest flag to indicate to fetch the latest version, version flag will be ignored in this case + --version string version of the workflow to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 1a32690879..b1929fc1ea 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -28,14 +28,14 @@ Options :: - -a, --archive pass in archive file either an http link or local path. - -i, --assumableIamRole string Custom assumable iam auth role to register launch plans with. + --archive pass in archive file either an http link or local path. + --assumableIamRole string custom assumable iam auth role to register launch plans with. --continueOnError continue on error when registering files. -h, --help help for examples - -k, --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. - -l, --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). + --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. + --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). --sourceUploadPath string Location for source code in storage. - -v, --version string version of the entity to be registered with flyte. (default "v1") + --version string version of the entity to be registered with flyte. (default "v1") Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 2e3207d832..55e8bab2bb 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -20,12 +20,12 @@ There is no difference between registration and fast registration, In fast regis SourceUploadPath is an optional flag. By default, flytectl will create SourceUploadPath from your storage config. In case of s3 flytectl will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 + bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 In case of fast registration, If the SourceUploadPath flag is defined then In this case flytectl will not use the default directory for uploading the source code, it will override the destination path on the registration :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 --SourceUploadPath="s3://dummy/fast" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" Using archive file.Currently supported are .tgz and .tar extension files and can be local or remote file served through http/https. Use --archive flag. @@ -54,7 +54,7 @@ Using short format of continueOnError flag Overriding the default version v1 using version string. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks -v v2 + bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 Change the o/p format has not effect on registration. The O/p is currently available only in table format. @@ -66,19 +66,19 @@ Override IamRole during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -i "arn:aws:iam::123456789:role/dummy" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -i "arn:aws:iam::123456789:role/dummy" Override Kubernetes service account during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -k "kubernetes-service-account" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -k "kubernetes-service-account" Override Output location prefix during registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -v v2 -l "s3://dummy/prefix" + bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -l "s3://dummy/prefix" Usage @@ -92,14 +92,14 @@ Options :: - -a, --archive pass in archive file either an http link or local path. - -i, --assumableIamRole string Custom assumable iam auth role to register launch plans with. + --archive pass in archive file either an http link or local path. + --assumableIamRole string custom assumable iam auth role to register launch plans with. --continueOnError continue on error when registering files. -h, --help help for files - -k, --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. - -l, --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). + --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. + --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). --sourceUploadPath string Location for source code in storage. - -v, --version string version of the entity to be registered with flyte. (default "v1") + --version string version of the entity to be registered with flyte. (default "v1") Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 9c98daa2ef..0bc98036df 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -37,9 +37,9 @@ Options :: - --activate Activates the named entity specified as argument. - --archive Archives the named entity specified as argument. - --description string description of the namedentity. + --activate activate the named entity. + --archive archive named entity. + --description string description of the named entity. -h, --help help for launchplan Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index e7b4665448..437df1e0cd 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -22,34 +22,23 @@ Archives project named flytesnacks. bin/flytectl update project -p flytesnacks --archiveProject -Activates project named flytesnacks using short option -t. -:: - - bin/flytectl update project -p flytesnacks -t - -Archives project named flytesnacks using short option -a. - -:: - - bin/flytectl update project flytesnacks -a - Incorrect usage when passing both archive and activate. :: - bin/flytectl update project flytesnacks -a -t + bin/flytectl update project flytesnacks --archiveProject --activateProject Incorrect usage when passing unknown-project. :: - bin/flytectl update project unknown-project -a + bin/flytectl update project unknown-project --archiveProject Incorrect usage when passing valid project using -p option. :: - bin/flytectl update project unknown-project -a -p known-project + bin/flytectl update project unknown-project --archiveProject -p known-project Usage @@ -63,8 +52,8 @@ Options :: - -t, --activateProject Activates the project specified as argument. - -a, --archiveProject Archives the project specified as argument. + --activateProject Activates the project specified as argument. + --archiveProject Archives the project specified as argument. -h, --help help for project Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst index 954071ee2a..f82ef9a7a1 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -37,9 +37,9 @@ Options :: - --activate Activates the named entity specified as argument. - --archive Archives the named entity specified as argument. - --description string description of the namedentity. + --activate activate the named entity. + --archive archive named entity. + --description string description of the named entity. -h, --help help for task Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst index 14f28a4082..b9d9abc384 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -37,9 +37,9 @@ Options :: - --activate Activates the named entity specified as argument. - --archive Archives the named entity specified as argument. - --description string description of the namedentity. + --activate activate the named entity. + --archive archive named entity. + --description string description of the named entity. -h, --help help for workflow Options inherited from parent commands diff --git a/flytectl/pkg/adminutils/config.go b/flytectl/pkg/adminutils/config.go index f47ae8276b..71f0a3f476 100644 --- a/flytectl/pkg/adminutils/config.go +++ b/flytectl/pkg/adminutils/config.go @@ -2,14 +2,14 @@ package adminutils import "github.com/flyteorg/flytestdlib/config" -//go:generate pflags Config +//go:generate pflags Config --default-var DefaultConfig --bind-default-var var ( - defaultConfig = &Config{ + DefaultConfig = &Config{ MaxRecords: 500, BatchSize: 100, } - section = config.MustRegisterSection("adminutils", defaultConfig) + section = config.MustRegisterSection("adminutils", DefaultConfig) ) type Config struct { diff --git a/flytectl/pkg/adminutils/config_flags.go b/flytectl/pkg/adminutils/config_flags.go index 5a3c9a2c4d..f62caa371c 100755 --- a/flytectl/pkg/adminutils/config_flags.go +++ b/flytectl/pkg/adminutils/config_flags.go @@ -28,6 +28,15 @@ func (Config) elemValueOrNil(v interface{}) interface{} { return v } +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + func (Config) mustMarshalJSON(v json.Marshaler) string { raw, err := v.MarshalJSON() if err != nil { @@ -41,7 +50,7 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.Int(fmt.Sprintf("%v%v", prefix, "maxRecords"), defaultConfig.MaxRecords, "Maximum number of records to retrieve.") - cmdFlags.Int(fmt.Sprintf("%v%v", prefix, "batchSize"), defaultConfig.BatchSize, "Maximum number of records to retrieve per call.") + cmdFlags.IntVar(&DefaultConfig.MaxRecords, fmt.Sprintf("%v%v", prefix, "maxRecords"), DefaultConfig.MaxRecords, "Maximum number of records to retrieve.") + cmdFlags.IntVar(&DefaultConfig.BatchSize, fmt.Sprintf("%v%v", prefix, "batchSize"), DefaultConfig.BatchSize, "Maximum number of records to retrieve per call.") return cmdFlags } diff --git a/flytectl/pkg/adminutils/config_flags_test.go b/flytectl/pkg/adminutils/config_flags_test.go index 1f7cf5ec73..de285339d1 100755 --- a/flytectl/pkg/adminutils/config_flags_test.go +++ b/flytectl/pkg/adminutils/config_flags_test.go @@ -84,7 +84,7 @@ func testDecodeJson_Config(t *testing.T, val, result interface{}) { assert.NoError(t, decode_Config(val, result)) } -func testDecodeSlice_Config(t *testing.T, vStringSlice, result interface{}) { +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { assert.NoError(t, decode_Config(vStringSlice, result)) } @@ -100,14 +100,6 @@ func TestConfig_SetFlags(t *testing.T) { assert.True(t, cmdFlags.HasFlags()) t.Run("Test_maxRecords", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vInt, err := cmdFlags.GetInt("maxRecords"); err == nil { - assert.Equal(t, int(defaultConfig.MaxRecords), vInt) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" @@ -122,14 +114,6 @@ func TestConfig_SetFlags(t *testing.T) { }) }) t.Run("Test_batchSize", func(t *testing.T) { - t.Run("DefaultValue", func(t *testing.T) { - // Test that default value is set properly - if vInt, err := cmdFlags.GetInt("batchSize"); err == nil { - assert.Equal(t, int(defaultConfig.BatchSize), vInt) - } else { - assert.FailNow(t, err.Error()) - } - }) t.Run("Override", func(t *testing.T) { testValue := "1" diff --git a/flytectl/pkg/adminutils/config_test.go b/flytectl/pkg/adminutils/config_test.go deleted file mode 100644 index 5a8fd5134d..0000000000 --- a/flytectl/pkg/adminutils/config_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package adminutils - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestGetConfig(t *testing.T) { - defaultConfig = &Config{ - MaxRecords: 500, - BatchSize: 100, - } - c := GetConfig() - assert.Equal(t, defaultConfig.BatchSize, c.BatchSize) - assert.Equal(t, defaultConfig.MaxRecords, c.MaxRecords) -} diff --git a/flytectl/pkg/filters/type.go b/flytectl/pkg/filters/type.go index 5dbad76923..6dabc0904d 100644 --- a/flytectl/pkg/filters/type.go +++ b/flytectl/pkg/filters/type.go @@ -10,8 +10,8 @@ var ( ) type Filters struct { - FieldSelector string `json:"field-selector" pflag:",Specifies the Field selector"` - SortBy string `json:"sort-by" pflag:",Specifies which field to sort results "` + FieldSelector string `json:"fieldSelector" pflag:",Specifies the Field selector"` + SortBy string `json:"sortBy" pflag:",Specifies which field to sort results "` // TODO: Support paginated queries Limit int32 `json:"limit" pflag:",Specifies the limit"` Asc bool `json:"asc" pflag:",Specifies the sorting order. By default flytectl sort result in descending order"` From fb6eb2d3e3b0c2f45f1e49460394f9c7a034dcc9 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Fri, 9 Jul 2021 15:09:41 -0700 Subject: [PATCH 102/645] Graphviz does not like hyphens #patch (#141) * Cluster names cannot have `-` in them. Signed-off-by: Ketan Umare * clusters with labels Signed-off-by: Ketan Umare --- flytectl/go.sum | 2 -- flytectl/pkg/visualize/graphviz.go | 10 ++++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flytectl/go.sum b/flytectl/go.sum index b5433777b6..802b4060f5 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -339,8 +339,6 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.19.8 h1:jWWIEnFMgJCZm/XK25Xts4+kQhoOrd5dWgLj/fLsbIg= -github.com/flyteorg/flyteidl v0.19.8/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flyteidl v0.19.9 h1:1j4/YbV/G1m2hrK017F9K0JYZYxCCwf4qtEkiNnUiEw= github.com/flyteorg/flyteidl v0.19.9/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= diff --git a/flytectl/pkg/visualize/graphviz.go b/flytectl/pkg/visualize/graphviz.go index 314c325148..08aa188716 100644 --- a/flytectl/pkg/visualize/graphviz.go +++ b/flytectl/pkg/visualize/graphviz.go @@ -229,8 +229,9 @@ func (gb *graphBuilder) constructNode(parentGraphName string, prefix string, gra } gb.nodeClusters[name] = parentGraphName case *core.Node_BranchNode: - branchSubGraphName := SubgraphPrefix + n.Metadata.Name - err := graph.AddSubGraph(parentGraphName, branchSubGraphName, nil) + sanitizedName := strings.ReplaceAll(n.Metadata.Name, "-", "_") + branchSubGraphName := SubgraphPrefix + sanitizedName + err := graph.AddSubGraph(parentGraphName, branchSubGraphName, map[string]string{LabelAttr: sanitizedName}) if err != nil { return nil, err } @@ -247,8 +248,9 @@ func (gb *graphBuilder) constructNode(parentGraphName string, prefix string, gra return nil, err } } else { - subGraphName := SubgraphPrefix + name - err := graph.AddSubGraph(parentGraphName, subGraphName, nil) + sanitizedName := strings.ReplaceAll(name, "-", "_") + subGraphName := SubgraphPrefix + sanitizedName + err := graph.AddSubGraph(parentGraphName, subGraphName, map[string]string{LabelAttr: sanitizedName}) if err != nil { return nil, err } From ab171cdefc9e096d4cd34e733d144d74c57b01d7 Mon Sep 17 00:00:00 2001 From: Haytham Abuelfutuh Date: Fri, 9 Jul 2021 21:05:21 -0700 Subject: [PATCH 103/645] Add pflag binding and fix loading of config (#135) --- flytectl/cmd/config/config.go | 9 +- flytectl/cmd/config/config_flags.go | 57 --------- flytectl/cmd/config/config_flags_test.go | 144 ----------------------- flytectl/cmd/root.go | 15 ++- flytectl/config.yaml | 1 + flytectl/go.mod | 2 +- flytectl/go.sum | 4 +- 7 files changed, 23 insertions(+), 209 deletions(-) delete mode 100755 flytectl/cmd/config/config_flags.go delete mode 100755 flytectl/cmd/config/config_flags_test.go diff --git a/flytectl/cmd/config/config.go b/flytectl/cmd/config/config.go index d038c316f5..c20f2bc2ef 100644 --- a/flytectl/cmd/config/config.go +++ b/flytectl/cmd/config/config.go @@ -9,11 +9,12 @@ import ( "github.com/flyteorg/flytectl/pkg/printer" ) -//go:generate pflags Config --bind-default-var - var ( - defaultConfig = &Config{} - section = config.MustRegisterSection("root", defaultConfig) + defaultConfig = &Config{ + Output: printer.OutputFormatTABLE.String(), + } + + section = config.MustRegisterSection("root", defaultConfig) ) // Config hold configration for flytectl flag diff --git a/flytectl/cmd/config/config_flags.go b/flytectl/cmd/config/config_flags.go deleted file mode 100755 index f219394ffb..0000000000 --- a/flytectl/cmd/config/config_flags.go +++ /dev/null @@ -1,57 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package config - -import ( - "encoding/json" - "reflect" - - "fmt" - - "github.com/spf13/pflag" -) - -// If v is a pointer, it will get its element value or the zero value of the element type. -// If v is not a pointer, it will return it as is. -func (Config) elemValueOrNil(v interface{}) interface{} { - if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { - if reflect.ValueOf(v).IsNil() { - return reflect.Zero(t.Elem()).Interface() - } else { - return reflect.ValueOf(v).Interface() - } - } else if v == nil { - return reflect.Zero(t).Interface() - } - - return v -} - -func (Config) mustJsonMarshal(v interface{}) string { - raw, err := json.Marshal(v) - if err != nil { - panic(err) - } - - return string(raw) -} - -func (Config) mustMarshalJSON(v json.Marshaler) string { - raw, err := v.MarshalJSON() - if err != nil { - panic(err) - } - - return string(raw) -} - -// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the -// flags is json-name.json-sub-name... etc. -func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&defaultConfig.Project, fmt.Sprintf("%v%v", prefix, "project"), defaultConfig.Project, "Specifies the project to work on.") - cmdFlags.StringVar(&defaultConfig.Domain, fmt.Sprintf("%v%v", prefix, "domain"), defaultConfig.Domain, "Specified the domain to work on.") - cmdFlags.StringVar(&defaultConfig.Output, fmt.Sprintf("%v%v", prefix, "output"), defaultConfig.Output, "Specified the output type.") - return cmdFlags -} diff --git a/flytectl/cmd/config/config_flags_test.go b/flytectl/cmd/config/config_flags_test.go deleted file mode 100755 index 88446ff3e3..0000000000 --- a/flytectl/cmd/config/config_flags_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package config - -import ( - "encoding/json" - "fmt" - "reflect" - "strings" - "testing" - - "github.com/mitchellh/mapstructure" - "github.com/stretchr/testify/assert" -) - -var dereferencableKindsConfig = map[reflect.Kind]struct{}{ - reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, -} - -// Checks if t is a kind that can be dereferenced to get its underlying type. -func canGetElementConfig(t reflect.Kind) bool { - _, exists := dereferencableKindsConfig[t] - return exists -} - -// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the -// object. Otherwise, it'll just pass on the original data. -func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { - unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() - if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || - (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { - - raw, err := json.Marshal(data) - if err != nil { - fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) - return data, nil - } - - res := reflect.New(to).Interface() - err = json.Unmarshal(raw, &res) - if err != nil { - fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) - return data, nil - } - - return res, nil - } - - return data, nil -} - -func decode_Config(input, result interface{}) error { - config := &mapstructure.DecoderConfig{ - TagName: "json", - WeaklyTypedInput: true, - Result: result, - DecodeHook: mapstructure.ComposeDecodeHookFunc( - mapstructure.StringToTimeDurationHookFunc(), - mapstructure.StringToSliceHookFunc(","), - jsonUnmarshalerHookConfig, - ), - } - - decoder, err := mapstructure.NewDecoder(config) - if err != nil { - return err - } - - return decoder.Decode(input) -} - -func join_Config(arr interface{}, sep string) string { - listValue := reflect.ValueOf(arr) - strs := make([]string, 0, listValue.Len()) - for i := 0; i < listValue.Len(); i++ { - strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) - } - - return strings.Join(strs, sep) -} - -func testDecodeJson_Config(t *testing.T, val, result interface{}) { - assert.NoError(t, decode_Config(val, result)) -} - -func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { - assert.NoError(t, decode_Config(vStringSlice, result)) -} - -func TestConfig_GetPFlagSet(t *testing.T) { - val := Config{} - cmdFlags := val.GetPFlagSet("") - assert.True(t, cmdFlags.HasFlags()) -} - -func TestConfig_SetFlags(t *testing.T) { - actual := Config{} - cmdFlags := actual.GetPFlagSet("") - assert.True(t, cmdFlags.HasFlags()) - - t.Run("Test_project", func(t *testing.T) { - - t.Run("Override", func(t *testing.T) { - testValue := "1" - - cmdFlags.Set("project", testValue) - if vString, err := cmdFlags.GetString("project"); err == nil { - testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Project) - - } else { - assert.FailNow(t, err.Error()) - } - }) - }) - t.Run("Test_domain", func(t *testing.T) { - - t.Run("Override", func(t *testing.T) { - testValue := "1" - - cmdFlags.Set("domain", testValue) - if vString, err := cmdFlags.GetString("domain"); err == nil { - testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Domain) - - } else { - assert.FailNow(t, err.Error()) - } - }) - }) - t.Run("Test_output", func(t *testing.T) { - - t.Run("Override", func(t *testing.T) { - testValue := "1" - - cmdFlags.Set("output", testValue) - if vString, err := cmdFlags.GetString("output"); err == nil { - testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Output) - - } else { - assert.FailNow(t, err.Error()) - } - }) - }) -} diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 70691d1751..9995b42774 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -47,6 +47,8 @@ func newRootCmd() *cobra.Command { rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file (default is $HOME/.flyte/config.yaml)") + configAccessor.InitializePflags(rootCmd.PersistentFlags()) + // Due to https://github.com/flyteorg/flyte/issues/341, project flag will have to be specified as // --root.project, this adds a convenience on top to allow --project to be used rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Project), "project", "p", "", "Specifies the Flyte project.") @@ -69,19 +71,30 @@ func newRootCmd() *cobra.Command { return rootCmd } -func initConfig(_ *cobra.Command, _ []string) error { +func initConfig(cmd *cobra.Command, _ []string) error { configFile := f.FilePathJoin(f.UserHomeDir(), configFileDir, configFileName) if len(os.Getenv("FLYTECTL_CONFIG")) > 0 { configFile = os.Getenv("FLYTECTL_CONFIG") } + if len(cfgFile) > 0 { configFile = cfgFile } + configAccessor = viper.NewAccessor(stdConfig.Options{ StrictMode: true, SearchPaths: []string{configFile}, }) + // persistent flags were initially bound to the root command so we must bind to the same command to avoid + // overriding those initial ones. We need to traverse up to the root command and initialize pflags for that. + rootCmd := cmd + for rootCmd.Parent() != nil { + rootCmd = rootCmd.Parent() + } + + configAccessor.InitializePflags(rootCmd.PersistentFlags()) + err := configAccessor.UpdateConfig(context.TODO()) if err != nil { return err diff --git a/flytectl/config.yaml b/flytectl/config.yaml index 82b0ed8704..6447502e59 100644 --- a/flytectl/config.yaml +++ b/flytectl/config.yaml @@ -2,6 +2,7 @@ admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: dns:///localhost:30081 insecure: true + authType: Pkce logger: show-source: true level: 0 diff --git a/flytectl/go.mod b/flytectl/go.mod index 67f26af2a7..1c518389af 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -11,7 +11,7 @@ require ( github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 github.com/flyteorg/flyteidl v0.19.9 - github.com/flyteorg/flytestdlib v0.3.24 + github.com/flyteorg/flytestdlib v0.3.28 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 github.com/google/go-cmp v0.5.6 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index 802b4060f5..ed5d175028 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -342,8 +342,8 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/flyteorg/flyteidl v0.19.9 h1:1j4/YbV/G1m2hrK017F9K0JYZYxCCwf4qtEkiNnUiEw= github.com/flyteorg/flyteidl v0.19.9/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= -github.com/flyteorg/flytestdlib v0.3.24 h1:Eu5TMKch9ihOavPKufgTBI677eVYjJpOAPPg9hfZIzU= -github.com/flyteorg/flytestdlib v0.3.24/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= +github.com/flyteorg/flytestdlib v0.3.28 h1:bvyldApjlUy9ETxSFpYvLhYLJxxndnMZTf93rVG6a00= +github.com/flyteorg/flytestdlib v0.3.28/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= From 81471f18cab1db220784dac932b6b11fa79bf04d Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Sat, 10 Jul 2021 09:37:26 +0530 Subject: [PATCH 104/645] #none fixed storage config in docs (#138) --- flytectl/docs/source/index.rst | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index c3b2a58db1..c9d94fa3d7 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -56,8 +56,8 @@ Basic Configuration admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: dns:///localhost:30081 - insecure: true - authType: Pkce # if using authentication or just drop this. If insecure set insecure: True + insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + authType: Pkce # authType: Pkce # if using authentication or just drop this. storage: connection: access-key: minio @@ -76,12 +76,15 @@ Basic Configuration admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: dns:/// - authType: Pkce # if using authentication or just drop this. If insecure set insecure: True + authType: Pkce # authType: Pkce # if using authentication or just drop this. + insecure: true # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) storage: - kind: s3 - config: - auth_type: iam - region: # Example: us-east-2 + type: stow + stow: + kind: s3 + config: + auth_type: iam + region: # Example: us-east-2 container: # Example my-bucket. Flyte k8s cluster / service account for execution should have read access to this bucket .. tab:: GCS Configuration @@ -91,13 +94,16 @@ Basic Configuration admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: dns:/// - authType: Pkce # if using authentication or just drop this. If insecure set insecure: True + authType: Pkce # authType: Pkce # if using authentication or just drop this. + insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) storage: - kind: google - config: - json: "" - project_id: # TODO: replace with the GCP project ID - scopes: https://www.googleapis.com/auth/devstorage.read_write + type: stow + stow: + kind: s3 + config: + json: "" + project_id: # TODO: replace with the GCP project ID + scopes: https://www.googleapis.com/auth/devstorage.read_write container: # Example my-bucket. Flyte k8s cluster / service account for execution should have access to this bucket .. tab:: Others From 41e0a4006e4d930f0438044b5c8d2dd99bd03588 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Sun, 11 Jul 2021 17:13:22 +0530 Subject: [PATCH 105/645] #none Fix DCO make target (#139) * Fix DCO make target Signed-off-by: Yuvraj * added github checkout depth to 2 Signed-off-by: Yuvraj --- flytectl/.github/workflows/build.yaml | 2 +- flytectl/docs/CONTRIBUTING.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml index efdceac3d7..48b9425a89 100644 --- a/flytectl/.github/workflows/build.yaml +++ b/flytectl/.github/workflows/build.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v2 with: - fetch-depth: "0" + fetch-depth: "2" - uses: actions/cache@v2 with: path: | diff --git a/flytectl/docs/CONTRIBUTING.md b/flytectl/docs/CONTRIBUTING.md index 1f93087df8..f170374b9e 100644 --- a/flytectl/docs/CONTRIBUTING.md +++ b/flytectl/docs/CONTRIBUTING.md @@ -20,6 +20,6 @@ Flyte ships commit hooks that allow you to auto-generate the DCO signoff line if it doesn't exist when you run `git commit`. Simply navigate to the flytectl project root and run ```bash -make dco +make setup-precommit ``` From 03be16bde5835604ae5a682ed909745df61c653f Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 12 Jul 2021 14:01:47 +0530 Subject: [PATCH 106/645] Added version flag in sandbox (#137) * Added version flag in the sandbox Signed-off-by: Yuvraj --- .../config/subcommand/sandbox/config_flags.go | 1 + .../subcommand/sandbox/config_flags_test.go | 14 +++ .../subcommand/sandbox/sandbox_config.go | 3 +- flytectl/cmd/sandbox/start.go | 76 +++++++++--- flytectl/cmd/sandbox/start_test.go | 108 +++++++++++++++--- flytectl/cmd/version/version.go | 39 +++---- flytectl/cmd/version/version_test.go | 29 ++--- flytectl/pkg/util/util.go | 32 +++++- flytectl/pkg/util/util_test.go | 34 ++++++ 9 files changed, 261 insertions(+), 75 deletions(-) diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index b727f8a04d..7126d6a2e3 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -51,5 +51,6 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) cmdFlags.StringVar(&DefaultConfig.Source, fmt.Sprintf("%v%v", prefix, "source"), DefaultConfig.Source, " Path of your source code") + cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "Version of flyte") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index 09d41aa631..f01337ec13 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -113,4 +113,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_version", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("version", testValue) + if vString, err := cmdFlags.GetString("version"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Version) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index 833a950495..5d3bfa9184 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -7,5 +7,6 @@ var ( //Config type Config struct { - Source string `json:"source" pflag:", Path of your source code"` + Source string `json:"source" pflag:",Path of your source code"` + Version string `json:"version" pflag:",Version of flyte"` } diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 5853ee5060..a1de9e2f6f 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -8,6 +8,9 @@ import ( "os" "path/filepath" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" + "github.com/flyteorg/flytectl/pkg/util" + "github.com/flyteorg/flytectl/pkg/docker" "github.com/docker/docker/api/types/mount" @@ -30,9 +33,22 @@ Mount your source code repository inside sandbox :: bin/flytectl sandbox start --source=$HOME/flyteorg/flytesnacks + +Run specific version of flyte, Only available after v0.14.0+ +:: + + bin/flytectl sandbox start --version=v0.14.0 Usage ` + GeneratedManifest = "/flyteorg/share/flyte_generated.yaml" + FlyteReleaseURL = "/flyteorg/flyte/releases/download/%v/flyte_sandbox_manifest.yaml" + FlyteMinimumVersionSupported = "v0.14.0" + GithubURL = "https://github.com" +) + +var ( + FlyteManifest = f.FilePathJoin(f.UserHomeDir(), ".flyte", "flyte_generated.yaml") ) type ExecResult struct { @@ -57,6 +73,10 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio.Scanner, error) { fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) + if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { + return nil, err + } + if err := docker.SetupFlyteDir(); err != nil { return nil, err } @@ -65,25 +85,15 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu return nil, err } - if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { + if err := mountSourceCode(); err != nil { return nil, err } - if len(sandboxConfig.DefaultConfig.Source) > 0 { - source, err := filepath.Abs(sandboxConfig.DefaultConfig.Source) - if err != nil { - return nil, err - } - docker.Volumes = append(docker.Volumes, mount.Mount{ - Type: mount.TypeBind, - Source: source, - Target: docker.Source, - }) + if err := mountFlyteManifest(sandboxConfig.DefaultConfig.Version); err != nil { + return nil, err } fmt.Printf("%v pulling docker image %s\n", emoji.Whale, docker.ImageName) - os.Setenv("KUBECONFIG", docker.Kubeconfig) - os.Setenv("FLYTECTL_CONFIG", docker.FlytectlConfig) if err := docker.PullDockerImage(ctx, cli, docker.ImageName); err != nil { return nil, err } @@ -111,3 +121,43 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu return logReader, nil } + +func mountSourceCode() error { + if len(sandboxConfig.DefaultConfig.Source) > 0 { + source, err := filepath.Abs(sandboxConfig.DefaultConfig.Source) + if err != nil { + return err + } + docker.Volumes = append(docker.Volumes, mount.Mount{ + Type: mount.TypeBind, + Source: source, + Target: docker.Source, + }) + } + return nil +} + +func mountFlyteManifest(version string) error { + if len(version) > 0 { + isGreater, err := util.IsVersionGreaterThan(version, FlyteMinimumVersionSupported) + if err != nil { + return err + } + if !isGreater { + return fmt.Errorf("version flag only support %s+ flyte version", FlyteMinimumVersionSupported) + } + response, err := util.GetRequest(GithubURL, fmt.Sprintf(FlyteReleaseURL, version)) + if err != nil { + return err + } + if err := util.WriteIntoFile(response, FlyteManifest); err != nil { + return err + } + docker.Volumes = append(docker.Volumes, mount.Mount{ + Type: mount.TypeBind, + Source: FlyteManifest, + Target: GeneratedManifest, + }) + } + return nil +} diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index 042860ed60..3e06516936 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -63,7 +63,8 @@ func TestStartSandboxFunc(t *testing.T) { bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := append(docker.Volumes, mount.Mount{ + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, @@ -101,7 +102,8 @@ func TestStartSandboxFunc(t *testing.T) { sandboxConfig.DefaultConfig.Source = "../" absPath, err := filepath.Abs(sandboxConfig.DefaultConfig.Source) assert.Nil(t, err) - volumes := append(docker.Volumes, mount.Mount{ + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ Type: mount.TypeBind, Source: absPath, Target: docker.Source, @@ -131,13 +133,90 @@ func TestStartSandboxFunc(t *testing.T) { _, err = startSandbox(ctx, mockDocker, os.Stdin) assert.Nil(t, err) }) + t.Run("Successfully run sandbox cluster with specific version", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Version = "v0.15.0" + sandboxConfig.DefaultConfig.Source = "" + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ + Type: mount.TypeBind, + Source: FlyteManifest, + Target: GeneratedManifest, + }) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err := startSandbox(ctx, mockDocker, os.Stdin) + assert.Nil(t, err) + }) + t.Run("Failed run sandbox cluster with wrong version", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Version = "v0.13.0" + sandboxConfig.DefaultConfig.Source = "" + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ + Type: mount.TypeBind, + Source: FlyteManifest, + Target: GeneratedManifest, + }) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err := startSandbox(ctx, mockDocker, os.Stdin) + assert.NotNil(t, err) + }) t.Run("Error in pulling image", func(t *testing.T) { ctx := context.Background() errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := append(docker.Volumes, mount.Mount{ + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, @@ -173,7 +252,8 @@ func TestStartSandboxFunc(t *testing.T) { bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := append(docker.Volumes, mount.Mount{ + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, @@ -216,19 +296,15 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := append(docker.Volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) + sandboxConfig.DefaultConfig.Source = "" + sandboxConfig.DefaultConfig.Version = "" mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, Image: docker.ImageName, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ - Mounts: volumes, + Mounts: docker.Volumes, PortBindings: p2, Privileged: true, }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ @@ -247,13 +323,18 @@ func TestStartSandboxFunc(t *testing.T) { _, err := startSandbox(ctx, mockDocker, os.Stdin) assert.NotNil(t, err) }) + t.Run("Failed manifest", func(t *testing.T) { + err := mountFlyteManifest("v100.9.9") + assert.NotNil(t, err) + }) t.Run("Error in reading logs", func(t *testing.T) { ctx := context.Background() errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := append(docker.Volumes, mount.Mount{ + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, @@ -289,7 +370,8 @@ func TestStartSandboxFunc(t *testing.T) { bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := append(docker.Volumes, mount.Mount{ + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ Type: mount.TypeBind, Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go index 4510c88aad..a48c9c6f90 100644 --- a/flytectl/cmd/version/version.go +++ b/flytectl/cmd/version/version.go @@ -10,7 +10,6 @@ import ( "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" stdlibversion "github.com/flyteorg/flytestdlib/version" - hversion "github.com/hashicorp/go-version" "github.com/spf13/cobra" ) @@ -23,13 +22,15 @@ Example version. bin/flytectl version ` - latestVersionMessage = "Installed flytectl version is the latest" - upgradeVersionMessage = "A newer version of flytectl is available [%v] Please upgrade using - https://docs.flyte.org/projects/flytectl/en/latest/index.html" flytectlAppName = "flytectl" controlPlanAppName = "controlPlane" - flytectlReleasePath = "/repos/flyteorg/flytectl/releases/latest" + GithubAPIURL = "https://api.github.com" + latestVersionMessage = "Installed flytectl version is the latest" + upgradeVersionMessage = "A newer version of flytectl is available [%v] Please upgrade using - https://docs.flyte.org/projects/flytectl/en/latest/index.html" ) +var flytectlReleasePath = "/repos/flyteorg/flytectl/releases/latest" + type versionOutput struct { // Specifies the Name of app App string `json:"App,omitempty"` @@ -54,13 +55,19 @@ func GetVersionCommand(rootCmd *cobra.Command) map[string]cmdCore.CommandEntry { func getVersion(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { latest, err := getLatestVersion(flytectlReleasePath) if err != nil { - return err + logger.Errorf(ctx, "Get latest version of flyte got failed", err) } - message, err := compareVersion(latest, stdlibversion.Version) + isGreater, err := util.IsVersionGreaterThan(latest, stdlibversion.Version) if err != nil { - return err + logger.Errorf(ctx, "Error while comparing the flytectl version", err) } + + message := latestVersionMessage + if isGreater { + message = fmt.Sprintf(upgradeVersionMessage, latest) + } + fmt.Println(message) // Print Flytectl if err := printVersion(versionOutput{ @@ -87,22 +94,6 @@ func printVersion(response versionOutput) error { return nil } -func compareVersion(latest, current string) (string, error) { - semanticVersion, err := hversion.NewVersion(latest) - if err != nil { - return "", err - } - currentVersion, err := hversion.NewVersion(current) - if err != nil { - return "", err - } - if currentVersion.LessThan(semanticVersion) { - return fmt.Sprintf(upgradeVersionMessage, latest), nil - } - - return latestVersionMessage, nil -} - func getControlPlaneVersion(ctx context.Context, cmdCtx cmdCore.CommandContext) error { v, err := cmdCtx.AdminClient().GetVersion(ctx, &admin.GetVersionRequest{}) if err != nil || v == nil { @@ -122,7 +113,7 @@ func getControlPlaneVersion(ctx context.Context, cmdCtx cmdCore.CommandContext) } func getLatestVersion(path string) (string, error) { - response, err := util.GetRequest("https://api.github.com", path) + response, err := util.GetRequest(GithubAPIURL, path) if err != nil { return "", err } diff --git a/flytectl/cmd/version/version_test.go b/flytectl/cmd/version/version_test.go index 2366a3a856..08681819b0 100644 --- a/flytectl/cmd/version/version_test.go +++ b/flytectl/cmd/version/version_test.go @@ -90,24 +90,6 @@ func TestVersionUtilFunc(t *testing.T) { assert.NotNil(t, err) assert.Equal(t, len(tag), 0) }) - t.Run("Compare flytectl version when upgrade available", func(t *testing.T) { - message, err := compareVersion("v1.1.21", testVersion) - assert.Nil(t, err) - assert.Equal(t, fmt.Sprintf(upgradeVersionMessage, "v1.1.21"), message) - }) - t.Run("Compare flytectl version", func(t *testing.T) { - message, err := compareVersion(testVersion, testVersion) - assert.Nil(t, err) - assert.Equal(t, latestVersionMessage, message) - }) - t.Run("Error in compare flytectl version", func(t *testing.T) { - _, err := compareVersion("vvvvvvvv", testVersion) - assert.NotNil(t, err) - }) - t.Run("Error in compare flytectl version", func(t *testing.T) { - _, err := compareVersion(testVersion, "vvvvvvvv") - assert.NotNil(t, err) - }) t.Run("Error in getting control plan version", func(t *testing.T) { ctx := context.Background() mockClient := new(mocks.AdminServiceClient) @@ -117,4 +99,15 @@ func TestVersionUtilFunc(t *testing.T) { err := getControlPlaneVersion(ctx, cmdCtx) assert.NotNil(t, err) }) + t.Run("Failed in getting version", func(t *testing.T) { + ctx := context.Background() + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + flytectlReleasePath = "/release" + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + mockClient.OnGetVersionMatch(ctx, &admin.GetVersionRequest{}).Return(nil, fmt.Errorf("error")) + err := getVersion(ctx, []string{}, cmdCtx) + assert.Nil(t, err) + }) + } diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index 6496f0fdd3..ee5a8e4184 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -5,6 +5,12 @@ import ( "fmt" "io/ioutil" "net/http" + + hversion "github.com/hashicorp/go-version" +) + +const ( + HTTPRequestErrorMessage = "something went wrong. Received status code [%v] while sending a request to [%s]" ) type githubversion struct { @@ -12,17 +18,19 @@ type githubversion struct { } func GetRequest(baseURL, url string) ([]byte, error) { - response, err := http.Get(fmt.Sprintf("%v%v", baseURL, url)) + response, err := http.Get(fmt.Sprintf("%s%s", baseURL, url)) if err != nil { return []byte(""), err } defer response.Body.Close() - - data, err := ioutil.ReadAll(response.Body) - if err != nil { - return []byte(""), err + if response.StatusCode == 200 { + data, err := ioutil.ReadAll(response.Body) + if err != nil { + return []byte(""), err + } + return data, nil } - return data, nil + return []byte(""), fmt.Errorf(HTTPRequestErrorMessage, response.StatusCode, fmt.Sprintf("%s%s", baseURL, url)) } func ParseGithubTag(data []byte) (string, error) { @@ -41,3 +49,15 @@ func WriteIntoFile(data []byte, file string) error { } return nil } + +func IsVersionGreaterThan(version1, version2 string) (bool, error) { + semanticVersion1, err := hversion.NewVersion(version1) + if err != nil { + return false, err + } + semanticVersion2, err := hversion.NewVersion(version2) + if err != nil { + return false, err + } + return semanticVersion2.LessThanOrEqual(semanticVersion1), nil +} diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index f4e0792428..ca9cd0f34f 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -9,6 +9,7 @@ import ( const flytectlReleaseURL = "/repos/flyteorg/flytectl/releases/latest" const baseURL = "https://api.github.com" const wrongBaseURL = "htts://api.github.com" +const testVersion = "v0.1.20" func TestGetRequest(t *testing.T) { t.Run("Get request with 200", func(t *testing.T) { @@ -19,6 +20,10 @@ func TestGetRequest(t *testing.T) { _, err := GetRequest(wrongBaseURL, flytectlReleaseURL) assert.NotNil(t, err) }) + t.Run("Get request with 400", func(t *testing.T) { + _, err := GetRequest("https://github.com", "/flyteorg/flyte/releases/download/latest/flyte_eks_manifest.yaml") + assert.NotNil(t, err) + }) } func TestParseGithubTag(t *testing.T) { @@ -49,3 +54,32 @@ func TestWriteIntoFile(t *testing.T) { assert.NotNil(t, err) }) } + +func TestIsVersionGreaterThan(t *testing.T) { + t.Run("Compare flytectl version when upgrade available", func(t *testing.T) { + _, err := IsVersionGreaterThan("v1.1.21", testVersion) + assert.Nil(t, err) + }) + t.Run("Compare flytectl version greater then", func(t *testing.T) { + ok, err := IsVersionGreaterThan("v1.1.21", testVersion) + assert.Nil(t, err) + assert.Equal(t, true, ok) + }) + t.Run("Compare flytectl version smaller then", func(t *testing.T) { + ok, err := IsVersionGreaterThan("v0.1.19", testVersion) + assert.Nil(t, err) + assert.Equal(t, false, ok) + }) + t.Run("Compare flytectl version", func(t *testing.T) { + _, err := IsVersionGreaterThan(testVersion, testVersion) + assert.Nil(t, err) + }) + t.Run("Error in compare flytectl version", func(t *testing.T) { + _, err := IsVersionGreaterThan("vvvvvvvv", testVersion) + assert.NotNil(t, err) + }) + t.Run("Error in compare flytectl version", func(t *testing.T) { + _, err := IsVersionGreaterThan(testVersion, "vvvvvvvv") + assert.NotNil(t, err) + }) +} From a1442752b3408d924285f39636ef2c8453ce20d1 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 12 Jul 2021 16:55:57 +0530 Subject: [PATCH 107/645] Added `config init` command (#123) * Added setup config Signed-off-by: Yuvraj --- flytectl/cmd/completion_test.go | 26 ++++ .../config/subcommand/config/config_flags.go | 57 +++++++ .../subcommand/config/config_flags_test.go | 144 ++++++++++++++++++ .../config/subcommand/config/init_flags.go | 16 ++ flytectl/cmd/configuration/configuration.go | 108 +++++++++++++ .../cmd/configuration/configuration_test.go | 63 ++++++++ flytectl/cmd/root.go | 6 +- flytectl/cmd/root_test.go | 12 ++ flytectl/cmd/sandbox/start.go | 83 +++++----- flytectl/cmd/sandbox/start_test.go | 2 +- flytectl/cmd/sandbox/teardown.go | 4 +- flytectl/docs/source/nouns.rst | 1 + flytectl/go.mod | 2 + flytectl/go.sum | 10 ++ flytectl/pkg/configutil/configutil.go | 104 +++++++++++++ flytectl/pkg/configutil/configutil_test.go | 59 +++++++ flytectl/pkg/docker/docker_util.go | 59 ++----- flytectl/pkg/docker/docker_util_test.go | 48 +----- flytectl/pkg/util/util.go | 12 +- flytectl/pkg/util/util_test.go | 4 + 20 files changed, 692 insertions(+), 128 deletions(-) create mode 100644 flytectl/cmd/completion_test.go create mode 100755 flytectl/cmd/config/subcommand/config/config_flags.go create mode 100755 flytectl/cmd/config/subcommand/config/config_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/config/init_flags.go create mode 100644 flytectl/cmd/configuration/configuration.go create mode 100644 flytectl/cmd/configuration/configuration_test.go create mode 100644 flytectl/cmd/root_test.go create mode 100644 flytectl/pkg/configutil/configutil.go create mode 100644 flytectl/pkg/configutil/configutil_test.go diff --git a/flytectl/cmd/completion_test.go b/flytectl/cmd/completion_test.go new file mode 100644 index 0000000000..3fd8ae01b1 --- /dev/null +++ b/flytectl/cmd/completion_test.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "testing" + + "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" +) + +func TestCompletionCmdIntegration(t *testing.T) { + rootCmd := &cobra.Command{ + Long: "flytectl is CLI tool written in go to interact with flyteadmin service", + Short: "flyetcl CLI tool", + Use: "flytectl", + DisableAutoGenTag: true, + } + + err := completionCmd.RunE(rootCmd, []string{"bash"}) + assert.Nil(t, err) + err = completionCmd.RunE(rootCmd, []string{"zsh"}) + assert.Nil(t, err) + err = completionCmd.RunE(rootCmd, []string{"fish"}) + assert.Nil(t, err) + err = completionCmd.RunE(rootCmd, []string{"powershell"}) + assert.Nil(t, err) +} diff --git a/flytectl/cmd/config/subcommand/config/config_flags.go b/flytectl/cmd/config/subcommand/config/config_flags.go new file mode 100755 index 0000000000..f22213b004 --- /dev/null +++ b/flytectl/cmd/config/subcommand/config/config_flags.go @@ -0,0 +1,57 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package config + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.StringVar(&DefaultConfig.Host, fmt.Sprintf("%v%v", prefix, "host"), DefaultConfig.Host, "Endpoint of flyte admin") + cmdFlags.BoolVar(&DefaultConfig.Insecure, fmt.Sprintf("%v%v", prefix, "insecure"), DefaultConfig.Insecure, "Enable insecure mode") + cmdFlags.BoolVar(&DefaultConfig.Storage, fmt.Sprintf("%v%v", prefix, "storage"), DefaultConfig.Storage, "Enable storage provider config") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/config/config_flags_test.go b/flytectl/cmd/config/subcommand/config/config_flags_test.go new file mode 100755 index 0000000000..aaf191eb4e --- /dev/null +++ b/flytectl/cmd/config/subcommand/config/config_flags_test.go @@ -0,0 +1,144 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package config + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_Config(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_Config(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) +} + +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) +} + +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_host", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("host", testValue) + if vString, err := cmdFlags.GetString("host"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Host) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_insecure", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("insecure", testValue) + if vBool, err := cmdFlags.GetBool("insecure"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Insecure) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_storage", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("storage", testValue) + if vBool, err := cmdFlags.GetBool("storage"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Storage) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/config/init_flags.go b/flytectl/cmd/config/subcommand/config/init_flags.go new file mode 100755 index 0000000000..029b92baf4 --- /dev/null +++ b/flytectl/cmd/config/subcommand/config/init_flags.go @@ -0,0 +1,16 @@ +package config + +//go:generate pflags Config --default-var DefaultConfig --bind-default-var +var ( + DefaultConfig = &Config{ + Insecure: true, + Storage: false, + } +) + +//Configs +type Config struct { + Host string `json:"host" pflag:",Endpoint of flyte admin"` + Insecure bool `json:"insecure" pflag:",Enable insecure mode"` + Storage bool `json:"storage" pflag:",Enable storage provider config"` +} diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go new file mode 100644 index 0000000000..140b4333f5 --- /dev/null +++ b/flytectl/cmd/configuration/configuration.go @@ -0,0 +1,108 @@ +package configuration + +import ( + "context" + "fmt" + "io" + "os" + "strings" + + "github.com/flyteorg/flytestdlib/logger" + + "github.com/flyteorg/flytectl/pkg/configutil" + + initConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/config" + cmdcore "github.com/flyteorg/flytectl/cmd/core" + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" + "github.com/flyteorg/flytestdlib/config/viper" + "github.com/manifoldco/promptui" + + "github.com/spf13/cobra" +) + +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + initCmdShort = `Generates flytectl config file in the user's home directory.` + initCmdLong = `Creates a flytectl config file in flyte directory i.e ~/.flyte + +Generate sandbox config. Flyte Sandbox is a fully standalone minimal environment for running Flyte. Read more about sandbox https://docs.flyte.org/en/latest/deployment/sandbox.html + +:: + + bin/flytectl configuration config + +Generate remote cluster config. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html + +:: + + bin/flytectl configuration config --host=flyte.myexample.com + +Generate flytectl config with a storage provider +:: + + bin/flytectl configuration config --host=flyte.myexample.com --storage +` +) + +var prompt = promptui.Select{ + Label: "Select Storage Provider", + Items: []string{"S3", "GCS"}, +} + +// CreateConfigCommand will return configuration command +func CreateConfigCommand() *cobra.Command { + configCmd := viper.GetConfigCommand() + + getResourcesFuncs := map[string]cmdcore.CommandEntry{ + "init": {CmdFunc: configInitFunc, Aliases: []string{""}, ProjectDomainNotRequired: true, + Short: initCmdShort, + Long: initCmdLong, PFlagProvider: initConfig.DefaultConfig}, + } + + cmdcore.AddCommands(configCmd, getResourcesFuncs) + return configCmd +} + +func configInitFunc(ctx context.Context, args []string, cmdCtx cmdcore.CommandContext) error { + return initFlytectlConfig(ctx, os.Stdin) +} + +func initFlytectlConfig(ctx context.Context, reader io.Reader) error { + + templateValues := configutil.ConfigTemplateSpec{ + Host: "dns:///localhost:30081", + Insecure: initConfig.DefaultConfig.Insecure, + } + templateStr := configutil.GetSandboxTemplate() + + if len(initConfig.DefaultConfig.Host) > 0 { + templateValues.Host = fmt.Sprintf("dns:///%v", initConfig.DefaultConfig.Host) + templateStr = configutil.AdminConfigTemplate + if initConfig.DefaultConfig.Storage { + templateStr = configutil.GetAWSCloudTemplate() + _, result, err := prompt.Run() + if err != nil { + return err + } + if strings.ToUpper(result) == "GCS" { + templateStr = configutil.GetGoogleCloudTemplate() + } + } + } + var _err error + if _, err := os.Stat(configutil.ConfigFile); os.IsNotExist(err) { + _err = configutil.SetupConfig(configutil.ConfigFile, templateStr, templateValues) + } else { + if cmdUtil.AskForConfirmation(fmt.Sprintf("This action will overwrite an existing config file at [%s]. Do you want to continue?", configutil.ConfigFile), reader) { + if err := os.Remove(configutil.ConfigFile); err != nil { + return err + } + _err = configutil.SetupConfig(configutil.ConfigFile, templateStr, templateValues) + } + } + + if len(initConfig.DefaultConfig.Host) > 0 { + logger.Infof(ctx, "Init flytectl config for remote cluster, Please update your storage config in %s. Learn more about the config here https://docs.flyte.org/projects/flytectl/en/latest/index.html#configure", configutil.ConfigFile) + } + return _err +} diff --git a/flytectl/cmd/configuration/configuration_test.go b/flytectl/cmd/configuration/configuration_test.go new file mode 100644 index 0000000000..5e84f00505 --- /dev/null +++ b/flytectl/cmd/configuration/configuration_test.go @@ -0,0 +1,63 @@ +package configuration + +import ( + "context" + "fmt" + "io" + "os" + "sort" + "strings" + "testing" + + "github.com/flyteorg/flytectl/pkg/configutil" + + initConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/util" + + "github.com/stretchr/testify/assert" +) + +func TestCreateInitCommand(t *testing.T) { + configCmd := CreateConfigCommand() + assert.Equal(t, configCmd.Use, "config") + assert.Equal(t, configCmd.Short, "Runs various config commands, look at the help of this command to get a list of available commands..") + fmt.Println(configCmd.Commands()) + assert.Equal(t, len(configCmd.Commands()), 3) + cmdNouns := configCmd.Commands() + // Sort by Use value. + sort.Slice(cmdNouns, func(i, j int) bool { + return cmdNouns[i].Use < cmdNouns[j].Use + }) + + assert.Equal(t, cmdNouns[0].Use, "discover") + assert.Equal(t, cmdNouns[0].Short, "Searches for a config in one of the default search paths.") + assert.Equal(t, cmdNouns[1].Use, "init") + assert.Equal(t, cmdNouns[1].Short, initCmdShort) + assert.Equal(t, cmdNouns[2].Use, "validate") + assert.Equal(t, cmdNouns[2].Short, "Validates the loaded config.") + +} + +func TestSetupConfigFunc(t *testing.T) { + var yes = strings.NewReader("Yes") + var no = strings.NewReader("No") + mockOutStream := new(io.Writer) + ctx := context.Background() + _ = os.Remove(configutil.FlytectlConfig) + + _ = util.SetupFlyteDir() + + cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + err := configInitFunc(ctx, []string{}, cmdCtx) + initConfig.DefaultConfig.Host = "" + assert.Nil(t, err) + + assert.Nil(t, initFlytectlConfig(ctx, yes)) + assert.Nil(t, initFlytectlConfig(ctx, yes)) + assert.Nil(t, initFlytectlConfig(ctx, no)) + initConfig.DefaultConfig.Host = "test" + assert.Nil(t, initFlytectlConfig(ctx, no)) + initConfig.DefaultConfig.Storage = true + assert.NotNil(t, initFlytectlConfig(ctx, yes)) +} diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 9995b42774..ee93bf0885 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "context" "fmt" + "os" "github.com/flyteorg/flytectl/cmd/sandbox" @@ -10,6 +11,7 @@ import ( f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/flyteorg/flytectl/cmd/config" + configuration "github.com/flyteorg/flytectl/cmd/configuration" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/create" "github.com/flyteorg/flytectl/cmd/delete" @@ -54,13 +56,14 @@ func newRootCmd() *cobra.Command { rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Project), "project", "p", "", "Specifies the Flyte project.") rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Domain), "domain", "d", "", "Specifies the Flyte project's domain.") rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Output), "output", "o", printer.OutputFormatTABLE.String(), fmt.Sprintf("Specifies the output type - supported formats %s. NOTE: dot, doturl are only supported for Workflow", printer.OutputFormats())) - rootCmd.AddCommand(viper.GetConfigCommand()) + rootCmd.AddCommand(get.CreateGetCommand()) rootCmd.AddCommand(create.RemoteCreateCommand()) rootCmd.AddCommand(update.CreateUpdateCommand()) rootCmd.AddCommand(register.RemoteRegisterCommand()) rootCmd.AddCommand(delete.RemoteDeleteCommand()) rootCmd.AddCommand(sandbox.CreateSandboxCommand()) + rootCmd.AddCommand(configuration.CreateConfigCommand()) rootCmd.AddCommand(completionCmd) // Added version command versioncmd := version.GetVersionCommand(rootCmd) @@ -73,6 +76,7 @@ func newRootCmd() *cobra.Command { func initConfig(cmd *cobra.Command, _ []string) error { configFile := f.FilePathJoin(f.UserHomeDir(), configFileDir, configFileName) + // TODO: Move flyteconfig env variable logic in flytestdlib if len(os.Getenv("FLYTECTL_CONFIG")) > 0 { configFile = os.Getenv("FLYTECTL_CONFIG") } diff --git a/flytectl/cmd/root_test.go b/flytectl/cmd/root_test.go new file mode 100644 index 0000000000..6941485d2c --- /dev/null +++ b/flytectl/cmd/root_test.go @@ -0,0 +1,12 @@ +package cmd + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRootCmdIntegration(t *testing.T) { + rootCmd := newRootCmd() + assert.NotNil(t, rootCmd) +} diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index a1de9e2f6f..c06b499818 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -8,12 +8,15 @@ import ( "os" "path/filepath" + "github.com/docker/docker/api/types/mount" + + "github.com/flyteorg/flytectl/pkg/configutil" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/flyteorg/flytectl/pkg/util" "github.com/flyteorg/flytectl/pkg/docker" - "github.com/docker/docker/api/types/mount" "github.com/enescakir/emoji" sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -73,24 +76,39 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio.Scanner, error) { fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) + if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { return nil, err } - if err := docker.SetupFlyteDir(); err != nil { + if err := util.SetupFlyteDir(); err != nil { return nil, err } - if err := docker.GetFlyteSandboxConfig(); err != nil { + templateValues := configutil.ConfigTemplateSpec{ + Host: "localhost:30081", + Insecure: true, + } + if err := configutil.SetupConfig(configutil.FlytectlConfig, configutil.GetSandboxTemplate(), templateValues); err != nil { return nil, err } - if err := mountSourceCode(); err != nil { + volumes := docker.Volumes + if vol, err := mountVolume(sandboxConfig.DefaultConfig.Source, docker.Source); err != nil { return nil, err + } else if vol != nil { + volumes = append(volumes, *vol) } - if err := mountFlyteManifest(sandboxConfig.DefaultConfig.Version); err != nil { - return nil, err + if len(sandboxConfig.DefaultConfig.Version) > 0 { + if err := downloadFlyteManifest(sandboxConfig.DefaultConfig.Version); err != nil { + return nil, err + } + vol, err := mountVolume(FlyteManifest, GeneratedManifest) + if err != nil { + return nil, err + } + volumes = append(volumes, *vol) } fmt.Printf("%v pulling docker image %s\n", emoji.Whale, docker.ImageName) @@ -100,7 +118,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) exposedPorts, portBindings, _ := docker.GetSandboxPorts() - ID, err := docker.StartContainer(ctx, cli, docker.Volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, docker.ImageName) + ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, docker.ImageName) if err != nil { fmt.Printf("%v Something went wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) return nil, err @@ -122,42 +140,35 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu return logReader, nil } -func mountSourceCode() error { - if len(sandboxConfig.DefaultConfig.Source) > 0 { - source, err := filepath.Abs(sandboxConfig.DefaultConfig.Source) +func mountVolume(file, destination string) (*mount.Mount, error) { + if len(file) > 0 { + source, err := filepath.Abs(file) if err != nil { - return err + return nil, err } - docker.Volumes = append(docker.Volumes, mount.Mount{ + return &mount.Mount{ Type: mount.TypeBind, Source: source, - Target: docker.Source, - }) + Target: destination, + }, nil } - return nil + return nil, nil } -func mountFlyteManifest(version string) error { - if len(version) > 0 { - isGreater, err := util.IsVersionGreaterThan(version, FlyteMinimumVersionSupported) - if err != nil { - return err - } - if !isGreater { - return fmt.Errorf("version flag only support %s+ flyte version", FlyteMinimumVersionSupported) - } - response, err := util.GetRequest(GithubURL, fmt.Sprintf(FlyteReleaseURL, version)) - if err != nil { - return err - } - if err := util.WriteIntoFile(response, FlyteManifest); err != nil { - return err - } - docker.Volumes = append(docker.Volumes, mount.Mount{ - Type: mount.TypeBind, - Source: FlyteManifest, - Target: GeneratedManifest, - }) +func downloadFlyteManifest(version string) error { + isGreater, err := util.IsVersionGreaterThan(version, FlyteMinimumVersionSupported) + if err != nil { + return err + } + if !isGreater { + return fmt.Errorf("version flag only support %s+ flyte version", FlyteMinimumVersionSupported) + } + response, err := util.GetRequest(GithubURL, fmt.Sprintf(FlyteReleaseURL, version)) + if err != nil { + return err + } + if err := util.WriteIntoFile(response, FlyteManifest); err != nil { + return err } return nil } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index 3e06516936..6c764ef47f 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -324,7 +324,7 @@ func TestStartSandboxFunc(t *testing.T) { assert.NotNil(t, err) }) t.Run("Failed manifest", func(t *testing.T) { - err := mountFlyteManifest("v100.9.9") + err := downloadFlyteManifest("v100.9.9") assert.NotNil(t, err) }) t.Run("Error in reading logs", func(t *testing.T) { diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index 1c9e634351..544880b997 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -4,6 +4,8 @@ import ( "context" "fmt" + "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flytectl/pkg/docker" "github.com/docker/docker/api/types" @@ -43,7 +45,7 @@ func tearDownSandbox(ctx context.Context, cli docker.Docker) error { return err } } - if err := docker.ConfigCleanup(); err != nil { + if err := configutil.ConfigCleanup(); err != nil { fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) } fmt.Printf("%v %v Sandbox cluster is removed successfully. \n", emoji.Broom, emoji.Broom) diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index bb1feb587a..f90ca068bf 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -36,6 +36,7 @@ Flytectl noun specify the resource on which the action needs to be performed eg: gen/flytectl_delete_execution-queue-attribute gen/flytectl_delete_plugin-override gen/flytectl_config_validate + gen/flytectl_config_init gen/flytectl_config_discover gen/flytectl_sandbox_start gen/flytectl_sandbox_status diff --git a/flytectl/go.mod b/flytectl/go.mod index 1c518389af..e864548a80 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -23,6 +23,7 @@ require ( github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/kr/text v0.2.0 // indirect github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 + github.com/manifoldco/promptui v0.8.0 github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/mapstructure v1.4.1 github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect @@ -42,5 +43,6 @@ require ( gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.4.0 gotest.tools v2.2.0+incompatible + k8s.io/kubernetes v1.13.0 sigs.k8s.io/yaml v1.2.0 ) diff --git a/flytectl/go.sum b/flytectl/go.sum index ed5d175028..2367487525 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -158,8 +158,11 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= @@ -560,6 +563,8 @@ github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfE github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 h1:M8exrBzuhWcU6aoHJlHWPe4qFjVKzkMGRal78f5jRRU= @@ -587,6 +592,8 @@ github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= +github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= @@ -597,6 +604,8 @@ github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPK github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/manifoldco/promptui v0.8.0 h1:R95mMF+McvXZQ7j1g8ucVZE1gLP3Sv6j9vlF9kyRqQo= +github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= @@ -1400,6 +1409,7 @@ k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/flytectl/pkg/configutil/configutil.go b/flytectl/pkg/configutil/configutil.go new file mode 100644 index 0000000000..f6d715e7eb --- /dev/null +++ b/flytectl/pkg/configutil/configutil.go @@ -0,0 +1,104 @@ +package configutil + +import ( + "html/template" + "os" + + f "github.com/flyteorg/flytectl/pkg/filesystemutils" +) + +const ( + AdminConfigTemplate = `admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: {{.Host}} + authType: Pkce + insecure: {{.Insecure}} +logger: + show-source: true + level: 0` + StorageConfigTemplate = ` +storage: + connection: + access-key: minio + auth-type: accesskey + disable-ssl: true + endpoint: http://localhost:30084 + region: us-east-1 + secret-key: miniostorage + type: minio + container: "my-s3-bucket" + enable-multicontainer: true` + StorageS3ConfigTemplate = ` +storage: + type: stow + stow: + kind: s3 + config: + auth_type: iam + region: # Example: us-east-2 + container: # Example my-bucket. Flyte k8s cluster / service account for execution should have read access to this bucket` + StorageGCSConfigTemplate = ` +storage: + type: stow + stow: + kind: s3 + config: + json: "" + project_id: # TODO: replace with the GCP project ID + scopes: https://www.googleapis.com/auth/devstorage.read_write + container: # Example my-bucket. Flyte k8s cluster / service account for execution should have read access to this bucket` +) + +type ConfigTemplateSpec struct { + Host string + Insecure bool +} + +var ( + FlytectlConfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "config-sandbox.yaml") + ConfigFile = f.FilePathJoin(f.UserHomeDir(), ".flyte", "config.yaml") + Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") +) + +// GetSandboxTemplate return sandbox cluster config +func GetSandboxTemplate() string { + return AdminConfigTemplate + StorageConfigTemplate +} + +// GetAWSCloudTemplate return aws flyte config with storage config +func GetAWSCloudTemplate() string { + return AdminConfigTemplate + StorageS3ConfigTemplate +} + +// GetGoogleCloudTemplate return google flyte config with storage config +func GetGoogleCloudTemplate() string { + return AdminConfigTemplate + StorageGCSConfigTemplate +} + +// SetupConfig download the flyte sandbox config +func SetupConfig(filename, templateStr string, templateSpec ConfigTemplateSpec) error { + tmpl := template.New("config") + tmpl, err := tmpl.Parse(templateStr) + if err != nil { + return err + } + file, err := os.Create(filename) + if err != nil { + return err + } + defer file.Close() + return tmpl.Execute(file, templateSpec) +} + +// ConfigCleanup will remove the sandbox config from flyte dir +func ConfigCleanup() error { + err := os.Remove(FlytectlConfig) + if err != nil { + return err + } + err = os.RemoveAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s")) + if err != nil { + return err + } + return nil +} diff --git a/flytectl/pkg/configutil/configutil_test.go b/flytectl/pkg/configutil/configutil_test.go new file mode 100644 index 0000000000..f65c8706e7 --- /dev/null +++ b/flytectl/pkg/configutil/configutil_test.go @@ -0,0 +1,59 @@ +package configutil + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/flyteorg/flytectl/pkg/util" + + f "github.com/flyteorg/flytectl/pkg/filesystemutils" + "github.com/stretchr/testify/assert" +) + +func TestConfigCleanup(t *testing.T) { + _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) + if os.IsNotExist(err) { + _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) + } + _ = ioutil.WriteFile(FlytectlConfig, []byte("string"), 0600) + _ = ioutil.WriteFile(Kubeconfig, []byte("string"), 0600) + + err = ConfigCleanup() + assert.Nil(t, err) + + _, err = os.Stat(FlytectlConfig) + check := os.IsNotExist(err) + assert.Equal(t, check, true) + + _, err = os.Stat(Kubeconfig) + check = os.IsNotExist(err) + assert.Equal(t, check, true) + _ = ConfigCleanup() +} + +func TestSetupFlytectlConfig(t *testing.T) { + templateValue := ConfigTemplateSpec{ + Host: "dns:///localhost:30081", + Insecure: true, + } + _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) + if os.IsNotExist(err) { + _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) + } + err = util.SetupFlyteDir() + assert.Nil(t, err) + err = SetupConfig("version.yaml", AdminConfigTemplate, templateValue) + assert.Nil(t, err) + _, err = os.Stat("version.yaml") + assert.Nil(t, err) + check := os.IsNotExist(err) + assert.Equal(t, check, false) + _ = ConfigCleanup() +} + +func TestAwsConfig(t *testing.T) { + assert.Equal(t, AdminConfigTemplate+StorageS3ConfigTemplate, GetAWSCloudTemplate()) + assert.Equal(t, AdminConfigTemplate+StorageGCSConfigTemplate, GetGoogleCloudTemplate()) + assert.Equal(t, AdminConfigTemplate+StorageConfigTemplate, GetSandboxTemplate()) +} diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index c1b39bd182..0b4ad0f2b1 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -8,24 +8,20 @@ import ( "os" "strings" - "github.com/flyteorg/flytectl/pkg/util" - - "github.com/docker/docker/client" - - "github.com/enescakir/emoji" - - cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" + "github.com/flyteorg/flytectl/pkg/configutil" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" + "github.com/docker/docker/client" "github.com/docker/go-connections/nat" + "github.com/enescakir/emoji" + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" f "github.com/flyteorg/flytectl/pkg/filesystemutils" ) var ( Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") - FlytectlConfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "config-sandbox.yaml") SuccessMessage = "Flyte is ready! Flyte UI is available at http://localhost:30081/console" ImageName = "cr.flyte.org/flyteorg/flyte-sandbox:dind" FlyteSandboxClusterName = "flyte-sandbox" @@ -51,37 +47,6 @@ var ( StartingBufLen = 32*1024 + StdWriterPrefixLen + 1 ) -// SetupFlyteDir will create .flyte dir if not exist -func SetupFlyteDir() error { - if err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755); err != nil { - return err - } - return nil -} - -// GetFlyteSandboxConfig download the flyte sandbox config -func GetFlyteSandboxConfig() error { - response, err := util.GetRequest("https://raw.githubusercontent.com", "/flyteorg/flytectl/master/config.yaml") - if err != nil { - return err - } - - return util.WriteIntoFile(response, FlytectlConfig) -} - -// ConfigCleanup will remove the sandbox config from flyte dir -func ConfigCleanup() error { - err := os.Remove(FlytectlConfig) - if err != nil { - return err - } - err = os.RemoveAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s")) - if err != nil { - return err - } - return nil -} - // GetSandbox will return sandbox container if it exist func GetSandbox(ctx context.Context, cli Docker) *types.Container { containers, _ := cli.ContainerList(ctx, types.ContainerListOptions{ @@ -125,6 +90,7 @@ func PullDockerImage(ctx context.Context, cli Docker, image string) error { if err != nil { return err } + _, err = io.Copy(os.Stdout, r) return err } @@ -155,12 +121,12 @@ func StartContainer(ctx context.Context, cli Docker, volumes []mount.Mount, expo // WatchError will return channel for watching errors of a container func WatchError(ctx context.Context, cli Docker, id string) (<-chan container.ContainerWaitOKBody, <-chan error) { - return cli.ContainerWait(context.Background(), id, container.WaitConditionNotRunning) + return cli.ContainerWait(ctx, id, container.WaitConditionNotRunning) } // ReadLogs will return io scanner for reading the logs of a container func ReadLogs(ctx context.Context, cli Docker, id string) (*bufio.Scanner, error) { - reader, err := cli.ContainerLogs(context.Background(), id, types.ContainerLogsOptions{ + reader, err := cli.ContainerLogs(ctx, id, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, @@ -176,12 +142,19 @@ func ReadLogs(ctx context.Context, cli Docker, id string) (*bufio.Scanner, error func WaitForSandbox(reader *bufio.Scanner, message string) bool { for reader.Scan() { if strings.Contains(reader.Text(), message) { + kubeconfig := strings.Join([]string{ + "$KUBECONFIG", + f.FilePathJoin(f.UserHomeDir(), ".kube", "config"), + Kubeconfig, + }, ":") + fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, message, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) fmt.Printf("Please visit https://github.com/flyteorg/flytesnacks for more example %v \n", emoji.Rocket) fmt.Printf("Register all flytesnacks example by running 'flytectl register examples -d development -p flytesnacks' \n") + fmt.Printf("Add KUBECONFIG and FLYTECTL_CONFIG to your environment variable \n") - fmt.Printf("export KUBECONFIG=%v \n", Kubeconfig) - fmt.Printf("export FLYTECTL_CONFIG=%v \n", FlytectlConfig) + fmt.Printf("export KUBECONFIG=%v \n", kubeconfig) + fmt.Printf("export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) return true } fmt.Println(reader.Text()) diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 65004a2b0b..52f35e3297 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -4,24 +4,19 @@ import ( "bufio" "context" "fmt" - - "github.com/docker/docker/api/types/container" - - //"github.com/docker/go-connections/nat" - "io/ioutil" "os" "strings" "testing" + "github.com/docker/docker/api/types/container" "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/flyteorg/flytectl/pkg/util" "github.com/stretchr/testify/mock" "github.com/docker/docker/api/types" cmdCore "github.com/flyteorg/flytectl/cmd/core" u "github.com/flyteorg/flytectl/cmd/testutils" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" - "github.com/stretchr/testify/assert" ) @@ -33,7 +28,7 @@ var ( func setupSandbox() { mockAdminClient := u.MockClient cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) - _ = SetupFlyteDir() + _ = util.SetupFlyteDir() container1 := types.Container{ ID: "FlyteSandboxClusterName", Names: []string{ @@ -43,43 +38,6 @@ func setupSandbox() { containers = append(containers, container1) } -func TestConfigCleanup(t *testing.T) { - _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) - if os.IsNotExist(err) { - _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) - } - _ = ioutil.WriteFile(FlytectlConfig, []byte("string"), 0600) - _ = ioutil.WriteFile(Kubeconfig, []byte("string"), 0600) - - err = ConfigCleanup() - assert.Nil(t, err) - - _, err = os.Stat(FlytectlConfig) - check := os.IsNotExist(err) - assert.Equal(t, check, true) - - _, err = os.Stat(Kubeconfig) - check = os.IsNotExist(err) - assert.Equal(t, check, true) - _ = ConfigCleanup() -} - -func TestSetupFlytectlConfig(t *testing.T) { - _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) - if os.IsNotExist(err) { - _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) - } - err = SetupFlyteDir() - assert.Nil(t, err) - err = GetFlyteSandboxConfig() - assert.Nil(t, err) - _, err = os.Stat(FlytectlConfig) - assert.Nil(t, err) - check := os.IsNotExist(err) - assert.Equal(t, check, false) - _ = ConfigCleanup() -} - func TestGetSandbox(t *testing.T) { setupSandbox() t.Run("Successfully get sandbox container", func(t *testing.T) { diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index ee5a8e4184..fe972ed2d8 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -5,7 +5,9 @@ import ( "fmt" "io/ioutil" "net/http" + "os" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" hversion "github.com/hashicorp/go-version" ) @@ -43,13 +45,21 @@ func ParseGithubTag(data []byte) (string, error) { } func WriteIntoFile(data []byte, file string) error { - err := ioutil.WriteFile(file, data, 0600) + err := ioutil.WriteFile(file, data, os.ModePerm) if err != nil { return err } return nil } +// SetupFlyteDir will create .flyte dir if not exist +func SetupFlyteDir() error { + if err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), os.ModePerm); err != nil { + return err + } + return nil +} + func IsVersionGreaterThan(version1, version2 string) (bool, error) { semanticVersion1, err := hversion.NewVersion(version1) if err != nil { diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index ca9cd0f34f..43bb8166c1 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -55,6 +55,10 @@ func TestWriteIntoFile(t *testing.T) { }) } +func TestSetupFlyteDir(t *testing.T) { + assert.Nil(t, SetupFlyteDir()) +} + func TestIsVersionGreaterThan(t *testing.T) { t.Run("Compare flytectl version when upgrade available", func(t *testing.T) { _, err := IsVersionGreaterThan("v1.1.21", testVersion) From c1d273cb98f1371b50a9886256cdeca04b863d09 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 12 Jul 2021 23:21:10 +0530 Subject: [PATCH 108/645] [WIP]Exclude generated file from unit test (#143) * Exclude generated file from unit test Signed-off-by: Yuvraj --- flytectl/.github/workflows/build.yaml | 2 +- flytectl/Makefile | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml index 48b9425a89..25759ecc17 100644 --- a/flytectl/.github/workflows/build.yaml +++ b/flytectl/.github/workflows/build.yaml @@ -31,7 +31,7 @@ jobs: GO111MODULE: "on" CI_ENV: "true" with: - args: make install && make test_unit_codecov + args: make install && make test_unit_without_flag - name: Push CodeCov uses: codecov/codecov-action@v1.0.5 with: diff --git a/flytectl/Makefile b/flytectl/Makefile index 43c7aab1ca..601e502569 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -35,3 +35,9 @@ install-piptools: doc-requirements.txt: doc-requirements.in install-piptools $(call PIP_COMPILE,doc-requirements.in) +.PHONY: test_unit_without_flag +test_unit_without_flag: + go test ./... -race -coverprofile=coverage.temp.txt -covermode=atomic + cat coverage.temp.txt | grep -v "_flags.go" > coverage.txt + rm coverage.temp.txt + curl -s https://codecov.io/bash > codecov_bash.sh && bash codecov_bash.sh From 5695606cf2a59e1e72b87285f5d616dd82aa2486 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Mon, 12 Jul 2021 11:54:09 -0700 Subject: [PATCH 109/645] Update documentation (#142) Signed-off-by: Flyte-Bot Co-authored-by: evalsocket --- flytectl/docs/source/gen/flytectl.rst | 42 ++++++++- .../docs/source/gen/flytectl_completion.rst | 40 +++++++- flytectl/docs/source/gen/flytectl_config.rst | 41 +++++++- .../source/gen/flytectl_config_discover.rst | 44 +++++++-- .../docs/source/gen/flytectl_config_init.rst | 94 +++++++++++++++++++ .../source/gen/flytectl_config_validate.rst | 44 +++++++-- flytectl/docs/source/gen/flytectl_create.rst | 40 +++++++- .../source/gen/flytectl_create_execution.rst | 40 +++++++- .../source/gen/flytectl_create_project.rst | 40 +++++++- flytectl/docs/source/gen/flytectl_delete.rst | 40 +++++++- ...ectl_delete_cluster-resource-attribute.rst | 40 +++++++- ...lytectl_delete_execution-cluster-label.rst | 40 +++++++- ...tectl_delete_execution-queue-attribute.rst | 40 +++++++- .../source/gen/flytectl_delete_execution.rst | 40 +++++++- .../gen/flytectl_delete_plugin-override.rst | 40 +++++++- ...lytectl_delete_task-resource-attribute.rst | 40 +++++++- flytectl/docs/source/gen/flytectl_get.rst | 40 +++++++- ...lytectl_get_cluster-resource-attribute.rst | 40 +++++++- .../flytectl_get_execution-cluster-label.rst | 40 +++++++- ...flytectl_get_execution-queue-attribute.rst | 40 +++++++- .../source/gen/flytectl_get_execution.rst | 40 +++++++- .../source/gen/flytectl_get_launchplan.rst | 40 +++++++- .../gen/flytectl_get_plugin-override.rst | 40 +++++++- .../docs/source/gen/flytectl_get_project.rst | 40 +++++++- .../flytectl_get_task-resource-attribute.rst | 40 +++++++- .../docs/source/gen/flytectl_get_task.rst | 40 +++++++- .../docs/source/gen/flytectl_get_workflow.rst | 40 +++++++- .../docs/source/gen/flytectl_register.rst | 40 +++++++- .../source/gen/flytectl_register_examples.rst | 40 +++++++- .../source/gen/flytectl_register_files.rst | 40 +++++++- flytectl/docs/source/gen/flytectl_sandbox.rst | 40 +++++++- .../docs/source/gen/flytectl_sandbox_exec.rst | 45 +++++++-- .../source/gen/flytectl_sandbox_start.rst | 50 ++++++++-- .../source/gen/flytectl_sandbox_status.rst | 40 +++++++- .../source/gen/flytectl_sandbox_teardown.rst | 40 +++++++- flytectl/docs/source/gen/flytectl_update.rst | 40 +++++++- ...ectl_update_cluster-resource-attribute.rst | 40 +++++++- ...lytectl_update_execution-cluster-label.rst | 40 +++++++- ...tectl_update_execution-queue-attribute.rst | 40 +++++++- .../source/gen/flytectl_update_launchplan.rst | 40 +++++++- .../gen/flytectl_update_plugin-override.rst | 40 +++++++- .../source/gen/flytectl_update_project.rst | 40 +++++++- ...lytectl_update_task-resource-attribute.rst | 40 +++++++- .../docs/source/gen/flytectl_update_task.rst | 40 +++++++- .../source/gen/flytectl_update_workflow.rst | 40 +++++++- flytectl/docs/source/gen/flytectl_version.rst | 40 +++++++- 46 files changed, 1731 insertions(+), 189 deletions(-) create mode 100644 flytectl/docs/source/gen/flytectl_config_init.rst diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index e11b06d619..2c4a65ba70 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -16,11 +16,43 @@ Options :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -h, --help help for flytectl - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -h, --help help for flytectl + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index bedc92ff41..4b0ba9dc4b 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -65,10 +65,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 818b172c65..27a5a6badf 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -25,15 +25,48 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ * :doc:`flytectl` - flyetcl CLI tool * :doc:`flytectl_config_discover` - Searches for a config in one of the default search paths. +* :doc:`flytectl_config_init` - Generates flytectl config file in the user's home directory. * :doc:`flytectl_config_validate` - Validates the loaded config. diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 690a450336..2071952bd5 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -27,12 +27,44 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --file stringArray Passes the config file to load. - If empty, it'll first search for the config file path then, if found, will load config from there. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst new file mode 100644 index 0000000000..c499bf06f5 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -0,0 +1,94 @@ +.. _flytectl_config_init: + +flytectl config init +-------------------- + +Generates flytectl config file in the user's home directory. + +Synopsis +~~~~~~~~ + + +Creates a flytectl config file in flyte directory i.e ~/.flyte + +Generate sandbox config. Flyte Sandbox is a fully standalone minimal environment for running Flyte. Read more about sandbox https://docs.flyte.org/en/latest/deployment/sandbox.html + +:: + + bin/flytectl configuration config + +Generate remote cluster config. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html + +:: + + bin/flytectl configuration config --host=flyte.myexample.com + +Generate flytectl config with a storage provider +:: + + bin/flytectl configuration config --host=flyte.myexample.com --storage + + +:: + + flytectl config init [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for init + --host string Endpoint of flyte admin + --insecure Enable insecure mode (default true) + --storage Enable storage provider config + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. + diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 447d666d25..5e6adb51fa 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -29,12 +29,44 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --file stringArray Passes the config file to load. - If empty, it'll first search for the config file path then, if found, will load config from there. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index 4e09d5b6e4..ff986fee7d 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -28,10 +28,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 142fc4f60d..06a5188144 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -146,10 +146,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index cd5f345d39..83101f6b0d 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -52,10 +52,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 17edc03f9b..7cba6f6123 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -28,10 +28,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 226d2e4246..5b96780560 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -64,10 +64,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index a48e9ef376..54d6d04946 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -62,10 +62,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 64182f6389..bfd7e5fb11 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -66,10 +66,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 365bd014d1..8205564f83 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -71,10 +71,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index bb20597c78..d57acd3d43 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -67,10 +67,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 20ee8d9f6f..279090fa8b 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -67,10 +67,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index f969fbd5e9..202a7ed989 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -28,10 +28,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index b79674a7c8..5bdcbe32b0 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -73,10 +73,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index 57b27f7293..e2900c17bf 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -71,10 +71,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index e03a50f183..96ee6eec3e 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -75,10 +75,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index e81e77ac7c..ced38d4586 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -95,10 +95,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 51c936f264..ff7687f82a 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -113,10 +113,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index 4943aa9e5d..ab39c075aa 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -95,10 +95,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 541f9e9a2d..57258c080e 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -66,10 +66,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 8689c6d030..ab0bb8e92d 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -77,10 +77,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 49148043bb..e4226e47ee 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -109,10 +109,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 6c8ec19195..b3e7ba4aa9 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -97,10 +97,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 27120f811e..39f0212527 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -28,10 +28,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index b1929fc1ea..d6c510092d 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -42,10 +42,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 55e8bab2bb..5ee4cea1aa 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -106,10 +106,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 313bbf85b2..5e54287f2c 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -47,10 +47,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index 9fbb77971c..bc187d689f 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -26,18 +26,51 @@ Options :: - -h, --help help for exec - --source string Path of your source code + -h, --help help for exec + --source string Path of your source code + --version string Version of flyte Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 21b02b2161..b1901042ef 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -21,6 +21,11 @@ Mount your source code repository inside sandbox :: bin/flytectl sandbox start --source=$HOME/flyteorg/flytesnacks + +Run specific version of flyte, Only available after v0.14.0+ +:: + + bin/flytectl sandbox start --version=v0.14.0 Usage @@ -34,18 +39,51 @@ Options :: - -h, --help help for start - --source string Path of your source code + -h, --help help for start + --source string Path of your source code + --version string Version of flyte Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 6295dff615..368cbf01a8 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -36,10 +36,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index bc41b259eb..4961977271 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -35,10 +35,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 0493254ff5..789633015e 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -30,10 +30,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 9f72793199..c85c4ce194 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -69,10 +69,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 046ff1ea20..48d57e94c4 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -62,10 +62,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index a915e427c7..c848d08f85 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -73,10 +73,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 0bc98036df..a4be4bd225 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -47,10 +47,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index fa2114ae8e..16f2085ddd 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -75,10 +75,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 437df1e0cd..22c5c29677 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -61,10 +61,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index bfe1b96d5c..36561dd33e 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -75,10 +75,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst index f82ef9a7a1..a0b6534663 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -47,10 +47,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst index b9d9abc384..3b9b698fe1 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -47,10 +47,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 0e7165621b..216543e267 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -32,10 +32,42 @@ Options inherited from parent commands :: - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ From 50ee30745f58179db8396b81c6c695fe5ca2d576 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Tue, 13 Jul 2021 16:39:17 +0530 Subject: [PATCH 110/645] Bug fix in sandbox start when sandbox exist (#145) * fix sandbox start if sandbox exist Signed-off-by: Yuvraj --- flytectl/clierrors/errors.go | 2 ++ flytectl/cmd/sandbox/start.go | 27 ++++++++++++++++-- flytectl/cmd/sandbox/start_test.go | 38 +++++++++++++++++++++++++ flytectl/docs/source/index.rst | 2 +- flytectl/pkg/docker/docker_util.go | 5 +++- flytectl/pkg/docker/docker_util_test.go | 2 +- 6 files changed, 71 insertions(+), 5 deletions(-) diff --git a/flytectl/clierrors/errors.go b/flytectl/clierrors/errors.go index a93f3c7a19..f6869aa2b2 100644 --- a/flytectl/clierrors/errors.go +++ b/flytectl/clierrors/errors.go @@ -14,4 +14,6 @@ var ( ErrTaskNotPassed = "Task name not passed\n" // #nosec ErrFailedTaskUpdate = "Task %v failed to get updated to due to %v\n" + + ErrSandboxExists = "Sandbox Exist\n" ) diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index c06b499818..28f142493a 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -7,6 +7,9 @@ import ( "io" "os" "path/filepath" + "strings" + + "github.com/flyteorg/flytectl/clierrors" "github.com/docker/docker/api/types/mount" @@ -70,7 +73,9 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm if err != nil { return err } - docker.WaitForSandbox(reader, docker.SuccessMessage) + if reader != nil { + docker.WaitForSandbox(reader, docker.SuccessMessage) + } return nil } @@ -78,7 +83,11 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { - return nil, err + if err.Error() != clierrors.ErrSandboxExists { + return nil, err + } + printExistingSandboxMessage() + return nil, nil } if err := util.SetupFlyteDir(); err != nil { @@ -172,3 +181,17 @@ func downloadFlyteManifest(version string) error { } return nil } + +func printExistingSandboxMessage() { + kubeconfig := strings.Join([]string{ + "$KUBECONFIG", + f.FilePathJoin(f.UserHomeDir(), ".kube", "config"), + docker.Kubeconfig, + }, ":") + + fmt.Printf("Existing details of your sandbox:") + fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, docker.SuccessMessage, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) + fmt.Printf("Add KUBECONFIG and FLYTECTL_CONFIG to your environment variable \n") + fmt.Printf("export KUBECONFIG=%v \n", kubeconfig) + fmt.Printf("export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) +} diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index 6c764ef47f..73a7eee0a7 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -57,6 +57,44 @@ func TestStartSandboxFunc(t *testing.T) { _, err := startSandbox(ctx, mockDocker, os.Stdin) assert.Nil(t, err) }) + t.Run("Successfully exit when sandbox cluster exist", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: docker.ImageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: docker.Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + reader, err := startSandbox(ctx, mockDocker, strings.NewReader("n")) + assert.Nil(t, err) + assert.Nil(t, reader) + }) t.Run("Successfully run sandbox cluster with source code", func(t *testing.T) { ctx := context.Background() errCh := make(chan error) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index c9d94fa3d7..4915e0b963 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -23,7 +23,7 @@ golang .. prompt:: bash $ - brew upgrade flytectl + brew update && brew upgrade flytectl .. tab:: Other Operating systems diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 0b4ad0f2b1..7e317d4878 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -3,11 +3,14 @@ package docker import ( "bufio" "context" + "errors" "fmt" "io" "os" "strings" + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/pkg/configutil" "github.com/docker/docker/api/types" @@ -69,7 +72,7 @@ func RemoveSandbox(ctx context.Context, cli Docker, reader io.Reader) error { }) return err } - return nil + return errors.New(clierrors.ErrSandboxExists) } return nil } diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 52f35e3297..25e67bad43 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -80,7 +80,7 @@ func TestRemoveSandboxWithNoReply(t *testing.T) { mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return(containers, nil) mockDocker.OnContainerRemove(context, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) err := RemoveSandbox(context, mockDocker, strings.NewReader("n")) - assert.Nil(t, err) + assert.NotNil(t, err) }) t.Run("Successfully remove sandbox container with zero sandbox containers are running", func(t *testing.T) { From 002d176ae02e73b7377220bd5debdee752c71200 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 13 Jul 2021 21:24:44 +0530 Subject: [PATCH 111/645] Added node execution data to show inputs and outputs (#136) * Added node execution data to show inputs and outputs Signed-off-by: Prafulla Mahindrakar * Added closure class Signed-off-by: Prafulla Mahindrakar * Removed the old wrapper classes Signed-off-by: Prafulla Mahindrakar * Uncommented the task exec closure Signed-off-by: Prafulla Mahindrakar * Fixed unit tests for the closure classes Signed-off-by: Prafulla Mahindrakar * go mod tidy Signed-off-by: Prafulla Mahindrakar * Adding .gitattribute file to contain rule for .rst files Signed-off-by: Prafulla Mahindrakar * Adding gen path to .gitattr Signed-off-by: Prafulla Mahindrakar * Added comments to new structs Signed-off-by: Prafulla Mahindrakar --- flytectl/.gitattributes | 1 + .../subcommand/execution/config_flags.go | 2 +- .../subcommand/execution/config_flags_test.go | 6 +- .../subcommand/execution/execution_config.go | 2 +- flytectl/cmd/get/execution.go | 24 +- flytectl/cmd/get/execution_test.go | 327 +++++++++++++++++- flytectl/cmd/get/node_execution.go | 287 +++++++++------ flytectl/cmd/get/node_execution_test.go | 254 +++++++------- .../source/gen/flytectl_get_execution.rst | 12 +- flytectl/go.mod | 1 - flytectl/go.sum | 1 - flytectl/pkg/ext/execution_fetcher.go | 23 +- flytectl/pkg/ext/execution_fetcher_test.go | 18 +- flytectl/pkg/ext/fetcher.go | 7 +- .../ext/mocks/admin_fetcher_ext_interface.go | 73 +++- flytectl/pkg/printer/printer.go | 62 +++- 16 files changed, 788 insertions(+), 312 deletions(-) create mode 100644 flytectl/.gitattributes diff --git a/flytectl/.gitattributes b/flytectl/.gitattributes new file mode 100644 index 0000000000..53c12facc6 --- /dev/null +++ b/flytectl/.gitattributes @@ -0,0 +1 @@ +docs/**/**/*rst linguist-generated=true diff --git a/flytectl/cmd/config/subcommand/execution/config_flags.go b/flytectl/cmd/config/subcommand/execution/config_flags.go index f9a96f5261..7f07f23bf7 100755 --- a/flytectl/cmd/config/subcommand/execution/config_flags.go +++ b/flytectl/cmd/config/subcommand/execution/config_flags.go @@ -55,6 +55,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") cmdFlags.BoolVar(&DefaultConfig.Details, fmt.Sprintf("%v%v", prefix, "details"), DefaultConfig.Details, "gets node execution details. Only applicable for single execution name i.e get execution name --details") - cmdFlags.StringVar(&DefaultConfig.NodeID, fmt.Sprintf("%v%v", prefix, "nodeId"), DefaultConfig.NodeID, "get task executions for given node name.") + cmdFlags.StringVar(&DefaultConfig.NodeID, fmt.Sprintf("%v%v", prefix, "nodeID"), DefaultConfig.NodeID, "get task executions for given node name.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/execution/config_flags_test.go b/flytectl/cmd/config/subcommand/execution/config_flags_test.go index 88cfd5fca0..57fc69dd42 100755 --- a/flytectl/cmd/config/subcommand/execution/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/execution/config_flags_test.go @@ -169,13 +169,13 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_nodeId", func(t *testing.T) { + t.Run("Test_nodeID", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("nodeId", testValue) - if vString, err := cmdFlags.GetString("nodeId"); err == nil { + cmdFlags.Set("nodeID", testValue) + if vString, err := cmdFlags.GetString("nodeID"); err == nil { testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.NodeID) } else { diff --git a/flytectl/cmd/config/subcommand/execution/execution_config.go b/flytectl/cmd/config/subcommand/execution/execution_config.go index a149179908..e7a203ea2b 100644 --- a/flytectl/cmd/config/subcommand/execution/execution_config.go +++ b/flytectl/cmd/config/subcommand/execution/execution_config.go @@ -15,5 +15,5 @@ var ( type Config struct { Filter filters.Filters `json:"filter" pflag:","` Details bool `json:"details" pflag:",gets node execution details. Only applicable for single execution name i.e get execution name --details"` - NodeID string `json:"nodeId" pflag:",get task executions for given node name."` + NodeID string `json:"nodeID" pflag:",get task executions for given node name."` } diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 2e8232ca7e..e17d6759d7 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -2,6 +2,7 @@ package get import ( "context" + "fmt" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" @@ -58,23 +59,23 @@ Get more details for the execution using --details flag which shows node executi bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -Using yaml view for the details. In this view only node details are available. For task details pass --nodeId flag +Using yaml view for the details. In this view only node details are available. For task details pass --nodeID flag :: bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml -Using --nodeId flag to get task executions on a specific node. Use the nodeId attribute from node details view +Using --nodeID flag to get task executions on a specific node. Use the nodeID attribute from node details view :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodId n0 + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 -Task execution view is also available in yaml/json format. Below example shows yaml +Task execution view is also available in yaml/json format. Below example shows yaml. This also contains inputs/outputs data for each node :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodId n0 -o yaml + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 -o yaml Usage ` @@ -115,7 +116,18 @@ func getExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Command if execution.DefaultConfig.Details || len(execution.DefaultConfig.NodeID) > 0 { // Fetching Node execution details - return getExecutionDetails(ctx, config.GetConfig().Project, config.GetConfig().Domain, name, cmdCtx) + nExecDetailsForView, err := getExecutionDetails(ctx, config.GetConfig().Project, config.GetConfig().Domain, name, execution.DefaultConfig.NodeID, cmdCtx) + if err != nil { + return err + } + // o/p format of table is not supported on the details. TODO: Add tree format in printer + if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { + fmt.Println("TABLE format is not supported on detailed view and defaults to tree view. Choose either json/yaml") + nodeExecTree := createNodeDetailsTreeView(nil, nExecDetailsForView) + fmt.Println(nodeExecTree.Print()) + return nil + } + return adminPrinter.PrintInterface(config.GetConfig().MustOutputFormat(), nodeExecutionColumns, nExecDetailsForView) } return adminPrinter.Print(config.GetConfig().MustOutputFormat(), executionColumns, ExecutionToProtoMessages(executions)...) diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go index bda18d0acf..6589e4df2d 100644 --- a/flytectl/cmd/get/execution_test.go +++ b/flytectl/cmd/get/execution_test.go @@ -19,11 +19,21 @@ import ( "github.com/stretchr/testify/mock" ) -func TestListExecutionFunc(t *testing.T) { - ctx := context.Background() +const ( + nodeID = "node-id" +) + +func getExecutionSetup() { config.GetConfig().Project = projectValue config.GetConfig().Domain = domainValue config.GetConfig().Output = output + execution.DefaultConfig.Details = false + execution.DefaultConfig.NodeID = "" +} + +func TestListExecutionFunc(t *testing.T) { + ctx := context.Background() + getExecutionSetup() var args []string mockClient := new(mocks.AdminServiceClient) mockOutStream := new(io.Writer) @@ -77,9 +87,7 @@ func TestListExecutionFunc(t *testing.T) { func TestListExecutionFuncWithError(t *testing.T) { ctx := context.Background() - config.GetConfig().Project = projectValue - config.GetConfig().Domain = domainValue - config.GetConfig().Output = output + getExecutionSetup() var args []string mockClient := new(mocks.AdminServiceClient) mockOutStream := new(io.Writer) @@ -129,9 +137,7 @@ func TestListExecutionFuncWithError(t *testing.T) { func TestGetExecutionFunc(t *testing.T) { ctx := context.Background() - config.GetConfig().Project = projectValue - config.GetConfig().Domain = domainValue - config.GetConfig().Output = output + getExecutionSetup() mockClient := new(mocks.AdminServiceClient) mockOutStream := new(io.Writer) cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) @@ -176,6 +182,7 @@ func TestGetExecutionFunc(t *testing.T) { func TestGetExecutionFuncForDetails(t *testing.T) { setup() + getExecutionSetup() ctx := u.Ctx mockCmdCtx := u.CmdCtx mockClient = u.MockClient @@ -183,17 +190,313 @@ func TestGetExecutionFuncForDetails(t *testing.T) { execution.DefaultConfig.Details = true args := []string{dummyExec} mockFetcherExt.OnFetchExecutionMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(&admin.Execution{}, nil) - mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nil, fmt.Errorf("unable to fetch details")) + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nil, fmt.Errorf("unable to fetch details")) err = getExecutionFunc(ctx, args, mockCmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to fetch details"), err) } +func TestGetExecutionFuncWithIOData(t *testing.T) { + t.Run("successful inputs outputs", func(t *testing.T) { + setup() + getExecutionSetup() + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockClient = u.MockClient + mockFetcherExt := u.FetcherExt + execution.DefaultConfig.NodeID = nodeID + args := []string{dummyExec} + + nodeExec1 := createDummyNodeWithID("n0", false) + taskExec1 := createDummyTaskExecutionForNode("n0", "task21") + taskExec2 := createDummyTaskExecutionForNode("n0", "task22") + + nodeExecutions := []*admin.NodeExecution{nodeExec1} + nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} + + inputs := map[string]*core.Literal{ + "val1": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 110, + }, + }, + }, + }, + }, + }, + } + outputs := map[string]*core.Literal{ + "o2": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 120, + }, + }, + }, + }, + }, + }, + } + dataResp := &admin.NodeExecutionGetDataResponse{ + FullOutputs: &core.LiteralMap{ + Literals: inputs, + }, + FullInputs: &core.LiteralMap{ + Literals: outputs, + }, + } + mockFetcherExt.OnFetchExecutionMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(&admin.Execution{}, nil) + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(&admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + }, nil) + mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(dataResp, nil) + + err = getExecutionFunc(ctx, args, mockCmdCtx) + assert.Nil(t, err) + }) + t.Run("invalid inputs", func(t *testing.T) { + setup() + getExecutionSetup() + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockClient = u.MockClient + mockFetcherExt := u.FetcherExt + execution.DefaultConfig.NodeID = nodeID + args := []string{dummyExec} + + nodeExec1 := createDummyNodeWithID("n0", false) + taskExec1 := createDummyTaskExecutionForNode("n0", "task21") + taskExec2 := createDummyTaskExecutionForNode("n0", "task22") + + nodeExecutions := []*admin.NodeExecution{nodeExec1} + nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} + + inputs := map[string]*core.Literal{ + "val1": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Schema{}, + }, + }, + }, + } + outputs := map[string]*core.Literal{ + "o2": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 120, + }, + }, + }, + }, + }, + }, + } + dataResp := &admin.NodeExecutionGetDataResponse{ + FullOutputs: &core.LiteralMap{ + Literals: inputs, + }, + FullInputs: &core.LiteralMap{ + Literals: outputs, + }, + } + mockFetcherExt.OnFetchExecutionMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(&admin.Execution{}, nil) + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(&admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + }, nil) + mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(dataResp, nil) + + err = getExecutionFunc(ctx, args, mockCmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unsupported literal scalar type *core.Scalar_Schema"), err) + }) + t.Run("invalid outputs", func(t *testing.T) { + setup() + getExecutionSetup() + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockClient = u.MockClient + mockFetcherExt := u.FetcherExt + execution.DefaultConfig.NodeID = nodeID + args := []string{dummyExec} + + nodeExec1 := createDummyNodeWithID("n0", false) + taskExec1 := createDummyTaskExecutionForNode("n0", "task21") + taskExec2 := createDummyTaskExecutionForNode("n0", "task22") + + nodeExecutions := []*admin.NodeExecution{nodeExec1} + nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} + + inputs := map[string]*core.Literal{ + "val1": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 120, + }, + }, + }, + }, + }, + }, + } + outputs := map[string]*core.Literal{ + "o2": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Schema{}, + }, + }, + }, + } + dataResp := &admin.NodeExecutionGetDataResponse{ + FullOutputs: &core.LiteralMap{ + Literals: inputs, + }, + FullInputs: &core.LiteralMap{ + Literals: outputs, + }, + } + mockFetcherExt.OnFetchExecutionMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(&admin.Execution{}, nil) + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(&admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + }, nil) + mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(dataResp, nil) + + err = getExecutionFunc(ctx, args, mockCmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unsupported literal scalar type *core.Scalar_Schema"), err) + }) + t.Run("fetch data error from admin", func(t *testing.T) { + setup() + getExecutionSetup() + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockClient = u.MockClient + mockFetcherExt := u.FetcherExt + execution.DefaultConfig.NodeID = nodeID + args := []string{dummyExec} + + nodeExec1 := createDummyNodeWithID("n0", false) + taskExec1 := createDummyTaskExecutionForNode("n0", "task21") + taskExec2 := createDummyTaskExecutionForNode("n0", "task22") + + nodeExecutions := []*admin.NodeExecution{nodeExec1} + nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} + mockFetcherExt.OnFetchExecutionMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(&admin.Execution{}, nil) + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(&admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + }, nil) + mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(nil, fmt.Errorf("error in fetching data")) + + err = getExecutionFunc(ctx, args, mockCmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error in fetching data"), err) + }) + t.Run("Table test successful cases", func(t *testing.T) { + tests := []struct { + outputFormat string + nodeID string + want error + }{ + {outputFormat: "table", nodeID: "", want: nil}, + {outputFormat: "table", nodeID: "n0", want: nil}, + {outputFormat: "yaml", nodeID: "", want: nil}, + {outputFormat: "yaml", nodeID: "n0", want: nil}, + {outputFormat: "yaml", nodeID: "n1", want: nil}, + } + + args := []string{dummyExec} + for _, tt := range tests { + setup() + config.GetConfig().Output = tt.outputFormat + execution.DefaultConfig.NodeID = tt.nodeID + + ctx := u.Ctx + mockCmdCtx := u.CmdCtx + mockFetcherExt := u.FetcherExt + nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} + + nodeExec1 := createDummyNodeWithID("n0", false) + taskExec1 := createDummyTaskExecutionForNode("n0", "task21") + taskExec2 := createDummyTaskExecutionForNode("n0", "task22") + + nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + } + + nodeExecutions := []*admin.NodeExecution{nodeExec1} + nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} + inputs := map[string]*core.Literal{ + "val1": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 100, + }, + }, + }, + }, + }, + }, + } + outputs := map[string]*core.Literal{ + "o2": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 120, + }, + }, + }, + }, + }, + }, + } + dataResp := &admin.NodeExecutionGetDataResponse{ + FullOutputs: &core.LiteralMap{ + Literals: inputs, + }, + FullInputs: &core.LiteralMap{ + Literals: outputs, + }, + } + + mockFetcherExt.OnFetchExecutionMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(&admin.Execution{}, nil) + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(&admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + }, nil) + mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(dataResp, nil) + got := getExecutionFunc(ctx, args, mockCmdCtx) + assert.Equal(t, tt.want, got) + } + }) +} + func TestGetExecutionFuncWithError(t *testing.T) { ctx := context.Background() - config.GetConfig().Project = projectValue - config.GetConfig().Domain = domainValue - config.GetConfig().Output = output + getExecutionSetup() mockClient := new(mocks.AdminServiceClient) mockOutStream := new(io.Writer) cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) diff --git a/flytectl/cmd/get/node_execution.go b/flytectl/cmd/get/node_execution.go index 5d58e39b01..6db868ed88 100644 --- a/flytectl/cmd/get/node_execution.go +++ b/flytectl/cmd/get/node_execution.go @@ -1,37 +1,28 @@ package get import ( + "bytes" "context" - "fmt" "sort" "strconv" + "strings" - "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" + "github.com/flyteorg/flyteidl/clients/go/coreutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/disiqueira/gotree" - "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/jsonpb" ) var nodeExecutionColumns = []printer.Column{ {Header: "Name", JSONPath: "$.id.nodeID"}, {Header: "Exec", JSONPath: "$.id.executionId.name"}, - {Header: "Duration", JSONPath: "$.closure.duration"}, - {Header: "StartedAt", JSONPath: "$.closure.startedAt"}, - {Header: "Phase", JSONPath: "$.closure.phase"}, -} - -var taskExecutionColumns = []printer.Column{ - {Header: "Name", JSONPath: "$.id.taskId.name"}, - {Header: "Node ID", JSONPath: "$.id.nodeExecutionId.nodeID"}, - {Header: "Execution ID", JSONPath: "$.closure.nodeExecutionId.executionId.name"}, - {Header: "Duration", JSONPath: "$.closure.duration"}, - {Header: "StartedAt", JSONPath: "$.closure.startedAt"}, - {Header: "Phase", JSONPath: "$.closure.phase"}, + {Header: "EndedAt", JSONPath: "$.endedAt"}, + {Header: "StartedAt", JSONPath: "$.startedAt"}, + {Header: "Phase", JSONPath: "$.phase"}, } const ( @@ -52,151 +43,229 @@ const ( hyphenPrefix = " - " ) -func NodeExecutionToProtoMessages(l []*admin.NodeExecution) []proto.Message { - messages := make([]proto.Message, 0, len(l)) - for _, m := range l { - messages = append(messages, m) +// TaskExecution wrapper around admin.TaskExecution +type TaskExecution struct { + *admin.TaskExecution +} + +// MarshalJSON overridden method to json marshalling to use jsonpb +func (in *TaskExecution) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + marshaller := jsonpb.Marshaler{} + if err := marshaller.Marshal(&buf, in.TaskExecution); err != nil { + return nil, err } - return messages + return buf.Bytes(), nil +} + +// UnmarshalJSON overridden method to json unmarshalling to use jsonpb +func (in *TaskExecution) UnmarshalJSON(b []byte) error { + in.TaskExecution = &admin.TaskExecution{} + return jsonpb.Unmarshal(bytes.NewReader(b), in.TaskExecution) } -func NodeTaskExecutionToProtoMessages(l []*admin.TaskExecution) []proto.Message { - messages := make([]proto.Message, 0, len(l)) - for _, m := range l { - messages = append(messages, m) +type NodeExecution struct { + *admin.NodeExecution +} + +// MarshalJSON overridden method to json marshalling to use jsonpb +func (in *NodeExecution) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + marshaller := jsonpb.Marshaler{} + if err := marshaller.Marshal(&buf, in.NodeExecution); err != nil { + return nil, err } - return messages + return buf.Bytes(), nil +} + +// UnmarshalJSON overridden method to json unmarshalling to use jsonpb +func (in *NodeExecution) UnmarshalJSON(b []byte) error { + *in = NodeExecution{} + return jsonpb.Unmarshal(bytes.NewReader(b), in) } -func getExecutionDetails(ctx context.Context, project, domain, name string, cmdCtx cmdCore.CommandContext) error { - adminPrinter := printer.Printer{} +// NodeExecutionClosure forms a wrapper around admin.NodeExecution and also fetches the childnodes , task execs +// and input/output on the node executions from the admin api's. +type NodeExecutionClosure struct { + NodeExec *NodeExecution `json:"node_exec,omitempty"` + ChildNodes []*NodeExecutionClosure `json:"child_nodes,omitempty"` + TaskExecutions []*TaskExecutionClosure `json:"task_execs,omitempty"` + // Inputs for the node + Inputs map[string]interface{} `json:"inputs,omitempty"` + // Outputs for the node + Outputs map[string]interface{} `json:"outputs,omitempty"` +} +// TaskExecutionClosure wrapper around TaskExecution +type TaskExecutionClosure struct { + *TaskExecution +} + +func getExecutionDetails(ctx context.Context, project, domain, execName, nodeName string, cmdCtx cmdCore.CommandContext) ([]*NodeExecutionClosure, error) { // Fetching Node execution details - nExecDetails, nodeExecToTaskExec, err := getNodeExecDetailsWithTasks(ctx, project, domain, name, cmdCtx) + nodeExecDetailsMap := map[string]*NodeExecutionClosure{} + nExecDetails, err := getNodeExecDetailsInt(ctx, project, domain, execName, nodeName, "", nodeExecDetailsMap, cmdCtx) if err != nil { - return err + return nil, err } - // o/p format of table is not supported on the details. TODO: Add tree format in printer - if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { - fmt.Println("TABLE format is not supported on detailed view and defaults to tree view. Choose either json/yaml") - if len(execution.DefaultConfig.NodeID) == 0 { - nodeExecTree := createNodeDetailsTreeView(nExecDetails, nodeExecToTaskExec) - if nodeExecTree != nil { - fmt.Println(nodeExecTree.Print()) - } - } else { - nodeTaskExecTree := createNodeTaskExecTreeView(nil, nodeExecToTaskExec[execution.DefaultConfig.NodeID]) - if nodeTaskExecTree != nil { - fmt.Println(nodeTaskExecTree.Print()) - } + var nExecDetailsForView []*NodeExecutionClosure + // Get the execution details only for the nodeId passed + if len(nodeName) > 0 { + // Fetch the last one which contains the nodeId details as previous ones are used to reach the nodeId + if nodeExecDetailsMap[nodeName] != nil { + nExecDetailsForView = append(nExecDetailsForView, nodeExecDetailsMap[nodeName]) } - return nil + } else { + nExecDetailsForView = nExecDetails } - if len(execution.DefaultConfig.NodeID) == 0 { - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), nodeExecutionColumns, - NodeExecutionToProtoMessages(nExecDetails)...) - } + sort.Slice(nExecDetailsForView[:], func(i, j int) bool { + return nExecDetailsForView[i].NodeExec.Closure.CreatedAt.AsTime().Before(nExecDetailsForView[j].NodeExec.Closure.CreatedAt.AsTime()) + }) - taskExecList := nodeExecToTaskExec[execution.DefaultConfig.NodeID] - if taskExecList != nil { - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), taskExecutionColumns, - NodeTaskExecutionToProtoMessages(taskExecList.TaskExecutions)...) - } - return nil + return nExecDetailsForView, nil } -func getNodeExecDetailsWithTasks(ctx context.Context, project, domain, name string, cmdCtx cmdCore.CommandContext) ( - []*admin.NodeExecution, map[string]*admin.TaskExecutionList, error) { - // Fetching Node execution details - nExecDetails, err := cmdCtx.AdminFetcherExt().FetchNodeExecutionDetails(ctx, name, project, domain) +func getNodeExecDetailsInt(ctx context.Context, project, domain, execName, nodeName, uniqueParentID string, + nodeExecDetailsMap map[string]*NodeExecutionClosure, cmdCtx cmdCore.CommandContext) ([]*NodeExecutionClosure, error) { + + nExecDetails, err := cmdCtx.AdminFetcherExt().FetchNodeExecutionDetails(ctx, execName, project, domain, uniqueParentID) if err != nil { - return nil, nil, err + return nil, err } - logger.Infof(ctx, "Retrieved %v node executions", len(nExecDetails.NodeExecutions)) - // Mapping node execution id to task list - nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} + var nodeExecClosures []*NodeExecutionClosure for _, nodeExec := range nExecDetails.NodeExecutions { - nodeExecToTaskExec[nodeExec.Id.NodeId], err = cmdCtx.AdminFetcherExt().FetchTaskExecutionsOnNode(ctx, - nodeExec.Id.NodeId, name, project, domain) - if err != nil { - return nil, nil, err + nodeExecClosure := &NodeExecutionClosure{ + NodeExec: &NodeExecution{nodeExec}, + } + nodeExecClosures = append(nodeExecClosures, nodeExecClosure) + + // Check if this is parent node. If yes do recursive call to get child nodes. + if nodeExec.Metadata != nil && nodeExec.Metadata.IsParentNode { + nodeExecClosure.ChildNodes, err = getNodeExecDetailsInt(ctx, project, domain, execName, nodeName, nodeExec.Id.NodeId, nodeExecDetailsMap, cmdCtx) + if err != nil { + return nil, err + } + } else { + // Bug in admin https://github.com/flyteorg/flyte/issues/1221 + if strings.HasSuffix(nodeExec.Id.NodeId, "start-node") { + continue + } + taskExecList, err := cmdCtx.AdminFetcherExt().FetchTaskExecutionsOnNode(ctx, + nodeExec.Id.NodeId, execName, project, domain) + if err != nil { + return nil, err + } + for _, taskExec := range taskExecList.TaskExecutions { + taskExecClosure := &TaskExecutionClosure{ + TaskExecution: &TaskExecution{taskExec}, + } + nodeExecClosure.TaskExecutions = append(nodeExecClosure.TaskExecutions, taskExecClosure) + } + // Fetch the node inputs and outputs + nExecDataResp, err := cmdCtx.AdminFetcherExt().FetchNodeExecutionData(ctx, nodeExec.Id.NodeId, execName, project, domain) + if err != nil { + return nil, err + } + // Extract the inputs from the literal map + nodeExecClosure.Inputs, err = extractLiteralMap(nExecDataResp.FullInputs) + if err != nil { + return nil, err + } + // Extract the outputs from the literal map + nodeExecClosure.Outputs, err = extractLiteralMap(nExecDataResp.FullOutputs) + if err != nil { + return nil, err + } + } + nodeExecDetailsMap[nodeExec.Id.NodeId] = nodeExecClosure + // Found the node + if len(nodeName) > 0 && nodeName == nodeExec.Id.NodeId { + return nodeExecClosures, err } } - return nExecDetails.NodeExecutions, nodeExecToTaskExec, nil + return nodeExecClosures, nil } -func createNodeTaskExecTreeView(rootView gotree.Tree, taskExecs *admin.TaskExecutionList) gotree.Tree { - if taskExecs == nil || len(taskExecs.TaskExecutions) == 0 { - return gotree.New("") +func createNodeTaskExecTreeView(rootView gotree.Tree, taskExecClosures []*TaskExecutionClosure) { + if len(taskExecClosures) == 0 { + return } if rootView == nil { rootView = gotree.New("") } // TODO: Replace this by filter to sort in the admin - sort.Slice(taskExecs.TaskExecutions[:], func(i, j int) bool { - return taskExecs.TaskExecutions[i].Id.RetryAttempt < taskExecs.TaskExecutions[j].Id.RetryAttempt + sort.Slice(taskExecClosures[:], func(i, j int) bool { + return taskExecClosures[i].Id.RetryAttempt < taskExecClosures[j].Id.RetryAttempt }) - for _, taskExec := range taskExecs.TaskExecutions { - attemptView := rootView.Add(taskAttemptPrefix + strconv.Itoa(int(taskExec.Id.RetryAttempt))) - attemptView.Add(taskExecPrefix + taskExec.Closure.Phase.String() + - hyphenPrefix + taskExec.Closure.StartedAt.AsTime().String() + - hyphenPrefix + taskExec.Closure.StartedAt.AsTime(). - Add(taskExec.Closure.Duration.AsDuration()).String()) - attemptView.Add(taskTypePrefix + taskExec.Closure.TaskType) - attemptView.Add(taskReasonPrefix + taskExec.Closure.Reason) - if taskExec.Closure.Metadata != nil { + for _, taskExecClosure := range taskExecClosures { + attemptView := rootView.Add(taskAttemptPrefix + strconv.Itoa(int(taskExecClosure.Id.RetryAttempt))) + attemptView.Add(taskExecPrefix + taskExecClosure.Closure.Phase.String() + + hyphenPrefix + taskExecClosure.Closure.CreatedAt.AsTime().String() + + hyphenPrefix + taskExecClosure.Closure.UpdatedAt.AsTime().String()) + attemptView.Add(taskTypePrefix + taskExecClosure.Closure.TaskType) + attemptView.Add(taskReasonPrefix + taskExecClosure.Closure.Reason) + if taskExecClosure.Closure.Metadata != nil { metadata := attemptView.Add(taskMetadataPrefix) - metadata.Add(taskGeneratedNamePrefix + taskExec.Closure.Metadata.GeneratedName) - metadata.Add(taskPluginIDPrefix + taskExec.Closure.Metadata.PluginIdentifier) + metadata.Add(taskGeneratedNamePrefix + taskExecClosure.Closure.Metadata.GeneratedName) + metadata.Add(taskPluginIDPrefix + taskExecClosure.Closure.Metadata.PluginIdentifier) extResourcesView := metadata.Add(taskExtResourcesPrefix) - for _, extResource := range taskExec.Closure.Metadata.ExternalResources { + for _, extResource := range taskExecClosure.Closure.Metadata.ExternalResources { extResourcesView.Add(taskExtResourcePrefix + extResource.ExternalId) } resourcePoolInfoView := metadata.Add(taskResourcePrefix) - for _, rsPool := range taskExec.Closure.Metadata.ResourcePoolInfo { + for _, rsPool := range taskExecClosure.Closure.Metadata.ResourcePoolInfo { resourcePoolInfoView.Add(taskExtResourcePrefix + rsPool.Namespace) resourcePoolInfoView.Add(taskExtResourceTokenPrefix + rsPool.AllocationToken) } } - sort.Slice(taskExec.Closure.Logs[:], func(i, j int) bool { - return taskExec.Closure.Logs[i].Name < taskExec.Closure.Logs[j].Name + sort.Slice(taskExecClosure.Closure.Logs[:], func(i, j int) bool { + return taskExecClosure.Closure.Logs[i].Name < taskExecClosure.Closure.Logs[j].Name }) logsView := attemptView.Add(taskLogsPrefix) - for _, logData := range taskExec.Closure.Logs { + for _, logData := range taskExecClosure.Closure.Logs { logsView.Add(taskLogsNamePrefix + logData.Name) logsView.Add(taskLogURIPrefix + logData.Uri) } } - - return rootView } -func createNodeDetailsTreeView(nodeExecutions []*admin.NodeExecution, nodeExecToTaskExec map[string]*admin.TaskExecutionList) gotree.Tree { - nodeDetailsTreeView := gotree.New("") - if nodeExecutions == nil || nodeExecToTaskExec == nil { - return nodeDetailsTreeView +func createNodeDetailsTreeView(rootView gotree.Tree, nodeExecutionClosures []*NodeExecutionClosure) gotree.Tree { + if rootView == nil { + rootView = gotree.New("") + } + if len(nodeExecutionClosures) == 0 { + return rootView } // TODO : Move to sorting using filters. - sort.Slice(nodeExecutions[:], func(i, j int) bool { - // TODO : Remove this after fixing the StartedAt and Duration field not being populated for start-node and end-node in Admin - if nodeExecutions[i].Closure.StartedAt == nil || nodeExecutions[j].Closure.StartedAt == nil { - return true - } - return nodeExecutions[i].Closure.StartedAt.Nanos < nodeExecutions[j].Closure.StartedAt.Nanos + sort.Slice(nodeExecutionClosures[:], func(i, j int) bool { + return nodeExecutionClosures[i].NodeExec.Closure.CreatedAt.AsTime().Before(nodeExecutionClosures[j].NodeExec.Closure.CreatedAt.AsTime()) }) - for _, nodeExec := range nodeExecutions { - nExecView := nodeDetailsTreeView.Add(nodeExec.Id.NodeId + hyphenPrefix + nodeExec.Closure.Phase.String() + - hyphenPrefix + nodeExec.Closure.StartedAt.AsTime().String() + - hyphenPrefix + nodeExec.Closure.StartedAt.AsTime(). - Add(nodeExec.Closure.Duration.AsDuration()).String()) - taskExecs := nodeExecToTaskExec[nodeExec.Id.NodeId] - createNodeTaskExecTreeView(nExecView, taskExecs) + for _, nodeExecWrapper := range nodeExecutionClosures { + nExecView := rootView.Add(nodeExecWrapper.NodeExec.Id.NodeId + hyphenPrefix + nodeExecWrapper.NodeExec.Closure.Phase.String() + + hyphenPrefix + nodeExecWrapper.NodeExec.Closure.CreatedAt.AsTime().String() + + hyphenPrefix + nodeExecWrapper.NodeExec.Closure.UpdatedAt.AsTime().String()) + if len(nodeExecWrapper.ChildNodes) > 0 { + createNodeDetailsTreeView(nExecView, nodeExecWrapper.ChildNodes) + } + createNodeTaskExecTreeView(nExecView, nodeExecWrapper.TaskExecutions) + } + return rootView +} + +func extractLiteralMap(literalMap *core.LiteralMap) (map[string]interface{}, error) { + m := make(map[string]interface{}) + for key, literalVal := range literalMap.Literals { + extractedLiteralVal, err := coreutils.ExtractFromLiteral(literalVal) + if err != nil { + return nil, err + } + m[key] = extractedLiteralVal } - return nodeDetailsTreeView + return m, nil } diff --git a/flytectl/cmd/get/node_execution_test.go b/flytectl/cmd/get/node_execution_test.go index e01325240e..ca58d26568 100644 --- a/flytectl/cmd/get/node_execution_test.go +++ b/flytectl/cmd/get/node_execution_test.go @@ -5,8 +5,6 @@ import ( "testing" "time" - "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -14,6 +12,7 @@ import ( "github.com/disiqueira/gotree" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "google.golang.org/protobuf/types/known/durationpb" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -27,73 +26,40 @@ const ( func TestCreateNodeDetailsTreeView(t *testing.T) { t.Run("empty node execution", func(t *testing.T) { - var nodeExecutions []*admin.NodeExecution - var nodeExecToTaskExec map[string]*admin.TaskExecutionList expectedRoot := gotree.New("") - treeRoot := createNodeDetailsTreeView(nodeExecutions, nodeExecToTaskExec) + treeRoot := createNodeDetailsTreeView(nil, nil) assert.Equal(t, expectedRoot, treeRoot) }) t.Run("successful simple node execution full view", func(t *testing.T) { - nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} - nodeExec1 := createDummyNodeWithID("start-node", true) + nodeExec1 := createDummyNodeWithID("start-node", false) + nodeExec1Closure := NodeExecutionClosure{NodeExec: &NodeExecution{nodeExec1}} taskExec11 := createDummyTaskExecutionForNode("start-node", "task11") + taskExec11Closure := TaskExecutionClosure{&TaskExecution{taskExec11}} taskExec12 := createDummyTaskExecutionForNode("start-node", "task12") + taskExec12Closure := TaskExecutionClosure{&TaskExecution{taskExec12}} - nodeExecToTaskExec["start-node"] = &admin.TaskExecutionList{ - TaskExecutions: []*admin.TaskExecution{taskExec11, taskExec12}, - } + nodeExec1Closure.TaskExecutions = []*TaskExecutionClosure{&taskExec11Closure, &taskExec12Closure} nodeExec2 := createDummyNodeWithID("n0", false) + nodeExec2Closure := NodeExecutionClosure{NodeExec: &NodeExecution{nodeExec2}} taskExec21 := createDummyTaskExecutionForNode("n0", "task21") + taskExec21Closure := TaskExecutionClosure{&TaskExecution{taskExec21}} taskExec22 := createDummyTaskExecutionForNode("n0", "task22") + taskExec22Closure := TaskExecutionClosure{&TaskExecution{taskExec22}} - nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ - TaskExecutions: []*admin.TaskExecution{taskExec21, taskExec22}, - } - - nodeExec3 := createDummyNodeWithID("n1", false) - taskExec31 := createDummyTaskExecutionForNode("n1", "task31") - taskExec32 := createDummyTaskExecutionForNode("n1", "task32") - - nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ - TaskExecutions: []*admin.TaskExecution{taskExec31, taskExec32}, - } - - nodeExecutions := []*admin.NodeExecution{nodeExec1, nodeExec2, nodeExec3} - - treeRoot := createNodeDetailsTreeView(nodeExecutions, nodeExecToTaskExec) - - assert.Equal(t, 3, len(treeRoot.Items())) - }) - - t.Run("empty task execution only view", func(t *testing.T) { - taskExecutionList := &admin.TaskExecutionList{} - treeRoot := createNodeTaskExecTreeView(nil, taskExecutionList) - assert.Equal(t, 0, len(treeRoot.Items())) - }) + nodeExec2Closure.TaskExecutions = []*TaskExecutionClosure{&taskExec21Closure, &taskExec22Closure} - t.Run("successful task execution only view", func(t *testing.T) { - taskExec31 := createDummyTaskExecutionForNode("n1", "task31") - taskExec32 := createDummyTaskExecutionForNode("n1", "task32") + wrapperNodeExecutions := []*NodeExecutionClosure{&nodeExec1Closure, &nodeExec2Closure} - taskExecutionList := &admin.TaskExecutionList{ - TaskExecutions: []*admin.TaskExecution{taskExec31, taskExec32}, - } + treeRoot := createNodeDetailsTreeView(nil, wrapperNodeExecutions) - treeRoot := createNodeTaskExecTreeView(nil, taskExecutionList) assert.Equal(t, 2, len(treeRoot.Items())) }) } -func createDummyNodeWithID(nodeID string, startedAtEmpty bool) *admin.NodeExecution { - // Remove this param startedAtEmpty and code once admin code is fixed - startedAt := timestamppb.Now() - if startedAtEmpty { - startedAt = nil - } - +func createDummyNodeWithID(nodeID string, isParentNode bool) *admin.NodeExecution { nodeExecution := &admin.NodeExecution{ Id: &core.NodeExecutionIdentifier{ NodeId: nodeID, @@ -104,12 +70,15 @@ func createDummyNodeWithID(nodeID string, startedAtEmpty bool) *admin.NodeExecut }, }, InputUri: nodeID + "inputUri", + Metadata: &admin.NodeExecutionMetaData{ + IsParentNode: isParentNode, + }, Closure: &admin.NodeExecutionClosure{ OutputResult: &admin.NodeExecutionClosure_OutputUri{ OutputUri: nodeID + "outputUri", }, Phase: core.NodeExecution_SUCCEEDED, - StartedAt: startedAt, + StartedAt: timestamppb.Now(), Duration: &durationpb.Duration{Seconds: 100}, CreatedAt: timestamppb.Now(), UpdatedAt: timestamppb.Now(), @@ -194,67 +163,132 @@ func TestGetExecutionDetails(t *testing.T) { ctx := u.Ctx mockCmdCtx := u.CmdCtx mockFetcherExt := u.FetcherExt - nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} + nodeExecStart := createDummyNodeWithID("start-node", false) + nodeExecN2 := createDummyNodeWithID("n2", true) nodeExec1 := createDummyNodeWithID("n0", false) taskExec1 := createDummyTaskExecutionForNode("n0", "task21") taskExec2 := createDummyTaskExecutionForNode("n0", "task22") - nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ - TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, - } - - nodeExecutions := []*admin.NodeExecution{nodeExec1} + nodeExecutions := []*admin.NodeExecution{nodeExecStart, nodeExecN2, nodeExec1} nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} - mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nodeExecList, nil) - mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(nodeExecToTaskExec["n0"], nil) + inputs := map[string]*core.Literal{ + "val1": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 100, + }, + }, + }, + }, + }, + }, + } + outputs := map[string]*core.Literal{ + "o2": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 120, + }, + }, + }, + }, + }, + }, + } + dataResp := &admin.NodeExecutionGetDataResponse{ + FullOutputs: &core.LiteralMap{ + Literals: inputs, + }, + FullInputs: &core.LiteralMap{ + Literals: outputs, + }, + } - err = getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, mockCmdCtx) - assert.Nil(t, err) - }) + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "n2").Return(&admin.NodeExecutionList{}, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(&admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + }, nil) + mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(dataResp, nil) - t.Run("failure node details fetch", func(t *testing.T) { - setup() - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockFetcherExt := u.FetcherExt - mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nil, fmt.Errorf("unable to fetch details")) - err = getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, mockCmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to fetch details"), err) + nodeExecWrappers, err := getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, "", mockCmdCtx) + assert.Nil(t, err) + assert.NotNil(t, nodeExecWrappers) }) - t.Run("failure task exec fetch", func(t *testing.T) { + t.Run("successful get details default view for node-id", func(t *testing.T) { setup() ctx := u.Ctx mockCmdCtx := u.CmdCtx mockFetcherExt := u.FetcherExt - nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} nodeExec1 := createDummyNodeWithID("n0", false) taskExec1 := createDummyTaskExecutionForNode("n0", "task21") taskExec2 := createDummyTaskExecutionForNode("n0", "task22") - nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ - TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, - } - nodeExecutions := []*admin.NodeExecution{nodeExec1} nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} - mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nodeExecList, nil) - mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(nil, fmt.Errorf("unable to fetch task exec details")) - err = getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, mockCmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to fetch task exec details"), err) + inputs := map[string]*core.Literal{ + "val1": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 100, + }, + }, + }, + }, + }, + }, + } + outputs := map[string]*core.Literal{ + "o2": &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 120, + }, + }, + }, + }, + }, + }, + } + dataResp := &admin.NodeExecutionGetDataResponse{ + FullOutputs: &core.LiteralMap{ + Literals: inputs, + }, + FullInputs: &core.LiteralMap{ + Literals: outputs, + }, + } + + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(&admin.TaskExecutionList{ + TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, + }, nil) + mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(dataResp, nil) + + nodeExecWrappers, err := getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, "n0", mockCmdCtx) + assert.Nil(t, err) + assert.NotNil(t, nodeExecWrappers) }) - t.Run("successful get details non default view", func(t *testing.T) { + t.Run("failure task exec fetch", func(t *testing.T) { setup() - config.GetConfig().Output = "table" - execution.DefaultConfig.NodeID = "n0" - ctx := u.Ctx mockCmdCtx := u.CmdCtx mockFetcherExt := u.FetcherExt @@ -271,52 +305,10 @@ func TestGetExecutionDetails(t *testing.T) { nodeExecutions := []*admin.NodeExecution{nodeExec1} nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} - mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nodeExecList, nil) - mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(nodeExecToTaskExec["n0"], nil) - - err = getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, mockCmdCtx) - assert.Nil(t, err) - }) - - t.Run("Table test successful cases", func(t *testing.T) { - tests := []struct { - outputFormat string - nodeID string - want error - }{ - {outputFormat: "table", nodeID: "", want: nil}, - {outputFormat: "table", nodeID: "n0", want: nil}, - {outputFormat: "yaml", nodeID: "", want: nil}, - {outputFormat: "yaml", nodeID: "n0", want: nil}, - {outputFormat: "yaml", nodeID: "n1", want: nil}, - } - - for _, tt := range tests { - setup() - config.GetConfig().Output = tt.outputFormat - execution.DefaultConfig.NodeID = tt.nodeID - - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockFetcherExt := u.FetcherExt - nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} - - nodeExec1 := createDummyNodeWithID("n0", false) - taskExec1 := createDummyTaskExecutionForNode("n0", "task21") - taskExec2 := createDummyTaskExecutionForNode("n0", "task22") - - nodeExecToTaskExec["n0"] = &admin.TaskExecutionList{ - TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, - } - - nodeExecutions := []*admin.NodeExecution{nodeExec1} - nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} - - mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(nodeExecList, nil) - mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(nodeExecToTaskExec["n0"], nil) - - got := getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, mockCmdCtx) - assert.Equal(t, tt.want, got) - } + mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) + mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(nil, fmt.Errorf("unable to fetch task exec details")) + _, err = getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, "", mockCmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to fetch task exec details"), err) }) } diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index ced38d4586..73c266b461 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -52,23 +52,23 @@ Get more details for the execution using --details flag which shows node executi bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -Using yaml view for the details. In this view only node details are available. For task details pass --nodeId flag +Using yaml view for the details. In this view only node details are available. For task details pass --nodeID flag :: bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml -Using --nodeId flag to get task executions on a specific node. Use the nodeId attribute from node details view +Using --nodeID flag to get task executions on a specific node. Use the nodeID attribute from node details view :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodId n0 + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 -Task execution view is also available in yaml/json format. Below example shows yaml +Task execution view is also available in yaml/json format. Below example shows yaml. This also contains inputs/outputs data for each node :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodId n0 -o yaml + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 -o yaml Usage @@ -88,7 +88,7 @@ Options --filter.limit int32 Specifies the limit (default 100) --filter.sortBy string Specifies which field to sort results (default "created_at") -h, --help help for execution - --nodeId string get task executions for given node name. + --nodeID string get task executions for given node name. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/go.mod b/flytectl/go.mod index e864548a80..089c496cfd 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -43,6 +43,5 @@ require ( gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.4.0 gotest.tools v2.2.0+incompatible - k8s.io/kubernetes v1.13.0 sigs.k8s.io/yaml v1.2.0 ) diff --git a/flytectl/go.sum b/flytectl/go.sum index 2367487525..6cecb15014 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -1409,7 +1409,6 @@ k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/flytectl/pkg/ext/execution_fetcher.go b/flytectl/pkg/ext/execution_fetcher.go index 47535cc1e3..24251b39f6 100644 --- a/flytectl/pkg/ext/execution_fetcher.go +++ b/flytectl/pkg/ext/execution_fetcher.go @@ -4,7 +4,6 @@ import ( "context" "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) @@ -23,14 +22,32 @@ func (a *AdminFetcherExtClient) FetchExecution(ctx context.Context, name, projec return e, nil } -func (a *AdminFetcherExtClient) FetchNodeExecutionDetails(ctx context.Context, name, project, domain string) (*admin.NodeExecutionList, error) { +func (a *AdminFetcherExtClient) FetchNodeExecutionData(ctx context.Context, nodeID, execName, project, domain string) (*admin.NodeExecutionGetDataResponse, error) { + ne, err := a.AdminServiceClient().GetNodeExecutionData(ctx, &admin.NodeExecutionGetDataRequest{ + Id: &core.NodeExecutionIdentifier{ + NodeId: nodeID, + ExecutionId: &core.WorkflowExecutionIdentifier{ + Project: project, + Domain: domain, + Name: execName, + }, + }, + }) + if err != nil { + return nil, err + } + return ne, nil +} + +func (a *AdminFetcherExtClient) FetchNodeExecutionDetails(ctx context.Context, name, project, domain, uniqueParentID string) (*admin.NodeExecutionList, error) { ne, err := a.AdminServiceClient().ListNodeExecutions(ctx, &admin.NodeExecutionListRequest{ WorkflowExecutionId: &core.WorkflowExecutionIdentifier{ Project: project, Domain: domain, Name: name, }, - Limit: 100, + UniqueParentId: uniqueParentID, + Limit: 100, }) if err != nil { return nil, err diff --git a/flytectl/pkg/ext/execution_fetcher_test.go b/flytectl/pkg/ext/execution_fetcher_test.go index 98da15871d..a415660f5c 100644 --- a/flytectl/pkg/ext/execution_fetcher_test.go +++ b/flytectl/pkg/ext/execution_fetcher_test.go @@ -71,14 +71,14 @@ func TestFetchExecutionError(t *testing.T) { func TestFetchNodeExecutionDetails(t *testing.T) { getExecutionFetcherSetup() adminClient.OnListNodeExecutionsMatch(mock.Anything, mock.Anything).Return(&admin.NodeExecutionList{}, nil) - _, err := adminFetcherExt.FetchNodeExecutionDetails(ctx, "execName", "dummyProject", "domainValue") + _, err := adminFetcherExt.FetchNodeExecutionDetails(ctx, "execName", "dummyProject", "domainValue", "") assert.Nil(t, err) } func TestFetchNodeExecutionDetailsError(t *testing.T) { getExecutionFetcherSetup() adminClient.OnListNodeExecutionsMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) - _, err := adminFetcherExt.FetchNodeExecutionDetails(ctx, "execName", "dummyProject", "domainValue") + _, err := adminFetcherExt.FetchNodeExecutionDetails(ctx, "execName", "dummyProject", "domainValue", "") assert.Equal(t, fmt.Errorf("failed"), err) } @@ -95,3 +95,17 @@ func TestFetchTaskExecOnNodeError(t *testing.T) { _, err := adminFetcherExt.FetchTaskExecutionsOnNode(ctx, "nodeId", "execName", "dummyProject", "domainValue") assert.Equal(t, fmt.Errorf("failed"), err) } + +func TestFetchNodeData(t *testing.T) { + getExecutionFetcherSetup() + adminClient.OnGetNodeExecutionDataMatch(mock.Anything, mock.Anything).Return(&admin.NodeExecutionGetDataResponse{}, nil) + _, err := adminFetcherExt.FetchNodeExecutionData(ctx, "nodeId", "execName", "dummyProject", "domainValue") + assert.Nil(t, err) +} + +func TestFetchNodeDataError(t *testing.T) { + getExecutionFetcherSetup() + adminClient.OnGetNodeExecutionDataMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchNodeExecutionData(ctx, "nodeId", "execName", "dummyProject", "domainValue") + assert.Equal(t, fmt.Errorf("failed"), err) +} diff --git a/flytectl/pkg/ext/fetcher.go b/flytectl/pkg/ext/fetcher.go index 118e889e07..2b8b96f793 100644 --- a/flytectl/pkg/ext/fetcher.go +++ b/flytectl/pkg/ext/fetcher.go @@ -19,8 +19,11 @@ type AdminFetcherExtInterface interface { // FetchExecution fetches the execution based on name, project, domain FetchExecution(ctx context.Context, name, project, domain string) (*admin.Execution, error) - // FetchNodeExecutionDetails fetches the node execution details based on execution name, project, domain - FetchNodeExecutionDetails(ctx context.Context, name, project, domain string) (*admin.NodeExecutionList, error) + // FetchNodeExecutionDetails fetches the node execution details based on execution name, project, domain, uniqueParentId + FetchNodeExecutionDetails(ctx context.Context, name, project, domain, uniqueParentID string) (*admin.NodeExecutionList, error) + + // FetchNodeExecutionData fetches the node execution data based on nodeId, execution name, project, domain + FetchNodeExecutionData(ctx context.Context, nodeID, execName, project, domain string) (*admin.NodeExecutionGetDataResponse, error) // FetchTaskExecutionsOnNode fetches task execution on a node , for give execution name, project, domain FetchTaskExecutionsOnNode(ctx context.Context, nodeID, execName, project, domain string) (*admin.TaskExecutionList, error) diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index 6932ee5c1b..f41cb66dda 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -299,6 +299,47 @@ func (_m *AdminFetcherExtInterface) FetchLPVersion(ctx context.Context, name str return r0, r1 } +type AdminFetcherExtInterface_FetchNodeExecutionData struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchNodeExecutionData) Return(_a0 *admin.NodeExecutionGetDataResponse, _a1 error) *AdminFetcherExtInterface_FetchNodeExecutionData { + return &AdminFetcherExtInterface_FetchNodeExecutionData{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionData(ctx context.Context, nodeID string, execName string, project string, domain string) *AdminFetcherExtInterface_FetchNodeExecutionData { + c := _m.On("FetchNodeExecutionData", ctx, nodeID, execName, project, domain) + return &AdminFetcherExtInterface_FetchNodeExecutionData{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDataMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchNodeExecutionData { + c := _m.On("FetchNodeExecutionData", matchers...) + return &AdminFetcherExtInterface_FetchNodeExecutionData{Call: c} +} + +// FetchNodeExecutionData provides a mock function with given fields: ctx, nodeID, execName, project, domain +func (_m *AdminFetcherExtInterface) FetchNodeExecutionData(ctx context.Context, nodeID string, execName string, project string, domain string) (*admin.NodeExecutionGetDataResponse, error) { + ret := _m.Called(ctx, nodeID, execName, project, domain) + + var r0 *admin.NodeExecutionGetDataResponse + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) *admin.NodeExecutionGetDataResponse); ok { + r0 = rf(ctx, nodeID, execName, project, domain) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.NodeExecutionGetDataResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { + r1 = rf(ctx, nodeID, execName, project, domain) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type AdminFetcherExtInterface_FetchNodeExecutionDetails struct { *mock.Call } @@ -307,8 +348,8 @@ func (_m AdminFetcherExtInterface_FetchNodeExecutionDetails) Return(_a0 *admin.N return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: _m.Call.Return(_a0, _a1)} } -func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchNodeExecutionDetails { - c := _m.On("FetchNodeExecutionDetails", ctx, name, project, domain) +func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string, uniqueParentId string) *AdminFetcherExtInterface_FetchNodeExecutionDetails { + c := _m.On("FetchNodeExecutionDetails", ctx, name, project, domain, uniqueParentId) return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: c} } @@ -317,13 +358,13 @@ func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDetailsMatch(matchers .. return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: c} } -// FetchNodeExecutionDetails provides a mock function with given fields: ctx, name, project, domain -func (_m *AdminFetcherExtInterface) FetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string) (*admin.NodeExecutionList, error) { - ret := _m.Called(ctx, name, project, domain) +// FetchNodeExecutionDetails provides a mock function with given fields: ctx, name, project, domain, uniqueParentId +func (_m *AdminFetcherExtInterface) FetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string, uniqueParentId string) (*admin.NodeExecutionList, error) { + ret := _m.Called(ctx, name, project, domain, uniqueParentId) var r0 *admin.NodeExecutionList - if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *admin.NodeExecutionList); ok { - r0 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) *admin.NodeExecutionList); ok { + r0 = rf(ctx, name, project, domain, uniqueParentId) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*admin.NodeExecutionList) @@ -331,8 +372,8 @@ func (_m *AdminFetcherExtInterface) FetchNodeExecutionDetails(ctx context.Contex } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { - r1 = rf(ctx, name, project, domain) + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { + r1 = rf(ctx, name, project, domain, uniqueParentId) } else { r1 = ret.Error(1) } @@ -389,8 +430,8 @@ func (_m AdminFetcherExtInterface_FetchTaskExecutionsOnNode) Return(_a0 *admin.T return &AdminFetcherExtInterface_FetchTaskExecutionsOnNode{Call: _m.Call.Return(_a0, _a1)} } -func (_m *AdminFetcherExtInterface) OnFetchTaskExecutionsOnNode(ctx context.Context, nodeId string, execName string, project string, domain string) *AdminFetcherExtInterface_FetchTaskExecutionsOnNode { - c := _m.On("FetchTaskExecutionsOnNode", ctx, nodeId, execName, project, domain) +func (_m *AdminFetcherExtInterface) OnFetchTaskExecutionsOnNode(ctx context.Context, nodeID string, execName string, project string, domain string) *AdminFetcherExtInterface_FetchTaskExecutionsOnNode { + c := _m.On("FetchTaskExecutionsOnNode", ctx, nodeID, execName, project, domain) return &AdminFetcherExtInterface_FetchTaskExecutionsOnNode{Call: c} } @@ -399,13 +440,13 @@ func (_m *AdminFetcherExtInterface) OnFetchTaskExecutionsOnNodeMatch(matchers .. return &AdminFetcherExtInterface_FetchTaskExecutionsOnNode{Call: c} } -// FetchTaskExecutionsOnNode provides a mock function with given fields: ctx, nodeId, execName, project, domain -func (_m *AdminFetcherExtInterface) FetchTaskExecutionsOnNode(ctx context.Context, nodeId string, execName string, project string, domain string) (*admin.TaskExecutionList, error) { - ret := _m.Called(ctx, nodeId, execName, project, domain) +// FetchTaskExecutionsOnNode provides a mock function with given fields: ctx, nodeID, execName, project, domain +func (_m *AdminFetcherExtInterface) FetchTaskExecutionsOnNode(ctx context.Context, nodeID string, execName string, project string, domain string) (*admin.TaskExecutionList, error) { + ret := _m.Called(ctx, nodeID, execName, project, domain) var r0 *admin.TaskExecutionList if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) *admin.TaskExecutionList); ok { - r0 = rf(ctx, nodeId, execName, project, domain) + r0 = rf(ctx, nodeID, execName, project, domain) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*admin.TaskExecutionList) @@ -414,7 +455,7 @@ func (_m *AdminFetcherExtInterface) FetchTaskExecutionsOnNode(ctx context.Contex var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { - r1 = rf(ctx, nodeId, execName, project, domain) + r1 = rf(ctx, nodeID, execName, project, domain) } else { r1 = ret.Error(1) } diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index 208b063195..2afcff5403 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -124,6 +124,46 @@ func (p Printer) JSONToTable(jsonRows []byte, columns []Column) error { return nil } +func (p Printer) PrintInterface(format OutputFormat, columns []Column, v interface{}) error { + jsonRows, err := json.Marshal(v) + if err != nil { + return err + } + // Factory Method for all printer + switch format { + case OutputFormatJSON, OutputFormatYAML: + return printJSONYaml(format, v) + default: // Print table + return p.JSONToTable(jsonRows, columns) + } +} + +// printJSONYaml internal function for printing +func printJSONYaml(format OutputFormat, v interface{}) error { + if format != OutputFormatJSON && format != OutputFormatYAML { + return fmt.Errorf("this function should be called only for json/yaml printing") + } + buf := new(bytes.Buffer) + encoder := json.NewEncoder(buf) + encoder.SetIndent(empty, tab) + + err := encoder.Encode(v) + if err != nil { + return err + } + + if format == OutputFormatJSON { + fmt.Println(buf.String()) + } else { + v, err := yaml.JSONToYAML(buf.Bytes()) + if err != nil { + return err + } + fmt.Println(string(v)) + } + return nil +} + func (p Printer) Print(format OutputFormat, columns []Column, messages ...proto.Message) error { printableMessages := make([]*PrintableProto, 0, len(messages)) @@ -134,27 +174,13 @@ func (p Printer) Print(format OutputFormat, columns []Column, messages ...proto. // Factory Method for all printer switch format { case OutputFormatJSON, OutputFormatYAML: // Print protobuf to json - buf := new(bytes.Buffer) - encoder := json.NewEncoder(buf) - encoder.SetIndent(empty, tab) - var err error + var v interface{} if len(printableMessages) == 1 { - err = encoder.Encode(printableMessages[0]) + v = printableMessages[0] } else { - err = encoder.Encode(printableMessages) - } - if err != nil { - return err - } - if format == OutputFormatJSON { - fmt.Println(buf.String()) - } else { - v, err := yaml.JSONToYAML(buf.Bytes()) - if err != nil { - return err - } - fmt.Println(string(v)) + v = printableMessages } + return printJSONYaml(format, v) case OutputFormatDOT, OutputFormatDOTURL: var workflows []*admin.Workflow for _, m := range messages { From 9b05df0ed7b2cba2f2dacf8d3e30a0523862a6ae Mon Sep 17 00:00:00 2001 From: Sean Lin Date: Tue, 13 Jul 2021 09:59:10 -0700 Subject: [PATCH 112/645] Adding support for workflow execution config (#144) Signed-off-by: Sean Lin --- .../attrdeleteconfig_flags.go | 55 +++++++ .../attrdeleteconfig_flags_test.go | 116 +++++++++++++++ .../attrfetchconfig_flags.go | 55 +++++++ .../attrfetchconfig_flags_test.go | 116 +++++++++++++++ .../attrupdateconfig_flags.go | 55 +++++++ .../attrupdateconfig_flags_test.go | 116 +++++++++++++++ .../workflowexecutionconfig/delete_config.go | 10 ++ .../workflowexecutionconfig/fetch_config.go | 9 ++ .../workflowexecutionconfig/file_config.go | 47 ++++++ .../file_config_test.go | 46 ++++++ .../workflowexecutionconfig/update_config.go | 10 ++ flytectl/cmd/delete/delete.go | 4 + flytectl/cmd/delete/delete_test.go | 10 +- .../matchable_workflow_execution_config.go | 79 ++++++++++ ...atchable_workflow_execution_config_test.go | 135 +++++++++++++++++ ...ject_domain_workflow_execution_config.yaml | 3 + ...id_workflow_workflow_execution_config.yaml | 4 + flytectl/cmd/get/get.go | 4 + flytectl/cmd/get/get_test.go | 10 +- .../matchable_workflow_execution_config.go | 100 +++++++++++++ ...atchable_workflow_execution_config_test.go | 138 ++++++++++++++++++ .../matchable_workflow_execution_config.go | 77 ++++++++++ ...atchable_workflow_execution_config_test.go | 95 ++++++++++++ ...ject_domain_workflow_execution_config.yaml | 3 + ...id_workflow_workflow_execution_config.yaml | 4 + flytectl/cmd/update/update.go | 3 + flytectl/cmd/update/update_test.go | 10 +- ...tectl_delete_workflow-execution-config.rst | 74 ++++++++++ ...flytectl_get_workflow-execution-config.rst | 94 ++++++++++++ ...tectl_update_workflow-execution-config.rst | 77 ++++++++++ flytectl/docs/source/nouns.rst | 3 + 31 files changed, 1547 insertions(+), 15 deletions(-) create mode 100755 flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags_test.go create mode 100755 flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go create mode 100644 flytectl/cmd/config/subcommand/workflowexecutionconfig/delete_config.go create mode 100644 flytectl/cmd/config/subcommand/workflowexecutionconfig/fetch_config.go create mode 100644 flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config.go create mode 100644 flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config_test.go create mode 100644 flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go create mode 100644 flytectl/cmd/delete/matchable_workflow_execution_config.go create mode 100644 flytectl/cmd/delete/matchable_workflow_execution_config_test.go create mode 100644 flytectl/cmd/delete/testdata/valid_project_domain_workflow_execution_config.yaml create mode 100644 flytectl/cmd/delete/testdata/valid_workflow_workflow_execution_config.yaml create mode 100644 flytectl/cmd/get/matchable_workflow_execution_config.go create mode 100644 flytectl/cmd/get/matchable_workflow_execution_config_test.go create mode 100644 flytectl/cmd/update/matchable_workflow_execution_config.go create mode 100644 flytectl/cmd/update/matchable_workflow_execution_config_test.go create mode 100644 flytectl/cmd/update/testdata/valid_project_domain_workflow_execution_config.yaml create mode 100644 flytectl/cmd/update/testdata/valid_workflow_workflow_execution_config.yaml create mode 100644 flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst create mode 100644 flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst create mode 100644 flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags.go new file mode 100755 index 0000000000..a7a7395cce --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags.go @@ -0,0 +1,55 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package workflowexecutionconfig + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrDeleteConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrDeleteConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrDeleteConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) + cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags_test.go new file mode 100755 index 0000000000..5aa3b6ec94 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags_test.go @@ -0,0 +1,116 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package workflowexecutionconfig + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrDeleteConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrDeleteConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrDeleteConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrDeleteConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrDeleteConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrDeleteConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrDeleteConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrDeleteConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrDeleteConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(val, result)) +} + +func testDecodeRaw_AttrDeleteConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrDeleteConfig(vStringSlice, result)) +} + +func TestAttrDeleteConfig_GetPFlagSet(t *testing.T) { + val := AttrDeleteConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrDeleteConfig_SetFlags(t *testing.T) { + actual := AttrDeleteConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags.go new file mode 100755 index 0000000000..6196b75ed7 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags.go @@ -0,0 +1,55 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package workflowexecutionconfig + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrFetchConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrFetchConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrFetchConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) + cmdFlags.StringVar(&DefaultFetchConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags_test.go new file mode 100755 index 0000000000..7f85109efe --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags_test.go @@ -0,0 +1,116 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package workflowexecutionconfig + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrFetchConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrFetchConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrFetchConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrFetchConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrFetchConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrFetchConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrFetchConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrFetchConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrFetchConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(val, result)) +} + +func testDecodeRaw_AttrFetchConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrFetchConfig(vStringSlice, result)) +} + +func TestAttrFetchConfig_GetPFlagSet(t *testing.T) { + val := AttrFetchConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrFetchConfig_SetFlags(t *testing.T) { + actual := AttrFetchConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrFetchConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go new file mode 100755 index 0000000000..d13942d393 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go @@ -0,0 +1,55 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package workflowexecutionconfig + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (AttrUpdateConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (AttrUpdateConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in AttrUpdateConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) + cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go new file mode 100755 index 0000000000..f9d64c9101 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go @@ -0,0 +1,116 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package workflowexecutionconfig + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsAttrUpdateConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementAttrUpdateConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsAttrUpdateConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookAttrUpdateConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementAttrUpdateConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_AttrUpdateConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookAttrUpdateConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_AttrUpdateConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_AttrUpdateConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(val, result)) +} + +func testDecodeRaw_AttrUpdateConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_AttrUpdateConfig(vStringSlice, result)) +} + +func TestAttrUpdateConfig_GetPFlagSet(t *testing.T) { + val := AttrUpdateConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestAttrUpdateConfig_SetFlags(t *testing.T) { + actual := AttrUpdateConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_attrFile", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("attrFile", testValue) + if vString, err := cmdFlags.GetString("attrFile"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vString), &actual.AttrFile) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/delete_config.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/delete_config.go new file mode 100644 index 0000000000..3604c0971e --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/delete_config.go @@ -0,0 +1,10 @@ +package workflowexecutionconfig + +//go:generate pflags AttrDeleteConfig --default-var DefaultDelConfig --bind-default-var + +// AttrDeleteConfig Matchable resource attributes configuration passed from command line +type AttrDeleteConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` +} + +var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/fetch_config.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/fetch_config.go new file mode 100644 index 0000000000..8c2b918cb4 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/fetch_config.go @@ -0,0 +1,9 @@ +package workflowexecutionconfig + +//go:generate pflags AttrFetchConfig --default-var DefaultFetchConfig --bind-default-var + +type AttrFetchConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` +} + +var DefaultFetchConfig = &AttrFetchConfig{} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config.go new file mode 100644 index 0000000000..9dc6b01ed5 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config.go @@ -0,0 +1,47 @@ +package workflowexecutionconfig + +import ( + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +// FileConfig shadow Config for WorkflowExecutionConfig. +// The shadow Config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. +// As the same structure is being used for both ProjectDomainAttribute/Workflowattribute +type FileConfig struct { + Project string `json:"project"` + Domain string `json:"domain"` + Workflow string `json:"workflow,omitempty"` + *admin.WorkflowExecutionConfig +} + +// Decorate decorator over WorkflowExecutionConfig. +func (t FileConfig) Decorate() *admin.MatchingAttributes { + return &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_WorkflowExecutionConfig{ + WorkflowExecutionConfig: t.WorkflowExecutionConfig, + }, + } +} + +// UnDecorate to uncover WorkflowExecutionConfig. +func (t *FileConfig) UnDecorate(matchingAttribute *admin.MatchingAttributes) { + if matchingAttribute == nil { + return + } + t.WorkflowExecutionConfig = matchingAttribute.GetWorkflowExecutionConfig() +} + +// GetProject from the WorkflowExecutionConfig +func (t FileConfig) GetProject() string { + return t.Project +} + +// GetDomain from the WorkflowExecutionConfig +func (t FileConfig) GetDomain() string { + return t.Domain +} + +// GetWorkflow from the WorkflowExecutionConfig +func (t FileConfig) GetWorkflow() string { + return t.Workflow +} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config_test.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config_test.go new file mode 100644 index 0000000000..b6b8cfd840 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config_test.go @@ -0,0 +1,46 @@ +package workflowexecutionconfig + +import ( + "testing" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" +) + +func TestFileConfig(t *testing.T) { + workflowExecutionConfigFileConfig := FileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + WorkflowExecutionConfig: &admin.WorkflowExecutionConfig{ + MaxParallelism: 5, + }, + } + matchingAttr := &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_WorkflowExecutionConfig{ + WorkflowExecutionConfig: workflowExecutionConfigFileConfig.WorkflowExecutionConfig, + }, + } + t.Run("decorate", func(t *testing.T) { + assert.Equal(t, matchingAttr, workflowExecutionConfigFileConfig.Decorate()) + }) + + t.Run("decorate", func(t *testing.T) { + workflowExecutionConfigFileConfigNew := FileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + } + workflowExecutionConfigFileConfigNew.UnDecorate(matchingAttr) + assert.Equal(t, workflowExecutionConfigFileConfig, workflowExecutionConfigFileConfigNew) + }) + t.Run("get project domain workflow", func(t *testing.T) { + workflowExecutionConfigFileConfigNew := FileConfig{ + Project: "dummyProject", + Domain: "dummyDomain", + Workflow: "workflow", + } + assert.Equal(t, "dummyProject", workflowExecutionConfigFileConfigNew.GetProject()) + assert.Equal(t, "dummyDomain", workflowExecutionConfigFileConfigNew.GetDomain()) + assert.Equal(t, "workflow", workflowExecutionConfigFileConfigNew.GetWorkflow()) + }) +} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go new file mode 100644 index 0000000000..591d354ae4 --- /dev/null +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go @@ -0,0 +1,10 @@ +package workflowexecutionconfig + +//go:generate pflags AttrUpdateConfig --default-var DefaultUpdateConfig --bind-default-var + +// AttrUpdateConfig Matchable resource attributes configuration passed from command line +type AttrUpdateConfig struct { + AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` +} + +var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index 94ce8e801f..00685feccd 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -6,6 +6,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" @@ -47,6 +48,9 @@ func RemoteDeleteCommand() *cobra.Command { "plugin-override": {CmdFunc: deletePluginOverride, Aliases: []string{"plugin-overrides"}, Short: pluginOverrideShort, Long: pluginOverrideLong, PFlagProvider: pluginoverride.DefaultDelConfig, ProjectDomainNotRequired: true}, + "workflow-execution-config": {CmdFunc: deleteWorkflowExecutionConfig, Aliases: []string{"workflow-execution-config"}, + Short: workflowExecutionConfigShort, + Long: workflowExecutionConfigLong, PFlagProvider: workflowexecutionconfig.DefaultDelConfig, ProjectDomainNotRequired: true}, } cmdcore.AddCommands(deleteCmd, terminateResourcesFuncs) return deleteCmd diff --git a/flytectl/cmd/delete/delete_test.go b/flytectl/cmd/delete/delete_test.go index e26a1d7a9d..70af741071 100644 --- a/flytectl/cmd/delete/delete_test.go +++ b/flytectl/cmd/delete/delete_test.go @@ -32,16 +32,16 @@ func TestDeleteCommand(t *testing.T) { assert.Equal(t, deleteCommand.Use, "delete") assert.Equal(t, deleteCommand.Short, deleteCmdShort) assert.Equal(t, deleteCommand.Long, deleteCmdLong) - assert.Equal(t, len(deleteCommand.Commands()), 6) + assert.Equal(t, len(deleteCommand.Commands()), 7) cmdNouns := deleteCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - useArray := []string{"cluster-resource-attribute", "execution", "execution-cluster-label", "execution-queue-attribute", "plugin-override", "task-resource-attribute"} - aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"execution-cluster-labels"}, {"execution-queue-attributes"}, {"plugin-overrides"}, {"task-resource-attributes"}} - shortArray := []string{clusterResourceAttributesShort, execCmdShort, executionClusterLabelShort, executionQueueAttributesShort, pluginOverrideShort, taskResourceAttributesShort} - longArray := []string{clusterResourceAttributesLong, execCmdLong, executionClusterLabelLong, executionQueueAttributesLong, pluginOverrideLong, taskResourceAttributesLong} + useArray := []string{"cluster-resource-attribute", "execution", "execution-cluster-label", "execution-queue-attribute", "plugin-override", "task-resource-attribute", "workflow-execution-config"} + aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"execution-cluster-labels"}, {"execution-queue-attributes"}, {"plugin-overrides"}, {"task-resource-attributes"}, {"workflow-execution-config"}} + shortArray := []string{clusterResourceAttributesShort, execCmdShort, executionClusterLabelShort, executionQueueAttributesShort, pluginOverrideShort, taskResourceAttributesShort, workflowExecutionConfigShort} + longArray := []string{clusterResourceAttributesLong, execCmdLong, executionClusterLabelLong, executionQueueAttributesLong, pluginOverrideLong, taskResourceAttributesLong, workflowExecutionConfigLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config.go b/flytectl/cmd/delete/matchable_workflow_execution_config.go new file mode 100644 index 0000000000..c65a3976ed --- /dev/null +++ b/flytectl/cmd/delete/matchable_workflow_execution_config.go @@ -0,0 +1,79 @@ +package delete + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + + "github.com/flyteorg/flytectl/cmd/config" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + workflowExecutionConfigShort = "Deletes matchable resources of workflow execution config" + workflowExecutionConfigLong = ` +Deletes workflow execution config for given project and domain combination or additionally with workflow name. + +Deletes workflow execution config label for project and domain +Here the command delete workflow execution config for project flytectldemo and development domain. +:: + + flytectl delete workflow-execution-config -p flytectldemo -d development + + +Deletes workflow execution config using config file which was used for creating it. +Here the command deletes workflow execution config from the config file wec.yaml +Max_parallelism is optional in the file as its unread during the delete command but can be kept as the same file can be used for get, update or delete +eg: content of wec.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete workflow-execution-config --attrFile wec.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + max_parallelism: 5 + +Deletes workflow execution config for a workflow +Here the command deletes workflow execution config for a workflow core.control_flow.run_merge_sort.merge_sort + +:: + + flytectl delete workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage +` +) + +func deleteWorkflowExecutionConfig(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var pwdGetter sconfig.ProjectDomainWorkflowGetter + pwdGetter = sconfig.PDWGetterCommandLine{Config: config.GetConfig(), Args: args} + delConfig := workflowexecutionconfig.DefaultDelConfig + + // Get the project domain workflowName from the config file or commandline params + if len(delConfig.AttrFile) > 0 { + // Initialize FileConfig which will be used if delConfig.AttrFile is non empty + // And Reads from the workflow execution config file + pwdGetter = &workflowexecutionconfig.FileConfig{} + if err := sconfig.ReadConfigFromFile(pwdGetter, delConfig.AttrFile); err != nil { + return err + } + } + // Use the pwdGetter to initialize the project domain and workflow + project := pwdGetter.GetProject() + domain := pwdGetter.GetDomain() + workflowName := pwdGetter.GetWorkflow() + + // Deletes the matchable attributes using the WorkflowExecutionConfigFileConfig + if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), + admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG); err != nil { + return err + } + + return nil +} diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config_test.go b/flytectl/cmd/delete/matchable_workflow_execution_config_test.go new file mode 100644 index 0000000000..bb706f5e67 --- /dev/null +++ b/flytectl/cmd/delete/matchable_workflow_execution_config_test.go @@ -0,0 +1,135 @@ +package delete + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + + "github.com/flyteorg/flytectl/cmd/config" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func deleteWorkflowExecutionConfigSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + workflowexecutionconfig.DefaultDelConfig = &workflowexecutionconfig.AttrDeleteConfig{} + args = []string{} +} + +func TestDeleteWorkflowExecutionConfig(t *testing.T) { + t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { + setup() + deleteWorkflowExecutionConfigSetup() + // Empty attribute file + workflowexecutionconfig.DefaultDelConfig.AttrFile = "" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + }) + t.Run("failed project domain attribute deletion", func(t *testing.T) { + setup() + deleteWorkflowExecutionConfigSetup() + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) + err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + }) + t.Run("successful project domain attribute deletion file", func(t *testing.T) { + setup() + deleteWorkflowExecutionConfigSetup() + // Empty attribute file + workflowexecutionconfig.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_workflow_execution_config.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + }) + t.Run("successful workflow attribute deletion", func(t *testing.T) { + setup() + deleteWorkflowExecutionConfigSetup() + // Empty attribute file + workflowexecutionconfig.DefaultDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + }) + t.Run("failed workflow attribute deletion", func(t *testing.T) { + setup() + deleteWorkflowExecutionConfigSetup() + // Empty attribute file + workflowexecutionconfig.DefaultDelConfig.AttrFile = "" + args := []string{"workflow1"} + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) + err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + }) + t.Run("successful workflow attribute deletion file", func(t *testing.T) { + setup() + deleteWorkflowExecutionConfigSetup() + // Empty attribute file + workflowexecutionconfig.DefaultDelConfig.AttrFile = "testdata/valid_workflow_workflow_execution_config.yaml" + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + assert.Nil(t, err) + u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + }) + t.Run("workflow attribute deletion non existent file", func(t *testing.T) { + setup() + deleteWorkflowExecutionConfigSetup() + // Empty attribute file + workflowexecutionconfig.DefaultDelConfig.AttrFile = testDataNonExistentFile + // No args implying project domain attribute deletion + u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + assert.NotNil(t, err) + u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + }) + t.Run("attribute deletion invalid file", func(t *testing.T) { + setup() + deleteWorkflowExecutionConfigSetup() + // Empty attribute file + workflowexecutionconfig.DefaultDelConfig.AttrFile = testDataInvalidAttrFile + // No args implying project domain attribute deletion + err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, + fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), + err) + u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + ctx, "flytectldemo", "development", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + }) +} diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_workflow_execution_config.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_workflow_execution_config.yaml new file mode 100644 index 0000000000..c13e67fcd2 --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_project_domain_workflow_execution_config.yaml @@ -0,0 +1,3 @@ +domain: development +project: flytectldemo +max_parallelism: 5 \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_workflow_workflow_execution_config.yaml b/flytectl/cmd/delete/testdata/valid_workflow_workflow_execution_config.yaml new file mode 100644 index 0000000000..c2b0879f1e --- /dev/null +++ b/flytectl/cmd/delete/testdata/valid_workflow_workflow_execution_config.yaml @@ -0,0 +1,4 @@ +domain: development +project: flytectldemo +workflow: core.control_flow.run_merge_sort.merge_sort +max_parallelism: 5 \ No newline at end of file diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index 6b3b077794..e6b750e2f5 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -11,6 +11,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/task" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" @@ -62,6 +63,9 @@ func CreateGetCommand() *cobra.Command { "plugin-override": {CmdFunc: getPluginOverridesFunc, Aliases: []string{"plugin-overrides"}, Short: pluginOverrideShort, Long: pluginOverrideLong, PFlagProvider: pluginoverride.DefaultFetchConfig}, + "workflow-execution-config": {CmdFunc: getWorkflowExecutionConfigFunc, Aliases: []string{"workflow-execution-config"}, + Short: workflowExecutionConfigShort, + Long: workflowExecutionConfigLong, PFlagProvider: workflowexecutionconfig.DefaultFetchConfig}, } cmdcore.AddCommands(getCmd, getResourcesFuncs) diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index 5b513ccd47..c6bce31c54 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -42,20 +42,20 @@ func TestCreateGetCommand(t *testing.T) { assert.Equal(t, getCommand.Use, "get") assert.Equal(t, getCommand.Short, "Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project.") fmt.Println(getCommand.Commands()) - assert.Equal(t, len(getCommand.Commands()), 10) + assert.Equal(t, len(getCommand.Commands()), 11) cmdNouns := getCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) useArray := []string{"cluster-resource-attribute", "execution", "execution-cluster-label", - "execution-queue-attribute", "launchplan", "plugin-override", "project", "task", "task-resource-attribute", "workflow"} + "execution-queue-attribute", "launchplan", "plugin-override", "project", "task", "task-resource-attribute", "workflow", "workflow-execution-config"} aliases := [][]string{{"cluster-resource-attributes"}, {"executions"}, {"execution-cluster-labels"}, - {"execution-queue-attributes"}, {"launchplans"}, {"plugin-overrides"}, {"projects"}, {"tasks"}, {"task-resource-attributes"}, {"workflows"}} + {"execution-queue-attributes"}, {"launchplans"}, {"plugin-overrides"}, {"projects"}, {"tasks"}, {"task-resource-attributes"}, {"workflows"}, {"workflow-execution-config"}} shortArray := []string{clusterResourceAttributesShort, executionShort, executionClusterLabelShort, executionQueueAttributesShort, launchPlanShort, - pluginOverrideShort, projectShort, taskShort, taskResourceAttributesShort, workflowShort} + pluginOverrideShort, projectShort, taskShort, taskResourceAttributesShort, workflowShort, workflowExecutionConfigShort} longArray := []string{clusterResourceAttributesLong, executionLong, executionClusterLabelLong, executionQueueAttributesLong, launchPlanLong, - pluginOverrideLong, projectLong, taskLong, taskResourceAttributesLong, workflowLong} + pluginOverrideLong, projectLong, taskLong, taskResourceAttributesLong, workflowLong, workflowExecutionConfigLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) diff --git a/flytectl/cmd/get/matchable_workflow_execution_config.go b/flytectl/cmd/get/matchable_workflow_execution_config.go new file mode 100644 index 0000000000..1afbc4324f --- /dev/null +++ b/flytectl/cmd/get/matchable_workflow_execution_config.go @@ -0,0 +1,100 @@ +package get + +import ( + "context" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + + "github.com/flyteorg/flytectl/cmd/config" + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +) + +const ( + workflowExecutionConfigShort = "Gets matchable resources of workflow execution config" + workflowExecutionConfigLong = ` +Retrieves workflow execution config for given project and domain combination or additionally with workflow name. + +Retrieves workflow execution config for project and domain +Here the command get workflow execution config for project flytectldemo and development domain. + +:: + + flytectl get workflow-execution-config -p flytectldemo -d development + +eg : output from the command + +.. code-block:: json + + { + "project": "flytectldemo", + "domain": "development", + "max_parallelism": 5 + } + +Retrieves workflow execution config for project and domain and workflow +Here the command get workflow execution config for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort + +:: + + flytectl get workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + { + "project": "flytectldemo", + "domain": "development", + "workflow": "core.control_flow.run_merge_sort.merge_sort" + "max_parallelism": 5 + } + +Writing the workflow execution config to a file. If there are no workflow execution config, command would return an error. +Here the command gets workflow execution config and writes the config file to wec.yaml +eg: content of wec.yaml + +:: + + flytectl get workflow-execution-config -p flytectldemo -d development --attrFile wec.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + max_parallelism: 5 + +Usage +` +) + +func getWorkflowExecutionConfigFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + var project string + var domain string + var workflowName string + + // Get the project domain workflow name parameters from the command line. Project and domain are mandatory for this command + project = config.GetConfig().Project + domain = config.GetConfig().Domain + if len(args) == 1 { + workflowName = args[0] + } + // Construct a shadow config for WorkflowExecutionConfig. The shadow config is not using ProjectDomainAttribute/Workflowattribute directly inorder to simplify the inputs. + workflowExecutionConfigFileConfig := workflowexecutionconfig.FileConfig{Project: project, Domain: domain, Workflow: workflowName} + // Get the workflow execution config from the command line config + fileName := workflowexecutionconfig.DefaultFetchConfig.AttrFile + + // Updates the workflowExecutionConfigFileConfig with the fetched matchable attribute + if err := FetchAndUnDecorateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminFetcherExt(), + &workflowExecutionConfigFileConfig, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG); err != nil { + return err + } + + // Write the config to the file which can be used for update + if err := sconfig.DumpTaskResourceAttr(workflowExecutionConfigFileConfig, fileName); err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/get/matchable_workflow_execution_config_test.go b/flytectl/cmd/get/matchable_workflow_execution_config_test.go new file mode 100644 index 0000000000..c3c97829a6 --- /dev/null +++ b/flytectl/cmd/get/matchable_workflow_execution_config_test.go @@ -0,0 +1,138 @@ +package get + +import ( + "fmt" + "os" + "testing" + + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func getWorkflowExecutionConfigSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + workflowexecutionconfig.DefaultFetchConfig = &workflowexecutionconfig.AttrFetchConfig{} + // Clean up the temp directory. + _ = os.Remove(testDataTempFile) +} + +func TestGetWorkflowExecutionConfig(t *testing.T) { + executionClusterLabel := &admin.WorkflowExecutionConfig{ + MaxParallelism: 5, + } + projectDomainResp := &admin.ProjectDomainAttributesGetResponse{ + Attributes: &admin.ProjectDomainAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_WorkflowExecutionConfig{ + WorkflowExecutionConfig: executionClusterLabel, + }, + }, + }, + } + workflowResp := &admin.WorkflowAttributesGetResponse{ + Attributes: &admin.WorkflowAttributes{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Workflow: "workflow", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_WorkflowExecutionConfig{ + WorkflowExecutionConfig: executionClusterLabel, + }, + }, + }, + } + t.Run("successful get project domain attribute", func(t *testing.T) { + var args []string + setup() + getWorkflowExecutionConfigSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","max_parallelism":5}`) + }) + t.Run("successful get project domain attribute and write to file", func(t *testing.T) { + var args []string + setup() + getWorkflowExecutionConfigSetup() + workflowexecutionconfig.DefaultFetchConfig.AttrFile = testDataTempFile + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + tearDownAndVerify(t, `wrote the config to file temp-output-file`) + }) + t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { + var args []string + setup() + getWorkflowExecutionConfigSetup() + workflowexecutionconfig.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(projectDomainResp, nil) + err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + tearDownAndVerify(t, ``) + }) + t.Run("failed get project domain attribute", func(t *testing.T) { + var args []string + setup() + getWorkflowExecutionConfigSetup() + // No args implying project domain attribute deletion + u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + tearDownAndVerify(t, ``) + }) + t.Run("successful get workflow attribute", func(t *testing.T) { + var args []string + setup() + getWorkflowExecutionConfigSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(workflowResp, nil) + err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","max_parallelism":5}`) + }) + t.Run("failed get workflow attribute", func(t *testing.T) { + var args []string + setup() + getWorkflowExecutionConfigSetup() + args = []string{"workflow"} + u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) + err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to fetch response"), err) + u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/update/matchable_workflow_execution_config.go b/flytectl/cmd/update/matchable_workflow_execution_config.go new file mode 100644 index 0000000000..7f6fa1b705 --- /dev/null +++ b/flytectl/cmd/update/matchable_workflow_execution_config.go @@ -0,0 +1,77 @@ +package update + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + + sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + cmdCore "github.com/flyteorg/flytectl/cmd/core" +) + +const ( + workflowExecutionConfigShort = "Updates matchable resources of workflow execution config" + workflowExecutionConfigLong = ` +Updates workflow execution config for given project and domain combination or additionally with workflow name. + +Updating the workflow execution config is only available from a generated file. See the get section for generating this file. +Also this will completely overwrite any existing custom project and domain and workflow combination execution config. +Would be preferable to do get and generate an config file if there is an existing execution config already set and then update it to have new values +Refer to get workflow-execution-config section on how to generate this file +Here the command updates takes the input for workflow execution config from the config file wec.yaml +eg: content of wec.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + max_parallelism: 5 + +:: + + flytectl update workflow-execution-config --attrFile wec.yaml + +Updating workflow execution config for project and domain and workflow combination. This will take precedence over any other +execution config defined at project domain level. +Update the workflow execution config for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain + +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + max_parallelism: 5 + +:: + + flytectl update workflow-execution-config --attrFile wec.yaml + +Usage + +` +) + +func updateWorkflowExecutionConfigFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + updateConfig := workflowexecutionconfig.DefaultUpdateConfig + if len(updateConfig.AttrFile) == 0 { + return fmt.Errorf("attrFile is mandatory while calling update for workflow execution config") + } + + workflowExecutionConfigFileConfig := workflowexecutionconfig.FileConfig{} + if err := sconfig.ReadConfigFromFile(&workflowExecutionConfigFileConfig, updateConfig.AttrFile); err != nil { + return err + } + + // Get project domain workflow name from the read file. + project := workflowExecutionConfigFileConfig.Project + domain := workflowExecutionConfigFileConfig.Domain + workflowName := workflowExecutionConfigFileConfig.Workflow + + // Updates the admin matchable attribute from workflowExecutionConfigFileConfig + if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), + workflowExecutionConfigFileConfig); err != nil { + return err + } + return nil +} diff --git a/flytectl/cmd/update/matchable_workflow_execution_config_test.go b/flytectl/cmd/update/matchable_workflow_execution_config_test.go new file mode 100644 index 0000000000..f4a2934c7f --- /dev/null +++ b/flytectl/cmd/update/matchable_workflow_execution_config_test.go @@ -0,0 +1,95 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + + u "github.com/flyteorg/flytectl/cmd/testutils" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func updateWorkflowExecutionConfigSetup() { + ctx = u.Ctx + cmdCtx = u.CmdCtx + mockClient = u.MockClient + workflowexecutionconfig.DefaultUpdateConfig = &workflowexecutionconfig.AttrUpdateConfig{} +} + +func TestWorkflowExecutionConfigs(t *testing.T) { + t.Run("no input file for update", func(t *testing.T) { + setup() + updateWorkflowExecutionConfigSetup() + err = updateWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for workflow execution config"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update project domain attribute", func(t *testing.T) { + setup() + updateWorkflowExecutionConfigSetup() + workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_workflow_execution_config.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(nil) + err = updateWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update project domain attribute", func(t *testing.T) { + setup() + updateWorkflowExecutionConfigSetup() + workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_workflow_execution_config.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updateWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("successful update workflow attribute", func(t *testing.T) { + setup() + updateWorkflowExecutionConfigSetup() + workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_workflow_execution_config.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil) + err = updateWorkflowExecutionConfigFunc(ctx, nil, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ``) + }) + t.Run("failed update workflow attribute", func(t *testing.T) { + setup() + updateWorkflowExecutionConfigSetup() + workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_workflow_execution_config.yaml" + // No args implying project domain attribute deletion + u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) + err = updateWorkflowExecutionConfigFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed to update attributes"), err) + tearDownAndVerify(t, ``) + }) + t.Run("non existent file", func(t *testing.T) { + setup() + updateWorkflowExecutionConfigSetup() + workflowexecutionconfig.DefaultUpdateConfig.AttrFile = testDataNonExistentFile + err = updateWorkflowExecutionConfigFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) + tearDownAndVerify(t, ``) + }) + t.Run("invalid update file", func(t *testing.T) { + setup() + updateWorkflowExecutionConfigSetup() + workflowexecutionconfig.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile + err = updateWorkflowExecutionConfigFunc(ctx, nil, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) + tearDownAndVerify(t, ``) + }) +} diff --git a/flytectl/cmd/update/testdata/valid_project_domain_workflow_execution_config.yaml b/flytectl/cmd/update/testdata/valid_project_domain_workflow_execution_config.yaml new file mode 100644 index 0000000000..c13e67fcd2 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_domain_workflow_execution_config.yaml @@ -0,0 +1,3 @@ +domain: development +project: flytectldemo +max_parallelism: 5 \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_workflow_workflow_execution_config.yaml b/flytectl/cmd/update/testdata/valid_workflow_workflow_execution_config.yaml new file mode 100644 index 0000000000..c2b0879f1e --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_workflow_workflow_execution_config.yaml @@ -0,0 +1,4 @@ +domain: development +project: flytectldemo +workflow: core.control_flow.run_merge_sort.merge_sort +max_parallelism: 5 \ No newline at end of file diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 8485f32043..efd2f0a48d 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -6,6 +6,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" @@ -51,6 +52,8 @@ func CreateUpdateCommand() *cobra.Command { Short: executionClusterLabelShort, Long: executionClusterLabelLong, ProjectDomainNotRequired: true}, "plugin-override": {CmdFunc: updatePluginOverridesFunc, Aliases: []string{}, PFlagProvider: pluginoverride.DefaultUpdateConfig, Short: pluginOverrideShort, Long: pluginOverrideLong, ProjectDomainNotRequired: true}, + "workflow-execution-config": {CmdFunc: updateWorkflowExecutionConfigFunc, Aliases: []string{}, PFlagProvider: workflowexecutionconfig.DefaultUpdateConfig, + Short: workflowExecutionConfigShort, Long: workflowExecutionConfigLong, ProjectDomainNotRequired: true}, } cmdCore.AddCommands(updateCmd, updateResourcesFuncs) return updateCmd diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index 3afcd4ae70..eecfbff0d6 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -32,19 +32,19 @@ func TestUpdateCommand(t *testing.T) { assert.Equal(t, updateCommand.Use, updateUse) assert.Equal(t, updateCommand.Short, updateShort) assert.Equal(t, updateCommand.Long, updatecmdLong) - assert.Equal(t, len(updateCommand.Commands()), 9) + assert.Equal(t, len(updateCommand.Commands()), 10) cmdNouns := updateCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) useArray := []string{"cluster-resource-attribute", "execution-cluster-label", "execution-queue-attribute", "launchplan", - "plugin-override", "project", "task", "task-resource-attribute", "workflow"} - aliases := [][]string{{}, {}, {}, {}, {}, {}, {}, {}, {}} + "plugin-override", "project", "task", "task-resource-attribute", "workflow", "workflow-execution-config"} + aliases := [][]string{{}, {}, {}, {}, {}, {}, {}, {}, {}, {}} shortArray := []string{clusterResourceAttributesShort, executionClusterLabelShort, executionQueueAttributesShort, updateLPShort, - pluginOverrideShort, projectShort, updateTaskShort, taskResourceAttributesShort, updateWorkflowShort} + pluginOverrideShort, projectShort, updateTaskShort, taskResourceAttributesShort, updateWorkflowShort, workflowExecutionConfigShort} longArray := []string{clusterResourceAttributesLong, executionClusterLabelLong, executionQueueAttributesLong, updateLPLong, - pluginOverrideLong, projectLong, updateTaskLong, taskResourceAttributesLong, updateWorkflowLong} + pluginOverrideLong, projectLong, updateTaskLong, taskResourceAttributesLong, updateWorkflowLong, workflowExecutionConfigLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst new file mode 100644 index 0000000000..dcd19ba965 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -0,0 +1,74 @@ +.. _flytectl_delete_workflow-execution-config: + +flytectl delete workflow-execution-config +----------------------------------------- + +Deletes matchable resources of workflow execution config + +Synopsis +~~~~~~~~ + + + +Deletes workflow execution config for given project and domain combination or additionally with workflow name. + +Deletes workflow execution config label for project and domain +Here the command delete workflow execution config for project flytectldemo and development domain. +:: + + flytectl delete workflow-execution-config -p flytectldemo -d development + + +Deletes workflow execution config using config file which was used for creating it. +Here the command deletes workflow execution config from the config file wec.yaml +Max_parallelism is optional in the file as its unread during the delete command but can be kept as the same file can be used for get, update or delete +eg: content of wec.yaml which will use the project domain and workflow name for deleting the resource + +:: + + flytectl delete workflow-execution-config --attrFile wec.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + max_parallelism: 5 + +Deletes workflow execution config for a workflow +Here the command deletes workflow execution config for a workflow core.control_flow.run_merge_sort.merge_sort + +:: + + flytectl delete workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +Usage + + +:: + + flytectl delete workflow-execution-config [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for delete attribute for the resource type. + -h, --help help for workflow-execution-config + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst new file mode 100644 index 0000000000..be693c93c9 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -0,0 +1,94 @@ +.. _flytectl_get_workflow-execution-config: + +flytectl get workflow-execution-config +-------------------------------------- + +Gets matchable resources of workflow execution config + +Synopsis +~~~~~~~~ + + + +Retrieves workflow execution config for given project and domain combination or additionally with workflow name. + +Retrieves workflow execution config for project and domain +Here the command get workflow execution config for project flytectldemo and development domain. + +:: + + flytectl get workflow-execution-config -p flytectldemo -d development + +eg : output from the command + +.. code-block:: json + + { + "project": "flytectldemo", + "domain": "development", + "max_parallelism": 5 + } + +Retrieves workflow execution config for project and domain and workflow +Here the command get workflow execution config for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort + +:: + + flytectl get workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + +eg : output from the command + +.. code-block:: json + + { + "project": "flytectldemo", + "domain": "development", + "workflow": "core.control_flow.run_merge_sort.merge_sort" + "max_parallelism": 5 + } + +Writing the workflow execution config to a file. If there are no workflow execution config, command would return an error. +Here the command gets workflow execution config and writes the config file to wec.yaml +eg: content of wec.yaml + +:: + + flytectl get workflow-execution-config -p flytectldemo -d development --attrFile wec.yaml + + +.. code-block:: yaml + + domain: development + project: flytectldemo + max_parallelism: 5 + +Usage + + +:: + + flytectl get workflow-execution-config [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for generating attribute for the resource type. + -h, --help help for workflow-execution-config + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. + diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst new file mode 100644 index 0000000000..dc2b8e4057 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -0,0 +1,77 @@ +.. _flytectl_update_workflow-execution-config: + +flytectl update workflow-execution-config +----------------------------------------- + +Updates matchable resources of workflow execution config + +Synopsis +~~~~~~~~ + + + +Updates workflow execution config for given project and domain combination or additionally with workflow name. + +Updating the workflow execution config is only available from a generated file. See the get section for generating this file. +Also this will completely overwrite any existing custom project and domain and workflow combination execution config. +Would be preferable to do get and generate an config file if there is an existing execution config already set and then update it to have new values +Refer to get workflow-execution-config section on how to generate this file +Here the command updates takes the input for workflow execution config from the config file wec.yaml +eg: content of wec.yaml + +.. code-block:: yaml + + domain: development + project: flytectldemo + max_parallelism: 5 + +:: + + flytectl update workflow-execution-config --attrFile wec.yaml + +Updating workflow execution config for project and domain and workflow combination. This will take precedence over any other +execution config defined at project domain level. +Update the workflow execution config for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain + +.. code-block:: yaml + + domain: development + project: flytectldemo + workflow: core.control_flow.run_merge_sort.merge_sort + max_parallelism: 5 + +:: + + flytectl update workflow-execution-config --attrFile wec.yaml + +Usage + + + +:: + + flytectl update workflow-execution-config [flags] + +Options +~~~~~~~ + +:: + + --attrFile string attribute file name to be used for updating attribute for the resource type. + -h, --help help for workflow-execution-config + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. + diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index f90ca068bf..12d6444a10 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -18,6 +18,7 @@ Flytectl noun specify the resource on which the action needs to be performed eg: gen/flytectl_get_execution-queue-attribute gen/flytectl_get_plugin-override gen/flytectl_get_launchplan + gen/flytectl_get_workflow-execution-config gen/flytectl_update_launchplan gen/flytectl_update_workflow gen/flytectl_update_project @@ -27,6 +28,7 @@ Flytectl noun specify the resource on which the action needs to be performed eg: gen/flytectl_update_execution-cluster-label gen/flytectl_update_execution-queue-attribute gen/flytectl_update_plugin-override + gen/flytectl_update_workflow-execution-config gen/flytectl_register_files gen/flytectl_register_examples gen/flytectl_delete_execution @@ -35,6 +37,7 @@ Flytectl noun specify the resource on which the action needs to be performed eg: gen/flytectl_delete_execution-cluster-label gen/flytectl_delete_execution-queue-attribute gen/flytectl_delete_plugin-override + gen/flytectl_delete_workflow-execution-config gen/flytectl_config_validate gen/flytectl_config_init gen/flytectl_config_discover From 5392ada020180dea34f631cef1d9fe4bf657865c Mon Sep 17 00:00:00 2001 From: brucearctor <5032356+brucearctor@users.noreply.github.com> Date: Fri, 16 Jul 2021 11:39:02 -0700 Subject: [PATCH 113/645] fix gcp parameters... s3 -> google (#147) * fix gcp parameters... s3 -> google Signed-off-by: Bruce Arctor <5032356+brucearctor@users.noreply.github.com> * change s3 to google for gcs docs Signed-off-by: Bruce Arctor <5032356+brucearctor@users.noreply.github.com> --- flytectl/docs/source/index.rst | 2 +- flytectl/pkg/configutil/configutil.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 4915e0b963..06602489e0 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -99,7 +99,7 @@ Basic Configuration storage: type: stow stow: - kind: s3 + kind: google config: json: "" project_id: # TODO: replace with the GCP project ID diff --git a/flytectl/pkg/configutil/configutil.go b/flytectl/pkg/configutil/configutil.go index f6d715e7eb..44420887a3 100644 --- a/flytectl/pkg/configutil/configutil.go +++ b/flytectl/pkg/configutil/configutil.go @@ -41,7 +41,7 @@ storage: storage: type: stow stow: - kind: s3 + kind: google config: json: "" project_id: # TODO: replace with the GCP project ID From 0510aaa69dfc440bdaf7e55b0f4e3bfc5c9658c5 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Sat, 17 Jul 2021 08:32:34 -0700 Subject: [PATCH 114/645] Update documentation (#146) Signed-off-by: Flyte-Bot Co-authored-by: kumare3 --- flytectl/docs/source/gen/flytectl_delete.rst | 1 + ...tectl_delete_workflow-execution-config.rst | 32 +++++++++++++++++++ flytectl/docs/source/gen/flytectl_get.rst | 1 + ...flytectl_get_workflow-execution-config.rst | 32 +++++++++++++++++++ flytectl/docs/source/gen/flytectl_update.rst | 1 + ...tectl_update_workflow-execution-config.rst | 32 +++++++++++++++++++ 6 files changed, 99 insertions(+) diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 7cba6f6123..c09e621e10 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -75,4 +75,5 @@ SEE ALSO * :doc:`flytectl_delete_execution-queue-attribute` - Deletes matchable resources of execution queue attributes * :doc:`flytectl_delete_plugin-override` - Deletes matchable resources of plugin overrides * :doc:`flytectl_delete_task-resource-attribute` - Deletes matchable resources of task attributes +* :doc:`flytectl_delete_workflow-execution-config` - Deletes matchable resources of workflow execution config diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index dcd19ba965..3af2b6770e 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -62,10 +62,42 @@ Options inherited from parent commands :: + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 202a7ed989..255ee9d809 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -79,4 +79,5 @@ SEE ALSO * :doc:`flytectl_get_task` - Gets task resources * :doc:`flytectl_get_task-resource-attribute` - Gets matchable resources of task attributes * :doc:`flytectl_get_workflow` - Gets workflow resources +* :doc:`flytectl_get_workflow-execution-config` - Gets matchable resources of workflow execution config diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index be693c93c9..8a024786f2 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -82,10 +82,42 @@ Options inherited from parent commands :: + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 789633015e..1c1d80ebe5 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -80,4 +80,5 @@ SEE ALSO * :doc:`flytectl_update_task` - Updates task metadata * :doc:`flytectl_update_task-resource-attribute` - Updates matchable resources of task attributes * :doc:`flytectl_update_workflow` - Updates workflow metadata +* :doc:`flytectl_update_workflow-execution-config` - Updates matchable resources of workflow execution config diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index dc2b8e4057..b83fd90320 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -65,10 +65,42 @@ Options inherited from parent commands :: + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ From 2d65956564a45700fc45c5b8eb6ad80d1bfe28ce Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Tue, 20 Jul 2021 22:00:50 -0700 Subject: [PATCH 115/645] Add ability to recover executions (#149) --- flytectl/cmd/create/execution.go | 11 +++++++ flytectl/cmd/create/execution_test.go | 33 ++++++++++++++++++- flytectl/cmd/create/execution_util.go | 24 ++++++++++++-- flytectl/cmd/create/execution_util_test.go | 33 ++++++++++++++++--- flytectl/cmd/create/executionconfig_flags.go | 1 + .../cmd/create/executionconfig_flags_test.go | 14 ++++++++ flytectl/docs/source/conf.py | 7 ++++ .../source/gen/flytectl_create_execution.rst | 8 +++++ flytectl/go.mod | 2 +- flytectl/go.sum | 4 +-- 10 files changed, 127 insertions(+), 10 deletions(-) diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index 4fdea5214d..5722808888 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -78,6 +78,13 @@ Also an execution can be relaunched by passing in current execution id. flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development +An execution can be recovered, that is recreated from the last known failure point for a previously-run workflow execution. +See :ref:` + "`ref_flyteidl.admin.ExecutionRecoverRequest`" + ` for more details. + +:: + + flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytectldemo -d development + Generic data types are also supported for execution in similar way.Following is sample of how the inputs need to be specified while creating the execution. As usual the spec file should be generated first and then run the execution using the spec file. @@ -138,6 +145,7 @@ type ExecutionConfig struct { KubeServiceAcct string `json:"kubeServiceAcct" pflag:",kubernetes service account AuthRole for launching execution."` IamRoleARN string `json:"iamRoleARN" pflag:",iam role ARN AuthRole for launching execution."` Relaunch string `json:"relaunch" pflag:",execution id to be relaunched."` + Recover string `json:"recover" pflag:",execution id to be recreated from the last known failure point."` // Non plfag section is read from the execution config generated by get task/launchplan Workflow string `json:"workflow,omitempty"` Task string `json:"task,omitempty"` @@ -151,6 +159,7 @@ const ( Task ExecutionType = iota Workflow Relaunch + Recover ) type ExecutionParams struct { @@ -174,6 +183,8 @@ func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.C switch execParams.execType { case Relaunch: return relaunchExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx) + case Recover: + return recoverExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx) case Task: if executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx); err != nil { return err diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index 00544c4f55..65df850ae5 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -183,6 +183,7 @@ func TestCreateLaunchPlanExecutionFunc(t *testing.T) { func TestCreateRelaunchExecutionFunc(t *testing.T) { setup() createExecutionSetup() + defer func() { executionConfig.Relaunch = "" }() relaunchExecResponse := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -206,6 +207,36 @@ func TestCreateRelaunchExecutionFunc(t *testing.T) { tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) } +func TestCreateRecoverExecutionFunc(t *testing.T) { + setup() + createExecutionSetup() + defer func() { executionConfig.Recover = "" }() + + originalExecutionName := "abc123" + recoverExecResponse := &admin.ExecutionCreateResponse{ + Id: &core.WorkflowExecutionIdentifier{ + Project: "flytesnacks", + Domain: "development", + Name: "f652ea3596e7f4d80a0e", + }, + } + + executionConfig.Recover = originalExecutionName + recoverRequest := &admin.ExecutionRecoverRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Name: originalExecutionName, + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + }, + } + mockClient.OnRecoverExecutionMatch(ctx, recoverRequest).Return(recoverExecResponse, nil) + err = createExecutionCommand(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "RecoverExecution", ctx, recoverRequest) + tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) + executionConfig.Relaunch = "" +} + func TestCreateExecutionFuncInvalid(t *testing.T) { setup() createExecutionSetup() @@ -213,7 +244,7 @@ func TestCreateExecutionFuncInvalid(t *testing.T) { executionConfig.ExecFile = "" err = createExecutionCommand(ctx, args, cmdCtx) assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("executionConfig or relaunch can't be empty. Run the flytectl get task/launchplan to generate the config"), err) + assert.Equal(t, fmt.Errorf("executionConfig, relaunch and recover can't be empty. Run the flytectl get task/launchplan to generate the config"), err) executionConfig.ExecFile = "Invalid-file" err = createExecutionCommand(ctx, args, cmdCtx) assert.NotNil(t, err) diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 4442301327..639a50c295 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -107,6 +107,22 @@ func relaunchExecution(ctx context.Context, executionName string, project string return nil } +func recoverExecution(ctx context.Context, executionName string, project string, domain string, + cmdCtx cmdCore.CommandContext) error { + recoveredExec, err := cmdCtx.AdminClient().RecoverExecution(ctx, &admin.ExecutionRecoverRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Name: executionName, + Project: project, + Domain: domain, + }, + }) + if err != nil { + return err + } + fmt.Printf("execution identifier %v\n", recoveredExec.Id) + return nil +} + func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, securityContext *core.SecurityContext, authRole *admin.AuthRole) *admin.ExecutionCreateRequest { @@ -164,14 +180,18 @@ func resolveOverrides(toBeOverridden *ExecutionConfig, project string, domain st func readConfigAndValidate(project string, domain string) (ExecutionParams, error) { executionParams := ExecutionParams{} - if executionConfig.ExecFile == "" && executionConfig.Relaunch == "" { - return executionParams, fmt.Errorf("executionConfig or relaunch can't be empty." + + if executionConfig.ExecFile == "" && executionConfig.Relaunch == "" && executionConfig.Recover == "" { + return executionParams, fmt.Errorf("executionConfig, relaunch and recover can't be empty." + " Run the flytectl get task/launchplan to generate the config") } if executionConfig.Relaunch != "" { resolveOverrides(executionConfig, project, domain) return ExecutionParams{name: executionConfig.Relaunch, execType: Relaunch}, nil } + if len(executionConfig.Recover) > 0 { + resolveOverrides(executionConfig, project, domain) + return ExecutionParams{name: executionConfig.Recover, execType: Recover}, nil + } var readExecutionConfig *ExecutionConfig var err error if readExecutionConfig, err = readExecConfigFromFile(executionConfig.ExecFile); err != nil { diff --git a/flytectl/cmd/create/execution_util_test.go b/flytectl/cmd/create/execution_util_test.go index db3a084225..9d6bf63d41 100644 --- a/flytectl/cmd/create/execution_util_test.go +++ b/flytectl/cmd/create/execution_util_test.go @@ -13,8 +13,9 @@ import ( ) var ( - relaunchExecResponse *admin.ExecutionCreateResponse - relaunchRequest *admin.ExecutionRelaunchRequest + executionCreateResponse *admin.ExecutionCreateResponse + relaunchRequest *admin.ExecutionRelaunchRequest + recoverRequest *admin.ExecutionRecoverRequest ) // This function needs to be called after testutils.Steup() @@ -22,7 +23,7 @@ func createExecutionUtilSetup() { ctx = testutils.Ctx cmdCtx = testutils.CmdCtx mockClient = testutils.MockClient - relaunchExecResponse = &admin.ExecutionCreateResponse{ + executionCreateResponse = &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", Domain: "development", @@ -36,12 +37,19 @@ func createExecutionUtilSetup() { Domain: config.GetConfig().Domain, }, } + recoverRequest = &admin.ExecutionRecoverRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Name: "execName", + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + }, + } } func TestCreateExecutionForRelaunch(t *testing.T) { setup() createExecutionUtilSetup() - mockClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(relaunchExecResponse, nil) + mockClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(executionCreateResponse, nil) err = relaunchExecution(ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) assert.Nil(t, err) } @@ -54,3 +62,20 @@ func TestCreateExecutionForRelaunchNotFound(t *testing.T) { assert.NotNil(t, err) assert.Equal(t, err, errors.New("unknown execution")) } + +func TestCreateExecutionForRecovery(t *testing.T) { + setup() + createExecutionUtilSetup() + mockClient.OnRecoverExecutionMatch(ctx, recoverRequest).Return(executionCreateResponse, nil) + err = recoverExecution(ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) + assert.Nil(t, err) +} + +func TestCreateExecutionForRecoveryNotFound(t *testing.T) { + setup() + createExecutionUtilSetup() + mockClient.OnRecoverExecutionMatch(ctx, recoverRequest).Return(nil, errors.New("unknown execution")) + err = recoverExecution(ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, err, errors.New("unknown execution")) +} diff --git a/flytectl/cmd/create/executionconfig_flags.go b/flytectl/cmd/create/executionconfig_flags.go index 5fb13bbbe8..a8d6f541c2 100755 --- a/flytectl/cmd/create/executionconfig_flags.go +++ b/flytectl/cmd/create/executionconfig_flags.go @@ -56,5 +56,6 @@ func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&executionConfig.KubeServiceAcct, fmt.Sprintf("%v%v", prefix, "kubeServiceAcct"), executionConfig.KubeServiceAcct, "kubernetes service account AuthRole for launching execution.") cmdFlags.StringVar(&executionConfig.IamRoleARN, fmt.Sprintf("%v%v", prefix, "iamRoleARN"), executionConfig.IamRoleARN, "iam role ARN AuthRole for launching execution.") cmdFlags.StringVar(&executionConfig.Relaunch, fmt.Sprintf("%v%v", prefix, "relaunch"), executionConfig.Relaunch, "execution id to be relaunched.") + cmdFlags.StringVar(&executionConfig.Recover, fmt.Sprintf("%v%v", prefix, "recover"), executionConfig.Relaunch, "execution id to be recreated from the last known failure point.") return cmdFlags } diff --git a/flytectl/cmd/create/executionconfig_flags_test.go b/flytectl/cmd/create/executionconfig_flags_test.go index 9e35676125..681816f22c 100755 --- a/flytectl/cmd/create/executionconfig_flags_test.go +++ b/flytectl/cmd/create/executionconfig_flags_test.go @@ -183,4 +183,18 @@ func TestExecutionConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_recover", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("recover", testValue) + if vString, err := cmdFlags.GetString("recover"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Recover) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index b429faea57..0e6329ab99 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -35,6 +35,7 @@ extensions = [ "sphinx.ext.autosummary", "sphinx.ext.autosectionlabel", + "sphinx.ext.intersphinx", "sphinx.ext.todo", "sphinx.ext.viewcode", "sphinx.ext.doctest", @@ -181,3 +182,9 @@ "Miscellaneous", ), ] + +# -- Options for intersphinx ------------------------------------------------- +# intersphinx configuration +intersphinx_mapping = { + "flyteidl": ("https://docs.flyte.org/projects/flyteidl/en/latest", None), +} diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 06a5188144..200f96547e 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -76,6 +76,13 @@ Also an execution can be relaunched by passing in current execution id. flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development +An execution can be recovered, that is recreated from the last known failure point for a previously-run workflow execution. +See :ref:`ref_flyteidl.admin.ExecutionRecoverRequest` for more details. + +:: + + flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytectldemo -d development + Generic data types are also supported for execution in similar way.Following is sample of how the inputs need to be specified while creating the execution. As usual the spec file should be generated first and then run the execution using the spec file. @@ -137,6 +144,7 @@ Options -h, --help help for execution --iamRoleARN string iam role ARN AuthRole for launching execution. --kubeServiceAcct string kubernetes service account AuthRole for launching execution. + --recover string execution id to be recreated from the last known failure point. --relaunch string execution id to be relaunched. --targetDomain string project where execution needs to be created.If not specified configured domain would be used. --targetProject string project where execution needs to be created.If not specified configured project would be used. diff --git a/flytectl/go.mod b/flytectl/go.mod index 089c496cfd..60b3e041ac 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -10,7 +10,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.19.9 + github.com/flyteorg/flyteidl v0.19.14 github.com/flyteorg/flytestdlib v0.3.28 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 diff --git a/flytectl/go.sum b/flytectl/go.sum index 6cecb15014..8eae97b092 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -342,8 +342,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.19.9 h1:1j4/YbV/G1m2hrK017F9K0JYZYxCCwf4qtEkiNnUiEw= -github.com/flyteorg/flyteidl v0.19.9/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.19.14 h1:OLg2eT9uYllcfMMjEZJoXQ+2WXcrNbUxD+yaCrz2AlI= +github.com/flyteorg/flyteidl v0.19.14/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.28 h1:bvyldApjlUy9ETxSFpYvLhYLJxxndnMZTf93rVG6a00= github.com/flyteorg/flytestdlib v0.3.28/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= From a66e66995a65772b143e80affe0b561f8553dc9d Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Thu, 22 Jul 2021 13:17:47 +0530 Subject: [PATCH 116/645] Fix config init command fails if no flyte dir doesn't exist (#150) * Added setup flytedir before config init Signed-off-by: Yuvraj --- flytectl/cmd/configuration/configuration.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index 140b4333f5..e47ff2ff81 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -9,6 +9,8 @@ import ( "github.com/flyteorg/flytestdlib/logger" + "github.com/flyteorg/flytectl/pkg/util" + "github.com/flyteorg/flytectl/pkg/configutil" initConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/config" @@ -69,6 +71,10 @@ func configInitFunc(ctx context.Context, args []string, cmdCtx cmdcore.CommandCo func initFlytectlConfig(ctx context.Context, reader io.Reader) error { + if err := util.SetupFlyteDir(); err != nil { + return err + } + templateValues := configutil.ConfigTemplateSpec{ Host: "dns:///localhost:30081", Insecure: initConfig.DefaultConfig.Insecure, @@ -87,6 +93,8 @@ func initFlytectlConfig(ctx context.Context, reader io.Reader) error { if strings.ToUpper(result) == "GCS" { templateStr = configutil.GetGoogleCloudTemplate() } + } else { + logger.Infof(ctx, "Init flytectl config for remote cluster, Please update your storage config in %s. Learn more about the config here https://docs.flyte.org/projects/flytectl/en/latest/index.html#configure", configutil.ConfigFile) } } var _err error @@ -100,9 +108,9 @@ func initFlytectlConfig(ctx context.Context, reader io.Reader) error { _err = configutil.SetupConfig(configutil.ConfigFile, templateStr, templateValues) } } - - if len(initConfig.DefaultConfig.Host) > 0 { - logger.Infof(ctx, "Init flytectl config for remote cluster, Please update your storage config in %s. Learn more about the config here https://docs.flyte.org/projects/flytectl/en/latest/index.html#configure", configutil.ConfigFile) + if _err != nil { + return _err } - return _err + fmt.Printf("Init flytectl config file at [%s]", configutil.ConfigFile) + return nil } From 5da69f57d84d398d847857533d4294c9df57afbd Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Thu, 22 Jul 2021 16:42:05 +0530 Subject: [PATCH 117/645] #none add go mod tidy in flyteidl release workflow (#151) Signed-off-by: Yuvraj --- .../{release-automation.yml => update-flyte-component.yml} | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) rename flytectl/.github/workflows/{release-automation.yml => update-flyte-component.yml} (83%) diff --git a/flytectl/.github/workflows/release-automation.yml b/flytectl/.github/workflows/update-flyte-component.yml similarity index 83% rename from flytectl/.github/workflows/release-automation.yml rename to flytectl/.github/workflows/update-flyte-component.yml index 0c16bd1c00..7893e4fb8b 100644 --- a/flytectl/.github/workflows/release-automation.yml +++ b/flytectl/.github/workflows/update-flyte-component.yml @@ -1,10 +1,10 @@ -name: Update flyteidl version +name: Update Flyte component on: workflow_dispatch: jobs: update-flyte-releases: - name: Update Flyteidl version + name: Update Flyte component runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -23,7 +23,10 @@ jobs: - name: Update Flyte component run: | FLYTEIDL_VERSION=$(curl --silent "https://api.github.com/repos/flyteorg/flyteidl/releases/latest" | jq -r .tag_name) + FLYTESTDLIB_VERSION=$(curl --silent "https://api.github.com/repos/flyteorg/flytestdlib/releases/latest" | jq -r .tag_name) go get -u github.com/flyteorg/flyteidl@$FLYTEIDL_VERSION + go get -u github.com/flyteorg/flytestdlib@$FLYTESTDLIB_VERSION + go mod tidy - name: Create Pull Request id: cpr uses: peter-evans/create-pull-request@v3 From 3d86194a7aa8e395529c6652104eda500f67ed92 Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Thu, 22 Jul 2021 17:18:22 +0530 Subject: [PATCH 118/645] Update code of conduct (#148) * code-of-conduct Signed-off-by: Samhita Alla * boilerplate Signed-off-by: Samhita Alla --- flytectl/CODE_OF_CONDUCT.md | 2 +- .../flyte/code_of_conduct/CODE_OF_CONDUCT.md | 2 ++ .../boilerplate/flyte/code_of_conduct/README.rst | 2 ++ .../boilerplate/flyte/code_of_conduct/update.sh | 12 ++++++++++++ .../boilerplate/flyte/golang_test_targets/goimports | 2 +- .../pull_request_template/pull_request_template.md | 13 ++++++++----- flytectl/boilerplate/update.cfg | 2 +- flytectl/pull_request_template.md | 13 ++++++++----- 8 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 flytectl/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md create mode 100644 flytectl/boilerplate/flyte/code_of_conduct/README.rst create mode 100755 flytectl/boilerplate/flyte/code_of_conduct/update.sh diff --git a/flytectl/CODE_OF_CONDUCT.md b/flytectl/CODE_OF_CONDUCT.md index 4c3a38cc48..e12139d691 100644 --- a/flytectl/CODE_OF_CONDUCT.md +++ b/flytectl/CODE_OF_CONDUCT.md @@ -1,2 +1,2 @@ -This project is governed by [Lyft's code of conduct](https://github.com/lyft/code-of-conduct). +This project is governed by LF AI Foundation's [code of conduct](https://lfprojects.org/policies/code-of-conduct/). All contributors and participants agree to abide by its terms. diff --git a/flytectl/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md b/flytectl/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..e12139d691 --- /dev/null +++ b/flytectl/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md @@ -0,0 +1,2 @@ +This project is governed by LF AI Foundation's [code of conduct](https://lfprojects.org/policies/code-of-conduct/). +All contributors and participants agree to abide by its terms. diff --git a/flytectl/boilerplate/flyte/code_of_conduct/README.rst b/flytectl/boilerplate/flyte/code_of_conduct/README.rst new file mode 100644 index 0000000000..0c9f2f1ec5 --- /dev/null +++ b/flytectl/boilerplate/flyte/code_of_conduct/README.rst @@ -0,0 +1,2 @@ +CODE OF CONDUCT +~~~~~~~~~~~~~~~ diff --git a/flytectl/boilerplate/flyte/code_of_conduct/update.sh b/flytectl/boilerplate/flyte/code_of_conduct/update.sh new file mode 100755 index 0000000000..42f6158460 --- /dev/null +++ b/flytectl/boilerplate/flyte/code_of_conduct/update.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. +# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: +# +# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst + +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +cp ${DIR}/CODE_OF_CONDUCT.md ${DIR}/../../../CODE_OF_CONDUCT.md diff --git a/flytectl/boilerplate/flyte/golang_test_targets/goimports b/flytectl/boilerplate/flyte/golang_test_targets/goimports index ba0d6d8718..af1829036c 100755 --- a/flytectl/boilerplate/flyte/golang_test_targets/goimports +++ b/flytectl/boilerplate/flyte/golang_test_targets/goimports @@ -5,4 +5,4 @@ # # TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst -goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*") +goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*" -not -path "./boilerplate/*") diff --git a/flytectl/boilerplate/flyte/pull_request_template/pull_request_template.md b/flytectl/boilerplate/flyte/pull_request_template/pull_request_template.md index d7699558be..9cdab99b46 100644 --- a/flytectl/boilerplate/flyte/pull_request_template/pull_request_template.md +++ b/flytectl/boilerplate/flyte/pull_request_template/pull_request_template.md @@ -1,8 +1,9 @@ -## Read then delete +## _Read then delete this section_ -- Make sure to use a concise title for the pull-request. -- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version -will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump) +_- Make sure to use a concise title for the pull-request._ + +_- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version +will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump)_ # TL;DR _Please replace this text with a description of what this PR accomplishes._ @@ -24,7 +25,9 @@ _Please replace this text with a description of what this PR accomplishes._ _How did you fix the bug, make the feature etc. Link to any design docs etc_ ## Tracking Issue -https://github.com/flyteorg/flyte/issues/ +_Remove the '*fixes*' keyword if there will be multiple PRs to fix the linked issue_ + +fixes https://github.com/flyteorg/flyte/issues/ ## Follow-up issue _NA_ diff --git a/flytectl/boilerplate/update.cfg b/flytectl/boilerplate/update.cfg index 45cc5569cf..f64279bc22 100644 --- a/flytectl/boilerplate/update.cfg +++ b/flytectl/boilerplate/update.cfg @@ -4,4 +4,4 @@ flyte/golang_support_tools flyte/pull_request_template flyte/welcome_bot flyte/precommit - +flyte/code_of_conduct diff --git a/flytectl/pull_request_template.md b/flytectl/pull_request_template.md index d7699558be..9cdab99b46 100644 --- a/flytectl/pull_request_template.md +++ b/flytectl/pull_request_template.md @@ -1,8 +1,9 @@ -## Read then delete +## _Read then delete this section_ -- Make sure to use a concise title for the pull-request. -- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version -will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump) +_- Make sure to use a concise title for the pull-request._ + +_- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version +will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump)_ # TL;DR _Please replace this text with a description of what this PR accomplishes._ @@ -24,7 +25,9 @@ _Please replace this text with a description of what this PR accomplishes._ _How did you fix the bug, make the feature etc. Link to any design docs etc_ ## Tracking Issue -https://github.com/flyteorg/flyte/issues/ +_Remove the '*fixes*' keyword if there will be multiple PRs to fix the linked issue_ + +fixes https://github.com/flyteorg/flyte/issues/ ## Follow-up issue _NA_ From 2a9a827bacec806f33043b86c2e20d32b46a3c64 Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Mon, 26 Jul 2021 14:05:02 -0400 Subject: [PATCH 119/645] update doc requirements with sphinx v4 (#153) Signed-off-by: cosmicBboy --- flytectl/doc-requirements.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index aabe778a3d..76f9d60edf 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with python 3.8 +# This file is autogenerated by pip-compile with python 3.9 # To update, run: # # pip-compile doc-requirements.in @@ -15,7 +15,7 @@ beautifulsoup4==4.9.3 # sphinx-material certifi==2021.5.30 # via requests -chardet==4.0.0 +charset-normalizer==2.0.3 # via requests css-html-js-minify==2.5.5 # via sphinx-material @@ -25,7 +25,7 @@ docutils==0.16 # sphinx-tabs git+git://github.com/flyteorg/furo@main # via -r doc-requirements.in -idna==2.10 +idna==3.2 # via requests imagesize==1.2.0 # via sphinx @@ -35,7 +35,7 @@ lxml==4.6.3 # via sphinx-material markupsafe==2.0.1 # via jinja2 -packaging==20.9 +packaging==21.0 # via sphinx pygments==2.9.0 # via @@ -48,7 +48,7 @@ python-slugify[unidecode]==5.0.2 # via sphinx-material pytz==2021.1 # via babel -requests==2.25.1 +requests==2.26.0 # via sphinx six==1.16.0 # via sphinx-code-include @@ -56,7 +56,7 @@ snowballstemmer==2.1.0 # via sphinx soupsieve==2.2.1 # via beautifulsoup4 -sphinx==3.5.4 +sphinx==4.1.2 # via # -r doc-requirements.in # furo @@ -68,11 +68,11 @@ sphinx==3.5.4 # sphinx-tabs sphinx-code-include==1.1.1 # via -r doc-requirements.in -sphinx-copybutton==0.3.3 +sphinx-copybutton==0.4.0 # via -r doc-requirements.in sphinx-fontawesome==0.0.6 # via -r doc-requirements.in -sphinx-material==0.0.32 +sphinx-material==0.0.34 # via -r doc-requirements.in sphinx-prompt==1.4.0 # via -r doc-requirements.in From 2fd5e5682cc35952441181c439e41dea3d19e278 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Tue, 27 Jul 2021 11:42:32 -0700 Subject: [PATCH 120/645] Update Flyteidl version (#134) --- flytectl/go.mod | 2 +- flytectl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 60b3e041ac..00186a8e76 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -11,7 +11,7 @@ require ( github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 github.com/flyteorg/flyteidl v0.19.14 - github.com/flyteorg/flytestdlib v0.3.28 + github.com/flyteorg/flytestdlib v0.3.30 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 github.com/google/go-cmp v0.5.6 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index 8eae97b092..15ee968a20 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -345,8 +345,8 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/flyteorg/flyteidl v0.19.14 h1:OLg2eT9uYllcfMMjEZJoXQ+2WXcrNbUxD+yaCrz2AlI= github.com/flyteorg/flyteidl v0.19.14/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= -github.com/flyteorg/flytestdlib v0.3.28 h1:bvyldApjlUy9ETxSFpYvLhYLJxxndnMZTf93rVG6a00= -github.com/flyteorg/flytestdlib v0.3.28/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= +github.com/flyteorg/flytestdlib v0.3.30 h1:cBsphk2PGyhSM6BFJBR1whO9DZ907NjUeWQLsBrm0/g= +github.com/flyteorg/flytestdlib v0.3.30/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= From eaeb998c618eda9ed5dce990df35b35bddbf38d6 Mon Sep 17 00:00:00 2001 From: Sean Lin Date: Wed, 4 Aug 2021 20:31:51 -0700 Subject: [PATCH 121/645] Render descriptions in flytectl (#154) --- flytectl/cmd/get/execution_util.go | 65 ++++++++++---- flytectl/cmd/get/launch_plan.go | 31 ++++++- flytectl/cmd/get/launch_plan_test.go | 121 ++++++++++++++++++++------- flytectl/cmd/get/task.go | 25 +++++- flytectl/cmd/get/task_test.go | 59 ++++++++++--- flytectl/cmd/get/workflow.go | 23 +++++ flytectl/cmd/testutils/test_utils.go | 9 +- flytectl/go.mod | 1 + flytectl/pkg/printer/printer.go | 65 +++++++++++++- flytectl/pkg/printer/printer_test.go | 54 ++++++++++++ 10 files changed, 384 insertions(+), 69 deletions(-) diff --git a/flytectl/cmd/get/execution_util.go b/flytectl/cmd/get/execution_util.go index 2d70450af3..65b72175a5 100644 --- a/flytectl/cmd/get/execution_util.go +++ b/flytectl/cmd/get/execution_util.go @@ -6,25 +6,25 @@ import ( "io/ioutil" "os" + "gopkg.in/yaml.v3" + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" "github.com/flyteorg/flyteidl/clients/go/coreutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - - "sigs.k8s.io/yaml" ) -// ExecutionConfig is duplicated struct from create with the same structure. This is to avoid the circular dependency. +// ExecutionConfig is duplicated struct from create with the same structure. This is to avoid the circular dependency. Only works with go-yaml. // TODO : replace this with a cleaner design type ExecutionConfig struct { - TargetDomain string `json:"targetDomain"` - TargetProject string `json:"targetProject"` - KubeServiceAcct string `json:"kubeServiceAcct"` - IamRoleARN string `json:"iamRoleARN"` - Workflow string `json:"workflow,omitempty"` - Task string `json:"task,omitempty"` - Version string `json:"version"` - Inputs map[string]interface{} `json:"inputs"` + IamRoleARN string `yaml:"iamRoleARN"` + Inputs map[string]yaml.Node `yaml:"inputs"` + KubeServiceAcct string `yaml:"kubeServiceAcct"` + TargetDomain string `yaml:"targetDomain"` + TargetProject string `yaml:"targetProject"` + Task string `yaml:"task,omitempty"` + Version string `yaml:"version"` + Workflow string `yaml:"workflow,omitempty"` } func WriteExecConfigToFile(executionConfig ExecutionConfig, fileName string) error { @@ -78,16 +78,27 @@ func TaskInputs(task *admin.Task) map[string]*core.Variable { return task.Closure.CompiledTask.Template.Interface.Inputs.Variables } -func ParamMapForTask(task *admin.Task) (map[string]interface{}, error) { +func ParamMapForTask(task *admin.Task) (map[string]yaml.Node, error) { taskInputs := TaskInputs(task) - paramMap := make(map[string]interface{}, len(taskInputs)) + paramMap := make(map[string]yaml.Node, len(taskInputs)) for k, v := range taskInputs { varTypeValue, err := coreutils.MakeDefaultLiteralForType(v.Type) if err != nil { fmt.Println("error creating default value for literal type ", v.Type) return nil, err } - if paramMap[k], err = coreutils.ExtractFromLiteral(varTypeValue); err != nil { + var nativeLiteral interface{} + if nativeLiteral, err = coreutils.ExtractFromLiteral(varTypeValue); err != nil { + return nil, err + } + + if k == v.Description { + // a: # a isn't very helpful + paramMap[k], err = getCommentedYamlNode(nativeLiteral, "") + } else { + paramMap[k], err = getCommentedYamlNode(nativeLiteral, v.Description) + } + if err != nil { return nil, err } } @@ -105,24 +116,42 @@ func WorkflowParams(lp *admin.LaunchPlan) map[string]*core.Parameter { return lp.Spec.DefaultInputs.Parameters } -func ParamMapForWorkflow(lp *admin.LaunchPlan) (map[string]interface{}, error) { +func ParamMapForWorkflow(lp *admin.LaunchPlan) (map[string]yaml.Node, error) { workflowParams := WorkflowParams(lp) - paramMap := make(map[string]interface{}, len(workflowParams)) + paramMap := make(map[string]yaml.Node, len(workflowParams)) for k, v := range workflowParams { varTypeValue, err := coreutils.MakeDefaultLiteralForType(v.Var.Type) if err != nil { fmt.Println("error creating default value for literal type ", v.Var.Type) return nil, err } - if paramMap[k], err = coreutils.ExtractFromLiteral(varTypeValue); err != nil { + var nativeLiteral interface{} + if nativeLiteral, err = coreutils.ExtractFromLiteral(varTypeValue); err != nil { return nil, err } // Override if there is a default value if paramsDefault, ok := v.Behavior.(*core.Parameter_Default); ok { - if paramMap[k], err = coreutils.ExtractFromLiteral(paramsDefault.Default); err != nil { + if nativeLiteral, err = coreutils.ExtractFromLiteral(paramsDefault.Default); err != nil { return nil, err } } + if k == v.Var.Description { + // a: # a isn't very helpful + paramMap[k], err = getCommentedYamlNode(nativeLiteral, "") + } else { + paramMap[k], err = getCommentedYamlNode(nativeLiteral, v.Var.Description) + } + + if err != nil { + return nil, err + } } return paramMap, nil } + +func getCommentedYamlNode(input interface{}, comment string) (yaml.Node, error) { + var node yaml.Node + err := node.Encode(input) + node.LineComment = comment + return node, err +} diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index ec90a62fd2..34bf10cf1a 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -104,6 +104,8 @@ var launchplanColumns = []printer.Column{ {Header: "Type", JSONPath: "$.closure.compiledTask.template.type"}, {Header: "State", JSONPath: "$.spec.state"}, {Header: "Schedule", JSONPath: "$.spec.entityMetadata.schedule"}, + {Header: "Inputs", JSONPath: "$.closure.expectedInputs.parameters." + printer.DefaultFormattedDescriptionsKey + ".var.description"}, + {Header: "Outputs", JSONPath: "$.closure.expectedOutputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, } // Column structure for get all launchplans @@ -122,6 +124,21 @@ func LaunchplanToProtoMessages(l []*admin.LaunchPlan) []proto.Message { return messages } +func LaunchplanToTableProtoMessages(l []*admin.LaunchPlan) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + m := proto.Clone(m).(*admin.LaunchPlan) + if m.Closure.ExpectedInputs != nil { + printer.FormatParameterDescriptions(m.Closure.ExpectedInputs.Parameters) + } + if m.Closure.ExpectedOutputs != nil { + printer.FormatVariableDescriptions(m.Closure.ExpectedOutputs.Variables) + } + messages = append(messages, m) + } + return messages +} + func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { launchPlanPrinter := printer.Printer{} var launchPlans []*admin.LaunchPlan @@ -134,8 +151,13 @@ func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comman return err } logger.Debugf(ctx, "Retrieved %v launch plans", len(launchPlans)) - err = launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplanColumns, - LaunchplanToProtoMessages(launchPlans)...) + if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { + err = launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplanColumns, + LaunchplanToTableProtoMessages(launchPlans)...) + } else { + err = launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplanColumns, + LaunchplanToProtoMessages(launchPlans)...) + } if err != nil { return err } @@ -148,8 +170,13 @@ func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comman } logger.Debugf(ctx, "Retrieved %v launch plans", len(launchPlans)) + if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { + return launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplansColumns, + LaunchplanToTableProtoMessages(launchPlans)...) + } return launchPlanPrinter.Print(config.GetConfig().MustOutputFormat(), launchplansColumns, LaunchplanToProtoMessages(launchPlans)...) + } // FetchLPForName fetches the launchplan give it name. diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index 9757a35c1d..6e3e104390 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -7,6 +7,7 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" cmdCore "github.com/flyteorg/flytectl/cmd/core" u "github.com/flyteorg/flytectl/cmd/testutils" @@ -48,6 +49,7 @@ func getLaunchPlanSetup() { }, }, }, + Description: "short desc", }, }, "numbers_count": { @@ -57,6 +59,7 @@ func getLaunchPlanSetup() { Simple: core.SimpleType_INTEGER, }, }, + Description: "long description will be truncated in table", }, }, "run_local_at_count": { @@ -66,6 +69,7 @@ func getLaunchPlanSetup() { Simple: core.SimpleType_INTEGER, }, }, + Description: "run_local_at_count", }, Behavior: &core.Parameter_Default{ Default: &core.Literal{ @@ -258,21 +262,24 @@ func TestGetLaunchPlanFunc(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "short desc" } }, "numbers_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "long description will be truncated in table" } }, "run_local_at_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "run_local_at_count" }, "default": { "scalar": { @@ -294,21 +301,24 @@ func TestGetLaunchPlanFunc(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "short desc" } }, "numbers_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "long description will be truncated in table" } }, "run_local_at_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "run_local_at_count" }, "default": { "scalar": { @@ -337,21 +347,24 @@ func TestGetLaunchPlanFunc(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "short desc" } }, "numbers_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "long description will be truncated in table" } }, "run_local_at_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "run_local_at_count" }, "default": { "scalar": { @@ -373,21 +386,24 @@ func TestGetLaunchPlanFunc(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "short desc" } }, "numbers_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "long description will be truncated in table" } }, "run_local_at_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "run_local_at_count" }, "default": { "scalar": { @@ -429,21 +445,24 @@ func TestGetLaunchPlanFuncLatest(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "short desc" } }, "numbers_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "long description will be truncated in table" } }, "run_local_at_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "run_local_at_count" }, "default": { "scalar": { @@ -465,21 +484,24 @@ func TestGetLaunchPlanFuncLatest(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "short desc" } }, "numbers_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "long description will be truncated in table" } }, "run_local_at_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "run_local_at_count" }, "default": { "scalar": { @@ -520,21 +542,24 @@ func TestGetLaunchPlanWithVersion(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "short desc" } }, "numbers_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "long description will be truncated in table" } }, "run_local_at_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "run_local_at_count" }, "default": { "scalar": { @@ -556,21 +581,24 @@ func TestGetLaunchPlanWithVersion(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "short desc" } }, "numbers_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "long description will be truncated in table" } }, "run_local_at_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "run_local_at_count" }, "default": { "scalar": { @@ -595,7 +623,7 @@ func TestGetLaunchPlans(t *testing.T) { argsLp = []string{} err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}}}},"numbers_count": {"var": {"type": {"simple": "INTEGER"}}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"}},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}}}},"numbers_count": {"var": {"type": {"simple": "INTEGER"}}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"}},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}}}},"numbers_count": {"var": {"type": {"simple": "INTEGER"}}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"}},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}}}},"numbers_count": {"var": {"type": {"simple": "INTEGER"}}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"}},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + tearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetLaunchPlansWithExecFile(t *testing.T) { @@ -624,21 +652,24 @@ func TestGetLaunchPlansWithExecFile(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "short desc" } }, "numbers_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "long description will be truncated in table" } }, "run_local_at_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "run_local_at_count" }, "default": { "scalar": { @@ -660,21 +691,24 @@ func TestGetLaunchPlansWithExecFile(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "short desc" } }, "numbers_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "long description will be truncated in table" } }, "run_local_at_count": { "var": { "type": { "simple": "INTEGER" - } + }, + "description": "run_local_at_count" }, "default": { "scalar": { @@ -690,3 +724,28 @@ func TestGetLaunchPlansWithExecFile(t *testing.T) { } }`) } + +func TestGetLaunchPlanTableFunc(t *testing.T) { + setup() + getLaunchPlanSetup() + mockClient.OnListLaunchPlansMatch(ctx, resourceGetRequest).Return(launchPlanListResponse, nil) + mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) + mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) + config.GetConfig().Output = "table" + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceGetRequest) + tearDownAndVerify(t, ` +--------- ------------- ------ ------- ---------- --------------------------- --------- +| VERSION | NAME | TYPE | STATE | SCHEDULE | INPUTS | OUTPUTS | +--------- ------------- ------ ------- ---------- --------------------------- --------- +| v2 | launchplan1 | | | | numbers: short desc | | +| | | | | | numbers_count: long de... | | +| | | | | | run_local_at_count | | +--------- ------------- ------ ------- ---------- --------------------------- --------- +| v1 | launchplan1 | | | | numbers: short desc | | +| | | | | | numbers_count: long de... | | +| | | | | | run_local_at_count | | +--------- ------------- ------ ------- ---------- --------------------------- --------- +2 rows`) +} diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 49c586f433..9f9a7b9861 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -10,7 +10,6 @@ import ( "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" - "github.com/golang/protobuf/proto" ) @@ -98,6 +97,8 @@ var taskColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, {Header: "Type", JSONPath: "$.closure.compiledTask.template.type"}, + {Header: "Inputs", JSONPath: "$.closure.compiledTask.template.interface.inputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, + {Header: "Outputs", JSONPath: "$.closure.compiledTask.template.interface.outputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, {Header: "Discoverable", JSONPath: "$.closure.compiledTask.template.metadata.discoverable"}, {Header: "Discovery Version", JSONPath: "$.closure.compiledTask.template.metadata.discoveryVersion"}, {Header: "Created At", JSONPath: "$.closure.createdAt"}, @@ -111,6 +112,21 @@ func TaskToProtoMessages(l []*admin.Task) []proto.Message { return messages } +func TaskToTableProtoMessages(l []*admin.Task) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + m := proto.Clone(m).(*admin.Task) + if m.Closure.CompiledTask.Template.Interface.Inputs != nil { + printer.FormatVariableDescriptions(m.Closure.CompiledTask.Template.Interface.Inputs.Variables) + } + if m.Closure.CompiledTask.Template.Interface.Outputs != nil { + printer.FormatVariableDescriptions(m.Closure.CompiledTask.Template.Interface.Outputs.Variables) + } + messages = append(messages, m) + } + return messages +} + func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { taskPrinter := printer.Printer{} var tasks []*admin.Task @@ -123,13 +139,20 @@ func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte return err } logger.Debugf(ctx, "Retrieved Task", tasks) + if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { + return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToTableProtoMessages(tasks)...) + } return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToProtoMessages(tasks)...) + } tasks, err = cmdCtx.AdminFetcherExt().FetchAllVerOfTask(ctx, "", config.GetConfig().Project, config.GetConfig().Domain, taskConfig.DefaultConfig.Filter) if err != nil { return err } logger.Debugf(ctx, "Retrieved %v Task", len(tasks)) + if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { + return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToTableProtoMessages(tasks)...) + } return taskPrinter.Print(config.GetConfig().MustOutputFormat(), taskColumns, TaskToProtoMessages(tasks)...) } diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index b72545487d..744c56b29e 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -5,6 +5,8 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/cmd/config" + taskConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/task" "github.com/flyteorg/flytectl/pkg/filters" @@ -50,6 +52,7 @@ func getTaskSetup() { }, }, }, + Description: "var description", } variableMap := map[string]*core.Variable{ "sorted_list1": &sortedListLiteralType, @@ -257,14 +260,16 @@ func TestGetTaskFunc(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "var description" }, "sorted_list2": { "type": { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "var description" } } } @@ -290,14 +295,16 @@ func TestGetTaskFunc(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "var description" }, "sorted_list2": { "type": { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "var description" } } } @@ -310,6 +317,28 @@ func TestGetTaskFunc(t *testing.T) { ]`) } +func TestGetTaskTableFunc(t *testing.T) { + setup() + getTaskSetup() + mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) + mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) + config.GetConfig().Output = "table" + err = getTaskFunc(ctx, argsTask, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "ListTasks", ctx, resourceListRequestTask) + tearDownAndVerify(t, ` +--------- ------- ------ --------------------------- --------- -------------- ------------------- ---------------------- +| VERSION | NAME | TYPE | INPUTS | OUTPUTS | DISCOVERABLE | DISCOVERY VERSION | CREATED AT | +--------- ------- ------ --------------------------- --------- -------------- ------------------- ---------------------- +| v2 | task1 | | sorted_list1: var desc... | | | | 1970-01-01T00:00:01Z | +| | | | sorted_list2: var desc... | | | | | +--------- ------- ------ --------------------------- --------- -------------- ------------------- ---------------------- +| v1 | task1 | | sorted_list1: var desc... | | | | 1970-01-01T00:00:00Z | +| | | | sorted_list2: var desc... | | | | | +--------- ------- ------ --------------------------- --------- -------------- ------------------- ---------------------- +2 rows`) +} + func TestGetTaskFuncLatest(t *testing.T) { setup() getTaskSetup() @@ -336,14 +365,16 @@ func TestGetTaskFuncLatest(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "var description" }, "sorted_list2": { "type": { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "var description" } } } @@ -382,14 +413,16 @@ func TestGetTaskWithVersion(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "var description" }, "sorted_list2": { "type": { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "var description" } } } @@ -408,7 +441,7 @@ func TestGetTasks(t *testing.T) { mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `[{"id": {"name": "task1","version": "v2"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}}},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}}}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}}},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}}}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + tearDownAndVerify(t, `[{"id": {"name": "task1","version": "v2"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetTasksFilters(t *testing.T) { @@ -420,7 +453,7 @@ func TestGetTasksFilters(t *testing.T) { mockClient.OnListTasksMatch(ctx, resourceListFilterRequestTask).Return(taskListFilterResponse, nil) err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}}},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}}}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}`) + tearDownAndVerify(t, `{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}`) } func TestGetTaskWithExecFile(t *testing.T) { @@ -451,14 +484,16 @@ func TestGetTaskWithExecFile(t *testing.T) { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "var description" }, "sorted_list2": { "type": { "collectionType": { "simple": "INTEGER" } - } + }, + "description": "var description" } } } diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 8fba30d2cd..704f7a0519 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -87,6 +87,8 @@ Usage var workflowColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, + {Header: "Inputs", JSONPath: "$.closure.compiledWorkflow.primary.template.interface.inputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, + {Header: "Outputs", JSONPath: "$.closure.compiledWorkflow.primary.template.interface.outputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, {Header: "Created At", JSONPath: "$.closure.createdAt"}, } @@ -98,6 +100,21 @@ func WorkflowToProtoMessages(l []*admin.Workflow) []proto.Message { return messages } +func WorkflowToTableProtoMessages(l []*admin.Workflow) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + m := proto.Clone(m).(*admin.Workflow) + if m.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs != nil { + printer.FormatVariableDescriptions(m.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs.Variables) + } + if m.Closure.CompiledWorkflow.Primary.Template.Interface.Outputs != nil { + printer.FormatVariableDescriptions(m.Closure.CompiledWorkflow.Primary.Template.Interface.Outputs.Variables) + } + messages = append(messages, m) + } + return messages +} + func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { adminPrinter := printer.Printer{} var workflows []*admin.Workflow @@ -108,6 +125,9 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC return err } logger.Debugf(ctx, "Retrieved %v workflow", len(workflows)) + if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToTableProtoMessages(workflows)...) + } return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows)...) } @@ -117,6 +137,9 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC } logger.Debugf(ctx, "Retrieved %v workflows", len(workflows)) + if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToTableProtoMessages(workflows)...) + } return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows)...) } diff --git a/flytectl/cmd/testutils/test_utils.go b/flytectl/cmd/testutils/test_utils.go index f386341f32..c04be45a52 100644 --- a/flytectl/cmd/testutils/test_utils.go +++ b/flytectl/cmd/testutils/test_utils.go @@ -6,6 +6,7 @@ import ( "io" "log" "os" + "regexp" "strings" "testing" @@ -68,10 +69,12 @@ func TearDownAndVerify(t *testing.T, expectedLog string) { os.Stderr = stderr var buf bytes.Buffer if _, err := io.Copy(&buf, reader); err == nil { - assert.Equal(t, santizeString(expectedLog), santizeString(buf.String())) + assert.Equal(t, sanitizeString(expectedLog), sanitizeString(buf.String())) } } -func santizeString(str string) string { - return strings.Trim(strings.ReplaceAll(strings.ReplaceAll(str, "\n", ""), "\t", ""), " \t") +func sanitizeString(str string) string { + // Not the most comprehensive ANSI pattern, but this should capture common color operations such as \x1b[107;0m and \x1b[0m. Expand if needed (insert regex 2 problems joke here). + ansiRegex := regexp.MustCompile("\u001B\\[[\\d+\\;]*\\d+m") + return ansiRegex.ReplaceAllString(strings.Trim(strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(str, "\n", ""), "\t", ""), "", ""), " \t"), "") } diff --git a/flytectl/go.mod b/flytectl/go.mod index 00186a8e76..438cc0c3b4 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -42,6 +42,7 @@ require ( google.golang.org/protobuf v1.25.0 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.4.0 + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect gotest.tools v2.2.0+incompatible sigs.k8s.io/yaml v1.2.0 ) diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index 2afcff5403..75d67208eb 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -6,6 +6,10 @@ import ( "fmt" "net/url" "os" + "sort" + "strings" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/pkg/visualize" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -51,8 +55,10 @@ type Column struct { type Printer struct{} const ( - empty = "" - tab = "\t" + empty = "" + tab = "\t" + DefaultFormattedDescriptionsKey = "_formatted_descriptions" + defaultLineWidth = 25 ) // Projects the columns in one row of data from the given JSON using the []Column map @@ -164,6 +170,61 @@ func printJSONYaml(format OutputFormat, v interface{}) error { return nil } +func FormatVariableDescriptions(variableMap map[string]*core.Variable) { + keys := make([]string, 0, len(variableMap)) + // sort the keys for testing and consistency with other output formats + for k := range variableMap { + keys = append(keys, k) + } + sort.Strings(keys) + + var descriptions []string + for _, k := range keys { + v := variableMap[k] + // a: a isn't very helpful + if k != v.Description { + descriptions = append(descriptions, getTruncatedLine(fmt.Sprintf("%s: %s", k, v.Description))) + } else { + descriptions = append(descriptions, getTruncatedLine(k)) + } + + } + variableMap[DefaultFormattedDescriptionsKey] = &core.Variable{Description: strings.Join(descriptions, "\n")} +} + +func FormatParameterDescriptions(parameterMap map[string]*core.Parameter) { + keys := make([]string, 0, len(parameterMap)) + // sort the keys for testing and consistency with other output formats + for k := range parameterMap { + keys = append(keys, k) + } + sort.Strings(keys) + + var descriptions []string + for _, k := range keys { + v := parameterMap[k] + if v.Var == nil { + continue + } + // a: a isn't very helpful + if k != v.Var.Description { + descriptions = append(descriptions, getTruncatedLine(fmt.Sprintf("%s: %s", k, v.Var.Description))) + } else { + descriptions = append(descriptions, getTruncatedLine(k)) + } + } + parameterMap[DefaultFormattedDescriptionsKey] = &core.Parameter{Var: &core.Variable{Description: strings.Join(descriptions, "\n")}} +} + +func getTruncatedLine(line string) string { + // TODO: maybe add width to function signature later + width := defaultLineWidth + if len(line) > width { + return line[:width-3] + "..." + } + return line +} + func (p Printer) Print(format OutputFormat, columns []Column, messages ...proto.Message) error { printableMessages := make([]*PrintableProto, 0, len(messages)) diff --git a/flytectl/pkg/printer/printer_test.go b/flytectl/pkg/printer/printer_test.go index faa11a1978..6d5441b9af 100644 --- a/flytectl/pkg/printer/printer_test.go +++ b/flytectl/pkg/printer/printer_test.go @@ -253,3 +253,57 @@ func TestPrint(t *testing.T) { assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("no template found in the sub workflow template:<> "), errors.Unwrap(err)) } + +func TestGetTruncatedLine(t *testing.T) { + testStrings := map[string]string{ + "foo": "foo", + "": "", + "short description": "short description", + "1234567890123456789012345": "1234567890123456789012345", + "12345678901234567890123456": "1234567890123456789012...", + "long description probably needs truncate": "long description proba...", + } + for k, v := range testStrings { + assert.Equal(t, v, getTruncatedLine(k)) + } +} + +func TestFormatVariableDescriptions(t *testing.T) { + fooVar := &core.Variable{ + Description: "foo", + } + barVar := &core.Variable{ + Description: "bar", + } + variableMap := map[string]*core.Variable{ + "var1": fooVar, + "var2": barVar, + "foo": fooVar, + "bar": barVar, + } + FormatVariableDescriptions(variableMap) + assert.Equal(t, "bar\nfoo\nvar1: foo\nvar2: bar", variableMap[DefaultFormattedDescriptionsKey].Description) +} + +func TestFormatParameterDescriptions(t *testing.T) { + fooParam := &core.Parameter{ + Var: &core.Variable{ + Description: "foo", + }, + } + barParam := &core.Parameter{ + Var: &core.Variable{ + Description: "bar", + }, + } + emptyParam := &core.Parameter{} + paramMap := map[string]*core.Parameter{ + "var1": fooParam, + "var2": barParam, + "foo": fooParam, + "bar": barParam, + "empty": emptyParam, + } + FormatParameterDescriptions(paramMap) + assert.Equal(t, "bar\nfoo\nvar1: foo\nvar2: bar", paramMap[DefaultFormattedDescriptionsKey].Var.Description) +} From f2d8560a613475459e0537c29af6ebe3c4fb9223 Mon Sep 17 00:00:00 2001 From: Sean Lin Date: Thu, 5 Aug 2021 20:50:41 -0700 Subject: [PATCH 122/645] Reset default filter in the task_test so that the unit tests can be run individually (#155) Signed-off-by: Sean Lin --- flytectl/cmd/get/task_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index 744c56b29e..293d506831 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -174,6 +174,7 @@ func getTaskSetup() { taskConfig.DefaultConfig.Latest = false taskConfig.DefaultConfig.ExecFile = "" taskConfig.DefaultConfig.Version = "" + taskConfig.DefaultConfig.Filter = filters.DefaultFilter } func TestGetTaskFuncWithError(t *testing.T) { @@ -238,6 +239,7 @@ func TestGetTaskFuncWithError(t *testing.T) { func TestGetTaskFunc(t *testing.T) { setup() getTaskSetup() + taskConfig.DefaultConfig.Filter = filters.Filters{} mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) err = getTaskFunc(ctx, argsTask, cmdCtx) @@ -320,6 +322,7 @@ func TestGetTaskFunc(t *testing.T) { func TestGetTaskTableFunc(t *testing.T) { setup() getTaskSetup() + taskConfig.DefaultConfig.Filter = filters.Filters{} mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) config.GetConfig().Output = "table" @@ -342,6 +345,7 @@ func TestGetTaskTableFunc(t *testing.T) { func TestGetTaskFuncLatest(t *testing.T) { setup() getTaskSetup() + taskConfig.DefaultConfig.Filter = filters.Filters{} mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) @@ -389,6 +393,7 @@ func TestGetTaskFuncLatest(t *testing.T) { func TestGetTaskWithVersion(t *testing.T) { setup() getTaskSetup() + taskConfig.DefaultConfig.Filter = filters.Filters{} mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) @@ -437,6 +442,7 @@ func TestGetTaskWithVersion(t *testing.T) { func TestGetTasks(t *testing.T) { setup() getTaskSetup() + taskConfig.DefaultConfig.Filter = filters.Filters{} mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) err = getTaskFunc(ctx, argsTask, cmdCtx) From 3e4323a5e896e8c68ee8dc903004f16db436acff Mon Sep 17 00:00:00 2001 From: Sean Lin Date: Fri, 6 Aug 2021 10:43:13 -0700 Subject: [PATCH 123/645] Add additional nil check (#156) Signed-off-by: Sean Lin --- flytectl/cmd/get/launch_plan.go | 12 +++++++----- flytectl/cmd/get/task.go | 16 +++++++++++----- flytectl/cmd/get/workflow.go | 18 +++++++++++++----- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 34bf10cf1a..f146740bd7 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -128,11 +128,13 @@ func LaunchplanToTableProtoMessages(l []*admin.LaunchPlan) []proto.Message { messages := make([]proto.Message, 0, len(l)) for _, m := range l { m := proto.Clone(m).(*admin.LaunchPlan) - if m.Closure.ExpectedInputs != nil { - printer.FormatParameterDescriptions(m.Closure.ExpectedInputs.Parameters) - } - if m.Closure.ExpectedOutputs != nil { - printer.FormatVariableDescriptions(m.Closure.ExpectedOutputs.Variables) + if m.Closure != nil { + if m.Closure.ExpectedInputs != nil { + printer.FormatParameterDescriptions(m.Closure.ExpectedInputs.Parameters) + } + if m.Closure.ExpectedOutputs != nil { + printer.FormatVariableDescriptions(m.Closure.ExpectedOutputs.Variables) + } } messages = append(messages, m) } diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 9f9a7b9861..a9f0859d58 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -116,11 +116,17 @@ func TaskToTableProtoMessages(l []*admin.Task) []proto.Message { messages := make([]proto.Message, 0, len(l)) for _, m := range l { m := proto.Clone(m).(*admin.Task) - if m.Closure.CompiledTask.Template.Interface.Inputs != nil { - printer.FormatVariableDescriptions(m.Closure.CompiledTask.Template.Interface.Inputs.Variables) - } - if m.Closure.CompiledTask.Template.Interface.Outputs != nil { - printer.FormatVariableDescriptions(m.Closure.CompiledTask.Template.Interface.Outputs.Variables) + if m.Closure != nil && m.Closure.CompiledTask != nil { + if m.Closure.CompiledTask.Template != nil { + if m.Closure.CompiledTask.Template.Interface != nil { + if m.Closure.CompiledTask.Template.Interface.Inputs != nil { + printer.FormatVariableDescriptions(m.Closure.CompiledTask.Template.Interface.Inputs.Variables) + } + if m.Closure.CompiledTask.Template.Interface.Outputs != nil { + printer.FormatVariableDescriptions(m.Closure.CompiledTask.Template.Interface.Outputs.Variables) + } + } + } } messages = append(messages, m) } diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 704f7a0519..28c4372628 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -104,11 +104,19 @@ func WorkflowToTableProtoMessages(l []*admin.Workflow) []proto.Message { messages := make([]proto.Message, 0, len(l)) for _, m := range l { m := proto.Clone(m).(*admin.Workflow) - if m.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs != nil { - printer.FormatVariableDescriptions(m.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs.Variables) - } - if m.Closure.CompiledWorkflow.Primary.Template.Interface.Outputs != nil { - printer.FormatVariableDescriptions(m.Closure.CompiledWorkflow.Primary.Template.Interface.Outputs.Variables) + if m.Closure != nil && m.Closure.CompiledWorkflow != nil { + if m.Closure.CompiledWorkflow.Primary != nil { + if m.Closure.CompiledWorkflow.Primary.Template != nil { + if m.Closure.CompiledWorkflow.Primary.Template.Interface != nil { + if m.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs != nil { + printer.FormatVariableDescriptions(m.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs.Variables) + } + if m.Closure.CompiledWorkflow.Primary.Template.Interface.Outputs != nil { + printer.FormatVariableDescriptions(m.Closure.CompiledWorkflow.Primary.Template.Interface.Outputs.Variables) + } + } + } + } } messages = append(messages, m) } From 2fae848b6044356c7523553912271486dacab192 Mon Sep 17 00:00:00 2001 From: Sean Lin Date: Sun, 8 Aug 2021 22:53:14 -0700 Subject: [PATCH 124/645] Remove input output columns for list workflows (#157) Signed-off-by: Sean Lin --- flytectl/cmd/get/launch_plan_test.go | 4 +- flytectl/cmd/get/task_test.go | 2 +- flytectl/cmd/get/workflow.go | 34 +++++---- flytectl/cmd/get/workflow_test.go | 104 +++++++++++++++++++++++++-- 4 files changed, 125 insertions(+), 19 deletions(-) diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index 6e3e104390..e6a7cbec01 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -5,6 +5,8 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/pkg/printer" + "github.com/flyteorg/flytectl/pkg/filters" "github.com/flyteorg/flytectl/cmd/config" @@ -731,7 +733,7 @@ func TestGetLaunchPlanTableFunc(t *testing.T) { mockClient.OnListLaunchPlansMatch(ctx, resourceGetRequest).Return(launchPlanListResponse, nil) mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) - config.GetConfig().Output = "table" + config.GetConfig().Output = printer.OutputFormatTABLE.String() err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceGetRequest) diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index 293d506831..0133c20f46 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -319,7 +319,7 @@ func TestGetTaskFunc(t *testing.T) { ]`) } -func TestGetTaskTableFunc(t *testing.T) { +func TestGetTaskFuncWithTable(t *testing.T) { setup() getTaskSetup() taskConfig.DefaultConfig.Filter = filters.Filters{} diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 28c4372628..519a6d1e1a 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -92,6 +92,12 @@ var workflowColumns = []printer.Column{ {Header: "Created At", JSONPath: "$.closure.createdAt"}, } +var listWorkflowColumns = []printer.Column{ + {Header: "Version", JSONPath: "$.id.version"}, + {Header: "Name", JSONPath: "$.id.name"}, + {Header: "Created At", JSONPath: "$.closure.createdAt"}, +} + func WorkflowToProtoMessages(l []*admin.Workflow) []proto.Message { messages := make([]proto.Message, 0, len(l)) for _, m := range l { @@ -129,14 +135,19 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC var err error if len(args) > 0 { name := args[0] - if workflows, err = FetchWorkflowForName(ctx, cmdCtx.AdminFetcherExt(), name, config.GetConfig().Project, config.GetConfig().Domain); err != nil { + var isList bool + if workflows, isList, err = FetchWorkflowForName(ctx, cmdCtx.AdminFetcherExt(), name, config.GetConfig().Project, config.GetConfig().Domain); err != nil { return err } + columns := workflowColumns + if isList { + columns = listWorkflowColumns + } logger.Debugf(ctx, "Retrieved %v workflow", len(workflows)) if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToTableProtoMessages(workflows)...) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), columns, WorkflowToTableProtoMessages(workflows)...) } - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows)...) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), columns, WorkflowToProtoMessages(workflows)...) } workflows, err = cmdCtx.AdminFetcherExt().FetchAllVerOfWorkflow(ctx, "", config.GetConfig().Project, config.GetConfig().Domain, workflowconfig.DefaultConfig.Filter) @@ -146,32 +157,31 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC logger.Debugf(ctx, "Retrieved %v workflows", len(workflows)) if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToTableProtoMessages(workflows)...) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), listWorkflowColumns, WorkflowToTableProtoMessages(workflows)...) } - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), workflowColumns, WorkflowToProtoMessages(workflows)...) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), listWorkflowColumns, WorkflowToProtoMessages(workflows)...) } // FetchWorkflowForName fetches the workflow give it name. func FetchWorkflowForName(ctx context.Context, fetcher ext.AdminFetcherExtInterface, name, project, - domain string) ([]*admin.Workflow, error) { - var workflows []*admin.Workflow + domain string) (workflows []*admin.Workflow, isList bool, err error) { var workflow *admin.Workflow - var err error if workflowconfig.DefaultConfig.Latest { if workflow, err = fetcher.FetchWorkflowLatestVersion(ctx, name, project, domain, workflowconfig.DefaultConfig.Filter); err != nil { - return nil, err + return nil, false, err } workflows = append(workflows, workflow) } else if workflowconfig.DefaultConfig.Version != "" { if workflow, err = fetcher.FetchWorkflowVersion(ctx, name, workflowconfig.DefaultConfig.Version, project, domain); err != nil { - return nil, err + return nil, false, err } workflows = append(workflows, workflow) } else { workflows, err = fetcher.FetchAllVerOfWorkflow(ctx, name, project, domain, workflowconfig.DefaultConfig.Filter) if err != nil { - return nil, err + return nil, false, err } + isList = true } - return workflows, nil + return workflows, isList, nil } diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go index a3e47e8332..46ad846cdd 100644 --- a/flytectl/cmd/get/workflow_test.go +++ b/flytectl/cmd/get/workflow_test.go @@ -4,6 +4,12 @@ import ( "fmt" "testing" + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flytectl/pkg/printer" + + "google.golang.org/protobuf/types/known/timestamppb" + "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -17,6 +23,9 @@ import ( var ( resourceListRequestWorkflow *admin.ResourceListRequest workflowListResponse *admin.WorkflowList + argsWf []string + workflow1 *admin.Workflow + workflows []*admin.Workflow ) func getWorkflowSetup() { @@ -30,11 +39,52 @@ func getWorkflowSetup() { }, } - workflow1 := &admin.Workflow{ + variableMap := map[string]*core.Variable{ + "var1": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + Description: "var1", + }, + "var2": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + Description: "var2 long descriptions probably needs truncate", + }, + } + workflow1 = &admin.Workflow{ Id: &core.Identifier{ Project: projectValue, Domain: domainValue, Name: "workflow1", + Version: "v1", + }, + Closure: &admin.WorkflowClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 0, Nanos: 0}, + CompiledWorkflow: &core.CompiledWorkflowClosure{ + Primary: &core.CompiledWorkflow{ + Template: &core.WorkflowTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }, + }, }, } workflow2 := &admin.Workflow{ @@ -42,14 +92,20 @@ func getWorkflowSetup() { Project: projectValue, Domain: domainValue, Name: "workflow2", + Version: "v2", + }, + Closure: &admin.WorkflowClosure{ + CreatedAt: ×tamppb.Timestamp{Seconds: 0, Nanos: 0}, }, } - workflows := []*admin.Workflow{workflow1, workflow2} + workflows = []*admin.Workflow{workflow1, workflow2} workflowListResponse = &admin.WorkflowList{ Workflows: workflows, } + argsWf = []string{"workflow1"} workflow.DefaultConfig.Latest = false workflow.DefaultConfig.Version = "" + workflow.DefaultConfig.Filter = filters.DefaultFilter } func TestGetWorkflowFuncWithError(t *testing.T) { @@ -59,7 +115,7 @@ func TestGetWorkflowFuncWithError(t *testing.T) { mockFetcher := new(mocks.AdminFetcherExtInterface) workflow.DefaultConfig.Latest = true mockFetcher.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) - _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) + _, _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -70,7 +126,7 @@ func TestGetWorkflowFuncWithError(t *testing.T) { workflow.DefaultConfig.Version = "v1" mockFetcher.OnFetchWorkflowVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching version")) - _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) + _, _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -80,7 +136,7 @@ func TestGetWorkflowFuncWithError(t *testing.T) { mockFetcher := new(mocks.AdminFetcherExtInterface) mockFetcher.OnFetchAllVerOfWorkflowMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) - _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) + _, _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) assert.NotNil(t, err) }) @@ -96,3 +152,41 @@ func TestGetWorkflowFuncWithError(t *testing.T) { }) } + +func TestGetWorkflowFuncLatestWithTable(t *testing.T) { + setup() + getWorkflowSetup() + workflow.DefaultConfig.Latest = true + workflow.DefaultConfig.Filter = filters.Filters{} + config.GetConfig().Output = printer.OutputFormatTABLE.String() + u.FetcherExt.OnFetchWorkflowLatestVersionMatch(ctx, "workflow1", projectValue, domainValue, filters.Filters{}).Return(workflow1, nil) + err = getWorkflowFunc(ctx, argsWf, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ` + --------- ----------- --------------------------- --------- ---------------------- +| VERSION | NAME | INPUTS | OUTPUTS | CREATED AT | + --------- ----------- --------------------------- --------- ---------------------- +| v1 | workflow1 | var1 | | 1970-01-01T00:00:00Z | +| | | var2: var2 long descri... | | | + --------- ----------- --------------------------- --------- ---------------------- +1 rows`) +} + +func TestListWorkflowFuncWithTable(t *testing.T) { + setup() + getWorkflowSetup() + workflow.DefaultConfig.Filter = filters.Filters{} + config.GetConfig().Output = printer.OutputFormatTABLE.String() + u.FetcherExt.OnFetchAllVerOfWorkflowMatch(ctx, "workflow1", projectValue, domainValue, filters.Filters{}).Return(workflows, nil) + err = getWorkflowFunc(ctx, argsWf, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, ` + --------- ----------- ---------------------- +| VERSION | NAME | CREATED AT | + --------- ----------- ---------------------- +| v1 | workflow1 | 1970-01-01T00:00:00Z | + --------- ----------- ---------------------- +| v2 | workflow2 | 1970-01-01T00:00:00Z | + --------- ----------- ---------------------- +2 rows`) +} From 89cb3742c63b0046a987b1bfe4b423c945d462cb Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Wed, 18 Aug 2021 18:34:59 +0530 Subject: [PATCH 125/645] Add upgrade command with some refactor (#152) * Added k8s check in sandbox * Added upgrade command Signed-off-by: Yuvraj --- flytectl/.github/workflows/sandbox.yaml | 7 +- flytectl/cmd/root.go | 9 +- flytectl/cmd/sandbox/exec.go | 4 +- flytectl/cmd/sandbox/start.go | 182 +++++++++++----- flytectl/cmd/sandbox/start_test.go | 188 ++++++++++++++-- flytectl/cmd/sandbox/teardown_test.go | 5 + flytectl/cmd/upgrade/upgrade.go | 138 ++++++++++++ flytectl/cmd/upgrade/upgrade_test.go | 200 ++++++++++++++++++ flytectl/cmd/version/version.go | 47 ++-- flytectl/cmd/version/version_test.go | 21 +- flytectl/docs/source/nouns.rst | 1 + flytectl/docs/source/verbs.rst | 1 + flytectl/go.mod | 18 +- flytectl/go.sum | 63 +++++- flytectl/pkg/configutil/configutil_test.go | 4 - flytectl/pkg/docker/docker_util.go | 22 +- flytectl/pkg/docker/docker_util_test.go | 19 +- flytectl/pkg/k8s/k8s.go | 33 +++ flytectl/pkg/k8s/k8s_test.go | 65 ++++++ flytectl/pkg/util/githubutil/githubutil.go | 156 ++++++++++++++ .../pkg/util/githubutil/githubutil_test.go | 127 +++++++++++ .../pkg/util/platformutil/platformutil.go | 26 +++ .../util/platformutil/platformutil_test.go | 39 ++++ flytectl/pkg/util/util.go | 67 +++--- flytectl/pkg/util/util_test.go | 64 +++--- 25 files changed, 1284 insertions(+), 222 deletions(-) create mode 100644 flytectl/cmd/upgrade/upgrade.go create mode 100644 flytectl/cmd/upgrade/upgrade_test.go create mode 100644 flytectl/pkg/k8s/k8s.go create mode 100644 flytectl/pkg/k8s/k8s_test.go create mode 100644 flytectl/pkg/util/githubutil/githubutil.go create mode 100644 flytectl/pkg/util/githubutil/githubutil_test.go create mode 100644 flytectl/pkg/util/platformutil/platformutil.go create mode 100644 flytectl/pkg/util/platformutil/platformutil_test.go diff --git a/flytectl/.github/workflows/sandbox.yaml b/flytectl/.github/workflows/sandbox.yaml index 35c10cee19..62ba9f783b 100644 --- a/flytectl/.github/workflows/sandbox.yaml +++ b/flytectl/.github/workflows/sandbox.yaml @@ -20,9 +20,14 @@ jobs: key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - name: Build Flytectl binary run: make compile + - name: Setup env + run: | + mkdir -p ~/.flyte/k3s && touch ~/.flyte/k3s/k3s.yaml && chmod 666 ~/.flyte/k3s/k3s.yaml - name: Create a sandbox cluster run: bin/flytectl sandbox start + - name: Setup flytectl config + run: bin/flytectl config init - name: Register cookbook - run: bin/flytectl register examples -d development -p flytesnacks || true + run: bin/flytectl register examples -d development -p flytesnacks - name: Teardown Sandbox cluster run: bin/flytectl sandbox teardown diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index ee93bf0885..5da86063ce 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -18,6 +18,7 @@ import ( "github.com/flyteorg/flytectl/cmd/get" "github.com/flyteorg/flytectl/cmd/register" "github.com/flyteorg/flytectl/cmd/update" + "github.com/flyteorg/flytectl/cmd/upgrade" "github.com/flyteorg/flytectl/cmd/version" "github.com/flyteorg/flytectl/pkg/printer" stdConfig "github.com/flyteorg/flytestdlib/config" @@ -66,8 +67,12 @@ func newRootCmd() *cobra.Command { rootCmd.AddCommand(configuration.CreateConfigCommand()) rootCmd.AddCommand(completionCmd) // Added version command - versioncmd := version.GetVersionCommand(rootCmd) - cmdCore.AddCommands(rootCmd, versioncmd) + versionCmd := version.GetVersionCommand(rootCmd) + cmdCore.AddCommands(rootCmd, versionCmd) + + // Added upgrade command + upgradeCmd := upgrade.SelfUpgrade(rootCmd) + cmdCore.AddCommands(rootCmd, upgradeCmd) config.GetConfig() diff --git a/flytectl/cmd/sandbox/exec.go b/flytectl/cmd/sandbox/exec.go index 63a17e8884..bc42048a86 100644 --- a/flytectl/cmd/sandbox/exec.go +++ b/flytectl/cmd/sandbox/exec.go @@ -25,12 +25,12 @@ func sandboxClusterExec(ctx context.Context, args []string, cmdCtx cmdCore.Comma return err } if len(args) > 0 { - return Execute(ctx, cli, args) + return execute(ctx, cli, args) } return fmt.Errorf("missing argument. Please check usage examples by running flytectl sandbox exec --help") } -func Execute(ctx context.Context, cli docker.Docker, args []string) error { +func execute(ctx context.Context, cli docker.Docker, args []string) error { c := docker.GetSandbox(ctx, cli) if c != nil { exec, err := docker.ExecCommend(ctx, cli, c.ID, args) diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 28f142493a..b97c3c1dd2 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -7,22 +7,29 @@ import ( "io" "os" "path/filepath" - "strings" + "time" - "github.com/flyteorg/flytectl/clierrors" - - "github.com/docker/docker/api/types/mount" + "github.com/avast/retry-go" + "github.com/olekukonko/tablewriter" + corev1api "k8s.io/api/core/v1" + corev1 "k8s.io/client-go/kubernetes/typed/core/v1" - "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flytectl/pkg/util/githubutil" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" - "github.com/flyteorg/flytectl/pkg/util" + "github.com/flyteorg/flytestdlib/logger" - "github.com/flyteorg/flytectl/pkg/docker" + "github.com/docker/docker/api/types/mount" + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flytectl/pkg/k8s" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/enescakir/emoji" sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/docker" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" + "github.com/flyteorg/flytectl/pkg/util" ) const ( @@ -47,14 +54,16 @@ Run specific version of flyte, Only available after v0.14.0+ Usage ` - GeneratedManifest = "/flyteorg/share/flyte_generated.yaml" - FlyteReleaseURL = "/flyteorg/flyte/releases/download/%v/flyte_sandbox_manifest.yaml" - FlyteMinimumVersionSupported = "v0.14.0" - GithubURL = "https://github.com" + k8sEndpoint = "https://127.0.0.1:30086" + flyteMinimumVersionSupported = "v0.14.0" + generatedManifest = "/flyteorg/share/flyte_generated.yaml" + flyteNamespace = "flyte" + diskPressureTaint = "node.kubernetes.io/disk-pressure" + taintEffect = "NoSchedule" ) var ( - FlyteManifest = f.FilePathJoin(f.UserHomeDir(), ".flyte", "flyte_generated.yaml") + flyteManifest = f.FilePathJoin(f.UserHomeDir(), ".flyte", "flyte_generated.yaml") ) type ExecResult struct { @@ -76,6 +85,24 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm if reader != nil { docker.WaitForSandbox(reader, docker.SuccessMessage) } + + var k8sClient k8s.K8s + err = retry.Do( + func() error { + k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, k8sEndpoint) + return err + }, + retry.Attempts(10), + ) + if err != nil { + return err + } + + if err := watchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { + return err + } + + util.PrintSandboxMessage() return nil } @@ -86,7 +113,8 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu if err.Error() != clierrors.ErrSandboxExists { return nil, err } - printExistingSandboxMessage() + fmt.Printf("Existing details of your sandbox:") + util.PrintSandboxMessage() return nil, nil } @@ -110,14 +138,24 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu } if len(sandboxConfig.DefaultConfig.Version) > 0 { - if err := downloadFlyteManifest(sandboxConfig.DefaultConfig.Version); err != nil { + isGreater, err := util.IsVersionGreaterThan(sandboxConfig.DefaultConfig.Version, flyteMinimumVersionSupported) + if err != nil { return nil, err } - vol, err := mountVolume(FlyteManifest, GeneratedManifest) - if err != nil { + if !isGreater { + logger.Infof(ctx, "version flag only supported after with flyte %s+ release", flyteMinimumVersionSupported) + return nil, fmt.Errorf("version flag only supported after with flyte %s+ release", flyteMinimumVersionSupported) + } + if err := githubutil.GetFlyteManifest(sandboxConfig.DefaultConfig.Version, flyteManifest); err != nil { return nil, err } - volumes = append(volumes, *vol) + + if vol, err := mountVolume(flyteManifest, generatedManifest); err != nil { + return nil, err + } else if vol != nil { + volumes = append(volumes, *vol) + } + } fmt.Printf("%v pulling docker image %s\n", emoji.Whale, docker.ImageName) @@ -133,18 +171,10 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu return nil, err } - _, errCh := docker.WatchError(ctx, cli, ID) logReader, err := docker.ReadLogs(ctx, cli, ID) if err != nil { return nil, err } - go func() { - err := <-errCh - if err != nil { - fmt.Printf("err: %v", err) - os.Exit(1) - } - }() return logReader, nil } @@ -164,34 +194,86 @@ func mountVolume(file, destination string) (*mount.Mount, error) { return nil, nil } -func downloadFlyteManifest(version string) error { - isGreater, err := util.IsVersionGreaterThan(version, FlyteMinimumVersionSupported) - if err != nil { - return err +func watchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface) error { + var data = os.Stdout + table := tablewriter.NewWriter(data) + table.SetHeader([]string{"Service", "Status", "Namespace"}) + table.SetRowLine(true) + + for { + isTaint, err := isNodeTainted(ctx, appsClient) + if err != nil { + return err + } + if isTaint { + return fmt.Errorf("docker sandbox doesn't have sufficient memory available. Please run docker system prune -a --volumes") + } + + pods, err := getFlyteDeployment(ctx, appsClient) + if err != nil { + return err + } + table.ClearRows() + table.SetAutoWrapText(false) + table.SetAutoFormatHeaders(true) + + // Clear os.Stdout + _, _ = data.WriteString("\x1b[3;J\x1b[H\x1b[2J") + + var total, ready int + total = len(pods.Items) + ready = 0 + if total != 0 { + for _, v := range pods.Items { + if isPodReady(v) { + ready++ + } + if len(v.Status.Conditions) > 0 { + table.Append([]string{v.GetName(), string(v.Status.Phase), v.GetNamespace()}) + } + } + table.Render() + if total == ready { + break + } + } + + time.Sleep(40 * time.Second) } - if !isGreater { - return fmt.Errorf("version flag only support %s+ flyte version", FlyteMinimumVersionSupported) + + return nil +} + +func isPodReady(v corev1api.Pod) bool { + if (v.Status.Phase == corev1api.PodRunning) || (v.Status.Phase == corev1api.PodSucceeded) { + return true } - response, err := util.GetRequest(GithubURL, fmt.Sprintf(FlyteReleaseURL, version)) + return false +} + +func getFlyteDeployment(ctx context.Context, client corev1.CoreV1Interface) (*corev1api.PodList, error) { + pods, err := client.Pods(flyteNamespace).List(ctx, v1.ListOptions{}) if err != nil { - return err - } - if err := util.WriteIntoFile(response, FlyteManifest); err != nil { - return err + return nil, err } - return nil + return pods, nil } -func printExistingSandboxMessage() { - kubeconfig := strings.Join([]string{ - "$KUBECONFIG", - f.FilePathJoin(f.UserHomeDir(), ".kube", "config"), - docker.Kubeconfig, - }, ":") - - fmt.Printf("Existing details of your sandbox:") - fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, docker.SuccessMessage, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) - fmt.Printf("Add KUBECONFIG and FLYTECTL_CONFIG to your environment variable \n") - fmt.Printf("export KUBECONFIG=%v \n", kubeconfig) - fmt.Printf("export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) +func isNodeTainted(ctx context.Context, client corev1.CoreV1Interface) (bool, error) { + nodes, err := client.Nodes().List(ctx, v1.ListOptions{}) + if err != nil { + return false, err + } + match := 0 + for _, node := range nodes.Items { + for _, c := range node.Spec.Taints { + if c.Key == diskPressureTaint && c.Effect == taintEffect { + match++ + } + } + } + if match > 0 { + return true, nil + } + return false, nil } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index 73a7eee0a7..f2b43ff8da 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -10,22 +10,76 @@ import ( "strings" "testing" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + "github.com/flyteorg/flytectl/pkg/k8s" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/docker/mocks" f "github.com/flyteorg/flytectl/pkg/filesystemutils" + "github.com/flyteorg/flytectl/pkg/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + testclient "k8s.io/client-go/kubernetes/fake" ) +var content = ` +apiVersion: v1 +clusters: +- cluster: + server: https://localhost:8080 + extensions: + - name: client.authentication.k8s.io/exec + extension: + audience: foo + other: bar + name: foo-cluster +contexts: +- context: + cluster: foo-cluster + user: foo-user + namespace: bar + name: foo-context +current-context: foo-context +kind: Config +users: +- name: foo-user + user: + exec: + apiVersion: client.authentication.k8s.io/v1alpha1 + args: + - arg-1 + - arg-2 + command: foo-command + provideClusterInfo: true +` + +var fakeNode = &corev1.Node{ + Spec: corev1.NodeSpec{ + Taints: []corev1.Taint{}, + }, +} + +var fakePod = corev1.Pod{ + Status: corev1.PodStatus{ + Phase: corev1.PodRunning, + Conditions: []corev1.PodCondition{}, + }, +} + func TestStartSandboxFunc(t *testing.T) { p1, p2, _ := docker.GetSandboxPorts() + assert.Nil(t, util.SetupFlyteDir()) + assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm)) + assert.Nil(t, ioutil.WriteFile(docker.Kubeconfig, []byte(content), os.ModePerm)) + + fakePod.SetName("flyte") + fakePod.SetName("flyte") t.Run("Successfully run sandbox cluster", func(t *testing.T) { ctx := context.Background() @@ -181,8 +235,8 @@ func TestStartSandboxFunc(t *testing.T) { volumes := docker.Volumes volumes = append(volumes, mount.Mount{ Type: mount.TypeBind, - Source: FlyteManifest, - Target: GeneratedManifest, + Source: flyteManifest, + Target: generatedManifest, }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -214,13 +268,13 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Version = "v0.13.0" + sandboxConfig.DefaultConfig.Version = "v0.1444.0" sandboxConfig.DefaultConfig.Source = "" volumes := docker.Volumes volumes = append(volumes, mount.Mount{ Type: mount.TypeBind, - Source: FlyteManifest, - Target: GeneratedManifest, + Source: flyteManifest, + Target: generatedManifest, }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -252,6 +306,7 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := docker.Volumes volumes = append(volumes, mount.Mount{ @@ -361,10 +416,6 @@ func TestStartSandboxFunc(t *testing.T) { _, err := startSandbox(ctx, mockDocker, os.Stdin) assert.NotNil(t, err) }) - t.Run("Failed manifest", func(t *testing.T) { - err := downloadFlyteManifest("v100.9.9") - assert.NotNil(t, err) - }) t.Run("Error in reading logs", func(t *testing.T) { ctx := context.Background() errCh := make(chan error) @@ -445,6 +496,17 @@ func TestStartSandboxFunc(t *testing.T) { cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) mockDocker := &mocks.Docker{} errCh := make(chan error) + client := testclient.NewSimpleClientset() + k8s.Client = client + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + fakeNode.SetName("master") + _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -472,7 +534,7 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) docker.Client = mockDocker sandboxConfig.DefaultConfig.Source = "" - err := startSandboxCluster(ctx, []string{}, cmdCtx) + err = startSandboxCluster(ctx, []string{}, cmdCtx) assert.Nil(t, err) }) t.Run("Error in running sandbox cluster command", func(t *testing.T) { @@ -512,3 +574,103 @@ func TestStartSandboxFunc(t *testing.T) { assert.NotNil(t, err) }) } + +func TestMonitorFlyteDeployment(t *testing.T) { + t.Run("Monitor k8s deployment fail because of storage", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + k8s.Client = client + fakePod.SetName("flyte") + fakePod.SetName("flyte") + + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + fakeNode.SetName("master") + fakeNode.Spec.Taints = append(fakeNode.Spec.Taints, corev1.Taint{ + Effect: "NoSchedule", + Key: "node.kubernetes.io/disk-pressure", + }) + _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + + err = watchFlyteDeployment(ctx, client.CoreV1()) + assert.NotNil(t, err) + + }) + + t.Run("Monitor k8s deployment success", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + k8s.Client = client + fakePod.SetName("flyte") + fakePod.SetName("flyte") + + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + fakeNode.SetName("master") + fakeNode.Spec.Taints = []corev1.Taint{} + _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + + err = watchFlyteDeployment(ctx, client.CoreV1()) + assert.Nil(t, err) + + }) + +} + +func TestGetFlyteDeploymentCount(t *testing.T) { + + ctx := context.Background() + client := testclient.NewSimpleClientset() + c, err := getFlyteDeployment(ctx, client.CoreV1()) + assert.Nil(t, err) + assert.Equal(t, 0, len(c.Items)) +} + +func TestGetNodeTaintStatus(t *testing.T) { + t.Run("Check node taint with success", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + fakeNode.SetName("master") + _, err := client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + c, err := isNodeTainted(ctx, client.CoreV1()) + assert.Nil(t, err) + assert.Equal(t, false, c) + }) + t.Run("Check node taint with fail", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + fakeNode.SetName("master") + _, err := client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + node, err := client.CoreV1().Nodes().Get(ctx, "master", v1.GetOptions{}) + if err != nil { + t.Error(err) + } + node.Spec.Taints = append(node.Spec.Taints, corev1.Taint{ + Effect: taintEffect, + Key: diskPressureTaint, + }) + _, err = client.CoreV1().Nodes().Update(ctx, node, v1.UpdateOptions{}) + if err != nil { + t.Error(err) + } + c, err := isNodeTainted(ctx, client.CoreV1()) + assert.Nil(t, err) + assert.Equal(t, true, c) + }) +} diff --git a/flytectl/cmd/sandbox/teardown_test.go b/flytectl/cmd/sandbox/teardown_test.go index 01511d926e..224c905ae1 100644 --- a/flytectl/cmd/sandbox/teardown_test.go +++ b/flytectl/cmd/sandbox/teardown_test.go @@ -6,6 +6,9 @@ import ( "io" "testing" + "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flytectl/pkg/util" + cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/docker/docker/api/types" @@ -47,6 +50,8 @@ func TestTearDownFunc(t *testing.T) { } func TestTearDownClusterFunc(t *testing.T) { + _ = util.SetupFlyteDir() + _ = util.WriteIntoFile([]byte("data"), configutil.FlytectlConfig) mockOutStream := new(io.Writer) ctx := context.Background() cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go new file mode 100644 index 0000000000..84f79a915f --- /dev/null +++ b/flytectl/cmd/upgrade/upgrade.go @@ -0,0 +1,138 @@ +package upgrade + +import ( + "context" + "errors" + "fmt" + "os" + "runtime" + "strings" + + "github.com/flyteorg/flytectl/pkg/util" + stdlibversion "github.com/flyteorg/flytestdlib/version" + + "github.com/flyteorg/flytectl/pkg/util/githubutil" + + "github.com/flyteorg/flytestdlib/logger" + "github.com/mouuff/go-rocket-update/pkg/updater" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/util/platformutil" + "github.com/spf13/cobra" +) + +type Goos string + +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + upgradeCmdShort = `Used for upgrade/rollback flyte version` + upgradeCmdLong = ` +Upgrade flytectl +:: + + bin/flytectl upgrade + +Rollback flytectl binary +:: + + bin/flytectl upgrade rollback + +Note: Upgrade is not available on windows +` + rollBackSubCommand = "rollback" +) + +var ( + goos = platformutil.Platform(runtime.GOOS) +) + +// SelfUpgrade will return self upgrade command +func SelfUpgrade(rootCmd *cobra.Command) map[string]cmdCore.CommandEntry { + getResourcesFuncs := map[string]cmdCore.CommandEntry{ + "upgrade": {CmdFunc: selfUpgrade, Aliases: []string{"upgrade"}, ProjectDomainNotRequired: true, + Short: upgradeCmdShort, + Long: upgradeCmdLong}, + } + return getResourcesFuncs +} + +func selfUpgrade(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + // Check if it's a rollback + if len(args) == 1 { + if args[0] == rollBackSubCommand && !isRollBackSupported(goos) { + return nil + } + ext, err := githubutil.FlytectlReleaseConfig.GetExecutable() + if err != nil { + return err + } + backupBinary := fmt.Sprintf("%s.old", ext) + if _, err := os.Stat(backupBinary); err != nil { + return errors.New("flytectl backup doesn't exist. Rollback is not possible") + } + return githubutil.FlytectlReleaseConfig.Rollback() + } + + if isSupported, err := isUpgradeSupported(goos); err != nil { + return err + } else if !isSupported { + return nil + } + + if message, err := upgrade(githubutil.FlytectlReleaseConfig); err != nil { + return err + } else if len(message) > 0 { + logger.Info(ctx, message) + } + return nil +} + +func upgrade(u *updater.Updater) (string, error) { + updateStatus, err := u.Update() + if err != nil { + return "", err + } + + if updateStatus == updater.Updated { + latestVersion, err := u.GetLatestVersion() + if err != nil { + return "", err + } + return fmt.Sprintf("Successfully updated to version %s", latestVersion), nil + } + return "", u.Rollback() +} + +func isUpgradeSupported(goos platformutil.Platform) (bool, error) { + latest, err := githubutil.FlytectlReleaseConfig.GetLatestVersion() + if err != nil { + return false, err + } + + if isGreater, err := util.IsVersionGreaterThan(latest, stdlibversion.Version); err != nil { + return false, err + } else if !isGreater { + fmt.Println("You have already latest version of flytectl") + return false, nil + } + + message, err := githubutil.GetUpgradeMessage(latest, goos) + if err != nil { + return false, err + } + if goos.String() == platformutil.Windows.String() || strings.Contains(message, "brew") { + if len(message) > 0 { + fmt.Println(message) + } + return false, nil + } + return true, nil +} + +func isRollBackSupported(goos platformutil.Platform) bool { + if goos.String() == platformutil.Windows.String() { + fmt.Printf("Flytectl rollback is not available on %s \n", goos.String()) + return false + } + return true +} diff --git a/flytectl/cmd/upgrade/upgrade_test.go b/flytectl/cmd/upgrade/upgrade_test.go new file mode 100644 index 0000000000..e1996fb24d --- /dev/null +++ b/flytectl/cmd/upgrade/upgrade_test.go @@ -0,0 +1,200 @@ +package upgrade + +import ( + "io" + "sort" + "testing" + + "github.com/flyteorg/flytectl/pkg/util" + "github.com/flyteorg/flytectl/pkg/util/githubutil" + + "github.com/flyteorg/flytectl/pkg/util/platformutil" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + stdlibversion "github.com/flyteorg/flytestdlib/version" + + "context" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" +) + +var ( + version = "v0.2.20" + tempExt = "flyte.ext" +) + +func TestUpgradeCommand(t *testing.T) { + rootCmd := &cobra.Command{ + Long: "flytectl is CLI tool written in go to interact with flyteadmin service", + Short: "flyetcl CLI tool", + Use: "flytectl", + DisableAutoGenTag: true, + } + upgradeCmd := SelfUpgrade(rootCmd) + cmdCore.AddCommands(rootCmd, upgradeCmd) + assert.Equal(t, len(rootCmd.Commands()), 1) + cmdNouns := rootCmd.Commands() + // Sort by Use value. + sort.Slice(cmdNouns, func(i, j int) bool { + return cmdNouns[i].Use < cmdNouns[j].Use + }) + + assert.Equal(t, cmdNouns[0].Use, "upgrade") + assert.Equal(t, cmdNouns[0].Short, upgradeCmdShort) + assert.Equal(t, cmdNouns[0].Long, upgradeCmdLong) +} + +// +func TestUpgrade(t *testing.T) { + _ = util.WriteIntoFile([]byte("data"), tempExt) + stdlibversion.Version = version + githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + t.Run("Successful upgrade", func(t *testing.T) { + message, err := upgrade(githubutil.FlytectlReleaseConfig) + assert.Nil(t, err) + assert.Equal(t, 39, len(message)) + }) +} + +func TestCheckGoosForRollback(t *testing.T) { + stdlibversion.Version = version + linux := platformutil.Linux + windows := platformutil.Windows + darwin := platformutil.Darwin + githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + t.Run("checkGOOSForRollback on linux", func(t *testing.T) { + assert.Equal(t, true, isRollBackSupported(linux)) + assert.Equal(t, false, isRollBackSupported(windows)) + assert.Equal(t, true, isRollBackSupported(darwin)) + }) +} + +func TestIsUpgradeable(t *testing.T) { + stdlibversion.Version = version + githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + linux := platformutil.Linux + windows := platformutil.Windows + darwin := platformutil.Darwin + t.Run("IsUpgradeable on linux", func(t *testing.T) { + check, err := isUpgradeSupported(linux) + assert.Nil(t, err) + assert.Equal(t, true, check) + }) + t.Run("IsUpgradeable on darwin", func(t *testing.T) { + check, err := isUpgradeSupported(darwin) + assert.Nil(t, err) + assert.Equal(t, true, check) + }) + t.Run("IsUpgradeable on darwin using brew", func(t *testing.T) { + check, err := isUpgradeSupported(darwin) + assert.Nil(t, err) + assert.Equal(t, true, check) + }) + t.Run("isUpgradeSupported failed", func(t *testing.T) { + stdlibversion.Version = "v" + check, err := isUpgradeSupported(linux) + assert.NotNil(t, err) + assert.Equal(t, false, check) + stdlibversion.Version = version + }) + t.Run("isUpgradeSupported windows", func(t *testing.T) { + check, err := isUpgradeSupported(windows) + assert.Nil(t, err) + assert.Equal(t, false, check) + }) +} + +func TestSelfUpgrade(t *testing.T) { + stdlibversion.Version = version + githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + goos = platformutil.Linux + t.Run("Successful upgrade", func(t *testing.T) { + ctx := context.Background() + var args []string + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + stdlibversion.Build = "" + stdlibversion.BuildTime = "" + stdlibversion.Version = version + + assert.Nil(t, selfUpgrade(ctx, args, cmdCtx)) + }) +} + +func TestSelfUpgradeError(t *testing.T) { + stdlibversion.Version = version + githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + goos = platformutil.Linux + t.Run("Successful upgrade", func(t *testing.T) { + ctx := context.Background() + var args []string + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + stdlibversion.Build = "" + stdlibversion.BuildTime = "" + stdlibversion.Version = "v" + + assert.NotNil(t, selfUpgrade(ctx, args, cmdCtx)) + }) + +} + +func TestSelfUpgradeRollback(t *testing.T) { + stdlibversion.Version = version + githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + goos = platformutil.Linux + t.Run("Successful rollback", func(t *testing.T) { + ctx := context.Background() + var args = []string{rollBackSubCommand} + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + stdlibversion.Build = "" + stdlibversion.BuildTime = "" + stdlibversion.Version = version + assert.Nil(t, selfUpgrade(ctx, args, cmdCtx)) + }) + + t.Run("Successful rollback failed", func(t *testing.T) { + ctx := context.Background() + var args = []string{rollBackSubCommand} + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + stdlibversion.Build = "" + stdlibversion.BuildTime = "" + stdlibversion.Version = "v100.0.0" + assert.NotNil(t, selfUpgrade(ctx, args, cmdCtx)) + }) + + t.Run("Successful rollback for windows", func(t *testing.T) { + ctx := context.Background() + var args = []string{rollBackSubCommand} + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + stdlibversion.Build = "" + stdlibversion.BuildTime = "" + stdlibversion.Version = version + goos = platformutil.Windows + assert.Nil(t, selfUpgrade(ctx, args, cmdCtx)) + }) + + t.Run("Successful rollback for windows", func(t *testing.T) { + ctx := context.Background() + var args = []string{rollBackSubCommand} + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + stdlibversion.Build = "" + stdlibversion.BuildTime = "" + stdlibversion.Version = version + githubutil.FlytectlReleaseConfig.OverrideExecutable = "/" + assert.Nil(t, selfUpgrade(ctx, args, cmdCtx)) + }) + +} diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go index a48c9c6f90..14a6d0bc4c 100644 --- a/flytectl/cmd/version/version.go +++ b/flytectl/cmd/version/version.go @@ -4,9 +4,13 @@ import ( "context" "encoding/json" "fmt" + "runtime" + + "github.com/flyteorg/flytectl/pkg/util/githubutil" + + "github.com/flyteorg/flytectl/pkg/util/platformutil" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/util" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" stdlibversion "github.com/flyteorg/flytestdlib/version" @@ -22,15 +26,10 @@ Example version. bin/flytectl version ` - flytectlAppName = "flytectl" - controlPlanAppName = "controlPlane" - GithubAPIURL = "https://api.github.com" - latestVersionMessage = "Installed flytectl version is the latest" - upgradeVersionMessage = "A newer version of flytectl is available [%v] Please upgrade using - https://docs.flyte.org/projects/flytectl/en/latest/index.html" + flytectlAppName = "flytectl" + controlPlanAppName = "controlPlane" ) -var flytectlReleasePath = "/repos/flyteorg/flytectl/releases/latest" - type versionOutput struct { // Specifies the Name of app App string `json:"App,omitempty"` @@ -53,22 +52,20 @@ func GetVersionCommand(rootCmd *cobra.Command) map[string]cmdCore.CommandEntry { } func getVersion(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - latest, err := getLatestVersion(flytectlReleasePath) - if err != nil { - logger.Errorf(ctx, "Get latest version of flyte got failed", err) - } - - isGreater, err := util.IsVersionGreaterThan(latest, stdlibversion.Version) + goos := platformutil.Platform(runtime.GOOS) + version, err := githubutil.FlytectlReleaseConfig.GetLatestVersion() if err != nil { - logger.Errorf(ctx, "Error while comparing the flytectl version", err) + logger.Error(ctx, "Not able to get latest version because %v", err) + } else { + message, err := githubutil.GetUpgradeMessage(version, goos) + if err != nil { + logger.Error(ctx, "Not able to detect new version because %v", err) + } + if len(message) > 0 { + fmt.Println(message) + } } - message := latestVersionMessage - if isGreater { - message = fmt.Sprintf(upgradeVersionMessage, latest) - } - - fmt.Println(message) // Print Flytectl if err := printVersion(versionOutput{ Build: stdlibversion.Build, @@ -111,11 +108,3 @@ func getControlPlaneVersion(ctx context.Context, cmdCtx cmdCore.CommandContext) } return nil } - -func getLatestVersion(path string) (string, error) { - response, err := util.GetRequest(GithubAPIURL, path) - if err != nil { - return "", err - } - return util.ParseGithubTag(response) -} diff --git a/flytectl/cmd/version/version_test.go b/flytectl/cmd/version/version_test.go index 08681819b0..cd9065258f 100644 --- a/flytectl/cmd/version/version_test.go +++ b/flytectl/cmd/version/version_test.go @@ -66,6 +66,21 @@ func TestVersionCommandFunc(t *testing.T) { mockClient.AssertCalled(t, "GetVersion", ctx, versionRequest) } +func TestVersionCommandFuncError(t *testing.T) { + ctx := context.Background() + var args []string + mockClient := new(mocks.AdminServiceClient) + mockOutStream := new(io.Writer) + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + stdlibversion.Build = "" + stdlibversion.BuildTime = "" + stdlibversion.Version = "v" + mockClient.OnGetVersionMatch(ctx, versionRequest).Return(versionResponse, nil) + err := getVersion(ctx, args, cmdCtx) + assert.Nil(t, err) + mockClient.AssertCalled(t, "GetVersion", ctx, versionRequest) +} + func TestVersionCommandFuncErr(t *testing.T) { ctx := context.Background() var args []string @@ -85,11 +100,6 @@ func TestVersionUtilFunc(t *testing.T) { stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = testVersion - t.Run("Get latest release with wrong url", func(t *testing.T) { - tag, err := getLatestVersion("h://api.github.com/repos/flyteorg/flytectreleases/latest") - assert.NotNil(t, err) - assert.Equal(t, len(tag), 0) - }) t.Run("Error in getting control plan version", func(t *testing.T) { ctx := context.Background() mockClient := new(mocks.AdminServiceClient) @@ -103,7 +113,6 @@ func TestVersionUtilFunc(t *testing.T) { ctx := context.Background() mockClient := new(mocks.AdminServiceClient) mockOutStream := new(io.Writer) - flytectlReleasePath = "/release" cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) mockClient.OnGetVersionMatch(ctx, &admin.GetVersionRequest{}).Return(nil, fmt.Errorf("error")) err := getVersion(ctx, []string{}, cmdCtx) diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index 12d6444a10..0afad1c0c0 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -45,3 +45,4 @@ Flytectl noun specify the resource on which the action needs to be performed eg: gen/flytectl_sandbox_status gen/flytectl_sandbox_teardown gen/flytectl_sandbox_exec + gen/flytectl_upgrade diff --git a/flytectl/docs/source/verbs.rst b/flytectl/docs/source/verbs.rst index e9185691cf..eab243c410 100644 --- a/flytectl/docs/source/verbs.rst +++ b/flytectl/docs/source/verbs.rst @@ -15,3 +15,4 @@ Flytectl verbs specify the actions to be performed on the resources like create/ gen/flytectl_config gen/flytectl_sandbox gen/flytectl_version + gen/flytectl_upgrade diff --git a/flytectl/go.mod b/flytectl/go.mod index 438cc0c3b4..d9bdf0a8ef 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -4,6 +4,7 @@ go 1.13 require ( github.com/Microsoft/go-winio v0.5.0 // indirect + github.com/avast/retry-go v3.0.0+incompatible github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/containerd/containerd v1.5.2 // indirect github.com/disiqueira/gotree v1.0.0 @@ -14,35 +15,42 @@ require ( github.com/flyteorg/flytestdlib v0.3.30 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 - github.com/google/go-cmp v0.5.6 // indirect github.com/google/go-github v17.0.0+incompatible + github.com/google/go-github/v37 v37.0.0 github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.2.0 github.com/gorilla/mux v1.8.0 // indirect github.com/hashicorp/go-version v1.3.0 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 - github.com/kr/text v0.2.0 // indirect github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 github.com/manifoldco/promptui v0.8.0 - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mattn/go-isatty v0.0.13 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect github.com/mitchellh/mapstructure v1.4.1 github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect github.com/morikuni/aec v1.0.0 // indirect - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/mouuff/go-rocket-update v1.5.1 + github.com/olekukonko/tablewriter v0.0.5 github.com/opencontainers/image-spec v1.0.1 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 + github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.8.0 github.com/spf13/cobra v1.1.3 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.7.0 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 github.com/zalando/go-keyring v0.1.1 + golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect + golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect google.golang.org/grpc v1.36.0 google.golang.org/protobuf v1.25.0 - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect gotest.tools v2.2.0+incompatible + k8s.io/api v0.21.3 + k8s.io/apimachinery v0.21.3 + k8s.io/client-go v0.21.3 sigs.k8s.io/yaml v1.2.0 ) diff --git a/flytectl/go.sum b/flytectl/go.sum index 15ee968a20..4633260946 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -122,6 +122,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= +github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= @@ -337,6 +339,7 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= +github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= @@ -448,9 +451,13 @@ github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v37 v37.0.0 h1:rCspN8/6kB1BAJWZfuafvHhyfIo5fkAulaP/3bOQ/tM= +github.com/google/go-github/v37 v37.0.0/go.mod h1:LM7in3NmXDrX58GbEHy7FtNLbI2JijX93RnMKvWG3m4= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -478,6 +485,7 @@ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -540,6 +548,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -557,6 +566,7 @@ github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= @@ -567,6 +577,8 @@ github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 h1:M8exrBzuhWcU6aoHJlHWPe4qFjVKzkMGRal78f5jRRU= github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23/go.mod h1:kBSna6b0/RzsOcOZf515vAXwSsXYusl2U7SA0XP09yI= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -612,11 +624,13 @@ github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= +github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= @@ -644,12 +658,16 @@ github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/f github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mouuff/go-rocket-update v1.5.1 h1:qGgUu/MP+aVQ63laEguRNimmNTPKs29xz0lZW6QRFaQ= +github.com/mouuff/go-rocket-update v1.5.1/go.mod h1:CnOyUYCxAJyC1g1mebSGC7gJysLTlX+RpxKgD1B0zLs= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -669,11 +687,14 @@ github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -681,12 +702,14 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -788,6 +811,8 @@ github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3x github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -940,8 +965,10 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1024,6 +1051,7 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1122,10 +1150,16 @@ golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492 h1:Paq34FxTluEPvVyayQqMPgHm+vTOrIifmcYxFBx9TLg= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1139,8 +1173,9 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1339,6 +1374,7 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= @@ -1349,6 +1385,7 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -1382,20 +1419,24 @@ k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.21.3 h1:cblWILbLO8ar+Fj6xdDGr603HRsf8Wu9E9rngJeprZQ= +k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg= k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6 h1:R5p3SlhaABYShQSO6LpPsYHjV05Q+79eBUR0Ut/f4tk= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apimachinery v0.21.3 h1:3Ju4nvjCngxxMYby0BimUk+pQHPOQp3eCGChk5kfVII= +k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6 h1:nJZOfolnsVtDtbGJNCxzOtKUAu7zvXjB8+pMo9UNxZo= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/client-go v0.21.3 h1:J9nxZTOmvkInRDCzcSNQmPJbDYN/PjlxXT9Mos3HcLg= +k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= @@ -1406,10 +1447,14 @@ k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= +k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= @@ -1418,6 +1463,8 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyz sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/flytectl/pkg/configutil/configutil_test.go b/flytectl/pkg/configutil/configutil_test.go index f65c8706e7..6908f06144 100644 --- a/flytectl/pkg/configutil/configutil_test.go +++ b/flytectl/pkg/configutil/configutil_test.go @@ -5,8 +5,6 @@ import ( "os" "testing" - "github.com/flyteorg/flytectl/pkg/util" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/stretchr/testify/assert" ) @@ -41,8 +39,6 @@ func TestSetupFlytectlConfig(t *testing.T) { if os.IsNotExist(err) { _ = os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), 0755) } - err = util.SetupFlyteDir() - assert.Nil(t, err) err = SetupConfig("version.yaml", AdminConfigTemplate, templateValue) assert.Nil(t, err) _, err = os.Stat("version.yaml") diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 7e317d4878..3e1d55e46c 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -11,8 +11,6 @@ import ( "github.com/flyteorg/flytectl/clierrors" - "github.com/flyteorg/flytectl/pkg/configutil" - "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" @@ -25,7 +23,7 @@ import ( var ( Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") - SuccessMessage = "Flyte is ready! Flyte UI is available at http://localhost:30081/console" + SuccessMessage = "Deploying Flyte..." ImageName = "cr.flyte.org/flyteorg/flyte-sandbox:dind" FlyteSandboxClusterName = "flyte-sandbox" Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} @@ -122,11 +120,6 @@ func StartContainer(ctx context.Context, cli Docker, volumes []mount.Mount, expo return resp.ID, nil } -// WatchError will return channel for watching errors of a container -func WatchError(ctx context.Context, cli Docker, id string) (<-chan container.ContainerWaitOKBody, <-chan error) { - return cli.ContainerWait(ctx, id, container.WaitConditionNotRunning) -} - // ReadLogs will return io scanner for reading the logs of a container func ReadLogs(ctx context.Context, cli Docker, id string) (*bufio.Scanner, error) { reader, err := cli.ContainerLogs(ctx, id, types.ContainerLogsOptions{ @@ -145,19 +138,6 @@ func ReadLogs(ctx context.Context, cli Docker, id string) (*bufio.Scanner, error func WaitForSandbox(reader *bufio.Scanner, message string) bool { for reader.Scan() { if strings.Contains(reader.Text(), message) { - kubeconfig := strings.Join([]string{ - "$KUBECONFIG", - f.FilePathJoin(f.UserHomeDir(), ".kube", "config"), - Kubeconfig, - }, ":") - - fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, message, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) - fmt.Printf("Please visit https://github.com/flyteorg/flytesnacks for more example %v \n", emoji.Rocket) - fmt.Printf("Register all flytesnacks example by running 'flytectl register examples -d development -p flytesnacks' \n") - - fmt.Printf("Add KUBECONFIG and FLYTECTL_CONFIG to your environment variable \n") - fmt.Printf("export KUBECONFIG=%v \n", kubeconfig) - fmt.Printf("export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) return true } fmt.Println(reader.Text()) diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 25e67bad43..5aa2b34896 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -8,9 +8,10 @@ import ( "strings" "testing" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" + "github.com/docker/docker/api/types/container" "github.com/flyteorg/flytectl/pkg/docker/mocks" - "github.com/flyteorg/flytectl/pkg/util" "github.com/stretchr/testify/mock" "github.com/docker/docker/api/types" @@ -28,7 +29,10 @@ var ( func setupSandbox() { mockAdminClient := u.MockClient cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) - _ = util.SetupFlyteDir() + err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), os.ModePerm) + if err != nil { + fmt.Println(err) + } container1 := types.Container{ ID: "FlyteSandboxClusterName", Names: []string{ @@ -198,17 +202,6 @@ func TestStartContainer(t *testing.T) { }) } -func TestWatchError(t *testing.T) { - setupSandbox() - mockDocker := &mocks.Docker{} - context := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker.OnContainerWaitMatch(context, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err := WatchError(context, mockDocker, "test") - assert.NotNil(t, err) -} - func TestReadLogs(t *testing.T) { setupSandbox() diff --git a/flytectl/pkg/k8s/k8s.go b/flytectl/pkg/k8s/k8s.go new file mode 100644 index 0000000000..f17082dbe0 --- /dev/null +++ b/flytectl/pkg/k8s/k8s.go @@ -0,0 +1,33 @@ +package k8s + +import ( + "os" + + "github.com/pkg/errors" + "k8s.io/client-go/kubernetes" + corev1 "k8s.io/client-go/kubernetes/typed/core/v1" + "k8s.io/client-go/tools/clientcmd" +) + +type K8s interface { + CoreV1() corev1.CoreV1Interface +} + +var Client K8s + +// GetK8sClient return the k8s client from sandbox kubeconfig +func GetK8sClient(cfg, master string) (K8s, error) { + kubeConfigPath := os.ExpandEnv(cfg) + kubecfg, err := clientcmd.BuildConfigFromFlags(master, kubeConfigPath) + if err != nil { + return nil, errors.Wrapf(err, "Error building kubeconfig") + } + if Client == nil { + kubeClient, err := kubernetes.NewForConfig(kubecfg) + if err != nil { + return nil, errors.Wrapf(err, "Error building kubernetes clientset") + } + return kubeClient, nil + } + return Client, nil +} diff --git a/flytectl/pkg/k8s/k8s_test.go b/flytectl/pkg/k8s/k8s_test.go new file mode 100644 index 0000000000..0cf3db31bb --- /dev/null +++ b/flytectl/pkg/k8s/k8s_test.go @@ -0,0 +1,65 @@ +package k8s + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" + testclient "k8s.io/client-go/kubernetes/fake" +) + +func TestGetK8sClient(t *testing.T) { + content := ` +apiVersion: v1 +clusters: +- cluster: + server: https://localhost:8080 + extensions: + - name: client.authentication.k8s.io/exec + extension: + audience: foo + other: bar + name: foo-cluster +contexts: +- context: + cluster: foo-cluster + user: foo-user + namespace: bar + name: foo-context +current-context: foo-context +kind: Config +users: +- name: foo-user + user: + exec: + apiVersion: client.authentication.k8s.io/v1alpha1 + args: + - arg-1 + - arg-2 + command: foo-command + provideClusterInfo: true +` + tmpfile, err := ioutil.TempFile("", "kubeconfig") + if err != nil { + t.Error(err) + } + defer os.Remove(tmpfile.Name()) + if err := ioutil.WriteFile(tmpfile.Name(), []byte(content), os.ModePerm); err != nil { + t.Error(err) + } + t.Run("Create client from config", func(t *testing.T) { + client := testclient.NewSimpleClientset() + Client = client + c, err := GetK8sClient(tmpfile.Name(), "https://localhost:8080") + assert.Nil(t, err) + assert.NotNil(t, c) + }) + t.Run("Create client from config", func(t *testing.T) { + Client = nil + client, err := GetK8sClient(tmpfile.Name(), "https://localhost:8080") + assert.Nil(t, err) + assert.NotNil(t, client) + }) + +} diff --git a/flytectl/pkg/util/githubutil/githubutil.go b/flytectl/pkg/util/githubutil/githubutil.go new file mode 100644 index 0000000000..c3ed9b8b52 --- /dev/null +++ b/flytectl/pkg/util/githubutil/githubutil.go @@ -0,0 +1,156 @@ +package githubutil + +import ( + "context" + "path/filepath" + "runtime" + "strings" + + "github.com/flyteorg/flytectl/pkg/util/platformutil" + stdlibversion "github.com/flyteorg/flytestdlib/version" + "github.com/mouuff/go-rocket-update/pkg/provider" + "github.com/mouuff/go-rocket-update/pkg/updater" + + "github.com/flyteorg/flytectl/pkg/util" + + "fmt" + "io/ioutil" + + "github.com/google/go-github/v37/github" +) + +const ( + owner = "flyteorg" + flyte = "flyte" + sandboxManifest = "flyte_sandbox_manifest.yaml" + flytectl = "flytectl" + flytectlRepository = "github.com/flyteorg/flytectl" + commonMessage = "\n A new release of flytectl is available: %s → %s \n" + brewMessage = "To upgrade, run: brew update && brew upgrade flytectl \n" + linuxMessage = "To upgrade, run: flytectl upgrade \n" + darwinMessage = "To upgrade, run: flytectl upgrade \n" + releaseURL = "https://github.com/flyteorg/flytectl/releases/tag/%s \n" + brewInstallDirectory = "/Cellar/flytectl" +) + +// FlytectlReleaseConfig represent the updater config for flytectl binary +var FlytectlReleaseConfig = &updater.Updater{ + Provider: &provider.Github{ + RepositoryURL: flytectlRepository, + ArchiveName: getFlytectlAssetName(), + }, + ExecutableName: flytectl, + Version: stdlibversion.Version, +} + +var ( + arch = platformutil.Arch(runtime.GOARCH) +) + +// GetLatestVersion returns the latest version of provided repository +func GetLatestVersion(repository string) (*github.RepositoryRelease, error) { + client := github.NewClient(nil) + release, _, err := client.Repositories.GetLatestRelease(context.Background(), owner, repository) + if err != nil { + return nil, err + } + return release, err +} + +func getFlytectlAssetName() string { + if arch == platformutil.ArchAmd64 { + arch = platformutil.ArchX86 + } else if arch == platformutil.ArchX86 { + arch = platformutil.Archi386 + } + return fmt.Sprintf("flytectl_%s_%s.tar.gz", strings.Title(runtime.GOOS), arch.String()) +} + +// CheckVersionExist returns the provided version release if version exist in repository +func CheckVersionExist(version, repository string) (*github.RepositoryRelease, error) { + client := github.NewClient(nil) + release, _, err := client.Repositories.GetReleaseByTag(context.Background(), owner, repository, version) + if err != nil { + return nil, err + } + return release, err +} + +// GetAssetsFromRelease returns the asset from github release +func GetAssetsFromRelease(version, assets, repository string) (*github.ReleaseAsset, error) { + release, err := CheckVersionExist(version, repository) + if err != nil { + return nil, err + } + for _, v := range release.Assets { + if v.GetName() == assets { + return v, nil + } + } + return nil, fmt.Errorf("assest is not found in %s[%s] release", repository, version) +} + +// GetFlyteManifest will write the flyte manifest in a file +func GetFlyteManifest(version string, target string) error { + asset, err := GetAssetsFromRelease(version, sandboxManifest, flyte) + if err != nil { + return err + } + response, err := util.SendRequest("GET", asset.GetBrowserDownloadURL(), nil) + if err != nil { + return err + } + defer response.Body.Close() + data, err := ioutil.ReadAll(response.Body) + if err != nil { + return err + } + if err := util.WriteIntoFile(data, target); err != nil { + return err + } + return nil + +} + +// GetUpgradeMessage return the upgrade message +func GetUpgradeMessage(latest string, goos platformutil.Platform) (string, error) { + isGreater, err := util.IsVersionGreaterThan(latest, stdlibversion.Version) + if err != nil { + return "", err + } + message := fmt.Sprintf(commonMessage, stdlibversion.Version, latest) + if isGreater { + symlink, err := CheckBrewInstall(goos) + if err != nil { + return "", err + } + if len(symlink) > 0 { + message += brewMessage + } else if goos == platformutil.Darwin { + message += darwinMessage + } else if goos == platformutil.Linux { + message += linuxMessage + } + message += fmt.Sprintf(releaseURL, latest) + } + + return message, nil +} + +// CheckBrewInstall returns the path of symlink if flytectl is installed from brew +func CheckBrewInstall(goos platformutil.Platform) (string, error) { + if goos.String() == platformutil.Darwin.String() { + executable, err := FlytectlReleaseConfig.GetExecutable() + if err != nil { + return executable, err + } + if symlink, err := filepath.EvalSymlinks(executable); err != nil { + return symlink, err + } else if len(symlink) > 0 { + if strings.Contains(symlink, brewInstallDirectory) { + return symlink, nil + } + } + } + return "", nil +} diff --git a/flytectl/pkg/util/githubutil/githubutil_test.go b/flytectl/pkg/util/githubutil/githubutil_test.go new file mode 100644 index 0000000000..05566121b9 --- /dev/null +++ b/flytectl/pkg/util/githubutil/githubutil_test.go @@ -0,0 +1,127 @@ +package githubutil + +import ( + "fmt" + "runtime" + "strings" + "testing" + + stdlibversion "github.com/flyteorg/flytestdlib/version" + + "github.com/flyteorg/flytectl/pkg/util/platformutil" + + "github.com/stretchr/testify/assert" +) + +func TestGetLatestVersion(t *testing.T) { + t.Run("Get latest release with wrong url", func(t *testing.T) { + _, err := GetLatestVersion("fl") + assert.NotNil(t, err) + }) + t.Run("Get latest release", func(t *testing.T) { + _, err := GetLatestVersion("flytectl") + assert.Nil(t, err) + }) +} + +func TestGetLatestRelease(t *testing.T) { + release, err := GetLatestVersion("flyte") + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(release.GetTagName(), "v")) +} + +func TestCheckVersionExist(t *testing.T) { + t.Run("Invalid Tag", func(t *testing.T) { + _, err := CheckVersionExist("v100.0.0", "flyte") + assert.NotNil(t, err) + }) + t.Run("Valid Tag", func(t *testing.T) { + release, err := CheckVersionExist("v0.15.0", "flyte") + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(release.GetTagName(), "v")) + }) +} + +func TestGetAssetsFromRelease(t *testing.T) { + t.Run("Successful get assets", func(t *testing.T) { + assets, err := GetAssetsFromRelease("v0.15.0", sandboxManifest, flyte) + assert.Nil(t, err) + assert.NotNil(t, assets) + assert.Equal(t, sandboxManifest, *assets.Name) + }) + + t.Run("Failed get assets with wrong name", func(t *testing.T) { + assets, err := GetAssetsFromRelease("v0.15.0", "test", flyte) + assert.NotNil(t, err) + assert.Nil(t, assets) + }) + t.Run("Successful get assets with wrong version", func(t *testing.T) { + assets, err := GetAssetsFromRelease("v100.15.0", "test", flyte) + assert.NotNil(t, err) + assert.Nil(t, assets) + }) +} + +func TestGetFlyteManifest(t *testing.T) { + t.Run("Successful get manifest", func(t *testing.T) { + err := GetFlyteManifest("v0.15.0", "test.yaml") + assert.Nil(t, err) + }) + t.Run("Failed get manifest with wrong name", func(t *testing.T) { + err := GetFlyteManifest("v100.15.0", "test.yaml") + assert.NotNil(t, err) + }) + t.Run("Failed get manifest with wrong name", func(t *testing.T) { + err := GetFlyteManifest("v0.12.0", "test.yaml") + assert.NotNil(t, err) + }) +} + +func TestGetAssetsName(t *testing.T) { + t.Run("Get Assets name", func(t *testing.T) { + expected := fmt.Sprintf("flytectl_%s_386.tar.gz", strings.Title(runtime.GOOS)) + arch = platformutil.Arch386 + assert.Equal(t, expected, getFlytectlAssetName()) + }) +} + +func TestCheckBrewInstall(t *testing.T) { + symlink, err := CheckBrewInstall(platformutil.Darwin) + assert.Nil(t, err) + assert.Equal(t, len(symlink), 0) + symlink, err = CheckBrewInstall(platformutil.Linux) + assert.Nil(t, err) + assert.Equal(t, 0, len(symlink)) +} + +func TestGetUpgradeMessage(t *testing.T) { + var darwin = platformutil.Darwin + var linux = platformutil.Linux + var windows = platformutil.Linux + + var version = "v0.2.20" + stdlibversion.Version = "v0.2.10" + message, err := GetUpgradeMessage(version, darwin) + assert.Nil(t, err) + assert.Equal(t, 157, len(message)) + + version = "v0.2.09" + message, err = GetUpgradeMessage(version, darwin) + assert.Nil(t, err) + assert.Equal(t, 63, len(message)) + + version = "v" + message, err = GetUpgradeMessage(version, darwin) + assert.NotNil(t, err) + assert.Equal(t, 0, len(message)) + + version = "v0.2.20" + message, err = GetUpgradeMessage(version, windows) + assert.Nil(t, err) + assert.Equal(t, 157, len(message)) + + version = "v0.2.20" + message, err = GetUpgradeMessage(version, linux) + assert.Nil(t, err) + assert.Equal(t, 157, len(message)) +} diff --git a/flytectl/pkg/util/platformutil/platformutil.go b/flytectl/pkg/util/platformutil/platformutil.go new file mode 100644 index 0000000000..064a6d8e14 --- /dev/null +++ b/flytectl/pkg/util/platformutil/platformutil.go @@ -0,0 +1,26 @@ +package platformutil + +type Arch string + +const ( + ArchAmd64 Arch = "amd64" + ArchX86 Arch = "x86_64" + Arch386 Arch = "386" + Archi386 Arch = "i386" +) + +func (a Arch) String() string { + return string(a) +} + +type Platform string + +const ( + Windows Platform = "windows" + Linux Platform = "linux" + Darwin Platform = "darwin" +) + +func (p Platform) String() string { + return string(p) +} diff --git a/flytectl/pkg/util/platformutil/platformutil_test.go b/flytectl/pkg/util/platformutil/platformutil_test.go new file mode 100644 index 0000000000..8c7ee7f81d --- /dev/null +++ b/flytectl/pkg/util/platformutil/platformutil_test.go @@ -0,0 +1,39 @@ +package platformutil + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestArch(t *testing.T) { + var amd64 = ArchAmd64 + assert.NotNil(t, amd64) + assert.Equal(t, "amd64", amd64.String()) + + var arch386 = Arch386 + assert.NotNil(t, arch386) + assert.Equal(t, "386", arch386.String()) + + var i386 = Archi386 + assert.NotNil(t, i386) + assert.Equal(t, "i386", i386.String()) + + var x8664 = ArchX86 + assert.NotNil(t, x8664) + assert.Equal(t, "x86_64", x8664.String()) +} + +func TestGoosEnum(t *testing.T) { + var linux = Linux + assert.NotNil(t, linux) + assert.Equal(t, "linux", linux.String()) + + var windows = Windows + assert.NotNil(t, windows) + assert.Equal(t, "windows", windows.String()) + + var darwin = Darwin + assert.NotNil(t, darwin) + assert.Equal(t, "darwin", darwin.String()) +} diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index fe972ed2d8..99a2408458 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -1,49 +1,27 @@ package util import ( - "encoding/json" "fmt" + "io" "io/ioutil" "net/http" "os" + "strings" + "github.com/enescakir/emoji" + "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flytectl/pkg/docker" f "github.com/flyteorg/flytectl/pkg/filesystemutils" hversion "github.com/hashicorp/go-version" ) const ( - HTTPRequestErrorMessage = "something went wrong. Received status code [%v] while sending a request to [%s]" + progressSuccessMessage = "Flyte is ready! Flyte UI is available at http://localhost:30081/console" ) -type githubversion struct { - TagName string `json:"tag_name"` -} - -func GetRequest(baseURL, url string) ([]byte, error) { - response, err := http.Get(fmt.Sprintf("%s%s", baseURL, url)) - if err != nil { - return []byte(""), err - } - defer response.Body.Close() - if response.StatusCode == 200 { - data, err := ioutil.ReadAll(response.Body) - if err != nil { - return []byte(""), err - } - return data, nil - } - return []byte(""), fmt.Errorf(HTTPRequestErrorMessage, response.StatusCode, fmt.Sprintf("%s%s", baseURL, url)) -} - -func ParseGithubTag(data []byte) (string, error) { - var result = githubversion{} - err := json.Unmarshal(data, &result) - if err != nil { - return "", err - } - return result.TagName, nil -} +var Ext string +// WriteIntoFile will write content in a file func WriteIntoFile(data []byte, file string) error { err := ioutil.WriteFile(file, data, os.ModePerm) if err != nil { @@ -60,6 +38,7 @@ func SetupFlyteDir() error { return nil } +// IsVersionGreaterThan check version if it's greater then other func IsVersionGreaterThan(version1, version2 string) (bool, error) { semanticVersion1, err := hversion.NewVersion(version1) if err != nil { @@ -71,3 +50,31 @@ func IsVersionGreaterThan(version1, version2 string) (bool, error) { } return semanticVersion2.LessThanOrEqual(semanticVersion1), nil } + +// PrintSandboxMessage will print sandbox success message +func PrintSandboxMessage() { + kubeconfig := strings.Join([]string{ + "$KUBECONFIG", + f.FilePathJoin(f.UserHomeDir(), ".kube", "config"), + docker.Kubeconfig, + }, ":") + + fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, progressSuccessMessage, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) + fmt.Printf("Add KUBECONFIG and FLYTECTL_CONFIG to your environment variable \n") + fmt.Printf("export KUBECONFIG=%v \n", kubeconfig) + fmt.Printf("export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) +} + +// SendRequest will create request and return the response +func SendRequest(method, url string, option io.Reader) (*http.Response, error) { + client := &http.Client{} + req, _ := http.NewRequest(method, url, option) + response, err := client.Do(req) + if err != nil { + return nil, err + } + if response.StatusCode != 200 { + return nil, fmt.Errorf("someting goes wrong while sending request to %s. Got status code %v", url, response.StatusCode) + } + return response, nil +} diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index 43bb8166c1..bbb84b3e33 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -6,52 +6,16 @@ import ( "github.com/stretchr/testify/assert" ) -const flytectlReleaseURL = "/repos/flyteorg/flytectl/releases/latest" -const baseURL = "https://api.github.com" -const wrongBaseURL = "htts://api.github.com" const testVersion = "v0.1.20" -func TestGetRequest(t *testing.T) { - t.Run("Get request with 200", func(t *testing.T) { - _, err := GetRequest(baseURL, flytectlReleaseURL) - assert.Nil(t, err) - }) - t.Run("Get request with 200", func(t *testing.T) { - _, err := GetRequest(wrongBaseURL, flytectlReleaseURL) - assert.NotNil(t, err) - }) - t.Run("Get request with 400", func(t *testing.T) { - _, err := GetRequest("https://github.com", "/flyteorg/flyte/releases/download/latest/flyte_eks_manifest.yaml") - assert.NotNil(t, err) - }) -} - -func TestParseGithubTag(t *testing.T) { - t.Run("Parse Github tag with success", func(t *testing.T) { - data, err := GetRequest(baseURL, flytectlReleaseURL) - assert.Nil(t, err) - tag, err := ParseGithubTag(data) - assert.Nil(t, err) - assert.Contains(t, tag, "v") - }) - t.Run("Get request with 200", func(t *testing.T) { - _, err := ParseGithubTag([]byte("string")) - assert.NotNil(t, err) - }) -} - func TestWriteIntoFile(t *testing.T) { t.Run("Successfully write into a file", func(t *testing.T) { - data, err := GetRequest(baseURL, flytectlReleaseURL) - assert.Nil(t, err) - err = WriteIntoFile(data, "version.yaml") + err := WriteIntoFile([]byte(""), "version.yaml") assert.Nil(t, err) }) t.Run("Error in writing file", func(t *testing.T) { - data, err := GetRequest(baseURL, flytectlReleaseURL) + err := WriteIntoFile([]byte(""), "version.yaml") assert.Nil(t, err) - err = WriteIntoFile(data, "/githubtest/version.yaml") - assert.NotNil(t, err) }) } @@ -87,3 +51,27 @@ func TestIsVersionGreaterThan(t *testing.T) { assert.NotNil(t, err) }) } + +func TestPrintSandboxMessage(t *testing.T) { + t.Run("Print Sandbox Message", func(t *testing.T) { + PrintSandboxMessage() + }) +} + +func TestSendRequest(t *testing.T) { + t.Run("Successful get request", func(t *testing.T) { + response, err := SendRequest("GET", "https://github.com", nil) + assert.Nil(t, err) + assert.NotNil(t, response) + }) + t.Run("Successful get request failed", func(t *testing.T) { + response, err := SendRequest("GET", "htp://github.com", nil) + assert.NotNil(t, err) + assert.Nil(t, response) + }) + t.Run("Successful get request failed", func(t *testing.T) { + response, err := SendRequest("GET", "https://github.com/evalsocket/flyte/archive/refs/tags/source-code.zip", nil) + assert.NotNil(t, err) + assert.Nil(t, response) + }) +} From c98c23c20abfa6f33b374a8e9868de8f076bd98a Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Wed, 18 Aug 2021 06:17:50 -0700 Subject: [PATCH 126/645] Update Flyteidl version (#160) --- flytectl/go.mod | 6 +++--- flytectl/go.sum | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index d9bdf0a8ef..337544ee91 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -11,8 +11,8 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.19.14 - github.com/flyteorg/flytestdlib v0.3.30 + github.com/flyteorg/flyteidl v0.19.24 + github.com/flyteorg/flytestdlib v0.3.33 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 github.com/google/go-github v17.0.0+incompatible @@ -47,7 +47,7 @@ require ( google.golang.org/grpc v1.36.0 google.golang.org/protobuf v1.25.0 gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b gotest.tools v2.2.0+incompatible k8s.io/api v0.21.3 k8s.io/apimachinery v0.21.3 diff --git a/flytectl/go.sum b/flytectl/go.sum index 4633260946..85a4f86cb4 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -345,11 +345,11 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.19.14 h1:OLg2eT9uYllcfMMjEZJoXQ+2WXcrNbUxD+yaCrz2AlI= -github.com/flyteorg/flyteidl v0.19.14/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.19.24 h1:aiBKTFNKZpIvOfcI051I33LnhQl54N3dhkaubucOg+E= +github.com/flyteorg/flyteidl v0.19.24/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= -github.com/flyteorg/flytestdlib v0.3.30 h1:cBsphk2PGyhSM6BFJBR1whO9DZ907NjUeWQLsBrm0/g= -github.com/flyteorg/flytestdlib v0.3.30/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= +github.com/flyteorg/flytestdlib v0.3.33 h1:+oCx3zXUIldL7CWmNMD7PMFPXvGqaPgYkSKn9wB6qvY= +github.com/flyteorg/flytestdlib v0.3.33/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= From 5e453441eff4d07ce4a879064de3937592b9d8e1 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Wed, 18 Aug 2021 06:56:59 -0700 Subject: [PATCH 127/645] Update documentation (#159) Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- flytectl/docs/source/gen/flytectl.rst | 5 +- .../docs/source/gen/flytectl_completion.rst | 4 +- flytectl/docs/source/gen/flytectl_config.rst | 4 +- .../source/gen/flytectl_config_discover.rst | 4 +- .../docs/source/gen/flytectl_config_init.rst | 4 +- .../source/gen/flytectl_config_validate.rst | 4 +- flytectl/docs/source/gen/flytectl_create.rst | 4 +- .../source/gen/flytectl_create_execution.rst | 4 +- .../source/gen/flytectl_create_project.rst | 4 +- flytectl/docs/source/gen/flytectl_delete.rst | 4 +- ...ectl_delete_cluster-resource-attribute.rst | 4 +- ...lytectl_delete_execution-cluster-label.rst | 4 +- ...tectl_delete_execution-queue-attribute.rst | 4 +- .../source/gen/flytectl_delete_execution.rst | 4 +- .../gen/flytectl_delete_plugin-override.rst | 4 +- ...lytectl_delete_task-resource-attribute.rst | 4 +- ...tectl_delete_workflow-execution-config.rst | 4 +- flytectl/docs/source/gen/flytectl_get.rst | 4 +- ...lytectl_get_cluster-resource-attribute.rst | 4 +- .../flytectl_get_execution-cluster-label.rst | 4 +- ...flytectl_get_execution-queue-attribute.rst | 4 +- .../source/gen/flytectl_get_execution.rst | 4 +- .../source/gen/flytectl_get_launchplan.rst | 4 +- .../gen/flytectl_get_plugin-override.rst | 4 +- .../docs/source/gen/flytectl_get_project.rst | 4 +- .../flytectl_get_task-resource-attribute.rst | 4 +- .../docs/source/gen/flytectl_get_task.rst | 4 +- ...flytectl_get_workflow-execution-config.rst | 4 +- .../docs/source/gen/flytectl_get_workflow.rst | 4 +- .../docs/source/gen/flytectl_register.rst | 4 +- .../source/gen/flytectl_register_examples.rst | 4 +- .../source/gen/flytectl_register_files.rst | 4 +- flytectl/docs/source/gen/flytectl_sandbox.rst | 4 +- .../docs/source/gen/flytectl_sandbox_exec.rst | 4 +- .../source/gen/flytectl_sandbox_start.rst | 4 +- .../source/gen/flytectl_sandbox_status.rst | 4 +- .../source/gen/flytectl_sandbox_teardown.rst | 4 +- flytectl/docs/source/gen/flytectl_update.rst | 4 +- ...ectl_update_cluster-resource-attribute.rst | 4 +- ...lytectl_update_execution-cluster-label.rst | 4 +- ...tectl_update_execution-queue-attribute.rst | 4 +- .../source/gen/flytectl_update_launchplan.rst | 4 +- .../gen/flytectl_update_plugin-override.rst | 4 +- .../source/gen/flytectl_update_project.rst | 4 +- ...lytectl_update_task-resource-attribute.rst | 4 +- .../docs/source/gen/flytectl_update_task.rst | 4 +- ...tectl_update_workflow-execution-config.rst | 4 +- .../source/gen/flytectl_update_workflow.rst | 4 +- flytectl/docs/source/gen/flytectl_upgrade.rst | 85 +++++++++++++++++++ flytectl/docs/source/gen/flytectl_version.rst | 4 +- 50 files changed, 233 insertions(+), 49 deletions(-) create mode 100644 flytectl/docs/source/gen/flytectl_upgrade.rst diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 2c4a65ba70..d56aa0fca5 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -48,10 +48,12 @@ Options --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO @@ -65,5 +67,6 @@ SEE ALSO * :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. * :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. * :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`flytectl_upgrade` - Used for upgrade/rollback flyte version * :doc:`flytectl_version` - Used for fetching flyte version diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index 4b0ba9dc4b..24271d7b12 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -96,10 +96,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 27a5a6badf..e835ee9fe9 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -56,10 +56,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 2071952bd5..8550321470 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -60,10 +60,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index c499bf06f5..30b4eb404f 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -81,10 +81,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 5e6adb51fa..51a3a7e443 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -62,10 +62,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index ff986fee7d..de2f4a89d4 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -59,10 +59,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 200f96547e..022e22dff5 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -185,10 +185,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index 83101f6b0d..f5b287a2fa 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -83,10 +83,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index c09e621e10..0af8199dca 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -59,10 +59,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 5b96780560..770ea699ca 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -95,10 +95,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 54d6d04946..918da73e88 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -93,10 +93,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index bfd7e5fb11..7c1e2eb8f6 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -97,10 +97,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 8205564f83..6f5f2d8e5f 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -102,10 +102,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index d57acd3d43..c04b0e1fe3 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -98,10 +98,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 279090fa8b..f0ff59cfbc 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -98,10 +98,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 3af2b6770e..ffb2333bd1 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -93,10 +93,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 255ee9d809..6ccba90bd7 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -59,10 +59,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index 5bdcbe32b0..2be6c9c3a9 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -104,10 +104,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index e2900c17bf..513359e3ce 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -102,10 +102,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index 96ee6eec3e..28c96777db 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -106,10 +106,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 73c266b461..555febfb23 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -126,10 +126,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index ff7687f82a..4c73065fe5 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -144,10 +144,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index ab39c075aa..c30c99e2db 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -126,10 +126,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 57258c080e..ffebba44d6 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -97,10 +97,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index ab0bb8e92d..2385235773 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -108,10 +108,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index e4226e47ee..38db5a9318 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -140,10 +140,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index 8a024786f2..1554f40e6a 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -113,10 +113,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index b3e7ba4aa9..031274ae61 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -128,10 +128,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 39f0212527..e21ebd27c5 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -59,10 +59,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index d6c510092d..a9b5943d56 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -73,10 +73,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 5ee4cea1aa..83447baa09 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -137,10 +137,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 5e54287f2c..3b77cb201e 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -78,10 +78,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index bc187d689f..2f8b53cc81 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -66,10 +66,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index b1901042ef..ed340e35d3 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -79,10 +79,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 368cbf01a8..017b0e0b0f 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -67,10 +67,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index 4961977271..b48d24452f 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -66,10 +66,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 1c1d80ebe5..3336ec4509 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -61,10 +61,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index c85c4ce194..b3a5886a32 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -100,10 +100,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 48d57e94c4..043be798c5 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -93,10 +93,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index c848d08f85..66539e7561 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -104,10 +104,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index a4be4bd225..ae54382190 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -78,10 +78,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 16f2085ddd..1ee6a87f8d 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -106,10 +106,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 22c5c29677..dccc3a9efc 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -92,10 +92,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 36561dd33e..bd02a91ad5 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -106,10 +106,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst index a0b6534663..ee60852b58 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -78,10 +78,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index b83fd90320..ed6856f395 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -96,10 +96,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst index 3b9b698fe1..204e00b614 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -78,10 +78,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst new file mode 100644 index 0000000000..e102c6b901 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -0,0 +1,85 @@ +.. _flytectl_upgrade: + +flytectl upgrade +---------------- + +Used for upgrade/rollback flyte version + +Synopsis +~~~~~~~~ + + + +Upgrade flytectl +:: + + bin/flytectl upgrade + +Rollback flytectl binary +:: + + bin/flytectl upgrade rollback + +Note: Upgrade is not available on windows + + +:: + + flytectl upgrade [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for upgrade + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - flyetcl CLI tool + diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 216543e267..43a1516515 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -63,10 +63,12 @@ Options inherited from parent commands --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO From 3a48b4a546af8ced7ad9b5dca442525e5d7b421b Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Thu, 19 Aug 2021 15:24:45 +0530 Subject: [PATCH 128/645] Bug fix in sandbix start (#161) * Added version compare check and bug fix in sandbox start Signed-off-by: Yuvraj --- flytectl/.github/config.yml | 1 + flytectl/.github/workflows/sandbox.yaml | 3 --- flytectl/boilerplate/flyte/welcome_bot/config.yml | 1 + flytectl/cmd/sandbox/start.go | 4 ++-- flytectl/cmd/upgrade/upgrade.go | 2 ++ flytectl/pkg/util/util.go | 8 ++++++-- flytectl/pkg/util/util_test.go | 5 +++++ 7 files changed, 17 insertions(+), 7 deletions(-) diff --git a/flytectl/.github/config.yml b/flytectl/.github/config.yml index f99bcd78f1..7afe6111f5 100644 --- a/flytectl/.github/config.yml +++ b/flytectl/.github/config.yml @@ -3,6 +3,7 @@ newPRWelcomeComment: > Thank you for opening this pull request! 🙌 These tips will help get your PR across the finish line: + - Most of the repos have a PR template; if not, fill it out to the best of your knowledge. - Sign off your commits (Reference: [DCO Guide](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md)). diff --git a/flytectl/.github/workflows/sandbox.yaml b/flytectl/.github/workflows/sandbox.yaml index 62ba9f783b..cb72047995 100644 --- a/flytectl/.github/workflows/sandbox.yaml +++ b/flytectl/.github/workflows/sandbox.yaml @@ -20,9 +20,6 @@ jobs: key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - name: Build Flytectl binary run: make compile - - name: Setup env - run: | - mkdir -p ~/.flyte/k3s && touch ~/.flyte/k3s/k3s.yaml && chmod 666 ~/.flyte/k3s/k3s.yaml - name: Create a sandbox cluster run: bin/flytectl sandbox start - name: Setup flytectl config diff --git a/flytectl/boilerplate/flyte/welcome_bot/config.yml b/flytectl/boilerplate/flyte/welcome_bot/config.yml index f99bcd78f1..7afe6111f5 100644 --- a/flytectl/boilerplate/flyte/welcome_bot/config.yml +++ b/flytectl/boilerplate/flyte/welcome_bot/config.yml @@ -3,6 +3,7 @@ newPRWelcomeComment: > Thank you for opening this pull request! 🙌 These tips will help get your PR across the finish line: + - Most of the repos have a PR template; if not, fill it out to the best of your knowledge. - Sign off your commits (Reference: [DCO Guide](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md)). diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index b97c3c1dd2..c5559988fe 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -47,7 +47,7 @@ Mount your source code repository inside sandbox bin/flytectl sandbox start --source=$HOME/flyteorg/flytesnacks -Run specific version of flyte, Only available after v0.14.0+ +Run specific version of flyte, Only available after v0.13.0+ :: bin/flytectl sandbox start --version=v0.14.0 @@ -55,7 +55,7 @@ Run specific version of flyte, Only available after v0.14.0+ Usage ` k8sEndpoint = "https://127.0.0.1:30086" - flyteMinimumVersionSupported = "v0.14.0" + flyteMinimumVersionSupported = "v0.13.0" generatedManifest = "/flyteorg/share/flyte_generated.yaml" flyteNamespace = "flyte" diskPressureTaint = "node.kubernetes.io/disk-pressure" diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go index 84f79a915f..54686a1f76 100644 --- a/flytectl/cmd/upgrade/upgrade.go +++ b/flytectl/cmd/upgrade/upgrade.go @@ -32,6 +32,8 @@ Upgrade flytectl bin/flytectl upgrade +Note: Please use upgrade with sudo, Without sudo it will cause permission issue + Rollback flytectl binary :: diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index 99a2408458..416ad58c7f 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -32,7 +32,11 @@ func WriteIntoFile(data []byte, file string) error { // SetupFlyteDir will create .flyte dir if not exist func SetupFlyteDir() error { - if err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), os.ModePerm); err != nil { + if err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm); err != nil { + return err + } + // Created a empty file with right permission + if err := ioutil.WriteFile(docker.Kubeconfig, []byte(""), os.ModePerm); err != nil { return err } return nil @@ -48,7 +52,7 @@ func IsVersionGreaterThan(version1, version2 string) (bool, error) { if err != nil { return false, err } - return semanticVersion2.LessThanOrEqual(semanticVersion1), nil + return semanticVersion1.GreaterThan(semanticVersion2), nil } // PrintSandboxMessage will print sandbox success message diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index bbb84b3e33..c123683e86 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -33,6 +33,11 @@ func TestIsVersionGreaterThan(t *testing.T) { assert.Nil(t, err) assert.Equal(t, true, ok) }) + t.Run("Compare flytectl version greater then for equal value", func(t *testing.T) { + ok, err := IsVersionGreaterThan(testVersion, testVersion) + assert.Nil(t, err) + assert.Equal(t, false, ok) + }) t.Run("Compare flytectl version smaller then", func(t *testing.T) { ok, err := IsVersionGreaterThan("v0.1.19", testVersion) assert.Nil(t, err) From ce15cf05671039adf69789bc4b0548705ad0ec4c Mon Sep 17 00:00:00 2001 From: Dan Rammer Date: Fri, 20 Aug 2021 22:14:20 -0500 Subject: [PATCH 129/645] add --dryRun flag to flytectl subcommands (#163) --- .../attrdeleteconfig_flags.go | 1 + .../attrdeleteconfig_flags_test.go | 14 +++ .../attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 +++ .../clusterresourceattribute/delete_config.go | 1 + .../clusterresourceattribute/update_config.go | 1 + .../subcommand/execution/delete_config.go | 10 ++ .../execution/execdeleteconfig_flags.go | 55 +++++++++ .../execution/execdeleteconfig_flags_test.go | 116 ++++++++++++++++++ .../attrdeleteconfig_flags.go | 1 + .../attrdeleteconfig_flags_test.go | 14 +++ .../attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 +++ .../executionclusterlabel/delete_config.go | 1 + .../executionclusterlabel/update_config.go | 1 + .../attrdeleteconfig_flags.go | 1 + .../attrdeleteconfig_flags_test.go | 14 +++ .../attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 +++ .../executionqueueattribute/delete_config.go | 1 + .../executionqueueattribute/update_config.go | 1 + .../plugin_override/attrdeleteconfig_flags.go | 1 + .../attrdeleteconfig_flags_test.go | 14 +++ .../plugin_override/attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 +++ .../plugin_override/delete_config.go | 1 + .../plugin_override/update_config.go | 1 + .../subcommand/register/files_config.go | 1 + .../subcommand/register/filesconfig_flags.go | 3 +- .../register/filesconfig_flags_test.go | 14 +++ .../attrdeleteconfig_flags.go | 1 + .../attrdeleteconfig_flags_test.go | 14 +++ .../attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 +++ .../taskresourceattribute/delete_config.go | 1 + .../taskresourceattribute/update_config.go | 1 + .../attrdeleteconfig_flags.go | 1 + .../attrdeleteconfig_flags_test.go | 14 +++ .../attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 +++ .../workflowexecutionconfig/delete_config.go | 1 + .../workflowexecutionconfig/update_config.go | 1 + flytectl/cmd/create/execution.go | 14 ++- flytectl/cmd/create/execution_util.go | 10 ++ flytectl/cmd/create/executionconfig_flags.go | 3 +- .../cmd/create/executionconfig_flags_test.go | 14 +++ flytectl/cmd/create/project.go | 28 +++-- flytectl/cmd/create/projectconfig_flags.go | 1 + .../cmd/create/projectconfig_flags_test.go | 14 +++ flytectl/cmd/delete/delete.go | 3 +- flytectl/cmd/delete/execution.go | 25 ++-- .../cmd/delete/matchable_attribute_util.go | 22 ++-- .../matchable_cluster_resource_attribute.go | 2 +- .../matchable_execution_cluster_label.go | 2 +- .../matchable_execution_queue_attribute.go | 2 +- .../cmd/delete/matchable_plugin_override.go | 2 +- .../matchable_task_resource_attribute.go | 2 +- .../matchable_workflow_execution_config.go | 2 +- flytectl/cmd/register/register_util.go | 75 ++++++----- .../cmd/update/matchable_attribute_util.go | 22 ++-- .../matchable_cluster_resource_attribute.go | 2 +- .../matchable_execution_cluster_label.go | 2 +- .../matchable_execution_queue_attribute.go | 2 +- .../cmd/update/matchable_plugin_override.go | 2 +- .../matchable_task_resource_attribute.go | 2 +- .../matchable_workflow_execution_config.go | 2 +- flytectl/cmd/update/named_entity.go | 35 ++++-- .../cmd/update/namedentityconfig_flags.go | 1 + .../update/namedentityconfig_flags_test.go | 14 +++ flytectl/cmd/update/project.go | 20 +-- flytectl/cmd/update/projectconfig_flags.go | 1 + .../cmd/update/projectconfig_flags_test.go | 14 +++ 72 files changed, 627 insertions(+), 104 deletions(-) create mode 100644 flytectl/cmd/config/subcommand/execution/delete_config.go create mode 100755 flytectl/cmd/config/subcommand/execution/execdeleteconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/execution/execdeleteconfig_flags_test.go diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go index 447d2e0471..80c5873993 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags.go @@ -51,5 +51,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.BoolVar(&DefaultDelConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultDelConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go index 63cb34732b..fcf1f72f0c 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrdeleteconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go index 7b19fc93f4..4f05b3a8a8 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go @@ -51,5 +51,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go index 9856912248..29c9328801 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go index 1112003923..e3dab991bf 100644 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/delete_config.go @@ -5,6 +5,7 @@ package clusterresourceattribute // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go index fcbbe04d2a..3727fbdb2a 100644 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go @@ -5,6 +5,7 @@ package clusterresourceattribute // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/execution/delete_config.go b/flytectl/cmd/config/subcommand/execution/delete_config.go new file mode 100644 index 0000000000..f5581f2bdf --- /dev/null +++ b/flytectl/cmd/config/subcommand/execution/delete_config.go @@ -0,0 +1,10 @@ +package execution + +//go:generate pflags ExecDeleteConfig --default-var DefaultExecDeleteConfig --bind-default-var + +var DefaultExecDeleteConfig = &ExecDeleteConfig{} + +// ExecutionDeleteConfig stores the flags required by delete execution +type ExecDeleteConfig struct { + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` +} diff --git a/flytectl/cmd/config/subcommand/execution/execdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/execution/execdeleteconfig_flags.go new file mode 100755 index 0000000000..b882734811 --- /dev/null +++ b/flytectl/cmd/config/subcommand/execution/execdeleteconfig_flags.go @@ -0,0 +1,55 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package execution + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (ExecDeleteConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (ExecDeleteConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (ExecDeleteConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in ExecDeleteConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg ExecDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("ExecDeleteConfig", pflag.ExitOnError) + cmdFlags.BoolVar(&DefaultExecDeleteConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultExecDeleteConfig.DryRun, "execute command without making any modifications.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/execution/execdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/execution/execdeleteconfig_flags_test.go new file mode 100755 index 0000000000..c4d58d13f8 --- /dev/null +++ b/flytectl/cmd/config/subcommand/execution/execdeleteconfig_flags_test.go @@ -0,0 +1,116 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package execution + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsExecDeleteConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementExecDeleteConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsExecDeleteConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookExecDeleteConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementExecDeleteConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_ExecDeleteConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookExecDeleteConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_ExecDeleteConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_ExecDeleteConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_ExecDeleteConfig(val, result)) +} + +func testDecodeRaw_ExecDeleteConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_ExecDeleteConfig(vStringSlice, result)) +} + +func TestExecDeleteConfig_GetPFlagSet(t *testing.T) { + val := ExecDeleteConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestExecDeleteConfig_SetFlags(t *testing.T) { + actual := ExecDeleteConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_ExecDeleteConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go index bbaa014f79..593582469a 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags.go @@ -51,5 +51,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.BoolVar(&DefaultDelConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultDelConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go index 2c669643d9..573e5937b3 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrdeleteconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go index bb592423db..8b1beee0bf 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go @@ -51,5 +51,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go index fa011c6c1b..4712ba314e 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go index cbd1a09018..b0388ed0d5 100644 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/delete_config.go @@ -5,6 +5,7 @@ package executionclusterlabel // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go index ba3e9d3d88..62d853a7cc 100644 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go @@ -5,6 +5,7 @@ package executionclusterlabel // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go index d3ab937c61..a174e908c0 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags.go @@ -51,5 +51,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.BoolVar(&DefaultDelConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultDelConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go index 46875fd457..a2ca3c8004 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrdeleteconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go index ffd725ff3e..cff8301fb7 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go @@ -51,5 +51,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go index fafee300fb..ff19cfa42f 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go index 48dedc581b..c66a5d72e8 100644 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/delete_config.go @@ -5,6 +5,7 @@ package executionqueueattribute // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go index 8dd3e595a4..7826602ab6 100644 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go @@ -5,6 +5,7 @@ package executionqueueattribute // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go index 7003e5e1dd..f2bdb90859 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags.go @@ -51,5 +51,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.BoolVar(&DefaultDelConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultDelConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go index 0129073516..006cfa064b 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrdeleteconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go index 1edf682879..8642031b92 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go @@ -51,5 +51,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go index c23184f43b..84628be5e7 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/plugin_override/delete_config.go b/flytectl/cmd/config/subcommand/plugin_override/delete_config.go index de00f5cf7f..5ae0f08b9d 100644 --- a/flytectl/cmd/config/subcommand/plugin_override/delete_config.go +++ b/flytectl/cmd/config/subcommand/plugin_override/delete_config.go @@ -5,6 +5,7 @@ package pluginoverride // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/plugin_override/update_config.go b/flytectl/cmd/config/subcommand/plugin_override/update_config.go index aa0d9af0b2..8e99970d4b 100644 --- a/flytectl/cmd/config/subcommand/plugin_override/update_config.go +++ b/flytectl/cmd/config/subcommand/plugin_override/update_config.go @@ -5,6 +5,7 @@ package pluginoverride // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/register/files_config.go b/flytectl/cmd/config/subcommand/register/files_config.go index b43232e6c1..c489dd38ed 100644 --- a/flytectl/cmd/config/subcommand/register/files_config.go +++ b/flytectl/cmd/config/subcommand/register/files_config.go @@ -18,4 +18,5 @@ type FilesConfig struct { K8ServiceAccount string `json:"k8ServiceAccount" pflag:", custom kubernetes service account auth role to register launch plans with."` OutputLocationPrefix string `json:"outputLocationPrefix" pflag:", custom output location prefix for offloaded types (files/schemas)."` SourceUploadPath string `json:"sourceUploadPath" pflag:", Location for source code in storage."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go index 9ddea3a547..cd19e456cc 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go @@ -12,7 +12,7 @@ import ( "github.com/spf13/pflag" ) -// If v` is a pointer, it will get its element value or the zero value of the element type. +// If v is a pointer, it will get its element value or the zero value of the element type. // If v is not a pointer, it will return it as is. func (FilesConfig) elemValueOrNil(v interface{}) interface{} { if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { @@ -57,5 +57,6 @@ func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), DefaultFilesConfig.K8ServiceAccount, " custom kubernetes service account auth role to register launch plans with.") cmdFlags.StringVar(&DefaultFilesConfig.OutputLocationPrefix, fmt.Sprintf("%v%v", prefix, "outputLocationPrefix"), DefaultFilesConfig.OutputLocationPrefix, " custom output location prefix for offloaded types (files/schemas).") cmdFlags.StringVar(&DefaultFilesConfig.SourceUploadPath, fmt.Sprintf("%v%v", prefix, "sourceUploadPath"), DefaultFilesConfig.SourceUploadPath, " Location for source code in storage.") + cmdFlags.BoolVar(&DefaultFilesConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultFilesConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go index 9b2340ca5d..951cfbaecc 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go @@ -197,4 +197,18 @@ func TestFilesConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go index d1128e5e9e..2989a37b03 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags.go @@ -51,5 +51,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.BoolVar(&DefaultDelConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultDelConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go index f41f531f3f..d4211ad7cf 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrdeleteconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go index e57de741e7..1a0e3e3a86 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go @@ -51,5 +51,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go index 06f17f631c..2a141e049b 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go index 6d88a180a7..6938c2032b 100644 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/delete_config.go @@ -5,6 +5,7 @@ package taskresourceattribute // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go index 2dd2451e9c..084c65d6d4 100644 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go @@ -5,6 +5,7 @@ package taskresourceattribute // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags.go index a7a7395cce..566789244a 100755 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags.go @@ -51,5 +51,6 @@ func (AttrDeleteConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrDeleteConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrDeleteConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultDelConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultDelConfig.AttrFile, "attribute file name to be used for delete attribute for the resource type.") + cmdFlags.BoolVar(&DefaultDelConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultDelConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags_test.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags_test.go index 5aa3b6ec94..8a6b1b94f4 100755 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrdeleteconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrDeleteConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrDeleteConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go index d13942d393..571daa90d5 100755 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go @@ -51,5 +51,6 @@ func (AttrUpdateConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") + cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go index f9d64c9101..5707cccbc8 100755 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/delete_config.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/delete_config.go index 3604c0971e..2ee094ab9e 100644 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/delete_config.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/delete_config.go @@ -5,6 +5,7 @@ package workflowexecutionconfig // AttrDeleteConfig Matchable resource attributes configuration passed from command line type AttrDeleteConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for delete attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultDelConfig = &AttrDeleteConfig{} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go index 591d354ae4..7fd6a1de64 100644 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go @@ -5,6 +5,7 @@ package workflowexecutionconfig // AttrUpdateConfig Matchable resource attributes configuration passed from command line type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index 5722808888..1c78c6c8d8 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -7,6 +7,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" ) const ( @@ -146,6 +147,7 @@ type ExecutionConfig struct { IamRoleARN string `json:"iamRoleARN" pflag:",iam role ARN AuthRole for launching execution."` Relaunch string `json:"relaunch" pflag:",execution id to be relaunched."` Recover string `json:"recover" pflag:",execution id to be recreated from the last known failure point."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` // Non plfag section is read from the execution config generated by get task/launchplan Workflow string `json:"workflow,omitempty"` Task string `json:"task,omitempty"` @@ -196,10 +198,14 @@ func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.C default: return fmt.Errorf("invalid execution type %v", execParams.execType) } - exec, _err := cmdCtx.AdminClient().CreateExecution(ctx, executionRequest) - if _err != nil { - return _err + if executionConfig.DryRun { + logger.Debugf(ctx, "skipping CreateExecution request (DryRun)") + } else { + exec, _err := cmdCtx.AdminClient().CreateExecution(ctx, executionRequest) + if _err != nil { + return _err + } + fmt.Printf("execution identifier %v\n", exec.Id) } - fmt.Printf("execution identifier %v\n", exec.Id) return nil } diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 639a50c295..0f90c7ccfe 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -10,6 +10,7 @@ import ( cmdGet "github.com/flyteorg/flytectl/cmd/get" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytestdlib/logger" "github.com/google/uuid" "sigs.k8s.io/yaml" ) @@ -93,6 +94,10 @@ func createExecutionRequestForTask(ctx context.Context, taskName string, project func relaunchExecution(ctx context.Context, executionName string, project string, domain string, cmdCtx cmdCore.CommandContext) error { + if executionConfig.DryRun { + logger.Debugf(ctx, "skipping RelaunchExecution request (DryRun)") + return nil + } relaunchedExec, err := cmdCtx.AdminClient().RelaunchExecution(ctx, &admin.ExecutionRelaunchRequest{ Id: &core.WorkflowExecutionIdentifier{ Name: executionName, @@ -109,6 +114,10 @@ func relaunchExecution(ctx context.Context, executionName string, project string func recoverExecution(ctx context.Context, executionName string, project string, domain string, cmdCtx cmdCore.CommandContext) error { + if executionConfig.DryRun { + logger.Debugf(ctx, "skipping RecoverExecution request (DryRun)") + return nil + } recoveredExec, err := cmdCtx.AdminClient().RecoverExecution(ctx, &admin.ExecutionRecoverRequest{ Id: &core.WorkflowExecutionIdentifier{ Name: executionName, @@ -157,6 +166,7 @@ func readExecConfigFromFile(fileName string) (*ExecutionConfig, error) { } func resolveOverrides(toBeOverridden *ExecutionConfig, project string, domain string) { + toBeOverridden.DryRun = executionConfig.DryRun if executionConfig.KubeServiceAcct != "" { toBeOverridden.KubeServiceAcct = executionConfig.KubeServiceAcct } diff --git a/flytectl/cmd/create/executionconfig_flags.go b/flytectl/cmd/create/executionconfig_flags.go index a8d6f541c2..fbfb378627 100755 --- a/flytectl/cmd/create/executionconfig_flags.go +++ b/flytectl/cmd/create/executionconfig_flags.go @@ -56,6 +56,7 @@ func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&executionConfig.KubeServiceAcct, fmt.Sprintf("%v%v", prefix, "kubeServiceAcct"), executionConfig.KubeServiceAcct, "kubernetes service account AuthRole for launching execution.") cmdFlags.StringVar(&executionConfig.IamRoleARN, fmt.Sprintf("%v%v", prefix, "iamRoleARN"), executionConfig.IamRoleARN, "iam role ARN AuthRole for launching execution.") cmdFlags.StringVar(&executionConfig.Relaunch, fmt.Sprintf("%v%v", prefix, "relaunch"), executionConfig.Relaunch, "execution id to be relaunched.") - cmdFlags.StringVar(&executionConfig.Recover, fmt.Sprintf("%v%v", prefix, "recover"), executionConfig.Relaunch, "execution id to be recreated from the last known failure point.") + cmdFlags.StringVar(&executionConfig.Recover, fmt.Sprintf("%v%v", prefix, "recover"), executionConfig.Recover, "execution id to be recreated from the last known failure point.") + cmdFlags.BoolVar(&executionConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), executionConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/create/executionconfig_flags_test.go b/flytectl/cmd/create/executionconfig_flags_test.go index 681816f22c..4ad41018ad 100755 --- a/flytectl/cmd/create/executionconfig_flags_test.go +++ b/flytectl/cmd/create/executionconfig_flags_test.go @@ -197,4 +197,18 @@ func TestExecutionConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/create/project.go b/flytectl/cmd/create/project.go index e7550c6b5f..06c039c529 100644 --- a/flytectl/cmd/create/project.go +++ b/flytectl/cmd/create/project.go @@ -9,6 +9,7 @@ import ( "gopkg.in/yaml.v2" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytestdlib/logger" ) const ( @@ -45,6 +46,7 @@ type ProjectConfig struct { File string `json:"file" pflag:",file for the project definition."` Description string `json:"description" pflag:",description for the project specified as argument."` Labels map[string]string `json:"labels" pflag:",labels for the project specified as argument."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } var ( @@ -77,18 +79,22 @@ func createProjectsCommand(ctx context.Context, args []string, cmdCtx cmdCore.Co if project.Name == "" { return fmt.Errorf("project name is required flag") } - _, err := cmdCtx.AdminClient().RegisterProject(ctx, &admin.ProjectRegisterRequest{ - Project: &admin.Project{ - Id: project.ID, - Name: project.Name, - Description: project.Description, - Labels: &admin.Labels{ - Values: project.Labels, + if projectConfig.DryRun { + logger.Debugf(ctx, "skipping RegisterProject request (DryRun)") + } else { + _, err := cmdCtx.AdminClient().RegisterProject(ctx, &admin.ProjectRegisterRequest{ + Project: &admin.Project{ + Id: project.ID, + Name: project.Name, + Description: project.Description, + Labels: &admin.Labels{ + Values: project.Labels, + }, }, - }, - }) - if err != nil { - return err + }) + if err != nil { + return err + } } fmt.Println("project Created successfully") return nil diff --git a/flytectl/cmd/create/projectconfig_flags.go b/flytectl/cmd/create/projectconfig_flags.go index 55a3eb8eed..b9e0c0607c 100755 --- a/flytectl/cmd/create/projectconfig_flags.go +++ b/flytectl/cmd/create/projectconfig_flags.go @@ -55,5 +55,6 @@ func (cfg ProjectConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&projectConfig.File, fmt.Sprintf("%v%v", prefix, "file"), projectConfig.File, "file for the project definition.") cmdFlags.StringVar(&projectConfig.Description, fmt.Sprintf("%v%v", prefix, "description"), projectConfig.Description, "description for the project specified as argument.") cmdFlags.StringToStringVar(&projectConfig.Labels, fmt.Sprintf("%v%v", prefix, "labels"), projectConfig.Labels, "labels for the project specified as argument.") + cmdFlags.BoolVar(&projectConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), projectConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/create/projectconfig_flags_test.go b/flytectl/cmd/create/projectconfig_flags_test.go index 8d90bc5cd7..e05f201be8 100755 --- a/flytectl/cmd/create/projectconfig_flags_test.go +++ b/flytectl/cmd/create/projectconfig_flags_test.go @@ -169,4 +169,18 @@ func TestProjectConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index 00685feccd..9a489abb65 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -2,6 +2,7 @@ package delete import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" @@ -32,7 +33,7 @@ func RemoteDeleteCommand() *cobra.Command { } terminateResourcesFuncs := map[string]cmdcore.CommandEntry{ "execution": {CmdFunc: terminateExecutionFunc, Aliases: []string{"executions"}, Short: execCmdShort, - Long: execCmdLong}, + Long: execCmdLong, PFlagProvider: execution.DefaultExecDeleteConfig}, "task-resource-attribute": {CmdFunc: deleteTaskResourceAttributes, Aliases: []string{"task-resource-attributes"}, Short: taskResourceAttributesShort, Long: taskResourceAttributesLong, PFlagProvider: taskresourceattribute.DefaultDelConfig, ProjectDomainNotRequired: true}, diff --git a/flytectl/cmd/delete/execution.go b/flytectl/cmd/delete/execution.go index d92871d45b..4b41181852 100644 --- a/flytectl/cmd/delete/execution.go +++ b/flytectl/cmd/delete/execution.go @@ -4,6 +4,7 @@ import ( "context" "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -64,16 +65,20 @@ func terminateExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.C for i := 0; i < len(args); i++ { name := args[i] logger.Infof(ctx, "Terminating execution of %v execution ", name) - _, err := cmdCtx.AdminClient().TerminateExecution(ctx, &admin.ExecutionTerminateRequest{ - Id: &core.WorkflowExecutionIdentifier{ - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - Name: name, - }, - }) - if err != nil { - logger.Errorf(ctx, "Failed in terminating execution of %v execution due to %v ", name, err) - return err + if execution.DefaultExecDeleteConfig.DryRun { + logger.Infof(ctx, "skipping TerminateExecution request (dryRun)") + } else { + _, err := cmdCtx.AdminClient().TerminateExecution(ctx, &admin.ExecutionTerminateRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: name, + }, + }) + if err != nil { + logger.Errorf(ctx, "Failed in terminating execution of %v execution due to %v ", name, err) + return err + } } logger.Infof(ctx, "Terminated execution of %v execution ", name) } diff --git a/flytectl/cmd/delete/matchable_attribute_util.go b/flytectl/cmd/delete/matchable_attribute_util.go index 6621ae85d8..cfdd90f250 100644 --- a/flytectl/cmd/delete/matchable_attribute_util.go +++ b/flytectl/cmd/delete/matchable_attribute_util.go @@ -9,19 +9,27 @@ import ( ) func deleteMatchableAttr(ctx context.Context, project, domain, workflowName string, - deleter ext.AdminDeleterExtInterface, rsType admin.MatchableResource) error { + deleter ext.AdminDeleterExtInterface, rsType admin.MatchableResource, dryRun bool) error { if len(workflowName) > 0 { // Delete the workflow attribute from the admin. If the attribute doesn't exist , admin deesn't return an error and same behavior is followed here - err := deleter.DeleteWorkflowAttributes(ctx, project, domain, workflowName, rsType) - if err != nil { - return err + if dryRun { + logger.Infof(ctx, "skipping DeleteWorkflowAttributes request (dryRun)") + } else { + err := deleter.DeleteWorkflowAttributes(ctx, project, domain, workflowName, rsType) + if err != nil { + return err + } } logger.Debugf(ctx, "Deleted matchable resources from %v project and domain %v and workflow %v", project, domain, workflowName) } else { // Delete the project domain attribute from the admin. If the attribute doesn't exist , admin deesn't return an error and same behavior is followed here - err := deleter.DeleteProjectDomainAttributes(ctx, project, domain, rsType) - if err != nil { - return err + if dryRun { + logger.Infof(ctx, "skipping DeleteProjectDomainAttributes request (dryRun)") + } else { + err := deleter.DeleteProjectDomainAttributes(ctx, project, domain, rsType) + if err != nil { + return err + } } logger.Debugf(ctx, "Deleted matchable resources from %v project and domain %v", project, domain) } diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go index e6b41941c0..c6f71fec35 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go @@ -72,7 +72,7 @@ func deleteClusterResourceAttributes(ctx context.Context, args []string, cmdCtx // Deletes the matchable attributes using the taskResourceAttrFileConfig if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), - admin.MatchableResource_CLUSTER_RESOURCE); err != nil { + admin.MatchableResource_CLUSTER_RESOURCE, delConfig.DryRun); err != nil { return err } diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label.go b/flytectl/cmd/delete/matchable_execution_cluster_label.go index 65ab8f7405..4149b5e18b 100644 --- a/flytectl/cmd/delete/matchable_execution_cluster_label.go +++ b/flytectl/cmd/delete/matchable_execution_cluster_label.go @@ -70,7 +70,7 @@ func deleteExecutionClusterLabel(ctx context.Context, args []string, cmdCtx cmdC // Deletes the matchable attributes using the ExecClusterLabelFileConfig if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), - admin.MatchableResource_EXECUTION_CLUSTER_LABEL); err != nil { + admin.MatchableResource_EXECUTION_CLUSTER_LABEL, delConfig.DryRun); err != nil { return err } diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute.go b/flytectl/cmd/delete/matchable_execution_queue_attribute.go index 392157a03f..6bc5a47aae 100644 --- a/flytectl/cmd/delete/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute.go @@ -74,7 +74,7 @@ func deleteExecutionQueueAttributes(ctx context.Context, args []string, cmdCtx c // Deletes the matchable attributes using the AttrFileConfig if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), - admin.MatchableResource_EXECUTION_QUEUE); err != nil { + admin.MatchableResource_EXECUTION_QUEUE, delConfig.DryRun); err != nil { return err } diff --git a/flytectl/cmd/delete/matchable_plugin_override.go b/flytectl/cmd/delete/matchable_plugin_override.go index 09353a83f8..edbe826a82 100644 --- a/flytectl/cmd/delete/matchable_plugin_override.go +++ b/flytectl/cmd/delete/matchable_plugin_override.go @@ -75,7 +75,7 @@ func deletePluginOverride(ctx context.Context, args []string, cmdCtx cmdCore.Com // Deletes the matchable attributes using the AttrFileConfig if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), - admin.MatchableResource_PLUGIN_OVERRIDE); err != nil { + admin.MatchableResource_PLUGIN_OVERRIDE, delConfig.DryRun); err != nil { return err } diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute.go b/flytectl/cmd/delete/matchable_task_resource_attribute.go index 3f1a719ca7..01af86bb6d 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute.go @@ -75,7 +75,7 @@ func deleteTaskResourceAttributes(ctx context.Context, args []string, cmdCtx cmd // Deletes the matchable attributes using the taskResourceAttrFileConfig if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), - admin.MatchableResource_TASK_RESOURCE); err != nil { + admin.MatchableResource_TASK_RESOURCE, delConfig.DryRun); err != nil { return err } diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config.go b/flytectl/cmd/delete/matchable_workflow_execution_config.go index c65a3976ed..fb9d6d5c6b 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config.go @@ -71,7 +71,7 @@ func deleteWorkflowExecutionConfig(ctx context.Context, args []string, cmdCtx cm // Deletes the matchable attributes using the WorkflowExecutionConfigFileConfig if err := deleteMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminDeleterExt(), - admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG); err != nil { + admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG, delConfig.DryRun); err != nil { return err } diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 14dfa4be62..07f62d6246 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -107,42 +107,57 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command switch v := message.(type) { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) - _, err := cmdCtx.AdminClient().CreateLaunchPlan(ctx, &admin.LaunchPlanCreateRequest{ - Id: &core.Identifier{ - ResourceType: core.ResourceType_LAUNCH_PLAN, - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - Name: launchPlan.Id.Name, - Version: rconfig.DefaultFilesConfig.Version, - }, - Spec: launchPlan.Spec, - }) + if rconfig.DefaultFilesConfig.DryRun { + logger.Debugf(ctx, "skipping CreateLaunchPlan request (DryRun)") + return nil + } + _, err := cmdCtx.AdminClient().CreateLaunchPlan(ctx, + &admin.LaunchPlanCreateRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_LAUNCH_PLAN, + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: launchPlan.Id.Name, + Version: rconfig.DefaultFilesConfig.Version, + }, + Spec: launchPlan.Spec, + }) return err case *admin.WorkflowSpec: workflowSpec := message.(*admin.WorkflowSpec) - _, err := cmdCtx.AdminClient().CreateWorkflow(ctx, &admin.WorkflowCreateRequest{ - Id: &core.Identifier{ - ResourceType: core.ResourceType_WORKFLOW, - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - Name: workflowSpec.Template.Id.Name, - Version: rconfig.DefaultFilesConfig.Version, - }, - Spec: workflowSpec, - }) + if rconfig.DefaultFilesConfig.DryRun { + logger.Debugf(ctx, "skipping CreateWorkflow request (DryRun)") + return nil + } + _, err := cmdCtx.AdminClient().CreateWorkflow(ctx, + &admin.WorkflowCreateRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_WORKFLOW, + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: workflowSpec.Template.Id.Name, + Version: rconfig.DefaultFilesConfig.Version, + }, + Spec: workflowSpec, + }) return err case *admin.TaskSpec: taskSpec := message.(*admin.TaskSpec) - _, err := cmdCtx.AdminClient().CreateTask(ctx, &admin.TaskCreateRequest{ - Id: &core.Identifier{ - ResourceType: core.ResourceType_TASK, - Project: config.GetConfig().Project, - Domain: config.GetConfig().Domain, - Name: taskSpec.Template.Id.Name, - Version: rconfig.DefaultFilesConfig.Version, - }, - Spec: taskSpec, - }) + if rconfig.DefaultFilesConfig.DryRun { + logger.Debugf(ctx, "skipping CreateTask request (DryRun)") + return nil + } + _, err := cmdCtx.AdminClient().CreateTask(ctx, + &admin.TaskCreateRequest{ + Id: &core.Identifier{ + ResourceType: core.ResourceType_TASK, + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: taskSpec.Template.Id.Name, + Version: rconfig.DefaultFilesConfig.Version, + }, + Spec: taskSpec, + }) return err default: return fmt.Errorf("Failed registering unknown entity %v", v) diff --git a/flytectl/cmd/update/matchable_attribute_util.go b/flytectl/cmd/update/matchable_attribute_util.go index 8717789574..41ff4fa388 100644 --- a/flytectl/cmd/update/matchable_attribute_util.go +++ b/flytectl/cmd/update/matchable_attribute_util.go @@ -9,20 +9,28 @@ import ( ) func DecorateAndUpdateMatchableAttr(ctx context.Context, project, domain, workflowName string, - updater ext.AdminUpdaterExtInterface, mcDecorator sconfig.MatchableAttributeDecorator) error { + updater ext.AdminUpdaterExtInterface, mcDecorator sconfig.MatchableAttributeDecorator, dryRun bool) error { matchingAttr := mcDecorator.Decorate() if len(workflowName) > 0 { // Update the workflow attribute using the admin. - err := updater.UpdateWorkflowAttributes(ctx, project, domain, workflowName, matchingAttr) - if err != nil { - return err + if dryRun { + logger.Infof(ctx, "skipping UpdateWorkflowAttributes request (dryRun)") + } else { + err := updater.UpdateWorkflowAttributes(ctx, project, domain, workflowName, matchingAttr) + if err != nil { + return err + } } logger.Debugf(ctx, "Updated attributes from %v project and domain %v and workflow %v", project, domain, workflowName) } else { // Update the project domain attribute using the admin. - err := updater.UpdateProjectDomainAttributes(ctx, project, domain, matchingAttr) - if err != nil { - return err + if dryRun { + logger.Infof(ctx, "skipping UpdateProjectDomainAttributes request (dryRun)") + } else { + err := updater.UpdateProjectDomainAttributes(ctx, project, domain, matchingAttr) + if err != nil { + return err + } } logger.Debugf(ctx, "Updated attributes from %v project and domain %v", project, domain) } diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute.go b/flytectl/cmd/update/matchable_cluster_resource_attribute.go index c41b74f23c..4938245a3b 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute.go @@ -73,7 +73,7 @@ func updateClusterResourceAttributesFunc(ctx context.Context, args []string, cmd // Updates the admin matchable attribute from taskResourceAttrFileConfig if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - clustrResourceAttrFileConfig); err != nil { + clustrResourceAttrFileConfig, updateConfig.DryRun); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_execution_cluster_label.go b/flytectl/cmd/update/matchable_execution_cluster_label.go index 0a3eb6965c..e9c6c62e5a 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label.go @@ -66,7 +66,7 @@ func updateExecutionClusterLabelFunc(ctx context.Context, args []string, cmdCtx // Updates the admin matchable attribute from executionClusterLabelFileConfig if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - executionClusterLabelFileConfig); err != nil { + executionClusterLabelFileConfig, updateConfig.DryRun); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute.go b/flytectl/cmd/update/matchable_execution_queue_attribute.go index f48bfa2d3b..6c09f9d7b0 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute.go @@ -77,7 +77,7 @@ func updateExecutionQueueAttributesFunc(ctx context.Context, args []string, cmdC // Updates the admin matchable attribute from executionQueueAttrFileConfig if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - executionQueueAttrFileConfig); err != nil { + executionQueueAttrFileConfig, updateConfig.DryRun); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_plugin_override.go b/flytectl/cmd/update/matchable_plugin_override.go index ceeaca0d96..065f2d7070 100644 --- a/flytectl/cmd/update/matchable_plugin_override.go +++ b/flytectl/cmd/update/matchable_plugin_override.go @@ -79,7 +79,7 @@ func updatePluginOverridesFunc(ctx context.Context, args []string, cmdCtx cmdCor // Updates the admin matchable attribute from pluginOverrideFileConfig if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - pluginOverrideFileConfig); err != nil { + pluginOverrideFileConfig, updateConfig.DryRun); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go index 1719dc9c40..bebd96929b 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -79,7 +79,7 @@ func updateTaskResourceAttributesFunc(ctx context.Context, args []string, cmdCtx // Updates the admin matchable attribute from taskResourceAttrFileConfig if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - taskResourceAttrFileConfig); err != nil { + taskResourceAttrFileConfig, updateConfig.DryRun); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_workflow_execution_config.go b/flytectl/cmd/update/matchable_workflow_execution_config.go index 7f6fa1b705..07b684ec5b 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config.go @@ -70,7 +70,7 @@ func updateWorkflowExecutionConfigFunc(ctx context.Context, args []string, cmdCt // Updates the admin matchable attribute from workflowExecutionConfigFileConfig if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - workflowExecutionConfigFileConfig); err != nil { + workflowExecutionConfigFileConfig, updateConfig.DryRun); err != nil { return err } return nil diff --git a/flytectl/cmd/update/named_entity.go b/flytectl/cmd/update/named_entity.go index da5380554e..25d537f380 100644 --- a/flytectl/cmd/update/named_entity.go +++ b/flytectl/cmd/update/named_entity.go @@ -8,6 +8,7 @@ import ( cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytestdlib/logger" ) //go:generate pflags NamedEntityConfig --default-var namedEntityConfig --bind-default-var @@ -20,6 +21,7 @@ type NamedEntityConfig struct { Archive bool `json:"archive" pflag:",archive named entity."` Activate bool `json:"activate" pflag:",activate the named entity."` Description string `json:"description" pflag:",description of the named entity."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } func (n NamedEntityConfig) UpdateNamedEntity(ctx context.Context, name string, project string, domain string, rsType core.ResourceType, cmdCtx cmdCore.CommandContext) error { @@ -34,17 +36,24 @@ func (n NamedEntityConfig) UpdateNamedEntity(ctx context.Context, name string, p } else if archiveProject { nameEntityState = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED } - _, err := cmdCtx.AdminClient().UpdateNamedEntity(ctx, &admin.NamedEntityUpdateRequest{ - ResourceType: rsType, - Id: &admin.NamedEntityIdentifier{ - Project: project, - Domain: domain, - Name: name, - }, - Metadata: &admin.NamedEntityMetadata{ - Description: n.Description, - State: nameEntityState, - }, - }) - return err + if namedEntityConfig.DryRun { + logger.Infof(ctx, "skipping UpdateNamedEntity request (dryRun)") + } else { + _, err := cmdCtx.AdminClient().UpdateNamedEntity(ctx, &admin.NamedEntityUpdateRequest{ + ResourceType: rsType, + Id: &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + Name: name, + }, + Metadata: &admin.NamedEntityMetadata{ + Description: n.Description, + State: nameEntityState, + }, + }) + if err != nil { + return err + } + } + return nil } diff --git a/flytectl/cmd/update/namedentityconfig_flags.go b/flytectl/cmd/update/namedentityconfig_flags.go index e1bd681341..8d3b7a96b8 100755 --- a/flytectl/cmd/update/namedentityconfig_flags.go +++ b/flytectl/cmd/update/namedentityconfig_flags.go @@ -53,5 +53,6 @@ func (cfg NamedEntityConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.BoolVar(&namedEntityConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), namedEntityConfig.Archive, "archive named entity.") cmdFlags.BoolVar(&namedEntityConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), namedEntityConfig.Activate, "activate the named entity.") cmdFlags.StringVar(&namedEntityConfig.Description, fmt.Sprintf("%v%v", prefix, "description"), namedEntityConfig.Description, "description of the named entity.") + cmdFlags.BoolVar(&namedEntityConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), namedEntityConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/update/namedentityconfig_flags_test.go b/flytectl/cmd/update/namedentityconfig_flags_test.go index 528f913d63..9c85b8be20 100755 --- a/flytectl/cmd/update/namedentityconfig_flags_test.go +++ b/flytectl/cmd/update/namedentityconfig_flags_test.go @@ -141,4 +141,18 @@ func TestNamedEntityConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_NamedEntityConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 86d7bb616a..abc54a6d36 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -9,6 +9,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytestdlib/logger" ) //go:generate pflags ProjectConfig --default-var DefaultProjectConfig --bind-default-var @@ -17,6 +18,7 @@ import ( type ProjectConfig struct { ActivateProject bool `json:"activateProject" pflag:",Activates the project specified as argument."` ArchiveProject bool `json:"archiveProject" pflag:",Archives the project specified as argument."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } const ( @@ -73,13 +75,17 @@ func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comma if archiveProject { projectState = admin.Project_ARCHIVED } - _, err := cmdCtx.AdminClient().UpdateProject(ctx, &admin.Project{ - Id: id, - State: projectState, - }) - if err != nil { - fmt.Printf(clierrors.ErrFailedProjectUpdate, id, projectState, err) - return err + if DefaultProjectConfig.DryRun { + logger.Infof(ctx, "skipping UpdateProject request (dryRun)") + } else { + _, err := cmdCtx.AdminClient().UpdateProject(ctx, &admin.Project{ + Id: id, + State: projectState, + }) + if err != nil { + fmt.Printf(clierrors.ErrFailedProjectUpdate, id, projectState, err) + return err + } } fmt.Printf("Project %v updated to %v state\n", id, projectState) return nil diff --git a/flytectl/cmd/update/projectconfig_flags.go b/flytectl/cmd/update/projectconfig_flags.go index 2139fb0563..9c700f5e7c 100755 --- a/flytectl/cmd/update/projectconfig_flags.go +++ b/flytectl/cmd/update/projectconfig_flags.go @@ -52,5 +52,6 @@ func (cfg ProjectConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("ProjectConfig", pflag.ExitOnError) cmdFlags.BoolVar(&DefaultProjectConfig.ActivateProject, fmt.Sprintf("%v%v", prefix, "activateProject"), DefaultProjectConfig.ActivateProject, "Activates the project specified as argument.") cmdFlags.BoolVar(&DefaultProjectConfig.ArchiveProject, fmt.Sprintf("%v%v", prefix, "archiveProject"), DefaultProjectConfig.ArchiveProject, "Archives the project specified as argument.") + cmdFlags.BoolVar(&DefaultProjectConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultProjectConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/update/projectconfig_flags_test.go b/flytectl/cmd/update/projectconfig_flags_test.go index c6bc6b262c..cfcf48b4c4 100755 --- a/flytectl/cmd/update/projectconfig_flags_test.go +++ b/flytectl/cmd/update/projectconfig_flags_test.go @@ -127,4 +127,18 @@ func TestProjectConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } From c6644401ab092a5035e3ec767143093cd76f8f08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Ali=C3=A8s?= Date: Sat, 21 Aug 2021 22:33:51 +0200 Subject: [PATCH 130/645] Update upgrade.go (#164) Signed-off-by: Arnaud Alies --- flytectl/cmd/upgrade/upgrade.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go index 54686a1f76..d32d587252 100644 --- a/flytectl/cmd/upgrade/upgrade.go +++ b/flytectl/cmd/upgrade/upgrade.go @@ -102,7 +102,7 @@ func upgrade(u *updater.Updater) (string, error) { } return fmt.Sprintf("Successfully updated to version %s", latestVersion), nil } - return "", u.Rollback() + return "", nil } func isUpgradeSupported(goos platformutil.Platform) (bool, error) { From e3c8cafab84b0bc6c98d780eeab73ab34601bcd6 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Sun, 22 Aug 2021 21:35:58 -0700 Subject: [PATCH 131/645] Update documentation (#162) Signed-off-by: Flyte-Bot Co-authored-by: evalsocket --- flytectl/docs/source/gen/flytectl_create_execution.rst | 1 + flytectl/docs/source/gen/flytectl_create_project.rst | 1 + .../source/gen/flytectl_delete_cluster-resource-attribute.rst | 1 + .../source/gen/flytectl_delete_execution-cluster-label.rst | 1 + .../source/gen/flytectl_delete_execution-queue-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_delete_execution.rst | 3 ++- flytectl/docs/source/gen/flytectl_delete_plugin-override.rst | 1 + .../source/gen/flytectl_delete_task-resource-attribute.rst | 1 + .../source/gen/flytectl_delete_workflow-execution-config.rst | 1 + flytectl/docs/source/gen/flytectl_register_examples.rst | 1 + flytectl/docs/source/gen/flytectl_register_files.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox_start.rst | 2 +- .../source/gen/flytectl_update_cluster-resource-attribute.rst | 1 + .../source/gen/flytectl_update_execution-cluster-label.rst | 1 + .../source/gen/flytectl_update_execution-queue-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_update_launchplan.rst | 1 + flytectl/docs/source/gen/flytectl_update_plugin-override.rst | 1 + flytectl/docs/source/gen/flytectl_update_project.rst | 1 + .../source/gen/flytectl_update_task-resource-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_update_task.rst | 1 + .../source/gen/flytectl_update_workflow-execution-config.rst | 1 + flytectl/docs/source/gen/flytectl_update_workflow.rst | 1 + flytectl/docs/source/gen/flytectl_upgrade.rst | 2 ++ 23 files changed, 25 insertions(+), 2 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 022e22dff5..7cac61bbd2 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -140,6 +140,7 @@ Options :: + --dryRun execute command without making any modifications. --execFile string file for the execution params.If not specified defaults to <_name>.execution_spec.yaml -h, --help help for execution --iamRoleARN string iam role ARN AuthRole for launching execution. diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index f5b287a2fa..f1e8a47194 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -41,6 +41,7 @@ Options :: --description string description for the project specified as argument. + --dryRun execute command without making any modifications. --file string file for the project definition. -h, --help help for project --id string id for the project specified as argument. diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 770ea699ca..5e80a706d1 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -57,6 +57,7 @@ Options :: --attrFile string attribute file name to be used for delete attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for cluster-resource-attribute Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 918da73e88..488a732b58 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -55,6 +55,7 @@ Options :: --attrFile string attribute file name to be used for delete attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for execution-cluster-label Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 7c1e2eb8f6..671eed2879 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -59,6 +59,7 @@ Options :: --attrFile string attribute file name to be used for delete attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for execution-queue-attribute Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 6f5f2d8e5f..11ebaa66fd 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -64,7 +64,8 @@ Options :: - -h, --help help for execution + --dryRun execute command without making any modifications. + -h, --help help for execution Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index c04b0e1fe3..2328ff9e12 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -60,6 +60,7 @@ Options :: --attrFile string attribute file name to be used for delete attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for plugin-override Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index f0ff59cfbc..544712992f 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -60,6 +60,7 @@ Options :: --attrFile string attribute file name to be used for delete attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for task-resource-attribute Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index ffb2333bd1..a97fcc811c 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -55,6 +55,7 @@ Options :: --attrFile string attribute file name to be used for delete attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for workflow-execution-config Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index a9b5943d56..f21135aa5b 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -31,6 +31,7 @@ Options --archive pass in archive file either an http link or local path. --assumableIamRole string custom assumable iam auth role to register launch plans with. --continueOnError continue on error when registering files. + --dryRun execute command without making any modifications. -h, --help help for examples --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 83447baa09..962d7cfaae 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -95,6 +95,7 @@ Options --archive pass in archive file either an http link or local path. --assumableIamRole string custom assumable iam auth role to register launch plans with. --continueOnError continue on error when registering files. + --dryRun execute command without making any modifications. -h, --help help for files --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index ed340e35d3..00de94c676 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -22,7 +22,7 @@ Mount your source code repository inside sandbox bin/flytectl sandbox start --source=$HOME/flyteorg/flytesnacks -Run specific version of flyte, Only available after v0.14.0+ +Run specific version of flyte, Only available after v0.13.0+ :: bin/flytectl sandbox start --version=v0.14.0 diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index b3a5886a32..9f1ca738f9 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -62,6 +62,7 @@ Options :: --attrFile string attribute file name to be used for updating attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for cluster-resource-attribute Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 043be798c5..4fca7a3a9f 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -55,6 +55,7 @@ Options :: --attrFile string attribute file name to be used for updating attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for execution-cluster-label Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 66539e7561..ae9db9b656 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -66,6 +66,7 @@ Options :: --attrFile string attribute file name to be used for updating attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for execution-queue-attribute Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index ae54382190..5ad0814622 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -40,6 +40,7 @@ Options --activate activate the named entity. --archive archive named entity. --description string description of the named entity. + --dryRun execute command without making any modifications. -h, --help help for launchplan Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 1ee6a87f8d..3056208c60 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -68,6 +68,7 @@ Options :: --attrFile string attribute file name to be used for updating attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for plugin-override Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index dccc3a9efc..abbaaca825 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -54,6 +54,7 @@ Options --activateProject Activates the project specified as argument. --archiveProject Archives the project specified as argument. + --dryRun execute command without making any modifications. -h, --help help for project Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index bd02a91ad5..182c3cdf3f 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -68,6 +68,7 @@ Options :: --attrFile string attribute file name to be used for updating attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for task-resource-attribute Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task.rst index ee60852b58..786d17ff96 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task.rst @@ -40,6 +40,7 @@ Options --activate activate the named entity. --archive archive named entity. --description string description of the named entity. + --dryRun execute command without making any modifications. -h, --help help for task Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index ed6856f395..cf66feece0 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -58,6 +58,7 @@ Options :: --attrFile string attribute file name to be used for updating attribute for the resource type. + --dryRun execute command without making any modifications. -h, --help help for workflow-execution-config Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow.rst index 204e00b614..c717ba53e1 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow.rst @@ -40,6 +40,7 @@ Options --activate activate the named entity. --archive archive named entity. --description string description of the named entity. + --dryRun execute command without making any modifications. -h, --help help for workflow Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index e102c6b901..63379360f4 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -15,6 +15,8 @@ Upgrade flytectl bin/flytectl upgrade +Note: Please use upgrade with sudo, Without sudo it will cause permission issue + Rollback flytectl binary :: From 6618d9ea471e0ccad6e40b49dbf73d2d98554f39 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 23 Aug 2021 10:37:20 +0530 Subject: [PATCH 132/645] bind sandbox port to host system (#165) Signed-off-by: Yuvraj --- flytectl/pkg/docker/docker_util.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 3e1d55e46c..de19ce15a0 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -78,10 +78,10 @@ func RemoveSandbox(ctx context.Context, cli Docker, reader io.Reader) error { // GetSandboxPorts will return sandbox ports func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, error) { return nat.ParsePortSpecs([]string{ - "127.0.0.1:30086:30086", - "127.0.0.1:30081:30081", - "127.0.0.1:30082:30082", - "127.0.0.1:30084:30084", + "0.0.0.0:30086:30086", + "0.0.0.0:30081:30081", + "0.0.0.0:30082:30082", + "0.0.0.0:30084:30084", }) } From 3b266d7bf7600220c9a568eca24a91384937dc46 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Fri, 27 Aug 2021 15:22:50 -0700 Subject: [PATCH 133/645] youtube video embedding for flytectl with walkthrough (#166) Signed-off-by: Ketan Umare --- flytectl/doc-requirements.in | 1 + flytectl/doc-requirements.txt | 13 ++++++++----- flytectl/docs/source/conf.py | 1 + flytectl/docs/source/index.rst | 5 +++++ 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in index 3982ec86e6..e0751192d5 100644 --- a/flytectl/doc-requirements.in +++ b/flytectl/doc-requirements.in @@ -6,3 +6,4 @@ sphinx-code-include sphinx-copybutton sphinx_fontawesome sphinx_tabs +sphinxcontrib-yt diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index 76f9d60edf..671f3d786e 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with python 3.9 +# This file is autogenerated by pip-compile with python 3.8 # To update, run: # # pip-compile doc-requirements.in @@ -15,7 +15,7 @@ beautifulsoup4==4.9.3 # sphinx-material certifi==2021.5.30 # via requests -charset-normalizer==2.0.3 +charset-normalizer==2.0.4 # via requests css-html-js-minify==2.5.5 # via sphinx-material @@ -37,7 +37,7 @@ markupsafe==2.0.1 # via jinja2 packaging==21.0 # via sphinx -pygments==2.9.0 +pygments==2.10.0 # via # sphinx # sphinx-prompt @@ -66,6 +66,7 @@ sphinx==4.1.2 # sphinx-material # sphinx-prompt # sphinx-tabs + # sphinxcontrib-yt sphinx-code-include==1.1.1 # via -r doc-requirements.in sphinx-copybutton==0.4.0 @@ -74,9 +75,9 @@ sphinx-fontawesome==0.0.6 # via -r doc-requirements.in sphinx-material==0.0.34 # via -r doc-requirements.in -sphinx-prompt==1.4.0 +sphinx-prompt==1.5.0 # via -r doc-requirements.in -sphinx-tabs==3.1.0 +sphinx-tabs==3.2.0 # via -r doc-requirements.in sphinxcontrib-applehelp==1.0.2 # via sphinx @@ -90,6 +91,8 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx +sphinxcontrib-yt==0.2.2 + # via -r doc-requirements.in text-unidecode==1.3 # via python-slugify unidecode==1.2.0 diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 0e6329ab99..053bbdf1e3 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -44,6 +44,7 @@ "sphinx_copybutton", "sphinx_fontawesome", "sphinx_tabs.tabs", + "sphinxcontrib.yt", ] # build the templated autosummary files diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 06602489e0..4ce8926c87 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -4,6 +4,11 @@ ``Flytectl`` Reference ########################################## +Overview +========= + +.. youtube:: qUKf07uUiTU + Install ======= From 1cf79c197f055802b493db2899392e596f33027e Mon Sep 17 00:00:00 2001 From: SandraGH5 <80421934+SandraGH5@users.noreply.github.com> Date: Tue, 31 Aug 2021 07:48:46 -0700 Subject: [PATCH 134/645] Point Tutorial Youtube video to the correct one (#167) Update current video to a shorter version specifically edited to be embedded in the docs. --- flytectl/docs/source/index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 4ce8926c87..bac2ce0607 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -6,8 +6,9 @@ Overview ========= +This video will take you on a tour of Flytectl - how to install and configure it, as well as how to use the Verbs and Nouns sections on the left hand side menu. Detailed information can be found in the sections below the video. -.. youtube:: qUKf07uUiTU +.. youtube:: cV8ezYnBANE Install From 70c47ed0eed9a9da1b4c842e32511c1dbb1037e6 Mon Sep 17 00:00:00 2001 From: Viktor Gerdin Date: Wed, 1 Sep 2021 00:29:20 +0200 Subject: [PATCH 135/645] fix panic when get with table output for resource w/o expected output (#168) `flytectl get task/workflow/launchplan -o table` panics if resource has no expected output. We encountered `FormatVariableDescriptions at pkg/printer/printer.go:173` to panic when using the get commands on a resource without expected output. This happened with both explicit table output as well as default. Replicated on lastest master, workflow demo-1.no-output has no expected output: ``` $ go run ./main.go get launchplans -p demo-1 -d production --latest demo-1.no-output panic: assignment to entry in nil map goroutine 1 [running]: github.com/flyteorg/flytectl/pkg/printer.FormatVariableDescriptions(0x0) /workspace/flyteorg/flytectl/pkg/printer/printer.go:202 +0x307 github.com/flyteorg/flytectl/cmd/get.LaunchplanToTableProtoMessages({0xc000a30938, 0x1, 0x7ffeefbff977}) /workspace/flyteorg/flytectl/cmd/get/launch_plan.go:136 +0xee github.com/flyteorg/flytectl/cmd/get.getLaunchPlanFunc({0x2dfbf98, 0xc0000580b8}, {0xc0002fb8c0, 0x1, 0x11519b4}, {{0x2e55850, 0xc000a30120}, {0x2e472c0, 0xc0009a3110}, {0x2ddff60, ...}, ...}) /workspace/flyteorg/flytectl/cmd/get/launch_plan.go:158 +0x307 github.com/flyteorg/flytectl/cmd/core.generateCommandFunc.func1(0xc000481680, {0xc0002fb8c0, 0x1, 0x6}) /workspace/flyteorg/flytectl/cmd/core/cmd.go:69 +0x47d github.com/spf13/cobra.(*Command).execute(0xc000481680, {0xc0002fb860, 0x6, 0x6}) /workspace/go/pkg/mod/github.com/spf13/cobra@v1.1.3/command.go:852 +0x60e github.com/spf13/cobra.(*Command).ExecuteC(0xc000480000) /workspace/go/pkg/mod/github.com/spf13/cobra@v1.1.3/command.go:960 +0x3ad github.com/spf13/cobra.(*Command).Execute(...) /workspace/go/pkg/mod/github.com/spf13/cobra@v1.1.3/command.go:897 github.com/flyteorg/flytectl/cmd.ExecuteCmd() /workspace/flyteorg/flytectl/cmd/root.go:135 +0x1e main.main() /workspace/flyteorg/flytectl/main.go:12 +0x1d exit status 2 ``` Simple fix: nil checks exists for container but not on the map itself prior to calling, and nil input causes the panic. Added nil check on map parameter prior to calling in all places found. Signed-off-by: Viktor Gerdin --- flytectl/cmd/get/launch_plan.go | 2 +- flytectl/cmd/get/task.go | 4 ++-- flytectl/cmd/get/workflow.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index f146740bd7..c5b7e7e581 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -132,7 +132,7 @@ func LaunchplanToTableProtoMessages(l []*admin.LaunchPlan) []proto.Message { if m.Closure.ExpectedInputs != nil { printer.FormatParameterDescriptions(m.Closure.ExpectedInputs.Parameters) } - if m.Closure.ExpectedOutputs != nil { + if m.Closure.ExpectedOutputs != nil && m.Closure.ExpectedOutputs.Variables != nil { printer.FormatVariableDescriptions(m.Closure.ExpectedOutputs.Variables) } } diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index a9f0859d58..63b490ae82 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -119,10 +119,10 @@ func TaskToTableProtoMessages(l []*admin.Task) []proto.Message { if m.Closure != nil && m.Closure.CompiledTask != nil { if m.Closure.CompiledTask.Template != nil { if m.Closure.CompiledTask.Template.Interface != nil { - if m.Closure.CompiledTask.Template.Interface.Inputs != nil { + if m.Closure.CompiledTask.Template.Interface.Inputs != nil && m.Closure.CompiledTask.Template.Interface.Inputs.Variables != nil { printer.FormatVariableDescriptions(m.Closure.CompiledTask.Template.Interface.Inputs.Variables) } - if m.Closure.CompiledTask.Template.Interface.Outputs != nil { + if m.Closure.CompiledTask.Template.Interface.Outputs != nil && m.Closure.CompiledTask.Template.Interface.Outputs.Variables != nil { printer.FormatVariableDescriptions(m.Closure.CompiledTask.Template.Interface.Outputs.Variables) } } diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 519a6d1e1a..2670b7f10d 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -114,10 +114,10 @@ func WorkflowToTableProtoMessages(l []*admin.Workflow) []proto.Message { if m.Closure.CompiledWorkflow.Primary != nil { if m.Closure.CompiledWorkflow.Primary.Template != nil { if m.Closure.CompiledWorkflow.Primary.Template.Interface != nil { - if m.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs != nil { + if m.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs != nil && m.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs.Variables != nil { printer.FormatVariableDescriptions(m.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs.Variables) } - if m.Closure.CompiledWorkflow.Primary.Template.Interface.Outputs != nil { + if m.Closure.CompiledWorkflow.Primary.Template.Interface.Outputs != nil && m.Closure.CompiledWorkflow.Primary.Template.Interface.Outputs.Variables != nil { printer.FormatVariableDescriptions(m.Closure.CompiledWorkflow.Primary.Template.Interface.Outputs.Variables) } } From ac2f7c8708ebc9657ad798f6f7b14c577ef8deb8 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Wed, 1 Sep 2021 21:22:05 +0530 Subject: [PATCH 136/645] hotfix fast register (#171) Signed-off-by: Yuvraj --- flytectl/go.mod | 2 +- flytectl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 337544ee91..533ac14d2f 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -12,7 +12,7 @@ require ( github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 github.com/flyteorg/flyteidl v0.19.24 - github.com/flyteorg/flytestdlib v0.3.33 + github.com/flyteorg/flytestdlib v0.3.34 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 github.com/google/go-github v17.0.0+incompatible diff --git a/flytectl/go.sum b/flytectl/go.sum index 85a4f86cb4..c99b90cda6 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -348,8 +348,8 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/flyteorg/flyteidl v0.19.24 h1:aiBKTFNKZpIvOfcI051I33LnhQl54N3dhkaubucOg+E= github.com/flyteorg/flyteidl v0.19.24/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= -github.com/flyteorg/flytestdlib v0.3.33 h1:+oCx3zXUIldL7CWmNMD7PMFPXvGqaPgYkSKn9wB6qvY= -github.com/flyteorg/flytestdlib v0.3.33/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= +github.com/flyteorg/flytestdlib v0.3.34 h1:OOuV03X8c1AWInzBU6IRsqpEF6y8WDJngbPcdL4VktY= +github.com/flyteorg/flytestdlib v0.3.34/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= From 0a23db336d62a6c385d6dfd7944ad5dab7d6f195 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Thu, 2 Sep 2021 10:55:09 +0530 Subject: [PATCH 137/645] Added launchplan update command and moved namedentity (#170) * Added launchplan update command and moved namedentity Signed-off-by: Prafulla Mahindrakar --- flytectl/clierrors/errors.go | 5 +- .../subcommand/launchplan/updateconfig.go | 14 ++ .../launchplan/updateconfig_flags.go | 58 +++++++ .../launchplan/updateconfig_flags_test.go | 158 ++++++++++++++++++ flytectl/cmd/get/execution.go | 1 + flytectl/cmd/update/launch_plan.go | 57 +++++-- flytectl/cmd/update/launch_plan_meta.go | 49 ++++++ flytectl/cmd/update/launch_plan_meta_test.go | 44 +++++ flytectl/cmd/update/launch_plan_test.go | 17 +- flytectl/cmd/update/{task.go => task_meta.go} | 0 .../{task_test.go => task_meta_test.go} | 0 flytectl/cmd/update/update.go | 9 +- flytectl/cmd/update/update_test.go | 14 +- .../update/{workflow.go => workflow_meta.go} | 0 ...workflow_test.go => workflow_meta_test.go} | 0 15 files changed, 392 insertions(+), 34 deletions(-) create mode 100644 flytectl/cmd/config/subcommand/launchplan/updateconfig.go create mode 100755 flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go create mode 100644 flytectl/cmd/update/launch_plan_meta.go create mode 100644 flytectl/cmd/update/launch_plan_meta_test.go rename flytectl/cmd/update/{task.go => task_meta.go} (100%) rename flytectl/cmd/update/{task_test.go => task_meta_test.go} (100%) rename flytectl/cmd/update/{workflow.go => workflow_meta.go} (100%) rename flytectl/cmd/update/{workflow_test.go => workflow_meta_test.go} (100%) diff --git a/flytectl/clierrors/errors.go b/flytectl/clierrors/errors.go index f6869aa2b2..0085d1711c 100644 --- a/flytectl/clierrors/errors.go +++ b/flytectl/clierrors/errors.go @@ -6,8 +6,9 @@ var ( ErrProjectNotPassed = "Project not passed\n" ErrFailedProjectUpdate = "Project %v failed to get updated to %v state due to %v\n" - ErrLPNotPassed = "Launch plan name not passed\n" - ErrFailedLPUpdate = "Launch plan %v failed to get updated due to %v\n" + ErrLPNotPassed = "Launch plan name not passed\n" + ErrLPVersionNotPassed = "Launch plan version not passed\n" //nolint + ErrFailedLPUpdate = "Launch plan %v failed to get updated due to %v\n" ErrWorkflowNotPassed = "Workflow name not passed\n" ErrFailedWorkflowUpdate = "Workflow %v failed to get updated to due to %v\n" diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig.go new file mode 100644 index 0000000000..9fcbb8869d --- /dev/null +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig.go @@ -0,0 +1,14 @@ +package launchplan + +//go:generate pflags UpdateConfig --default-var UConfig --bind-default-var +var ( + UConfig = &UpdateConfig{} +) + +// Config +type UpdateConfig struct { + Archive bool `json:"archive" pflag:",archive launchplan."` + Activate bool `json:"activate" pflag:",activate launchplan."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Version string `json:"version" pflag:",version of the launchplan to be fetched."` +} diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go new file mode 100755 index 0000000000..b217372c76 --- /dev/null +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go @@ -0,0 +1,58 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package launchplan + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (UpdateConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (UpdateConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (UpdateConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in UpdateConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg UpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("UpdateConfig", pflag.ExitOnError) + cmdFlags.BoolVar(&UConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), UConfig.Archive, "archive launchplan.") + cmdFlags.BoolVar(&UConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), UConfig.Activate, "activate launchplan.") + cmdFlags.BoolVar(&UConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), UConfig.DryRun, "execute command without making any modifications.") + cmdFlags.StringVar(&UConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), UConfig.Version, "version of the launchplan to be fetched.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go new file mode 100755 index 0000000000..a0d1c1adf6 --- /dev/null +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go @@ -0,0 +1,158 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package launchplan + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsUpdateConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementUpdateConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsUpdateConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookUpdateConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementUpdateConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_UpdateConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookUpdateConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_UpdateConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_UpdateConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_UpdateConfig(val, result)) +} + +func testDecodeRaw_UpdateConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_UpdateConfig(vStringSlice, result)) +} + +func TestUpdateConfig_GetPFlagSet(t *testing.T) { + val := UpdateConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestUpdateConfig_SetFlags(t *testing.T) { + actual := UpdateConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_archive", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("archive", testValue) + if vBool, err := cmdFlags.GetBool("archive"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Archive) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_activate", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("activate", testValue) + if vBool, err := cmdFlags.GetBool("activate"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Activate) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_version", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("version", testValue) + if vString, err := cmdFlags.GetString("version"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vString), &actual.Version) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index e17d6759d7..45ce3d9b69 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -88,6 +88,7 @@ var executionColumns = []printer.Column{ {Header: "Launch Plan Name", JSONPath: "$.spec.launchPlan.name"}, {Header: "Type", JSONPath: "$.spec.launchPlan.resourceType"}, {Header: "Phase", JSONPath: "$.closure.phase"}, + {Header: "Scheduled Time", JSONPath: "$.spec.metadata.scheduledAt"}, {Header: "Started", JSONPath: "$.closure.startedAt"}, {Header: "Elapsed Time", JSONPath: "$.closure.duration"}, {Header: "Abort data (Trunc)", JSONPath: "$.closure.abortMetadata[\"cause\"]", TruncateTo: &hundredChars}, diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go index 1f32a2cb04..a9dd059c5c 100644 --- a/flytectl/cmd/update/launch_plan.go +++ b/flytectl/cmd/update/launch_plan.go @@ -6,27 +6,26 @@ import ( "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytestdlib/logger" ) const ( - updateLPShort = "Updates launch plan metadata" + updateLPShort = "Updates launch plan status" updateLPLong = ` -Following command updates the description on the launchplan. +Activating launchplan activates the scheduled job associated with it :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort example" + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --activate -Archiving launchplan named entity is not supported and would throw an error. +Archiving launchplan deschedules any scheduled job associated with it :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --archive -Activating launchplan named entity would be a noop. -:: - - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate Usage ` @@ -39,11 +38,41 @@ func updateLPFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandCont return fmt.Errorf(clierrors.ErrLPNotPassed) } name := args[0] - err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_LAUNCH_PLAN, cmdCtx) - if err != nil { - fmt.Printf(clierrors.ErrFailedLPUpdate, name, err) - return err + version := launchplan.UConfig.Version + if len(version) == 0 { + return fmt.Errorf(clierrors.ErrLPVersionNotPassed) + } + activateLP := launchplan.UConfig.Activate + archiveLP := launchplan.UConfig.Archive + if activateLP == archiveLP && archiveLP { + return fmt.Errorf(clierrors.ErrInvalidStateUpdate) + } + + var lpState admin.LaunchPlanState + if activateLP { + lpState = admin.LaunchPlanState_ACTIVE + } else if archiveLP { + lpState = admin.LaunchPlanState_INACTIVE + } + + if launchplan.UConfig.DryRun { + logger.Debugf(ctx, "skipping CreateExecution request (DryRun)") + } else { + _, err := cmdCtx.AdminClient().UpdateLaunchPlan(ctx, &admin.LaunchPlanUpdateRequest{ + Id: &core.Identifier{ + Project: project, + Domain: domain, + Name: name, + Version: version, + }, + State: lpState, + }) + if err != nil { + fmt.Printf(clierrors.ErrFailedLPUpdate, name, err) + return err + } } - fmt.Printf("updated metadata successfully on %v", name) + fmt.Printf("updated launchplan successfully on %v", name) + return nil } diff --git a/flytectl/cmd/update/launch_plan_meta.go b/flytectl/cmd/update/launch_plan_meta.go new file mode 100644 index 0000000000..00cd9bef36 --- /dev/null +++ b/flytectl/cmd/update/launch_plan_meta.go @@ -0,0 +1,49 @@ +package update + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" +) + +const ( + updateLPMetaShort = "Updates launch plan metadata" + updateLPMetaLong = ` +Following command updates the description on the launchplan. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort example" + +Archiving launchplan named entity is not supported and would throw an error. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + +Activating launchplan named entity would be a noop. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate + +Usage +` +) + +func updateLPMetaFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + project := config.GetConfig().Project + domain := config.GetConfig().Domain + if len(args) != 1 { + return fmt.Errorf(clierrors.ErrLPNotPassed) + } + name := args[0] + err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_LAUNCH_PLAN, cmdCtx) + if err != nil { + fmt.Printf(clierrors.ErrFailedLPUpdate, name, err) + return err + } + fmt.Printf("updated metadata successfully on %v", name) + return nil +} diff --git a/flytectl/cmd/update/launch_plan_meta_test.go b/flytectl/cmd/update/launch_plan_meta_test.go new file mode 100644 index 0000000000..0427964fc6 --- /dev/null +++ b/flytectl/cmd/update/launch_plan_meta_test.go @@ -0,0 +1,44 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func UpdateLPMetaSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient +} + +func TestLPMetaUpdate(t *testing.T) { + testutils.Setup() + UpdateLPMetaSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{"task1"} + mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) + assert.Nil(t, updateLPMetaFunc(ctx, args, cmdCtx)) +} + +func TestLPMetaUpdateFail(t *testing.T) { + testutils.Setup() + UpdateLPMetaSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{"task1"} + mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) +} + +func TestLPMetaUpdateInvalidArgs(t *testing.T) { + testutils.Setup() + UpdateLPMetaSetup() + namedEntityConfig = &NamedEntityConfig{} + args = []string{} + assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) +} diff --git a/flytectl/cmd/update/launch_plan_test.go b/flytectl/cmd/update/launch_plan_test.go index aa8f8601de..3ef074277b 100644 --- a/flytectl/cmd/update/launch_plan_test.go +++ b/flytectl/cmd/update/launch_plan_test.go @@ -4,6 +4,7 @@ import ( "fmt" "testing" + "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -20,25 +21,25 @@ func UpdateLPSetup() { func TestLPUpdate(t *testing.T) { testutils.Setup() UpdateLPSetup() - namedEntityConfig = &NamedEntityConfig{} - args = []string{"task1"} - mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) + launchplan.UConfig = &launchplan.UpdateConfig{Version: "v1", Archive: true} + args = []string{"lp1"} + mockClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(&admin.LaunchPlanUpdateResponse{}, nil) assert.Nil(t, updateLPFunc(ctx, args, cmdCtx)) } func TestLPUpdateFail(t *testing.T) { testutils.Setup() UpdateLPSetup() - namedEntityConfig = &NamedEntityConfig{} + launchplan.UConfig = &launchplan.UpdateConfig{Version: "v1", Archive: true} args = []string{"task1"} - mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) + mockClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, updateLPFunc(ctx, args, cmdCtx)) } func TestLPUpdateInvalidArgs(t *testing.T) { testutils.Setup() UpdateLPSetup() - namedEntityConfig = &NamedEntityConfig{} + launchplan.UConfig = &launchplan.UpdateConfig{Version: "v1", Archive: true, Activate: true} args = []string{} - assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) + assert.NotNil(t, updateLPFunc(ctx, args, cmdCtx)) } diff --git a/flytectl/cmd/update/task.go b/flytectl/cmd/update/task_meta.go similarity index 100% rename from flytectl/cmd/update/task.go rename to flytectl/cmd/update/task_meta.go diff --git a/flytectl/cmd/update/task_test.go b/flytectl/cmd/update/task_meta_test.go similarity index 100% rename from flytectl/cmd/update/task_test.go rename to flytectl/cmd/update/task_meta_test.go diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index efd2f0a48d..c1a721b704 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -4,6 +4,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" @@ -34,13 +35,15 @@ func CreateUpdateCommand() *cobra.Command { Long: updatecmdLong, } updateResourcesFuncs := map[string]cmdCore.CommandEntry{ - "launchplan": {CmdFunc: updateLPFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, + "launchplan": {CmdFunc: updateLPFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: launchplan.UConfig, Short: updateLPShort, Long: updateLPLong}, + "launchplan-meta": {CmdFunc: updateLPMetaFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, + Short: updateLPMetaShort, Long: updateLPMetaLong}, "project": {CmdFunc: updateProjectsFunc, Aliases: []string{}, ProjectDomainNotRequired: true, PFlagProvider: DefaultProjectConfig, Short: projectShort, Long: projectLong}, - "task": {CmdFunc: updateTaskFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, + "task-meta": {CmdFunc: updateTaskFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateTaskShort, Long: updateTaskLong}, - "workflow": {CmdFunc: updateWorkflowFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, + "workflow-meta": {CmdFunc: updateWorkflowFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateWorkflowShort, Long: updateWorkflowLong}, "task-resource-attribute": {CmdFunc: updateTaskResourceAttributesFunc, Aliases: []string{}, PFlagProvider: taskresourceattribute.DefaultUpdateConfig, Short: taskResourceAttributesShort, Long: taskResourceAttributesLong, ProjectDomainNotRequired: true}, diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index eecfbff0d6..8cf80f3f73 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -32,19 +32,19 @@ func TestUpdateCommand(t *testing.T) { assert.Equal(t, updateCommand.Use, updateUse) assert.Equal(t, updateCommand.Short, updateShort) assert.Equal(t, updateCommand.Long, updatecmdLong) - assert.Equal(t, len(updateCommand.Commands()), 10) + assert.Equal(t, len(updateCommand.Commands()), 11) cmdNouns := updateCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) useArray := []string{"cluster-resource-attribute", "execution-cluster-label", "execution-queue-attribute", "launchplan", - "plugin-override", "project", "task", "task-resource-attribute", "workflow", "workflow-execution-config"} - aliases := [][]string{{}, {}, {}, {}, {}, {}, {}, {}, {}, {}} - shortArray := []string{clusterResourceAttributesShort, executionClusterLabelShort, executionQueueAttributesShort, updateLPShort, - pluginOverrideShort, projectShort, updateTaskShort, taskResourceAttributesShort, updateWorkflowShort, workflowExecutionConfigShort} - longArray := []string{clusterResourceAttributesLong, executionClusterLabelLong, executionQueueAttributesLong, updateLPLong, - pluginOverrideLong, projectLong, updateTaskLong, taskResourceAttributesLong, updateWorkflowLong, workflowExecutionConfigLong} + "launchplan-meta", "plugin-override", "project", "task-meta", "task-resource-attribute", "workflow-execution-config", "workflow-meta"} + aliases := [][]string{{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}} + shortArray := []string{clusterResourceAttributesShort, executionClusterLabelShort, executionQueueAttributesShort, updateLPShort, updateLPMetaShort, + pluginOverrideShort, projectShort, updateTaskShort, taskResourceAttributesShort, workflowExecutionConfigShort, updateWorkflowShort} + longArray := []string{clusterResourceAttributesLong, executionClusterLabelLong, executionQueueAttributesLong, updateLPLong, updateLPMetaLong, + pluginOverrideLong, projectLong, updateTaskLong, taskResourceAttributesLong, workflowExecutionConfigLong, updateWorkflowLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) assert.Equal(t, cmdNouns[i].Aliases, aliases[i]) diff --git a/flytectl/cmd/update/workflow.go b/flytectl/cmd/update/workflow_meta.go similarity index 100% rename from flytectl/cmd/update/workflow.go rename to flytectl/cmd/update/workflow_meta.go diff --git a/flytectl/cmd/update/workflow_test.go b/flytectl/cmd/update/workflow_meta_test.go similarity index 100% rename from flytectl/cmd/update/workflow_test.go rename to flytectl/cmd/update/workflow_meta_test.go From dcc2c091d55f34dd19417b5fa15bba23d3be3a95 Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Thu, 2 Sep 2021 10:12:57 -0700 Subject: [PATCH 138/645] Fix panic in rendering LP input descriptions (#174) Signed-off-by: Katrina Rogan --- flytectl/cmd/get/launch_plan.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index c5b7e7e581..6ef85d6cb3 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -129,7 +129,7 @@ func LaunchplanToTableProtoMessages(l []*admin.LaunchPlan) []proto.Message { for _, m := range l { m := proto.Clone(m).(*admin.LaunchPlan) if m.Closure != nil { - if m.Closure.ExpectedInputs != nil { + if m.Closure.ExpectedInputs != nil && m.Closure.ExpectedInputs.Parameters != nil { printer.FormatParameterDescriptions(m.Closure.ExpectedInputs.Parameters) } if m.Closure.ExpectedOutputs != nil && m.Closure.ExpectedOutputs.Variables != nil { From 7c31c1e8f96024bdb9bdf10dcda862eb09d4b579 Mon Sep 17 00:00:00 2001 From: Sean Lin Date: Thu, 2 Sep 2021 11:22:26 -0700 Subject: [PATCH 139/645] Adopt flyteidl's ordered variable map change (#158) * Adopt flyteidl's ordered variable map change Signed-off-by: Sean Lin * wip Adopt flyteidl's ordered variable map change Signed-off-by: Sean Lin * wip Adopt flyteidl's ordered variable map change Signed-off-by: Sean Lin * Reformat json Signed-off-by: Sean Lin * Reformat json Signed-off-by: Sean Lin * Parameter field name change Signed-off-by: Sean Lin * Make execfile backward compatible Signed-off-by: Sean Lin * Remove legacy proto Signed-off-by: Sean Lin * Format test data Signed-off-by: Sean Lin * Update flyteidl Signed-off-by: Haytham Abuelfutuh * goimports Signed-off-by: Haytham Abuelfutuh Co-authored-by: Haytham Abuelfutuh --- flytectl/cmd/create/execution_test.go | 52 +- flytectl/cmd/create/serialization_utils.go | 22 +- .../cmd/create/serialization_utils_test.go | 52 +- flytectl/cmd/get/execution_util.go | 34 +- flytectl/cmd/get/execution_util_test.go | 13 +- flytectl/cmd/get/launch_plan.go | 4 +- flytectl/cmd/get/launch_plan_test.go | 864 ++++++++++++------ flytectl/cmd/get/task.go | 14 +- flytectl/cmd/get/task_test.go | 328 +++++-- flytectl/cmd/get/workflow.go | 4 +- flytectl/cmd/get/workflow_test.go | 38 +- flytectl/go.mod | 2 +- flytectl/go.sum | 4 +- flytectl/pkg/ext/launch_plan_fetcher_test.go | 41 +- flytectl/pkg/ext/task_fetcher_test.go | 11 +- flytectl/pkg/ext/workflow_fetcher_test.go | 11 +- flytectl/pkg/printer/printer.go | 46 +- flytectl/pkg/printer/printer_test.go | 65 +- .../compiled_closure_branch_nested.json | 104 ++- .../testdata/compiled_subworkflows.json | 157 ++-- 20 files changed, 1221 insertions(+), 645 deletions(-) diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index 65df850ae5..36166fdf21 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -32,9 +32,14 @@ func createExecutionSetup() { }, }, } - variableMap := map[string]*core.Variable{ - "sorted_list1": &sortedListLiteralType, - "sorted_list2": &sortedListLiteralType, + variableMap := []*core.VariableMapEntry{ + { + Name: "sorted_list1", + Var: &sortedListLiteralType, + }, { + Name: "sorted_list2", + Var: &sortedListLiteralType, + }, } task1 := &admin.Task{ @@ -56,9 +61,10 @@ func createExecutionSetup() { }, } mockClient.OnGetTaskMatch(ctx, mock.Anything).Return(task1, nil) - parameterMap := map[string]*core.Parameter{ - "numbers": { - Var: &core.Variable{ + parameterMap := []*core.ParameterMapEntry{ + { + Name: "numbers", + Parameter: &core.Parameter{Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_CollectionType{ CollectionType: &core.LiteralType{ @@ -68,40 +74,42 @@ func createExecutionSetup() { }, }, }, - }, + }}, }, - "numbers_count": { - Var: &core.Variable{ + { + Name: "numbers_count", + Parameter: &core.Parameter{Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, }, }, - }, + }}, }, - "run_local_at_count": { - Var: &core.Variable{ + { + Name: "run_local_at_count", + Parameter: &core.Parameter{Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, }, }, }, - Behavior: &core.Parameter_Default{ - Default: &core.Literal{ - Value: &core.Literal_Scalar{ - Scalar: &core.Scalar{ - Value: &core.Scalar_Primitive{ - Primitive: &core.Primitive{ - Value: &core.Primitive_Integer{ - Integer: 10, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, + }, }, }, }, }, }, - }, - }, + }}, }, } launchPlan1 := &admin.LaunchPlan{ diff --git a/flytectl/cmd/create/serialization_utils.go b/flytectl/cmd/create/serialization_utils.go index 53045d2c9e..568ed6dc27 100644 --- a/flytectl/cmd/create/serialization_utils.go +++ b/flytectl/cmd/create/serialization_utils.go @@ -11,15 +11,15 @@ import ( // MakeLiteralForVariables builds a map of literals for the provided serialized values. If a provided value does not have // a corresponding variable or if that variable is invalid (e.g. doesn't have Type property populated), it returns an // error. -func MakeLiteralForVariables(serialize map[string]interface{}, variables map[string]*core.Variable) (map[string]*core.Literal, error) { +func MakeLiteralForVariables(serialize map[string]interface{}, variables []*core.VariableMapEntry) (map[string]*core.Literal, error) { types := make(map[string]*core.LiteralType) - for k, v := range variables { - t := v.GetType() + for _, e := range variables { + t := e.GetVar().GetType() if t == nil { - return nil, fmt.Errorf("variable [%v] has nil type", k) + return nil, fmt.Errorf("variable [%v] has nil type", e.GetName()) } - types[k] = t + types[e.GetName()] = t } return MakeLiteralForTypes(serialize, types) @@ -28,15 +28,15 @@ func MakeLiteralForVariables(serialize map[string]interface{}, variables map[str // MakeLiteralForParams builds a map of literals for the provided serialized values. If a provided value does not have // a corresponding parameter or if that parameter is invalid (e.g. doesn't have Type property populated), it returns an // error. -func MakeLiteralForParams(serialize map[string]interface{}, parameters map[string]*core.Parameter) (map[string]*core.Literal, error) { +func MakeLiteralForParams(serialize map[string]interface{}, parameters []*core.ParameterMapEntry) (map[string]*core.Literal, error) { types := make(map[string]*core.LiteralType) - for k, v := range parameters { - if variable := v.GetVar(); variable == nil { - return nil, fmt.Errorf("parameter [%v] has nil Variable", k) + for _, e := range parameters { + if variable := e.GetParameter().GetVar(); variable == nil { + return nil, fmt.Errorf("parameter [%v] has nil Variable", e.GetName()) } else if t := variable.GetType(); t == nil { - return nil, fmt.Errorf("parameter [%v] has nil variable type", k) + return nil, fmt.Errorf("parameter [%v] has nil variable type", e.GetName()) } else { - types[k] = t + types[e.GetName()] = t } } diff --git a/flytectl/cmd/create/serialization_utils_test.go b/flytectl/cmd/create/serialization_utils_test.go index 5c7326493d..ebe4484472 100644 --- a/flytectl/cmd/create/serialization_utils_test.go +++ b/flytectl/cmd/create/serialization_utils_test.go @@ -67,15 +67,16 @@ func TestMakeLiteralForParams(t *testing.T) { } t.Run("Happy path", func(t *testing.T) { - inputParams := map[string]*core.Parameter{ - "a": { - Var: &core.Variable{ + inputParams := []*core.ParameterMapEntry{ + { + Name: "a", + Parameter: &core.Parameter{Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_STRING, }, }, - }, + }}, }, } @@ -85,8 +86,11 @@ func TestMakeLiteralForParams(t *testing.T) { }) t.Run("Invalid Param", func(t *testing.T) { - inputParams := map[string]*core.Parameter{ - "a": nil, + inputParams := []*core.ParameterMapEntry{ + { + Name: "a", + Parameter: nil, + }, } _, err := MakeLiteralForParams(inputValues, inputParams) @@ -94,9 +98,10 @@ func TestMakeLiteralForParams(t *testing.T) { }) t.Run("Invalid Type", func(t *testing.T) { - inputParams := map[string]*core.Parameter{ - "a": { - Var: &core.Variable{}, + inputParams := []*core.ParameterMapEntry{ + { + Name: "a", + Parameter: &core.Parameter{Var: &core.Variable{}}, }, } @@ -111,11 +116,14 @@ func TestMakeLiteralForVariables(t *testing.T) { } t.Run("Happy path", func(t *testing.T) { - inputVariables := map[string]*core.Variable{ - "a": { - Type: &core.LiteralType{ - Type: &core.LiteralType_Simple{ - Simple: core.SimpleType_STRING, + inputVariables := []*core.VariableMapEntry{ + { + Name: "a", + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_STRING, + }, }, }, }, @@ -127,8 +135,11 @@ func TestMakeLiteralForVariables(t *testing.T) { }) t.Run("Invalid Variable", func(t *testing.T) { - inputVariables := map[string]*core.Variable{ - "a": nil, + inputVariables := []*core.VariableMapEntry{ + { + Name: "a", + Var: nil, + }, } _, err := MakeLiteralForVariables(inputValues, inputVariables) @@ -136,9 +147,12 @@ func TestMakeLiteralForVariables(t *testing.T) { }) t.Run("Invalid Type", func(t *testing.T) { - inputVariables := map[string]*core.Variable{ - "a": { - Type: nil, + inputVariables := []*core.VariableMapEntry{ + { + Name: "a", + Var: &core.Variable{ + Type: nil, + }, }, } diff --git a/flytectl/cmd/get/execution_util.go b/flytectl/cmd/get/execution_util.go index 65b72175a5..8469e68e1d 100644 --- a/flytectl/cmd/get/execution_util.go +++ b/flytectl/cmd/get/execution_util.go @@ -58,8 +58,8 @@ func CreateAndWriteExecConfigForWorkflow(wlp *admin.LaunchPlan, fileName string) return WriteExecConfigToFile(executionConfig, fileName) } -func TaskInputs(task *admin.Task) map[string]*core.Variable { - taskInputs := map[string]*core.Variable{} +func TaskInputs(task *admin.Task) []*core.VariableMapEntry { + taskInputs := []*core.VariableMapEntry{} if task == nil || task.Closure == nil { return taskInputs } @@ -81,10 +81,10 @@ func TaskInputs(task *admin.Task) map[string]*core.Variable { func ParamMapForTask(task *admin.Task) (map[string]yaml.Node, error) { taskInputs := TaskInputs(task) paramMap := make(map[string]yaml.Node, len(taskInputs)) - for k, v := range taskInputs { - varTypeValue, err := coreutils.MakeDefaultLiteralForType(v.Type) + for _, e := range taskInputs { + varTypeValue, err := coreutils.MakeDefaultLiteralForType(e.Var.Type) if err != nil { - fmt.Println("error creating default value for literal type ", v.Type) + fmt.Println("error creating default value for literal type ", e.Var.Type) return nil, err } var nativeLiteral interface{} @@ -92,11 +92,11 @@ func ParamMapForTask(task *admin.Task) (map[string]yaml.Node, error) { return nil, err } - if k == v.Description { + if e.Name == e.Var.Description { // a: # a isn't very helpful - paramMap[k], err = getCommentedYamlNode(nativeLiteral, "") + paramMap[e.Name], err = getCommentedYamlNode(nativeLiteral, "") } else { - paramMap[k], err = getCommentedYamlNode(nativeLiteral, v.Description) + paramMap[e.Name], err = getCommentedYamlNode(nativeLiteral, e.Var.Description) } if err != nil { return nil, err @@ -105,8 +105,8 @@ func ParamMapForTask(task *admin.Task) (map[string]yaml.Node, error) { return paramMap, nil } -func WorkflowParams(lp *admin.LaunchPlan) map[string]*core.Parameter { - workflowParams := map[string]*core.Parameter{} +func WorkflowParams(lp *admin.LaunchPlan) []*core.ParameterMapEntry { + workflowParams := []*core.ParameterMapEntry{} if lp == nil || lp.Spec == nil { return workflowParams } @@ -119,10 +119,10 @@ func WorkflowParams(lp *admin.LaunchPlan) map[string]*core.Parameter { func ParamMapForWorkflow(lp *admin.LaunchPlan) (map[string]yaml.Node, error) { workflowParams := WorkflowParams(lp) paramMap := make(map[string]yaml.Node, len(workflowParams)) - for k, v := range workflowParams { - varTypeValue, err := coreutils.MakeDefaultLiteralForType(v.Var.Type) + for _, e := range workflowParams { + varTypeValue, err := coreutils.MakeDefaultLiteralForType(e.Parameter.Var.Type) if err != nil { - fmt.Println("error creating default value for literal type ", v.Var.Type) + fmt.Println("error creating default value for literal type ", e.Parameter.Var.Type) return nil, err } var nativeLiteral interface{} @@ -130,16 +130,16 @@ func ParamMapForWorkflow(lp *admin.LaunchPlan) (map[string]yaml.Node, error) { return nil, err } // Override if there is a default value - if paramsDefault, ok := v.Behavior.(*core.Parameter_Default); ok { + if paramsDefault, ok := e.Parameter.Behavior.(*core.Parameter_Default); ok { if nativeLiteral, err = coreutils.ExtractFromLiteral(paramsDefault.Default); err != nil { return nil, err } } - if k == v.Var.Description { + if e.Name == e.Parameter.Var.Description { // a: # a isn't very helpful - paramMap[k], err = getCommentedYamlNode(nativeLiteral, "") + paramMap[e.Name], err = getCommentedYamlNode(nativeLiteral, "") } else { - paramMap[k], err = getCommentedYamlNode(nativeLiteral, v.Var.Description) + paramMap[e.Name], err = getCommentedYamlNode(nativeLiteral, e.Parameter.Var.Description) } if err != nil { diff --git a/flytectl/cmd/get/execution_util_test.go b/flytectl/cmd/get/execution_util_test.go index 2d98c8b834..5a2c53aee7 100644 --- a/flytectl/cmd/get/execution_util_test.go +++ b/flytectl/cmd/get/execution_util_test.go @@ -11,7 +11,7 @@ import ( ) func TestTaskInputs(t *testing.T) { - taskInputs := map[string]*core.Variable{} + taskInputs := []*core.VariableMapEntry{} t.Run("nil task", func(t *testing.T) { retValue := TaskInputs(nil) assert.Equal(t, taskInputs, retValue) @@ -60,9 +60,14 @@ func createTask() *admin.Task { }, } - variableMap := map[string]*core.Variable{ - "sorted_list1": &sortedListLiteralType, - "sorted_list2": &sortedListLiteralType, + variableMap := []*core.VariableMapEntry{ + { + Name: "sorted_list1", + Var: &sortedListLiteralType, + }, { + Name: "sorted_list2", + Var: &sortedListLiteralType, + }, } inputs := &core.VariableMap{ diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 6ef85d6cb3..dc19efeaa9 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -104,8 +104,8 @@ var launchplanColumns = []printer.Column{ {Header: "Type", JSONPath: "$.closure.compiledTask.template.type"}, {Header: "State", JSONPath: "$.spec.state"}, {Header: "Schedule", JSONPath: "$.spec.entityMetadata.schedule"}, - {Header: "Inputs", JSONPath: "$.closure.expectedInputs.parameters." + printer.DefaultFormattedDescriptionsKey + ".var.description"}, - {Header: "Outputs", JSONPath: "$.closure.expectedOutputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, + {Header: "Inputs", JSONPath: "$.closure.expectedInputs.parameters[0].parameter.var.description"}, + {Header: "Outputs", JSONPath: "$.closure.expectedOutputs.variables[0].var.description"}, } // Column structure for get all launchplans diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index e6a7cbec01..cf944cf5e6 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -39,9 +39,10 @@ func getLaunchPlanSetup() { // TODO: migrate to new command context from testutils cmdCtx = cmdCore.NewCommandContext(mockClient, u.MockOutStream) argsLp = []string{"launchplan1"} - parameterMap := map[string]*core.Parameter{ - "numbers": { - Var: &core.Variable{ + parameterMap := []*core.ParameterMapEntry{ + { + Name: "numbers", + Parameter: &core.Parameter{Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_CollectionType{ CollectionType: &core.LiteralType{ @@ -51,21 +52,21 @@ func getLaunchPlanSetup() { }, }, }, - Description: "short desc", - }, + Description: "short desc"}}, }, - "numbers_count": { - Var: &core.Variable{ + { + Name: "numbers_count", + Parameter: &core.Parameter{Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, }, - }, - Description: "long description will be truncated in table", - }, + }, Description: "long description will be truncated in table", + }}, }, - "run_local_at_count": { - Var: &core.Variable{ + { + Name: "run_local_at_count", + Parameter: &core.Parameter{Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, @@ -73,21 +74,21 @@ func getLaunchPlanSetup() { }, Description: "run_local_at_count", }, - Behavior: &core.Parameter_Default{ - Default: &core.Literal{ - Value: &core.Literal_Scalar{ - Scalar: &core.Scalar{ - Value: &core.Scalar_Primitive{ - Primitive: &core.Primitive{ - Value: &core.Primitive_Integer{ - Integer: 10, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, + }, }, }, }, }, }, - }, - }, + }}, }, } launchPlan1 := &admin.LaunchPlan{ @@ -257,80 +258,98 @@ func TestGetLaunchPlanFunc(t *testing.T) { }, "spec": { "defaultInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } } }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } } }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" + "default": { + "scalar": { + "primitive": { + "integer": "10" + } } } } } - } + ] } }, "closure": { "expectedInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } } }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } } }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" + "default": { + "scalar": { + "primitive": { + "integer": "10" + } } } } } - } + ] }, "createdAt": "1970-01-01T00:00:01Z" } @@ -342,80 +361,98 @@ func TestGetLaunchPlanFunc(t *testing.T) { }, "spec": { "defaultInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } } }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } } }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" + "default": { + "scalar": { + "primitive": { + "integer": "10" + } } } } } - } + ] } }, "closure": { "expectedInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } } }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } } }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" + "default": { + "scalar": { + "primitive": { + "integer": "10" + } } } } } - } + ] }, "createdAt": "1970-01-01T00:00:00Z" } @@ -440,80 +477,98 @@ func TestGetLaunchPlanFuncLatest(t *testing.T) { }, "spec": { "defaultInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } } }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } } }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" + "default": { + "scalar": { + "primitive": { + "integer": "10" + } } } } } - } + ] } }, "closure": { "expectedInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } } }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } } }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" + "default": { + "scalar": { + "primitive": { + "integer": "10" + } } } } } - } + ] }, "createdAt": "1970-01-01T00:00:01Z" } @@ -537,80 +592,98 @@ func TestGetLaunchPlanWithVersion(t *testing.T) { }, "spec": { "defaultInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } } }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } } }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" + "default": { + "scalar": { + "primitive": { + "integer": "10" + } } } } } - } + ] } }, "closure": { "expectedInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } } }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } } }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" + "default": { + "scalar": { + "primitive": { + "integer": "10" + } } } } } - } + ] }, "createdAt": "1970-01-01T00:00:01Z" } @@ -625,7 +698,214 @@ func TestGetLaunchPlans(t *testing.T) { argsLp = []string{} err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + tearDownAndVerify(t, `[ + { + "id": { + "name": "launchplan1", + "version": "v2" + }, + "spec": { + "defaultInputs": { + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } + } + }, + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } + } + }, + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + ] + } + }, + "closure": { + "expectedInputs": { + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } + } + }, + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } + } + }, + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + ] + }, + "createdAt": "1970-01-01T00:00:01Z" + } + }, + { + "id": { + "name": "launchplan1", + "version": "v1" + }, + "spec": { + "defaultInputs": { + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } + } + }, + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } + } + }, + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + ] + } + }, + "closure": { + "expectedInputs": { + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } + } + }, + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } + } + }, + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" + } + } + } + } + } + ] + }, + "createdAt": "1970-01-01T00:00:00Z" + } + } +]`) } func TestGetLaunchPlansWithExecFile(t *testing.T) { @@ -647,80 +927,98 @@ func TestGetLaunchPlansWithExecFile(t *testing.T) { }, "spec": { "defaultInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } } }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } } }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" + "default": { + "scalar": { + "primitive": { + "integer": "10" + } } } } } - } + ] } }, "closure": { "expectedInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" + "parameters": [ + { + "name": "numbers", + "parameter": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" + } } }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" + { + "name": "numbers_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" + } } }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" + { + "name": "run_local_at_count", + "parameter": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "run_local_at_count" }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" + "default": { + "scalar": { + "primitive": { + "integer": "10" + } } } } } - } + ] }, "createdAt": "1970-01-01T00:00:01Z" } diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 63b490ae82..e3ce88e348 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -3,6 +3,8 @@ package get import ( "context" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytectl/cmd/config" taskConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/task" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -97,8 +99,8 @@ var taskColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, {Header: "Type", JSONPath: "$.closure.compiledTask.template.type"}, - {Header: "Inputs", JSONPath: "$.closure.compiledTask.template.interface.inputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, - {Header: "Outputs", JSONPath: "$.closure.compiledTask.template.interface.outputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, + {Header: "Inputs", JSONPath: "$.closure.compiledTask.template.interface.inputs.variables[0].var.description"}, + {Header: "Outputs", JSONPath: "$.closure.compiledTask.template.interface.outputs.variables[0].var.description"}, {Header: "Discoverable", JSONPath: "$.closure.compiledTask.template.metadata.discoverable"}, {Header: "Discovery Version", JSONPath: "$.closure.compiledTask.template.metadata.discoveryVersion"}, {Header: "Created At", JSONPath: "$.closure.createdAt"}, @@ -133,6 +135,14 @@ func TaskToTableProtoMessages(l []*admin.Task) []proto.Message { return messages } +func VariableMapEntriesToMap(mapFieldEntries []*core.VariableMapEntry) (variableMap map[string]*core.Variable) { + variableMap = map[string]*core.Variable{} + for _, e := range mapFieldEntries { + variableMap[e.Name] = e.Var + } + return +} + func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { taskPrinter := printer.Printer{} var tasks []*admin.Task diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index 0133c20f46..dfed9cea1f 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -54,9 +54,14 @@ func getTaskSetup() { }, Description: "var description", } - variableMap := map[string]*core.Variable{ - "sorted_list1": &sortedListLiteralType, - "sorted_list2": &sortedListLiteralType, + variableMap := []*core.VariableMapEntry{ + { + Name: "sorted_list1", + Var: &sortedListLiteralType, + }, { + Name: "sorted_list2", + Var: &sortedListLiteralType, + }, } task1 := &admin.Task{ @@ -256,24 +261,30 @@ func TestGetTaskFunc(t *testing.T) { "template": { "interface": { "inputs": { - "variables": { - "sorted_list1": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" + "variables": [ + { + "name": "sorted_list1", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } }, - "sorted_list2": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" + { + "name": "sorted_list2", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } } - } + ] } } } @@ -291,24 +302,30 @@ func TestGetTaskFunc(t *testing.T) { "template": { "interface": { "inputs": { - "variables": { - "sorted_list1": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" + "variables": [ + { + "name": "sorted_list1", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } }, - "sorted_list2": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" + { + "name": "sorted_list2", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } } - } + ] } } } @@ -363,24 +380,30 @@ func TestGetTaskFuncLatest(t *testing.T) { "template": { "interface": { "inputs": { - "variables": { - "sorted_list1": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" + "variables": [ + { + "name": "sorted_list1", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } }, - "sorted_list2": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" + { + "name": "sorted_list2", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } } - } + ] } } } @@ -412,24 +435,30 @@ func TestGetTaskWithVersion(t *testing.T) { "template": { "interface": { "inputs": { - "variables": { - "sorted_list1": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" + "variables": [ + { + "name": "sorted_list1", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } }, - "sorted_list2": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" + { + "name": "sorted_list2", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } } - } + ] } } } @@ -447,7 +476,90 @@ func TestGetTasks(t *testing.T) { mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `[{"id": {"name": "task1","version": "v2"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + tearDownAndVerify(t, `[ + { + "id": { + "name": "task1", + "version": "v2" + }, + "closure": { + "compiledTask": { + "template": { + "interface": { + "inputs": { + "variables": [ + { + "name": "sorted_list1", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } + }, + { + "name": "sorted_list2", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } + } + ] + } + } + } + }, + "createdAt": "1970-01-01T00:00:01Z" + } + }, + { + "id": { + "name": "task1", + "version": "v1" + }, + "closure": { + "compiledTask": { + "template": { + "interface": { + "inputs": { + "variables": [ + { + "name": "sorted_list1", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } + }, + { + "name": "sorted_list2", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } + } + ] + } + } + } + }, + "createdAt": "1970-01-01T00:00:00Z" + } + } +]`) } func TestGetTasksFilters(t *testing.T) { @@ -459,7 +571,47 @@ func TestGetTasksFilters(t *testing.T) { mockClient.OnListTasksMatch(ctx, resourceListFilterRequestTask).Return(taskListFilterResponse, nil) err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}`) + tearDownAndVerify(t, `{ + "id": { + "name": "task1", + "version": "v1" + }, + "closure": { + "compiledTask": { + "template": { + "interface": { + "inputs": { + "variables": [ + { + "name": "sorted_list1", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } + }, + { + "name": "sorted_list2", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } + } + ] + } + } + } + }, + "createdAt": "1970-01-01T00:00:00Z" + } +}`) } func TestGetTaskWithExecFile(t *testing.T) { @@ -484,24 +636,30 @@ func TestGetTaskWithExecFile(t *testing.T) { "template": { "interface": { "inputs": { - "variables": { - "sorted_list1": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" + "variables": [ + { + "name": "sorted_list1", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } }, - "sorted_list2": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" + { + "name": "sorted_list2", + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" + } } - } + ] } } } diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 2670b7f10d..f461aac9e3 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -87,8 +87,8 @@ Usage var workflowColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, - {Header: "Inputs", JSONPath: "$.closure.compiledWorkflow.primary.template.interface.inputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, - {Header: "Outputs", JSONPath: "$.closure.compiledWorkflow.primary.template.interface.outputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, + {Header: "Inputs", JSONPath: "$.closure.compiledWorkflow.primary.template.interface.inputs.variables[0].var.description"}, + {Header: "Outputs", JSONPath: "$.closure.compiledWorkflow.primary.template.interface.outputs.variables[0].var.description"}, {Header: "Created At", JSONPath: "$.closure.createdAt"}, } diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go index 46ad846cdd..54c826d423 100644 --- a/flytectl/cmd/get/workflow_test.go +++ b/flytectl/cmd/get/workflow_test.go @@ -38,31 +38,35 @@ func getWorkflowSetup() { Domain: domainValue, }, } - - variableMap := map[string]*core.Variable{ - "var1": { - Type: &core.LiteralType{ - Type: &core.LiteralType_CollectionType{ - CollectionType: &core.LiteralType{ - Type: &core.LiteralType_Simple{ - Simple: core.SimpleType_INTEGER, + variableMap := []*core.VariableMapEntry{ + { + Name: "var1", + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, }, }, }, + Description: "var1", }, - Description: "var1", - }, - "var2": { - Type: &core.LiteralType{ - Type: &core.LiteralType_CollectionType{ - CollectionType: &core.LiteralType{ - Type: &core.LiteralType_Simple{ - Simple: core.SimpleType_INTEGER, + }, { + Name: "var2", + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, }, }, }, + Description: "var2 long descriptions probably needs truncate", }, - Description: "var2 long descriptions probably needs truncate", }, } workflow1 = &admin.Workflow{ diff --git a/flytectl/go.mod b/flytectl/go.mod index 533ac14d2f..1873b540e2 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -11,7 +11,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.19.24 + github.com/flyteorg/flyteidl v0.20.2 github.com/flyteorg/flytestdlib v0.3.34 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 diff --git a/flytectl/go.sum b/flytectl/go.sum index c99b90cda6..1c820fdecf 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -345,8 +345,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.19.24 h1:aiBKTFNKZpIvOfcI051I33LnhQl54N3dhkaubucOg+E= -github.com/flyteorg/flyteidl v0.19.24/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.20.2 h1:3DDj1y9Axmb35SskN/h2nRgohWhGBPGxmJSX7b/Y2rk= +github.com/flyteorg/flyteidl v0.20.2/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.34 h1:OOuV03X8c1AWInzBU6IRsqpEF6y8WDJngbPcdL4VktY= github.com/flyteorg/flytestdlib v0.3.34/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= diff --git a/flytectl/pkg/ext/launch_plan_fetcher_test.go b/flytectl/pkg/ext/launch_plan_fetcher_test.go index 39d0121c93..e38d0d054e 100644 --- a/flytectl/pkg/ext/launch_plan_fetcher_test.go +++ b/flytectl/pkg/ext/launch_plan_fetcher_test.go @@ -27,9 +27,10 @@ func getLaunchPlanFetcherSetup() { adminClient = new(mocks.AdminServiceClient) adminFetcherExt = AdminFetcherExtClient{AdminClient: adminClient} - parameterMap := map[string]*core.Parameter{ - "numbers": { - Var: &core.Variable{ + parameterMap := []*core.ParameterMapEntry{ + { + Name: "numbers", + Parameter: &core.Parameter{Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_CollectionType{ CollectionType: &core.LiteralType{ @@ -39,40 +40,42 @@ func getLaunchPlanFetcherSetup() { }, }, }, - }, + }}, }, - "numbers_count": { - Var: &core.Variable{ + { + Name: "numbers_count", + Parameter: &core.Parameter{Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, }, }, - }, + }}, }, - "run_local_at_count": { - Var: &core.Variable{ + { + Name: "run_local_at_count", + Parameter: &core.Parameter{Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, }, }, }, - Behavior: &core.Parameter_Default{ - Default: &core.Literal{ - Value: &core.Literal_Scalar{ - Scalar: &core.Scalar{ - Value: &core.Scalar_Primitive{ - Primitive: &core.Primitive{ - Value: &core.Primitive_Integer{ - Integer: 10, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, + }, }, }, }, }, }, - }, - }, + }}, }, } launchPlan1 = &admin.LaunchPlan{ diff --git a/flytectl/pkg/ext/task_fetcher_test.go b/flytectl/pkg/ext/task_fetcher_test.go index 0bfc9ef8dd..50d14e2144 100644 --- a/flytectl/pkg/ext/task_fetcher_test.go +++ b/flytectl/pkg/ext/task_fetcher_test.go @@ -41,9 +41,14 @@ func getTaskFetcherSetup() { }, }, } - variableMap := map[string]*core.Variable{ - "sorted_list1": &sortedListLiteralType, - "sorted_list2": &sortedListLiteralType, + variableMap := []*core.VariableMapEntry{ + { + Name: "sorted_list1", + Var: &sortedListLiteralType, + }, { + Name: "sorted_list2", + Var: &sortedListLiteralType, + }, } task1 := &admin.Task{ diff --git a/flytectl/pkg/ext/workflow_fetcher_test.go b/flytectl/pkg/ext/workflow_fetcher_test.go index 9ae96612a6..c8da9b2373 100644 --- a/flytectl/pkg/ext/workflow_fetcher_test.go +++ b/flytectl/pkg/ext/workflow_fetcher_test.go @@ -38,9 +38,14 @@ func getWorkflowFetcherSetup() { }, }, } - variableMap := map[string]*core.Variable{ - "sorted_list1": &sortedListLiteralType, - "sorted_list2": &sortedListLiteralType, + variableMap := []*core.VariableMapEntry{ + { + Name: "sorted_list1", + Var: &sortedListLiteralType, + }, { + Name: "sorted_list2", + Var: &sortedListLiteralType, + }, } var compiledTasks []*core.CompiledTask diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index 75d67208eb..0f11d15ac7 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -6,7 +6,6 @@ import ( "fmt" "net/url" "os" - "sort" "strings" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -170,50 +169,37 @@ func printJSONYaml(format OutputFormat, v interface{}) error { return nil } -func FormatVariableDescriptions(variableMap map[string]*core.Variable) { - keys := make([]string, 0, len(variableMap)) - // sort the keys for testing and consistency with other output formats - for k := range variableMap { - keys = append(keys, k) - } - sort.Strings(keys) - +func FormatVariableDescriptions(variableMap []*core.VariableMapEntry) { var descriptions []string - for _, k := range keys { - v := variableMap[k] + for _, e := range variableMap { + if e.Var == nil { + continue + } // a: a isn't very helpful - if k != v.Description { - descriptions = append(descriptions, getTruncatedLine(fmt.Sprintf("%s: %s", k, v.Description))) + if e.Name != e.Var.Description { + descriptions = append(descriptions, getTruncatedLine(fmt.Sprintf("%s: %s", e.Name, e.Var.Description))) } else { - descriptions = append(descriptions, getTruncatedLine(k)) + descriptions = append(descriptions, getTruncatedLine(e.Name)) } } - variableMap[DefaultFormattedDescriptionsKey] = &core.Variable{Description: strings.Join(descriptions, "\n")} + variableMap[0] = &core.VariableMapEntry{Var: &core.Variable{Description: strings.Join(descriptions, "\n")}} } -func FormatParameterDescriptions(parameterMap map[string]*core.Parameter) { - keys := make([]string, 0, len(parameterMap)) - // sort the keys for testing and consistency with other output formats - for k := range parameterMap { - keys = append(keys, k) - } - sort.Strings(keys) - +func FormatParameterDescriptions(parameterMap []*core.ParameterMapEntry) { var descriptions []string - for _, k := range keys { - v := parameterMap[k] - if v.Var == nil { + for _, e := range parameterMap { + if e.Parameter == nil || e.Parameter.Var == nil { continue } // a: a isn't very helpful - if k != v.Var.Description { - descriptions = append(descriptions, getTruncatedLine(fmt.Sprintf("%s: %s", k, v.Var.Description))) + if e.Name != e.Parameter.Var.Description { + descriptions = append(descriptions, getTruncatedLine(fmt.Sprintf("%s: %s", e.Name, e.Parameter.Var.Description))) } else { - descriptions = append(descriptions, getTruncatedLine(k)) + descriptions = append(descriptions, getTruncatedLine(e.Name)) } } - parameterMap[DefaultFormattedDescriptionsKey] = &core.Parameter{Var: &core.Variable{Description: strings.Join(descriptions, "\n")}} + parameterMap[0] = &core.ParameterMapEntry{Parameter: &core.Parameter{Var: &core.Variable{Description: strings.Join(descriptions, "\n")}}} } func getTruncatedLine(line string) string { diff --git a/flytectl/pkg/printer/printer_test.go b/flytectl/pkg/printer/printer_test.go index 6d5441b9af..1d0ee4e15c 100644 --- a/flytectl/pkg/printer/printer_test.go +++ b/flytectl/pkg/printer/printer_test.go @@ -150,9 +150,15 @@ func TestPrint(t *testing.T) { }, }, } - variableMap := map[string]*core.Variable{ - "sorted_list1": &sortedListLiteralType, - "sorted_list2": &sortedListLiteralType, + variableMap := []*core.VariableMapEntry{ + { + Name: "sorted_list1", + Var: &sortedListLiteralType, + }, + { + Name: "sorted_list2", + Var: &sortedListLiteralType, + }, } var compiledTasks []*core.CompiledTask @@ -275,14 +281,26 @@ func TestFormatVariableDescriptions(t *testing.T) { barVar := &core.Variable{ Description: "bar", } - variableMap := map[string]*core.Variable{ - "var1": fooVar, - "var2": barVar, - "foo": fooVar, - "bar": barVar, + variableMap := []*core.VariableMapEntry{ + { + Name: "var1", + Var: fooVar, + }, + { + Name: "var2", + Var: barVar, + }, + { + Name: "foo", + Var: fooVar, + }, + { + Name: "bar", + Var: barVar, + }, } FormatVariableDescriptions(variableMap) - assert.Equal(t, "bar\nfoo\nvar1: foo\nvar2: bar", variableMap[DefaultFormattedDescriptionsKey].Description) + assert.Equal(t, "var1: foo\nvar2: bar\nfoo\nbar", variableMap[0].Var.Description) } func TestFormatParameterDescriptions(t *testing.T) { @@ -297,13 +315,28 @@ func TestFormatParameterDescriptions(t *testing.T) { }, } emptyParam := &core.Parameter{} - paramMap := map[string]*core.Parameter{ - "var1": fooParam, - "var2": barParam, - "foo": fooParam, - "bar": barParam, - "empty": emptyParam, + paramMap := []*core.ParameterMapEntry{ + { + Name: "var1", + Parameter: fooParam, + }, + { + Name: "var2", + Parameter: barParam, + }, + { + Name: "foo", + Parameter: fooParam, + }, + { + Name: "bar", + Parameter: barParam, + }, + { + Name: "empty", + Parameter: emptyParam, + }, } FormatParameterDescriptions(paramMap) - assert.Equal(t, "bar\nfoo\nvar1: foo\nvar2: bar", paramMap[DefaultFormattedDescriptionsKey].Var.Description) + assert.Equal(t, "var1: foo\nvar2: bar\nfoo\nbar", paramMap[0].Parameter.Var.Description) } diff --git a/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json b/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json index baae3d9926..6b7330e1d7 100644 --- a/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json +++ b/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json @@ -11,24 +11,30 @@ "metadata": {}, "interface": { "inputs": { - "variables": { - "my_input": { - "type": { - "simple": "FLOAT" - }, - "description": "my_input" + "variables": [ + { + "name": "my_input", + "var": { + "type": { + "simple": "FLOAT" + }, + "description": "my_input" + } } - } + ] }, "outputs": { - "variables": { - "o0": { - "type": { - "simple": "FLOAT" - }, - "description": "o0" + "variables": [ + { + "name": "o0", + "var": { + "type": { + "simple": "FLOAT" + }, + "description": "o0" + } } - } + ] } }, "nodes": [ @@ -227,7 +233,7 @@ ], "error": { "failedNodeId": "inner_fractions", - "message": "Only \u003c0.7 allowed" + "message": "Only <0.7 allowed" } } } @@ -424,24 +430,30 @@ }, "interface": { "inputs": { - "variables": { - "n": { - "type": { - "simple": "FLOAT" - }, - "description": "n" + "variables": [ + { + "name": "n", + "var": { + "type": { + "simple": "FLOAT" + }, + "description": "n" + } } - } + ] }, "outputs": { - "variables": { - "o0": { - "type": { - "simple": "FLOAT" - }, - "description": "o0" + "variables": [ + { + "name": "o0", + "var": { + "type": { + "simple": "FLOAT" + }, + "description": "o0" + } } - } + ] } }, "container": { @@ -497,24 +509,30 @@ }, "interface": { "inputs": { - "variables": { - "n": { - "type": { - "simple": "FLOAT" - }, - "description": "n" + "variables": [ + { + "name": "n", + "var": { + "type": { + "simple": "FLOAT" + }, + "description": "n" + } } - } + ] }, "outputs": { - "variables": { - "o0": { - "type": { - "simple": "FLOAT" - }, - "description": "o0" + "variables": [ + { + "name": "o0", + "var": { + "type": { + "simple": "FLOAT" + }, + "description": "o0" + } } - } + ] } }, "container": { diff --git a/flytectl/pkg/visualize/testdata/compiled_subworkflows.json b/flytectl/pkg/visualize/testdata/compiled_subworkflows.json index 8bbf441367..b46a334701 100644 --- a/flytectl/pkg/visualize/testdata/compiled_subworkflows.json +++ b/flytectl/pkg/visualize/testdata/compiled_subworkflows.json @@ -11,36 +11,48 @@ "metadata": {}, "interface": { "inputs": { - "variables": { - "a": { - "type": { - "simple": "INTEGER" - }, - "description": "a" + "variables": [ + { + "name": "a", + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "a" + } } - } + ] }, "outputs": { - "variables": { - "o0": { - "type": { - "simple": "INTEGER" - }, - "description": "o0" + "variables": [ + { + "name": "o0", + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "o0" + } }, - "o1": { - "type": { - "simple": "STRING" - }, - "description": "o1" + { + "name": "o1", + "var": { + "type": { + "simple": "STRING" + }, + "description": "o1" + } }, - "o2": { - "type": { - "simple": "STRING" - }, - "description": "o2" + { + "name": "o2", + "var": { + "type": { + "simple": "STRING" + }, + "description": "o2" + } } - } + ] } }, "nodes": [ @@ -222,30 +234,39 @@ "metadata": {}, "interface": { "inputs": { - "variables": { - "a": { - "type": { - "simple": "INTEGER" - }, - "description": "a" + "variables": [ + { + "name": "a", + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "a" + } } - } + ] }, "outputs": { - "variables": { - "o0": { - "type": { - "simple": "STRING" - }, - "description": "o0" + "variables": [ + { + "name": "o0", + "var": { + "type": { + "simple": "STRING" + }, + "description": "o0" + } }, - "o1": { - "type": { - "simple": "STRING" - }, - "description": "o1" + { + "name": "o1", + "var": { + "type": { + "simple": "STRING" + }, + "description": "o1" + } } - } + ] } }, "nodes": [ @@ -419,30 +440,39 @@ }, "interface": { "inputs": { - "variables": { - "a": { - "type": { - "simple": "INTEGER" - }, - "description": "a" + "variables": [ + { + "name": "a", + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "a" + } } - } + ] }, "outputs": { - "variables": { - "c": { - "type": { - "simple": "STRING" - }, - "description": "c" + "variables": [ + { + "name": "c", + "var": { + "type": { + "simple": "STRING" + }, + "description": "c" + } }, - "t1_int_output": { - "type": { - "simple": "INTEGER" - }, - "description": "t1_int_output" + { + "name": "t1_int_output", + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "t1_int_output" + } } - } + ] } }, "container": { @@ -478,5 +508,4 @@ } } ] -} - +} \ No newline at end of file From 6a8bb243abafd89faa3907a37cd522b237f0b7aa Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Thu, 2 Sep 2021 14:12:35 -0700 Subject: [PATCH 140/645] Update documentation (#173) Signed-off-by: Flyte-Bot Co-authored-by: EngHabu --- flytectl/docs/source/gen/flytectl_update.rst | 7 +- .../gen/flytectl_update_launchplan-meta.rst | 94 +++++++++++++++++++ .../source/gen/flytectl_update_launchplan.rst | 24 ++--- ...task.rst => flytectl_update_task-meta.rst} | 10 +- ....rst => flytectl_update_workflow-meta.rst} | 10 +- 5 files changed, 118 insertions(+), 27 deletions(-) create mode 100644 flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst rename flytectl/docs/source/gen/{flytectl_update_task.rst => flytectl_update_task-meta.rst} (96%) rename flytectl/docs/source/gen/{flytectl_update_workflow.rst => flytectl_update_workflow-meta.rst} (96%) diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 3336ec4509..cb65073fef 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -76,11 +76,12 @@ SEE ALSO * :doc:`flytectl_update_cluster-resource-attribute` - Updates matchable resources of cluster attributes * :doc:`flytectl_update_execution-cluster-label` - Updates matchable resources of execution cluster label * :doc:`flytectl_update_execution-queue-attribute` - Updates matchable resources of execution queue attributes -* :doc:`flytectl_update_launchplan` - Updates launch plan metadata +* :doc:`flytectl_update_launchplan` - Updates launch plan status +* :doc:`flytectl_update_launchplan-meta` - Updates launch plan metadata * :doc:`flytectl_update_plugin-override` - Updates matchable resources of plugin overrides * :doc:`flytectl_update_project` - Updates project resources -* :doc:`flytectl_update_task` - Updates task metadata +* :doc:`flytectl_update_task-meta` - Updates task metadata * :doc:`flytectl_update_task-resource-attribute` - Updates matchable resources of task attributes -* :doc:`flytectl_update_workflow` - Updates workflow metadata * :doc:`flytectl_update_workflow-execution-config` - Updates matchable resources of workflow execution config +* :doc:`flytectl_update_workflow-meta` - Updates workflow metadata diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst new file mode 100644 index 0000000000..14717eb90c --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -0,0 +1,94 @@ +.. _flytectl_update_launchplan-meta: + +flytectl update launchplan-meta +------------------------------- + +Updates launch plan metadata + +Synopsis +~~~~~~~~ + + + +Following command updates the description on the launchplan. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort example" + +Archiving launchplan named entity is not supported and would throw an error. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + +Activating launchplan named entity would be a noop. +:: + + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate + +Usage + + +:: + + flytectl update launchplan-meta [flags] + +Options +~~~~~~~ + +:: + + --activate activate the named entity. + --archive archive named entity. + --description string description of the named entity. + --dryRun execute command without making any modifications. + -h, --help help for launchplan-meta + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Used for updating flyte resources eg: project. + diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 5ad0814622..41f7995b27 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -3,27 +3,23 @@ flytectl update launchplan -------------------------- -Updates launch plan metadata +Updates launch plan status Synopsis ~~~~~~~~ -Following command updates the description on the launchplan. +Activating launchplan activates the scheduled job associated with it :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort example" + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --activate -Archiving launchplan named entity is not supported and would throw an error. +Archiving launchplan deschedules any scheduled job associated with it :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --archive -Activating launchplan named entity would be a noop. -:: - - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate Usage @@ -37,11 +33,11 @@ Options :: - --activate activate the named entity. - --archive archive named entity. - --description string description of the named entity. - --dryRun execute command without making any modifications. - -h, --help help for launchplan + --activate activate launchplan. + --archive archive launchplan. + --dryRun execute command without making any modifications. + -h, --help help for launchplan + --version string version of the launchplan to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_task.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst similarity index 96% rename from flytectl/docs/source/gen/flytectl_update_task.rst rename to flytectl/docs/source/gen/flytectl_update_task-meta.rst index 786d17ff96..f25862a7f9 100644 --- a/flytectl/docs/source/gen/flytectl_update_task.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -1,7 +1,7 @@ -.. _flytectl_update_task: +.. _flytectl_update_task-meta: -flytectl update task --------------------- +flytectl update task-meta +------------------------- Updates task metadata @@ -30,7 +30,7 @@ Usage :: - flytectl update task [flags] + flytectl update task-meta [flags] Options ~~~~~~~ @@ -41,7 +41,7 @@ Options --archive archive named entity. --description string description of the named entity. --dryRun execute command without making any modifications. - -h, --help help for task + -h, --help help for task-meta Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_workflow.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst similarity index 96% rename from flytectl/docs/source/gen/flytectl_update_workflow.rst rename to flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index c717ba53e1..404dd37b52 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -1,7 +1,7 @@ -.. _flytectl_update_workflow: +.. _flytectl_update_workflow-meta: -flytectl update workflow ------------------------- +flytectl update workflow-meta +----------------------------- Updates workflow metadata @@ -30,7 +30,7 @@ Usage :: - flytectl update workflow [flags] + flytectl update workflow-meta [flags] Options ~~~~~~~ @@ -41,7 +41,7 @@ Options --archive archive named entity. --description string description of the named entity. --dryRun execute command without making any modifications. - -h, --help help for workflow + -h, --help help for workflow-meta Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 24710f743e8cac29290ca38a4aff1975d39a833f Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Fri, 3 Sep 2021 12:19:52 +0530 Subject: [PATCH 141/645] Hotfix register example (#172) * fix register example Signed-off-by: Yuvraj --- .../subcommand/register/files_config.go | 3 +- .../subcommand/register/filesconfig_flags.go | 3 +- .../register/filesconfig_flags_test.go | 14 ++++ flytectl/cmd/register/examples.go | 33 ++++++++-- flytectl/cmd/register/examples_test.go | 4 +- flytectl/cmd/register/files.go | 3 + flytectl/cmd/register/register_util.go | 65 +++++++++---------- flytectl/cmd/register/register_util_test.go | 33 ++++------ 8 files changed, 92 insertions(+), 66 deletions(-) diff --git a/flytectl/cmd/config/subcommand/register/files_config.go b/flytectl/cmd/config/subcommand/register/files_config.go index c489dd38ed..8aea9f099b 100644 --- a/flytectl/cmd/config/subcommand/register/files_config.go +++ b/flytectl/cmd/config/subcommand/register/files_config.go @@ -15,7 +15,8 @@ type FilesConfig struct { ContinueOnError bool `json:"continueOnError" pflag:",continue on error when registering files."` Archive bool `json:"archive" pflag:",pass in archive file either an http link or local path."` AssumableIamRole string `json:"assumableIamRole" pflag:", custom assumable iam auth role to register launch plans with."` - K8ServiceAccount string `json:"k8ServiceAccount" pflag:", custom kubernetes service account auth role to register launch plans with."` + K8sServiceAccount string `json:"k8sServiceAccount" pflag:", custom kubernetes service account auth role to register launch plans with."` + K8ServiceAccount string `json:"k8ServiceAccount" pflag:", deprecated. Please use --K8sServiceAccount"` OutputLocationPrefix string `json:"outputLocationPrefix" pflag:", custom output location prefix for offloaded types (files/schemas)."` SourceUploadPath string `json:"sourceUploadPath" pflag:", Location for source code in storage."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go index cd19e456cc..5727138104 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go @@ -54,7 +54,8 @@ func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.BoolVar(&DefaultFilesConfig.ContinueOnError, fmt.Sprintf("%v%v", prefix, "continueOnError"), DefaultFilesConfig.ContinueOnError, "continue on error when registering files.") cmdFlags.BoolVar(&DefaultFilesConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), DefaultFilesConfig.Archive, "pass in archive file either an http link or local path.") cmdFlags.StringVar(&DefaultFilesConfig.AssumableIamRole, fmt.Sprintf("%v%v", prefix, "assumableIamRole"), DefaultFilesConfig.AssumableIamRole, " custom assumable iam auth role to register launch plans with.") - cmdFlags.StringVar(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), DefaultFilesConfig.K8ServiceAccount, " custom kubernetes service account auth role to register launch plans with.") + cmdFlags.StringVar(&DefaultFilesConfig.K8sServiceAccount, fmt.Sprintf("%v%v", prefix, "k8sServiceAccount"), DefaultFilesConfig.K8sServiceAccount, " custom kubernetes service account auth role to register launch plans with.") + cmdFlags.StringVar(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), DefaultFilesConfig.K8ServiceAccount, " deprecated. Please use --K8sServiceAccount") cmdFlags.StringVar(&DefaultFilesConfig.OutputLocationPrefix, fmt.Sprintf("%v%v", prefix, "outputLocationPrefix"), DefaultFilesConfig.OutputLocationPrefix, " custom output location prefix for offloaded types (files/schemas).") cmdFlags.StringVar(&DefaultFilesConfig.SourceUploadPath, fmt.Sprintf("%v%v", prefix, "sourceUploadPath"), DefaultFilesConfig.SourceUploadPath, " Location for source code in storage.") cmdFlags.BoolVar(&DefaultFilesConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultFilesConfig.DryRun, "execute command without making any modifications.") diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go index 951cfbaecc..6f46245d9f 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go @@ -155,6 +155,20 @@ func TestFilesConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_k8sServiceAccount", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("k8sServiceAccount", testValue) + if vString, err := cmdFlags.GetString("k8sServiceAccount"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vString), &actual.K8sServiceAccount) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_k8ServiceAccount", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index 0952571c12..264324876d 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -4,6 +4,10 @@ import ( "context" "fmt" + "github.com/flyteorg/flytestdlib/logger" + + "github.com/google/go-github/github" + rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" ) @@ -16,27 +20,42 @@ Registers all latest flytesnacks example bin/flytectl register examples -d development -p flytesnacks +Registers specific release of flytesnacks example +:: + bin/flytectl register examples -d development -p flytesnacks v0.2.176 + +Note: register command automatically override the version with release version Usage ` ) var ( - githubOrg = "flyteorg" - githubRepository = "flytesnacks" - snackReleaseURL = "https://github.com/flyteorg/flytesnacks/releases/download/%s/flytesnacks-%s.tgz" - flyteManifest = "https://github.com/flyteorg/flytesnacks/releases/download/%s/flyte_tests_manifest.json" + githubOrg = "flyteorg" + flytesnacksRepository = "flytesnacks" ) func registerExamplesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - flytesnacks, tag, err := getFlyteTestManifest(githubOrg, githubRepository) + var examples []github.ReleaseAsset + var release string + + // Deprecated checks for --k8Service + deprecatedCheck(ctx) + + if len(args) == 1 { + release = args[0] + } + examples, tag, err := getAllFlytesnacksExample(githubOrg, flytesnacksRepository, release) if err != nil { return err } + + logger.Infof(ctx, "Register started for %s %s release https://github.com/%s/%s/releases/tag/%s", flytesnacksRepository, tag, githubOrg, flytesnacksRepository, tag) rconfig.DefaultFilesConfig.Archive = true - for _, v := range flytesnacks { + rconfig.DefaultFilesConfig.Version = tag + for _, v := range examples { args := []string{ - fmt.Sprintf(snackReleaseURL, tag, v.Name), + *v.BrowserDownloadURL, } if err := Register(ctx, args, cmdCtx); err != nil { return fmt.Errorf("Example %v failed to register %v", v.Name, err) diff --git a/flytectl/cmd/register/examples_test.go b/flytectl/cmd/register/examples_test.go index 1c004a74a9..5b38de8196 100644 --- a/flytectl/cmd/register/examples_test.go +++ b/flytectl/cmd/register/examples_test.go @@ -16,11 +16,11 @@ func TestRegisterExamplesFunc(t *testing.T) { func TestRegisterExamplesFuncErr(t *testing.T) { setup() registerFilesSetup() - githubRepository = "testingsnacks" + flytesnacksRepository = "testingsnacks" args = []string{""} err := registerExamplesFunc(ctx, args, cmdCtx) // TODO (Yuvraj) make test to success after fixing flytesnacks bug assert.NotNil(t, err) - githubRepository = "flytesnacks" + flytesnacksRepository = "flytesnacks" } diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index 210bb1bba2..99d8a99090 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -99,6 +99,9 @@ func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) var _err error var dataRefs []string + // Deprecated checks for --k8Service + deprecatedCheck(ctx) + // getSerializeOutputFiles will return you all proto and source code compress file in sorted order dataRefs, tmpDir, err := getSerializeOutputFiles(ctx, args) if err != nil { diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 07f62d6246..fa51cc29c8 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -55,22 +55,8 @@ type HTTPClient interface { Do(req *http.Request) (*http.Response, error) } -var FlyteSnacksRelease []FlyteSnack var Client *storage.DataStore -// FlyteSnack Defines flyte test manifest structure -type FlyteSnack struct { - Name string `json:"name"` - Priority string `json:"priority"` - Path string `json:"path"` - ExitCondition Condition `json:"exitCondition"` -} - -type Condition struct { - ExitSuccess bool `json:"exit_success"` - ExitMessage string `json:"exit_message"` -} - var httpClient HTTPClient func init() { @@ -242,12 +228,12 @@ func hydrateTaskSpec(task *admin.TaskSpec, sourceCode string) error { func hydrateLaunchPlanSpec(lpSpec *admin.LaunchPlanSpec) { assumableIamRole := len(rconfig.DefaultFilesConfig.AssumableIamRole) > 0 - k8ServiceAcct := len(rconfig.DefaultFilesConfig.K8ServiceAccount) > 0 + k8sServiceAcct := len(rconfig.DefaultFilesConfig.K8sServiceAccount) > 0 outputLocationPrefix := len(rconfig.DefaultFilesConfig.OutputLocationPrefix) > 0 - if assumableIamRole || k8ServiceAcct { + if assumableIamRole || k8sServiceAcct { lpSpec.AuthRole = &admin.AuthRole{ AssumableIamRole: rconfig.DefaultFilesConfig.AssumableIamRole, - KubernetesServiceAccount: rconfig.DefaultFilesConfig.K8ServiceAccount, + KubernetesServiceAccount: rconfig.DefaultFilesConfig.K8sServiceAccount, } } if outputLocationPrefix { @@ -468,32 +454,34 @@ func getJSONSpec(message proto.Message) string { return jsonSpec } -func getFlyteTestManifest(org, repository string) ([]FlyteSnack, string, error) { +func filterExampleFromRelease(releases github.RepositoryRelease) []github.ReleaseAsset { + var assets []github.ReleaseAsset + for _, v := range releases.Assets { + if strings.HasSuffix(*v.Name, ".tgz") { + assets = append(assets, v) + } + } + return assets +} + +func getAllFlytesnacksExample(org, repository, release string) ([]github.ReleaseAsset, string, error) { c := github.NewClient(nil) opt := &github.ListOptions{Page: 1, PerPage: 1} + if len(release) > 0 { + releases, _, err := c.Repositories.GetReleaseByTag(context.Background(), org, repository, release) + if err != nil { + return nil, "", err + } + return filterExampleFromRelease(*releases), release, nil + } releases, _, err := c.Repositories.ListReleases(context.Background(), org, repository, opt) if err != nil { return nil, "", err } if len(releases) == 0 { - return nil, "", fmt.Errorf("Repository doesn't have any release") + return nil, "", fmt.Errorf("repository doesn't have any release") } - response, err := http.Get(fmt.Sprintf(flyteManifest, *releases[0].TagName)) - if err != nil { - return nil, "", err - } - defer response.Body.Close() - - data, err := ioutil.ReadAll(response.Body) - if err != nil { - return nil, "", err - } - - err = json.Unmarshal(data, &FlyteSnacksRelease) - if err != nil { - return nil, "", err - } - return FlyteSnacksRelease, *releases[0].TagName, nil + return filterExampleFromRelease(*releases[0]), *releases[0].TagName, nil } @@ -580,3 +568,10 @@ func segregateSourceAndProtos(dataRefs []string) (string, []string, []string) { } return sourceCode, validProto, InvalidFiles } + +func deprecatedCheck(ctx context.Context) { + if len(rconfig.DefaultFilesConfig.K8ServiceAccount) > 0 { + logger.Warning(ctx, "--K8ServiceAccount is deprecated, Please use --K8sServiceAccount") + rconfig.DefaultFilesConfig.K8sServiceAccount = rconfig.DefaultFilesConfig.K8ServiceAccount + } +} diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index b4b11563a4..bb85c1c22f 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -53,7 +53,7 @@ func registerFilesSetup() { cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) rconfig.DefaultFilesConfig.AssumableIamRole = "" - rconfig.DefaultFilesConfig.K8ServiceAccount = "" + rconfig.DefaultFilesConfig.K8sServiceAccount = "" rconfig.DefaultFilesConfig.OutputLocationPrefix = "" } @@ -278,19 +278,19 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { hydrateLaunchPlanSpec(lpSpec) assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole"}, lpSpec.AuthRole) }) - t.Run("k8Service account override", func(t *testing.T) { + t.Run("k8sService account override", func(t *testing.T) { setup() registerFilesSetup() - rconfig.DefaultFilesConfig.K8ServiceAccount = "k8Account" + rconfig.DefaultFilesConfig.K8sServiceAccount = "k8Account" lpSpec := &admin.LaunchPlanSpec{} hydrateLaunchPlanSpec(lpSpec) assert.Equal(t, &admin.AuthRole{KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) }) - t.Run("Both k8Service and IamRole", func(t *testing.T) { + t.Run("Both k8sService and IamRole", func(t *testing.T) { setup() registerFilesSetup() rconfig.DefaultFilesConfig.AssumableIamRole = "iamRole" - rconfig.DefaultFilesConfig.K8ServiceAccount = "k8Account" + rconfig.DefaultFilesConfig.K8sServiceAccount = "k8Account" lpSpec := &admin.LaunchPlanSpec{} hydrateLaunchPlanSpec(lpSpec) assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole", @@ -306,13 +306,6 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { }) } -func TestFlyteManifest(t *testing.T) { - _, tag, err := getFlyteTestManifest(githubOrg, githubRepository) - assert.Nil(t, err) - assert.Contains(t, tag, "v") - assert.NotEmpty(t, tag) -} - func TestUploadFastRegisterArtifact(t *testing.T) { t.Run("Successful upload", func(t *testing.T) { testScope := promutils.NewTestScope() @@ -358,22 +351,22 @@ func TestGetStorageClient(t *testing.T) { }) } -func TestGetFlyteTestManifest(t *testing.T) { +func TestGetAllFlytesnacksExample(t *testing.T) { t.Run("Failed to get manifest with wrong name", func(t *testing.T) { - _, tag, err := getFlyteTestManifest("no////ne", "no////ne") + _, tag, err := getAllFlytesnacksExample("no////ne", "no////ne", "") assert.NotNil(t, err) assert.Equal(t, len(tag), 0) }) t.Run("Failed to get release", func(t *testing.T) { - _, tag, err := getFlyteTestManifest("flyteorg", "homebrew-tap") + _, tag, err := getAllFlytesnacksExample("flyteorg", "homebrew-tap", "") assert.NotNil(t, err) assert.Equal(t, len(tag), 0) }) - t.Run("Failed to get manifest", func(t *testing.T) { - flyteManifest = "" - _, tag, err := getFlyteTestManifest("flyteorg", "flytesnacks") - assert.NotNil(t, err) - assert.Equal(t, len(tag), 0) + t.Run("Successfully get examples", func(t *testing.T) { + assets, tag, err := getAllFlytesnacksExample("flyteorg", "flytesnacks", "v0.2.175") + assert.Nil(t, err) + assert.Greater(t, len(tag), 0) + assert.Greater(t, len(assets), 0) }) } From e93d16cfdbce3fd805470285518e06f9181ab900 Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Thu, 9 Sep 2021 07:34:23 +0530 Subject: [PATCH 142/645] fix algolia search (#179) --- flytectl/doc-requirements.in | 2 +- flytectl/doc-requirements.txt | 15 +-- flytectl/docs/source/_static/custom.css | 16 +++ flytectl/docs/source/conf.py | 7 +- flytectl/docs/source/index.rst | 169 ++++++++++++------------ 5 files changed, 111 insertions(+), 98 deletions(-) create mode 100644 flytectl/docs/source/_static/custom.css diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in index e0751192d5..bb24b9a7b1 100644 --- a/flytectl/doc-requirements.in +++ b/flytectl/doc-requirements.in @@ -5,5 +5,5 @@ sphinx-material sphinx-code-include sphinx-copybutton sphinx_fontawesome -sphinx_tabs sphinxcontrib-yt +sphinx-panels diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index 671f3d786e..e3c954b328 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -8,7 +8,7 @@ alabaster==0.7.12 # via sphinx babel==2.9.1 # via sphinx -beautifulsoup4==4.9.3 +beautifulsoup4==4.10.0 # via # furo # sphinx-code-include @@ -19,10 +19,10 @@ charset-normalizer==2.0.4 # via requests css-html-js-minify==2.5.5 # via sphinx-material -docutils==0.16 +docutils==0.17.1 # via # sphinx - # sphinx-tabs + # sphinx-panels git+git://github.com/flyteorg/furo@main # via -r doc-requirements.in idna==3.2 @@ -41,7 +41,6 @@ pygments==2.10.0 # via # sphinx # sphinx-prompt - # sphinx-tabs pyparsing==2.4.7 # via packaging python-slugify[unidecode]==5.0.2 @@ -64,8 +63,8 @@ sphinx==4.1.2 # sphinx-copybutton # sphinx-fontawesome # sphinx-material + # sphinx-panels # sphinx-prompt - # sphinx-tabs # sphinxcontrib-yt sphinx-code-include==1.1.1 # via -r doc-requirements.in @@ -75,9 +74,9 @@ sphinx-fontawesome==0.0.6 # via -r doc-requirements.in sphinx-material==0.0.34 # via -r doc-requirements.in -sphinx-prompt==1.5.0 +sphinx-panels==0.6.0 # via -r doc-requirements.in -sphinx-tabs==3.2.0 +sphinx-prompt==1.5.0 # via -r doc-requirements.in sphinxcontrib-applehelp==1.0.2 # via sphinx @@ -95,7 +94,7 @@ sphinxcontrib-yt==0.2.2 # via -r doc-requirements.in text-unidecode==1.3 # via python-slugify -unidecode==1.2.0 +unidecode==1.3.0 # via python-slugify urllib3==1.26.6 # via requests diff --git a/flytectl/docs/source/_static/custom.css b/flytectl/docs/source/_static/custom.css new file mode 100644 index 0000000000..96f45d4066 --- /dev/null +++ b/flytectl/docs/source/_static/custom.css @@ -0,0 +1,16 @@ +html .tabbed-set > label { + color: var(--color-foreground-border); +} + +html .tabbed-set > input:checked + label { + border-color: var(--color-link); + color: var(--color-link); +} + +html .tabbed-set > label:hover { + color: var(--color-link); +} + +html .tabbed-content { + box-shadow: 0 -.0625rem var(--color-background-border),0 .0625rem var(--color-background-border); +} \ No newline at end of file diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 053bbdf1e3..6767fad9e7 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -23,7 +23,7 @@ author = "Flyte" # The full version, including alpha/beta/rc tags -release = re.sub('^v', '', os.popen('git describe').read().strip()) +release = re.sub("^v", "", os.popen("git describe").read().strip()) version = release @@ -43,8 +43,8 @@ "sphinx-prompt", "sphinx_copybutton", "sphinx_fontawesome", - "sphinx_tabs.tabs", "sphinxcontrib.yt", + "sphinx_panels", ] # build the templated autosummary files @@ -77,7 +77,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path . -exclude_patterns = [u'_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = [u"_build", "Thumbs.db", ".DS_Store"] # The name of the Pygments (syntax highlighting) style to use. pygments_style = "tango" @@ -123,6 +123,7 @@ # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] +html_css_files = ["custom.css"] # Custom sidebar templates, must be a dictionary that maps document names # to template names. diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index bac2ce0607..3125fb7637 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -1,8 +1,8 @@ .. flytectl doc -########################################## +###################### ``Flytectl`` Reference -########################################## +###################### Overview ========= @@ -16,26 +16,23 @@ Install Flytectl is a Golang binary and can be installed on any platform supported by golang +.. tabbed:: OSX -.. tabs:: + .. prompt:: bash $ - .. tab:: OSX + brew install flyteorg/homebrew-tap/flytectl - .. prompt:: bash $ + *Upgrade* existing installation using the following command: - brew install flyteorg/homebrew-tap/flytectl + .. prompt:: bash $ - *Upgrade* existing installation using the following command: + brew update && brew upgrade flytectl - .. prompt:: bash $ +.. tabbed:: Other Operating systems - brew update && brew upgrade flytectl + .. prompt:: bash $ - .. tab:: Other Operating systems - - .. prompt:: bash $ - - curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash + curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash **Test** if Flytectl is installed correctly (your Flytectl version should be > 0.2.0) using the following command: @@ -51,79 +48,79 @@ on command-line. The following configuration is useful to setup. Basic Configuration -------------------- -.. tabs:: Flytectl configuration - - .. tab:: Local Flyte Sandbox - - Automatically configured for you by ``flytectl sandbox`` command. - - .. code-block:: yaml - - admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///localhost:30081 - insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) - authType: Pkce # authType: Pkce # if using authentication or just drop this. - storage: - connection: - access-key: minio - auth-type: accesskey - disable-ssl: true - endpoint: http://localhost:30084 - region: my-region-here - secret-key: miniostorage - container: my-s3-bucket - type: minio - - .. tab:: AWS Configuration - - .. code-block:: yaml - - admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:/// - authType: Pkce # authType: Pkce # if using authentication or just drop this. - insecure: true # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) - storage: - type: stow - stow: - kind: s3 - config: - auth_type: iam - region: # Example: us-east-2 - container: # Example my-bucket. Flyte k8s cluster / service account for execution should have read access to this bucket - - .. tab:: GCS Configuration - - .. code-block:: yaml - - admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:/// - authType: Pkce # authType: Pkce # if using authentication or just drop this. - insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) - storage: - type: stow - stow: - kind: google - config: - json: "" - project_id: # TODO: replace with the GCP project ID - scopes: https://www.googleapis.com/auth/devstorage.read_write - container: # Example my-bucket. Flyte k8s cluster / service account for execution should have access to this bucket - - .. tab:: Others - - For other supported storage backends like Oracle, Azure, etc., refer to the configuration structure `here `__. - - - Place this in $HOME/.flyte directory with name config.yaml. - This file is searched in - - * $HOME/.flyte +Flytectl configuration + +.. tabbed:: Local Flyte Sandbox + + Automatically configured for you by ``flytectl sandbox`` command. + + .. code-block:: yaml + + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:///localhost:30081 + insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + authType: Pkce # authType: Pkce # if using authentication or just drop this. + storage: + connection: + access-key: minio + auth-type: accesskey + disable-ssl: true + endpoint: http://localhost:30084 + region: my-region-here + secret-key: miniostorage + container: my-s3-bucket + type: minio + +.. tabbed:: AWS Configuration + + .. code-block:: yaml + + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:/// + authType: Pkce # authType: Pkce # if using authentication or just drop this. + insecure: true # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + storage: + type: stow + stow: + kind: s3 + config: + auth_type: iam + region: # Example: us-east-2 + container: # Example my-bucket. Flyte k8s cluster / service account for execution should have read access to this bucket + +.. tabbed:: GCS Configuration + + .. code-block:: yaml + + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:/// + authType: Pkce # authType: Pkce # if using authentication or just drop this. + insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + storage: + type: stow + stow: + kind: google + config: + json: "" + project_id: # TODO: replace with the GCP project ID + scopes: https://www.googleapis.com/auth/devstorage.read_write + container: # Example my-bucket. Flyte k8s cluster / service account for execution should have access to this bucket + +.. tabbed:: Others + + For other supported storage backends like Oracle, Azure, etc., refer to the configuration structure `here `__. + + Place the config file in ``$HOME/.flyte`` directory with the name config.yaml. + This file is typically searched in: + + * ``$HOME/.flyte`` * currDir from where you run flytectl - * /etc/flyte/config - You can pass it commandline using --config aswell + * ``/etc/flyte/config`` + + You can pass the file name in the commandline using ``--config `` as well! .. toctree:: From 2761a7200771756f0671d17eb9791797274489e1 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Thu, 9 Sep 2021 14:41:41 +0530 Subject: [PATCH 143/645] added support for helm (#177) * added support for the helm Signed-off-by: Yuvraj --- .../config/subcommand/sandbox/config_flags.go | 4 +- .../subcommand/sandbox/sandbox_config.go | 8 +- flytectl/cmd/sandbox/sandbox.go | 2 +- flytectl/cmd/sandbox/start.go | 114 +++++++++--------- flytectl/cmd/sandbox/start_test.go | 75 ++++++++---- flytectl/pkg/docker/docker_util.go | 7 +- flytectl/pkg/util/githubutil/githubutil.go | 43 +++---- .../pkg/util/githubutil/githubutil_test.go | 27 ++--- 8 files changed, 154 insertions(+), 126 deletions(-) diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index 7126d6a2e3..ca50e9ad28 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -50,7 +50,7 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&DefaultConfig.Source, fmt.Sprintf("%v%v", prefix, "source"), DefaultConfig.Source, " Path of your source code") - cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "Version of flyte") + cmdFlags.StringVar(&DefaultConfig.Source, fmt.Sprintf("%v%v", prefix, "source"), DefaultConfig.Source, "Path of your source code") + cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "Version of flyte. Only support v0.10.0+ flyte release") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index 5d3bfa9184..7005b031b1 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -7,6 +7,10 @@ var ( //Config type Config struct { - Source string `json:"source" pflag:",Path of your source code"` - Version string `json:"version" pflag:",Version of flyte"` + Source string `json:"source" pflag:",Path of your source code"` + + // Flytectl sandbox only support flyte version available in Github release https://github.com/flyteorg/flyte/tags + // Flytectl sandbox will only work for v0.10.0+ + // Default value dind represent the latest release + Version string `json:"version" pflag:",Version of flyte. Only support v0.10.0+ flyte release"` } diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go index 9be32bbba4..b269f378be 100644 --- a/flytectl/cmd/sandbox/sandbox.go +++ b/flytectl/cmd/sandbox/sandbox.go @@ -56,7 +56,7 @@ func CreateSandboxCommand() *cobra.Command { Long: statusLong}, "exec": {CmdFunc: sandboxClusterExec, Aliases: []string{}, ProjectDomainNotRequired: true, Short: execShort, - Long: execLong, PFlagProvider: sandboxConfig.DefaultConfig}, + Long: execLong}, } cmdcore.AddCommands(sandbox, sandboxResourcesFuncs) diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index c5559988fe..b36324be14 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -9,17 +9,15 @@ import ( "path/filepath" "time" + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/pkg/util/githubutil" + "github.com/avast/retry-go" "github.com/olekukonko/tablewriter" corev1api "k8s.io/api/core/v1" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" - "github.com/flyteorg/flytectl/pkg/util/githubutil" - - "github.com/flyteorg/flytestdlib/logger" - "github.com/docker/docker/api/types/mount" - "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/pkg/configutil" "github.com/flyteorg/flytectl/pkg/k8s" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -28,7 +26,6 @@ import ( sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/docker" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/flyteorg/flytectl/pkg/util" ) @@ -47,23 +44,22 @@ Mount your source code repository inside sandbox bin/flytectl sandbox start --source=$HOME/flyteorg/flytesnacks -Run specific version of flyte, Only available after v0.13.0+ +Run specific version of flyte. flytectl sandbox only support flyte version available in Github release https://github.com/flyteorg/flyte/tags :: bin/flytectl sandbox start --version=v0.14.0 +Note: Flytectl sandbox will only work for v0.10.0+ + Usage ` - k8sEndpoint = "https://127.0.0.1:30086" - flyteMinimumVersionSupported = "v0.13.0" - generatedManifest = "/flyteorg/share/flyte_generated.yaml" - flyteNamespace = "flyte" - diskPressureTaint = "node.kubernetes.io/disk-pressure" - taintEffect = "NoSchedule" -) - -var ( - flyteManifest = f.FilePathJoin(f.UserHomeDir(), ".flyte", "flyte_generated.yaml") + k8sEndpoint = "https://127.0.0.1:30086" + flyteNamespace = "flyte" + flyteRepository = "flyte" + dind = "dind" + sandboxSupportedVersion = "v0.10.0" + diskPressureTaint = "node.kubernetes.io/disk-pressure" + taintEffect = "NoSchedule" ) type ExecResult struct { @@ -86,23 +82,23 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm docker.WaitForSandbox(reader, docker.SuccessMessage) } - var k8sClient k8s.K8s - err = retry.Do( - func() error { - k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, k8sEndpoint) + if reader != nil { + var k8sClient k8s.K8s + err = retry.Do( + func() error { + k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, k8sEndpoint) + return err + }, + retry.Attempts(10), + ) + if err != nil { return err - }, - retry.Attempts(10), - ) - if err != nil { - return err - } - - if err := watchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { - return err + } + if err := watchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { + return err + } + util.PrintSandboxMessage() } - - util.PrintSandboxMessage() return nil } @@ -113,7 +109,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu if err.Error() != clierrors.ErrSandboxExists { return nil, err } - fmt.Printf("Existing details of your sandbox:") + fmt.Printf("Existing details of your sandbox") util.PrintSandboxMessage() return nil, nil } @@ -137,35 +133,18 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu volumes = append(volumes, *vol) } - if len(sandboxConfig.DefaultConfig.Version) > 0 { - isGreater, err := util.IsVersionGreaterThan(sandboxConfig.DefaultConfig.Version, flyteMinimumVersionSupported) - if err != nil { - return nil, err - } - if !isGreater { - logger.Infof(ctx, "version flag only supported after with flyte %s+ release", flyteMinimumVersionSupported) - return nil, fmt.Errorf("version flag only supported after with flyte %s+ release", flyteMinimumVersionSupported) - } - if err := githubutil.GetFlyteManifest(sandboxConfig.DefaultConfig.Version, flyteManifest); err != nil { - return nil, err - } - - if vol, err := mountVolume(flyteManifest, generatedManifest); err != nil { - return nil, err - } else if vol != nil { - volumes = append(volumes, *vol) - } - + image, err := getSandboxImage(sandboxConfig.DefaultConfig.Version) + if err != nil { + return nil, err } - - fmt.Printf("%v pulling docker image %s\n", emoji.Whale, docker.ImageName) - if err := docker.PullDockerImage(ctx, cli, docker.ImageName); err != nil { + fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, image) + if err := docker.PullDockerImage(ctx, cli, image); err != nil { return nil, err } fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) exposedPorts, portBindings, _ := docker.GetSandboxPorts() - ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, docker.ImageName) + ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, image) if err != nil { fmt.Printf("%v Something went wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) return nil, err @@ -179,6 +158,29 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu return logReader, nil } +func getSandboxImage(version string) (string, error) { + // Latest release will use image cr.flyte.org/flyteorg/flyte-sandbox:dind + // In case of version flytectl will use cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA} + + var tag = dind + if len(version) > 0 { + isGreater, err := util.IsVersionGreaterThan(version, sandboxSupportedVersion) + if err != nil { + return "", err + } + if !isGreater { + return "", fmt.Errorf("version flag only supported with flyte %s+ release", sandboxSupportedVersion) + } + sha, err := githubutil.GetSHAFromVersion(version, flyteRepository) + if err != nil { + return "", err + } + tag = fmt.Sprintf("%s-%s", dind, sha) + } + + return docker.GetSandboxImage(tag), nil +} + func mountVolume(file, destination string) (*mount.Mount, error) { if len(file) > 0 { source, err := filepath.Abs(file) diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index f2b43ff8da..0d0331968c 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -10,6 +10,8 @@ import ( "strings" "testing" + "github.com/flyteorg/flytectl/pkg/util/githubutil" + "github.com/flyteorg/flytectl/pkg/k8s" "github.com/docker/docker/api/types" @@ -85,10 +87,11 @@ func TestStartSandboxFunc(t *testing.T) { ctx := context.Background() mockDocker := &mocks.Docker{} errCh := make(chan error) + sandboxConfig.DefaultConfig.Version = "" bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -118,7 +121,7 @@ func TestStartSandboxFunc(t *testing.T) { bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -155,6 +158,7 @@ func TestStartSandboxFunc(t *testing.T) { bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = f.UserHomeDir() + sandboxConfig.DefaultConfig.Version = "" volumes := docker.Volumes volumes = append(volumes, mount.Mount{ Type: mount.TypeBind, @@ -163,7 +167,7 @@ func TestStartSandboxFunc(t *testing.T) { }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -192,6 +196,7 @@ func TestStartSandboxFunc(t *testing.T) { bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = "../" + sandboxConfig.DefaultConfig.Version = "" absPath, err := filepath.Abs(sandboxConfig.DefaultConfig.Source) assert.Nil(t, err) volumes := docker.Volumes @@ -202,7 +207,7 @@ func TestStartSandboxFunc(t *testing.T) { }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -232,15 +237,14 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Version = "v0.15.0" sandboxConfig.DefaultConfig.Source = "" + + sha, err := githubutil.GetSHAFromVersion(sandboxConfig.DefaultConfig.Version, "flyte") + assert.Nil(t, err) + volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: flyteManifest, - Target: generatedManifest, - }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(fmt.Sprintf("%s-%s", dind, sha)), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -260,7 +264,7 @@ func TestStartSandboxFunc(t *testing.T) { Follow: true, }).Return(nil, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err := startSandbox(ctx, mockDocker, os.Stdin) + _, err = startSandbox(ctx, mockDocker, os.Stdin) assert.Nil(t, err) }) t.Run("Failed run sandbox cluster with wrong version", func(t *testing.T) { @@ -271,14 +275,9 @@ func TestStartSandboxFunc(t *testing.T) { sandboxConfig.DefaultConfig.Version = "v0.1444.0" sandboxConfig.DefaultConfig.Source = "" volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: flyteManifest, - Target: generatedManifest, - }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -316,7 +315,7 @@ func TestStartSandboxFunc(t *testing.T) { }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -353,7 +352,7 @@ func TestStartSandboxFunc(t *testing.T) { }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -393,7 +392,7 @@ func TestStartSandboxFunc(t *testing.T) { sandboxConfig.DefaultConfig.Version = "" mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -430,7 +429,7 @@ func TestStartSandboxFunc(t *testing.T) { }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -459,6 +458,7 @@ func TestStartSandboxFunc(t *testing.T) { bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = f.UserHomeDir() + sandboxConfig.DefaultConfig.Version = "" volumes := docker.Volumes volumes = append(volumes, mount.Mount{ Type: mount.TypeBind, @@ -467,7 +467,7 @@ func TestStartSandboxFunc(t *testing.T) { }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -510,7 +510,7 @@ func TestStartSandboxFunc(t *testing.T) { bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -534,6 +534,7 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) docker.Client = mockDocker sandboxConfig.DefaultConfig.Source = "" + sandboxConfig.DefaultConfig.Version = "" err = startSandboxCluster(ctx, []string{}, cmdCtx) assert.Nil(t, err) }) @@ -546,7 +547,7 @@ func TestStartSandboxFunc(t *testing.T) { bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.ImageName, + Image: docker.GetSandboxImage(dind), Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -674,3 +675,29 @@ func TestGetNodeTaintStatus(t *testing.T) { assert.Equal(t, true, c) }) } + +func TestGetSandboxImage(t *testing.T) { + t.Run("Get Latest sandbox", func(t *testing.T) { + image, err := getSandboxImage("") + assert.Nil(t, err) + assert.Equal(t, docker.GetSandboxImage(dind), image) + }) + + t.Run("Get sandbox image with version ", func(t *testing.T) { + image, err := getSandboxImage("v0.14.0") + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(image, docker.ImageName)) + }) + t.Run("Get sandbox image with wrong version ", func(t *testing.T) { + _, err := getSandboxImage("v100.1.0") + assert.NotNil(t, err) + }) + t.Run("Get sandbox image with wrong version ", func(t *testing.T) { + _, err := getSandboxImage("aaaaaa") + assert.NotNil(t, err) + }) + t.Run("Get sandbox image with version that is not supported", func(t *testing.T) { + _, err := getSandboxImage("v0.10.0") + assert.NotNil(t, err) + }) +} diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index de19ce15a0..1d3baabed5 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -24,7 +24,7 @@ import ( var ( Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") SuccessMessage = "Deploying Flyte..." - ImageName = "cr.flyte.org/flyteorg/flyte-sandbox:dind" + ImageName = "cr.flyte.org/flyteorg/flyte-sandbox" FlyteSandboxClusterName = "flyte-sandbox" Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} Source = "/root" @@ -179,3 +179,8 @@ func InspectExecResp(ctx context.Context, cli Docker, containerID string) error } return nil } + +// GetSandboxImage will return the sandbox image with tag +func GetSandboxImage(tag string) string { + return fmt.Sprintf("%s:%s", ImageName, tag) +} diff --git a/flytectl/pkg/util/githubutil/githubutil.go b/flytectl/pkg/util/githubutil/githubutil.go index c3ed9b8b52..ba51c160db 100644 --- a/flytectl/pkg/util/githubutil/githubutil.go +++ b/flytectl/pkg/util/githubutil/githubutil.go @@ -2,6 +2,7 @@ package githubutil import ( "context" + "net/http" "path/filepath" "runtime" "strings" @@ -14,7 +15,6 @@ import ( "github.com/flyteorg/flytectl/pkg/util" "fmt" - "io/ioutil" "github.com/google/go-github/v37/github" ) @@ -47,9 +47,14 @@ var ( arch = platformutil.Arch(runtime.GOARCH) ) +//GetGHClient will return github client +func GetGHClient() *github.Client { + return github.NewClient(&http.Client{}) +} + // GetLatestVersion returns the latest version of provided repository func GetLatestVersion(repository string) (*github.RepositoryRelease, error) { - client := github.NewClient(nil) + client := GetGHClient() release, _, err := client.Repositories.GetLatestRelease(context.Background(), owner, repository) if err != nil { return nil, err @@ -68,7 +73,7 @@ func getFlytectlAssetName() string { // CheckVersionExist returns the provided version release if version exist in repository func CheckVersionExist(version, repository string) (*github.RepositoryRelease, error) { - client := github.NewClient(nil) + client := GetGHClient() release, _, err := client.Repositories.GetReleaseByTag(context.Background(), owner, repository, version) if err != nil { return nil, err @@ -76,6 +81,16 @@ func CheckVersionExist(version, repository string) (*github.RepositoryRelease, e return release, err } +// GetSHAFromVersion returns sha commit hash against a release +func GetSHAFromVersion(version, repository string) (string, error) { + client := GetGHClient() + sha, _, err := client.Repositories.GetCommitSHA1(context.Background(), owner, repository, version, "") + if err != nil { + return "", err + } + return sha, err +} + // GetAssetsFromRelease returns the asset from github release func GetAssetsFromRelease(version, assets, repository string) (*github.ReleaseAsset, error) { release, err := CheckVersionExist(version, repository) @@ -90,28 +105,6 @@ func GetAssetsFromRelease(version, assets, repository string) (*github.ReleaseAs return nil, fmt.Errorf("assest is not found in %s[%s] release", repository, version) } -// GetFlyteManifest will write the flyte manifest in a file -func GetFlyteManifest(version string, target string) error { - asset, err := GetAssetsFromRelease(version, sandboxManifest, flyte) - if err != nil { - return err - } - response, err := util.SendRequest("GET", asset.GetBrowserDownloadURL(), nil) - if err != nil { - return err - } - defer response.Body.Close() - data, err := ioutil.ReadAll(response.Body) - if err != nil { - return err - } - if err := util.WriteIntoFile(data, target); err != nil { - return err - } - return nil - -} - // GetUpgradeMessage return the upgrade message func GetUpgradeMessage(latest string, goos platformutil.Platform) (string, error) { isGreater, err := util.IsVersionGreaterThan(latest, stdlibversion.Version) diff --git a/flytectl/pkg/util/githubutil/githubutil_test.go b/flytectl/pkg/util/githubutil/githubutil_test.go index 05566121b9..2f2eb64345 100644 --- a/flytectl/pkg/util/githubutil/githubutil_test.go +++ b/flytectl/pkg/util/githubutil/githubutil_test.go @@ -42,6 +42,18 @@ func TestCheckVersionExist(t *testing.T) { }) } +func TestGetSHAFromVersion(t *testing.T) { + t.Run("Invalid Tag", func(t *testing.T) { + _, err := GetSHAFromVersion("v100.0.0", "flyte") + assert.NotNil(t, err) + }) + t.Run("Valid Tag", func(t *testing.T) { + release, err := GetSHAFromVersion("v0.15.0", "flyte") + assert.Nil(t, err) + assert.Greater(t, len(release), 0) + }) +} + func TestGetAssetsFromRelease(t *testing.T) { t.Run("Successful get assets", func(t *testing.T) { assets, err := GetAssetsFromRelease("v0.15.0", sandboxManifest, flyte) @@ -62,21 +74,6 @@ func TestGetAssetsFromRelease(t *testing.T) { }) } -func TestGetFlyteManifest(t *testing.T) { - t.Run("Successful get manifest", func(t *testing.T) { - err := GetFlyteManifest("v0.15.0", "test.yaml") - assert.Nil(t, err) - }) - t.Run("Failed get manifest with wrong name", func(t *testing.T) { - err := GetFlyteManifest("v100.15.0", "test.yaml") - assert.NotNil(t, err) - }) - t.Run("Failed get manifest with wrong name", func(t *testing.T) { - err := GetFlyteManifest("v0.12.0", "test.yaml") - assert.NotNil(t, err) - }) -} - func TestGetAssetsName(t *testing.T) { t.Run("Get Assets name", func(t *testing.T) { expected := fmt.Sprintf("flytectl_%s_386.tar.gz", strings.Title(runtime.GOOS)) From 8db28dd3eb65798b690d70c4c12e679f51cef68c Mon Sep 17 00:00:00 2001 From: Sean Lin Date: Thu, 9 Sep 2021 20:00:22 -0700 Subject: [PATCH 144/645] #minor Revert "Adopt flyteidl's ordered variable map change" (#180) * Revert "Adopt flyteidl's ordered variable map change (#158)" This reverts commit 7c31c1e8f96024bdb9bdf10dcda862eb09d4b579. Signed-off-by: Sean Lin --- flytectl/cmd/create/execution_test.go | 52 +- flytectl/cmd/create/serialization_utils.go | 22 +- .../cmd/create/serialization_utils_test.go | 52 +- flytectl/cmd/get/execution_util.go | 34 +- flytectl/cmd/get/execution_util_test.go | 13 +- flytectl/cmd/get/launch_plan.go | 4 +- flytectl/cmd/get/launch_plan_test.go | 864 ++++++------------ flytectl/cmd/get/task.go | 14 +- flytectl/cmd/get/task_test.go | 328 ++----- flytectl/cmd/get/workflow.go | 4 +- flytectl/cmd/get/workflow_test.go | 38 +- flytectl/go.mod | 2 +- flytectl/go.sum | 4 +- flytectl/pkg/ext/launch_plan_fetcher_test.go | 41 +- flytectl/pkg/ext/task_fetcher_test.go | 11 +- flytectl/pkg/ext/workflow_fetcher_test.go | 11 +- flytectl/pkg/printer/printer.go | 46 +- flytectl/pkg/printer/printer_test.go | 65 +- .../compiled_closure_branch_nested.json | 104 +-- .../testdata/compiled_subworkflows.json | 157 ++-- 20 files changed, 645 insertions(+), 1221 deletions(-) diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index 36166fdf21..65df850ae5 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -32,14 +32,9 @@ func createExecutionSetup() { }, }, } - variableMap := []*core.VariableMapEntry{ - { - Name: "sorted_list1", - Var: &sortedListLiteralType, - }, { - Name: "sorted_list2", - Var: &sortedListLiteralType, - }, + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, } task1 := &admin.Task{ @@ -61,10 +56,9 @@ func createExecutionSetup() { }, } mockClient.OnGetTaskMatch(ctx, mock.Anything).Return(task1, nil) - parameterMap := []*core.ParameterMapEntry{ - { - Name: "numbers", - Parameter: &core.Parameter{Var: &core.Variable{ + parameterMap := map[string]*core.Parameter{ + "numbers": { + Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_CollectionType{ CollectionType: &core.LiteralType{ @@ -74,42 +68,40 @@ func createExecutionSetup() { }, }, }, - }}, + }, }, - { - Name: "numbers_count", - Parameter: &core.Parameter{Var: &core.Variable{ + "numbers_count": { + Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, }, }, - }}, + }, }, - { - Name: "run_local_at_count", - Parameter: &core.Parameter{Var: &core.Variable{ + "run_local_at_count": { + Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, }, }, }, - Behavior: &core.Parameter_Default{ - Default: &core.Literal{ - Value: &core.Literal_Scalar{ - Scalar: &core.Scalar{ - Value: &core.Scalar_Primitive{ - Primitive: &core.Primitive{ - Value: &core.Primitive_Integer{ - Integer: 10, - }, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, }, }, }, }, }, - }}, + }, + }, }, } launchPlan1 := &admin.LaunchPlan{ diff --git a/flytectl/cmd/create/serialization_utils.go b/flytectl/cmd/create/serialization_utils.go index 568ed6dc27..53045d2c9e 100644 --- a/flytectl/cmd/create/serialization_utils.go +++ b/flytectl/cmd/create/serialization_utils.go @@ -11,15 +11,15 @@ import ( // MakeLiteralForVariables builds a map of literals for the provided serialized values. If a provided value does not have // a corresponding variable or if that variable is invalid (e.g. doesn't have Type property populated), it returns an // error. -func MakeLiteralForVariables(serialize map[string]interface{}, variables []*core.VariableMapEntry) (map[string]*core.Literal, error) { +func MakeLiteralForVariables(serialize map[string]interface{}, variables map[string]*core.Variable) (map[string]*core.Literal, error) { types := make(map[string]*core.LiteralType) - for _, e := range variables { - t := e.GetVar().GetType() + for k, v := range variables { + t := v.GetType() if t == nil { - return nil, fmt.Errorf("variable [%v] has nil type", e.GetName()) + return nil, fmt.Errorf("variable [%v] has nil type", k) } - types[e.GetName()] = t + types[k] = t } return MakeLiteralForTypes(serialize, types) @@ -28,15 +28,15 @@ func MakeLiteralForVariables(serialize map[string]interface{}, variables []*core // MakeLiteralForParams builds a map of literals for the provided serialized values. If a provided value does not have // a corresponding parameter or if that parameter is invalid (e.g. doesn't have Type property populated), it returns an // error. -func MakeLiteralForParams(serialize map[string]interface{}, parameters []*core.ParameterMapEntry) (map[string]*core.Literal, error) { +func MakeLiteralForParams(serialize map[string]interface{}, parameters map[string]*core.Parameter) (map[string]*core.Literal, error) { types := make(map[string]*core.LiteralType) - for _, e := range parameters { - if variable := e.GetParameter().GetVar(); variable == nil { - return nil, fmt.Errorf("parameter [%v] has nil Variable", e.GetName()) + for k, v := range parameters { + if variable := v.GetVar(); variable == nil { + return nil, fmt.Errorf("parameter [%v] has nil Variable", k) } else if t := variable.GetType(); t == nil { - return nil, fmt.Errorf("parameter [%v] has nil variable type", e.GetName()) + return nil, fmt.Errorf("parameter [%v] has nil variable type", k) } else { - types[e.GetName()] = t + types[k] = t } } diff --git a/flytectl/cmd/create/serialization_utils_test.go b/flytectl/cmd/create/serialization_utils_test.go index ebe4484472..5c7326493d 100644 --- a/flytectl/cmd/create/serialization_utils_test.go +++ b/flytectl/cmd/create/serialization_utils_test.go @@ -67,16 +67,15 @@ func TestMakeLiteralForParams(t *testing.T) { } t.Run("Happy path", func(t *testing.T) { - inputParams := []*core.ParameterMapEntry{ - { - Name: "a", - Parameter: &core.Parameter{Var: &core.Variable{ + inputParams := map[string]*core.Parameter{ + "a": { + Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_STRING, }, }, - }}, + }, }, } @@ -86,11 +85,8 @@ func TestMakeLiteralForParams(t *testing.T) { }) t.Run("Invalid Param", func(t *testing.T) { - inputParams := []*core.ParameterMapEntry{ - { - Name: "a", - Parameter: nil, - }, + inputParams := map[string]*core.Parameter{ + "a": nil, } _, err := MakeLiteralForParams(inputValues, inputParams) @@ -98,10 +94,9 @@ func TestMakeLiteralForParams(t *testing.T) { }) t.Run("Invalid Type", func(t *testing.T) { - inputParams := []*core.ParameterMapEntry{ - { - Name: "a", - Parameter: &core.Parameter{Var: &core.Variable{}}, + inputParams := map[string]*core.Parameter{ + "a": { + Var: &core.Variable{}, }, } @@ -116,14 +111,11 @@ func TestMakeLiteralForVariables(t *testing.T) { } t.Run("Happy path", func(t *testing.T) { - inputVariables := []*core.VariableMapEntry{ - { - Name: "a", - Var: &core.Variable{ - Type: &core.LiteralType{ - Type: &core.LiteralType_Simple{ - Simple: core.SimpleType_STRING, - }, + inputVariables := map[string]*core.Variable{ + "a": { + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_STRING, }, }, }, @@ -135,11 +127,8 @@ func TestMakeLiteralForVariables(t *testing.T) { }) t.Run("Invalid Variable", func(t *testing.T) { - inputVariables := []*core.VariableMapEntry{ - { - Name: "a", - Var: nil, - }, + inputVariables := map[string]*core.Variable{ + "a": nil, } _, err := MakeLiteralForVariables(inputValues, inputVariables) @@ -147,12 +136,9 @@ func TestMakeLiteralForVariables(t *testing.T) { }) t.Run("Invalid Type", func(t *testing.T) { - inputVariables := []*core.VariableMapEntry{ - { - Name: "a", - Var: &core.Variable{ - Type: nil, - }, + inputVariables := map[string]*core.Variable{ + "a": { + Type: nil, }, } diff --git a/flytectl/cmd/get/execution_util.go b/flytectl/cmd/get/execution_util.go index 8469e68e1d..65b72175a5 100644 --- a/flytectl/cmd/get/execution_util.go +++ b/flytectl/cmd/get/execution_util.go @@ -58,8 +58,8 @@ func CreateAndWriteExecConfigForWorkflow(wlp *admin.LaunchPlan, fileName string) return WriteExecConfigToFile(executionConfig, fileName) } -func TaskInputs(task *admin.Task) []*core.VariableMapEntry { - taskInputs := []*core.VariableMapEntry{} +func TaskInputs(task *admin.Task) map[string]*core.Variable { + taskInputs := map[string]*core.Variable{} if task == nil || task.Closure == nil { return taskInputs } @@ -81,10 +81,10 @@ func TaskInputs(task *admin.Task) []*core.VariableMapEntry { func ParamMapForTask(task *admin.Task) (map[string]yaml.Node, error) { taskInputs := TaskInputs(task) paramMap := make(map[string]yaml.Node, len(taskInputs)) - for _, e := range taskInputs { - varTypeValue, err := coreutils.MakeDefaultLiteralForType(e.Var.Type) + for k, v := range taskInputs { + varTypeValue, err := coreutils.MakeDefaultLiteralForType(v.Type) if err != nil { - fmt.Println("error creating default value for literal type ", e.Var.Type) + fmt.Println("error creating default value for literal type ", v.Type) return nil, err } var nativeLiteral interface{} @@ -92,11 +92,11 @@ func ParamMapForTask(task *admin.Task) (map[string]yaml.Node, error) { return nil, err } - if e.Name == e.Var.Description { + if k == v.Description { // a: # a isn't very helpful - paramMap[e.Name], err = getCommentedYamlNode(nativeLiteral, "") + paramMap[k], err = getCommentedYamlNode(nativeLiteral, "") } else { - paramMap[e.Name], err = getCommentedYamlNode(nativeLiteral, e.Var.Description) + paramMap[k], err = getCommentedYamlNode(nativeLiteral, v.Description) } if err != nil { return nil, err @@ -105,8 +105,8 @@ func ParamMapForTask(task *admin.Task) (map[string]yaml.Node, error) { return paramMap, nil } -func WorkflowParams(lp *admin.LaunchPlan) []*core.ParameterMapEntry { - workflowParams := []*core.ParameterMapEntry{} +func WorkflowParams(lp *admin.LaunchPlan) map[string]*core.Parameter { + workflowParams := map[string]*core.Parameter{} if lp == nil || lp.Spec == nil { return workflowParams } @@ -119,10 +119,10 @@ func WorkflowParams(lp *admin.LaunchPlan) []*core.ParameterMapEntry { func ParamMapForWorkflow(lp *admin.LaunchPlan) (map[string]yaml.Node, error) { workflowParams := WorkflowParams(lp) paramMap := make(map[string]yaml.Node, len(workflowParams)) - for _, e := range workflowParams { - varTypeValue, err := coreutils.MakeDefaultLiteralForType(e.Parameter.Var.Type) + for k, v := range workflowParams { + varTypeValue, err := coreutils.MakeDefaultLiteralForType(v.Var.Type) if err != nil { - fmt.Println("error creating default value for literal type ", e.Parameter.Var.Type) + fmt.Println("error creating default value for literal type ", v.Var.Type) return nil, err } var nativeLiteral interface{} @@ -130,16 +130,16 @@ func ParamMapForWorkflow(lp *admin.LaunchPlan) (map[string]yaml.Node, error) { return nil, err } // Override if there is a default value - if paramsDefault, ok := e.Parameter.Behavior.(*core.Parameter_Default); ok { + if paramsDefault, ok := v.Behavior.(*core.Parameter_Default); ok { if nativeLiteral, err = coreutils.ExtractFromLiteral(paramsDefault.Default); err != nil { return nil, err } } - if e.Name == e.Parameter.Var.Description { + if k == v.Var.Description { // a: # a isn't very helpful - paramMap[e.Name], err = getCommentedYamlNode(nativeLiteral, "") + paramMap[k], err = getCommentedYamlNode(nativeLiteral, "") } else { - paramMap[e.Name], err = getCommentedYamlNode(nativeLiteral, e.Parameter.Var.Description) + paramMap[k], err = getCommentedYamlNode(nativeLiteral, v.Var.Description) } if err != nil { diff --git a/flytectl/cmd/get/execution_util_test.go b/flytectl/cmd/get/execution_util_test.go index 5a2c53aee7..2d98c8b834 100644 --- a/flytectl/cmd/get/execution_util_test.go +++ b/flytectl/cmd/get/execution_util_test.go @@ -11,7 +11,7 @@ import ( ) func TestTaskInputs(t *testing.T) { - taskInputs := []*core.VariableMapEntry{} + taskInputs := map[string]*core.Variable{} t.Run("nil task", func(t *testing.T) { retValue := TaskInputs(nil) assert.Equal(t, taskInputs, retValue) @@ -60,14 +60,9 @@ func createTask() *admin.Task { }, } - variableMap := []*core.VariableMapEntry{ - { - Name: "sorted_list1", - Var: &sortedListLiteralType, - }, { - Name: "sorted_list2", - Var: &sortedListLiteralType, - }, + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, } inputs := &core.VariableMap{ diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index dc19efeaa9..6ef85d6cb3 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -104,8 +104,8 @@ var launchplanColumns = []printer.Column{ {Header: "Type", JSONPath: "$.closure.compiledTask.template.type"}, {Header: "State", JSONPath: "$.spec.state"}, {Header: "Schedule", JSONPath: "$.spec.entityMetadata.schedule"}, - {Header: "Inputs", JSONPath: "$.closure.expectedInputs.parameters[0].parameter.var.description"}, - {Header: "Outputs", JSONPath: "$.closure.expectedOutputs.variables[0].var.description"}, + {Header: "Inputs", JSONPath: "$.closure.expectedInputs.parameters." + printer.DefaultFormattedDescriptionsKey + ".var.description"}, + {Header: "Outputs", JSONPath: "$.closure.expectedOutputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, } // Column structure for get all launchplans diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index cf944cf5e6..e6a7cbec01 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -39,10 +39,9 @@ func getLaunchPlanSetup() { // TODO: migrate to new command context from testutils cmdCtx = cmdCore.NewCommandContext(mockClient, u.MockOutStream) argsLp = []string{"launchplan1"} - parameterMap := []*core.ParameterMapEntry{ - { - Name: "numbers", - Parameter: &core.Parameter{Var: &core.Variable{ + parameterMap := map[string]*core.Parameter{ + "numbers": { + Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_CollectionType{ CollectionType: &core.LiteralType{ @@ -52,21 +51,21 @@ func getLaunchPlanSetup() { }, }, }, - Description: "short desc"}}, + Description: "short desc", + }, }, - { - Name: "numbers_count", - Parameter: &core.Parameter{Var: &core.Variable{ + "numbers_count": { + Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, }, - }, Description: "long description will be truncated in table", - }}, + }, + Description: "long description will be truncated in table", + }, }, - { - Name: "run_local_at_count", - Parameter: &core.Parameter{Var: &core.Variable{ + "run_local_at_count": { + Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, @@ -74,21 +73,21 @@ func getLaunchPlanSetup() { }, Description: "run_local_at_count", }, - Behavior: &core.Parameter_Default{ - Default: &core.Literal{ - Value: &core.Literal_Scalar{ - Scalar: &core.Scalar{ - Value: &core.Scalar_Primitive{ - Primitive: &core.Primitive{ - Value: &core.Primitive_Integer{ - Integer: 10, - }, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, }, }, }, }, }, - }}, + }, + }, }, } launchPlan1 := &admin.LaunchPlan{ @@ -258,98 +257,80 @@ func TestGetLaunchPlanFunc(t *testing.T) { }, "spec": { "defaultInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" } }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" } }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" } } } } - ] + } } }, "closure": { "expectedInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" } }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" } }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" } } } } - ] + } }, "createdAt": "1970-01-01T00:00:01Z" } @@ -361,98 +342,80 @@ func TestGetLaunchPlanFunc(t *testing.T) { }, "spec": { "defaultInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" } }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" } }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" } } } } - ] + } } }, "closure": { "expectedInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" } }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" } }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" } } } } - ] + } }, "createdAt": "1970-01-01T00:00:00Z" } @@ -477,98 +440,80 @@ func TestGetLaunchPlanFuncLatest(t *testing.T) { }, "spec": { "defaultInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" } }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" } }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" } } } } - ] + } } }, "closure": { "expectedInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" } }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" } }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" } } } } - ] + } }, "createdAt": "1970-01-01T00:00:01Z" } @@ -592,98 +537,80 @@ func TestGetLaunchPlanWithVersion(t *testing.T) { }, "spec": { "defaultInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" } }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" } }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" } } } } - ] + } } }, "closure": { "expectedInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" } }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" } }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" } } } } - ] + } }, "createdAt": "1970-01-01T00:00:01Z" } @@ -698,214 +625,7 @@ func TestGetLaunchPlans(t *testing.T) { argsLp = []string{} err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `[ - { - "id": { - "name": "launchplan1", - "version": "v2" - }, - "spec": { - "defaultInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - } - }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - } - }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - ] - } - }, - "closure": { - "expectedInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - } - }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - } - }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - ] - }, - "createdAt": "1970-01-01T00:00:01Z" - } - }, - { - "id": { - "name": "launchplan1", - "version": "v1" - }, - "spec": { - "defaultInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - } - }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - } - }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - ] - } - }, - "closure": { - "expectedInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - } - }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - } - }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - ] - }, - "createdAt": "1970-01-01T00:00:00Z" - } - } -]`) + tearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetLaunchPlansWithExecFile(t *testing.T) { @@ -927,98 +647,80 @@ func TestGetLaunchPlansWithExecFile(t *testing.T) { }, "spec": { "defaultInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" } }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" } }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" } } } } - ] + } } }, "closure": { "expectedInputs": { - "parameters": [ - { - "name": "numbers", - "parameter": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } + "parameters": { + "numbers": { + "var": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "short desc" } }, - { - "name": "numbers_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } + "numbers_count": { + "var": { + "type": { + "simple": "INTEGER" + }, + "description": "long description will be truncated in table" } }, - { - "name": "run_local_at_count", - "parameter": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" + "run_local_at_count": { + "var": { + "type": { + "simple": "INTEGER" }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } + "description": "run_local_at_count" + }, + "default": { + "scalar": { + "primitive": { + "integer": "10" } } } } - ] + } }, "createdAt": "1970-01-01T00:00:01Z" } diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index e3ce88e348..63b490ae82 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -3,8 +3,6 @@ package get import ( "context" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flytectl/cmd/config" taskConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/task" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -99,8 +97,8 @@ var taskColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, {Header: "Type", JSONPath: "$.closure.compiledTask.template.type"}, - {Header: "Inputs", JSONPath: "$.closure.compiledTask.template.interface.inputs.variables[0].var.description"}, - {Header: "Outputs", JSONPath: "$.closure.compiledTask.template.interface.outputs.variables[0].var.description"}, + {Header: "Inputs", JSONPath: "$.closure.compiledTask.template.interface.inputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, + {Header: "Outputs", JSONPath: "$.closure.compiledTask.template.interface.outputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, {Header: "Discoverable", JSONPath: "$.closure.compiledTask.template.metadata.discoverable"}, {Header: "Discovery Version", JSONPath: "$.closure.compiledTask.template.metadata.discoveryVersion"}, {Header: "Created At", JSONPath: "$.closure.createdAt"}, @@ -135,14 +133,6 @@ func TaskToTableProtoMessages(l []*admin.Task) []proto.Message { return messages } -func VariableMapEntriesToMap(mapFieldEntries []*core.VariableMapEntry) (variableMap map[string]*core.Variable) { - variableMap = map[string]*core.Variable{} - for _, e := range mapFieldEntries { - variableMap[e.Name] = e.Var - } - return -} - func getTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { taskPrinter := printer.Printer{} var tasks []*admin.Task diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index dfed9cea1f..0133c20f46 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -54,14 +54,9 @@ func getTaskSetup() { }, Description: "var description", } - variableMap := []*core.VariableMapEntry{ - { - Name: "sorted_list1", - Var: &sortedListLiteralType, - }, { - Name: "sorted_list2", - Var: &sortedListLiteralType, - }, + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, } task1 := &admin.Task{ @@ -261,30 +256,24 @@ func TestGetTaskFunc(t *testing.T) { "template": { "interface": { "inputs": { - "variables": [ - { - "name": "sorted_list1", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } + "variables": { + "sorted_list1": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" }, - { - "name": "sorted_list2", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } + "sorted_list2": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" } - ] + } } } } @@ -302,30 +291,24 @@ func TestGetTaskFunc(t *testing.T) { "template": { "interface": { "inputs": { - "variables": [ - { - "name": "sorted_list1", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } + "variables": { + "sorted_list1": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" }, - { - "name": "sorted_list2", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } + "sorted_list2": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" } - ] + } } } } @@ -380,30 +363,24 @@ func TestGetTaskFuncLatest(t *testing.T) { "template": { "interface": { "inputs": { - "variables": [ - { - "name": "sorted_list1", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } + "variables": { + "sorted_list1": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" }, - { - "name": "sorted_list2", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } + "sorted_list2": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" } - ] + } } } } @@ -435,30 +412,24 @@ func TestGetTaskWithVersion(t *testing.T) { "template": { "interface": { "inputs": { - "variables": [ - { - "name": "sorted_list1", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } + "variables": { + "sorted_list1": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" }, - { - "name": "sorted_list2", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } + "sorted_list2": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" } - ] + } } } } @@ -476,90 +447,7 @@ func TestGetTasks(t *testing.T) { mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `[ - { - "id": { - "name": "task1", - "version": "v2" - }, - "closure": { - "compiledTask": { - "template": { - "interface": { - "inputs": { - "variables": [ - { - "name": "sorted_list1", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } - }, - { - "name": "sorted_list2", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } - } - ] - } - } - } - }, - "createdAt": "1970-01-01T00:00:01Z" - } - }, - { - "id": { - "name": "task1", - "version": "v1" - }, - "closure": { - "compiledTask": { - "template": { - "interface": { - "inputs": { - "variables": [ - { - "name": "sorted_list1", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } - }, - { - "name": "sorted_list2", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } - } - ] - } - } - } - }, - "createdAt": "1970-01-01T00:00:00Z" - } - } -]`) + tearDownAndVerify(t, `[{"id": {"name": "task1","version": "v2"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetTasksFilters(t *testing.T) { @@ -571,47 +459,7 @@ func TestGetTasksFilters(t *testing.T) { mockClient.OnListTasksMatch(ctx, resourceListFilterRequestTask).Return(taskListFilterResponse, nil) err = getTaskFunc(ctx, argsTask, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `{ - "id": { - "name": "task1", - "version": "v1" - }, - "closure": { - "compiledTask": { - "template": { - "interface": { - "inputs": { - "variables": [ - { - "name": "sorted_list1", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } - }, - { - "name": "sorted_list2", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } - } - ] - } - } - } - }, - "createdAt": "1970-01-01T00:00:00Z" - } -}`) + tearDownAndVerify(t, `{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}`) } func TestGetTaskWithExecFile(t *testing.T) { @@ -636,30 +484,24 @@ func TestGetTaskWithExecFile(t *testing.T) { "template": { "interface": { "inputs": { - "variables": [ - { - "name": "sorted_list1", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } + "variables": { + "sorted_list1": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" }, - { - "name": "sorted_list2", - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "var description" - } + "sorted_list2": { + "type": { + "collectionType": { + "simple": "INTEGER" + } + }, + "description": "var description" } - ] + } } } } diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index f461aac9e3..2670b7f10d 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -87,8 +87,8 @@ Usage var workflowColumns = []printer.Column{ {Header: "Version", JSONPath: "$.id.version"}, {Header: "Name", JSONPath: "$.id.name"}, - {Header: "Inputs", JSONPath: "$.closure.compiledWorkflow.primary.template.interface.inputs.variables[0].var.description"}, - {Header: "Outputs", JSONPath: "$.closure.compiledWorkflow.primary.template.interface.outputs.variables[0].var.description"}, + {Header: "Inputs", JSONPath: "$.closure.compiledWorkflow.primary.template.interface.inputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, + {Header: "Outputs", JSONPath: "$.closure.compiledWorkflow.primary.template.interface.outputs.variables." + printer.DefaultFormattedDescriptionsKey + ".description"}, {Header: "Created At", JSONPath: "$.closure.createdAt"}, } diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go index 54c826d423..46ad846cdd 100644 --- a/flytectl/cmd/get/workflow_test.go +++ b/flytectl/cmd/get/workflow_test.go @@ -38,35 +38,31 @@ func getWorkflowSetup() { Domain: domainValue, }, } - variableMap := []*core.VariableMapEntry{ - { - Name: "var1", - Var: &core.Variable{ - Type: &core.LiteralType{ - Type: &core.LiteralType_CollectionType{ - CollectionType: &core.LiteralType{ - Type: &core.LiteralType_Simple{ - Simple: core.SimpleType_INTEGER, - }, + + variableMap := map[string]*core.Variable{ + "var1": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, }, }, }, - Description: "var1", }, - }, { - Name: "var2", - Var: &core.Variable{ - Type: &core.LiteralType{ - Type: &core.LiteralType_CollectionType{ - CollectionType: &core.LiteralType{ - Type: &core.LiteralType_Simple{ - Simple: core.SimpleType_INTEGER, - }, + Description: "var1", + }, + "var2": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, }, }, }, - Description: "var2 long descriptions probably needs truncate", }, + Description: "var2 long descriptions probably needs truncate", }, } workflow1 = &admin.Workflow{ diff --git a/flytectl/go.mod b/flytectl/go.mod index 1873b540e2..94ef0c7047 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -11,7 +11,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.20.2 + github.com/flyteorg/flyteidl v0.21.0 github.com/flyteorg/flytestdlib v0.3.34 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 diff --git a/flytectl/go.sum b/flytectl/go.sum index 1c820fdecf..b482ad192a 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -345,8 +345,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.20.2 h1:3DDj1y9Axmb35SskN/h2nRgohWhGBPGxmJSX7b/Y2rk= -github.com/flyteorg/flyteidl v0.20.2/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.21.0 h1:AwHNusfxJMfRRSDk2QWfb3aIlyLJrFWVGtpXCbCtJ5A= +github.com/flyteorg/flyteidl v0.21.0/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.34 h1:OOuV03X8c1AWInzBU6IRsqpEF6y8WDJngbPcdL4VktY= github.com/flyteorg/flytestdlib v0.3.34/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= diff --git a/flytectl/pkg/ext/launch_plan_fetcher_test.go b/flytectl/pkg/ext/launch_plan_fetcher_test.go index e38d0d054e..39d0121c93 100644 --- a/flytectl/pkg/ext/launch_plan_fetcher_test.go +++ b/flytectl/pkg/ext/launch_plan_fetcher_test.go @@ -27,10 +27,9 @@ func getLaunchPlanFetcherSetup() { adminClient = new(mocks.AdminServiceClient) adminFetcherExt = AdminFetcherExtClient{AdminClient: adminClient} - parameterMap := []*core.ParameterMapEntry{ - { - Name: "numbers", - Parameter: &core.Parameter{Var: &core.Variable{ + parameterMap := map[string]*core.Parameter{ + "numbers": { + Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_CollectionType{ CollectionType: &core.LiteralType{ @@ -40,42 +39,40 @@ func getLaunchPlanFetcherSetup() { }, }, }, - }}, + }, }, - { - Name: "numbers_count", - Parameter: &core.Parameter{Var: &core.Variable{ + "numbers_count": { + Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, }, }, - }}, + }, }, - { - Name: "run_local_at_count", - Parameter: &core.Parameter{Var: &core.Variable{ + "run_local_at_count": { + Var: &core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_Simple{ Simple: core.SimpleType_INTEGER, }, }, }, - Behavior: &core.Parameter_Default{ - Default: &core.Literal{ - Value: &core.Literal_Scalar{ - Scalar: &core.Scalar{ - Value: &core.Scalar_Primitive{ - Primitive: &core.Primitive{ - Value: &core.Primitive_Integer{ - Integer: 10, - }, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, }, }, }, }, }, - }}, + }, + }, }, } launchPlan1 = &admin.LaunchPlan{ diff --git a/flytectl/pkg/ext/task_fetcher_test.go b/flytectl/pkg/ext/task_fetcher_test.go index 50d14e2144..0bfc9ef8dd 100644 --- a/flytectl/pkg/ext/task_fetcher_test.go +++ b/flytectl/pkg/ext/task_fetcher_test.go @@ -41,14 +41,9 @@ func getTaskFetcherSetup() { }, }, } - variableMap := []*core.VariableMapEntry{ - { - Name: "sorted_list1", - Var: &sortedListLiteralType, - }, { - Name: "sorted_list2", - Var: &sortedListLiteralType, - }, + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, } task1 := &admin.Task{ diff --git a/flytectl/pkg/ext/workflow_fetcher_test.go b/flytectl/pkg/ext/workflow_fetcher_test.go index c8da9b2373..9ae96612a6 100644 --- a/flytectl/pkg/ext/workflow_fetcher_test.go +++ b/flytectl/pkg/ext/workflow_fetcher_test.go @@ -38,14 +38,9 @@ func getWorkflowFetcherSetup() { }, }, } - variableMap := []*core.VariableMapEntry{ - { - Name: "sorted_list1", - Var: &sortedListLiteralType, - }, { - Name: "sorted_list2", - Var: &sortedListLiteralType, - }, + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, } var compiledTasks []*core.CompiledTask diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index 0f11d15ac7..75d67208eb 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -6,6 +6,7 @@ import ( "fmt" "net/url" "os" + "sort" "strings" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -169,37 +170,50 @@ func printJSONYaml(format OutputFormat, v interface{}) error { return nil } -func FormatVariableDescriptions(variableMap []*core.VariableMapEntry) { +func FormatVariableDescriptions(variableMap map[string]*core.Variable) { + keys := make([]string, 0, len(variableMap)) + // sort the keys for testing and consistency with other output formats + for k := range variableMap { + keys = append(keys, k) + } + sort.Strings(keys) + var descriptions []string - for _, e := range variableMap { - if e.Var == nil { - continue - } + for _, k := range keys { + v := variableMap[k] // a: a isn't very helpful - if e.Name != e.Var.Description { - descriptions = append(descriptions, getTruncatedLine(fmt.Sprintf("%s: %s", e.Name, e.Var.Description))) + if k != v.Description { + descriptions = append(descriptions, getTruncatedLine(fmt.Sprintf("%s: %s", k, v.Description))) } else { - descriptions = append(descriptions, getTruncatedLine(e.Name)) + descriptions = append(descriptions, getTruncatedLine(k)) } } - variableMap[0] = &core.VariableMapEntry{Var: &core.Variable{Description: strings.Join(descriptions, "\n")}} + variableMap[DefaultFormattedDescriptionsKey] = &core.Variable{Description: strings.Join(descriptions, "\n")} } -func FormatParameterDescriptions(parameterMap []*core.ParameterMapEntry) { +func FormatParameterDescriptions(parameterMap map[string]*core.Parameter) { + keys := make([]string, 0, len(parameterMap)) + // sort the keys for testing and consistency with other output formats + for k := range parameterMap { + keys = append(keys, k) + } + sort.Strings(keys) + var descriptions []string - for _, e := range parameterMap { - if e.Parameter == nil || e.Parameter.Var == nil { + for _, k := range keys { + v := parameterMap[k] + if v.Var == nil { continue } // a: a isn't very helpful - if e.Name != e.Parameter.Var.Description { - descriptions = append(descriptions, getTruncatedLine(fmt.Sprintf("%s: %s", e.Name, e.Parameter.Var.Description))) + if k != v.Var.Description { + descriptions = append(descriptions, getTruncatedLine(fmt.Sprintf("%s: %s", k, v.Var.Description))) } else { - descriptions = append(descriptions, getTruncatedLine(e.Name)) + descriptions = append(descriptions, getTruncatedLine(k)) } } - parameterMap[0] = &core.ParameterMapEntry{Parameter: &core.Parameter{Var: &core.Variable{Description: strings.Join(descriptions, "\n")}}} + parameterMap[DefaultFormattedDescriptionsKey] = &core.Parameter{Var: &core.Variable{Description: strings.Join(descriptions, "\n")}} } func getTruncatedLine(line string) string { diff --git a/flytectl/pkg/printer/printer_test.go b/flytectl/pkg/printer/printer_test.go index 1d0ee4e15c..6d5441b9af 100644 --- a/flytectl/pkg/printer/printer_test.go +++ b/flytectl/pkg/printer/printer_test.go @@ -150,15 +150,9 @@ func TestPrint(t *testing.T) { }, }, } - variableMap := []*core.VariableMapEntry{ - { - Name: "sorted_list1", - Var: &sortedListLiteralType, - }, - { - Name: "sorted_list2", - Var: &sortedListLiteralType, - }, + variableMap := map[string]*core.Variable{ + "sorted_list1": &sortedListLiteralType, + "sorted_list2": &sortedListLiteralType, } var compiledTasks []*core.CompiledTask @@ -281,26 +275,14 @@ func TestFormatVariableDescriptions(t *testing.T) { barVar := &core.Variable{ Description: "bar", } - variableMap := []*core.VariableMapEntry{ - { - Name: "var1", - Var: fooVar, - }, - { - Name: "var2", - Var: barVar, - }, - { - Name: "foo", - Var: fooVar, - }, - { - Name: "bar", - Var: barVar, - }, + variableMap := map[string]*core.Variable{ + "var1": fooVar, + "var2": barVar, + "foo": fooVar, + "bar": barVar, } FormatVariableDescriptions(variableMap) - assert.Equal(t, "var1: foo\nvar2: bar\nfoo\nbar", variableMap[0].Var.Description) + assert.Equal(t, "bar\nfoo\nvar1: foo\nvar2: bar", variableMap[DefaultFormattedDescriptionsKey].Description) } func TestFormatParameterDescriptions(t *testing.T) { @@ -315,28 +297,13 @@ func TestFormatParameterDescriptions(t *testing.T) { }, } emptyParam := &core.Parameter{} - paramMap := []*core.ParameterMapEntry{ - { - Name: "var1", - Parameter: fooParam, - }, - { - Name: "var2", - Parameter: barParam, - }, - { - Name: "foo", - Parameter: fooParam, - }, - { - Name: "bar", - Parameter: barParam, - }, - { - Name: "empty", - Parameter: emptyParam, - }, + paramMap := map[string]*core.Parameter{ + "var1": fooParam, + "var2": barParam, + "foo": fooParam, + "bar": barParam, + "empty": emptyParam, } FormatParameterDescriptions(paramMap) - assert.Equal(t, "var1: foo\nvar2: bar\nfoo\nbar", paramMap[0].Parameter.Var.Description) + assert.Equal(t, "bar\nfoo\nvar1: foo\nvar2: bar", paramMap[DefaultFormattedDescriptionsKey].Var.Description) } diff --git a/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json b/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json index 6b7330e1d7..baae3d9926 100644 --- a/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json +++ b/flytectl/pkg/visualize/testdata/compiled_closure_branch_nested.json @@ -11,30 +11,24 @@ "metadata": {}, "interface": { "inputs": { - "variables": [ - { - "name": "my_input", - "var": { - "type": { - "simple": "FLOAT" - }, - "description": "my_input" - } + "variables": { + "my_input": { + "type": { + "simple": "FLOAT" + }, + "description": "my_input" } - ] + } }, "outputs": { - "variables": [ - { - "name": "o0", - "var": { - "type": { - "simple": "FLOAT" - }, - "description": "o0" - } + "variables": { + "o0": { + "type": { + "simple": "FLOAT" + }, + "description": "o0" } - ] + } } }, "nodes": [ @@ -233,7 +227,7 @@ ], "error": { "failedNodeId": "inner_fractions", - "message": "Only <0.7 allowed" + "message": "Only \u003c0.7 allowed" } } } @@ -430,30 +424,24 @@ }, "interface": { "inputs": { - "variables": [ - { - "name": "n", - "var": { - "type": { - "simple": "FLOAT" - }, - "description": "n" - } + "variables": { + "n": { + "type": { + "simple": "FLOAT" + }, + "description": "n" } - ] + } }, "outputs": { - "variables": [ - { - "name": "o0", - "var": { - "type": { - "simple": "FLOAT" - }, - "description": "o0" - } + "variables": { + "o0": { + "type": { + "simple": "FLOAT" + }, + "description": "o0" } - ] + } } }, "container": { @@ -509,30 +497,24 @@ }, "interface": { "inputs": { - "variables": [ - { - "name": "n", - "var": { - "type": { - "simple": "FLOAT" - }, - "description": "n" - } + "variables": { + "n": { + "type": { + "simple": "FLOAT" + }, + "description": "n" } - ] + } }, "outputs": { - "variables": [ - { - "name": "o0", - "var": { - "type": { - "simple": "FLOAT" - }, - "description": "o0" - } + "variables": { + "o0": { + "type": { + "simple": "FLOAT" + }, + "description": "o0" } - ] + } } }, "container": { diff --git a/flytectl/pkg/visualize/testdata/compiled_subworkflows.json b/flytectl/pkg/visualize/testdata/compiled_subworkflows.json index b46a334701..8bbf441367 100644 --- a/flytectl/pkg/visualize/testdata/compiled_subworkflows.json +++ b/flytectl/pkg/visualize/testdata/compiled_subworkflows.json @@ -11,48 +11,36 @@ "metadata": {}, "interface": { "inputs": { - "variables": [ - { - "name": "a", - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "a" - } + "variables": { + "a": { + "type": { + "simple": "INTEGER" + }, + "description": "a" } - ] + } }, "outputs": { - "variables": [ - { - "name": "o0", - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "o0" - } + "variables": { + "o0": { + "type": { + "simple": "INTEGER" + }, + "description": "o0" }, - { - "name": "o1", - "var": { - "type": { - "simple": "STRING" - }, - "description": "o1" - } + "o1": { + "type": { + "simple": "STRING" + }, + "description": "o1" }, - { - "name": "o2", - "var": { - "type": { - "simple": "STRING" - }, - "description": "o2" - } + "o2": { + "type": { + "simple": "STRING" + }, + "description": "o2" } - ] + } } }, "nodes": [ @@ -234,39 +222,30 @@ "metadata": {}, "interface": { "inputs": { - "variables": [ - { - "name": "a", - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "a" - } + "variables": { + "a": { + "type": { + "simple": "INTEGER" + }, + "description": "a" } - ] + } }, "outputs": { - "variables": [ - { - "name": "o0", - "var": { - "type": { - "simple": "STRING" - }, - "description": "o0" - } + "variables": { + "o0": { + "type": { + "simple": "STRING" + }, + "description": "o0" }, - { - "name": "o1", - "var": { - "type": { - "simple": "STRING" - }, - "description": "o1" - } + "o1": { + "type": { + "simple": "STRING" + }, + "description": "o1" } - ] + } } }, "nodes": [ @@ -440,39 +419,30 @@ }, "interface": { "inputs": { - "variables": [ - { - "name": "a", - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "a" - } + "variables": { + "a": { + "type": { + "simple": "INTEGER" + }, + "description": "a" } - ] + } }, "outputs": { - "variables": [ - { - "name": "c", - "var": { - "type": { - "simple": "STRING" - }, - "description": "c" - } + "variables": { + "c": { + "type": { + "simple": "STRING" + }, + "description": "c" }, - { - "name": "t1_int_output", - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "t1_int_output" - } + "t1_int_output": { + "type": { + "simple": "INTEGER" + }, + "description": "t1_int_output" } - ] + } } }, "container": { @@ -508,4 +478,5 @@ } } ] -} \ No newline at end of file +} + From 4199e65a39d24cbf50b00811f3dc08fdf7620120 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 14 Sep 2021 15:21:43 +0530 Subject: [PATCH 145/645] Removing the ignore on start-node and minor bug fix (#176) Signed-off-by: Prafulla Mahindrakar --- flytectl/.gitignore | 3 ++- flytectl/cmd/get/node_execution.go | 8 +++----- flytectl/cmd/get/node_execution_test.go | 10 ++++++++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/flytectl/.gitignore b/flytectl/.gitignore index 1715663b54..c1b726f812 100644 --- a/flytectl/.gitignore +++ b/flytectl/.gitignore @@ -5,4 +5,5 @@ bin .DS_Store _test ./config.yaml -docs/build/* \ No newline at end of file +docs/build/* +cmd/upgrade/flyte.ext diff --git a/flytectl/cmd/get/node_execution.go b/flytectl/cmd/get/node_execution.go index 6db868ed88..8700272c0f 100644 --- a/flytectl/cmd/get/node_execution.go +++ b/flytectl/cmd/get/node_execution.go @@ -5,7 +5,6 @@ import ( "context" "sort" "strconv" - "strings" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" @@ -149,10 +148,6 @@ func getNodeExecDetailsInt(ctx context.Context, project, domain, execName, nodeN return nil, err } } else { - // Bug in admin https://github.com/flyteorg/flyte/issues/1221 - if strings.HasSuffix(nodeExec.Id.NodeId, "start-node") { - continue - } taskExecList, err := cmdCtx.AdminFetcherExt().FetchTaskExecutionsOnNode(ctx, nodeExec.Id.NodeId, execName, project, domain) if err != nil { @@ -260,6 +255,9 @@ func createNodeDetailsTreeView(rootView gotree.Tree, nodeExecutionClosures []*No func extractLiteralMap(literalMap *core.LiteralMap) (map[string]interface{}, error) { m := make(map[string]interface{}) + if literalMap == nil || literalMap.Literals == nil { + return m, nil + } for key, literalVal := range literalMap.Literals { extractedLiteralVal, err := coreutils.ExtractFromLiteral(literalVal) if err != nil { diff --git a/flytectl/cmd/get/node_execution_test.go b/flytectl/cmd/get/node_execution_test.go index ca58d26568..05d5c2372f 100644 --- a/flytectl/cmd/get/node_execution_test.go +++ b/flytectl/cmd/get/node_execution_test.go @@ -312,3 +312,13 @@ func TestGetExecutionDetails(t *testing.T) { assert.Equal(t, fmt.Errorf("unable to fetch task exec details"), err) }) } + +func TestExtractLiteralMapError(t *testing.T) { + literalMap, err := extractLiteralMap(nil) + assert.Nil(t, err) + assert.Equal(t, len(literalMap), 0) + + literalMap, err = extractLiteralMap(&core.LiteralMap{}) + assert.Nil(t, err) + assert.Equal(t, len(literalMap), 0) +} From c6dff3f2b406d781b79ba1f08389dd4399e60678 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 21 Sep 2021 12:42:09 +0530 Subject: [PATCH 146/645] Schema support idl update (#182) * Schema support idl update Signed-off-by: Prafulla Mahindrakar * Added released idl version Signed-off-by: Prafulla Mahindrakar * Fixed flaky tests Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/get/execution_test.go | 120 --------------------------- flytectl/cmd/upgrade/upgrade_test.go | 2 +- flytectl/go.mod | 2 +- flytectl/go.sum | 4 +- 4 files changed, 4 insertions(+), 124 deletions(-) diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go index 6589e4df2d..bcedf1f6d3 100644 --- a/flytectl/cmd/get/execution_test.go +++ b/flytectl/cmd/get/execution_test.go @@ -262,126 +262,6 @@ func TestGetExecutionFuncWithIOData(t *testing.T) { err = getExecutionFunc(ctx, args, mockCmdCtx) assert.Nil(t, err) }) - t.Run("invalid inputs", func(t *testing.T) { - setup() - getExecutionSetup() - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockClient = u.MockClient - mockFetcherExt := u.FetcherExt - execution.DefaultConfig.NodeID = nodeID - args := []string{dummyExec} - - nodeExec1 := createDummyNodeWithID("n0", false) - taskExec1 := createDummyTaskExecutionForNode("n0", "task21") - taskExec2 := createDummyTaskExecutionForNode("n0", "task22") - - nodeExecutions := []*admin.NodeExecution{nodeExec1} - nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} - - inputs := map[string]*core.Literal{ - "val1": &core.Literal{ - Value: &core.Literal_Scalar{ - Scalar: &core.Scalar{ - Value: &core.Scalar_Schema{}, - }, - }, - }, - } - outputs := map[string]*core.Literal{ - "o2": &core.Literal{ - Value: &core.Literal_Scalar{ - Scalar: &core.Scalar{ - Value: &core.Scalar_Primitive{ - Primitive: &core.Primitive{ - Value: &core.Primitive_Integer{ - Integer: 120, - }, - }, - }, - }, - }, - }, - } - dataResp := &admin.NodeExecutionGetDataResponse{ - FullOutputs: &core.LiteralMap{ - Literals: inputs, - }, - FullInputs: &core.LiteralMap{ - Literals: outputs, - }, - } - mockFetcherExt.OnFetchExecutionMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(&admin.Execution{}, nil) - mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) - mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(&admin.TaskExecutionList{ - TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, - }, nil) - mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(dataResp, nil) - - err = getExecutionFunc(ctx, args, mockCmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unsupported literal scalar type *core.Scalar_Schema"), err) - }) - t.Run("invalid outputs", func(t *testing.T) { - setup() - getExecutionSetup() - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockClient = u.MockClient - mockFetcherExt := u.FetcherExt - execution.DefaultConfig.NodeID = nodeID - args := []string{dummyExec} - - nodeExec1 := createDummyNodeWithID("n0", false) - taskExec1 := createDummyTaskExecutionForNode("n0", "task21") - taskExec2 := createDummyTaskExecutionForNode("n0", "task22") - - nodeExecutions := []*admin.NodeExecution{nodeExec1} - nodeExecList := &admin.NodeExecutionList{NodeExecutions: nodeExecutions} - - inputs := map[string]*core.Literal{ - "val1": &core.Literal{ - Value: &core.Literal_Scalar{ - Scalar: &core.Scalar{ - Value: &core.Scalar_Primitive{ - Primitive: &core.Primitive{ - Value: &core.Primitive_Integer{ - Integer: 120, - }, - }, - }, - }, - }, - }, - } - outputs := map[string]*core.Literal{ - "o2": &core.Literal{ - Value: &core.Literal_Scalar{ - Scalar: &core.Scalar{ - Value: &core.Scalar_Schema{}, - }, - }, - }, - } - dataResp := &admin.NodeExecutionGetDataResponse{ - FullOutputs: &core.LiteralMap{ - Literals: inputs, - }, - FullInputs: &core.LiteralMap{ - Literals: outputs, - }, - } - mockFetcherExt.OnFetchExecutionMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(&admin.Execution{}, nil) - mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) - mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(&admin.TaskExecutionList{ - TaskExecutions: []*admin.TaskExecution{taskExec1, taskExec2}, - }, nil) - mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(dataResp, nil) - - err = getExecutionFunc(ctx, args, mockCmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unsupported literal scalar type *core.Scalar_Schema"), err) - }) t.Run("fetch data error from admin", func(t *testing.T) { setup() getExecutionSetup() diff --git a/flytectl/cmd/upgrade/upgrade_test.go b/flytectl/cmd/upgrade/upgrade_test.go index e1996fb24d..213b02afdc 100644 --- a/flytectl/cmd/upgrade/upgrade_test.go +++ b/flytectl/cmd/upgrade/upgrade_test.go @@ -54,7 +54,7 @@ func TestUpgrade(t *testing.T) { t.Run("Successful upgrade", func(t *testing.T) { message, err := upgrade(githubutil.FlytectlReleaseConfig) assert.Nil(t, err) - assert.Equal(t, 39, len(message)) + assert.Contains(t, message, "Successfully updated to version") }) } diff --git a/flytectl/go.mod b/flytectl/go.mod index 94ef0c7047..125993c6d4 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -11,7 +11,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.21.0 + github.com/flyteorg/flyteidl v0.21.2 github.com/flyteorg/flytestdlib v0.3.34 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 diff --git a/flytectl/go.sum b/flytectl/go.sum index b482ad192a..475f57a778 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -345,8 +345,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.21.0 h1:AwHNusfxJMfRRSDk2QWfb3aIlyLJrFWVGtpXCbCtJ5A= -github.com/flyteorg/flyteidl v0.21.0/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.21.2 h1:7qRC28MueIcElwaqQxtjp483zMFrOjINTH8fjW/sQx0= +github.com/flyteorg/flyteidl v0.21.2/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.3.34 h1:OOuV03X8c1AWInzBU6IRsqpEF6y8WDJngbPcdL4VktY= github.com/flyteorg/flytestdlib v0.3.34/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= From f33a41d85d85443fcbbe157a22d6cded947c0e44 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Tue, 21 Sep 2021 10:37:07 -0700 Subject: [PATCH 147/645] Update documentation (#175) Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- flytectl/docs/source/gen/flytectl_register_examples.rst | 8 +++++++- flytectl/docs/source/gen/flytectl_register_files.rst | 3 ++- flytectl/docs/source/gen/flytectl_sandbox_exec.rst | 4 +--- flytectl/docs/source/gen/flytectl_sandbox_start.rst | 8 +++++--- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index f21135aa5b..e5fd09cfe0 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -15,7 +15,12 @@ Registers all latest flytesnacks example bin/flytectl register examples -d development -p flytesnacks +Registers specific release of flytesnacks example +:: + bin/flytectl register examples -d development -p flytesnacks v0.2.176 + +Note: register command automatically override the version with release version Usage @@ -33,7 +38,8 @@ Options --continueOnError continue on error when registering files. --dryRun execute command without making any modifications. -h, --help help for examples - --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. + --k8ServiceAccount string deprecated. Please use --K8sServiceAccount + --k8sServiceAccount string custom kubernetes service account auth role to register launch plans with. --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). --sourceUploadPath string Location for source code in storage. --version string version of the entity to be registered with flyte. (default "v1") diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 962d7cfaae..cb26121177 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -97,7 +97,8 @@ Options --continueOnError continue on error when registering files. --dryRun execute command without making any modifications. -h, --help help for files - --k8ServiceAccount string custom kubernetes service account auth role to register launch plans with. + --k8ServiceAccount string deprecated. Please use --K8sServiceAccount + --k8sServiceAccount string custom kubernetes service account auth role to register launch plans with. --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). --sourceUploadPath string Location for source code in storage. --version string version of the entity to be registered with flyte. (default "v1") diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index 2f8b53cc81..bd9c0ec4e9 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -26,9 +26,7 @@ Options :: - -h, --help help for exec - --source string Path of your source code - --version string Version of flyte + -h, --help help for exec Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 00de94c676..bc96eb1ade 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -22,11 +22,13 @@ Mount your source code repository inside sandbox bin/flytectl sandbox start --source=$HOME/flyteorg/flytesnacks -Run specific version of flyte, Only available after v0.13.0+ +Run specific version of flyte. flytectl sandbox only support flyte version available in Github release https://github.com/flyteorg/flyte/tags :: bin/flytectl sandbox start --version=v0.14.0 +Note: Flytectl sandbox will only work for v0.10.0+ + Usage @@ -40,8 +42,8 @@ Options :: -h, --help help for start - --source string Path of your source code - --version string Version of flyte + --source string Path of your source code + --version string Version of flyte. Only support v0.10.0+ flyte release Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From b3ae520644179a2165782a556fff727ff4b77f39 Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Wed, 29 Sep 2021 14:17:23 +0530 Subject: [PATCH 148/645] Update FlyteCTL Contribution Guide (#183) * Update FlyteCTL Contribution Guide Signed-off-by: Samhita Alla * delete CONTRIBUTE.md file Signed-off-by: Samhita Alla * fix contribute.rst Signed-off-by: Samhita Alla * fix readme Signed-off-by: Samhita Alla * fix readme Signed-off-by: Samhita Alla * update contrib guide Signed-off-by: Samhita Alla * update contrib guide Signed-off-by: Samhita Alla * update contrib guide Signed-off-by: Samhita Alla * update contrib guide Signed-off-by: Samhita Alla * update README Signed-off-by: Samhita Alla --- flytectl/.gitignore | 1 + flytectl/README.md | 80 ++++++++++++++++++----------- flytectl/docs/CONTRIBUTING.md | 25 --------- flytectl/docs/source/contribute.rst | 73 ++++++++++++++++++++++++++ flytectl/docs/source/index.rst | 2 +- 5 files changed, 124 insertions(+), 57 deletions(-) delete mode 100644 flytectl/docs/CONTRIBUTING.md create mode 100644 flytectl/docs/source/contribute.rst diff --git a/flytectl/.gitignore b/flytectl/.gitignore index c1b726f812..0cfb4d69b2 100644 --- a/flytectl/.gitignore +++ b/flytectl/.gitignore @@ -7,3 +7,4 @@ _test ./config.yaml docs/build/* cmd/upgrade/flyte.ext +.vscode diff --git a/flytectl/README.md b/flytectl/README.md index 1dab7131eb..45006d74c7 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -1,4 +1,19 @@ -# flytectl + +

+ Flyte Logo +

+

+ FlyteCTL +

+

+ The official Flyte command-line interface +

+

+ Documentation + · + Contribution Guide +

+ [![Docs](https://readthedocs.org/projects/flytectl/badge/?version=latest&style=plastic)](https://flytectl.rtfd.io) [![Current Release](https://img.shields.io/github/release/flyteorg/flytectl.svg)](https://github.com/flyteorg/flytectl/releases/latest) @@ -10,42 +25,45 @@ ![Commit activity](https://img.shields.io/github/commit-activity/w/lyft/flytectl.svg?style=plastic) ![Commit since last release](https://img.shields.io/github/commits-since/lyft/flytectl/latest.svg?style=plastic) -Flytectl is designed to be a portable, lightweight, CLI for working with Flyte. It is written in Golang and can access FlyteAdmin +FlyteCTL is designed to be a portable and lightweight CLI to work with Flyte. It is written in Golang and can access [FlyteAdmin](https://github.com/flyteorg/flyteadmin/)—the control plane of Flyte. -## Docs +## 🚀 Quick Start -Docs are generated using Sphinx and are available at [flytectl.rtfd.io](https://flytectl.rtfd.io) -Generating docs locally can be accomplished by running make gendocs from within the docs folder +1. Install FlyteCTL with bash or shell script + * Bash + ```bash + $ brew install flyteorg/homebrew-tap/flytectl + ``` + * Shell script + ```bash + $ curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash + ``` +2. (Optional) `flytectl upgrade` provides a general interface to upgrade FlyteCTL; run the command shown in the output -## Installation +3. Start sandbox using FlyteCTL + ```bash + $ flytectl sandbox start + ``` -Install flytectl with homebrew tap -```bash -$ brew install flyteorg/homebrew-tap/flytectl +4. Register examples + ```bash + # Register core workflows + $ flytectl register examples -d development -p flytesnacks + ``` -# Upgrade flytectl -$ brew upgrade flytectl -``` + +

+ 📖 How to Contribute to FlyteCTL +

+ -Install flytectl with shell script -```bash -$ curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash -``` +You can find the detailed contribution guide [here](docs/source/contribute.rst). -## Get Started + +

+ 🐞 File an Issue +

+ -### Create a sandbox cluster -```bash -$ flytectl sandbox start -``` - -### Register flytesnacks example -```bash -# Run Core workflows -$ flytectl register examples -d development -p flytesnacks -``` - -## Contributing - -[Contribution guidelines for this project](docs/CONTRIBUTING.md) +Refer to the [issues](https://docs.flyte.org/en/latest/community/contribute.html#issues) section in the contribution guide if you'd like to file an issue. \ No newline at end of file diff --git a/flytectl/docs/CONTRIBUTING.md b/flytectl/docs/CONTRIBUTING.md deleted file mode 100644 index f170374b9e..0000000000 --- a/flytectl/docs/CONTRIBUTING.md +++ /dev/null @@ -1,25 +0,0 @@ -# Developing FlyteCtl - -A local cluster can be setup via --> https://docs.flyte.org/en/latest/getting_started.html - -Then, if having trouble connecting to local cluster see the following: - -#1) Find/Set/Verify gRPC port for your local Flyte service: - -FLYTECTL_GRPC_PORT=`kubectl get service -n flyte flyteadmin -o json | jq '.spec.ports[] | select(.name=="grpc").port'` - -#2) Setup Port forwarding: kubectl port-forward -n flyte service/flyteadmin 8081:$FLYTECTL_GRPC_PORT - -#3) Update config line in https://github.com/flyteorg/flytectl/blob/master/config.yaml to dns:///localhost:8081 - -#4) All new flags introduced for flytectl commands and subcommands should be camelcased. eg: bin/flytectl update project -p flytesnacks --activateProject - -# DCO: Sign your work - -Flyte ships commit hooks that allow you to auto-generate the DCO signoff line if -it doesn't exist when you run `git commit`. Simply navigate to the flytectl project root and run - -```bash -make setup-precommit -``` - diff --git a/flytectl/docs/source/contribute.rst b/flytectl/docs/source/contribute.rst new file mode 100644 index 0000000000..bbb5d385f6 --- /dev/null +++ b/flytectl/docs/source/contribute.rst @@ -0,0 +1,73 @@ +########################### +FlyteCTL Contribution Guide +########################### + +First off, thank you for thinking about contributing! +Below you’ll find instructions that will hopefully guide you through how to contribute to, fix, and improve FlyteCTL. + +📝 Contribute to Documentation +============================== + +Docs are generated using Sphinx and are available at [flytectl.rtfd.io](https://flytectl.rtfd.io). + +To update the documentation, follow these steps: + +1. Install the requirements by running ``pip install -r doc-requirements.txt`` in the root folder +2. Make modifications in the `docs/source/gen `__ folder +3. Run ``make gendocs`` from within the `docs `__ folder +4. Open html files produced by Sphinx in your browser to verify if the changes look as expected (html files can be found in the ``docs/build/html`` folder) + +💻 Contribute Code +================== + +1. Run ``make compile`` in the root directory to compile the code +2. Set up a local cluster by running ``./bin/flytectl sandbox start`` in the root directory +3. Run ``flytectl get project`` to see if things are working +4. Run the command you want to test in the terminal +5. If you want to update the command (add additional options, change existing options, etc.): + + * Navigate to `cmd `__ directory + * Each sub-directory points to a command, for example, ``create`` points to ``flytectl create ...`` + * Here are the directories you can navigate to: + + .. list-table:: FlyteCTL cmd directories + :widths: 25 25 50 + :header-rows: 1 + + * - Directory + - Command + - Description + * - ``config`` + - ``flytectl config ...`` + - Common package for all commands; has root flags + * - ``configuration`` + - ``flytectl configuration ...`` + - Command to validate/generate flytectl config + * - ``create`` + - ``flytectl create ...`` + - Command to create a project/execution + * - ``delete`` + - ``flytectl delete ...`` + - Command to abort an execution and delete resource attributes + * - ``get`` + - ``flytectl get ...`` + - Command to get a task/workflow/launchplan/execution/project/resource's-attributes + * - ``register`` + - ``flytectl register ...`` + - Command to register a task/workflow/launchplan + * - ``sandbox`` + - ``flytectl sandbox ...`` + - Command to interact with sandbox + * - ``update`` + - ``flytectl update ...`` + - Command to update a project/launchplan/resource's-attributes + * - ``upgrade`` + - ``flytectl upgrade ...`` + - Command to upgrade/rollback FlyteCTL version + * - ``version`` + - ``flytectl version ...`` + - Command to fetch FlyteCTL version + + Find all FlyteCTL commands on the `Nouns `__ page. + * Run appropriate tests to test the changes by running ``go test ./... -race -coverprofile=coverage.txt -covermode=atomic -v`` + in the root directory \ No newline at end of file diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 3125fb7637..40a953745c 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -143,4 +143,4 @@ Flytectl configuration Install and Configure verbs nouns - Contribute + contribute From d963c7aac65974ad23dd9deb82235a6f435edca9 Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Fri, 1 Oct 2021 09:08:30 -0700 Subject: [PATCH 149/645] Fix pod task fast registration template substitution (#184) --- flytectl/cmd/register/register_util.go | 29 +++++++++++ flytectl/cmd/register/register_util_test.go | 56 +++++++++++++++++++++ flytectl/go.sum | 1 + 3 files changed, 86 insertions(+) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index fa51cc29c8..1cdc7893c5 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -18,6 +18,7 @@ import ( "github.com/flyteorg/flytestdlib/contextutils" "github.com/flyteorg/flytestdlib/promutils" "github.com/flyteorg/flytestdlib/promutils/labeled" + "github.com/flyteorg/flytestdlib/utils" "github.com/google/go-github/github" @@ -34,6 +35,7 @@ import ( "github.com/golang/protobuf/proto" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + v1 "k8s.io/api/core/v1" ) // Variable define in serialized proto that needs to be replace in registration time @@ -222,6 +224,33 @@ func hydrateTaskSpec(task *admin.TaskSpec, sourceCode string) error { task.Template.GetContainer().Args[k] = string(remotePath) } } + } else if task.Template.GetK8SPod() != nil && task.Template.GetK8SPod().PodSpec != nil { + var podSpec = v1.PodSpec{} + err := utils.UnmarshalStructToObj(task.Template.GetK8SPod().PodSpec, &podSpec) + if err != nil { + return err + } + for containerIdx, container := range podSpec.Containers { + for argIdx, arg := range container.Args { + if arg == registrationRemotePackagePattern { + remotePath, err := getRemoteStoragePath(context.Background(), Client, rconfig.DefaultFilesConfig.SourceUploadPath, sourceCode, rconfig.DefaultFilesConfig.Version) + if err != nil { + return err + } + podSpec.Containers[containerIdx].Args[argIdx] = string(remotePath) + } + } + } + podSpecStruct, err := utils.MarshalObjToStruct(podSpec) + if err != nil { + return err + } + task.Template.Target = &core.TaskTemplate_K8SPod{ + K8SPod: &core.K8SPod{ + Metadata: task.Template.GetK8SPod().Metadata, + PodSpec: podSpecStruct, + }, + } } return nil } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index bb85c1c22f..4963ebe4b3 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -9,6 +9,10 @@ import ( "strings" "testing" + "github.com/flyteorg/flytestdlib/utils" + + v1 "k8s.io/api/core/v1" + "github.com/flyteorg/flytestdlib/contextutils" "github.com/flyteorg/flytestdlib/promutils" "github.com/flyteorg/flytestdlib/promutils/labeled" @@ -397,3 +401,55 @@ func TestHydrateNode(t *testing.T) { assert.NotNil(t, err) }) } + +func TestHydrateTaskSpec(t *testing.T) { + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + s, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + assert.Nil(t, err) + Client = s + + metadata := &core.K8SObjectMetadata{ + Labels: map[string]string{ + "l": "a", + }, + Annotations: map[string]string{ + "a": "b", + }, + } + + podSpec := v1.PodSpec{ + Containers: []v1.Container{ + { + Args: []string{"foo", "bar"}, + }, + { + Args: []string{"baz", registrationRemotePackagePattern}, + }, + }, + } + podSpecStruct, err := utils.MarshalObjToStruct(podSpec) + if err != nil { + t.Fatal(err) + } + + task := &admin.TaskSpec{ + Template: &core.TaskTemplate{ + Target: &core.TaskTemplate_K8SPod{ + K8SPod: &core.K8SPod{ + Metadata: metadata, + PodSpec: podSpecStruct, + }, + }, + }, + } + err = hydrateTaskSpec(task, "sourcey") + assert.NoError(t, err) + var hydratedPodSpec = v1.PodSpec{} + err = utils.UnmarshalStructToObj(task.Template.GetK8SPod().PodSpec, &hydratedPodSpec) + assert.NoError(t, err) + assert.Len(t, hydratedPodSpec.Containers[1].Args, 2) + assert.True(t, strings.HasSuffix(hydratedPodSpec.Containers[1].Args[1], "sourcey")) +} diff --git a/flytectl/go.sum b/flytectl/go.sum index 475f57a778..28983a22c6 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -534,6 +534,7 @@ github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= From bdf47b88b8a8a287ffa64313f96909a947da9413 Mon Sep 17 00:00:00 2001 From: Divyansh Bansal <86911142+idivyanshbansal@users.noreply.github.com> Date: Mon, 4 Oct 2021 08:49:51 +0530 Subject: [PATCH 150/645] Update README.md (#192) --- flytectl/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/flytectl/README.md b/flytectl/README.md index 45006d74c7..52324250d3 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -6,7 +6,7 @@ FlyteCTL

- The official Flyte command-line interface + Flyte's official command-line interface

Documentation @@ -25,7 +25,7 @@ ![Commit activity](https://img.shields.io/github/commit-activity/w/lyft/flytectl.svg?style=plastic) ![Commit since last release](https://img.shields.io/github/commits-since/lyft/flytectl/latest.svg?style=plastic) -FlyteCTL is designed to be a portable and lightweight CLI to work with Flyte. It is written in Golang and can access [FlyteAdmin](https://github.com/flyteorg/flyteadmin/)—the control plane of Flyte. +FlyteCTL was designed as a portable and lightweight command-line interface to work with Flyte. It is written in Golang and accesses [FlyteAdmin](https://github.com/flyteorg/flyteadmin/), the control plane for Flyte. ## 🚀 Quick Start @@ -39,7 +39,7 @@ FlyteCTL is designed to be a portable and lightweight CLI to work with Flyte. It ```bash $ curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash ``` -2. (Optional) `flytectl upgrade` provides a general interface to upgrade FlyteCTL; run the command shown in the output +2. (Optional) `flytectl upgrade` provides a general interface to upgrading FlyteCTL; run the command in the output 3. Start sandbox using FlyteCTL ```bash @@ -66,4 +66,4 @@ You can find the detailed contribution guide [here](docs/source/contribute.rst).

-Refer to the [issues](https://docs.flyte.org/en/latest/community/contribute.html#issues) section in the contribution guide if you'd like to file an issue. \ No newline at end of file +Refer to the [issues](https://docs.flyte.org/en/latest/community/contribute.html#issues) section in the contribution guide if you'd like to file an issue. From 6f9a2aa918b39988c76b6de6e92f6c7c7b0fc602 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Wed, 6 Oct 2021 14:39:46 -0700 Subject: [PATCH 151/645] flytectl sandbox start --image xyz (#195) * flytectl sandbox start --image xyz Sandbox can now use a custom image Signed-off-by: Ketan Umare * fixed unit test Signed-off-by: Ketan Umare * updated comments Signed-off-by: Ketan Umare --- .../config/subcommand/sandbox/config_flags.go | 3 +- .../subcommand/sandbox/config_flags_test.go | 14 +++++++++ .../subcommand/sandbox/sandbox_config.go | 11 +++++-- flytectl/cmd/sandbox/start.go | 30 ++++++++++++------- flytectl/cmd/sandbox/start_test.go | 17 +++++++---- 5 files changed, 56 insertions(+), 19 deletions(-) diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index ca50e9ad28..15c7c6f78f 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -51,6 +51,7 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) cmdFlags.StringVar(&DefaultConfig.Source, fmt.Sprintf("%v%v", prefix, "source"), DefaultConfig.Source, "Path of your source code") - cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "Version of flyte. Only support v0.10.0+ flyte release") + cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "Version of flyte. Only supports flyte releases greater than v0.10.0") + cmdFlags.StringVar(&DefaultConfig.Image, fmt.Sprintf("%v%v", prefix, "image"), DefaultConfig.Image, "Optional. Provide a fully qualified path to a Flyte compliant docker image.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index f01337ec13..cd58322bb6 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -127,4 +127,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_image", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("image", testValue) + if vString, err := cmdFlags.GetString("image"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Image) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index 7005b031b1..9a787757a7 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -9,8 +9,13 @@ var ( type Config struct { Source string `json:"source" pflag:",Path of your source code"` - // Flytectl sandbox only support flyte version available in Github release https://github.com/flyteorg/flyte/tags + // Flytectl sandbox only supports flyte version available in Github release https://github.com/flyteorg/flyte/tags // Flytectl sandbox will only work for v0.10.0+ - // Default value dind represent the latest release - Version string `json:"version" pflag:",Version of flyte. Only support v0.10.0+ flyte release"` + // Default value dind represents the latest release + Version string `json:"version" pflag:",Version of flyte. Only supports flyte releases greater than v0.10.0"` + + // Optionally it is possible to specify a specific fqn for the docker image with the tag. This should be + // Flyte compliant sandbox image. Usually useful, if you want to push the image to your own registry and relaunch + // from there. + Image string `json:"image" pflag:",Optional. Provide a fully qualified path to a Flyte compliant docker image."` } diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index b36324be14..8f9518a793 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -37,22 +37,27 @@ The Flyte Sandbox is a fully standalone minimal environment for running Flyte. p Start sandbox cluster without any source code :: - bin/flytectl sandbox start + flytectl sandbox start Mount your source code repository inside sandbox :: - bin/flytectl sandbox start --source=$HOME/flyteorg/flytesnacks + flytectl sandbox start --source=$HOME/flyteorg/flytesnacks Run specific version of flyte. flytectl sandbox only support flyte version available in Github release https://github.com/flyteorg/flyte/tags :: - bin/flytectl sandbox start --version=v0.14.0 + flytectl sandbox start --version=v0.14.0 + +Note: Flytectl sandbox is only supported for Flyte versions > v0.10.0 + +Specify a Flyte Sandbox compliant image with the registry. This is useful, in case you want to use an image from your registry. +:: + + flytectl sandbox start --image docker.io/my-override:latest -Note: Flytectl sandbox will only work for v0.10.0+ - Usage - ` +` k8sEndpoint = "https://127.0.0.1:30086" flyteNamespace = "flyte" flyteRepository = "flyte" @@ -133,7 +138,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu volumes = append(volumes, *vol) } - image, err := getSandboxImage(sandboxConfig.DefaultConfig.Version) + image, err := getSandboxImage(sandboxConfig.DefaultConfig.Version, sandboxConfig.DefaultConfig.Image) if err != nil { return nil, err } @@ -158,9 +163,14 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu return logReader, nil } -func getSandboxImage(version string) (string, error) { - // Latest release will use image cr.flyte.org/flyteorg/flyte-sandbox:dind - // In case of version flytectl will use cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA} +// Returns the alternate image if specified, else +// if no version is specified then the Latest release of cr.flyte.org/flyteorg/flyte-sandbox:dind is used +// else cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA}, where sha is derived from the version. +func getSandboxImage(version string, alternateImage string) (string, error) { + + if len(alternateImage) > 0 { + return alternateImage, nil + } var tag = dind if len(version) > 0 { diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index 0d0331968c..d15ee17ef4 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -678,26 +678,33 @@ func TestGetNodeTaintStatus(t *testing.T) { func TestGetSandboxImage(t *testing.T) { t.Run("Get Latest sandbox", func(t *testing.T) { - image, err := getSandboxImage("") + image, err := getSandboxImage("", "") assert.Nil(t, err) assert.Equal(t, docker.GetSandboxImage(dind), image) }) t.Run("Get sandbox image with version ", func(t *testing.T) { - image, err := getSandboxImage("v0.14.0") + image, err := getSandboxImage("v0.14.0", "") assert.Nil(t, err) assert.Equal(t, true, strings.HasPrefix(image, docker.ImageName)) }) t.Run("Get sandbox image with wrong version ", func(t *testing.T) { - _, err := getSandboxImage("v100.1.0") + _, err := getSandboxImage("v100.1.0", "") assert.NotNil(t, err) }) t.Run("Get sandbox image with wrong version ", func(t *testing.T) { - _, err := getSandboxImage("aaaaaa") + _, err := getSandboxImage("aaaaaa", "") assert.NotNil(t, err) }) t.Run("Get sandbox image with version that is not supported", func(t *testing.T) { - _, err := getSandboxImage("v0.10.0") + _, err := getSandboxImage("v0.10.0", "") assert.NotNil(t, err) }) + + t.Run("Get sandbox image with version that is not supported", func(t *testing.T) { + img := "docker.io/my-override:latest" + i, err := getSandboxImage("v0.11.0", img) + assert.Nil(t, err) + assert.Equal(t, i, img) + }) } From b58b748ac1d18776f7c9f2b47e2f4ce0376c6e8a Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Thu, 7 Oct 2021 12:07:36 +0530 Subject: [PATCH 152/645] Fixed the non-zero return code issue in archive path (#194) --- flytectl/cmd/register/files.go | 11 ++++++----- flytectl/cmd/register/files_test.go | 24 +++++++++++++++++++++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index 99d8a99090..a3575662fd 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -96,7 +96,7 @@ func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.Co } func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - var _err error + var regErr error var dataRefs []string // Deprecated checks for --k8Service @@ -131,17 +131,18 @@ func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) var registerResults []Result fastFail := rconfig.DefaultFilesConfig.ContinueOnError - for i := 0; i < len(validProto) && !(fastFail && _err != nil); i++ { - registerResults, _err = registerFile(ctx, validProto[i], sourceCodeName, registerResults, cmdCtx) + for i := 0; i < len(validProto) && !(fastFail && regErr != nil); i++ { + registerResults, regErr = registerFile(ctx, validProto[i], sourceCodeName, registerResults, cmdCtx) } payload, _ := json.Marshal(registerResults) registerPrinter := printer.Printer{} _ = registerPrinter.JSONToTable(payload, projectColumns) if tmpDir != "" { - if _err = os.RemoveAll(tmpDir); _err != nil { + if _err := os.RemoveAll(tmpDir); _err != nil { logger.Errorf(ctx, "unable to delete temp dir %v due to %v", tmpDir, _err) + return _err } } - return _err + return regErr } diff --git a/flytectl/cmd/register/files_test.go b/flytectl/cmd/register/files_test.go index c79c1259d2..34da278850 100644 --- a/flytectl/cmd/register/files_test.go +++ b/flytectl/cmd/register/files_test.go @@ -1,6 +1,7 @@ package register import ( + "fmt" "testing" "github.com/flyteorg/flytestdlib/contextutils" @@ -71,7 +72,7 @@ func TestRegisterFromFiles(t *testing.T) { err = Register(ctx, args, cmdCtx) assert.Nil(t, err) }) - t.Run("Failed registeration because of invalid files", func(t *testing.T) { + t.Run("Failed registration because of invalid files", func(t *testing.T) { setup() registerFilesSetup() testScope := promutils.NewTestScope() @@ -90,7 +91,28 @@ func TestRegisterFromFiles(t *testing.T) { err = registerFromFilesFunc(ctx, args, cmdCtx) assert.NotNil(t, err) }) + t.Run("Failure registration of fast serialize", func(t *testing.T) { + setup() + registerFilesSetup() + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + rconfig.DefaultFilesConfig.Archive = true + rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output + rconfig.DefaultFilesConfig.SourceUploadPath = s3Output + s, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + Client = s + assert.Nil(t, err) + args = []string{"testdata/flytesnacks-core.tgz"} + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + err = registerFromFilesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed"), err) + }) t.Run("Valid registration of fast serialize", func(t *testing.T) { setup() registerFilesSetup() From d0333696bac1bb76c26a875460e7538713b6f3a6 Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Fri, 8 Oct 2021 18:54:34 +0530 Subject: [PATCH 153/645] Fix docs contribution guide (#197) Signed-off-by: Samhita Alla --- flytectl/docs/source/contribute.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/flytectl/docs/source/contribute.rst b/flytectl/docs/source/contribute.rst index bbb5d385f6..a623d3f159 100644 --- a/flytectl/docs/source/contribute.rst +++ b/flytectl/docs/source/contribute.rst @@ -13,7 +13,7 @@ Docs are generated using Sphinx and are available at [flytectl.rtfd.io](https:// To update the documentation, follow these steps: 1. Install the requirements by running ``pip install -r doc-requirements.txt`` in the root folder -2. Make modifications in the `docs/source/gen `__ folder +2. Make modifications in the `cmd `__ folder 3. Run ``make gendocs`` from within the `docs `__ folder 4. Open html files produced by Sphinx in your browser to verify if the changes look as expected (html files can be found in the ``docs/build/html`` folder) @@ -25,11 +25,11 @@ To update the documentation, follow these steps: 3. Run ``flytectl get project`` to see if things are working 4. Run the command you want to test in the terminal 5. If you want to update the command (add additional options, change existing options, etc.): - + * Navigate to `cmd `__ directory * Each sub-directory points to a command, for example, ``create`` points to ``flytectl create ...`` * Here are the directories you can navigate to: - + .. list-table:: FlyteCTL cmd directories :widths: 25 25 50 :header-rows: 1 @@ -67,7 +67,7 @@ To update the documentation, follow these steps: * - ``version`` - ``flytectl version ...`` - Command to fetch FlyteCTL version - + Find all FlyteCTL commands on the `Nouns `__ page. * Run appropriate tests to test the changes by running ``go test ./... -race -coverprofile=coverage.txt -covermode=atomic -v`` in the root directory \ No newline at end of file From 90e01a64860ada1c7c03e1d6de56a9f1c21ea2ad Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Fri, 15 Oct 2021 05:15:13 +0530 Subject: [PATCH 154/645] Add Slack button to README (#198) Signed-off-by: Ketan Umare --- flytectl/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/flytectl/README.md b/flytectl/README.md index 52324250d3..e0c3279d1c 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -24,6 +24,7 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/flyteorg/flytectl)](https://goreportcard.com/report/github.com/flyteorg/flytectl) ![Commit activity](https://img.shields.io/github/commit-activity/w/lyft/flytectl.svg?style=plastic) ![Commit since last release](https://img.shields.io/github/commits-since/lyft/flytectl/latest.svg?style=plastic) +[![Slack](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social)](https://slack.flyte.org) FlyteCTL was designed as a portable and lightweight command-line interface to work with Flyte. It is written in Golang and accesses [FlyteAdmin](https://github.com/flyteorg/flyteadmin/), the control plane for Flyte. From 6e20a258f208d1cd06775a5546f4b90c0b7afdcf Mon Sep 17 00:00:00 2001 From: Joshua T Date: Mon, 18 Oct 2021 14:57:39 +0530 Subject: [PATCH 155/645] Do not bump version on docs or boilerplate update (#200) This consequently does not run the release wordflow Signed-off-by: radiantly --- flytectl/.github/workflows/master.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/flytectl/.github/workflows/master.yml b/flytectl/.github/workflows/master.yml index 320f92c4ce..5a414d6b62 100644 --- a/flytectl/.github/workflows/master.yml +++ b/flytectl/.github/workflows/master.yml @@ -4,22 +4,24 @@ on: push: branches: - master + paths-ignore: + - "docs/**" + - "boilerplate/**" jobs: bump-version: name: Bump Version - if: github.event.head_commit.name != 'flyte-bot' runs-on: ubuntu-latest outputs: version: ${{ steps.bump-version.outputs.tag }} steps: - uses: actions/checkout@v2 with: - fetch-depth: '0' + fetch-depth: "0" - name: Bump version and push tag id: bump-version uses: anothrNick/github-tag-action@1.17.2 env: GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} WITH_V: true - DEFAULT_BUMP: patch \ No newline at end of file + DEFAULT_BUMP: patch From 26f139a33851396b981fc38b69da371f9f09c1a0 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 18 Oct 2021 18:34:34 +0530 Subject: [PATCH 156/645] Added support for tar.gz in register (#199) * Added support for tar.gz in register Signed-off-by: Yuvraj --- flytectl/cmd/register/register_util.go | 35 ++++++++++++++++----- flytectl/cmd/register/register_util_test.go | 2 +- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 1cdc7893c5..cc0130d7dd 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -46,6 +46,12 @@ const registrationVersionPattern = "{{ registration.version }}" // Additional variable define in fast serialized proto that needs to be replace in registration time const registrationRemotePackagePattern = "{{ .remote_package_path }}" +// All supported extensions for compress +var supportedExtensions = []string{".tar", ".tgz", ".tar.gz"} + +// All supported extensions for gzip compress +var validGzipExtensions = []string{".tgz", ".tar.gz"} + type Result struct { Name string Status string @@ -445,15 +451,14 @@ func registerFile(ctx context.Context, fileName, sourceCode string, registerResu func getArchiveReaderCloser(ctx context.Context, ref string) (io.ReadCloser, error) { dataRef := storage.DataReference(ref) scheme, _, key, err := dataRef.Split() - segments := strings.Split(key, ".") - ext := segments[len(segments)-1] if err != nil { return nil, err } var dataRefReaderCloser io.ReadCloser - if ext != "tar" && ext != "tgz" { - return nil, errors.New("only .tar and .tgz extension archives are supported") + isValid, extension := checkSupportedExtensionForCompress(key) + if !isValid { + return nil, errors.New("only .tar, .tar.gz and .tgz extension archives are supported") } if scheme == "http" || scheme == "https" { @@ -464,9 +469,13 @@ func getArchiveReaderCloser(ctx context.Context, ref string) (io.ReadCloser, err if err != nil { return nil, err } - if ext == "tgz" { - if dataRefReaderCloser, err = gzip.NewReader(dataRefReaderCloser); err != nil { - return nil, err + + for _, ext := range validGzipExtensions { + if ext == extension { + if dataRefReaderCloser, err = gzip.NewReader(dataRefReaderCloser); err != nil { + return nil, err + } + break } } return dataRefReaderCloser, err @@ -486,7 +495,8 @@ func getJSONSpec(message proto.Message) string { func filterExampleFromRelease(releases github.RepositoryRelease) []github.ReleaseAsset { var assets []github.ReleaseAsset for _, v := range releases.Assets { - if strings.HasSuffix(*v.Name, ".tgz") { + isValid, _ := checkSupportedExtensionForCompress(*v.Name) + if isValid { assets = append(assets, v) } } @@ -604,3 +614,12 @@ func deprecatedCheck(ctx context.Context) { rconfig.DefaultFilesConfig.K8sServiceAccount = rconfig.DefaultFilesConfig.K8ServiceAccount } } + +func checkSupportedExtensionForCompress(file string) (bool, string) { + for _, extension := range supportedExtensions { + if strings.HasSuffix(file, extension) { + return true, extension + } + } + return false, "" +} diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 4963ebe4b3..7f784776b3 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -163,7 +163,7 @@ func TestGetSortedArchivedInvalidArchiveFileList(t *testing.T) { assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) - assert.Equal(t, errors.New("only .tar and .tgz extension archives are supported"), err) + assert.Equal(t, errors.New("only .tar, .tar.gz and .tgz extension archives are supported"), err) // Clean up the temp directory. assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) } From 249ee0475b360466a60d8d84383bfeee9b9b84d3 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Mon, 18 Oct 2021 10:18:34 -0700 Subject: [PATCH 157/645] Update Flyteidl version (#202) Signed-off-by: Flyte-Bot Co-authored-by: evalsocket --- flytectl/go.mod | 4 ++-- flytectl/go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 125993c6d4..79df64a12b 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -11,8 +11,8 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.21.2 - github.com/flyteorg/flytestdlib v0.3.34 + github.com/flyteorg/flyteidl v0.21.5 + github.com/flyteorg/flytestdlib v0.4.0 github.com/ghodss/yaml v1.0.0 github.com/golang/protobuf v1.4.3 github.com/google/go-github v17.0.0+incompatible diff --git a/flytectl/go.sum b/flytectl/go.sum index 28983a22c6..bee38b14ea 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -345,11 +345,11 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.21.2 h1:7qRC28MueIcElwaqQxtjp483zMFrOjINTH8fjW/sQx0= -github.com/flyteorg/flyteidl v0.21.2/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.21.5 h1:ietcyEpQ0C1FYDTUauo7h4yS792PAeiJYs0mQJ/j+8k= +github.com/flyteorg/flyteidl v0.21.5/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= -github.com/flyteorg/flytestdlib v0.3.34 h1:OOuV03X8c1AWInzBU6IRsqpEF6y8WDJngbPcdL4VktY= -github.com/flyteorg/flytestdlib v0.3.34/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= +github.com/flyteorg/flytestdlib v0.4.0 h1:cEMkNfjocCuBSLzM9tKjsODhkr5gXTZAGl6k62FrT60= +github.com/flyteorg/flytestdlib v0.4.0/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= From f8fff0e2170d5cc1994d91bdb77258d38fed27ea Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Mon, 18 Oct 2021 10:19:53 -0700 Subject: [PATCH 158/645] Update documentation (#196) Signed-off-by: Flyte-Bot Co-authored-by: evalsocket --- .../source/gen/flytectl_sandbox_start.rst | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index bc96eb1ade..441f04674e 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -15,22 +15,27 @@ The Flyte Sandbox is a fully standalone minimal environment for running Flyte. p Start sandbox cluster without any source code :: - bin/flytectl sandbox start + flytectl sandbox start Mount your source code repository inside sandbox :: - bin/flytectl sandbox start --source=$HOME/flyteorg/flytesnacks + flytectl sandbox start --source=$HOME/flyteorg/flytesnacks Run specific version of flyte. flytectl sandbox only support flyte version available in Github release https://github.com/flyteorg/flyte/tags :: - bin/flytectl sandbox start --version=v0.14.0 + flytectl sandbox start --version=v0.14.0 + +Note: Flytectl sandbox is only supported for Flyte versions > v0.10.0 + +Specify a Flyte Sandbox compliant image with the registry. This is useful, in case you want to use an image from your registry. +:: + + flytectl sandbox start --image docker.io/my-override:latest -Note: Flytectl sandbox will only work for v0.10.0+ - Usage - + :: @@ -42,8 +47,9 @@ Options :: -h, --help help for start + --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. --source string Path of your source code - --version string Version of flyte. Only support v0.10.0+ flyte release + --version string Version of flyte. Only supports flyte releases greater than v0.10.0 Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From a2f437fcde1f3c7dd631d0cbee4fe8392df861f4 Mon Sep 17 00:00:00 2001 From: Haytham Abuelfutuh Date: Tue, 19 Oct 2021 15:59:50 -0700 Subject: [PATCH 159/645] Redirect install.sh script (#204) * Redirect install.sh script Signed-off-by: Haytham Abuelfutuh * Update index.rst Signed-off-by: Haytham Abuelfutuh * Make curl follow redirects Signed-off-by: Haytham Abuelfutuh --- flytectl/README.md | 12 +++++++----- flytectl/docs/source/index.rst | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/flytectl/README.md b/flytectl/README.md index e0c3279d1c..4c64202e23 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -26,7 +26,8 @@ ![Commit since last release](https://img.shields.io/github/commits-since/lyft/flytectl/latest.svg?style=plastic) [![Slack](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social)](https://slack.flyte.org) -FlyteCTL was designed as a portable and lightweight command-line interface to work with Flyte. It is written in Golang and accesses [FlyteAdmin](https://github.com/flyteorg/flyteadmin/), the control plane for Flyte. +FlyteCTL was designed as a portable and lightweight command-line interface to work with Flyte. It is written in Golang +and accesses [FlyteAdmin](https://github.com/flyteorg/flyteadmin/), the control plane for Flyte. ## 🚀 Quick Start @@ -38,11 +39,11 @@ FlyteCTL was designed as a portable and lightweight command-line interface to wo ``` * Shell script ```bash - $ curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash + $ curl -sL https://ctl.flyte.org/install | bash ``` 2. (Optional) `flytectl upgrade` provides a general interface to upgrading FlyteCTL; run the command in the output -3. Start sandbox using FlyteCTL +3. Start sandbox using FlyteCTL ```bash $ flytectl sandbox start ``` @@ -59,7 +60,7 @@ FlyteCTL was designed as a portable and lightweight command-line interface to wo -You can find the detailed contribution guide [here](docs/source/contribute.rst). +You can find the detailed contribution guide [here](docs/source/contribute.rst).

@@ -67,4 +68,5 @@ You can find the detailed contribution guide [here](docs/source/contribute.rst).

-Refer to the [issues](https://docs.flyte.org/en/latest/community/contribute.html#issues) section in the contribution guide if you'd like to file an issue. +Refer to the [issues](https://docs.flyte.org/en/latest/community/contribute.html#issues) section in the contribution +guide if you'd like to file an issue. diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 40a953745c..4ea8589032 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -32,7 +32,7 @@ golang .. prompt:: bash $ - curl -s https://raw.githubusercontent.com/lyft/flytectl/master/install.sh | bash + curl -sL https://ctl.flyte.org/install | bash **Test** if Flytectl is installed correctly (your Flytectl version should be > 0.2.0) using the following command: From 31ad383f403e3e3e72aa4b52183b02b3e64b20c3 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Wed, 20 Oct 2021 11:15:51 +0530 Subject: [PATCH 160/645] Added minio port in sandbox (#203) * Added minio port in the sandbox Signed-off-by: Yuvraj --- flytectl/pkg/docker/docker_util.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 1d3baabed5..05c0d82474 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -78,10 +78,11 @@ func RemoveSandbox(ctx context.Context, cli Docker, reader io.Reader) error { // GetSandboxPorts will return sandbox ports func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, error) { return nat.ParsePortSpecs([]string{ - "0.0.0.0:30086:30086", - "0.0.0.0:30081:30081", - "0.0.0.0:30082:30082", - "0.0.0.0:30084:30084", + "0.0.0.0:30081:30081", // Flyteconsole Port + "0.0.0.0:30082:30082", // Flyteadmin Port + "0.0.0.0:30084:30084", // Minio API Port + "0.0.0.0:30086:30086", // K8s Dashboard Port + "0.0.0.0:30087:30087", // Minio Console Port }) } From 6453fab47956a9a2937ea2b2bd0c098690fbb888 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Fri, 22 Oct 2021 20:40:18 +0530 Subject: [PATCH 161/645] Added arm support (#206) Signed-off-by: Yuvraj --- flytectl/.goreleaser.yml | 4 +++- flytectl/go.mod | 2 +- flytectl/go.sum | 1 - 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/flytectl/.goreleaser.yml b/flytectl/.goreleaser.yml index 4f9557b3cd..6d326f33ce 100644 --- a/flytectl/.goreleaser.yml +++ b/flytectl/.goreleaser.yml @@ -23,6 +23,8 @@ archives: format_overrides: - goos: windows format: zip +universal_binaries: + - replace: false checksum: name_template: 'checksums.txt' snapshot: @@ -63,4 +65,4 @@ brews: skip_upload: auto dependencies: - - name: go \ No newline at end of file + - name: go diff --git a/flytectl/go.mod b/flytectl/go.mod index 79df64a12b..f403705864 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -1,6 +1,6 @@ module github.com/flyteorg/flytectl -go 1.13 +go 1.16 require ( github.com/Microsoft/go-winio v0.5.0 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index bee38b14ea..823dc8ecf0 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -281,7 +281,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= From 0a2ddb24431a5f7eb33886edab5ef02b094c4ba1 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 25 Oct 2021 09:32:28 +0530 Subject: [PATCH 162/645] Added support for arm64 in install.sh (#209) * Added install.sh script for arm Signed-off-by: Yuvraj --- flytectl/.github/workflows/build.yaml | 11 +++++------ flytectl/.github/workflows/release.yml | 3 +++ flytectl/.goreleaser.yml | 27 +++++++++++++++++++++++--- flytectl/install.sh | 6 +++--- 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml index 25759ecc17..03b19ecd88 100644 --- a/flytectl/.github/workflows/build.yaml +++ b/flytectl/.github/workflows/build.yaml @@ -20,18 +20,19 @@ jobs: ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} + - uses: actions/setup-go@v2 + with: + go-version: '1.16' - name: Run GoReleaser dry run uses: goreleaser/goreleaser-action@v2 with: version: latest args: --snapshot --skip-publish --rm-dist - name: Unit Tests - uses: cedrickring/golang-action@1.5.2 env: GO111MODULE: "on" CI_ENV: "true" - with: - args: make install && make test_unit_without_flag + run: make install && make test_unit_without_flag - name: Push CodeCov uses: codecov/codecov-action@v1.0.5 with: @@ -39,8 +40,6 @@ jobs: flags: unittests fail_ci_if_error: true - name: Lint - uses: cedrickring/golang-action@1.5.2 env: GO111MODULE: "on" - with: - args: make install && make lint + run: make install && make lint diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml index 1e4c78aa08..7137ab353c 100644 --- a/flytectl/.github/workflows/release.yml +++ b/flytectl/.github/workflows/release.yml @@ -14,6 +14,9 @@ jobs: uses: actions/checkout@v2 with: fetch-depth: "0" + - uses: actions/setup-go@v2 + with: + go-version: '1.16' - name: Run GoReleaser dry run uses: goreleaser/goreleaser-action@v2 with: diff --git a/flytectl/.goreleaser.yml b/flytectl/.goreleaser.yml index 6d326f33ce..17e2499506 100644 --- a/flytectl/.goreleaser.yml +++ b/flytectl/.goreleaser.yml @@ -6,10 +6,33 @@ builds: - CGO_ENABLED=0 main: ./main.go binary: flytectl + id: flytectl-darwin + goos: + - darwin + goarch: + - arm64 + - amd64 + ldflags: + - -s -w -X github.com/flyteorg/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flytestdlib/version.BuildTime={{.Date}} + - env: + - CGO_ENABLED=0 + main: ./main.go + binary: flytectl + id: flytectl-linux goos: - linux + goarch: + - arm64 + - amd64 + ldflags: + - -s -w -X github.com/flyteorg/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flytestdlib/version.BuildTime={{.Date}} + - env: + - CGO_ENABLED=0 + main: ./main.go + binary: flytectl + id: flytectl-windows + goos: - windows - - darwin ldflags: - -s -w -X github.com/flyteorg/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flytestdlib/version.BuildTime={{.Date}} archives: @@ -23,8 +46,6 @@ archives: format_overrides: - goos: windows format: zip -universal_binaries: - - replace: false checksum: name_template: 'checksums.txt' snapshot: diff --git a/flytectl/install.sh b/flytectl/install.sh index 150ae277af..57860ba297 100755 --- a/flytectl/install.sh +++ b/flytectl/install.sh @@ -1,6 +1,6 @@ #!/bin/sh set -e -# Code generated by godownloader on 2021-04-03T07:49:04Z. DO NOT EDIT. +# Code generated by godownloader on 2021-10-24T11:29:26Z. DO NOT EDIT. # usage() { @@ -62,10 +62,10 @@ execute() { } get_binaries() { case "$PLATFORM" in - darwin/386) BINARIES="flytectl" ;; darwin/amd64) BINARIES="flytectl" ;; - linux/386) BINARIES="flytectl" ;; + darwin/arm64) BINARIES="flytectl" ;; linux/amd64) BINARIES="flytectl" ;; + linux/arm64) BINARIES="flytectl" ;; windows/386) BINARIES="flytectl" ;; windows/amd64) BINARIES="flytectl" ;; *) From 89245631091ab8920841b74bd55b13a5d595c651 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Tue, 2 Nov 2021 20:21:04 +0530 Subject: [PATCH 163/645] Added check before creating empty k8s config (#211) * Added check before creating empty k8s config Signed-off-by: Yuvraj --- flytectl/pkg/util/util.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index 416ad58c7f..9dbc7e7c62 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -35,10 +35,16 @@ func SetupFlyteDir() error { if err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm); err != nil { return err } + // Created a empty file with right permission - if err := ioutil.WriteFile(docker.Kubeconfig, []byte(""), os.ModePerm); err != nil { - return err + if _, err := os.Stat(docker.Kubeconfig); err != nil { + if os.IsNotExist(err) { + if err := ioutil.WriteFile(docker.Kubeconfig, []byte(""), os.ModePerm); err != nil { + return err + } + } } + return nil } From 4752206a355aea83a35b0d2f941f9b89b1cde2d3 Mon Sep 17 00:00:00 2001 From: Abhijeet Chatterjee Date: Mon, 8 Nov 2021 19:02:51 +0530 Subject: [PATCH 164/645] [Docs] Flytectl docs cleanup (#210) * Docs Fix flytectl.rst Signed-off-by: abhijeet007rocks8 * Doc fix config.go Signed-off-by: abhijeet007rocks8 * Docs Update get/Execution.go Signed-off-by: abhijeet007rocks8 * Docs Update get/Execution.go Signed-off-by: Abhijeet Chatterjee Signed-off-by: abhijeet007rocks8 * docs update get/launch_plan.go Signed-off-by: Abhijeet Chatterjee Signed-off-by: abhijeet007rocks8 * Docs fix get/matchable_cluster_resource_attribute.go Signed-off-by: Abhijeet Chatterjee Signed-off-by: abhijeet007rocks8 * Docs Update matchable_execution_cluster_label.go Signed-off-by: Abhijeet Chatterjee Signed-off-by: abhijeet007rocks8 * Docs Update matchable_execution_queue_attribute.go Signed-off-by: Abhijeet Chatterjee Signed-off-by: abhijeet007rocks8 * Docs Update matchable_plugin_override.go Signed-off-by: Abhijeet Chatterjee Signed-off-by: abhijeet007rocks8 * Docs Fix matchable_task_resource_attribute.go Signed-off-by: Abhijeet Chatterjee Signed-off-by: abhijeet007rocks8 * Applied Suggestion Signed-off-by: abhijeet007rocks8 * Apply suggestions from code review Co-authored-by: Samhita Alla Signed-off-by: abhijeet007rocks8 * Apply suggestions from code review Co-authored-by: Samhita Alla Signed-off-by: abhijeet007rocks8 * Applied Suggestion Signed-off-by: abhijeet007rocks8 * Applied Suggestion Signed-off-by: abhijeet007rocks8 * Applied Suggestion Signed-off-by: abhijeet007rocks8 Co-authored-by: Samhita Alla --- flytectl/cmd/config/config.go | 4 +- flytectl/cmd/get/execution.go | 20 ++++----- flytectl/cmd/get/launch_plan.go | 16 +++---- .../matchable_cluster_resource_attribute.go | 16 ++++--- .../get/matchable_execution_cluster_label.go | 16 +++---- .../matchable_execution_queue_attribute.go | 20 ++++----- flytectl/cmd/get/matchable_plugin_override.go | 16 ++++--- .../get/matchable_task_resource_attribute.go | 18 ++++---- flytectl/docs/source/gen/flytectl.rst | 42 +++++++++---------- 9 files changed, 80 insertions(+), 88 deletions(-) diff --git a/flytectl/cmd/config/config.go b/flytectl/cmd/config/config.go index c20f2bc2ef..0283313f24 100644 --- a/flytectl/cmd/config/config.go +++ b/flytectl/cmd/config/config.go @@ -20,8 +20,8 @@ var ( // Config hold configration for flytectl flag type Config struct { Project string `json:"project" pflag:",Specifies the project to work on."` - Domain string `json:"domain" pflag:",Specified the domain to work on."` - Output string `json:"output" pflag:",Specified the output type."` + Domain string `json:"domain" pflag:",Specifies the domain to work on."` + Output string `json:"output" pflag:",Specifies the output type."` } // OutputFormat will return output formate diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 45ce3d9b69..3cda9d4925 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -17,12 +17,12 @@ import ( const ( executionShort = "Gets execution resources" executionLong = ` -Retrieves all the executions within project and domain.(execution,executions can be used interchangeably in these commands) +Retrieve all executions within the project and domain (execution, executions can be used interchangeably). :: bin/flytectl get execution -p flytesnacks -d development -Retrieves execution by name within project and domain. +Retrieves executions by name within the project and domain. :: @@ -34,44 +34,44 @@ Retrieves all the executions with filters. bin/flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" -Retrieves all the execution with limit and sorting. +Retrieve executions as per the specified limit and sorting parameters. :: bin/flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the execution within project and domain in yaml format +Retrieve executions within the project and domain in YAML format. :: bin/flytectl get execution -p flytesnacks -d development -o yaml -Retrieves all the execution within project and domain in json format. +Retrieve executions within the project and domain in JSON format. :: bin/flytectl get execution -p flytesnacks -d development -o json -Get more details for the execution using --details flag which shows node executions along with task executions on them. Default view is tree view and TABLE format is not supported on this view +Get more details of the execution using the --details flag, which shows node and task executions. The default view is a tree view, and the TABLE view format is not supported on this view. :: bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -Using yaml view for the details. In this view only node details are available. For task details pass --nodeID flag +Fetch execution details in YAML format. In this view, only node details are available. For task, send the --nodeID flag. :: bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml -Using --nodeID flag to get task executions on a specific node. Use the nodeID attribute from node details view +Fetch task executions on a specific node using the --nodeID flag. Use the nodeID attribute given by the node details view. :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodeID n0 -Task execution view is also available in yaml/json format. Below example shows yaml. This also contains inputs/outputs data for each node +Task execution view is also available in YAML/JSON format. The following example showcases YAML, where the output also contains input and output data of each node. :: diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 6ef85d6cb3..79aa4822b3 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -16,25 +16,25 @@ import ( const ( launchPlanShort = "Gets launch plan resources" launchPlanLong = ` -Retrieves all the launch plans within project and domain.(launchplan,launchplans can be used interchangeably in these commands) +Retrieve all launch plans within the project and domain (launchplan, launchplans can be used interchangeably). :: flytectl get launchplan -p flytesnacks -d development -Retrieves launch plan by name within project and domain. + Retrieve a launch plan by name within the project and domain. :: flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet -Retrieves latest version of task by name within project and domain. +Retrieve the latest version of the task by name within the project and domain. :: flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --latest -Retrieves particular version of launchplan by name within project and domain. +Retrieves a particular version of the launch plan by name within the project and domain. :: @@ -57,25 +57,25 @@ Retrieves all the launch plans with limit and sorting. bin/flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the launchplan within project and domain in yaml format. +Retrieves all launch plans within the project and domain in YAML format. :: flytectl get launchplan -p flytesnacks -d development -o yaml -Retrieves all the launchplan within project and domain in json format +Retrieves all launch plans the within the project and domain in JSON format. :: flytectl get launchplan -p flytesnacks -d development -o json -Retrieves a launch plans within project and domain for a version and generate the execution spec file for it to be used for launching the execution using create execution. +Retrieve a launch plan within the project and domain as per a version and generate the execution spec file; the file can be used to launch the execution using the 'create execution' command. :: flytectl get launchplan -d development -p flytectldemo core.advanced.run_merge_sort.merge_sort --execFile execution_spec.yaml -The generated file would look similar to this +The generated file would look similar to this: .. code-block:: yaml diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute.go b/flytectl/cmd/get/matchable_cluster_resource_attribute.go index e29f61d5a1..7750a30ee2 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute.go @@ -11,12 +11,10 @@ import ( ) const ( - clusterResourceAttributesShort = "Gets matchable resources of cluster resource attributes" + clusterResourceAttributesShort = "Gets matchable resources of cluster resource attributes." clusterResourceAttributesLong = ` -Retrieves cluster resource attributes for given project and domain combination or additionally with workflow name. - -Retrieves cluster resource attribute for project and domain -Here the command get cluster resource attributes for project flytectldemo and development domain. +Retrieve cluster resource attributes for the given project and domain. +Here, the command gets cluster resource attributes for the project flytectldemo and development domain. :: flytectl get cluster-resource-attribute -p flytectldemo -d development @@ -27,8 +25,8 @@ eg : output from the command {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} -Retrieves cluster resource attribute for project and domain and workflow -Here the command get cluster resource attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieve cluster resource attributes for the given project, domain, and workflow. +Here, the command gets cluster resource attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. :: flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort @@ -39,8 +37,8 @@ eg : output from the command {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} -Writing the cluster resource attribute to a file. If there are no cluster resource attributes , command would return an error. -Here the command gets task resource attributes and writes the config file to cra.yaml +Writes the cluster resource attributes to a file. If there are no cluster resource attributes,the command throws an error. +Here, the command gets the task resource attributes and writes the config file to cra.yaml file. eg: content of cra.yaml :: diff --git a/flytectl/cmd/get/matchable_execution_cluster_label.go b/flytectl/cmd/get/matchable_execution_cluster_label.go index 56e9e7b94c..8a5227d736 100644 --- a/flytectl/cmd/get/matchable_execution_cluster_label.go +++ b/flytectl/cmd/get/matchable_execution_cluster_label.go @@ -11,24 +11,24 @@ import ( ) const ( - executionClusterLabelShort = "Gets matchable resources of execution cluster label" + executionClusterLabelShort = "Gets matchable resources of execution cluster label." executionClusterLabelLong = ` -Retrieves execution cluster label for given project and domain combination or additionally with workflow name. +// Retrieves the execution cluster label for a given project and domain, combination or additionally with workflow name. -Retrieves execution cluster label for project and domain +Retrieve the execution cluster label for the given project and domain. Here the command get execution cluster label for project flytectldemo and development domain. :: flytectl get execution-cluster-label -p flytectldemo -d development -eg : output from the command +e.g. : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","value":"foo"} -Retrieves execution cluster label for project and domain and workflow -Here the command get execution cluster label for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieve the execution cluster label for the given project, domain and workflow. +Here, the command gets the execution cluster label for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. :: flytectl get execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort @@ -39,8 +39,8 @@ eg : output from the command {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","value":"foo"} -Writing the execution cluster label to a file. If there are no execution cluster label, command would return an error. -Here the command gets execution cluster label and writes the config file to ecl.yaml +Writes the execution cluster label to a file. If there is no execution cluster label, command throws an error. +Here, the command gets the execution cluster label and writes the config file to ecl.yaml file. eg: content of ecl.yaml :: diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute.go b/flytectl/cmd/get/matchable_execution_queue_attribute.go index b51517e595..0fea10ee56 100644 --- a/flytectl/cmd/get/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/get/matchable_execution_queue_attribute.go @@ -13,35 +13,33 @@ import ( const ( executionQueueAttributesShort = "Gets matchable resources of execution queue attributes" executionQueueAttributesLong = ` -Retrieves execution queue attributes for given project and domain combination or additionally with workflow name. - -Retrieves execution queue attribute for project and domain -Here the command get execution queue attributes for project flytectldemo and development domain. +Retrieve the execution queue attribute for the given project and domain. +Here, the command gets execution queue attributes for the project flytectldemo and development domain. :: flytectl get execution-queue-attribute -p flytectldemo -d development -eg : output from the command +e.g. : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} -Retrieves execution queue attribute for project and domain and workflow -Here the command get execution queue attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieve the execution queue attribute for the given project, domain, and workflow. +Here, the command gets execution queue attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. :: flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g. : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","tags":["foo", "bar"]} -Writing the execution queue attribute to a file. If there are no execution queue attributes, command would return an error. -Here the command gets execution queue attributes and writes the config file to era.yaml -eg: content of era.yaml +Write the execution queue attribute to a file. If there are no execution queue attributes, the command throws an error. +Here, the command gets the execution queue attributes and writes the config to era.yaml file. +e.g. : content of era.yaml :: diff --git a/flytectl/cmd/get/matchable_plugin_override.go b/flytectl/cmd/get/matchable_plugin_override.go index 7c42a35219..8c8f5986dc 100644 --- a/flytectl/cmd/get/matchable_plugin_override.go +++ b/flytectl/cmd/get/matchable_plugin_override.go @@ -13,16 +13,14 @@ import ( const ( pluginOverrideShort = "Gets matchable resources of plugin override" pluginOverrideLong = ` -Retrieves plugin overrides for given project and domain combination or additionally with workflow name. - -Retrieves plugin overrides for project and domain -Here the command get plugin override for project flytectldemo and development domain. +Retrieve the plugin overrides for the given project and domain. +Here, the command gets the plugin overrides for the project flytectldemo and development domain. :: flytectl get plugin-override -p flytectldemo -d development -eg : output from the command +e.g. : output from the command .. code-block:: json @@ -36,14 +34,14 @@ eg : output from the command }] } -Retrieves plugin override for project and domain and workflow -Here the command get plugin override for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieves the plugin overrides for project, domain and workflow +Here the command gets the plugin overrides for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort :: flytectl get plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g. : output from the command .. code-block:: json @@ -58,7 +56,7 @@ eg : output from the command }] } -Writing the plugin override to a file. If there are no plugin overrides, command would return an error. +Writing the plugin overrides to a file. If there are no plugin overrides, command would return an error. Here the command gets plugin overrides and writes the config file to po.yaml eg: content of po.yaml diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go index 74c8a9a99d..2c27bb6f46 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -13,36 +13,34 @@ import ( const ( taskResourceAttributesShort = "Gets matchable resources of task attributes" taskResourceAttributesLong = ` -Retrieves task resource attributes for given project,domain combination or additionally with workflow name. - -Retrieves task resource attribute for project and domain -Here the command get task resource attributes for project flytectldemo and development domain. +Retrieve task resource attributes for the given project and domain. +Here, the command gets the task resource attributes for the project flytectldemo and development domain. :: flytectl get task-resource-attribute -p flytectldemo -d development -eg : output from the command +e.g. : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} -Retrieves task resource attribute for project and domain and workflow -Here the command get task resource attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieve task resource attributes for the given project, domain, and workflow. +Here, the command gets task resource attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. :: flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g. : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} -Writing the task resource attribute to a file. If there are no task resource attributes a file would be written with basic data populated. +Write the task resource attributes to a file. If there are no task resource attributes, a file would be populated with the basic data. Here the command gets task resource attributes and writes the config file to tra.yaml -eg: content of tra.yaml +e.g. : content of tra.yaml :: diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index d56aa0fca5..73fc3d1770 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -3,44 +3,44 @@ flytectl -------- -flyetcl CLI tool +**flyetcl** CLI tool Synopsis ~~~~~~~~ -flytectl is CLI tool written in go to interact with flyteadmin service +**flytectl** is CLI tool written in go to interact with flyteadmin service. Options ~~~~~~~ :: - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.authorizationHeader string Custom metadata header to pass JWT. + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint. + --admin.clientId string Client ID. (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret. (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the URI of the service is located. --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution :shouldn't be use for production usecases'. + --admin.maxBackoffDelay string Max delay for gRPC backoff. (default "8s") + --admin.maxRetries int Max number of gRPC retries. (default 4) + --admin.perRetryTimeout string gRPC per retry timeout. (default "15s") --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request + --admin.scopes strings List of scopes to request. --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) + -c, --config string config file. (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. - -h, --help help for flytectl + -h, --help Help for flytectl. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used. --storage.cache.target_gc_percent int Sets the garbage collection target percentage. --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") @@ -48,9 +48,9 @@ Options --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist. --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered. --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow @@ -59,12 +59,12 @@ Options SEE ALSO ~~~~~~~~ -* :doc:`flytectl_completion` - Generate completion script -* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`flytectl_completion` - Generates completion script. +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands. * :doc:`flytectl_create` - Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_register` - Registers the tasks/workflows/launchplans from list of generated serialized files. * :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. * :doc:`flytectl_update` - Used for updating flyte resources eg: project. * :doc:`flytectl_upgrade` - Used for upgrade/rollback flyte version From 3c0eaa21996763811613725421db09b395942cdd Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Mon, 8 Nov 2021 18:17:06 -0800 Subject: [PATCH 165/645] Update documentation (#213) Signed-off-by: Flyte-Bot Co-authored-by: samhita-alla --- flytectl/docs/source/gen/flytectl.rst | 42 +++++++++---------- flytectl/docs/source/gen/flytectl_get.rst | 4 +- ...lytectl_get_cluster-resource-attribute.rst | 16 ++++--- .../flytectl_get_execution-cluster-label.rst | 16 +++---- ...flytectl_get_execution-queue-attribute.rst | 20 ++++----- .../source/gen/flytectl_get_execution.rst | 20 ++++----- .../source/gen/flytectl_get_launchplan.rst | 16 +++---- .../gen/flytectl_get_plugin-override.rst | 16 ++++--- .../flytectl_get_task-resource-attribute.rst | 18 ++++---- 9 files changed, 80 insertions(+), 88 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 73fc3d1770..d56aa0fca5 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -3,44 +3,44 @@ flytectl -------- -**flyetcl** CLI tool +flyetcl CLI tool Synopsis ~~~~~~~~ -**flytectl** is CLI tool written in go to interact with flyteadmin service. +flytectl is CLI tool written in go to interact with flyteadmin service Options ~~~~~~~ :: - --admin.authorizationHeader string Custom metadata header to pass JWT. - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint. - --admin.clientId string Client ID. (default "flytepropeller") - --admin.clientSecretLocation string File containing the client secret. (default "/etc/secrets/client_secret") - --admin.endpoint string For admin types, specify where the URI of the service is located. + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution :shouldn't be use for production usecases'. - --admin.maxBackoffDelay string Max delay for gRPC backoff. (default "8s") - --admin.maxRetries int Max number of gRPC retries. (default 4) - --admin.perRetryTimeout string gRPC per retry timeout. (default "15s") + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request. + --admin.scopes strings List of scopes to request --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file. (default is $HOME/.flyte/config.yaml) + -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. - -h, --help Help for flytectl. + -h, --help help for flytectl --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used --storage.cache.target_gc_percent int Sets the garbage collection target percentage. --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") @@ -48,9 +48,9 @@ Options --storage.connection.endpoint string URL for storage client to connect to. --storage.connection.region string Region to connect to. (default "us-east-1") --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered. + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow @@ -59,12 +59,12 @@ Options SEE ALSO ~~~~~~~~ -* :doc:`flytectl_completion` - Generates completion script. -* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands. +* :doc:`flytectl_completion` - Generate completion script +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. * :doc:`flytectl_create` - Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. * :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`flytectl_register` - Registers the tasks/workflows/launchplans from list of generated serialized files. +* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. * :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. * :doc:`flytectl_update` - Used for updating flyte resources eg: project. * :doc:`flytectl_upgrade` - Used for upgrade/rollback flyte version diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 6ccba90bd7..386cee0808 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -71,9 +71,9 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl` - flyetcl CLI tool -* :doc:`flytectl_get_cluster-resource-attribute` - Gets matchable resources of cluster resource attributes +* :doc:`flytectl_get_cluster-resource-attribute` - Gets matchable resources of cluster resource attributes. * :doc:`flytectl_get_execution` - Gets execution resources -* :doc:`flytectl_get_execution-cluster-label` - Gets matchable resources of execution cluster label +* :doc:`flytectl_get_execution-cluster-label` - Gets matchable resources of execution cluster label. * :doc:`flytectl_get_execution-queue-attribute` - Gets matchable resources of execution queue attributes * :doc:`flytectl_get_launchplan` - Gets launch plan resources * :doc:`flytectl_get_plugin-override` - Gets matchable resources of plugin override diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index 2be6c9c3a9..ea44a874bd 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -3,17 +3,15 @@ flytectl get cluster-resource-attribute --------------------------------------- -Gets matchable resources of cluster resource attributes +Gets matchable resources of cluster resource attributes. Synopsis ~~~~~~~~ -Retrieves cluster resource attributes for given project and domain combination or additionally with workflow name. - -Retrieves cluster resource attribute for project and domain -Here the command get cluster resource attributes for project flytectldemo and development domain. +Retrieve cluster resource attributes for the given project and domain. +Here, the command gets cluster resource attributes for the project flytectldemo and development domain. :: flytectl get cluster-resource-attribute -p flytectldemo -d development @@ -24,8 +22,8 @@ eg : output from the command {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} -Retrieves cluster resource attribute for project and domain and workflow -Here the command get cluster resource attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieve cluster resource attributes for the given project, domain, and workflow. +Here, the command gets cluster resource attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. :: flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort @@ -36,8 +34,8 @@ eg : output from the command {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} -Writing the cluster resource attribute to a file. If there are no cluster resource attributes , command would return an error. -Here the command gets task resource attributes and writes the config file to cra.yaml +Writes the cluster resource attributes to a file. If there are no cluster resource attributes,the command throws an error. +Here, the command gets the task resource attributes and writes the config file to cra.yaml file. eg: content of cra.yaml :: diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index 513359e3ce..e25ecb4e84 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -3,29 +3,29 @@ flytectl get execution-cluster-label ------------------------------------ -Gets matchable resources of execution cluster label +Gets matchable resources of execution cluster label. Synopsis ~~~~~~~~ -Retrieves execution cluster label for given project and domain combination or additionally with workflow name. +// Retrieves the execution cluster label for a given project and domain, combination or additionally with workflow name. -Retrieves execution cluster label for project and domain +Retrieve the execution cluster label for the given project and domain. Here the command get execution cluster label for project flytectldemo and development domain. :: flytectl get execution-cluster-label -p flytectldemo -d development -eg : output from the command +e.g. : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","value":"foo"} -Retrieves execution cluster label for project and domain and workflow -Here the command get execution cluster label for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieve the execution cluster label for the given project, domain and workflow. +Here, the command gets the execution cluster label for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. :: flytectl get execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort @@ -36,8 +36,8 @@ eg : output from the command {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","value":"foo"} -Writing the execution cluster label to a file. If there are no execution cluster label, command would return an error. -Here the command gets execution cluster label and writes the config file to ecl.yaml +Writes the execution cluster label to a file. If there is no execution cluster label, command throws an error. +Here, the command gets the execution cluster label and writes the config file to ecl.yaml file. eg: content of ecl.yaml :: diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index 28c96777db..04f8d0b24b 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -10,35 +10,33 @@ Synopsis -Retrieves execution queue attributes for given project and domain combination or additionally with workflow name. - -Retrieves execution queue attribute for project and domain -Here the command get execution queue attributes for project flytectldemo and development domain. +Retrieve the execution queue attribute for the given project and domain. +Here, the command gets execution queue attributes for the project flytectldemo and development domain. :: flytectl get execution-queue-attribute -p flytectldemo -d development -eg : output from the command +e.g. : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} -Retrieves execution queue attribute for project and domain and workflow -Here the command get execution queue attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieve the execution queue attribute for the given project, domain, and workflow. +Here, the command gets execution queue attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. :: flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g. : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","tags":["foo", "bar"]} -Writing the execution queue attribute to a file. If there are no execution queue attributes, command would return an error. -Here the command gets execution queue attributes and writes the config file to era.yaml -eg: content of era.yaml +Write the execution queue attribute to a file. If there are no execution queue attributes, the command throws an error. +Here, the command gets the execution queue attributes and writes the config to era.yaml file. +e.g. : content of era.yaml :: diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 555febfb23..29e0e06706 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -10,12 +10,12 @@ Synopsis -Retrieves all the executions within project and domain.(execution,executions can be used interchangeably in these commands) +Retrieve all executions within the project and domain (execution, executions can be used interchangeably). :: bin/flytectl get execution -p flytesnacks -d development -Retrieves execution by name within project and domain. +Retrieves executions by name within the project and domain. :: @@ -27,44 +27,44 @@ Retrieves all the executions with filters. bin/flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" -Retrieves all the execution with limit and sorting. +Retrieve executions as per the specified limit and sorting parameters. :: bin/flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the execution within project and domain in yaml format +Retrieve executions within the project and domain in YAML format. :: bin/flytectl get execution -p flytesnacks -d development -o yaml -Retrieves all the execution within project and domain in json format. +Retrieve executions within the project and domain in JSON format. :: bin/flytectl get execution -p flytesnacks -d development -o json -Get more details for the execution using --details flag which shows node executions along with task executions on them. Default view is tree view and TABLE format is not supported on this view +Get more details of the execution using the --details flag, which shows node and task executions. The default view is a tree view, and the TABLE view format is not supported on this view. :: bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -Using yaml view for the details. In this view only node details are available. For task details pass --nodeID flag +Fetch execution details in YAML format. In this view, only node details are available. For task, send the --nodeID flag. :: bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml -Using --nodeID flag to get task executions on a specific node. Use the nodeID attribute from node details view +Fetch task executions on a specific node using the --nodeID flag. Use the nodeID attribute given by the node details view. :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 + bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodeID n0 -Task execution view is also available in yaml/json format. Below example shows yaml. This also contains inputs/outputs data for each node +Task execution view is also available in YAML/JSON format. The following example showcases YAML, where the output also contains input and output data of each node. :: diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 4c73065fe5..2a3c0c1dc3 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -10,25 +10,25 @@ Synopsis -Retrieves all the launch plans within project and domain.(launchplan,launchplans can be used interchangeably in these commands) +Retrieve all launch plans within the project and domain (launchplan, launchplans can be used interchangeably). :: flytectl get launchplan -p flytesnacks -d development -Retrieves launch plan by name within project and domain. + Retrieve a launch plan by name within the project and domain. :: flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet -Retrieves latest version of task by name within project and domain. +Retrieve the latest version of the task by name within the project and domain. :: flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --latest -Retrieves particular version of launchplan by name within project and domain. +Retrieves a particular version of the launch plan by name within the project and domain. :: @@ -51,25 +51,25 @@ Retrieves all the launch plans with limit and sorting. bin/flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the launchplan within project and domain in yaml format. +Retrieves all launch plans within the project and domain in YAML format. :: flytectl get launchplan -p flytesnacks -d development -o yaml -Retrieves all the launchplan within project and domain in json format +Retrieves all launch plans the within the project and domain in JSON format. :: flytectl get launchplan -p flytesnacks -d development -o json -Retrieves a launch plans within project and domain for a version and generate the execution spec file for it to be used for launching the execution using create execution. +Retrieve a launch plan within the project and domain as per a version and generate the execution spec file; the file can be used to launch the execution using the 'create execution' command. :: flytectl get launchplan -d development -p flytectldemo core.advanced.run_merge_sort.merge_sort --execFile execution_spec.yaml -The generated file would look similar to this +The generated file would look similar to this: .. code-block:: yaml diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index c30c99e2db..0c7668510e 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -10,16 +10,14 @@ Synopsis -Retrieves plugin overrides for given project and domain combination or additionally with workflow name. - -Retrieves plugin overrides for project and domain -Here the command get plugin override for project flytectldemo and development domain. +Retrieve the plugin overrides for the given project and domain. +Here, the command gets the plugin overrides for the project flytectldemo and development domain. :: flytectl get plugin-override -p flytectldemo -d development -eg : output from the command +e.g. : output from the command .. code-block:: json @@ -33,14 +31,14 @@ eg : output from the command }] } -Retrieves plugin override for project and domain and workflow -Here the command get plugin override for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieves the plugin overrides for project, domain and workflow +Here the command gets the plugin overrides for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort :: flytectl get plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g. : output from the command .. code-block:: json @@ -55,7 +53,7 @@ eg : output from the command }] } -Writing the plugin override to a file. If there are no plugin overrides, command would return an error. +Writing the plugin overrides to a file. If there are no plugin overrides, command would return an error. Here the command gets plugin overrides and writes the config file to po.yaml eg: content of po.yaml diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 2385235773..1122ce6411 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -10,36 +10,34 @@ Synopsis -Retrieves task resource attributes for given project,domain combination or additionally with workflow name. - -Retrieves task resource attribute for project and domain -Here the command get task resource attributes for project flytectldemo and development domain. +Retrieve task resource attributes for the given project and domain. +Here, the command gets the task resource attributes for the project flytectldemo and development domain. :: flytectl get task-resource-attribute -p flytectldemo -d development -eg : output from the command +e.g. : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} -Retrieves task resource attribute for project and domain and workflow -Here the command get task resource attributes for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieve task resource attributes for the given project, domain, and workflow. +Here, the command gets task resource attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. :: flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g. : output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} -Writing the task resource attribute to a file. If there are no task resource attributes a file would be written with basic data populated. +Write the task resource attributes to a file. If there are no task resource attributes, a file would be populated with the basic data. Here the command gets task resource attributes and writes the config file to tra.yaml -eg: content of tra.yaml +e.g. : content of tra.yaml :: From 0c16202671d449fd5920794d3af2c1020a629d57 Mon Sep 17 00:00:00 2001 From: Adrian Rumpold Date: Wed, 10 Nov 2021 16:28:02 +0100 Subject: [PATCH 166/645] fix: Correctly demultiplex sandbox Docker exec output (#214) --- flytectl/pkg/docker/docker_util.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 05c0d82474..a6afbec299 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -15,6 +15,7 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" "github.com/docker/docker/client" + "github.com/docker/docker/pkg/stdcopy" "github.com/docker/go-connections/nat" "github.com/enescakir/emoji" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" @@ -174,9 +175,9 @@ func InspectExecResp(ctx context.Context, cli Docker, containerID string) error if err != nil { return err } - s := bufio.NewScanner(resp.Reader) - for s.Scan() { - fmt.Println(s.Text()) + _, err = stdcopy.StdCopy(os.Stdout, os.Stderr, resp.Reader) + if err != nil { + return err } return nil } From fd190c5924bd591fd8edf134a849d2ba2fe2f878 Mon Sep 17 00:00:00 2001 From: Lisa <30621230+aeioulisa@users.noreply.github.com> Date: Tue, 16 Nov 2021 11:58:31 +0800 Subject: [PATCH 167/645] [Housekeeping] Refactor flytectl flags (#212) * use defaultFileConfig as param Signed-off-by: aeioulisa --- flytectl/cmd/register/examples.go | 2 +- flytectl/cmd/register/files.go | 8 +- flytectl/cmd/register/files_test.go | 1 - flytectl/cmd/register/register_util.go | 96 ++++++++++----------- flytectl/cmd/register/register_util_test.go | 52 +++++------ 5 files changed, 79 insertions(+), 80 deletions(-) diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index 264324876d..c290b52ae2 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -40,7 +40,7 @@ func registerExamplesFunc(ctx context.Context, args []string, cmdCtx cmdCore.Com var release string // Deprecated checks for --k8Service - deprecatedCheck(ctx) + deprecatedCheck(ctx, &rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.K8ServiceAccount) if len(args) == 1 { release = args[0] diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index a3575662fd..d1b16a18b3 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -100,10 +100,10 @@ func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) var dataRefs []string // Deprecated checks for --k8Service - deprecatedCheck(ctx) + deprecatedCheck(ctx, &rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.K8ServiceAccount) // getSerializeOutputFiles will return you all proto and source code compress file in sorted order - dataRefs, tmpDir, err := getSerializeOutputFiles(ctx, args) + dataRefs, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) if err != nil { logger.Errorf(ctx, "error while un-archiving files in tmp dir due to %v", err) return err @@ -123,7 +123,7 @@ func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) if len(sourceCode) > 0 { logger.Infof(ctx, "Fast Registration detected") _, sourceCodeName = filepath.Split(sourceCode) - if err = uploadFastRegisterArtifact(ctx, sourceCode, sourceCodeName, rconfig.DefaultFilesConfig.Version); err != nil { + if err = uploadFastRegisterArtifact(ctx, sourceCode, sourceCodeName, rconfig.DefaultFilesConfig.Version, &rconfig.DefaultFilesConfig.SourceUploadPath); err != nil { return fmt.Errorf("please check your Storage Config. It failed while uploading the source code. %v", err) } logger.Infof(ctx, "Source code successfully uploaded %v/%v ", rconfig.DefaultFilesConfig.SourceUploadPath, sourceCodeName) @@ -132,7 +132,7 @@ func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) var registerResults []Result fastFail := rconfig.DefaultFilesConfig.ContinueOnError for i := 0; i < len(validProto) && !(fastFail && regErr != nil); i++ { - registerResults, regErr = registerFile(ctx, validProto[i], sourceCodeName, registerResults, cmdCtx) + registerResults, regErr = registerFile(ctx, validProto[i], sourceCodeName, registerResults, cmdCtx, *rconfig.DefaultFilesConfig) } payload, _ := json.Marshal(registerResults) diff --git a/flytectl/cmd/register/files_test.go b/flytectl/cmd/register/files_test.go index 34da278850..e583e18400 100644 --- a/flytectl/cmd/register/files_test.go +++ b/flytectl/cmd/register/files_test.go @@ -9,7 +9,6 @@ import ( "github.com/flyteorg/flytestdlib/storage" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" - "github.com/flyteorg/flytestdlib/promutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index cc0130d7dd..85b55e81b4 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -97,11 +97,11 @@ func unMarshalContents(ctx context.Context, fileContents []byte, fname string) ( } -func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.CommandContext) error { +func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.CommandContext, dryRun bool, version string) error { switch v := message.(type) { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) - if rconfig.DefaultFilesConfig.DryRun { + if dryRun { logger.Debugf(ctx, "skipping CreateLaunchPlan request (DryRun)") return nil } @@ -112,14 +112,14 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: launchPlan.Id.Name, - Version: rconfig.DefaultFilesConfig.Version, + Version: version, }, Spec: launchPlan.Spec, }) return err case *admin.WorkflowSpec: workflowSpec := message.(*admin.WorkflowSpec) - if rconfig.DefaultFilesConfig.DryRun { + if dryRun { logger.Debugf(ctx, "skipping CreateWorkflow request (DryRun)") return nil } @@ -130,14 +130,14 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: workflowSpec.Template.Id.Name, - Version: rconfig.DefaultFilesConfig.Version, + Version: version, }, Spec: workflowSpec, }) return err case *admin.TaskSpec: taskSpec := message.(*admin.TaskSpec) - if rconfig.DefaultFilesConfig.DryRun { + if dryRun { logger.Debugf(ctx, "skipping CreateTask request (DryRun)") return nil } @@ -148,7 +148,7 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: taskSpec.Template.Id.Name, - Version: rconfig.DefaultFilesConfig.Version, + Version: version, }, Spec: taskSpec, }) @@ -158,33 +158,33 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command } } -func hydrateNode(node *core.Node) error { +func hydrateNode(node *core.Node, version string) error { targetNode := node.Target switch v := targetNode.(type) { case *core.Node_TaskNode: taskNodeWrapper := targetNode.(*core.Node_TaskNode) taskNodeReference := taskNodeWrapper.TaskNode.Reference.(*core.TaskNode_ReferenceId) - hydrateIdentifier(taskNodeReference.ReferenceId) + hydrateIdentifier(taskNodeReference.ReferenceId, version) case *core.Node_WorkflowNode: workflowNodeWrapper := targetNode.(*core.Node_WorkflowNode) switch workflowNodeWrapper.WorkflowNode.Reference.(type) { case *core.WorkflowNode_SubWorkflowRef: subWorkflowNodeReference := workflowNodeWrapper.WorkflowNode.Reference.(*core.WorkflowNode_SubWorkflowRef) - hydrateIdentifier(subWorkflowNodeReference.SubWorkflowRef) + hydrateIdentifier(subWorkflowNodeReference.SubWorkflowRef, version) case *core.WorkflowNode_LaunchplanRef: launchPlanNodeReference := workflowNodeWrapper.WorkflowNode.Reference.(*core.WorkflowNode_LaunchplanRef) - hydrateIdentifier(launchPlanNodeReference.LaunchplanRef) + hydrateIdentifier(launchPlanNodeReference.LaunchplanRef, version) default: return fmt.Errorf("unknown type %T", workflowNodeWrapper.WorkflowNode.Reference) } case *core.Node_BranchNode: branchNodeWrapper := targetNode.(*core.Node_BranchNode) - if err := hydrateNode(branchNodeWrapper.BranchNode.IfElse.Case.ThenNode); err != nil { + if err := hydrateNode(branchNodeWrapper.BranchNode.IfElse.Case.ThenNode, version); err != nil { return fmt.Errorf("failed to hydrateNode") } if len(branchNodeWrapper.BranchNode.IfElse.Other) > 0 { for _, ifBlock := range branchNodeWrapper.BranchNode.IfElse.Other { - if err := hydrateNode(ifBlock.ThenNode); err != nil { + if err := hydrateNode(ifBlock.ThenNode, version); err != nil { return fmt.Errorf("failed to hydrateNode") } } @@ -192,7 +192,7 @@ func hydrateNode(node *core.Node) error { switch branchNodeWrapper.BranchNode.IfElse.Default.(type) { case *core.IfElseBlock_ElseNode: elseNodeReference := branchNodeWrapper.BranchNode.IfElse.Default.(*core.IfElseBlock_ElseNode) - if err := hydrateNode(elseNodeReference.ElseNode); err != nil { + if err := hydrateNode(elseNodeReference.ElseNode, version); err != nil { return fmt.Errorf("failed to hydrateNode") } @@ -207,7 +207,7 @@ func hydrateNode(node *core.Node) error { return nil } -func hydrateIdentifier(identifier *core.Identifier) { +func hydrateIdentifier(identifier *core.Identifier, version string) { if identifier.Project == "" || identifier.Project == registrationProjectPattern { identifier.Project = config.GetConfig().Project } @@ -215,15 +215,15 @@ func hydrateIdentifier(identifier *core.Identifier) { identifier.Domain = config.GetConfig().Domain } if identifier.Version == "" || identifier.Version == registrationVersionPattern { - identifier.Version = rconfig.DefaultFilesConfig.Version + identifier.Version = version } } -func hydrateTaskSpec(task *admin.TaskSpec, sourceCode string) error { +func hydrateTaskSpec(task *admin.TaskSpec, sourceCode string, sourceUploadPath string, version string) error { if task.Template.GetContainer() != nil { for k := range task.Template.GetContainer().Args { if task.Template.GetContainer().Args[k] == "" || task.Template.GetContainer().Args[k] == registrationRemotePackagePattern { - remotePath, err := getRemoteStoragePath(context.Background(), Client, rconfig.DefaultFilesConfig.SourceUploadPath, sourceCode, rconfig.DefaultFilesConfig.Version) + remotePath, err := getRemoteStoragePath(context.Background(), Client, sourceUploadPath, sourceCode, version) if err != nil { return err } @@ -239,7 +239,7 @@ func hydrateTaskSpec(task *admin.TaskSpec, sourceCode string) error { for containerIdx, container := range podSpec.Containers { for argIdx, arg := range container.Args { if arg == registrationRemotePackagePattern { - remotePath, err := getRemoteStoragePath(context.Background(), Client, rconfig.DefaultFilesConfig.SourceUploadPath, sourceCode, rconfig.DefaultFilesConfig.Version) + remotePath, err := getRemoteStoragePath(context.Background(), Client, sourceUploadPath, sourceCode, version) if err != nil { return err } @@ -261,50 +261,50 @@ func hydrateTaskSpec(task *admin.TaskSpec, sourceCode string) error { return nil } -func hydrateLaunchPlanSpec(lpSpec *admin.LaunchPlanSpec) { - assumableIamRole := len(rconfig.DefaultFilesConfig.AssumableIamRole) > 0 - k8sServiceAcct := len(rconfig.DefaultFilesConfig.K8sServiceAccount) > 0 - outputLocationPrefix := len(rconfig.DefaultFilesConfig.OutputLocationPrefix) > 0 +func hydrateLaunchPlanSpec(configAssumableIamRole string, configK8sServiceAccount string, configOutputLocationPrefix string, lpSpec *admin.LaunchPlanSpec) { + assumableIamRole := len(configAssumableIamRole) > 0 + k8sServiceAcct := len(configK8sServiceAccount) > 0 + outputLocationPrefix := len(configOutputLocationPrefix) > 0 if assumableIamRole || k8sServiceAcct { lpSpec.AuthRole = &admin.AuthRole{ - AssumableIamRole: rconfig.DefaultFilesConfig.AssumableIamRole, - KubernetesServiceAccount: rconfig.DefaultFilesConfig.K8sServiceAccount, + AssumableIamRole: configAssumableIamRole, + KubernetesServiceAccount: configK8sServiceAccount, } } if outputLocationPrefix { lpSpec.RawOutputDataConfig = &admin.RawOutputDataConfig{ - OutputLocationPrefix: rconfig.DefaultFilesConfig.OutputLocationPrefix, + OutputLocationPrefix: configOutputLocationPrefix, } } } -func hydrateSpec(message proto.Message, sourceCode string) error { +func hydrateSpec(message proto.Message, sourceCode string, config rconfig.FilesConfig) error { switch v := message.(type) { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) - hydrateIdentifier(launchPlan.Spec.WorkflowId) - hydrateLaunchPlanSpec(launchPlan.Spec) + hydrateIdentifier(launchPlan.Spec.WorkflowId, config.Version) + hydrateLaunchPlanSpec(config.AssumableIamRole, config.K8sServiceAccount, config.OutputLocationPrefix, launchPlan.Spec) case *admin.WorkflowSpec: workflowSpec := message.(*admin.WorkflowSpec) for _, Noderef := range workflowSpec.Template.Nodes { - if err := hydrateNode(Noderef); err != nil { + if err := hydrateNode(Noderef, config.Version); err != nil { return err } } - hydrateIdentifier(workflowSpec.Template.Id) + hydrateIdentifier(workflowSpec.Template.Id, config.Version) for _, subWorkflow := range workflowSpec.SubWorkflows { for _, Noderef := range subWorkflow.Nodes { - if err := hydrateNode(Noderef); err != nil { + if err := hydrateNode(Noderef, config.Version); err != nil { return err } } - hydrateIdentifier(subWorkflow.Id) + hydrateIdentifier(subWorkflow.Id, config.Version) } case *admin.TaskSpec: taskSpec := message.(*admin.TaskSpec) - hydrateIdentifier(taskSpec.Template.Id) + hydrateIdentifier(taskSpec.Template.Id, config.Version) // In case of fast serialize input proto also have on additional variable to substitute i.e destination bucket for source code - if err := hydrateTaskSpec(taskSpec, sourceCode); err != nil { + if err := hydrateTaskSpec(taskSpec, sourceCode, config.SourceUploadPath, config.Version); err != nil { return err } @@ -331,8 +331,8 @@ Get serialize output file list from the args list. If the archive flag is on then download the archives to temp directory and extract it. In case of fast register it will also return the compressed source code The o/p of this function would be sorted list of the file locations. */ -func getSerializeOutputFiles(ctx context.Context, args []string) ([]string, string, error) { - if !rconfig.DefaultFilesConfig.Archive { +func getSerializeOutputFiles(ctx context.Context, args []string, archive bool) ([]string, string, error) { + if !archive { /* * Sorting is required for non-archived case since its possible for the user to pass in a list of unordered * serialized protobuf files , but flyte expects them to be registered in topologically sorted order that it had @@ -406,7 +406,7 @@ func readAndCopyArchive(src io.Reader, tempDir string, unarchivedFiles []string) } } -func registerFile(ctx context.Context, fileName, sourceCode string, registerResults []Result, cmdCtx cmdCore.CommandContext) ([]Result, error) { +func registerFile(ctx context.Context, fileName, sourceCode string, registerResults []Result, cmdCtx cmdCore.CommandContext, config rconfig.FilesConfig) ([]Result, error) { var registerResult Result var fileContents []byte var err error @@ -422,7 +422,7 @@ func registerFile(ctx context.Context, fileName, sourceCode string, registerResu return registerResults, err } - if err := hydrateSpec(spec, sourceCode); err != nil { + if err := hydrateSpec(spec, sourceCode, config); err != nil { registerResult = Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error hydrating spec due to %v", err)} registerResults = append(registerResults, registerResult) return registerResults, err @@ -430,7 +430,7 @@ func registerFile(ctx context.Context, fileName, sourceCode string, registerResu logger.Debugf(ctx, "Hydrated spec : %v", getJSONSpec(spec)) - if err := register(ctx, spec, cmdCtx); err != nil { + if err := register(ctx, spec, cmdCtx, config.DryRun, config.Version); err != nil { // If error is AlreadyExists then dont consider this to be an error but just a warning state if grpcError := status.Code(err); grpcError == codes.AlreadyExists { registerResult = Result{Name: fileName, Status: "Success", Info: fmt.Sprintf("%v", grpcError.String())} @@ -532,21 +532,21 @@ func getRemoteStoragePath(ctx context.Context, s *storage.DataStore, remoteLocat return remotePath, nil } -func uploadFastRegisterArtifact(ctx context.Context, file, sourceCodeName, version string) error { +func uploadFastRegisterArtifact(ctx context.Context, file, sourceCodeName, version string, sourceUploadPath *string) error { dataStore, err := getStorageClient(ctx) if err != nil { return err } var dataRefReaderCloser io.ReadCloser - remotePath := storage.DataReference(rconfig.DefaultFilesConfig.SourceUploadPath) - if len(rconfig.DefaultFilesConfig.SourceUploadPath) == 0 { + remotePath := storage.DataReference(*sourceUploadPath) + if len(*sourceUploadPath) == 0 { remotePath, err = dataStore.ConstructReference(ctx, dataStore.GetBaseContainerFQN(ctx), "fast") if err != nil { return err } } - rconfig.DefaultFilesConfig.SourceUploadPath = string(remotePath) - fullRemotePath, err := getRemoteStoragePath(ctx, dataStore, rconfig.DefaultFilesConfig.SourceUploadPath, sourceCodeName, version) + *sourceUploadPath = string(remotePath) + fullRemotePath, err := getRemoteStoragePath(ctx, dataStore, *sourceUploadPath, sourceCodeName, version) if err != nil { return err } @@ -608,10 +608,10 @@ func segregateSourceAndProtos(dataRefs []string) (string, []string, []string) { return sourceCode, validProto, InvalidFiles } -func deprecatedCheck(ctx context.Context) { - if len(rconfig.DefaultFilesConfig.K8ServiceAccount) > 0 { +func deprecatedCheck(ctx context.Context, k8sServiceAccount *string, k8ServiceAccount string) { + if len(k8ServiceAccount) > 0 { logger.Warning(ctx, "--K8ServiceAccount is deprecated, Please use --K8sServiceAccount") - rconfig.DefaultFilesConfig.K8sServiceAccount = rconfig.DefaultFilesConfig.K8ServiceAccount + *k8sServiceAccount = k8ServiceAccount } } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 7f784776b3..24be8297c5 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -66,7 +66,7 @@ func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-parent-folder-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -83,7 +83,7 @@ func TestGetSortedArchivedFileList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -100,7 +100,7 @@ func TestGetSortedArchivedFileUnorderedList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-unordered-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -117,7 +117,7 @@ func TestGetSortedArchivedCorruptedFileList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/invalid.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 0) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -130,7 +130,7 @@ func TestGetSortedArchivedTgzList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/valid-register.tgz"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -146,7 +146,7 @@ func TestGetSortedArchivedCorruptedTgzFileList(t *testing.T) { setup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/invalid.tgz"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -159,7 +159,7 @@ func TestGetSortedArchivedInvalidArchiveFileList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"testdata/invalid-extension-register.zip"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -172,7 +172,7 @@ func TestGetSortedArchivedFileThroughInvalidHttpList(t *testing.T) { setup() rconfig.DefaultFilesConfig.Archive = true args = []string{"http://invalidhost:invalidport/testdata/valid-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -185,7 +185,7 @@ func TestGetSortedArchivedFileThroughValidHttpList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args = []string{"http://dummyhost:80/testdata/valid-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -203,7 +203,7 @@ func TestGetSortedArchivedFileThroughValidHttpWithNullContextList(t *testing.T) rconfig.DefaultFilesConfig.Archive = true args = []string{"http://dummyhost:80/testdata/valid-register.tar"} ctx = nil - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args) + fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 0) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -219,7 +219,7 @@ func TestRegisterFile(t *testing.T) { mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx) + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Nil(t, err) }) @@ -228,7 +228,7 @@ func TestRegisterFile(t *testing.T) { registerFilesSetup() args = []string{"testdata/non-existent.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx) + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) assert.Equal(t, "Error reading file due to open testdata/non-existent.pb: no such file or directory", results[0].Info) @@ -239,7 +239,7 @@ func TestRegisterFile(t *testing.T) { registerFilesSetup() args = []string{"testdata/valid-register.tar"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx) + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) assert.Equal(t, "Error unmarshalling file due to failed unmarshalling file testdata/valid-register.tar", results[0].Info) @@ -252,7 +252,7 @@ func TestRegisterFile(t *testing.T) { status.Error(codes.AlreadyExists, "AlreadyExists")) args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx) + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Equal(t, "Success", results[0].Status) assert.Equal(t, "AlreadyExists", results[0].Info) @@ -265,7 +265,7 @@ func TestRegisterFile(t *testing.T) { status.Error(codes.InvalidArgument, "Invalid")) args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx) + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) assert.Equal(t, "Error registering file due to rpc error: code = InvalidArgument desc = Invalid", results[0].Info) @@ -279,7 +279,7 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.AssumableIamRole = "iamRole" lpSpec := &admin.LaunchPlanSpec{} - hydrateLaunchPlanSpec(lpSpec) + hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole"}, lpSpec.AuthRole) }) t.Run("k8sService account override", func(t *testing.T) { @@ -287,7 +287,7 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.K8sServiceAccount = "k8Account" lpSpec := &admin.LaunchPlanSpec{} - hydrateLaunchPlanSpec(lpSpec) + hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) assert.Equal(t, &admin.AuthRole{KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) }) t.Run("Both k8sService and IamRole", func(t *testing.T) { @@ -296,7 +296,7 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { rconfig.DefaultFilesConfig.AssumableIamRole = "iamRole" rconfig.DefaultFilesConfig.K8sServiceAccount = "k8Account" lpSpec := &admin.LaunchPlanSpec{} - hydrateLaunchPlanSpec(lpSpec) + hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole", KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) }) @@ -305,7 +305,7 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.OutputLocationPrefix = "prefix" lpSpec := &admin.LaunchPlanSpec{} - hydrateLaunchPlanSpec(lpSpec) + hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) assert.Equal(t, &admin.RawOutputDataConfig{OutputLocationPrefix: "prefix"}, lpSpec.RawOutputDataConfig) }) } @@ -319,7 +319,7 @@ func TestUploadFastRegisterArtifact(t *testing.T) { }, testScope.NewSubScope("flytectl")) assert.Nil(t, err) Client = s - err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacks-core.tgz", "flytesnacks-core.tgz", "") + err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacks-core.tgz", "flytesnacks-core.tgz", "", &rconfig.DefaultFilesConfig.SourceUploadPath) assert.Nil(t, err) }) t.Run("Failed upload", func(t *testing.T) { @@ -330,7 +330,7 @@ func TestUploadFastRegisterArtifact(t *testing.T) { }, testScope.NewSubScope("flytectl")) assert.Nil(t, err) Client = s - err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacks-core.tgz", "", "") + err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacks-core.tgz", "", "", &rconfig.DefaultFilesConfig.SourceUploadPath) assert.Nil(t, err) }) t.Run("Failed upload", func(t *testing.T) { @@ -341,7 +341,7 @@ func TestUploadFastRegisterArtifact(t *testing.T) { }, testScope.NewSubScope("flytectl")) assert.Nil(t, err) Client = s - err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacksre.tgz", "", "") + err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacksre.tgz", "", "", &rconfig.DefaultFilesConfig.SourceUploadPath) assert.NotNil(t, err) }) } @@ -379,7 +379,7 @@ func TestRegister(t *testing.T) { setup() registerFilesSetup() node := &admin.NodeExecution{} - err := register(ctx, node, cmdCtx) + err := register(ctx, node, cmdCtx, rconfig.DefaultFilesConfig.DryRun, rconfig.DefaultFilesConfig.Version) assert.NotNil(t, err) }) } @@ -389,7 +389,7 @@ func TestHydrateNode(t *testing.T) { setup() registerFilesSetup() node := &core.Node{} - err := hydrateNode(node) + err := hydrateNode(node, rconfig.DefaultFilesConfig.Version) assert.NotNil(t, err) }) @@ -397,7 +397,7 @@ func TestHydrateNode(t *testing.T) { setup() registerFilesSetup() task := &admin.Task{} - err := hydrateSpec(task, "") + err := hydrateSpec(task, "", *rconfig.DefaultFilesConfig) assert.NotNil(t, err) }) } @@ -445,7 +445,7 @@ func TestHydrateTaskSpec(t *testing.T) { }, }, } - err = hydrateTaskSpec(task, "sourcey") + err = hydrateTaskSpec(task, "sourcey", rconfig.DefaultFilesConfig.SourceUploadPath, rconfig.DefaultFilesConfig.Version) assert.NoError(t, err) var hydratedPodSpec = v1.PodSpec{} err = utils.UnmarshalStructToObj(task.Template.GetK8SPod().PodSpec, &hydratedPodSpec) From 06458f5809bd27a788cba44c4c9a5b777f609a9e Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 16 Nov 2021 12:55:32 +0530 Subject: [PATCH 168/645] Added validation for scheduled workflow during registration (#215) Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/register/register_util.go | 39 ++++++- flytectl/cmd/register/register_util_test.go | 107 +++++++++++++++++++- 2 files changed, 140 insertions(+), 6 deletions(-) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 85b55e81b4..91657241d3 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -261,7 +261,39 @@ func hydrateTaskSpec(task *admin.TaskSpec, sourceCode string, sourceUploadPath s return nil } -func hydrateLaunchPlanSpec(configAssumableIamRole string, configK8sServiceAccount string, configOutputLocationPrefix string, lpSpec *admin.LaunchPlanSpec) { +func validateLaunchSpec(lpSpec *admin.LaunchPlanSpec) error { + if lpSpec == nil { + return nil + } + if lpSpec.EntityMetadata != nil && lpSpec.EntityMetadata.Schedule != nil { + schedule := lpSpec.EntityMetadata.Schedule + var scheduleFixedParams []string + if lpSpec.DefaultInputs != nil { + for paramKey := range lpSpec.DefaultInputs.Parameters { + if paramKey != schedule.KickoffTimeInputArg { + scheduleFixedParams = append(scheduleFixedParams, paramKey) + } + } + } + if (lpSpec.FixedInputs == nil && len(scheduleFixedParams) > 0) || + (len(scheduleFixedParams) > len(lpSpec.FixedInputs.Literals)) { + fixedInputLen := 0 + if lpSpec.FixedInputs != nil { + fixedInputLen = len(lpSpec.FixedInputs.Literals) + } + return fmt.Errorf("param values are missing on scheduled workflow."+ + "additional args other than %v on scheduled workflow are %v > %v fixed values", schedule.KickoffTimeInputArg, + len(scheduleFixedParams), fixedInputLen) + } + } + return nil +} + +func hydrateLaunchPlanSpec(configAssumableIamRole string, configK8sServiceAccount string, configOutputLocationPrefix string, lpSpec *admin.LaunchPlanSpec) error { + + if err := validateLaunchSpec(lpSpec); err != nil { + return err + } assumableIamRole := len(configAssumableIamRole) > 0 k8sServiceAcct := len(configK8sServiceAccount) > 0 outputLocationPrefix := len(configOutputLocationPrefix) > 0 @@ -276,6 +308,7 @@ func hydrateLaunchPlanSpec(configAssumableIamRole string, configK8sServiceAccoun OutputLocationPrefix: configOutputLocationPrefix, } } + return nil } func hydrateSpec(message proto.Message, sourceCode string, config rconfig.FilesConfig) error { @@ -283,7 +316,9 @@ func hydrateSpec(message proto.Message, sourceCode string, config rconfig.FilesC case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) hydrateIdentifier(launchPlan.Spec.WorkflowId, config.Version) - hydrateLaunchPlanSpec(config.AssumableIamRole, config.K8sServiceAccount, config.OutputLocationPrefix, launchPlan.Spec) + if err := hydrateLaunchPlanSpec(config.AssumableIamRole, config.K8sServiceAccount, config.OutputLocationPrefix, launchPlan.Spec); err != nil { + return err + } case *admin.WorkflowSpec: workflowSpec := message.(*admin.WorkflowSpec) for _, Noderef := range workflowSpec.Template.Nodes { diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 24be8297c5..fcbff5a802 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -13,6 +13,7 @@ import ( v1 "k8s.io/api/core/v1" + "github.com/flyteorg/flyteidl/clients/go/coreutils" "github.com/flyteorg/flytestdlib/contextutils" "github.com/flyteorg/flytestdlib/promutils" "github.com/flyteorg/flytestdlib/promutils/labeled" @@ -279,7 +280,8 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.AssumableIamRole = "iamRole" lpSpec := &admin.LaunchPlanSpec{} - hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + assert.Nil(t, err) assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole"}, lpSpec.AuthRole) }) t.Run("k8sService account override", func(t *testing.T) { @@ -287,7 +289,8 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.K8sServiceAccount = "k8Account" lpSpec := &admin.LaunchPlanSpec{} - hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + assert.Nil(t, err) assert.Equal(t, &admin.AuthRole{KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) }) t.Run("Both k8sService and IamRole", func(t *testing.T) { @@ -296,7 +299,8 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { rconfig.DefaultFilesConfig.AssumableIamRole = "iamRole" rconfig.DefaultFilesConfig.K8sServiceAccount = "k8Account" lpSpec := &admin.LaunchPlanSpec{} - hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + assert.Nil(t, err) assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole", KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) }) @@ -305,9 +309,104 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.OutputLocationPrefix = "prefix" lpSpec := &admin.LaunchPlanSpec{} - hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + assert.Nil(t, err) assert.Equal(t, &admin.RawOutputDataConfig{OutputLocationPrefix: "prefix"}, lpSpec.RawOutputDataConfig) }) + t.Run("Validation successful", func(t *testing.T) { + lpSpec := &admin.LaunchPlanSpec{ + EntityMetadata: &admin.LaunchPlanMetadata{ + Schedule: &admin.Schedule{ + ScheduleExpression: &admin.Schedule_CronExpression{ + CronExpression: "foo", + }, + KickoffTimeInputArg: "kickoff_time_arg", + }, + }, + FixedInputs: &core.LiteralMap{ + Literals: map[string]*core.Literal{}, + }, + } + err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + assert.Nil(t, err) + }) + t.Run("Validation failure", func(t *testing.T) { + lpSpec := &admin.LaunchPlanSpec{ + EntityMetadata: &admin.LaunchPlanMetadata{ + Schedule: &admin.Schedule{ + ScheduleExpression: &admin.Schedule_CronExpression{ + CronExpression: "expr", + }, + KickoffTimeInputArg: "kickoff_time_arg", + }, + }, + DefaultInputs: &core.ParameterMap{ + Parameters: map[string]*core.Parameter{ + "bar": { + Var: &core.Variable{ + Type: &core.LiteralType{Type: &core.LiteralType_Simple{Simple: core.SimpleType_STRING}}, + }, + }, + }, + }, + FixedInputs: &core.LiteralMap{ + Literals: map[string]*core.Literal{}, + }, + } + err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + assert.NotNil(t, err) + }) + t.Run("Validation failed with fixed inputs empty", func(t *testing.T) { + lpSpec := &admin.LaunchPlanSpec{ + EntityMetadata: &admin.LaunchPlanMetadata{ + Schedule: &admin.Schedule{ + ScheduleExpression: &admin.Schedule_CronExpression{ + CronExpression: "expr", + }, + KickoffTimeInputArg: "kickoff_time_arg", + }, + }, + DefaultInputs: &core.ParameterMap{ + Parameters: map[string]*core.Parameter{ + "bar": { + Var: &core.Variable{ + Type: &core.LiteralType{Type: &core.LiteralType_Simple{Simple: core.SimpleType_STRING}}, + }, + }, + }, + }, + } + err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + assert.NotNil(t, err) + }) + t.Run("Validation success with fixed", func(t *testing.T) { + lpSpec := &admin.LaunchPlanSpec{ + EntityMetadata: &admin.LaunchPlanMetadata{ + Schedule: &admin.Schedule{ + ScheduleExpression: &admin.Schedule_CronExpression{ + CronExpression: "expr", + }, + KickoffTimeInputArg: "kickoff_time_arg", + }, + }, + DefaultInputs: &core.ParameterMap{ + Parameters: map[string]*core.Parameter{ + "bar": { + Var: &core.Variable{ + Type: &core.LiteralType{Type: &core.LiteralType_Simple{Simple: core.SimpleType_STRING}}, + }, + }, + }, + }, + FixedInputs: &core.LiteralMap{ + Literals: map[string]*core.Literal{ + "bar": coreutils.MustMakeLiteral("bar-value"), + }, + }, + } + err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) + assert.Nil(t, err) + }) } func TestUploadFastRegisterArtifact(t *testing.T) { From fe72730a5499f509846eb6edc964f7b5dc6cbb86 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Wed, 24 Nov 2021 20:32:09 +0530 Subject: [PATCH 169/645] Added flags for using local images in sandbox (#216) * Added flags for local images in sandbox Signed-off-by: Yuvraj * debug Signed-off-by: Yuvraj * Added pull policy in sandbox Signed-off-by: Yuvraj * fix pflag manually Signed-off-by: Yuvraj * more changes Signed-off-by: Yuvraj * Allow setting ImagePullPolicy in cmd line (#218) Signed-off-by: Haytham Abuelfutuh * fix test Signed-off-by: Yuvraj * Fix docs for ImagePullPolicy values Signed-off-by: Haytham Abuelfutuh Co-authored-by: Haytham Abuelfutuh --- .../config/subcommand/sandbox/config_flags.go | 1 + .../subcommand/sandbox/config_flags_test.go | 12 ++++ .../sandbox/imagepullpolicy_enumer.go | 69 +++++++++++++++++++ .../subcommand/sandbox/sandbox_config.go | 31 ++++++++- flytectl/cmd/sandbox/start.go | 8 ++- flytectl/pkg/docker/docker.go | 1 + flytectl/pkg/docker/docker_util.go | 30 ++++++-- flytectl/pkg/docker/docker_util_test.go | 26 ++++++- flytectl/pkg/docker/mocks/docker.go | 41 +++++++++++ 9 files changed, 208 insertions(+), 11 deletions(-) create mode 100644 flytectl/cmd/config/subcommand/sandbox/imagepullpolicy_enumer.go diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index 15c7c6f78f..5339211026 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -53,5 +53,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.Source, fmt.Sprintf("%v%v", prefix, "source"), DefaultConfig.Source, "Path of your source code") cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "Version of flyte. Only supports flyte releases greater than v0.10.0") cmdFlags.StringVar(&DefaultConfig.Image, fmt.Sprintf("%v%v", prefix, "image"), DefaultConfig.Image, "Optional. Provide a fully qualified path to a Flyte compliant docker image.") + cmdFlags.Var(&DefaultConfig.ImagePullPolicy, fmt.Sprintf("%v%v", prefix, "imagePullPolicy"), "Optional. Defines the image pull behavior [Always/IfNotPresent/Never]") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index cd58322bb6..4e1410c228 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -141,4 +141,16 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_imagePullPolicy", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("imagePullPolicy", testValue) + if v := cmdFlags.Lookup("imagePullPolicy"); v != nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", v.Value.String()), &actual.ImagePullPolicy) + + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/sandbox/imagepullpolicy_enumer.go b/flytectl/cmd/config/subcommand/sandbox/imagepullpolicy_enumer.go new file mode 100644 index 0000000000..8416741819 --- /dev/null +++ b/flytectl/cmd/config/subcommand/sandbox/imagepullpolicy_enumer.go @@ -0,0 +1,69 @@ +// Code generated by "enumer -type=ImagePullPolicy -trimprefix=ImagePullPolicy --json"; DO NOT EDIT. + +// +package sandbox + +import ( + "encoding/json" + "fmt" +) + +const _ImagePullPolicyName = "AlwaysIfNotPresentNever" + +var _ImagePullPolicyIndex = [...]uint8{0, 6, 18, 23} + +func (i ImagePullPolicy) String() string { + if i < 0 || i >= ImagePullPolicy(len(_ImagePullPolicyIndex)-1) { + return fmt.Sprintf("ImagePullPolicy(%d)", i) + } + return _ImagePullPolicyName[_ImagePullPolicyIndex[i]:_ImagePullPolicyIndex[i+1]] +} + +var _ImagePullPolicyValues = []ImagePullPolicy{0, 1, 2} + +var _ImagePullPolicyNameToValueMap = map[string]ImagePullPolicy{ + _ImagePullPolicyName[0:6]: 0, + _ImagePullPolicyName[6:18]: 1, + _ImagePullPolicyName[18:23]: 2, +} + +// ImagePullPolicyString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func ImagePullPolicyString(s string) (ImagePullPolicy, error) { + if val, ok := _ImagePullPolicyNameToValueMap[s]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to ImagePullPolicy values", s) +} + +// ImagePullPolicyValues returns all values of the enum +func ImagePullPolicyValues() []ImagePullPolicy { + return _ImagePullPolicyValues +} + +// IsAImagePullPolicy returns "true" if the value is listed in the enum definition. "false" otherwise +func (i ImagePullPolicy) IsAImagePullPolicy() bool { + for _, v := range _ImagePullPolicyValues { + if i == v { + return true + } + } + return false +} + +// MarshalJSON implements the json.Marshaler interface for ImagePullPolicy +func (i ImagePullPolicy) MarshalJSON() ([]byte, error) { + return json.Marshal(i.String()) +} + +// UnmarshalJSON implements the json.Unmarshaler interface for ImagePullPolicy +func (i *ImagePullPolicy) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return fmt.Errorf("ImagePullPolicy should be a string, got %s", data) + } + + var err error + *i, err = ImagePullPolicyString(s) + return err +} diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index 9a787757a7..ff7559b562 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -1,11 +1,36 @@ package sandbox +//go:generate enumer -type=ImagePullPolicy -trimprefix=ImagePullPolicy --json +type ImagePullPolicy int + +const ( + ImagePullPolicyAlways ImagePullPolicy = iota + ImagePullPolicyIfNotPresent + ImagePullPolicyNever +) + +// Set implements PFlag's Value interface to attempt to set the value of the flag from string. +func (i *ImagePullPolicy) Set(val string) error { + policy, err := ImagePullPolicyString(val) + if err != nil { + return err + } + + *i = policy + return nil +} + +// Type implements PFlag's Value interface to return type name. +func (i ImagePullPolicy) Type() string { + return "ImagePullPolicy" +} + //go:generate pflags Config --default-var DefaultConfig --bind-default-var var ( DefaultConfig = &Config{} ) -//Config +//Config holds configuration flags for sandbox command. type Config struct { Source string `json:"source" pflag:",Path of your source code"` @@ -18,4 +43,8 @@ type Config struct { // Flyte compliant sandbox image. Usually useful, if you want to push the image to your own registry and relaunch // from there. Image string `json:"image" pflag:",Optional. Provide a fully qualified path to a Flyte compliant docker image."` + + // Optionally it is possible to use local sandbox image + // If local flag pass then flytectl will not pull image from registry. Usually useful, if you want to test your local images without pushing them to a registry + ImagePullPolicy ImagePullPolicy `json:"imagePullPolicy" pflag:",Optional. Defines the image pull behavior [Always/IfNotPresent/Never]"` } diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 8f9518a793..720b6f1a1d 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -56,6 +56,11 @@ Specify a Flyte Sandbox compliant image with the registry. This is useful, in ca flytectl sandbox start --image docker.io/my-override:latest + +Specify a Flyte Sandbox image pull policy. Possible pull policy values are Always, IfNotPresent, or Never +:: + + flytectl sandbox start --image docker.io/my-override:latest --imagePullPolicy Always Usage ` k8sEndpoint = "https://127.0.0.1:30086" @@ -143,7 +148,8 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu return nil, err } fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, image) - if err := docker.PullDockerImage(ctx, cli, image); err != nil { + + if err := docker.PullDockerImage(ctx, cli, image, sandboxConfig.DefaultConfig.ImagePullPolicy); err != nil { return nil, err } diff --git a/flytectl/pkg/docker/docker.go b/flytectl/pkg/docker/docker.go index 1cc53b6285..cb08092b5f 100644 --- a/flytectl/pkg/docker/docker.go +++ b/flytectl/pkg/docker/docker.go @@ -24,6 +24,7 @@ type Docker interface { ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) + ImageList(ctx context.Context, listOption types.ImageListOptions) ([]types.ImageSummary, error) } type FlyteDocker struct { diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index a6afbec299..29551decab 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -9,6 +9,8 @@ import ( "os" "strings" + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + "github.com/flyteorg/flytectl/clierrors" "github.com/docker/docker/api/types" @@ -88,14 +90,30 @@ func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, e } // PullDockerImage will Pull docker image -func PullDockerImage(ctx context.Context, cli Docker, image string) error { - r, err := cli.ImagePull(ctx, image, types.ImagePullOptions{}) - if err != nil { +func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy sandboxConfig.ImagePullPolicy) error { + if pullPolicy == sandboxConfig.ImagePullPolicyAlways || pullPolicy == sandboxConfig.ImagePullPolicyIfNotPresent { + if pullPolicy == sandboxConfig.ImagePullPolicyIfNotPresent { + imageSummary, err := cli.ImageList(ctx, types.ImageListOptions{}) + if err != nil { + return err + } + for _, img := range imageSummary { + for _, tags := range img.RepoTags { + if image == tags { + return nil + } + } + } + } + r, err := cli.ImagePull(ctx, image, types.ImagePullOptions{}) + if err != nil { + return err + } + + _, err = io.Copy(os.Stdout, r) return err } - - _, err = io.Copy(os.Stdout, r) - return err + return nil } //StartContainer will create and start docker container diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 5aa2b34896..0a40d55ea2 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -8,6 +8,8 @@ import ( "strings" "testing" + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/docker/docker/api/types/container" @@ -101,13 +103,13 @@ func TestRemoveSandboxWithNoReply(t *testing.T) { } func TestPullDockerImage(t *testing.T) { - t.Run("Successfully pull image", func(t *testing.T) { + t.Run("Successfully pull image Always", func(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} context := context.Background() // Verify the attributes mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - err := PullDockerImage(context, mockDocker, "nginx") + err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways) assert.Nil(t, err) }) @@ -117,10 +119,28 @@ func TestPullDockerImage(t *testing.T) { context := context.Background() // Verify the attributes mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) - err := PullDockerImage(context, mockDocker, "nginx") + err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways) assert.NotNil(t, err) }) + t.Run("Successfully pull image IfNotPresent", func(t *testing.T) { + setupSandbox() + mockDocker := &mocks.Docker{} + context := context.Background() + // Verify the attributes + mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImageListMatch(context, types.ImageListOptions{}).Return([]types.ImageSummary{}, nil) + err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyIfNotPresent) + assert.Nil(t, err) + }) + + t.Run("Successfully pull image Never", func(t *testing.T) { + setupSandbox() + mockDocker := &mocks.Docker{} + context := context.Background() + err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyNever) + assert.Nil(t, err) + }) } func TestStartContainer(t *testing.T) { diff --git a/flytectl/pkg/docker/mocks/docker.go b/flytectl/pkg/docker/mocks/docker.go index 9655d46a9c..b08cf0d51a 100644 --- a/flytectl/pkg/docker/mocks/docker.go +++ b/flytectl/pkg/docker/mocks/docker.go @@ -368,6 +368,47 @@ func (_m *Docker) ContainerWait(ctx context.Context, containerID string, conditi return r0, r1 } +type Docker_ImageList struct { + *mock.Call +} + +func (_m Docker_ImageList) Return(_a0 []types.ImageSummary, _a1 error) *Docker_ImageList { + return &Docker_ImageList{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnImageList(ctx context.Context, listOption types.ImageListOptions) *Docker_ImageList { + c := _m.On("ImageList", ctx, listOption) + return &Docker_ImageList{Call: c} +} + +func (_m *Docker) OnImageListMatch(matchers ...interface{}) *Docker_ImageList { + c := _m.On("ImageList", matchers...) + return &Docker_ImageList{Call: c} +} + +// ImageList provides a mock function with given fields: ctx, listOption +func (_m *Docker) ImageList(ctx context.Context, listOption types.ImageListOptions) ([]types.ImageSummary, error) { + ret := _m.Called(ctx, listOption) + + var r0 []types.ImageSummary + if rf, ok := ret.Get(0).(func(context.Context, types.ImageListOptions) []types.ImageSummary); ok { + r0 = rf(ctx, listOption) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]types.ImageSummary) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, types.ImageListOptions) error); ok { + r1 = rf(ctx, listOption) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type Docker_ImagePull struct { *mock.Call } From 47ee1ef2e851cd13e8db156555ed0d3cb510aee5 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Wed, 24 Nov 2021 07:19:36 -0800 Subject: [PATCH 170/645] Update documentation (#220) Signed-off-by: Flyte-Bot Co-authored-by: EngHabu --- .../docs/source/gen/flytectl_sandbox_start.rst | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 441f04674e..3c48e3ad2b 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -34,6 +34,11 @@ Specify a Flyte Sandbox compliant image with the registry. This is useful, in ca flytectl sandbox start --image docker.io/my-override:latest + +Specify a Flyte Sandbox image pull policy. Possible pull policy values are Always, IfNotPresent, or Never +:: + + flytectl sandbox start --image docker.io/my-override:latest --imagePullPolicy Always Usage @@ -46,10 +51,11 @@ Options :: - -h, --help help for start - --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. - --source string Path of your source code - --version string Version of flyte. Only supports flyte releases greater than v0.10.0 + -h, --help help for start + --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. + --imagePullPolicy ImagePullPolicy Optional. Defines the image pull behavior [Always/IfNotPresent/Never] (default Always) + --source string Path of your source code + --version string Version of flyte. Only supports flyte releases greater than v0.10.0 Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 922a8b1920cc29ed0233f57f294508619b807fdc Mon Sep 17 00:00:00 2001 From: Haytham Abuelfutuh Date: Wed, 24 Nov 2021 09:20:39 -0800 Subject: [PATCH 171/645] Implement PFlag Value interface for OutputFormat to allow pflag binding (#219) * Added flags for local images in sandbox Signed-off-by: Yuvraj * debug Signed-off-by: Yuvraj * Added pull policy in sandbox Signed-off-by: Yuvraj * fix pflag manually Signed-off-by: Yuvraj * Allow setting ImagePullPolicy in cmd line Signed-off-by: Haytham Abuelfutuh * Regenerate Flags with new pflags Signed-off-by: Haytham Abuelfutuh * Regenerate Signed-off-by: Haytham Abuelfutuh Co-authored-by: Yuvraj --- flytectl/cmd/create/execution.go | 2 +- flytectl/cmd/create/executionconfig_flags.go | 3 ++ .../cmd/create/executionconfig_flags_test.go | 42 +++++++++++++++++++ .../ext/mocks/admin_fetcher_ext_interface.go | 14 +++---- flytectl/pkg/printer/printer.go | 16 +++++++ 5 files changed, 69 insertions(+), 8 deletions(-) diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index 1c78c6c8d8..d3e5d1c34c 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -152,7 +152,7 @@ type ExecutionConfig struct { Workflow string `json:"workflow,omitempty"` Task string `json:"task,omitempty"` Version string `json:"version"` - Inputs map[string]interface{} `json:"inputs"` + Inputs map[string]interface{} `json:"inputs" pflag:"-"` } type ExecutionType int diff --git a/flytectl/cmd/create/executionconfig_flags.go b/flytectl/cmd/create/executionconfig_flags.go index fbfb378627..8dbfa9fdfe 100755 --- a/flytectl/cmd/create/executionconfig_flags.go +++ b/flytectl/cmd/create/executionconfig_flags.go @@ -58,5 +58,8 @@ func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&executionConfig.Relaunch, fmt.Sprintf("%v%v", prefix, "relaunch"), executionConfig.Relaunch, "execution id to be relaunched.") cmdFlags.StringVar(&executionConfig.Recover, fmt.Sprintf("%v%v", prefix, "recover"), executionConfig.Recover, "execution id to be recreated from the last known failure point.") cmdFlags.BoolVar(&executionConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), executionConfig.DryRun, "execute command without making any modifications.") + cmdFlags.StringVar(&executionConfig.Workflow, fmt.Sprintf("%v%v", prefix, "workflow"), executionConfig.Workflow, "") + cmdFlags.StringVar(&executionConfig.Task, fmt.Sprintf("%v%v", prefix, "task"), executionConfig.Task, "") + cmdFlags.StringVar(&executionConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), executionConfig.Version, "") return cmdFlags } diff --git a/flytectl/cmd/create/executionconfig_flags_test.go b/flytectl/cmd/create/executionconfig_flags_test.go index 4ad41018ad..0b301402cc 100755 --- a/flytectl/cmd/create/executionconfig_flags_test.go +++ b/flytectl/cmd/create/executionconfig_flags_test.go @@ -211,4 +211,46 @@ func TestExecutionConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_workflow", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("workflow", testValue) + if vString, err := cmdFlags.GetString("workflow"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Workflow) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_task", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("task", testValue) + if vString, err := cmdFlags.GetString("task"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Task) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_version", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("version", testValue) + if vString, err := cmdFlags.GetString("version"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Version) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index f41cb66dda..623199b9f9 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -348,8 +348,8 @@ func (_m AdminFetcherExtInterface_FetchNodeExecutionDetails) Return(_a0 *admin.N return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: _m.Call.Return(_a0, _a1)} } -func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string, uniqueParentId string) *AdminFetcherExtInterface_FetchNodeExecutionDetails { - c := _m.On("FetchNodeExecutionDetails", ctx, name, project, domain, uniqueParentId) +func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string, uniqueParentID string) *AdminFetcherExtInterface_FetchNodeExecutionDetails { + c := _m.On("FetchNodeExecutionDetails", ctx, name, project, domain, uniqueParentID) return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: c} } @@ -358,13 +358,13 @@ func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDetailsMatch(matchers .. return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: c} } -// FetchNodeExecutionDetails provides a mock function with given fields: ctx, name, project, domain, uniqueParentId -func (_m *AdminFetcherExtInterface) FetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string, uniqueParentId string) (*admin.NodeExecutionList, error) { - ret := _m.Called(ctx, name, project, domain, uniqueParentId) +// FetchNodeExecutionDetails provides a mock function with given fields: ctx, name, project, domain, uniqueParentID +func (_m *AdminFetcherExtInterface) FetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string, uniqueParentID string) (*admin.NodeExecutionList, error) { + ret := _m.Called(ctx, name, project, domain, uniqueParentID) var r0 *admin.NodeExecutionList if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) *admin.NodeExecutionList); ok { - r0 = rf(ctx, name, project, domain, uniqueParentId) + r0 = rf(ctx, name, project, domain, uniqueParentID) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*admin.NodeExecutionList) @@ -373,7 +373,7 @@ func (_m *AdminFetcherExtInterface) FetchNodeExecutionDetails(ctx context.Contex var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { - r1 = rf(ctx, name, project, domain, uniqueParentId) + r1 = rf(ctx, name, project, domain, uniqueParentID) } else { r1 = ret.Error(1) } diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index 75d67208eb..f231c32baf 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -35,6 +35,22 @@ const ( OutputFormatDOTURL ) +// Set implements PFlag's Value interface to attempt to set the value of the flag from string. +func (i *OutputFormat) Set(val string) error { + policy, err := OutputFormatString(val) + if err != nil { + return err + } + + *i = policy + return nil +} + +// Type implements PFlag's Value interface to return type name. +func (i OutputFormat) Type() string { + return "OutputFormat" +} + const GraphVisualizationServiceURL = "http://graph.flyte.org/#" func OutputFormats() []string { From f4a7e1e3a9119146dacaddb826c1ffee0cefb120 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Wed, 24 Nov 2021 09:59:48 -0800 Subject: [PATCH 172/645] Update documentation (#221) Signed-off-by: Flyte-Bot Co-authored-by: EngHabu --- flytectl/docs/source/gen/flytectl_create_execution.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 7cac61bbd2..2838ecdd5c 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -149,6 +149,9 @@ Options --relaunch string execution id to be relaunched. --targetDomain string project where execution needs to be created.If not specified configured domain would be used. --targetProject string project where execution needs to be created.If not specified configured project would be used. + --task string + --version string + --workflow string Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 8d2b83b1e05b9f94202f3cd0f54202c48a9afaca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Nov 2021 23:30:25 +0530 Subject: [PATCH 173/645] Bump github.com/opencontainers/image-spec from 1.0.1 to 1.0.2 (#217) Bumps [github.com/opencontainers/image-spec](https://github.com/opencontainers/image-spec) from 1.0.1 to 1.0.2. - [Release notes](https://github.com/opencontainers/image-spec/releases) - [Changelog](https://github.com/opencontainers/image-spec/blob/main/RELEASES.md) - [Commits](https://github.com/opencontainers/image-spec/compare/v1.0.1...v1.0.2) --- updated-dependencies: - dependency-name: github.com/opencontainers/image-spec dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- flytectl/go.mod | 2 +- flytectl/go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index f403705864..21bb228fda 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -31,7 +31,7 @@ require ( github.com/morikuni/aec v1.0.0 // indirect github.com/mouuff/go-rocket-update v1.5.1 github.com/olekukonko/tablewriter v0.0.5 - github.com/opencontainers/image-spec v1.0.1 + github.com/opencontainers/image-spec v1.0.2 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.8.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 823dc8ecf0..38549bec3b 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -719,8 +719,9 @@ github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go. github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= From b09e206532e2463d5c6fd8ab6f91021963058f95 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Tue, 30 Nov 2021 06:52:26 +0530 Subject: [PATCH 174/645] Improve register example UX, Moved from argument to version flag. (#222) * fix flytesnacks register version Signed-off-by: Yuvraj --- .../cmd/config/subcommand/register/files_config.go | 2 +- flytectl/cmd/register/examples.go | 10 +++------- flytectl/cmd/register/register_util.go | 8 ++++---- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/flytectl/cmd/config/subcommand/register/files_config.go b/flytectl/cmd/config/subcommand/register/files_config.go index 8aea9f099b..9c17c958c8 100644 --- a/flytectl/cmd/config/subcommand/register/files_config.go +++ b/flytectl/cmd/config/subcommand/register/files_config.go @@ -4,7 +4,7 @@ package register var ( DefaultFilesConfig = &FilesConfig{ - Version: "v1", + Version: "", ContinueOnError: false, } ) diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index c290b52ae2..3e1b805554 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -18,12 +18,12 @@ const ( Registers all latest flytesnacks example :: - bin/flytectl register examples -d development -p flytesnacks + bin/flytectl register examples -d development -p flytesnacks Registers specific release of flytesnacks example :: - bin/flytectl register examples -d development -p flytesnacks v0.2.176 + bin/flytectl register examples -d development -p flytesnacks --version v0.2.176 Note: register command automatically override the version with release version Usage @@ -37,15 +37,11 @@ var ( func registerExamplesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { var examples []github.ReleaseAsset - var release string // Deprecated checks for --k8Service deprecatedCheck(ctx, &rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.K8ServiceAccount) - if len(args) == 1 { - release = args[0] - } - examples, tag, err := getAllFlytesnacksExample(githubOrg, flytesnacksRepository, release) + examples, tag, err := getAllFlytesnacksExample(githubOrg, flytesnacksRepository, rconfig.DefaultFilesConfig.Version) if err != nil { return err } diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 91657241d3..2e8d3cf6e8 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -538,15 +538,15 @@ func filterExampleFromRelease(releases github.RepositoryRelease) []github.Releas return assets } -func getAllFlytesnacksExample(org, repository, release string) ([]github.ReleaseAsset, string, error) { +func getAllFlytesnacksExample(org, repository, version string) ([]github.ReleaseAsset, string, error) { c := github.NewClient(nil) opt := &github.ListOptions{Page: 1, PerPage: 1} - if len(release) > 0 { - releases, _, err := c.Repositories.GetReleaseByTag(context.Background(), org, repository, release) + if len(version) > 0 { + releases, _, err := c.Repositories.GetReleaseByTag(context.Background(), org, repository, version) if err != nil { return nil, "", err } - return filterExampleFromRelease(*releases), release, nil + return filterExampleFromRelease(*releases), version, nil } releases, _, err := c.Repositories.ListReleases(context.Background(), org, repository, opt) if err != nil { From 0f9eee813e8858aee1ea6a9756c659c083ca0ab9 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Mon, 29 Nov 2021 20:25:08 -0800 Subject: [PATCH 175/645] Update documentation (#223) Signed-off-by: Flyte-Bot Co-authored-by: evalsocket --- flytectl/docs/source/gen/flytectl_register_examples.rst | 6 +++--- flytectl/docs/source/gen/flytectl_register_files.rst | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index e5fd09cfe0..8a01a27d65 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -13,12 +13,12 @@ Synopsis Registers all latest flytesnacks example :: - bin/flytectl register examples -d development -p flytesnacks + bin/flytectl register examples -d development -p flytesnacks Registers specific release of flytesnacks example :: - bin/flytectl register examples -d development -p flytesnacks v0.2.176 + bin/flytectl register examples -d development -p flytesnacks --version v0.2.176 Note: register command automatically override the version with release version Usage @@ -42,7 +42,7 @@ Options --k8sServiceAccount string custom kubernetes service account auth role to register launch plans with. --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). --sourceUploadPath string Location for source code in storage. - --version string version of the entity to be registered with flyte. (default "v1") + --version string version of the entity to be registered with flyte. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index cb26121177..f25b6597fb 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -101,7 +101,7 @@ Options --k8sServiceAccount string custom kubernetes service account auth role to register launch plans with. --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). --sourceUploadPath string Location for source code in storage. - --version string version of the entity to be registered with flyte. (default "v1") + --version string version of the entity to be registered with flyte. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From bd1d4e5efbc0928f45c01d09efc54ac578a27621 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 6 Dec 2021 12:03:00 +0530 Subject: [PATCH 176/645] Added script for checking diff of generated code (#229) * Added script for checking diff of generated code Signed-off-by: Yuvraj --- flytectl/.github/config.yml | 2 +- flytectl/.github/workflows/build.yaml | 10 +++++++++ flytectl/Makefile | 3 --- .../flyte/golang_support_tools/go.mod | 4 ++-- .../flyte/golang_support_tools/go.sum | 5 +++-- .../flyte/golang_test_targets/Makefile | 4 ++++ .../flyte/golang_test_targets/go-gen.sh | 22 +++++++++++++++++++ .../boilerplate/flyte/welcome_bot/config.yml | 2 +- 8 files changed, 43 insertions(+), 9 deletions(-) create mode 100755 flytectl/boilerplate/flyte/golang_test_targets/go-gen.sh diff --git a/flytectl/.github/config.yml b/flytectl/.github/config.yml index 7afe6111f5..73da252e52 100644 --- a/flytectl/.github/config.yml +++ b/flytectl/.github/config.yml @@ -1,5 +1,5 @@ # Comment to be posted on PRs from first-time contributors in your repository -newPRWelcomeComment: > +newPRWelcomeComment: | Thank you for opening this pull request! 🙌 These tips will help get your PR across the finish line: diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml index 03b19ecd88..148963bd0c 100644 --- a/flytectl/.github/workflows/build.yaml +++ b/flytectl/.github/workflows/build.yaml @@ -43,3 +43,13 @@ jobs: env: GO111MODULE: "on" run: make install && make lint + + generate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-go@v2 + with: + go-version: '1.16' + - name: Go generate and diff + run: DELTA_CHECK=true make generate \ No newline at end of file diff --git a/flytectl/Makefile b/flytectl/Makefile index 601e502569..d515ffa462 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -13,9 +13,6 @@ define PIP_COMPILE pip-compile $(1) --upgrade --verbose endef -generate: - go test github.com/flyteorg/flytectl/cmd --update - compile: go build -o bin/flytectl -ldflags=$(LD_FLAGS) main.go diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.mod b/flytectl/boilerplate/flyte/golang_support_tools/go.mod index 53f645159a..13941936c5 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.mod +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.mod @@ -4,10 +4,10 @@ go 1.16 require ( github.com/alvaroloes/enumer v1.1.2 - github.com/flyteorg/flytestdlib v0.3.22 + github.com/flyteorg/flytestdlib v0.4.7 github.com/golangci/golangci-lint v1.38.0 - github.com/pseudomuto/protoc-gen-doc v1.4.1 // indirect github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5 + github.com/pseudomuto/protoc-gen-doc v0.1.1 // indirect ) replace github.com/vektra/mockery => github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0 diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.sum b/flytectl/boilerplate/flyte/golang_support_tools/go.sum index 261048f745..a62010d29f 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.sum +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.sum @@ -210,8 +210,8 @@ github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flytestdlib v0.3.22 h1:nJEPaCdxzXBaeg2p4fdo3I3Ua09NedFRaUwuLafLEdw= -github.com/flyteorg/flytestdlib v0.3.22/go.mod h1:1XG0DwYTUm34Yrffm1Qy9Tdr/pWQypEqTq5dUxw3/cM= +github.com/flyteorg/flytestdlib v0.4.7 h1:SMPPXI3j/MjP7D2fqaR+lPQkTrqYS7xZbwsgJI2F8SU= +github.com/flyteorg/flytestdlib v0.4.7/go.mod h1:fv1ar34LJLMTaf0tbfetisLykUlARi7rP+NQTUn6QQs= github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= @@ -1263,6 +1263,7 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.2 h1:SMdYLJl312RXuxXziCCHhRsp/tvct9cGKey0yv95tZM= honnef.co/go/tools v0.1.2/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= +k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= diff --git a/flytectl/boilerplate/flyte/golang_test_targets/Makefile b/flytectl/boilerplate/flyte/golang_test_targets/Makefile index 21d8b5b776..280e1e55e4 100644 --- a/flytectl/boilerplate/flyte/golang_test_targets/Makefile +++ b/flytectl/boilerplate/flyte/golang_test_targets/Makefile @@ -8,6 +8,10 @@ download_tooling: #download dependencies (including test deps) for the package @boilerplate/flyte/golang_test_targets/download_tooling.sh +.PHONY: generate +generate: download_tooling #generate go code + @boilerplate/flyte/golang_test_targets/go-gen.sh + .PHONY: lint lint: download_tooling #lints the package for common code smells GL_DEBUG=linters_output,env golangci-lint run --deadline=5m --exclude deprecated -v diff --git a/flytectl/boilerplate/flyte/golang_test_targets/go-gen.sh b/flytectl/boilerplate/flyte/golang_test_targets/go-gen.sh new file mode 100755 index 0000000000..54bd6af61b --- /dev/null +++ b/flytectl/boilerplate/flyte/golang_test_targets/go-gen.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +set -ex + +echo "Running go generate" +go generate ./... + +# This section is used by GitHub workflow to ensure that the generation step was run +if [ -n "$DELTA_CHECK" ]; then + DIRTY=$(git status --porcelain) + if [ -n "$DIRTY" ]; then + echo "FAILED: Go code updated without commiting generated code." + echo "Ensure make generate has run and all changes are committed." + DIFF=$(git diff) + echo "diff detected: $DIFF" + DIFF=$(git diff --name-only) + echo "files different: $DIFF" + exit 1 + else + echo "SUCCESS: Generated code is up to date." + fi +fi diff --git a/flytectl/boilerplate/flyte/welcome_bot/config.yml b/flytectl/boilerplate/flyte/welcome_bot/config.yml index 7afe6111f5..73da252e52 100644 --- a/flytectl/boilerplate/flyte/welcome_bot/config.yml +++ b/flytectl/boilerplate/flyte/welcome_bot/config.yml @@ -1,5 +1,5 @@ # Comment to be posted on PRs from first-time contributors in your repository -newPRWelcomeComment: > +newPRWelcomeComment: | Thank you for opening this pull request! 🙌 These tips will help get your PR across the finish line: From 073c29d762de93e6849e489d4b0f77ce458ebaad Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Tue, 7 Dec 2021 20:51:29 +0530 Subject: [PATCH 177/645] bump version containerd (#231) Signed-off-by: Yuvraj --- flytectl/go.mod | 8 ++++---- flytectl/go.sum | 36 ++++++++++++++++++++++++++---------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 21bb228fda..c4c7eb3fa2 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -6,7 +6,7 @@ require ( github.com/Microsoft/go-winio v0.5.0 // indirect github.com/avast/retry-go v3.0.0+incompatible github.com/awalterschulze/gographviz v2.0.3+incompatible - github.com/containerd/containerd v1.5.2 // indirect + github.com/containerd/containerd v1.5.8 // indirect github.com/disiqueira/gotree v1.0.0 github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 @@ -14,7 +14,7 @@ require ( github.com/flyteorg/flyteidl v0.21.5 github.com/flyteorg/flytestdlib v0.4.0 github.com/ghodss/yaml v1.0.0 - github.com/golang/protobuf v1.4.3 + github.com/golang/protobuf v1.5.0 github.com/google/go-github v17.0.0+incompatible github.com/google/go-github/v37 v37.0.0 github.com/google/go-querystring v1.1.0 // indirect @@ -34,7 +34,7 @@ require ( github.com/opencontainers/image-spec v1.0.2 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 github.com/pkg/errors v0.9.1 - github.com/sirupsen/logrus v1.8.0 + github.com/sirupsen/logrus v1.8.1 github.com/spf13/cobra v1.1.3 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.7.0 @@ -45,7 +45,7 @@ require ( golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect google.golang.org/grpc v1.36.0 - google.golang.org/protobuf v1.25.0 + google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b gotest.tools v2.2.0+incompatible diff --git a/flytectl/go.sum b/flytectl/go.sum index 38549bec3b..9de725ed5f 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -95,6 +95,7 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3 github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -141,6 +142,7 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= @@ -152,12 +154,14 @@ github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0Bsq github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= @@ -170,6 +174,7 @@ github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmE github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -204,12 +209,13 @@ github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMX github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.2 h1:MG/Bg1pbmMb61j3wHCFWPxESXHieiKr2xG64px/k8zQ= -github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.8 h1:NmkCC1/QxyZFBny8JogwLpOy2f+VEbO/f6bV2Mqtwuw= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -242,6 +248,7 @@ github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDG github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= @@ -274,6 +281,7 @@ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -391,8 +399,9 @@ github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblf github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= @@ -431,8 +440,9 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -446,6 +456,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= @@ -548,8 +559,9 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -607,8 +619,6 @@ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0U github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= -github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= @@ -727,14 +737,17 @@ github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59P github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -835,8 +848,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU= -github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -1360,8 +1373,11 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 1d2d0db4f23ae9022868d13122385cb2312061eb Mon Sep 17 00:00:00 2001 From: Babis Kiosidis Date: Thu, 9 Dec 2021 17:44:50 +0200 Subject: [PATCH 178/645] add version to pflags (#232) --- flytectl/cmd/create/execution.go | 2 +- flytectl/cmd/create/execution_test.go | 1 + flytectl/cmd/create/execution_util.go | 3 +++ flytectl/cmd/create/executionconfig_flags.go | 2 +- .../cmd/create/executionconfig_flags_test.go | 24 +++++++++---------- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index d3e5d1c34c..bbb7d77d9e 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -148,10 +148,10 @@ type ExecutionConfig struct { Relaunch string `json:"relaunch" pflag:",execution id to be relaunched."` Recover string `json:"recover" pflag:",execution id to be recreated from the last known failure point."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Version string `json:"version" pflag:",specify version of execution workflow/task."` // Non plfag section is read from the execution config generated by get task/launchplan Workflow string `json:"workflow,omitempty"` Task string `json:"task,omitempty"` - Version string `json:"version"` Inputs map[string]interface{} `json:"inputs" pflag:"-"` } diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index 65df850ae5..49ff720f6a 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -19,6 +19,7 @@ import ( func createExecutionSetup() { ctx = testutils.Ctx mockClient = testutils.MockClient + executionConfig = &ExecutionConfig{} // TODO: migrate to new command context from testutils cmdCtx = cmdCore.NewCommandContext(mockClient, testutils.MockOutStream) sortedListLiteralType := core.Variable{ diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 0f90c7ccfe..f2f7bdd60f 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -179,6 +179,9 @@ func resolveOverrides(toBeOverridden *ExecutionConfig, project string, domain st if executionConfig.TargetDomain != "" { toBeOverridden.TargetDomain = executionConfig.TargetDomain } + if executionConfig.Version != "" { + toBeOverridden.Version = executionConfig.Version + } // Use the root project and domain to launch the task/workflow if target is unspecified if executionConfig.TargetProject == "" { toBeOverridden.TargetProject = project diff --git a/flytectl/cmd/create/executionconfig_flags.go b/flytectl/cmd/create/executionconfig_flags.go index 8dbfa9fdfe..621a53d253 100755 --- a/flytectl/cmd/create/executionconfig_flags.go +++ b/flytectl/cmd/create/executionconfig_flags.go @@ -58,8 +58,8 @@ func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&executionConfig.Relaunch, fmt.Sprintf("%v%v", prefix, "relaunch"), executionConfig.Relaunch, "execution id to be relaunched.") cmdFlags.StringVar(&executionConfig.Recover, fmt.Sprintf("%v%v", prefix, "recover"), executionConfig.Recover, "execution id to be recreated from the last known failure point.") cmdFlags.BoolVar(&executionConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), executionConfig.DryRun, "execute command without making any modifications.") + cmdFlags.StringVar(&executionConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), executionConfig.Version, "specify version of execution workflow/task.") cmdFlags.StringVar(&executionConfig.Workflow, fmt.Sprintf("%v%v", prefix, "workflow"), executionConfig.Workflow, "") cmdFlags.StringVar(&executionConfig.Task, fmt.Sprintf("%v%v", prefix, "task"), executionConfig.Task, "") - cmdFlags.StringVar(&executionConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), executionConfig.Version, "") return cmdFlags } diff --git a/flytectl/cmd/create/executionconfig_flags_test.go b/flytectl/cmd/create/executionconfig_flags_test.go index 0b301402cc..dcae9e6516 100755 --- a/flytectl/cmd/create/executionconfig_flags_test.go +++ b/flytectl/cmd/create/executionconfig_flags_test.go @@ -211,42 +211,42 @@ func TestExecutionConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_workflow", func(t *testing.T) { + t.Run("Test_version", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("workflow", testValue) - if vString, err := cmdFlags.GetString("workflow"); err == nil { - testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Workflow) + cmdFlags.Set("version", testValue) + if vString, err := cmdFlags.GetString("version"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Version) } else { assert.FailNow(t, err.Error()) } }) }) - t.Run("Test_task", func(t *testing.T) { + t.Run("Test_workflow", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("task", testValue) - if vString, err := cmdFlags.GetString("task"); err == nil { - testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Task) + cmdFlags.Set("workflow", testValue) + if vString, err := cmdFlags.GetString("workflow"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Workflow) } else { assert.FailNow(t, err.Error()) } }) }) - t.Run("Test_version", func(t *testing.T) { + t.Run("Test_task", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("version", testValue) - if vString, err := cmdFlags.GetString("version"); err == nil { - testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Version) + cmdFlags.Set("task", testValue) + if vString, err := cmdFlags.GetString("task"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.Task) } else { assert.FailNow(t, err.Error()) From c751289f0d9e4b3a8bb23601424566a1c490076d Mon Sep 17 00:00:00 2001 From: SmritiSatyanV <94349093+SmritiSatyanV@users.noreply.github.com> Date: Fri, 10 Dec 2021 10:46:15 +0530 Subject: [PATCH 179/645] Created separate rst files for every resource (noun) (#230) * Update nouns.rst * removed html links Created separate rst file for each noun and referenced it in the nouns.rst file. * Update verbs.rst * Deleted newly added rst files error with codecov, so deleted the newly added rst files. * Delete verbs.rst * Created separate rst files for every resource * Changes to files in cmd folder * Update create_test.go * cmd folders * Update cmd/create/execution.go Co-authored-by: Samhita Alla * Added verbs.rst * changes to cmd folder files /bin removed, * Update based on review * Update cmd/create/project.go Co-authored-by: Samhita Alla * Update cmd/create/create.go Co-authored-by: Samhita Alla * Update cmd/create/create_test.go Co-authored-by: Samhita Alla * Update cmd/delete/delete.go Co-authored-by: Samhita Alla * Update cmd/delete/matchable_cluster_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/delete/matchable_task_resource_attribute.go Co-authored-by: Samhita Alla * Changes to delete - matchable_plugin_override * Changes to .go files in cmd * Changed flytesnack to Flytesnack * Creates to create * Update cmd/get/launch_plan.go Co-authored-by: Samhita Alla * Changed 'launchplan' to 'launch plan' * Update cmd/register/examples.go Co-authored-by: Samhita Alla * Update cmd/register/examples.go Co-authored-by: Samhita Alla * Update cmd/register/examples.go Co-authored-by: Samhita Alla * Update cmd/register/files.go Co-authored-by: Samhita Alla * Update cmd/register/register.go Co-authored-by: Samhita Alla * Update cmd/register/register_test.go Co-authored-by: Samhita Alla * Update cmd/sandbox/sandbox.go Co-authored-by: Samhita Alla * Update cmd/sandbox/start.go Co-authored-by: Samhita Alla * Update cmd/sandbox/start.go Co-authored-by: Samhita Alla * Update cmd/sandbox/status.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_cluster_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_cluster_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_execution_cluster_label.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_execution_queue_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_plugin_override.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_task_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_workflow_execution_config.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_workflow_execution_config.go Co-authored-by: Samhita Alla * Update cmd/update/update.go Co-authored-by: Samhita Alla * Update cmd/upgrade/upgrade.go Co-authored-by: Samhita Alla * Update cmd/upgrade/upgrade.go Co-authored-by: Samhita Alla * Update cmd/version/version.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_task_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/update.go Co-authored-by: Samhita Alla * Resolved changes * Changed 'delte' to 'delete' * Updated rst files Created rst files for every noun, and linked the associated verbs with it * Trial * Removed the extra whitespace * Changed 'delte' to 'delete' Co-authored-by: Samhita Alla --- flytectl/cmd/completion.go | 2 +- flytectl/cmd/completion_test.go | 6 +- flytectl/cmd/configuration/configuration.go | 18 +++--- flytectl/cmd/create/create.go | 10 +-- flytectl/cmd/create/create_test.go | 2 +- flytectl/cmd/create/execution.go | 26 ++++---- flytectl/cmd/create/project.go | 8 +-- flytectl/cmd/delete/delete.go | 8 +-- flytectl/cmd/delete/execution.go | 21 +++---- .../matchable_cluster_resource_attribute.go | 19 +++--- .../matchable_execution_cluster_label.go | 15 +++-- .../matchable_execution_cluster_label_test.go | 4 +- .../matchable_execution_queue_attribute.go | 17 +++-- .../cmd/delete/matchable_plugin_override.go | 20 +++--- .../matchable_task_resource_attribute.go | 19 +++--- .../matchable_workflow_execution_config.go | 19 +++--- flytectl/cmd/get/execution.go | 34 +++++----- flytectl/cmd/get/get.go | 4 +- flytectl/cmd/get/get_test.go | 2 +- flytectl/cmd/get/launch_plan.go | 28 ++++----- .../matchable_cluster_resource_attribute.go | 20 +++--- .../get/matchable_execution_cluster_label.go | 19 +++--- .../matchable_execution_queue_attribute.go | 18 +++--- flytectl/cmd/get/matchable_plugin_override.go | 20 +++--- .../get/matchable_task_resource_attribute.go | 18 +++--- .../matchable_workflow_execution_config.go | 21 +++---- flytectl/cmd/get/project.go | 26 ++++---- flytectl/cmd/get/task.go | 40 ++++++------ flytectl/cmd/get/workflow.go | 30 ++++----- flytectl/cmd/register/examples.go | 12 ++-- flytectl/cmd/register/files.go | 54 ++++++++-------- flytectl/cmd/register/register.go | 8 +-- flytectl/cmd/register/register_test.go | 6 +- flytectl/cmd/root.go | 6 +- flytectl/cmd/sandbox/exec.go | 4 +- flytectl/cmd/sandbox/sandbox.go | 18 +++--- flytectl/cmd/sandbox/start.go | 14 ++--- flytectl/cmd/sandbox/status.go | 7 +-- flytectl/cmd/sandbox/teardown.go | 6 +- flytectl/cmd/update/launch_plan.go | 6 +- flytectl/cmd/update/launch_plan_meta.go | 8 +-- .../matchable_cluster_resource_attribute.go | 18 +++--- .../matchable_execution_cluster_label.go | 14 ++--- .../matchable_execution_queue_attribute.go | 18 +++--- .../cmd/update/matchable_plugin_override.go | 14 ++--- .../matchable_task_resource_attribute.go | 18 +++--- .../matchable_workflow_execution_config.go | 16 ++--- flytectl/cmd/update/project.go | 24 +++---- flytectl/cmd/update/task_meta.go | 8 +-- flytectl/cmd/update/update.go | 10 +-- flytectl/cmd/update/workflow_meta.go | 8 +-- flytectl/cmd/upgrade/upgrade.go | 14 ++--- flytectl/cmd/upgrade/upgrade_test.go | 6 +- flytectl/cmd/version/version.go | 6 +- flytectl/cmd/version/version_test.go | 6 +- .../source/cluster-resource-attribute.rst | 9 +++ flytectl/docs/source/config.rst | 10 +++ flytectl/docs/source/examples.rst | 8 +++ .../docs/source/execution-cluster-label.rst | 10 +++ .../docs/source/execution-queue-attribute.rst | 10 +++ flytectl/docs/source/execution.rst | 10 +++ flytectl/docs/source/files.rst | 10 +++ flytectl/docs/source/gen/flytectl.rst | 30 ++++----- .../docs/source/gen/flytectl_completion.rst | 10 +-- flytectl/docs/source/gen/flytectl_config.rst | 12 ++-- .../source/gen/flytectl_config_discover.rst | 8 +-- .../docs/source/gen/flytectl_config_init.rst | 24 +++---- .../source/gen/flytectl_config_validate.rst | 8 +-- flytectl/docs/source/gen/flytectl_create.rst | 16 ++--- .../source/gen/flytectl_create_execution.rst | 34 +++++----- .../source/gen/flytectl_create_project.rst | 16 ++--- flytectl/docs/source/gen/flytectl_delete.rst | 26 ++++---- ...ectl_delete_cluster-resource-attribute.rst | 27 ++++---- ...lytectl_delete_execution-cluster-label.rst | 23 ++++--- ...tectl_delete_execution-queue-attribute.rst | 25 ++++---- .../source/gen/flytectl_delete_execution.rst | 27 ++++---- .../gen/flytectl_delete_plugin-override.rst | 28 ++++----- ...lytectl_delete_task-resource-attribute.rst | 27 ++++---- ...tectl_delete_workflow-execution-config.rst | 27 ++++---- flytectl/docs/source/gen/flytectl_get.rst | 32 +++++----- ...lytectl_get_cluster-resource-attribute.rst | 28 ++++----- .../flytectl_get_execution-cluster-label.rst | 27 ++++---- ...flytectl_get_execution-queue-attribute.rst | 26 ++++---- .../source/gen/flytectl_get_execution.rst | 42 ++++++------- .../source/gen/flytectl_get_launchplan.rst | 36 +++++------ .../gen/flytectl_get_plugin-override.rst | 28 ++++----- .../docs/source/gen/flytectl_get_project.rst | 34 +++++----- .../flytectl_get_task-resource-attribute.rst | 26 ++++---- .../docs/source/gen/flytectl_get_task.rst | 48 +++++++------- ...flytectl_get_workflow-execution-config.rst | 29 +++++---- .../docs/source/gen/flytectl_get_workflow.rst | 38 ++++++------ .../docs/source/gen/flytectl_register.rst | 18 +++--- .../source/gen/flytectl_register_examples.rst | 20 +++--- .../source/gen/flytectl_register_files.rst | 62 +++++++++---------- flytectl/docs/source/gen/flytectl_sandbox.rst | 32 +++++----- .../docs/source/gen/flytectl_sandbox_exec.rst | 12 ++-- .../source/gen/flytectl_sandbox_start.rst | 22 +++---- .../source/gen/flytectl_sandbox_status.rst | 15 +++-- .../source/gen/flytectl_sandbox_teardown.rst | 14 ++--- flytectl/docs/source/gen/flytectl_update.rst | 38 ++++++------ ...ectl_update_cluster-resource-attribute.rst | 26 ++++---- ...lytectl_update_execution-cluster-label.rst | 22 +++---- ...tectl_update_execution-queue-attribute.rst | 26 ++++---- .../gen/flytectl_update_launchplan-meta.rst | 16 ++--- .../source/gen/flytectl_update_launchplan.rst | 14 ++--- .../gen/flytectl_update_plugin-override.rst | 22 +++---- .../source/gen/flytectl_update_project.rst | 32 +++++----- .../source/gen/flytectl_update_task-meta.rst | 16 ++--- ...lytectl_update_task-resource-attribute.rst | 26 ++++---- ...tectl_update_workflow-execution-config.rst | 24 +++---- .../gen/flytectl_update_workflow-meta.rst | 16 ++--- flytectl/docs/source/gen/flytectl_upgrade.rst | 22 +++---- flytectl/docs/source/gen/flytectl_version.rst | 14 ++--- flytectl/docs/source/launchplan.rst | 9 +++ flytectl/docs/source/nouns.rst | 60 ++++++------------ flytectl/docs/source/plugin-override.rst | 10 +++ flytectl/docs/source/project.rst | 10 +++ flytectl/docs/source/sandbox.rst | 11 ++++ .../docs/source/task-resource-attribute.rst | 11 ++++ flytectl/docs/source/task.rst | 8 +++ flytectl/docs/source/verbs.rst | 22 +++---- .../docs/source/workflow-execution-config.rst | 10 +++ flytectl/docs/source/workflow.rst | 8 +++ flytectl/pkg/configutil/configutil.go | 8 +-- flytectl/pkg/util/util_test.go | 14 ++--- flytectl/proposal/README.md | 10 +-- 126 files changed, 1225 insertions(+), 1127 deletions(-) create mode 100644 flytectl/docs/source/cluster-resource-attribute.rst create mode 100644 flytectl/docs/source/config.rst create mode 100644 flytectl/docs/source/examples.rst create mode 100644 flytectl/docs/source/execution-cluster-label.rst create mode 100644 flytectl/docs/source/execution-queue-attribute.rst create mode 100644 flytectl/docs/source/execution.rst create mode 100644 flytectl/docs/source/files.rst create mode 100644 flytectl/docs/source/launchplan.rst create mode 100644 flytectl/docs/source/plugin-override.rst create mode 100644 flytectl/docs/source/project.rst create mode 100644 flytectl/docs/source/sandbox.rst create mode 100644 flytectl/docs/source/task-resource-attribute.rst create mode 100644 flytectl/docs/source/task.rst create mode 100644 flytectl/docs/source/workflow-execution-config.rst create mode 100644 flytectl/docs/source/workflow.rst diff --git a/flytectl/cmd/completion.go b/flytectl/cmd/completion.go index 7c705c2e00..ceeb07643a 100644 --- a/flytectl/cmd/completion.go +++ b/flytectl/cmd/completion.go @@ -40,7 +40,7 @@ Bash: Zsh: # If shell completion is not already enabled in your environment, - # you will need to enable it. You can execute the following once: + # you will need to enable it. You can execute the following once: $ echo "autoload -U compinit; compinit" >> ~/.zshrc diff --git a/flytectl/cmd/completion_test.go b/flytectl/cmd/completion_test.go index 3fd8ae01b1..71eab97dc9 100644 --- a/flytectl/cmd/completion_test.go +++ b/flytectl/cmd/completion_test.go @@ -9,9 +9,9 @@ import ( func TestCompletionCmdIntegration(t *testing.T) { rootCmd := &cobra.Command{ - Long: "flytectl is CLI tool written in go to interact with flyteadmin service", - Short: "flyetcl CLI tool", - Use: "flytectl", + Long: "FlyteCTL is CLI tool written in go to interact with Flyteadmin service", + Short: "FlyteCTL CLI tool", + Use: "FlyteCTL", DisableAutoGenTag: true, } diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index e47ff2ff81..cbf0b8bf36 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -22,27 +22,27 @@ import ( "github.com/spf13/cobra" ) -// Long descriptions are whitespace sensitive when generating docs using sphinx. +// Long descriptions are whitespace sensitive when generating docs using Sphinx. const ( - initCmdShort = `Generates flytectl config file in the user's home directory.` - initCmdLong = `Creates a flytectl config file in flyte directory i.e ~/.flyte + initCmdShort = `Generates FlyteCTL config file in the user's home directory.` + initCmdLong = `Creates a FlyteCTL config file in Flyte directory i.e ~/.flyte -Generate sandbox config. Flyte Sandbox is a fully standalone minimal environment for running Flyte. Read more about sandbox https://docs.flyte.org/en/latest/deployment/sandbox.html +Generates sandbox config. Flyte Sandbox is a fully standalone minimal environment for running Flyte. Read more about sandbox https://docs.flyte.org/en/latest/deployment/sandbox.html :: - bin/flytectl configuration config + flytectl configuration config -Generate remote cluster config. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html +Generates remote cluster config. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html :: - bin/flytectl configuration config --host=flyte.myexample.com + flytectl configuration config --host=flyte.myexample.com -Generate flytectl config with a storage provider +Generates FlyteCTL config with a storage provider :: - bin/flytectl configuration config --host=flyte.myexample.com --storage + flytectl configuration config --host=flyte.myexample.com --storage ` ) diff --git a/flytectl/cmd/create/create.go b/flytectl/cmd/create/create.go index 5868b91c97..54ad53cf22 100644 --- a/flytectl/cmd/create/create.go +++ b/flytectl/cmd/create/create.go @@ -6,18 +6,18 @@ import ( "github.com/spf13/cobra" ) -// Long descriptions are whitespace sensitive when generating docs using sphinx. +// Long descriptions are whitespace sensitive when generating docs using Sphinx. const ( - createCmdShort = `Used for creating various flyte resources including tasks/workflows/launchplans/executions/project.` + createCmdShort = `Create various Flyte resources including tasks/workflows/launchplans/executions/project.` createCmdLong = ` -Example create. +Create Flyte resource; if a project: :: - bin/flytectl create project --file project.yaml + flytectl create project --file project.yaml ` ) -// RemoteCreateCommand will return create flyte resource commands +// RemoteCreateCommand will return create Flyte resource commands func RemoteCreateCommand() *cobra.Command { createCmd := &cobra.Command{ Use: "create", diff --git a/flytectl/cmd/create/create_test.go b/flytectl/cmd/create/create_test.go index d2e4711a31..a33201cf12 100644 --- a/flytectl/cmd/create/create_test.go +++ b/flytectl/cmd/create/create_test.go @@ -27,7 +27,7 @@ var tearDownAndVerify = testutils.TearDownAndVerify func TestCreateCommand(t *testing.T) { createCommand := RemoteCreateCommand() assert.Equal(t, createCommand.Use, "create") - assert.Equal(t, createCommand.Short, "Used for creating various flyte resources including tasks/workflows/launchplans/executions/project.") + assert.Equal(t, createCommand.Short, "Create various Flyte resources including tasks/workflows/launchplans/executions/project.") assert.Equal(t, len(createCommand.Commands()), 2) cmdNouns := createCommand.Commands() // Sort by Use value. diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index bbb7d77d9e..263046389e 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -13,22 +13,22 @@ import ( const ( executionShort = "Create execution resources" executionLong = ` -Create the executions for given workflow/task in a project and domain. +Creates executions for a given workflow/task in a project and domain. -There are three steps in generating an execution. +There are three steps in generating an execution: - Generate the execution spec file using the get command. - Update the inputs for the execution if needed. - Run the execution by passing in the generated yaml file. -The spec file should be generated first and then run the execution using the spec file. -You can reference the flytectl get task for more details +The spec file should be generated first and then, the execution should be run using the spec file. +You can reference the FlyteCTL get task for more details. :: flytectl get tasks -d development -p flytectldemo core.advanced.run_merge_sort.merge --version v2 --execFile execution_spec.yaml -The generated file would look similar to this +The generated file would look similar to this: .. code-block:: yaml @@ -65,35 +65,35 @@ The generated file can be modified to change the input values. task: core.advanced.run_merge_sort.merge version: "v2" -And then can be passed through the command line. -Notice the source and target domain/projects can be different. -The root project and domain flags of -p and -d should point to task/launch plans project/domain. +It can then be passed through the command line. +Notice that the source and target domain/projects can be different. +The root project and domain flags of -p and -d should point to the task/launch plans project/domain. :: flytectl create execution --execFile execution_spec.yaml -p flytectldemo -d development --targetProject flytesnacks -Also an execution can be relaunched by passing in current execution id. +Also, an execution can be relaunched by passing in the current execution id. :: flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development -An execution can be recovered, that is recreated from the last known failure point for a previously-run workflow execution. +An execution can be recovered, i.e., recreated from the last known failure point for previously-run workflow execution. See :ref:` + "`ref_flyteidl.admin.ExecutionRecoverRequest`" + ` for more details. :: flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytectldemo -d development -Generic data types are also supported for execution in similar way.Following is sample of how the inputs need to be specified while creating the execution. -As usual the spec file should be generated first and then run the execution using the spec file. +Generic data types are also supported for execution in a similar manner. Following is a sample of how the inputs need to be specified while creating the execution. +The spec file should be generated first and then, the execution should be run using the spec file. :: flytectl get task -d development -p flytectldemo core.type_system.custom_objects.add --execFile adddatanum.yaml -The generated file would look similar to this. Here you can see empty values dumped for generic data type x and y. +The generated file would look similar to this. Here, empty values have been dumped for generic data type x and y. :: diff --git a/flytectl/cmd/create/project.go b/flytectl/cmd/create/project.go index 06c039c529..dec5a7322d 100644 --- a/flytectl/cmd/create/project.go +++ b/flytectl/cmd/create/project.go @@ -15,16 +15,16 @@ import ( const ( projectShort = "Create project resources" projectLong = ` -Create the projects.(project,projects can be used interchangeably in these commands) +Create projects.(project/projects can be used interchangeably in these commands) :: - bin/flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte + flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte -Create Project by definition file. Note: The name shouldn't contain any whitespace characters' +Create a project by definition file. Note: The name shouldn't contain any whitespace characters. :: - bin/flytectl create project --file project.yaml + flytectl create project --file project.yaml .. code-block:: yaml diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index 9a489abb65..14969e9aeb 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -13,14 +13,14 @@ import ( "github.com/spf13/cobra" ) -// Long descriptions are whitespace sensitive when generating docs using sphinx. +// Long descriptions are whitespace sensitive when generating docs using Sphinx. const ( - deleteCmdShort = `Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project.` + deleteCmdShort = `Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project.` deleteCmdLong = ` -Example Delete executions. +Delete a resource; if an execution: :: - bin/flytectl delete execution kxd1i72850 -d development -p flytesnacks + flytectl delete execution kxd1i72850 -d development -p flytesnacks ` ) diff --git a/flytectl/cmd/delete/execution.go b/flytectl/cmd/delete/execution.go index 4b41181852..12a0e268fc 100644 --- a/flytectl/cmd/delete/execution.go +++ b/flytectl/cmd/delete/execution.go @@ -11,42 +11,41 @@ import ( "github.com/flyteorg/flytestdlib/logger" ) -// Long descriptions are whitespace sensitive when generating docs using sphinx. +// Long descriptions are whitespace sensitive when generating docs using Sphinx. const ( execCmdShort = `Terminate/Delete execution resources.` execCmdLong = ` Terminate executions.(execution,executions can be used interchangeably in these commands) -Task executions can be aborted only if they are in non-terminal state i.e if they are FAILED,ABORTED or SUCCEEDED then -calling terminate on them has no effect. +Task executions can be aborted only if they are in non-terminal state. If they are FAILED, ABORTED or SUCCEEDED, calling terminate on them has no effect. -Terminate a single execution with its name +Terminate a single execution with its name: :: - bin/flytectl delete execution c6a51x2l9e -d development -p flytesnacks + flytectl delete execution c6a51x2l9e -d development -p flytesnacks -You can get executions to check its state. +Get executions to check its state: :: - bin/flytectl get execution -d development -p flytesnacks + flytectl get execution -d development -p flytesnacks ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | c6a51x2l9e | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:13:04.680476300Z | 15.540361300s | ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- -Terminate multiple executions with there names +Terminate multiple executions with their names: :: - bin/flytectl delete execution eeam9s8sny p4wv4hwgc4 -d development -p flytesnacks + flytectl delete execution eeam9s8sny p4wv4hwgc4 -d development -p flytesnacks -Similarly you can get executions to find the state of previously terminated executions. +Get executions to find the state of previously terminated executions: :: - bin/flytectl get execution -d development -p flytesnacks + flytectl get execution -d development -p flytesnacks ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go index c6f71fec35..8b4b6fb4dc 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go @@ -11,21 +11,20 @@ import ( ) const ( - clusterResourceAttributesShort = "Deletes matchable resources of cluster attributes" + clusterResourceAttributesShort = "Delete matchable resources of cluster attributes" clusterResourceAttributesLong = ` -Deletes cluster resource attributes for given project and domain combination or additionally with workflow name. +Deletes cluster resource attributes for the given project and domain combination or additionally with workflow name. -Deletes cluster resource attribute for project and domain -Here the command delete cluster resource attributes for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete cluster-resource-attribute -p flytectldemo -d development -Deletes cluster resource attribute using config file which was used for creating it. -Here the command deletes cluster resource attributes from the config file cra.yaml -Attributes are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of cra.yaml which will use the project domain and workflow name for deleting the resource +Deletes cluster resource attribute using config file which was used to create it. +Here, the config file is written to cra.yaml. +Attributes are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. +e.g., content of cra.yaml: :: @@ -40,8 +39,8 @@ eg: content of cra.yaml which will use the project domain and workflow name for foo: "bar" buzz: "lightyear" -Deletes cluster resource attribute for a workflow -Here the command deletes cluster resource attributes for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes cluster resource attribute for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label.go b/flytectl/cmd/delete/matchable_execution_cluster_label.go index 4149b5e18b..e8ed9c04ae 100644 --- a/flytectl/cmd/delete/matchable_execution_cluster_label.go +++ b/flytectl/cmd/delete/matchable_execution_cluster_label.go @@ -11,21 +11,20 @@ import ( ) const ( - executionClusterLabelShort = "Deletes matchable resources of execution cluster label" + executionClusterLabelShort = "Delete matchable resources of execution cluster label" executionClusterLabelLong = ` Deletes execution cluster label for given project and domain combination or additionally with workflow name. -Deletes execution cluster label for project and domain -Here the command delete execution cluster label for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete execution-cluster-label -p flytectldemo -d development Deletes execution cluster label using config file which was used for creating it. -Here the command deletes execution cluster label from the config file ecl.yaml -Value is optional in the file as its unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of ecl.yaml which will use the project domain and workflow name for deleting the resource +Here, the config file is written to ecl.yaml. +Value is optional in the file as it is unread during the delete command but it can be kept since the same file can be used for get, update or delete commands. +e.g., content of ecl.yaml: :: @@ -38,8 +37,8 @@ eg: content of ecl.yaml which will use the project domain and workflow name for project: flytectldemo value: foo -Deletes execution cluster label for a workflow -Here the command deletes execution cluster label for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes execution cluster label for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label_test.go b/flytectl/cmd/delete/matchable_execution_cluster_label_test.go index fe90153dbf..834e5afb66 100644 --- a/flytectl/cmd/delete/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/delete/matchable_execution_cluster_label_test.go @@ -40,10 +40,10 @@ func TestDeleteExecutionClusterLabels(t *testing.T) { deleteExecutionClusterLabelSetup() // No args implying project domain attribute deletion u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) + mock.Anything).Return(fmt.Errorf("failed to delete project domain attributes")) err = deleteExecutionClusterLabel(ctx, args, cmdCtx) assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) + assert.Equal(t, fmt.Errorf("failed to delete project domain attributes"), err) u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute.go b/flytectl/cmd/delete/matchable_execution_queue_attribute.go index 6bc5a47aae..d3b77a62c5 100644 --- a/flytectl/cmd/delete/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute.go @@ -11,21 +11,20 @@ import ( ) const ( - executionQueueAttributesShort = "Deletes matchable resources of execution queue attributes" + executionQueueAttributesShort = "Delete matchable resources of execution queue attributes" executionQueueAttributesLong = ` -Deletes execution queue attributes for given project and domain combination or additionally with workflow name. +Deletes execution queue attributes for the given project and domain combination or additionally with workflow name. -Deletes execution queue attribute for project and domain -Here the command delete execution queue attributes for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete execution-queue-attribute -p flytectldemo -d development Deletes execution queue attribute using config file which was used for creating it. -Here the command deletes execution queue attributes from the config file era.yaml -Tags are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of era.yaml which will use the project domain and workflow name for deleting the resource +Here, the config file is written to era.yaml. +Value is optional in the file as it is unread during the delete command but it can be kept since the same file can be used for get, update or delete commands. +e.g., content of era.yaml: :: @@ -42,8 +41,8 @@ eg: content of era.yaml which will use the project domain and workflow name for - buzz - lightyear -Deletes execution queue attribute for a workflow -Here the command deletes the execution queue attributes for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes execution queue attribute for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: diff --git a/flytectl/cmd/delete/matchable_plugin_override.go b/flytectl/cmd/delete/matchable_plugin_override.go index edbe826a82..80b46b35db 100644 --- a/flytectl/cmd/delete/matchable_plugin_override.go +++ b/flytectl/cmd/delete/matchable_plugin_override.go @@ -11,22 +11,20 @@ import ( ) const ( - pluginOverrideShort = "Deletes matchable resources of plugin overrides" + pluginOverrideShort = "Delete matchable resources of plugin overrides" pluginOverrideLong = ` -Deletes plugin override for given project and domain combination or additionally with workflow name. +Deletes plugin override for the given project and domain combination or additionally with workflow name. -Deletes plugin override for project and domain -Here the command deletes plugin override for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete plugin-override -p flytectldemo -d development -Deletes plugin override using config file which was used for creating it. -Here the command deletes plugin overrides from the config file po.yaml -Overrides are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of po.yaml which will use the project domain and workflow name for deleting the resource - +Deletes plugin override using config file which was used to create it. +Here, the config file is written to po.yaml. +Overrides are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. +e.g., content of po.yaml: :: flytectl delete plugin-override --attrFile po.yaml @@ -43,8 +41,8 @@ eg: content of po.yaml which will use the project domain and workflow name for - plugin_override2 missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT -Deletes plugin override for a workflow -Here the command deletes the plugin override for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes plugin override for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute.go b/flytectl/cmd/delete/matchable_task_resource_attribute.go index 01af86bb6d..90cd11e48f 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute.go @@ -11,21 +11,20 @@ import ( ) const ( - taskResourceAttributesShort = "Deletes matchable resources of task attributes" + taskResourceAttributesShort = "Delete matchable resources of task attributes" taskResourceAttributesLong = ` -Deletes task resource attributes for given project,domain combination or additionally with workflow name. +Deletes task resource attributes for the given project and domain combination, or additionally with workflow name. -Deletes task resource attribute for project and domain -Here the command delete task resource attributes for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete task-resource-attribute -p flytectldemo -d development -Deletes task resource attribute using config file which was used for creating it. -Here the command deletes task resource attributes from the config file tra.yaml -defaults/limits are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of tra.yaml which will use the project domain and workflow name for deleting the resource +Deletes task resource attribute using config file which was used to create it. +Here, the config file is written to tra.yaml. +The defaults/limits are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. +e.g., content of tra.yaml: :: @@ -43,8 +42,8 @@ eg: content of tra.yaml which will use the project domain and workflow name for cpu: "2" memory: "450Mi" -Deletes task resource attribute for a workflow -Here the command deletes task resource attributes for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes task resource attribute for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config.go b/flytectl/cmd/delete/matchable_workflow_execution_config.go index fb9d6d5c6b..ee9b612712 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config.go @@ -12,21 +12,20 @@ import ( ) const ( - workflowExecutionConfigShort = "Deletes matchable resources of workflow execution config" + workflowExecutionConfigShort = "Delete matchable resources of workflow execution config" workflowExecutionConfigLong = ` -Deletes workflow execution config for given project and domain combination or additionally with workflow name. +Deletes workflow execution config for the given project and domain combination or additionally with workflow name. -Deletes workflow execution config label for project and domain -Here the command delete workflow execution config for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete workflow-execution-config -p flytectldemo -d development -Deletes workflow execution config using config file which was used for creating it. -Here the command deletes workflow execution config from the config file wec.yaml -Max_parallelism is optional in the file as its unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of wec.yaml which will use the project domain and workflow name for deleting the resource +Deletes workflow execution config using config file which was used to create it. +Here, the config file is written to wec.yaml. +Max_parallelism is optional in the file as it is unread during the delete command but can be kept since the same file can be used for get, update or delete commands. +e.g., content of wec.yaml: :: @@ -39,8 +38,8 @@ eg: content of wec.yaml which will use the project domain and workflow name for project: flytectldemo max_parallelism: 5 -Deletes workflow execution config for a workflow -Here the command deletes workflow execution config for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes workflow execution config for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 3cda9d4925..3dcf3f34ae 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -15,67 +15,67 @@ import ( ) const ( - executionShort = "Gets execution resources" + executionShort = "Get execution resources" executionLong = ` -Retrieve all executions within the project and domain (execution, executions can be used interchangeably). +Retrieve all executions within the project and domain (execution, executions can be used interchangeably): :: - bin/flytectl get execution -p flytesnacks -d development + flytectl get execution -p flytesnacks -d development -Retrieves executions by name within the project and domain. +Retrieve executions by name within the project and domain: :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r + flytectl get execution -p flytesnacks -d development oeh94k9r2r -Retrieves all the executions with filters. +Retrieve all the executions with filters: :: - bin/flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" + flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" -Retrieve executions as per the specified limit and sorting parameters. +Retrieve executions as per the specified limit and sorting parameters: :: - bin/flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc + flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieve executions within the project and domain in YAML format. +Retrieve executions within the project and domain in YAML format: :: - bin/flytectl get execution -p flytesnacks -d development -o yaml + flytectl get execution -p flytesnacks -d development -o yaml -Retrieve executions within the project and domain in JSON format. +Retrieve executions within the project and domain in JSON format: :: - bin/flytectl get execution -p flytesnacks -d development -o json + flytectl get execution -p flytesnacks -d development -o json Get more details of the execution using the --details flag, which shows node and task executions. The default view is a tree view, and the TABLE view format is not supported on this view. :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details + flytectl get execution -p flytesnacks -d development oeh94k9r2r --details Fetch execution details in YAML format. In this view, only node details are available. For task, send the --nodeID flag. :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml + flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml Fetch task executions on a specific node using the --nodeID flag. Use the nodeID attribute given by the node details view. :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodeID n0 + flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodeID n0 Task execution view is also available in YAML/JSON format. The following example showcases YAML, where the output also contains input and output data of each node. :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 -o yaml + flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 -o yaml Usage ` diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index e6b750e2f5..181444afec 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -19,9 +19,9 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - getCmdShort = `Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project.` + getCmdShort = `Fetch various Flyte resources including tasks/workflows/launchplans/executions/project.` getCmdLong = ` -Example get projects. +For project, it is: :: flytectl get project diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index c6bce31c54..bf22c762f1 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -40,7 +40,7 @@ const ( func TestCreateGetCommand(t *testing.T) { getCommand := CreateGetCommand() assert.Equal(t, getCommand.Use, "get") - assert.Equal(t, getCommand.Short, "Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project.") + assert.Equal(t, getCommand.Short, "Fetch various Flyte resources including tasks/workflows/launchplans/executions/project.") fmt.Println(getCommand.Commands()) assert.Equal(t, len(getCommand.Commands()), 11) cmdNouns := getCommand.Commands() diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 79aa4822b3..531504d41c 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -14,62 +14,62 @@ import ( ) const ( - launchPlanShort = "Gets launch plan resources" + launchPlanShort = "Get launch plan resources" launchPlanLong = ` -Retrieve all launch plans within the project and domain (launchplan, launchplans can be used interchangeably). +Retrieve all launch plans within the project and domain (launch plan, launch plans can be used interchangeably): :: flytectl get launchplan -p flytesnacks -d development - Retrieve a launch plan by name within the project and domain. + Retrieve a launch plan by name within the project and domain: :: flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet -Retrieve the latest version of the task by name within the project and domain. +Retrieve the latest version of the task by name within the project and domain: :: flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --latest -Retrieves a particular version of the launch plan by name within the project and domain. +Retrieve a particular version of the launch plan by name within the project and domain: :: flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --version v2 -Retrieves all the launch plans with filters. +Retrieve all the launch plans with filters: :: - bin/flytectl get launchplan -p flytesnacks -d development --filter.fieldSelector="name=core.basic.lp.go_greet" + flytectl get launchplan -p flytesnacks -d development --filter.fieldSelector="name=core.basic.lp.go_greet" -Retrieves launch plans entity search across all versions with filters. +Retrieve launch plans entity search across all versions with filters: :: - bin/flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="version=v1" + flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="version=v1" -Retrieves all the launch plans with limit and sorting. +Retrieve all the launch plans with limit and sorting: :: - bin/flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc + flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all launch plans within the project and domain in YAML format. +Retrieve all launch plans within the project and domain in YAML format: :: flytectl get launchplan -p flytesnacks -d development -o yaml -Retrieves all launch plans the within the project and domain in JSON format. +Retrieve all launch plans the within the project and domain in JSON format: :: flytectl get launchplan -p flytesnacks -d development -o json -Retrieve a launch plan within the project and domain as per a version and generate the execution spec file; the file can be used to launch the execution using the 'create execution' command. +Retrieve a launch plan within the project and domain as per a version and generate the execution spec file; the file can be used to launch the execution using the 'create execution' command: :: diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute.go b/flytectl/cmd/get/matchable_cluster_resource_attribute.go index 7750a30ee2..9682ec271d 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute.go @@ -11,35 +11,35 @@ import ( ) const ( - clusterResourceAttributesShort = "Gets matchable resources of cluster resource attributes." + clusterResourceAttributesShort = "Get matchable resources of cluster resource attributes." clusterResourceAttributesLong = ` -Retrieve cluster resource attributes for the given project and domain. -Here, the command gets cluster resource attributes for the project flytectldemo and development domain. +Retrieves cluster resource attributes for the given project and domain. +For project flytectldemo and development domain, it is: :: flytectl get cluster-resource-attribute -p flytectldemo -d development -eg : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} -Retrieve cluster resource attributes for the given project, domain, and workflow. -Here, the command gets cluster resource attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. +Retrieves cluster resource attributes for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} -Writes the cluster resource attributes to a file. If there are no cluster resource attributes,the command throws an error. -Here, the command gets the task resource attributes and writes the config file to cra.yaml file. -eg: content of cra.yaml +Writes the cluster resource attributes to a file. If there are no cluster resource attributes, the command throws an error. +Here, the config file is written to cra.yaml file: +e.g., content of cra.yaml :: diff --git a/flytectl/cmd/get/matchable_execution_cluster_label.go b/flytectl/cmd/get/matchable_execution_cluster_label.go index 8a5227d736..a8ebb50514 100644 --- a/flytectl/cmd/get/matchable_execution_cluster_label.go +++ b/flytectl/cmd/get/matchable_execution_cluster_label.go @@ -11,37 +11,36 @@ import ( ) const ( - executionClusterLabelShort = "Gets matchable resources of execution cluster label." + executionClusterLabelShort = "Get matchable resources of execution cluster label." executionClusterLabelLong = ` -// Retrieves the execution cluster label for a given project and domain, combination or additionally with workflow name. +Retrieves the execution cluster label for a given project and domain, combination or additionally with workflow name. -Retrieve the execution cluster label for the given project and domain. -Here the command get execution cluster label for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl get execution-cluster-label -p flytectldemo -d development -e.g. : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","value":"foo"} Retrieve the execution cluster label for the given project, domain and workflow. -Here, the command gets the execution cluster label for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: flytectl get execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","value":"foo"} -Writes the execution cluster label to a file. If there is no execution cluster label, command throws an error. -Here, the command gets the execution cluster label and writes the config file to ecl.yaml file. -eg: content of ecl.yaml +Write the execution cluster label to a file. If there is no execution cluster label, the command throws an error. +Here, the config file is written to ecl.yaml, +e.g., content of ecl.yaml: :: diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute.go b/flytectl/cmd/get/matchable_execution_queue_attribute.go index 0fea10ee56..34b73c139e 100644 --- a/flytectl/cmd/get/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/get/matchable_execution_queue_attribute.go @@ -11,35 +11,35 @@ import ( ) const ( - executionQueueAttributesShort = "Gets matchable resources of execution queue attributes" + executionQueueAttributesShort = "Get matchable resources of execution queue attributes" executionQueueAttributesLong = ` -Retrieve the execution queue attribute for the given project and domain. -Here, the command gets execution queue attributes for the project flytectldemo and development domain. +Retrieves the execution queue attribute for the given project and domain. +For project flytectldemo and development domain, it is: :: flytectl get execution-queue-attribute -p flytectldemo -d development -e.g. : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} -Retrieve the execution queue attribute for the given project, domain, and workflow. -Here, the command gets execution queue attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. +Retrieves the execution queue attribute for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g. : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","tags":["foo", "bar"]} Write the execution queue attribute to a file. If there are no execution queue attributes, the command throws an error. -Here, the command gets the execution queue attributes and writes the config to era.yaml file. -e.g. : content of era.yaml +Here, the config file is written to era.yaml, +e.g., content of era.yaml: :: diff --git a/flytectl/cmd/get/matchable_plugin_override.go b/flytectl/cmd/get/matchable_plugin_override.go index 8c8f5986dc..eb8e0fdd0c 100644 --- a/flytectl/cmd/get/matchable_plugin_override.go +++ b/flytectl/cmd/get/matchable_plugin_override.go @@ -11,16 +11,16 @@ import ( ) const ( - pluginOverrideShort = "Gets matchable resources of plugin override" + pluginOverrideShort = "Get matchable resources of plugin override" pluginOverrideLong = ` -Retrieve the plugin overrides for the given project and domain. -Here, the command gets the plugin overrides for the project flytectldemo and development domain. +Retrieves the plugin override for the given project and domain. +For project flytectldemo and development domain, it is: :: flytectl get plugin-override -p flytectldemo -d development -e.g. : output from the command +e.g., output from the command .. code-block:: json @@ -34,14 +34,14 @@ e.g. : output from the command }] } -Retrieves the plugin overrides for project, domain and workflow -Here the command gets the plugin overrides for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieves the plugin override for the given project, domain and workflow. +For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: flytectl get plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g. : output from the command +e.g., output from the command: .. code-block:: json @@ -56,9 +56,9 @@ e.g. : output from the command }] } -Writing the plugin overrides to a file. If there are no plugin overrides, command would return an error. -Here the command gets plugin overrides and writes the config file to po.yaml -eg: content of po.yaml +Write plugin overrides to a file. If there are no plugin overrides, the command returns an error. +Here, the config file is written to po.yaml, +e.g., content of po.yaml: :: diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go index 2c27bb6f46..6636976350 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -11,27 +11,27 @@ import ( ) const ( - taskResourceAttributesShort = "Gets matchable resources of task attributes" + taskResourceAttributesShort = "Get matchable resources of task attributes" taskResourceAttributesLong = ` -Retrieve task resource attributes for the given project and domain. -Here, the command gets the task resource attributes for the project flytectldemo and development domain. +Retrieves task resource attributes for the given project and domain. +For project flytectldemo and development domain, it is: :: flytectl get task-resource-attribute -p flytectldemo -d development -e.g. : output from the command +e.g., output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} -Retrieve task resource attributes for the given project, domain, and workflow. -Here, the command gets task resource attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. +Retrieves task resource attributes for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g. : output from the command +e.g., output from the command: .. code-block:: json @@ -39,8 +39,8 @@ e.g. : output from the command Write the task resource attributes to a file. If there are no task resource attributes, a file would be populated with the basic data. -Here the command gets task resource attributes and writes the config file to tra.yaml -e.g. : content of tra.yaml +Here, the config file is written to tra.yaml, +e.g., content of tra.yaml: :: diff --git a/flytectl/cmd/get/matchable_workflow_execution_config.go b/flytectl/cmd/get/matchable_workflow_execution_config.go index 1afbc4324f..afb1d3b0f8 100644 --- a/flytectl/cmd/get/matchable_workflow_execution_config.go +++ b/flytectl/cmd/get/matchable_workflow_execution_config.go @@ -12,18 +12,17 @@ import ( ) const ( - workflowExecutionConfigShort = "Gets matchable resources of workflow execution config" + workflowExecutionConfigShort = "Get matchable resources of workflow execution config" workflowExecutionConfigLong = ` -Retrieves workflow execution config for given project and domain combination or additionally with workflow name. +Retrieves workflow execution config for the given project and domain combination or additionally with workflow name. -Retrieves workflow execution config for project and domain -Here the command get workflow execution config for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl get workflow-execution-config -p flytectldemo -d development -eg : output from the command +e.g., output from the command .. code-block:: json @@ -33,14 +32,14 @@ eg : output from the command "max_parallelism": 5 } -Retrieves workflow execution config for project and domain and workflow -Here the command get workflow execution config for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieves workflow execution config for the project, domain and workflow. +For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: flytectl get workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g., output from the command .. code-block:: json @@ -51,9 +50,9 @@ eg : output from the command "max_parallelism": 5 } -Writing the workflow execution config to a file. If there are no workflow execution config, command would return an error. -Here the command gets workflow execution config and writes the config file to wec.yaml -eg: content of wec.yaml +Writing the workflow execution config to a file. If there are no workflow execution config, the command would return an error. +Here, the config file is written to wec.yaml, +e.g., content of wec.yaml: :: diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 10148a1c07..4912d4b5fc 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -15,40 +15,40 @@ import ( ) const ( - projectShort = "Gets project resources" + projectShort = "Get project resources" projectLong = ` -Retrieves all the projects.(project,projects can be used interchangeably in these commands) +Retrieve all the projects. (project,projects can be used interchangeably in these commands): :: - bin/flytectl get project + flytectl get project -Retrieves project by name +Retrieve project by name: :: - bin/flytectl get project flytesnacks + flytectl get project flytesnacks -Retrieves all the projects with filters. +Retrieve all the projects with filters: :: - bin/flytectl get project --filter.fieldSelector="project.name=flytesnacks" + flytectl get project --filter.fieldSelector="project.name=flytesnacks" -Retrieves all the projects with limit and sorting. +Retrieve all the projects with limit and sorting: :: - bin/flytectl get project --filter.sortBy=created_at --filter.limit=1 --filter.asc + flytectl get project --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the projects in yaml format +Retrieve all the projects in yaml format: :: - bin/flytectl get project -o yaml + flytectl get project -o yaml -Retrieves all the projects in json format +Retrieve all the projects in json format: :: - bin/flytectl get project -o json + flytectl get project -o json Usage ` diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 63b490ae82..c1f103dea4 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -14,64 +14,64 @@ import ( ) const ( - taskShort = "Gets task resources" + taskShort = "Get task resources" taskLong = ` -Retrieves all the task within project and domain.(task,tasks can be used interchangeably in these commands) +Retrieve all the tasks within project and domain(task,tasks can be used interchangeably in these commands): :: - bin/flytectl get task -p flytesnacks -d development + flytectl get task -p flytesnacks -d development -Retrieves task by name within project and domain. +Retrieve task by name within project and domain: :: - bin/flytectl task -p flytesnacks -d development core.basic.lp.greet + flytectl task -p flytesnacks -d development core.basic.lp.greet -Retrieves latest version of task by name within project and domain. +Retrieve latest version of task by name within project and domain: :: flytectl get task -p flytesnacks -d development core.basic.lp.greet --latest -Retrieves particular version of task by name within project and domain. +Retrieve particular version of task by name within project and domain: :: flytectl get task -p flytesnacks -d development core.basic.lp.greet --version v2 -Retrieves all the tasks with filters. +Retrieve all the tasks with filters: :: - bin/flytectl get task -p flytesnacks -d development --filter.fieldSelector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" + flytectl get task -p flytesnacks -d development --filter.fieldSelector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" -Retrieve a specific task with filters. +Retrieve a specific task with filters: :: - bin/flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.fieldSelector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" + flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.fieldSelector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" -Retrieves all the task with limit and sorting. +Retrieve all the tasks with limit and sorting: :: - bin/flytectl get -p flytesnacks -d development task --filter.sortBy=created_at --filter.limit=1 --filter.asc + flytectl get -p flytesnacks -d development task --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the tasks within project and domain in yaml format. +Retrieve all the tasks within project and domain in yaml format: :: - bin/flytectl get task -p flytesnacks -d development -o yaml + flytectl get task -p flytesnacks -d development -o yaml -Retrieves all the tasks within project and domain in json format. +Retrieve all the tasks within project and domain in json format: :: - bin/flytectl get task -p flytesnacks -d development -o json + flytectl get task -p flytesnacks -d development -o json -Retrieves a tasks within project and domain for a version and generate the execution spec file for it to be used for launching the execution using create execution. +Retrieve tasks within project and domain for a version and generate the execution spec file for it to be used for launching the execution using create execution: :: - bin/flytectl get tasks -d development -p flytesnacks core.advanced.run_merge_sort.merge --execFile execution_spec.yaml --version v2 + flytectl get tasks -d development -p flytesnacks core.advanced.run_merge_sort.merge --execFile execution_spec.yaml --version v2 -The generated file would look similar to this +The generated file would look similar to this: .. code-block:: yaml diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 2670b7f10d..0b80e652e3 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -16,65 +16,65 @@ import ( ) const ( - workflowShort = "Gets workflow resources" + workflowShort = "Get workflow resources" workflowLong = ` -Retrieves all the workflows within project and domain.(workflow,workflows can be used interchangeably in these commands) +Retrieve all the workflows within project and domain (workflow,workflows can be used interchangeably in these commands): :: flytectl get workflow -p flytesnacks -d development -Retrieves workflow by name within project and domain. +Retrieve workflow by name within project and domain: :: flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet -Retrieves latest version of workflow by name within project and domain. +Retrieve latest version of workflow by name within project and domain: :: flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet --latest -Retrieves particular version of workflow by name within project and domain. +Retrieve particular version of workflow by name within project and domain: :: flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet --version v2 -Retrieves all the workflows with filters. +Retrieve all the workflows with filters: :: - bin/flytectl get workflow -p flytesnacks -d development --filter.fieldSelector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" + flytectl get workflow -p flytesnacks -d development --filter.fieldSelector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" -Retrieve specific workflow with filters. +Retrieve specific workflow with filters: :: - bin/flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="workflow.version=v1" + flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="workflow.version=v1" -Retrieves all the workflows with limit and sorting. +Retrieve all the workflows with limit and sorting: :: - bin/flytectl get -p flytesnacks -d development workflow --filter.sortBy=created_at --filter.limit=1 --filter.asc + flytectl get -p flytesnacks -d development workflow --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the workflow within project and domain in yaml format. +Retrieve all the workflows within project and domain in yaml format: :: flytectl get workflow -p flytesnacks -d development -o yaml -Retrieves all the workflow within project and domain in json format. +Retrieve all the workflow within project and domain in json format: :: flytectl get workflow -p flytesnacks -d development -o json -Visualize the graph for a workflow within project and domain in dot format. +Visualize the graph for a workflow within project and domain in dot format: :: flytectl get workflow -p flytesnacks -d development core.flyte_basics.basic_workflow.my_wf --latest -o dot -Visualize the graph for a workflow within project and domain in a dot content render. +Visualize the graph for a workflow within project and domain in a dot content render: :: diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index 3e1b805554..c27ca67409 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -13,19 +13,19 @@ import ( ) const ( - registerExampleShort = "Registers flytesnack example" + registerExampleShort = "Register Flytesnacks example" registerExampleLong = ` -Registers all latest flytesnacks example +Register all latest Flytesnacks examples: :: - bin/flytectl register examples -d development -p flytesnacks + flytectl register examples -d development -p flytesnacks -Registers specific release of flytesnacks example +Register specific release of Flytesnacks examples: :: - bin/flytectl register examples -d development -p flytesnacks --version v0.2.176 + flytectl register examples -d development -p flytesnacks --version v0.2.176 -Note: register command automatically override the version with release version +Note: The register command automatically override the version with release version Usage ` ) diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index d1b16a18b3..b2801d53ef 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -14,77 +14,77 @@ import ( ) const ( - registerFilesShort = "Registers file resources" + registerFilesShort = "Register file resources" registerFilesLong = ` Registers all the serialized protobuf files including tasks, workflows and launchplans with default v1 version. -If there are already registered entities with v1 version then the command will fail immediately on the first such encounter. +If previously registered entities with v1 version are present, the command will fail immediately on the first such encounter. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks + flytectl register file _pb_output/* -d development -p flytesnacks -There is no difference between registration and fast registration, In fast registration, the input provided by the user is fast serialized proto that is generated by pyflyte. If Flytectl finds any source code in users's input then it will consider registration as fast registration. Flytectl finds input file by searching an archive file whose name starts with fast and has .tar.gz extension When the user runs pyflyte with --fast flag then pyflyte creates serialize proto and it also archive create source code archive file in the same directory. -SourceUploadPath is an optional flag. By default, flytectl will create SourceUploadPath from your storage config. In case of s3 flytectl will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. +There is no difference between registration and fast registration. In fast registration, the input provided by the user is fast serialized proto that is generated by pyflyte. If FlyteCTL finds any source code in users' input, it considers the registration as fast registration. FlyteCTL finds input file by searching an archive file whose name starts with fast and has .tar.gz extension. When the user runs pyflyte with --fast flag then pyflyte creates serialize proto and it also creates source code archive file in the same directory. +SourceUploadPath is an optional flag. By default, FlyteCTL will create SourceUploadPath from your storage config. In case of s3 FlyteCTL will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 -In case of fast registration, If the SourceUploadPath flag is defined then In this case flytectl will not use the default directory for uploading the source code, it will override the destination path on the registration +In case of fast registration, if the SourceUploadPath flag is defined, FlyteCTL will not use the default directory to upload the source code. Instead, it will override the destination path on the registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" -Using archive file.Currently supported are .tgz and .tar extension files and can be local or remote file served through http/https. -Use --archive flag. +Using archive file. Currently supported extensions are .tgz and .tar. They can be local or remote files served through http/https. +Use --archive flag: :: - bin/flytectl register files http://localhost:8080/_pb_output.tar -d development -p flytesnacks --archive + flytectl register files http://localhost:8080/_pb_output.tar -d development -p flytesnacks --archive -Using local tgz file. +Using local tgz file: :: - bin/flytectl register files _pb_output.tgz -d development -p flytesnacks --archive + flytectl register files _pb_output.tgz -d development -p flytesnacks --archive -If you want to continue executing registration on other files ignoring the errors including version conflicts then pass in the continueOnError flag. +If you wish to continue executing registration on other files by ignoring the errors including the version conflicts, then send the continueOnError flag: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -Using short format of continueOnError flag +Using short format of continueOnError flag: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -Overriding the default version v1 using version string. +Override the default version v1 using version string: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 -Change the o/p format has not effect on registration. The O/p is currently available only in table format. +Changing the o/p format has no effect on the registration. The O/p is currently available only in table format: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -o yaml + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -o yaml -Override IamRole during registration. +Override IamRole during registration: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -i "arn:aws:iam::123456789:role/dummy" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -i "arn:aws:iam::123456789:role/dummy" -Override Kubernetes service account during registration. +Override Kubernetes service account during registration: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -k "kubernetes-service-account" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -k "kubernetes-service-account" -Override Output location prefix during registration. +Override Output location prefix during registration: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -l "s3://dummy/prefix" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -l "s3://dummy/prefix" Usage ` diff --git a/flytectl/cmd/register/register.go b/flytectl/cmd/register/register.go index ccc95a5127..469a3811a9 100644 --- a/flytectl/cmd/register/register.go +++ b/flytectl/cmd/register/register.go @@ -9,12 +9,12 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - registerCmdShort = "Registers tasks/workflows/launchplans from list of generated serialized files." + registerCmdShort = "Register tasks/workflows/launchplans from a list of generated serialized files." registercmdLong = ` Takes input files as serialized versions of the tasks/workflows/launchplans and registers them with flyteadmin. -Currently these input files are protobuf files generated as output from flytekit serialize. -Project & Domain are mandatory fields to be passed for registration and an optional version which defaults to v1 -If the entities are already registered with flyte for the same version then registration would fail. +Currently, these input files are protobuf files generated as output from Flytekit serialize. +Project & Domain are mandatory fields to be passed for registration and an optional version which defaults to v1. +If the entities are already registered with Flyte for the same version, the registration would fail. ` ) diff --git a/flytectl/cmd/register/register_test.go b/flytectl/cmd/register/register_test.go index 33f48dddd3..cf3b725fcd 100644 --- a/flytectl/cmd/register/register_test.go +++ b/flytectl/cmd/register/register_test.go @@ -27,7 +27,7 @@ var setup = u.Setup func TestRegisterCommand(t *testing.T) { registerCommand := RemoteRegisterCommand() assert.Equal(t, registerCommand.Use, "register") - assert.Equal(t, registerCommand.Short, "Registers tasks/workflows/launchplans from list of generated serialized files.") + assert.Equal(t, registerCommand.Short, "Register tasks/workflows/launchplans from a list of generated serialized files.") fmt.Println(registerCommand.Commands()) assert.Equal(t, len(registerCommand.Commands()), 2) cmdNouns := registerCommand.Commands() @@ -38,9 +38,9 @@ func TestRegisterCommand(t *testing.T) { assert.Equal(t, cmdNouns[0].Use, "examples") assert.Equal(t, cmdNouns[0].Aliases, []string{"example", "flytesnack", "flytesnacks"}) - assert.Equal(t, cmdNouns[0].Short, "Registers flytesnack example") + assert.Equal(t, cmdNouns[0].Short, "Register Flytesnacks example") assert.Equal(t, cmdNouns[1].Use, "files") assert.Equal(t, cmdNouns[1].Aliases, []string{"file"}) - assert.Equal(t, cmdNouns[1].Short, "Registers file resources") + assert.Equal(t, cmdNouns[1].Short, "Register file resources") } diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 5da86063ce..98c646c37a 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -42,9 +42,9 @@ const ( func newRootCmd() *cobra.Command { rootCmd := &cobra.Command{ PersistentPreRunE: initConfig, - Long: "flytectl is CLI tool written in go to interact with flyteadmin service", - Short: "flyetcl CLI tool", - Use: "flytectl", + Long: "FlyteCTL is CLI tool written in go to interact with Flyteadmin service", + Short: "FlyteCTL CLI tool", + Use: "FlyteCTL", DisableAutoGenTag: true, } diff --git a/flytectl/cmd/sandbox/exec.go b/flytectl/cmd/sandbox/exec.go index bc42048a86..98f584aa64 100644 --- a/flytectl/cmd/sandbox/exec.go +++ b/flytectl/cmd/sandbox/exec.go @@ -11,10 +11,10 @@ import ( const ( execShort = "Execute non-interactive command inside the sandbox container" execLong = ` -Execute command will run non-interactive command inside the sandbox container and return immediately with the output.By default flytectl exec in /root directory inside the sandbox container +Runs non-interactive command inside the Sandbox container and immediately returns the output. By default, flytectl exec is present in /root directory inside the Sandbox container. :: - bin/flytectl sandbox exec -- ls -al + flytectl sandbox exec -- ls -al Usage` ) diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go index b269f378be..ea639fa4a4 100644 --- a/flytectl/cmd/sandbox/sandbox.go +++ b/flytectl/cmd/sandbox/sandbox.go @@ -10,29 +10,29 @@ import ( const ( sandboxShort = `Used for sandbox interactions like start/teardown/status/exec.` sandboxLong = ` -The Flyte Sandbox is a fully standalone minimal environment for running Flyte. provides a simplified way of running flyte-sandbox as a single Docker container running locally. +The Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte sandbox as a single Docker container locally. -Create sandbox cluster. +Create sandbox cluster: :: - bin/flytectl sandbox start + flytectl sandbox start -Remove sandbox cluster. +Remove sandbox cluster: :: - bin/flytectl sandbox teardown + flytectl sandbox teardown -Check status of sandbox container. +Check status of sandbox container: :: - bin/flytectl sandbox status + flytectl sandbox status -Execute command inside sandbox container. +Execute command inside sandbox container: :: - bin/flytectl sandbox exec -- pwd + flytectl sandbox exec -- pwd ` ) diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 720b6f1a1d..73f1a083be 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -32,32 +32,32 @@ import ( const ( startShort = "Start the flyte sandbox cluster" startLong = ` -The Flyte Sandbox is a fully standalone minimal environment for running Flyte. provides a simplified way of running flyte-sandbox as a single Docker container running locally. +The Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte sandbox as a single Docker container locally. -Start sandbox cluster without any source code +Start sandbox cluster without any source code: :: flytectl sandbox start -Mount your source code repository inside sandbox +Mount your source code repository inside sandbox: :: flytectl sandbox start --source=$HOME/flyteorg/flytesnacks -Run specific version of flyte. flytectl sandbox only support flyte version available in Github release https://github.com/flyteorg/flyte/tags +Run specific version of Flyte. FlyteCTL sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. :: flytectl sandbox start --version=v0.14.0 -Note: Flytectl sandbox is only supported for Flyte versions > v0.10.0 +Note: FlyteCTL sandbox is only supported for Flyte versions > v0.10.0 -Specify a Flyte Sandbox compliant image with the registry. This is useful, in case you want to use an image from your registry. +Specify a Flyte Sandbox compliant image with the registry. This is useful in case you want to use an image from your registry. :: flytectl sandbox start --image docker.io/my-override:latest -Specify a Flyte Sandbox image pull policy. Possible pull policy values are Always, IfNotPresent, or Never +Specify a Flyte Sandbox image pull policy. Possible pull policy values are Always, IfNotPresent, or Never: :: flytectl sandbox start --image docker.io/my-override:latest --imagePullPolicy Always diff --git a/flytectl/cmd/sandbox/status.go b/flytectl/cmd/sandbox/status.go index c9493b4509..bff5230c11 100644 --- a/flytectl/cmd/sandbox/status.go +++ b/flytectl/cmd/sandbox/status.go @@ -10,15 +10,14 @@ import ( ) const ( - statusShort = "Get the status of the sandbox environment." + statusShort = "Get status of the sandbox environment." statusLong = ` -Status will retrieve the status of the Sandbox environment. Currently FlyteSandbox runs as a local docker container. -This will return the docker status for this container +Retrieve the status of the Sandbox environment. Currently, Flyte Sandbox runs as a local Docker container. Usage :: - bin/flytectl sandbox status + flytectl sandbox status ` ) diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index 544880b997..3d42e7c7c5 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -15,12 +15,12 @@ import ( ) const ( - teardownShort = "Teardown will cleanup the sandbox environment" + teardownShort = "Teardown cleans up the sandbox environment" teardownLong = ` -Teardown will remove sandbox cluster and all the flyte config created by sandbox start +Teardown removes Sandbox cluster and all the Flyte config created by sandbox start: :: - bin/flytectl sandbox teardown + flytectl sandbox teardown Usage diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go index a9dd059c5c..0c2a3267dd 100644 --- a/flytectl/cmd/update/launch_plan.go +++ b/flytectl/cmd/update/launch_plan.go @@ -14,14 +14,14 @@ import ( ) const ( - updateLPShort = "Updates launch plan status" + updateLPShort = "Update launch plan status" updateLPLong = ` -Activating launchplan activates the scheduled job associated with it +Activating launch plan activates the scheduled job associated with it: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --activate -Archiving launchplan deschedules any scheduled job associated with it +Archiving launch plan deschedules any scheduled job associated with it: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --archive diff --git a/flytectl/cmd/update/launch_plan_meta.go b/flytectl/cmd/update/launch_plan_meta.go index 00cd9bef36..d2a9678667 100644 --- a/flytectl/cmd/update/launch_plan_meta.go +++ b/flytectl/cmd/update/launch_plan_meta.go @@ -11,19 +11,19 @@ import ( ) const ( - updateLPMetaShort = "Updates launch plan metadata" + updateLPMetaShort = "Update launch plan metadata" updateLPMetaLong = ` -Following command updates the description on the launchplan. +Update the description on the launch plan: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort example" -Archiving launchplan named entity is not supported and would throw an error. +Archiving launch plan named entity is not supported and would throw an error: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive -Activating launchplan named entity would be a noop. +Activating launch plan named entity would be a noop: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute.go b/flytectl/cmd/update/matchable_cluster_resource_attribute.go index 4938245a3b..2e8f2a2077 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute.go @@ -10,13 +10,13 @@ import ( ) const ( - clusterResourceAttributesShort = "Updates matchable resources of cluster attributes" + clusterResourceAttributesShort = "Update matchable resources of cluster attributes" clusterResourceAttributesLong = ` Updates cluster resource attributes for given project and domain combination or additionally with workflow name. -Updating to the cluster resource attribute is only available from a generated file. See the get section for generating this file. -Here the command updates takes the input for cluster resource attributes from the config file cra.yaml -eg: content of cra.yaml +Updating to the cluster resource attribute is only available from a generated file. See the get section to generate this file. +It takes input for cluster resource attributes from the config file cra.yaml, +e.g., content of cra.yaml: .. code-block:: yaml @@ -30,12 +30,12 @@ eg: content of cra.yaml flytectl update cluster-resource-attribute --attrFile cra.yaml -Updating cluster resource attribute for project and domain and workflow combination. This will take precedence over any other +Updates cluster resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. -Also this will completely overwrite any existing custom project and domain and workflow combination attributes. -Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values -Refer to get cluster-resource-attribute section on how to generate this file -Update the cluster resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain +This will completely overwrite any existing custom project, domain and workflow combination attributes. +It is preferable to do get and generate an attribute file if there is an existing attribute that is already set and then update it to have new values. +Refer to get cluster-resource-attribute section on how to generate this file. +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml diff --git a/flytectl/cmd/update/matchable_execution_cluster_label.go b/flytectl/cmd/update/matchable_execution_cluster_label.go index e9c6c62e5a..2c03815468 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label.go @@ -10,13 +10,13 @@ import ( ) const ( - executionClusterLabelShort = "Updates matchable resources of execution cluster label" + executionClusterLabelShort = "Update matchable resources of execution cluster label" executionClusterLabelLong = ` -Updates execution cluster label for given project and domain combination or additionally with workflow name. +Updates execution cluster label for the given project and domain combination or additionally with workflow name. -Updating to the execution cluster label is only available from a generated file. See the get section for generating this file. -Here the command updates takes the input for execution cluster label from the config file ecl.yaml -eg: content of ecl.yaml +Updating to the execution cluster label is only available from a generated file. See the get section to generate this file. +It takes input for execution cluster label from the config file ecl.yaml +e.g., content of ecl.yaml: .. code-block:: yaml @@ -28,9 +28,9 @@ eg: content of ecl.yaml flytectl update execution-cluster-label --attrFile ecl.yaml -Updating execution cluster label for project and domain and workflow combination. This will take precedence over any other +Updates execution cluster label for project, domain and workflow combination. This will take precedence over any other execution cluster label defined at project domain level. -Update the execution cluster label for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute.go b/flytectl/cmd/update/matchable_execution_queue_attribute.go index 6c09f9d7b0..4d85146680 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute.go @@ -10,16 +10,16 @@ import ( ) const ( - executionQueueAttributesShort = "Updates matchable resources of execution queue attributes" + executionQueueAttributesShort = "Update matchable resources of execution queue attributes" executionQueueAttributesLong = ` -Updates execution queue attributes for given project and domain combination or additionally with workflow name. +Updates execution queue attributes for the given project and domain combination or additionally with workflow name. -Updating to the execution queue attribute is only available from a generated file. See the get section for generating this file. -Also this will completely overwrite any existing custom project and domain and workflow combination attributes. -Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values +Updating the execution queue attribute is only available from a generated file. See the get section for generating this file. +This will completely overwrite any existing custom project, domain and workflow combination attributes. +It is preferable to do get and generate an attribute file if there is an existing attribute that is already set and then update it to have new values. Refer to get execution-queue-attribute section on how to generate this file -Here the command updates takes the input for execution queue attributes from the config file era.yaml -eg: content of era.yaml +It takes input for execution queue attributes from the config file era.yaml, +e.g., content of era.yaml: .. code-block:: yaml @@ -35,9 +35,9 @@ eg: content of era.yaml flytectl update execution-queue-attribute --attrFile era.yaml -Updating execution queue attribute for project and domain and workflow combination. This will take precedence over any other +Updates execution queue attribute for project, domain and workflow combination. This will take precedence over any other execution queue attribute defined at project domain level. -Update the execution queue attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml diff --git a/flytectl/cmd/update/matchable_plugin_override.go b/flytectl/cmd/update/matchable_plugin_override.go index 065f2d7070..2dfca66113 100644 --- a/flytectl/cmd/update/matchable_plugin_override.go +++ b/flytectl/cmd/update/matchable_plugin_override.go @@ -10,16 +10,16 @@ import ( ) const ( - pluginOverrideShort = "Updates matchable resources of plugin overrides" + pluginOverrideShort = "Update matchable resources of plugin overrides" pluginOverrideLong = ` Updates plugin overrides for given project and domain combination or additionally with workflow name. Updating to the plugin override is only available from a generated file. See the get section for generating this file. -Also this will completely overwrite any existing plugins overrides on custom project and domain and workflow combination. -Would be preferable to do get and generate an plugin override file if there is an existing override already set and then update it to have new values +This will completely overwrite any existing plugins overrides on custom project, domain and workflow combination. +It is preferable to do get and generate a plugin override file if there is an existing override already set and then update it to have new values. Refer to get plugin-override section on how to generate this file -Here the command updates takes the input for plugin overrides from the config file po.yaml -eg: content of po.yaml +It takes input for plugin overrides from the config file po.yaml, +e.g., content of po.yaml: .. code-block:: yaml @@ -36,9 +36,9 @@ eg: content of po.yaml flytectl update plugin-override --attrFile po.yaml -Updating plugin override for project and domain and workflow combination. This will take precedence over any other +Updates plugin override for project, domain and workflow combination. This will take precedence over any other plugin overrides defined at project domain level. -Update the plugin overrides for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go index bebd96929b..f7bb45ce67 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -10,16 +10,16 @@ import ( ) const ( - taskResourceAttributesShort = "Updates matchable resources of task attributes" + taskResourceAttributesShort = "Update matchable resources of task attributes" taskResourceAttributesLong = ` -Updates task resource attributes for given project and domain combination or additionally with workflow name. +Updates task resource attributes for the given project and domain combination or additionally with workflow name. Updating the task resource attribute is only available from a generated file. See the get section for generating this file. -Also this will completely overwrite any existing custom project and domain and workflow combination attributes. -Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values -Refer to get task-resource-attribute section on how to generate this file -Here the command updates takes the input for task resource attributes from the config file tra.yaml -eg: content of tra.yaml +This will completely overwrite any existing custom project, domain and workflow combination attributes. +It is preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values. +Refer to get task-resource-attribute section on how to generate this file. +It takes input for task resource attributes from the config file tra.yaml, +e.g., content of tra.yaml: .. code-block:: yaml @@ -36,9 +36,9 @@ eg: content of tra.yaml flytectl update task-resource-attribute --attrFile tra.yaml -Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other +Updates task resource attribute for project, domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. -Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml diff --git a/flytectl/cmd/update/matchable_workflow_execution_config.go b/flytectl/cmd/update/matchable_workflow_execution_config.go index 07b684ec5b..740685ef2b 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config.go @@ -11,16 +11,16 @@ import ( ) const ( - workflowExecutionConfigShort = "Updates matchable resources of workflow execution config" + workflowExecutionConfigShort = "Update matchable resources of workflow execution config" workflowExecutionConfigLong = ` Updates workflow execution config for given project and domain combination or additionally with workflow name. Updating the workflow execution config is only available from a generated file. See the get section for generating this file. -Also this will completely overwrite any existing custom project and domain and workflow combination execution config. -Would be preferable to do get and generate an config file if there is an existing execution config already set and then update it to have new values -Refer to get workflow-execution-config section on how to generate this file -Here the command updates takes the input for workflow execution config from the config file wec.yaml -eg: content of wec.yaml +This will completely overwrite any existing custom project and domain and workflow combination execution config. +It is preferable to do get and generate a config file if there is an existing execution config already set and then update it to have new values. +Refer to get workflow-execution-config section on how to generate this file. +It takes input for workflow execution config from the config file wec.yaml, +e.g., content of wec.yaml: .. code-block:: yaml @@ -32,9 +32,9 @@ eg: content of wec.yaml flytectl update workflow-execution-config --attrFile wec.yaml -Updating workflow execution config for project and domain and workflow combination. This will take precedence over any other +Updates workflow execution config for project, domain and workflow combination. This will take precedence over any other execution config defined at project domain level. -Update the workflow execution config for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index abc54a6d36..330afe395c 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -22,37 +22,37 @@ type ProjectConfig struct { } const ( - projectShort = "Updates project resources" + projectShort = "Update project resources" projectLong = ` -Updates the project according the flags passed. Allows you to archive or activate a project. -Activates project named flytesnacks. +Updates the project according to the flags passed. Allows you to archive or activate a project. +Activate project flytesnacks: :: - bin/flytectl update project -p flytesnacks --activateProject + flytectl update project -p flytesnacks --activateProject -Archives project named flytesnacks. +Archive project flytesnacks: :: - bin/flytectl update project -p flytesnacks --archiveProject + flytectl update project -p flytesnacks --archiveProject -Incorrect usage when passing both archive and activate. +Incorrect usage when passing both archive and activate: :: - bin/flytectl update project flytesnacks --archiveProject --activateProject + flytectl update project flytesnacks --archiveProject --activateProject -Incorrect usage when passing unknown-project. +Incorrect usage when passing unknown-project: :: - bin/flytectl update project unknown-project --archiveProject + flytectl update project unknown-project --archiveProject -Incorrect usage when passing valid project using -p option. +Incorrect usage when passing valid project using -p option: :: - bin/flytectl update project unknown-project --archiveProject -p known-project + flytectl update project unknown-project --archiveProject -p known-project Usage ` diff --git a/flytectl/cmd/update/task_meta.go b/flytectl/cmd/update/task_meta.go index e38cdff16b..8c599710b2 100644 --- a/flytectl/cmd/update/task_meta.go +++ b/flytectl/cmd/update/task_meta.go @@ -11,19 +11,19 @@ import ( ) const ( - updateTaskShort = "Updates task metadata" + updateTaskShort = "Update task metadata" updateTaskLong = ` -Following command updates the description on the task. +Updates the description on the task: :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --description "Merge sort example" -Archiving task named entity is not supported and would throw an error. +Archiving task named entity is not supported and would throw an error: :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --archive -Activating task named entity would be a noop as archiving is not possible. +Activating task named entity would be a noop since archiving is not possible: :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --activate diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index c1a721b704..60603a7dbe 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -16,14 +16,14 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( updateUse = "update" - updateShort = `Used for updating flyte resources eg: project.` + updateShort = `Update Flyte resources e.g., project.` updatecmdLong = ` -Currently this command only provides subcommands to update project. -Takes input project which need to be archived or unarchived. Name of the project to be updated is mandatory field. -Example update project to activate it. +Currently, this command only provides subcommands to update project. +Takes input project that needs to be archived or unarchived. Name of the project to be updated is a mandatory field. +To update a project: :: - bin/flytectl update project -p flytesnacks --activateProject + flytectl update project -p flytesnacks --activateProject ` ) diff --git a/flytectl/cmd/update/workflow_meta.go b/flytectl/cmd/update/workflow_meta.go index 9e67796208..af4cb3fe7d 100644 --- a/flytectl/cmd/update/workflow_meta.go +++ b/flytectl/cmd/update/workflow_meta.go @@ -11,19 +11,19 @@ import ( ) const ( - updateWorkflowShort = "Updates workflow metadata" + updateWorkflowShort = "Update workflow metadata" updateWorkflowLong = ` -Following command updates the description on the workflow. +Updates the description on the workflow: :: flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort workflow example" -Archiving workflow named entity would cause this to disapper from flyteconsole UI. +Archiving workflow named entity would cause this to disapper from flyteconsole UI: :: flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive -Activating workflow named entity +Activate workflow named entity: :: flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go index d32d587252..7fdd6d5f82 100644 --- a/flytectl/cmd/upgrade/upgrade.go +++ b/flytectl/cmd/upgrade/upgrade.go @@ -25,21 +25,21 @@ type Goos string // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - upgradeCmdShort = `Used for upgrade/rollback flyte version` + upgradeCmdShort = `Upgrade/rollback to a Flyte version` upgradeCmdLong = ` -Upgrade flytectl +For FlyteCTL, it is: :: - bin/flytectl upgrade + flytectl upgrade -Note: Please use upgrade with sudo, Without sudo it will cause permission issue +Note: Please use upgrade with sudo. Without sudo it will cause permission issue. -Rollback flytectl binary +Rollback flytectl binary: :: - bin/flytectl upgrade rollback + flytectl upgrade rollback -Note: Upgrade is not available on windows +Note: Upgrade is not available on windows. ` rollBackSubCommand = "rollback" ) diff --git a/flytectl/cmd/upgrade/upgrade_test.go b/flytectl/cmd/upgrade/upgrade_test.go index 213b02afdc..17584822a7 100644 --- a/flytectl/cmd/upgrade/upgrade_test.go +++ b/flytectl/cmd/upgrade/upgrade_test.go @@ -27,9 +27,9 @@ var ( func TestUpgradeCommand(t *testing.T) { rootCmd := &cobra.Command{ - Long: "flytectl is CLI tool written in go to interact with flyteadmin service", - Short: "flyetcl CLI tool", - Use: "flytectl", + Long: "FlyteCTL is CLI tool written in go to interact with flyteadmin service", + Short: "FlyteCTL CLI tool", + Use: "FlyteCTL", DisableAutoGenTag: true, } upgradeCmd := SelfUpgrade(rootCmd) diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go index 14a6d0bc4c..f52dd27407 100644 --- a/flytectl/cmd/version/version.go +++ b/flytectl/cmd/version/version.go @@ -19,12 +19,12 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - versionCmdShort = `Used for fetching flyte version` + versionCmdShort = `Fetch Flyte version` versionCmdLong = ` -Example version. +For FlyteCTL version, it is: :: - bin/flytectl version + flytectl version ` flytectlAppName = "flytectl" controlPlanAppName = "controlPlane" diff --git a/flytectl/cmd/version/version_test.go b/flytectl/cmd/version/version_test.go index cd9065258f..2b83ff9403 100644 --- a/flytectl/cmd/version/version_test.go +++ b/flytectl/cmd/version/version_test.go @@ -31,9 +31,9 @@ var ( func TestVersionCommand(t *testing.T) { rootCmd := &cobra.Command{ - Long: "flytectl is CLI tool written in go to interact with flyteadmin service", - Short: "flyetcl CLI tool", - Use: "flytectl", + Long: "FlyteCTL is CLI tool written in go to interact with Flyteadmin service", + Short: "FlyteCTL CLI tool", + Use: "FlyteCTL", DisableAutoGenTag: true, } versionCommand := GetVersionCommand(rootCmd) diff --git a/flytectl/docs/source/cluster-resource-attribute.rst b/flytectl/docs/source/cluster-resource-attribute.rst new file mode 100644 index 0000000000..bfbd2b0ffa --- /dev/null +++ b/flytectl/docs/source/cluster-resource-attribute.rst @@ -0,0 +1,9 @@ +Cluster resource attribute +------ +.. toctree:: + :maxdepth: 1 + :caption: Cluster resource attribute + + gen/FlyteCTL_get_cluster-resource-attribute + gen/FlyteCTL_delete_cluster-resource-attribute + gen/FlyteCTL_update_cluster-resource-attribute diff --git a/flytectl/docs/source/config.rst b/flytectl/docs/source/config.rst new file mode 100644 index 0000000000..bf112114f8 --- /dev/null +++ b/flytectl/docs/source/config.rst @@ -0,0 +1,10 @@ +Config +------ + +.. toctree:: + :maxdepth: 1 + :caption: Config + + gen/FlyteCTL_config_validate + gen/FlyteCTL_config_init + gen/flytectl_config_discover diff --git a/flytectl/docs/source/examples.rst b/flytectl/docs/source/examples.rst new file mode 100644 index 0000000000..a854e2349b --- /dev/null +++ b/flytectl/docs/source/examples.rst @@ -0,0 +1,8 @@ +Examples +------ +.. toctree:: + :maxdepth: 1 + :caption: Examples + + + gen/FlyteCTL_register_examples \ No newline at end of file diff --git a/flytectl/docs/source/execution-cluster-label.rst b/flytectl/docs/source/execution-cluster-label.rst new file mode 100644 index 0000000000..e0dae2adbc --- /dev/null +++ b/flytectl/docs/source/execution-cluster-label.rst @@ -0,0 +1,10 @@ +Execution cluster label +------ + +.. toctree:: + :maxdepth: 1 + :caption: Execution cluster label + + gen/FlyteCTL_get_execution-cluster-label + gen/FlyteCTL_update_execution-cluster-label + gen/FlyteCTL_delete_execution-cluster-label \ No newline at end of file diff --git a/flytectl/docs/source/execution-queue-attribute.rst b/flytectl/docs/source/execution-queue-attribute.rst new file mode 100644 index 0000000000..92ba2502c0 --- /dev/null +++ b/flytectl/docs/source/execution-queue-attribute.rst @@ -0,0 +1,10 @@ +Execution queue attribute +------ + +.. toctree:: + :maxdepth: 1 + :caption: Execution queue attribute + + gen/FlyteCTL_get_execution-queue-attribute + gen/FlyteCTL_delete_execution-queue-attribute + gen/FlyteCTL_update_execution-queue-attribute \ No newline at end of file diff --git a/flytectl/docs/source/execution.rst b/flytectl/docs/source/execution.rst new file mode 100644 index 0000000000..b7857e7103 --- /dev/null +++ b/flytectl/docs/source/execution.rst @@ -0,0 +1,10 @@ +Execution +------ + +.. toctree:: + :maxdepth: 1 + :caption: Execution + + gen/FlyteCTL_create_execution + gen/FlyteCTL_get_execution + gen/FlyteCTL_delete_execution \ No newline at end of file diff --git a/flytectl/docs/source/files.rst b/flytectl/docs/source/files.rst new file mode 100644 index 0000000000..b7216fbcae --- /dev/null +++ b/flytectl/docs/source/files.rst @@ -0,0 +1,10 @@ +Files +------ + +.. toctree:: + :maxdepth: 1 + :caption: Files + + gen/FlyteCTL_register_files + +Note: It allows the user to register local files diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index d56aa0fca5..d11e9d5bbf 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -1,15 +1,15 @@ -.. _flytectl: +.. _FlyteCTL: -flytectl +FlyteCTL -------- -flyetcl CLI tool +FlyteCTL CLI tool Synopsis ~~~~~~~~ -flytectl is CLI tool written in go to interact with flyteadmin service +FlyteCTL is CLI tool written in go to interact with Flyteadmin service Options ~~~~~~~ @@ -33,7 +33,7 @@ Options --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. - -h, --help help for flytectl + -h, --help help for FlyteCTL --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. @@ -59,14 +59,14 @@ Options SEE ALSO ~~~~~~~~ -* :doc:`flytectl_completion` - Generate completion script -* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. -* :doc:`flytectl_create` - Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. -* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. -* :doc:`flytectl_upgrade` - Used for upgrade/rollback flyte version -* :doc:`flytectl_version` - Used for fetching flyte version +* :doc:`FlyteCTL_completion` - Generate completion script +* :doc:`FlyteCTL_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`FlyteCTL_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_register` - Register tasks/workflows/launchplans from a list of generated serialized files. +* :doc:`FlyteCTL_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`FlyteCTL_upgrade` - Upgrade/rollback to a Flyte version +* :doc:`FlyteCTL_version` - Fetch Flyte version diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index 24271d7b12..1e4ed90351 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -1,6 +1,6 @@ -.. _flytectl_completion: +.. _FlyteCTL_completion: -flytectl completion +FlyteCTL completion ------------------- Generate completion script @@ -24,7 +24,7 @@ Bash: Zsh: # If shell completion is not already enabled in your environment, - # you will need to enable it. You can execute the following once: + # you will need to enable it. You can execute the following once: $ echo "autoload -U compinit; compinit" >> ~/.zshrc @@ -51,7 +51,7 @@ PowerShell: :: - flytectl completion [bash|zsh|fish|powershell] + FlyteCTL completion [bash|zsh|fish|powershell] Options ~~~~~~~ @@ -107,5 +107,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - flyetcl CLI tool +* :doc:`FlyteCTL` - FlyteCTL CLI tool diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index e835ee9fe9..3df3187008 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -1,6 +1,6 @@ -.. _flytectl_config: +.. _FlyteCTL_config: -flytectl config +FlyteCTL config --------------- Runs various config commands, look at the help of this command to get a list of available commands.. @@ -67,8 +67,8 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - flyetcl CLI tool -* :doc:`flytectl_config_discover` - Searches for a config in one of the default search paths. -* :doc:`flytectl_config_init` - Generates flytectl config file in the user's home directory. -* :doc:`flytectl_config_validate` - Validates the loaded config. +* :doc:`FlyteCTL` - FlyteCTL CLI tool +* :doc:`FlyteCTL_config_discover` - Searches for a config in one of the default search paths. +* :doc:`FlyteCTL_config_init` - Generates FlyteCTL config file in the user's home directory. +* :doc:`FlyteCTL_config_validate` - Validates the loaded config. diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 8550321470..a91147e3d4 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -1,6 +1,6 @@ -.. _flytectl_config_discover: +.. _FlyteCTL_config_discover: -flytectl config discover +FlyteCTL config discover ------------------------ Searches for a config in one of the default search paths. @@ -13,7 +13,7 @@ Searches for a config in one of the default search paths. :: - flytectl config discover [flags] + FlyteCTL config discover [flags] Options ~~~~~~~ @@ -71,5 +71,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`FlyteCTL_config` - Runs various config commands, look at the help of this command to get a list of available commands.. diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index 30b4eb404f..3ba2564ca2 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -1,37 +1,37 @@ -.. _flytectl_config_init: +.. _FlyteCTL_config_init: -flytectl config init +FlyteCTL config init -------------------- -Generates flytectl config file in the user's home directory. +Generates FlyteCTL config file in the user's home directory. Synopsis ~~~~~~~~ -Creates a flytectl config file in flyte directory i.e ~/.flyte +Creates a FlyteCTL config file in Flyte directory i.e ~/.flyte -Generate sandbox config. Flyte Sandbox is a fully standalone minimal environment for running Flyte. Read more about sandbox https://docs.flyte.org/en/latest/deployment/sandbox.html +Generates sandbox config. Flyte Sandbox is a fully standalone minimal environment for running Flyte. Read more about sandbox https://docs.flyte.org/en/latest/deployment/sandbox.html :: - bin/flytectl configuration config + flytectl configuration config -Generate remote cluster config. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html +Generates remote cluster config. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html :: - bin/flytectl configuration config --host=flyte.myexample.com + flytectl configuration config --host=flyte.myexample.com -Generate flytectl config with a storage provider +Generates FlyteCTL config with a storage provider :: - bin/flytectl configuration config --host=flyte.myexample.com --storage + flytectl configuration config --host=flyte.myexample.com --storage :: - flytectl config init [flags] + FlyteCTL config init [flags] Options ~~~~~~~ @@ -92,5 +92,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`FlyteCTL_config` - Runs various config commands, look at the help of this command to get a list of available commands.. diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 51a3a7e443..461e625269 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -1,6 +1,6 @@ -.. _flytectl_config_validate: +.. _FlyteCTL_config_validate: -flytectl config validate +FlyteCTL config validate ------------------------ Validates the loaded config. @@ -13,7 +13,7 @@ Validates the loaded config. :: - flytectl config validate [flags] + FlyteCTL config validate [flags] Options ~~~~~~~ @@ -73,5 +73,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`FlyteCTL_config` - Runs various config commands, look at the help of this command to get a list of available commands.. diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index de2f4a89d4..d389ea2c0d 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -1,19 +1,19 @@ -.. _flytectl_create: +.. _FlyteCTL_create: -flytectl create +FlyteCTL create --------------- -Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. +Create various Flyte resources including tasks/workflows/launchplans/executions/project. Synopsis ~~~~~~~~ -Example create. +Create Flyte resource; if a project: :: - bin/flytectl create project --file project.yaml + flytectl create project --file project.yaml Options @@ -70,7 +70,7 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - flyetcl CLI tool -* :doc:`flytectl_create_execution` - Create execution resources -* :doc:`flytectl_create_project` - Create project resources +* :doc:`FlyteCTL` - FlyteCTL CLI tool +* :doc:`FlyteCTL_create_execution` - Create execution resources +* :doc:`FlyteCTL_create_project` - Create project resources diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 2838ecdd5c..2d502a4209 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -1,6 +1,6 @@ -.. _flytectl_create_execution: +.. _FlyteCTL_create_execution: -flytectl create execution +FlyteCTL create execution ------------------------- Create execution resources @@ -10,22 +10,22 @@ Synopsis -Create the executions for given workflow/task in a project and domain. +Creates executions for a given workflow/task in a project and domain. -There are three steps in generating an execution. +There are three steps in generating an execution: - Generate the execution spec file using the get command. - Update the inputs for the execution if needed. - Run the execution by passing in the generated yaml file. -The spec file should be generated first and then run the execution using the spec file. -You can reference the flytectl get task for more details +The spec file should be generated first and then, the execution should be run using the spec file. +You can reference the FlyteCTL get task for more details. :: flytectl get tasks -d development -p flytectldemo core.advanced.run_merge_sort.merge --version v2 --execFile execution_spec.yaml -The generated file would look similar to this +The generated file would look similar to this: .. code-block:: yaml @@ -62,35 +62,35 @@ The generated file can be modified to change the input values. task: core.advanced.run_merge_sort.merge version: "v2" -And then can be passed through the command line. -Notice the source and target domain/projects can be different. -The root project and domain flags of -p and -d should point to task/launch plans project/domain. +It can then be passed through the command line. +Notice that the source and target domain/projects can be different. +The root project and domain flags of -p and -d should point to the task/launch plans project/domain. :: flytectl create execution --execFile execution_spec.yaml -p flytectldemo -d development --targetProject flytesnacks -Also an execution can be relaunched by passing in current execution id. +Also, an execution can be relaunched by passing in the current execution id. :: flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development -An execution can be recovered, that is recreated from the last known failure point for a previously-run workflow execution. +An execution can be recovered, i.e., recreated from the last known failure point for previously-run workflow execution. See :ref:`ref_flyteidl.admin.ExecutionRecoverRequest` for more details. :: flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytectldemo -d development -Generic data types are also supported for execution in similar way.Following is sample of how the inputs need to be specified while creating the execution. -As usual the spec file should be generated first and then run the execution using the spec file. +Generic data types are also supported for execution in a similar manner. Following is a sample of how the inputs need to be specified while creating the execution. +The spec file should be generated first and then, the execution should be run using the spec file. :: flytectl get task -d development -p flytectldemo core.type_system.custom_objects.add --execFile adddatanum.yaml -The generated file would look similar to this. Here you can see empty values dumped for generic data type x and y. +The generated file would look similar to this. Here, empty values have been dumped for generic data type x and y. :: @@ -133,7 +133,7 @@ Usage :: - flytectl create execution [flags] + FlyteCTL create execution [flags] Options ~~~~~~~ @@ -200,5 +200,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_create` - Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index f1e8a47194..49d244f310 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -1,6 +1,6 @@ -.. _flytectl_create_project: +.. _FlyteCTL_create_project: -flytectl create project +FlyteCTL create project ----------------------- Create project resources @@ -10,16 +10,16 @@ Synopsis -Create the projects.(project,projects can be used interchangeably in these commands) +Create projects.(project/projects can be used interchangeably in these commands) :: - bin/flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte + flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte -Create Project by definition file. Note: The name shouldn't contain any whitespace characters' +Create a project by definition file. Note: The name shouldn't contain any whitespace characters. :: - bin/flytectl create project --file project.yaml + flytectl create project --file project.yaml .. code-block:: yaml @@ -33,7 +33,7 @@ Create Project by definition file. Note: The name shouldn't contain any whitespa :: - flytectl create project [flags] + FlyteCTL create project [flags] Options ~~~~~~~ @@ -95,5 +95,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_create` - Used for creating various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 0af8199dca..b675158f7a 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -1,19 +1,19 @@ -.. _flytectl_delete: +.. _FlyteCTL_delete: -flytectl delete +FlyteCTL delete --------------- -Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. +Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. Synopsis ~~~~~~~~ -Example Delete executions. +Delete a resource; if an execution: :: - bin/flytectl delete execution kxd1i72850 -d development -p flytesnacks + flytectl delete execution kxd1i72850 -d development -p flytesnacks Options @@ -70,12 +70,12 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - flyetcl CLI tool -* :doc:`flytectl_delete_cluster-resource-attribute` - Deletes matchable resources of cluster attributes -* :doc:`flytectl_delete_execution` - Terminate/Delete execution resources. -* :doc:`flytectl_delete_execution-cluster-label` - Deletes matchable resources of execution cluster label -* :doc:`flytectl_delete_execution-queue-attribute` - Deletes matchable resources of execution queue attributes -* :doc:`flytectl_delete_plugin-override` - Deletes matchable resources of plugin overrides -* :doc:`flytectl_delete_task-resource-attribute` - Deletes matchable resources of task attributes -* :doc:`flytectl_delete_workflow-execution-config` - Deletes matchable resources of workflow execution config +* :doc:`FlyteCTL` - FlyteCTL CLI tool +* :doc:`FlyteCTL_delete_cluster-resource-attribute` - Delete matchable resources of cluster attributes +* :doc:`FlyteCTL_delete_execution` - Terminate/Delete execution resources. +* :doc:`FlyteCTL_delete_execution-cluster-label` - Delete matchable resources of execution cluster label +* :doc:`FlyteCTL_delete_execution-queue-attribute` - Delete matchable resources of execution queue attributes +* :doc:`FlyteCTL_delete_plugin-override` - Delete matchable resources of plugin overrides +* :doc:`FlyteCTL_delete_task-resource-attribute` - Delete matchable resources of task attributes +* :doc:`FlyteCTL_delete_workflow-execution-config` - Delete matchable resources of workflow execution config diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 5e80a706d1..80d749a821 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -1,28 +1,27 @@ -.. _flytectl_delete_cluster-resource-attribute: +.. _FlyteCTL_delete_cluster-resource-attribute: -flytectl delete cluster-resource-attribute +FlyteCTL delete cluster-resource-attribute ------------------------------------------ -Deletes matchable resources of cluster attributes +Delete matchable resources of cluster attributes Synopsis ~~~~~~~~ -Deletes cluster resource attributes for given project and domain combination or additionally with workflow name. +Deletes cluster resource attributes for the given project and domain combination or additionally with workflow name. -Deletes cluster resource attribute for project and domain -Here the command delete cluster resource attributes for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete cluster-resource-attribute -p flytectldemo -d development -Deletes cluster resource attribute using config file which was used for creating it. -Here the command deletes cluster resource attributes from the config file cra.yaml -Attributes are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of cra.yaml which will use the project domain and workflow name for deleting the resource +Deletes cluster resource attribute using config file which was used to create it. +Here, the config file is written to cra.yaml. +Attributes are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. +e.g., content of cra.yaml: :: @@ -37,8 +36,8 @@ eg: content of cra.yaml which will use the project domain and workflow name for foo: "bar" buzz: "lightyear" -Deletes cluster resource attribute for a workflow -Here the command deletes cluster resource attributes for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes cluster resource attribute for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: @@ -49,7 +48,7 @@ Usage :: - flytectl delete cluster-resource-attribute [flags] + FlyteCTL delete cluster-resource-attribute [flags] Options ~~~~~~~ @@ -107,5 +106,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 488a732b58..1938d47b4a 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -1,9 +1,9 @@ -.. _flytectl_delete_execution-cluster-label: +.. _FlyteCTL_delete_execution-cluster-label: -flytectl delete execution-cluster-label +FlyteCTL delete execution-cluster-label --------------------------------------- -Deletes matchable resources of execution cluster label +Delete matchable resources of execution cluster label Synopsis ~~~~~~~~ @@ -12,17 +12,16 @@ Synopsis Deletes execution cluster label for given project and domain combination or additionally with workflow name. -Deletes execution cluster label for project and domain -Here the command delete execution cluster label for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete execution-cluster-label -p flytectldemo -d development Deletes execution cluster label using config file which was used for creating it. -Here the command deletes execution cluster label from the config file ecl.yaml -Value is optional in the file as its unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of ecl.yaml which will use the project domain and workflow name for deleting the resource +Here, the config file is written to ecl.yaml. +Value is optional in the file as it is unread during the delete command but it can be kept since the same file can be used for get, update or delete commands. +e.g., content of ecl.yaml: :: @@ -35,8 +34,8 @@ eg: content of ecl.yaml which will use the project domain and workflow name for project: flytectldemo value: foo -Deletes execution cluster label for a workflow -Here the command deletes execution cluster label for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes execution cluster label for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: @@ -47,7 +46,7 @@ Usage :: - flytectl delete execution-cluster-label [flags] + FlyteCTL delete execution-cluster-label [flags] Options ~~~~~~~ @@ -105,5 +104,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 671eed2879..3f84f50441 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -1,28 +1,27 @@ -.. _flytectl_delete_execution-queue-attribute: +.. _FlyteCTL_delete_execution-queue-attribute: -flytectl delete execution-queue-attribute +FlyteCTL delete execution-queue-attribute ----------------------------------------- -Deletes matchable resources of execution queue attributes +Delete matchable resources of execution queue attributes Synopsis ~~~~~~~~ -Deletes execution queue attributes for given project and domain combination or additionally with workflow name. +Deletes execution queue attributes for the given project and domain combination or additionally with workflow name. -Deletes execution queue attribute for project and domain -Here the command delete execution queue attributes for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete execution-queue-attribute -p flytectldemo -d development Deletes execution queue attribute using config file which was used for creating it. -Here the command deletes execution queue attributes from the config file era.yaml -Tags are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of era.yaml which will use the project domain and workflow name for deleting the resource +Here, the config file is written to era.yaml. +Value is optional in the file as it is unread during the delete command but it can be kept since the same file can be used for get, update or delete commands. +e.g., content of era.yaml: :: @@ -39,8 +38,8 @@ eg: content of era.yaml which will use the project domain and workflow name for - buzz - lightyear -Deletes execution queue attribute for a workflow -Here the command deletes the execution queue attributes for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes execution queue attribute for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: @@ -51,7 +50,7 @@ Usage :: - flytectl delete execution-queue-attribute [flags] + FlyteCTL delete execution-queue-attribute [flags] Options ~~~~~~~ @@ -109,5 +108,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 11ebaa66fd..d84c5d3b55 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -1,6 +1,6 @@ -.. _flytectl_delete_execution: +.. _FlyteCTL_delete_execution: -flytectl delete execution +FlyteCTL delete execution ------------------------- Terminate/Delete execution resources. @@ -12,36 +12,35 @@ Synopsis Terminate executions.(execution,executions can be used interchangeably in these commands) -Task executions can be aborted only if they are in non-terminal state i.e if they are FAILED,ABORTED or SUCCEEDED then -calling terminate on them has no effect. +Task executions can be aborted only if they are in non-terminal state. If they are FAILED, ABORTED or SUCCEEDED, calling terminate on them has no effect. -Terminate a single execution with its name +Terminate a single execution with its name: :: - bin/flytectl delete execution c6a51x2l9e -d development -p flytesnacks + flytectl delete execution c6a51x2l9e -d development -p flytesnacks -You can get executions to check its state. +Get executions to check its state: :: - bin/flytectl get execution -d development -p flytesnacks + flytectl get execution -d development -p flytesnacks ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | c6a51x2l9e | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:13:04.680476300Z | 15.540361300s | ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- -Terminate multiple executions with there names +Terminate multiple executions with their names: :: - bin/flytectl delete execution eeam9s8sny p4wv4hwgc4 -d development -p flytesnacks + flytectl delete execution eeam9s8sny p4wv4hwgc4 -d development -p flytesnacks -Similarly you can get executions to find the state of previously terminated executions. +Get executions to find the state of previously terminated executions: :: - bin/flytectl get execution -d development -p flytesnacks + flytectl get execution -d development -p flytesnacks ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- @@ -57,7 +56,7 @@ Usage :: - flytectl delete execution [flags] + FlyteCTL delete execution [flags] Options ~~~~~~~ @@ -114,5 +113,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index 2328ff9e12..baa2d4355c 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -1,29 +1,27 @@ -.. _flytectl_delete_plugin-override: +.. _FlyteCTL_delete_plugin-override: -flytectl delete plugin-override +FlyteCTL delete plugin-override ------------------------------- -Deletes matchable resources of plugin overrides +Delete matchable resources of plugin overrides Synopsis ~~~~~~~~ -Deletes plugin override for given project and domain combination or additionally with workflow name. +Deletes plugin override for the given project and domain combination or additionally with workflow name. -Deletes plugin override for project and domain -Here the command deletes plugin override for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete plugin-override -p flytectldemo -d development -Deletes plugin override using config file which was used for creating it. -Here the command deletes plugin overrides from the config file po.yaml -Overrides are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of po.yaml which will use the project domain and workflow name for deleting the resource - +Deletes plugin override using config file which was used to create it. +Here, the config file is written to po.yaml. +Overrides are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. +e.g., content of po.yaml: :: flytectl delete plugin-override --attrFile po.yaml @@ -40,8 +38,8 @@ eg: content of po.yaml which will use the project domain and workflow name for - plugin_override2 missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT -Deletes plugin override for a workflow -Here the command deletes the plugin override for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes plugin override for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: @@ -52,7 +50,7 @@ Usage :: - flytectl delete plugin-override [flags] + FlyteCTL delete plugin-override [flags] Options ~~~~~~~ @@ -110,5 +108,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 544712992f..1800977e0f 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -1,28 +1,27 @@ -.. _flytectl_delete_task-resource-attribute: +.. _FlyteCTL_delete_task-resource-attribute: -flytectl delete task-resource-attribute +FlyteCTL delete task-resource-attribute --------------------------------------- -Deletes matchable resources of task attributes +Delete matchable resources of task attributes Synopsis ~~~~~~~~ -Deletes task resource attributes for given project,domain combination or additionally with workflow name. +Deletes task resource attributes for the given project and domain combination, or additionally with workflow name. -Deletes task resource attribute for project and domain -Here the command delete task resource attributes for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete task-resource-attribute -p flytectldemo -d development -Deletes task resource attribute using config file which was used for creating it. -Here the command deletes task resource attributes from the config file tra.yaml -defaults/limits are optional in the file as they are unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of tra.yaml which will use the project domain and workflow name for deleting the resource +Deletes task resource attribute using config file which was used to create it. +Here, the config file is written to tra.yaml. +The defaults/limits are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. +e.g., content of tra.yaml: :: @@ -40,8 +39,8 @@ eg: content of tra.yaml which will use the project domain and workflow name for cpu: "2" memory: "450Mi" -Deletes task resource attribute for a workflow -Here the command deletes task resource attributes for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes task resource attribute for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: @@ -52,7 +51,7 @@ Usage :: - flytectl delete task-resource-attribute [flags] + FlyteCTL delete task-resource-attribute [flags] Options ~~~~~~~ @@ -110,5 +109,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index a97fcc811c..5d23c0547b 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -1,28 +1,27 @@ -.. _flytectl_delete_workflow-execution-config: +.. _FlyteCTL_delete_workflow-execution-config: -flytectl delete workflow-execution-config +FlyteCTL delete workflow-execution-config ----------------------------------------- -Deletes matchable resources of workflow execution config +Delete matchable resources of workflow execution config Synopsis ~~~~~~~~ -Deletes workflow execution config for given project and domain combination or additionally with workflow name. +Deletes workflow execution config for the given project and domain combination or additionally with workflow name. -Deletes workflow execution config label for project and domain -Here the command delete workflow execution config for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl delete workflow-execution-config -p flytectldemo -d development -Deletes workflow execution config using config file which was used for creating it. -Here the command deletes workflow execution config from the config file wec.yaml -Max_parallelism is optional in the file as its unread during the delete command but can be kept as the same file can be used for get, update or delete -eg: content of wec.yaml which will use the project domain and workflow name for deleting the resource +Deletes workflow execution config using config file which was used to create it. +Here, the config file is written to wec.yaml. +Max_parallelism is optional in the file as it is unread during the delete command but can be kept since the same file can be used for get, update or delete commands. +e.g., content of wec.yaml: :: @@ -35,8 +34,8 @@ eg: content of wec.yaml which will use the project domain and workflow name for project: flytectldemo max_parallelism: 5 -Deletes workflow execution config for a workflow -Here the command deletes workflow execution config for a workflow core.control_flow.run_merge_sort.merge_sort +Deletes workflow execution config for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: @@ -47,7 +46,7 @@ Usage :: - flytectl delete workflow-execution-config [flags] + FlyteCTL delete workflow-execution-config [flags] Options ~~~~~~~ @@ -105,5 +104,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Used for terminating/deleting various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 386cee0808..d27ae935a2 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -1,16 +1,16 @@ -.. _flytectl_get: +.. _FlyteCTL_get: -flytectl get +FlyteCTL get ------------ -Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. Synopsis ~~~~~~~~ -Example get projects. +For project, it is: :: flytectl get project @@ -70,16 +70,16 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - flyetcl CLI tool -* :doc:`flytectl_get_cluster-resource-attribute` - Gets matchable resources of cluster resource attributes. -* :doc:`flytectl_get_execution` - Gets execution resources -* :doc:`flytectl_get_execution-cluster-label` - Gets matchable resources of execution cluster label. -* :doc:`flytectl_get_execution-queue-attribute` - Gets matchable resources of execution queue attributes -* :doc:`flytectl_get_launchplan` - Gets launch plan resources -* :doc:`flytectl_get_plugin-override` - Gets matchable resources of plugin override -* :doc:`flytectl_get_project` - Gets project resources -* :doc:`flytectl_get_task` - Gets task resources -* :doc:`flytectl_get_task-resource-attribute` - Gets matchable resources of task attributes -* :doc:`flytectl_get_workflow` - Gets workflow resources -* :doc:`flytectl_get_workflow-execution-config` - Gets matchable resources of workflow execution config +* :doc:`FlyteCTL` - FlyteCTL CLI tool +* :doc:`FlyteCTL_get_cluster-resource-attribute` - Get matchable resources of cluster resource attributes. +* :doc:`FlyteCTL_get_execution` - Get execution resources +* :doc:`FlyteCTL_get_execution-cluster-label` - Get matchable resources of execution cluster label. +* :doc:`FlyteCTL_get_execution-queue-attribute` - Get matchable resources of execution queue attributes +* :doc:`FlyteCTL_get_launchplan` - Get launch plan resources +* :doc:`FlyteCTL_get_plugin-override` - Get matchable resources of plugin override +* :doc:`FlyteCTL_get_project` - Get project resources +* :doc:`FlyteCTL_get_task` - Get task resources +* :doc:`FlyteCTL_get_task-resource-attribute` - Get matchable resources of task attributes +* :doc:`FlyteCTL_get_workflow` - Get workflow resources +* :doc:`FlyteCTL_get_workflow-execution-config` - Get matchable resources of workflow execution config diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index ea44a874bd..059cfe64a5 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -1,42 +1,42 @@ -.. _flytectl_get_cluster-resource-attribute: +.. _FlyteCTL_get_cluster-resource-attribute: -flytectl get cluster-resource-attribute +FlyteCTL get cluster-resource-attribute --------------------------------------- -Gets matchable resources of cluster resource attributes. +Get matchable resources of cluster resource attributes. Synopsis ~~~~~~~~ -Retrieve cluster resource attributes for the given project and domain. -Here, the command gets cluster resource attributes for the project flytectldemo and development domain. +Retrieves cluster resource attributes for the given project and domain. +For project flytectldemo and development domain, it is: :: flytectl get cluster-resource-attribute -p flytectldemo -d development -eg : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} -Retrieve cluster resource attributes for the given project, domain, and workflow. -Here, the command gets cluster resource attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. +Retrieves cluster resource attributes for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} -Writes the cluster resource attributes to a file. If there are no cluster resource attributes,the command throws an error. -Here, the command gets the task resource attributes and writes the config file to cra.yaml file. -eg: content of cra.yaml +Writes the cluster resource attributes to a file. If there are no cluster resource attributes, the command throws an error. +Here, the config file is written to cra.yaml file: +e.g., content of cra.yaml :: @@ -56,7 +56,7 @@ Usage :: - flytectl get cluster-resource-attribute [flags] + FlyteCTL get cluster-resource-attribute [flags] Options ~~~~~~~ @@ -113,5 +113,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index e25ecb4e84..1db5d7980c 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -1,44 +1,43 @@ -.. _flytectl_get_execution-cluster-label: +.. _FlyteCTL_get_execution-cluster-label: -flytectl get execution-cluster-label +FlyteCTL get execution-cluster-label ------------------------------------ -Gets matchable resources of execution cluster label. +Get matchable resources of execution cluster label. Synopsis ~~~~~~~~ -// Retrieves the execution cluster label for a given project and domain, combination or additionally with workflow name. +Retrieves the execution cluster label for a given project and domain, combination or additionally with workflow name. -Retrieve the execution cluster label for the given project and domain. -Here the command get execution cluster label for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl get execution-cluster-label -p flytectldemo -d development -e.g. : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","value":"foo"} Retrieve the execution cluster label for the given project, domain and workflow. -Here, the command gets the execution cluster label for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: flytectl get execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","value":"foo"} -Writes the execution cluster label to a file. If there is no execution cluster label, command throws an error. -Here, the command gets the execution cluster label and writes the config file to ecl.yaml file. -eg: content of ecl.yaml +Write the execution cluster label to a file. If there is no execution cluster label, the command throws an error. +Here, the config file is written to ecl.yaml, +e.g., content of ecl.yaml: :: @@ -56,7 +55,7 @@ Usage :: - flytectl get execution-cluster-label [flags] + FlyteCTL get execution-cluster-label [flags] Options ~~~~~~~ @@ -113,5 +112,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index 04f8d0b24b..e56c92e39e 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -1,42 +1,42 @@ -.. _flytectl_get_execution-queue-attribute: +.. _FlyteCTL_get_execution-queue-attribute: -flytectl get execution-queue-attribute +FlyteCTL get execution-queue-attribute -------------------------------------- -Gets matchable resources of execution queue attributes +Get matchable resources of execution queue attributes Synopsis ~~~~~~~~ -Retrieve the execution queue attribute for the given project and domain. -Here, the command gets execution queue attributes for the project flytectldemo and development domain. +Retrieves the execution queue attribute for the given project and domain. +For project flytectldemo and development domain, it is: :: flytectl get execution-queue-attribute -p flytectldemo -d development -e.g. : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} -Retrieve the execution queue attribute for the given project, domain, and workflow. -Here, the command gets execution queue attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. +Retrieves the execution queue attribute for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g. : output from the command +e.g., output from the command .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","tags":["foo", "bar"]} Write the execution queue attribute to a file. If there are no execution queue attributes, the command throws an error. -Here, the command gets the execution queue attributes and writes the config to era.yaml file. -e.g. : content of era.yaml +Here, the config file is written to era.yaml, +e.g., content of era.yaml: :: @@ -58,7 +58,7 @@ Usage :: - flytectl get execution-queue-attribute [flags] + FlyteCTL get execution-queue-attribute [flags] Options ~~~~~~~ @@ -115,5 +115,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 29e0e06706..714a6ddeae 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -1,81 +1,81 @@ -.. _flytectl_get_execution: +.. _FlyteCTL_get_execution: -flytectl get execution +FlyteCTL get execution ---------------------- -Gets execution resources +Get execution resources Synopsis ~~~~~~~~ -Retrieve all executions within the project and domain (execution, executions can be used interchangeably). +Retrieve all executions within the project and domain (execution, executions can be used interchangeably): :: - bin/flytectl get execution -p flytesnacks -d development + flytectl get execution -p flytesnacks -d development -Retrieves executions by name within the project and domain. +Retrieve executions by name within the project and domain: :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r + flytectl get execution -p flytesnacks -d development oeh94k9r2r -Retrieves all the executions with filters. +Retrieve all the executions with filters: :: - bin/flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" + flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" -Retrieve executions as per the specified limit and sorting parameters. +Retrieve executions as per the specified limit and sorting parameters: :: - bin/flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc + flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieve executions within the project and domain in YAML format. +Retrieve executions within the project and domain in YAML format: :: - bin/flytectl get execution -p flytesnacks -d development -o yaml + flytectl get execution -p flytesnacks -d development -o yaml -Retrieve executions within the project and domain in JSON format. +Retrieve executions within the project and domain in JSON format: :: - bin/flytectl get execution -p flytesnacks -d development -o json + flytectl get execution -p flytesnacks -d development -o json Get more details of the execution using the --details flag, which shows node and task executions. The default view is a tree view, and the TABLE view format is not supported on this view. :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details + flytectl get execution -p flytesnacks -d development oeh94k9r2r --details Fetch execution details in YAML format. In this view, only node details are available. For task, send the --nodeID flag. :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml + flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml Fetch task executions on a specific node using the --nodeID flag. Use the nodeID attribute given by the node details view. :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodeID n0 + flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodeID n0 Task execution view is also available in YAML/JSON format. The following example showcases YAML, where the output also contains input and output data of each node. :: - bin/flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 -o yaml + flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 -o yaml Usage :: - flytectl get execution [flags] + FlyteCTL get execution [flags] Options ~~~~~~~ @@ -137,5 +137,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 2a3c0c1dc3..6d2c4fcafa 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -1,69 +1,69 @@ -.. _flytectl_get_launchplan: +.. _FlyteCTL_get_launchplan: -flytectl get launchplan +FlyteCTL get launchplan ----------------------- -Gets launch plan resources +Get launch plan resources Synopsis ~~~~~~~~ -Retrieve all launch plans within the project and domain (launchplan, launchplans can be used interchangeably). +Retrieve all launch plans within the project and domain (launch plan, launch plans can be used interchangeably): :: flytectl get launchplan -p flytesnacks -d development - Retrieve a launch plan by name within the project and domain. + Retrieve a launch plan by name within the project and domain: :: flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet -Retrieve the latest version of the task by name within the project and domain. +Retrieve the latest version of the task by name within the project and domain: :: flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --latest -Retrieves a particular version of the launch plan by name within the project and domain. +Retrieve a particular version of the launch plan by name within the project and domain: :: flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --version v2 -Retrieves all the launch plans with filters. +Retrieve all the launch plans with filters: :: - bin/flytectl get launchplan -p flytesnacks -d development --filter.fieldSelector="name=core.basic.lp.go_greet" + flytectl get launchplan -p flytesnacks -d development --filter.fieldSelector="name=core.basic.lp.go_greet" -Retrieves launch plans entity search across all versions with filters. +Retrieve launch plans entity search across all versions with filters: :: - bin/flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="version=v1" + flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="version=v1" -Retrieves all the launch plans with limit and sorting. +Retrieve all the launch plans with limit and sorting: :: - bin/flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc + flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all launch plans within the project and domain in YAML format. +Retrieve all launch plans within the project and domain in YAML format: :: flytectl get launchplan -p flytesnacks -d development -o yaml -Retrieves all launch plans the within the project and domain in JSON format. +Retrieve all launch plans the within the project and domain in JSON format: :: flytectl get launchplan -p flytesnacks -d development -o json -Retrieve a launch plan within the project and domain as per a version and generate the execution spec file; the file can be used to launch the execution using the 'create execution' command. +Retrieve a launch plan within the project and domain as per a version and generate the execution spec file; the file can be used to launch the execution using the 'create execution' command: :: @@ -92,7 +92,7 @@ Usage :: - flytectl get launchplan [flags] + FlyteCTL get launchplan [flags] Options ~~~~~~~ @@ -155,5 +155,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index 0c7668510e..30d89032b1 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -1,23 +1,23 @@ -.. _flytectl_get_plugin-override: +.. _FlyteCTL_get_plugin-override: -flytectl get plugin-override +FlyteCTL get plugin-override ---------------------------- -Gets matchable resources of plugin override +Get matchable resources of plugin override Synopsis ~~~~~~~~ -Retrieve the plugin overrides for the given project and domain. -Here, the command gets the plugin overrides for the project flytectldemo and development domain. +Retrieves the plugin override for the given project and domain. +For project flytectldemo and development domain, it is: :: flytectl get plugin-override -p flytectldemo -d development -e.g. : output from the command +e.g., output from the command .. code-block:: json @@ -31,14 +31,14 @@ e.g. : output from the command }] } -Retrieves the plugin overrides for project, domain and workflow -Here the command gets the plugin overrides for project flytectldemo, development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieves the plugin override for the given project, domain and workflow. +For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: flytectl get plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g. : output from the command +e.g., output from the command: .. code-block:: json @@ -53,9 +53,9 @@ e.g. : output from the command }] } -Writing the plugin overrides to a file. If there are no plugin overrides, command would return an error. -Here the command gets plugin overrides and writes the config file to po.yaml -eg: content of po.yaml +Write plugin overrides to a file. If there are no plugin overrides, the command returns an error. +Here, the config file is written to po.yaml, +e.g., content of po.yaml: :: @@ -78,7 +78,7 @@ Usage :: - flytectl get plugin-override [flags] + FlyteCTL get plugin-override [flags] Options ~~~~~~~ @@ -135,5 +135,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index ffebba44d6..cad73c12d6 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -1,54 +1,54 @@ -.. _flytectl_get_project: +.. _FlyteCTL_get_project: -flytectl get project +FlyteCTL get project -------------------- -Gets project resources +Get project resources Synopsis ~~~~~~~~ -Retrieves all the projects.(project,projects can be used interchangeably in these commands) +Retrieve all the projects. (project,projects can be used interchangeably in these commands): :: - bin/flytectl get project + flytectl get project -Retrieves project by name +Retrieve project by name: :: - bin/flytectl get project flytesnacks + flytectl get project flytesnacks -Retrieves all the projects with filters. +Retrieve all the projects with filters: :: - bin/flytectl get project --filter.fieldSelector="project.name=flytesnacks" + flytectl get project --filter.fieldSelector="project.name=flytesnacks" -Retrieves all the projects with limit and sorting. +Retrieve all the projects with limit and sorting: :: - bin/flytectl get project --filter.sortBy=created_at --filter.limit=1 --filter.asc + flytectl get project --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the projects in yaml format +Retrieve all the projects in yaml format: :: - bin/flytectl get project -o yaml + flytectl get project -o yaml -Retrieves all the projects in json format +Retrieve all the projects in json format: :: - bin/flytectl get project -o json + flytectl get project -o json Usage :: - flytectl get project [flags] + FlyteCTL get project [flags] Options ~~~~~~~ @@ -108,5 +108,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 1122ce6411..384345cd0c 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -1,34 +1,34 @@ -.. _flytectl_get_task-resource-attribute: +.. _FlyteCTL_get_task-resource-attribute: -flytectl get task-resource-attribute +FlyteCTL get task-resource-attribute ------------------------------------ -Gets matchable resources of task attributes +Get matchable resources of task attributes Synopsis ~~~~~~~~ -Retrieve task resource attributes for the given project and domain. -Here, the command gets the task resource attributes for the project flytectldemo and development domain. +Retrieves task resource attributes for the given project and domain. +For project flytectldemo and development domain, it is: :: flytectl get task-resource-attribute -p flytectldemo -d development -e.g. : output from the command +e.g., output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} -Retrieve task resource attributes for the given project, domain, and workflow. -Here, the command gets task resource attributes for the project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort'. +Retrieves task resource attributes for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g. : output from the command +e.g., output from the command: .. code-block:: json @@ -36,8 +36,8 @@ e.g. : output from the command Write the task resource attributes to a file. If there are no task resource attributes, a file would be populated with the basic data. -Here the command gets task resource attributes and writes the config file to tra.yaml -e.g. : content of tra.yaml +Here, the config file is written to tra.yaml, +e.g., content of tra.yaml: :: @@ -60,7 +60,7 @@ Usage :: - flytectl get task-resource-attribute [flags] + FlyteCTL get task-resource-attribute [flags] Options ~~~~~~~ @@ -117,5 +117,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 38db5a9318..cc76eff200 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -1,71 +1,71 @@ -.. _flytectl_get_task: +.. _FlyteCTL_get_task: -flytectl get task +FlyteCTL get task ----------------- -Gets task resources +Get task resources Synopsis ~~~~~~~~ -Retrieves all the task within project and domain.(task,tasks can be used interchangeably in these commands) +Retrieve all the tasks within project and domain(task,tasks can be used interchangeably in these commands): :: - bin/flytectl get task -p flytesnacks -d development + flytectl get task -p flytesnacks -d development -Retrieves task by name within project and domain. +Retrieve task by name within project and domain: :: - bin/flytectl task -p flytesnacks -d development core.basic.lp.greet + flytectl task -p flytesnacks -d development core.basic.lp.greet -Retrieves latest version of task by name within project and domain. +Retrieve latest version of task by name within project and domain: :: flytectl get task -p flytesnacks -d development core.basic.lp.greet --latest -Retrieves particular version of task by name within project and domain. +Retrieve particular version of task by name within project and domain: :: flytectl get task -p flytesnacks -d development core.basic.lp.greet --version v2 -Retrieves all the tasks with filters. +Retrieve all the tasks with filters: :: - bin/flytectl get task -p flytesnacks -d development --filter.fieldSelector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" + flytectl get task -p flytesnacks -d development --filter.fieldSelector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" -Retrieve a specific task with filters. +Retrieve a specific task with filters: :: - bin/flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.fieldSelector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" + flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.fieldSelector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" -Retrieves all the task with limit and sorting. +Retrieve all the tasks with limit and sorting: :: - bin/flytectl get -p flytesnacks -d development task --filter.sortBy=created_at --filter.limit=1 --filter.asc + flytectl get -p flytesnacks -d development task --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the tasks within project and domain in yaml format. +Retrieve all the tasks within project and domain in yaml format: :: - bin/flytectl get task -p flytesnacks -d development -o yaml + flytectl get task -p flytesnacks -d development -o yaml -Retrieves all the tasks within project and domain in json format. +Retrieve all the tasks within project and domain in json format: :: - bin/flytectl get task -p flytesnacks -d development -o json + flytectl get task -p flytesnacks -d development -o json -Retrieves a tasks within project and domain for a version and generate the execution spec file for it to be used for launching the execution using create execution. +Retrieve tasks within project and domain for a version and generate the execution spec file for it to be used for launching the execution using create execution: :: - bin/flytectl get tasks -d development -p flytesnacks core.advanced.run_merge_sort.merge --execFile execution_spec.yaml --version v2 + flytectl get tasks -d development -p flytesnacks core.advanced.run_merge_sort.merge --execFile execution_spec.yaml --version v2 -The generated file would look similar to this +The generated file would look similar to this: .. code-block:: yaml @@ -88,7 +88,7 @@ Usage :: - flytectl get task [flags] + FlyteCTL get task [flags] Options ~~~~~~~ @@ -151,5 +151,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index 1554f40e6a..12acb14f89 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -1,25 +1,24 @@ -.. _flytectl_get_workflow-execution-config: +.. _FlyteCTL_get_workflow-execution-config: -flytectl get workflow-execution-config +FlyteCTL get workflow-execution-config -------------------------------------- -Gets matchable resources of workflow execution config +Get matchable resources of workflow execution config Synopsis ~~~~~~~~ -Retrieves workflow execution config for given project and domain combination or additionally with workflow name. +Retrieves workflow execution config for the given project and domain combination or additionally with workflow name. -Retrieves workflow execution config for project and domain -Here the command get workflow execution config for project flytectldemo and development domain. +For project flytectldemo and development domain, it is: :: flytectl get workflow-execution-config -p flytectldemo -d development -eg : output from the command +e.g., output from the command .. code-block:: json @@ -29,14 +28,14 @@ eg : output from the command "max_parallelism": 5 } -Retrieves workflow execution config for project and domain and workflow -Here the command get workflow execution config for project flytectldemo ,development domain and workflow core.control_flow.run_merge_sort.merge_sort +Retrieves workflow execution config for the project, domain and workflow. +For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: :: flytectl get workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -eg : output from the command +e.g., output from the command .. code-block:: json @@ -47,9 +46,9 @@ eg : output from the command "max_parallelism": 5 } -Writing the workflow execution config to a file. If there are no workflow execution config, command would return an error. -Here the command gets workflow execution config and writes the config file to wec.yaml -eg: content of wec.yaml +Writing the workflow execution config to a file. If there are no workflow execution config, the command would return an error. +Here, the config file is written to wec.yaml, +e.g., content of wec.yaml: :: @@ -67,7 +66,7 @@ Usage :: - flytectl get workflow-execution-config [flags] + FlyteCTL get workflow-execution-config [flags] Options ~~~~~~~ @@ -124,5 +123,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 031274ae61..6edd90c438 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -1,72 +1,72 @@ -.. _flytectl_get_workflow: +.. _FlyteCTL_get_workflow: -flytectl get workflow +FlyteCTL get workflow --------------------- -Gets workflow resources +Get workflow resources Synopsis ~~~~~~~~ -Retrieves all the workflows within project and domain.(workflow,workflows can be used interchangeably in these commands) +Retrieve all the workflows within project and domain (workflow,workflows can be used interchangeably in these commands): :: flytectl get workflow -p flytesnacks -d development -Retrieves workflow by name within project and domain. +Retrieve workflow by name within project and domain: :: flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet -Retrieves latest version of workflow by name within project and domain. +Retrieve latest version of workflow by name within project and domain: :: flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet --latest -Retrieves particular version of workflow by name within project and domain. +Retrieve particular version of workflow by name within project and domain: :: flytectl get workflow -p flytesnacks -d development core.basic.lp.go_greet --version v2 -Retrieves all the workflows with filters. +Retrieve all the workflows with filters: :: - bin/flytectl get workflow -p flytesnacks -d development --filter.fieldSelector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" + flytectl get workflow -p flytesnacks -d development --filter.fieldSelector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" -Retrieve specific workflow with filters. +Retrieve specific workflow with filters: :: - bin/flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="workflow.version=v1" + flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="workflow.version=v1" -Retrieves all the workflows with limit and sorting. +Retrieve all the workflows with limit and sorting: :: - bin/flytectl get -p flytesnacks -d development workflow --filter.sortBy=created_at --filter.limit=1 --filter.asc + flytectl get -p flytesnacks -d development workflow --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the workflow within project and domain in yaml format. +Retrieve all the workflows within project and domain in yaml format: :: flytectl get workflow -p flytesnacks -d development -o yaml -Retrieves all the workflow within project and domain in json format. +Retrieve all the workflow within project and domain in json format: :: flytectl get workflow -p flytesnacks -d development -o json -Visualize the graph for a workflow within project and domain in dot format. +Visualize the graph for a workflow within project and domain in dot format: :: flytectl get workflow -p flytesnacks -d development core.flyte_basics.basic_workflow.my_wf --latest -o dot -Visualize the graph for a workflow within project and domain in a dot content render. +Visualize the graph for a workflow within project and domain in a dot content render: :: @@ -77,7 +77,7 @@ Usage :: - flytectl get workflow [flags] + FlyteCTL get workflow [flags] Options ~~~~~~~ @@ -139,5 +139,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Used for fetching various flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index e21ebd27c5..199911f0fd 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -1,9 +1,9 @@ -.. _flytectl_register: +.. _FlyteCTL_register: -flytectl register +FlyteCTL register ----------------- -Registers tasks/workflows/launchplans from list of generated serialized files. +Register tasks/workflows/launchplans from a list of generated serialized files. Synopsis ~~~~~~~~ @@ -11,9 +11,9 @@ Synopsis Takes input files as serialized versions of the tasks/workflows/launchplans and registers them with flyteadmin. -Currently these input files are protobuf files generated as output from flytekit serialize. -Project & Domain are mandatory fields to be passed for registration and an optional version which defaults to v1 -If the entities are already registered with flyte for the same version then registration would fail. +Currently, these input files are protobuf files generated as output from Flytekit serialize. +Project & Domain are mandatory fields to be passed for registration and an optional version which defaults to v1. +If the entities are already registered with Flyte for the same version, the registration would fail. Options @@ -70,7 +70,7 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - flyetcl CLI tool -* :doc:`flytectl_register_examples` - Registers flytesnack example -* :doc:`flytectl_register_files` - Registers file resources +* :doc:`FlyteCTL` - FlyteCTL CLI tool +* :doc:`FlyteCTL_register_examples` - Register Flytesnacks example +* :doc:`FlyteCTL_register_files` - Register file resources diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 8a01a27d65..06ac0bec81 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -1,32 +1,32 @@ -.. _flytectl_register_examples: +.. _FlyteCTL_register_examples: -flytectl register examples +FlyteCTL register examples -------------------------- -Registers flytesnack example +Register Flytesnacks example Synopsis ~~~~~~~~ -Registers all latest flytesnacks example +Register all latest Flytesnacks examples: :: - bin/flytectl register examples -d development -p flytesnacks + flytectl register examples -d development -p flytesnacks -Registers specific release of flytesnacks example +Register specific release of Flytesnacks examples: :: - bin/flytectl register examples -d development -p flytesnacks --version v0.2.176 + flytectl register examples -d development -p flytesnacks --version v0.2.176 -Note: register command automatically override the version with release version +Note: The register command automatically override the version with release version Usage :: - flytectl register examples [flags] + FlyteCTL register examples [flags] Options ~~~~~~~ @@ -91,5 +91,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. +* :doc:`FlyteCTL_register` - Register tasks/workflows/launchplans from a list of generated serialized files. diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index f25b6597fb..b361d481c7 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -1,9 +1,9 @@ -.. _flytectl_register_files: +.. _FlyteCTL_register_files: -flytectl register files +FlyteCTL register files ----------------------- -Registers file resources +Register file resources Synopsis ~~~~~~~~ @@ -11,81 +11,81 @@ Synopsis Registers all the serialized protobuf files including tasks, workflows and launchplans with default v1 version. -If there are already registered entities with v1 version then the command will fail immediately on the first such encounter. +If previously registered entities with v1 version are present, the command will fail immediately on the first such encounter. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks + flytectl register file _pb_output/* -d development -p flytesnacks -There is no difference between registration and fast registration, In fast registration, the input provided by the user is fast serialized proto that is generated by pyflyte. If Flytectl finds any source code in users's input then it will consider registration as fast registration. Flytectl finds input file by searching an archive file whose name starts with fast and has .tar.gz extension When the user runs pyflyte with --fast flag then pyflyte creates serialize proto and it also archive create source code archive file in the same directory. -SourceUploadPath is an optional flag. By default, flytectl will create SourceUploadPath from your storage config. In case of s3 flytectl will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. +There is no difference between registration and fast registration. In fast registration, the input provided by the user is fast serialized proto that is generated by pyflyte. If FlyteCTL finds any source code in users' input, it considers the registration as fast registration. FlyteCTL finds input file by searching an archive file whose name starts with fast and has .tar.gz extension. When the user runs pyflyte with --fast flag then pyflyte creates serialize proto and it also creates source code archive file in the same directory. +SourceUploadPath is an optional flag. By default, FlyteCTL will create SourceUploadPath from your storage config. In case of s3 FlyteCTL will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 -In case of fast registration, If the SourceUploadPath flag is defined then In this case flytectl will not use the default directory for uploading the source code, it will override the destination path on the registration +In case of fast registration, if the SourceUploadPath flag is defined, FlyteCTL will not use the default directory to upload the source code. Instead, it will override the destination path on the registration. :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" -Using archive file.Currently supported are .tgz and .tar extension files and can be local or remote file served through http/https. -Use --archive flag. +Using archive file. Currently supported extensions are .tgz and .tar. They can be local or remote files served through http/https. +Use --archive flag: :: - bin/flytectl register files http://localhost:8080/_pb_output.tar -d development -p flytesnacks --archive + flytectl register files http://localhost:8080/_pb_output.tar -d development -p flytesnacks --archive -Using local tgz file. +Using local tgz file: :: - bin/flytectl register files _pb_output.tgz -d development -p flytesnacks --archive + flytectl register files _pb_output.tgz -d development -p flytesnacks --archive -If you want to continue executing registration on other files ignoring the errors including version conflicts then pass in the continueOnError flag. +If you wish to continue executing registration on other files by ignoring the errors including the version conflicts, then send the continueOnError flag: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -Using short format of continueOnError flag +Using short format of continueOnError flag: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -Overriding the default version v1 using version string. +Override the default version v1 using version string: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --version v2 + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 -Change the o/p format has not effect on registration. The O/p is currently available only in table format. +Changing the o/p format has no effect on the registration. The O/p is currently available only in table format: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -o yaml + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError -o yaml -Override IamRole during registration. +Override IamRole during registration: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -i "arn:aws:iam::123456789:role/dummy" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -i "arn:aws:iam::123456789:role/dummy" -Override Kubernetes service account during registration. +Override Kubernetes service account during registration: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -k "kubernetes-service-account" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -k "kubernetes-service-account" -Override Output location prefix during registration. +Override Output location prefix during registration: :: - bin/flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -l "s3://dummy/prefix" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -l "s3://dummy/prefix" Usage :: - flytectl register files [flags] + FlyteCTL register files [flags] Options ~~~~~~~ @@ -150,5 +150,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_register` - Registers tasks/workflows/launchplans from list of generated serialized files. +* :doc:`FlyteCTL_register` - Register tasks/workflows/launchplans from a list of generated serialized files. diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 3b77cb201e..05b115d066 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -1,6 +1,6 @@ -.. _flytectl_sandbox: +.. _FlyteCTL_sandbox: -flytectl sandbox +FlyteCTL sandbox ---------------- Used for sandbox interactions like start/teardown/status/exec. @@ -10,29 +10,29 @@ Synopsis -The Flyte Sandbox is a fully standalone minimal environment for running Flyte. provides a simplified way of running flyte-sandbox as a single Docker container running locally. +The Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte sandbox as a single Docker container locally. -Create sandbox cluster. +Create sandbox cluster: :: - bin/flytectl sandbox start + flytectl sandbox start -Remove sandbox cluster. +Remove sandbox cluster: :: - bin/flytectl sandbox teardown + flytectl sandbox teardown -Check status of sandbox container. +Check status of sandbox container: :: - bin/flytectl sandbox status + flytectl sandbox status -Execute command inside sandbox container. +Execute command inside sandbox container: :: - bin/flytectl sandbox exec -- pwd + flytectl sandbox exec -- pwd Options @@ -89,9 +89,9 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - flyetcl CLI tool -* :doc:`flytectl_sandbox_exec` - Execute non-interactive command inside the sandbox container -* :doc:`flytectl_sandbox_start` - Start the flyte sandbox cluster -* :doc:`flytectl_sandbox_status` - Get the status of the sandbox environment. -* :doc:`flytectl_sandbox_teardown` - Teardown will cleanup the sandbox environment +* :doc:`FlyteCTL` - FlyteCTL CLI tool +* :doc:`FlyteCTL_sandbox_exec` - Execute non-interactive command inside the sandbox container +* :doc:`FlyteCTL_sandbox_start` - Start the flyte sandbox cluster +* :doc:`FlyteCTL_sandbox_status` - Get status of the sandbox environment. +* :doc:`FlyteCTL_sandbox_teardown` - Teardown cleans up the sandbox environment diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index bd9c0ec4e9..c89b580c0b 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -1,6 +1,6 @@ -.. _flytectl_sandbox_exec: +.. _FlyteCTL_sandbox_exec: -flytectl sandbox exec +FlyteCTL sandbox exec --------------------- Execute non-interactive command inside the sandbox container @@ -10,16 +10,16 @@ Synopsis -Execute command will run non-interactive command inside the sandbox container and return immediately with the output.By default flytectl exec in /root directory inside the sandbox container +Runs non-interactive command inside the Sandbox container and immediately returns the output. By default, flytectl exec is present in /root directory inside the Sandbox container. :: - bin/flytectl sandbox exec -- ls -al + flytectl sandbox exec -- ls -al Usage :: - flytectl sandbox exec [flags] + FlyteCTL sandbox exec [flags] Options ~~~~~~~ @@ -75,5 +75,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`FlyteCTL_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 3c48e3ad2b..1b7cd78ed8 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -1,6 +1,6 @@ -.. _flytectl_sandbox_start: +.. _FlyteCTL_sandbox_start: -flytectl sandbox start +FlyteCTL sandbox start ---------------------- Start the flyte sandbox cluster @@ -10,32 +10,32 @@ Synopsis -The Flyte Sandbox is a fully standalone minimal environment for running Flyte. provides a simplified way of running flyte-sandbox as a single Docker container running locally. +The Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte sandbox as a single Docker container locally. -Start sandbox cluster without any source code +Start sandbox cluster without any source code: :: flytectl sandbox start -Mount your source code repository inside sandbox +Mount your source code repository inside sandbox: :: flytectl sandbox start --source=$HOME/flyteorg/flytesnacks -Run specific version of flyte. flytectl sandbox only support flyte version available in Github release https://github.com/flyteorg/flyte/tags +Run specific version of Flyte. FlyteCTL sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. :: flytectl sandbox start --version=v0.14.0 -Note: Flytectl sandbox is only supported for Flyte versions > v0.10.0 +Note: FlyteCTL sandbox is only supported for Flyte versions > v0.10.0 -Specify a Flyte Sandbox compliant image with the registry. This is useful, in case you want to use an image from your registry. +Specify a Flyte Sandbox compliant image with the registry. This is useful in case you want to use an image from your registry. :: flytectl sandbox start --image docker.io/my-override:latest -Specify a Flyte Sandbox image pull policy. Possible pull policy values are Always, IfNotPresent, or Never +Specify a Flyte Sandbox image pull policy. Possible pull policy values are Always, IfNotPresent, or Never: :: flytectl sandbox start --image docker.io/my-override:latest --imagePullPolicy Always @@ -44,7 +44,7 @@ Usage :: - flytectl sandbox start [flags] + FlyteCTL sandbox start [flags] Options ~~~~~~~ @@ -104,5 +104,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`FlyteCTL_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 017b0e0b0f..b61887f15c 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -1,28 +1,27 @@ -.. _flytectl_sandbox_status: +.. _FlyteCTL_sandbox_status: -flytectl sandbox status +FlyteCTL sandbox status ----------------------- -Get the status of the sandbox environment. +Get status of the sandbox environment. Synopsis ~~~~~~~~ -Status will retrieve the status of the Sandbox environment. Currently FlyteSandbox runs as a local docker container. -This will return the docker status for this container +Retrieve the status of the Sandbox environment. Currently, Flyte Sandbox runs as a local Docker container. Usage :: - bin/flytectl sandbox status + flytectl sandbox status :: - flytectl sandbox status [flags] + FlyteCTL sandbox status [flags] Options ~~~~~~~ @@ -78,5 +77,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`FlyteCTL_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index b48d24452f..ca2a13d800 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -1,19 +1,19 @@ -.. _flytectl_sandbox_teardown: +.. _FlyteCTL_sandbox_teardown: -flytectl sandbox teardown +FlyteCTL sandbox teardown ------------------------- -Teardown will cleanup the sandbox environment +Teardown cleans up the sandbox environment Synopsis ~~~~~~~~ -Teardown will remove sandbox cluster and all the flyte config created by sandbox start +Teardown removes Sandbox cluster and all the Flyte config created by sandbox start: :: - bin/flytectl sandbox teardown + flytectl sandbox teardown Usage @@ -21,7 +21,7 @@ Usage :: - flytectl sandbox teardown [flags] + FlyteCTL sandbox teardown [flags] Options ~~~~~~~ @@ -77,5 +77,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`FlyteCTL_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index cb65073fef..a4276dfa44 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -1,21 +1,21 @@ -.. _flytectl_update: +.. _FlyteCTL_update: -flytectl update +FlyteCTL update --------------- -Used for updating flyte resources eg: project. +Update Flyte resources e.g., project. Synopsis ~~~~~~~~ -Currently this command only provides subcommands to update project. -Takes input project which need to be archived or unarchived. Name of the project to be updated is mandatory field. -Example update project to activate it. +Currently, this command only provides subcommands to update project. +Takes input project that needs to be archived or unarchived. Name of the project to be updated is a mandatory field. +To update a project: :: - bin/flytectl update project -p flytesnacks --activateProject + flytectl update project -p flytesnacks --activateProject Options @@ -72,16 +72,16 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - flyetcl CLI tool -* :doc:`flytectl_update_cluster-resource-attribute` - Updates matchable resources of cluster attributes -* :doc:`flytectl_update_execution-cluster-label` - Updates matchable resources of execution cluster label -* :doc:`flytectl_update_execution-queue-attribute` - Updates matchable resources of execution queue attributes -* :doc:`flytectl_update_launchplan` - Updates launch plan status -* :doc:`flytectl_update_launchplan-meta` - Updates launch plan metadata -* :doc:`flytectl_update_plugin-override` - Updates matchable resources of plugin overrides -* :doc:`flytectl_update_project` - Updates project resources -* :doc:`flytectl_update_task-meta` - Updates task metadata -* :doc:`flytectl_update_task-resource-attribute` - Updates matchable resources of task attributes -* :doc:`flytectl_update_workflow-execution-config` - Updates matchable resources of workflow execution config -* :doc:`flytectl_update_workflow-meta` - Updates workflow metadata +* :doc:`FlyteCTL` - FlyteCTL CLI tool +* :doc:`FlyteCTL_update_cluster-resource-attribute` - Update matchable resources of cluster attributes +* :doc:`FlyteCTL_update_execution-cluster-label` - Update matchable resources of execution cluster label +* :doc:`FlyteCTL_update_execution-queue-attribute` - Update matchable resources of execution queue attributes +* :doc:`FlyteCTL_update_launchplan` - Update launch plan status +* :doc:`FlyteCTL_update_launchplan-meta` - Update launch plan metadata +* :doc:`FlyteCTL_update_plugin-override` - Update matchable resources of plugin overrides +* :doc:`FlyteCTL_update_project` - Update project resources +* :doc:`FlyteCTL_update_task-meta` - Update task metadata +* :doc:`FlyteCTL_update_task-resource-attribute` - Update matchable resources of task attributes +* :doc:`FlyteCTL_update_workflow-execution-config` - Update matchable resources of workflow execution config +* :doc:`FlyteCTL_update_workflow-meta` - Update workflow metadata diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 9f1ca738f9..25b31bb004 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -1,9 +1,9 @@ -.. _flytectl_update_cluster-resource-attribute: +.. _FlyteCTL_update_cluster-resource-attribute: -flytectl update cluster-resource-attribute +FlyteCTL update cluster-resource-attribute ------------------------------------------ -Updates matchable resources of cluster attributes +Update matchable resources of cluster attributes Synopsis ~~~~~~~~ @@ -12,9 +12,9 @@ Synopsis Updates cluster resource attributes for given project and domain combination or additionally with workflow name. -Updating to the cluster resource attribute is only available from a generated file. See the get section for generating this file. -Here the command updates takes the input for cluster resource attributes from the config file cra.yaml -eg: content of cra.yaml +Updating to the cluster resource attribute is only available from a generated file. See the get section to generate this file. +It takes input for cluster resource attributes from the config file cra.yaml, +e.g., content of cra.yaml: .. code-block:: yaml @@ -28,12 +28,12 @@ eg: content of cra.yaml flytectl update cluster-resource-attribute --attrFile cra.yaml -Updating cluster resource attribute for project and domain and workflow combination. This will take precedence over any other +Updates cluster resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. -Also this will completely overwrite any existing custom project and domain and workflow combination attributes. -Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values -Refer to get cluster-resource-attribute section on how to generate this file -Update the cluster resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain +This will completely overwrite any existing custom project, domain and workflow combination attributes. +It is preferable to do get and generate an attribute file if there is an existing attribute that is already set and then update it to have new values. +Refer to get cluster-resource-attribute section on how to generate this file. +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml @@ -54,7 +54,7 @@ Usage :: - flytectl update cluster-resource-attribute [flags] + FlyteCTL update cluster-resource-attribute [flags] Options ~~~~~~~ @@ -112,5 +112,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 4fca7a3a9f..6086db5067 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -1,20 +1,20 @@ -.. _flytectl_update_execution-cluster-label: +.. _FlyteCTL_update_execution-cluster-label: -flytectl update execution-cluster-label +FlyteCTL update execution-cluster-label --------------------------------------- -Updates matchable resources of execution cluster label +Update matchable resources of execution cluster label Synopsis ~~~~~~~~ -Updates execution cluster label for given project and domain combination or additionally with workflow name. +Updates execution cluster label for the given project and domain combination or additionally with workflow name. -Updating to the execution cluster label is only available from a generated file. See the get section for generating this file. -Here the command updates takes the input for execution cluster label from the config file ecl.yaml -eg: content of ecl.yaml +Updating to the execution cluster label is only available from a generated file. See the get section to generate this file. +It takes input for execution cluster label from the config file ecl.yaml +e.g., content of ecl.yaml: .. code-block:: yaml @@ -26,9 +26,9 @@ eg: content of ecl.yaml flytectl update execution-cluster-label --attrFile ecl.yaml -Updating execution cluster label for project and domain and workflow combination. This will take precedence over any other +Updates execution cluster label for project, domain and workflow combination. This will take precedence over any other execution cluster label defined at project domain level. -Update the execution cluster label for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml @@ -47,7 +47,7 @@ Usage :: - flytectl update execution-cluster-label [flags] + FlyteCTL update execution-cluster-label [flags] Options ~~~~~~~ @@ -105,5 +105,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index ae9db9b656..849b54ab17 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -1,23 +1,23 @@ -.. _flytectl_update_execution-queue-attribute: +.. _FlyteCTL_update_execution-queue-attribute: -flytectl update execution-queue-attribute +FlyteCTL update execution-queue-attribute ----------------------------------------- -Updates matchable resources of execution queue attributes +Update matchable resources of execution queue attributes Synopsis ~~~~~~~~ -Updates execution queue attributes for given project and domain combination or additionally with workflow name. +Updates execution queue attributes for the given project and domain combination or additionally with workflow name. -Updating to the execution queue attribute is only available from a generated file. See the get section for generating this file. -Also this will completely overwrite any existing custom project and domain and workflow combination attributes. -Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values +Updating the execution queue attribute is only available from a generated file. See the get section for generating this file. +This will completely overwrite any existing custom project, domain and workflow combination attributes. +It is preferable to do get and generate an attribute file if there is an existing attribute that is already set and then update it to have new values. Refer to get execution-queue-attribute section on how to generate this file -Here the command updates takes the input for execution queue attributes from the config file era.yaml -eg: content of era.yaml +It takes input for execution queue attributes from the config file era.yaml, +e.g., content of era.yaml: .. code-block:: yaml @@ -33,9 +33,9 @@ eg: content of era.yaml flytectl update execution-queue-attribute --attrFile era.yaml -Updating execution queue attribute for project and domain and workflow combination. This will take precedence over any other +Updates execution queue attribute for project, domain and workflow combination. This will take precedence over any other execution queue attribute defined at project domain level. -Update the execution queue attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml @@ -58,7 +58,7 @@ Usage :: - flytectl update execution-queue-attribute [flags] + FlyteCTL update execution-queue-attribute [flags] Options ~~~~~~~ @@ -116,5 +116,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index 14717eb90c..26fa58c7b4 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -1,26 +1,26 @@ -.. _flytectl_update_launchplan-meta: +.. _FlyteCTL_update_launchplan-meta: -flytectl update launchplan-meta +FlyteCTL update launchplan-meta ------------------------------- -Updates launch plan metadata +Update launch plan metadata Synopsis ~~~~~~~~ -Following command updates the description on the launchplan. +Update the description on the launch plan: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort example" -Archiving launchplan named entity is not supported and would throw an error. +Archiving launch plan named entity is not supported and would throw an error: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive -Activating launchplan named entity would be a noop. +Activating launch plan named entity would be a noop: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate @@ -30,7 +30,7 @@ Usage :: - flytectl update launchplan-meta [flags] + FlyteCTL update launchplan-meta [flags] Options ~~~~~~~ @@ -90,5 +90,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 41f7995b27..4213143d3a 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -1,21 +1,21 @@ -.. _flytectl_update_launchplan: +.. _FlyteCTL_update_launchplan: -flytectl update launchplan +FlyteCTL update launchplan -------------------------- -Updates launch plan status +Update launch plan status Synopsis ~~~~~~~~ -Activating launchplan activates the scheduled job associated with it +Activating launch plan activates the scheduled job associated with it: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --activate -Archiving launchplan deschedules any scheduled job associated with it +Archiving launch plan deschedules any scheduled job associated with it: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --archive @@ -26,7 +26,7 @@ Usage :: - flytectl update launchplan [flags] + FlyteCTL update launchplan [flags] Options ~~~~~~~ @@ -86,5 +86,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 3056208c60..33c765d247 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -1,9 +1,9 @@ -.. _flytectl_update_plugin-override: +.. _FlyteCTL_update_plugin-override: -flytectl update plugin-override +FlyteCTL update plugin-override ------------------------------- -Updates matchable resources of plugin overrides +Update matchable resources of plugin overrides Synopsis ~~~~~~~~ @@ -13,11 +13,11 @@ Synopsis Updates plugin overrides for given project and domain combination or additionally with workflow name. Updating to the plugin override is only available from a generated file. See the get section for generating this file. -Also this will completely overwrite any existing plugins overrides on custom project and domain and workflow combination. -Would be preferable to do get and generate an plugin override file if there is an existing override already set and then update it to have new values +This will completely overwrite any existing plugins overrides on custom project, domain and workflow combination. +It is preferable to do get and generate a plugin override file if there is an existing override already set and then update it to have new values. Refer to get plugin-override section on how to generate this file -Here the command updates takes the input for plugin overrides from the config file po.yaml -eg: content of po.yaml +It takes input for plugin overrides from the config file po.yaml, +e.g., content of po.yaml: .. code-block:: yaml @@ -34,9 +34,9 @@ eg: content of po.yaml flytectl update plugin-override --attrFile po.yaml -Updating plugin override for project and domain and workflow combination. This will take precedence over any other +Updates plugin override for project, domain and workflow combination. This will take precedence over any other plugin overrides defined at project domain level. -Update the plugin overrides for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo , development domain +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml @@ -60,7 +60,7 @@ Usage :: - flytectl update plugin-override [flags] + FlyteCTL update plugin-override [flags] Options ~~~~~~~ @@ -118,5 +118,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index abbaaca825..1e13cac8fd 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -1,51 +1,51 @@ -.. _flytectl_update_project: +.. _FlyteCTL_update_project: -flytectl update project +FlyteCTL update project ----------------------- -Updates project resources +Update project resources Synopsis ~~~~~~~~ -Updates the project according the flags passed. Allows you to archive or activate a project. -Activates project named flytesnacks. +Updates the project according to the flags passed. Allows you to archive or activate a project. +Activate project flytesnacks: :: - bin/flytectl update project -p flytesnacks --activateProject + flytectl update project -p flytesnacks --activateProject -Archives project named flytesnacks. +Archive project flytesnacks: :: - bin/flytectl update project -p flytesnacks --archiveProject + flytectl update project -p flytesnacks --archiveProject -Incorrect usage when passing both archive and activate. +Incorrect usage when passing both archive and activate: :: - bin/flytectl update project flytesnacks --archiveProject --activateProject + flytectl update project flytesnacks --archiveProject --activateProject -Incorrect usage when passing unknown-project. +Incorrect usage when passing unknown-project: :: - bin/flytectl update project unknown-project --archiveProject + flytectl update project unknown-project --archiveProject -Incorrect usage when passing valid project using -p option. +Incorrect usage when passing valid project using -p option: :: - bin/flytectl update project unknown-project --archiveProject -p known-project + flytectl update project unknown-project --archiveProject -p known-project Usage :: - flytectl update project [flags] + FlyteCTL update project [flags] Options ~~~~~~~ @@ -104,5 +104,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index f25862a7f9..497f5edf00 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -1,26 +1,26 @@ -.. _flytectl_update_task-meta: +.. _FlyteCTL_update_task-meta: -flytectl update task-meta +FlyteCTL update task-meta ------------------------- -Updates task metadata +Update task metadata Synopsis ~~~~~~~~ -Following command updates the description on the task. +Updates the description on the task: :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --description "Merge sort example" -Archiving task named entity is not supported and would throw an error. +Archiving task named entity is not supported and would throw an error: :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --archive -Activating task named entity would be a noop as archiving is not possible. +Activating task named entity would be a noop since archiving is not possible: :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --activate @@ -30,7 +30,7 @@ Usage :: - flytectl update task-meta [flags] + FlyteCTL update task-meta [flags] Options ~~~~~~~ @@ -90,5 +90,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 182c3cdf3f..856a267771 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -1,23 +1,23 @@ -.. _flytectl_update_task-resource-attribute: +.. _FlyteCTL_update_task-resource-attribute: -flytectl update task-resource-attribute +FlyteCTL update task-resource-attribute --------------------------------------- -Updates matchable resources of task attributes +Update matchable resources of task attributes Synopsis ~~~~~~~~ -Updates task resource attributes for given project and domain combination or additionally with workflow name. +Updates task resource attributes for the given project and domain combination or additionally with workflow name. Updating the task resource attribute is only available from a generated file. See the get section for generating this file. -Also this will completely overwrite any existing custom project and domain and workflow combination attributes. -Would be preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values -Refer to get task-resource-attribute section on how to generate this file -Here the command updates takes the input for task resource attributes from the config file tra.yaml -eg: content of tra.yaml +This will completely overwrite any existing custom project, domain and workflow combination attributes. +It is preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values. +Refer to get task-resource-attribute section on how to generate this file. +It takes input for task resource attributes from the config file tra.yaml, +e.g., content of tra.yaml: .. code-block:: yaml @@ -34,9 +34,9 @@ eg: content of tra.yaml flytectl update task-resource-attribute --attrFile tra.yaml -Updating task resource attribute for project and domain and workflow combination. This will take precedence over any other +Updates task resource attribute for project, domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. -Update the resource attributes for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml @@ -60,7 +60,7 @@ Usage :: - flytectl update task-resource-attribute [flags] + FlyteCTL update task-resource-attribute [flags] Options ~~~~~~~ @@ -118,5 +118,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index cf66feece0..b10ca234a8 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -1,9 +1,9 @@ -.. _flytectl_update_workflow-execution-config: +.. _FlyteCTL_update_workflow-execution-config: -flytectl update workflow-execution-config +FlyteCTL update workflow-execution-config ----------------------------------------- -Updates matchable resources of workflow execution config +Update matchable resources of workflow execution config Synopsis ~~~~~~~~ @@ -13,11 +13,11 @@ Synopsis Updates workflow execution config for given project and domain combination or additionally with workflow name. Updating the workflow execution config is only available from a generated file. See the get section for generating this file. -Also this will completely overwrite any existing custom project and domain and workflow combination execution config. -Would be preferable to do get and generate an config file if there is an existing execution config already set and then update it to have new values -Refer to get workflow-execution-config section on how to generate this file -Here the command updates takes the input for workflow execution config from the config file wec.yaml -eg: content of wec.yaml +This will completely overwrite any existing custom project and domain and workflow combination execution config. +It is preferable to do get and generate a config file if there is an existing execution config already set and then update it to have new values. +Refer to get workflow-execution-config section on how to generate this file. +It takes input for workflow execution config from the config file wec.yaml, +e.g., content of wec.yaml: .. code-block:: yaml @@ -29,9 +29,9 @@ eg: content of wec.yaml flytectl update workflow-execution-config --attrFile wec.yaml -Updating workflow execution config for project and domain and workflow combination. This will take precedence over any other +Updates workflow execution config for project, domain and workflow combination. This will take precedence over any other execution config defined at project domain level. -Update the workflow execution config for workflow core.control_flow.run_merge_sort.merge_sort in flytectldemo, development domain +For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: .. code-block:: yaml @@ -50,7 +50,7 @@ Usage :: - flytectl update workflow-execution-config [flags] + FlyteCTL update workflow-execution-config [flags] Options ~~~~~~~ @@ -108,5 +108,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index 404dd37b52..1e665e8958 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -1,26 +1,26 @@ -.. _flytectl_update_workflow-meta: +.. _FlyteCTL_update_workflow-meta: -flytectl update workflow-meta +FlyteCTL update workflow-meta ----------------------------- -Updates workflow metadata +Update workflow metadata Synopsis ~~~~~~~~ -Following command updates the description on the workflow. +Updates the description on the workflow: :: flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort workflow example" -Archiving workflow named entity would cause this to disapper from flyteconsole UI. +Archiving workflow named entity would cause this to disapper from flyteconsole UI: :: flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive -Activating workflow named entity +Activate workflow named entity: :: flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate @@ -30,7 +30,7 @@ Usage :: - flytectl update workflow-meta [flags] + FlyteCTL update workflow-meta [flags] Options ~~~~~~~ @@ -90,5 +90,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_update` - Used for updating flyte resources eg: project. +* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index 63379360f4..b44d9c5e36 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -1,33 +1,33 @@ -.. _flytectl_upgrade: +.. _FlyteCTL_upgrade: -flytectl upgrade +FlyteCTL upgrade ---------------- -Used for upgrade/rollback flyte version +Upgrade/rollback to a Flyte version Synopsis ~~~~~~~~ -Upgrade flytectl +For FlyteCTL, it is: :: - bin/flytectl upgrade + flytectl upgrade -Note: Please use upgrade with sudo, Without sudo it will cause permission issue +Note: Please use upgrade with sudo. Without sudo it will cause permission issue. -Rollback flytectl binary +Rollback flytectl binary: :: - bin/flytectl upgrade rollback + flytectl upgrade rollback -Note: Upgrade is not available on windows +Note: Upgrade is not available on windows. :: - flytectl upgrade [flags] + FlyteCTL upgrade [flags] Options ~~~~~~~ @@ -83,5 +83,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - flyetcl CLI tool +* :doc:`FlyteCTL` - FlyteCTL CLI tool diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 43a1516515..5748697600 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -1,24 +1,24 @@ -.. _flytectl_version: +.. _FlyteCTL_version: -flytectl version +FlyteCTL version ---------------- -Used for fetching flyte version +Fetch Flyte version Synopsis ~~~~~~~~ -Example version. +For FlyteCTL version, it is: :: - bin/flytectl version + flytectl version :: - flytectl version [flags] + FlyteCTL version [flags] Options ~~~~~~~ @@ -74,5 +74,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - flyetcl CLI tool +* :doc:`FlyteCTL` - FlyteCTL CLI tool diff --git a/flytectl/docs/source/launchplan.rst b/flytectl/docs/source/launchplan.rst new file mode 100644 index 0000000000..6adab05fb8 --- /dev/null +++ b/flytectl/docs/source/launchplan.rst @@ -0,0 +1,9 @@ +Launchplan +------ + +.. toctree:: + :maxdepth: 1 + :caption: Launchplan + + gen/FlyteCTL_get_launchplan + gen/FlyteCTL_update_launchplan \ No newline at end of file diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index 0afad1c0c0..df3082ee2a 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -1,48 +1,24 @@ Nouns ------ -Flytectl noun specify the resource on which the action needs to be performed eg: resources like project/workflow/task/execution +Flytectl nouns specify the resource on which the action needs to be performed. +Example of resources include project, workflow, task, execution. .. toctree:: :maxdepth: 1 :caption: Nouns - - gen/flytectl_create_project - gen/flytectl_create_execution - gen/flytectl_get_execution - gen/flytectl_get_project - gen/flytectl_get_workflow - gen/flytectl_get_task - gen/flytectl_get_task-resource-attribute - gen/flytectl_get_cluster-resource-attribute - gen/flytectl_get_execution-cluster-label - gen/flytectl_get_execution-queue-attribute - gen/flytectl_get_plugin-override - gen/flytectl_get_launchplan - gen/flytectl_get_workflow-execution-config - gen/flytectl_update_launchplan - gen/flytectl_update_workflow - gen/flytectl_update_project - gen/flytectl_update_task - gen/flytectl_update_task-resource-attribute - gen/flytectl_update_cluster-resource-attribute - gen/flytectl_update_execution-cluster-label - gen/flytectl_update_execution-queue-attribute - gen/flytectl_update_plugin-override - gen/flytectl_update_workflow-execution-config - gen/flytectl_register_files - gen/flytectl_register_examples - gen/flytectl_delete_execution - gen/flytectl_delete_task-resource-attribute - gen/flytectl_delete_cluster-resource-attribute - gen/flytectl_delete_execution-cluster-label - gen/flytectl_delete_execution-queue-attribute - gen/flytectl_delete_plugin-override - gen/flytectl_delete_workflow-execution-config - gen/flytectl_config_validate - gen/flytectl_config_init - gen/flytectl_config_discover - gen/flytectl_sandbox_start - gen/flytectl_sandbox_status - gen/flytectl_sandbox_teardown - gen/flytectl_sandbox_exec - gen/flytectl_upgrade + + project + execution + workflow + task + task-resource-attribute + cluster-resource-attribute + execution-cluster-label + execution-queue-attribute + plugin-override + launchplan + workflow-execution-config + examples + files + config + sandbox diff --git a/flytectl/docs/source/plugin-override.rst b/flytectl/docs/source/plugin-override.rst new file mode 100644 index 0000000000..26ebd9e28d --- /dev/null +++ b/flytectl/docs/source/plugin-override.rst @@ -0,0 +1,10 @@ +Plugin override +------ + +.. toctree:: + :maxdepth: 1 + :caption: Plugin override + + gen/FlyteCTL_get_plugin-override + gen/FlyteCTL_update_plugin-override + gen/FlyteCTL_delete_plugin-override \ No newline at end of file diff --git a/flytectl/docs/source/project.rst b/flytectl/docs/source/project.rst new file mode 100644 index 0000000000..c81e4e785f --- /dev/null +++ b/flytectl/docs/source/project.rst @@ -0,0 +1,10 @@ +Project +------ + +.. toctree:: + :maxdepth: 1 + :caption: Project + + gen/FlyteCTL_create_project + gen/FlyteCTL_get_project + gen/FlyteCTL_update_project \ No newline at end of file diff --git a/flytectl/docs/source/sandbox.rst b/flytectl/docs/source/sandbox.rst new file mode 100644 index 0000000000..8cacd53ac0 --- /dev/null +++ b/flytectl/docs/source/sandbox.rst @@ -0,0 +1,11 @@ +Sandbox +------ + +.. toctree:: + :maxdepth: 1 + :caption: Sandbox + + gen/FlyteCTL_sandbox_start + gen/FlyteCTL_sandbox_status + gen/FlyteCTL_sandbox_teardown + gen/FlyteCTL_sandbox_exec \ No newline at end of file diff --git a/flytectl/docs/source/task-resource-attribute.rst b/flytectl/docs/source/task-resource-attribute.rst new file mode 100644 index 0000000000..95dca187cd --- /dev/null +++ b/flytectl/docs/source/task-resource-attribute.rst @@ -0,0 +1,11 @@ +Task resource attribute +------ + +.. toctree:: + :maxdepth: 1 + :caption: Task resource attribute + + gen/FlyteCTL_get_task-resource-attribute + gen/FlyteCTL_update_task-resource-attribute + gen/FlyteCTL_delete_task-resource-attribute + diff --git a/flytectl/docs/source/task.rst b/flytectl/docs/source/task.rst new file mode 100644 index 0000000000..1cf59495c0 --- /dev/null +++ b/flytectl/docs/source/task.rst @@ -0,0 +1,8 @@ +Task +------ + +.. toctree:: + :maxdepth: 1 + :caption: Task + + gen/FlyteCTL_get_task \ No newline at end of file diff --git a/flytectl/docs/source/verbs.rst b/flytectl/docs/source/verbs.rst index eab243c410..88d4dcefbb 100644 --- a/flytectl/docs/source/verbs.rst +++ b/flytectl/docs/source/verbs.rst @@ -1,18 +1,18 @@ Verbs ------ -Flytectl verbs specify the actions to be performed on the resources like create/get/update/delete +Flytectl verbs specify the actions to be performed on the resources. Ex: create, get, update, and delete. .. toctree:: :maxdepth: 1 :caption: Verbs - gen/flytectl_create - gen/flytectl_completion - gen/flytectl_get - gen/flytectl_update - gen/flytectl_delete - gen/flytectl_register - gen/flytectl_config - gen/flytectl_sandbox - gen/flytectl_version - gen/flytectl_upgrade + gen/FlyteCTL_flytectl_create + gen/FlyteCTL_flytectl_completion + gen/FlyteCTL_flytectl_get + gen/FlyteCTL_flytectl_update + gen/FlyteCTL_delete + gen/FlyteCTL_register + gen/FlyteCTL_config + gen/FlyteCTL_sandbox + gen/FlyteCTL_version + gen/FlyteCTL_upgrade diff --git a/flytectl/docs/source/workflow-execution-config.rst b/flytectl/docs/source/workflow-execution-config.rst new file mode 100644 index 0000000000..008864872b --- /dev/null +++ b/flytectl/docs/source/workflow-execution-config.rst @@ -0,0 +1,10 @@ +Workflow execution config +------ + +.. toctree:: + :maxdepth: 1 + :caption: Workflow execution config + + gen/FlyteCTL_get_workflow-execution-config + gen/FlyteCTL_update_workflow-execution-config + gen/FlyteCTL_delete_workflow-execution-config \ No newline at end of file diff --git a/flytectl/docs/source/workflow.rst b/flytectl/docs/source/workflow.rst new file mode 100644 index 0000000000..b37dbad28f --- /dev/null +++ b/flytectl/docs/source/workflow.rst @@ -0,0 +1,8 @@ +Workflow +------ + +.. toctree:: + :maxdepth: 1 + :caption: Workflow + + gen/FlyteCTL_get_workflow \ No newline at end of file diff --git a/flytectl/pkg/configutil/configutil.go b/flytectl/pkg/configutil/configutil.go index 44420887a3..c0df7f9b31 100644 --- a/flytectl/pkg/configutil/configutil.go +++ b/flytectl/pkg/configutil/configutil.go @@ -65,17 +65,17 @@ func GetSandboxTemplate() string { return AdminConfigTemplate + StorageConfigTemplate } -// GetAWSCloudTemplate return aws flyte config with storage config +// GetAWSCloudTemplate return aws Flyte config with storage config func GetAWSCloudTemplate() string { return AdminConfigTemplate + StorageS3ConfigTemplate } -// GetGoogleCloudTemplate return google flyte config with storage config +// GetGoogleCloudTemplate return google Flyte config with storage config func GetGoogleCloudTemplate() string { return AdminConfigTemplate + StorageGCSConfigTemplate } -// SetupConfig download the flyte sandbox config +// SetupConfig download the Flyte sandbox config func SetupConfig(filename, templateStr string, templateSpec ConfigTemplateSpec) error { tmpl := template.New("config") tmpl, err := tmpl.Parse(templateStr) @@ -90,7 +90,7 @@ func SetupConfig(filename, templateStr string, templateSpec ConfigTemplateSpec) return tmpl.Execute(file, templateSpec) } -// ConfigCleanup will remove the sandbox config from flyte dir +// ConfigCleanup will remove the sandbox config from Flyte dir func ConfigCleanup() error { err := os.Remove(FlytectlConfig) if err != nil { diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index c123683e86..b97b11804e 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -24,34 +24,34 @@ func TestSetupFlyteDir(t *testing.T) { } func TestIsVersionGreaterThan(t *testing.T) { - t.Run("Compare flytectl version when upgrade available", func(t *testing.T) { + t.Run("Compare FlyteCTL version when upgrade available", func(t *testing.T) { _, err := IsVersionGreaterThan("v1.1.21", testVersion) assert.Nil(t, err) }) - t.Run("Compare flytectl version greater then", func(t *testing.T) { + t.Run("Compare FlyteCTL version greater then", func(t *testing.T) { ok, err := IsVersionGreaterThan("v1.1.21", testVersion) assert.Nil(t, err) assert.Equal(t, true, ok) }) - t.Run("Compare flytectl version greater then for equal value", func(t *testing.T) { + t.Run("Compare FlyteCTL version greater then for equal value", func(t *testing.T) { ok, err := IsVersionGreaterThan(testVersion, testVersion) assert.Nil(t, err) assert.Equal(t, false, ok) }) - t.Run("Compare flytectl version smaller then", func(t *testing.T) { + t.Run("Compare FlyteCTL version smaller then", func(t *testing.T) { ok, err := IsVersionGreaterThan("v0.1.19", testVersion) assert.Nil(t, err) assert.Equal(t, false, ok) }) - t.Run("Compare flytectl version", func(t *testing.T) { + t.Run("Compare FlyteCTL version", func(t *testing.T) { _, err := IsVersionGreaterThan(testVersion, testVersion) assert.Nil(t, err) }) - t.Run("Error in compare flytectl version", func(t *testing.T) { + t.Run("Error in compare FlyteCTL version", func(t *testing.T) { _, err := IsVersionGreaterThan("vvvvvvvv", testVersion) assert.NotNil(t, err) }) - t.Run("Error in compare flytectl version", func(t *testing.T) { + t.Run("Error in compare FlyteCTL version", func(t *testing.T) { _, err := IsVersionGreaterThan(testVersion, "vvvvvvvv") assert.NotNil(t, err) }) diff --git a/flytectl/proposal/README.md b/flytectl/proposal/README.md index abbf8c6bfb..f561707b4d 100644 --- a/flytectl/proposal/README.md +++ b/flytectl/proposal/README.md @@ -5,8 +5,8 @@ FlyteAdmin. We will start with gRPC endpoint as the client is easily generated a more SDK's in different languages we should support a common way of interacting with the API. This does no mean that some SDK's may provide native ways of interacting with the Admin API (for e.g. flytekit), but the intention is that we will eventually replace **flytekit/flyte-cli** with flytectl exclusively. -We also recommend that the design of flytectl is careful and it could helps us with delivering user features faster without having to rely on the UI. flytectl with follow standard oauth2 for -authentication already supported by flyteAdmin. Moreover, flytectl should be readily available on almost any platform - OSX, Linux and Windows. We will strive to keep it relatively lean and fast. +We also recommend that the design of FlyteCTL is careful and it could helps us with delivering user features faster without having to rely on the UI. FlyteCTL with follow standard oauth2 for +authentication already supported by flyteAdmin. Moreover, FlyteCTL should be readily available on almost any platform - OSX, Linux and Windows. We will strive to keep it relatively lean and fast. # Why One CLI? @@ -24,7 +24,7 @@ As we build multiple SDK's they need a native way of interacting with the API. H - kubectl is a stellar example of a cli done well ## Generating Swagger code -We started exploring this (flytetools)[https://github.com/lyft/flytetools#tools] has some work. We also got approached by the swagger code gen maintainer to see if they can help. +We started exploring this (Flytetools)[https://github.com/lyft/flytetools#tools] has some work. We also got approached by the swagger code gen maintainer to see if they can help. # API @@ -41,7 +41,7 @@ $ flytectl [options] ``` ### base options -- *endpoint* endpoint where flyteadmin is available +- *endpoint* endpoint where Flyteadmin is available - *insecure* use if Oauth is not available - optional *project* project for which we need to retrieve details - optional *domain* domain for which we need to retrieve details @@ -51,7 +51,7 @@ $ flytectl [options] returns the version of the CLI, version of Admin service and version of the Platform that is deployed ### configure -Allows configuring flytectl for your own usage (low pri). Needed for especially storing Auth tokens. +Allows configuring FlyteCTL for your own usage (low pri). Needed for especially storing Auth tokens. ### get/delete Get retrieves a list of resources that is qualified by a further sub-command. for example From 3064b009a51f354889a32dc268efcf9fb6687339 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Thu, 9 Dec 2021 21:49:46 -0800 Subject: [PATCH 180/645] Update documentation (#233) Signed-off-by: Flyte-Bot Co-authored-by: SmritiSatyanV --- flytectl/docs/source/gen/{flytectl.rst => FlyteCTL.rst} | 0 .../gen/{flytectl_completion.rst => FlyteCTL_completion.rst} | 0 .../source/gen/{flytectl_config.rst => FlyteCTL_config.rst} | 0 ...lytectl_config_discover.rst => FlyteCTL_config_discover.rst} | 0 .../gen/{flytectl_config_init.rst => FlyteCTL_config_init.rst} | 0 ...lytectl_config_validate.rst => FlyteCTL_config_validate.rst} | 0 .../source/gen/{flytectl_create.rst => FlyteCTL_create.rst} | 0 ...tectl_create_execution.rst => FlyteCTL_create_execution.rst} | 2 +- ...{flytectl_create_project.rst => FlyteCTL_create_project.rst} | 0 .../source/gen/{flytectl_delete.rst => FlyteCTL_delete.rst} | 0 ...ibute.rst => FlyteCTL_delete_cluster-resource-attribute.rst} | 0 ...er-label.rst => FlyteCTL_delete_execution-cluster-label.rst} | 0 ...ribute.rst => FlyteCTL_delete_execution-queue-attribute.rst} | 0 ...tectl_delete_execution.rst => FlyteCTL_delete_execution.rst} | 0 ..._plugin-override.rst => FlyteCTL_delete_plugin-override.rst} | 0 ...ttribute.rst => FlyteCTL_delete_task-resource-attribute.rst} | 0 ...config.rst => FlyteCTL_delete_workflow-execution-config.rst} | 0 flytectl/docs/source/gen/{flytectl_get.rst => FlyteCTL_get.rst} | 0 ...ttribute.rst => FlyteCTL_get_cluster-resource-attribute.rst} | 0 ...uster-label.rst => FlyteCTL_get_execution-cluster-label.rst} | 0 ...attribute.rst => FlyteCTL_get_execution-queue-attribute.rst} | 0 .../{flytectl_get_execution.rst => FlyteCTL_get_execution.rst} | 0 ...{flytectl_get_launchplan.rst => FlyteCTL_get_launchplan.rst} | 0 ...get_plugin-override.rst => FlyteCTL_get_plugin-override.rst} | 0 .../gen/{flytectl_get_project.rst => FlyteCTL_get_project.rst} | 0 ...e-attribute.rst => FlyteCTL_get_task-resource-attribute.rst} | 0 .../source/gen/{flytectl_get_task.rst => FlyteCTL_get_task.rst} | 0 ...on-config.rst => FlyteCTL_get_workflow-execution-config.rst} | 0 .../{flytectl_get_workflow.rst => FlyteCTL_get_workflow.rst} | 0 .../source/gen/{flytectl_register.rst => FlyteCTL_register.rst} | 0 ...ctl_register_examples.rst => FlyteCTL_register_examples.rst} | 0 ...{flytectl_register_files.rst => FlyteCTL_register_files.rst} | 0 .../source/gen/{flytectl_sandbox.rst => FlyteCTL_sandbox.rst} | 0 .../{flytectl_sandbox_exec.rst => FlyteCTL_sandbox_exec.rst} | 0 .../{flytectl_sandbox_start.rst => FlyteCTL_sandbox_start.rst} | 0 ...{flytectl_sandbox_status.rst => FlyteCTL_sandbox_status.rst} | 0 ...tectl_sandbox_teardown.rst => FlyteCTL_sandbox_teardown.rst} | 0 .../source/gen/{flytectl_update.rst => FlyteCTL_update.rst} | 0 ...ibute.rst => FlyteCTL_update_cluster-resource-attribute.rst} | 0 ...er-label.rst => FlyteCTL_update_execution-cluster-label.rst} | 0 ...ribute.rst => FlyteCTL_update_execution-queue-attribute.rst} | 0 ..._launchplan-meta.rst => FlyteCTL_update_launchplan-meta.rst} | 0 ...ctl_update_launchplan.rst => FlyteCTL_update_launchplan.rst} | 0 ..._plugin-override.rst => FlyteCTL_update_plugin-override.rst} | 0 ...{flytectl_update_project.rst => FlyteCTL_update_project.rst} | 0 ...tectl_update_task-meta.rst => FlyteCTL_update_task-meta.rst} | 0 ...ttribute.rst => FlyteCTL_update_task-resource-attribute.rst} | 0 ...config.rst => FlyteCTL_update_workflow-execution-config.rst} | 0 ...date_workflow-meta.rst => FlyteCTL_update_workflow-meta.rst} | 0 .../source/gen/{flytectl_upgrade.rst => FlyteCTL_upgrade.rst} | 0 .../source/gen/{flytectl_version.rst => FlyteCTL_version.rst} | 0 51 files changed, 1 insertion(+), 1 deletion(-) rename flytectl/docs/source/gen/{flytectl.rst => FlyteCTL.rst} (100%) rename flytectl/docs/source/gen/{flytectl_completion.rst => FlyteCTL_completion.rst} (100%) rename flytectl/docs/source/gen/{flytectl_config.rst => FlyteCTL_config.rst} (100%) rename flytectl/docs/source/gen/{flytectl_config_discover.rst => FlyteCTL_config_discover.rst} (100%) rename flytectl/docs/source/gen/{flytectl_config_init.rst => FlyteCTL_config_init.rst} (100%) rename flytectl/docs/source/gen/{flytectl_config_validate.rst => FlyteCTL_config_validate.rst} (100%) rename flytectl/docs/source/gen/{flytectl_create.rst => FlyteCTL_create.rst} (100%) rename flytectl/docs/source/gen/{flytectl_create_execution.rst => FlyteCTL_create_execution.rst} (99%) rename flytectl/docs/source/gen/{flytectl_create_project.rst => FlyteCTL_create_project.rst} (100%) rename flytectl/docs/source/gen/{flytectl_delete.rst => FlyteCTL_delete.rst} (100%) rename flytectl/docs/source/gen/{flytectl_delete_cluster-resource-attribute.rst => FlyteCTL_delete_cluster-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{flytectl_delete_execution-cluster-label.rst => FlyteCTL_delete_execution-cluster-label.rst} (100%) rename flytectl/docs/source/gen/{flytectl_delete_execution-queue-attribute.rst => FlyteCTL_delete_execution-queue-attribute.rst} (100%) rename flytectl/docs/source/gen/{flytectl_delete_execution.rst => FlyteCTL_delete_execution.rst} (100%) rename flytectl/docs/source/gen/{flytectl_delete_plugin-override.rst => FlyteCTL_delete_plugin-override.rst} (100%) rename flytectl/docs/source/gen/{flytectl_delete_task-resource-attribute.rst => FlyteCTL_delete_task-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{flytectl_delete_workflow-execution-config.rst => FlyteCTL_delete_workflow-execution-config.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get.rst => FlyteCTL_get.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_cluster-resource-attribute.rst => FlyteCTL_get_cluster-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_execution-cluster-label.rst => FlyteCTL_get_execution-cluster-label.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_execution-queue-attribute.rst => FlyteCTL_get_execution-queue-attribute.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_execution.rst => FlyteCTL_get_execution.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_launchplan.rst => FlyteCTL_get_launchplan.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_plugin-override.rst => FlyteCTL_get_plugin-override.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_project.rst => FlyteCTL_get_project.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_task-resource-attribute.rst => FlyteCTL_get_task-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_task.rst => FlyteCTL_get_task.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_workflow-execution-config.rst => FlyteCTL_get_workflow-execution-config.rst} (100%) rename flytectl/docs/source/gen/{flytectl_get_workflow.rst => FlyteCTL_get_workflow.rst} (100%) rename flytectl/docs/source/gen/{flytectl_register.rst => FlyteCTL_register.rst} (100%) rename flytectl/docs/source/gen/{flytectl_register_examples.rst => FlyteCTL_register_examples.rst} (100%) rename flytectl/docs/source/gen/{flytectl_register_files.rst => FlyteCTL_register_files.rst} (100%) rename flytectl/docs/source/gen/{flytectl_sandbox.rst => FlyteCTL_sandbox.rst} (100%) rename flytectl/docs/source/gen/{flytectl_sandbox_exec.rst => FlyteCTL_sandbox_exec.rst} (100%) rename flytectl/docs/source/gen/{flytectl_sandbox_start.rst => FlyteCTL_sandbox_start.rst} (100%) rename flytectl/docs/source/gen/{flytectl_sandbox_status.rst => FlyteCTL_sandbox_status.rst} (100%) rename flytectl/docs/source/gen/{flytectl_sandbox_teardown.rst => FlyteCTL_sandbox_teardown.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update.rst => FlyteCTL_update.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_cluster-resource-attribute.rst => FlyteCTL_update_cluster-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_execution-cluster-label.rst => FlyteCTL_update_execution-cluster-label.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_execution-queue-attribute.rst => FlyteCTL_update_execution-queue-attribute.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_launchplan-meta.rst => FlyteCTL_update_launchplan-meta.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_launchplan.rst => FlyteCTL_update_launchplan.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_plugin-override.rst => FlyteCTL_update_plugin-override.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_project.rst => FlyteCTL_update_project.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_task-meta.rst => FlyteCTL_update_task-meta.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_task-resource-attribute.rst => FlyteCTL_update_task-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_workflow-execution-config.rst => FlyteCTL_update_workflow-execution-config.rst} (100%) rename flytectl/docs/source/gen/{flytectl_update_workflow-meta.rst => FlyteCTL_update_workflow-meta.rst} (100%) rename flytectl/docs/source/gen/{flytectl_upgrade.rst => FlyteCTL_upgrade.rst} (100%) rename flytectl/docs/source/gen/{flytectl_version.rst => FlyteCTL_version.rst} (100%) diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/FlyteCTL.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl.rst rename to flytectl/docs/source/gen/FlyteCTL.rst diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/FlyteCTL_completion.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_completion.rst rename to flytectl/docs/source/gen/FlyteCTL_completion.rst diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/FlyteCTL_config.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_config.rst rename to flytectl/docs/source/gen/FlyteCTL_config.rst diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/FlyteCTL_config_discover.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_config_discover.rst rename to flytectl/docs/source/gen/FlyteCTL_config_discover.rst diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/FlyteCTL_config_init.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_config_init.rst rename to flytectl/docs/source/gen/FlyteCTL_config_init.rst diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/FlyteCTL_config_validate.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_config_validate.rst rename to flytectl/docs/source/gen/FlyteCTL_config_validate.rst diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/FlyteCTL_create.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_create.rst rename to flytectl/docs/source/gen/FlyteCTL_create.rst diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/FlyteCTL_create_execution.rst similarity index 99% rename from flytectl/docs/source/gen/flytectl_create_execution.rst rename to flytectl/docs/source/gen/FlyteCTL_create_execution.rst index 2d502a4209..72337bd67e 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/FlyteCTL_create_execution.rst @@ -150,7 +150,7 @@ Options --targetDomain string project where execution needs to be created.If not specified configured domain would be used. --targetProject string project where execution needs to be created.If not specified configured project would be used. --task string - --version string + --version string specify version of execution workflow/task. --workflow string Options inherited from parent commands diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/FlyteCTL_create_project.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_create_project.rst rename to flytectl/docs/source/gen/FlyteCTL_create_project.rst diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/FlyteCTL_delete.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_delete.rst rename to flytectl/docs/source/gen/FlyteCTL_delete.rst diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_delete_cluster-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst rename to flytectl/docs/source/gen/FlyteCTL_delete_cluster-resource-attribute.rst diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/FlyteCTL_delete_execution-cluster-label.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst rename to flytectl/docs/source/gen/FlyteCTL_delete_execution-cluster-label.rst diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_delete_execution-queue-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst rename to flytectl/docs/source/gen/FlyteCTL_delete_execution-queue-attribute.rst diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/FlyteCTL_delete_execution.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_delete_execution.rst rename to flytectl/docs/source/gen/FlyteCTL_delete_execution.rst diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/FlyteCTL_delete_plugin-override.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_delete_plugin-override.rst rename to flytectl/docs/source/gen/FlyteCTL_delete_plugin-override.rst diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_delete_task-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst rename to flytectl/docs/source/gen/FlyteCTL_delete_task-resource-attribute.rst diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/FlyteCTL_delete_workflow-execution-config.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst rename to flytectl/docs/source/gen/FlyteCTL_delete_workflow-execution-config.rst diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/FlyteCTL_get.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get.rst rename to flytectl/docs/source/gen/FlyteCTL_get.rst diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_get_cluster-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst rename to flytectl/docs/source/gen/FlyteCTL_get_cluster-resource-attribute.rst diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/FlyteCTL_get_execution-cluster-label.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst rename to flytectl/docs/source/gen/FlyteCTL_get_execution-cluster-label.rst diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_get_execution-queue-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst rename to flytectl/docs/source/gen/FlyteCTL_get_execution-queue-attribute.rst diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/FlyteCTL_get_execution.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_execution.rst rename to flytectl/docs/source/gen/FlyteCTL_get_execution.rst diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/FlyteCTL_get_launchplan.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_launchplan.rst rename to flytectl/docs/source/gen/FlyteCTL_get_launchplan.rst diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/FlyteCTL_get_plugin-override.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_plugin-override.rst rename to flytectl/docs/source/gen/FlyteCTL_get_plugin-override.rst diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/FlyteCTL_get_project.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_project.rst rename to flytectl/docs/source/gen/FlyteCTL_get_project.rst diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_get_task-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst rename to flytectl/docs/source/gen/FlyteCTL_get_task-resource-attribute.rst diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/FlyteCTL_get_task.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_task.rst rename to flytectl/docs/source/gen/FlyteCTL_get_task.rst diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/FlyteCTL_get_workflow-execution-config.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst rename to flytectl/docs/source/gen/FlyteCTL_get_workflow-execution-config.rst diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/FlyteCTL_get_workflow.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_get_workflow.rst rename to flytectl/docs/source/gen/FlyteCTL_get_workflow.rst diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/FlyteCTL_register.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_register.rst rename to flytectl/docs/source/gen/FlyteCTL_register.rst diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/FlyteCTL_register_examples.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_register_examples.rst rename to flytectl/docs/source/gen/FlyteCTL_register_examples.rst diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/FlyteCTL_register_files.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_register_files.rst rename to flytectl/docs/source/gen/FlyteCTL_register_files.rst diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/FlyteCTL_sandbox.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_sandbox.rst rename to flytectl/docs/source/gen/FlyteCTL_sandbox.rst diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/FlyteCTL_sandbox_exec.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_sandbox_exec.rst rename to flytectl/docs/source/gen/FlyteCTL_sandbox_exec.rst diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/FlyteCTL_sandbox_start.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_sandbox_start.rst rename to flytectl/docs/source/gen/FlyteCTL_sandbox_start.rst diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/FlyteCTL_sandbox_status.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_sandbox_status.rst rename to flytectl/docs/source/gen/FlyteCTL_sandbox_status.rst diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/FlyteCTL_sandbox_teardown.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_sandbox_teardown.rst rename to flytectl/docs/source/gen/FlyteCTL_sandbox_teardown.rst diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/FlyteCTL_update.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update.rst rename to flytectl/docs/source/gen/FlyteCTL_update.rst diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_update_cluster-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst rename to flytectl/docs/source/gen/FlyteCTL_update_cluster-resource-attribute.rst diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/FlyteCTL_update_execution-cluster-label.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst rename to flytectl/docs/source/gen/FlyteCTL_update_execution-cluster-label.rst diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_update_execution-queue-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst rename to flytectl/docs/source/gen/FlyteCTL_update_execution-queue-attribute.rst diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/FlyteCTL_update_launchplan-meta.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst rename to flytectl/docs/source/gen/FlyteCTL_update_launchplan-meta.rst diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/FlyteCTL_update_launchplan.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_launchplan.rst rename to flytectl/docs/source/gen/FlyteCTL_update_launchplan.rst diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/FlyteCTL_update_plugin-override.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_plugin-override.rst rename to flytectl/docs/source/gen/FlyteCTL_update_plugin-override.rst diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/FlyteCTL_update_project.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_project.rst rename to flytectl/docs/source/gen/FlyteCTL_update_project.rst diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/FlyteCTL_update_task-meta.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_task-meta.rst rename to flytectl/docs/source/gen/FlyteCTL_update_task-meta.rst diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_update_task-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst rename to flytectl/docs/source/gen/FlyteCTL_update_task-resource-attribute.rst diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/FlyteCTL_update_workflow-execution-config.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst rename to flytectl/docs/source/gen/FlyteCTL_update_workflow-execution-config.rst diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/FlyteCTL_update_workflow-meta.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_update_workflow-meta.rst rename to flytectl/docs/source/gen/FlyteCTL_update_workflow-meta.rst diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/FlyteCTL_upgrade.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_upgrade.rst rename to flytectl/docs/source/gen/FlyteCTL_upgrade.rst diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/FlyteCTL_version.rst similarity index 100% rename from flytectl/docs/source/gen/flytectl_version.rst rename to flytectl/docs/source/gen/FlyteCTL_version.rst From e3977b117a06a1da75cbcb905f32c1abbe93e3af Mon Sep 17 00:00:00 2001 From: SmritiSatyanV <94349093+SmritiSatyanV@users.noreply.github.com> Date: Fri, 10 Dec 2021 19:19:05 +0530 Subject: [PATCH 181/645] Changes to 'use' in cmd folder (#235) * Update nouns.rst * removed html links Created separate rst file for each noun and referenced it in the nouns.rst file. * Update verbs.rst * Deleted newly added rst files error with codecov, so deleted the newly added rst files. * Delete verbs.rst * Created separate rst files for every resource * Changes to files in cmd folder * Update create_test.go * cmd folders * Update cmd/create/execution.go Co-authored-by: Samhita Alla * Added verbs.rst * changes to cmd folder files /bin removed, * Update based on review * Update cmd/create/project.go Co-authored-by: Samhita Alla * Update cmd/create/create.go Co-authored-by: Samhita Alla * Update cmd/create/create_test.go Co-authored-by: Samhita Alla * Update cmd/delete/delete.go Co-authored-by: Samhita Alla * Update cmd/delete/matchable_cluster_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/delete/matchable_task_resource_attribute.go Co-authored-by: Samhita Alla * Changes to delete - matchable_plugin_override * Changes to .go files in cmd * Changed flytesnack to Flytesnack * Creates to create * Update cmd/get/launch_plan.go Co-authored-by: Samhita Alla * Changed 'launchplan' to 'launch plan' * Update cmd/register/examples.go Co-authored-by: Samhita Alla * Update cmd/register/examples.go Co-authored-by: Samhita Alla * Update cmd/register/examples.go Co-authored-by: Samhita Alla * Update cmd/register/files.go Co-authored-by: Samhita Alla * Update cmd/register/register.go Co-authored-by: Samhita Alla * Update cmd/register/register_test.go Co-authored-by: Samhita Alla * Update cmd/sandbox/sandbox.go Co-authored-by: Samhita Alla * Update cmd/sandbox/start.go Co-authored-by: Samhita Alla * Update cmd/sandbox/start.go Co-authored-by: Samhita Alla * Update cmd/sandbox/status.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_cluster_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_cluster_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_execution_cluster_label.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_execution_queue_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_plugin_override.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_task_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_workflow_execution_config.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_workflow_execution_config.go Co-authored-by: Samhita Alla * Update cmd/update/update.go Co-authored-by: Samhita Alla * Update cmd/upgrade/upgrade.go Co-authored-by: Samhita Alla * Update cmd/upgrade/upgrade.go Co-authored-by: Samhita Alla * Update cmd/version/version.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_task_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/update.go Co-authored-by: Samhita Alla * Resolved changes * Changed 'delte' to 'delete' * Updated rst files Created rst files for every noun, and linked the associated verbs with it * Trial * Removed the extra whitespace * Changed 'delte' to 'delete' * Changed 'use' in some cmd folders * Description to rst files * Resolved conflicts Co-authored-by: Samhita Alla --- ...atchable_workflow_execution_config_test.go | 4 +-- .../matchable_execution_cluster_label_test.go | 4 +-- flytectl/cmd/root.go | 2 +- flytectl/cmd/sandbox/start.go | 2 +- flytectl/cmd/upgrade/upgrade_test.go | 2 +- flytectl/cmd/version/version_test.go | 2 +- .../source/cluster-resource-attribute.rst | 11 ++++++-- flytectl/docs/source/config.rst | 7 +++-- flytectl/docs/source/examples.rst | 5 +++- .../docs/source/execution-cluster-label.rst | 10 +++++-- .../docs/source/execution-queue-attribute.rst | 10 +++++-- flytectl/docs/source/execution.rst | 10 +++++-- flytectl/docs/source/files.rst | 4 ++- flytectl/docs/source/gen/FlyteCTL.rst | 26 ++++++++--------- .../docs/source/gen/FlyteCTL_completion.rst | 8 +++--- flytectl/docs/source/gen/FlyteCTL_config.rst | 12 ++++---- .../source/gen/FlyteCTL_config_discover.rst | 8 +++--- .../docs/source/gen/FlyteCTL_config_init.rst | 8 +++--- .../source/gen/FlyteCTL_config_validate.rst | 8 +++--- flytectl/docs/source/gen/FlyteCTL_create.rst | 10 +++---- .../source/gen/FlyteCTL_create_execution.rst | 8 +++--- .../source/gen/FlyteCTL_create_project.rst | 8 +++--- flytectl/docs/source/gen/FlyteCTL_delete.rst | 20 ++++++------- ...eCTL_delete_cluster-resource-attribute.rst | 8 +++--- ...lyteCTL_delete_execution-cluster-label.rst | 8 +++--- ...teCTL_delete_execution-queue-attribute.rst | 8 +++--- .../source/gen/FlyteCTL_delete_execution.rst | 8 +++--- .../gen/FlyteCTL_delete_plugin-override.rst | 8 +++--- ...lyteCTL_delete_task-resource-attribute.rst | 8 +++--- ...teCTL_delete_workflow-execution-config.rst | 8 +++--- flytectl/docs/source/gen/FlyteCTL_get.rst | 28 +++++++++---------- ...lyteCTL_get_cluster-resource-attribute.rst | 8 +++--- .../FlyteCTL_get_execution-cluster-label.rst | 8 +++--- ...FlyteCTL_get_execution-queue-attribute.rst | 8 +++--- .../source/gen/FlyteCTL_get_execution.rst | 8 +++--- .../source/gen/FlyteCTL_get_launchplan.rst | 8 +++--- .../gen/FlyteCTL_get_plugin-override.rst | 8 +++--- .../docs/source/gen/FlyteCTL_get_project.rst | 8 +++--- .../FlyteCTL_get_task-resource-attribute.rst | 8 +++--- .../docs/source/gen/FlyteCTL_get_task.rst | 8 +++--- ...FlyteCTL_get_workflow-execution-config.rst | 8 +++--- .../docs/source/gen/FlyteCTL_get_workflow.rst | 8 +++--- .../docs/source/gen/FlyteCTL_register.rst | 10 +++---- .../source/gen/FlyteCTL_register_examples.rst | 8 +++--- .../source/gen/FlyteCTL_register_files.rst | 8 +++--- flytectl/docs/source/gen/FlyteCTL_sandbox.rst | 14 +++++----- .../docs/source/gen/FlyteCTL_sandbox_exec.rst | 8 +++--- .../source/gen/FlyteCTL_sandbox_start.rst | 10 +++---- .../source/gen/FlyteCTL_sandbox_status.rst | 8 +++--- .../source/gen/FlyteCTL_sandbox_teardown.rst | 8 +++--- flytectl/docs/source/gen/FlyteCTL_update.rst | 28 +++++++++---------- ...eCTL_update_cluster-resource-attribute.rst | 8 +++--- ...lyteCTL_update_execution-cluster-label.rst | 8 +++--- ...teCTL_update_execution-queue-attribute.rst | 8 +++--- .../gen/FlyteCTL_update_launchplan-meta.rst | 8 +++--- .../source/gen/FlyteCTL_update_launchplan.rst | 8 +++--- .../gen/FlyteCTL_update_plugin-override.rst | 8 +++--- .../source/gen/FlyteCTL_update_project.rst | 8 +++--- .../source/gen/FlyteCTL_update_task-meta.rst | 8 +++--- ...lyteCTL_update_task-resource-attribute.rst | 8 +++--- ...teCTL_update_workflow-execution-config.rst | 8 +++--- .../gen/FlyteCTL_update_workflow-meta.rst | 8 +++--- flytectl/docs/source/gen/FlyteCTL_upgrade.rst | 8 +++--- flytectl/docs/source/gen/FlyteCTL_version.rst | 8 +++--- flytectl/docs/source/launchplan.rst | 7 +++-- flytectl/docs/source/nouns.rst | 3 +- flytectl/docs/source/plugin-override.rst | 10 +++++-- flytectl/docs/source/project.rst | 11 ++++++-- flytectl/docs/source/sandbox.rst | 13 ++++++--- .../docs/source/task-resource-attribute.rst | 10 +++++-- flytectl/docs/source/task.rst | 4 ++- flytectl/docs/source/verbs.rst | 23 +++++++-------- .../docs/source/workflow-execution-config.rst | 11 ++++++-- flytectl/docs/source/workflow.rst | 4 ++- 74 files changed, 359 insertions(+), 304 deletions(-) diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config_test.go b/flytectl/cmd/delete/matchable_workflow_execution_config_test.go index bb706f5e67..acebc7d06b 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config_test.go @@ -41,10 +41,10 @@ func TestDeleteWorkflowExecutionConfig(t *testing.T) { deleteWorkflowExecutionConfigSetup() // No args implying project domain attribute deletion u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) + mock.Anything).Return(fmt.Errorf("failed to delete project domain attributes")) err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) + assert.Equal(t, fmt.Errorf("failed to delete project domain attributes"), err) u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) diff --git a/flytectl/cmd/get/matchable_execution_cluster_label_test.go b/flytectl/cmd/get/matchable_execution_cluster_label_test.go index 04231373a3..b49aab9d8b 100644 --- a/flytectl/cmd/get/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/get/matchable_execution_cluster_label_test.go @@ -92,7 +92,7 @@ func TestGetExecutionClusterLabel(t *testing.T) { ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) tearDownAndVerify(t, ``) }) - t.Run("failed get project domain attribute", func(t *testing.T) { + t.Run("failed to get project domain attribute", func(t *testing.T) { var args []string setup() getExecutionClusterLabelSetup() @@ -120,7 +120,7 @@ func TestGetExecutionClusterLabel(t *testing.T) { admin.MatchableResource_EXECUTION_CLUSTER_LABEL) tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","value":"foo"}`) }) - t.Run("failed get workflow attribute", func(t *testing.T) { + t.Run("failed to get workflow attribute", func(t *testing.T) { var args []string setup() getExecutionClusterLabelSetup() diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 98c646c37a..f9286950b7 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -44,7 +44,7 @@ func newRootCmd() *cobra.Command { PersistentPreRunE: initConfig, Long: "FlyteCTL is CLI tool written in go to interact with Flyteadmin service", Short: "FlyteCTL CLI tool", - Use: "FlyteCTL", + Use: "flytectl", DisableAutoGenTag: true, } diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 73f1a083be..95edcff8dd 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -30,7 +30,7 @@ import ( ) const ( - startShort = "Start the flyte sandbox cluster" + startShort = "Start the Flyte Sandbox cluster" startLong = ` The Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte sandbox as a single Docker container locally. diff --git a/flytectl/cmd/upgrade/upgrade_test.go b/flytectl/cmd/upgrade/upgrade_test.go index 17584822a7..9708bc43fd 100644 --- a/flytectl/cmd/upgrade/upgrade_test.go +++ b/flytectl/cmd/upgrade/upgrade_test.go @@ -29,7 +29,7 @@ func TestUpgradeCommand(t *testing.T) { rootCmd := &cobra.Command{ Long: "FlyteCTL is CLI tool written in go to interact with flyteadmin service", Short: "FlyteCTL CLI tool", - Use: "FlyteCTL", + Use: "flytectl", DisableAutoGenTag: true, } upgradeCmd := SelfUpgrade(rootCmd) diff --git a/flytectl/cmd/version/version_test.go b/flytectl/cmd/version/version_test.go index 2b83ff9403..8bc2511a3a 100644 --- a/flytectl/cmd/version/version_test.go +++ b/flytectl/cmd/version/version_test.go @@ -33,7 +33,7 @@ func TestVersionCommand(t *testing.T) { rootCmd := &cobra.Command{ Long: "FlyteCTL is CLI tool written in go to interact with Flyteadmin service", Short: "FlyteCTL CLI tool", - Use: "FlyteCTL", + Use: "flytectl", DisableAutoGenTag: true, } versionCommand := GetVersionCommand(rootCmd) diff --git a/flytectl/docs/source/cluster-resource-attribute.rst b/flytectl/docs/source/cluster-resource-attribute.rst index bfbd2b0ffa..4b655f8dfa 100644 --- a/flytectl/docs/source/cluster-resource-attribute.rst +++ b/flytectl/docs/source/cluster-resource-attribute.rst @@ -1,9 +1,14 @@ Cluster resource attribute ------ +It specifies the actions to be performed on the 'cluster-resource-attribute'. + .. toctree:: :maxdepth: 1 :caption: Cluster resource attribute - gen/FlyteCTL_get_cluster-resource-attribute - gen/FlyteCTL_delete_cluster-resource-attribute - gen/FlyteCTL_update_cluster-resource-attribute + gen/flytectl_get_cluster-resource-attribute + gen/flytectl_delete_cluster-resource-attribute + gen/flytectl_update_cluster-resource-attribute + gen/flytectl_get_cluster-resource-attribute + gen/flytectl_delete_cluster-resource-attribute + gen/flytectl_update_cluster-resource-attribute diff --git a/flytectl/docs/source/config.rst b/flytectl/docs/source/config.rst index bf112114f8..dd558c988c 100644 --- a/flytectl/docs/source/config.rst +++ b/flytectl/docs/source/config.rst @@ -1,10 +1,13 @@ Config ------ +It specifies the actions to be performed on the resource 'config'. .. toctree:: :maxdepth: 1 :caption: Config - gen/FlyteCTL_config_validate - gen/FlyteCTL_config_init + gen/flytectl_config_validate + gen/flytectl_config_init + gen/flytectl_config_validate + gen/flytectl_config_init gen/flytectl_config_discover diff --git a/flytectl/docs/source/examples.rst b/flytectl/docs/source/examples.rst index a854e2349b..da62f2988f 100644 --- a/flytectl/docs/source/examples.rst +++ b/flytectl/docs/source/examples.rst @@ -1,8 +1,11 @@ Examples ------ +It specifies the actions to be performed on the resource 'examples'. + .. toctree:: :maxdepth: 1 :caption: Examples - gen/FlyteCTL_register_examples \ No newline at end of file + gen/flytectl_register_examples + gen/flytectl_register_examples diff --git a/flytectl/docs/source/execution-cluster-label.rst b/flytectl/docs/source/execution-cluster-label.rst index e0dae2adbc..8bd483f17e 100644 --- a/flytectl/docs/source/execution-cluster-label.rst +++ b/flytectl/docs/source/execution-cluster-label.rst @@ -1,10 +1,14 @@ Execution cluster label ------ +It specifies the actions to be performed on the resource 'execution-cluster-label'. .. toctree:: :maxdepth: 1 :caption: Execution cluster label - gen/FlyteCTL_get_execution-cluster-label - gen/FlyteCTL_update_execution-cluster-label - gen/FlyteCTL_delete_execution-cluster-label \ No newline at end of file + gen/flytectl_get_execution-cluster-label + gen/flytectl_update_execution-cluster-label + gen/flytectl_delete_execution-cluster-label + gen/flytectl_get_execution-cluster-label + gen/flytectl_update_execution-cluster-label + gen/flytectl_delete_execution-cluster-label diff --git a/flytectl/docs/source/execution-queue-attribute.rst b/flytectl/docs/source/execution-queue-attribute.rst index 92ba2502c0..207118cdb9 100644 --- a/flytectl/docs/source/execution-queue-attribute.rst +++ b/flytectl/docs/source/execution-queue-attribute.rst @@ -1,10 +1,14 @@ Execution queue attribute ------ +It specifies the actions to be performed on the resource 'execution-queue-attribute'. .. toctree:: :maxdepth: 1 :caption: Execution queue attribute - gen/FlyteCTL_get_execution-queue-attribute - gen/FlyteCTL_delete_execution-queue-attribute - gen/FlyteCTL_update_execution-queue-attribute \ No newline at end of file + gen/flytectl_get_execution-queue-attribute + gen/flytectl_delete_execution-queue-attribute + gen/flytectl_update_execution-queue-attribute + gen/flytectl_get_execution-queue-attribute + gen/flytectl_delete_execution-queue-attribute + gen/flytectl_update_execution-queue-attribute diff --git a/flytectl/docs/source/execution.rst b/flytectl/docs/source/execution.rst index b7857e7103..717c697db8 100644 --- a/flytectl/docs/source/execution.rst +++ b/flytectl/docs/source/execution.rst @@ -1,10 +1,14 @@ Execution ------ +It specifies the actions to be performed on the resource 'execution'. .. toctree:: :maxdepth: 1 :caption: Execution - gen/FlyteCTL_create_execution - gen/FlyteCTL_get_execution - gen/FlyteCTL_delete_execution \ No newline at end of file + gen/flytectl_create_execution + gen/flytectl_get_execution + gen/flytectl_delete_execution + gen/flytectl_create_execution + gen/flytectl_get_execution + gen/flytectl_delete_execution diff --git a/flytectl/docs/source/files.rst b/flytectl/docs/source/files.rst index b7216fbcae..afdb7e8e66 100644 --- a/flytectl/docs/source/files.rst +++ b/flytectl/docs/source/files.rst @@ -1,10 +1,12 @@ Files ------ +It specifies the actions to be performed on the resource 'files'. .. toctree:: :maxdepth: 1 :caption: Files - gen/FlyteCTL_register_files + gen/flytectl_register_files + gen/flytectl_register_files Note: It allows the user to register local files diff --git a/flytectl/docs/source/gen/FlyteCTL.rst b/flytectl/docs/source/gen/FlyteCTL.rst index d11e9d5bbf..9d7eec1e80 100644 --- a/flytectl/docs/source/gen/FlyteCTL.rst +++ b/flytectl/docs/source/gen/FlyteCTL.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL: +.. _flytectl: -FlyteCTL +flytectl -------- FlyteCTL CLI tool @@ -33,7 +33,7 @@ Options --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. - -h, --help help for FlyteCTL + -h, --help help for flytectl --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. @@ -59,14 +59,14 @@ Options SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_completion` - Generate completion script -* :doc:`FlyteCTL_config` - Runs various config commands, look at the help of this command to get a list of available commands.. -* :doc:`FlyteCTL_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`FlyteCTL_register` - Register tasks/workflows/launchplans from a list of generated serialized files. -* :doc:`FlyteCTL_sandbox` - Used for sandbox interactions like start/teardown/status/exec. -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. -* :doc:`FlyteCTL_upgrade` - Upgrade/rollback to a Flyte version -* :doc:`FlyteCTL_version` - Fetch Flyte version +* :doc:`flytectl_completion` - Generate completion script +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`flytectl_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_register` - Register tasks/workflows/launchplans from a list of generated serialized files. +* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_upgrade` - Upgrade/rollback to a Flyte version +* :doc:`flytectl_version` - Fetch Flyte version diff --git a/flytectl/docs/source/gen/FlyteCTL_completion.rst b/flytectl/docs/source/gen/FlyteCTL_completion.rst index 1e4ed90351..20f9b52f89 100644 --- a/flytectl/docs/source/gen/FlyteCTL_completion.rst +++ b/flytectl/docs/source/gen/FlyteCTL_completion.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_completion: +.. _flytectl_completion: -FlyteCTL completion +flytectl completion ------------------- Generate completion script @@ -51,7 +51,7 @@ PowerShell: :: - FlyteCTL completion [bash|zsh|fish|powershell] + flytectl completion [bash|zsh|fish|powershell] Options ~~~~~~~ @@ -107,5 +107,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL` - FlyteCTL CLI tool +* :doc:`flytectl` - FlyteCTL CLI tool diff --git a/flytectl/docs/source/gen/FlyteCTL_config.rst b/flytectl/docs/source/gen/FlyteCTL_config.rst index 3df3187008..7d4e25cef6 100644 --- a/flytectl/docs/source/gen/FlyteCTL_config.rst +++ b/flytectl/docs/source/gen/FlyteCTL_config.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_config: +.. _flytectl_config: -FlyteCTL config +flytectl config --------------- Runs various config commands, look at the help of this command to get a list of available commands.. @@ -67,8 +67,8 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL` - FlyteCTL CLI tool -* :doc:`FlyteCTL_config_discover` - Searches for a config in one of the default search paths. -* :doc:`FlyteCTL_config_init` - Generates FlyteCTL config file in the user's home directory. -* :doc:`FlyteCTL_config_validate` - Validates the loaded config. +* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl_config_discover` - Searches for a config in one of the default search paths. +* :doc:`flytectl_config_init` - Generates FlyteCTL config file in the user's home directory. +* :doc:`flytectl_config_validate` - Validates the loaded config. diff --git a/flytectl/docs/source/gen/FlyteCTL_config_discover.rst b/flytectl/docs/source/gen/FlyteCTL_config_discover.rst index a91147e3d4..8550321470 100644 --- a/flytectl/docs/source/gen/FlyteCTL_config_discover.rst +++ b/flytectl/docs/source/gen/FlyteCTL_config_discover.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_config_discover: +.. _flytectl_config_discover: -FlyteCTL config discover +flytectl config discover ------------------------ Searches for a config in one of the default search paths. @@ -13,7 +13,7 @@ Searches for a config in one of the default search paths. :: - FlyteCTL config discover [flags] + flytectl config discover [flags] Options ~~~~~~~ @@ -71,5 +71,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. diff --git a/flytectl/docs/source/gen/FlyteCTL_config_init.rst b/flytectl/docs/source/gen/FlyteCTL_config_init.rst index 3ba2564ca2..2540c588af 100644 --- a/flytectl/docs/source/gen/FlyteCTL_config_init.rst +++ b/flytectl/docs/source/gen/FlyteCTL_config_init.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_config_init: +.. _flytectl_config_init: -FlyteCTL config init +flytectl config init -------------------- Generates FlyteCTL config file in the user's home directory. @@ -31,7 +31,7 @@ Generates FlyteCTL config with a storage provider :: - FlyteCTL config init [flags] + flytectl config init [flags] Options ~~~~~~~ @@ -92,5 +92,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. diff --git a/flytectl/docs/source/gen/FlyteCTL_config_validate.rst b/flytectl/docs/source/gen/FlyteCTL_config_validate.rst index 461e625269..51a3a7e443 100644 --- a/flytectl/docs/source/gen/FlyteCTL_config_validate.rst +++ b/flytectl/docs/source/gen/FlyteCTL_config_validate.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_config_validate: +.. _flytectl_config_validate: -FlyteCTL config validate +flytectl config validate ------------------------ Validates the loaded config. @@ -13,7 +13,7 @@ Validates the loaded config. :: - FlyteCTL config validate [flags] + flytectl config validate [flags] Options ~~~~~~~ @@ -73,5 +73,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_config` - Runs various config commands, look at the help of this command to get a list of available commands.. +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. diff --git a/flytectl/docs/source/gen/FlyteCTL_create.rst b/flytectl/docs/source/gen/FlyteCTL_create.rst index d389ea2c0d..1405e2c25a 100644 --- a/flytectl/docs/source/gen/FlyteCTL_create.rst +++ b/flytectl/docs/source/gen/FlyteCTL_create.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_create: +.. _flytectl_create: -FlyteCTL create +flytectl create --------------- Create various Flyte resources including tasks/workflows/launchplans/executions/project. @@ -70,7 +70,7 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL` - FlyteCTL CLI tool -* :doc:`FlyteCTL_create_execution` - Create execution resources -* :doc:`FlyteCTL_create_project` - Create project resources +* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl_create_execution` - Create execution resources +* :doc:`flytectl_create_project` - Create project resources diff --git a/flytectl/docs/source/gen/FlyteCTL_create_execution.rst b/flytectl/docs/source/gen/FlyteCTL_create_execution.rst index 72337bd67e..962f7749ac 100644 --- a/flytectl/docs/source/gen/FlyteCTL_create_execution.rst +++ b/flytectl/docs/source/gen/FlyteCTL_create_execution.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_create_execution: +.. _flytectl_create_execution: -FlyteCTL create execution +flytectl create execution ------------------------- Create execution resources @@ -133,7 +133,7 @@ Usage :: - FlyteCTL create execution [flags] + flytectl create execution [flags] Options ~~~~~~~ @@ -200,5 +200,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_create_project.rst b/flytectl/docs/source/gen/FlyteCTL_create_project.rst index 49d244f310..4c42f59c44 100644 --- a/flytectl/docs/source/gen/FlyteCTL_create_project.rst +++ b/flytectl/docs/source/gen/FlyteCTL_create_project.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_create_project: +.. _flytectl_create_project: -FlyteCTL create project +flytectl create project ----------------------- Create project resources @@ -33,7 +33,7 @@ Create a project by definition file. Note: The name shouldn't contain any whites :: - FlyteCTL create project [flags] + flytectl create project [flags] Options ~~~~~~~ @@ -95,5 +95,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_delete.rst b/flytectl/docs/source/gen/FlyteCTL_delete.rst index b675158f7a..60bef4e19d 100644 --- a/flytectl/docs/source/gen/FlyteCTL_delete.rst +++ b/flytectl/docs/source/gen/FlyteCTL_delete.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_delete: +.. _flytectl_delete: -FlyteCTL delete +flytectl delete --------------- Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. @@ -70,12 +70,12 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL` - FlyteCTL CLI tool -* :doc:`FlyteCTL_delete_cluster-resource-attribute` - Delete matchable resources of cluster attributes -* :doc:`FlyteCTL_delete_execution` - Terminate/Delete execution resources. -* :doc:`FlyteCTL_delete_execution-cluster-label` - Delete matchable resources of execution cluster label -* :doc:`FlyteCTL_delete_execution-queue-attribute` - Delete matchable resources of execution queue attributes -* :doc:`FlyteCTL_delete_plugin-override` - Delete matchable resources of plugin overrides -* :doc:`FlyteCTL_delete_task-resource-attribute` - Delete matchable resources of task attributes -* :doc:`FlyteCTL_delete_workflow-execution-config` - Delete matchable resources of workflow execution config +* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl_delete_cluster-resource-attribute` - Delete matchable resources of cluster attributes +* :doc:`flytectl_delete_execution` - Terminate/Delete execution resources. +* :doc:`flytectl_delete_execution-cluster-label` - Delete matchable resources of execution cluster label +* :doc:`flytectl_delete_execution-queue-attribute` - Delete matchable resources of execution queue attributes +* :doc:`flytectl_delete_plugin-override` - Delete matchable resources of plugin overrides +* :doc:`flytectl_delete_task-resource-attribute` - Delete matchable resources of task attributes +* :doc:`flytectl_delete_workflow-execution-config` - Delete matchable resources of workflow execution config diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_delete_cluster-resource-attribute.rst index 80d749a821..0572aac149 100644 --- a/flytectl/docs/source/gen/FlyteCTL_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/FlyteCTL_delete_cluster-resource-attribute.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_delete_cluster-resource-attribute: +.. _flytectl_delete_cluster-resource-attribute: -FlyteCTL delete cluster-resource-attribute +flytectl delete cluster-resource-attribute ------------------------------------------ Delete matchable resources of cluster attributes @@ -48,7 +48,7 @@ Usage :: - FlyteCTL delete cluster-resource-attribute [flags] + flytectl delete cluster-resource-attribute [flags] Options ~~~~~~~ @@ -106,5 +106,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/FlyteCTL_delete_execution-cluster-label.rst index 1938d47b4a..32206f7c2b 100644 --- a/flytectl/docs/source/gen/FlyteCTL_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/FlyteCTL_delete_execution-cluster-label.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_delete_execution-cluster-label: +.. _flytectl_delete_execution-cluster-label: -FlyteCTL delete execution-cluster-label +flytectl delete execution-cluster-label --------------------------------------- Delete matchable resources of execution cluster label @@ -46,7 +46,7 @@ Usage :: - FlyteCTL delete execution-cluster-label [flags] + flytectl delete execution-cluster-label [flags] Options ~~~~~~~ @@ -104,5 +104,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_delete_execution-queue-attribute.rst index 3f84f50441..cf6bc31ed3 100644 --- a/flytectl/docs/source/gen/FlyteCTL_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/FlyteCTL_delete_execution-queue-attribute.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_delete_execution-queue-attribute: +.. _flytectl_delete_execution-queue-attribute: -FlyteCTL delete execution-queue-attribute +flytectl delete execution-queue-attribute ----------------------------------------- Delete matchable resources of execution queue attributes @@ -50,7 +50,7 @@ Usage :: - FlyteCTL delete execution-queue-attribute [flags] + flytectl delete execution-queue-attribute [flags] Options ~~~~~~~ @@ -108,5 +108,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_execution.rst b/flytectl/docs/source/gen/FlyteCTL_delete_execution.rst index d84c5d3b55..25bec01c32 100644 --- a/flytectl/docs/source/gen/FlyteCTL_delete_execution.rst +++ b/flytectl/docs/source/gen/FlyteCTL_delete_execution.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_delete_execution: +.. _flytectl_delete_execution: -FlyteCTL delete execution +flytectl delete execution ------------------------- Terminate/Delete execution resources. @@ -56,7 +56,7 @@ Usage :: - FlyteCTL delete execution [flags] + flytectl delete execution [flags] Options ~~~~~~~ @@ -113,5 +113,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_plugin-override.rst b/flytectl/docs/source/gen/FlyteCTL_delete_plugin-override.rst index baa2d4355c..cbf85e2288 100644 --- a/flytectl/docs/source/gen/FlyteCTL_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/FlyteCTL_delete_plugin-override.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_delete_plugin-override: +.. _flytectl_delete_plugin-override: -FlyteCTL delete plugin-override +flytectl delete plugin-override ------------------------------- Delete matchable resources of plugin overrides @@ -50,7 +50,7 @@ Usage :: - FlyteCTL delete plugin-override [flags] + flytectl delete plugin-override [flags] Options ~~~~~~~ @@ -108,5 +108,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_delete_task-resource-attribute.rst index 1800977e0f..c673e19a4e 100644 --- a/flytectl/docs/source/gen/FlyteCTL_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/FlyteCTL_delete_task-resource-attribute.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_delete_task-resource-attribute: +.. _flytectl_delete_task-resource-attribute: -FlyteCTL delete task-resource-attribute +flytectl delete task-resource-attribute --------------------------------------- Delete matchable resources of task attributes @@ -51,7 +51,7 @@ Usage :: - FlyteCTL delete task-resource-attribute [flags] + flytectl delete task-resource-attribute [flags] Options ~~~~~~~ @@ -109,5 +109,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/FlyteCTL_delete_workflow-execution-config.rst index 5d23c0547b..7647c0cb36 100644 --- a/flytectl/docs/source/gen/FlyteCTL_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/FlyteCTL_delete_workflow-execution-config.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_delete_workflow-execution-config: +.. _flytectl_delete_workflow-execution-config: -FlyteCTL delete workflow-execution-config +flytectl delete workflow-execution-config ----------------------------------------- Delete matchable resources of workflow execution config @@ -46,7 +46,7 @@ Usage :: - FlyteCTL delete workflow-execution-config [flags] + flytectl delete workflow-execution-config [flags] Options ~~~~~~~ @@ -104,5 +104,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get.rst b/flytectl/docs/source/gen/FlyteCTL_get.rst index d27ae935a2..14db227b12 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get: +.. _flytectl_get: -FlyteCTL get +flytectl get ------------ Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. @@ -70,16 +70,16 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL` - FlyteCTL CLI tool -* :doc:`FlyteCTL_get_cluster-resource-attribute` - Get matchable resources of cluster resource attributes. -* :doc:`FlyteCTL_get_execution` - Get execution resources -* :doc:`FlyteCTL_get_execution-cluster-label` - Get matchable resources of execution cluster label. -* :doc:`FlyteCTL_get_execution-queue-attribute` - Get matchable resources of execution queue attributes -* :doc:`FlyteCTL_get_launchplan` - Get launch plan resources -* :doc:`FlyteCTL_get_plugin-override` - Get matchable resources of plugin override -* :doc:`FlyteCTL_get_project` - Get project resources -* :doc:`FlyteCTL_get_task` - Get task resources -* :doc:`FlyteCTL_get_task-resource-attribute` - Get matchable resources of task attributes -* :doc:`FlyteCTL_get_workflow` - Get workflow resources -* :doc:`FlyteCTL_get_workflow-execution-config` - Get matchable resources of workflow execution config +* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl_get_cluster-resource-attribute` - Get matchable resources of cluster resource attributes. +* :doc:`flytectl_get_execution` - Get execution resources +* :doc:`flytectl_get_execution-cluster-label` - Get matchable resources of execution cluster label. +* :doc:`flytectl_get_execution-queue-attribute` - Get matchable resources of execution queue attributes +* :doc:`flytectl_get_launchplan` - Get launch plan resources +* :doc:`flytectl_get_plugin-override` - Get matchable resources of plugin override +* :doc:`flytectl_get_project` - Get project resources +* :doc:`flytectl_get_task` - Get task resources +* :doc:`flytectl_get_task-resource-attribute` - Get matchable resources of task attributes +* :doc:`flytectl_get_workflow` - Get workflow resources +* :doc:`flytectl_get_workflow-execution-config` - Get matchable resources of workflow execution config diff --git a/flytectl/docs/source/gen/FlyteCTL_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_get_cluster-resource-attribute.rst index 059cfe64a5..1a0e26cad6 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_cluster-resource-attribute.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_cluster-resource-attribute: +.. _flytectl_get_cluster-resource-attribute: -FlyteCTL get cluster-resource-attribute +flytectl get cluster-resource-attribute --------------------------------------- Get matchable resources of cluster resource attributes. @@ -56,7 +56,7 @@ Usage :: - FlyteCTL get cluster-resource-attribute [flags] + flytectl get cluster-resource-attribute [flags] Options ~~~~~~~ @@ -113,5 +113,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get_execution-cluster-label.rst b/flytectl/docs/source/gen/FlyteCTL_get_execution-cluster-label.rst index 1db5d7980c..e027c3f899 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_execution-cluster-label.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_execution-cluster-label: +.. _flytectl_get_execution-cluster-label: -FlyteCTL get execution-cluster-label +flytectl get execution-cluster-label ------------------------------------ Get matchable resources of execution cluster label. @@ -55,7 +55,7 @@ Usage :: - FlyteCTL get execution-cluster-label [flags] + flytectl get execution-cluster-label [flags] Options ~~~~~~~ @@ -112,5 +112,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_get_execution-queue-attribute.rst index e56c92e39e..d5fbb275e2 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_execution-queue-attribute.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_execution-queue-attribute: +.. _flytectl_get_execution-queue-attribute: -FlyteCTL get execution-queue-attribute +flytectl get execution-queue-attribute -------------------------------------- Get matchable resources of execution queue attributes @@ -58,7 +58,7 @@ Usage :: - FlyteCTL get execution-queue-attribute [flags] + flytectl get execution-queue-attribute [flags] Options ~~~~~~~ @@ -115,5 +115,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get_execution.rst b/flytectl/docs/source/gen/FlyteCTL_get_execution.rst index 714a6ddeae..a727191707 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_execution.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_execution.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_execution: +.. _flytectl_get_execution: -FlyteCTL get execution +flytectl get execution ---------------------- Get execution resources @@ -75,7 +75,7 @@ Usage :: - FlyteCTL get execution [flags] + flytectl get execution [flags] Options ~~~~~~~ @@ -137,5 +137,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get_launchplan.rst b/flytectl/docs/source/gen/FlyteCTL_get_launchplan.rst index 6d2c4fcafa..a8708be99a 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_launchplan.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_launchplan.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_launchplan: +.. _flytectl_get_launchplan: -FlyteCTL get launchplan +flytectl get launchplan ----------------------- Get launch plan resources @@ -92,7 +92,7 @@ Usage :: - FlyteCTL get launchplan [flags] + flytectl get launchplan [flags] Options ~~~~~~~ @@ -155,5 +155,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get_plugin-override.rst b/flytectl/docs/source/gen/FlyteCTL_get_plugin-override.rst index 30d89032b1..3b99af6a8b 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_plugin-override.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_plugin-override.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_plugin-override: +.. _flytectl_get_plugin-override: -FlyteCTL get plugin-override +flytectl get plugin-override ---------------------------- Get matchable resources of plugin override @@ -78,7 +78,7 @@ Usage :: - FlyteCTL get plugin-override [flags] + flytectl get plugin-override [flags] Options ~~~~~~~ @@ -135,5 +135,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get_project.rst b/flytectl/docs/source/gen/FlyteCTL_get_project.rst index cad73c12d6..cd967a7ee6 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_project.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_project.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_project: +.. _flytectl_get_project: -FlyteCTL get project +flytectl get project -------------------- Get project resources @@ -48,7 +48,7 @@ Usage :: - FlyteCTL get project [flags] + flytectl get project [flags] Options ~~~~~~~ @@ -108,5 +108,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get_task-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_get_task-resource-attribute.rst index 384345cd0c..e27aa5532b 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_task-resource-attribute.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_task-resource-attribute: +.. _flytectl_get_task-resource-attribute: -FlyteCTL get task-resource-attribute +flytectl get task-resource-attribute ------------------------------------ Get matchable resources of task attributes @@ -60,7 +60,7 @@ Usage :: - FlyteCTL get task-resource-attribute [flags] + flytectl get task-resource-attribute [flags] Options ~~~~~~~ @@ -117,5 +117,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get_task.rst b/flytectl/docs/source/gen/FlyteCTL_get_task.rst index cc76eff200..2848c36a2a 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_task.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_task.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_task: +.. _flytectl_get_task: -FlyteCTL get task +flytectl get task ----------------- Get task resources @@ -88,7 +88,7 @@ Usage :: - FlyteCTL get task [flags] + flytectl get task [flags] Options ~~~~~~~ @@ -151,5 +151,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get_workflow-execution-config.rst b/flytectl/docs/source/gen/FlyteCTL_get_workflow-execution-config.rst index 12acb14f89..f3108b567a 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_workflow-execution-config.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_workflow-execution-config: +.. _flytectl_get_workflow-execution-config: -FlyteCTL get workflow-execution-config +flytectl get workflow-execution-config -------------------------------------- Get matchable resources of workflow execution config @@ -66,7 +66,7 @@ Usage :: - FlyteCTL get workflow-execution-config [flags] + flytectl get workflow-execution-config [flags] Options ~~~~~~~ @@ -123,5 +123,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_get_workflow.rst b/flytectl/docs/source/gen/FlyteCTL_get_workflow.rst index 6edd90c438..4cb6dd7e71 100644 --- a/flytectl/docs/source/gen/FlyteCTL_get_workflow.rst +++ b/flytectl/docs/source/gen/FlyteCTL_get_workflow.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_get_workflow: +.. _flytectl_get_workflow: -FlyteCTL get workflow +flytectl get workflow --------------------- Get workflow resources @@ -77,7 +77,7 @@ Usage :: - FlyteCTL get workflow [flags] + flytectl get workflow [flags] Options ~~~~~~~ @@ -139,5 +139,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. diff --git a/flytectl/docs/source/gen/FlyteCTL_register.rst b/flytectl/docs/source/gen/FlyteCTL_register.rst index 199911f0fd..5c3200f533 100644 --- a/flytectl/docs/source/gen/FlyteCTL_register.rst +++ b/flytectl/docs/source/gen/FlyteCTL_register.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_register: +.. _flytectl_register: -FlyteCTL register +flytectl register ----------------- Register tasks/workflows/launchplans from a list of generated serialized files. @@ -70,7 +70,7 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL` - FlyteCTL CLI tool -* :doc:`FlyteCTL_register_examples` - Register Flytesnacks example -* :doc:`FlyteCTL_register_files` - Register file resources +* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl_register_examples` - Register Flytesnacks example +* :doc:`flytectl_register_files` - Register file resources diff --git a/flytectl/docs/source/gen/FlyteCTL_register_examples.rst b/flytectl/docs/source/gen/FlyteCTL_register_examples.rst index 06ac0bec81..92d00b3bf1 100644 --- a/flytectl/docs/source/gen/FlyteCTL_register_examples.rst +++ b/flytectl/docs/source/gen/FlyteCTL_register_examples.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_register_examples: +.. _flytectl_register_examples: -FlyteCTL register examples +flytectl register examples -------------------------- Register Flytesnacks example @@ -26,7 +26,7 @@ Usage :: - FlyteCTL register examples [flags] + flytectl register examples [flags] Options ~~~~~~~ @@ -91,5 +91,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_register` - Register tasks/workflows/launchplans from a list of generated serialized files. +* :doc:`flytectl_register` - Register tasks/workflows/launchplans from a list of generated serialized files. diff --git a/flytectl/docs/source/gen/FlyteCTL_register_files.rst b/flytectl/docs/source/gen/FlyteCTL_register_files.rst index b361d481c7..7e73e6d955 100644 --- a/flytectl/docs/source/gen/FlyteCTL_register_files.rst +++ b/flytectl/docs/source/gen/FlyteCTL_register_files.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_register_files: +.. _flytectl_register_files: -FlyteCTL register files +flytectl register files ----------------------- Register file resources @@ -85,7 +85,7 @@ Usage :: - FlyteCTL register files [flags] + flytectl register files [flags] Options ~~~~~~~ @@ -150,5 +150,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_register` - Register tasks/workflows/launchplans from a list of generated serialized files. +* :doc:`flytectl_register` - Register tasks/workflows/launchplans from a list of generated serialized files. diff --git a/flytectl/docs/source/gen/FlyteCTL_sandbox.rst b/flytectl/docs/source/gen/FlyteCTL_sandbox.rst index 05b115d066..34d11c5c93 100644 --- a/flytectl/docs/source/gen/FlyteCTL_sandbox.rst +++ b/flytectl/docs/source/gen/FlyteCTL_sandbox.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_sandbox: +.. _flytectl_sandbox: -FlyteCTL sandbox +flytectl sandbox ---------------- Used for sandbox interactions like start/teardown/status/exec. @@ -89,9 +89,9 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL` - FlyteCTL CLI tool -* :doc:`FlyteCTL_sandbox_exec` - Execute non-interactive command inside the sandbox container -* :doc:`FlyteCTL_sandbox_start` - Start the flyte sandbox cluster -* :doc:`FlyteCTL_sandbox_status` - Get status of the sandbox environment. -* :doc:`FlyteCTL_sandbox_teardown` - Teardown cleans up the sandbox environment +* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl_sandbox_exec` - Execute non-interactive command inside the sandbox container +* :doc:`flytectl_sandbox_start` - Start the Flyte Sandbox cluster +* :doc:`flytectl_sandbox_status` - Get status of the sandbox environment. +* :doc:`flytectl_sandbox_teardown` - Teardown cleans up the sandbox environment diff --git a/flytectl/docs/source/gen/FlyteCTL_sandbox_exec.rst b/flytectl/docs/source/gen/FlyteCTL_sandbox_exec.rst index c89b580c0b..aa868e7c19 100644 --- a/flytectl/docs/source/gen/FlyteCTL_sandbox_exec.rst +++ b/flytectl/docs/source/gen/FlyteCTL_sandbox_exec.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_sandbox_exec: +.. _flytectl_sandbox_exec: -FlyteCTL sandbox exec +flytectl sandbox exec --------------------- Execute non-interactive command inside the sandbox container @@ -19,7 +19,7 @@ Usage :: - FlyteCTL sandbox exec [flags] + flytectl sandbox exec [flags] Options ~~~~~~~ @@ -75,5 +75,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/FlyteCTL_sandbox_start.rst b/flytectl/docs/source/gen/FlyteCTL_sandbox_start.rst index 1b7cd78ed8..8f6feea066 100644 --- a/flytectl/docs/source/gen/FlyteCTL_sandbox_start.rst +++ b/flytectl/docs/source/gen/FlyteCTL_sandbox_start.rst @@ -1,9 +1,9 @@ -.. _FlyteCTL_sandbox_start: +.. _flytectl_sandbox_start: -FlyteCTL sandbox start +flytectl sandbox start ---------------------- -Start the flyte sandbox cluster +Start the Flyte Sandbox cluster Synopsis ~~~~~~~~ @@ -44,7 +44,7 @@ Usage :: - FlyteCTL sandbox start [flags] + flytectl sandbox start [flags] Options ~~~~~~~ @@ -104,5 +104,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/FlyteCTL_sandbox_status.rst b/flytectl/docs/source/gen/FlyteCTL_sandbox_status.rst index b61887f15c..2249ab17ee 100644 --- a/flytectl/docs/source/gen/FlyteCTL_sandbox_status.rst +++ b/flytectl/docs/source/gen/FlyteCTL_sandbox_status.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_sandbox_status: +.. _flytectl_sandbox_status: -FlyteCTL sandbox status +flytectl sandbox status ----------------------- Get status of the sandbox environment. @@ -21,7 +21,7 @@ Usage :: - FlyteCTL sandbox status [flags] + flytectl sandbox status [flags] Options ~~~~~~~ @@ -77,5 +77,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/FlyteCTL_sandbox_teardown.rst b/flytectl/docs/source/gen/FlyteCTL_sandbox_teardown.rst index ca2a13d800..ede1979d2f 100644 --- a/flytectl/docs/source/gen/FlyteCTL_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/FlyteCTL_sandbox_teardown.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_sandbox_teardown: +.. _flytectl_sandbox_teardown: -FlyteCTL sandbox teardown +flytectl sandbox teardown ------------------------- Teardown cleans up the sandbox environment @@ -21,7 +21,7 @@ Usage :: - FlyteCTL sandbox teardown [flags] + flytectl sandbox teardown [flags] Options ~~~~~~~ @@ -77,5 +77,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. diff --git a/flytectl/docs/source/gen/FlyteCTL_update.rst b/flytectl/docs/source/gen/FlyteCTL_update.rst index a4276dfa44..232876c1d3 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update: +.. _flytectl_update: -FlyteCTL update +flytectl update --------------- Update Flyte resources e.g., project. @@ -72,16 +72,16 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL` - FlyteCTL CLI tool -* :doc:`FlyteCTL_update_cluster-resource-attribute` - Update matchable resources of cluster attributes -* :doc:`FlyteCTL_update_execution-cluster-label` - Update matchable resources of execution cluster label -* :doc:`FlyteCTL_update_execution-queue-attribute` - Update matchable resources of execution queue attributes -* :doc:`FlyteCTL_update_launchplan` - Update launch plan status -* :doc:`FlyteCTL_update_launchplan-meta` - Update launch plan metadata -* :doc:`FlyteCTL_update_plugin-override` - Update matchable resources of plugin overrides -* :doc:`FlyteCTL_update_project` - Update project resources -* :doc:`FlyteCTL_update_task-meta` - Update task metadata -* :doc:`FlyteCTL_update_task-resource-attribute` - Update matchable resources of task attributes -* :doc:`FlyteCTL_update_workflow-execution-config` - Update matchable resources of workflow execution config -* :doc:`FlyteCTL_update_workflow-meta` - Update workflow metadata +* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl_update_cluster-resource-attribute` - Update matchable resources of cluster attributes +* :doc:`flytectl_update_execution-cluster-label` - Update matchable resources of execution cluster label +* :doc:`flytectl_update_execution-queue-attribute` - Update matchable resources of execution queue attributes +* :doc:`flytectl_update_launchplan` - Update launch plan status +* :doc:`flytectl_update_launchplan-meta` - Update launch plan metadata +* :doc:`flytectl_update_plugin-override` - Update matchable resources of plugin overrides +* :doc:`flytectl_update_project` - Update project resources +* :doc:`flytectl_update_task-meta` - Update task metadata +* :doc:`flytectl_update_task-resource-attribute` - Update matchable resources of task attributes +* :doc:`flytectl_update_workflow-execution-config` - Update matchable resources of workflow execution config +* :doc:`flytectl_update_workflow-meta` - Update workflow metadata diff --git a/flytectl/docs/source/gen/FlyteCTL_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_update_cluster-resource-attribute.rst index 25b31bb004..b102e6b8aa 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_cluster-resource-attribute.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_cluster-resource-attribute: +.. _flytectl_update_cluster-resource-attribute: -FlyteCTL update cluster-resource-attribute +flytectl update cluster-resource-attribute ------------------------------------------ Update matchable resources of cluster attributes @@ -54,7 +54,7 @@ Usage :: - FlyteCTL update cluster-resource-attribute [flags] + flytectl update cluster-resource-attribute [flags] Options ~~~~~~~ @@ -112,5 +112,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_update_execution-cluster-label.rst b/flytectl/docs/source/gen/FlyteCTL_update_execution-cluster-label.rst index 6086db5067..4da8a7c242 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_execution-cluster-label.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_execution-cluster-label: +.. _flytectl_update_execution-cluster-label: -FlyteCTL update execution-cluster-label +flytectl update execution-cluster-label --------------------------------------- Update matchable resources of execution cluster label @@ -47,7 +47,7 @@ Usage :: - FlyteCTL update execution-cluster-label [flags] + flytectl update execution-cluster-label [flags] Options ~~~~~~~ @@ -105,5 +105,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_update_execution-queue-attribute.rst index 849b54ab17..9db12f7afb 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_execution-queue-attribute.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_execution-queue-attribute: +.. _flytectl_update_execution-queue-attribute: -FlyteCTL update execution-queue-attribute +flytectl update execution-queue-attribute ----------------------------------------- Update matchable resources of execution queue attributes @@ -58,7 +58,7 @@ Usage :: - FlyteCTL update execution-queue-attribute [flags] + flytectl update execution-queue-attribute [flags] Options ~~~~~~~ @@ -116,5 +116,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_update_launchplan-meta.rst b/flytectl/docs/source/gen/FlyteCTL_update_launchplan-meta.rst index 26fa58c7b4..b3c11b6d57 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_launchplan-meta.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_launchplan-meta: +.. _flytectl_update_launchplan-meta: -FlyteCTL update launchplan-meta +flytectl update launchplan-meta ------------------------------- Update launch plan metadata @@ -30,7 +30,7 @@ Usage :: - FlyteCTL update launchplan-meta [flags] + flytectl update launchplan-meta [flags] Options ~~~~~~~ @@ -90,5 +90,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_update_launchplan.rst b/flytectl/docs/source/gen/FlyteCTL_update_launchplan.rst index 4213143d3a..b2b64722cb 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_launchplan.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_launchplan.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_launchplan: +.. _flytectl_update_launchplan: -FlyteCTL update launchplan +flytectl update launchplan -------------------------- Update launch plan status @@ -26,7 +26,7 @@ Usage :: - FlyteCTL update launchplan [flags] + flytectl update launchplan [flags] Options ~~~~~~~ @@ -86,5 +86,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_update_plugin-override.rst b/flytectl/docs/source/gen/FlyteCTL_update_plugin-override.rst index 33c765d247..7a0b81f1a5 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_plugin-override.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_plugin-override.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_plugin-override: +.. _flytectl_update_plugin-override: -FlyteCTL update plugin-override +flytectl update plugin-override ------------------------------- Update matchable resources of plugin overrides @@ -60,7 +60,7 @@ Usage :: - FlyteCTL update plugin-override [flags] + flytectl update plugin-override [flags] Options ~~~~~~~ @@ -118,5 +118,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_update_project.rst b/flytectl/docs/source/gen/FlyteCTL_update_project.rst index 1e13cac8fd..38042f4b9b 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_project.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_project.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_project: +.. _flytectl_update_project: -FlyteCTL update project +flytectl update project ----------------------- Update project resources @@ -45,7 +45,7 @@ Usage :: - FlyteCTL update project [flags] + flytectl update project [flags] Options ~~~~~~~ @@ -104,5 +104,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_update_task-meta.rst b/flytectl/docs/source/gen/FlyteCTL_update_task-meta.rst index 497f5edf00..45287308ab 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_task-meta.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_task-meta.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_task-meta: +.. _flytectl_update_task-meta: -FlyteCTL update task-meta +flytectl update task-meta ------------------------- Update task metadata @@ -30,7 +30,7 @@ Usage :: - FlyteCTL update task-meta [flags] + flytectl update task-meta [flags] Options ~~~~~~~ @@ -90,5 +90,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_update_task-resource-attribute.rst b/flytectl/docs/source/gen/FlyteCTL_update_task-resource-attribute.rst index 856a267771..fe12a27559 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_task-resource-attribute.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_task-resource-attribute: +.. _flytectl_update_task-resource-attribute: -FlyteCTL update task-resource-attribute +flytectl update task-resource-attribute --------------------------------------- Update matchable resources of task attributes @@ -60,7 +60,7 @@ Usage :: - FlyteCTL update task-resource-attribute [flags] + flytectl update task-resource-attribute [flags] Options ~~~~~~~ @@ -118,5 +118,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_update_workflow-execution-config.rst b/flytectl/docs/source/gen/FlyteCTL_update_workflow-execution-config.rst index b10ca234a8..66f46455e2 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_workflow-execution-config.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_workflow-execution-config: +.. _flytectl_update_workflow-execution-config: -FlyteCTL update workflow-execution-config +flytectl update workflow-execution-config ----------------------------------------- Update matchable resources of workflow execution config @@ -50,7 +50,7 @@ Usage :: - FlyteCTL update workflow-execution-config [flags] + flytectl update workflow-execution-config [flags] Options ~~~~~~~ @@ -108,5 +108,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_update_workflow-meta.rst b/flytectl/docs/source/gen/FlyteCTL_update_workflow-meta.rst index 1e665e8958..c6dca84ae0 100644 --- a/flytectl/docs/source/gen/FlyteCTL_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/FlyteCTL_update_workflow-meta.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_update_workflow-meta: +.. _flytectl_update_workflow-meta: -FlyteCTL update workflow-meta +flytectl update workflow-meta ----------------------------- Update workflow metadata @@ -30,7 +30,7 @@ Usage :: - FlyteCTL update workflow-meta [flags] + flytectl update workflow-meta [flags] Options ~~~~~~~ @@ -90,5 +90,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL_update` - Update Flyte resources e.g., project. +* :doc:`flytectl_update` - Update Flyte resources e.g., project. diff --git a/flytectl/docs/source/gen/FlyteCTL_upgrade.rst b/flytectl/docs/source/gen/FlyteCTL_upgrade.rst index b44d9c5e36..837a27dd4a 100644 --- a/flytectl/docs/source/gen/FlyteCTL_upgrade.rst +++ b/flytectl/docs/source/gen/FlyteCTL_upgrade.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_upgrade: +.. _flytectl_upgrade: -FlyteCTL upgrade +flytectl upgrade ---------------- Upgrade/rollback to a Flyte version @@ -27,7 +27,7 @@ Note: Upgrade is not available on windows. :: - FlyteCTL upgrade [flags] + flytectl upgrade [flags] Options ~~~~~~~ @@ -83,5 +83,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL` - FlyteCTL CLI tool +* :doc:`flytectl` - FlyteCTL CLI tool diff --git a/flytectl/docs/source/gen/FlyteCTL_version.rst b/flytectl/docs/source/gen/FlyteCTL_version.rst index 5748697600..ba7aeb4d94 100644 --- a/flytectl/docs/source/gen/FlyteCTL_version.rst +++ b/flytectl/docs/source/gen/FlyteCTL_version.rst @@ -1,6 +1,6 @@ -.. _FlyteCTL_version: +.. _flytectl_version: -FlyteCTL version +flytectl version ---------------- Fetch Flyte version @@ -18,7 +18,7 @@ For FlyteCTL version, it is: :: - FlyteCTL version [flags] + flytectl version [flags] Options ~~~~~~~ @@ -74,5 +74,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`FlyteCTL` - FlyteCTL CLI tool +* :doc:`flytectl` - FlyteCTL CLI tool diff --git a/flytectl/docs/source/launchplan.rst b/flytectl/docs/source/launchplan.rst index 6adab05fb8..f469b98563 100644 --- a/flytectl/docs/source/launchplan.rst +++ b/flytectl/docs/source/launchplan.rst @@ -1,9 +1,12 @@ Launchplan ------ +It specifies the actions to be performed on the resource 'launchplan'. .. toctree:: :maxdepth: 1 :caption: Launchplan - gen/FlyteCTL_get_launchplan - gen/FlyteCTL_update_launchplan \ No newline at end of file + gen/flytectl_get_launchplan + gen/flytectl_update_launchplan + gen/flytectl_get_launchplan + gen/flytectl_update_launchplan diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index df3082ee2a..c61cfbf640 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -1,7 +1,6 @@ Nouns ------ -Flytectl nouns specify the resource on which the action needs to be performed. -Example of resources include project, workflow, task, execution. +FlyteCTL nouns specify the resource on which the action needs to be performed. Example of resources include project, workflow, task, execution. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/plugin-override.rst b/flytectl/docs/source/plugin-override.rst index 26ebd9e28d..6e77ceb748 100644 --- a/flytectl/docs/source/plugin-override.rst +++ b/flytectl/docs/source/plugin-override.rst @@ -1,10 +1,14 @@ Plugin override ------ +It specifies the actions to be performed on the resource 'plugin-override'. .. toctree:: :maxdepth: 1 :caption: Plugin override - gen/FlyteCTL_get_plugin-override - gen/FlyteCTL_update_plugin-override - gen/FlyteCTL_delete_plugin-override \ No newline at end of file + gen/flytectl_get_plugin-override + gen/flytectl_update_plugin-override + gen/flytectl_delete_plugin-override + gen/flytectl_get_plugin-override + gen/flytectl_update_plugin-override + gen/flytectl_delete_plugin-override diff --git a/flytectl/docs/source/project.rst b/flytectl/docs/source/project.rst index c81e4e785f..ed2f4d2b27 100644 --- a/flytectl/docs/source/project.rst +++ b/flytectl/docs/source/project.rst @@ -1,10 +1,15 @@ Project ------ +It specifies the actions to be performed on the resource 'project'. + .. toctree:: :maxdepth: 1 :caption: Project - gen/FlyteCTL_create_project - gen/FlyteCTL_get_project - gen/FlyteCTL_update_project \ No newline at end of file + gen/flytectl_create_project + gen/flytectl_get_project + gen/flytectl_update_project + gen/flytectl_create_project + gen/flytectl_get_project + gen/flytectl_update_project diff --git a/flytectl/docs/source/sandbox.rst b/flytectl/docs/source/sandbox.rst index 8cacd53ac0..a0fb7b21d8 100644 --- a/flytectl/docs/source/sandbox.rst +++ b/flytectl/docs/source/sandbox.rst @@ -1,11 +1,16 @@ Sandbox ------ +It specifies the actions to be performed on the resource 'sandbox'. .. toctree:: :maxdepth: 1 :caption: Sandbox - gen/FlyteCTL_sandbox_start - gen/FlyteCTL_sandbox_status - gen/FlyteCTL_sandbox_teardown - gen/FlyteCTL_sandbox_exec \ No newline at end of file + gen/flytectl_sandbox_start + gen/flytectl_sandbox_status + gen/flytectl_sandbox_teardown + gen/flytectl_sandbox_exec + gen/flytectl_sandbox_start + gen/flytectl_sandbox_status + gen/flytectl_sandbox_teardown + gen/flytectl_sandbox_exec diff --git a/flytectl/docs/source/task-resource-attribute.rst b/flytectl/docs/source/task-resource-attribute.rst index 95dca187cd..ee827b775b 100644 --- a/flytectl/docs/source/task-resource-attribute.rst +++ b/flytectl/docs/source/task-resource-attribute.rst @@ -1,11 +1,15 @@ Task resource attribute ------ +It specifies the actions to be performed on the resource 'task-resource-attribute'. .. toctree:: :maxdepth: 1 :caption: Task resource attribute - gen/FlyteCTL_get_task-resource-attribute - gen/FlyteCTL_update_task-resource-attribute - gen/FlyteCTL_delete_task-resource-attribute + gen/flytectl_get_task-resource-attribute + gen/flytectl_update_task-resource-attribute + gen/flytectl_delete_task-resource-attribute + gen/flytectl_get_task-resource-attribute + gen/flytectl_update_task-resource-attribute + gen/flytectl_delete_task-resource-attribute diff --git a/flytectl/docs/source/task.rst b/flytectl/docs/source/task.rst index 1cf59495c0..2b19b358d5 100644 --- a/flytectl/docs/source/task.rst +++ b/flytectl/docs/source/task.rst @@ -1,8 +1,10 @@ Task ------ +It specifies the actions to be performed on the resource 'task'. .. toctree:: :maxdepth: 1 :caption: Task - gen/FlyteCTL_get_task \ No newline at end of file + gen/flytectl_get_task + gen/flytectl_get_task diff --git a/flytectl/docs/source/verbs.rst b/flytectl/docs/source/verbs.rst index 88d4dcefbb..a286d313e6 100644 --- a/flytectl/docs/source/verbs.rst +++ b/flytectl/docs/source/verbs.rst @@ -1,18 +1,19 @@ Verbs ------ -Flytectl verbs specify the actions to be performed on the resources. Ex: create, get, update, and delete. +FlyteCTL verbs specify the actions to be performed on the resources. Ex: create, get, update, and delete. + .. toctree:: :maxdepth: 1 :caption: Verbs - gen/FlyteCTL_flytectl_create - gen/FlyteCTL_flytectl_completion - gen/FlyteCTL_flytectl_get - gen/FlyteCTL_flytectl_update - gen/FlyteCTL_delete - gen/FlyteCTL_register - gen/FlyteCTL_config - gen/FlyteCTL_sandbox - gen/FlyteCTL_version - gen/FlyteCTL_upgrade + gen/flytectl_create + gen/flytectl_completion + gen/flytectl_get + gen/flytectl_update + gen/flytectl_delete + gen/flytectl_register + gen/flytectl_config + gen/flytectl_sandbox + gen/flytectl_version + gen/flytectl_upgrade diff --git a/flytectl/docs/source/workflow-execution-config.rst b/flytectl/docs/source/workflow-execution-config.rst index 008864872b..bcca57b854 100644 --- a/flytectl/docs/source/workflow-execution-config.rst +++ b/flytectl/docs/source/workflow-execution-config.rst @@ -1,10 +1,15 @@ Workflow execution config ------ +It specifies the actions to be performed on the resource 'workflow-execution-config'. + .. toctree:: :maxdepth: 1 :caption: Workflow execution config - gen/FlyteCTL_get_workflow-execution-config - gen/FlyteCTL_update_workflow-execution-config - gen/FlyteCTL_delete_workflow-execution-config \ No newline at end of file + gen/flytectl_get_workflow-execution-config + gen/flytectl_update_workflow-execution-config + gen/flytectl_delete_workflow-execution-config + gen/flytectl_get_workflow-execution-config + gen/flytectl_update_workflow-execution-config + gen/flytectl_delete_workflow-execution-config diff --git a/flytectl/docs/source/workflow.rst b/flytectl/docs/source/workflow.rst index b37dbad28f..e77bb0f92c 100644 --- a/flytectl/docs/source/workflow.rst +++ b/flytectl/docs/source/workflow.rst @@ -1,8 +1,10 @@ Workflow ------ +It specifies the actions to be performed on the resource 'workflow'. .. toctree:: :maxdepth: 1 :caption: Workflow - gen/FlyteCTL_get_workflow \ No newline at end of file + gen/flytectl_get_workflow + gen/flytectl_get_workflow From 325b1065e01340bd0fd2aaef13416ad955ed7ddd Mon Sep 17 00:00:00 2001 From: SmritiSatyanV <94349093+SmritiSatyanV@users.noreply.github.com> Date: Sat, 11 Dec 2021 17:06:33 +0530 Subject: [PATCH 182/645] The rst file names are in upper case (#237) * Update nouns.rst * removed html links Created separate rst file for each noun and referenced it in the nouns.rst file. * Update verbs.rst * Deleted newly added rst files error with codecov, so deleted the newly added rst files. * Delete verbs.rst * Created separate rst files for every resource * Changes to files in cmd folder * Update create_test.go * cmd folders * Update cmd/create/execution.go Co-authored-by: Samhita Alla * Added verbs.rst * changes to cmd folder files /bin removed, * Update based on review * Update cmd/create/project.go Co-authored-by: Samhita Alla * Update cmd/create/create.go Co-authored-by: Samhita Alla * Update cmd/create/create_test.go Co-authored-by: Samhita Alla * Update cmd/delete/delete.go Co-authored-by: Samhita Alla * Update cmd/delete/matchable_cluster_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/delete/matchable_task_resource_attribute.go Co-authored-by: Samhita Alla * Changes to delete - matchable_plugin_override * Changes to .go files in cmd * Changed flytesnack to Flytesnack * Creates to create * Update cmd/get/launch_plan.go Co-authored-by: Samhita Alla * Changed 'launchplan' to 'launch plan' * Update cmd/register/examples.go Co-authored-by: Samhita Alla * Update cmd/register/examples.go Co-authored-by: Samhita Alla * Update cmd/register/examples.go Co-authored-by: Samhita Alla * Update cmd/register/files.go Co-authored-by: Samhita Alla * Update cmd/register/register.go Co-authored-by: Samhita Alla * Update cmd/register/register_test.go Co-authored-by: Samhita Alla * Update cmd/sandbox/sandbox.go Co-authored-by: Samhita Alla * Update cmd/sandbox/start.go Co-authored-by: Samhita Alla * Update cmd/sandbox/start.go Co-authored-by: Samhita Alla * Update cmd/sandbox/status.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_cluster_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_cluster_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_execution_cluster_label.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_execution_queue_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_plugin_override.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_task_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_workflow_execution_config.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_workflow_execution_config.go Co-authored-by: Samhita Alla * Update cmd/update/update.go Co-authored-by: Samhita Alla * Update cmd/upgrade/upgrade.go Co-authored-by: Samhita Alla * Update cmd/upgrade/upgrade.go Co-authored-by: Samhita Alla * Update cmd/version/version.go Co-authored-by: Samhita Alla * Update cmd/update/matchable_task_resource_attribute.go Co-authored-by: Samhita Alla * Update cmd/update/update.go Co-authored-by: Samhita Alla * Resolved changes * Changed 'delte' to 'delete' * Updated rst files Created rst files for every noun, and linked the associated verbs with it * Trial * Removed the extra whitespace * Changed 'delte' to 'delete' * Changed 'use' in some cmd folders * Description to rst files * Resolved conflicts * Removed extra spaces * deleted flyte-ctl files * restored flytectl files * deleted one file * Resolved conflicts-2 Co-authored-by: Samhita Alla --- flytectl/docs/source/examples.rst | 1 - flytectl/docs/source/gen/{FlyteCTL.rst => flytectl.rst} | 0 .../gen/{FlyteCTL_completion.rst => flytectl_completion.rst} | 0 .../source/gen/{FlyteCTL_config.rst => flytectl_config.rst} | 0 ...teCTL_config_discover.rst => flytectl_config_discover.rst} | 0 .../{FlyteCTL_config_init.rst => flytectl_config_init.rst} | 0 ...teCTL_config_validate.rst => flytectl_config_validate.rst} | 0 .../source/gen/{FlyteCTL_create.rst => flytectl_create.rst} | 0 ...CTL_create_execution.rst => flytectl_create_execution.rst} | 0 ...lyteCTL_create_project.rst => flytectl_create_project.rst} | 0 .../source/gen/{FlyteCTL_delete.rst => flytectl_delete.rst} | 0 ...ute.rst => flytectl_delete_cluster-resource-attribute.rst} | 0 ...-label.rst => flytectl_delete_execution-cluster-label.rst} | 0 ...bute.rst => flytectl_delete_execution-queue-attribute.rst} | 0 ...CTL_delete_execution.rst => flytectl_delete_execution.rst} | 0 ...lugin-override.rst => flytectl_delete_plugin-override.rst} | 0 ...ribute.rst => flytectl_delete_task-resource-attribute.rst} | 0 ...nfig.rst => flytectl_delete_workflow-execution-config.rst} | 0 .../docs/source/gen/{FlyteCTL_get.rst => flytectl_get.rst} | 0 ...ribute.rst => flytectl_get_cluster-resource-attribute.rst} | 0 ...ter-label.rst => flytectl_get_execution-cluster-label.rst} | 0 ...tribute.rst => flytectl_get_execution-queue-attribute.rst} | 0 ...{FlyteCTL_get_execution.rst => flytectl_get_execution.rst} | 0 ...lyteCTL_get_launchplan.rst => flytectl_get_launchplan.rst} | 0 ...t_plugin-override.rst => flytectl_get_plugin-override.rst} | 0 .../{FlyteCTL_get_project.rst => flytectl_get_project.rst} | 0 ...attribute.rst => flytectl_get_task-resource-attribute.rst} | 0 .../gen/{FlyteCTL_get_task.rst => flytectl_get_task.rst} | 0 ...-config.rst => flytectl_get_workflow-execution-config.rst} | 0 .../{FlyteCTL_get_workflow.rst => flytectl_get_workflow.rst} | 0 .../gen/{FlyteCTL_register.rst => flytectl_register.rst} | 0 ...L_register_examples.rst => flytectl_register_examples.rst} | 0 ...lyteCTL_register_files.rst => flytectl_register_files.rst} | 0 .../source/gen/{FlyteCTL_sandbox.rst => flytectl_sandbox.rst} | 0 .../{FlyteCTL_sandbox_exec.rst => flytectl_sandbox_exec.rst} | 0 ...{FlyteCTL_sandbox_start.rst => flytectl_sandbox_start.rst} | 0 ...lyteCTL_sandbox_status.rst => flytectl_sandbox_status.rst} | 0 ...CTL_sandbox_teardown.rst => flytectl_sandbox_teardown.rst} | 0 .../source/gen/{FlyteCTL_update.rst => flytectl_update.rst} | 0 ...ute.rst => flytectl_update_cluster-resource-attribute.rst} | 0 ...-label.rst => flytectl_update_execution-cluster-label.rst} | 0 ...bute.rst => flytectl_update_execution-queue-attribute.rst} | 0 ...aunchplan-meta.rst => flytectl_update_launchplan-meta.rst} | 0 ...L_update_launchplan.rst => flytectl_update_launchplan.rst} | 0 ...lugin-override.rst => flytectl_update_plugin-override.rst} | 0 ...lyteCTL_update_project.rst => flytectl_update_project.rst} | 0 ...CTL_update_task-meta.rst => flytectl_update_task-meta.rst} | 0 ...ribute.rst => flytectl_update_task-resource-attribute.rst} | 0 ...nfig.rst => flytectl_update_workflow-execution-config.rst} | 0 ...te_workflow-meta.rst => flytectl_update_workflow-meta.rst} | 0 .../source/gen/{FlyteCTL_upgrade.rst => flytectl_upgrade.rst} | 0 .../source/gen/{FlyteCTL_version.rst => flytectl_version.rst} | 0 flytectl/docs/source/project.rst | 3 --- flytectl/docs/source/workflow-execution-config.rst | 4 ---- 54 files changed, 8 deletions(-) rename flytectl/docs/source/gen/{FlyteCTL.rst => flytectl.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_completion.rst => flytectl_completion.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_config.rst => flytectl_config.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_config_discover.rst => flytectl_config_discover.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_config_init.rst => flytectl_config_init.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_config_validate.rst => flytectl_config_validate.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_create.rst => flytectl_create.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_create_execution.rst => flytectl_create_execution.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_create_project.rst => flytectl_create_project.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_delete.rst => flytectl_delete.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_delete_cluster-resource-attribute.rst => flytectl_delete_cluster-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_delete_execution-cluster-label.rst => flytectl_delete_execution-cluster-label.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_delete_execution-queue-attribute.rst => flytectl_delete_execution-queue-attribute.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_delete_execution.rst => flytectl_delete_execution.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_delete_plugin-override.rst => flytectl_delete_plugin-override.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_delete_task-resource-attribute.rst => flytectl_delete_task-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_delete_workflow-execution-config.rst => flytectl_delete_workflow-execution-config.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get.rst => flytectl_get.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_cluster-resource-attribute.rst => flytectl_get_cluster-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_execution-cluster-label.rst => flytectl_get_execution-cluster-label.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_execution-queue-attribute.rst => flytectl_get_execution-queue-attribute.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_execution.rst => flytectl_get_execution.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_launchplan.rst => flytectl_get_launchplan.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_plugin-override.rst => flytectl_get_plugin-override.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_project.rst => flytectl_get_project.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_task-resource-attribute.rst => flytectl_get_task-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_task.rst => flytectl_get_task.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_workflow-execution-config.rst => flytectl_get_workflow-execution-config.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_get_workflow.rst => flytectl_get_workflow.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_register.rst => flytectl_register.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_register_examples.rst => flytectl_register_examples.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_register_files.rst => flytectl_register_files.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_sandbox.rst => flytectl_sandbox.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_sandbox_exec.rst => flytectl_sandbox_exec.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_sandbox_start.rst => flytectl_sandbox_start.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_sandbox_status.rst => flytectl_sandbox_status.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_sandbox_teardown.rst => flytectl_sandbox_teardown.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update.rst => flytectl_update.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_cluster-resource-attribute.rst => flytectl_update_cluster-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_execution-cluster-label.rst => flytectl_update_execution-cluster-label.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_execution-queue-attribute.rst => flytectl_update_execution-queue-attribute.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_launchplan-meta.rst => flytectl_update_launchplan-meta.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_launchplan.rst => flytectl_update_launchplan.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_plugin-override.rst => flytectl_update_plugin-override.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_project.rst => flytectl_update_project.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_task-meta.rst => flytectl_update_task-meta.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_task-resource-attribute.rst => flytectl_update_task-resource-attribute.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_workflow-execution-config.rst => flytectl_update_workflow-execution-config.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_update_workflow-meta.rst => flytectl_update_workflow-meta.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_upgrade.rst => flytectl_upgrade.rst} (100%) rename flytectl/docs/source/gen/{FlyteCTL_version.rst => flytectl_version.rst} (100%) diff --git a/flytectl/docs/source/examples.rst b/flytectl/docs/source/examples.rst index da62f2988f..b57b7e5965 100644 --- a/flytectl/docs/source/examples.rst +++ b/flytectl/docs/source/examples.rst @@ -8,4 +8,3 @@ It specifies the actions to be performed on the resource 'examples'. gen/flytectl_register_examples - gen/flytectl_register_examples diff --git a/flytectl/docs/source/gen/FlyteCTL.rst b/flytectl/docs/source/gen/flytectl.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL.rst rename to flytectl/docs/source/gen/flytectl.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_completion.rst rename to flytectl/docs/source/gen/flytectl_completion.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_config.rst b/flytectl/docs/source/gen/flytectl_config.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_config.rst rename to flytectl/docs/source/gen/flytectl_config.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_config_discover.rst rename to flytectl/docs/source/gen/flytectl_config_discover.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_config_init.rst rename to flytectl/docs/source/gen/flytectl_config_init.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_config_validate.rst rename to flytectl/docs/source/gen/flytectl_config_validate.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_create.rst b/flytectl/docs/source/gen/flytectl_create.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_create.rst rename to flytectl/docs/source/gen/flytectl_create.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_create_execution.rst rename to flytectl/docs/source/gen/flytectl_create_execution.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_create_project.rst rename to flytectl/docs/source/gen/flytectl_create_project.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_delete.rst rename to flytectl/docs/source/gen/flytectl_delete.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_delete_cluster-resource-attribute.rst rename to flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_delete_execution-cluster-label.rst rename to flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_delete_execution-queue-attribute.rst rename to flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_delete_execution.rst rename to flytectl/docs/source/gen/flytectl_delete_execution.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_delete_plugin-override.rst rename to flytectl/docs/source/gen/flytectl_delete_plugin-override.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_delete_task-resource-attribute.rst rename to flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_delete_workflow-execution-config.rst rename to flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get.rst b/flytectl/docs/source/gen/flytectl_get.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get.rst rename to flytectl/docs/source/gen/flytectl_get.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_cluster-resource-attribute.rst rename to flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_execution-cluster-label.rst rename to flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_execution-queue-attribute.rst rename to flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_execution.rst rename to flytectl/docs/source/gen/flytectl_get_execution.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_launchplan.rst rename to flytectl/docs/source/gen/flytectl_get_launchplan.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_plugin-override.rst rename to flytectl/docs/source/gen/flytectl_get_plugin-override.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_project.rst rename to flytectl/docs/source/gen/flytectl_get_project.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_task-resource-attribute.rst rename to flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_task.rst rename to flytectl/docs/source/gen/flytectl_get_task.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_workflow-execution-config.rst rename to flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_get_workflow.rst rename to flytectl/docs/source/gen/flytectl_get_workflow.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_register.rst b/flytectl/docs/source/gen/flytectl_register.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_register.rst rename to flytectl/docs/source/gen/flytectl_register.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_register_examples.rst rename to flytectl/docs/source/gen/flytectl_register_examples.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_register_files.rst rename to flytectl/docs/source/gen/flytectl_register_files.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_sandbox.rst rename to flytectl/docs/source/gen/flytectl_sandbox.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_sandbox_exec.rst rename to flytectl/docs/source/gen/flytectl_sandbox_exec.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_sandbox_start.rst rename to flytectl/docs/source/gen/flytectl_sandbox_start.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_sandbox_status.rst rename to flytectl/docs/source/gen/flytectl_sandbox_status.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_sandbox_teardown.rst rename to flytectl/docs/source/gen/flytectl_sandbox_teardown.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update.rst b/flytectl/docs/source/gen/flytectl_update.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update.rst rename to flytectl/docs/source/gen/flytectl_update.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_cluster-resource-attribute.rst rename to flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_execution-cluster-label.rst rename to flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_execution-queue-attribute.rst rename to flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_launchplan-meta.rst rename to flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_launchplan.rst rename to flytectl/docs/source/gen/flytectl_update_launchplan.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_plugin-override.rst rename to flytectl/docs/source/gen/flytectl_update_plugin-override.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_project.rst rename to flytectl/docs/source/gen/flytectl_update_project.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_task-meta.rst rename to flytectl/docs/source/gen/flytectl_update_task-meta.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_task-resource-attribute.rst rename to flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_workflow-execution-config.rst rename to flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_update_workflow-meta.rst rename to flytectl/docs/source/gen/flytectl_update_workflow-meta.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_upgrade.rst rename to flytectl/docs/source/gen/flytectl_upgrade.rst diff --git a/flytectl/docs/source/gen/FlyteCTL_version.rst b/flytectl/docs/source/gen/flytectl_version.rst similarity index 100% rename from flytectl/docs/source/gen/FlyteCTL_version.rst rename to flytectl/docs/source/gen/flytectl_version.rst diff --git a/flytectl/docs/source/project.rst b/flytectl/docs/source/project.rst index ed2f4d2b27..b98d7909c2 100644 --- a/flytectl/docs/source/project.rst +++ b/flytectl/docs/source/project.rst @@ -10,6 +10,3 @@ It specifies the actions to be performed on the resource 'project'. gen/flytectl_create_project gen/flytectl_get_project gen/flytectl_update_project - gen/flytectl_create_project - gen/flytectl_get_project - gen/flytectl_update_project diff --git a/flytectl/docs/source/workflow-execution-config.rst b/flytectl/docs/source/workflow-execution-config.rst index bcca57b854..0ae96cbb87 100644 --- a/flytectl/docs/source/workflow-execution-config.rst +++ b/flytectl/docs/source/workflow-execution-config.rst @@ -2,7 +2,6 @@ Workflow execution config ------ It specifies the actions to be performed on the resource 'workflow-execution-config'. - .. toctree:: :maxdepth: 1 :caption: Workflow execution config @@ -10,6 +9,3 @@ It specifies the actions to be performed on the resource 'workflow-execution-con gen/flytectl_get_workflow-execution-config gen/flytectl_update_workflow-execution-config gen/flytectl_delete_workflow-execution-config - gen/flytectl_get_workflow-execution-config - gen/flytectl_update_workflow-execution-config - gen/flytectl_delete_workflow-execution-config From 2766c18b2abe4f91ca5d7fa618f3f0656375c74d Mon Sep 17 00:00:00 2001 From: Nishant Mittal Date: Sat, 11 Dec 2021 18:22:26 +0530 Subject: [PATCH 183/645] #minor feat: pagination support for get commands (#234) * feat: pagination support for get commands Signed-off-by: Nishant Mittal --- .../subcommand/execution/config_flags.go | 1 + .../subcommand/execution/config_flags_test.go | 14 ++++++++++++++ .../subcommand/launchplan/config_flags.go | 1 + .../launchplan/config_flags_test.go | 14 ++++++++++++++ .../config/subcommand/project/config_flags.go | 1 + .../subcommand/project/config_flags_test.go | 14 ++++++++++++++ .../config/subcommand/task/config_flags.go | 1 + .../subcommand/task/config_flags_test.go | 14 ++++++++++++++ .../subcommand/workflow/config_flags.go | 1 + .../subcommand/workflow/config_flags_test.go | 14 ++++++++++++++ flytectl/cmd/get/execution.go | 14 +++++++++----- flytectl/cmd/get/launch_plan.go | 18 +++++++++++------- flytectl/cmd/get/project.go | 11 ++++++++--- flytectl/cmd/get/task.go | 19 ++++++++++++------- flytectl/cmd/get/workflow.go | 15 ++++++++++----- flytectl/pkg/filters/type.go | 7 ++++--- flytectl/pkg/filters/util.go | 12 ++++++++++++ flytectl/pkg/filters/util_test.go | 3 +++ 18 files changed, 144 insertions(+), 30 deletions(-) diff --git a/flytectl/cmd/config/subcommand/execution/config_flags.go b/flytectl/cmd/config/subcommand/execution/config_flags.go index 7f07f23bf7..9f47f721f9 100755 --- a/flytectl/cmd/config/subcommand/execution/config_flags.go +++ b/flytectl/cmd/config/subcommand/execution/config_flags.go @@ -54,6 +54,7 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sortBy"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") + cmdFlags.Int32Var(&DefaultConfig.Filter.Page, fmt.Sprintf("%v%v", prefix, "filter.page"), DefaultConfig.Filter.Page, "Specifies the page number, in case there are multiple pages of results") cmdFlags.BoolVar(&DefaultConfig.Details, fmt.Sprintf("%v%v", prefix, "details"), DefaultConfig.Details, "gets node execution details. Only applicable for single execution name i.e get execution name --details") cmdFlags.StringVar(&DefaultConfig.NodeID, fmt.Sprintf("%v%v", prefix, "nodeID"), DefaultConfig.NodeID, "get task executions for given node name.") return cmdFlags diff --git a/flytectl/cmd/config/subcommand/execution/config_flags_test.go b/flytectl/cmd/config/subcommand/execution/config_flags_test.go index 57fc69dd42..ea72babe75 100755 --- a/flytectl/cmd/config/subcommand/execution/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/execution/config_flags_test.go @@ -155,6 +155,20 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_filter.page", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.page", testValue) + if vInt32, err := cmdFlags.GetInt32("filter.page"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt32), &actual.Filter.Page) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_details", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/config/subcommand/launchplan/config_flags.go b/flytectl/cmd/config/subcommand/launchplan/config_flags.go index e41777eebc..3348bff7ee 100755 --- a/flytectl/cmd/config/subcommand/launchplan/config_flags.go +++ b/flytectl/cmd/config/subcommand/launchplan/config_flags.go @@ -57,5 +57,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sortBy"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") + cmdFlags.Int32Var(&DefaultConfig.Filter.Page, fmt.Sprintf("%v%v", prefix, "filter.page"), DefaultConfig.Filter.Page, "Specifies the page number, in case there are multiple pages of results") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go b/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go index d2ccb2715d..afcd0597dd 100755 --- a/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go @@ -197,4 +197,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_filter.page", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.page", testValue) + if vInt32, err := cmdFlags.GetInt32("filter.page"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt32), &actual.Filter.Page) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/project/config_flags.go b/flytectl/cmd/config/subcommand/project/config_flags.go index ca18dca630..ec92b98635 100755 --- a/flytectl/cmd/config/subcommand/project/config_flags.go +++ b/flytectl/cmd/config/subcommand/project/config_flags.go @@ -54,5 +54,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sortBy"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") + cmdFlags.Int32Var(&DefaultConfig.Filter.Page, fmt.Sprintf("%v%v", prefix, "filter.page"), DefaultConfig.Filter.Page, "Specifies the page number, in case there are multiple pages of results") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/project/config_flags_test.go b/flytectl/cmd/config/subcommand/project/config_flags_test.go index 52668bcf14..78bd4ca726 100755 --- a/flytectl/cmd/config/subcommand/project/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/project/config_flags_test.go @@ -155,4 +155,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_filter.page", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.page", testValue) + if vInt32, err := cmdFlags.GetInt32("filter.page"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt32), &actual.Filter.Page) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/task/config_flags.go b/flytectl/cmd/config/subcommand/task/config_flags.go index 3138439017..ee181f076f 100755 --- a/flytectl/cmd/config/subcommand/task/config_flags.go +++ b/flytectl/cmd/config/subcommand/task/config_flags.go @@ -57,5 +57,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sortBy"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") + cmdFlags.Int32Var(&DefaultConfig.Filter.Page, fmt.Sprintf("%v%v", prefix, "filter.page"), DefaultConfig.Filter.Page, "Specifies the page number, in case there are multiple pages of results") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/task/config_flags_test.go b/flytectl/cmd/config/subcommand/task/config_flags_test.go index 844d031a5a..52651e144c 100755 --- a/flytectl/cmd/config/subcommand/task/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/task/config_flags_test.go @@ -197,4 +197,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_filter.page", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.page", testValue) + if vInt32, err := cmdFlags.GetInt32("filter.page"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt32), &actual.Filter.Page) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/workflow/config_flags.go b/flytectl/cmd/config/subcommand/workflow/config_flags.go index 29bc7fca54..f0f1064aff 100755 --- a/flytectl/cmd/config/subcommand/workflow/config_flags.go +++ b/flytectl/cmd/config/subcommand/workflow/config_flags.go @@ -56,5 +56,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.Filter.SortBy, fmt.Sprintf("%v%v", prefix, "filter.sortBy"), DefaultConfig.Filter.SortBy, "Specifies which field to sort results ") cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") + cmdFlags.Int32Var(&DefaultConfig.Filter.Page, fmt.Sprintf("%v%v", prefix, "filter.page"), DefaultConfig.Filter.Page, "Specifies the page number, in case there are multiple pages of results") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/workflow/config_flags_test.go b/flytectl/cmd/config/subcommand/workflow/config_flags_test.go index 4011d8e4f3..46d13aeb87 100755 --- a/flytectl/cmd/config/subcommand/workflow/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/workflow/config_flags_test.go @@ -183,4 +183,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_filter.page", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("filter.page", testValue) + if vInt32, err := cmdFlags.GetInt32("filter.page"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt32), &actual.Filter.Page) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 3dcf3f34ae..9f8f6a66d7 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -30,15 +30,19 @@ Retrieve executions by name within the project and domain: Retrieve all the executions with filters: :: - - flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" - + flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" + + Retrieve executions as per the specified limit and sorting parameters: :: - + flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc - + +Retrieves all the executions on other pages. +:: + + flytectl get -p flytesnacks -d development execution --filter.limit=10 --filter.page=2 Retrieve executions within the project and domain in YAML format: diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 531504d41c..d228ed3459 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -42,20 +42,24 @@ Retrieve a particular version of the launch plan by name within the project and Retrieve all the launch plans with filters: :: - + flytectl get launchplan -p flytesnacks -d development --filter.fieldSelector="name=core.basic.lp.go_greet" - + Retrieve launch plans entity search across all versions with filters: :: - + flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="version=v1" - - + + Retrieve all the launch plans with limit and sorting: :: - + flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc - + +Retrieves all the launch plans on other pages. +:: + + flytectl get -p flytesnacks -d development launchplan --filter.limit=10 --filter.page=2 Retrieve all launch plans within the project and domain in YAML format: diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 4912d4b5fc..2718a54a9c 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -30,14 +30,19 @@ Retrieve project by name: Retrieve all the projects with filters: :: - + flytectl get project --filter.fieldSelector="project.name=flytesnacks" - + Retrieve all the projects with limit and sorting: :: - + flytectl get project --filter.sortBy=created_at --filter.limit=1 --filter.asc +Retrieves all the projects on other pages. +:: + + flytectl get project --filter.limit=10 --filter.page=2 + Retrieve all the projects in yaml format: :: diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index c1f103dea4..43eec8b1a3 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -41,19 +41,24 @@ Retrieve particular version of task by name within project and domain: Retrieve all the tasks with filters: :: - - flytectl get task -p flytesnacks -d development --filter.fieldSelector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" - + + flytectl get task -p flytesnacks -d development --filter.fieldSelector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" + Retrieve a specific task with filters: :: - - flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.fieldSelector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" - + + flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.fieldSelector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" + Retrieve all the tasks with limit and sorting: :: - + flytectl get -p flytesnacks -d development task --filter.sortBy=created_at --filter.limit=1 --filter.asc +Retrieves all the task on other pages. +:: + + flytectl get -p flytesnacks -d development task --filter.limit=10 --filter.page=2 + Retrieve all the tasks within project and domain in yaml format: :: diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 0b80e652e3..5d3c7364b9 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -43,19 +43,24 @@ Retrieve particular version of workflow by name within project and domain: Retrieve all the workflows with filters: :: - + flytectl get workflow -p flytesnacks -d development --filter.fieldSelector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" - + Retrieve specific workflow with filters: :: - + flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="workflow.version=v1" - + Retrieve all the workflows with limit and sorting: :: - + flytectl get -p flytesnacks -d development workflow --filter.sortBy=created_at --filter.limit=1 --filter.asc +Retrieves all the workflows on other pages. +:: + + flytectl get -p flytesnacks -d development workflow --filter.limit=10 --filter.page 2 + Retrieve all the workflows within project and domain in yaml format: :: diff --git a/flytectl/pkg/filters/type.go b/flytectl/pkg/filters/type.go index 6dabc0904d..1a46a4fa2c 100644 --- a/flytectl/pkg/filters/type.go +++ b/flytectl/pkg/filters/type.go @@ -4,6 +4,7 @@ var ( DefaultLimit int32 = 100 DefaultFilter = Filters{ Limit: DefaultLimit, + Page: 1, SortBy: "created_at", Asc: false, } @@ -12,7 +13,7 @@ var ( type Filters struct { FieldSelector string `json:"fieldSelector" pflag:",Specifies the Field selector"` SortBy string `json:"sortBy" pflag:",Specifies which field to sort results "` - // TODO: Support paginated queries - Limit int32 `json:"limit" pflag:",Specifies the limit"` - Asc bool `json:"asc" pflag:",Specifies the sorting order. By default flytectl sort result in descending order"` + Limit int32 `json:"limit" pflag:",Specifies the limit"` + Asc bool `json:"asc" pflag:",Specifies the sorting order. By default flytectl sort result in descending order"` + Page int32 `json:"page" pflag:",Specifies the page number, in case there are multiple pages of results"` } diff --git a/flytectl/pkg/filters/util.go b/flytectl/pkg/filters/util.go index 2c2515326a..6d2501e4d5 100644 --- a/flytectl/pkg/filters/util.go +++ b/flytectl/pkg/filters/util.go @@ -1,6 +1,8 @@ package filters import ( + "strconv" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) @@ -11,6 +13,7 @@ func BuildResourceListRequestWithName(c Filters, project, domain, name string) ( } request := &admin.ResourceListRequest{ Limit: uint32(c.Limit), + Token: getToken(c), Filters: fieldSelector, Id: &admin.NamedEntityIdentifier{ Project: project, @@ -33,6 +36,7 @@ func BuildProjectListRequest(c Filters) (*admin.ProjectListRequest, error) { } request := &admin.ProjectListRequest{ Limit: uint32(c.Limit), + Token: getToken(c), Filters: fieldSelector, SortBy: buildSortingRequest(c), } @@ -52,3 +56,11 @@ func buildSortingRequest(c Filters) *admin.Sort { } return nil } + +func getToken(c Filters) string { + token := int(c.Page-1) * int(c.Limit) + if token <= 0 { + return "" + } + return strconv.Itoa(token) +} diff --git a/flytectl/pkg/filters/util_test.go b/flytectl/pkg/filters/util_test.go index 6edcc79786..98cb98985c 100644 --- a/flytectl/pkg/filters/util_test.go +++ b/flytectl/pkg/filters/util_test.go @@ -47,11 +47,13 @@ func TestProjectListRequestFunc(t *testing.T) { config.GetConfig().Domain = domain filter := Filters{ Limit: 100, + Page: 2, SortBy: "created_at", } request, err := BuildProjectListRequest(filter) expectedResponse := &admin.ProjectListRequest{ Limit: 100, + Token: "100", Filters: "", SortBy: &admin.Sort{ Key: "created_at", @@ -80,6 +82,7 @@ func TestListRequestWithNameFunc(t *testing.T) { filter := Filters{ Limit: 100, SortBy: "created_at", + Page: 1, } request, err := BuildResourceListRequestWithName(filter, project, domain, name) expectedResponse := &admin.ResourceListRequest{ From cb3193a78fe45c84db415141f6953e63eec29177 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Sun, 12 Dec 2021 23:49:21 -0800 Subject: [PATCH 184/645] Update documentation (#239) * Update documentation Signed-off-by: Flyte-Bot * update Signed-off-by: Samhita Alla * make gendocs Signed-off-by: Samhita Alla Co-authored-by: evalsocket Co-authored-by: Samhita Alla --- flytectl/cmd/get/execution.go | 3 ++- flytectl/cmd/get/launch_plan.go | 2 +- flytectl/cmd/get/project.go | 2 +- flytectl/cmd/get/task.go | 2 +- flytectl/cmd/get/workflow.go | 2 +- .../source/gen/flytectl_get_execution.rst | 16 ++++++++++----- .../source/gen/flytectl_get_launchplan.rst | 19 +++++++++++------- .../docs/source/gen/flytectl_get_project.rst | 12 ++++++++--- .../docs/source/gen/flytectl_get_task.rst | 20 ++++++++++++------- .../docs/source/gen/flytectl_get_workflow.rst | 16 ++++++++++----- 10 files changed, 62 insertions(+), 32 deletions(-) diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 9f8f6a66d7..3c53b714b2 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -39,7 +39,8 @@ Retrieve executions as per the specified limit and sorting parameters: flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the executions on other pages. +Retrieve executions present in other pages by specifying the limit and page number: + :: flytectl get -p flytesnacks -d development execution --filter.limit=10 --filter.page=2 diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index d228ed3459..1700f4c04e 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -56,7 +56,7 @@ Retrieve all the launch plans with limit and sorting: flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the launch plans on other pages. +Retrieve launch plans present in other pages by specifying the limit and page number: :: flytectl get -p flytesnacks -d development launchplan --filter.limit=10 --filter.page=2 diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 2718a54a9c..8855b020b2 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -38,7 +38,7 @@ Retrieve all the projects with limit and sorting: flytectl get project --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the projects on other pages. +Retrieve projects present in other pages by specifying the limit and page number: :: flytectl get project --filter.limit=10 --filter.page=2 diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 43eec8b1a3..dfb03c337c 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -54,7 +54,7 @@ Retrieve all the tasks with limit and sorting: flytectl get -p flytesnacks -d development task --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the task on other pages. +Retrieve tasks present in other pages by specifying the limit and page number: :: flytectl get -p flytesnacks -d development task --filter.limit=10 --filter.page=2 diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 5d3c7364b9..1a51974b75 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -56,7 +56,7 @@ Retrieve all the workflows with limit and sorting: flytectl get -p flytesnacks -d development workflow --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieves all the workflows on other pages. +Retrieve workflows present in other pages by specifying the limit and page number: :: flytectl get -p flytesnacks -d development workflow --filter.limit=10 --filter.page 2 diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index a727191707..0d6a903604 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -23,15 +23,20 @@ Retrieve executions by name within the project and domain: Retrieve all the executions with filters: :: - - flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" - + flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" + + Retrieve executions as per the specified limit and sorting parameters: :: - + flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc - + +Retrieve executions present in other pages by specifying the limit and page number: + +:: + + flytectl get -p flytesnacks -d development execution --filter.limit=10 --filter.page=2 Retrieve executions within the project and domain in YAML format: @@ -86,6 +91,7 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.fieldSelector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) + --filter.page int32 Specifies the page number, in case there are multiple pages of results (default 1) --filter.sortBy string Specifies which field to sort results (default "created_at") -h, --help help for execution --nodeID string get task executions for given node name. diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index a8708be99a..2876f26774 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -36,20 +36,24 @@ Retrieve a particular version of the launch plan by name within the project and Retrieve all the launch plans with filters: :: - + flytectl get launchplan -p flytesnacks -d development --filter.fieldSelector="name=core.basic.lp.go_greet" - + Retrieve launch plans entity search across all versions with filters: :: - + flytectl get launchplan -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="version=v1" - - + + Retrieve all the launch plans with limit and sorting: :: - + flytectl get launchplan -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc - + +Retrieve launch plans present in other pages by specifying the limit and page number: +:: + + flytectl get -p flytesnacks -d development launchplan --filter.limit=10 --filter.page=2 Retrieve all launch plans within the project and domain in YAML format: @@ -103,6 +107,7 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.fieldSelector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) + --filter.page int32 Specifies the page number, in case there are multiple pages of results (default 1) --filter.sortBy string Specifies which field to sort results (default "created_at") -h, --help help for launchplan --latest flag to indicate to fetch the latest version, version flag will be ignored in this case diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index cd967a7ee6..c68aa1b6d4 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -23,14 +23,19 @@ Retrieve project by name: Retrieve all the projects with filters: :: - + flytectl get project --filter.fieldSelector="project.name=flytesnacks" - + Retrieve all the projects with limit and sorting: :: - + flytectl get project --filter.sortBy=created_at --filter.limit=1 --filter.asc +Retrieve projects present in other pages by specifying the limit and page number: +:: + + flytectl get project --filter.limit=10 --filter.page=2 + Retrieve all the projects in yaml format: :: @@ -58,6 +63,7 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.fieldSelector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) + --filter.page int32 Specifies the page number, in case there are multiple pages of results (default 1) --filter.sortBy string Specifies which field to sort results (default "created_at") -h, --help help for project diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 2848c36a2a..0b7d3d461f 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -35,19 +35,24 @@ Retrieve particular version of task by name within project and domain: Retrieve all the tasks with filters: :: - - flytectl get task -p flytesnacks -d development --filter.fieldSelector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" - + + flytectl get task -p flytesnacks -d development --filter.fieldSelector="task.name=k8s_spark.pyspark_pi.print_every_time,task.version=v1" + Retrieve a specific task with filters: :: - - flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.fieldSelector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" - + + flytectl get task -p flytesnacks -d development k8s_spark.pyspark_pi.print_every_time --filter.fieldSelector="task.version=v1,created_at>=2021-05-24T21:43:12.325335Z" + Retrieve all the tasks with limit and sorting: :: - + flytectl get -p flytesnacks -d development task --filter.sortBy=created_at --filter.limit=1 --filter.asc +Retrieve tasks present in other pages by specifying the limit and page number: +:: + + flytectl get -p flytesnacks -d development task --filter.limit=10 --filter.page=2 + Retrieve all the tasks within project and domain in yaml format: :: @@ -99,6 +104,7 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.fieldSelector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) + --filter.page int32 Specifies the page number, in case there are multiple pages of results (default 1) --filter.sortBy string Specifies which field to sort results (default "created_at") -h, --help help for task --latest flag to indicate to fetch the latest version, version flag will be ignored in this case diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 4cb6dd7e71..d89e372bb1 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -35,19 +35,24 @@ Retrieve particular version of workflow by name within project and domain: Retrieve all the workflows with filters: :: - + flytectl get workflow -p flytesnacks -d development --filter.fieldSelector="workflow.name=k8s_spark.dataframe_passing.my_smart_schema" - + Retrieve specific workflow with filters: :: - + flytectl get workflow -p flytesnacks -d development k8s_spark.dataframe_passing.my_smart_schema --filter.fieldSelector="workflow.version=v1" - + Retrieve all the workflows with limit and sorting: :: - + flytectl get -p flytesnacks -d development workflow --filter.sortBy=created_at --filter.limit=1 --filter.asc +Retrieve workflows present in other pages by specifying the limit and page number: +:: + + flytectl get -p flytesnacks -d development workflow --filter.limit=10 --filter.page 2 + Retrieve all the workflows within project and domain in yaml format: :: @@ -87,6 +92,7 @@ Options --filter.asc Specifies the sorting order. By default flytectl sort result in descending order --filter.fieldSelector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) + --filter.page int32 Specifies the page number, in case there are multiple pages of results (default 1) --filter.sortBy string Specifies which field to sort results (default "created_at") -h, --help help for workflow --latest flag to indicate to fetch the latest version, version flag will be ignored in this case From da9d46764143063c12d7a7869b9b8495e869c757 Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Sat, 18 Dec 2021 09:06:43 +0000 Subject: [PATCH 185/645] fix: doc-requirements.txt to reduce vulnerabilities (#240) The following vulnerabilities are fixed by pinning transitive dependencies: - https://snyk.io/vuln/SNYK-PYTHON-LXML-2316995 Signed-off-by: Yuvraj --- flytectl/doc-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index e3c954b328..36f0a08186 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -31,7 +31,7 @@ imagesize==1.2.0 # via sphinx jinja2==3.0.1 # via sphinx -lxml==4.6.3 +lxml==4.6.5 # via sphinx-material markupsafe==2.0.1 # via jinja2 From 2d93fcfabafdf0a569e48f6c91df514e26464e5e Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Tue, 21 Dec 2021 21:14:02 +0800 Subject: [PATCH 186/645] Update sandbox default config in the docs (#243) Signed-off-by: Kevin Su --- flytectl/docs/source/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 4ea8589032..47dcb78db1 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -1,7 +1,7 @@ .. flytectl doc ###################### -``Flytectl`` Reference +Flytectl Reference ###################### Overview @@ -59,7 +59,7 @@ Flytectl configuration admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: dns:///localhost:30081 - insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + insecure: true # Set to false to enable TLS/SSL connection (not recommended except on local sandbox deployment) authType: Pkce # authType: Pkce # if using authentication or just drop this. storage: connection: From 51226d564b39b0bb366c4f71586c1071526f9e7b Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Wed, 22 Dec 2021 21:11:46 +0530 Subject: [PATCH 187/645] Fixed the version bug and also added force flag (#246) Signed-off-by: Prafulla Mahindrakar --- .../subcommand/register/files_config.go | 3 +- .../subcommand/register/filesconfig_flags.go | 3 +- .../register/filesconfig_flags_test.go | 14 +++++++ flytectl/cmd/register/register_util.go | 41 ++++++++++--------- flytectl/cmd/register/register_util_test.go | 4 +- 5 files changed, 41 insertions(+), 24 deletions(-) diff --git a/flytectl/cmd/config/subcommand/register/files_config.go b/flytectl/cmd/config/subcommand/register/files_config.go index 9c17c958c8..0db9aa6102 100644 --- a/flytectl/cmd/config/subcommand/register/files_config.go +++ b/flytectl/cmd/config/subcommand/register/files_config.go @@ -11,7 +11,8 @@ var ( // FilesConfig containing flags used for registration type FilesConfig struct { - Version string `json:"version" pflag:",version of the entity to be registered with flyte."` + Version string `json:"version" pflag:",version of the entity to be registered with flyte which are un-versioned after serialization."` + Force bool `json:"force" pflag:",force use of version number on entities registered with flyte."` ContinueOnError bool `json:"continueOnError" pflag:",continue on error when registering files."` Archive bool `json:"archive" pflag:",pass in archive file either an http link or local path."` AssumableIamRole string `json:"assumableIamRole" pflag:", custom assumable iam auth role to register launch plans with."` diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go index 5727138104..7e196e89d5 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go @@ -50,7 +50,8 @@ func (FilesConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("FilesConfig", pflag.ExitOnError) - cmdFlags.StringVar(&DefaultFilesConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultFilesConfig.Version, "version of the entity to be registered with flyte.") + cmdFlags.StringVar(&DefaultFilesConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultFilesConfig.Version, "version of the entity to be registered with flyte which are un-versioned after serialization.") + cmdFlags.BoolVar(&DefaultFilesConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultFilesConfig.Force, "force use of version number on entities registered with flyte.") cmdFlags.BoolVar(&DefaultFilesConfig.ContinueOnError, fmt.Sprintf("%v%v", prefix, "continueOnError"), DefaultFilesConfig.ContinueOnError, "continue on error when registering files.") cmdFlags.BoolVar(&DefaultFilesConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), DefaultFilesConfig.Archive, "pass in archive file either an http link or local path.") cmdFlags.StringVar(&DefaultFilesConfig.AssumableIamRole, fmt.Sprintf("%v%v", prefix, "assumableIamRole"), DefaultFilesConfig.AssumableIamRole, " custom assumable iam auth role to register launch plans with.") diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go index 6f46245d9f..024bb0783b 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go @@ -113,6 +113,20 @@ func TestFilesConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_continueOnError", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 2e8d3cf6e8..de2ce65de5 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -97,7 +97,7 @@ func unMarshalContents(ctx context.Context, fileContents []byte, fname string) ( } -func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.CommandContext, dryRun bool, version string) error { +func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.CommandContext, dryRun bool) error { switch v := message.(type) { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) @@ -112,7 +112,7 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: launchPlan.Id.Name, - Version: version, + Version: launchPlan.Id.Version, }, Spec: launchPlan.Spec, }) @@ -130,7 +130,7 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: workflowSpec.Template.Id.Name, - Version: version, + Version: workflowSpec.Template.Id.Version, }, Spec: workflowSpec, }) @@ -148,7 +148,7 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: taskSpec.Template.Id.Name, - Version: version, + Version: taskSpec.Template.Id.Version, }, Spec: taskSpec, }) @@ -158,33 +158,33 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command } } -func hydrateNode(node *core.Node, version string) error { +func hydrateNode(node *core.Node, version string, force bool) error { targetNode := node.Target switch v := targetNode.(type) { case *core.Node_TaskNode: taskNodeWrapper := targetNode.(*core.Node_TaskNode) taskNodeReference := taskNodeWrapper.TaskNode.Reference.(*core.TaskNode_ReferenceId) - hydrateIdentifier(taskNodeReference.ReferenceId, version) + hydrateIdentifier(taskNodeReference.ReferenceId, version, force) case *core.Node_WorkflowNode: workflowNodeWrapper := targetNode.(*core.Node_WorkflowNode) switch workflowNodeWrapper.WorkflowNode.Reference.(type) { case *core.WorkflowNode_SubWorkflowRef: subWorkflowNodeReference := workflowNodeWrapper.WorkflowNode.Reference.(*core.WorkflowNode_SubWorkflowRef) - hydrateIdentifier(subWorkflowNodeReference.SubWorkflowRef, version) + hydrateIdentifier(subWorkflowNodeReference.SubWorkflowRef, version, force) case *core.WorkflowNode_LaunchplanRef: launchPlanNodeReference := workflowNodeWrapper.WorkflowNode.Reference.(*core.WorkflowNode_LaunchplanRef) - hydrateIdentifier(launchPlanNodeReference.LaunchplanRef, version) + hydrateIdentifier(launchPlanNodeReference.LaunchplanRef, version, force) default: return fmt.Errorf("unknown type %T", workflowNodeWrapper.WorkflowNode.Reference) } case *core.Node_BranchNode: branchNodeWrapper := targetNode.(*core.Node_BranchNode) - if err := hydrateNode(branchNodeWrapper.BranchNode.IfElse.Case.ThenNode, version); err != nil { + if err := hydrateNode(branchNodeWrapper.BranchNode.IfElse.Case.ThenNode, version, force); err != nil { return fmt.Errorf("failed to hydrateNode") } if len(branchNodeWrapper.BranchNode.IfElse.Other) > 0 { for _, ifBlock := range branchNodeWrapper.BranchNode.IfElse.Other { - if err := hydrateNode(ifBlock.ThenNode, version); err != nil { + if err := hydrateNode(ifBlock.ThenNode, version, force); err != nil { return fmt.Errorf("failed to hydrateNode") } } @@ -192,7 +192,7 @@ func hydrateNode(node *core.Node, version string) error { switch branchNodeWrapper.BranchNode.IfElse.Default.(type) { case *core.IfElseBlock_ElseNode: elseNodeReference := branchNodeWrapper.BranchNode.IfElse.Default.(*core.IfElseBlock_ElseNode) - if err := hydrateNode(elseNodeReference.ElseNode, version); err != nil { + if err := hydrateNode(elseNodeReference.ElseNode, version, force); err != nil { return fmt.Errorf("failed to hydrateNode") } @@ -207,14 +207,14 @@ func hydrateNode(node *core.Node, version string) error { return nil } -func hydrateIdentifier(identifier *core.Identifier, version string) { +func hydrateIdentifier(identifier *core.Identifier, version string, force bool) { if identifier.Project == "" || identifier.Project == registrationProjectPattern { identifier.Project = config.GetConfig().Project } if identifier.Domain == "" || identifier.Domain == registrationDomainPattern { identifier.Domain = config.GetConfig().Domain } - if identifier.Version == "" || identifier.Version == registrationVersionPattern { + if force || identifier.Version == "" || identifier.Version == registrationVersionPattern { identifier.Version = version } } @@ -315,29 +315,30 @@ func hydrateSpec(message proto.Message, sourceCode string, config rconfig.FilesC switch v := message.(type) { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) - hydrateIdentifier(launchPlan.Spec.WorkflowId, config.Version) + hydrateIdentifier(launchPlan.Id, config.Version, config.Force) + hydrateIdentifier(launchPlan.Spec.WorkflowId, config.Version, config.Force) if err := hydrateLaunchPlanSpec(config.AssumableIamRole, config.K8sServiceAccount, config.OutputLocationPrefix, launchPlan.Spec); err != nil { return err } case *admin.WorkflowSpec: workflowSpec := message.(*admin.WorkflowSpec) for _, Noderef := range workflowSpec.Template.Nodes { - if err := hydrateNode(Noderef, config.Version); err != nil { + if err := hydrateNode(Noderef, config.Version, config.Force); err != nil { return err } } - hydrateIdentifier(workflowSpec.Template.Id, config.Version) + hydrateIdentifier(workflowSpec.Template.Id, config.Version, config.Force) for _, subWorkflow := range workflowSpec.SubWorkflows { for _, Noderef := range subWorkflow.Nodes { - if err := hydrateNode(Noderef, config.Version); err != nil { + if err := hydrateNode(Noderef, config.Version, config.Force); err != nil { return err } } - hydrateIdentifier(subWorkflow.Id, config.Version) + hydrateIdentifier(subWorkflow.Id, config.Version, config.Force) } case *admin.TaskSpec: taskSpec := message.(*admin.TaskSpec) - hydrateIdentifier(taskSpec.Template.Id, config.Version) + hydrateIdentifier(taskSpec.Template.Id, config.Version, config.Force) // In case of fast serialize input proto also have on additional variable to substitute i.e destination bucket for source code if err := hydrateTaskSpec(taskSpec, sourceCode, config.SourceUploadPath, config.Version); err != nil { return err @@ -465,7 +466,7 @@ func registerFile(ctx context.Context, fileName, sourceCode string, registerResu logger.Debugf(ctx, "Hydrated spec : %v", getJSONSpec(spec)) - if err := register(ctx, spec, cmdCtx, config.DryRun, config.Version); err != nil { + if err := register(ctx, spec, cmdCtx, config.DryRun); err != nil { // If error is AlreadyExists then dont consider this to be an error but just a warning state if grpcError := status.Code(err); grpcError == codes.AlreadyExists { registerResult = Result{Name: fileName, Status: "Success", Info: fmt.Sprintf("%v", grpcError.String())} diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index fcbff5a802..eb53ab32f7 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -478,7 +478,7 @@ func TestRegister(t *testing.T) { setup() registerFilesSetup() node := &admin.NodeExecution{} - err := register(ctx, node, cmdCtx, rconfig.DefaultFilesConfig.DryRun, rconfig.DefaultFilesConfig.Version) + err := register(ctx, node, cmdCtx, rconfig.DefaultFilesConfig.DryRun) assert.NotNil(t, err) }) } @@ -488,7 +488,7 @@ func TestHydrateNode(t *testing.T) { setup() registerFilesSetup() node := &core.Node{} - err := hydrateNode(node, rconfig.DefaultFilesConfig.Version) + err := hydrateNode(node, rconfig.DefaultFilesConfig.Version, true) assert.NotNil(t, err) }) From 04d2c53009d94e869031b81c16c131fea89ca788 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Wed, 22 Dec 2021 08:08:44 -0800 Subject: [PATCH 188/645] Update documentation (#247) Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- flytectl/docs/source/gen/flytectl_register_examples.rst | 3 ++- flytectl/docs/source/gen/flytectl_register_files.rst | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 92d00b3bf1..323c62e0af 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -37,12 +37,13 @@ Options --assumableIamRole string custom assumable iam auth role to register launch plans with. --continueOnError continue on error when registering files. --dryRun execute command without making any modifications. + --force force use of version number on entities registered with flyte. -h, --help help for examples --k8ServiceAccount string deprecated. Please use --K8sServiceAccount --k8sServiceAccount string custom kubernetes service account auth role to register launch plans with. --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). --sourceUploadPath string Location for source code in storage. - --version string version of the entity to be registered with flyte. + --version string version of the entity to be registered with flyte which are un-versioned after serialization. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 7e73e6d955..8ccc1a91a7 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -96,12 +96,13 @@ Options --assumableIamRole string custom assumable iam auth role to register launch plans with. --continueOnError continue on error when registering files. --dryRun execute command without making any modifications. + --force force use of version number on entities registered with flyte. -h, --help help for files --k8ServiceAccount string deprecated. Please use --K8sServiceAccount --k8sServiceAccount string custom kubernetes service account auth role to register launch plans with. --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). --sourceUploadPath string Location for source code in storage. - --version string version of the entity to be registered with flyte. + --version string version of the entity to be registered with flyte which are un-versioned after serialization. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From d087f3552adf4c682ab54ad726d29b4ca2d6f6f4 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 27 Dec 2021 18:42:45 +0530 Subject: [PATCH 189/645] Improve flytectl config init UX (#241) * Fix flytectl ux issue Signed-off-by: Yuvraj --- .../config/subcommand/config/init_flags.go | 2 +- flytectl/cmd/configuration/configuration.go | 51 ++++++++++++++++--- .../cmd/configuration/configuration_test.go | 18 ++++++- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/flytectl/cmd/config/subcommand/config/init_flags.go b/flytectl/cmd/config/subcommand/config/init_flags.go index 029b92baf4..cb2047dec6 100755 --- a/flytectl/cmd/config/subcommand/config/init_flags.go +++ b/flytectl/cmd/config/subcommand/config/init_flags.go @@ -3,7 +3,7 @@ package config //go:generate pflags Config --default-var DefaultConfig --bind-default-var var ( DefaultConfig = &Config{ - Insecure: true, + Insecure: false, Storage: false, } ) diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index cbf0b8bf36..bdc2fe83a1 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -2,9 +2,12 @@ package configuration import ( "context" + "errors" "fmt" "io" + "net" "os" + "regexp" "strings" "github.com/flyteorg/flytestdlib/logger" @@ -31,18 +34,24 @@ Generates sandbox config. Flyte Sandbox is a fully standalone minimal environmen :: - flytectl configuration config + flytectl config init -Generates remote cluster config. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html +Generates remote cluster config, By default connection is secure. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html :: - flytectl configuration config --host=flyte.myexample.com - + flytectl config init --host=flyte.myexample.com + +Generates remote cluster config with insecure connection + +:: + + flytectl config init --host=flyte.myexample.com --insecure + Generates FlyteCTL config with a storage provider :: - flytectl configuration config --host=flyte.myexample.com --storage + flytectl config init --host=flyte.myexample.com --storage ` ) @@ -51,6 +60,8 @@ var prompt = promptui.Select{ Items: []string{"S3", "GCS"}, } +var endpointPrefix = [3]string{"dns://", "http://", "https://"} + // CreateConfigCommand will return configuration command func CreateConfigCommand() *cobra.Command { configCmd := viper.GetConfigCommand() @@ -77,12 +88,18 @@ func initFlytectlConfig(ctx context.Context, reader io.Reader) error { templateValues := configutil.ConfigTemplateSpec{ Host: "dns:///localhost:30081", - Insecure: initConfig.DefaultConfig.Insecure, + Insecure: true, } templateStr := configutil.GetSandboxTemplate() if len(initConfig.DefaultConfig.Host) > 0 { - templateValues.Host = fmt.Sprintf("dns:///%v", initConfig.DefaultConfig.Host) + trimHost := trim(initConfig.DefaultConfig.Host) + host := strings.Split(trimHost, ":") + if !validateEndpointName(host[0]) { + return errors.New("Please use a valid endpoint") + } + templateValues.Host = fmt.Sprintf("dns://%s", trimHost) + templateValues.Insecure = initConfig.DefaultConfig.Insecure templateStr = configutil.AdminConfigTemplate if initConfig.DefaultConfig.Storage { templateStr = configutil.GetAWSCloudTemplate() @@ -114,3 +131,23 @@ func initFlytectlConfig(ctx context.Context, reader io.Reader) error { fmt.Printf("Init flytectl config file at [%s]", configutil.ConfigFile) return nil } + +func trim(hostname string) string { + for _, prefix := range endpointPrefix { + hostname = strings.TrimPrefix(hostname, prefix) + } + return hostname + +} + +func validateEndpointName(domain string) bool { + RegExp := regexp.MustCompile(`^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z + ]{2,3})$`) + if RegExp.MatchString(domain) || domain == "localhost" { + return true + } + if net.ParseIP(domain) == nil { + return false + } + return true +} diff --git a/flytectl/cmd/configuration/configuration_test.go b/flytectl/cmd/configuration/configuration_test.go index 5e84f00505..ce2d2ca1bf 100644 --- a/flytectl/cmd/configuration/configuration_test.go +++ b/flytectl/cmd/configuration/configuration_test.go @@ -56,8 +56,24 @@ func TestSetupConfigFunc(t *testing.T) { assert.Nil(t, initFlytectlConfig(ctx, yes)) assert.Nil(t, initFlytectlConfig(ctx, yes)) assert.Nil(t, initFlytectlConfig(ctx, no)) - initConfig.DefaultConfig.Host = "test" + initConfig.DefaultConfig.Host = "flyte.org" + assert.Nil(t, initFlytectlConfig(ctx, no)) + initConfig.DefaultConfig.Host = "localhost:30081" assert.Nil(t, initFlytectlConfig(ctx, no)) initConfig.DefaultConfig.Storage = true assert.NotNil(t, initFlytectlConfig(ctx, yes)) } + +func TestTrimFunc(t *testing.T) { + assert.Equal(t, trim("dns://localhost"), "localhost") + assert.Equal(t, trim("http://localhost"), "localhost") + assert.Equal(t, trim("https://localhost"), "localhost") +} + +func TestValidateEndpointName(t *testing.T) { + assert.Equal(t, validateEndpointName("127.0.0.1"), true) + assert.Equal(t, validateEndpointName("127.0.0.1.0"), false) + assert.Equal(t, validateEndpointName("localhost"), true) + assert.Equal(t, validateEndpointName("flyte.org"), true) + assert.Equal(t, validateEndpointName("flyte"), false) +} From 6453ad84938363a8002af24d6969b8f36a504585 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Wed, 29 Dec 2021 03:26:41 -0800 Subject: [PATCH 190/645] Update documentation (#249) Signed-off-by: Flyte-Bot Co-authored-by: evalsocket --- .../docs/source/gen/flytectl_config_init.rst | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index 2540c588af..796a17864b 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -15,18 +15,24 @@ Generates sandbox config. Flyte Sandbox is a fully standalone minimal environmen :: - flytectl configuration config + flytectl config init -Generates remote cluster config. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html +Generates remote cluster config, By default connection is secure. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html :: - flytectl configuration config --host=flyte.myexample.com - + flytectl config init --host=flyte.myexample.com + +Generates remote cluster config with insecure connection + +:: + + flytectl config init --host=flyte.myexample.com --insecure + Generates FlyteCTL config with a storage provider :: - flytectl configuration config --host=flyte.myexample.com --storage + flytectl config init --host=flyte.myexample.com --storage :: @@ -40,7 +46,7 @@ Options -h, --help help for init --host string Endpoint of flyte admin - --insecure Enable insecure mode (default true) + --insecure Enable insecure mode --storage Enable storage provider config Options inherited from parent commands From 409c01c24390055796eb4e123f9c86b615d9f3b1 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Wed, 29 Dec 2021 20:51:08 +0530 Subject: [PATCH 191/645] Hotfix/config init validation (#250) * fix config endpoint validation Signed-off-by: Yuvraj --- flytectl/cmd/configuration/configuration.go | 37 ++++++++++++------- .../cmd/configuration/configuration_test.go | 21 +++++++---- flytectl/go.mod | 1 + flytectl/go.sum | 4 ++ 4 files changed, 42 insertions(+), 21 deletions(-) diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index bdc2fe83a1..680b6c8896 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -5,9 +5,7 @@ import ( "errors" "fmt" "io" - "net" "os" - "regexp" "strings" "github.com/flyteorg/flytestdlib/logger" @@ -20,8 +18,8 @@ import ( cmdcore "github.com/flyteorg/flytectl/cmd/core" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" "github.com/flyteorg/flytestdlib/config/viper" + "github.com/go-ozzo/ozzo-validation/v4/is" "github.com/manifoldco/promptui" - "github.com/spf13/cobra" ) @@ -93,9 +91,8 @@ func initFlytectlConfig(ctx context.Context, reader io.Reader) error { templateStr := configutil.GetSandboxTemplate() if len(initConfig.DefaultConfig.Host) > 0 { - trimHost := trim(initConfig.DefaultConfig.Host) - host := strings.Split(trimHost, ":") - if !validateEndpointName(host[0]) { + trimHost := trimEndpoint(initConfig.DefaultConfig.Host) + if !validateEndpointName(trimHost) { return errors.New("Please use a valid endpoint") } templateValues.Host = fmt.Sprintf("dns://%s", trimHost) @@ -132,7 +129,7 @@ func initFlytectlConfig(ctx context.Context, reader io.Reader) error { return nil } -func trim(hostname string) string { +func trimEndpoint(hostname string) string { for _, prefix := range endpointPrefix { hostname = strings.TrimPrefix(hostname, prefix) } @@ -140,14 +137,28 @@ func trim(hostname string) string { } -func validateEndpointName(domain string) bool { - RegExp := regexp.MustCompile(`^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z - ]{2,3})$`) - if RegExp.MatchString(domain) || domain == "localhost" { +func validateEndpointName(endPoint string) bool { + var validate = false + if endPoint == "localhost" { return true } - if net.ParseIP(domain) == nil { + if err := is.URL.Validate(endPoint); err != nil { return false } - return true + endPointParts := strings.Split(endPoint, ":") + if len(endPointParts) <= 2 && len(endPointParts) > 0 { + if err := is.DNSName.Validate(endPointParts[0]); !errors.Is(err, is.ErrDNSName) && err == nil { + validate = true + } + if err := is.IP.Validate(endPointParts[0]); !errors.Is(err, is.ErrIP) && err == nil { + validate = true + } + if len(endPointParts) == 2 { + if err := is.Port.Validate(endPointParts[1]); err != nil { + return false + } + } + } + + return validate } diff --git a/flytectl/cmd/configuration/configuration_test.go b/flytectl/cmd/configuration/configuration_test.go index ce2d2ca1bf..00fbfc29b6 100644 --- a/flytectl/cmd/configuration/configuration_test.go +++ b/flytectl/cmd/configuration/configuration_test.go @@ -65,15 +65,20 @@ func TestSetupConfigFunc(t *testing.T) { } func TestTrimFunc(t *testing.T) { - assert.Equal(t, trim("dns://localhost"), "localhost") - assert.Equal(t, trim("http://localhost"), "localhost") - assert.Equal(t, trim("https://localhost"), "localhost") + assert.Equal(t, trimEndpoint("dns://localhost"), "localhost") + assert.Equal(t, trimEndpoint("http://localhost"), "localhost") + assert.Equal(t, trimEndpoint("https://localhost"), "localhost") } func TestValidateEndpointName(t *testing.T) { - assert.Equal(t, validateEndpointName("127.0.0.1"), true) - assert.Equal(t, validateEndpointName("127.0.0.1.0"), false) - assert.Equal(t, validateEndpointName("localhost"), true) - assert.Equal(t, validateEndpointName("flyte.org"), true) - assert.Equal(t, validateEndpointName("flyte"), false) + assert.Equal(t, true, validateEndpointName("8093405779.ap-northeast-2.elb.amazonaws.com:81")) + assert.Equal(t, true, validateEndpointName("8093405779.ap-northeast-2.elb.amazonaws.com")) + assert.Equal(t, false, validateEndpointName("8093405779.ap-northeast-2.elb.amazonaws.com:81/console")) + assert.Equal(t, true, validateEndpointName("localhost")) + assert.Equal(t, true, validateEndpointName("127.0.0.1")) + assert.Equal(t, true, validateEndpointName("127.0.0.1:30086")) + assert.Equal(t, true, validateEndpointName("112.11.1.1")) + assert.Equal(t, true, validateEndpointName("112.11.1.1:8080")) + assert.Equal(t, false, validateEndpointName("112.11.1.1:8080/console")) + assert.Equal(t, false, validateEndpointName("flyte")) } diff --git a/flytectl/go.mod b/flytectl/go.mod index c4c7eb3fa2..e7bbcdf52f 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -14,6 +14,7 @@ require ( github.com/flyteorg/flyteidl v0.21.5 github.com/flyteorg/flytestdlib v0.4.0 github.com/ghodss/yaml v1.0.0 + github.com/go-ozzo/ozzo-validation/v4 v4.3.0 github.com/golang/protobuf v1.5.0 github.com/google/go-github v17.0.0+incompatible github.com/google/go-github/v37 v37.0.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 9de725ed5f..130ebc8fd0 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -123,6 +123,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= @@ -391,6 +393,8 @@ github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL9 github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es= +github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= From 2762f976278e4a0471fb2cf236c8d69a6df5f3a7 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Thu, 30 Dec 2021 03:02:20 +0530 Subject: [PATCH 192/645] Added support for pyflyte serialize fast register (#248) * Added support for pyflyte serialize fast register (#239) Signed-off-by: Yuvraj --- .../subcommand/register/files_config.go | 1 + .../subcommand/register/filesconfig_flags.go | 1 + .../register/filesconfig_flags_test.go | 14 ++++++++++++++ flytectl/cmd/register/files.go | 12 +++++++++--- flytectl/cmd/register/register_util.go | 19 ++++++++++++++++--- flytectl/cmd/register/register_util_test.go | 2 +- 6 files changed, 42 insertions(+), 7 deletions(-) diff --git a/flytectl/cmd/config/subcommand/register/files_config.go b/flytectl/cmd/config/subcommand/register/files_config.go index 0db9aa6102..ae618d3380 100644 --- a/flytectl/cmd/config/subcommand/register/files_config.go +++ b/flytectl/cmd/config/subcommand/register/files_config.go @@ -20,5 +20,6 @@ type FilesConfig struct { K8ServiceAccount string `json:"k8ServiceAccount" pflag:", deprecated. Please use --K8sServiceAccount"` OutputLocationPrefix string `json:"outputLocationPrefix" pflag:", custom output location prefix for offloaded types (files/schemas)."` SourceUploadPath string `json:"sourceUploadPath" pflag:", Location for source code in storage."` + DestinationDirectory string `json:"destinationDirectory" pflag:", Location of source code in container."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go index 7e196e89d5..910245ee9f 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go @@ -59,6 +59,7 @@ func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), DefaultFilesConfig.K8ServiceAccount, " deprecated. Please use --K8sServiceAccount") cmdFlags.StringVar(&DefaultFilesConfig.OutputLocationPrefix, fmt.Sprintf("%v%v", prefix, "outputLocationPrefix"), DefaultFilesConfig.OutputLocationPrefix, " custom output location prefix for offloaded types (files/schemas).") cmdFlags.StringVar(&DefaultFilesConfig.SourceUploadPath, fmt.Sprintf("%v%v", prefix, "sourceUploadPath"), DefaultFilesConfig.SourceUploadPath, " Location for source code in storage.") + cmdFlags.StringVar(&DefaultFilesConfig.DestinationDirectory, fmt.Sprintf("%v%v", prefix, "destinationDirectory"), DefaultFilesConfig.DestinationDirectory, " Location of source code in container.") cmdFlags.BoolVar(&DefaultFilesConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultFilesConfig.DryRun, "execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go index 024bb0783b..29c5494a67 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go @@ -225,6 +225,20 @@ func TestFilesConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_destinationDirectory", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("destinationDirectory", testValue) + if vString, err := cmdFlags.GetString("destinationDirectory"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vString), &actual.DestinationDirectory) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_dryRun", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index b2801d53ef..895d2f5aa5 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -72,19 +72,25 @@ Override IamRole during registration: :: - flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -i "arn:aws:iam::123456789:role/dummy" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 --assumableIamRole "arn:aws:iam::123456789:role/dummy" Override Kubernetes service account during registration: :: - flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -k "kubernetes-service-account" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 --k8sServiceAccount "kubernetes-service-account" Override Output location prefix during registration: :: - flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -l "s3://dummy/prefix" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 --outputLocationPrefix "s3://dummy/prefix" + +Override Destination dir of source code in container during registration: + +:: + + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 --destinationDirectory "/root" Usage ` diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index de2ce65de5..d8b11c8d08 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -45,6 +45,7 @@ const registrationVersionPattern = "{{ registration.version }}" // Additional variable define in fast serialized proto that needs to be replace in registration time const registrationRemotePackagePattern = "{{ .remote_package_path }}" +const registrationDestDirPattern = "{{ .dest_dir }}" // All supported extensions for compress var supportedExtensions = []string{".tar", ".tgz", ".tar.gz"} @@ -219,16 +220,22 @@ func hydrateIdentifier(identifier *core.Identifier, version string, force bool) } } -func hydrateTaskSpec(task *admin.TaskSpec, sourceCode string, sourceUploadPath string, version string) error { +func hydrateTaskSpec(task *admin.TaskSpec, sourceCode, sourceUploadPath, version, destinationDir string) error { if task.Template.GetContainer() != nil { for k := range task.Template.GetContainer().Args { - if task.Template.GetContainer().Args[k] == "" || task.Template.GetContainer().Args[k] == registrationRemotePackagePattern { + if task.Template.GetContainer().Args[k] == registrationRemotePackagePattern { remotePath, err := getRemoteStoragePath(context.Background(), Client, sourceUploadPath, sourceCode, version) if err != nil { return err } task.Template.GetContainer().Args[k] = string(remotePath) } + if task.Template.GetContainer().Args[k] == registrationDestDirPattern { + task.Template.GetContainer().Args[k] = "." + if len(destinationDir) > 0 { + task.Template.GetContainer().Args[k] = destinationDir + } + } } } else if task.Template.GetK8SPod() != nil && task.Template.GetK8SPod().PodSpec != nil { var podSpec = v1.PodSpec{} @@ -245,6 +252,12 @@ func hydrateTaskSpec(task *admin.TaskSpec, sourceCode string, sourceUploadPath s } podSpec.Containers[containerIdx].Args[argIdx] = string(remotePath) } + if arg == registrationDestDirPattern { + podSpec.Containers[containerIdx].Args[argIdx] = "." + if len(destinationDir) > 0 { + podSpec.Containers[containerIdx].Args[argIdx] = destinationDir + } + } } } podSpecStruct, err := utils.MarshalObjToStruct(podSpec) @@ -340,7 +353,7 @@ func hydrateSpec(message proto.Message, sourceCode string, config rconfig.FilesC taskSpec := message.(*admin.TaskSpec) hydrateIdentifier(taskSpec.Template.Id, config.Version, config.Force) // In case of fast serialize input proto also have on additional variable to substitute i.e destination bucket for source code - if err := hydrateTaskSpec(taskSpec, sourceCode, config.SourceUploadPath, config.Version); err != nil { + if err := hydrateTaskSpec(taskSpec, sourceCode, config.SourceUploadPath, config.Version, config.DestinationDirectory); err != nil { return err } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index eb53ab32f7..f3af72c5ff 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -544,7 +544,7 @@ func TestHydrateTaskSpec(t *testing.T) { }, }, } - err = hydrateTaskSpec(task, "sourcey", rconfig.DefaultFilesConfig.SourceUploadPath, rconfig.DefaultFilesConfig.Version) + err = hydrateTaskSpec(task, "sourcey", rconfig.DefaultFilesConfig.SourceUploadPath, rconfig.DefaultFilesConfig.Version, "") assert.NoError(t, err) var hydratedPodSpec = v1.PodSpec{} err = utils.UnmarshalStructToObj(task.Template.GetK8SPod().PodSpec, &hydratedPodSpec) From 1a904e0b3119fe1918630cb0510aa08197910596 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Thu, 30 Dec 2021 09:23:47 +0530 Subject: [PATCH 193/645] Added flag to pass in CAcerts (#245) --- flytectl/go.mod | 2 ++ flytectl/go.sum | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index e7bbcdf52f..27f1f9ebd4 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -55,3 +55,5 @@ require ( k8s.io/client-go v0.21.3 sigs.k8s.io/yaml v1.2.0 ) + +replace github.com/flyteorg/flyteidl => github.com/flyteorg/flyteidl v0.21.8-0.20211222073222-e8a6c7184c08 diff --git a/flytectl/go.sum b/flytectl/go.sum index 130ebc8fd0..c4201d372e 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -354,8 +354,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.21.5 h1:ietcyEpQ0C1FYDTUauo7h4yS792PAeiJYs0mQJ/j+8k= -github.com/flyteorg/flyteidl v0.21.5/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.21.8-0.20211222073222-e8a6c7184c08 h1:tefRGxALrl5RmfTxbPr0+MUmfOuPREgYmvfvRrM4lbA= +github.com/flyteorg/flyteidl v0.21.8-0.20211222073222-e8a6c7184c08/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.4.0 h1:cEMkNfjocCuBSLzM9tKjsODhkr5gXTZAGl6k62FrT60= github.com/flyteorg/flytestdlib v0.4.0/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= From a2954286e4bacf898937ae607a10169cada1dbf0 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Thu, 30 Dec 2021 09:51:54 +0530 Subject: [PATCH 194/645] Using released IDL version for CACaert flag (#254) --- flytectl/go.mod | 4 +--- flytectl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 27f1f9ebd4..d60e10cf05 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -11,7 +11,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.21.5 + github.com/flyteorg/flyteidl v0.21.14 github.com/flyteorg/flytestdlib v0.4.0 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 @@ -55,5 +55,3 @@ require ( k8s.io/client-go v0.21.3 sigs.k8s.io/yaml v1.2.0 ) - -replace github.com/flyteorg/flyteidl => github.com/flyteorg/flyteidl v0.21.8-0.20211222073222-e8a6c7184c08 diff --git a/flytectl/go.sum b/flytectl/go.sum index c4201d372e..02e6c276e8 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -354,8 +354,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.21.8-0.20211222073222-e8a6c7184c08 h1:tefRGxALrl5RmfTxbPr0+MUmfOuPREgYmvfvRrM4lbA= -github.com/flyteorg/flyteidl v0.21.8-0.20211222073222-e8a6c7184c08/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.21.14 h1:uOc3u0DFkFPag5fOQ8LMmMBBZqHy19ikxShnRlRAzZ0= +github.com/flyteorg/flyteidl v0.21.14/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.4.0 h1:cEMkNfjocCuBSLzM9tKjsODhkr5gXTZAGl6k62FrT60= github.com/flyteorg/flytestdlib v0.4.0/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= From 37847d4cafc32df6ad3a09e10010c034f15d8e1d Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 4 Jan 2022 11:18:29 +0530 Subject: [PATCH 195/645] Updates the local kubecontext with that of sandbox and switches to it (#255) * Updates the local kubecontext with that of sandbox and switches to it Signed-off-by: Prafulla Mahindrakar * Removed map delete Signed-off-by: Prafulla Mahindrakar * Added context default for the sandbox test which is checked during context switch Signed-off-by: Prafulla Mahindrakar * Moved copy context to k8s util Signed-off-by: Prafulla Mahindrakar * Removing context during teardown Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/sandbox/start.go | 18 ++++++++ flytectl/cmd/sandbox/start_test.go | 12 ++--- flytectl/cmd/sandbox/teardown.go | 10 +++++ flytectl/pkg/k8s/k8s.go | 70 ++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 6 deletions(-) diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 95edcff8dd..2023806dd5 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -27,6 +27,7 @@ import ( cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/util" + "k8s.io/client-go/tools/clientcmd" ) const ( @@ -70,6 +71,8 @@ Usage sandboxSupportedVersion = "v0.10.0" diskPressureTaint = "node.kubernetes.io/disk-pressure" taintEffect = "NoSchedule" + sandboxContextName = "flyte-sandbox" + sandboxDockerContext = "default" ) type ExecResult struct { @@ -104,6 +107,10 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm if err != nil { return err } + if err = updateLocalKubeContext(); err != nil { + return err + } + if err := watchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { return err } @@ -112,6 +119,17 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm return nil } +func updateLocalKubeContext() error { + localConfigAccess := clientcmd.NewDefaultPathOptions() + + dockerConfigAccess := &clientcmd.PathOptions{ + GlobalFile: docker.Kubeconfig, + LoadingRules: clientcmd.NewDefaultClientConfigLoadingRules(), + } + + return k8s.CopyKubeContext(dockerConfigAccess, localConfigAccess, sandboxDockerContext, sandboxContextName) +} + func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio.Scanner, error) { fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index d15ee17ef4..ca64917914 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -40,17 +40,17 @@ clusters: extension: audience: foo other: bar - name: foo-cluster + name: default contexts: - context: - cluster: foo-cluster - user: foo-user + cluster: default + user: default namespace: bar - name: foo-context -current-context: foo-context + name: default +current-context: default kind: Config users: -- name: foo-user +- name: default user: exec: apiVersion: client.authentication.k8s.io/v1alpha1 diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index 3d42e7c7c5..bce078b788 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -12,6 +12,8 @@ import ( "github.com/enescakir/emoji" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/k8s" + "k8s.io/client-go/tools/clientcmd" ) const ( @@ -48,6 +50,14 @@ func tearDownSandbox(ctx context.Context, cli docker.Docker) error { if err := configutil.ConfigCleanup(); err != nil { fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) } + if err := removeSandboxKubeContext(); err != nil { + fmt.Printf("Kubecontext cleanup failed. Which Failed due to %v \n ", err) + } fmt.Printf("%v %v Sandbox cluster is removed successfully. \n", emoji.Broom, emoji.Broom) return nil } + +func removeSandboxKubeContext() error { + localConfigAccess := clientcmd.NewDefaultPathOptions() + return k8s.RemoveKubeContext(localConfigAccess, sandboxContextName) +} diff --git a/flytectl/pkg/k8s/k8s.go b/flytectl/pkg/k8s/k8s.go index f17082dbe0..74086d76a2 100644 --- a/flytectl/pkg/k8s/k8s.go +++ b/flytectl/pkg/k8s/k8s.go @@ -1,12 +1,14 @@ package k8s import ( + "fmt" "os" "github.com/pkg/errors" "k8s.io/client-go/kubernetes" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/clientcmd" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" ) type K8s interface { @@ -31,3 +33,71 @@ func GetK8sClient(cfg, master string) (K8s, error) { } return Client, nil } + +// CopyKubeContext copies context fromContext part of fromConfigAccess to toContext part of toConfigAccess. +func CopyKubeContext(fromConfigAccess, toConfigAccess clientcmd.ConfigAccess, fromContext, toContext string) error { + _, err := toConfigAccess.GetStartingConfig() + if err != nil { + return err + } + + fromStartingConfig, err := fromConfigAccess.GetStartingConfig() + if err != nil { + return err + } + _, exists := fromStartingConfig.Contexts[fromContext] + if !exists { + return fmt.Errorf("context %v doesn't exist", fromContext) + } + + toStartingConfig, err := toConfigAccess.GetStartingConfig() + if err != nil { + return err + } + + _, exists = toStartingConfig.Contexts[toContext] + if exists { + fmt.Printf("context %v already exist. Overwriting it\n", toContext) + } else { + toStartingConfig.Contexts[toContext] = clientcmdapi.NewContext() + } + + toStartingConfig.Clusters[toContext] = fromStartingConfig.Clusters[fromContext] + toStartingConfig.Clusters[toContext].LocationOfOrigin = toConfigAccess.GetDefaultFilename() + toStartingConfig.AuthInfos[toContext] = fromStartingConfig.AuthInfos[fromContext] + toStartingConfig.AuthInfos[toContext].LocationOfOrigin = toConfigAccess.GetDefaultFilename() + toStartingConfig.Contexts[toContext].Cluster = toContext + toStartingConfig.Contexts[toContext].AuthInfo = toContext + toStartingConfig.CurrentContext = toContext + + if err := clientcmd.ModifyConfig(toConfigAccess, *toStartingConfig, true); err != nil { + return err + } + + fmt.Printf("context modified for %q and switched over to it.\n", toContext) + return nil +} + +// RemoveKubeContext removes the contextToRemove from the kubeContext pointed to be fromConfigAccess +func RemoveKubeContext(fromConfigAccess clientcmd.ConfigAccess, contextToRemove string) error { + fromStartingConfig, err := fromConfigAccess.GetStartingConfig() + if err != nil { + return err + } + _, exists := fromStartingConfig.Contexts[contextToRemove] + if !exists { + return fmt.Errorf("context %v doesn't exist", contextToRemove) + } + + delete(fromStartingConfig.Clusters, contextToRemove) + delete(fromStartingConfig.AuthInfos, contextToRemove) + delete(fromStartingConfig.Contexts, contextToRemove) + fromStartingConfig.CurrentContext = "" + + if err := clientcmd.ModifyConfig(fromConfigAccess, *fromStartingConfig, true); err != nil { + return err + } + + fmt.Printf("context removed for %q.\n", contextToRemove) + return nil +} From 60b0f1c276c036ad5a71fae451947d46dc88766f Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Tue, 4 Jan 2022 02:18:33 -0800 Subject: [PATCH 196/645] Update documentation (#253) Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- flytectl/docs/source/gen/flytectl.rst | 2 ++ flytectl/docs/source/gen/flytectl_completion.rst | 2 ++ flytectl/docs/source/gen/flytectl_config.rst | 2 ++ .../docs/source/gen/flytectl_config_discover.rst | 2 ++ flytectl/docs/source/gen/flytectl_config_init.rst | 2 ++ .../docs/source/gen/flytectl_config_validate.rst | 2 ++ flytectl/docs/source/gen/flytectl_create.rst | 2 ++ .../docs/source/gen/flytectl_create_execution.rst | 2 ++ .../docs/source/gen/flytectl_create_project.rst | 2 ++ flytectl/docs/source/gen/flytectl_delete.rst | 2 ++ ...flytectl_delete_cluster-resource-attribute.rst | 2 ++ .../flytectl_delete_execution-cluster-label.rst | 2 ++ .../flytectl_delete_execution-queue-attribute.rst | 2 ++ .../docs/source/gen/flytectl_delete_execution.rst | 2 ++ .../gen/flytectl_delete_plugin-override.rst | 2 ++ .../flytectl_delete_task-resource-attribute.rst | 2 ++ .../flytectl_delete_workflow-execution-config.rst | 2 ++ flytectl/docs/source/gen/flytectl_get.rst | 2 ++ .../flytectl_get_cluster-resource-attribute.rst | 2 ++ .../gen/flytectl_get_execution-cluster-label.rst | 2 ++ .../flytectl_get_execution-queue-attribute.rst | 2 ++ .../docs/source/gen/flytectl_get_execution.rst | 2 ++ .../docs/source/gen/flytectl_get_launchplan.rst | 2 ++ .../source/gen/flytectl_get_plugin-override.rst | 2 ++ flytectl/docs/source/gen/flytectl_get_project.rst | 2 ++ .../gen/flytectl_get_task-resource-attribute.rst | 2 ++ flytectl/docs/source/gen/flytectl_get_task.rst | 2 ++ .../flytectl_get_workflow-execution-config.rst | 2 ++ .../docs/source/gen/flytectl_get_workflow.rst | 2 ++ flytectl/docs/source/gen/flytectl_register.rst | 2 ++ .../source/gen/flytectl_register_examples.rst | 3 +++ .../docs/source/gen/flytectl_register_files.rst | 15 ++++++++++++--- flytectl/docs/source/gen/flytectl_sandbox.rst | 2 ++ .../docs/source/gen/flytectl_sandbox_exec.rst | 2 ++ .../docs/source/gen/flytectl_sandbox_start.rst | 2 ++ .../docs/source/gen/flytectl_sandbox_status.rst | 2 ++ .../docs/source/gen/flytectl_sandbox_teardown.rst | 2 ++ flytectl/docs/source/gen/flytectl_update.rst | 2 ++ ...flytectl_update_cluster-resource-attribute.rst | 2 ++ .../flytectl_update_execution-cluster-label.rst | 2 ++ .../flytectl_update_execution-queue-attribute.rst | 2 ++ .../gen/flytectl_update_launchplan-meta.rst | 2 ++ .../source/gen/flytectl_update_launchplan.rst | 2 ++ .../gen/flytectl_update_plugin-override.rst | 2 ++ .../docs/source/gen/flytectl_update_project.rst | 2 ++ .../docs/source/gen/flytectl_update_task-meta.rst | 2 ++ .../flytectl_update_task-resource-attribute.rst | 2 ++ .../flytectl_update_workflow-execution-config.rst | 2 ++ .../source/gen/flytectl_update_workflow-meta.rst | 2 ++ flytectl/docs/source/gen/flytectl_upgrade.rst | 2 ++ flytectl/docs/source/gen/flytectl_version.rst | 2 ++ 51 files changed, 113 insertions(+), 3 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 9d7eec1e80..f3cf8c06f6 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -18,8 +18,10 @@ Options --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index 20f9b52f89..33dea6e177 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -67,8 +67,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 7d4e25cef6..c8590d9ac1 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -27,8 +27,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 8550321470..a2c248fdac 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -29,8 +29,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index 796a17864b..a7274917da 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -56,8 +56,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 51a3a7e443..bcb53f6e61 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -31,8 +31,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index 1405e2c25a..1fcc9387db 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -30,8 +30,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 962f7749ac..9e0d33530e 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -160,8 +160,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index 4c42f59c44..ef5ed2853d 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -55,8 +55,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 60bef4e19d..4bf0a412a6 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -30,8 +30,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 0572aac149..e606a9fd2e 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -66,8 +66,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 32206f7c2b..de963af2ce 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -64,8 +64,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index cf6bc31ed3..30849c67d8 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -68,8 +68,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 25bec01c32..9831831e98 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -73,8 +73,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index cbf85e2288..e54b428707 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -68,8 +68,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index c673e19a4e..96f726900a 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -69,8 +69,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 7647c0cb36..fc586192f5 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -64,8 +64,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 14db227b12..b129cecbb2 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -30,8 +30,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index 1a0e26cad6..de78a8ceac 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -73,8 +73,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index e027c3f899..84109db997 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -72,8 +72,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index d5fbb275e2..ecb63556bc 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -75,8 +75,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 0d6a903604..e77bcb8dc0 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -103,8 +103,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 2876f26774..cb527a26b0 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -120,8 +120,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index 3b99af6a8b..eafa654f20 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -95,8 +95,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index c68aa1b6d4..c1e67c5ce3 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -74,8 +74,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index e27aa5532b..2bc62dd00a 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -77,8 +77,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 0b7d3d461f..473030b128 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -117,8 +117,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index f3108b567a..eaa12eef0d 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -83,8 +83,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index d89e372bb1..b3e8fc5738 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -105,8 +105,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 5c3200f533..56c795d3c3 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -30,8 +30,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 323c62e0af..a53c63669f 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -36,6 +36,7 @@ Options --archive pass in archive file either an http link or local path. --assumableIamRole string custom assumable iam auth role to register launch plans with. --continueOnError continue on error when registering files. + --destinationDirectory string Location of source code in container. --dryRun execute command without making any modifications. --force force use of version number on entities registered with flyte. -h, --help help for examples @@ -52,8 +53,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 8ccc1a91a7..cc62e457db 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -66,19 +66,25 @@ Override IamRole during registration: :: - flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -i "arn:aws:iam::123456789:role/dummy" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 --assumableIamRole "arn:aws:iam::123456789:role/dummy" Override Kubernetes service account during registration: :: - flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -k "kubernetes-service-account" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 --k8sServiceAccount "kubernetes-service-account" Override Output location prefix during registration: :: - flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 -l "s3://dummy/prefix" + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 --outputLocationPrefix "s3://dummy/prefix" + +Override Destination dir of source code in container during registration: + +:: + + flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 --destinationDirectory "/root" Usage @@ -95,6 +101,7 @@ Options --archive pass in archive file either an http link or local path. --assumableIamRole string custom assumable iam auth role to register launch plans with. --continueOnError continue on error when registering files. + --destinationDirectory string Location of source code in container. --dryRun execute command without making any modifications. --force force use of version number on entities registered with flyte. -h, --help help for files @@ -111,8 +118,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 34d11c5c93..e9ff4c3a02 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -49,8 +49,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index aa868e7c19..d377d26950 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -35,8 +35,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 8f6feea066..217b7da4b5 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -64,8 +64,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 2249ab17ee..6b7637cb3b 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -37,8 +37,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index ede1979d2f..5958285fae 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -37,8 +37,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 232876c1d3..0e903ed9e2 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -32,8 +32,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index b102e6b8aa..b976c3486a 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -72,8 +72,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 4da8a7c242..265a274589 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -65,8 +65,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 9db12f7afb..e12e6ff614 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -76,8 +76,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index b3c11b6d57..2ac0f7c1ff 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -50,8 +50,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index b2b64722cb..fd64182bd3 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -46,8 +46,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 7a0b81f1a5..41c04f73ce 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -78,8 +78,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 38042f4b9b..b8baaa4349 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -64,8 +64,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index 45287308ab..06ad150dc1 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -50,8 +50,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index fe12a27559..c788249f3b 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -78,8 +78,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index 66f46455e2..90f3815857 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -68,8 +68,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index c6dca84ae0..07a7340fbd 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -50,8 +50,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index 837a27dd4a..bea19096ad 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -43,8 +43,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index ba7aeb4d94..de9d2d6d6c 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -34,8 +34,10 @@ Options inherited from parent commands --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' From ef0e4352b6a90d34ff3fecb75c83735ca11e363c Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 4 Jan 2022 20:39:54 +0530 Subject: [PATCH 197/645] Linked configurable options for flytectl config.yaml (#251) * Linked configurable options for flytectl config.yaml Signed-off-by: Prafulla Mahindrakar * Incorporated feedback Signed-off-by: Prafulla Mahindrakar * Incorporated feedback Signed-off-by: Prafulla Mahindrakar --- flytectl/docs/source/cluster-resource-attribute.rst | 5 +---- flytectl/docs/source/execution-cluster-label.rst | 5 +---- flytectl/docs/source/execution.rst | 5 +---- flytectl/docs/source/index.rst | 7 ++++++- flytectl/docs/source/launchplan.rst | 5 ++--- flytectl/docs/source/plugin-override.rst | 5 +---- flytectl/docs/source/sandbox.rst | 6 +----- flytectl/docs/source/task-resource-attribute.rst | 5 +---- flytectl/docs/source/task.rst | 2 +- flytectl/docs/source/workflow.rst | 4 ++-- 10 files changed, 17 insertions(+), 32 deletions(-) diff --git a/flytectl/docs/source/cluster-resource-attribute.rst b/flytectl/docs/source/cluster-resource-attribute.rst index 4b655f8dfa..c4b89458c8 100644 --- a/flytectl/docs/source/cluster-resource-attribute.rst +++ b/flytectl/docs/source/cluster-resource-attribute.rst @@ -1,5 +1,5 @@ Cluster resource attribute ------- +-------------------------- It specifies the actions to be performed on the 'cluster-resource-attribute'. .. toctree:: @@ -9,6 +9,3 @@ It specifies the actions to be performed on the 'cluster-resource-attribute'. gen/flytectl_get_cluster-resource-attribute gen/flytectl_delete_cluster-resource-attribute gen/flytectl_update_cluster-resource-attribute - gen/flytectl_get_cluster-resource-attribute - gen/flytectl_delete_cluster-resource-attribute - gen/flytectl_update_cluster-resource-attribute diff --git a/flytectl/docs/source/execution-cluster-label.rst b/flytectl/docs/source/execution-cluster-label.rst index 8bd483f17e..2a27e87e52 100644 --- a/flytectl/docs/source/execution-cluster-label.rst +++ b/flytectl/docs/source/execution-cluster-label.rst @@ -1,5 +1,5 @@ Execution cluster label ------- +----------------------- It specifies the actions to be performed on the resource 'execution-cluster-label'. .. toctree:: @@ -9,6 +9,3 @@ It specifies the actions to be performed on the resource 'execution-cluster-labe gen/flytectl_get_execution-cluster-label gen/flytectl_update_execution-cluster-label gen/flytectl_delete_execution-cluster-label - gen/flytectl_get_execution-cluster-label - gen/flytectl_update_execution-cluster-label - gen/flytectl_delete_execution-cluster-label diff --git a/flytectl/docs/source/execution.rst b/flytectl/docs/source/execution.rst index 717c697db8..4e3d1cbff3 100644 --- a/flytectl/docs/source/execution.rst +++ b/flytectl/docs/source/execution.rst @@ -1,5 +1,5 @@ Execution ------- +--------- It specifies the actions to be performed on the resource 'execution'. .. toctree:: @@ -9,6 +9,3 @@ It specifies the actions to be performed on the resource 'execution'. gen/flytectl_create_execution gen/flytectl_get_execution gen/flytectl_delete_execution - gen/flytectl_create_execution - gen/flytectl_get_execution - gen/flytectl_delete_execution diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 47dcb78db1..2c59eaa031 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -48,7 +48,11 @@ on command-line. The following configuration is useful to setup. Basic Configuration -------------------- -Flytectl configuration +For full list of configurable options available can be found by running ``flytectl --help`` and can be alternately be found `here `__ + +.. NOTE:: + + Currently, the Project ``-p``, Domain ``-d``, and Output ``-o`` flags cannot be used in config file .. tabbed:: Local Flyte Sandbox @@ -141,6 +145,7 @@ Flytectl configuration :hidden: Install and Configure + gen/flytectl verbs nouns contribute diff --git a/flytectl/docs/source/launchplan.rst b/flytectl/docs/source/launchplan.rst index f469b98563..7755b8eaba 100644 --- a/flytectl/docs/source/launchplan.rst +++ b/flytectl/docs/source/launchplan.rst @@ -1,5 +1,5 @@ Launchplan ------- +---------- It specifies the actions to be performed on the resource 'launchplan'. .. toctree:: @@ -8,5 +8,4 @@ It specifies the actions to be performed on the resource 'launchplan'. gen/flytectl_get_launchplan gen/flytectl_update_launchplan - gen/flytectl_get_launchplan - gen/flytectl_update_launchplan + gen/flytectl_update_launchplan-meta diff --git a/flytectl/docs/source/plugin-override.rst b/flytectl/docs/source/plugin-override.rst index 6e77ceb748..ed016543c5 100644 --- a/flytectl/docs/source/plugin-override.rst +++ b/flytectl/docs/source/plugin-override.rst @@ -1,5 +1,5 @@ Plugin override ------- +--------------- It specifies the actions to be performed on the resource 'plugin-override'. .. toctree:: @@ -9,6 +9,3 @@ It specifies the actions to be performed on the resource 'plugin-override'. gen/flytectl_get_plugin-override gen/flytectl_update_plugin-override gen/flytectl_delete_plugin-override - gen/flytectl_get_plugin-override - gen/flytectl_update_plugin-override - gen/flytectl_delete_plugin-override diff --git a/flytectl/docs/source/sandbox.rst b/flytectl/docs/source/sandbox.rst index a0fb7b21d8..e6de8cafa5 100644 --- a/flytectl/docs/source/sandbox.rst +++ b/flytectl/docs/source/sandbox.rst @@ -1,5 +1,5 @@ Sandbox ------- +------- It specifies the actions to be performed on the resource 'sandbox'. .. toctree:: @@ -10,7 +10,3 @@ It specifies the actions to be performed on the resource 'sandbox'. gen/flytectl_sandbox_status gen/flytectl_sandbox_teardown gen/flytectl_sandbox_exec - gen/flytectl_sandbox_start - gen/flytectl_sandbox_status - gen/flytectl_sandbox_teardown - gen/flytectl_sandbox_exec diff --git a/flytectl/docs/source/task-resource-attribute.rst b/flytectl/docs/source/task-resource-attribute.rst index ee827b775b..3a4c0d5e8d 100644 --- a/flytectl/docs/source/task-resource-attribute.rst +++ b/flytectl/docs/source/task-resource-attribute.rst @@ -1,5 +1,5 @@ Task resource attribute ------- +----------------------- It specifies the actions to be performed on the resource 'task-resource-attribute'. .. toctree:: @@ -9,7 +9,4 @@ It specifies the actions to be performed on the resource 'task-resource-attribut gen/flytectl_get_task-resource-attribute gen/flytectl_update_task-resource-attribute gen/flytectl_delete_task-resource-attribute - gen/flytectl_get_task-resource-attribute - gen/flytectl_update_task-resource-attribute - gen/flytectl_delete_task-resource-attribute diff --git a/flytectl/docs/source/task.rst b/flytectl/docs/source/task.rst index 2b19b358d5..14f1c58f41 100644 --- a/flytectl/docs/source/task.rst +++ b/flytectl/docs/source/task.rst @@ -7,4 +7,4 @@ It specifies the actions to be performed on the resource 'task'. :caption: Task gen/flytectl_get_task - gen/flytectl_get_task + gen/flytectl_update_task-meta diff --git a/flytectl/docs/source/workflow.rst b/flytectl/docs/source/workflow.rst index e77bb0f92c..91332dc281 100644 --- a/flytectl/docs/source/workflow.rst +++ b/flytectl/docs/source/workflow.rst @@ -1,5 +1,5 @@ Workflow ------- +-------- It specifies the actions to be performed on the resource 'workflow'. .. toctree:: @@ -7,4 +7,4 @@ It specifies the actions to be performed on the resource 'workflow'. :caption: Workflow gen/flytectl_get_workflow - gen/flytectl_get_workflow + gen/flytectl_update_workflow-meta From 2cec59ba2e44a16763a0918bb81056e0383a0e28 Mon Sep 17 00:00:00 2001 From: Sandra Youssef <80421934+SandraGH5@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:41:53 -0800 Subject: [PATCH 198/645] Editorial review (#256) Adding some syntax edits. The content has not been changed. --- flytectl/docs/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 2c59eaa031..f572de1ee2 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -48,7 +48,7 @@ on command-line. The following configuration is useful to setup. Basic Configuration -------------------- -For full list of configurable options available can be found by running ``flytectl --help`` and can be alternately be found `here `__ +The full list of available configurable options can be found by running ``flytectl --help``, or alternately `here `__ .. NOTE:: From 3da647f8915b49cd331bbdbc4d61426481996c71 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Wed, 5 Jan 2022 21:45:23 +0530 Subject: [PATCH 199/645] Adding flytectl.rst to index (#257) * Adding flytectl.rst to index Signed-off-by: Prafulla Mahindrakar * Update index.rst Co-authored-by: Niels Bantilan --- flytectl/docs/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index f572de1ee2..88a895f174 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -145,7 +145,7 @@ The full list of available configurable options can be found by running ``flytec :hidden: Install and Configure - gen/flytectl + CLI Entrypoint verbs nouns contribute From 40e2b3844271bb54f342fcf77711572ff5fb27ff Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Fri, 7 Jan 2022 23:32:38 +0530 Subject: [PATCH 200/645] bump docsearch version (#258) Signed-off-by: Samhita Alla --- flytectl/doc-requirements.txt | 36 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index 36f0a08186..7998e241d3 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -13,9 +13,9 @@ beautifulsoup4==4.10.0 # furo # sphinx-code-include # sphinx-material -certifi==2021.5.30 +certifi==2021.10.8 # via requests -charset-normalizer==2.0.4 +charset-normalizer==2.0.10 # via requests css-html-js-minify==2.5.5 # via sphinx-material @@ -23,39 +23,39 @@ docutils==0.17.1 # via # sphinx # sphinx-panels -git+git://github.com/flyteorg/furo@main +furo @ git+git://github.com/flyteorg/furo@main # via -r doc-requirements.in -idna==3.2 +idna==3.3 # via requests -imagesize==1.2.0 +imagesize==1.3.0 # via sphinx -jinja2==3.0.1 +jinja2==3.0.3 # via sphinx -lxml==4.6.5 +lxml==4.7.1 # via sphinx-material markupsafe==2.0.1 # via jinja2 -packaging==21.0 +packaging==21.3 # via sphinx -pygments==2.10.0 +pygments==2.11.2 # via # sphinx # sphinx-prompt -pyparsing==2.4.7 +pyparsing==3.0.6 # via packaging python-slugify[unidecode]==5.0.2 # via sphinx-material -pytz==2021.1 +pytz==2021.3 # via babel -requests==2.26.0 +requests==2.27.1 # via sphinx six==1.16.0 # via sphinx-code-include -snowballstemmer==2.1.0 +snowballstemmer==2.2.0 # via sphinx -soupsieve==2.2.1 +soupsieve==2.3.1 # via beautifulsoup4 -sphinx==4.1.2 +sphinx==4.3.2 # via # -r doc-requirements.in # furo @@ -72,7 +72,7 @@ sphinx-copybutton==0.4.0 # via -r doc-requirements.in sphinx-fontawesome==0.0.6 # via -r doc-requirements.in -sphinx-material==0.0.34 +sphinx-material==0.0.35 # via -r doc-requirements.in sphinx-panels==0.6.0 # via -r doc-requirements.in @@ -94,9 +94,9 @@ sphinxcontrib-yt==0.2.2 # via -r doc-requirements.in text-unidecode==1.3 # via python-slugify -unidecode==1.3.0 +unidecode==1.3.2 # via python-slugify -urllib3==1.26.6 +urllib3==1.26.7 # via requests # The following packages are considered to be unsafe in a requirements file: From 4a1ff5e04f7b4d2becdda64c6e31931b46e4843e Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Fri, 7 Jan 2022 19:19:12 -0500 Subject: [PATCH 201/645] update flytectl for new navbar (#259) --- flytectl/docs/source/conf.py | 3 ++- flytectl/docs/source/contribute.rst | 2 +- flytectl/docs/source/index.rst | 11 +++++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 6767fad9e7..aeaa2ae410 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -89,8 +89,9 @@ # a list of builtin themes. # html_theme = "furo" -html_title = "Flyte Docs" +html_title = "Flyte" html_logo = "flyte_circle_gradient_1_4x4.png" +html_favicon = "flyte_circle_gradient_1_4x4.png" html_theme_options = { "light_css_variables": { diff --git a/flytectl/docs/source/contribute.rst b/flytectl/docs/source/contribute.rst index a623d3f159..864fda4e61 100644 --- a/flytectl/docs/source/contribute.rst +++ b/flytectl/docs/source/contribute.rst @@ -1,5 +1,5 @@ ########################### -FlyteCTL Contribution Guide +Contributing Guide ########################### First off, thank you for thinking about contributing! diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 88a895f174..3f73b6b834 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -1,8 +1,8 @@ .. flytectl doc -###################### -Flytectl Reference -###################### +#################################################### +Flytectl: The Official Flyte Command-line Interface +#################################################### Overview ========= @@ -139,12 +139,15 @@ The full list of available configurable options can be found by running ``flytec |book| API Reference |hands-helping| Community + +.. NOTE: the caption text is important for the sphinx theme to correctly render the nav header +.. https://github.com/flyteorg/furo .. toctree:: :maxdepth: -1 :caption: Flytectl :hidden: - Install and Configure + Flytectl CLI Entrypoint verbs nouns From f079e1d931161a6936bccaefc1073dc3161dc308 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Tue, 11 Jan 2022 20:28:16 +0530 Subject: [PATCH 202/645] bump containderd version (#262) * bump containerd Signed-off-by: Yuvraj --- flytectl/doc-requirements.in | 2 +- flytectl/doc-requirements.txt | 2 +- flytectl/go.mod | 2 +- flytectl/go.sum | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in index bb24b9a7b1..1bcf77f9be 100644 --- a/flytectl/doc-requirements.in +++ b/flytectl/doc-requirements.in @@ -1,4 +1,4 @@ -git+git://github.com/flyteorg/furo@main +git+https://github.com/flyteorg/furo@main sphinx sphinx-prompt sphinx-material diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index 7998e241d3..549d2907c6 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -23,7 +23,7 @@ docutils==0.17.1 # via # sphinx # sphinx-panels -furo @ git+git://github.com/flyteorg/furo@main +git+https://github.com/flyteorg/furo@main # via -r doc-requirements.in idna==3.3 # via requests diff --git a/flytectl/go.mod b/flytectl/go.mod index d60e10cf05..19376fa17a 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -6,7 +6,7 @@ require ( github.com/Microsoft/go-winio v0.5.0 // indirect github.com/avast/retry-go v3.0.0+incompatible github.com/awalterschulze/gographviz v2.0.3+incompatible - github.com/containerd/containerd v1.5.8 // indirect + github.com/containerd/containerd v1.5.9 // indirect github.com/disiqueira/gotree v1.0.0 github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 02e6c276e8..9445a185c3 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -216,8 +216,8 @@ github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7 github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.8 h1:NmkCC1/QxyZFBny8JogwLpOy2f+VEbO/f6bV2Mqtwuw= -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/containerd v1.5.9 h1:rs6Xg1gtIxaeyG+Smsb/0xaSDu1VgFhOCKBXxMxbsF4= +github.com/containerd/containerd v1.5.9/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= From a101cd6f527b9d7dc54f0579c748775fa0201034 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Wed, 12 Jan 2022 15:04:36 +0530 Subject: [PATCH 203/645] Added Update Execution cli (#261) * Added Update Execution cli Signed-off-by: Prafulla Mahindrakar * Added unit tests Signed-off-by: Prafulla Mahindrakar * reset Signed-off-by: Prafulla Mahindrakar * nit Signed-off-by: Prafulla Mahindrakar --- flytectl/clierrors/errors.go | 3 + .../subcommand/execution/update_config.go | 13 ++ .../execution/updateconfig_flags.go | 57 +++++++ .../execution/updateconfig_flags_test.go | 144 ++++++++++++++++++ flytectl/cmd/update/execution.go | 73 +++++++++ flytectl/cmd/update/execution_test.go | 71 +++++++++ flytectl/cmd/update/update.go | 3 + flytectl/cmd/update/update_test.go | 10 +- flytectl/go.mod | 2 + flytectl/go.sum | 4 +- 10 files changed, 373 insertions(+), 7 deletions(-) create mode 100644 flytectl/cmd/config/subcommand/execution/update_config.go create mode 100755 flytectl/cmd/config/subcommand/execution/updateconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/execution/updateconfig_flags_test.go create mode 100644 flytectl/cmd/update/execution.go create mode 100644 flytectl/cmd/update/execution_test.go diff --git a/flytectl/clierrors/errors.go b/flytectl/clierrors/errors.go index 0085d1711c..44e7368c05 100644 --- a/flytectl/clierrors/errors.go +++ b/flytectl/clierrors/errors.go @@ -10,6 +10,9 @@ var ( ErrLPVersionNotPassed = "Launch plan version not passed\n" //nolint ErrFailedLPUpdate = "Launch plan %v failed to get updated due to %v\n" + ErrExecutionNotPassed = "Execution name not passed\n" + ErrFailedExecutionUpdate = "Execution %v failed to get updated due to %v\n" + ErrWorkflowNotPassed = "Workflow name not passed\n" ErrFailedWorkflowUpdate = "Workflow %v failed to get updated to due to %v\n" diff --git a/flytectl/cmd/config/subcommand/execution/update_config.go b/flytectl/cmd/config/subcommand/execution/update_config.go new file mode 100644 index 0000000000..8623435784 --- /dev/null +++ b/flytectl/cmd/config/subcommand/execution/update_config.go @@ -0,0 +1,13 @@ +package execution + +//go:generate pflags UpdateConfig --default-var UConfig --bind-default-var +var ( + UConfig = &UpdateConfig{} +) + +// UpdateConfig +type UpdateConfig struct { + Archive bool `json:"archive" pflag:",archive execution."` + Activate bool `json:"activate" pflag:",activate execution."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` +} diff --git a/flytectl/cmd/config/subcommand/execution/updateconfig_flags.go b/flytectl/cmd/config/subcommand/execution/updateconfig_flags.go new file mode 100755 index 0000000000..03c9d0f90b --- /dev/null +++ b/flytectl/cmd/config/subcommand/execution/updateconfig_flags.go @@ -0,0 +1,57 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package execution + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (UpdateConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (UpdateConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (UpdateConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in UpdateConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg UpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("UpdateConfig", pflag.ExitOnError) + cmdFlags.BoolVar(&UConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), UConfig.Archive, "archive execution.") + cmdFlags.BoolVar(&UConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), UConfig.Activate, "activate execution.") + cmdFlags.BoolVar(&UConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), UConfig.DryRun, "execute command without making any modifications.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/execution/updateconfig_flags_test.go b/flytectl/cmd/config/subcommand/execution/updateconfig_flags_test.go new file mode 100755 index 0000000000..6c65c2d14b --- /dev/null +++ b/flytectl/cmd/config/subcommand/execution/updateconfig_flags_test.go @@ -0,0 +1,144 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package execution + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsUpdateConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementUpdateConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsUpdateConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookUpdateConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementUpdateConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_UpdateConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookUpdateConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_UpdateConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_UpdateConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_UpdateConfig(val, result)) +} + +func testDecodeRaw_UpdateConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_UpdateConfig(vStringSlice, result)) +} + +func TestUpdateConfig_GetPFlagSet(t *testing.T) { + val := UpdateConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestUpdateConfig_SetFlags(t *testing.T) { + actual := UpdateConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_archive", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("archive", testValue) + if vBool, err := cmdFlags.GetBool("archive"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Archive) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_activate", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("activate", testValue) + if vBool, err := cmdFlags.GetBool("activate"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Activate) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/update/execution.go b/flytectl/cmd/update/execution.go new file mode 100644 index 0000000000..a91653afb6 --- /dev/null +++ b/flytectl/cmd/update/execution.go @@ -0,0 +1,73 @@ +package update + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytestdlib/logger" +) + +const ( + updateExecutionShort = "Update execution status" + updateExecutionLong = ` +Activating an execution shows it in the cli and UI: +:: + + flytectl update execution -p flytectldemo -d development oeh94k9r2r --activate + +Archiving execution hides it from cli and UI: +:: + + flytectl update execution -p flytectldemo -d development oeh94k9r2r --archive + + +Usage +` +) + +func updateExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + project := config.GetConfig().Project + domain := config.GetConfig().Domain + if len(args) != 1 { + return fmt.Errorf(clierrors.ErrExecutionNotPassed) + } + executionName := args[0] + activateExec := execution.UConfig.Activate + archiveExec := execution.UConfig.Archive + if activateExec && archiveExec { + return fmt.Errorf(clierrors.ErrInvalidStateUpdate) + } + + var executionState admin.ExecutionStatus_ExecutionState + if activateExec { + executionState = admin.ExecutionStatus_EXECUTION_ACTIVE + } else if archiveExec { + executionState = admin.ExecutionStatus_EXECUTION_ARCHIVED + } + + if execution.UConfig.DryRun { + logger.Debugf(ctx, "skipping UpdateExecution request (DryRun)") + } else { + _, err := cmdCtx.AdminClient().UpdateExecution(ctx, &admin.ExecutionUpdateRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Project: project, + Domain: domain, + Name: executionName, + }, + Status: &admin.ExecutionStatus{State: executionState}, + }) + if err != nil { + fmt.Printf(clierrors.ErrFailedExecutionUpdate, executionName, err) + return err + } + } + fmt.Printf("updated execution %s successfully to state %s\n", executionName, executionState.String()) + + return nil +} diff --git a/flytectl/cmd/update/execution_test.go b/flytectl/cmd/update/execution_test.go new file mode 100644 index 0000000000..2f7e5423ba --- /dev/null +++ b/flytectl/cmd/update/execution_test.go @@ -0,0 +1,71 @@ +package update + +import ( + "fmt" + "testing" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func UpdateExecutionSetup() { + ctx = testutils.Ctx + cmdCtx = testutils.CmdCtx + mockClient = testutils.MockClient +} + +func TestExecutionUpdate(t *testing.T) { + testutils.Setup() + UpdateExecutionSetup() + args = []string{"execution1"} + // Activate + execution.UConfig.Activate = true + mockClient.OnUpdateExecutionMatch(mock.Anything, mock.Anything).Return(&admin.ExecutionUpdateResponse{}, nil) + assert.Nil(t, updateExecutionFunc(ctx, args, cmdCtx)) + // Archive + execution.UConfig.Activate = false + execution.UConfig.Archive = true + assert.Nil(t, updateExecutionFunc(ctx, args, cmdCtx)) + // Reset + execution.UConfig.Activate = false + execution.UConfig.Archive = false + + // Dry run + execution.UConfig.DryRun = true + assert.Nil(t, updateExecutionFunc(ctx, args, cmdCtx)) + mockClient.AssertNotCalled(t, "UpdateExecution", mock.Anything) + + // Reset + execution.UConfig.DryRun = false +} + +func TestExecutionUpdateValidationFailure(t *testing.T) { + testutils.Setup() + UpdateExecutionSetup() + args = []string{"execution1"} + execution.UConfig.Activate = true + execution.UConfig.Archive = true + assert.NotNil(t, updateExecutionFunc(ctx, args, cmdCtx)) + // Reset + execution.UConfig.Activate = false + execution.UConfig.Archive = false +} + +func TestExecutionUpdateFail(t *testing.T) { + testutils.Setup() + UpdateExecutionSetup() + args = []string{"execution1"} + mockClient.OnUpdateExecutionMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, updateExecutionFunc(ctx, args, cmdCtx)) +} + +func TestExecutionUpdateInvalidArgs(t *testing.T) { + testutils.Setup() + UpdateExecutionSetup() + args = []string{} + assert.NotNil(t, updateExecutionFunc(ctx, args, cmdCtx)) +} diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 60603a7dbe..57a391b2a6 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -2,6 +2,7 @@ package update import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" @@ -41,6 +42,8 @@ func CreateUpdateCommand() *cobra.Command { Short: updateLPMetaShort, Long: updateLPMetaLong}, "project": {CmdFunc: updateProjectsFunc, Aliases: []string{}, ProjectDomainNotRequired: true, PFlagProvider: DefaultProjectConfig, Short: projectShort, Long: projectLong}, + "execution": {CmdFunc: updateExecutionFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: execution.UConfig, + Short: updateExecutionShort, Long: updateExecutionLong}, "task-meta": {CmdFunc: updateTaskFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateTaskShort, Long: updateTaskLong}, "workflow-meta": {CmdFunc: updateWorkflowFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index 8cf80f3f73..b289b0a4cd 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -32,18 +32,18 @@ func TestUpdateCommand(t *testing.T) { assert.Equal(t, updateCommand.Use, updateUse) assert.Equal(t, updateCommand.Short, updateShort) assert.Equal(t, updateCommand.Long, updatecmdLong) - assert.Equal(t, len(updateCommand.Commands()), 11) + assert.Equal(t, len(updateCommand.Commands()), 12) cmdNouns := updateCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - useArray := []string{"cluster-resource-attribute", "execution-cluster-label", "execution-queue-attribute", "launchplan", + useArray := []string{"cluster-resource-attribute", "execution", "execution-cluster-label", "execution-queue-attribute", "launchplan", "launchplan-meta", "plugin-override", "project", "task-meta", "task-resource-attribute", "workflow-execution-config", "workflow-meta"} - aliases := [][]string{{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}} - shortArray := []string{clusterResourceAttributesShort, executionClusterLabelShort, executionQueueAttributesShort, updateLPShort, updateLPMetaShort, + aliases := [][]string{{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}} + shortArray := []string{clusterResourceAttributesShort, updateExecutionShort, executionClusterLabelShort, executionQueueAttributesShort, updateLPShort, updateLPMetaShort, pluginOverrideShort, projectShort, updateTaskShort, taskResourceAttributesShort, workflowExecutionConfigShort, updateWorkflowShort} - longArray := []string{clusterResourceAttributesLong, executionClusterLabelLong, executionQueueAttributesLong, updateLPLong, updateLPMetaLong, + longArray := []string{clusterResourceAttributesLong, updateExecutionLong, executionClusterLabelLong, executionQueueAttributesLong, updateLPLong, updateLPMetaLong, pluginOverrideLong, projectLong, updateTaskLong, taskResourceAttributesLong, workflowExecutionConfigLong, updateWorkflowLong} for i := range cmdNouns { assert.Equal(t, cmdNouns[i].Use, useArray[i]) diff --git a/flytectl/go.mod b/flytectl/go.mod index 19376fa17a..16f5ab8964 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -55,3 +55,5 @@ require ( k8s.io/client-go v0.21.3 sigs.k8s.io/yaml v1.2.0 ) + +replace github.com/flyteorg/flyteidl => github.com/flyteorg/flyteidl v0.21.20-0.20220111070000-bdd241a81330 diff --git a/flytectl/go.sum b/flytectl/go.sum index 9445a185c3..a32df294d5 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -354,8 +354,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.21.14 h1:uOc3u0DFkFPag5fOQ8LMmMBBZqHy19ikxShnRlRAzZ0= -github.com/flyteorg/flyteidl v0.21.14/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.21.20-0.20220111070000-bdd241a81330 h1:pHiSSq3bVs9bKTc2SVnd7oLLuEn4uyXmx54bZqGZJ5M= +github.com/flyteorg/flyteidl v0.21.20-0.20220111070000-bdd241a81330/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.4.0 h1:cEMkNfjocCuBSLzM9tKjsODhkr5gXTZAGl6k62FrT60= github.com/flyteorg/flytestdlib v0.4.0/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= From 1784a382b03dfd937a63bc55d038d275ba4a8527 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Wed, 12 Jan 2022 02:38:42 -0800 Subject: [PATCH 204/645] Update documentation (#263) Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- flytectl/docs/source/gen/flytectl_update.rst | 1 + .../source/gen/flytectl_update_execution.rst | 91 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 flytectl/docs/source/gen/flytectl_update_execution.rst diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 0e903ed9e2..e0ed691ea5 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -76,6 +76,7 @@ SEE ALSO * :doc:`flytectl` - FlyteCTL CLI tool * :doc:`flytectl_update_cluster-resource-attribute` - Update matchable resources of cluster attributes +* :doc:`flytectl_update_execution` - Update execution status * :doc:`flytectl_update_execution-cluster-label` - Update matchable resources of execution cluster label * :doc:`flytectl_update_execution-queue-attribute` - Update matchable resources of execution queue attributes * :doc:`flytectl_update_launchplan` - Update launch plan status diff --git a/flytectl/docs/source/gen/flytectl_update_execution.rst b/flytectl/docs/source/gen/flytectl_update_execution.rst new file mode 100644 index 0000000000..7bb7ebee56 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_update_execution.rst @@ -0,0 +1,91 @@ +.. _flytectl_update_execution: + +flytectl update execution +------------------------- + +Update execution status + +Synopsis +~~~~~~~~ + + + +Activating an execution shows it in the cli and UI: +:: + + flytectl update execution -p flytectldemo -d development oeh94k9r2r --activate + +Archiving execution hides it from cli and UI: +:: + + flytectl update execution -p flytectldemo -d development oeh94k9r2r --archive + + +Usage + + +:: + + flytectl update execution [flags] + +Options +~~~~~~~ + +:: + + --activate activate execution. + --archive archive execution. + --dryRun execute command without making any modifications. + -h, --help help for execution + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_update` - Update Flyte resources e.g., project. + From dec585d44621c15c235f27857066d98da87cd4af Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Thu, 20 Jan 2022 00:03:37 -0800 Subject: [PATCH 205/645] add port (#265) Signed-off-by: Yee Hing Tong --- flytectl/pkg/docker/docker_util.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 29551decab..e0edaeb148 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -85,7 +85,8 @@ func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, e "0.0.0.0:30082:30082", // Flyteadmin Port "0.0.0.0:30084:30084", // Minio API Port "0.0.0.0:30086:30086", // K8s Dashboard Port - "0.0.0.0:30087:30087", // Minio Console Port + "0.0.0.0:30087:30087", // Old Minio Console Port, keeping around for old images + "0.0.0.0:30088:30088", // Minio Console Port }) } From e6855b46329813425dfdddede6cfed9c8280549d Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Fri, 21 Jan 2022 14:05:00 +0530 Subject: [PATCH 206/645] Added endpoint suffix to service user for pkce token saved in token cache (#264) * Added endpoint suffix to service user for pkce token saved in token cache Signed-off-by: Prafulla Mahindrakar * nits Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/core/cmd.go | 3 ++- flytectl/cmd/core/cmd_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 flytectl/cmd/core/cmd_test.go diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 54483c5c8f..c1121355fb 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -58,9 +58,10 @@ func generateCommandFunc(cmdEntry CommandEntry) func(cmd *cobra.Command, args [] return err } + adminCfg := admin.GetConfig(ctx) clientSet, err := admin.ClientSetBuilder().WithConfig(admin.GetConfig(ctx)). WithTokenCache(pkce.TokenCacheKeyringProvider{ - ServiceUser: pkce.KeyRingServiceUser, + ServiceUser: fmt.Sprintf("%s:%s", adminCfg.Endpoint.String(), pkce.KeyRingServiceUser), ServiceName: pkce.KeyRingServiceName, }).Build(ctx) if err != nil { diff --git a/flytectl/cmd/core/cmd_test.go b/flytectl/cmd/core/cmd_test.go new file mode 100644 index 0000000000..f0bab3bc53 --- /dev/null +++ b/flytectl/cmd/core/cmd_test.go @@ -0,0 +1,27 @@ +package cmdcore + +import ( + "context" + "net/url" + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin" + "github.com/flyteorg/flytestdlib/config" + + "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" +) + +func testCommandFunc(ctx context.Context, args []string, cmdCtx CommandContext) error { + return nil +} + +func TestGenerateCommandFunc(t *testing.T) { + adminCfg := admin.GetConfig(context.Background()) + adminCfg.Endpoint = config.URL{URL: url.URL{Host: "dummyHost"}} + adminCfg.AuthType = admin.AuthTypePkce + rootCmd := &cobra.Command{} + cmdEntry := CommandEntry{CmdFunc: testCommandFunc, ProjectDomainNotRequired: true} + fn := generateCommandFunc(cmdEntry) + assert.Nil(t, fn(rootCmd, []string{})) +} From 6f1622ffb76f9904034192bb8c3e3ca76251d9ab Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Fri, 21 Jan 2022 16:25:19 +0530 Subject: [PATCH 207/645] update execution for state changes (#267) Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/update/execution.go | 8 ++++---- flytectl/go.mod | 4 +--- flytectl/go.sum | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/flytectl/cmd/update/execution.go b/flytectl/cmd/update/execution.go index a91653afb6..cd8a7ad209 100644 --- a/flytectl/cmd/update/execution.go +++ b/flytectl/cmd/update/execution.go @@ -44,11 +44,11 @@ func updateExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comm return fmt.Errorf(clierrors.ErrInvalidStateUpdate) } - var executionState admin.ExecutionStatus_ExecutionState + var executionState admin.ExecutionState if activateExec { - executionState = admin.ExecutionStatus_EXECUTION_ACTIVE + executionState = admin.ExecutionState_EXECUTION_ACTIVE } else if archiveExec { - executionState = admin.ExecutionStatus_EXECUTION_ARCHIVED + executionState = admin.ExecutionState_EXECUTION_ARCHIVED } if execution.UConfig.DryRun { @@ -60,7 +60,7 @@ func updateExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comm Domain: domain, Name: executionName, }, - Status: &admin.ExecutionStatus{State: executionState}, + State: executionState, }) if err != nil { fmt.Printf(clierrors.ErrFailedExecutionUpdate, executionName, err) diff --git a/flytectl/go.mod b/flytectl/go.mod index 16f5ab8964..cc8a7bb50f 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -11,7 +11,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.21.14 + github.com/flyteorg/flyteidl v0.21.24 github.com/flyteorg/flytestdlib v0.4.0 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 @@ -55,5 +55,3 @@ require ( k8s.io/client-go v0.21.3 sigs.k8s.io/yaml v1.2.0 ) - -replace github.com/flyteorg/flyteidl => github.com/flyteorg/flyteidl v0.21.20-0.20220111070000-bdd241a81330 diff --git a/flytectl/go.sum b/flytectl/go.sum index a32df294d5..9945f3089d 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -354,8 +354,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.21.20-0.20220111070000-bdd241a81330 h1:pHiSSq3bVs9bKTc2SVnd7oLLuEn4uyXmx54bZqGZJ5M= -github.com/flyteorg/flyteidl v0.21.20-0.20220111070000-bdd241a81330/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.21.24 h1:e2wPBK4aiLE+fw2zmhUDNg39QoJk6Lf5lQRvj8XgtFk= +github.com/flyteorg/flyteidl v0.21.24/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.4.0 h1:cEMkNfjocCuBSLzM9tKjsODhkr5gXTZAGl6k62FrT60= github.com/flyteorg/flytestdlib v0.4.0/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= From 0e61f13541608839270efc64a98d7e073f881b9b Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Sun, 23 Jan 2022 21:59:15 +0530 Subject: [PATCH 208/645] Migrated github methods to githubutil (#268) Signed-off-by: Yuvraj --- flytectl/cmd/register/examples.go | 13 ++++----- flytectl/cmd/register/examples_test.go | 4 +-- flytectl/cmd/register/register_util.go | 32 ++++++++++++--------- flytectl/cmd/register/register_util_test.go | 10 +++---- flytectl/pkg/util/githubutil/githubutil.go | 12 ++++++++ 5 files changed, 42 insertions(+), 29 deletions(-) diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index c27ca67409..d19641fd85 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -6,7 +6,7 @@ import ( "github.com/flyteorg/flytestdlib/logger" - "github.com/google/go-github/github" + "github.com/google/go-github/v37/github" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -31,24 +31,23 @@ Usage ) var ( - githubOrg = "flyteorg" - flytesnacksRepository = "flytesnacks" + flytesnacks = "flytesnacks" ) func registerExamplesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - var examples []github.ReleaseAsset + var examples []*github.ReleaseAsset // Deprecated checks for --k8Service deprecatedCheck(ctx, &rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.K8ServiceAccount) - examples, tag, err := getAllFlytesnacksExample(githubOrg, flytesnacksRepository, rconfig.DefaultFilesConfig.Version) + examples, tag, err := getAllExample(flytesnacks, rconfig.DefaultFilesConfig.Version) if err != nil { return err } - logger.Infof(ctx, "Register started for %s %s release https://github.com/%s/%s/releases/tag/%s", flytesnacksRepository, tag, githubOrg, flytesnacksRepository, tag) + logger.Infof(ctx, "Register started for %s %s release https://github.com/flyteorg/%s/releases/tag/%s", flytesnacks, tag, flytesnacks, tag) rconfig.DefaultFilesConfig.Archive = true - rconfig.DefaultFilesConfig.Version = tag + rconfig.DefaultFilesConfig.Version = *tag.TagName for _, v := range examples { args := []string{ *v.BrowserDownloadURL, diff --git a/flytectl/cmd/register/examples_test.go b/flytectl/cmd/register/examples_test.go index 5b38de8196..f405d44284 100644 --- a/flytectl/cmd/register/examples_test.go +++ b/flytectl/cmd/register/examples_test.go @@ -16,11 +16,11 @@ func TestRegisterExamplesFunc(t *testing.T) { func TestRegisterExamplesFuncErr(t *testing.T) { setup() registerFilesSetup() - flytesnacksRepository = "testingsnacks" + flytesnacks = "testingsnacks" args = []string{""} err := registerExamplesFunc(ctx, args, cmdCtx) // TODO (Yuvraj) make test to success after fixing flytesnacks bug assert.NotNil(t, err) - flytesnacksRepository = "flytesnacks" + flytesnacks = "flytesnacks" } diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index d8b11c8d08..30f2ae8350 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -15,13 +15,13 @@ import ( "sort" "strings" + "github.com/flyteorg/flytectl/pkg/util/githubutil" + "github.com/flyteorg/flytestdlib/contextutils" "github.com/flyteorg/flytestdlib/promutils" "github.com/flyteorg/flytestdlib/promutils/labeled" "github.com/flyteorg/flytestdlib/utils" - "github.com/google/go-github/github" - "github.com/flyteorg/flytectl/cmd/config" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -30,6 +30,7 @@ import ( "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytestdlib/logger" "github.com/flyteorg/flytestdlib/storage" + "github.com/google/go-github/v37/github" "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" @@ -541,8 +542,8 @@ func getJSONSpec(message proto.Message) string { return jsonSpec } -func filterExampleFromRelease(releases github.RepositoryRelease) []github.ReleaseAsset { - var assets []github.ReleaseAsset +func filterExampleFromRelease(releases *github.RepositoryRelease) []*github.ReleaseAsset { + var assets []*github.ReleaseAsset for _, v := range releases.Assets { isValid, _ := checkSupportedExtensionForCompress(*v.Name) if isValid { @@ -552,24 +553,27 @@ func filterExampleFromRelease(releases github.RepositoryRelease) []github.Releas return assets } -func getAllFlytesnacksExample(org, repository, version string) ([]github.ReleaseAsset, string, error) { - c := github.NewClient(nil) - opt := &github.ListOptions{Page: 1, PerPage: 1} +func getAllExample(repository, version string) ([]*github.ReleaseAsset, *github.RepositoryRelease, error) { if len(version) > 0 { - releases, _, err := c.Repositories.GetReleaseByTag(context.Background(), org, repository, version) + release, err := githubutil.CheckVersionExist(version, repository) if err != nil { - return nil, "", err + return nil, nil, err } - return filterExampleFromRelease(*releases), version, nil + return filterExampleFromRelease(release), release, nil } - releases, _, err := c.Repositories.ListReleases(context.Background(), org, repository, opt) + releases, err := githubutil.GetListRelease(repository) if err != nil { - return nil, "", err + return nil, nil, err } if len(releases) == 0 { - return nil, "", fmt.Errorf("repository doesn't have any release") + return nil, nil, fmt.Errorf("repository doesn't have any release") + } + for _, v := range releases { + if !*v.Prerelease { + return filterExampleFromRelease(v), v, nil + } } - return filterExampleFromRelease(*releases[0]), *releases[0].TagName, nil + return nil, nil, nil } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index f3af72c5ff..a711495293 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -456,19 +456,17 @@ func TestGetStorageClient(t *testing.T) { func TestGetAllFlytesnacksExample(t *testing.T) { t.Run("Failed to get manifest with wrong name", func(t *testing.T) { - _, tag, err := getAllFlytesnacksExample("no////ne", "no////ne", "") + _, _, err := getAllExample("no////ne", "") assert.NotNil(t, err) - assert.Equal(t, len(tag), 0) }) t.Run("Failed to get release", func(t *testing.T) { - _, tag, err := getAllFlytesnacksExample("flyteorg", "homebrew-tap", "") + _, _, err := getAllExample("homebrew-tap", "") assert.NotNil(t, err) - assert.Equal(t, len(tag), 0) }) t.Run("Successfully get examples", func(t *testing.T) { - assets, tag, err := getAllFlytesnacksExample("flyteorg", "flytesnacks", "v0.2.175") + assets, r, err := getAllExample("flytesnacks", "v0.2.175") assert.Nil(t, err) - assert.Greater(t, len(tag), 0) + assert.Greater(t, len(*r.TagName), 0) assert.Greater(t, len(assets), 0) }) } diff --git a/flytectl/pkg/util/githubutil/githubutil.go b/flytectl/pkg/util/githubutil/githubutil.go index ba51c160db..109b6daec1 100644 --- a/flytectl/pkg/util/githubutil/githubutil.go +++ b/flytectl/pkg/util/githubutil/githubutil.go @@ -62,6 +62,18 @@ func GetLatestVersion(repository string) (*github.RepositoryRelease, error) { return release, err } +// GetListRelease returns the list of release of provided repository +func GetListRelease(repository string) ([]*github.RepositoryRelease, error) { + client := GetGHClient() + releases, _, err := client.Repositories.ListReleases(context.Background(), owner, repository, &github.ListOptions{ + PerPage: 100, + }) + if err != nil { + return nil, err + } + return releases, err +} + func getFlytectlAssetName() string { if arch == platformutil.ArchAmd64 { arch = platformutil.ArchX86 From cfde70d50da3e12680af99002bdfd0750e2a2205 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Mon, 24 Jan 2022 15:53:45 +0530 Subject: [PATCH 209/645] Added option to update labels & description in project (#260) * wip: Add project label & description in update command Signed-off-by: Yuvraj --- flytectl/clierrors/errors.go | 5 +- .../subcommand/project/configproject_flags.go | 64 ++++++++ .../project/configproject_flags_test.go} | 114 ++++++++++---- .../subcommand/project/project_config.go | 77 +++++++++- .../subcommand/project/project_config_test.go | 27 ++++ .../subcommand/project/testdata/project.yaml | 14 ++ .../project/testdata/project_error.yaml | 1 + flytectl/cmd/create/create.go | 3 +- flytectl/cmd/create/project.go | 67 +++----- flytectl/cmd/create/project_test.go | 32 ++-- flytectl/cmd/create/projectconfig_flags.go | 60 -------- flytectl/cmd/create/type.go | 8 - flytectl/cmd/get/project.go | 4 +- flytectl/cmd/update/project.go | 96 +++++++----- flytectl/cmd/update/project_test.go | 70 ++++++--- flytectl/cmd/update/projectconfig_flags.go | 57 ------- .../cmd/update/projectconfig_flags_test.go | 144 ------------------ flytectl/cmd/update/update.go | 3 +- flytectl/doc-requirements.txt | 2 +- flytectl/pkg/util/util.go | 1 + 20 files changed, 426 insertions(+), 423 deletions(-) create mode 100755 flytectl/cmd/config/subcommand/project/configproject_flags.go rename flytectl/cmd/{create/projectconfig_flags_test.go => config/subcommand/project/configproject_flags_test.go} (57%) create mode 100644 flytectl/cmd/config/subcommand/project/project_config_test.go create mode 100644 flytectl/cmd/config/subcommand/project/testdata/project.yaml create mode 100644 flytectl/cmd/config/subcommand/project/testdata/project_error.yaml delete mode 100755 flytectl/cmd/create/projectconfig_flags.go delete mode 100644 flytectl/cmd/create/type.go delete mode 100755 flytectl/cmd/update/projectconfig_flags.go delete mode 100755 flytectl/cmd/update/projectconfig_flags_test.go diff --git a/flytectl/clierrors/errors.go b/flytectl/clierrors/errors.go index 44e7368c05..4f22acf5af 100644 --- a/flytectl/clierrors/errors.go +++ b/flytectl/clierrors/errors.go @@ -3,8 +3,9 @@ package clierrors var ( ErrInvalidStateUpdate = "Invalid state passed. Specify either activate or archive\n" - ErrProjectNotPassed = "Project not passed\n" - ErrFailedProjectUpdate = "Project %v failed to get updated to %v state due to %v\n" + ErrProjectNotPassed = "Project not passed\n" + ErrProjectNameNotPassed = "project name is required flag" + ErrFailedProjectUpdate = "Project %v failed to get updated due to %v\n" ErrLPNotPassed = "Launch plan name not passed\n" ErrLPVersionNotPassed = "Launch plan version not passed\n" //nolint diff --git a/flytectl/cmd/config/subcommand/project/configproject_flags.go b/flytectl/cmd/config/subcommand/project/configproject_flags.go new file mode 100755 index 0000000000..e0e1c75f08 --- /dev/null +++ b/flytectl/cmd/config/subcommand/project/configproject_flags.go @@ -0,0 +1,64 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package project + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (ConfigProject) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (ConfigProject) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (ConfigProject) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in ConfigProject and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg ConfigProject) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("ConfigProject", pflag.ExitOnError) + cmdFlags.StringVar(&DefaultProjectConfig.ID, fmt.Sprintf("%v%v", prefix, "id"), DefaultProjectConfig.ID, "id for the project specified as argument.") + cmdFlags.BoolVar(&DefaultProjectConfig.ActivateProject, fmt.Sprintf("%v%v", prefix, "activateProject"), DefaultProjectConfig.ActivateProject, "(Deprecated) Activates the project specified as argument. Only used in update") + cmdFlags.BoolVar(&DefaultProjectConfig.ArchiveProject, fmt.Sprintf("%v%v", prefix, "archiveProject"), DefaultProjectConfig.ArchiveProject, "(Deprecated) Archives the project specified as argument. Only used in update") + cmdFlags.BoolVar(&DefaultProjectConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), DefaultProjectConfig.Activate, "Activates the project specified as argument. Only used in update") + cmdFlags.BoolVar(&DefaultProjectConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), DefaultProjectConfig.Archive, "Archives the project specified as argument. Only used in update") + cmdFlags.StringVar(&DefaultProjectConfig.Name, fmt.Sprintf("%v%v", prefix, "name"), DefaultProjectConfig.Name, "name for the project specified as argument.") + cmdFlags.BoolVar(&DefaultProjectConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultProjectConfig.DryRun, "execute command without making any modifications.") + cmdFlags.StringVar(&DefaultProjectConfig.Description, fmt.Sprintf("%v%v", prefix, "description"), DefaultProjectConfig.Description, "description for the project specified as argument.") + cmdFlags.StringToStringVar(&DefaultProjectConfig.Labels, fmt.Sprintf("%v%v", prefix, "labels"), DefaultProjectConfig.Labels, "labels for the project specified as argument.") + cmdFlags.StringVar(&DefaultProjectConfig.File, fmt.Sprintf("%v%v", prefix, "file"), DefaultProjectConfig.File, "file for the project definition.") + return cmdFlags +} diff --git a/flytectl/cmd/create/projectconfig_flags_test.go b/flytectl/cmd/config/subcommand/project/configproject_flags_test.go similarity index 57% rename from flytectl/cmd/create/projectconfig_flags_test.go rename to flytectl/cmd/config/subcommand/project/configproject_flags_test.go index e05f201be8..abe5e1e627 100755 --- a/flytectl/cmd/create/projectconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/project/configproject_flags_test.go @@ -1,7 +1,7 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots. -package create +package project import ( "encoding/json" @@ -14,22 +14,22 @@ import ( "github.com/stretchr/testify/assert" ) -var dereferencableKindsProjectConfig = map[reflect.Kind]struct{}{ +var dereferencableKindsConfigProject = map[reflect.Kind]struct{}{ reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, } // Checks if t is a kind that can be dereferenced to get its underlying type. -func canGetElementProjectConfig(t reflect.Kind) bool { - _, exists := dereferencableKindsProjectConfig[t] +func canGetElementConfigProject(t reflect.Kind) bool { + _, exists := dereferencableKindsConfigProject[t] return exists } // This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the // object. Otherwise, it'll just pass on the original data. -func jsonUnmarshalerHookProjectConfig(_, to reflect.Type, data interface{}) (interface{}, error) { +func jsonUnmarshalerHookConfigProject(_, to reflect.Type, data interface{}) (interface{}, error) { unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || - (canGetElementProjectConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + (canGetElementConfigProject(to.Kind()) && to.Elem().Implements(unmarshalerType)) { raw, err := json.Marshal(data) if err != nil { @@ -50,7 +50,7 @@ func jsonUnmarshalerHookProjectConfig(_, to reflect.Type, data interface{}) (int return data, nil } -func decode_ProjectConfig(input, result interface{}) error { +func decode_ConfigProject(input, result interface{}) error { config := &mapstructure.DecoderConfig{ TagName: "json", WeaklyTypedInput: true, @@ -58,7 +58,7 @@ func decode_ProjectConfig(input, result interface{}) error { DecodeHook: mapstructure.ComposeDecodeHookFunc( mapstructure.StringToTimeDurationHookFunc(), mapstructure.StringToSliceHookFunc(","), - jsonUnmarshalerHookProjectConfig, + jsonUnmarshalerHookConfigProject, ), } @@ -70,7 +70,7 @@ func decode_ProjectConfig(input, result interface{}) error { return decoder.Decode(input) } -func join_ProjectConfig(arr interface{}, sep string) string { +func join_ConfigProject(arr interface{}, sep string) string { listValue := reflect.ValueOf(arr) strs := make([]string, 0, listValue.Len()) for i := 0; i < listValue.Len(); i++ { @@ -80,22 +80,22 @@ func join_ProjectConfig(arr interface{}, sep string) string { return strings.Join(strs, sep) } -func testDecodeJson_ProjectConfig(t *testing.T, val, result interface{}) { - assert.NoError(t, decode_ProjectConfig(val, result)) +func testDecodeJson_ConfigProject(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_ConfigProject(val, result)) } -func testDecodeRaw_ProjectConfig(t *testing.T, vStringSlice, result interface{}) { - assert.NoError(t, decode_ProjectConfig(vStringSlice, result)) +func testDecodeRaw_ConfigProject(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_ConfigProject(vStringSlice, result)) } -func TestProjectConfig_GetPFlagSet(t *testing.T) { - val := ProjectConfig{} +func TestConfigProject_GetPFlagSet(t *testing.T) { + val := ConfigProject{} cmdFlags := val.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) } -func TestProjectConfig_SetFlags(t *testing.T) { - actual := ProjectConfig{} +func TestConfigProject_SetFlags(t *testing.T) { + actual := ConfigProject{} cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) @@ -106,7 +106,63 @@ func TestProjectConfig_SetFlags(t *testing.T) { cmdFlags.Set("id", testValue) if vString, err := cmdFlags.GetString("id"); err == nil { - testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vString), &actual.ID) + testDecodeJson_ConfigProject(t, fmt.Sprintf("%v", vString), &actual.ID) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_activateProject", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("activateProject", testValue) + if vBool, err := cmdFlags.GetBool("activateProject"); err == nil { + testDecodeJson_ConfigProject(t, fmt.Sprintf("%v", vBool), &actual.ActivateProject) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_archiveProject", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("archiveProject", testValue) + if vBool, err := cmdFlags.GetBool("archiveProject"); err == nil { + testDecodeJson_ConfigProject(t, fmt.Sprintf("%v", vBool), &actual.ArchiveProject) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_activate", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("activate", testValue) + if vBool, err := cmdFlags.GetBool("activate"); err == nil { + testDecodeJson_ConfigProject(t, fmt.Sprintf("%v", vBool), &actual.Activate) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_archive", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("archive", testValue) + if vBool, err := cmdFlags.GetBool("archive"); err == nil { + testDecodeJson_ConfigProject(t, fmt.Sprintf("%v", vBool), &actual.Archive) } else { assert.FailNow(t, err.Error()) @@ -120,21 +176,21 @@ func TestProjectConfig_SetFlags(t *testing.T) { cmdFlags.Set("name", testValue) if vString, err := cmdFlags.GetString("name"); err == nil { - testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vString), &actual.Name) + testDecodeJson_ConfigProject(t, fmt.Sprintf("%v", vString), &actual.Name) } else { assert.FailNow(t, err.Error()) } }) }) - t.Run("Test_file", func(t *testing.T) { + t.Run("Test_dryRun", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("file", testValue) - if vString, err := cmdFlags.GetString("file"); err == nil { - testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vString), &actual.File) + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_ConfigProject(t, fmt.Sprintf("%v", vBool), &actual.DryRun) } else { assert.FailNow(t, err.Error()) @@ -148,7 +204,7 @@ func TestProjectConfig_SetFlags(t *testing.T) { cmdFlags.Set("description", testValue) if vString, err := cmdFlags.GetString("description"); err == nil { - testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vString), &actual.Description) + testDecodeJson_ConfigProject(t, fmt.Sprintf("%v", vString), &actual.Description) } else { assert.FailNow(t, err.Error()) @@ -162,21 +218,21 @@ func TestProjectConfig_SetFlags(t *testing.T) { cmdFlags.Set("labels", testValue) if vStringToString, err := cmdFlags.GetStringToString("labels"); err == nil { - testDecodeRaw_ProjectConfig(t, vStringToString, &actual.Labels) + testDecodeRaw_ConfigProject(t, vStringToString, &actual.Labels) } else { assert.FailNow(t, err.Error()) } }) }) - t.Run("Test_dryRun", func(t *testing.T) { + t.Run("Test_file", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("dryRun", testValue) - if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { - testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + cmdFlags.Set("file", testValue) + if vString, err := cmdFlags.GetString("file"); err == nil { + testDecodeJson_ConfigProject(t, fmt.Sprintf("%v", vString), &actual.File) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go index 8692a746cd..87b9d190ed 100644 --- a/flytectl/cmd/config/subcommand/project/project_config.go +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -1,7 +1,14 @@ package project import ( + "fmt" + "io/ioutil" + + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/pkg/filters" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "gopkg.in/yaml.v2" ) //go:generate pflags Config --default-var DefaultConfig --bind-default-var @@ -11,7 +18,75 @@ var ( } ) -// Config +// Config holds the flag for get project type Config struct { Filter filters.Filters `json:"filter" pflag:","` } + +//go:generate pflags ConfigProject --default-var DefaultProjectConfig --bind-default-var + +// ConfigProject hold configuration for project update flags. +type ConfigProject struct { + ID string `json:"id" pflag:",id for the project specified as argument."` + ActivateProject bool `json:"activateProject" pflag:",(Deprecated) Activates the project specified as argument. Only used in update"` + ArchiveProject bool `json:"archiveProject" pflag:",(Deprecated) Archives the project specified as argument. Only used in update"` + Activate bool `json:"activate" pflag:",Activates the project specified as argument. Only used in update"` + Archive bool `json:"archive" pflag:",Archives the project specified as argument. Only used in update"` + Name string `json:"name" pflag:",name for the project specified as argument."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Description string `json:"description" pflag:",description for the project specified as argument."` + Labels map[string]string `json:"labels" pflag:",labels for the project specified as argument."` + File string `json:"file" pflag:",file for the project definition."` +} + +var DefaultProjectConfig = &ConfigProject{ + Description: "", + Labels: map[string]string{}, +} + +//GetProjectSpec return project spec from a file/flags +func (c *ConfigProject) GetProjectSpec(id string) (*admin.Project, error) { + projectSpec := admin.Project{} + if len(c.File) > 0 { + yamlFile, err := ioutil.ReadFile(c.File) + if err != nil { + return nil, err + } + err = yaml.Unmarshal(yamlFile, &projectSpec) + if err != nil { + return nil, err + } + return &projectSpec, nil + } + + projectSpec.Id = id + projectSpec.Name = c.Name + projectSpec.Description = c.Description + projectSpec.Labels = &admin.Labels{ + Values: c.Labels, + } + return &projectSpec, nil +} + +//MapToAdminState return project spec from a file/flags +func (c *ConfigProject) MapToAdminState() (admin.Project_ProjectState, error) { + if c.ActivateProject { + c.Activate = c.ActivateProject + } + if c.ArchiveProject { + c.Archive = c.ArchiveProject + } + + activate := c.Activate + archive := c.Archive + + if activate || archive { + if activate == archive { + return admin.Project_ACTIVE, fmt.Errorf(clierrors.ErrInvalidStateUpdate) + } + if archive { + return admin.Project_ARCHIVED, nil + } + } + return admin.Project_ACTIVE, nil +} diff --git a/flytectl/cmd/config/subcommand/project/project_config_test.go b/flytectl/cmd/config/subcommand/project/project_config_test.go new file mode 100644 index 0000000000..fdad3cc33a --- /dev/null +++ b/flytectl/cmd/config/subcommand/project/project_config_test.go @@ -0,0 +1,27 @@ +package project + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGetProjectSpec(t *testing.T) { + t.Run("Successful get project spec", func(t *testing.T) { + c := &ConfigProject{ + Name: "flytesnacks", + } + response, err := c.GetProjectSpec("flytesnacks") + assert.Nil(t, err) + assert.NotNil(t, response) + }) + t.Run("Successful get request spec from file", func(t *testing.T) { + c := &ConfigProject{ + File: "testdata/project.yaml", + } + response, err := c.GetProjectSpec("flytesnacks") + assert.Nil(t, err) + assert.Equal(t, "flytesnacks", response.Name) + assert.Equal(t, "flytesnacks test", response.Description) + }) +} diff --git a/flytectl/cmd/config/subcommand/project/testdata/project.yaml b/flytectl/cmd/config/subcommand/project/testdata/project.yaml new file mode 100644 index 0000000000..8b5fd32841 --- /dev/null +++ b/flytectl/cmd/config/subcommand/project/testdata/project.yaml @@ -0,0 +1,14 @@ +description: flytesnacks test +domains: + - id: development + name: development + - id: staging + name: staging + - id: production + name: production +id: flytesnacks +labels: + values: + team: flytesnacks +name: flytesnacks + diff --git a/flytectl/cmd/config/subcommand/project/testdata/project_error.yaml b/flytectl/cmd/config/subcommand/project/testdata/project_error.yaml new file mode 100644 index 0000000000..0b7088ec63 --- /dev/null +++ b/flytectl/cmd/config/subcommand/project/testdata/project_error.yaml @@ -0,0 +1 @@ +Data diff --git a/flytectl/cmd/create/create.go b/flytectl/cmd/create/create.go index 54ad53cf22..20cbefb54e 100644 --- a/flytectl/cmd/create/create.go +++ b/flytectl/cmd/create/create.go @@ -1,6 +1,7 @@ package create import ( + "github.com/flyteorg/flytectl/cmd/config/subcommand/project" cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" @@ -25,7 +26,7 @@ func RemoteCreateCommand() *cobra.Command { Long: createCmdLong, } createResourcesFuncs := map[string]cmdcore.CommandEntry{ - "project": {CmdFunc: createProjectsCommand, Aliases: []string{"projects"}, ProjectDomainNotRequired: true, PFlagProvider: projectConfig, Short: projectShort, + "project": {CmdFunc: createProjectsCommand, Aliases: []string{"projects"}, ProjectDomainNotRequired: true, PFlagProvider: project.DefaultProjectConfig, Short: projectShort, Long: projectLong}, "execution": {CmdFunc: createExecutionCommand, Aliases: []string{"executions"}, ProjectDomainNotRequired: false, PFlagProvider: executionConfig, Short: executionShort, Long: executionLong}, diff --git a/flytectl/cmd/create/project.go b/flytectl/cmd/create/project.go index dec5a7322d..9cc2ecf68a 100644 --- a/flytectl/cmd/create/project.go +++ b/flytectl/cmd/create/project.go @@ -3,10 +3,12 @@ package create import ( "context" "fmt" - "io/ioutil" + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/project" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "gopkg.in/yaml.v2" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytestdlib/logger" @@ -31,65 +33,34 @@ Create a project by definition file. Note: The name shouldn't contain any whites id: "project-unique-id" name: "Name" labels: - app: flyte + values: + app: flyte description: "Some description for the project" ` ) -//go:generate pflags ProjectConfig --default-var projectConfig --bind-default-var - -// ProjectConfig Config hold configuration for project create flags. -type ProjectConfig struct { - ID string `json:"id" pflag:",id for the project specified as argument."` - Name string `json:"name" pflag:",name for the project specified as argument."` - File string `json:"file" pflag:",file for the project definition."` - Description string `json:"description" pflag:",description for the project specified as argument."` - Labels map[string]string `json:"labels" pflag:",labels for the project specified as argument."` - DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` -} - -var ( - projectConfig = &ProjectConfig{ - Description: "", - Labels: map[string]string{}, - } -) - func createProjectsCommand(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - project := projectDefinition{} - if projectConfig.File != "" { - yamlFile, err := ioutil.ReadFile(projectConfig.File) - if err != nil { - return err - } - err = yaml.Unmarshal(yamlFile, &project) - if err != nil { - return err - } - } else { - project.ID = projectConfig.ID - project.Name = projectConfig.Name - project.Description = projectConfig.Description - project.Labels = projectConfig.Labels + projectSpec, err := project.DefaultProjectConfig.GetProjectSpec(config.GetConfig().Project) + if err != nil { + return err } - if project.ID == "" { - return fmt.Errorf("project ID is required flag") + if projectSpec.Id == "" { + return fmt.Errorf(clierrors.ErrProjectNotPassed) } - if project.Name == "" { - return fmt.Errorf("project name is required flag") + if projectSpec.Name == "" { + return fmt.Errorf(clierrors.ErrProjectNameNotPassed) } - if projectConfig.DryRun { + + if project.DefaultProjectConfig.DryRun { logger.Debugf(ctx, "skipping RegisterProject request (DryRun)") } else { _, err := cmdCtx.AdminClient().RegisterProject(ctx, &admin.ProjectRegisterRequest{ Project: &admin.Project{ - Id: project.ID, - Name: project.Name, - Description: project.Description, - Labels: &admin.Labels{ - Values: project.Labels, - }, + Id: projectSpec.Id, + Name: projectSpec.Name, + Description: projectSpec.Description, + Labels: projectSpec.Labels, }, }) if err != nil { diff --git a/flytectl/cmd/create/project_test.go b/flytectl/cmd/create/project_test.go index 8f4bb309b0..ef55e5b365 100644 --- a/flytectl/cmd/create/project_test.go +++ b/flytectl/cmd/create/project_test.go @@ -1,9 +1,14 @@ package create import ( + "errors" "fmt" "testing" + "github.com/flyteorg/flytectl/clierrors" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/project" + "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -31,19 +36,19 @@ func createProjectSetup() { }, }, } - projectConfig.ID = "" - projectConfig.Name = "" - projectConfig.Labels = map[string]string{} - projectConfig.Description = "" + project.DefaultProjectConfig.ID = "" + project.DefaultProjectConfig.Name = "" + project.DefaultProjectConfig.Labels = map[string]string{} + project.DefaultProjectConfig.Description = "" } func TestCreateProjectFunc(t *testing.T) { setup() createProjectSetup() defer tearDownAndVerify(t, "project Created successfully") - projectConfig.ID = projectValue - projectConfig.Name = projectValue - projectConfig.Labels = map[string]string{} - projectConfig.Description = "" + project.DefaultProjectConfig.ID = projectValue + project.DefaultProjectConfig.Name = projectValue + project.DefaultProjectConfig.Labels = map[string]string{} + project.DefaultProjectConfig.Description = "" mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) err := createProjectsCommand(ctx, args, cmdCtx) assert.Nil(t, err) @@ -54,11 +59,10 @@ func TestEmptyProjectID(t *testing.T) { setup() createProjectSetup() defer tearDownAndVerify(t, "") - projectConfig.Name = projectValue - projectConfig.Labels = map[string]string{} + project.DefaultProjectConfig = &project.ConfigProject{} mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) err := createProjectsCommand(ctx, args, cmdCtx) - assert.Equal(t, fmt.Errorf("project ID is required flag"), err) + assert.Equal(t, errors.New(clierrors.ErrProjectNameNotPassed), err) mockClient.AssertNotCalled(t, "RegisterProject", ctx, mock.Anything) } @@ -66,9 +70,9 @@ func TestEmptyProjectName(t *testing.T) { setup() createProjectSetup() defer tearDownAndVerify(t, "") - projectConfig.ID = projectValue - projectConfig.Labels = map[string]string{} - projectConfig.Description = "" + project.DefaultProjectConfig.ID = projectValue + project.DefaultProjectConfig.Labels = map[string]string{} + project.DefaultProjectConfig.Description = "" mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) err := createProjectsCommand(ctx, args, cmdCtx) assert.Equal(t, fmt.Errorf("project name is required flag"), err) diff --git a/flytectl/cmd/create/projectconfig_flags.go b/flytectl/cmd/create/projectconfig_flags.go deleted file mode 100755 index b9e0c0607c..0000000000 --- a/flytectl/cmd/create/projectconfig_flags.go +++ /dev/null @@ -1,60 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package create - -import ( - "encoding/json" - "reflect" - - "fmt" - - "github.com/spf13/pflag" -) - -// If v is a pointer, it will get its element value or the zero value of the element type. -// If v is not a pointer, it will return it as is. -func (ProjectConfig) elemValueOrNil(v interface{}) interface{} { - if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { - if reflect.ValueOf(v).IsNil() { - return reflect.Zero(t.Elem()).Interface() - } else { - return reflect.ValueOf(v).Interface() - } - } else if v == nil { - return reflect.Zero(t).Interface() - } - - return v -} - -func (ProjectConfig) mustJsonMarshal(v interface{}) string { - raw, err := json.Marshal(v) - if err != nil { - panic(err) - } - - return string(raw) -} - -func (ProjectConfig) mustMarshalJSON(v json.Marshaler) string { - raw, err := v.MarshalJSON() - if err != nil { - panic(err) - } - - return string(raw) -} - -// GetPFlagSet will return strongly types pflags for all fields in ProjectConfig and its nested types. The format of the -// flags is json-name.json-sub-name... etc. -func (cfg ProjectConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("ProjectConfig", pflag.ExitOnError) - cmdFlags.StringVar(&projectConfig.ID, fmt.Sprintf("%v%v", prefix, "id"), projectConfig.ID, "id for the project specified as argument.") - cmdFlags.StringVar(&projectConfig.Name, fmt.Sprintf("%v%v", prefix, "name"), projectConfig.Name, "name for the project specified as argument.") - cmdFlags.StringVar(&projectConfig.File, fmt.Sprintf("%v%v", prefix, "file"), projectConfig.File, "file for the project definition.") - cmdFlags.StringVar(&projectConfig.Description, fmt.Sprintf("%v%v", prefix, "description"), projectConfig.Description, "description for the project specified as argument.") - cmdFlags.StringToStringVar(&projectConfig.Labels, fmt.Sprintf("%v%v", prefix, "labels"), projectConfig.Labels, "labels for the project specified as argument.") - cmdFlags.BoolVar(&projectConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), projectConfig.DryRun, "execute command without making any modifications.") - return cmdFlags -} diff --git a/flytectl/cmd/create/type.go b/flytectl/cmd/create/type.go deleted file mode 100644 index 61709eb6ef..0000000000 --- a/flytectl/cmd/create/type.go +++ /dev/null @@ -1,8 +0,0 @@ -package create - -type projectDefinition struct { - ID string `yaml:"id"` - Name string `yaml:"name"` - Description string `yaml:"description"` - Labels map[string]string `yaml:"labels"` -} diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 8855b020b2..03f1826059 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -82,10 +82,10 @@ func getProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC } if len(args) == 1 { - name := args[0] + id := args[0] logger.Debugf(ctx, "Retrieved %v projects", len(projects.Projects)) for _, v := range projects.Projects { - if v.Name == name { + if v.Id == id { err := adminPrinter.Print(config.GetConfig().MustOutputFormat(), projectColumns, v) if err != nil { return err diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 330afe395c..fd5ff592ff 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -4,23 +4,14 @@ import ( "context" "fmt" - "github.com/flyteorg/flytectl/clierrors" - "github.com/flyteorg/flytectl/cmd/config" + + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config/subcommand/project" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" ) -//go:generate pflags ProjectConfig --default-var DefaultProjectConfig --bind-default-var - -// Config hold configuration for project update flags. -type ProjectConfig struct { - ActivateProject bool `json:"activateProject" pflag:",Activates the project specified as argument."` - ArchiveProject bool `json:"archiveProject" pflag:",Archives the project specified as argument."` - DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` -} - const ( projectShort = "Update project resources" projectLong = ` @@ -28,65 +19,96 @@ Updates the project according to the flags passed. Allows you to archive or acti Activate project flytesnacks: :: - flytectl update project -p flytesnacks --activateProject + flytectl update project -p flytesnacks --activate Archive project flytesnacks: :: - flytectl update project -p flytesnacks --archiveProject + flytectl update project -p flytesnacks --archive Incorrect usage when passing both archive and activate: :: - flytectl update project flytesnacks --archiveProject --activateProject + flytectl update project -p flytesnacks --archiveProject --activate Incorrect usage when passing unknown-project: +:: + + flytectl update project unknown-project --archive + +project ID is required flag + :: flytectl update project unknown-project --archiveProject -Incorrect usage when passing valid project using -p option: +Update projects.(project/projects can be used interchangeably in these commands) + +:: + + flytectl update project -p flytesnacks --description "flytesnacks description" --labels app=flyte + +Update a project by definition file. Note: The name shouldn't contain any whitespace characters. +:: + + flytectl update project --file project.yaml + +.. code-block:: yaml + id: "project-unique-id" + name: "Name" + labels: + values: + app: flyte + description: "Some description for the project" + +Update a project state by definition file. Note: The name shouldn't contain any whitespace characters. :: - flytectl update project unknown-project --archiveProject -p known-project + flytectl update project --file project.yaml --archive + +.. code-block:: yaml + + id: "project-unique-id" + name: "Name" + labels: + values: + app: flyte + description: "Some description for the project" Usage ` ) -var DefaultProjectConfig = &ProjectConfig{} - func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - id := config.GetConfig().Project - if id == "" { - fmt.Printf(clierrors.ErrProjectNotPassed) - return nil + projectSpec, err := project.DefaultProjectConfig.GetProjectSpec(config.GetConfig().Project) + if err != nil { + return err + } + if projectSpec.Id == "" { + return fmt.Errorf(clierrors.ErrProjectNotPassed) } - archiveProject := DefaultProjectConfig.ArchiveProject - activateProject := DefaultProjectConfig.ActivateProject - if activateProject == archiveProject { - return fmt.Errorf(clierrors.ErrInvalidStateUpdate) + if projectSpec.Name == "" { + return fmt.Errorf(clierrors.ErrProjectNameNotPassed) } - projectState := admin.Project_ACTIVE - if archiveProject { - projectState = admin.Project_ARCHIVED + + state, err := project.DefaultProjectConfig.MapToAdminState() + if err != nil { + return err } - if DefaultProjectConfig.DryRun { + projectSpec.State = state + if project.DefaultProjectConfig.DryRun { logger.Infof(ctx, "skipping UpdateProject request (dryRun)") } else { - _, err := cmdCtx.AdminClient().UpdateProject(ctx, &admin.Project{ - Id: id, - State: projectState, - }) + _, err := cmdCtx.AdminClient().UpdateProject(ctx, projectSpec) if err != nil { - fmt.Printf(clierrors.ErrFailedProjectUpdate, id, projectState, err) + fmt.Printf(clierrors.ErrFailedProjectUpdate, projectSpec.Id, err) return err } } - fmt.Printf("Project %v updated to %v state\n", id, projectState) + fmt.Printf("Project %v updated\n", projectSpec.Id) return nil } diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index 9db9f8cf46..b6b16702b6 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -5,6 +5,8 @@ import ( "fmt" "testing" + "github.com/flyteorg/flytectl/cmd/config/subcommand/project" + "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" u "github.com/flyteorg/flytectl/cmd/testutils" @@ -37,75 +39,107 @@ func modifyProjectFlags(archiveProject *bool, newArchiveVal bool, activateProjec func TestActivateProjectFunc(t *testing.T) { setup() updateProjectSetup() - modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), false, &(DefaultProjectConfig.ActivateProject), true) + config.GetConfig().Project = projectValue + project.DefaultProjectConfig.Name = projectValue + modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), false, &(project.DefaultProjectConfig.ActivateProject), true) + projectUpdateRequest = &admin.Project{ + Id: projectValue, + Name: projectValue, + Labels: &admin.Labels{ + Values: map[string]string{}, + }, + State: admin.Project_ACTIVE, + } mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) err = updateProjectsFunc(ctx, args, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project dummyProject updated to ACTIVE state\n") + tearDownAndVerify(t, "Project dummyProject updated\n") } func TestActivateProjectFuncWithError(t *testing.T) { setup() updateProjectSetup() - modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), false, &(DefaultProjectConfig.ActivateProject), true) + config.GetConfig().Project = projectValue + project.DefaultProjectConfig.Name = projectValue + modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), false, &(project.DefaultProjectConfig.ActivateProject), true) + projectUpdateRequest = &admin.Project{ + Id: projectValue, + Name: projectValue, + Labels: &admin.Labels{ + Values: map[string]string{}, + }, + State: admin.Project_ACTIVE, + } mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) err = updateProjectsFunc(ctx, args, cmdCtx) assert.NotNil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project dummyProject failed to get updated to ACTIVE state due to Error Updating Project\n") + tearDownAndVerify(t, "Project dummyProject failed to get updated due to Error Updating Project\n") } func TestArchiveProjectFunc(t *testing.T) { setup() updateProjectSetup() - modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), true, &(DefaultProjectConfig.ActivateProject), false) + config.GetConfig().Project = projectValue + project.DefaultProjectConfig = &project.ConfigProject{} + project.DefaultProjectConfig.Name = projectValue + modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), true, &(project.DefaultProjectConfig.ActivateProject), false) projectUpdateRequest = &admin.Project{ - Id: projectValue, + Id: projectValue, + Name: projectValue, + Labels: &admin.Labels{ + Values: nil, + }, State: admin.Project_ARCHIVED, } mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) err = updateProjectsFunc(ctx, args, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project dummyProject updated to ARCHIVED state\n") + tearDownAndVerify(t, "Project dummyProject updated\n") } func TestArchiveProjectFuncWithError(t *testing.T) { setup() updateProjectSetup() - modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), true, &(DefaultProjectConfig.ActivateProject), false) + project.DefaultProjectConfig.Name = projectValue + project.DefaultProjectConfig.Labels = map[string]string{} + modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), true, &(project.DefaultProjectConfig.ActivateProject), false) projectUpdateRequest = &admin.Project{ - Id: projectValue, + Id: projectValue, + Name: projectValue, + Labels: &admin.Labels{ + Values: map[string]string{}, + }, State: admin.Project_ARCHIVED, } mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) err = updateProjectsFunc(ctx, args, cmdCtx) assert.NotNil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project dummyProject failed to get updated to ARCHIVED state due to Error Updating Project\n") + tearDownAndVerify(t, "Project dummyProject failed to get updated"+ + " due to Error Updating Project\n") } func TestEmptyProjectInput(t *testing.T) { setup() updateProjectSetup() config.GetConfig().Project = "" - modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), false, &(DefaultProjectConfig.ActivateProject), true) - mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) + modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), false, &(project.DefaultProjectConfig.ActivateProject), true) err = updateProjectsFunc(ctx, args, cmdCtx) - assert.Nil(t, err) - mockClient.AssertNotCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project not passed") + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf(clierrors.ErrProjectNotPassed), err) } func TestInvalidInput(t *testing.T) { setup() updateProjectSetup() - modifyProjectFlags(&(DefaultProjectConfig.ArchiveProject), false, &(DefaultProjectConfig.ActivateProject), false) - mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) + config.GetConfig().Project = projectValue + project.DefaultProjectConfig.Name = projectValue + modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), true, &(project.DefaultProjectConfig.ActivateProject), true) err = updateProjectsFunc(ctx, args, cmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf(clierrors.ErrInvalidStateUpdate), err) - mockClient.AssertNotCalled(t, "UpdateProject", ctx, projectUpdateRequest) tearDownAndVerify(t, "") } diff --git a/flytectl/cmd/update/projectconfig_flags.go b/flytectl/cmd/update/projectconfig_flags.go deleted file mode 100755 index 9c700f5e7c..0000000000 --- a/flytectl/cmd/update/projectconfig_flags.go +++ /dev/null @@ -1,57 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package update - -import ( - "encoding/json" - "reflect" - - "fmt" - - "github.com/spf13/pflag" -) - -// If v is a pointer, it will get its element value or the zero value of the element type. -// If v is not a pointer, it will return it as is. -func (ProjectConfig) elemValueOrNil(v interface{}) interface{} { - if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { - if reflect.ValueOf(v).IsNil() { - return reflect.Zero(t.Elem()).Interface() - } else { - return reflect.ValueOf(v).Interface() - } - } else if v == nil { - return reflect.Zero(t).Interface() - } - - return v -} - -func (ProjectConfig) mustJsonMarshal(v interface{}) string { - raw, err := json.Marshal(v) - if err != nil { - panic(err) - } - - return string(raw) -} - -func (ProjectConfig) mustMarshalJSON(v json.Marshaler) string { - raw, err := v.MarshalJSON() - if err != nil { - panic(err) - } - - return string(raw) -} - -// GetPFlagSet will return strongly types pflags for all fields in ProjectConfig and its nested types. The format of the -// flags is json-name.json-sub-name... etc. -func (cfg ProjectConfig) GetPFlagSet(prefix string) *pflag.FlagSet { - cmdFlags := pflag.NewFlagSet("ProjectConfig", pflag.ExitOnError) - cmdFlags.BoolVar(&DefaultProjectConfig.ActivateProject, fmt.Sprintf("%v%v", prefix, "activateProject"), DefaultProjectConfig.ActivateProject, "Activates the project specified as argument.") - cmdFlags.BoolVar(&DefaultProjectConfig.ArchiveProject, fmt.Sprintf("%v%v", prefix, "archiveProject"), DefaultProjectConfig.ArchiveProject, "Archives the project specified as argument.") - cmdFlags.BoolVar(&DefaultProjectConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultProjectConfig.DryRun, "execute command without making any modifications.") - return cmdFlags -} diff --git a/flytectl/cmd/update/projectconfig_flags_test.go b/flytectl/cmd/update/projectconfig_flags_test.go deleted file mode 100755 index cfcf48b4c4..0000000000 --- a/flytectl/cmd/update/projectconfig_flags_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package update - -import ( - "encoding/json" - "fmt" - "reflect" - "strings" - "testing" - - "github.com/mitchellh/mapstructure" - "github.com/stretchr/testify/assert" -) - -var dereferencableKindsProjectConfig = map[reflect.Kind]struct{}{ - reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, -} - -// Checks if t is a kind that can be dereferenced to get its underlying type. -func canGetElementProjectConfig(t reflect.Kind) bool { - _, exists := dereferencableKindsProjectConfig[t] - return exists -} - -// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the -// object. Otherwise, it'll just pass on the original data. -func jsonUnmarshalerHookProjectConfig(_, to reflect.Type, data interface{}) (interface{}, error) { - unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() - if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || - (canGetElementProjectConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { - - raw, err := json.Marshal(data) - if err != nil { - fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) - return data, nil - } - - res := reflect.New(to).Interface() - err = json.Unmarshal(raw, &res) - if err != nil { - fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) - return data, nil - } - - return res, nil - } - - return data, nil -} - -func decode_ProjectConfig(input, result interface{}) error { - config := &mapstructure.DecoderConfig{ - TagName: "json", - WeaklyTypedInput: true, - Result: result, - DecodeHook: mapstructure.ComposeDecodeHookFunc( - mapstructure.StringToTimeDurationHookFunc(), - mapstructure.StringToSliceHookFunc(","), - jsonUnmarshalerHookProjectConfig, - ), - } - - decoder, err := mapstructure.NewDecoder(config) - if err != nil { - return err - } - - return decoder.Decode(input) -} - -func join_ProjectConfig(arr interface{}, sep string) string { - listValue := reflect.ValueOf(arr) - strs := make([]string, 0, listValue.Len()) - for i := 0; i < listValue.Len(); i++ { - strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) - } - - return strings.Join(strs, sep) -} - -func testDecodeJson_ProjectConfig(t *testing.T, val, result interface{}) { - assert.NoError(t, decode_ProjectConfig(val, result)) -} - -func testDecodeRaw_ProjectConfig(t *testing.T, vStringSlice, result interface{}) { - assert.NoError(t, decode_ProjectConfig(vStringSlice, result)) -} - -func TestProjectConfig_GetPFlagSet(t *testing.T) { - val := ProjectConfig{} - cmdFlags := val.GetPFlagSet("") - assert.True(t, cmdFlags.HasFlags()) -} - -func TestProjectConfig_SetFlags(t *testing.T) { - actual := ProjectConfig{} - cmdFlags := actual.GetPFlagSet("") - assert.True(t, cmdFlags.HasFlags()) - - t.Run("Test_activateProject", func(t *testing.T) { - - t.Run("Override", func(t *testing.T) { - testValue := "1" - - cmdFlags.Set("activateProject", testValue) - if vBool, err := cmdFlags.GetBool("activateProject"); err == nil { - testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vBool), &actual.ActivateProject) - - } else { - assert.FailNow(t, err.Error()) - } - }) - }) - t.Run("Test_archiveProject", func(t *testing.T) { - - t.Run("Override", func(t *testing.T) { - testValue := "1" - - cmdFlags.Set("archiveProject", testValue) - if vBool, err := cmdFlags.GetBool("archiveProject"); err == nil { - testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vBool), &actual.ArchiveProject) - - } else { - assert.FailNow(t, err.Error()) - } - }) - }) - t.Run("Test_dryRun", func(t *testing.T) { - - t.Run("Override", func(t *testing.T) { - testValue := "1" - - cmdFlags.Set("dryRun", testValue) - if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { - testDecodeJson_ProjectConfig(t, fmt.Sprintf("%v", vBool), &actual.DryRun) - - } else { - assert.FailNow(t, err.Error()) - } - }) - }) -} diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 57a391b2a6..ef1c2b66a8 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -7,6 +7,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" + "github.com/flyteorg/flytectl/cmd/config/subcommand/project" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -40,7 +41,7 @@ func CreateUpdateCommand() *cobra.Command { Short: updateLPShort, Long: updateLPLong}, "launchplan-meta": {CmdFunc: updateLPMetaFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateLPMetaShort, Long: updateLPMetaLong}, - "project": {CmdFunc: updateProjectsFunc, Aliases: []string{}, ProjectDomainNotRequired: true, PFlagProvider: DefaultProjectConfig, + "project": {CmdFunc: updateProjectsFunc, Aliases: []string{}, ProjectDomainNotRequired: true, PFlagProvider: project.DefaultProjectConfig, Short: projectShort, Long: projectLong}, "execution": {CmdFunc: updateExecutionFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: execution.UConfig, Short: updateExecutionShort, Long: updateExecutionLong}, diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index 549d2907c6..f0ff7cad16 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -23,7 +23,7 @@ docutils==0.17.1 # via # sphinx # sphinx-panels -git+https://github.com/flyteorg/furo@main +furo @ git+https://github.com/flyteorg/furo@main # via -r doc-requirements.in idna==3.3 # via requests diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index 9dbc7e7c62..31c01db225 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -5,6 +5,7 @@ import ( "io" "io/ioutil" "net/http" + "os" "strings" From f72902eeb666e9775a8fe4d1898391004a105faf Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Mon, 24 Jan 2022 07:34:08 -0800 Subject: [PATCH 210/645] Update documentation (#270) Signed-off-by: Flyte-Bot Co-authored-by: evalsocket --- .../source/gen/flytectl_create_project.rst | 7 ++- .../source/gen/flytectl_update_project.rst | 59 ++++++++++++++++--- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index ef5ed2853d..ba6b813e40 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -26,7 +26,8 @@ Create a project by definition file. Note: The name shouldn't contain any whites id: "project-unique-id" name: "Name" labels: - app: flyte + values: + app: flyte description: "Some description for the project" @@ -40,6 +41,10 @@ Options :: + --activate Activates the project specified as argument. Only used in update + --activateProject (Deprecated) Activates the project specified as argument. Only used in update + --archive Archives the project specified as argument. Only used in update + --archiveProject (Deprecated) Archives the project specified as argument. Only used in update --description string description for the project specified as argument. --dryRun execute command without making any modifications. --file string file for the project definition. diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index b8baaa4349..1c05bdbbc9 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -14,31 +14,65 @@ Updates the project according to the flags passed. Allows you to archive or acti Activate project flytesnacks: :: - flytectl update project -p flytesnacks --activateProject + flytectl update project -p flytesnacks --activate Archive project flytesnacks: :: - flytectl update project -p flytesnacks --archiveProject + flytectl update project -p flytesnacks --archive Incorrect usage when passing both archive and activate: :: - flytectl update project flytesnacks --archiveProject --activateProject + flytectl update project -p flytesnacks --archiveProject --activate Incorrect usage when passing unknown-project: +:: + + flytectl update project unknown-project --archive + +project ID is required flag + :: flytectl update project unknown-project --archiveProject -Incorrect usage when passing valid project using -p option: +Update projects.(project/projects can be used interchangeably in these commands) + +:: + + flytectl update project -p flytesnacks --description "flytesnacks description" --labels app=flyte +Update a project by definition file. Note: The name shouldn't contain any whitespace characters. :: - flytectl update project unknown-project --archiveProject -p known-project + flytectl update project --file project.yaml + +.. code-block:: yaml + + id: "project-unique-id" + name: "Name" + labels: + values: + app: flyte + description: "Some description for the project" + +Update a project state by definition file. Note: The name shouldn't contain any whitespace characters. +:: + + flytectl update project --file project.yaml --archive + +.. code-block:: yaml + + id: "project-unique-id" + name: "Name" + labels: + values: + app: flyte + description: "Some description for the project" Usage @@ -52,10 +86,17 @@ Options :: - --activateProject Activates the project specified as argument. - --archiveProject Archives the project specified as argument. - --dryRun execute command without making any modifications. - -h, --help help for project + --activate Activates the project specified as argument. Only used in update + --activateProject (Deprecated) Activates the project specified as argument. Only used in update + --archive Archives the project specified as argument. Only used in update + --archiveProject (Deprecated) Archives the project specified as argument. Only used in update + --description string description for the project specified as argument. + --dryRun execute command without making any modifications. + --file string file for the project definition. + -h, --help help for project + --id string id for the project specified as argument. + --labels stringToString labels for the project specified as argument. (default []) + --name string name for the project specified as argument. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 5af33e330dec068a87f7325136d251d8ef494c45 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Tue, 25 Jan 2022 11:53:43 +0530 Subject: [PATCH 211/645] Always use sha for sandbox image (#266) * Always use sha for sandbox image Signed-off-by: Yuvraj * Upgrade go 1.17 Signed-off-by: Yuvraj --- flytectl/.github/workflows/build.yaml | 40 +++++- flytectl/.github/workflows/generate-docs.yaml | 2 +- flytectl/.github/workflows/release.yml | 2 +- .../workflows/update-flyte-component.yml | 2 +- .../subcommand/project/project_config_test.go | 41 ++++++ .../config/subcommand/sandbox/config_flags.go | 1 + .../subcommand/sandbox/config_flags_test.go | 14 +++ .../subcommand/sandbox/sandbox_config.go | 3 + flytectl/cmd/register/examples.go | 2 +- flytectl/cmd/register/register_util.go | 2 +- flytectl/cmd/sandbox/start.go | 65 +++------- flytectl/cmd/sandbox/start_test.go | 96 ++++++++------ flytectl/cmd/upgrade/upgrade.go | 1 + flytectl/go.mod | 118 +++++++++++++++--- flytectl/go.sum | 14 +-- flytectl/pkg/docker/docker_util.go | 37 +++--- flytectl/pkg/docker/docker_util_test.go | 13 +- flytectl/pkg/util/githubutil/githubutil.go | 92 +++++++++++--- flytectl/pkg/util/util.go | 29 ++--- flytectl/pkg/util/util_test.go | 48 +++---- 20 files changed, 427 insertions(+), 195 deletions(-) diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml index 148963bd0c..736cd5e0bb 100644 --- a/flytectl/.github/workflows/build.yaml +++ b/flytectl/.github/workflows/build.yaml @@ -6,8 +6,8 @@ on: - master jobs: - build: - name: Run tests and lint + dry-run-goreleaser: + name: Dry Run Goreleaser runs-on: ubuntu-latest steps: - name: Checkout @@ -22,16 +22,35 @@ jobs: key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - uses: actions/setup-go@v2 with: - go-version: '1.16' + go-version: '1.17' - name: Run GoReleaser dry run uses: goreleaser/goreleaser-action@v2 with: version: latest args: --snapshot --skip-publish --rm-dist + + unit-test: + name: Run unit test + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: "2" + - uses: actions/cache@v2 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} + - uses: actions/setup-go@v2 + with: + go-version: '1.17' - name: Unit Tests env: GO111MODULE: "on" CI_ENV: "true" + GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} run: make install && make test_unit_without_flag - name: Push CodeCov uses: codecov/codecov-action@v1.0.5 @@ -39,6 +58,19 @@ jobs: file: coverage.txt flags: unittests fail_ci_if_error: true + + + lint: + name: Run Lint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: "2" + - uses: actions/setup-go@v2 + with: + go-version: '1.17' - name: Lint env: GO111MODULE: "on" @@ -50,6 +82,6 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-go@v2 with: - go-version: '1.16' + go-version: '1.17' - name: Go generate and diff run: DELTA_CHECK=true make generate \ No newline at end of file diff --git a/flytectl/.github/workflows/generate-docs.yaml b/flytectl/.github/workflows/generate-docs.yaml index 1c442ea4f8..853aefe30e 100644 --- a/flytectl/.github/workflows/generate-docs.yaml +++ b/flytectl/.github/workflows/generate-docs.yaml @@ -15,7 +15,7 @@ jobs: lfs: true - uses: actions/setup-go@v1 with: - go-version: '1.16' + go-version: '1.17' - uses: actions/setup-python@v1 with: python-version: 3.8 diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml index 7137ab353c..47d6863674 100644 --- a/flytectl/.github/workflows/release.yml +++ b/flytectl/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: fetch-depth: "0" - uses: actions/setup-go@v2 with: - go-version: '1.16' + go-version: '1.17' - name: Run GoReleaser dry run uses: goreleaser/goreleaser-action@v2 with: diff --git a/flytectl/.github/workflows/update-flyte-component.yml b/flytectl/.github/workflows/update-flyte-component.yml index 7893e4fb8b..ec765da89f 100644 --- a/flytectl/.github/workflows/update-flyte-component.yml +++ b/flytectl/.github/workflows/update-flyte-component.yml @@ -13,7 +13,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.16 + go-version: 1.17 - uses: crazy-max/ghaction-import-gpg@v3 with: gpg-private-key: ${{ secrets.FLYTE_BOT_GPG_PRIVATE_KEY }} diff --git a/flytectl/cmd/config/subcommand/project/project_config_test.go b/flytectl/cmd/config/subcommand/project/project_config_test.go index fdad3cc33a..a44cd0b423 100644 --- a/flytectl/cmd/config/subcommand/project/project_config_test.go +++ b/flytectl/cmd/config/subcommand/project/project_config_test.go @@ -1,8 +1,12 @@ package project import ( + "errors" "testing" + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/stretchr/testify/assert" ) @@ -25,3 +29,40 @@ func TestGetProjectSpec(t *testing.T) { assert.Equal(t, "flytesnacks test", response.Description) }) } + +func TestMapToAdminState(t *testing.T) { + t.Run("Successful mapToAdminState with archive", func(t *testing.T) { + c := &ConfigProject{ + Archive: true, + } + state, err := c.MapToAdminState() + assert.Nil(t, err) + assert.Equal(t, admin.Project_ARCHIVED, state) + }) + t.Run("Successful mapToAdminState with activate", func(t *testing.T) { + c := &ConfigProject{ + Activate: true, + } + state, err := c.MapToAdminState() + assert.Nil(t, err) + assert.Equal(t, admin.Project_ACTIVE, state) + }) + t.Run("Invalid state", func(t *testing.T) { + c := &ConfigProject{ + Activate: true, + Archive: true, + } + state, err := c.MapToAdminState() + assert.NotNil(t, err) + assert.Equal(t, errors.New(clierrors.ErrInvalidStateUpdate), err) + assert.Equal(t, admin.Project_ACTIVE, state) + }) + t.Run("deprecated Flags Test", func(t *testing.T) { + c := &ConfigProject{ + ActivateProject: true, + } + state, err := c.MapToAdminState() + assert.Nil(t, err) + assert.Equal(t, admin.Project_ACTIVE, state) + }) +} diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index 5339211026..5e4451b922 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -53,6 +53,7 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.Source, fmt.Sprintf("%v%v", prefix, "source"), DefaultConfig.Source, "Path of your source code") cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "Version of flyte. Only supports flyte releases greater than v0.10.0") cmdFlags.StringVar(&DefaultConfig.Image, fmt.Sprintf("%v%v", prefix, "image"), DefaultConfig.Image, "Optional. Provide a fully qualified path to a Flyte compliant docker image.") + cmdFlags.BoolVar(&DefaultConfig.Prerelease, fmt.Sprintf("%v%v", prefix, "pre"), DefaultConfig.Prerelease, "Optional. Pre release Version of flyte will be used for sandbox.") cmdFlags.Var(&DefaultConfig.ImagePullPolicy, fmt.Sprintf("%v%v", prefix, "imagePullPolicy"), "Optional. Defines the image pull behavior [Always/IfNotPresent/Never]") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index 4e1410c228..da98f59320 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -141,6 +141,20 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_pre", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("pre", testValue) + if vBool, err := cmdFlags.GetBool("pre"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Prerelease) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_imagePullPolicy", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index ff7559b562..77246f09d0 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -44,6 +44,9 @@ type Config struct { // from there. Image string `json:"image" pflag:",Optional. Provide a fully qualified path to a Flyte compliant docker image."` + // Default value false represents that flytectl will not use latest pre release if exist + Prerelease bool `json:"pre" pflag:",Optional. Pre release Version of flyte will be used for sandbox."` + // Optionally it is possible to use local sandbox image // If local flag pass then flytectl will not pull image from registry. Usually useful, if you want to test your local images without pushing them to a registry ImagePullPolicy ImagePullPolicy `json:"imagePullPolicy" pflag:",Optional. Defines the image pull behavior [Always/IfNotPresent/Never]"` diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index d19641fd85..845dcc417c 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -6,7 +6,7 @@ import ( "github.com/flyteorg/flytestdlib/logger" - "github.com/google/go-github/v37/github" + "github.com/google/go-github/v42/github" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 30f2ae8350..29e83c698d 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -30,7 +30,7 @@ import ( "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytestdlib/logger" "github.com/flyteorg/flytestdlib/storage" - "github.com/google/go-github/v37/github" + "github.com/google/go-github/v42/github" "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 2023806dd5..00c445d509 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -9,10 +9,10 @@ import ( "path/filepath" "time" - "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/pkg/util/githubutil" "github.com/avast/retry-go" + "github.com/flyteorg/flytectl/clierrors" "github.com/olekukonko/tablewriter" corev1api "k8s.io/api/core/v1" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" @@ -64,15 +64,13 @@ Specify a Flyte Sandbox image pull policy. Possible pull policy values are Alway flytectl sandbox start --image docker.io/my-override:latest --imagePullPolicy Always Usage ` - k8sEndpoint = "https://127.0.0.1:30086" - flyteNamespace = "flyte" - flyteRepository = "flyte" - dind = "dind" - sandboxSupportedVersion = "v0.10.0" - diskPressureTaint = "node.kubernetes.io/disk-pressure" - taintEffect = "NoSchedule" - sandboxContextName = "flyte-sandbox" - sandboxDockerContext = "default" + k8sEndpoint = "https://127.0.0.1:30086" + flyteNamespace = "flyte" + diskPressureTaint = "node.kubernetes.io/disk-pressure" + taintEffect = "NoSchedule" + sandboxContextName = "flyte-sandbox" + sandboxDockerContext = "default" + imageName = "cr.flyte.org/flyteorg/flyte-sandbox" ) type ExecResult struct { @@ -160,20 +158,23 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu } else if vol != nil { volumes = append(volumes, *vol) } - - image, err := getSandboxImage(sandboxConfig.DefaultConfig.Version, sandboxConfig.DefaultConfig.Image) - if err != nil { - return nil, err + sandboxImage := sandboxConfig.DefaultConfig.Image + if len(sandboxConfig.DefaultConfig.Image) == 0 { + image, version, err := githubutil.GetSandboxImage(sandboxConfig.DefaultConfig.Version, imageName) + if err != nil { + return nil, err + } + sandboxImage = image + fmt.Printf("%v Running Flyte %s release\n", emoji.Whale, version) } - fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, image) - - if err := docker.PullDockerImage(ctx, cli, image, sandboxConfig.DefaultConfig.ImagePullPolicy); err != nil { + fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, sandboxImage) + if err := docker.PullDockerImage(ctx, cli, sandboxImage, sandboxConfig.DefaultConfig.ImagePullPolicy); err != nil { return nil, err } fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) exposedPorts, portBindings, _ := docker.GetSandboxPorts() - ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, image) + ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, sandboxImage) if err != nil { fmt.Printf("%v Something went wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) return nil, err @@ -187,34 +188,6 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu return logReader, nil } -// Returns the alternate image if specified, else -// if no version is specified then the Latest release of cr.flyte.org/flyteorg/flyte-sandbox:dind is used -// else cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA}, where sha is derived from the version. -func getSandboxImage(version string, alternateImage string) (string, error) { - - if len(alternateImage) > 0 { - return alternateImage, nil - } - - var tag = dind - if len(version) > 0 { - isGreater, err := util.IsVersionGreaterThan(version, sandboxSupportedVersion) - if err != nil { - return "", err - } - if !isGreater { - return "", fmt.Errorf("version flag only supported with flyte %s+ release", sandboxSupportedVersion) - } - sha, err := githubutil.GetSHAFromVersion(version, flyteRepository) - if err != nil { - return "", err - } - tag = fmt.Sprintf("%s-%s", dind, sha) - } - - return docker.GetSandboxImage(tag), nil -} - func mountVolume(file, destination string) (*mount.Mount, error) { if len(file) > 0 { source, err := filepath.Abs(file) diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index ca64917914..71c3e45ffb 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -87,11 +87,13 @@ func TestStartSandboxFunc(t *testing.T) { ctx := context.Background() mockDocker := &mocks.Docker{} errCh := make(chan error) - sandboxConfig.DefaultConfig.Version = "" + sandboxConfig.DefaultConfig.Version = "v0.19.1" bodyStatus := make(chan container.ContainerWaitOKBody) + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -111,17 +113,19 @@ func TestStartSandboxFunc(t *testing.T) { Follow: true, }).Return(nil, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err := startSandbox(ctx, mockDocker, os.Stdin) + _, err = startSandbox(ctx, mockDocker, os.Stdin) assert.Nil(t, err) }) t.Run("Successfully exit when sandbox cluster exist", func(t *testing.T) { ctx := context.Background() mockDocker := &mocks.Docker{} errCh := make(chan error) + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -165,9 +169,11 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -187,7 +193,7 @@ func TestStartSandboxFunc(t *testing.T) { Follow: true, }).Return(nil, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err := startSandbox(ctx, mockDocker, os.Stdin) + _, err = startSandbox(ctx, mockDocker, os.Stdin) assert.Nil(t, err) }) t.Run("Successfully run sandbox cluster with abs path of source code", func(t *testing.T) { @@ -205,9 +211,11 @@ func TestStartSandboxFunc(t *testing.T) { Source: absPath, Target: docker.Source, }) + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -235,16 +243,15 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Version = "v0.15.0" + sandboxConfig.DefaultConfig.Version = "v0.18.0" sandboxConfig.DefaultConfig.Source = "" - sha, err := githubutil.GetSHAFromVersion(sandboxConfig.DefaultConfig.Version, "flyte") + image, _, err := githubutil.GetSandboxImage(sandboxConfig.DefaultConfig.Version, imageName) assert.Nil(t, err) - volumes := docker.Volumes mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(fmt.Sprintf("%s-%s", dind, sha)), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -274,10 +281,12 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Version = "v0.1444.0" sandboxConfig.DefaultConfig.Source = "" + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) volumes := docker.Volumes mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -297,7 +306,7 @@ func TestStartSandboxFunc(t *testing.T) { Follow: true, }).Return(nil, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err := startSandbox(ctx, mockDocker, os.Stdin) + _, err = startSandbox(ctx, mockDocker, os.Stdin) assert.NotNil(t, err) }) t.Run("Error in pulling image", func(t *testing.T) { @@ -305,7 +314,8 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := docker.Volumes volumes = append(volumes, mount.Mount{ @@ -315,7 +325,7 @@ func TestStartSandboxFunc(t *testing.T) { }) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -335,7 +345,7 @@ func TestStartSandboxFunc(t *testing.T) { Follow: true, }).Return(nil, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err := startSandbox(ctx, mockDocker, os.Stdin) + _, err = startSandbox(ctx, mockDocker, os.Stdin) assert.NotNil(t, err) }) t.Run("Error in removing existing cluster", func(t *testing.T) { @@ -350,9 +360,11 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -380,7 +392,7 @@ func TestStartSandboxFunc(t *testing.T) { }).Return(nil, nil) mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("error")) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err := startSandbox(ctx, mockDocker, strings.NewReader("y")) + _, err = startSandbox(ctx, mockDocker, strings.NewReader("y")) assert.NotNil(t, err) }) t.Run("Error in start container", func(t *testing.T) { @@ -390,9 +402,11 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = "" sandboxConfig.DefaultConfig.Version = "" + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -412,7 +426,7 @@ func TestStartSandboxFunc(t *testing.T) { Follow: true, }).Return(nil, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err := startSandbox(ctx, mockDocker, os.Stdin) + _, err = startSandbox(ctx, mockDocker, os.Stdin) assert.NotNil(t, err) }) t.Run("Error in reading logs", func(t *testing.T) { @@ -427,9 +441,11 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -449,7 +465,7 @@ func TestStartSandboxFunc(t *testing.T) { Follow: true, }).Return(nil, fmt.Errorf("error")) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err := startSandbox(ctx, mockDocker, os.Stdin) + _, err = startSandbox(ctx, mockDocker, os.Stdin) assert.NotNil(t, err) }) t.Run("Error in list container", func(t *testing.T) { @@ -465,9 +481,11 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -487,7 +505,7 @@ func TestStartSandboxFunc(t *testing.T) { Follow: true, }).Return(nil, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err := startSandbox(ctx, mockDocker, os.Stdin) + _, err = startSandbox(ctx, mockDocker, os.Stdin) assert.Nil(t, err) }) t.Run("Successfully run sandbox cluster command", func(t *testing.T) { @@ -507,10 +525,12 @@ func TestStartSandboxFunc(t *testing.T) { if err != nil { t.Error(err) } + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -545,9 +565,11 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker := &mocks.Docker{} errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) + image, _, err := githubutil.GetSandboxImage("", imageName) + assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, - Image: docker.GetSandboxImage(dind), + Image: image, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -571,7 +593,7 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) docker.Client = mockDocker sandboxConfig.DefaultConfig.Source = "" - err := startSandboxCluster(ctx, []string{}, cmdCtx) + err = startSandboxCluster(ctx, []string{}, cmdCtx) assert.NotNil(t, err) }) } @@ -678,33 +700,27 @@ func TestGetNodeTaintStatus(t *testing.T) { func TestGetSandboxImage(t *testing.T) { t.Run("Get Latest sandbox", func(t *testing.T) { - image, err := getSandboxImage("", "") + image, _, err := githubutil.GetSandboxImage("", imageName) assert.Nil(t, err) - assert.Equal(t, docker.GetSandboxImage(dind), image) + assert.Equal(t, true, strings.HasPrefix(image, "cr.flyte.org/flyteorg/flyte-sandbox:dind-")) }) t.Run("Get sandbox image with version ", func(t *testing.T) { - image, err := getSandboxImage("v0.14.0", "") + image, _, err := githubutil.GetSandboxImage("v0.14.0", imageName) assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(image, docker.ImageName)) + assert.Equal(t, true, strings.HasPrefix(image, imageName)) }) t.Run("Get sandbox image with wrong version ", func(t *testing.T) { - _, err := getSandboxImage("v100.1.0", "") + _, _, err := githubutil.GetSandboxImage("v100.1.0", imageName) assert.NotNil(t, err) }) t.Run("Get sandbox image with wrong version ", func(t *testing.T) { - _, err := getSandboxImage("aaaaaa", "") + _, _, err := githubutil.GetSandboxImage("aaaaaa", imageName) assert.NotNil(t, err) }) t.Run("Get sandbox image with version that is not supported", func(t *testing.T) { - _, err := getSandboxImage("v0.10.0", "") + _, _, err := githubutil.GetSandboxImage("v0.10.0", imageName) assert.NotNil(t, err) }) - t.Run("Get sandbox image with version that is not supported", func(t *testing.T) { - img := "docker.io/my-override:latest" - i, err := getSandboxImage("v0.11.0", img) - assert.Nil(t, err) - assert.Equal(t, i, img) - }) } diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go index 7fdd6d5f82..b0965f20d9 100644 --- a/flytectl/cmd/upgrade/upgrade.go +++ b/flytectl/cmd/upgrade/upgrade.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/flyteorg/flytectl/pkg/util" + stdlibversion "github.com/flyteorg/flytestdlib/version" "github.com/flyteorg/flytectl/pkg/util/githubutil" diff --git a/flytectl/go.mod b/flytectl/go.mod index cc8a7bb50f..3481e540f0 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -1,12 +1,10 @@ module github.com/flyteorg/flytectl -go 1.16 +go 1.17 require ( - github.com/Microsoft/go-winio v0.5.0 // indirect github.com/avast/retry-go v3.0.0+incompatible github.com/awalterschulze/gographviz v2.0.3+incompatible - github.com/containerd/containerd v1.5.9 // indirect github.com/disiqueira/gotree v1.0.0 github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 @@ -16,20 +14,13 @@ require ( github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 github.com/golang/protobuf v1.5.0 - github.com/google/go-github v17.0.0+incompatible - github.com/google/go-github/v37 v37.0.0 - github.com/google/go-querystring v1.1.0 // indirect + github.com/google/go-github/v42 v42.0.0 github.com/google/uuid v1.2.0 - github.com/gorilla/mux v1.8.0 // indirect github.com/hashicorp/go-version v1.3.0 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 github.com/manifoldco/promptui v0.8.0 - github.com/mattn/go-isatty v0.0.13 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect github.com/mitchellh/mapstructure v1.4.1 - github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect - github.com/morikuni/aec v1.0.0 // indirect github.com/mouuff/go-rocket-update v1.5.1 github.com/olekukonko/tablewriter v0.0.5 github.com/opencontainers/image-spec v1.0.2 @@ -41,10 +32,7 @@ require ( github.com/stretchr/testify v1.7.0 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 github.com/zalando/go-keyring v0.1.1 - golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect - golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect google.golang.org/grpc v1.36.0 google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v2 v2.4.0 @@ -55,3 +43,105 @@ require ( k8s.io/client-go v0.21.3 sigs.k8s.io/yaml v1.2.0 ) + +require ( + cloud.google.com/go v0.75.0 // indirect + cloud.google.com/go/storage v1.12.0 // indirect + github.com/Azure/azure-sdk-for-go v51.0.0+incompatible // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest v0.11.17 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/logger v0.2.0 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/Microsoft/go-winio v0.5.0 // indirect + github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect + github.com/aws/aws-sdk-go v1.37.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect + github.com/containerd/containerd v1.5.9 // indirect + github.com/coocood/freecache v1.1.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect + github.com/danieljoos/wincred v1.1.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/distribution v2.7.1+incompatible // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/evanphx/json-patch v4.9.0+incompatible // indirect + github.com/fatih/color v1.10.0 // indirect + github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect + github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/go-logr/logr v0.4.0 // indirect + github.com/godbus/dbus/v5 v5.0.4 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + github.com/google/go-cmp v0.5.6 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/gofuzz v1.1.0 // indirect + github.com/googleapis/gax-go/v2 v2.0.5 // indirect + github.com/googleapis/gnostic v0.4.1 // indirect + github.com/gorilla/mux v1.8.0 // indirect + github.com/graymeta/stow v0.2.7 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect + github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/json-iterator/go v1.1.10 // indirect + github.com/jstemmer/go-junit-report v0.9.1 // indirect + github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a // indirect + github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect + github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a // indirect + github.com/magiconair/properties v1.8.4 // indirect + github.com/mattn/go-colorable v0.1.8 // indirect + github.com/mattn/go-isatty v0.0.13 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/ncw/swift v1.0.53 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/pelletier/go-toml v1.8.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.9.0 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.15.0 // indirect + github.com/prometheus/procfs v0.6.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/russross/blackfriday/v2 v2.0.1 // indirect + github.com/satori/go.uuid v1.2.0 // indirect + github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + github.com/spf13/afero v1.5.1 // indirect + github.com/spf13/cast v1.3.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/viper v1.7.1 // indirect + github.com/stretchr/objx v0.3.0 // indirect + github.com/subosito/gotenv v1.2.0 // indirect + go.opencensus.io v0.22.6 // indirect + golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect + golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect + golang.org/x/mod v0.4.1 // indirect + golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect + golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect + golang.org/x/text v0.3.5 // indirect + golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect + golang.org/x/tools v0.1.0 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + google.golang.org/api v0.38.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.62.0 // indirect + k8s.io/klog/v2 v2.8.0 // indirect + k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect + k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect +) diff --git a/flytectl/go.sum b/flytectl/go.sum index 9945f3089d..a1093f10c1 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -149,6 +149,7 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bradleyfalzon/ghinstallation/v2 v2.0.3/go.mod h1:tlgi+JWCXnKFx/Y4WtnDbZEINo31N5bcvnCoqieefmk= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= @@ -417,6 +418,7 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -463,11 +465,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-github/v37 v37.0.0 h1:rCspN8/6kB1BAJWZfuafvHhyfIo5fkAulaP/3bOQ/tM= -github.com/google/go-github/v37 v37.0.0/go.mod h1:LM7in3NmXDrX58GbEHy7FtNLbI2JijX93RnMKvWG3m4= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-github/v39 v39.0.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= +github.com/google/go-github/v42 v42.0.0 h1:YNT0FwjPrEysRkLIiKuEfSvBPCGKphW5aS5PxwaoLec= +github.com/google/go-github/v42 v42.0.0/go.mod h1:jgg/jvyI0YlDOM1/ps6XYh04HNQ3vKf0CVko62/EhRg= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -985,8 +985,8 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index e0edaeb148..a1d952475f 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -9,6 +9,9 @@ import ( "os" "strings" + "github.com/docker/docker/client" + "github.com/enescakir/emoji" + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" "github.com/flyteorg/flytectl/clierrors" @@ -16,10 +19,8 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/client" "github.com/docker/docker/pkg/stdcopy" "github.com/docker/go-connections/nat" - "github.com/enescakir/emoji" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" f "github.com/flyteorg/flytectl/pkg/filesystemutils" ) @@ -27,7 +28,6 @@ import ( var ( Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") SuccessMessage = "Deploying Flyte..." - ImageName = "cr.flyte.org/flyteorg/flyte-sandbox" FlyteSandboxClusterName = "flyte-sandbox" Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} Source = "/root" @@ -51,6 +51,19 @@ var ( StartingBufLen = 32*1024 + StdWriterPrefixLen + 1 ) +// GetDockerClient will returns the docker client +func GetDockerClient() (Docker, error) { + if Client == nil { + cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + if err != nil { + fmt.Printf("%v Please Check your docker client %v \n", emoji.GrimacingFace, emoji.Whale) + return nil, err + } + return cli, nil + } + return Client, nil +} + // GetSandbox will return sandbox container if it exist func GetSandbox(ctx context.Context, cli Docker) *types.Container { containers, _ := cli.ContainerList(ctx, types.ContainerListOptions{ @@ -166,19 +179,6 @@ func WaitForSandbox(reader *bufio.Scanner, message string) bool { return false } -// GetDockerClient will returns the docker client -func GetDockerClient() (Docker, error) { - if Client == nil { - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - fmt.Printf("%v Please Check your docker client %v \n", emoji.GrimacingFace, emoji.Whale) - return nil, err - } - return cli, nil - } - return Client, nil -} - // ExecCommend will execute a command in container and returns an execution id func ExecCommend(ctx context.Context, cli Docker, containerID string, command []string) (types.IDResponse, error) { ExecConfig.Cmd = command @@ -200,8 +200,3 @@ func InspectExecResp(ctx context.Context, cli Docker, containerID string) error } return nil } - -// GetSandboxImage will return the sandbox image with tag -func GetSandboxImage(tag string) string { - return fmt.Sprintf("%s:%s", ImageName, tag) -} diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 0a40d55ea2..cc27fd8af4 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -26,6 +26,7 @@ import ( var ( cmdCtx cmdCore.CommandContext containers []types.Container + imageName = "cr.flyte.org/flyteorg/flyte-sandbox" ) func setupSandbox() { @@ -154,7 +155,7 @@ func TestStartContainer(t *testing.T) { // Verify the attributes mockDocker.OnContainerCreate(context, &container.Config{ Env: Environment, - Image: ImageName, + Image: imageName, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -165,7 +166,7 @@ func TestStartContainer(t *testing.T) { ID: "Hello", }, nil) mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(nil) - id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", ImageName) + id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName) assert.Nil(t, err) assert.Greater(t, len(id), 0) assert.Equal(t, id, "Hello") @@ -179,7 +180,7 @@ func TestStartContainer(t *testing.T) { // Verify the attributes mockDocker.OnContainerCreate(context, &container.Config{ Env: Environment, - Image: ImageName, + Image: imageName, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -190,7 +191,7 @@ func TestStartContainer(t *testing.T) { ID: "", }, fmt.Errorf("error")) mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(nil) - id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", ImageName) + id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName) assert.NotNil(t, err) assert.Equal(t, len(id), 0) assert.Equal(t, id, "") @@ -204,7 +205,7 @@ func TestStartContainer(t *testing.T) { // Verify the attributes mockDocker.OnContainerCreate(context, &container.Config{ Env: Environment, - Image: ImageName, + Image: imageName, Tty: false, ExposedPorts: p1, }, &container.HostConfig{ @@ -215,7 +216,7 @@ func TestStartContainer(t *testing.T) { ID: "Hello", }, nil) mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) - id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", ImageName) + id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName) assert.NotNil(t, err) assert.Equal(t, len(id), 0) assert.Equal(t, id, "") diff --git a/flytectl/pkg/util/githubutil/githubutil.go b/flytectl/pkg/util/githubutil/githubutil.go index 109b6daec1..075b1cc8df 100644 --- a/flytectl/pkg/util/githubutil/githubutil.go +++ b/flytectl/pkg/util/githubutil/githubutil.go @@ -3,34 +3,42 @@ package githubutil import ( "context" "net/http" + "os" "path/filepath" "runtime" "strings" + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + + "github.com/flyteorg/flytectl/pkg/util" + + "github.com/flyteorg/flytestdlib/logger" + + "golang.org/x/oauth2" + "github.com/flyteorg/flytectl/pkg/util/platformutil" stdlibversion "github.com/flyteorg/flytestdlib/version" "github.com/mouuff/go-rocket-update/pkg/provider" "github.com/mouuff/go-rocket-update/pkg/updater" - "github.com/flyteorg/flytectl/pkg/util" - "fmt" - "github.com/google/go-github/v37/github" + "github.com/google/go-github/v42/github" ) const ( - owner = "flyteorg" - flyte = "flyte" - sandboxManifest = "flyte_sandbox_manifest.yaml" - flytectl = "flytectl" - flytectlRepository = "github.com/flyteorg/flytectl" - commonMessage = "\n A new release of flytectl is available: %s → %s \n" - brewMessage = "To upgrade, run: brew update && brew upgrade flytectl \n" - linuxMessage = "To upgrade, run: flytectl upgrade \n" - darwinMessage = "To upgrade, run: flytectl upgrade \n" - releaseURL = "https://github.com/flyteorg/flytectl/releases/tag/%s \n" - brewInstallDirectory = "/Cellar/flytectl" + owner = "flyteorg" + flyte = "flyte" + sandboxManifest = "flyte_sandbox_manifest.yaml" + flytectl = "flytectl" + sandboxSupportedVersion = "v0.10.0" + flytectlRepository = "github.com/flyteorg/flytectl" + commonMessage = "\n A new release of flytectl is available: %s → %s \n" + brewMessage = "To upgrade, run: brew update && brew upgrade flytectl \n" + linuxMessage = "To upgrade, run: flytectl upgrade \n" + darwinMessage = "To upgrade, run: flytectl upgrade \n" + releaseURL = "https://github.com/flyteorg/flytectl/releases/tag/%s \n" + brewInstallDirectory = "/Cellar/flytectl" ) // FlytectlReleaseConfig represent the updater config for flytectl binary @@ -49,6 +57,11 @@ var ( //GetGHClient will return github client func GetGHClient() *github.Client { + if len(os.Getenv("GITHUB_TOKEN")) > 0 { + return github.NewClient(oauth2.NewClient(context.Background(), oauth2.StaticTokenSource( + &oauth2.Token{AccessToken: os.Getenv("GITHUB_TOKEN")}, + ))) + } return github.NewClient(&http.Client{}) } @@ -74,6 +87,45 @@ func GetListRelease(repository string) ([]*github.RepositoryRelease, error) { return releases, err } +// GetSandboxImageSha returns the sha as per input +func GetSandboxImageSha(version string, pre bool) (string, string, error) { + var release *github.RepositoryRelease + if len(version) == 0 { + releases, err := GetListRelease(flyte) + if err != nil { + return "", release.GetTagName(), err + } + for _, v := range releases { + if *v.Prerelease && pre { + release = v + break + } else if !*v.Prerelease && !pre { + release = v + break + } + } + logger.Infof(context.Background(), "sandbox started with release %s", release.GetTagName()) + } else if len(version) > 0 { + r, err := CheckVersionExist(version, flyte) + if err != nil { + return "", r.GetTagName(), err + } + release = r + } + isGreater, err := util.IsVersionGreaterThan(release.GetTagName(), sandboxSupportedVersion) + if err != nil { + return "", release.GetTagName(), err + } + if !isGreater { + return "", release.GetTagName(), fmt.Errorf("version flag only supported with flyte %s+ release", sandboxSupportedVersion) + } + sha, err := GetSHAFromVersion(release.GetTagName(), flyte) + if err != nil { + return "", release.GetTagName(), err + } + return sha, release.GetTagName(), nil +} + func getFlytectlAssetName() string { if arch == platformutil.ArchAmd64 { arch = platformutil.ArchX86 @@ -159,3 +211,15 @@ func CheckBrewInstall(goos platformutil.Platform) (string, error) { } return "", nil } + +// GetSandboxImage Returns the alternate image if specified, else +// if no version is specified then the Latest release of cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA} is used +// else cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA}, where sha is derived from the version. +func GetSandboxImage(version, image string) (string, string, error) { + sha, version, err := GetSandboxImageSha(version, sandboxConfig.DefaultConfig.Prerelease) + if err != nil { + return "", version, err + } + + return fmt.Sprintf("%s:%s", image, fmt.Sprintf("dind-%s", sha)), version, nil +} diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index 31c01db225..c5f5470dc0 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -9,11 +9,12 @@ import ( "os" "strings" + hversion "github.com/hashicorp/go-version" + "github.com/enescakir/emoji" "github.com/flyteorg/flytectl/pkg/configutil" "github.com/flyteorg/flytectl/pkg/docker" f "github.com/flyteorg/flytectl/pkg/filesystemutils" - hversion "github.com/hashicorp/go-version" ) const ( @@ -49,19 +50,6 @@ func SetupFlyteDir() error { return nil } -// IsVersionGreaterThan check version if it's greater then other -func IsVersionGreaterThan(version1, version2 string) (bool, error) { - semanticVersion1, err := hversion.NewVersion(version1) - if err != nil { - return false, err - } - semanticVersion2, err := hversion.NewVersion(version2) - if err != nil { - return false, err - } - return semanticVersion1.GreaterThan(semanticVersion2), nil -} - // PrintSandboxMessage will print sandbox success message func PrintSandboxMessage() { kubeconfig := strings.Join([]string{ @@ -89,3 +77,16 @@ func SendRequest(method, url string, option io.Reader) (*http.Response, error) { } return response, nil } + +// IsVersionGreaterThan check version if it's greater then other +func IsVersionGreaterThan(version1, version2 string) (bool, error) { + semanticVersion1, err := hversion.NewVersion(version1) + if err != nil { + return false, err + } + semanticVersion2, err := hversion.NewVersion(version2) + if err != nil { + return false, err + } + return semanticVersion1.GreaterThan(semanticVersion2), nil +} diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index b97b11804e..185b20db82 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -23,6 +23,30 @@ func TestSetupFlyteDir(t *testing.T) { assert.Nil(t, SetupFlyteDir()) } +func TestPrintSandboxMessage(t *testing.T) { + t.Run("Print Sandbox Message", func(t *testing.T) { + PrintSandboxMessage() + }) +} + +func TestSendRequest(t *testing.T) { + t.Run("Successful get request", func(t *testing.T) { + response, err := SendRequest("GET", "https://github.com", nil) + assert.Nil(t, err) + assert.NotNil(t, response) + }) + t.Run("Successful get request failed", func(t *testing.T) { + response, err := SendRequest("GET", "htp://github.com", nil) + assert.NotNil(t, err) + assert.Nil(t, response) + }) + t.Run("Successful get request failed", func(t *testing.T) { + response, err := SendRequest("GET", "https://github.com/evalsocket/flyte/archive/refs/tags/source-code.zip", nil) + assert.NotNil(t, err) + assert.Nil(t, response) + }) +} + func TestIsVersionGreaterThan(t *testing.T) { t.Run("Compare FlyteCTL version when upgrade available", func(t *testing.T) { _, err := IsVersionGreaterThan("v1.1.21", testVersion) @@ -56,27 +80,3 @@ func TestIsVersionGreaterThan(t *testing.T) { assert.NotNil(t, err) }) } - -func TestPrintSandboxMessage(t *testing.T) { - t.Run("Print Sandbox Message", func(t *testing.T) { - PrintSandboxMessage() - }) -} - -func TestSendRequest(t *testing.T) { - t.Run("Successful get request", func(t *testing.T) { - response, err := SendRequest("GET", "https://github.com", nil) - assert.Nil(t, err) - assert.NotNil(t, response) - }) - t.Run("Successful get request failed", func(t *testing.T) { - response, err := SendRequest("GET", "htp://github.com", nil) - assert.NotNil(t, err) - assert.Nil(t, response) - }) - t.Run("Successful get request failed", func(t *testing.T) { - response, err := SendRequest("GET", "https://github.com/evalsocket/flyte/archive/refs/tags/source-code.zip", nil) - assert.NotNil(t, err) - assert.Nil(t, response) - }) -} From f2ad7195694e18d519fe41b4198ff2db30a870da Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Tue, 25 Jan 2022 01:02:40 -0800 Subject: [PATCH 212/645] Update documentation (#271) Signed-off-by: Flyte-Bot Co-authored-by: evalsocket --- flytectl/docs/source/gen/flytectl_sandbox_start.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 217b7da4b5..402342248a 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -54,6 +54,7 @@ Options -h, --help help for start --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. --imagePullPolicy ImagePullPolicy Optional. Defines the image pull behavior [Always/IfNotPresent/Never] (default Always) + --pre Optional. Pre release Version of flyte will be used for sandbox. --source string Path of your source code --version string Version of flyte. Only supports flyte releases greater than v0.10.0 From 7f2214330450eb7baec2b236da937b17c2937158 Mon Sep 17 00:00:00 2001 From: Rodrigo Baron Date: Sat, 5 Feb 2022 22:19:12 -0300 Subject: [PATCH 213/645] fix: use 'dns:///' instead of 'dns://' (#274) --- flytectl/cmd/configuration/configuration.go | 4 ++-- flytectl/cmd/configuration/configuration_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index 680b6c8896..be8421a640 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -58,7 +58,7 @@ var prompt = promptui.Select{ Items: []string{"S3", "GCS"}, } -var endpointPrefix = [3]string{"dns://", "http://", "https://"} +var endpointPrefix = [3]string{"dns:///", "http://", "https://"} // CreateConfigCommand will return configuration command func CreateConfigCommand() *cobra.Command { @@ -95,7 +95,7 @@ func initFlytectlConfig(ctx context.Context, reader io.Reader) error { if !validateEndpointName(trimHost) { return errors.New("Please use a valid endpoint") } - templateValues.Host = fmt.Sprintf("dns://%s", trimHost) + templateValues.Host = fmt.Sprintf("dns:///%s", trimHost) templateValues.Insecure = initConfig.DefaultConfig.Insecure templateStr = configutil.AdminConfigTemplate if initConfig.DefaultConfig.Storage { diff --git a/flytectl/cmd/configuration/configuration_test.go b/flytectl/cmd/configuration/configuration_test.go index 00fbfc29b6..4f6e6a6186 100644 --- a/flytectl/cmd/configuration/configuration_test.go +++ b/flytectl/cmd/configuration/configuration_test.go @@ -65,7 +65,7 @@ func TestSetupConfigFunc(t *testing.T) { } func TestTrimFunc(t *testing.T) { - assert.Equal(t, trimEndpoint("dns://localhost"), "localhost") + assert.Equal(t, trimEndpoint("dns:///localhost"), "localhost") assert.Equal(t, trimEndpoint("http://localhost"), "localhost") assert.Equal(t, trimEndpoint("https://localhost"), "localhost") } From 6947a2afdf10997480831c994bfd85a5041e0777 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Thu, 10 Feb 2022 09:02:30 +0530 Subject: [PATCH 214/645] Added reuseable workflow (#276) * Added reuseable workflow Signed-off-by: Yuvraj --- .../workflows/boilerplate-automation.yml | 42 ----- flytectl/.github/workflows/build.yaml | 87 ----------- flytectl/.github/workflows/checks.yml | 147 ++++++++++++++++++ flytectl/.github/workflows/generate-docs.yaml | 60 ------- flytectl/.github/workflows/master.yml | 27 ---- flytectl/.github/workflows/release.yml | 26 ---- flytectl/.github/workflows/sandbox.yaml | 30 ---- .../workflows/update-flyte-component.yml | 50 ------ .../.github/workflows/upgrade_automtion.yml | 21 +++ flytectl/cmd/sandbox/start_test.go | 2 +- 10 files changed, 169 insertions(+), 323 deletions(-) delete mode 100644 flytectl/.github/workflows/boilerplate-automation.yml delete mode 100644 flytectl/.github/workflows/build.yaml create mode 100644 flytectl/.github/workflows/checks.yml delete mode 100644 flytectl/.github/workflows/generate-docs.yaml delete mode 100644 flytectl/.github/workflows/master.yml delete mode 100644 flytectl/.github/workflows/release.yml delete mode 100644 flytectl/.github/workflows/sandbox.yaml delete mode 100644 flytectl/.github/workflows/update-flyte-component.yml create mode 100644 flytectl/.github/workflows/upgrade_automtion.yml diff --git a/flytectl/.github/workflows/boilerplate-automation.yml b/flytectl/.github/workflows/boilerplate-automation.yml deleted file mode 100644 index 1692c7059e..0000000000 --- a/flytectl/.github/workflows/boilerplate-automation.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Update Boilerplate Automation -on: - workflow_dispatch: - -jobs: - update-boilerplate: - name: Update Boilerplate - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: "0" - - uses: crazy-max/ghaction-import-gpg@v3 - with: - gpg-private-key: ${{ secrets.FLYTE_BOT_GPG_PRIVATE_KEY }} - passphrase: ${{ secrets.FLYTE_BOT_GPG_PASSPHRASE }} - git-user-signingkey: true - git-commit-gpgsign: true - - name: Update Boilerplate - run: | - make update_boilerplate - - name: Create Pull Request - id: cpr - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.FLYTE_BOT_PAT }} - commit-message: Update Boilerplate - committer: Flyte-Bot - author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> - signoff: true - branch: flyte-bot-update-boilerplate - delete-branch: true - title: 'Update Boilerplate' - body: | - Update Boilerplate - - Auto-generated by [flyte-bot] - labels: | - boilerplate - team-reviewers: | - owners - maintainers - draft: false \ No newline at end of file diff --git a/flytectl/.github/workflows/build.yaml b/flytectl/.github/workflows/build.yaml deleted file mode 100644 index 736cd5e0bb..0000000000 --- a/flytectl/.github/workflows/build.yaml +++ /dev/null @@ -1,87 +0,0 @@ -name: build - -on: - pull_request: - branches: - - master - -jobs: - dry-run-goreleaser: - name: Dry Run Goreleaser - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - fetch-depth: "2" - - uses: actions/cache@v2 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - - uses: actions/setup-go@v2 - with: - go-version: '1.17' - - name: Run GoReleaser dry run - uses: goreleaser/goreleaser-action@v2 - with: - version: latest - args: --snapshot --skip-publish --rm-dist - - unit-test: - name: Run unit test - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - fetch-depth: "2" - - uses: actions/cache@v2 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - - uses: actions/setup-go@v2 - with: - go-version: '1.17' - - name: Unit Tests - env: - GO111MODULE: "on" - CI_ENV: "true" - GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} - run: make install && make test_unit_without_flag - - name: Push CodeCov - uses: codecov/codecov-action@v1.0.5 - with: - file: coverage.txt - flags: unittests - fail_ci_if_error: true - - - lint: - name: Run Lint - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - fetch-depth: "2" - - uses: actions/setup-go@v2 - with: - go-version: '1.17' - - name: Lint - env: - GO111MODULE: "on" - run: make install && make lint - - generate: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-go@v2 - with: - go-version: '1.17' - - name: Go generate and diff - run: DELTA_CHECK=true make generate \ No newline at end of file diff --git a/flytectl/.github/workflows/checks.yml b/flytectl/.github/workflows/checks.yml new file mode 100644 index 0000000000..b7f29f1dc5 --- /dev/null +++ b/flytectl/.github/workflows/checks.yml @@ -0,0 +1,147 @@ +name: Flytectl Checks + +on: + workflow_dispatch: + pull_request: + branches: + - master + paths-ignore: + - "docs/**" + - "boilerplate/**" + push: + branches: + - master + paths-ignore: + - "docs/**" + - "boilerplate/**" + +jobs: + lint: + name: Lint + uses: flyteorg/flytetools/.github/workflows/lint.yml@master + + tests: + name: Unit Tests + uses: flyteorg/flytetools/.github/workflows/tests.yml@master + secrets: + FLYTE_BOT_PAT: ${{ secrets.FLYTE_BOT_PAT }} + + generate: + name: Check Go Gennerate + uses: flyteorg/flytetools/.github/workflows/go_generate.yml@master + + dry_run_goreleaser: + name: Dry Run Goreleaser + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: "2" + - uses: actions/cache@v2 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} + - uses: actions/setup-go@v2 + with: + go-version: '1.17' + - name: Run GoReleaser dry run + uses: goreleaser/goreleaser-action@v2 + with: + version: latest + args: --snapshot --skip-publish --rm-dist + + sandbox: + name: Test Getting started + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - uses: actions/cache@v2 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} + - name: Build Flytectl binary + run: make compile + - name: Create a sandbox cluster + run: bin/flytectl sandbox start + - name: Setup flytectl config + run: bin/flytectl config init + - name: Register cookbook + run: bin/flytectl register examples -d development -p flytesnacks + - name: Teardown Sandbox cluster + run: bin/flytectl sandbox teardown + + bump_version: + name: Bump Version + if: ${{ github.event_name != 'pull_request' }} + needs: [ lint, tests, generate, dry_run_goreleaser, sandbox ] # Only to ensure it can successfully build + uses: flyteorg/flytetools/.github/workflows/bump_version.yml@master + secrets: + FLYTE_BOT_PAT: ${{ secrets.FLYTE_BOT_PAT }} + + generate_docs: + name: Generate documentation + needs: [ bump_version ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + lfs: true + - uses: actions/setup-go@v1 + with: + go-version: '1.17' + - uses: actions/setup-python@v1 + with: + python-version: 3.8 + - uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: docs-pip-${{ runner.os }}-${{ hashFiles('doc-requirements.txt') }}-${{ hashFiles('doc-requirements.in') }} + restore-keys: docs-pip- + - uses: crazy-max/ghaction-import-gpg@v3 + with: + gpg-private-key: ${{ secrets.FLYTE_BOT_GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.FLYTE_BOT_GPG_PASSPHRASE }} + git-user-signingkey: true + git-commit-gpgsign: true + - name: Install Dependencies + run: | + # Install all requirments + pip install -r doc-requirements.txt + - name: Generate documentation + run: | + make -C docs gendocs + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.FLYTE_BOT_PAT }} + commit-message: Update documentation + committer: Flyte-Bot + author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> + signoff: true + branch: flyte-bot-update-documentation + delete-branch: true + title: 'Update documentation' + body: | + Update documentation + - Auto-generated by [flyte-bot] + labels: | + documentation + team-reviewers: | + owners + maintainers + draft: false + + goreleaser: + name: Goreleaser + needs: [ bump_version ] # Only to ensure it can successfully build + uses: flyteorg/flytetools/.github/workflows/goreleaser.yml@master + secrets: + FLYTE_BOT_PAT: ${{ secrets.FLYTE_BOT_PAT }} + diff --git a/flytectl/.github/workflows/generate-docs.yaml b/flytectl/.github/workflows/generate-docs.yaml deleted file mode 100644 index 853aefe30e..0000000000 --- a/flytectl/.github/workflows/generate-docs.yaml +++ /dev/null @@ -1,60 +0,0 @@ -name: Generate Documentation - -on: - push: - branches: - - master - -jobs: - generate-docs: - name: Generate documentation - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - lfs: true - - uses: actions/setup-go@v1 - with: - go-version: '1.17' - - uses: actions/setup-python@v1 - with: - python-version: 3.8 - - uses: actions/cache@v2 - with: - path: ~/.cache/pip - key: docs-pip-${{ runner.os }}-${{ hashFiles('doc-requirements.txt') }}-${{ hashFiles('doc-requirements.in') }} - restore-keys: docs-pip- - - uses: crazy-max/ghaction-import-gpg@v3 - with: - gpg-private-key: ${{ secrets.FLYTE_BOT_GPG_PRIVATE_KEY }} - passphrase: ${{ secrets.FLYTE_BOT_GPG_PASSPHRASE }} - git-user-signingkey: true - git-commit-gpgsign: true - - name: Install Dependencies - run: | - # Install all requirments - pip install -r doc-requirements.txt - - name: Generate documentation - run: | - make -C docs gendocs - - name: Create Pull Request - id: cpr - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.FLYTE_BOT_PAT }} - commit-message: Update documentation - committer: Flyte-Bot - author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> - signoff: true - branch: flyte-bot-update-documentation - delete-branch: true - title: 'Update documentation' - body: | - Update documentation - - Auto-generated by [flyte-bot] - labels: | - documentation - team-reviewers: | - owners - maintainers - draft: false diff --git a/flytectl/.github/workflows/master.yml b/flytectl/.github/workflows/master.yml deleted file mode 100644 index 5a414d6b62..0000000000 --- a/flytectl/.github/workflows/master.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Bump Version - -on: - push: - branches: - - master - paths-ignore: - - "docs/**" - - "boilerplate/**" - -jobs: - bump-version: - name: Bump Version - runs-on: ubuntu-latest - outputs: - version: ${{ steps.bump-version.outputs.tag }} - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: "0" - - name: Bump version and push tag - id: bump-version - uses: anothrNick/github-tag-action@1.17.2 - env: - GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} - WITH_V: true - DEFAULT_BUMP: patch diff --git a/flytectl/.github/workflows/release.yml b/flytectl/.github/workflows/release.yml deleted file mode 100644 index 47d6863674..0000000000 --- a/flytectl/.github/workflows/release.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Release Flytectl - -on: - push: - tags: - - 'v*' - -jobs: - releaser: - name: Release flytectl - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - fetch-depth: "0" - - uses: actions/setup-go@v2 - with: - go-version: '1.17' - - name: Run GoReleaser dry run - uses: goreleaser/goreleaser-action@v2 - with: - version: latest - args: release --rm-dist - env: - GITHUB_TOKEN: ${{ secrets.FLYTE_BOT_PAT }} diff --git a/flytectl/.github/workflows/sandbox.yaml b/flytectl/.github/workflows/sandbox.yaml deleted file mode 100644 index cb72047995..0000000000 --- a/flytectl/.github/workflows/sandbox.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: Test Getting started - -on: - pull_request: - branches: - - master - -jobs: - sandbox: - name: Test Getting started - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - uses: actions/cache@v2 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - - name: Build Flytectl binary - run: make compile - - name: Create a sandbox cluster - run: bin/flytectl sandbox start - - name: Setup flytectl config - run: bin/flytectl config init - - name: Register cookbook - run: bin/flytectl register examples -d development -p flytesnacks - - name: Teardown Sandbox cluster - run: bin/flytectl sandbox teardown diff --git a/flytectl/.github/workflows/update-flyte-component.yml b/flytectl/.github/workflows/update-flyte-component.yml deleted file mode 100644 index ec765da89f..0000000000 --- a/flytectl/.github/workflows/update-flyte-component.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Update Flyte component -on: - workflow_dispatch: - -jobs: - update-flyte-releases: - name: Update Flyte component - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: "0" - - name: Set up Go - uses: actions/setup-go@v2 - with: - go-version: 1.17 - - uses: crazy-max/ghaction-import-gpg@v3 - with: - gpg-private-key: ${{ secrets.FLYTE_BOT_GPG_PRIVATE_KEY }} - passphrase: ${{ secrets.FLYTE_BOT_GPG_PASSPHRASE }} - git-user-signingkey: true - git-commit-gpgsign: true - - name: Update Flyte component - run: | - FLYTEIDL_VERSION=$(curl --silent "https://api.github.com/repos/flyteorg/flyteidl/releases/latest" | jq -r .tag_name) - FLYTESTDLIB_VERSION=$(curl --silent "https://api.github.com/repos/flyteorg/flytestdlib/releases/latest" | jq -r .tag_name) - go get -u github.com/flyteorg/flyteidl@$FLYTEIDL_VERSION - go get -u github.com/flyteorg/flytestdlib@$FLYTESTDLIB_VERSION - go mod tidy - - name: Create Pull Request - id: cpr - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.FLYTE_BOT_PAT }} - commit-message: Update Flyteidl version - committer: Flyte-Bot - author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> - signoff: true - branch: flyte-bot-update-flyteidl - delete-branch: true - title: 'Update Flyteidl version' - body: | - Update Flyteidl version - - Auto-generated by [flyte-bot] - labels: | - flyteidl - team-reviewers: | - owners - maintainers - draft: false \ No newline at end of file diff --git a/flytectl/.github/workflows/upgrade_automtion.yml b/flytectl/.github/workflows/upgrade_automtion.yml new file mode 100644 index 0000000000..a087b8fd04 --- /dev/null +++ b/flytectl/.github/workflows/upgrade_automtion.yml @@ -0,0 +1,21 @@ +name: Upgrade Automation +on: + workflow_dispatch: + inputs: + component: + description: "Name of Flyte component" + required: true + default: "boilerplate" + type: choice + options: + - boilerplate + - flyteidl + - flytestdlib +jobs: + trigger-upgrade: + name: ${{ github.event.inputs.component }} Upgrade + uses: flyteorg/flytetools/.github/workflows/flyte_automation.yml@master + with: + component: ${{ github.event.inputs.component }} + secrets: + FLYTE_BOT_PAT: ${{ secrets.FLYTE_BOT_PAT }} diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index 71c3e45ffb..fc5e18936e 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -89,7 +89,7 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) sandboxConfig.DefaultConfig.Version = "v0.19.1" bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetSandboxImage(sandboxConfig.DefaultConfig.Version, imageName) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, From f3f6765a3222d7ccb60baa1f3719e207f82fbeb1 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Sat, 12 Feb 2022 05:43:35 +0530 Subject: [PATCH 215/645] Fixed create project (#277) * Fixed create project Signed-off-by: Yuvraj * Fixed unit test Signed-off-by: Yuvraj --- flytectl/clierrors/errors.go | 2 +- flytectl/cmd/config/subcommand/project/project_config.go | 4 ++++ flytectl/cmd/create/project.go | 4 +--- flytectl/cmd/create/project_test.go | 2 +- flytectl/cmd/update/project.go | 3 --- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/flytectl/clierrors/errors.go b/flytectl/clierrors/errors.go index 4f22acf5af..c3515bf212 100644 --- a/flytectl/clierrors/errors.go +++ b/flytectl/clierrors/errors.go @@ -3,7 +3,7 @@ package clierrors var ( ErrInvalidStateUpdate = "Invalid state passed. Specify either activate or archive\n" - ErrProjectNotPassed = "Project not passed\n" + ErrProjectNotPassed = "Project id not passed\n" // #nosec ErrProjectNameNotPassed = "project name is required flag" ErrFailedProjectUpdate = "Project %v failed to get updated due to %v\n" diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go index 87b9d190ed..e4c9bfb649 100644 --- a/flytectl/cmd/config/subcommand/project/project_config.go +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -56,6 +56,10 @@ func (c *ConfigProject) GetProjectSpec(id string) (*admin.Project, error) { if err != nil { return nil, err } + if projectSpec.Id == id { + return &projectSpec, nil + } + projectSpec.Id = id return &projectSpec, nil } diff --git a/flytectl/cmd/create/project.go b/flytectl/cmd/create/project.go index 9cc2ecf68a..95c4909c59 100644 --- a/flytectl/cmd/create/project.go +++ b/flytectl/cmd/create/project.go @@ -5,8 +5,6 @@ import ( "fmt" "github.com/flyteorg/flytectl/clierrors" - "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytectl/cmd/config/subcommand/project" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -41,7 +39,7 @@ Create a project by definition file. Note: The name shouldn't contain any whites ) func createProjectsCommand(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - projectSpec, err := project.DefaultProjectConfig.GetProjectSpec(config.GetConfig().Project) + projectSpec, err := project.DefaultProjectConfig.GetProjectSpec(project.DefaultProjectConfig.ID) if err != nil { return err } diff --git a/flytectl/cmd/create/project_test.go b/flytectl/cmd/create/project_test.go index ef55e5b365..867894c4b7 100644 --- a/flytectl/cmd/create/project_test.go +++ b/flytectl/cmd/create/project_test.go @@ -62,7 +62,7 @@ func TestEmptyProjectID(t *testing.T) { project.DefaultProjectConfig = &project.ConfigProject{} mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) err := createProjectsCommand(ctx, args, cmdCtx) - assert.Equal(t, errors.New(clierrors.ErrProjectNameNotPassed), err) + assert.Equal(t, errors.New(clierrors.ErrProjectNotPassed), err) mockClient.AssertNotCalled(t, "RegisterProject", ctx, mock.Anything) } diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index fd5ff592ff..d63bcb80d3 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -91,9 +91,6 @@ func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comma if projectSpec.Id == "" { return fmt.Errorf(clierrors.ErrProjectNotPassed) } - if projectSpec.Name == "" { - return fmt.Errorf(clierrors.ErrProjectNameNotPassed) - } state, err := project.DefaultProjectConfig.MapToAdminState() if err != nil { From f4ed59fff8b2b95348f9407225efa70d1599796e Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Tue, 15 Feb 2022 18:01:53 -0800 Subject: [PATCH 216/645] Use GetLatestRelease to list latest non-pre-release flytesnacks version #minor (#279) * Use GetLatestRelease to list latest non-pre-release flytesnacks version Signed-off-by: Eduardo Apolinario * Use GetLatestVersion Signed-off-by: Eduardo Apolinario * Move GetLatestVersion to its original place Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- flytectl/cmd/register/register_util.go | 13 ++----------- flytectl/pkg/util/githubutil/githubutil.go | 3 ++- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 29e83c698d..c94c990ee2 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -561,20 +561,11 @@ func getAllExample(repository, version string) ([]*github.ReleaseAsset, *github. } return filterExampleFromRelease(release), release, nil } - releases, err := githubutil.GetListRelease(repository) + release, err := githubutil.GetLatestVersion(repository) if err != nil { return nil, nil, err } - if len(releases) == 0 { - return nil, nil, fmt.Errorf("repository doesn't have any release") - } - for _, v := range releases { - if !*v.Prerelease { - return filterExampleFromRelease(v), v, nil - } - } - return nil, nil, nil - + return filterExampleFromRelease(release), release, nil } func getRemoteStoragePath(ctx context.Context, s *storage.DataStore, remoteLocation, file, identifier string) (storage.DataReference, error) { diff --git a/flytectl/pkg/util/githubutil/githubutil.go b/flytectl/pkg/util/githubutil/githubutil.go index 075b1cc8df..257eaad970 100644 --- a/flytectl/pkg/util/githubutil/githubutil.go +++ b/flytectl/pkg/util/githubutil/githubutil.go @@ -65,7 +65,8 @@ func GetGHClient() *github.Client { return github.NewClient(&http.Client{}) } -// GetLatestVersion returns the latest version of provided repository +// GetLatestVersion returns the latest non-prerelease version of provided repository, as +// described in https://docs.github.com/en/rest/reference/releases#get-the-latest-release func GetLatestVersion(repository string) (*github.RepositoryRelease, error) { client := GetGHClient() release, _, err := client.Repositories.GetLatestRelease(context.Background(), owner, repository) From 69c6afa4ab36b093112b9a7cd3284c223c52fe01 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Thu, 17 Feb 2022 17:59:47 +0530 Subject: [PATCH 217/645] Refactor (#275) * refactor packages Signed-off-by: Yuvraj --- flytectl/cmd/register/register_util.go | 2 +- flytectl/cmd/sandbox/start.go | 18 ++++++--- flytectl/cmd/sandbox/start_test.go | 40 +++++++++---------- flytectl/cmd/upgrade/upgrade.go | 4 +- flytectl/cmd/upgrade/upgrade_test.go | 4 +- flytectl/cmd/version/version.go | 4 +- .../pkg/{util => }/githubutil/githubutil.go | 13 +++--- .../{util => }/githubutil/githubutil_test.go | 25 +++++++++++- .../{util => }/platformutil/platformutil.go | 0 .../platformutil/platformutil_test.go | 0 10 files changed, 70 insertions(+), 40 deletions(-) rename flytectl/pkg/{util => }/githubutil/githubutil.go (93%) rename flytectl/pkg/{util => }/githubutil/githubutil_test.go (75%) rename flytectl/pkg/{util => }/platformutil/platformutil.go (100%) rename flytectl/pkg/{util => }/platformutil/platformutil_test.go (100%) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index c94c990ee2..9f3b678794 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -15,7 +15,7 @@ import ( "sort" "strings" - "github.com/flyteorg/flytectl/pkg/util/githubutil" + "github.com/flyteorg/flytectl/pkg/githubutil" "github.com/flyteorg/flytestdlib/contextutils" "github.com/flyteorg/flytestdlib/promutils" diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 00c445d509..a946601c5c 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -9,10 +9,10 @@ import ( "path/filepath" "time" - "github.com/flyteorg/flytectl/pkg/util/githubutil" + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/pkg/githubutil" "github.com/avast/retry-go" - "github.com/flyteorg/flytectl/clierrors" "github.com/olekukonko/tablewriter" corev1api "k8s.io/api/core/v1" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" @@ -52,11 +52,19 @@ Run specific version of Flyte. FlyteCTL sandbox only supports Flyte version avai Note: FlyteCTL sandbox is only supported for Flyte versions > v0.10.0 +Run latest pre release of Flyte. +:: + + flytectl sandbox start --pre + +Note: pre release flag will be ignore if user pass version flag, In that case Flytectl will use specific version. + Specify a Flyte Sandbox compliant image with the registry. This is useful in case you want to use an image from your registry. :: flytectl sandbox start --image docker.io/my-override:latest +Note: If image flag is passed then Flytectl will ignore version and pre flags. Specify a Flyte Sandbox image pull policy. Possible pull policy values are Always, IfNotPresent, or Never: :: @@ -70,7 +78,7 @@ Usage taintEffect = "NoSchedule" sandboxContextName = "flyte-sandbox" sandboxDockerContext = "default" - imageName = "cr.flyte.org/flyteorg/flyte-sandbox" + sandboxImageName = "cr.flyte.org/flyteorg/flyte-sandbox" ) type ExecResult struct { @@ -159,8 +167,8 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu volumes = append(volumes, *vol) } sandboxImage := sandboxConfig.DefaultConfig.Image - if len(sandboxConfig.DefaultConfig.Image) == 0 { - image, version, err := githubutil.GetSandboxImage(sandboxConfig.DefaultConfig.Version, imageName) + if len(sandboxImage) == 0 { + image, version, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, sandboxImageName, sandboxConfig.DefaultConfig.Prerelease) if err != nil { return nil, err } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index fc5e18936e..a70e136334 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - "github.com/flyteorg/flytectl/pkg/util/githubutil" + "github.com/flyteorg/flytectl/pkg/githubutil" "github.com/flyteorg/flytectl/pkg/k8s" @@ -89,7 +89,7 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) sandboxConfig.DefaultConfig.Version = "v0.19.1" bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetSandboxImage(sandboxConfig.DefaultConfig.Version, imageName) + image, _, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -120,7 +120,7 @@ func TestStartSandboxFunc(t *testing.T) { ctx := context.Background() mockDocker := &mocks.Docker{} errCh := make(chan error) - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -169,7 +169,7 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -211,7 +211,7 @@ func TestStartSandboxFunc(t *testing.T) { Source: absPath, Target: docker.Source, }) - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -246,7 +246,7 @@ func TestStartSandboxFunc(t *testing.T) { sandboxConfig.DefaultConfig.Version = "v0.18.0" sandboxConfig.DefaultConfig.Source = "" - image, _, err := githubutil.GetSandboxImage(sandboxConfig.DefaultConfig.Version, imageName) + image, _, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, sandboxImageName, false) assert.Nil(t, err) volumes := docker.Volumes mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -281,7 +281,7 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Version = "v0.1444.0" sandboxConfig.DefaultConfig.Source = "" - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) volumes := docker.Volumes mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -314,7 +314,7 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := docker.Volumes @@ -360,7 +360,7 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -402,7 +402,7 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = "" sandboxConfig.DefaultConfig.Version = "" - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -441,7 +441,7 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -481,7 +481,7 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -525,7 +525,7 @@ func TestStartSandboxFunc(t *testing.T) { if err != nil { t.Error(err) } - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -565,7 +565,7 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker := &mocks.Docker{} errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -700,26 +700,26 @@ func TestGetNodeTaintStatus(t *testing.T) { func TestGetSandboxImage(t *testing.T) { t.Run("Get Latest sandbox", func(t *testing.T) { - image, _, err := githubutil.GetSandboxImage("", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) assert.Nil(t, err) assert.Equal(t, true, strings.HasPrefix(image, "cr.flyte.org/flyteorg/flyte-sandbox:dind-")) }) t.Run("Get sandbox image with version ", func(t *testing.T) { - image, _, err := githubutil.GetSandboxImage("v0.14.0", imageName) + image, _, err := githubutil.GetFullyQualifiedImageName("v0.14.0", sandboxImageName, false) assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(image, imageName)) + assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) }) t.Run("Get sandbox image with wrong version ", func(t *testing.T) { - _, _, err := githubutil.GetSandboxImage("v100.1.0", imageName) + _, _, err := githubutil.GetFullyQualifiedImageName("v100.1.0", sandboxImageName, false) assert.NotNil(t, err) }) t.Run("Get sandbox image with wrong version ", func(t *testing.T) { - _, _, err := githubutil.GetSandboxImage("aaaaaa", imageName) + _, _, err := githubutil.GetFullyQualifiedImageName("aaaaaa", sandboxImageName, false) assert.NotNil(t, err) }) t.Run("Get sandbox image with version that is not supported", func(t *testing.T) { - _, _, err := githubutil.GetSandboxImage("v0.10.0", imageName) + _, _, err := githubutil.GetFullyQualifiedImageName("v0.10.0", sandboxImageName, false) assert.NotNil(t, err) }) diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go index b0965f20d9..37ae2feb73 100644 --- a/flytectl/cmd/upgrade/upgrade.go +++ b/flytectl/cmd/upgrade/upgrade.go @@ -12,13 +12,13 @@ import ( stdlibversion "github.com/flyteorg/flytestdlib/version" - "github.com/flyteorg/flytectl/pkg/util/githubutil" + "github.com/flyteorg/flytectl/pkg/githubutil" "github.com/flyteorg/flytestdlib/logger" "github.com/mouuff/go-rocket-update/pkg/updater" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/util/platformutil" + "github.com/flyteorg/flytectl/pkg/platformutil" "github.com/spf13/cobra" ) diff --git a/flytectl/cmd/upgrade/upgrade_test.go b/flytectl/cmd/upgrade/upgrade_test.go index 9708bc43fd..d89f93aecf 100644 --- a/flytectl/cmd/upgrade/upgrade_test.go +++ b/flytectl/cmd/upgrade/upgrade_test.go @@ -5,10 +5,10 @@ import ( "sort" "testing" + "github.com/flyteorg/flytectl/pkg/githubutil" "github.com/flyteorg/flytectl/pkg/util" - "github.com/flyteorg/flytectl/pkg/util/githubutil" - "github.com/flyteorg/flytectl/pkg/util/platformutil" + "github.com/flyteorg/flytectl/pkg/platformutil" "github.com/flyteorg/flyteidl/clients/go/admin/mocks" stdlibversion "github.com/flyteorg/flytestdlib/version" diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go index f52dd27407..2f5d9f3f62 100644 --- a/flytectl/cmd/version/version.go +++ b/flytectl/cmd/version/version.go @@ -6,9 +6,9 @@ import ( "fmt" "runtime" - "github.com/flyteorg/flytectl/pkg/util/githubutil" + "github.com/flyteorg/flytectl/pkg/githubutil" - "github.com/flyteorg/flytectl/pkg/util/platformutil" + "github.com/flyteorg/flytectl/pkg/platformutil" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" diff --git a/flytectl/pkg/util/githubutil/githubutil.go b/flytectl/pkg/githubutil/githubutil.go similarity index 93% rename from flytectl/pkg/util/githubutil/githubutil.go rename to flytectl/pkg/githubutil/githubutil.go index 257eaad970..b948fe880d 100644 --- a/flytectl/pkg/util/githubutil/githubutil.go +++ b/flytectl/pkg/githubutil/githubutil.go @@ -8,15 +8,13 @@ import ( "runtime" "strings" - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" - "github.com/flyteorg/flytectl/pkg/util" "github.com/flyteorg/flytestdlib/logger" "golang.org/x/oauth2" - "github.com/flyteorg/flytectl/pkg/util/platformutil" + "github.com/flyteorg/flytectl/pkg/platformutil" stdlibversion "github.com/flyteorg/flytestdlib/version" "github.com/mouuff/go-rocket-update/pkg/provider" "github.com/mouuff/go-rocket-update/pkg/updater" @@ -105,7 +103,7 @@ func GetSandboxImageSha(version string, pre bool) (string, string, error) { break } } - logger.Infof(context.Background(), "sandbox started with release %s", release.GetTagName()) + logger.Infof(context.Background(), "starting with release %s", release.GetTagName()) } else if len(version) > 0 { r, err := CheckVersionExist(version, flyte) if err != nil { @@ -213,11 +211,12 @@ func CheckBrewInstall(goos platformutil.Platform) (string, error) { return "", nil } -// GetSandboxImage Returns the alternate image if specified, else +// GetFullyQualifiedImageName Returns the sandbox image, version and error // if no version is specified then the Latest release of cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA} is used // else cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA}, where sha is derived from the version. -func GetSandboxImage(version, image string) (string, string, error) { - sha, version, err := GetSandboxImageSha(version, sandboxConfig.DefaultConfig.Prerelease) +// If pre release is true then use latest pre release of Flyte, In that case User don't need to pass version +func GetFullyQualifiedImageName(version, image string, pre bool) (string, string, error) { + sha, version, err := GetSandboxImageSha(version, pre) if err != nil { return "", version, err } diff --git a/flytectl/pkg/util/githubutil/githubutil_test.go b/flytectl/pkg/githubutil/githubutil_test.go similarity index 75% rename from flytectl/pkg/util/githubutil/githubutil_test.go rename to flytectl/pkg/githubutil/githubutil_test.go index 2f2eb64345..70f383034d 100644 --- a/flytectl/pkg/util/githubutil/githubutil_test.go +++ b/flytectl/pkg/githubutil/githubutil_test.go @@ -8,11 +8,13 @@ import ( stdlibversion "github.com/flyteorg/flytestdlib/version" - "github.com/flyteorg/flytectl/pkg/util/platformutil" + "github.com/flyteorg/flytectl/pkg/platformutil" "github.com/stretchr/testify/assert" ) +var sandboxImageName = "cr.flyte.org/flyteorg/flyte-sandbox" + func TestGetLatestVersion(t *testing.T) { t.Run("Get latest release with wrong url", func(t *testing.T) { _, err := GetLatestVersion("fl") @@ -42,6 +44,27 @@ func TestCheckVersionExist(t *testing.T) { }) } +func TestGetFullyQualifiedImageName(t *testing.T) { + t.Run("Get tFully Qualified Image Name ", func(t *testing.T) { + image, tag, err := GetFullyQualifiedImageName("", sandboxImageName, false) + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(tag, "v")) + assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) + }) + t.Run("Get tFully Qualified Image Name with pre release", func(t *testing.T) { + image, tag, err := GetFullyQualifiedImageName("", sandboxImageName, true) + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(tag, "v")) + assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) + }) + t.Run("Get tFully Qualified Image Name with specific version", func(t *testing.T) { + image, tag, err := GetFullyQualifiedImageName("v0.19.0", sandboxImageName, true) + assert.Nil(t, err) + assert.Equal(t, "v0.19.0", tag) + assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) + }) +} + func TestGetSHAFromVersion(t *testing.T) { t.Run("Invalid Tag", func(t *testing.T) { _, err := GetSHAFromVersion("v100.0.0", "flyte") diff --git a/flytectl/pkg/util/platformutil/platformutil.go b/flytectl/pkg/platformutil/platformutil.go similarity index 100% rename from flytectl/pkg/util/platformutil/platformutil.go rename to flytectl/pkg/platformutil/platformutil.go diff --git a/flytectl/pkg/util/platformutil/platformutil_test.go b/flytectl/pkg/platformutil/platformutil_test.go similarity index 100% rename from flytectl/pkg/util/platformutil/platformutil_test.go rename to flytectl/pkg/platformutil/platformutil_test.go From 3199afa1b80dba319fe483c76597a30599974d26 Mon Sep 17 00:00:00 2001 From: Alekhya Sai Date: Thu, 17 Feb 2022 20:19:04 +0530 Subject: [PATCH 218/645] Modified latest version message (#283) Signed-off-by: Alekhya Sai Punnamaraju --- flytectl/cmd/upgrade/upgrade.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go index 37ae2feb73..89963b3b71 100644 --- a/flytectl/cmd/upgrade/upgrade.go +++ b/flytectl/cmd/upgrade/upgrade.go @@ -115,7 +115,7 @@ func isUpgradeSupported(goos platformutil.Platform) (bool, error) { if isGreater, err := util.IsVersionGreaterThan(latest, stdlibversion.Version); err != nil { return false, err } else if !isGreater { - fmt.Println("You have already latest version of flytectl") + fmt.Println("You already have the latest version of flytectl") return false, nil } From 5d691856f16913ed004742a07a774565e24d2005 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Fri, 18 Feb 2022 08:01:13 +0530 Subject: [PATCH 219/645] bump docker/distribution (#281) Signed-off-by: Yuvraj --- flytectl/go.mod | 2 +- flytectl/go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 3481e540f0..b34924a30d 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -66,7 +66,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/danieljoos/wincred v1.1.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/distribution v2.7.1+incompatible // indirect + github.com/docker/distribution v2.8.0+incompatible // indirect github.com/docker/go-units v0.4.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/evanphx/json-patch v4.9.0+incompatible // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index a1093f10c1..9787249411 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -314,8 +314,9 @@ github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= +github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= From 7992166921f620dd42a043b1e8bd4a643306e3e4 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Thu, 17 Feb 2022 18:42:32 -0800 Subject: [PATCH 220/645] Update documentation (#282) Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- flytectl/docs/source/gen/flytectl_sandbox_start.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 402342248a..ec6fa871cf 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -29,11 +29,19 @@ Run specific version of Flyte. FlyteCTL sandbox only supports Flyte version avai Note: FlyteCTL sandbox is only supported for Flyte versions > v0.10.0 +Run latest pre release of Flyte. +:: + + flytectl sandbox start --pre + +Note: pre release flag will be ignore if user pass version flag, In that case Flytectl will use specific version. + Specify a Flyte Sandbox compliant image with the registry. This is useful in case you want to use an image from your registry. :: flytectl sandbox start --image docker.io/my-override:latest +Note: If image flag is passed then Flytectl will ignore version and pre flags. Specify a Flyte Sandbox image pull policy. Possible pull policy values are Always, IfNotPresent, or Never: :: From fc506a38d69aa6b836d227adc69adac27afb728a Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Thu, 17 Feb 2022 21:15:13 -0800 Subject: [PATCH 221/645] Update documentation (#284) Signed-off-by: Flyte-Bot Co-authored-by: evalsocket From 9cb07f9a14d46dc3151c4be33c631d0a70e198e0 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Sat, 19 Feb 2022 09:16:53 +0530 Subject: [PATCH 222/645] Fixed validation logic for launch plan schedule registration (#280) --- flytectl/cmd/register/register_util.go | 119 ++++- flytectl/cmd/register/register_util_test.go | 442 ++++++++++++++---- .../testdata/152_my_cron_scheduled_lp_3.pb | Bin 0 -> 373 bytes 3 files changed, 442 insertions(+), 119 deletions(-) create mode 100644 flytectl/cmd/register/testdata/152_my_cron_scheduled_lp_3.pb diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 9f3b678794..f81c438fec 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -275,39 +275,94 @@ func hydrateTaskSpec(task *admin.TaskSpec, sourceCode, sourceUploadPath, version return nil } -func validateLaunchSpec(lpSpec *admin.LaunchPlanSpec) error { - if lpSpec == nil { - return nil - } - if lpSpec.EntityMetadata != nil && lpSpec.EntityMetadata.Schedule != nil { - schedule := lpSpec.EntityMetadata.Schedule - var scheduleFixedParams []string - if lpSpec.DefaultInputs != nil { - for paramKey := range lpSpec.DefaultInputs.Parameters { - if paramKey != schedule.KickoffTimeInputArg { - scheduleFixedParams = append(scheduleFixedParams, paramKey) - } +func validateLPWithSchedule(lpSpec *admin.LaunchPlanSpec, wf *admin.Workflow) error { + schedule := lpSpec.EntityMetadata.Schedule + var scheduleRequiredParams []string + if wf != nil && wf.Closure != nil && wf.Closure.CompiledWorkflow != nil && + wf.Closure.CompiledWorkflow.Primary != nil && wf.Closure.CompiledWorkflow.Primary.Template != nil && + wf.Closure.CompiledWorkflow.Primary.Template.Interface != nil && + wf.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs != nil { + variables := wf.Closure.CompiledWorkflow.Primary.Template.Interface.Inputs.Variables + for varName := range variables { + if varName != schedule.KickoffTimeInputArg { + scheduleRequiredParams = append(scheduleRequiredParams, varName) } } - if (lpSpec.FixedInputs == nil && len(scheduleFixedParams) > 0) || - (len(scheduleFixedParams) > len(lpSpec.FixedInputs.Literals)) { - fixedInputLen := 0 - if lpSpec.FixedInputs != nil { - fixedInputLen = len(lpSpec.FixedInputs.Literals) + + } + // Either the scheduled param should have default or fixed values + var scheduleParamsWithValues []string + // Check for default values + if lpSpec.DefaultInputs != nil { + for paramName := range lpSpec.DefaultInputs.Parameters { + if paramName != schedule.KickoffTimeInputArg { + scheduleParamsWithValues = append(scheduleParamsWithValues, paramName) } - return fmt.Errorf("param values are missing on scheduled workflow."+ - "additional args other than %v on scheduled workflow are %v > %v fixed values", schedule.KickoffTimeInputArg, - len(scheduleFixedParams), fixedInputLen) } } + // Check for fixed values + if lpSpec.FixedInputs != nil && lpSpec.FixedInputs.Literals != nil { + for fixedLiteralName := range lpSpec.FixedInputs.Literals { + scheduleParamsWithValues = append(scheduleParamsWithValues, fixedLiteralName) + } + } + + diffSet := leftDiff(scheduleRequiredParams, scheduleParamsWithValues) + if len(diffSet) > 0 { + return fmt.Errorf("param values are missing on scheduled workflow "+ + "for the following params %v. Either specify them having a default or fixed value", diffSet) + } return nil } -func hydrateLaunchPlanSpec(configAssumableIamRole string, configK8sServiceAccount string, configOutputLocationPrefix string, lpSpec *admin.LaunchPlanSpec) error { - - if err := validateLaunchSpec(lpSpec); err != nil { +func validateLaunchSpec(ctx context.Context, lpSpec *admin.LaunchPlanSpec, cmdCtx cmdCore.CommandContext) error { + if lpSpec == nil || lpSpec.WorkflowId == nil || lpSpec.EntityMetadata == nil || + lpSpec.EntityMetadata.Schedule == nil { + return nil + } + // Fetch the workflow spec using the identifier + workflowID := lpSpec.WorkflowId + wf, err := cmdCtx.AdminFetcherExt().FetchWorkflowVersion(ctx, workflowID.Name, workflowID.Version, + workflowID.Project, workflowID.Domain) + if err != nil { return err } + + return validateLPWithSchedule(lpSpec, wf) +} + +// Finds the left diff between to two string slices +// If a and b are two sets then the o/p c is defined as : +// c = a - a ^ b +// where ^ is intersection slice of a and b +// and - removes all the common elements and returns a new slice +// a= {1,2,3} +// b = {3,4,5} +// o/p c = {1,2} +func leftDiff(a, b []string) []string { + m := make(map[string]bool) + + for _, item := range a { + m[item] = true + } + + for _, item := range b { + delete(m, item) + } + // nil semantics on return + if len(m) == 0 { + return nil + } + c := make([]string, len(m)) + index := 0 + for item := range m { + c[index] = item + index++ + } + return c +} + +func hydrateLaunchPlanSpec(configAssumableIamRole string, configK8sServiceAccount string, configOutputLocationPrefix string, lpSpec *admin.LaunchPlanSpec) error { assumableIamRole := len(configAssumableIamRole) > 0 k8sServiceAcct := len(configK8sServiceAccount) > 0 outputLocationPrefix := len(configOutputLocationPrefix) > 0 @@ -325,6 +380,18 @@ func hydrateLaunchPlanSpec(configAssumableIamRole string, configK8sServiceAccoun return nil } +// Validate the spec before sending it to admin. +func validateSpec(ctx context.Context, message proto.Message, cmdCtx cmdCore.CommandContext) error { + switch v := message.(type) { + case *admin.LaunchPlan: + launchPlan := v + if err := validateLaunchSpec(ctx, launchPlan.Spec, cmdCtx); err != nil { + return err + } + } + return nil +} + func hydrateSpec(message proto.Message, sourceCode string, config rconfig.FilesConfig) error { switch v := message.(type) { case *admin.LaunchPlan: @@ -479,7 +546,11 @@ func registerFile(ctx context.Context, fileName, sourceCode string, registerResu } logger.Debugf(ctx, "Hydrated spec : %v", getJSONSpec(spec)) - + if err = validateSpec(ctx, spec, cmdCtx); err != nil { + registerResult = Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error hydrating spec due to %v", err)} + registerResults = append(registerResults, registerResult) + return registerResults, err + } if err := register(ctx, spec, cmdCtx, config.DryRun); err != nil { // If error is AlreadyExists then dont consider this to be an error but just a warning state if grpcError := status.Code(err); grpcError == codes.AlreadyExists { diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index a711495293..15a14a8887 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -1,11 +1,13 @@ package register import ( + "context" "errors" "fmt" "net/http" "os" "path/filepath" + "sort" "strings" "testing" @@ -13,7 +15,6 @@ import ( v1 "k8s.io/api/core/v1" - "github.com/flyteorg/flyteidl/clients/go/coreutils" "github.com/flyteorg/flytestdlib/contextutils" "github.com/flyteorg/flytestdlib/promutils" "github.com/flyteorg/flytestdlib/promutils/labeled" @@ -224,6 +225,61 @@ func TestRegisterFile(t *testing.T) { assert.Equal(t, 1, len(results)) assert.Nil(t, err) }) + t.Run("Failed Scheduled launch plan registration", func(t *testing.T) { + setup() + registerFilesSetup() + mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + variableMap := map[string]*core.Variable{ + "var1": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + Description: "var1", + }, + "var2": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + Description: "var2 long descriptions probably needs truncate", + }, + } + wf := &admin.Workflow{ + Closure: &admin.WorkflowClosure{ + CompiledWorkflow: &core.CompiledWorkflowClosure{ + Primary: &core.CompiledWorkflow{ + Template: &core.WorkflowTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }, + }, + }, + } + mockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) + args = []string{"testdata/152_my_cron_scheduled_lp_3.pb"} + var registerResults []Result + results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) + assert.Equal(t, 1, len(results)) + assert.Equal(t, "Failed", results[0].Status) + assert.Equal(t, "Error hydrating spec due to param values are missing on scheduled workflow for"+ + " the following params [var1 var2]. Either specify them having a default or fixed value", results[0].Info) + assert.NotNil(t, err) + }) t.Run("Non existent file", func(t *testing.T) { setup() registerFilesSetup() @@ -313,100 +369,6 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { assert.Nil(t, err) assert.Equal(t, &admin.RawOutputDataConfig{OutputLocationPrefix: "prefix"}, lpSpec.RawOutputDataConfig) }) - t.Run("Validation successful", func(t *testing.T) { - lpSpec := &admin.LaunchPlanSpec{ - EntityMetadata: &admin.LaunchPlanMetadata{ - Schedule: &admin.Schedule{ - ScheduleExpression: &admin.Schedule_CronExpression{ - CronExpression: "foo", - }, - KickoffTimeInputArg: "kickoff_time_arg", - }, - }, - FixedInputs: &core.LiteralMap{ - Literals: map[string]*core.Literal{}, - }, - } - err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) - assert.Nil(t, err) - }) - t.Run("Validation failure", func(t *testing.T) { - lpSpec := &admin.LaunchPlanSpec{ - EntityMetadata: &admin.LaunchPlanMetadata{ - Schedule: &admin.Schedule{ - ScheduleExpression: &admin.Schedule_CronExpression{ - CronExpression: "expr", - }, - KickoffTimeInputArg: "kickoff_time_arg", - }, - }, - DefaultInputs: &core.ParameterMap{ - Parameters: map[string]*core.Parameter{ - "bar": { - Var: &core.Variable{ - Type: &core.LiteralType{Type: &core.LiteralType_Simple{Simple: core.SimpleType_STRING}}, - }, - }, - }, - }, - FixedInputs: &core.LiteralMap{ - Literals: map[string]*core.Literal{}, - }, - } - err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) - assert.NotNil(t, err) - }) - t.Run("Validation failed with fixed inputs empty", func(t *testing.T) { - lpSpec := &admin.LaunchPlanSpec{ - EntityMetadata: &admin.LaunchPlanMetadata{ - Schedule: &admin.Schedule{ - ScheduleExpression: &admin.Schedule_CronExpression{ - CronExpression: "expr", - }, - KickoffTimeInputArg: "kickoff_time_arg", - }, - }, - DefaultInputs: &core.ParameterMap{ - Parameters: map[string]*core.Parameter{ - "bar": { - Var: &core.Variable{ - Type: &core.LiteralType{Type: &core.LiteralType_Simple{Simple: core.SimpleType_STRING}}, - }, - }, - }, - }, - } - err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) - assert.NotNil(t, err) - }) - t.Run("Validation success with fixed", func(t *testing.T) { - lpSpec := &admin.LaunchPlanSpec{ - EntityMetadata: &admin.LaunchPlanMetadata{ - Schedule: &admin.Schedule{ - ScheduleExpression: &admin.Schedule_CronExpression{ - CronExpression: "expr", - }, - KickoffTimeInputArg: "kickoff_time_arg", - }, - }, - DefaultInputs: &core.ParameterMap{ - Parameters: map[string]*core.Parameter{ - "bar": { - Var: &core.Variable{ - Type: &core.LiteralType{Type: &core.LiteralType_Simple{Simple: core.SimpleType_STRING}}, - }, - }, - }, - }, - FixedInputs: &core.LiteralMap{ - Literals: map[string]*core.Literal{ - "bar": coreutils.MustMakeLiteral("bar-value"), - }, - }, - } - err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) - assert.Nil(t, err) - }) } func TestUploadFastRegisterArtifact(t *testing.T) { @@ -550,3 +512,293 @@ func TestHydrateTaskSpec(t *testing.T) { assert.Len(t, hydratedPodSpec.Containers[1].Args, 2) assert.True(t, strings.HasSuffix(hydratedPodSpec.Containers[1].Args[1], "sourcey")) } + +func TestLeftDiff(t *testing.T) { + t.Run("empty slices", func(t *testing.T) { + c := leftDiff(nil, nil) + assert.Empty(t, c) + }) + t.Run("right empty slice", func(t *testing.T) { + a := []string{"1", "2", "3"} + c := leftDiff(a, nil) + sort.Strings(a) + sort.Strings(c) + assert.Equal(t, a, c) + }) + t.Run("non empty slices without intersection", func(t *testing.T) { + a := []string{"1", "2", "3"} + b := []string{"5", "6", "7"} + c := leftDiff(a, b) + sort.Strings(a) + sort.Strings(c) + assert.Equal(t, a, c) + }) + t.Run("non empty slices with some intersection", func(t *testing.T) { + a := []string{"1", "2", "3"} + b := []string{"2", "5", "7"} + c := leftDiff(a, b) + expected := []string{"1", "3"} + sort.Strings(expected) + sort.Strings(c) + assert.Equal(t, expected, c) + }) + + t.Run("non empty slices with full intersection same order", func(t *testing.T) { + a := []string{"1", "2", "3"} + b := []string{"1", "2", "3"} + c := leftDiff(a, b) + var expected []string + sort.Strings(c) + assert.Equal(t, expected, c) + }) + + t.Run("non empty slices with full intersection diff order", func(t *testing.T) { + a := []string{"1", "2", "3"} + b := []string{"2", "3", "1"} + c := leftDiff(a, b) + var expected []string + sort.Strings(c) + assert.Equal(t, expected, c) + }) +} + +func TestValidateLaunchSpec(t *testing.T) { + ctx := context.Background() + t.Run("nil launchplan spec", func(t *testing.T) { + registerFilesSetup() + err := validateLaunchSpec(ctx, nil, cmdCtx) + assert.Nil(t, err) + }) + t.Run("launchplan spec with nil workflow id", func(t *testing.T) { + registerFilesSetup() + lpSpec := &admin.LaunchPlanSpec{} + err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + assert.Nil(t, err) + }) + t.Run("launchplan spec with empty metadata", func(t *testing.T) { + registerFilesSetup() + lpSpec := &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Project: "projectValue", + Domain: "domainValue", + Name: "workflowNameValue", + Version: "workflowVersionValue", + }, + } + err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + assert.Nil(t, err) + }) + t.Run("launchplan spec with metadata and empty schedule", func(t *testing.T) { + registerFilesSetup() + lpSpec := &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Project: "projectValue", + Domain: "domainValue", + Name: "workflowNameValue", + Version: "workflowVersionValue", + }, + EntityMetadata: &admin.LaunchPlanMetadata{}, + } + err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + assert.Nil(t, err) + }) + t.Run("validate spec failed to fetch workflow", func(t *testing.T) { + setup() + registerFilesSetup() + + mockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + lpSpec := &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Project: "projectValue", + Domain: "domainValue", + Name: "workflowNameValue", + Version: "workflowVersionValue", + }, + EntityMetadata: &admin.LaunchPlanMetadata{ + Schedule: &admin.Schedule{ + KickoffTimeInputArg: "kick_off_time_arg", + }, + }, + } + lp := &admin.LaunchPlan{ + Spec: lpSpec, + } + err := validateSpec(ctx, lp, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, "failed", err.Error()) + }) + t.Run("failed to fetch workflow", func(t *testing.T) { + setup() + registerFilesSetup() + + mockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + lpSpec := &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Project: "projectValue", + Domain: "domainValue", + Name: "workflowNameValue", + Version: "workflowVersionValue", + }, + EntityMetadata: &admin.LaunchPlanMetadata{ + Schedule: &admin.Schedule{ + KickoffTimeInputArg: "kick_off_time_arg", + }, + }, + } + err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, "failed", err.Error()) + }) + t.Run("launchplan spec missing required param schedule", func(t *testing.T) { + setup() + registerFilesSetup() + variableMap := map[string]*core.Variable{ + "var1": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + Description: "var1", + }, + "var2": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + Description: "var2 long descriptions probably needs truncate", + }, + } + wf := &admin.Workflow{ + Closure: &admin.WorkflowClosure{ + CompiledWorkflow: &core.CompiledWorkflowClosure{ + Primary: &core.CompiledWorkflow{ + Template: &core.WorkflowTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }, + }, + }, + } + mockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) + lpSpec := &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Project: "projectValue", + Domain: "domainValue", + Name: "workflowNameValue", + Version: "workflowVersionValue", + }, + EntityMetadata: &admin.LaunchPlanMetadata{ + Schedule: &admin.Schedule{ + KickoffTimeInputArg: "kick_off_time_arg", + }, + }, + } + err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, "param values are missing on scheduled workflow for the following params [var1 var2]."+ + " Either specify them having a default or fixed value", err.Error()) + }) + t.Run("launchplan spec non empty schedule required param success", func(t *testing.T) { + setup() + registerFilesSetup() + variableMap := map[string]*core.Variable{ + "var1": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + Description: "var1", + }, + "var2": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + Description: "var2 long descriptions probably needs truncate", + }, + } + wf := &admin.Workflow{ + Closure: &admin.WorkflowClosure{ + CompiledWorkflow: &core.CompiledWorkflowClosure{ + Primary: &core.CompiledWorkflow{ + Template: &core.WorkflowTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }, + }, + }, + } + mockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) + lpSpec := &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Project: "projectValue", + Domain: "domainValue", + Name: "workflowNameValue", + Version: "workflowVersionValue", + }, + EntityMetadata: &admin.LaunchPlanMetadata{ + Schedule: &admin.Schedule{ + KickoffTimeInputArg: "kick_off_time_arg", + }, + }, + DefaultInputs: &core.ParameterMap{ + Parameters: map[string]*core.Parameter{ + "var1": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{Simple: core.SimpleType_INTEGER}, + }, + }, + }, + }, + }, + FixedInputs: &core.LiteralMap{ + Literals: map[string]*core.Literal{ + "var2": { + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, + }, + }, + }, + }, + }, + }, + }, + }, + } + err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + assert.Nil(t, err) + }) +} diff --git a/flytectl/cmd/register/testdata/152_my_cron_scheduled_lp_3.pb b/flytectl/cmd/register/testdata/152_my_cron_scheduled_lp_3.pb new file mode 100644 index 0000000000000000000000000000000000000000..9f56c79ae1e1a3344fb64aea12dd0ffc20d17da3 GIT binary patch literal 373 zcmbV|%}N6?5XX~Rp^P7gAf*P1%N{)JVMQ;3C(ph_2-!)EyV)$0=pv;r;K5hcprF)3 z4>G5jAO8;q+S!4S>vci6axsxkF7)+4;R#JDHXC{Vmo>p_*Jo6o`B!Bq^eUQ1Y@R!8 zR5w&RW-mxFn`VXh;PB38lm7pmDO!B|Jwgrbv*b<64h|CYg)^)*4cEj%2 M1AF64P6d Date: Fri, 4 Mar 2022 19:50:37 +0530 Subject: [PATCH 223/645] Added env flag for sandbox start (#273) * Added env flag for sandbox start Signed-off-by: Prafulla Mahindrakar * ADDED docs for FLYTE_TIMEOUT Signed-off-by: Prafulla Mahindrakar * Fixed validation logic for launch plan schedule registration (#280) Signed-off-by: Prafulla Mahindrakar Signed-off-by: pmahindrakar-oss * boilerplate updates Signed-off-by: Prafulla Mahindrakar * fixed unit test after stdlib upgrade Signed-off-by: Prafulla Mahindrakar * fixed unit test Signed-off-by: Prafulla Mahindrakar --- .../flyte/golang_support_tools/go.mod | 182 +++++++++++++++++- .../flyte/golang_support_tools/tools.go | 2 +- .../golang_test_targets/download_tooling.sh | 4 +- .../config/subcommand/sandbox/config_flags.go | 1 + .../subcommand/sandbox/config_flags_test.go | 14 ++ .../subcommand/sandbox/sandbox_config.go | 3 + .../cmd/configuration/configuration_test.go | 17 +- flytectl/cmd/register/register_util_test.go | 6 +- flytectl/cmd/sandbox/start.go | 29 ++- .../source/gen/flytectl_sandbox_start.rst | 23 +++ flytectl/go.mod | 2 +- flytectl/go.sum | 4 +- flytectl/pkg/docker/docker_util.go | 5 +- flytectl/pkg/docker/docker_util_test.go | 36 +++- 14 files changed, 303 insertions(+), 25 deletions(-) diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.mod b/flytectl/boilerplate/flyte/golang_support_tools/go.mod index 13941936c5..307398c89e 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.mod +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.mod @@ -1,13 +1,191 @@ module github.com/flyteorg/boilerplate -go 1.16 +go 1.17 require ( github.com/alvaroloes/enumer v1.1.2 github.com/flyteorg/flytestdlib v0.4.7 github.com/golangci/golangci-lint v1.38.0 + github.com/pseudomuto/protoc-gen-doc v1.4.1 github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5 - github.com/pseudomuto/protoc-gen-doc v0.1.1 // indirect +) + +require ( + 4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a // indirect + cloud.google.com/go v0.75.0 // indirect + cloud.google.com/go/storage v1.12.0 // indirect + github.com/Azure/azure-sdk-for-go v51.0.0+incompatible // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest v0.11.17 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/logger v0.2.0 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/BurntSushi/toml v0.3.1 // indirect + github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect + github.com/Masterminds/semver v1.5.0 // indirect + github.com/Masterminds/sprig v2.15.0+incompatible // indirect + github.com/OpenPeeDeeP/depguard v1.0.1 // indirect + github.com/alexkohler/prealloc v1.0.0 // indirect + github.com/aokoli/goutils v1.0.1 // indirect + github.com/ashanbrown/forbidigo v1.1.0 // indirect + github.com/ashanbrown/makezero v0.0.0-20201205152432-7b7cdbb3025a // indirect + github.com/aws/aws-sdk-go v1.37.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bkielbasa/cyclop v1.2.0 // indirect + github.com/bombsimon/wsl/v3 v3.2.0 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/charithe/durationcheck v0.0.6 // indirect + github.com/coocood/freecache v1.1.1 // indirect + github.com/daixiang0/gci v0.2.8 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/denis-tingajkin/go-header v0.4.2 // indirect + github.com/envoyproxy/protoc-gen-validate v0.3.0-java // indirect + github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 // indirect + github.com/esimonov/ifshort v1.0.1 // indirect + github.com/fatih/color v1.10.0 // indirect + github.com/fatih/structtag v1.2.0 // indirect + github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect + github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/fzipp/gocyclo v0.3.1 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-critic/go-critic v0.5.4 // indirect + github.com/go-logr/logr v0.4.0 // indirect + github.com/go-toolsmith/astcast v1.0.0 // indirect + github.com/go-toolsmith/astcopy v1.0.0 // indirect + github.com/go-toolsmith/astequal v1.0.0 // indirect + github.com/go-toolsmith/astfmt v1.0.0 // indirect + github.com/go-toolsmith/astp v1.0.0 // indirect + github.com/go-toolsmith/strparse v1.0.0 // indirect + github.com/go-toolsmith/typep v1.0.2 // indirect + github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/gofrs/flock v0.8.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + github.com/golang/protobuf v1.4.3 // indirect + github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect + github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect + github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 // indirect + github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a // indirect + github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect + github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect + github.com/golangci/misspell v0.3.5 // indirect + github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5 // indirect + github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect + github.com/google/go-cmp v0.5.4 // indirect + github.com/google/uuid v1.1.2 // indirect + github.com/googleapis/gax-go/v2 v2.0.5 // indirect + github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 // indirect + github.com/gostaticanalysis/analysisutil v0.4.1 // indirect + github.com/gostaticanalysis/comment v1.4.1 // indirect + github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 // indirect + github.com/gostaticanalysis/nilerr v0.1.1 // indirect + github.com/graymeta/stow v0.2.7 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/huandu/xstrings v1.0.0 // indirect + github.com/imdario/mergo v0.3.5 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jgautheron/goconst v1.4.0 // indirect + github.com/jingyugao/rowserrcheck v0.0.0-20210130005344-c6a0c12dd98d // indirect + github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jstemmer/go-junit-report v0.9.1 // indirect + github.com/julz/importas v0.0.0-20210226073942-60b4fa260dd0 // indirect + github.com/kisielk/errcheck v1.6.0 // indirect + github.com/kisielk/gotool v1.0.0 // indirect + github.com/kulti/thelper v0.4.0 // indirect + github.com/kunwardeep/paralleltest v1.0.2 // indirect + github.com/kyoh86/exportloopref v0.1.8 // indirect + github.com/magefile/mage v1.10.0 // indirect + github.com/magiconair/properties v1.8.4 // indirect + github.com/maratori/testpackage v1.0.1 // indirect + github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 // indirect + github.com/mattn/go-colorable v0.1.8 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mattn/go-runewidth v0.0.7 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mbilski/exhaustivestruct v1.2.0 // indirect + github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 // indirect + github.com/mgechev/revive v1.0.3 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/moricho/tparallel v0.2.1 // indirect + github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect + github.com/nakabonne/nestif v0.3.0 // indirect + github.com/nbutton23/zxcvbn-go v0.0.0-20201221231540-e56b841a3c88 // indirect + github.com/ncw/swift v1.0.53 // indirect + github.com/nishanths/exhaustive v0.1.0 // indirect + github.com/nishanths/predeclared v0.2.1 // indirect + github.com/olekukonko/tablewriter v0.0.4 // indirect + github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 // indirect + github.com/pelletier/go-toml v1.8.1 // indirect + github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f // indirect + github.com/prometheus/client_golang v1.9.0 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.15.0 // indirect + github.com/prometheus/procfs v0.3.0 // indirect + github.com/pseudomuto/protokit v0.2.0 // indirect + github.com/quasilyte/go-ruleguard v0.3.0 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 // indirect + github.com/ryancurrah/gomodguard v1.2.0 // indirect + github.com/ryanrolds/sqlclosecheck v0.3.0 // indirect + github.com/sanposhiho/wastedassign v0.1.3 // indirect + github.com/satori/go.uuid v1.2.0 // indirect + github.com/securego/gosec/v2 v2.6.1 // indirect + github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect + github.com/sirupsen/logrus v1.8.0 // indirect + github.com/sonatard/noctx v0.0.1 // indirect + github.com/sourcegraph/go-diff v0.6.1 // indirect + github.com/spf13/afero v1.5.1 // indirect + github.com/spf13/cast v1.3.1 // indirect + github.com/spf13/cobra v1.1.3 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.7.1 // indirect + github.com/ssgreg/nlreturn/v2 v2.1.0 // indirect + github.com/stretchr/objx v0.3.0 // indirect + github.com/stretchr/testify v1.7.0 // indirect + github.com/subosito/gotenv v1.2.0 // indirect + github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b // indirect + github.com/tetafro/godot v1.4.4 // indirect + github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94 // indirect + github.com/tomarrell/wrapcheck v0.0.0-20201130113247-1683564d9756 // indirect + github.com/tommy-muehle/go-mnd/v2 v2.3.1 // indirect + github.com/ultraware/funlen v0.0.3 // indirect + github.com/ultraware/whitespace v0.0.4 // indirect + github.com/uudashr/gocognit v1.0.1 // indirect + go.opencensus.io v0.22.6 // indirect + golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect + golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect + golang.org/x/mod v0.4.1 // indirect + golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect + golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 // indirect + golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c // indirect + golang.org/x/text v0.3.5 // indirect + golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect + golang.org/x/tools v0.1.0 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + google.golang.org/api v0.38.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 // indirect + google.golang.org/grpc v1.35.0 // indirect + google.golang.org/protobuf v1.25.0 // indirect + gopkg.in/ini.v1 v1.62.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + honnef.co/go/tools v0.1.2 // indirect + k8s.io/apimachinery v0.20.2 // indirect + k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 // indirect + k8s.io/klog/v2 v2.5.0 // indirect + mvdan.cc/gofumpt v0.1.0 // indirect + mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect + mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect + mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7 // indirect ) replace github.com/vektra/mockery => github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0 diff --git a/flytectl/boilerplate/flyte/golang_support_tools/tools.go b/flytectl/boilerplate/flyte/golang_support_tools/tools.go index eee691d8c3..d970d2106a 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/tools.go +++ b/flytectl/boilerplate/flyte/golang_support_tools/tools.go @@ -7,5 +7,5 @@ import ( _ "github.com/flyteorg/flytestdlib/cli/pflags" _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/vektra/mockery/cmd/mockery" - - "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" + _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" ) diff --git a/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh index c0ab06b063..02fb004881 100755 --- a/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh @@ -17,8 +17,8 @@ set -e # In the format of ":" or ":" if no cli tools=( "github.com/vektra/mockery/cmd/mockery" - "github.com/flyteorg/flytestdlib/cli/pflags" - "github.com/golangci/golangci-lint/cmd/golangci-lint" + "github.com/flyteorg/flytestdlib/cli/pflags@latest" + "github.com/golangci/golangci-lint/cmd/golangci-lint@latest" "github.com/alvaroloes/enumer" "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" ) diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index 5e4451b922..0355ee08f5 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -54,6 +54,7 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "Version of flyte. Only supports flyte releases greater than v0.10.0") cmdFlags.StringVar(&DefaultConfig.Image, fmt.Sprintf("%v%v", prefix, "image"), DefaultConfig.Image, "Optional. Provide a fully qualified path to a Flyte compliant docker image.") cmdFlags.BoolVar(&DefaultConfig.Prerelease, fmt.Sprintf("%v%v", prefix, "pre"), DefaultConfig.Prerelease, "Optional. Pre release Version of flyte will be used for sandbox.") + cmdFlags.StringSliceVar(&DefaultConfig.Env, fmt.Sprintf("%v%v", prefix, "env"), DefaultConfig.Env, "Optional. Provide Env variable in key=value format which can be passed to sandbox container.") cmdFlags.Var(&DefaultConfig.ImagePullPolicy, fmt.Sprintf("%v%v", prefix, "imagePullPolicy"), "Optional. Defines the image pull behavior [Always/IfNotPresent/Never]") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index da98f59320..6433a3e647 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -155,6 +155,20 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_env", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := join_Config(DefaultConfig.Env, ",") + + cmdFlags.Set("env", testValue) + if vStringSlice, err := cmdFlags.GetStringSlice("env"); err == nil { + testDecodeRaw_Config(t, join_Config(vStringSlice, ","), &actual.Env) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_imagePullPolicy", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index 77246f09d0..be553a4efc 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -47,6 +47,9 @@ type Config struct { // Default value false represents that flytectl will not use latest pre release if exist Prerelease bool `json:"pre" pflag:",Optional. Pre release Version of flyte will be used for sandbox."` + // Optionally it is possible to pass in environment variables to sandbox container. + Env []string `json:"env" pflag:",Optional. Provide Env variable in key=value format which can be passed to sandbox container."` + // Optionally it is possible to use local sandbox image // If local flag pass then flytectl will not pull image from registry. Usually useful, if you want to test your local images without pushing them to a registry ImagePullPolicy ImagePullPolicy `json:"imagePullPolicy" pflag:",Optional. Defines the image pull behavior [Always/IfNotPresent/Never]"` diff --git a/flytectl/cmd/configuration/configuration_test.go b/flytectl/cmd/configuration/configuration_test.go index 4f6e6a6186..bb2d256229 100644 --- a/flytectl/cmd/configuration/configuration_test.go +++ b/flytectl/cmd/configuration/configuration_test.go @@ -23,19 +23,22 @@ func TestCreateInitCommand(t *testing.T) { assert.Equal(t, configCmd.Use, "config") assert.Equal(t, configCmd.Short, "Runs various config commands, look at the help of this command to get a list of available commands..") fmt.Println(configCmd.Commands()) - assert.Equal(t, len(configCmd.Commands()), 3) + assert.Equal(t, 4, len(configCmd.Commands())) cmdNouns := configCmd.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { return cmdNouns[i].Use < cmdNouns[j].Use }) - assert.Equal(t, cmdNouns[0].Use, "discover") - assert.Equal(t, cmdNouns[0].Short, "Searches for a config in one of the default search paths.") - assert.Equal(t, cmdNouns[1].Use, "init") - assert.Equal(t, cmdNouns[1].Short, initCmdShort) - assert.Equal(t, cmdNouns[2].Use, "validate") - assert.Equal(t, cmdNouns[2].Short, "Validates the loaded config.") + assert.Equal(t, "discover", cmdNouns[0].Use) + assert.Equal(t, "Searches for a config in one of the default search paths.", cmdNouns[0].Short) + assert.Equal(t, "docs", cmdNouns[1].Use) + assert.Equal(t, "Generate configuration documetation in rst format", cmdNouns[1].Short) + + assert.Equal(t, "init", cmdNouns[2].Use) + assert.Equal(t, initCmdShort, cmdNouns[2].Short) + assert.Equal(t, "validate", cmdNouns[3].Use) + assert.Equal(t, "Validates the loaded config.", cmdNouns[3].Short) } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 15a14a8887..491c0c1f98 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -276,8 +276,7 @@ func TestRegisterFile(t *testing.T) { results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) - assert.Equal(t, "Error hydrating spec due to param values are missing on scheduled workflow for"+ - " the following params [var1 var2]. Either specify them having a default or fixed value", results[0].Info) + assert.Contains(t, results[0].Info, "param values are missing on scheduled workflow for the following params") assert.NotNil(t, err) }) t.Run("Non existent file", func(t *testing.T) { @@ -709,8 +708,7 @@ func TestValidateLaunchSpec(t *testing.T) { } err := validateLaunchSpec(ctx, lpSpec, cmdCtx) assert.NotNil(t, err) - assert.Equal(t, "param values are missing on scheduled workflow for the following params [var1 var2]."+ - " Either specify them having a default or fixed value", err.Error()) + assert.Contains(t, err.Error(), "param values are missing on scheduled workflow for the following params") }) t.Run("launchplan spec non empty schedule required param success", func(t *testing.T) { setup() diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index a946601c5c..ece842beb8 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -70,6 +70,28 @@ Specify a Flyte Sandbox image pull policy. Possible pull policy values are Alway :: flytectl sandbox start --image docker.io/my-override:latest --imagePullPolicy Always + +Start sandbox cluster passing environment variables. This can be used to pass docker specific env variables or flyte specific env variables. +eg : for passing timeout value in secs for the sandbox container use the following. +:: + + flytectl sandbox start --env FLYTE_TIMEOUT=700 + + +The DURATION can be a positive integer or a floating-point number, followed by an optional unit suffix:: +s - seconds (default) +m - minutes +h - hours +d - days +When no unit is used, it defaults to seconds. If the duration is set to zero, the associated timeout is disabled. + + +eg : for passing multiple environment variables +:: + + flytectl sandbox start --env USER=foo --env PASSWORD=bar + + Usage ` k8sEndpoint = "https://127.0.0.1:30086" @@ -161,7 +183,8 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu } volumes := docker.Volumes - if vol, err := mountVolume(sandboxConfig.DefaultConfig.Source, docker.Source); err != nil { + sandboxDefaultConfig := sandboxConfig.DefaultConfig + if vol, err := mountVolume(sandboxDefaultConfig.Source, docker.Source); err != nil { return nil, err } else if vol != nil { volumes = append(volumes, *vol) @@ -182,7 +205,9 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) exposedPorts, portBindings, _ := docker.GetSandboxPorts() - ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, sandboxImage) + ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, + sandboxImage, sandboxDefaultConfig.Env) + if err != nil { fmt.Printf("%v Something went wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) return nil, err diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index ec6fa871cf..941cb57926 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -47,6 +47,28 @@ Specify a Flyte Sandbox image pull policy. Possible pull policy values are Alway :: flytectl sandbox start --image docker.io/my-override:latest --imagePullPolicy Always + +Start sandbox cluster passing environment variables. This can be used to pass docker specific env variables or flyte specific env variables. +eg : for passing timeout value in secs for the sandbox container use the following. +:: + + flytectl sandbox start --env FLYTE_TIMEOUT=700 + + +The DURATION can be a positive integer or a floating-point number, followed by an optional unit suffix:: +s - seconds (default) +m - minutes +h - hours +d - days +When no unit is used, it defaults to seconds. If the duration is set to zero, the associated timeout is disabled. + + +eg : for passing multiple environment variables +:: + + flytectl sandbox start --env USER=foo --env PASSWORD=bar + + Usage @@ -59,6 +81,7 @@ Options :: + --env strings Optional. Provide Env variable in key=value format which can be passed to sandbox container. -h, --help help for start --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. --imagePullPolicy ImagePullPolicy Optional. Defines the image pull behavior [Always/IfNotPresent/Never] (default Always) diff --git a/flytectl/go.mod b/flytectl/go.mod index b34924a30d..096232e2c3 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -10,7 +10,7 @@ require ( github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 github.com/flyteorg/flyteidl v0.21.24 - github.com/flyteorg/flytestdlib v0.4.0 + github.com/flyteorg/flytestdlib v0.4.14 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 github.com/golang/protobuf v1.5.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 9787249411..a3a5753e53 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -359,8 +359,8 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/flyteorg/flyteidl v0.21.24 h1:e2wPBK4aiLE+fw2zmhUDNg39QoJk6Lf5lQRvj8XgtFk= github.com/flyteorg/flyteidl v0.21.24/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= -github.com/flyteorg/flytestdlib v0.4.0 h1:cEMkNfjocCuBSLzM9tKjsODhkr5gXTZAGl6k62FrT60= -github.com/flyteorg/flytestdlib v0.4.0/go.mod h1:7cDWkY3v7xsoesFcDdu6DSW5Q2U2W5KlHUbUHSwBG1Q= +github.com/flyteorg/flytestdlib v0.4.14 h1:qpPwvJ+DqM1fI/y5uPKAP8p8VONz8oRp9Fz0jFl/5aI= +github.com/flyteorg/flytestdlib v0.4.14/go.mod h1:fv1ar34LJLMTaf0tbfetisLykUlARi7rP+NQTUn6QQs= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index a1d952475f..cf8f96a2c6 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -131,7 +131,10 @@ func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy s } //StartContainer will create and start docker container -func StartContainer(ctx context.Context, cli Docker, volumes []mount.Mount, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, name, image string) (string, error) { +func StartContainer(ctx context.Context, cli Docker, volumes []mount.Mount, exposedPorts map[nat.Port]struct{}, + portBindings map[nat.Port][]nat.PortBinding, name, image string, additionalEnvVars []string) (string, error) { + // Append the additional env variables to the default list of env + Environment = append(Environment, additionalEnvVars...) resp, err := cli.ContainerCreate(ctx, &container.Config{ Env: Environment, Image: image, diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index cc27fd8af4..1915722640 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -166,12 +166,42 @@ func TestStartContainer(t *testing.T) { ID: "Hello", }, nil) mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(nil) - id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName) + id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) assert.Nil(t, err) assert.Greater(t, len(id), 0) assert.Equal(t, id, "Hello") }) + t.Run("Successfully create a container with Env", func(t *testing.T) { + setupSandbox() + mockDocker := &mocks.Docker{} + context := context.Background() + // Setup additional env + additionalEnv := []string{"a=1", "b=2"} + expectedEnv := append(Environment, "a=1") + expectedEnv = append(expectedEnv, "b=2") + + // Verify the attributes + mockDocker.OnContainerCreate(context, &container.Config{ + Env: expectedEnv, + Image: imageName, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(nil) + id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName, additionalEnv) + assert.Nil(t, err) + assert.Greater(t, len(id), 0) + assert.Equal(t, id, "Hello") + assert.Equal(t, expectedEnv, Environment) + }) + t.Run("Error in creating container", func(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} @@ -191,7 +221,7 @@ func TestStartContainer(t *testing.T) { ID: "", }, fmt.Errorf("error")) mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(nil) - id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName) + id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) assert.NotNil(t, err) assert.Equal(t, len(id), 0) assert.Equal(t, id, "") @@ -216,7 +246,7 @@ func TestStartContainer(t *testing.T) { ID: "Hello", }, nil) mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) - id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName) + id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) assert.NotNil(t, err) assert.Equal(t, len(id), 0) assert.Equal(t, id, "") From 39cb8f3e46370b2ade5434ca019921f3578591b6 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Fri, 4 Mar 2022 07:04:30 -0800 Subject: [PATCH 224/645] Update documentation (#286) Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- flytectl/docs/source/gen/flytectl_config.rst | 1 + .../docs/source/gen/flytectl_config_docs.rst | 77 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 flytectl/docs/source/gen/flytectl_config_docs.rst diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index c8590d9ac1..56b8782bb7 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -71,6 +71,7 @@ SEE ALSO * :doc:`flytectl` - FlyteCTL CLI tool * :doc:`flytectl_config_discover` - Searches for a config in one of the default search paths. +* :doc:`flytectl_config_docs` - Generate configuration documetation in rst format * :doc:`flytectl_config_init` - Generates FlyteCTL config file in the user's home directory. * :doc:`flytectl_config_validate` - Validates the loaded config. diff --git a/flytectl/docs/source/gen/flytectl_config_docs.rst b/flytectl/docs/source/gen/flytectl_config_docs.rst new file mode 100644 index 0000000000..ec4ee408d7 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_config_docs.rst @@ -0,0 +1,77 @@ +.. _flytectl_config_docs: + +flytectl config docs +-------------------- + +Generate configuration documetation in rst format + +Synopsis +~~~~~~~~ + + +Generate configuration documetation in rst format + +:: + + flytectl config docs [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for docs + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. + From 9aaba3e34cc26545d41b2b08fbea4ecaf515d907 Mon Sep 17 00:00:00 2001 From: Alekhya Sai Date: Mon, 7 Mar 2022 22:16:04 +0530 Subject: [PATCH 225/645] Remove duplicate register files (#288) Signed-off-by: Alekhya Sai Punnamaraju --- flytectl/docs/source/files.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/flytectl/docs/source/files.rst b/flytectl/docs/source/files.rst index afdb7e8e66..96f2b861d9 100644 --- a/flytectl/docs/source/files.rst +++ b/flytectl/docs/source/files.rst @@ -7,6 +7,5 @@ It specifies the actions to be performed on the resource 'files'. :caption: Files gen/flytectl_register_files - gen/flytectl_register_files -Note: It allows the user to register local files +Note: It allows the user to register local files. From a94cbdd5743198110cd807d947b5b1186cbab0bf Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Mon, 7 Mar 2022 22:27:03 +0530 Subject: [PATCH 226/645] Added workflow flag for get launchplan (#287) * Added workflow flag for get launchplan Signed-off-by: Prafulla Mahindrakar * Using filter for workflow flag Signed-off-by: Prafulla Mahindrakar --- .../subcommand/launchplan/config_flags.go | 1 + .../launchplan/config_flags_test.go | 14 + .../launchplan/launchplan_config.go | 1 + flytectl/cmd/get/launch_plan.go | 14 + flytectl/cmd/get/launch_plan_test.go | 496 ++---------------- 5 files changed, 83 insertions(+), 443 deletions(-) diff --git a/flytectl/cmd/config/subcommand/launchplan/config_flags.go b/flytectl/cmd/config/subcommand/launchplan/config_flags.go index 3348bff7ee..dfac4c53ea 100755 --- a/flytectl/cmd/config/subcommand/launchplan/config_flags.go +++ b/flytectl/cmd/config/subcommand/launchplan/config_flags.go @@ -58,5 +58,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.Int32Var(&DefaultConfig.Filter.Limit, fmt.Sprintf("%v%v", prefix, "filter.limit"), DefaultConfig.Filter.Limit, "Specifies the limit") cmdFlags.BoolVar(&DefaultConfig.Filter.Asc, fmt.Sprintf("%v%v", prefix, "filter.asc"), DefaultConfig.Filter.Asc, "Specifies the sorting order. By default flytectl sort result in descending order") cmdFlags.Int32Var(&DefaultConfig.Filter.Page, fmt.Sprintf("%v%v", prefix, "filter.page"), DefaultConfig.Filter.Page, "Specifies the page number, in case there are multiple pages of results") + cmdFlags.StringVar(&DefaultConfig.Workflow, fmt.Sprintf("%v%v", prefix, "workflow"), DefaultConfig.Workflow, "name of the workflow for which the launchplans need to be fetched.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go b/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go index afcd0597dd..b46c8d104f 100755 --- a/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/launchplan/config_flags_test.go @@ -211,4 +211,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_workflow", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("workflow", testValue) + if vString, err := cmdFlags.GetString("workflow"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Workflow) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go b/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go index 7c8245256a..1a10764384 100644 --- a/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go +++ b/flytectl/cmd/config/subcommand/launchplan/launchplan_config.go @@ -17,4 +17,5 @@ type Config struct { Version string `json:"version" pflag:",version of the launchplan to be fetched."` Latest bool `json:"latest" pflag:", flag to indicate to fetch the latest version, version flag will be ignored in this case"` Filter filters.Filters `json:"filter" pflag:","` + Workflow string `json:"workflow" pflag:",name of the workflow for which the launchplans need to be fetched."` } diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 1700f4c04e..047965ebf4 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -2,6 +2,7 @@ package get import ( "context" + "fmt" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" @@ -40,6 +41,12 @@ Retrieve a particular version of the launch plan by name within the project and flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --version v2 +Retrieve all launch plans for a given workflow name: + +:: + + flytectl get launchplan -p flytesnacks -d development --workflow core.flyte_basics.lp.go_greet + Retrieve all the launch plans with filters: :: @@ -170,6 +177,13 @@ func getLaunchPlanFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comman return nil } + if len(launchplan.DefaultConfig.Workflow) > 0 { + if len(launchplan.DefaultConfig.Filter.FieldSelector) > 0 { + return fmt.Errorf("fieldSelector cannot be specified with workflow flag") + } + launchplan.DefaultConfig.Filter.FieldSelector = fmt.Sprintf("workflow.name=%s", launchplan.DefaultConfig.Workflow) + } + launchPlans, err := cmdCtx.AdminFetcherExt().FetchAllVerOfLP(ctx, "", config.GetConfig().Project, config.GetConfig().Domain, launchplan.DefaultConfig.Filter) if err != nil { return err diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index e6a7cbec01..a36cd2ec77 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -23,14 +23,15 @@ import ( ) var ( - resourceListRequest *admin.ResourceListRequest - resourceGetRequest *admin.ResourceListRequest - objectGetRequest *admin.ObjectGetRequest - namedIDRequest *admin.NamedEntityIdentifierListRequest - launchPlanListResponse *admin.LaunchPlanList - argsLp []string - namedIdentifierList *admin.NamedEntityIdentifierList - launchPlan2 *admin.LaunchPlan + resourceListRequest *admin.ResourceListRequest + resourceGetRequest *admin.ResourceListRequest + objectGetRequest *admin.ObjectGetRequest + namedIDRequest *admin.NamedEntityIdentifierListRequest + launchPlanListResponse *admin.LaunchPlanList + filteredLaunchPlanListResponse *admin.LaunchPlanList + argsLp []string + namedIdentifierList *admin.NamedEntityIdentifierList + launchPlan2 *admin.LaunchPlan ) func getLaunchPlanSetup() { @@ -96,6 +97,9 @@ func getLaunchPlanSetup() { Version: "v1", }, Spec: &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Name: "workflow1", + }, DefaultInputs: &core.ParameterMap{ Parameters: parameterMap, }, @@ -113,6 +117,9 @@ func getLaunchPlanSetup() { Version: "v2", }, Spec: &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Name: "workflow2", + }, DefaultInputs: &core.ParameterMap{ Parameters: parameterMap, }, @@ -146,6 +153,10 @@ func getLaunchPlanSetup() { LaunchPlans: launchPlans, } + filteredLaunchPlanListResponse = &admin.LaunchPlanList{ + LaunchPlans: []*admin.LaunchPlan{launchPlan2}, + } + objectGetRequest = &admin.ObjectGetRequest{ Id: &core.Identifier{ ResourceType: core.ResourceType_LAUNCH_PLAN, @@ -249,178 +260,7 @@ func TestGetLaunchPlanFunc(t *testing.T) { err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceGetRequest) - tearDownAndVerify(t, `[ - { - "id": { - "name": "launchplan1", - "version": "v2" - }, - "spec": { - "defaultInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - } - }, - "closure": { - "expectedInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - }, - "createdAt": "1970-01-01T00:00:01Z" - } - }, - { - "id": { - "name": "launchplan1", - "version": "v1" - }, - "spec": { - "defaultInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - } - }, - "closure": { - "expectedInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - }, - "createdAt": "1970-01-01T00:00:00Z" - } - } -]`) + tearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetLaunchPlanFuncLatest(t *testing.T) { @@ -433,91 +273,7 @@ func TestGetLaunchPlanFuncLatest(t *testing.T) { err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceGetRequest) - tearDownAndVerify(t, `{ - "id": { - "name": "launchplan1", - "version": "v2" - }, - "spec": { - "defaultInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - } - }, - "closure": { - "expectedInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - }, - "createdAt": "1970-01-01T00:00:01Z" - } -}`) + tearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlanWithVersion(t *testing.T) { @@ -530,102 +286,40 @@ func TestGetLaunchPlanWithVersion(t *testing.T) { err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) assert.Nil(t, err) mockClient.AssertCalled(t, "GetLaunchPlan", ctx, objectGetRequest) - tearDownAndVerify(t, `{ - "id": { - "name": "launchplan1", - "version": "v2" - }, - "spec": { - "defaultInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - } - }, - "closure": { - "expectedInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - }, - "createdAt": "1970-01-01T00:00:01Z" - } -}`) + tearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlans(t *testing.T) { - setup() - getLaunchPlanSetup() - mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) - mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) - argsLp = []string{} - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) - assert.Nil(t, err) - tearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + t.Run("no workflow filter", func(t *testing.T) { + setup() + getLaunchPlanSetup() + mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) + argsLp = []string{} + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + }) + t.Run("workflow filter", func(t *testing.T) { + setup() + getLaunchPlanSetup() + resourceListRequest.Filters = "eq(workflow.name,workflow2)" + mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(filteredLaunchPlanListResponse, nil) + argsLp = []string{} + launchplan.DefaultConfig.Workflow = "workflow2" + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + assert.Nil(t, err) + tearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + }) + t.Run("workflow filter error", func(t *testing.T) { + setup() + getLaunchPlanSetup() + argsLp = []string{} + launchplan.DefaultConfig.Workflow = "workflow2" + launchplan.DefaultConfig.Filter.FieldSelector = "workflow.name" + err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("fieldSelector cannot be specified with workflow flag"), err) + }) } func TestGetLaunchPlansWithExecFile(t *testing.T) { @@ -640,91 +334,7 @@ func TestGetLaunchPlansWithExecFile(t *testing.T) { os.Remove(launchplan.DefaultConfig.ExecFile) assert.Nil(t, err) mockClient.AssertCalled(t, "GetLaunchPlan", ctx, objectGetRequest) - tearDownAndVerify(t, `{ - "id": { - "name": "launchplan1", - "version": "v2" - }, - "spec": { - "defaultInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - } - }, - "closure": { - "expectedInputs": { - "parameters": { - "numbers": { - "var": { - "type": { - "collectionType": { - "simple": "INTEGER" - } - }, - "description": "short desc" - } - }, - "numbers_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "long description will be truncated in table" - } - }, - "run_local_at_count": { - "var": { - "type": { - "simple": "INTEGER" - }, - "description": "run_local_at_count" - }, - "default": { - "scalar": { - "primitive": { - "integer": "10" - } - } - } - } - } - }, - "createdAt": "1970-01-01T00:00:01Z" - } -}`) + tearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlanTableFunc(t *testing.T) { From 3421735b73b2a273ac4fda071a098020d9f151a6 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Tue, 8 Mar 2022 22:43:01 -0800 Subject: [PATCH 227/645] Update documentation (#289) Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- flytectl/docs/source/gen/flytectl_get_launchplan.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index cb527a26b0..4a2e13a751 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -34,6 +34,12 @@ Retrieve a particular version of the launch plan by name within the project and flytectl get launchplan -p flytesnacks -d development core.basic.lp.go_greet --version v2 +Retrieve all launch plans for a given workflow name: + +:: + + flytectl get launchplan -p flytesnacks -d development --workflow core.flyte_basics.lp.go_greet + Retrieve all the launch plans with filters: :: @@ -112,6 +118,7 @@ Options -h, --help help for launchplan --latest flag to indicate to fetch the latest version, version flag will be ignored in this case --version string version of the launchplan to be fetched. + --workflow string name of the workflow for which the launchplans need to be fetched. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 651706b5ad52e8ac6e1a69e841630ca82e21ccd6 Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Wed, 9 Mar 2022 12:44:27 +0530 Subject: [PATCH 228/645] bump containerd (#290) Signed-off-by: Yuvraj --- flytectl/go.mod | 2 +- flytectl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 096232e2c3..84eef1ec12 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -61,7 +61,7 @@ require ( github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.1 // indirect github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect - github.com/containerd/containerd v1.5.9 // indirect + github.com/containerd/containerd v1.5.10 // indirect github.com/coocood/freecache v1.1.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/danieljoos/wincred v1.1.0 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index a3a5753e53..3666fe15ea 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -217,8 +217,8 @@ github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7 github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.9 h1:rs6Xg1gtIxaeyG+Smsb/0xaSDu1VgFhOCKBXxMxbsF4= -github.com/containerd/containerd v1.5.9/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= +github.com/containerd/containerd v1.5.10 h1:3cQ2uRVCkJVcx5VombsE7105Gl9Wrl7ORAO3+4+ogf4= +github.com/containerd/containerd v1.5.10/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= From 63582435e0c51cf1ae45fa526b16b63ac927916e Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Fri, 11 Mar 2022 10:00:59 +0530 Subject: [PATCH 229/645] fix create project bug (#291) Signed-off-by: Yuvraj --- flytectl/cmd/config/subcommand/project/project_config.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go index e4c9bfb649..36e6c41cb9 100644 --- a/flytectl/cmd/config/subcommand/project/project_config.go +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -56,10 +56,9 @@ func (c *ConfigProject) GetProjectSpec(id string) (*admin.Project, error) { if err != nil { return nil, err } - if projectSpec.Id == id { - return &projectSpec, nil + if len(id) > 0 { + projectSpec.Id = id } - projectSpec.Id = id return &projectSpec, nil } From 7a6ba140ca282d161425ff390bbaccea406812e4 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 15 Mar 2022 10:24:28 +0530 Subject: [PATCH 230/645] Fixed continueonError bug (#292) --- flytectl/cmd/register/files.go | 2 +- flytectl/cmd/register/files_test.go | 29 ++++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index 895d2f5aa5..b6ac2c980a 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -136,7 +136,7 @@ func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) } var registerResults []Result - fastFail := rconfig.DefaultFilesConfig.ContinueOnError + fastFail := !rconfig.DefaultFilesConfig.ContinueOnError for i := 0; i < len(validProto) && !(fastFail && regErr != nil); i++ { registerResults, regErr = registerFile(ctx, validProto[i], sourceCodeName, registerResults, cmdCtx, *rconfig.DefaultFilesConfig) } diff --git a/flytectl/cmd/register/files_test.go b/flytectl/cmd/register/files_test.go index e583e18400..744e9cef2c 100644 --- a/flytectl/cmd/register/files_test.go +++ b/flytectl/cmd/register/files_test.go @@ -105,9 +105,32 @@ func TestRegisterFromFiles(t *testing.T) { Client = s assert.Nil(t, err) args = []string{"testdata/flytesnacks-core.tgz"} - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) - mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) - mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(1) + mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(1) + mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(1) + err = registerFromFilesFunc(ctx, args, cmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("failed"), err) + }) + t.Run("Failure registration of fast serialize continue on error", func(t *testing.T) { + setup() + registerFilesSetup() + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + rconfig.DefaultFilesConfig.Archive = true + + rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output + rconfig.DefaultFilesConfig.SourceUploadPath = s3Output + rconfig.DefaultFilesConfig.ContinueOnError = true + s, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + Client = s + assert.Nil(t, err) + args = []string{"testdata/flytesnacks-core.tgz"} + mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(39) + mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(21) + mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(24) err = registerFromFilesFunc(ctx, args, cmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed"), err) From 3e329adea4756d145f0d701ee3cb47bdfbfee5d0 Mon Sep 17 00:00:00 2001 From: SmritiSatyanV <94349093+SmritiSatyanV@users.noreply.github.com> Date: Tue, 15 Mar 2022 14:25:26 +0530 Subject: [PATCH 231/645] Fix grammar test (#272) * Fix grammar Signed-off-by: SmritiSatyanV * Updated task.go Signed-off-by: SmritiSatyanV * Updated configuration.go Signed-off-by: SmritiSatyanV * Fixed build errors-1 Signed-off-by: SmritiSatyanV * Fixed build errors-2 Signed-off-by: SmritiSatyanV * Fixed errors-3 Signed-off-by: SmritiSatyanV * Updated sandbox_test.go Signed-off-by: SmritiSatyanV * Fixed errors-4 Signed-off-by: SmritiSatyanV * Minor grammar fix Changed FlyteCTL to Flytectl Grammar fixes Signed-off-by: SmritiSatyanV * Fixed errors Signed-off-by: SmritiSatyanV * Fixed unit test errors Signed-off-by: SmritiSatyanV * Updates based on comments Signed-off-by: SmritiSatyanV * Rephrased sentence Signed-off-by: SmritiSatyanV * Fixed errors Error strings shouldn't begin with upper case or end with punctuation or newline. Signed-off-by: SmritiSatyanV * Updated project.go Signed-off-by: SmritiSatyanV * Updated errors.go Signed-off-by: SmritiSatyanV * Updated project_test.go Signed-off-by: SmritiSatyanV * stylistic changes Signed-off-by: Samhita Alla * revert letter case in errors.go Signed-off-by: Samhita Alla * fix lint errors Signed-off-by: Samhita Alla Co-authored-by: Samhita Alla --- flytectl/README.md | 10 +- flytectl/clierrors/errors.go | 28 ++--- flytectl/cmd/completion.go | 70 +++++++----- flytectl/cmd/completion_test.go | 6 +- .../subcommand/sandbox/sandbox_config.go | 10 +- flytectl/cmd/configuration/configuration.go | 19 ++-- flytectl/cmd/create/create.go | 2 +- flytectl/cmd/create/create_test.go | 4 +- flytectl/cmd/create/execution.go | 105 ++++++++---------- flytectl/cmd/create/execution_test.go | 2 +- flytectl/cmd/create/execution_util.go | 2 +- flytectl/cmd/create/project.go | 20 ++-- flytectl/cmd/create/project_test.go | 4 +- flytectl/cmd/delete/delete.go | 2 +- flytectl/cmd/delete/execution.go | 16 +-- .../matchable_cluster_resource_attribute.go | 21 ++-- .../matchable_execution_cluster_label.go | 22 ++-- .../matchable_execution_queue_attribute.go | 20 ++-- .../cmd/delete/matchable_plugin_override.go | 19 ++-- .../matchable_task_resource_attribute.go | 20 ++-- .../matchable_workflow_execution_config.go | 22 ++-- flytectl/cmd/get/execution.go | 26 +++-- flytectl/cmd/get/get.go | 4 +- flytectl/cmd/get/get_test.go | 2 +- flytectl/cmd/get/launch_plan.go | 12 +- .../matchable_cluster_resource_attribute.go | 18 +-- .../get/matchable_execution_cluster_label.go | 18 +-- .../matchable_execution_queue_attribute.go | 18 +-- flytectl/cmd/get/matchable_plugin_override.go | 21 ++-- .../get/matchable_task_resource_attribute.go | 18 +-- .../matchable_workflow_execution_config.go | 20 ++-- flytectl/cmd/get/project.go | 7 +- flytectl/cmd/get/task.go | 8 +- flytectl/cmd/get/workflow.go | 4 +- flytectl/cmd/register/examples.go | 8 +- flytectl/cmd/register/files.go | 34 +++--- flytectl/cmd/register/register.go | 6 +- flytectl/cmd/register/register_test.go | 6 +- flytectl/cmd/root.go | 4 +- flytectl/cmd/sandbox/exec.go | 6 +- flytectl/cmd/sandbox/sandbox.go | 23 ++-- flytectl/cmd/sandbox/sandbox_test.go | 2 +- flytectl/cmd/sandbox/start.go | 18 +-- flytectl/cmd/sandbox/status.go | 4 +- flytectl/cmd/sandbox/teardown.go | 4 +- flytectl/cmd/update/execution.go | 6 +- flytectl/cmd/update/launch_plan.go | 6 +- flytectl/cmd/update/launch_plan_meta.go | 2 +- .../matchable_cluster_resource_attribute.go | 6 +- ...tchable_cluster_resource_attribute_test.go | 8 +- .../matchable_execution_cluster_label.go | 6 +- .../matchable_execution_queue_attribute.go | 8 +- .../cmd/update/matchable_plugin_override.go | 8 +- .../matchable_task_resource_attribute.go | 8 +- .../matchable_workflow_execution_config.go | 8 +- flytectl/cmd/update/project.go | 2 +- flytectl/cmd/update/project_test.go | 4 +- flytectl/cmd/update/task_meta.go | 2 +- flytectl/cmd/update/update.go | 4 +- flytectl/cmd/update/workflow_meta.go | 2 +- flytectl/cmd/upgrade/upgrade.go | 14 ++- flytectl/cmd/upgrade/upgrade_test.go | 4 +- flytectl/cmd/version/version.go | 12 +- flytectl/cmd/version/version_test.go | 4 +- flytectl/docs/source/conf.py | 1 + flytectl/docs/source/config.rst | 2 - flytectl/docs/source/contribute.rst | 45 ++++---- flytectl/docs/source/examples.rst | 4 +- .../docs/source/execution-cluster-label.rst | 2 +- .../docs/source/execution-queue-attribute.rst | 7 +- flytectl/docs/source/execution.rst | 2 +- flytectl/docs/source/files.rst | 4 +- flytectl/docs/source/gen/flytectl.rst | 20 ++-- .../docs/source/gen/flytectl_completion.rst | 72 +++++++----- flytectl/docs/source/gen/flytectl_config.rst | 4 +- .../docs/source/gen/flytectl_config_init.rst | 19 ++-- flytectl/docs/source/gen/flytectl_create.rst | 8 +- .../source/gen/flytectl_create_execution.rst | 105 ++++++++---------- .../source/gen/flytectl_create_project.rst | 20 ++-- flytectl/docs/source/gen/flytectl_delete.rst | 18 +-- ...ectl_delete_cluster-resource-attribute.rst | 23 ++-- ...lytectl_delete_execution-cluster-label.rst | 18 +-- ...tectl_delete_execution-queue-attribute.rst | 18 +-- .../source/gen/flytectl_delete_execution.rst | 16 +-- .../gen/flytectl_delete_plugin-override.rst | 18 +-- ...lytectl_delete_task-resource-attribute.rst | 16 +-- ...tectl_delete_workflow-execution-config.rst | 14 +-- flytectl/docs/source/gen/flytectl_get.rst | 28 ++--- ...lytectl_get_cluster-resource-attribute.rst | 20 ++-- .../flytectl_get_execution-cluster-label.rst | 20 ++-- ...flytectl_get_execution-queue-attribute.rst | 20 ++-- .../source/gen/flytectl_get_execution.rst | 28 ++--- .../source/gen/flytectl_get_launchplan.rst | 14 ++- .../gen/flytectl_get_plugin-override.rst | 23 ++-- .../docs/source/gen/flytectl_get_project.rst | 9 +- .../flytectl_get_task-resource-attribute.rst | 20 ++-- .../docs/source/gen/flytectl_get_task.rst | 10 +- ...flytectl_get_workflow-execution-config.rst | 22 ++-- .../docs/source/gen/flytectl_get_workflow.rst | 6 +- .../docs/source/gen/flytectl_register.rst | 12 +- .../source/gen/flytectl_register_examples.rst | 10 +- .../source/gen/flytectl_register_files.rst | 14 ++- flytectl/docs/source/gen/flytectl_sandbox.rst | 22 ++-- .../docs/source/gen/flytectl_sandbox_exec.rst | 7 +- .../source/gen/flytectl_sandbox_start.rst | 19 ++-- .../source/gen/flytectl_sandbox_status.rst | 6 +- .../source/gen/flytectl_sandbox_teardown.rst | 6 +- flytectl/docs/source/gen/flytectl_update.rst | 14 +-- ...ectl_update_cluster-resource-attribute.rst | 6 +- ...lytectl_update_execution-cluster-label.rst | 6 +- ...tectl_update_execution-queue-attribute.rst | 8 +- .../source/gen/flytectl_update_execution.rst | 6 +- .../gen/flytectl_update_launchplan-meta.rst | 2 +- .../source/gen/flytectl_update_launchplan.rst | 6 +- .../gen/flytectl_update_plugin-override.rst | 8 +- .../source/gen/flytectl_update_project.rst | 2 +- .../source/gen/flytectl_update_task-meta.rst | 2 +- ...lytectl_update_task-resource-attribute.rst | 8 +- ...tectl_update_workflow-execution-config.rst | 8 +- .../gen/flytectl_update_workflow-meta.rst | 2 +- flytectl/docs/source/gen/flytectl_upgrade.rst | 14 ++- flytectl/docs/source/gen/flytectl_version.rst | 6 +- flytectl/docs/source/index.rst | 25 +++-- flytectl/docs/source/launchplan.rst | 4 +- flytectl/docs/source/nouns.rst | 4 +- flytectl/docs/source/plugin-override.rst | 2 +- flytectl/docs/source/project.rst | 4 +- flytectl/docs/source/sandbox.rst | 2 +- .../docs/source/task-resource-attribute.rst | 2 +- flytectl/docs/source/task.rst | 2 +- flytectl/docs/source/verbs.rst | 2 +- .../docs/source/workflow-execution-config.rst | 5 +- flytectl/docs/source/workflow.rst | 2 +- flytectl/proposal/README.md | 32 +++--- 134 files changed, 932 insertions(+), 853 deletions(-) diff --git a/flytectl/README.md b/flytectl/README.md index 4c64202e23..938d915550 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -31,7 +31,7 @@ and accesses [FlyteAdmin](https://github.com/flyteorg/flyteadmin/), the control ## 🚀 Quick Start -1. Install FlyteCTL with bash or shell script +1. Install Flytectl with bash or shell script. * Bash ```bash @@ -41,14 +41,14 @@ and accesses [FlyteAdmin](https://github.com/flyteorg/flyteadmin/), the control ```bash $ curl -sL https://ctl.flyte.org/install | bash ``` -2. (Optional) `flytectl upgrade` provides a general interface to upgrading FlyteCTL; run the command in the output +2. (Optional) `flytectl upgrade` provides a general interface to upgrading Flytectl; run the command in the output. -3. Start sandbox using FlyteCTL +3. Start Sandbox using Flytectl. ```bash $ flytectl sandbox start ``` -4. Register examples +4. Register examples. ```bash # Register core workflows $ flytectl register examples -d development -p flytesnacks @@ -56,7 +56,7 @@ and accesses [FlyteAdmin](https://github.com/flyteorg/flyteadmin/), the control

- 📖 How to Contribute to FlyteCTL + 📖 How to Contribute to Flytectl

diff --git a/flytectl/clierrors/errors.go b/flytectl/clierrors/errors.go index c3515bf212..a8ff701cb3 100644 --- a/flytectl/clierrors/errors.go +++ b/flytectl/clierrors/errors.go @@ -1,24 +1,24 @@ package clierrors var ( - ErrInvalidStateUpdate = "Invalid state passed. Specify either activate or archive\n" + ErrInvalidStateUpdate = "invalid state passed. Specify either activate or archive\n" - ErrProjectNotPassed = "Project id not passed\n" // #nosec - ErrProjectNameNotPassed = "project name is required flag" - ErrFailedProjectUpdate = "Project %v failed to get updated due to %v\n" + ErrProjectNotPassed = "project id wasn't passed\n" // #nosec + ErrProjectNameNotPassed = "project name is a required flag" + ErrFailedProjectUpdate = "Project %v failed to update due to %v\n" - ErrLPNotPassed = "Launch plan name not passed\n" - ErrLPVersionNotPassed = "Launch plan version not passed\n" //nolint - ErrFailedLPUpdate = "Launch plan %v failed to get updated due to %v\n" + ErrLPNotPassed = "launch plan name wasn't passed\n" + ErrLPVersionNotPassed = "launch plan version wasn't passed\n" //nolint + ErrFailedLPUpdate = "launch plan %v failed to update due to %v\n" - ErrExecutionNotPassed = "Execution name not passed\n" - ErrFailedExecutionUpdate = "Execution %v failed to get updated due to %v\n" + ErrExecutionNotPassed = "execution name wasn't passed\n" + ErrFailedExecutionUpdate = "execution %v failed to update due to %v\n" - ErrWorkflowNotPassed = "Workflow name not passed\n" - ErrFailedWorkflowUpdate = "Workflow %v failed to get updated to due to %v\n" + ErrWorkflowNotPassed = "workflow name wasn't passed\n" + ErrFailedWorkflowUpdate = "workflow %v failed to update to due to %v\n" - ErrTaskNotPassed = "Task name not passed\n" // #nosec - ErrFailedTaskUpdate = "Task %v failed to get updated to due to %v\n" + ErrTaskNotPassed = "task name wasn't passed\n" // #nosec + ErrFailedTaskUpdate = "task %v failed to update to due to %v\n" - ErrSandboxExists = "Sandbox Exist\n" + ErrSandboxExists = "sandbox already exists!\n" ) diff --git a/flytectl/cmd/completion.go b/flytectl/cmd/completion.go index ceeb07643a..34b3c17104 100644 --- a/flytectl/cmd/completion.go +++ b/flytectl/cmd/completion.go @@ -24,45 +24,65 @@ import ( // completionCmd represents the completion command var completionCmd = &cobra.Command{ Use: "completion [bash|zsh|fish|powershell]", - Short: "Generate completion script", - Long: `To load completions: + Short: "Generates completion script.", + Long: `To load completion, run the following commands in accordance with the shell you are using: -Bash: +- Bash + :: - $ source <(flytectl completion bash) + $ source <(flytectl completion bash) - # To load completions for each session, execute once: - # Linux: - $ flytectl completion bash > /etc/bash_completion.d/flytectl - # macOS: - $ flytectl completion bash > /usr/local/etc/bash_completion.d/flytectl + To load completions for each session: -Zsh: + - Linux + :: - # If shell completion is not already enabled in your environment, - # you will need to enable it. You can execute the following once: + $ flytectl completion bash > /etc/bash_completion.d/flytectl - $ echo "autoload -U compinit; compinit" >> ~/.zshrc + - macOS + :: - # To load completions for each session, execute once: - $ flytectl completion zsh > "${fpath[1]}/_flytectl" + $ flytectl completion bash > /usr/local/etc/bash_completion.d/flytectl - # You will need to start a new shell for this setup to take effect. +- Zsh + If shell completion is not already enabled in your environment, enable it: -fish: + :: - $ flytectl completion fish | source + $ echo "autoload -U compinit; compinit" >> ~/.zshrc - # To load completions for each session, execute once: - $ flytectl completion fish > ~/.config/fish/completions/flytectl.fish + Once enabled, execute once: -PowerShell: + :: - PS> flytectl completion powershell | Out-String | Invoke-Expression + $ flytectl completion zsh > "${fpath[1]}/_flytectl" - # To load completions for every new session, run: - PS> flytectl completion powershell > flytectl.ps1 - # and source this file from your PowerShell profile. + .. note:: + Start a new shell for this setup to take effect. + +- fish + :: + + $ flytectl completion fish | source + + To load completions for each session, run: + + :: + + $ flytectl completion fish > ~/.config/fish/completions/flytectl.fish + +- PowerShell + :: + + PS> flytectl completion powershell | Out-String | Invoke-Expression + + To load completions for each session, run: + + :: + + PS> flytectl completion powershell > flytectl.ps1 + + and source this file from your PowerShell profile. `, DisableFlagsInUseLine: true, ValidArgs: []string{"bash", "zsh", "fish", "powershell"}, diff --git a/flytectl/cmd/completion_test.go b/flytectl/cmd/completion_test.go index 71eab97dc9..99aa21a851 100644 --- a/flytectl/cmd/completion_test.go +++ b/flytectl/cmd/completion_test.go @@ -9,9 +9,9 @@ import ( func TestCompletionCmdIntegration(t *testing.T) { rootCmd := &cobra.Command{ - Long: "FlyteCTL is CLI tool written in go to interact with Flyteadmin service", - Short: "FlyteCTL CLI tool", - Use: "FlyteCTL", + Long: "Flytectl is a CLI tool written in Go to interact with the FlyteAdmin service", + Short: "Flytectl CLI tool", + Use: "flytectl", DisableAutoGenTag: true, } diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index be553a4efc..a2fd3d1521 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -34,9 +34,9 @@ var ( type Config struct { Source string `json:"source" pflag:",Path of your source code"` - // Flytectl sandbox only supports flyte version available in Github release https://github.com/flyteorg/flyte/tags - // Flytectl sandbox will only work for v0.10.0+ - // Default value dind represents the latest release + // Flytectl sandbox only supports Flyte version available in Github release https://github.com/flyteorg/flyte/tags. + // Flytectl sandbox will only work for v0.10.0+. + // Default value dind represents the latest release. Version string `json:"version" pflag:",Version of flyte. Only supports flyte releases greater than v0.10.0"` // Optionally it is possible to specify a specific fqn for the docker image with the tag. This should be @@ -44,13 +44,13 @@ type Config struct { // from there. Image string `json:"image" pflag:",Optional. Provide a fully qualified path to a Flyte compliant docker image."` - // Default value false represents that flytectl will not use latest pre release if exist + // Default value false represents that Flytectl will not use the latest pre-release if it exists. Prerelease bool `json:"pre" pflag:",Optional. Pre release Version of flyte will be used for sandbox."` // Optionally it is possible to pass in environment variables to sandbox container. Env []string `json:"env" pflag:",Optional. Provide Env variable in key=value format which can be passed to sandbox container."` // Optionally it is possible to use local sandbox image - // If local flag pass then flytectl will not pull image from registry. Usually useful, if you want to test your local images without pushing them to a registry + // Flytectl will not pull the image from the registry if the local flag passes. It is usually useful while testing your local images without pushing them to a registry. ImagePullPolicy ImagePullPolicy `json:"imagePullPolicy" pflag:",Optional. Defines the image pull behavior [Always/IfNotPresent/Never]"` } diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index be8421a640..30e506c2f1 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -25,28 +25,33 @@ import ( // Long descriptions are whitespace sensitive when generating docs using Sphinx. const ( - initCmdShort = `Generates FlyteCTL config file in the user's home directory.` - initCmdLong = `Creates a FlyteCTL config file in Flyte directory i.e ~/.flyte + initCmdShort = `Generates a Flytectl config file in the user's home directory.` + initCmdLong = `Creates a Flytectl config file in Flyte directory i.e ~/.flyte. -Generates sandbox config. Flyte Sandbox is a fully standalone minimal environment for running Flyte. Read more about sandbox https://docs.flyte.org/en/latest/deployment/sandbox.html - +Generate Sandbox config: :: flytectl config init -Generates remote cluster config, By default connection is secure. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html +Flyte Sandbox is a fully standalone minimal environment for running Flyte. +Read more about the Sandbox deployment :ref:` + "`here `" + `. + +Generate remote cluster config: :: flytectl config init --host=flyte.myexample.com -Generates remote cluster config with insecure connection +By default, the connection is secure. +Read more about remote deployment :ref:` + "`here `" + `. + +Generate remote cluster config with insecure connection: :: flytectl config init --host=flyte.myexample.com --insecure -Generates FlyteCTL config with a storage provider +Generate Flytectl config with a storage provider: :: flytectl config init --host=flyte.myexample.com --storage diff --git a/flytectl/cmd/create/create.go b/flytectl/cmd/create/create.go index 20cbefb54e..81b029c5bf 100644 --- a/flytectl/cmd/create/create.go +++ b/flytectl/cmd/create/create.go @@ -9,7 +9,7 @@ import ( // Long descriptions are whitespace sensitive when generating docs using Sphinx. const ( - createCmdShort = `Create various Flyte resources including tasks/workflows/launchplans/executions/project.` + createCmdShort = `Creates various Flyte resources such as tasks, workflows, launch plans, executions, and projects.` createCmdLong = ` Create Flyte resource; if a project: :: diff --git a/flytectl/cmd/create/create_test.go b/flytectl/cmd/create/create_test.go index a33201cf12..40b8d5d861 100644 --- a/flytectl/cmd/create/create_test.go +++ b/flytectl/cmd/create/create_test.go @@ -27,7 +27,7 @@ var tearDownAndVerify = testutils.TearDownAndVerify func TestCreateCommand(t *testing.T) { createCommand := RemoteCreateCommand() assert.Equal(t, createCommand.Use, "create") - assert.Equal(t, createCommand.Short, "Create various Flyte resources including tasks/workflows/launchplans/executions/project.") + assert.Equal(t, createCommand.Short, "Creates various Flyte resources such as tasks, workflows, launch plans, executions, and projects.") assert.Equal(t, len(createCommand.Commands()), 2) cmdNouns := createCommand.Commands() // Sort by Use value. @@ -39,5 +39,5 @@ func TestCreateCommand(t *testing.T) { assert.Equal(t, cmdNouns[0].Short, executionShort) assert.Equal(t, cmdNouns[1].Use, "project") assert.Equal(t, cmdNouns[1].Aliases, []string{"projects"}) - assert.Equal(t, cmdNouns[1].Short, "Create project resources") + assert.Equal(t, cmdNouns[1].Short, "Creates project resources.") } diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index 263046389e..3693c97424 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -11,90 +11,83 @@ import ( ) const ( - executionShort = "Create execution resources" + executionShort = "Creates execution resources." executionLong = ` -Creates executions for a given workflow/task in a project and domain. +Create execution resources for a given workflow or task in a project and domain. -There are three steps in generating an execution: - -- Generate the execution spec file using the get command. -- Update the inputs for the execution if needed. -- Run the execution by passing in the generated yaml file. - -The spec file should be generated first and then, the execution should be run using the spec file. -You can reference the FlyteCTL get task for more details. +There are three steps to generate an execution, as outlined below: +1. Generate the execution spec file using the :ref:` + "`get task `" + ` command. :: - flytectl get tasks -d development -p flytectldemo core.advanced.run_merge_sort.merge --version v2 --execFile execution_spec.yaml + flytectl get tasks -d development -p flytectldemo core.advanced.run_merge_sort.merge --version v2 --execFile execution_spec.yaml -The generated file would look similar to this: +The generated file would look similar to the following: .. code-block:: yaml - iamRoleARN: "" - inputs: - sorted_list1: - - 0 - sorted_list2: - - 0 - kubeServiceAcct: "" - targetDomain: "" - targetProject: "" - task: core.advanced.run_merge_sort.merge - version: "v2" - - -The generated file can be modified to change the input values. + iamRoleARN: "" + inputs: + sorted_list1: + - 0 + sorted_list2: + - 0 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.advanced.run_merge_sort.merge + version: "v2" + +2. [Optional] Update the inputs for the execution, if needed. +The generated spec file can be modified to change the input values, as shown below: .. code-block:: yaml - iamRoleARN: 'arn:aws:iam::12345678:role/defaultrole' - inputs: - sorted_list1: - - 2 - - 4 - - 6 - sorted_list2: - - 1 - - 3 - - 5 - kubeServiceAcct: "" - targetDomain: "" - targetProject: "" - task: core.advanced.run_merge_sort.merge - version: "v2" - -It can then be passed through the command line. -Notice that the source and target domain/projects can be different. -The root project and domain flags of -p and -d should point to the task/launch plans project/domain. - + iamRoleARN: 'arn:aws:iam::12345678:role/defaultrole' + inputs: + sorted_list1: + - 2 + - 4 + - 6 + sorted_list2: + - 1 + - 3 + - 5 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.advanced.run_merge_sort.merge + version: "v2" + +3. Run the execution by passing the generated YAML file. +The file can then be passed through the command line. +It is worth noting that the source's and target's project and domain can be different. :: - flytectl create execution --execFile execution_spec.yaml -p flytectldemo -d development --targetProject flytesnacks + flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d staging --targetProject flytesnacks -Also, an execution can be relaunched by passing in the current execution id. +To relaunch an execution, pass the current execution ID as follows: :: flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development -An execution can be recovered, i.e., recreated from the last known failure point for previously-run workflow execution. -See :ref:` + "`ref_flyteidl.admin.ExecutionRecoverRequest`" + ` for more details. +To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: :: flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytectldemo -d development -Generic data types are also supported for execution in a similar manner. Following is a sample of how the inputs need to be specified while creating the execution. -The spec file should be generated first and then, the execution should be run using the spec file. +See :ref:` + "`ref_flyteidl.admin.ExecutionRecoverRequest`" + ` for more details. + +Generic data types are supported for execution in a similar manner. +The following is an example of how generic data can be specified while creating the execution. :: flytectl get task -d development -p flytectldemo core.type_system.custom_objects.add --execFile adddatanum.yaml -The generated file would look similar to this. Here, empty values have been dumped for generic data type x and y. - +The generated file would look similar to this. Here, empty values have been dumped for generic data types 'x' and 'y'. :: iamRoleARN: "" @@ -107,7 +100,7 @@ The generated file would look similar to this. Here, empty values have been dump task: core.type_system.custom_objects.add version: v3 -Modified file with struct data populated for x and y parameters for the task core.type_system.custom_objects.add +Modified file with struct data populated for 'x' and 'y' parameters for the task "core.type_system.custom_objects.add": :: @@ -149,7 +142,7 @@ type ExecutionConfig struct { Recover string `json:"recover" pflag:",execution id to be recreated from the last known failure point."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` Version string `json:"version" pflag:",specify version of execution workflow/task."` - // Non plfag section is read from the execution config generated by get task/launchplan + // Non plfag section is read from the execution config generated by get task/launch plan Workflow string `json:"workflow,omitempty"` Task string `json:"task,omitempty"` Inputs map[string]interface{} `json:"inputs" pflag:"-"` diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index 49ff720f6a..d671e0f5b0 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -253,5 +253,5 @@ func TestCreateExecutionFuncInvalid(t *testing.T) { executionConfig.ExecFile = testDataFolder + "invalid_execution_spec.yaml" err = createExecutionCommand(ctx, args, cmdCtx) assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("either one of task or workflow name should be specified to launch an execution"), err) + assert.Equal(t, fmt.Errorf("either task or workflow name should be specified to launch an execution"), err) } diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index f2f7bdd60f..82adaf6110 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -216,7 +216,7 @@ func readConfigAndValidate(project string, domain string) (ExecutionParams, erro isTask := readExecutionConfig.Task != "" isWorkflow := readExecutionConfig.Workflow != "" if isTask == isWorkflow { - return executionParams, fmt.Errorf("either one of task or workflow name should be specified" + + return executionParams, fmt.Errorf("either task or workflow name should be specified" + " to launch an execution") } name := readExecutionConfig.Task diff --git a/flytectl/cmd/create/project.go b/flytectl/cmd/create/project.go index 95c4909c59..b0bb4eba73 100644 --- a/flytectl/cmd/create/project.go +++ b/flytectl/cmd/create/project.go @@ -13,18 +13,22 @@ import ( ) const ( - projectShort = "Create project resources" + projectShort = "Creates project resources." projectLong = ` -Create projects.(project/projects can be used interchangeably in these commands) +Create a project given its name and id. :: - flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte + flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte + +.. note:: + The terms project/projects are interchangeable in these commands. + +Create a project by definition file. -Create a project by definition file. Note: The name shouldn't contain any whitespace characters. :: - flytectl create project --file project.yaml + flytectl create project --file project.yaml .. code-block:: yaml @@ -33,8 +37,10 @@ Create a project by definition file. Note: The name shouldn't contain any whites labels: values: app: flyte - description: "Some description for the project" + description: "Some description for the project." +.. note:: + The project name shouldn't contain any whitespace characters. ` ) @@ -65,6 +71,6 @@ func createProjectsCommand(ctx context.Context, args []string, cmdCtx cmdCore.Co return err } } - fmt.Println("project Created successfully") + fmt.Println("project created successfully.") return nil } diff --git a/flytectl/cmd/create/project_test.go b/flytectl/cmd/create/project_test.go index 867894c4b7..538fd70f62 100644 --- a/flytectl/cmd/create/project_test.go +++ b/flytectl/cmd/create/project_test.go @@ -44,7 +44,7 @@ func createProjectSetup() { func TestCreateProjectFunc(t *testing.T) { setup() createProjectSetup() - defer tearDownAndVerify(t, "project Created successfully") + defer tearDownAndVerify(t, "project created successfully.") project.DefaultProjectConfig.ID = projectValue project.DefaultProjectConfig.Name = projectValue project.DefaultProjectConfig.Labels = map[string]string{} @@ -75,6 +75,6 @@ func TestEmptyProjectName(t *testing.T) { project.DefaultProjectConfig.Description = "" mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) err := createProjectsCommand(ctx, args, cmdCtx) - assert.Equal(t, fmt.Errorf("project name is required flag"), err) + assert.Equal(t, fmt.Errorf("project name is a required flag"), err) mockClient.AssertNotCalled(t, "RegisterProject", ctx, mock.Anything) } diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index 14969e9aeb..fa51fd2fbb 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -15,7 +15,7 @@ import ( // Long descriptions are whitespace sensitive when generating docs using Sphinx. const ( - deleteCmdShort = `Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project.` + deleteCmdShort = `Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects.` deleteCmdLong = ` Delete a resource; if an execution: :: diff --git a/flytectl/cmd/delete/execution.go b/flytectl/cmd/delete/execution.go index 12a0e268fc..fab4cbe5d0 100644 --- a/flytectl/cmd/delete/execution.go +++ b/flytectl/cmd/delete/execution.go @@ -13,19 +13,19 @@ import ( // Long descriptions are whitespace sensitive when generating docs using Sphinx. const ( - execCmdShort = `Terminate/Delete execution resources.` + execCmdShort = `Terminates/deletes execution resources.` execCmdLong = ` -Terminate executions.(execution,executions can be used interchangeably in these commands) - -Task executions can be aborted only if they are in non-terminal state. If they are FAILED, ABORTED or SUCCEEDED, calling terminate on them has no effect. - +Task executions can be aborted only if they are in non-terminal state. If they are FAILED, ABORTED, or SUCCEEDED, calling terminate on them has no effect. Terminate a single execution with its name: :: flytectl delete execution c6a51x2l9e -d development -p flytesnacks -Get executions to check its state: +.. note:: + The terms execution/executions are interchangeable in these commands. + +Get an execution to check its state: :: @@ -41,7 +41,7 @@ Terminate multiple executions with their names: flytectl delete execution eeam9s8sny p4wv4hwgc4 -d development -p flytesnacks -Get executions to find the state of previously terminated executions: +Get an execution to find the state of previously terminated executions: :: @@ -75,7 +75,7 @@ func terminateExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.C }, }) if err != nil { - logger.Errorf(ctx, "Failed in terminating execution of %v execution due to %v ", name, err) + logger.Errorf(ctx, "Failed to terminate execution of %v execution due to %v ", name, err) return err } } diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go index 8b4b6fb4dc..d94a71741a 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go @@ -11,36 +11,35 @@ import ( ) const ( - clusterResourceAttributesShort = "Delete matchable resources of cluster attributes" + clusterResourceAttributesShort = "Deletes matchable resources of cluster attributes." clusterResourceAttributesLong = ` -Deletes cluster resource attributes for the given project and domain combination or additionally with workflow name. +Delete cluster resource attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain, run: :: - flytectl delete cluster-resource-attribute -p flytectldemo -d development + flytectl delete cluster-resource-attribute -p flytectldemo -d development -Deletes cluster resource attribute using config file which was used to create it. -Here, the config file is written to cra.yaml. -Attributes are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. -e.g., content of cra.yaml: +To delete cluster resource attribute using the config file that was used to create it, run: :: flytectl delete cluster-resource-attribute --attrFile cra.yaml +For example, here's the config file cra.yaml: .. code-block:: yaml - + domain: development project: flytectldemo attributes: foo: "bar" buzz: "lightyear" -Deletes cluster resource attribute for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Attributes are optional in the file, which are unread during the 'delete' command but can be retained since the same file can be used for 'get', 'update' and 'delete' commands. + +To delete cluster resource attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run: :: diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label.go b/flytectl/cmd/delete/matchable_execution_cluster_label.go index e8ed9c04ae..ff88f7a788 100644 --- a/flytectl/cmd/delete/matchable_execution_cluster_label.go +++ b/flytectl/cmd/delete/matchable_execution_cluster_label.go @@ -11,34 +11,32 @@ import ( ) const ( - executionClusterLabelShort = "Delete matchable resources of execution cluster label" + executionClusterLabelShort = "Deletes matchable resources of execution cluster label." executionClusterLabelLong = ` -Deletes execution cluster label for given project and domain combination or additionally with workflow name. +Delete execution cluster label for a given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain, run: :: - flytectl delete execution-cluster-label -p flytectldemo -d development + flytectl delete execution-cluster-label -p flytectldemo -d development - -Deletes execution cluster label using config file which was used for creating it. -Here, the config file is written to ecl.yaml. -Value is optional in the file as it is unread during the delete command but it can be kept since the same file can be used for get, update or delete commands. -e.g., content of ecl.yaml: +To delete execution cluster label using the config file that was used to create it, run: :: flytectl delete execution-cluster-label --attrFile ecl.yaml +For example, here's the config file ecl.yaml: .. code-block:: yaml - + domain: development project: flytectldemo value: foo -Deletes execution cluster label for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Value is optional in the file as it is unread during the delete command, but it can be retained since the same file can be used for 'get', 'update' and 'delete' commands. + +To delete the execution cluster label of the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following: :: diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute.go b/flytectl/cmd/delete/matchable_execution_queue_attribute.go index d3b77a62c5..0c222065ac 100644 --- a/flytectl/cmd/delete/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute.go @@ -11,25 +11,22 @@ import ( ) const ( - executionQueueAttributesShort = "Delete matchable resources of execution queue attributes" + executionQueueAttributesShort = "Deletes matchable resources of execution queue attributes." executionQueueAttributesLong = ` -Deletes execution queue attributes for the given project and domain combination or additionally with workflow name. +Delete execution queue attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain, run: :: - flytectl delete execution-queue-attribute -p flytectldemo -d development + flytectl delete execution-queue-attribute -p flytectldemo -d development - -Deletes execution queue attribute using config file which was used for creating it. -Here, the config file is written to era.yaml. -Value is optional in the file as it is unread during the delete command but it can be kept since the same file can be used for get, update or delete commands. -e.g., content of era.yaml: +Delete execution queue attribute using the config file which was used to create it. :: flytectl delete execution-queue-attribute --attrFile era.yaml +For example, here's the config file era.yaml: .. code-block:: yaml @@ -41,8 +38,9 @@ e.g., content of era.yaml: - buzz - lightyear -Deletes execution queue attribute for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Value is optional in the file as it is unread during the delete command but it can be retained since the same file can be used for get, update and delete commands. + +To delete the execution queue attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: :: diff --git a/flytectl/cmd/delete/matchable_plugin_override.go b/flytectl/cmd/delete/matchable_plugin_override.go index 80b46b35db..c96493cd91 100644 --- a/flytectl/cmd/delete/matchable_plugin_override.go +++ b/flytectl/cmd/delete/matchable_plugin_override.go @@ -11,24 +11,22 @@ import ( ) const ( - pluginOverrideShort = "Delete matchable resources of plugin overrides" + pluginOverrideShort = "Deletes matchable resources of plugin overrides." pluginOverrideLong = ` -Deletes plugin override for the given project and domain combination or additionally with workflow name. +Delete plugin override for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain, run: :: - flytectl delete plugin-override -p flytectldemo -d development + flytectl delete plugin-override -p flytectldemo -d development -Deletes plugin override using config file which was used to create it. -Here, the config file is written to po.yaml. -Overrides are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. -e.g., content of po.yaml: +To delete plugin override using the config file which was used to create it, run: :: flytectl delete plugin-override --attrFile po.yaml +For example, here's the config file po.yaml: .. code-block:: yaml @@ -41,8 +39,9 @@ e.g., content of po.yaml: - plugin_override2 missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT -Deletes plugin override for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Overrides are optional in the file as they are unread during the delete command but can be retained since the same file can be used for get, update and delete commands. + +To delete plugin override for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: :: diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute.go b/flytectl/cmd/delete/matchable_task_resource_attribute.go index 90cd11e48f..903c1f7dc8 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute.go @@ -11,25 +11,22 @@ import ( ) const ( - taskResourceAttributesShort = "Delete matchable resources of task attributes" + taskResourceAttributesShort = "Deletes matchable resources of task attributes." taskResourceAttributesLong = ` -Deletes task resource attributes for the given project and domain combination, or additionally with workflow name. +Delete task resource attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain, run: :: - flytectl delete task-resource-attribute -p flytectldemo -d development + flytectl delete task-resource-attribute -p flytectldemo -d development - -Deletes task resource attribute using config file which was used to create it. -Here, the config file is written to tra.yaml. -The defaults/limits are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. -e.g., content of tra.yaml: +To delete task resource attribute using the config file which was used to create it, run: :: flytectl delete task-resource-attribute --attrFile tra.yaml +For example, here's the config file tra.yaml: .. code-block:: yaml @@ -42,8 +39,9 @@ e.g., content of tra.yaml: cpu: "2" memory: "450Mi" -Deletes task resource attribute for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +The defaults/limits are optional in the file as they are unread during the delete command, but can be retained since the same file can be used for 'get', 'update' and 'delete' commands. + +To delete task resource attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: :: diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config.go b/flytectl/cmd/delete/matchable_workflow_execution_config.go index ee9b612712..4aa47acc23 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config.go @@ -12,34 +12,32 @@ import ( ) const ( - workflowExecutionConfigShort = "Delete matchable resources of workflow execution config" + workflowExecutionConfigShort = "Deletes matchable resources of workflow execution config." workflowExecutionConfigLong = ` -Deletes workflow execution config for the given project and domain combination or additionally with workflow name. +Delete workflow execution config for the given project and domain combination or additionally the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain, run: :: - flytectl delete workflow-execution-config -p flytectldemo -d development + flytectl delete workflow-execution-config -p flytectldemo -d development - -Deletes workflow execution config using config file which was used to create it. -Here, the config file is written to wec.yaml. -Max_parallelism is optional in the file as it is unread during the delete command but can be kept since the same file can be used for get, update or delete commands. -e.g., content of wec.yaml: +To delete workflow execution config using the config file which was used to create it, run: :: flytectl delete workflow-execution-config --attrFile wec.yaml +For example, here's the config file wec.yaml: .. code-block:: yaml - + domain: development project: flytectldemo max_parallelism: 5 -Deletes workflow execution config for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Max_parallelism is optional in the file as it is unread during the delete command but can be retained since the same file can be used for get, update and delete commands. + +To delete workflow execution config for the workflow 'core.control_flow.run_merge_sort.merge_sort', run: :: diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 3c53b714b2..657d283499 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -15,57 +15,59 @@ import ( ) const ( - executionShort = "Get execution resources" + executionShort = "Gets execution resources." executionLong = ` -Retrieve all executions within the project and domain (execution, executions can be used interchangeably): +Retrieve all executions within the project and domain. :: flytectl get execution -p flytesnacks -d development -Retrieve executions by name within the project and domain: +.. note:: + The terms execution/executions are interchangeable in these commands. +Retrieve executions by name within the project and domain. :: flytectl get execution -p flytesnacks -d development oeh94k9r2r -Retrieve all the executions with filters: +Retrieve all the executions with filters. :: flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" -Retrieve executions as per the specified limit and sorting parameters: +Retrieve executions as per the specified limit and sorting parameters. :: flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieve executions present in other pages by specifying the limit and page number: +Retrieve executions present in other pages by specifying the limit and page number. :: flytectl get -p flytesnacks -d development execution --filter.limit=10 --filter.page=2 -Retrieve executions within the project and domain in YAML format: +Retrieve executions within the project and domain in YAML format. :: flytectl get execution -p flytesnacks -d development -o yaml -Retrieve executions within the project and domain in JSON format: +Retrieve executions within the project and domain in JSON format. :: flytectl get execution -p flytesnacks -d development -o json -Get more details of the execution using the --details flag, which shows node and task executions. The default view is a tree view, and the TABLE view format is not supported on this view. +Get more details of the execution using the --details flag, which shows node and task executions. +The default view is a tree view, and the TABLE view format is not supported on this view. :: flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -Fetch execution details in YAML format. In this view, only node details are available. For task, send the --nodeID flag. - +Fetch execution details in YAML format. In this view, only node details are available. For task, pass the --nodeID flag. :: flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml @@ -76,7 +78,7 @@ Fetch task executions on a specific node using the --nodeID flag. Use the nodeID flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodeID n0 -Task execution view is also available in YAML/JSON format. The following example showcases YAML, where the output also contains input and output data of each node. +Task execution view is available in YAML/JSON format too. The following example showcases YAML, where the output contains input and output data of each node. :: diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index 181444afec..2e0792166d 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -19,9 +19,9 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - getCmdShort = `Fetch various Flyte resources including tasks/workflows/launchplans/executions/project.` + getCmdShort = `Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects.` getCmdLong = ` -For project, it is: +To fetch a project, use the following command: :: flytectl get project diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index bf22c762f1..e92d7c1261 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -40,7 +40,7 @@ const ( func TestCreateGetCommand(t *testing.T) { getCommand := CreateGetCommand() assert.Equal(t, getCommand.Use, "get") - assert.Equal(t, getCommand.Short, "Fetch various Flyte resources including tasks/workflows/launchplans/executions/project.") + assert.Equal(t, getCommand.Short, "Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects.") fmt.Println(getCommand.Commands()) assert.Equal(t, len(getCommand.Commands()), 11) cmdNouns := getCommand.Commands() diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 047965ebf4..65071c2f7c 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -15,13 +15,16 @@ import ( ) const ( - launchPlanShort = "Get launch plan resources" + launchPlanShort = "Gets the launch plan resources." launchPlanLong = ` -Retrieve all launch plans within the project and domain (launch plan, launch plans can be used interchangeably): +Retrieve all launch plans within the project and domain: :: flytectl get launchplan -p flytesnacks -d development +.. note:: + The terms launchplan/launchplans are interchangeable in these commands. + Retrieve a launch plan by name within the project and domain: :: @@ -80,7 +83,7 @@ Retrieve all launch plans the within the project and domain in JSON format: flytectl get launchplan -p flytesnacks -d development -o json -Retrieve a launch plan within the project and domain as per a version and generate the execution spec file; the file can be used to launch the execution using the 'create execution' command: +Retrieve a launch plan within the project and domain as per a version and generates the execution spec file; the file can be used to launch the execution using the 'create execution' command: :: @@ -102,8 +105,7 @@ The generated file would look similar to this: version: v3 workflow: core.advanced.run_merge_sort.merge_sort -Check the create execution section on how to launch one using the generated file. - +Check the :ref:` + "`create execution section`" + ` on how to launch one using the generated file. Usage ` ) diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute.go b/flytectl/cmd/get/matchable_cluster_resource_attribute.go index 9682ec271d..89830dfec8 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute.go @@ -11,35 +11,35 @@ import ( ) const ( - clusterResourceAttributesShort = "Get matchable resources of cluster resource attributes." + clusterResourceAttributesShort = "Gets matchable resources of cluster resource attributes." clusterResourceAttributesLong = ` -Retrieves cluster resource attributes for the given project and domain. -For project flytectldemo and development domain, it is: +Retrieve cluster resource attributes for the given project and domain. +For project flytectldemo and development domain: :: flytectl get cluster-resource-attribute -p flytectldemo -d development -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} -Retrieves cluster resource attributes for the given project, domain, and workflow. +Retrieve cluster resource attributes for the given project, domain, and workflow. For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} -Writes the cluster resource attributes to a file. If there are no cluster resource attributes, the command throws an error. -Here, the config file is written to cra.yaml file: -e.g., content of cra.yaml +Write the cluster resource attributes to a file. If there are no cluster resource attributes, the command throws an error. +The config file is written to cra.yaml file. +Example: content of cra.yaml: :: diff --git a/flytectl/cmd/get/matchable_execution_cluster_label.go b/flytectl/cmd/get/matchable_execution_cluster_label.go index a8ebb50514..c665a48db0 100644 --- a/flytectl/cmd/get/matchable_execution_cluster_label.go +++ b/flytectl/cmd/get/matchable_execution_cluster_label.go @@ -11,36 +11,36 @@ import ( ) const ( - executionClusterLabelShort = "Get matchable resources of execution cluster label." + executionClusterLabelShort = "Gets matchable resources of execution cluster label." executionClusterLabelLong = ` -Retrieves the execution cluster label for a given project and domain, combination or additionally with workflow name. +Retrieve the execution cluster label for a given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain, run: :: flytectl get execution-cluster-label -p flytectldemo -d development -e.g., output from the command +The output would look like: .. code-block:: json {"project":"flytectldemo","domain":"development","value":"foo"} -Retrieve the execution cluster label for the given project, domain and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Retrieve the execution cluster label for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","value":"foo"} Write the execution cluster label to a file. If there is no execution cluster label, the command throws an error. -Here, the config file is written to ecl.yaml, -e.g., content of ecl.yaml: +The config file is written to ecl.yaml file. +Example: content of ecl.yaml: :: diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute.go b/flytectl/cmd/get/matchable_execution_queue_attribute.go index 34b73c139e..796b405d0d 100644 --- a/flytectl/cmd/get/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/get/matchable_execution_queue_attribute.go @@ -11,35 +11,35 @@ import ( ) const ( - executionQueueAttributesShort = "Get matchable resources of execution queue attributes" + executionQueueAttributesShort = "Gets matchable resources of execution queue attributes." executionQueueAttributesLong = ` -Retrieves the execution queue attribute for the given project and domain. -For project flytectldemo and development domain, it is: +Retrieve the execution queue attribute for the given project and domain. +For project flytectldemo and development domain: :: flytectl get execution-queue-attribute -p flytectldemo -d development -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} -Retrieves the execution queue attribute for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Retrieve the execution queue attribute for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","tags":["foo", "bar"]} Write the execution queue attribute to a file. If there are no execution queue attributes, the command throws an error. -Here, the config file is written to era.yaml, -e.g., content of era.yaml: +The config file is written to era.yaml file. +Example: content of era.yaml: :: diff --git a/flytectl/cmd/get/matchable_plugin_override.go b/flytectl/cmd/get/matchable_plugin_override.go index eb8e0fdd0c..eaac3d0dee 100644 --- a/flytectl/cmd/get/matchable_plugin_override.go +++ b/flytectl/cmd/get/matchable_plugin_override.go @@ -11,16 +11,16 @@ import ( ) const ( - pluginOverrideShort = "Get matchable resources of plugin override" + pluginOverrideShort = "Gets matchable resources of plugin override." pluginOverrideLong = ` -Retrieves the plugin override for the given project and domain. -For project flytectldemo and development domain, it is: +Retrieve the plugin override for the given project and domain. +For project flytectldemo and development domain: :: flytectl get plugin-override -p flytectldemo -d development -e.g., output from the command +Example: output from the command .. code-block:: json @@ -34,14 +34,13 @@ e.g., output from the command }] } -Retrieves the plugin override for the given project, domain and workflow. -For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: - +Retrieve the plugin override for the given project, domain, and workflow. +For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command: +Example: output from the command: .. code-block:: json @@ -56,9 +55,9 @@ e.g., output from the command: }] } -Write plugin overrides to a file. If there are no plugin overrides, the command returns an error. -Here, the config file is written to po.yaml, -e.g., content of po.yaml: +Write plugin overrides to a file. If there are no plugin overrides, the command throws an error. +The config file is written to po.yaml file. +Example: content of po.yaml: :: diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go index 6636976350..63ef50da19 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -11,27 +11,27 @@ import ( ) const ( - taskResourceAttributesShort = "Get matchable resources of task attributes" + taskResourceAttributesShort = "Gets matchable resources of task attributes." taskResourceAttributesLong = ` -Retrieves task resource attributes for the given project and domain. -For project flytectldemo and development domain, it is: +Retrieve task resource attributes for the given project and domain. +For project flytectldemo and development domain: :: flytectl get task-resource-attribute -p flytectldemo -d development -e.g., output from the command: +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} -Retrieves task resource attributes for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Retrieve task resource attributes for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command: +Example: output from the command: .. code-block:: json @@ -39,8 +39,8 @@ e.g., output from the command: Write the task resource attributes to a file. If there are no task resource attributes, a file would be populated with the basic data. -Here, the config file is written to tra.yaml, -e.g., content of tra.yaml: +The config file is written to tra.yaml file. +Example: content of tra.yaml: :: diff --git a/flytectl/cmd/get/matchable_workflow_execution_config.go b/flytectl/cmd/get/matchable_workflow_execution_config.go index afb1d3b0f8..6adfd5ebca 100644 --- a/flytectl/cmd/get/matchable_workflow_execution_config.go +++ b/flytectl/cmd/get/matchable_workflow_execution_config.go @@ -12,17 +12,17 @@ import ( ) const ( - workflowExecutionConfigShort = "Get matchable resources of workflow execution config" + workflowExecutionConfigShort = "Gets matchable resources of workflow execution config." workflowExecutionConfigLong = ` -Retrieves workflow execution config for the given project and domain combination or additionally with workflow name. +Retrieve workflow execution config for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain: :: flytectl get workflow-execution-config -p flytectldemo -d development -e.g., output from the command +Example: output from the command: .. code-block:: json @@ -32,14 +32,14 @@ e.g., output from the command "max_parallelism": 5 } -Retrieves workflow execution config for the project, domain and workflow. -For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Retrieve workflow execution config for the project, domain, and workflow. +For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command +Example: output from the command: .. code-block:: json @@ -50,9 +50,9 @@ e.g., output from the command "max_parallelism": 5 } -Writing the workflow execution config to a file. If there are no workflow execution config, the command would return an error. -Here, the config file is written to wec.yaml, -e.g., content of wec.yaml: +Write the workflow execution config to a file. If there are no workflow execution config, the command throws an error. +The config file is written to wec.yaml file. +Example: content of wec.yaml: :: diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 03f1826059..092935c59c 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -15,13 +15,16 @@ import ( ) const ( - projectShort = "Get project resources" + projectShort = "Gets project resources" projectLong = ` -Retrieve all the projects. (project,projects can be used interchangeably in these commands): +Retrieve all the projects: :: flytectl get project +.. note:: + The terms project/projects are interchangeable in these commands. + Retrieve project by name: :: diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index dfb03c337c..d4226d86dd 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -14,13 +14,17 @@ import ( ) const ( - taskShort = "Get task resources" + taskShort = "Gets task resources" taskLong = ` -Retrieve all the tasks within project and domain(task,tasks can be used interchangeably in these commands): + +Retrieve all the tasks within project and domain: :: flytectl get task -p flytesnacks -d development +.. note:: + The terms task/tasks are interchangeable in these commands. + Retrieve task by name within project and domain: :: diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index 1a51974b75..f2b3650250 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -16,9 +16,9 @@ import ( ) const ( - workflowShort = "Get workflow resources" + workflowShort = "Gets workflow resources" workflowLong = ` -Retrieve all the workflows within project and domain (workflow,workflows can be used interchangeably in these commands): +Retrieve all the workflows within project and domain (workflow/workflows can be used interchangeably in these commands): :: flytectl get workflow -p flytesnacks -d development diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index 845dcc417c..8d1434294e 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -13,9 +13,9 @@ import ( ) const ( - registerExampleShort = "Register Flytesnacks example" + registerExampleShort = "Registers Flytesnacks example." registerExampleLong = ` -Register all latest Flytesnacks examples: +Register all the latest Flytesnacks examples: :: flytectl register examples -d development -p flytesnacks @@ -25,7 +25,9 @@ Register specific release of Flytesnacks examples: flytectl register examples -d development -p flytesnacks --version v0.2.176 -Note: The register command automatically override the version with release version +.. note:: + The register command automatically override the version with release version. + Usage ` ) diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index b6ac2c980a..c66ceddf7a 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -14,31 +14,39 @@ import ( ) const ( - registerFilesShort = "Register file resources" + registerFilesShort = "Registers file resources." registerFilesLong = ` -Registers all the serialized protobuf files including tasks, workflows and launchplans with default v1 version. +Registers all the serialized protobuf files including tasks, workflows and launch plans with default v1 version. + If previously registered entities with v1 version are present, the command will fail immediately on the first such encounter. :: flytectl register file _pb_output/* -d development -p flytesnacks - -There is no difference between registration and fast registration. In fast registration, the input provided by the user is fast serialized proto that is generated by pyflyte. If FlyteCTL finds any source code in users' input, it considers the registration as fast registration. FlyteCTL finds input file by searching an archive file whose name starts with fast and has .tar.gz extension. When the user runs pyflyte with --fast flag then pyflyte creates serialize proto and it also creates source code archive file in the same directory. -SourceUploadPath is an optional flag. By default, FlyteCTL will create SourceUploadPath from your storage config. In case of s3 FlyteCTL will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. + +As per Flytectl, registration and fast registration mean the same! + +In fast registration, the input provided by the user is fast serialized proto generated by pyflyte. +When the user runs pyflyte with --fast flag, then pyflyte creates serialized proto and the source code archive file in the same directory. +Flytectl finds the input file by searching for an archive file whose name starts with "fast" and has .tar.gz extension. +If Flytectl finds any source code in users' input, it considers the registration as fast registration. + +SourceUploadPath is an optional flag. By default, Flytectl will create SourceUploadPath from your storage config. +If s3, Flytectl will upload the code base to s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. :: - flytectl register file _pb_output/* -d development -p flytesnacks --version v2 - -In case of fast registration, if the SourceUploadPath flag is defined, FlyteCTL will not use the default directory to upload the source code. Instead, it will override the destination path on the registration. + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 + +In case of fast registration, if the SourceUploadPath flag is defined, Flytectl will not use the default directory to upload the source code. +Instead, it will override the destination path on the registration. :: - flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" - -Using archive file. Currently supported extensions are .tgz and .tar. They can be local or remote files served through http/https. -Use --archive flag: + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" + +To register a .tgz or .tar file, use the --archive flag. They can be local or remote files served through http/https. :: - flytectl register files http://localhost:8080/_pb_output.tar -d development -p flytesnacks --archive + flytectl register files http://localhost:8080/_pb_output.tar -d development -p flytesnacks --archive Using local tgz file: diff --git a/flytectl/cmd/register/register.go b/flytectl/cmd/register/register.go index 469a3811a9..a04c99bd19 100644 --- a/flytectl/cmd/register/register.go +++ b/flytectl/cmd/register/register.go @@ -9,11 +9,11 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - registerCmdShort = "Register tasks/workflows/launchplans from a list of generated serialized files." + registerCmdShort = "Registers tasks, workflows, and launch plans from a list of generated serialized files." registercmdLong = ` -Takes input files as serialized versions of the tasks/workflows/launchplans and registers them with flyteadmin. +Take input files as serialized versions of the tasks/workflows/launchplans and register them with FlyteAdmin. Currently, these input files are protobuf files generated as output from Flytekit serialize. -Project & Domain are mandatory fields to be passed for registration and an optional version which defaults to v1. +Project and Domain are mandatory fields to be passed for registration and an optional version which defaults to v1. If the entities are already registered with Flyte for the same version, the registration would fail. ` ) diff --git a/flytectl/cmd/register/register_test.go b/flytectl/cmd/register/register_test.go index cf3b725fcd..871fc2523b 100644 --- a/flytectl/cmd/register/register_test.go +++ b/flytectl/cmd/register/register_test.go @@ -27,7 +27,7 @@ var setup = u.Setup func TestRegisterCommand(t *testing.T) { registerCommand := RemoteRegisterCommand() assert.Equal(t, registerCommand.Use, "register") - assert.Equal(t, registerCommand.Short, "Register tasks/workflows/launchplans from a list of generated serialized files.") + assert.Equal(t, registerCommand.Short, "Registers tasks, workflows, and launch plans from a list of generated serialized files.") fmt.Println(registerCommand.Commands()) assert.Equal(t, len(registerCommand.Commands()), 2) cmdNouns := registerCommand.Commands() @@ -38,9 +38,9 @@ func TestRegisterCommand(t *testing.T) { assert.Equal(t, cmdNouns[0].Use, "examples") assert.Equal(t, cmdNouns[0].Aliases, []string{"example", "flytesnack", "flytesnacks"}) - assert.Equal(t, cmdNouns[0].Short, "Register Flytesnacks example") + assert.Equal(t, cmdNouns[0].Short, "Registers Flytesnacks example.") assert.Equal(t, cmdNouns[1].Use, "files") assert.Equal(t, cmdNouns[1].Aliases, []string{"file"}) - assert.Equal(t, cmdNouns[1].Short, "Register file resources") + assert.Equal(t, cmdNouns[1].Short, "Registers file resources.") } diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index f9286950b7..dba5b8f85a 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -42,8 +42,8 @@ const ( func newRootCmd() *cobra.Command { rootCmd := &cobra.Command{ PersistentPreRunE: initConfig, - Long: "FlyteCTL is CLI tool written in go to interact with Flyteadmin service", - Short: "FlyteCTL CLI tool", + Long: "Flytectl is a CLI tool written in Go to interact with the FlyteAdmin service.", + Short: "Flytectl CLI tool", Use: "flytectl", DisableAutoGenTag: true, } diff --git a/flytectl/cmd/sandbox/exec.go b/flytectl/cmd/sandbox/exec.go index 98f584aa64..327d2e4f23 100644 --- a/flytectl/cmd/sandbox/exec.go +++ b/flytectl/cmd/sandbox/exec.go @@ -9,11 +9,13 @@ import ( ) const ( - execShort = "Execute non-interactive command inside the sandbox container" + execShort = "Executes non-interactive command inside the sandbox container" execLong = ` -Runs non-interactive command inside the Sandbox container and immediately returns the output. By default, flytectl exec is present in /root directory inside the Sandbox container. +Run non-interactive commands inside the sandbox container and immediately return the output. +By default, "flytectl exec" is present in the /root directory inside the sandbox container. :: + flytectl sandbox exec -- ls -al Usage` diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go index ea639fa4a4..26e9453f7e 100644 --- a/flytectl/cmd/sandbox/sandbox.go +++ b/flytectl/cmd/sandbox/sandbox.go @@ -8,28 +8,27 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - sandboxShort = `Used for sandbox interactions like start/teardown/status/exec.` + sandboxShort = `Helps with sandbox interactions like start, teardown, status, and exec.` sandboxLong = ` -The Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte sandbox as a single Docker container locally. +Flyte Sandbox is a fully standalone minimal environment for running Flyte. +It provides a simplified way of running Flyte sandbox as a single Docker container locally. -Create sandbox cluster: +To create a sandbox cluster, run: :: flytectl sandbox start - - -Remove sandbox cluster: + +To remove a sandbox cluster, run: :: - flytectl sandbox teardown - + flytectl sandbox teardown -Check status of sandbox container: +To check the status of the sandbox container, run: :: - flytectl sandbox status - -Execute command inside sandbox container: + flytectl sandbox status + +To execute commands inside the sandbox container, use exec: :: flytectl sandbox exec -- pwd diff --git a/flytectl/cmd/sandbox/sandbox_test.go b/flytectl/cmd/sandbox/sandbox_test.go index ee615c08ce..0692a08930 100644 --- a/flytectl/cmd/sandbox/sandbox_test.go +++ b/flytectl/cmd/sandbox/sandbox_test.go @@ -11,7 +11,7 @@ import ( func TestCreateSandboxCommand(t *testing.T) { sandboxCommand := CreateSandboxCommand() assert.Equal(t, sandboxCommand.Use, "sandbox") - assert.Equal(t, sandboxCommand.Short, "Used for sandbox interactions like start/teardown/status/exec.") + assert.Equal(t, sandboxCommand.Short, "Helps with sandbox interactions like start, teardown, status, and exec.") fmt.Println(sandboxCommand.Commands()) assert.Equal(t, len(sandboxCommand.Commands()), 4) cmdNouns := sandboxCommand.Commands() diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index ece842beb8..979e666788 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -31,33 +31,35 @@ import ( ) const ( - startShort = "Start the Flyte Sandbox cluster" + startShort = "Starts the Flyte sandbox cluster." startLong = ` -The Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte sandbox as a single Docker container locally. +Flyte sandbox is a fully standalone minimal environment for running Flyte. +It provides a simplified way of running Flyte sandbox as a single Docker container locally. -Start sandbox cluster without any source code: +Starts the sandbox cluster without any source code: :: flytectl sandbox start -Mount your source code repository inside sandbox: +Mounts your source code repository inside the sandbox: :: flytectl sandbox start --source=$HOME/flyteorg/flytesnacks -Run specific version of Flyte. FlyteCTL sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. +Runs a specific version of Flyte. Flytectl sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. :: flytectl sandbox start --version=v0.14.0 -Note: FlyteCTL sandbox is only supported for Flyte versions > v0.10.0 +.. note:: + Flytectl Sandbox is only supported for Flyte versions > v0.10.0. -Run latest pre release of Flyte. +Runs the latest pre release of Flyte. :: flytectl sandbox start --pre -Note: pre release flag will be ignore if user pass version flag, In that case Flytectl will use specific version. +Note: The pre release flag will be ignored if the user passes the version flag. In that case, Flytectl will use a specific version. Specify a Flyte Sandbox compliant image with the registry. This is useful in case you want to use an image from your registry. :: diff --git a/flytectl/cmd/sandbox/status.go b/flytectl/cmd/sandbox/status.go index bff5230c11..49e5fb77b7 100644 --- a/flytectl/cmd/sandbox/status.go +++ b/flytectl/cmd/sandbox/status.go @@ -10,9 +10,9 @@ import ( ) const ( - statusShort = "Get status of the sandbox environment." + statusShort = "Gets the status of the sandbox environment." statusLong = ` -Retrieve the status of the Sandbox environment. Currently, Flyte Sandbox runs as a local Docker container. +Retrieves the status of the sandbox environment. Currently, Flyte sandbox runs as a local Docker container. Usage :: diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index bce078b788..bbdfa303c6 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -17,9 +17,9 @@ import ( ) const ( - teardownShort = "Teardown cleans up the sandbox environment" + teardownShort = "Cleans up the sandbox environment" teardownLong = ` -Teardown removes Sandbox cluster and all the Flyte config created by sandbox start: +Removes the Sandbox cluster and all the Flyte config created by 'sandbox start': :: flytectl sandbox teardown diff --git a/flytectl/cmd/update/execution.go b/flytectl/cmd/update/execution.go index cd8a7ad209..a32d4cddc4 100644 --- a/flytectl/cmd/update/execution.go +++ b/flytectl/cmd/update/execution.go @@ -14,14 +14,14 @@ import ( ) const ( - updateExecutionShort = "Update execution status" + updateExecutionShort = "Updates the execution status" updateExecutionLong = ` -Activating an execution shows it in the cli and UI: +Activate an execution; and it shows up in the CLI and UI: :: flytectl update execution -p flytectldemo -d development oeh94k9r2r --activate -Archiving execution hides it from cli and UI: +Archive an execution; and it is hidden from the CLI and UI: :: flytectl update execution -p flytectldemo -d development oeh94k9r2r --archive diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go index 0c2a3267dd..51552fbf8a 100644 --- a/flytectl/cmd/update/launch_plan.go +++ b/flytectl/cmd/update/launch_plan.go @@ -14,14 +14,14 @@ import ( ) const ( - updateLPShort = "Update launch plan status" + updateLPShort = "Updates launch plan status" updateLPLong = ` -Activating launch plan activates the scheduled job associated with it: +Activates a launch plan which activates the scheduled job associated with it: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --activate -Archiving launch plan deschedules any scheduled job associated with it: +Archives a launch plan which deschedules any scheduled job associated with it: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --archive diff --git a/flytectl/cmd/update/launch_plan_meta.go b/flytectl/cmd/update/launch_plan_meta.go index d2a9678667..c3efa3b254 100644 --- a/flytectl/cmd/update/launch_plan_meta.go +++ b/flytectl/cmd/update/launch_plan_meta.go @@ -11,7 +11,7 @@ import ( ) const ( - updateLPMetaShort = "Update launch plan metadata" + updateLPMetaShort = "Updates the launch plan metadata" updateLPMetaLong = ` Update the description on the launch plan: :: diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute.go b/flytectl/cmd/update/matchable_cluster_resource_attribute.go index 2e8f2a2077..7da3bc3c1c 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute.go @@ -12,11 +12,11 @@ import ( const ( clusterResourceAttributesShort = "Update matchable resources of cluster attributes" clusterResourceAttributesLong = ` -Updates cluster resource attributes for given project and domain combination or additionally with workflow name. +Update cluster resource attributes for given project and domain combination or additionally with workflow name. Updating to the cluster resource attribute is only available from a generated file. See the get section to generate this file. It takes input for cluster resource attributes from the config file cra.yaml, -e.g., content of cra.yaml: +Example: content of cra.yaml: .. code-block:: yaml @@ -30,7 +30,7 @@ e.g., content of cra.yaml: flytectl update cluster-resource-attribute --attrFile cra.yaml -Updates cluster resource attribute for project and domain and workflow combination. This will take precedence over any other +Update cluster resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. This will completely overwrite any existing custom project, domain and workflow combination attributes. It is preferable to do get and generate an attribute file if there is an existing attribute that is already set and then update it to have new values. diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go index 8cb13ee340..e354541d26 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go @@ -27,7 +27,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for cluster resource attribute"), err) tearDownAndVerify(t, ``) }) - t.Run("successful update project domain attribute", func(t *testing.T) { + t.Run("successfully updated project domain attribute", func(t *testing.T) { setup() updateClusterResourceAttributeSetup() clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_cluster_attribute.yaml" @@ -38,7 +38,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { assert.Nil(t, err) tearDownAndVerify(t, ``) }) - t.Run("failed update project domain attribute", func(t *testing.T) { + t.Run("failed to update project domain attribute", func(t *testing.T) { setup() updateClusterResourceAttributeSetup() clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_cluster_attribute.yaml" @@ -50,7 +50,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { assert.Equal(t, fmt.Errorf("failed to update attributes"), err) tearDownAndVerify(t, ``) }) - t.Run("successful update workflow attribute", func(t *testing.T) { + t.Run("successfully updated workflow attribute", func(t *testing.T) { setup() updateClusterResourceAttributeSetup() clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_cluster_attribute.yaml" @@ -61,7 +61,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { assert.Nil(t, err) tearDownAndVerify(t, ``) }) - t.Run("failed update workflow attribute", func(t *testing.T) { + t.Run("failed to update workflow attribute", func(t *testing.T) { setup() updateClusterResourceAttributeSetup() clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_cluster_attribute.yaml" diff --git a/flytectl/cmd/update/matchable_execution_cluster_label.go b/flytectl/cmd/update/matchable_execution_cluster_label.go index 2c03815468..223001cdfb 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label.go @@ -12,11 +12,11 @@ import ( const ( executionClusterLabelShort = "Update matchable resources of execution cluster label" executionClusterLabelLong = ` -Updates execution cluster label for the given project and domain combination or additionally with workflow name. +Update execution cluster label for the given project and domain combination or additionally with workflow name. Updating to the execution cluster label is only available from a generated file. See the get section to generate this file. It takes input for execution cluster label from the config file ecl.yaml -e.g., content of ecl.yaml: +Example: content of ecl.yaml: .. code-block:: yaml @@ -28,7 +28,7 @@ e.g., content of ecl.yaml: flytectl update execution-cluster-label --attrFile ecl.yaml -Updates execution cluster label for project, domain and workflow combination. This will take precedence over any other +Update execution cluster label for project, domain, and workflow combination. This will take precedence over any other execution cluster label defined at project domain level. For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute.go b/flytectl/cmd/update/matchable_execution_queue_attribute.go index 4d85146680..e324fee2e0 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute.go @@ -12,14 +12,14 @@ import ( const ( executionQueueAttributesShort = "Update matchable resources of execution queue attributes" executionQueueAttributesLong = ` -Updates execution queue attributes for the given project and domain combination or additionally with workflow name. +Update execution queue attributes for the given project and domain combination or additionally with workflow name. Updating the execution queue attribute is only available from a generated file. See the get section for generating this file. -This will completely overwrite any existing custom project, domain and workflow combination attributes. +This will completely overwrite any existing custom project, domain, and workflow combination attributes. It is preferable to do get and generate an attribute file if there is an existing attribute that is already set and then update it to have new values. Refer to get execution-queue-attribute section on how to generate this file It takes input for execution queue attributes from the config file era.yaml, -e.g., content of era.yaml: +Example: content of era.yaml: .. code-block:: yaml @@ -35,7 +35,7 @@ e.g., content of era.yaml: flytectl update execution-queue-attribute --attrFile era.yaml -Updates execution queue attribute for project, domain and workflow combination. This will take precedence over any other +Update execution queue attribute for project, domain, and workflow combination. This will take precedence over any other execution queue attribute defined at project domain level. For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: diff --git a/flytectl/cmd/update/matchable_plugin_override.go b/flytectl/cmd/update/matchable_plugin_override.go index 2dfca66113..52a2837ab8 100644 --- a/flytectl/cmd/update/matchable_plugin_override.go +++ b/flytectl/cmd/update/matchable_plugin_override.go @@ -12,14 +12,14 @@ import ( const ( pluginOverrideShort = "Update matchable resources of plugin overrides" pluginOverrideLong = ` -Updates plugin overrides for given project and domain combination or additionally with workflow name. +Update plugin overrides for given project and domain combination or additionally with workflow name. Updating to the plugin override is only available from a generated file. See the get section for generating this file. -This will completely overwrite any existing plugins overrides on custom project, domain and workflow combination. +This will completely overwrite any existing plugins overrides on custom project, domain, and workflow combination. It is preferable to do get and generate a plugin override file if there is an existing override already set and then update it to have new values. Refer to get plugin-override section on how to generate this file It takes input for plugin overrides from the config file po.yaml, -e.g., content of po.yaml: +Example: content of po.yaml: .. code-block:: yaml @@ -36,7 +36,7 @@ e.g., content of po.yaml: flytectl update plugin-override --attrFile po.yaml -Updates plugin override for project, domain and workflow combination. This will take precedence over any other +Update plugin override for project, domain, and workflow combination. This will take precedence over any other plugin overrides defined at project domain level. For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go index f7bb45ce67..7b3e72cfda 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -12,14 +12,14 @@ import ( const ( taskResourceAttributesShort = "Update matchable resources of task attributes" taskResourceAttributesLong = ` -Updates task resource attributes for the given project and domain combination or additionally with workflow name. +Updates the task resource attributes for the given project and domain combination or additionally with workflow name. Updating the task resource attribute is only available from a generated file. See the get section for generating this file. -This will completely overwrite any existing custom project, domain and workflow combination attributes. +This will completely overwrite any existing custom project, domain, and workflow combination attributes. It is preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values. Refer to get task-resource-attribute section on how to generate this file. It takes input for task resource attributes from the config file tra.yaml, -e.g., content of tra.yaml: +Example: content of tra.yaml: .. code-block:: yaml @@ -36,7 +36,7 @@ e.g., content of tra.yaml: flytectl update task-resource-attribute --attrFile tra.yaml -Updates task resource attribute for project, domain and workflow combination. This will take precedence over any other +Update task resource attribute for project, domain, and workflow combination. This will take precedence over any other resource attribute defined at project domain level. For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: diff --git a/flytectl/cmd/update/matchable_workflow_execution_config.go b/flytectl/cmd/update/matchable_workflow_execution_config.go index 740685ef2b..57e20c065d 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config.go @@ -11,16 +11,16 @@ import ( ) const ( - workflowExecutionConfigShort = "Update matchable resources of workflow execution config" + workflowExecutionConfigShort = "Updates matchable resources of workflow execution config" workflowExecutionConfigLong = ` -Updates workflow execution config for given project and domain combination or additionally with workflow name. +Updates the workflow execution config for the given project and domain combination or additionally with workflow name. Updating the workflow execution config is only available from a generated file. See the get section for generating this file. This will completely overwrite any existing custom project and domain and workflow combination execution config. It is preferable to do get and generate a config file if there is an existing execution config already set and then update it to have new values. Refer to get workflow-execution-config section on how to generate this file. It takes input for workflow execution config from the config file wec.yaml, -e.g., content of wec.yaml: +Example: content of wec.yaml: .. code-block:: yaml @@ -32,7 +32,7 @@ e.g., content of wec.yaml: flytectl update workflow-execution-config --attrFile wec.yaml -Updates workflow execution config for project, domain and workflow combination. This will take precedence over any other +Update workflow execution config for project, domain, and workflow combination. This will take precedence over any other execution config defined at project domain level. For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index d63bcb80d3..0da542b763 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -15,7 +15,7 @@ import ( const ( projectShort = "Update project resources" projectLong = ` -Updates the project according to the flags passed. Allows you to archive or activate a project. +Update the project according to the flags passed. Allows you to archive or activate a project. Activate project flytesnacks: :: diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index b6b16702b6..db1f52c7cd 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -75,7 +75,7 @@ func TestActivateProjectFuncWithError(t *testing.T) { err = updateProjectsFunc(ctx, args, cmdCtx) assert.NotNil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project dummyProject failed to get updated due to Error Updating Project\n") + tearDownAndVerify(t, "Project dummyProject failed to update due to Error Updating Project\n") } func TestArchiveProjectFunc(t *testing.T) { @@ -118,7 +118,7 @@ func TestArchiveProjectFuncWithError(t *testing.T) { err = updateProjectsFunc(ctx, args, cmdCtx) assert.NotNil(t, err) mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project dummyProject failed to get updated"+ + tearDownAndVerify(t, "Project dummyProject failed to update"+ " due to Error Updating Project\n") } diff --git a/flytectl/cmd/update/task_meta.go b/flytectl/cmd/update/task_meta.go index 8c599710b2..80f2b6c7b0 100644 --- a/flytectl/cmd/update/task_meta.go +++ b/flytectl/cmd/update/task_meta.go @@ -13,7 +13,7 @@ import ( const ( updateTaskShort = "Update task metadata" updateTaskLong = ` -Updates the description on the task: +Update the description on the task: :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --description "Merge sort example" diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index ef1c2b66a8..7f48226b0c 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -21,8 +21,8 @@ const ( updateShort = `Update Flyte resources e.g., project.` updatecmdLong = ` Currently, this command only provides subcommands to update project. -Takes input project that needs to be archived or unarchived. Name of the project to be updated is a mandatory field. -To update a project: +Take input project that needs to be archived or unarchived. Name of the project to be updated is a mandatory field. +Update Flyte resources; if a project: :: flytectl update project -p flytesnacks --activateProject diff --git a/flytectl/cmd/update/workflow_meta.go b/flytectl/cmd/update/workflow_meta.go index af4cb3fe7d..f84c1e87e4 100644 --- a/flytectl/cmd/update/workflow_meta.go +++ b/flytectl/cmd/update/workflow_meta.go @@ -13,7 +13,7 @@ import ( const ( updateWorkflowShort = "Update workflow metadata" updateWorkflowLong = ` -Updates the description on the workflow: +Update the description on the workflow: :: flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort workflow example" diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go index 89963b3b71..eb1dde2b3e 100644 --- a/flytectl/cmd/upgrade/upgrade.go +++ b/flytectl/cmd/upgrade/upgrade.go @@ -26,21 +26,23 @@ type Goos string // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - upgradeCmdShort = `Upgrade/rollback to a Flyte version` + upgradeCmdShort = `Upgrades/rollbacks to a Flyte version.` upgradeCmdLong = ` -For FlyteCTL, it is: +For Flytectl, it is: :: flytectl upgrade -Note: Please use upgrade with sudo. Without sudo it will cause permission issue. +.. note:: + Please upgrade with sudo. Failing to do so may result in a permission issues. -Rollback flytectl binary: +Rollback Flytectl binary: :: flytectl upgrade rollback -Note: Upgrade is not available on windows. +.. note:: + Upgrade is not available on Windows. ` rollBackSubCommand = "rollback" ) @@ -115,7 +117,7 @@ func isUpgradeSupported(goos platformutil.Platform) (bool, error) { if isGreater, err := util.IsVersionGreaterThan(latest, stdlibversion.Version); err != nil { return false, err } else if !isGreater { - fmt.Println("You already have the latest version of flytectl") + fmt.Println("You already have the latest version of Flytectl") return false, nil } diff --git a/flytectl/cmd/upgrade/upgrade_test.go b/flytectl/cmd/upgrade/upgrade_test.go index d89f93aecf..473621bb9e 100644 --- a/flytectl/cmd/upgrade/upgrade_test.go +++ b/flytectl/cmd/upgrade/upgrade_test.go @@ -27,8 +27,8 @@ var ( func TestUpgradeCommand(t *testing.T) { rootCmd := &cobra.Command{ - Long: "FlyteCTL is CLI tool written in go to interact with flyteadmin service", - Short: "FlyteCTL CLI tool", + Long: "Flytectl is a CLI tool written in Go to interact with the FlyteAdmin service.", + Short: "Flytectl CLI tool", Use: "flytectl", DisableAutoGenTag: true, } diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go index 2f5d9f3f62..927ca755f5 100644 --- a/flytectl/cmd/version/version.go +++ b/flytectl/cmd/version/version.go @@ -19,9 +19,9 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( - versionCmdShort = `Fetch Flyte version` + versionCmdShort = `Fetches Flyte version` versionCmdLong = ` -For FlyteCTL version, it is: +Fetch Flytectl version. :: flytectl version @@ -55,11 +55,11 @@ func getVersion(ctx context.Context, args []string, cmdCtx cmdCore.CommandContex goos := platformutil.Platform(runtime.GOOS) version, err := githubutil.FlytectlReleaseConfig.GetLatestVersion() if err != nil { - logger.Error(ctx, "Not able to get latest version because %v", err) + logger.Error(ctx, "Unable to get the latest version because %v", err) } else { message, err := githubutil.GetUpgradeMessage(version, goos) if err != nil { - logger.Error(ctx, "Not able to detect new version because %v", err) + logger.Error(ctx, "Unable to detect a new version because %v", err) } if len(message) > 0 { fmt.Println(message) @@ -97,14 +97,14 @@ func getControlPlaneVersion(ctx context.Context, cmdCtx cmdCore.CommandContext) logger.Debugf(ctx, "Failed to get version of control plane %v: \n", err) return err } - // Print Flyteadmin + // Print FlyteAdmin if err := printVersion(versionOutput{ Build: v.ControlPlaneVersion.Build, BuildTime: v.ControlPlaneVersion.BuildTime, Version: v.ControlPlaneVersion.Version, App: controlPlanAppName, }); err != nil { - return fmt.Errorf("not able to get control plane version..Please try again: %v", err) + return fmt.Errorf("Unable to get the control plane version. Please try again: %v", err) } return nil } diff --git a/flytectl/cmd/version/version_test.go b/flytectl/cmd/version/version_test.go index 8bc2511a3a..0be22c97c2 100644 --- a/flytectl/cmd/version/version_test.go +++ b/flytectl/cmd/version/version_test.go @@ -31,8 +31,8 @@ var ( func TestVersionCommand(t *testing.T) { rootCmd := &cobra.Command{ - Long: "FlyteCTL is CLI tool written in go to interact with Flyteadmin service", - Short: "FlyteCTL CLI tool", + Long: "Flytectl is a CLI tool written in Go to interact with the FlyteAdmin service.", + Short: "Flytectl CLI tool", Use: "flytectl", DisableAutoGenTag: true, } diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index aeaa2ae410..419e02fd71 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -190,4 +190,5 @@ # intersphinx configuration intersphinx_mapping = { "flyteidl": ("https://docs.flyte.org/projects/flyteidl/en/latest", None), + "flyte": ("https://docs.flyte.org/en/latest", None), } diff --git a/flytectl/docs/source/config.rst b/flytectl/docs/source/config.rst index dd558c988c..1bf12d6016 100644 --- a/flytectl/docs/source/config.rst +++ b/flytectl/docs/source/config.rst @@ -6,8 +6,6 @@ It specifies the actions to be performed on the resource 'config'. :maxdepth: 1 :caption: Config - gen/flytectl_config_validate - gen/flytectl_config_init gen/flytectl_config_validate gen/flytectl_config_init gen/flytectl_config_discover diff --git a/flytectl/docs/source/contribute.rst b/flytectl/docs/source/contribute.rst index 864fda4e61..9859618635 100644 --- a/flytectl/docs/source/contribute.rst +++ b/flytectl/docs/source/contribute.rst @@ -3,7 +3,7 @@ Contributing Guide ########################### First off, thank you for thinking about contributing! -Below you’ll find instructions that will hopefully guide you through how to contribute to, fix, and improve FlyteCTL. +Here are the instructions that will guide you through contributing, fixing, and improving Flytectl. 📝 Contribute to Documentation ============================== @@ -12,25 +12,25 @@ Docs are generated using Sphinx and are available at [flytectl.rtfd.io](https:// To update the documentation, follow these steps: -1. Install the requirements by running ``pip install -r doc-requirements.txt`` in the root folder -2. Make modifications in the `cmd `__ folder -3. Run ``make gendocs`` from within the `docs `__ folder -4. Open html files produced by Sphinx in your browser to verify if the changes look as expected (html files can be found in the ``docs/build/html`` folder) +1. Install the requirements by running ``pip install -r doc-requirements.txt`` in the root folder. +2. Make modifications in the `cmd `__ folder. +3. Run ``make gendocs`` from within the `docs `__ folder. +4. Open html files produced by Sphinx in your browser to verify if the changes look as expected (html files can be found in the ``docs/build/html`` folder). 💻 Contribute Code ================== -1. Run ``make compile`` in the root directory to compile the code -2. Set up a local cluster by running ``./bin/flytectl sandbox start`` in the root directory -3. Run ``flytectl get project`` to see if things are working -4. Run the command you want to test in the terminal +1. Run ``make compile`` in the root directory to compile the code. +2. Set up a local cluster by running ``./bin/flytectl sandbox start`` in the root directory. +3. Run ``flytectl get project`` to see if things are working. +4. Run the command you want to test in the terminal. 5. If you want to update the command (add additional options, change existing options, etc.): * Navigate to `cmd `__ directory - * Each sub-directory points to a command, for example, ``create`` points to ``flytectl create ...`` + * Each sub-directory points to a command, e.g., ``create`` points to ``flytectl create ...`` * Here are the directories you can navigate to: - .. list-table:: FlyteCTL cmd directories + .. list-table:: Flytectl cmd directories :widths: 25 25 50 :header-rows: 1 @@ -42,32 +42,31 @@ To update the documentation, follow these steps: - Common package for all commands; has root flags * - ``configuration`` - ``flytectl configuration ...`` - - Command to validate/generate flytectl config + - Validates/generates Flytectl config * - ``create`` - ``flytectl create ...`` - - Command to create a project/execution + - Creates a project/execution * - ``delete`` - ``flytectl delete ...`` - - Command to abort an execution and delete resource attributes + - Aborts an execution and deletes the resource attributes * - ``get`` - ``flytectl get ...`` - - Command to get a task/workflow/launchplan/execution/project/resource's-attributes + - Gets a task/workflow/launchplan/execution/project/resource attribute * - ``register`` - ``flytectl register ...`` - - Command to register a task/workflow/launchplan + - Registers a task/workflow/launchplan * - ``sandbox`` - ``flytectl sandbox ...`` - - Command to interact with sandbox + - Interacts with sandbox * - ``update`` - ``flytectl update ...`` - - Command to update a project/launchplan/resource's-attributes + - Updates a project/launchplan/resource attribute * - ``upgrade`` - ``flytectl upgrade ...`` - - Command to upgrade/rollback FlyteCTL version + - Upgrades/rollbacks Flytectl version * - ``version`` - ``flytectl version ...`` - - Command to fetch FlyteCTL version + - Fetches Flytectl version + Find all the Flytectl commands :ref:`here `. + * Run appropriate tests to view the changes by running ``go test ./... -race -coverprofile=coverage.txt -covermode=atomic -v`` in the root directory. - Find all FlyteCTL commands on the `Nouns `__ page. - * Run appropriate tests to test the changes by running ``go test ./... -race -coverprofile=coverage.txt -covermode=atomic -v`` - in the root directory \ No newline at end of file diff --git a/flytectl/docs/source/examples.rst b/flytectl/docs/source/examples.rst index b57b7e5965..35993115b4 100644 --- a/flytectl/docs/source/examples.rst +++ b/flytectl/docs/source/examples.rst @@ -1,6 +1,6 @@ Examples ------- -It specifies the actions to be performed on the resource 'examples'. +--------- +It specifies the actions to be performed on the 'examples' resource. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/execution-cluster-label.rst b/flytectl/docs/source/execution-cluster-label.rst index 2a27e87e52..9daa792840 100644 --- a/flytectl/docs/source/execution-cluster-label.rst +++ b/flytectl/docs/source/execution-cluster-label.rst @@ -1,6 +1,6 @@ Execution cluster label ----------------------- -It specifies the actions to be performed on the resource 'execution-cluster-label'. +It specifies the actions to be performed on the 'execution-cluster-label' resource. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/execution-queue-attribute.rst b/flytectl/docs/source/execution-queue-attribute.rst index 207118cdb9..cbffa7537b 100644 --- a/flytectl/docs/source/execution-queue-attribute.rst +++ b/flytectl/docs/source/execution-queue-attribute.rst @@ -1,6 +1,6 @@ Execution queue attribute ------- -It specifies the actions to be performed on the resource 'execution-queue-attribute'. +-------------------------- +It specifies the actions to be performed on the 'execution-queue-attribute' resource. .. toctree:: :maxdepth: 1 @@ -9,6 +9,3 @@ It specifies the actions to be performed on the resource 'execution-queue-attrib gen/flytectl_get_execution-queue-attribute gen/flytectl_delete_execution-queue-attribute gen/flytectl_update_execution-queue-attribute - gen/flytectl_get_execution-queue-attribute - gen/flytectl_delete_execution-queue-attribute - gen/flytectl_update_execution-queue-attribute diff --git a/flytectl/docs/source/execution.rst b/flytectl/docs/source/execution.rst index 4e3d1cbff3..2669831019 100644 --- a/flytectl/docs/source/execution.rst +++ b/flytectl/docs/source/execution.rst @@ -1,6 +1,6 @@ Execution --------- -It specifies the actions to be performed on the resource 'execution'. +It specifies the actions to be performed on the 'execution' resource. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/files.rst b/flytectl/docs/source/files.rst index 96f2b861d9..f02fb03950 100644 --- a/flytectl/docs/source/files.rst +++ b/flytectl/docs/source/files.rst @@ -1,6 +1,6 @@ Files ------ -It specifies the actions to be performed on the resource 'files'. +It specifies the actions to be performed on the 'file' resource. .. toctree:: :maxdepth: 1 @@ -8,4 +8,4 @@ It specifies the actions to be performed on the resource 'files'. gen/flytectl_register_files -Note: It allows the user to register local files. +Note: It allows the user to register local files. diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index f3cf8c06f6..6d7693e09a 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -3,13 +3,13 @@ flytectl -------- -FlyteCTL CLI tool +Flytectl CLI tool Synopsis ~~~~~~~~ -FlyteCTL is CLI tool written in go to interact with Flyteadmin service +Flytectl is a CLI tool written in Go to interact with the FlyteAdmin service. Options ~~~~~~~ @@ -61,14 +61,14 @@ Options SEE ALSO ~~~~~~~~ -* :doc:`flytectl_completion` - Generate completion script +* :doc:`flytectl_completion` - Generates completion script. * :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. -* :doc:`flytectl_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. -* :doc:`flytectl_register` - Register tasks/workflows/launchplans from a list of generated serialized files. -* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`flytectl_create` - Creates various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_register` - Registers tasks, workflows, and launch plans from a list of generated serialized files. +* :doc:`flytectl_sandbox` - Helps with Sandbox interactions like start, teardown, status, and exec. * :doc:`flytectl_update` - Update Flyte resources e.g., project. -* :doc:`flytectl_upgrade` - Upgrade/rollback to a Flyte version -* :doc:`flytectl_version` - Fetch Flyte version +* :doc:`flytectl_upgrade` - Upgrades/rollbacks to a Flyte version. +* :doc:`flytectl_version` - Fetches Flyte version diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index 33dea6e177..e9a33b0ae6 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -3,50 +3,70 @@ flytectl completion ------------------- -Generate completion script +Generates completion script. Synopsis ~~~~~~~~ -To load completions: +To load completion, run the following commands in accordance with the shell you are using: -Bash: +- Bash + :: - $ source <(flytectl completion bash) + $ source <(flytectl completion bash) - # To load completions for each session, execute once: - # Linux: - $ flytectl completion bash > /etc/bash_completion.d/flytectl - # macOS: - $ flytectl completion bash > /usr/local/etc/bash_completion.d/flytectl + To load completions for each session: -Zsh: + - Linux + :: - # If shell completion is not already enabled in your environment, - # you will need to enable it. You can execute the following once: + $ flytectl completion bash > /etc/bash_completion.d/flytectl - $ echo "autoload -U compinit; compinit" >> ~/.zshrc + - macOS + :: - # To load completions for each session, execute once: - $ flytectl completion zsh > "${fpath[1]}/_flytectl" + $ flytectl completion bash > /usr/local/etc/bash_completion.d/flytectl - # You will need to start a new shell for this setup to take effect. +- Zsh + If shell completion is not already enabled in your environment, enable it: -fish: + :: - $ flytectl completion fish | source + $ echo "autoload -U compinit; compinit" >> ~/.zshrc - # To load completions for each session, execute once: - $ flytectl completion fish > ~/.config/fish/completions/flytectl.fish + Once enabled, execute once: -PowerShell: + :: - PS> flytectl completion powershell | Out-String | Invoke-Expression + $ flytectl completion zsh > "${fpath[1]}/_flytectl" - # To load completions for every new session, run: - PS> flytectl completion powershell > flytectl.ps1 - # and source this file from your PowerShell profile. + .. note:: + Start a new shell for this setup to take effect. + +- fish + :: + + $ flytectl completion fish | source + + To load completions for each session, run: + + :: + + $ flytectl completion fish > ~/.config/fish/completions/flytectl.fish + +- PowerShell + :: + + PS> flytectl completion powershell | Out-String | Invoke-Expression + + To load completions for each session, run: + + :: + + PS> flytectl completion powershell > flytectl.ps1 + + and source this file from your PowerShell profile. :: @@ -109,5 +129,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl` - Flytectl CLI tool diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 56b8782bb7..86138b2491 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -69,9 +69,9 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl` - Flytectl CLI tool * :doc:`flytectl_config_discover` - Searches for a config in one of the default search paths. * :doc:`flytectl_config_docs` - Generate configuration documetation in rst format -* :doc:`flytectl_config_init` - Generates FlyteCTL config file in the user's home directory. +* :doc:`flytectl_config_init` - Generates a Flytectl config file in the user's home directory. * :doc:`flytectl_config_validate` - Validates the loaded config. diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index a7274917da..26c1eae2ac 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -3,33 +3,38 @@ flytectl config init -------------------- -Generates FlyteCTL config file in the user's home directory. +Generates a Flytectl config file in the user's home directory. Synopsis ~~~~~~~~ -Creates a FlyteCTL config file in Flyte directory i.e ~/.flyte +Creates a Flytectl config file in Flyte directory i.e ~/.flyte. -Generates sandbox config. Flyte Sandbox is a fully standalone minimal environment for running Flyte. Read more about sandbox https://docs.flyte.org/en/latest/deployment/sandbox.html - +Generate Sandbox config: :: flytectl config init -Generates remote cluster config, By default connection is secure. Read more about the remote deployment https://docs.flyte.org/en/latest/deployment/index.html +Flyte Sandbox is a fully standalone minimal environment for running Flyte. +Read more about the Sandbox deployment :ref:`here `. + +Generate remote cluster config: :: flytectl config init --host=flyte.myexample.com -Generates remote cluster config with insecure connection +By default, the connection is secure. +Read more about remote deployment :ref:`here `. + +Generate remote cluster config with insecure connection: :: flytectl config init --host=flyte.myexample.com --insecure -Generates FlyteCTL config with a storage provider +Generate Flytectl config with a storage provider: :: flytectl config init --host=flyte.myexample.com --storage diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index 1fcc9387db..3839af1a4a 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -3,7 +3,7 @@ flytectl create --------------- -Create various Flyte resources including tasks/workflows/launchplans/executions/project. +Creates various Flyte resources such as tasks, workflows, launch plans, executions, and projects. Synopsis ~~~~~~~~ @@ -72,7 +72,7 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - FlyteCTL CLI tool -* :doc:`flytectl_create_execution` - Create execution resources -* :doc:`flytectl_create_project` - Create project resources +* :doc:`flytectl` - Flytectl CLI tool +* :doc:`flytectl_create_execution` - Creates execution resources. +* :doc:`flytectl_create_project` - Creates project resources. diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 9e0d33530e..c7cfc199ba 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -3,95 +3,88 @@ flytectl create execution ------------------------- -Create execution resources +Creates execution resources. Synopsis ~~~~~~~~ -Creates executions for a given workflow/task in a project and domain. +Create execution resources for a given workflow or task in a project and domain. -There are three steps in generating an execution: - -- Generate the execution spec file using the get command. -- Update the inputs for the execution if needed. -- Run the execution by passing in the generated yaml file. - -The spec file should be generated first and then, the execution should be run using the spec file. -You can reference the FlyteCTL get task for more details. +There are three steps to generate an execution, as outlined below: +1. Generate the execution spec file using the :ref:`get task ` command. :: - flytectl get tasks -d development -p flytectldemo core.advanced.run_merge_sort.merge --version v2 --execFile execution_spec.yaml + flytectl get tasks -d development -p flytectldemo core.advanced.run_merge_sort.merge --version v2 --execFile execution_spec.yaml -The generated file would look similar to this: +The generated file would look similar to the following: .. code-block:: yaml - iamRoleARN: "" - inputs: - sorted_list1: - - 0 - sorted_list2: - - 0 - kubeServiceAcct: "" - targetDomain: "" - targetProject: "" - task: core.advanced.run_merge_sort.merge - version: "v2" - - -The generated file can be modified to change the input values. + iamRoleARN: "" + inputs: + sorted_list1: + - 0 + sorted_list2: + - 0 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.advanced.run_merge_sort.merge + version: "v2" + +2. [Optional] Update the inputs for the execution, if needed. +The generated spec file can be modified to change the input values, as shown below: .. code-block:: yaml - iamRoleARN: 'arn:aws:iam::12345678:role/defaultrole' - inputs: - sorted_list1: - - 2 - - 4 - - 6 - sorted_list2: - - 1 - - 3 - - 5 - kubeServiceAcct: "" - targetDomain: "" - targetProject: "" - task: core.advanced.run_merge_sort.merge - version: "v2" - -It can then be passed through the command line. -Notice that the source and target domain/projects can be different. -The root project and domain flags of -p and -d should point to the task/launch plans project/domain. - + iamRoleARN: 'arn:aws:iam::12345678:role/defaultrole' + inputs: + sorted_list1: + - 2 + - 4 + - 6 + sorted_list2: + - 1 + - 3 + - 5 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.advanced.run_merge_sort.merge + version: "v2" + +3. Run the execution by passing the generated YAML file. +The file can then be passed through the command line. +It is worth noting that the source's and target's project and domain can be different. :: - flytectl create execution --execFile execution_spec.yaml -p flytectldemo -d development --targetProject flytesnacks + flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d staging --targetProject flytesnacks -Also, an execution can be relaunched by passing in the current execution id. +To relaunch an execution, pass the current execution ID as follows: :: flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development -An execution can be recovered, i.e., recreated from the last known failure point for previously-run workflow execution. -See :ref:`ref_flyteidl.admin.ExecutionRecoverRequest` for more details. +To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: :: flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytectldemo -d development -Generic data types are also supported for execution in a similar manner. Following is a sample of how the inputs need to be specified while creating the execution. -The spec file should be generated first and then, the execution should be run using the spec file. +See :ref:`ref_flyteidl.admin.ExecutionRecoverRequest` for more details. + +Generic data types are supported for execution in a similar manner. +The following is an example of how generic data can be specified while creating the execution. :: flytectl get task -d development -p flytectldemo core.type_system.custom_objects.add --execFile adddatanum.yaml -The generated file would look similar to this. Here, empty values have been dumped for generic data type x and y. - +The generated file would look similar to this. Here, empty values have been dumped for generic data types 'x' and 'y'. :: iamRoleARN: "" @@ -104,7 +97,7 @@ The generated file would look similar to this. Here, empty values have been dump task: core.type_system.custom_objects.add version: v3 -Modified file with struct data populated for x and y parameters for the task core.type_system.custom_objects.add +Modified file with struct data populated for 'x' and 'y' parameters for the task "core.type_system.custom_objects.add": :: @@ -202,5 +195,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_create` - Creates various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index ba6b813e40..6cf6174288 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -3,23 +3,27 @@ flytectl create project ----------------------- -Create project resources +Creates project resources. Synopsis ~~~~~~~~ -Create projects.(project/projects can be used interchangeably in these commands) +Create a project given its name and id. :: - flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte + flytectl create project --name flytesnacks --id flytesnacks --description "flytesnacks description" --labels app=flyte + +.. note:: + The terms project/projects are interchangeable in these commands. + +Create a project by definition file. -Create a project by definition file. Note: The name shouldn't contain any whitespace characters. :: - flytectl create project --file project.yaml + flytectl create project --file project.yaml .. code-block:: yaml @@ -28,8 +32,10 @@ Create a project by definition file. Note: The name shouldn't contain any whites labels: values: app: flyte - description: "Some description for the project" + description: "Some description for the project." +.. note:: + The project name shouldn't contain any whitespace characters. :: @@ -102,5 +108,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_create` - Create various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_create` - Creates various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 4bf0a412a6..c5a5d389fc 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -3,7 +3,7 @@ flytectl delete --------------- -Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. Synopsis ~~~~~~~~ @@ -72,12 +72,12 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - FlyteCTL CLI tool -* :doc:`flytectl_delete_cluster-resource-attribute` - Delete matchable resources of cluster attributes -* :doc:`flytectl_delete_execution` - Terminate/Delete execution resources. -* :doc:`flytectl_delete_execution-cluster-label` - Delete matchable resources of execution cluster label -* :doc:`flytectl_delete_execution-queue-attribute` - Delete matchable resources of execution queue attributes -* :doc:`flytectl_delete_plugin-override` - Delete matchable resources of plugin overrides -* :doc:`flytectl_delete_task-resource-attribute` - Delete matchable resources of task attributes -* :doc:`flytectl_delete_workflow-execution-config` - Delete matchable resources of workflow execution config +* :doc:`flytectl` - Flytectl CLI tool +* :doc:`flytectl_delete_cluster-resource-attribute` - Deletes matchable resources of cluster attributes. +* :doc:`flytectl_delete_execution` - Terminates/deletes execution resources. +* :doc:`flytectl_delete_execution-cluster-label` - Deletes matchable resources of execution cluster label. +* :doc:`flytectl_delete_execution-queue-attribute` - Deletes matchable resources of execution queue attributes. +* :doc:`flytectl_delete_plugin-override` - Deletes matchable resources of plugin overrides. +* :doc:`flytectl_delete_task-resource-attribute` - Deletes matchable resources of task attributes. +* :doc:`flytectl_delete_workflow-execution-config` - Deletes matchable resources of workflow execution config. diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index e606a9fd2e..0fdfa84c68 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -3,41 +3,40 @@ flytectl delete cluster-resource-attribute ------------------------------------------ -Delete matchable resources of cluster attributes +Deletes matchable resources of cluster attributes. Synopsis ~~~~~~~~ -Deletes cluster resource attributes for the given project and domain combination or additionally with workflow name. +Delete cluster resource attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain, run: :: - flytectl delete cluster-resource-attribute -p flytectldemo -d development + flytectl delete cluster-resource-attribute -p flytectldemo -d development -Deletes cluster resource attribute using config file which was used to create it. -Here, the config file is written to cra.yaml. -Attributes are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. -e.g., content of cra.yaml: +To delete cluster resource attribute using the config file that was used to create it, run: :: flytectl delete cluster-resource-attribute --attrFile cra.yaml +For example, here's the config file cra.yaml: .. code-block:: yaml - + domain: development project: flytectldemo attributes: foo: "bar" buzz: "lightyear" -Deletes cluster resource attribute for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Attributes are optional in the file, which are unread during the 'delete' command but can be retained since the same file can be used for 'get', 'update' and 'delete' commands. + +To delete cluster resource attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run: :: @@ -108,5 +107,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index de963af2ce..889e09a6fa 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -3,25 +3,25 @@ flytectl delete execution-cluster-label --------------------------------------- -Delete matchable resources of execution cluster label +Deletes matchable resources of execution cluster label. Synopsis ~~~~~~~~ -Deletes execution cluster label for given project and domain combination or additionally with workflow name. +Deletes execution cluster label for a given project and domain combination or additionally the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain: :: flytectl delete execution-cluster-label -p flytectldemo -d development -Deletes execution cluster label using config file which was used for creating it. +Delete execution cluster label using the config file that was used to create it. Here, the config file is written to ecl.yaml. -Value is optional in the file as it is unread during the delete command but it can be kept since the same file can be used for get, update or delete commands. -e.g., content of ecl.yaml: +Value is optional in the file as it is unread during the delete command, but it can be retained since the same file can be used for 'get', 'update' or 'delete' commands. +Example: content of ecl.yaml: :: @@ -34,8 +34,8 @@ e.g., content of ecl.yaml: project: flytectldemo value: foo -Deletes execution cluster label for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Delete execution cluster label for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort': :: @@ -106,5 +106,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 30849c67d8..9909792dbe 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -3,25 +3,25 @@ flytectl delete execution-queue-attribute ----------------------------------------- -Delete matchable resources of execution queue attributes +Deletes matchable resources of execution queue attributes. Synopsis ~~~~~~~~ -Deletes execution queue attributes for the given project and domain combination or additionally with workflow name. +Delete execution queue attributes for the given project and domain combination or additionally the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain: :: flytectl delete execution-queue-attribute -p flytectldemo -d development -Deletes execution queue attribute using config file which was used for creating it. +Delete execution queue attribute using the config file which was used to create it. Here, the config file is written to era.yaml. -Value is optional in the file as it is unread during the delete command but it can be kept since the same file can be used for get, update or delete commands. -e.g., content of era.yaml: +Value is optional in the file as it is unread during the delete command but it can be retained since the same file can be used for get, update or delete commands. +Example: content of era.yaml: :: @@ -38,8 +38,8 @@ e.g., content of era.yaml: - buzz - lightyear -Deletes execution queue attribute for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Delete execution queue attribute for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort': :: @@ -110,5 +110,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 9831831e98..711b2a3ffd 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -3,24 +3,24 @@ flytectl delete execution ------------------------- -Terminate/Delete execution resources. +Terminates/deletes execution resources. Synopsis ~~~~~~~~ -Terminate executions.(execution,executions can be used interchangeably in these commands) - -Task executions can be aborted only if they are in non-terminal state. If they are FAILED, ABORTED or SUCCEEDED, calling terminate on them has no effect. - +Task executions can be aborted only if they are in non-terminal state. If they are FAILED, ABORTED, or SUCCEEDED, calling terminate on them has no effect. Terminate a single execution with its name: :: flytectl delete execution c6a51x2l9e -d development -p flytesnacks -Get executions to check its state: +.. note:: + The terms execution/executions are interchangeable in these commands. + +Get an execution to check its state: :: @@ -36,7 +36,7 @@ Terminate multiple executions with their names: flytectl delete execution eeam9s8sny p4wv4hwgc4 -d development -p flytesnacks -Get executions to find the state of previously terminated executions: +Get an execution to find the state of previously terminated executions: :: @@ -115,5 +115,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index e54b428707..9933f2c072 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -3,25 +3,25 @@ flytectl delete plugin-override ------------------------------- -Delete matchable resources of plugin overrides +Deletes matchable resources of plugin overrides. Synopsis ~~~~~~~~ -Deletes plugin override for the given project and domain combination or additionally with workflow name. +Delete plugin override for the given project and domain combination or additionally the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain: :: flytectl delete plugin-override -p flytectldemo -d development -Deletes plugin override using config file which was used to create it. +Delete plugin override using the config file which was used to create it. Here, the config file is written to po.yaml. -Overrides are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. -e.g., content of po.yaml: +Overrides are optional in the file as they are unread during the delete command but can be retained since the same file can be used for get, update or delete commands. +Example: content of po.yaml: :: flytectl delete plugin-override --attrFile po.yaml @@ -38,8 +38,8 @@ e.g., content of po.yaml: - plugin_override2 missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT -Deletes plugin override for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Delete plugin override for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort': :: @@ -110,5 +110,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 96f726900a..8664c34035 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -3,16 +3,16 @@ flytectl delete task-resource-attribute --------------------------------------- -Delete matchable resources of task attributes +Deletes matchable resources of task attributes. Synopsis ~~~~~~~~ -Deletes task resource attributes for the given project and domain combination, or additionally with workflow name. +Deletes task resource attributes for the given project and domain combination, or additionally the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain: :: flytectl delete task-resource-attribute -p flytectldemo -d development @@ -20,8 +20,8 @@ For project flytectldemo and development domain, it is: Deletes task resource attribute using config file which was used to create it. Here, the config file is written to tra.yaml. -The defaults/limits are optional in the file as they are unread during the delete command but can be kept since the same file can be used for get, update or delete commands. -e.g., content of tra.yaml: +The defaults/limits are optional in the file as they are unread during the delete command, but can be retained since the same file can be used for 'get', 'update' or 'delete' commands. +Example: content of tra.yaml: :: @@ -39,8 +39,8 @@ e.g., content of tra.yaml: cpu: "2" memory: "450Mi" -Deletes task resource attribute for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Delete task resource attribute for a workflow. +For the workflow 'core.control_flow.run_merge_sort.merge_sort': :: @@ -111,5 +111,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index fc586192f5..b584343e6f 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -3,16 +3,16 @@ flytectl delete workflow-execution-config ----------------------------------------- -Delete matchable resources of workflow execution config +Deletes matchable resources of workflow execution config. Synopsis ~~~~~~~~ -Deletes workflow execution config for the given project and domain combination or additionally with workflow name. +Delete workflow execution config for the given project and domain combination or additionally the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain: :: flytectl delete workflow-execution-config -p flytectldemo -d development @@ -20,8 +20,8 @@ For project flytectldemo and development domain, it is: Deletes workflow execution config using config file which was used to create it. Here, the config file is written to wec.yaml. -Max_parallelism is optional in the file as it is unread during the delete command but can be kept since the same file can be used for get, update or delete commands. -e.g., content of wec.yaml: +Max_parallelism is optional in the file as it is unread during the delete command but can be retained since the same file can be used for get, update or delete commands. +Example: content of wec.yaml: :: @@ -35,7 +35,7 @@ e.g., content of wec.yaml: max_parallelism: 5 Deletes workflow execution config for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +For the workflow 'core.control_flow.run_merge_sort.merge_sort': :: @@ -106,5 +106,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminate/delete various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index b129cecbb2..a61c75323c 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -3,14 +3,14 @@ flytectl get ------------ -Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. Synopsis ~~~~~~~~ -For project, it is: +Fetch Flyte resource; if a project: :: flytectl get project @@ -72,16 +72,16 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - FlyteCTL CLI tool -* :doc:`flytectl_get_cluster-resource-attribute` - Get matchable resources of cluster resource attributes. -* :doc:`flytectl_get_execution` - Get execution resources -* :doc:`flytectl_get_execution-cluster-label` - Get matchable resources of execution cluster label. -* :doc:`flytectl_get_execution-queue-attribute` - Get matchable resources of execution queue attributes -* :doc:`flytectl_get_launchplan` - Get launch plan resources -* :doc:`flytectl_get_plugin-override` - Get matchable resources of plugin override -* :doc:`flytectl_get_project` - Get project resources -* :doc:`flytectl_get_task` - Get task resources -* :doc:`flytectl_get_task-resource-attribute` - Get matchable resources of task attributes -* :doc:`flytectl_get_workflow` - Get workflow resources -* :doc:`flytectl_get_workflow-execution-config` - Get matchable resources of workflow execution config +* :doc:`flytectl` - Flytectl CLI tool +* :doc:`flytectl_get_cluster-resource-attribute` - Gets matchable resources of cluster resource attributes. +* :doc:`flytectl_get_execution` - Gets execution resources. +* :doc:`flytectl_get_execution-cluster-label` - Gets matchable resources of execution cluster label. +* :doc:`flytectl_get_execution-queue-attribute` - Gets matchable resources of execution queue attributes. +* :doc:`flytectl_get_launchplan` - Gets the launch plan resources. +* :doc:`flytectl_get_plugin-override` - Gets matchable resources of plugin override. +* :doc:`flytectl_get_project` - Gets project resources +* :doc:`flytectl_get_task` - Gets task resources +* :doc:`flytectl_get_task-resource-attribute` - Gets matchable resources of task attributes. +* :doc:`flytectl_get_workflow` - Gets workflow resources +* :doc:`flytectl_get_workflow-execution-config` - Gets matchable resources of workflow execution config. diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index de78a8ceac..6ea320d7cf 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -3,40 +3,40 @@ flytectl get cluster-resource-attribute --------------------------------------- -Get matchable resources of cluster resource attributes. +Gets matchable resources of cluster resource attributes. Synopsis ~~~~~~~~ -Retrieves cluster resource attributes for the given project and domain. -For project flytectldemo and development domain, it is: +Retrieve cluster resource attributes for the given project and domain. +For project flytectldemo and development domain: :: flytectl get cluster-resource-attribute -p flytectldemo -d development -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} -Retrieves cluster resource attributes for the given project, domain, and workflow. +Retrieve cluster resource attributes for the given project, domain, and workflow. For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} -Writes the cluster resource attributes to a file. If there are no cluster resource attributes, the command throws an error. -Here, the config file is written to cra.yaml file: -e.g., content of cra.yaml +Write the cluster resource attributes to a file. If there are no cluster resource attributes, the command throws an error. +The config file is written to cra.yaml file. +Example: content of cra.yaml: :: @@ -115,5 +115,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index 84109db997..47309bf44f 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -3,41 +3,41 @@ flytectl get execution-cluster-label ------------------------------------ -Get matchable resources of execution cluster label. +Gets matchable resources of execution cluster label. Synopsis ~~~~~~~~ -Retrieves the execution cluster label for a given project and domain, combination or additionally with workflow name. +Retrieve the execution cluster label for a given project and domain, combination or additionally the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain: :: flytectl get execution-cluster-label -p flytectldemo -d development -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","value":"foo"} -Retrieve the execution cluster label for the given project, domain and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Retrieve the execution cluster label for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","value":"foo"} Write the execution cluster label to a file. If there is no execution cluster label, the command throws an error. -Here, the config file is written to ecl.yaml, -e.g., content of ecl.yaml: +The config file is written to ecl.yaml file. +Example: content of ecl.yaml: :: @@ -114,5 +114,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index ecb63556bc..719ac51458 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -3,40 +3,40 @@ flytectl get execution-queue-attribute -------------------------------------- -Get matchable resources of execution queue attributes +Gets matchable resources of execution queue attributes. Synopsis ~~~~~~~~ -Retrieves the execution queue attribute for the given project and domain. -For project flytectldemo and development domain, it is: +Retrieve the execution queue attribute for the given project and domain. +For project flytectldemo and development domain: :: flytectl get execution-queue-attribute -p flytectldemo -d development -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} -Retrieves the execution queue attribute for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Retrieve the execution queue attribute for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","tags":["foo", "bar"]} Write the execution queue attribute to a file. If there are no execution queue attributes, the command throws an error. -Here, the config file is written to era.yaml, -e.g., content of era.yaml: +The config file is written to era.yaml file. +Example: content of era.yaml: :: @@ -117,5 +117,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index e77bcb8dc0..ba5c4a0801 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -3,62 +3,64 @@ flytectl get execution ---------------------- -Get execution resources +Gets execution resources. Synopsis ~~~~~~~~ -Retrieve all executions within the project and domain (execution, executions can be used interchangeably): +Retrieve all executions within the project and domain. :: flytectl get execution -p flytesnacks -d development -Retrieve executions by name within the project and domain: +.. note:: + The terms execution/executions are interchangeable in these commands. +Retrieve executions by name within the project and domain. :: flytectl get execution -p flytesnacks -d development oeh94k9r2r -Retrieve all the executions with filters: +Retrieve all the executions with filters. :: flytectl get execution -p flytesnacks -d development --filter.fieldSelector="execution.phase in (FAILED;SUCCEEDED),execution.duration<200" -Retrieve executions as per the specified limit and sorting parameters: +Retrieve executions as per the specified limit and sorting parameters. :: flytectl get execution -p flytesnacks -d development --filter.sortBy=created_at --filter.limit=1 --filter.asc -Retrieve executions present in other pages by specifying the limit and page number: +Retrieve executions present in other pages by specifying the limit and page number. :: flytectl get -p flytesnacks -d development execution --filter.limit=10 --filter.page=2 -Retrieve executions within the project and domain in YAML format: +Retrieve executions within the project and domain in YAML format. :: flytectl get execution -p flytesnacks -d development -o yaml -Retrieve executions within the project and domain in JSON format: +Retrieve executions within the project and domain in JSON format. :: flytectl get execution -p flytesnacks -d development -o json -Get more details of the execution using the --details flag, which shows node and task executions. The default view is a tree view, and the TABLE view format is not supported on this view. +Get more details of the execution using the --details flag, which shows node and task executions. +The default view is a tree view, and the TABLE view format is not supported on this view. :: flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -Fetch execution details in YAML format. In this view, only node details are available. For task, send the --nodeID flag. - +Fetch execution details in YAML format. In this view, only node details are available. For task, pass the --nodeID flag. :: flytectl get execution -p flytesnacks -d development oeh94k9r2r --details -o yaml @@ -69,7 +71,7 @@ Fetch task executions on a specific node using the --nodeID flag. Use the nodeID flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodeID n0 -Task execution view is also available in YAML/JSON format. The following example showcases YAML, where the output also contains input and output data of each node. +Task execution view is available in YAML/JSON format too. The following example showcases YAML, where the output contains input and output data of each node. :: @@ -145,5 +147,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 4a2e13a751..53c95cff78 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -3,18 +3,21 @@ flytectl get launchplan ----------------------- -Get launch plan resources +Gets the launch plan resources. Synopsis ~~~~~~~~ -Retrieve all launch plans within the project and domain (launch plan, launch plans can be used interchangeably): +Retrieve all launch plans within the project and domain: :: flytectl get launchplan -p flytesnacks -d development +.. note:: + The terms launch plan/launch plans are interchangeable in these commands. + Retrieve a launch plan by name within the project and domain: :: @@ -73,7 +76,7 @@ Retrieve all launch plans the within the project and domain in JSON format: flytectl get launchplan -p flytesnacks -d development -o json -Retrieve a launch plan within the project and domain as per a version and generate the execution spec file; the file can be used to launch the execution using the 'create execution' command: +Retrieve a launch plan within the project and domain as per a version and generates the execution spec file; the file can be used to launch the execution using the 'create execution' command: :: @@ -95,8 +98,7 @@ The generated file would look similar to this: version: v3 workflow: core.advanced.run_merge_sort.merge_sort -Check the create execution section on how to launch one using the generated file. - +Check the :ref:`create execution section` on how to launch one using the generated file. Usage @@ -169,5 +171,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index eafa654f20..aa1ed4f7a1 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -3,21 +3,21 @@ flytectl get plugin-override ---------------------------- -Get matchable resources of plugin override +Gets matchable resources of plugin override. Synopsis ~~~~~~~~ -Retrieves the plugin override for the given project and domain. -For project flytectldemo and development domain, it is: +Retrieve the plugin override for the given project and domain. +For project flytectldemo and development domain: :: flytectl get plugin-override -p flytectldemo -d development -e.g., output from the command +Example: output from the command .. code-block:: json @@ -31,14 +31,13 @@ e.g., output from the command }] } -Retrieves the plugin override for the given project, domain and workflow. -For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: - +Retrieve the plugin override for the given project, domain, and workflow. +For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command: +Example: output from the command: .. code-block:: json @@ -53,9 +52,9 @@ e.g., output from the command: }] } -Write plugin overrides to a file. If there are no plugin overrides, the command returns an error. -Here, the config file is written to po.yaml, -e.g., content of po.yaml: +Write plugin overrides to a file. If there are no plugin overrides, the command throws an error. +The config file is written to po.yaml file. +Example: content of po.yaml: :: @@ -137,5 +136,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index c1e67c5ce3..f917911908 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -3,18 +3,21 @@ flytectl get project -------------------- -Get project resources +Gets project resources Synopsis ~~~~~~~~ -Retrieve all the projects. (project,projects can be used interchangeably in these commands): +Retrieve all the projects: :: flytectl get project +.. note:: + The terms project/projects are interchangeable in these commands. + Retrieve project by name: :: @@ -116,5 +119,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 2bc62dd00a..7cdb8bc5ae 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -3,32 +3,32 @@ flytectl get task-resource-attribute ------------------------------------ -Get matchable resources of task attributes +Gets matchable resources of task attributes. Synopsis ~~~~~~~~ -Retrieves task resource attributes for the given project and domain. -For project flytectldemo and development domain, it is: +Retrieve task resource attributes for the given project and domain. +For project flytectldemo and development domain: :: flytectl get task-resource-attribute -p flytectldemo -d development -e.g., output from the command: +Example: output from the command: .. code-block:: json {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} -Retrieves task resource attributes for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Retrieve task resource attributes for the given project, domain, and workflow. +For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command: +Example: output from the command: .. code-block:: json @@ -36,8 +36,8 @@ e.g., output from the command: Write the task resource attributes to a file. If there are no task resource attributes, a file would be populated with the basic data. -Here, the config file is written to tra.yaml, -e.g., content of tra.yaml: +The config file is written to tra.yaml file. +Example: content of tra.yaml: :: @@ -119,5 +119,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 473030b128..0ce16463f4 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -3,18 +3,22 @@ flytectl get task ----------------- -Get task resources +Gets task resources Synopsis ~~~~~~~~ -Retrieve all the tasks within project and domain(task,tasks can be used interchangeably in these commands): + +Retrieve all the tasks within project and domain: :: flytectl get task -p flytesnacks -d development +.. note:: + The terms task/tasks are interchangeable in these commands. + Retrieve task by name within project and domain: :: @@ -159,5 +163,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index eaa12eef0d..85ce34f3b9 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -3,22 +3,22 @@ flytectl get workflow-execution-config -------------------------------------- -Get matchable resources of workflow execution config +Gets matchable resources of workflow execution config. Synopsis ~~~~~~~~ -Retrieves workflow execution config for the given project and domain combination or additionally with workflow name. +Retrieve workflow execution config for the given project and domain combination or additionally the workflow name. -For project flytectldemo and development domain, it is: +For project flytectldemo and development domain: :: flytectl get workflow-execution-config -p flytectldemo -d development -e.g., output from the command +Example: output from the command: .. code-block:: json @@ -28,14 +28,14 @@ e.g., output from the command "max_parallelism": 5 } -Retrieves workflow execution config for the project, domain and workflow. -For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort', it is: +Retrieve workflow execution config for the project, domain, and workflow. +For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort': :: flytectl get workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort -e.g., output from the command +Example: output from the command: .. code-block:: json @@ -46,9 +46,9 @@ e.g., output from the command "max_parallelism": 5 } -Writing the workflow execution config to a file. If there are no workflow execution config, the command would return an error. -Here, the config file is written to wec.yaml, -e.g., content of wec.yaml: +Write the workflow execution config to a file. If there are no workflow execution config, the command throws an error. +The config file is written to wec.yaml file. +Example: content of wec.yaml: :: @@ -125,5 +125,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index b3e8fc5738..92960d0ddb 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -3,14 +3,14 @@ flytectl get workflow --------------------- -Get workflow resources +Gets workflow resources Synopsis ~~~~~~~~ -Retrieve all the workflows within project and domain (workflow,workflows can be used interchangeably in these commands): +Retrieve all the workflows within project and domain (workflow/workflows can be used interchangeably in these commands): :: flytectl get workflow -p flytesnacks -d development @@ -147,5 +147,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_get` - Fetch various Flyte resources including tasks/workflows/launchplans/executions/project. +* :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 56c795d3c3..aeea164696 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -3,16 +3,16 @@ flytectl register ----------------- -Register tasks/workflows/launchplans from a list of generated serialized files. +Registers tasks, workflows, and launch plans from a list of generated serialized files. Synopsis ~~~~~~~~ -Takes input files as serialized versions of the tasks/workflows/launchplans and registers them with flyteadmin. +Take input files as serialized versions of the tasks/workflows/launchplans and register them with FlyteAdmin. Currently, these input files are protobuf files generated as output from Flytekit serialize. -Project & Domain are mandatory fields to be passed for registration and an optional version which defaults to v1. +Project and Domain are mandatory fields to be passed for registration and an optional version which defaults to v1. If the entities are already registered with Flyte for the same version, the registration would fail. @@ -72,7 +72,7 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - FlyteCTL CLI tool -* :doc:`flytectl_register_examples` - Register Flytesnacks example -* :doc:`flytectl_register_files` - Register file resources +* :doc:`flytectl` - Flytectl CLI tool +* :doc:`flytectl_register_examples` - Registers Flytesnacks example. +* :doc:`flytectl_register_files` - Registers file resources. diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index a53c63669f..75d25ea88e 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -3,14 +3,14 @@ flytectl register examples -------------------------- -Register Flytesnacks example +Registers Flytesnacks example. Synopsis ~~~~~~~~ -Register all latest Flytesnacks examples: +Register all the latest Flytesnacks examples: :: flytectl register examples -d development -p flytesnacks @@ -20,7 +20,9 @@ Register specific release of Flytesnacks examples: flytectl register examples -d development -p flytesnacks --version v0.2.176 -Note: The register command automatically override the version with release version +.. note:: + The register command automatically override the version with release version. + Usage @@ -95,5 +97,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_register` - Register tasks/workflows/launchplans from a list of generated serialized files. +* :doc:`flytectl_register` - Registers tasks, workflows, and launch plans from a list of generated serialized files. diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index cc62e457db..e052e181be 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -3,26 +3,28 @@ flytectl register files ----------------------- -Register file resources +Registers file resources. Synopsis ~~~~~~~~ -Registers all the serialized protobuf files including tasks, workflows and launchplans with default v1 version. +Registers all the serialized protobuf files including tasks, workflows and launch plans with default v1 version. If previously registered entities with v1 version are present, the command will fail immediately on the first such encounter. :: flytectl register file _pb_output/* -d development -p flytesnacks -There is no difference between registration and fast registration. In fast registration, the input provided by the user is fast serialized proto that is generated by pyflyte. If FlyteCTL finds any source code in users' input, it considers the registration as fast registration. FlyteCTL finds input file by searching an archive file whose name starts with fast and has .tar.gz extension. When the user runs pyflyte with --fast flag then pyflyte creates serialize proto and it also creates source code archive file in the same directory. -SourceUploadPath is an optional flag. By default, FlyteCTL will create SourceUploadPath from your storage config. In case of s3 FlyteCTL will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. +Registration and fast registration mean the same. In fast registration, the input provided by the user is fast serialized proto generated by pyflyte. +If Flytectl finds any source code in users' input, it considers the registration as fast registration. +Flytectl finds input file by searching an archive file whose name starts with fast and has .tar.gz extension. When the user runs pyflyte with --fast flag then pyflyte creates serialize proto and it also creates source code archive file in the same directory. +SourceUploadPath is an optional flag. By default, Flytectl will create SourceUploadPath from your storage config. In case of s3 Flytectl will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. :: flytectl register file _pb_output/* -d development -p flytesnacks --version v2 -In case of fast registration, if the SourceUploadPath flag is defined, FlyteCTL will not use the default directory to upload the source code. Instead, it will override the destination path on the registration. +In case of fast registration, if the SourceUploadPath flag is defined, Flytectl will not use the default directory to upload the source code. Instead, it will override the destination path on the registration. :: flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" @@ -160,5 +162,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_register` - Register tasks/workflows/launchplans from a list of generated serialized files. +* :doc:`flytectl_register` - Registers tasks, workflows, and launch plans from a list of generated serialized files. diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index e9ff4c3a02..43e7816f51 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -3,33 +3,33 @@ flytectl sandbox ---------------- -Used for sandbox interactions like start/teardown/status/exec. +Helps with Sandbox interactions like start, teardown, status, and exec. Synopsis ~~~~~~~~ -The Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte sandbox as a single Docker container locally. +Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte Sandbox as a single Docker container locally. -Create sandbox cluster: +Creates Sandbox cluster: :: flytectl sandbox start -Remove sandbox cluster: +Removes Sandbox cluster: :: flytectl sandbox teardown -Check status of sandbox container: +Checks the status of the Sandbox container: :: flytectl sandbox status -Execute command inside sandbox container: +Executes commands inside the Sandbox container: :: flytectl sandbox exec -- pwd @@ -91,9 +91,9 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - FlyteCTL CLI tool -* :doc:`flytectl_sandbox_exec` - Execute non-interactive command inside the sandbox container -* :doc:`flytectl_sandbox_start` - Start the Flyte Sandbox cluster -* :doc:`flytectl_sandbox_status` - Get status of the sandbox environment. -* :doc:`flytectl_sandbox_teardown` - Teardown cleans up the sandbox environment +* :doc:`flytectl` - Flytectl CLI tool +* :doc:`flytectl_sandbox_exec` - Executes non-interactive command inside the Sandbox container +* :doc:`flytectl_sandbox_start` - Starts the Flyte Sandbox cluster. +* :doc:`flytectl_sandbox_status` - Gets the status of the Sandbox environment. +* :doc:`flytectl_sandbox_teardown` - Cleans up the sandbox environment diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index d377d26950..e030242b1d 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -3,16 +3,17 @@ flytectl sandbox exec --------------------- -Execute non-interactive command inside the sandbox container +Executes non-interactive command inside the Sandbox container Synopsis ~~~~~~~~ -Runs non-interactive command inside the Sandbox container and immediately returns the output. By default, flytectl exec is present in /root directory inside the Sandbox container. +Runs non-interactive commands inside the Sandbox container and immediately returns the output. By default, "flytectl exec" is present in the /root directory inside the Sandbox container. :: + flytectl sandbox exec -- ls -al Usage @@ -77,5 +78,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`flytectl_sandbox` - Helps with Sandbox interactions like start, teardown, status, and exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 941cb57926..c7a87d2ed1 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -3,38 +3,39 @@ flytectl sandbox start ---------------------- -Start the Flyte Sandbox cluster +Starts the Flyte Sandbox cluster. Synopsis ~~~~~~~~ -The Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte sandbox as a single Docker container locally. +Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte Sandbox as a single Docker container locally. -Start sandbox cluster without any source code: +Starts the Sandbox cluster without any source code: :: flytectl sandbox start -Mount your source code repository inside sandbox: +Mounts your source code repository inside the Sandbox: :: flytectl sandbox start --source=$HOME/flyteorg/flytesnacks -Run specific version of Flyte. FlyteCTL sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. +Runs a specific version of Flyte. Flytectl Sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. :: flytectl sandbox start --version=v0.14.0 -Note: FlyteCTL sandbox is only supported for Flyte versions > v0.10.0 +.. note:: + Flytectl Sandbox is only supported for Flyte versions > v0.10.0. -Run latest pre release of Flyte. +Runs the latest pre release of Flyte. :: flytectl sandbox start --pre -Note: pre release flag will be ignore if user pass version flag, In that case Flytectl will use specific version. +Note: The pre release flag will be ignored if the user passes the version flag. In that case, Flytectl will use a specific version. Specify a Flyte Sandbox compliant image with the registry. This is useful in case you want to use an image from your registry. :: @@ -138,5 +139,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`flytectl_sandbox` - Helps with Sandbox interactions like start, teardown, status, and exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 6b7637cb3b..a7a8e1e372 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -3,14 +3,14 @@ flytectl sandbox status ----------------------- -Get status of the sandbox environment. +Gets the status of the Sandbox environment. Synopsis ~~~~~~~~ -Retrieve the status of the Sandbox environment. Currently, Flyte Sandbox runs as a local Docker container. +Retrieves the status of the Sandbox environment. Currently, Flyte Sandbox runs as a local Docker container. Usage :: @@ -79,5 +79,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`flytectl_sandbox` - Helps with Sandbox interactions like start, teardown, status, and exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index 5958285fae..31280b2511 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -3,14 +3,14 @@ flytectl sandbox teardown ------------------------- -Teardown cleans up the sandbox environment +Cleans up the sandbox environment Synopsis ~~~~~~~~ -Teardown removes Sandbox cluster and all the Flyte config created by sandbox start: +Removes the Sandbox cluster and all the Flyte config created by 'sandbox start': :: flytectl sandbox teardown @@ -79,5 +79,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Used for sandbox interactions like start/teardown/status/exec. +* :doc:`flytectl_sandbox` - Helps with Sandbox interactions like start, teardown, status, and exec. diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index e0ed691ea5..f4c8ae3e06 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -11,8 +11,8 @@ Synopsis Currently, this command only provides subcommands to update project. -Takes input project that needs to be archived or unarchived. Name of the project to be updated is a mandatory field. -To update a project: +Take input project that needs to be archived or unarchived. Name of the project to be updated is a mandatory field. +Update Flyte resources; if a project: :: flytectl update project -p flytesnacks --activateProject @@ -74,17 +74,17 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl` - Flytectl CLI tool * :doc:`flytectl_update_cluster-resource-attribute` - Update matchable resources of cluster attributes -* :doc:`flytectl_update_execution` - Update execution status +* :doc:`flytectl_update_execution` - Updates the execution status * :doc:`flytectl_update_execution-cluster-label` - Update matchable resources of execution cluster label * :doc:`flytectl_update_execution-queue-attribute` - Update matchable resources of execution queue attributes -* :doc:`flytectl_update_launchplan` - Update launch plan status -* :doc:`flytectl_update_launchplan-meta` - Update launch plan metadata +* :doc:`flytectl_update_launchplan` - Updates launch plan status +* :doc:`flytectl_update_launchplan-meta` - Updates the launch plan metadata * :doc:`flytectl_update_plugin-override` - Update matchable resources of plugin overrides * :doc:`flytectl_update_project` - Update project resources * :doc:`flytectl_update_task-meta` - Update task metadata * :doc:`flytectl_update_task-resource-attribute` - Update matchable resources of task attributes -* :doc:`flytectl_update_workflow-execution-config` - Update matchable resources of workflow execution config +* :doc:`flytectl_update_workflow-execution-config` - Updates matchable resources of workflow execution config * :doc:`flytectl_update_workflow-meta` - Update workflow metadata diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index b976c3486a..43f4f034bc 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -10,11 +10,11 @@ Synopsis -Updates cluster resource attributes for given project and domain combination or additionally with workflow name. +Update cluster resource attributes for given project and domain combination or additionally with workflow name. Updating to the cluster resource attribute is only available from a generated file. See the get section to generate this file. It takes input for cluster resource attributes from the config file cra.yaml, -e.g., content of cra.yaml: +Example: content of cra.yaml: .. code-block:: yaml @@ -28,7 +28,7 @@ e.g., content of cra.yaml: flytectl update cluster-resource-attribute --attrFile cra.yaml -Updates cluster resource attribute for project and domain and workflow combination. This will take precedence over any other +Update cluster resource attribute for project and domain and workflow combination. This will take precedence over any other resource attribute defined at project domain level. This will completely overwrite any existing custom project, domain and workflow combination attributes. It is preferable to do get and generate an attribute file if there is an existing attribute that is already set and then update it to have new values. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 265a274589..e809f7c70a 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -10,11 +10,11 @@ Synopsis -Updates execution cluster label for the given project and domain combination or additionally with workflow name. +Update execution cluster label for the given project and domain combination or additionally with workflow name. Updating to the execution cluster label is only available from a generated file. See the get section to generate this file. It takes input for execution cluster label from the config file ecl.yaml -e.g., content of ecl.yaml: +Example: content of ecl.yaml: .. code-block:: yaml @@ -26,7 +26,7 @@ e.g., content of ecl.yaml: flytectl update execution-cluster-label --attrFile ecl.yaml -Updates execution cluster label for project, domain and workflow combination. This will take precedence over any other +Update execution cluster label for project, domain, and workflow combination. This will take precedence over any other execution cluster label defined at project domain level. For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index e12e6ff614..53122c5a8f 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -10,14 +10,14 @@ Synopsis -Updates execution queue attributes for the given project and domain combination or additionally with workflow name. +Update execution queue attributes for the given project and domain combination or additionally with workflow name. Updating the execution queue attribute is only available from a generated file. See the get section for generating this file. -This will completely overwrite any existing custom project, domain and workflow combination attributes. +This will completely overwrite any existing custom project, domain, and workflow combination attributes. It is preferable to do get and generate an attribute file if there is an existing attribute that is already set and then update it to have new values. Refer to get execution-queue-attribute section on how to generate this file It takes input for execution queue attributes from the config file era.yaml, -e.g., content of era.yaml: +Example: content of era.yaml: .. code-block:: yaml @@ -33,7 +33,7 @@ e.g., content of era.yaml: flytectl update execution-queue-attribute --attrFile era.yaml -Updates execution queue attribute for project, domain and workflow combination. This will take precedence over any other +Update execution queue attribute for project, domain, and workflow combination. This will take precedence over any other execution queue attribute defined at project domain level. For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: diff --git a/flytectl/docs/source/gen/flytectl_update_execution.rst b/flytectl/docs/source/gen/flytectl_update_execution.rst index 7bb7ebee56..4ad95da247 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution.rst @@ -3,19 +3,19 @@ flytectl update execution ------------------------- -Update execution status +Updates the execution status Synopsis ~~~~~~~~ -Activating an execution shows it in the cli and UI: +Activate an execution; and it shows up in the CLI and UI: :: flytectl update execution -p flytectldemo -d development oeh94k9r2r --activate -Archiving execution hides it from cli and UI: +Archive an execution; and it is hidden from the CLI and UI: :: flytectl update execution -p flytectldemo -d development oeh94k9r2r --archive diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index 2ac0f7c1ff..b08cd29e4b 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -3,7 +3,7 @@ flytectl update launchplan-meta ------------------------------- -Update launch plan metadata +Updates the launch plan metadata Synopsis ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index fd64182bd3..ca27b38679 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -3,19 +3,19 @@ flytectl update launchplan -------------------------- -Update launch plan status +Updates launch plan status Synopsis ~~~~~~~~ -Activating launch plan activates the scheduled job associated with it: +Activates a launch plan which activates the scheduled job associated with it: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --activate -Archiving launch plan deschedules any scheduled job associated with it: +Archives a launch plan which deschedules any scheduled job associated with it: :: flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --archive diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 41c04f73ce..3460f9498b 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -10,14 +10,14 @@ Synopsis -Updates plugin overrides for given project and domain combination or additionally with workflow name. +Update plugin overrides for given project and domain combination or additionally with workflow name. Updating to the plugin override is only available from a generated file. See the get section for generating this file. -This will completely overwrite any existing plugins overrides on custom project, domain and workflow combination. +This will completely overwrite any existing plugins overrides on custom project, domain, and workflow combination. It is preferable to do get and generate a plugin override file if there is an existing override already set and then update it to have new values. Refer to get plugin-override section on how to generate this file It takes input for plugin overrides from the config file po.yaml, -e.g., content of po.yaml: +Example: content of po.yaml: .. code-block:: yaml @@ -34,7 +34,7 @@ e.g., content of po.yaml: flytectl update plugin-override --attrFile po.yaml -Updates plugin override for project, domain and workflow combination. This will take precedence over any other +Update plugin override for project, domain, and workflow combination. This will take precedence over any other plugin overrides defined at project domain level. For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 1c05bdbbc9..9277927bae 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -10,7 +10,7 @@ Synopsis -Updates the project according to the flags passed. Allows you to archive or activate a project. +Update the project according to the flags passed. Allows you to archive or activate a project. Activate project flytesnacks: :: diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index 06ad150dc1..b6fec0258c 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -10,7 +10,7 @@ Synopsis -Updates the description on the task: +Update the description on the task: :: flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --description "Merge sort example" diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index c788249f3b..0c9f31dc50 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -10,14 +10,14 @@ Synopsis -Updates task resource attributes for the given project and domain combination or additionally with workflow name. +Updates the task resource attributes for the given project and domain combination or additionally with workflow name. Updating the task resource attribute is only available from a generated file. See the get section for generating this file. -This will completely overwrite any existing custom project, domain and workflow combination attributes. +This will completely overwrite any existing custom project, domain, and workflow combination attributes. It is preferable to do get and generate an attribute file if there is an existing attribute already set and then update it to have new values. Refer to get task-resource-attribute section on how to generate this file. It takes input for task resource attributes from the config file tra.yaml, -e.g., content of tra.yaml: +Example: content of tra.yaml: .. code-block:: yaml @@ -34,7 +34,7 @@ e.g., content of tra.yaml: flytectl update task-resource-attribute --attrFile tra.yaml -Updates task resource attribute for project, domain and workflow combination. This will take precedence over any other +Update task resource attribute for project, domain, and workflow combination. This will take precedence over any other resource attribute defined at project domain level. For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index 90f3815857..ae43ff1982 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -3,21 +3,21 @@ flytectl update workflow-execution-config ----------------------------------------- -Update matchable resources of workflow execution config +Updates matchable resources of workflow execution config Synopsis ~~~~~~~~ -Updates workflow execution config for given project and domain combination or additionally with workflow name. +Updates the workflow execution config for the given project and domain combination or additionally with workflow name. Updating the workflow execution config is only available from a generated file. See the get section for generating this file. This will completely overwrite any existing custom project and domain and workflow combination execution config. It is preferable to do get and generate a config file if there is an existing execution config already set and then update it to have new values. Refer to get workflow-execution-config section on how to generate this file. It takes input for workflow execution config from the config file wec.yaml, -e.g., content of wec.yaml: +Example: content of wec.yaml: .. code-block:: yaml @@ -29,7 +29,7 @@ e.g., content of wec.yaml: flytectl update workflow-execution-config --attrFile wec.yaml -Updates workflow execution config for project, domain and workflow combination. This will take precedence over any other +Update workflow execution config for project, domain, and workflow combination. This will take precedence over any other execution config defined at project domain level. For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index 07a7340fbd..6e220472c6 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -10,7 +10,7 @@ Synopsis -Updates the description on the workflow: +Update the description on the workflow: :: flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort workflow example" diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index bea19096ad..d1a1e34ee3 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -3,26 +3,28 @@ flytectl upgrade ---------------- -Upgrade/rollback to a Flyte version +Upgrades/rollbacks to a Flyte version. Synopsis ~~~~~~~~ -For FlyteCTL, it is: +For Flytectl, it is: :: flytectl upgrade -Note: Please use upgrade with sudo. Without sudo it will cause permission issue. +.. note:: + Please upgrade with sudo. Failing to do so may result in a permission issues. -Rollback flytectl binary: +Rollback Flytectl binary: :: flytectl upgrade rollback -Note: Upgrade is not available on windows. +.. note:: + Upgrade is not available on Windows. :: @@ -85,5 +87,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl` - Flytectl CLI tool diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index de9d2d6d6c..41ad6f8030 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -3,14 +3,14 @@ flytectl version ---------------- -Fetch Flyte version +Fetches Flyte version Synopsis ~~~~~~~~ -For FlyteCTL version, it is: +Fetch Flytectl version. :: flytectl version @@ -76,5 +76,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl` - FlyteCTL CLI tool +* :doc:`flytectl` - Flytectl CLI tool diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 3f73b6b834..7288d80a7e 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -11,10 +11,10 @@ This video will take you on a tour of Flytectl - how to install and configure it .. youtube:: cV8ezYnBANE -Install -======= -Flytectl is a Golang binary and can be installed on any platform supported by -golang +Installation +============ + +Flytectl is a Golang binary that can be installed on any platform supported by Golang. .. tabbed:: OSX @@ -40,19 +40,20 @@ golang flytectl version -Configure -========= -Flytectl allows configuring using a YAML file or pass every configuration value -on command-line. The following configuration is useful to setup. +Configuration +============= + +Flytectl allows you to communicate with FlyteAdmin using a YAML file or by passing every configuration value +on the command-line. The following configuration can be used for the setup: Basic Configuration -------------------- -The full list of available configurable options can be found by running ``flytectl --help``, or alternately `here `__ +The full list of available configurable options can be found by running ``flytectl --help``, or `here `__. .. NOTE:: - Currently, the Project ``-p``, Domain ``-d``, and Output ``-o`` flags cannot be used in config file + Currently, the Project ``-p``, Domain ``-d``, and Output ``-o`` flags cannot be used in the config file. .. tabbed:: Local Flyte Sandbox @@ -63,7 +64,7 @@ The full list of available configurable options can be found by running ``flytec admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: dns:///localhost:30081 - insecure: true # Set to false to enable TLS/SSL connection (not recommended except on local sandbox deployment) + insecure: true # Set to false to enable TLS/SSL connection (not recommended except on local sandbox deployment). authType: Pkce # authType: Pkce # if using authentication or just drop this. storage: connection: @@ -124,7 +125,7 @@ The full list of available configurable options can be found by running ``flytec * currDir from where you run flytectl * ``/etc/flyte/config`` - You can pass the file name in the commandline using ``--config `` as well! + You can also pass the file name in the command line using ``--config ``. .. toctree:: diff --git a/flytectl/docs/source/launchplan.rst b/flytectl/docs/source/launchplan.rst index 7755b8eaba..ad29e5229a 100644 --- a/flytectl/docs/source/launchplan.rst +++ b/flytectl/docs/source/launchplan.rst @@ -1,6 +1,6 @@ Launchplan ----------- -It specifies the actions to be performed on the resource 'launchplan'. +----------- +It specifies the actions to be performed on the 'launchplan' resource. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index c61cfbf640..197ce67a02 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -1,6 +1,8 @@ +.. _nouns: + Nouns ------ -FlyteCTL nouns specify the resource on which the action needs to be performed. Example of resources include project, workflow, task, execution. +Flytectl nouns specify the resource on which the action needs to be performed. Examples of resources include project, workflow, task, and execution. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/plugin-override.rst b/flytectl/docs/source/plugin-override.rst index ed016543c5..7b1010ff1a 100644 --- a/flytectl/docs/source/plugin-override.rst +++ b/flytectl/docs/source/plugin-override.rst @@ -1,6 +1,6 @@ Plugin override --------------- -It specifies the actions to be performed on the resource 'plugin-override'. +It specifies the actions to be performed on the 'plugin-override' resource. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/project.rst b/flytectl/docs/source/project.rst index b98d7909c2..05e1cc1113 100644 --- a/flytectl/docs/source/project.rst +++ b/flytectl/docs/source/project.rst @@ -1,6 +1,6 @@ Project ------- -It specifies the actions to be performed on the resource 'project'. +-------- +It specifies the actions to be performed on the 'project' resource. .. toctree:: diff --git a/flytectl/docs/source/sandbox.rst b/flytectl/docs/source/sandbox.rst index e6de8cafa5..f7d7bbc4bd 100644 --- a/flytectl/docs/source/sandbox.rst +++ b/flytectl/docs/source/sandbox.rst @@ -1,6 +1,6 @@ Sandbox ------- -It specifies the actions to be performed on the resource 'sandbox'. +It specifies the actions to be performed on the 'sandbox' resource. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/task-resource-attribute.rst b/flytectl/docs/source/task-resource-attribute.rst index 3a4c0d5e8d..edc168355a 100644 --- a/flytectl/docs/source/task-resource-attribute.rst +++ b/flytectl/docs/source/task-resource-attribute.rst @@ -1,6 +1,6 @@ Task resource attribute ----------------------- -It specifies the actions to be performed on the resource 'task-resource-attribute'. +It specifies the actions to be performed on the 'task-resource-attribute' resource. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/task.rst b/flytectl/docs/source/task.rst index 14f1c58f41..8792ea31d4 100644 --- a/flytectl/docs/source/task.rst +++ b/flytectl/docs/source/task.rst @@ -1,6 +1,6 @@ Task ------ -It specifies the actions to be performed on the resource 'task'. +It specifies the actions to be performed on the 'task' resource. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/verbs.rst b/flytectl/docs/source/verbs.rst index a286d313e6..a1763a35b2 100644 --- a/flytectl/docs/source/verbs.rst +++ b/flytectl/docs/source/verbs.rst @@ -1,6 +1,6 @@ Verbs ------ -FlyteCTL verbs specify the actions to be performed on the resources. Ex: create, get, update, and delete. +Flytectl verbs specify the actions to be performed on the resources. Example: create, get, update, and delete. .. toctree:: diff --git a/flytectl/docs/source/workflow-execution-config.rst b/flytectl/docs/source/workflow-execution-config.rst index 0ae96cbb87..d4f94e76a9 100644 --- a/flytectl/docs/source/workflow-execution-config.rst +++ b/flytectl/docs/source/workflow-execution-config.rst @@ -1,6 +1,7 @@ Workflow execution config ------- -It specifies the actions to be performed on the resource 'workflow-execution-config'. +------------------------- + +It specifies the actions to be performed on the 'workflow-execution-config' resource. .. toctree:: :maxdepth: 1 diff --git a/flytectl/docs/source/workflow.rst b/flytectl/docs/source/workflow.rst index 91332dc281..32c08574a3 100644 --- a/flytectl/docs/source/workflow.rst +++ b/flytectl/docs/source/workflow.rst @@ -1,6 +1,6 @@ Workflow -------- -It specifies the actions to be performed on the resource 'workflow'. +It specifies the actions to be performed on the 'workflow' resource. .. toctree:: :maxdepth: 1 diff --git a/flytectl/proposal/README.md b/flytectl/proposal/README.md index f561707b4d..362e60a9ba 100644 --- a/flytectl/proposal/README.md +++ b/flytectl/proposal/README.md @@ -1,30 +1,30 @@ # Introduction -This document proposes, **flytectl** as one singular CLI that interacts with flyteadmin service. It is proposed to write the CLI in **Golang** and would support both gRPC and REST endpoints of -FlyteAdmin. We will start with gRPC endpoint as the client is easily generated and in future we should investigate generation of a Swagger based REST client from the gRPC specification. As we build -more SDK's in different languages we should support a common way of interacting with the API. This does no mean that some SDK's may provide native ways of interacting with the Admin API (for e.g. -flytekit), but the intention is that we will eventually replace **flytekit/flyte-cli** with flytectl exclusively. +This document proposes, **Flytectl** as a single CLI that interacts with FlyteAdmin service. It is proposed to write the CLI in **Golang** and would support both gRPC and REST endpoints of +FlyteAdmin. We will start with gRPC endpoint since the client can be easily generated. In the future, we will work on generating a Swagger-based REST client from the gRPC specification. As we build +more SDKs in different languages we will support a common way of interacting with the API. This doesn't mean that some SDKs may provide native ways of interacting with the Admin API (for e.g. +Flytekit), but the intention is to eventually replace **Flytekit/Flytecli** with Flytectl exclusively. -We also recommend that the design of FlyteCTL is careful and it could helps us with delivering user features faster without having to rely on the UI. FlyteCTL with follow standard oauth2 for -authentication already supported by flyteAdmin. Moreover, FlyteCTL should be readily available on almost any platform - OSX, Linux and Windows. We will strive to keep it relatively lean and fast. +Flytectl has been designed to deliver user features without having to rely on the UI. Flytectl will follow the standard oauth2 for +authentication, supported by FlyteAdmin. Moreover, Flytectl should be readily available on almost any platform - OSX, Linux and Windows. We will strive to keep it relatively lean and fast. # Why One CLI? -As we build multiple SDK's they need a native way of interacting with the API. Having multiple CLI's makes it hard to keep all of them in sync as we rapidly evolve the API and add more features. +As we build multiple SDKs, we need a native way of interacting with the API. Having multiple CLIs makes it hard to keep all of them in sync as we rapidly evolve the API and add more features. *Diagram here* # Why Golang? -- Most of Flytebackend is written in golang -- Golang offers great CLI tooling support with viper and cobra -- Golang toolchain to create cross-compiled small, light weight binary is really efficient and easy to use -- We already generate golang proto and clients for all our IDL -- we have multiple common libraries available to ease the development of this tool -- kubectl is a stellar example of a cli done well +- Most of Flyte backend is written in Golang. +- Golang offers great CLI tooling support with viper and cobra. +- Golang toolchain helps create cross-compiled small, light weight binary, which is efficient and easy to use. +- We already generate Golang proto and clients for all our IDL. +- We have multiple common libraries available to ease the development of this tool. +- Kubectl is a stellar example of a CLI done well. ## Generating Swagger code -We started exploring this (Flytetools)[https://github.com/lyft/flytetools#tools] has some work. We also got approached by the swagger code gen maintainer to see if they can help. +We started exploring this (Flytetools)[https://github.com/lyft/flytetools#tools] has some work. The Swagger code-gen maintainer also approached us to see if they could help. # API @@ -51,7 +51,7 @@ $ flytectl [options] returns the version of the CLI, version of Admin service and version of the Platform that is deployed ### configure -Allows configuring FlyteCTL for your own usage (low pri). Needed for especially storing Auth tokens. +Allows configuring Flytectl for your own usage (low pri). Needed for especially storing Auth tokens. ### get/delete Get retrieves a list of resources that is qualified by a further sub-command. for example @@ -72,7 +72,7 @@ Create may need more information than can be easily passed in command line and w Eventually we may want to simplify the json and yaml representations but that is not required in first pass. We may also want to create just a separate option for that. The create for Task and Workflow is essential what is encompassed in the pyflyte as the registration process. We will decouple the registration process such that pyflyte, jflyte (other native cli's or -code methods) can dump a serialized representations of the workflows and tasks that are directly consumed by **flytectl**. Thus flytectl is essential in every flow for the user. +code methods) can dump a serialized representations of the workflows and tasks that are directly consumed by **Flytectl**. Thus Flytectl is essential in every flow for the user. #### Create Templatization From 1f29a6732e6ece005a32e2490ddd911fc909a634 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Tue, 15 Mar 2022 08:34:37 -0700 Subject: [PATCH 232/645] Update documentation (#293) Signed-off-by: Flyte-Bot Co-authored-by: samhita-alla --- flytectl/docs/source/gen/flytectl.rst | 2 +- ...lytectl_delete_execution-cluster-label.rst | 20 ++++++------ ...tectl_delete_execution-queue-attribute.rst | 16 ++++------ .../gen/flytectl_delete_plugin-override.rst | 17 +++++----- ...lytectl_delete_task-resource-attribute.rst | 18 +++++------ ...tectl_delete_workflow-execution-config.rst | 18 +++++------ flytectl/docs/source/gen/flytectl_get.rst | 2 +- .../flytectl_get_execution-cluster-label.rst | 6 ++-- .../source/gen/flytectl_get_launchplan.rst | 2 +- ...flytectl_get_workflow-execution-config.rst | 2 +- .../source/gen/flytectl_register_files.rst | 32 +++++++++++-------- flytectl/docs/source/gen/flytectl_sandbox.rst | 29 ++++++++--------- .../docs/source/gen/flytectl_sandbox_exec.rst | 7 ++-- .../source/gen/flytectl_sandbox_start.rst | 13 ++++---- .../source/gen/flytectl_sandbox_status.rst | 6 ++-- .../source/gen/flytectl_sandbox_teardown.rst | 2 +- 16 files changed, 95 insertions(+), 97 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 6d7693e09a..03357644e9 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -67,7 +67,7 @@ SEE ALSO * :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. * :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. * :doc:`flytectl_register` - Registers tasks, workflows, and launch plans from a list of generated serialized files. -* :doc:`flytectl_sandbox` - Helps with Sandbox interactions like start, teardown, status, and exec. +* :doc:`flytectl_sandbox` - Helps with sandbox interactions like start, teardown, status, and exec. * :doc:`flytectl_update` - Update Flyte resources e.g., project. * :doc:`flytectl_upgrade` - Upgrades/rollbacks to a Flyte version. * :doc:`flytectl_version` - Fetches Flyte version diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 889e09a6fa..e83edad12e 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -10,32 +10,30 @@ Synopsis -Deletes execution cluster label for a given project and domain combination or additionally the workflow name. +Delete execution cluster label for a given project and domain, in combination with the workflow name. -For project flytectldemo and development domain: +For project flytectldemo and development domain, run: :: - flytectl delete execution-cluster-label -p flytectldemo -d development + flytectl delete execution-cluster-label -p flytectldemo -d development - -Delete execution cluster label using the config file that was used to create it. -Here, the config file is written to ecl.yaml. -Value is optional in the file as it is unread during the delete command, but it can be retained since the same file can be used for 'get', 'update' or 'delete' commands. -Example: content of ecl.yaml: +To delete execution cluster label using the config file that was used to create it, run: :: flytectl delete execution-cluster-label --attrFile ecl.yaml +For example, here's the config file ecl.yaml: .. code-block:: yaml - + domain: development project: flytectldemo value: foo -Delete execution cluster label for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort': +Value is optional in the file as it is unread during the delete command, but it can be retained since the same file can be used for 'get', 'update' and 'delete' commands. + +To delete the execution cluster label of the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following: :: diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 9909792dbe..710e8e7f10 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -10,23 +10,20 @@ Synopsis -Delete execution queue attributes for the given project and domain combination or additionally the workflow name. +Delete execution queue attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain: +For project flytectldemo and development domain, run: :: - flytectl delete execution-queue-attribute -p flytectldemo -d development - + flytectl delete execution-queue-attribute -p flytectldemo -d development Delete execution queue attribute using the config file which was used to create it. -Here, the config file is written to era.yaml. -Value is optional in the file as it is unread during the delete command but it can be retained since the same file can be used for get, update or delete commands. -Example: content of era.yaml: :: flytectl delete execution-queue-attribute --attrFile era.yaml +For example, here's the config file era.yaml: .. code-block:: yaml @@ -38,8 +35,9 @@ Example: content of era.yaml: - buzz - lightyear -Delete execution queue attribute for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort': +Value is optional in the file as it is unread during the delete command but it can be retained since the same file can be used for get, update and delete commands. + +To delete the execution queue attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: :: diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index 9933f2c072..f3b01a02c9 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -10,22 +10,20 @@ Synopsis -Delete plugin override for the given project and domain combination or additionally the workflow name. +Delete plugin override for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain: +For project flytectldemo and development domain, run: :: - flytectl delete plugin-override -p flytectldemo -d development + flytectl delete plugin-override -p flytectldemo -d development -Delete plugin override using the config file which was used to create it. -Here, the config file is written to po.yaml. -Overrides are optional in the file as they are unread during the delete command but can be retained since the same file can be used for get, update or delete commands. -Example: content of po.yaml: +To delete plugin override using the config file which was used to create it, run: :: flytectl delete plugin-override --attrFile po.yaml +For example, here's the config file po.yaml: .. code-block:: yaml @@ -38,8 +36,9 @@ Example: content of po.yaml: - plugin_override2 missing_plugin_behavior: 1 # Behavior when no specified plugin_id has an associated handler. 0 : FAIL , 1: DEFAULT -Delete plugin override for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort': +Overrides are optional in the file as they are unread during the delete command but can be retained since the same file can be used for get, update and delete commands. + +To delete plugin override for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: :: diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 8664c34035..ac26e320de 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -10,23 +10,20 @@ Synopsis -Deletes task resource attributes for the given project and domain combination, or additionally the workflow name. +Delete task resource attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain: +For project flytectldemo and development domain, run: :: - flytectl delete task-resource-attribute -p flytectldemo -d development + flytectl delete task-resource-attribute -p flytectldemo -d development - -Deletes task resource attribute using config file which was used to create it. -Here, the config file is written to tra.yaml. -The defaults/limits are optional in the file as they are unread during the delete command, but can be retained since the same file can be used for 'get', 'update' or 'delete' commands. -Example: content of tra.yaml: +To delete task resource attribute using the config file which was used to create it, run: :: flytectl delete task-resource-attribute --attrFile tra.yaml +For example, here's the config file tra.yaml: .. code-block:: yaml @@ -39,8 +36,9 @@ Example: content of tra.yaml: cpu: "2" memory: "450Mi" -Delete task resource attribute for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort': +The defaults/limits are optional in the file as they are unread during the delete command, but can be retained since the same file can be used for 'get', 'update' and 'delete' commands. + +To delete task resource attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: :: diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index b584343e6f..0f36d5dd7a 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -12,30 +12,28 @@ Synopsis Delete workflow execution config for the given project and domain combination or additionally the workflow name. -For project flytectldemo and development domain: +For project flytectldemo and development domain, run: :: - flytectl delete workflow-execution-config -p flytectldemo -d development + flytectl delete workflow-execution-config -p flytectldemo -d development - -Deletes workflow execution config using config file which was used to create it. -Here, the config file is written to wec.yaml. -Max_parallelism is optional in the file as it is unread during the delete command but can be retained since the same file can be used for get, update or delete commands. -Example: content of wec.yaml: +To delete workflow execution config using the config file which was used to create it, run: :: flytectl delete workflow-execution-config --attrFile wec.yaml +For example, here's the config file wec.yaml: .. code-block:: yaml - + domain: development project: flytectldemo max_parallelism: 5 -Deletes workflow execution config for a workflow. -For the workflow 'core.control_flow.run_merge_sort.merge_sort': +Max_parallelism is optional in the file as it is unread during the delete command but can be retained since the same file can be used for get, update and delete commands. + +To delete workflow execution config for the workflow 'core.control_flow.run_merge_sort.merge_sort', run: :: diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index a61c75323c..0be6546db4 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -10,7 +10,7 @@ Synopsis -Fetch Flyte resource; if a project: +To fetch a project, use the following command: :: flytectl get project diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index 47309bf44f..c8eed6cbb6 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -10,14 +10,14 @@ Synopsis -Retrieve the execution cluster label for a given project and domain, combination or additionally the workflow name. +Retrieve the execution cluster label for a given project and domain, in combination with the workflow name. -For project flytectldemo and development domain: +For project flytectldemo and development domain, run: :: flytectl get execution-cluster-label -p flytectldemo -d development -Example: output from the command: +The output would look like: .. code-block:: json diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 53c95cff78..2d47156ba8 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -16,7 +16,7 @@ Retrieve all launch plans within the project and domain: flytectl get launchplan -p flytesnacks -d development .. note:: - The terms launch plan/launch plans are interchangeable in these commands. + The terms launchplan/launchplans are interchangeable in these commands. Retrieve a launch plan by name within the project and domain: diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index 85ce34f3b9..ce38e4be29 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -10,7 +10,7 @@ Synopsis -Retrieve workflow execution config for the given project and domain combination or additionally the workflow name. +Retrieve workflow execution config for the given project and domain, in combination with the workflow name. For project flytectldemo and development domain: diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index e052e181be..7c20d694bb 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -11,30 +11,36 @@ Synopsis Registers all the serialized protobuf files including tasks, workflows and launch plans with default v1 version. + If previously registered entities with v1 version are present, the command will fail immediately on the first such encounter. :: flytectl register file _pb_output/* -d development -p flytesnacks - -Registration and fast registration mean the same. In fast registration, the input provided by the user is fast serialized proto generated by pyflyte. -If Flytectl finds any source code in users' input, it considers the registration as fast registration. -Flytectl finds input file by searching an archive file whose name starts with fast and has .tar.gz extension. When the user runs pyflyte with --fast flag then pyflyte creates serialize proto and it also creates source code archive file in the same directory. -SourceUploadPath is an optional flag. By default, Flytectl will create SourceUploadPath from your storage config. In case of s3 Flytectl will upload code base in s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. + +As per Flytectl, registration and fast registration mean the same! + +In fast registration, the input provided by the user is fast serialized proto generated by pyflyte. +When the user runs pyflyte with --fast flag, then pyflyte creates serialized proto and the source code archive file in the same directory. +Flytectl finds the input file by searching for an archive file whose name starts with "fast" and has .tar.gz extension. +If Flytectl finds any source code in users' input, it considers the registration as fast registration. + +SourceUploadPath is an optional flag. By default, Flytectl will create SourceUploadPath from your storage config. +If s3, Flytectl will upload the code base to s3://{{DEFINE_BUCKET_IN_STORAGE_CONFIG}}/fast/{{VERSION}}-fast{{MD5_CREATED_BY_PYFLYTE}.tar.gz}. :: - flytectl register file _pb_output/* -d development -p flytesnacks --version v2 - -In case of fast registration, if the SourceUploadPath flag is defined, Flytectl will not use the default directory to upload the source code. Instead, it will override the destination path on the registration. + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 + +In case of fast registration, if the SourceUploadPath flag is defined, Flytectl will not use the default directory to upload the source code. +Instead, it will override the destination path on the registration. :: - flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" - -Using archive file. Currently supported extensions are .tgz and .tar. They can be local or remote files served through http/https. -Use --archive flag: + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --SourceUploadPath="s3://dummy/fast" + +To register a .tgz or .tar file, use the --archive flag. They can be local or remote files served through http/https. :: - flytectl register files http://localhost:8080/_pb_output.tar -d development -p flytesnacks --archive + flytectl register files http://localhost:8080/_pb_output.tar -d development -p flytesnacks --archive Using local tgz file: diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 43e7816f51..dcc3f886cd 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -3,33 +3,32 @@ flytectl sandbox ---------------- -Helps with Sandbox interactions like start, teardown, status, and exec. +Helps with sandbox interactions like start, teardown, status, and exec. Synopsis ~~~~~~~~ -Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte Sandbox as a single Docker container locally. +Flyte Sandbox is a fully standalone minimal environment for running Flyte. +It provides a simplified way of running Flyte sandbox as a single Docker container locally. -Creates Sandbox cluster: +To create a sandbox cluster, run: :: flytectl sandbox start - - -Removes Sandbox cluster: + +To remove a sandbox cluster, run: :: - flytectl sandbox teardown - + flytectl sandbox teardown -Checks the status of the Sandbox container: +To check the status of the sandbox container, run: :: - flytectl sandbox status - -Executes commands inside the Sandbox container: + flytectl sandbox status + +To execute commands inside the sandbox container, use exec: :: flytectl sandbox exec -- pwd @@ -92,8 +91,8 @@ SEE ALSO ~~~~~~~~ * :doc:`flytectl` - Flytectl CLI tool -* :doc:`flytectl_sandbox_exec` - Executes non-interactive command inside the Sandbox container -* :doc:`flytectl_sandbox_start` - Starts the Flyte Sandbox cluster. -* :doc:`flytectl_sandbox_status` - Gets the status of the Sandbox environment. +* :doc:`flytectl_sandbox_exec` - Executes non-interactive command inside the sandbox container +* :doc:`flytectl_sandbox_start` - Starts the Flyte sandbox cluster. +* :doc:`flytectl_sandbox_status` - Gets the status of the sandbox environment. * :doc:`flytectl_sandbox_teardown` - Cleans up the sandbox environment diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index e030242b1d..ebe3141dda 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -3,14 +3,15 @@ flytectl sandbox exec --------------------- -Executes non-interactive command inside the Sandbox container +Executes non-interactive command inside the sandbox container Synopsis ~~~~~~~~ -Runs non-interactive commands inside the Sandbox container and immediately returns the output. By default, "flytectl exec" is present in the /root directory inside the Sandbox container. +Run non-interactive commands inside the sandbox container and immediately return the output. +By default, "flytectl exec" is present in the /root directory inside the sandbox container. :: @@ -78,5 +79,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Helps with Sandbox interactions like start, teardown, status, and exec. +* :doc:`flytectl_sandbox` - Helps with sandbox interactions like start, teardown, status, and exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index c7a87d2ed1..75169d7cec 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -3,26 +3,27 @@ flytectl sandbox start ---------------------- -Starts the Flyte Sandbox cluster. +Starts the Flyte sandbox cluster. Synopsis ~~~~~~~~ -Flyte Sandbox is a fully standalone minimal environment for running Flyte. It provides a simplified way of running Flyte Sandbox as a single Docker container locally. +Flyte sandbox is a fully standalone minimal environment for running Flyte. +It provides a simplified way of running Flyte sandbox as a single Docker container locally. -Starts the Sandbox cluster without any source code: +Starts the sandbox cluster without any source code: :: flytectl sandbox start -Mounts your source code repository inside the Sandbox: +Mounts your source code repository inside the sandbox: :: flytectl sandbox start --source=$HOME/flyteorg/flytesnacks -Runs a specific version of Flyte. Flytectl Sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. +Runs a specific version of Flyte. Flytectl sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. :: flytectl sandbox start --version=v0.14.0 @@ -139,5 +140,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Helps with Sandbox interactions like start, teardown, status, and exec. +* :doc:`flytectl_sandbox` - Helps with sandbox interactions like start, teardown, status, and exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index a7a8e1e372..41b13a1307 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -3,14 +3,14 @@ flytectl sandbox status ----------------------- -Gets the status of the Sandbox environment. +Gets the status of the sandbox environment. Synopsis ~~~~~~~~ -Retrieves the status of the Sandbox environment. Currently, Flyte Sandbox runs as a local Docker container. +Retrieves the status of the sandbox environment. Currently, Flyte sandbox runs as a local Docker container. Usage :: @@ -79,5 +79,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Helps with Sandbox interactions like start, teardown, status, and exec. +* :doc:`flytectl_sandbox` - Helps with sandbox interactions like start, teardown, status, and exec. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index 31280b2511..18a97a7fb8 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -79,5 +79,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_sandbox` - Helps with Sandbox interactions like start, teardown, status, and exec. +* :doc:`flytectl_sandbox` - Helps with sandbox interactions like start, teardown, status, and exec. From e8bffb618ceb3e0ebc61dbfdf33bdb0d056fb0bb Mon Sep 17 00:00:00 2001 From: Alekhya Sai Date: Thu, 17 Mar 2022 19:56:41 +0530 Subject: [PATCH 233/645] Image migration to static resources (#294) * Updates to grammar and image link. Signed-off-by: Alekhya Sai Punnamaraju * Updated image link in readme. Signed-off-by: Alekhya Sai Punnamaraju * Updates from review suggestions. Signed-off-by: Alekhya Sai Punnamaraju --- flytectl/README.md | 2 +- flytectl/proposal/README.md | 77 +++++++++++++++++++++---------------- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/flytectl/README.md b/flytectl/README.md index 938d915550..d7c8081889 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -1,6 +1,6 @@

- Flyte Logo + Flyte Logo

FlyteCTL diff --git a/flytectl/proposal/README.md b/flytectl/proposal/README.md index 362e60a9ba..833f01d0bb 100644 --- a/flytectl/proposal/README.md +++ b/flytectl/proposal/README.md @@ -1,21 +1,18 @@ # Introduction -This document proposes, **Flytectl** as a single CLI that interacts with FlyteAdmin service. It is proposed to write the CLI in **Golang** and would support both gRPC and REST endpoints of -FlyteAdmin. We will start with gRPC endpoint since the client can be easily generated. In the future, we will work on generating a Swagger-based REST client from the gRPC specification. As we build -more SDKs in different languages we will support a common way of interacting with the API. This doesn't mean that some SDKs may provide native ways of interacting with the Admin API (for e.g. -Flytekit), but the intention is to eventually replace **Flytekit/Flytecli** with Flytectl exclusively. +This document proposes, **Flytectl** as a single CLI that interacts with the FlyteAdmin service. It is proposed to write the CLI in **Golang** and would support both gRPC and REST endpoints of the FlyteAdmin. We will start with gRPC endpoint since the client can be easily generated. In the future, we will work on generating a Swagger-based REST client from the gRPC specification. As we buildmore SDKs in different languages we will support a common way of interacting with the API. This doesn't mean that some SDKs may provide native ways of interacting with the Admin API (e.g. Flytekit), but the intention is to eventually replace **Flytekit/Flytecli** with Flytectl exclusively. -Flytectl has been designed to deliver user features without having to rely on the UI. Flytectl will follow the standard oauth2 for -authentication, supported by FlyteAdmin. Moreover, Flytectl should be readily available on almost any platform - OSX, Linux and Windows. We will strive to keep it relatively lean and fast. +Flytectl has been designed to deliver user features without having to rely on the UI. Flytectl will follow the standard oauth2 for authentication, supported by FlyteAdmin. Moreover, Flytectl should be readily available on almost any platform - OSX, Linux and Windows. We will strive to keep it relatively lean and fast. # Why One CLI? As we build multiple SDKs, we need a native way of interacting with the API. Having multiple CLIs makes it hard to keep all of them in sync as we rapidly evolve the API and add more features. -*Diagram here* + # Why Golang? + - Most of Flyte backend is written in Golang. - Golang offers great CLI tooling support with viper and cobra. - Golang toolchain helps create cross-compiled small, light weight binary, which is efficient and easy to use. @@ -24,6 +21,7 @@ As we build multiple SDKs, we need a native way of interacting with the API. Hav - Kubectl is a stellar example of a CLI done well. ## Generating Swagger code + We started exploring this (Flytetools)[https://github.com/lyft/flytetools#tools] has some work. The Swagger code-gen maintainer also approached us to see if they could help. # API @@ -41,6 +39,7 @@ $ flytectl [options] ``` ### base options + - *endpoint* endpoint where Flyteadmin is available - *insecure* use if Oauth is not available - optional *project* project for which we need to retrieve details @@ -48,12 +47,15 @@ $ flytectl [options] - TBD ### version -returns the version of the CLI, version of Admin service and version of the Platform that is deployed + +returns the version of the CLI, version of Admin service, and version of the Platform that is deployed. ### configure + Allows configuring Flytectl for your own usage (low pri). Needed for especially storing Auth tokens. ### get/delete + Get retrieves a list of resources that is qualified by a further sub-command. for example ```bash $ flytectl --endpoint "example.flyte.net" get projects @@ -68,15 +70,15 @@ $ flytectl --endpoint "example.flyte.net" --project "p" --domain "d" delete work ``` ### Create is special -Create may need more information than can be easily passed in command line and we recommend using files to create an entity. The file could be in protobuf, jsonpb (json) or jsonpb (yaml) form. -Eventually we may want to simplify the json and yaml representations but that is not required in first pass. We may also want to create just a separate option for that. - -The create for Task and Workflow is essential what is encompassed in the pyflyte as the registration process. We will decouple the registration process such that pyflyte, jflyte (other native cli's or -code methods) can dump a serialized representations of the workflows and tasks that are directly consumed by **Flytectl**. Thus Flytectl is essential in every flow for the user. +Create may need more information that can be easily passed in the command line. We recommend using files to create an entity. The file could be in protobuf, jsonpb (json) or jsonpb (yaml) form. + Eventually, we may want to simplify the json and yaml representations, but that is not required in the first pass. We may also want to create just a separate option for that. +The create for Task and Workflow is essential to what is encompassed in the pyflyte as the registration process. We will decouple the registration process such that the pyflyte, jflyte (other native cli's or +code methods) can dump a serialized representations of the workflows and tasks that are directly consumed by **flytectl**. Thus flytectl is essential in every flow for the user. #### Create Templatization -User-facing SDKs can serialize workflow code to protobuf representations but these will be incomplete. Specifically, the _project_, _domain_, and _version_ parameters must be supplied at create time since these are attributes of the registerable, rather than serialized object. Placeholder template variables including: + +User-facing SDKs can serialize workflow code to protobuf representations, but these will be incomplete. Specifically, the _project_, _domain_, and _version_ parameters must be supplied at create time since these are attributes of the registerable rather than serialized object. Placeholder template variables include: * `{{ .project }}` * `{{ .domain }}` @@ -84,9 +86,9 @@ User-facing SDKs can serialize workflow code to protobuf representations but the * [auth](https://github.com/flyteorg/flyteidl/blob/c3baba8983019680ef57b6244cea36ba951233ed/protos/flyteidl/admin/common.proto#L241): including the assumable_iam_role and/or kubernetes_service_account * the [output_location_prefix](https://github.com/flyteorg/flyteidl/blob/c3baba8983019680ef57b6244cea36ba951233ed/protos/flyteidl/admin/common.proto#L250) -will be included in the serialized protobuf that must be substituted at **create** time. Eventually the hope is that substitution will be done server-side. +will be included in the serialized protobuf that must be substituted at **create** time. Eventually, the hope is that substitution will be done server-side. -Furthermore, to reproduce the equivalent **fast-register** code path for the flyte-cli defined in flytekit an equivalent _fast-create_ command must fill in additional template variables in the [task container args](https://github.com/flyteorg/flyteidl/blob/master/protos/flyteidl/core/tasks.proto#L142). These serialized, templatized args will appear like so: +Furthermore, to reproduce the equivalent **fast-register** code path for the flyte-cli defined in flytekit, an equivalent _fast-create_ command must fill in additional template variables in the [task container args](https://github.com/flyteorg/flyteidl/blob/master/protos/flyteidl/core/tasks.proto#L142). These serialized, templatized args will appear like so: ``` "pyflyte-fast-execute", @@ -99,21 +101,22 @@ Furthermore, to reproduce the equivalent **fast-register** code path for the fly ... ``` -The `remote package path` is determined by uploading the compressed user code (produced in the serialize step) to a user-specified remote directory (called `additional-distribution-dir` in flytekit). In the case of fast-create the code _version_ arg can be deterministcally assigned when serializing the code. Compressed code archives uploaded as individual files to the remote directory can assume the version name to guarantee uniqueness. +The `remote package path` is determined by uploading the compressed user code (produced in the serialize step) to a user-specified remote directory (called `additional-distribution-dir` in flytekit). In the case of fast-create the code _version_ arg can be deterministically assigned when serializing the code. Compressed code archives uploaded as individual files to the remote directory can assume the version name to guarantee uniqueness. The `dest dir` is an optional argument specified by the user to designate where code is downloaded at execution time. -![Registration process](flytectl_interaction.png) +![Registration process](https://raw.githubusercontent.com/flyteorg/static-resources/main/flytectl/readme/flytectl_interaction.png) ### update -This is a lower priority option as most entities in flyte are immutable and do not support updates. For the ones where update is supported, we should look into retrieving the existing and allow editing in an editor, like kubectl edit does. -**To be specified** +This is a lower priority option as most entities in flyte are immutable and do not support updates. For the ones where updates are supported, we should look into retrieving the existing and allowing editing in an editor, as kubectl edit does. + -# Details of each resource +# Details of each resource ## Projects + Projects are top level entity in Flyte. You can fetch multiple projects or one project using the CLI. Think about projects like namespaces. - create @@ -144,16 +147,17 @@ $ flytectl update projects --id project-x ... ``` ## Tasks - - get + +- get ```bash $ flytectl get tasks [task-name] [-o yaml | -o json | default -o table] [--filters...] [--sort-by...] [--selectors...] ``` - - get specific version and get a template to launch - Create an execution is complicated as the user needs to know all the input types and way to simplify this could be to create a YAML template locally from the launchplan (the interface, etc) + - get a specific version and get a template to launch + Create an execution is complicated as the user needs to know all the input types, and a way to simplify this could be to create a YAML template locally from the launchplan (the interface, etc.) ```bash $ flytectl get task task-name --execution-template -o YAML yaml.template (TBD) -This is a special version of get launch-plan which can be executed by passing it to create execution. +This is a special version of the get launch-plan which can be executed by passing it to create execution. ``` - create @@ -161,6 +165,7 @@ This is a special version of get launch-plan which can be executed by passing it - update ## Workflows + Support - get ```bash @@ -170,30 +175,32 @@ $ flytectl get workflows [workflow-name] [-o yaml | -o json | default -o table] - update ## Launch Plans + Support - get ```bash $ flytectl get launch-plans [launchplan-name] [-o yaml | -o json | default -o table] [--filters...] [--sort-by...] [--selectors...] ``` - - get specific version and get a template to launch - Create an execution is complicated as the user needs to know all the input types and way to simplify this could be to create a YAML template locally from the launchplan (the interface, etc) + - get a specific version and get a template to launch + Create an execution is complicated as the user needs to know all the input types, and a way to simplify this could be to create a YAML template locally from the launchplan (the interface, etc.) ```bash $ flytectl get launch-plans launch-plan-name --execution-template -o YAML yaml.template (TBD) -This is a special version of get launch-plan which can be executed by passing it to create execution. +This is a special version of the get launch-plan which can be executed by passing it to create execution. ``` - create - update ## Execution + Create or retrieve an execution. - get Get all executions or get a single execution. ```bash $ flytectl get execution [exec-name] [-o yaml | -o json | default -o table] [--filters...] [--sort-by...] [--selectors...] ``` -An interesting feature in get-execution might be to filter within the execution only the execution of a node, or quickly find the ones that have failed. +An interesting feature in get-execution might be to filter the execution of a node within the execution only or quickly find the ones that have failed. Visualizing the execution is also challenging. We may want to visualize We could use https://graphviz.org/ to visualize the DAG. Within the DAG, NodeExecutions and corresponding task executions need to be fetched. @@ -207,12 +214,14 @@ $ flytectl create execution --launch-plan "name" --inputs "key=value" - delete - here refers to terminate ## MatchableEntity -Ability to retrieve matchable entity and edit its details + +Ability to retrieve the matchable entity and edit its details - get - create - update ## Outputs + Support - get - create @@ -221,14 +230,16 @@ Support # No resource interactions ## Install all examples -Today Flytesnacks houses a few examples for Flyte usage in python. When a user wants to get started with Flyte quickly it would be preferable that all Flytesnacks examples are serialized and stored as artifacts in flytesnacks for every checkin. This can be done for python flytekit using `pyflyte serialize` command. Once they are posted as serialized blobs, flytectl could easily retrieve them and register them in a specific project as desired by the user. + +Today Flytesnacks houses a few examples for Flyte usage in python. When a user wants to get started with Flyte quickly, it would be preferable that all Flytesnacks examples are serialized and stored as artifacts in flytesnacks for every checkin. This can be done for python flytekit using `pyflyte serialize` command. Once they are posted as serialized blobs, flytectl could easily retrieve them and register them in a specific project as desired by the user. ```bash $ flytectl examples register-all [cookbook|plugins|--custom-path=remote-path] [--semver semantic-version-of-flytesnacks-examples] --target-project --target-domain ``` -The remote has to follow a protocol. It should be an archive - `tar.gz` with two folders `example-set/ -tasks/*.pb -workflows/*.pb` All the workflows in this path will be installed to the target project / domain +The remote has to follow a protocol. It should be an archive - `tar.gz` with two folders `example-set/ -tasks/*.pb -workflows/*.pb` All the workflows in this path will be installed to the target project/domain. ## Setup a repository with dockerfile for writing code for Flyte + Maybe we should look at `boilr` or some other existing framework to do this ```bash $ flytectl init project --archetype tensorflow-2.0 @@ -236,4 +247,4 @@ $ flytectl init project --archetype spark-3.0 $ flytectl init project --archetype xgboost ... ``` -For this to work, all these archetypes should be available in a separate repository. An archetype is essentially a template with dockerfile and folder setup with flytekit.config +All these archetypes should be available in a separate repository for this to work. An archetype is a template with dockerfile and folder setup with flytekit.config. From 308ddc86aba93f8d4df100a2aa397753fbc29e5e Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 22 Mar 2022 12:23:55 +0530 Subject: [PATCH 234/645] [Doc] Updated flytectl uprade command (#297) --- flytectl/docs/source/index.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 7288d80a7e..e78875f917 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -26,7 +26,7 @@ Flytectl is a Golang binary that can be installed on any platform supported by G .. prompt:: bash $ - brew update && brew upgrade flytectl + flytectl upgrade .. tabbed:: Other Operating systems @@ -34,6 +34,12 @@ Flytectl is a Golang binary that can be installed on any platform supported by G curl -sL https://ctl.flyte.org/install | bash + *Upgrade* existing installation using the following command: + + .. prompt:: bash $ + + flytectl upgrade + **Test** if Flytectl is installed correctly (your Flytectl version should be > 0.2.0) using the following command: .. prompt:: bash $ From 204d3eafb6a8dc45f818b024e61c42aab313d67c Mon Sep 17 00:00:00 2001 From: Alekhya Sai Date: Thu, 24 Mar 2022 18:40:46 +0530 Subject: [PATCH 235/645] Include workflow execution creation as part of flytectl create workflow (#295) * Stub for workflow Signed-off-by: Alekhya Sai Punnamaraju * Edit. Signed-off-by: Alekhya Sai Punnamaraju * Add WF execution steps Signed-off-by: Alekhya Sai Punnamaraju * Modified workflow steps. Signed-off-by: Alekhya Sai Punnamaraju * Fixing the rendering issue. Signed-off-by: Alekhya Sai Punnamaraju * Modified workflow as discussed. Signed-off-by: Alekhya Sai Punnamaraju * Removed relaunch steps for workflow. Signed-off-by: Alekhya Sai Punnamaraju --- .../source/gen/flytectl_create_execution.rst | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index c7cfc199ba..55ab913ddb 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -10,10 +10,15 @@ Synopsis -Create execution resources for a given workflow or task in a project and domain. +Create execution resources for a given workflow or task in a project and domain. + There are three steps to generate an execution, as outlined below: + +Create execution for a task +=========================== + 1. Generate the execution spec file using the :ref:`get task ` command. :: @@ -63,6 +68,53 @@ It is worth noting that the source's and target's project and domain can be diff flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d staging --targetProject flytesnacks +Create execution for a workflow +=============================== + +1. Generate an execution spec file. +:: + + flytectl get launchplan --project flytesnacks --domain development flyte.workflows.example.my_wf --latest --execFile exec_spec.yaml + +The generated file would look similar to the following: + +.. code-block:: yaml + + iamRoleARN: "" + inputs: {} + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + version: v1 + workflow: flyte.workflows.example.my_wf + +2. [Optional] Update the inputs for the execution, if needed. The generated spec file can be modified to change the input values, as shown below: + +.. code-block:: yaml + + iamRoleARN: 'arn:aws:iam::12345678:role/defaultrole' + inputs: + sorted_list1: + - 2 + - 4 + - 6 + sorted_list2: + - 1 + - 3 + - 5 + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + version: "v1" + workflow: flyte.workflows.example.my_wf + +3. Run the execution using the exec spec file. The file can then be passed through the command line. It is worth noting that the source’s and target’s project and domain can be different. +:: + + flytectl create execution --project flytesnacks --domain development --execFile exec_spec.yaml + +The following commands are common to both task and worflow: + To relaunch an execution, pass the current execution ID as follows: :: @@ -123,7 +175,6 @@ Modified file with struct data populated for 'x' and 'y' parameters for the task Usage - :: flytectl create execution [flags] From 4065cf7112af13694836bf9fbf966fc4a610fef4 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Fri, 25 Mar 2022 22:59:00 +0530 Subject: [PATCH 236/645] Project domain attribute for workflow Execution config (#298) --- .../golang_test_targets/download_tooling.sh | 2 +- .../matchable_attr_file_config_utils.go | 2 +- .../attrfetchconfig_flags.go | 1 + .../attrfetchconfig_flags_test.go | 14 +++++++ .../workflowexecutionconfig/fetch_config.go | 1 + .../cmd/delete/matchable_attribute_util.go | 10 ++--- .../matchable_workflow_execution_config.go | 41 +++++++++++++++++-- .../cmd/update/matchable_attribute_util.go | 10 ++--- ...tchable_cluster_resource_attribute_test.go | 4 +- .../matchable_execution_cluster_label_test.go | 4 +- ...atchable_execution_queue_attribute_test.go | 4 +- .../update/matchable_plugin_override_test.go | 4 +- .../matchable_task_resource_attribute_test.go | 4 +- ...atchable_workflow_execution_config_test.go | 4 +- flytectl/go.mod | 2 +- flytectl/go.sum | 4 +- 16 files changed, 81 insertions(+), 30 deletions(-) diff --git a/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh index 02fb004881..f205cb9cd0 100755 --- a/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh @@ -17,7 +17,7 @@ set -e # In the format of ":" or ":" if no cli tools=( "github.com/vektra/mockery/cmd/mockery" - "github.com/flyteorg/flytestdlib/cli/pflags@latest" + "github.com/flyteorg/flytestdlib/cli/pflags" "github.com/golangci/golangci-lint/cmd/golangci-lint@latest" "github.com/alvaroloes/enumer" "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" diff --git a/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go b/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go index b21e7832a9..d7fa956373 100644 --- a/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go +++ b/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go @@ -57,4 +57,4 @@ func DumpTaskResourceAttr(matchableAttrConfig interface{}, fileName string) erro fmt.Printf("%v", String(matchableAttrConfig)) } return nil -} +} \ No newline at end of file diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags.go index 6196b75ed7..7ea760f420 100755 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags.go @@ -51,5 +51,6 @@ func (AttrFetchConfig) mustMarshalJSON(v json.Marshaler) string { func (cfg AttrFetchConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrFetchConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultFetchConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultFetchConfig.AttrFile, "attribute file name to be used for generating attribute for the resource type.") + cmdFlags.BoolVar(&DefaultFetchConfig.Gen, fmt.Sprintf("%v%v", prefix, "gen"), DefaultFetchConfig.Gen, "generates an empty workflow execution config file with conformance to the api format.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags_test.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags_test.go index 7f85109efe..6d090a0fe4 100755 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrfetchconfig_flags_test.go @@ -113,4 +113,18 @@ func TestAttrFetchConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_gen", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("gen", testValue) + if vBool, err := cmdFlags.GetBool("gen"); err == nil { + testDecodeJson_AttrFetchConfig(t, fmt.Sprintf("%v", vBool), &actual.Gen) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/fetch_config.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/fetch_config.go index 8c2b918cb4..6a1c3e6988 100644 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/fetch_config.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/fetch_config.go @@ -4,6 +4,7 @@ package workflowexecutionconfig type AttrFetchConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for generating attribute for the resource type."` + Gen bool `json:"gen" pflag:",generates an empty workflow execution config file with conformance to the api format."` } var DefaultFetchConfig = &AttrFetchConfig{} diff --git a/flytectl/cmd/delete/matchable_attribute_util.go b/flytectl/cmd/delete/matchable_attribute_util.go index cfdd90f250..b2482270e8 100644 --- a/flytectl/cmd/delete/matchable_attribute_util.go +++ b/flytectl/cmd/delete/matchable_attribute_util.go @@ -2,10 +2,10 @@ package delete import ( "context" + "fmt" "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" ) func deleteMatchableAttr(ctx context.Context, project, domain, workflowName string, @@ -13,25 +13,25 @@ func deleteMatchableAttr(ctx context.Context, project, domain, workflowName stri if len(workflowName) > 0 { // Delete the workflow attribute from the admin. If the attribute doesn't exist , admin deesn't return an error and same behavior is followed here if dryRun { - logger.Infof(ctx, "skipping DeleteWorkflowAttributes request (dryRun)") + fmt.Print("skipping DeleteWorkflowAttributes request (dryRun)\n") } else { err := deleter.DeleteWorkflowAttributes(ctx, project, domain, workflowName, rsType) if err != nil { return err } } - logger.Debugf(ctx, "Deleted matchable resources from %v project and domain %v and workflow %v", project, domain, workflowName) + fmt.Printf("Deleted matchable resources from %v project and domain %v and workflow %v\n", project, domain, workflowName) } else { // Delete the project domain attribute from the admin. If the attribute doesn't exist , admin deesn't return an error and same behavior is followed here if dryRun { - logger.Infof(ctx, "skipping DeleteProjectDomainAttributes request (dryRun)") + fmt.Print("skipping DeleteProjectDomainAttributes request (dryRun)\n") } else { err := deleter.DeleteProjectDomainAttributes(ctx, project, domain, rsType) if err != nil { return err } } - logger.Debugf(ctx, "Deleted matchable resources from %v project and domain %v", project, domain) + fmt.Printf("Deleted matchable resources from %v project and domain %v\n", project, domain) } return nil } diff --git a/flytectl/cmd/get/matchable_workflow_execution_config.go b/flytectl/cmd/get/matchable_workflow_execution_config.go index 6adfd5ebca..7e75c2a93b 100644 --- a/flytectl/cmd/get/matchable_workflow_execution_config.go +++ b/flytectl/cmd/get/matchable_workflow_execution_config.go @@ -2,13 +2,17 @@ package get import ( "context" - - "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + "fmt" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) const ( @@ -88,7 +92,12 @@ func getWorkflowExecutionConfigFunc(ctx context.Context, args []string, cmdCtx c // Updates the workflowExecutionConfigFileConfig with the fetched matchable attribute if err := FetchAndUnDecorateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminFetcherExt(), &workflowExecutionConfigFileConfig, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG); err != nil { - return err + if grpcError := status.Code(err); grpcError == codes.NotFound && workflowexecutionconfig.DefaultFetchConfig.Gen { + fmt.Println("Generating a sample workflow execution config file") + workflowExecutionConfigFileConfig = getSampleWorkflowExecutionFileConfig(project, domain, workflowName) + } else { + return err + } } // Write the config to the file which can be used for update @@ -97,3 +106,29 @@ func getWorkflowExecutionConfigFunc(ctx context.Context, args []string, cmdCtx c } return nil } + +func getSampleWorkflowExecutionFileConfig(project, domain, workflow string) workflowexecutionconfig.FileConfig { + return workflowexecutionconfig.FileConfig{ + Project: project, + Domain: domain, + Workflow: workflow, + WorkflowExecutionConfig: &admin.WorkflowExecutionConfig{ + MaxParallelism: 10, + SecurityContext: &core.SecurityContext{ + RunAs: &core.Identity{ + K8SServiceAccount: "default", + IamRole: "", + }, + }, + Labels: &admin.Labels{ + Values: map[string]string{"cliLabelKey": "cliLabelValue"}, + }, + Annotations: &admin.Annotations{ + Values: map[string]string{"cliAnnotationKey": "cliAnnotationValue"}, + }, + RawOutputDataConfig: &admin.RawOutputDataConfig{ + OutputLocationPrefix: "cliOutputLocationPrefix", + }, + }, + } +} diff --git a/flytectl/cmd/update/matchable_attribute_util.go b/flytectl/cmd/update/matchable_attribute_util.go index 41ff4fa388..e3f4a2d296 100644 --- a/flytectl/cmd/update/matchable_attribute_util.go +++ b/flytectl/cmd/update/matchable_attribute_util.go @@ -2,10 +2,10 @@ package update import ( "context" + "fmt" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flytestdlib/logger" ) func DecorateAndUpdateMatchableAttr(ctx context.Context, project, domain, workflowName string, @@ -14,25 +14,25 @@ func DecorateAndUpdateMatchableAttr(ctx context.Context, project, domain, workfl if len(workflowName) > 0 { // Update the workflow attribute using the admin. if dryRun { - logger.Infof(ctx, "skipping UpdateWorkflowAttributes request (dryRun)") + fmt.Printf("skipping UpdateWorkflowAttributes request (dryRun)\n") } else { err := updater.UpdateWorkflowAttributes(ctx, project, domain, workflowName, matchingAttr) if err != nil { return err } } - logger.Debugf(ctx, "Updated attributes from %v project and domain %v and workflow %v", project, domain, workflowName) + fmt.Printf("Updated attributes from %v project and domain %v and workflow %v\n", project, domain, workflowName) } else { // Update the project domain attribute using the admin. if dryRun { - logger.Infof(ctx, "skipping UpdateProjectDomainAttributes request (dryRun)") + fmt.Printf("skipping UpdateProjectDomainAttributes request (dryRun)\n") } else { err := updater.UpdateProjectDomainAttributes(ctx, project, domain, matchingAttr) if err != nil { return err } } - logger.Debugf(ctx, "Updated attributes from %v project and domain %v", project, domain) + fmt.Printf("Updated attributes from %v project and domain %v\n", project, domain) } return nil } diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go index e354541d26..d091125cdc 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go @@ -36,7 +36,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { mock.Anything).Return(nil) err = updateClusterResourceAttributesFunc(ctx, args, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed to update project domain attribute", func(t *testing.T) { setup() @@ -59,7 +59,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed to update workflow attribute", func(t *testing.T) { setup() diff --git a/flytectl/cmd/update/matchable_execution_cluster_label_test.go b/flytectl/cmd/update/matchable_execution_cluster_label_test.go index b22b444b7a..0a84237cc0 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label_test.go @@ -36,7 +36,7 @@ func TestExecutionClusterLabel(t *testing.T) { mock.Anything).Return(nil) err = updateExecutionClusterLabelFunc(ctx, args, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { setup() @@ -59,7 +59,7 @@ func TestExecutionClusterLabel(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err = updateExecutionClusterLabelFunc(ctx, nil, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { setup() diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go index 5659a35696..f0751b32da 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go @@ -36,7 +36,7 @@ func TestExecutionQueueAttributes(t *testing.T) { mock.Anything).Return(nil) err = updateExecutionQueueAttributesFunc(ctx, args, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { setup() @@ -59,7 +59,7 @@ func TestExecutionQueueAttributes(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err = updateExecutionQueueAttributesFunc(ctx, nil, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { setup() diff --git a/flytectl/cmd/update/matchable_plugin_override_test.go b/flytectl/cmd/update/matchable_plugin_override_test.go index 8ca9cff072..8f59d1e1e4 100644 --- a/flytectl/cmd/update/matchable_plugin_override_test.go +++ b/flytectl/cmd/update/matchable_plugin_override_test.go @@ -36,7 +36,7 @@ func TestPluginOverride(t *testing.T) { mock.Anything).Return(nil) err = updatePluginOverridesFunc(ctx, args, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { setup() @@ -59,7 +59,7 @@ func TestPluginOverride(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err = updatePluginOverridesFunc(ctx, nil, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { setup() diff --git a/flytectl/cmd/update/matchable_task_resource_attribute_test.go b/flytectl/cmd/update/matchable_task_resource_attribute_test.go index a5dd5f7a02..e91f6476d9 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute_test.go @@ -36,7 +36,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { mock.Anything).Return(nil) err = updateTaskResourceAttributesFunc(ctx, args, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { setup() @@ -59,7 +59,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { setup() diff --git a/flytectl/cmd/update/matchable_workflow_execution_config_test.go b/flytectl/cmd/update/matchable_workflow_execution_config_test.go index f4a2934c7f..8afcfda1bf 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config_test.go @@ -37,7 +37,7 @@ func TestWorkflowExecutionConfigs(t *testing.T) { mock.Anything).Return(nil) err = updateWorkflowExecutionConfigFunc(ctx, args, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { setup() @@ -60,7 +60,7 @@ func TestWorkflowExecutionConfigs(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err = updateWorkflowExecutionConfigFunc(ctx, nil, cmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { setup() diff --git a/flytectl/go.mod b/flytectl/go.mod index 84eef1ec12..695533b176 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.21.24 + github.com/flyteorg/flyteidl v0.24.6 github.com/flyteorg/flytestdlib v0.4.14 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 3666fe15ea..5402048521 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -356,8 +356,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.21.24 h1:e2wPBK4aiLE+fw2zmhUDNg39QoJk6Lf5lQRvj8XgtFk= -github.com/flyteorg/flyteidl v0.21.24/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.24.6 h1:n2796X9Sw7mNDtXWwsJr84DLQpz8Cptvb7LptfJLxag= +github.com/flyteorg/flyteidl v0.24.6/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.4.14 h1:qpPwvJ+DqM1fI/y5uPKAP8p8VONz8oRp9Fz0jFl/5aI= github.com/flyteorg/flytestdlib v0.4.14/go.mod h1:fv1ar34LJLMTaf0tbfetisLykUlARi7rP+NQTUn6QQs= From 49a11220fb8d5991b467de52dfbc01050a36e7ab Mon Sep 17 00:00:00 2001 From: Haytham Abuelfutuh Date: Fri, 1 Apr 2022 00:30:43 -0700 Subject: [PATCH 237/645] Implement Fast Register through PreSigned URL (#296) * Signed URL Signed-off-by: Haytham Abuelfutuh * Updates Signed-off-by: Haytham Abuelfutuh * go mod tidy Signed-off-by: Haytham Abuelfutuh * update to latest Signed-off-by: Haytham Abuelfutuh * update stdlib version Signed-off-by: Haytham Abuelfutuh * Cleanup golang support Signed-off-by: Haytham Abuelfutuh * Update go version Signed-off-by: Haytham Abuelfutuh * Use latest flytestdlib Signed-off-by: Haytham Abuelfutuh * Fix unit tests Signed-off-by: Haytham Abuelfutuh * Overhaul tests to get rid of global variables Signed-off-by: Haytham Abuelfutuh * cleanup Signed-off-by: Haytham Abuelfutuh * more cleanup Signed-off-by: Haytham Abuelfutuh * Lint Signed-off-by: Haytham Abuelfutuh * go fmt Signed-off-by: Haytham Abuelfutuh * generate Signed-off-by: Haytham Abuelfutuh * Go imports Signed-off-by: Haytham Abuelfutuh * Lint Signed-off-by: Haytham Abuelfutuh * Fix unit test Signed-off-by: Haytham Abuelfutuh * lint Signed-off-by: Haytham Abuelfutuh * lint Signed-off-by: Haytham Abuelfutuh * Fix unit tests Signed-off-by: Haytham Abuelfutuh * go fmt Signed-off-by: Haytham Abuelfutuh * More lint Signed-off-by: Haytham Abuelfutuh * some progress Signed-off-by: Haytham Abuelfutuh * Go generate Signed-off-by: Haytham Abuelfutuh * Attempting to serialize tests Signed-off-by: Haytham Abuelfutuh * Reset file Signed-off-by: Haytham Abuelfutuh * go improts Signed-off-by: Haytham Abuelfutuh * Revert to go 1.17 Signed-off-by: Haytham Abuelfutuh * Use Go 1.17 for tests Signed-off-by: Haytham Abuelfutuh * Unit tests Signed-off-by: Haytham Abuelfutuh * Fix unit test Signed-off-by: Haytham Abuelfutuh * Rename DataProxy per IDL changes Signed-off-by: Haytham Abuelfutuh * Missed Signed-off-by: Haytham Abuelfutuh --- flytectl/.github/workflows/checks.yml | 10 + .../flyte/golang_support_tools/go.mod | 23 +- .../flyte/golang_support_tools/go.sum | 62 ++++-- .../matchable_attr_file_config_utils.go | 2 +- .../subcommand/register/files_config.go | 30 ++- .../subcommand/register/filesconfig_flags.go | 22 +- .../register/filesconfig_flags_test.go | 2 +- .../config/subcommand/sandbox/config_flags.go | 2 + .../subcommand/sandbox/config_flags_test.go | 28 +++ .../subcommand/sandbox/sandbox_config.go | 7 + .../cmd/configuration/configuration_test.go | 5 +- flytectl/cmd/core/cmd.go | 4 +- flytectl/cmd/core/cmd_ctx.go | 32 ++- flytectl/cmd/create/create_test.go | 11 - flytectl/cmd/create/execution_test.go | 118 +++++----- flytectl/cmd/create/execution_util_test.go | 28 ++- flytectl/cmd/create/project_test.go | 34 ++- flytectl/cmd/delete/delete_test.go | 11 - flytectl/cmd/delete/execution_test.go | 46 ++-- ...tchable_cluster_resource_attribute_test.go | 82 ++++--- .../matchable_execution_cluster_label_test.go | 82 ++++--- ...atchable_execution_queue_attribute_test.go | 82 ++++--- .../delete/matchable_plugin_override_test.go | 82 ++++--- .../matchable_task_resource_attribute_test.go | 82 ++++--- ...atchable_workflow_execution_config_test.go | 82 ++++--- flytectl/cmd/get/execution_test.go | 109 ++++------ flytectl/cmd/get/get_test.go | 10 - flytectl/cmd/get/launch_plan_test.go | 133 ++++++------ ...tchable_cluster_resource_attribute_test.go | 88 ++++---- .../matchable_execution_cluster_label_test.go | 88 ++++---- ...atchable_execution_queue_attribute_test.go | 88 ++++---- .../cmd/get/matchable_plugin_override_test.go | 88 ++++---- .../matchable_task_resource_attribute_test.go | 88 ++++---- ...atchable_workflow_execution_config_test.go | 88 ++++---- flytectl/cmd/get/node_execution_test.go | 29 +-- flytectl/cmd/get/project_test.go | 43 ++-- flytectl/cmd/get/task_test.go | 139 ++++++------ flytectl/cmd/get/workflow_test.go | 40 ++-- flytectl/cmd/register/examples.go | 6 +- flytectl/cmd/register/examples_test.go | 13 +- flytectl/cmd/register/files.go | 27 ++- flytectl/cmd/register/files_test.go | 144 +++++++------ flytectl/cmd/register/register_test.go | 10 +- flytectl/cmd/register/register_util.go | 188 ++++++++++++---- flytectl/cmd/register/register_util_test.go | 203 ++++++++++-------- flytectl/cmd/root.go | 7 +- flytectl/cmd/sandbox/exec_test.go | 14 +- flytectl/cmd/sandbox/start.go | 2 +- flytectl/cmd/sandbox/start_test.go | 6 +- flytectl/cmd/sandbox/status_test.go | 20 +- flytectl/cmd/sandbox/teardown_test.go | 12 +- flytectl/cmd/testutils/test_utils.go | 114 ++++++---- flytectl/cmd/update/execution_test.go | 44 ++-- flytectl/cmd/update/launch_plan_meta.go | 28 +-- flytectl/cmd/update/launch_plan_meta_test.go | 37 ++-- flytectl/cmd/update/launch_plan_test.go | 31 +-- ...tchable_cluster_resource_attribute_test.go | 55 +++-- .../matchable_execution_cluster_label_test.go | 55 +++-- ...atchable_execution_queue_attribute_test.go | 55 +++-- .../update/matchable_plugin_override_test.go | 55 +++-- .../matchable_task_resource_attribute_test.go | 55 +++-- ...atchable_workflow_execution_config_test.go | 55 +++-- flytectl/cmd/update/named_entity.go | 10 +- flytectl/cmd/update/named_entity_test.go | 39 ++-- flytectl/cmd/update/project_test.go | 54 +++-- flytectl/cmd/update/task_meta.go | 30 +-- flytectl/cmd/update/task_meta_test.go | 33 +-- flytectl/cmd/update/update.go | 6 +- flytectl/cmd/update/update_test.go | 11 - flytectl/cmd/update/workflow_meta.go | 28 +-- flytectl/cmd/update/workflow_meta_test.go | 33 +-- flytectl/cmd/upgrade/upgrade_test.go | 50 ++--- flytectl/cmd/version/version_test.go | 47 ++-- flytectl/go.mod | 28 +-- flytectl/go.sum | 57 +++-- flytectl/pkg/configutil/version.yaml | 8 + flytectl/pkg/docker/docker_util.go | 10 +- flytectl/pkg/docker/docker_util_test.go | 14 +- flytectl/pkg/githubutil/githubutil.go | 5 +- flytectl/pkg/githubutil/githubutil_test.go | 5 +- flytectl/pkg/util/version.yaml | 0 81 files changed, 1888 insertions(+), 1816 deletions(-) create mode 100644 flytectl/pkg/configutil/version.yaml create mode 100755 flytectl/pkg/util/version.yaml diff --git a/flytectl/.github/workflows/checks.yml b/flytectl/.github/workflows/checks.yml index b7f29f1dc5..d31399b768 100644 --- a/flytectl/.github/workflows/checks.yml +++ b/flytectl/.github/workflows/checks.yml @@ -19,16 +19,22 @@ jobs: lint: name: Lint uses: flyteorg/flytetools/.github/workflows/lint.yml@master + with: + go-version: 1.17 tests: name: Unit Tests uses: flyteorg/flytetools/.github/workflows/tests.yml@master secrets: FLYTE_BOT_PAT: ${{ secrets.FLYTE_BOT_PAT }} + with: + go-version: 1.17 generate: name: Check Go Gennerate uses: flyteorg/flytetools/.github/workflows/go_generate.yml@master + with: + go-version: 1.17 dry_run_goreleaser: name: Dry Run Goreleaser @@ -65,6 +71,10 @@ jobs: ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.17 - name: Build Flytectl binary run: make compile - name: Create a sandbox cluster diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.mod b/flytectl/boilerplate/flyte/golang_support_tools/go.mod index 307398c89e..441224926c 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.mod +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/alvaroloes/enumer v1.1.2 - github.com/flyteorg/flytestdlib v0.4.7 + github.com/flyteorg/flytestdlib v0.4.16 github.com/golangci/golangci-lint v1.38.0 github.com/pseudomuto/protoc-gen-doc v1.4.1 github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5 @@ -14,7 +14,10 @@ require ( 4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a // indirect cloud.google.com/go v0.75.0 // indirect cloud.google.com/go/storage v1.12.0 // indirect - github.com/Azure/azure-sdk-for-go v51.0.0+incompatible // indirect + github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.17 // indirect github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect @@ -46,6 +49,7 @@ require ( github.com/esimonov/ifshort v1.0.1 // indirect github.com/fatih/color v1.10.0 // indirect github.com/fatih/structtag v1.2.0 // indirect + github.com/flyteorg/stow v0.3.1 // indirect github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/fzipp/gocyclo v0.3.1 // indirect @@ -62,6 +66,7 @@ require ( github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gofrs/flock v0.8.0 // indirect + github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/protobuf v1.4.3 // indirect @@ -82,7 +87,6 @@ require ( github.com/gostaticanalysis/comment v1.4.1 // indirect github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 // indirect github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/graymeta/stow v0.2.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.0.0 // indirect github.com/imdario/mergo v0.3.5 // indirect @@ -135,7 +139,6 @@ require ( github.com/ryancurrah/gomodguard v1.2.0 // indirect github.com/ryanrolds/sqlclosecheck v0.3.0 // indirect github.com/sanposhiho/wastedassign v0.1.3 // indirect - github.com/satori/go.uuid v1.2.0 // indirect github.com/securego/gosec/v2 v2.6.1 // indirect github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect github.com/sirupsen/logrus v1.8.0 // indirect @@ -160,15 +163,15 @@ require ( github.com/ultraware/whitespace v0.0.4 // indirect github.com/uudashr/gocognit v1.0.1 // indirect go.opencensus.io v0.22.6 // indirect - golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect - golang.org/x/mod v0.4.1 // indirect - golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect + golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect + golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 // indirect - golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c // indirect - golang.org/x/text v0.3.5 // indirect + golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect + golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect - golang.org/x/tools v0.1.0 // indirect + golang.org/x/tools v0.1.10 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/api v0.38.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.sum b/flytectl/boilerplate/flyte/golang_support_tools/go.sum index a62010d29f..755f8cf6ef 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.sum +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.sum @@ -41,9 +41,14 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 cloud.google.com/go/storage v1.12.0 h1:4y3gHptW1EHVtcPAVE0eBBlFuGqEejTTG3KdIE0lUX4= cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v51.0.0+incompatible h1:p7blnyJSjJqf5jflHbSGhIhEpXIgIFmYZNg5uwqweso= -github.com/Azure/azure-sdk-for-go v51.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= +github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= @@ -177,8 +182,9 @@ github.com/denis-tingajkin/go-header v0.4.2 h1:jEeSF4sdv8/3cT/WY8AgDHUoItNSoEZ7q github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -210,10 +216,12 @@ github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flytestdlib v0.4.7 h1:SMPPXI3j/MjP7D2fqaR+lPQkTrqYS7xZbwsgJI2F8SU= -github.com/flyteorg/flytestdlib v0.4.7/go.mod h1:fv1ar34LJLMTaf0tbfetisLykUlARi7rP+NQTUn6QQs= +github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= +github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= +github.com/flyteorg/stow v0.3.1 h1:cBMbWl03Gsy5KoA5mutUYTuYpqtT7Pb8+ANGCLnmFEs= +github.com/flyteorg/stow v0.3.1/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -276,6 +284,8 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -397,8 +407,6 @@ github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 h github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/graymeta/stow v0.2.7 h1:b31cB1Ylw/388sYSZxnmpjT2QxC21AaQ8fRnUtE13b4= -github.com/graymeta/stow v0.2.7/go.mod h1:JAs139Zr29qfsecy7b+h9DRsWXbFbsd7LCrbCDYI84k= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -484,6 +492,8 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -577,7 +587,6 @@ github.com/nbutton23/zxcvbn-go v0.0.0-20201221231540-e56b841a3c88/go.mod h1:KSVJ github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nishanths/exhaustive v0.1.0 h1:kVlMw8h2LHPMGUVqUj6230oQjjTMFjwcZrnkhXzFfl8= github.com/nishanths/exhaustive v0.1.0/go.mod h1:S1j9110vxV1ECdCudXRkeMnFQ/DQk9ajLT0Uf2MYZQQ= @@ -698,8 +707,6 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanposhiho/wastedassign v0.1.3 h1:qIMpTh4NGZYRbFJ+DSpLoVn8F4SLciX2afRvXPefC7w= github.com/sanposhiho/wastedassign v0.1.3/go.mod h1:LGpq5Hsv74QaqM47WtIsRSF/ik9kqk07kchgv66tLVE= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/securego/gosec/v2 v2.6.1 h1:+KCw+uz16FYfFyJ/A5aU6uP7mnrL+j1TbDnk1yN+8R0= github.com/securego/gosec/v2 v2.6.1/go.mod h1:I76p3NTHBXsGhybUW+cEQ692q2Vp+A0Z6ZLzDIZy+Ao= @@ -799,6 +806,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -832,8 +840,9 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -867,8 +876,9 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -907,14 +917,18 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -936,6 +950,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -993,8 +1008,10 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1003,8 +1020,9 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1106,8 +1124,9 @@ golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1225,8 +1244,9 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= diff --git a/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go b/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go index d7fa956373..b21e7832a9 100644 --- a/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go +++ b/flytectl/cmd/config/subcommand/matchable_attr_file_config_utils.go @@ -57,4 +57,4 @@ func DumpTaskResourceAttr(matchableAttrConfig interface{}, fileName string) erro fmt.Printf("%v", String(matchableAttrConfig)) } return nil -} \ No newline at end of file +} diff --git a/flytectl/cmd/config/subcommand/register/files_config.go b/flytectl/cmd/config/subcommand/register/files_config.go index ae618d3380..ea2333583a 100644 --- a/flytectl/cmd/config/subcommand/register/files_config.go +++ b/flytectl/cmd/config/subcommand/register/files_config.go @@ -1,5 +1,7 @@ package register +import "github.com/flyteorg/flytestdlib/config" + //go:generate pflags FilesConfig --default-var DefaultFilesConfig --bind-default-var var ( @@ -7,19 +9,25 @@ var ( Version: "", ContinueOnError: false, } + + cfg = config.MustRegisterSection("files", DefaultFilesConfig) ) // FilesConfig containing flags used for registration type FilesConfig struct { - Version string `json:"version" pflag:",version of the entity to be registered with flyte which are un-versioned after serialization."` - Force bool `json:"force" pflag:",force use of version number on entities registered with flyte."` - ContinueOnError bool `json:"continueOnError" pflag:",continue on error when registering files."` - Archive bool `json:"archive" pflag:",pass in archive file either an http link or local path."` - AssumableIamRole string `json:"assumableIamRole" pflag:", custom assumable iam auth role to register launch plans with."` - K8sServiceAccount string `json:"k8sServiceAccount" pflag:", custom kubernetes service account auth role to register launch plans with."` - K8ServiceAccount string `json:"k8ServiceAccount" pflag:", deprecated. Please use --K8sServiceAccount"` - OutputLocationPrefix string `json:"outputLocationPrefix" pflag:", custom output location prefix for offloaded types (files/schemas)."` - SourceUploadPath string `json:"sourceUploadPath" pflag:", Location for source code in storage."` - DestinationDirectory string `json:"destinationDirectory" pflag:", Location of source code in container."` - DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Version string `json:"version" pflag:",Version of the entity to be registered with flyte which are un-versioned after serialization."` + Force bool `json:"force" pflag:",Force use of version number on entities registered with flyte."` + ContinueOnError bool `json:"continueOnError" pflag:",Continue on error when registering files."` + Archive bool `json:"archive" pflag:",Pass in archive file either an http link or local path."` + AssumableIamRole string `json:"assumableIamRole" pflag:",Custom assumable iam auth role to register launch plans with."` + K8sServiceAccount string `json:"k8sServiceAccount" pflag:",Custom kubernetes service account auth role to register launch plans with."` + K8ServiceAccount string `json:"k8ServiceAccount" pflag:",Deprecated. Please use --K8sServiceAccount"` + OutputLocationPrefix string `json:"outputLocationPrefix" pflag:",Custom output location prefix for offloaded types (files/schemas)."` + DeprecatedSourceUploadPath string `json:"sourceUploadPath" pflag:",Deprecated: Update flyte admin to avoid having to configure storage access from flytectl."` + DestinationDirectory string `json:"destinationDirectory" pflag:",Location of source code in container."` + DryRun bool `json:"dryRun" pflag:",Execute command without making any modifications."` +} + +func GetConfig() *FilesConfig { + return cfg.GetConfig().(*FilesConfig) } diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go index 910245ee9f..9ca76123d8 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go @@ -50,16 +50,16 @@ func (FilesConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("FilesConfig", pflag.ExitOnError) - cmdFlags.StringVar(&DefaultFilesConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultFilesConfig.Version, "version of the entity to be registered with flyte which are un-versioned after serialization.") - cmdFlags.BoolVar(&DefaultFilesConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultFilesConfig.Force, "force use of version number on entities registered with flyte.") - cmdFlags.BoolVar(&DefaultFilesConfig.ContinueOnError, fmt.Sprintf("%v%v", prefix, "continueOnError"), DefaultFilesConfig.ContinueOnError, "continue on error when registering files.") - cmdFlags.BoolVar(&DefaultFilesConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), DefaultFilesConfig.Archive, "pass in archive file either an http link or local path.") - cmdFlags.StringVar(&DefaultFilesConfig.AssumableIamRole, fmt.Sprintf("%v%v", prefix, "assumableIamRole"), DefaultFilesConfig.AssumableIamRole, " custom assumable iam auth role to register launch plans with.") - cmdFlags.StringVar(&DefaultFilesConfig.K8sServiceAccount, fmt.Sprintf("%v%v", prefix, "k8sServiceAccount"), DefaultFilesConfig.K8sServiceAccount, " custom kubernetes service account auth role to register launch plans with.") - cmdFlags.StringVar(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), DefaultFilesConfig.K8ServiceAccount, " deprecated. Please use --K8sServiceAccount") - cmdFlags.StringVar(&DefaultFilesConfig.OutputLocationPrefix, fmt.Sprintf("%v%v", prefix, "outputLocationPrefix"), DefaultFilesConfig.OutputLocationPrefix, " custom output location prefix for offloaded types (files/schemas).") - cmdFlags.StringVar(&DefaultFilesConfig.SourceUploadPath, fmt.Sprintf("%v%v", prefix, "sourceUploadPath"), DefaultFilesConfig.SourceUploadPath, " Location for source code in storage.") - cmdFlags.StringVar(&DefaultFilesConfig.DestinationDirectory, fmt.Sprintf("%v%v", prefix, "destinationDirectory"), DefaultFilesConfig.DestinationDirectory, " Location of source code in container.") - cmdFlags.BoolVar(&DefaultFilesConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultFilesConfig.DryRun, "execute command without making any modifications.") + cmdFlags.StringVar(&DefaultFilesConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultFilesConfig.Version, "Version of the entity to be registered with flyte which are un-versioned after serialization.") + cmdFlags.BoolVar(&DefaultFilesConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultFilesConfig.Force, "Force use of version number on entities registered with flyte.") + cmdFlags.BoolVar(&DefaultFilesConfig.ContinueOnError, fmt.Sprintf("%v%v", prefix, "continueOnError"), DefaultFilesConfig.ContinueOnError, "Continue on error when registering files.") + cmdFlags.BoolVar(&DefaultFilesConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), DefaultFilesConfig.Archive, "Pass in archive file either an http link or local path.") + cmdFlags.StringVar(&DefaultFilesConfig.AssumableIamRole, fmt.Sprintf("%v%v", prefix, "assumableIamRole"), DefaultFilesConfig.AssumableIamRole, "Custom assumable iam auth role to register launch plans with.") + cmdFlags.StringVar(&DefaultFilesConfig.K8sServiceAccount, fmt.Sprintf("%v%v", prefix, "k8sServiceAccount"), DefaultFilesConfig.K8sServiceAccount, "Custom kubernetes service account auth role to register launch plans with.") + cmdFlags.StringVar(&DefaultFilesConfig.K8ServiceAccount, fmt.Sprintf("%v%v", prefix, "k8ServiceAccount"), DefaultFilesConfig.K8ServiceAccount, "Deprecated. Please use --K8sServiceAccount") + cmdFlags.StringVar(&DefaultFilesConfig.OutputLocationPrefix, fmt.Sprintf("%v%v", prefix, "outputLocationPrefix"), DefaultFilesConfig.OutputLocationPrefix, "Custom output location prefix for offloaded types (files/schemas).") + cmdFlags.StringVar(&DefaultFilesConfig.DeprecatedSourceUploadPath, fmt.Sprintf("%v%v", prefix, "sourceUploadPath"), DefaultFilesConfig.DeprecatedSourceUploadPath, "Deprecated: Update flyte admin to avoid having to configure storage access from flytectl.") + cmdFlags.StringVar(&DefaultFilesConfig.DestinationDirectory, fmt.Sprintf("%v%v", prefix, "destinationDirectory"), DefaultFilesConfig.DestinationDirectory, "Location of source code in container.") + cmdFlags.BoolVar(&DefaultFilesConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultFilesConfig.DryRun, "Execute command without making any modifications.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go index 29c5494a67..911df3dc31 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go @@ -218,7 +218,7 @@ func TestFilesConfig_SetFlags(t *testing.T) { cmdFlags.Set("sourceUploadPath", testValue) if vString, err := cmdFlags.GetString("sourceUploadPath"); err == nil { - testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vString), &actual.SourceUploadPath) + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vString), &actual.DeprecatedSourceUploadPath) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index 0355ee08f5..426e24204b 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -56,5 +56,7 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.BoolVar(&DefaultConfig.Prerelease, fmt.Sprintf("%v%v", prefix, "pre"), DefaultConfig.Prerelease, "Optional. Pre release Version of flyte will be used for sandbox.") cmdFlags.StringSliceVar(&DefaultConfig.Env, fmt.Sprintf("%v%v", prefix, "env"), DefaultConfig.Env, "Optional. Provide Env variable in key=value format which can be passed to sandbox container.") cmdFlags.Var(&DefaultConfig.ImagePullPolicy, fmt.Sprintf("%v%v", prefix, "imagePullPolicy"), "Optional. Defines the image pull behavior [Always/IfNotPresent/Never]") + cmdFlags.StringVar(&DefaultConfig.ImagePullOptions.RegistryAuth, fmt.Sprintf("%v%v", prefix, "imagePullOptions.registryAuth"), DefaultConfig.ImagePullOptions.RegistryAuth, "The base64 encoded credentials for the registry.") + cmdFlags.StringVar(&DefaultConfig.ImagePullOptions.Platform, fmt.Sprintf("%v%v", prefix, "imagePullOptions.platform"), DefaultConfig.ImagePullOptions.Platform, "Forces a specific platform's image to be pulled.'") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index 6433a3e647..3fdc64ba40 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -181,4 +181,32 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_imagePullOptions.registryAuth", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("imagePullOptions.registryAuth", testValue) + if vString, err := cmdFlags.GetString("imagePullOptions.registryAuth"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.ImagePullOptions.RegistryAuth) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_imagePullOptions.platform", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("imagePullOptions.platform", testValue) + if vString, err := cmdFlags.GetString("imagePullOptions.platform"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.ImagePullOptions.Platform) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index a2fd3d1521..7381a398b7 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -53,4 +53,11 @@ type Config struct { // Optionally it is possible to use local sandbox image // Flytectl will not pull the image from the registry if the local flag passes. It is usually useful while testing your local images without pushing them to a registry. ImagePullPolicy ImagePullPolicy `json:"imagePullPolicy" pflag:",Optional. Defines the image pull behavior [Always/IfNotPresent/Never]"` + + ImagePullOptions ImagePullOptions `json:"imagePullOptions" pflag:",Optional. Defines image pull options (e.g. auth)"` +} + +type ImagePullOptions struct { + RegistryAuth string `json:"registryAuth" pflag:",The base64 encoded credentials for the registry."` + Platform string `json:"platform" pflag:",Forces a specific platform's image to be pulled.'"` } diff --git a/flytectl/cmd/configuration/configuration_test.go b/flytectl/cmd/configuration/configuration_test.go index bb2d256229..da5b0a6f97 100644 --- a/flytectl/cmd/configuration/configuration_test.go +++ b/flytectl/cmd/configuration/configuration_test.go @@ -9,6 +9,8 @@ import ( "strings" "testing" + admin2 "github.com/flyteorg/flyteidl/clients/go/admin" + "github.com/flyteorg/flytectl/pkg/configutil" initConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/config" @@ -51,7 +53,8 @@ func TestSetupConfigFunc(t *testing.T) { _ = util.SetupFlyteDir() - cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + mockClient := admin2.InitializeMockClientset() + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) err := configInitFunc(ctx, []string{}, cmdCtx) initConfig.DefaultConfig.Host = "" assert.Nil(t, err) diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index c1121355fb..20188130a6 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -35,9 +35,11 @@ func AddCommands(rootCmd *cobra.Command, cmdFuncs map[string]CommandEntry) { RunE: generateCommandFunc(cmdEntry), SilenceUsage: true, } + if cmdEntry.PFlagProvider != nil { cmd.Flags().AddFlagSet(cmdEntry.PFlagProvider.GetPFlagSet("")) } + rootCmd.AddCommand(cmd) } } @@ -67,6 +69,6 @@ func generateCommandFunc(cmdEntry CommandEntry) func(cmd *cobra.Command, args [] if err != nil { return err } - return cmdEntry.CmdFunc(ctx, args, NewCommandContext(clientSet.AdminClient(), cmd.OutOrStdout())) + return cmdEntry.CmdFunc(ctx, args, NewCommandContext(clientSet, cmd.OutOrStdout())) } } diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go index ab1c6c6afd..7d02474490 100644 --- a/flytectl/cmd/core/cmd_ctx.go +++ b/flytectl/cmd/core/cmd_ctx.go @@ -3,12 +3,14 @@ package cmdcore import ( "io" + "github.com/flyteorg/flyteidl/clients/go/admin" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" ) type CommandContext struct { - adminClient service.AdminServiceClient + clientSet *admin.Clientset adminClientFetcherExt ext.AdminFetcherExtInterface adminClientUpdateExt ext.AdminUpdaterExtInterface adminClientDeleteExt ext.AdminDeleterExtInterface @@ -16,28 +18,38 @@ type CommandContext struct { out io.Writer } -func NewCommandContext(adminClient service.AdminServiceClient, out io.Writer) CommandContext { - return CommandContext{adminClient: adminClient, out: out, - adminClientFetcherExt: &ext.AdminFetcherExtClient{AdminClient: adminClient}, - adminClientUpdateExt: &ext.AdminUpdaterExtClient{AdminClient: adminClient}, - adminClientDeleteExt: &ext.AdminDeleterExtClient{AdminClient: adminClient}} +func NewCommandContext(clientSet *admin.Clientset, out io.Writer) CommandContext { + return CommandContext{ + clientSet: clientSet, + out: out, + adminClientFetcherExt: &ext.AdminFetcherExtClient{AdminClient: clientSet.AdminClient()}, + adminClientUpdateExt: &ext.AdminUpdaterExtClient{AdminClient: clientSet.AdminClient()}, + adminClientDeleteExt: &ext.AdminDeleterExtClient{AdminClient: clientSet.AdminClient()}, + } } // NewCommandContextWithExt construct command context with injected extensions. Helps in injecting mocked ones for testing. func NewCommandContextWithExt( - adminClient service.AdminServiceClient, + clientSet *admin.Clientset, fetcher ext.AdminFetcherExtInterface, updater ext.AdminUpdaterExtInterface, deleter ext.AdminDeleterExtInterface, out io.Writer) CommandContext { - return CommandContext{adminClient: adminClient, out: out, + return CommandContext{ + clientSet: clientSet, + out: out, adminClientFetcherExt: fetcher, adminClientUpdateExt: updater, - adminClientDeleteExt: deleter} + adminClientDeleteExt: deleter, + } } func (c CommandContext) AdminClient() service.AdminServiceClient { - return c.adminClient + return c.clientSet.AdminClient() +} + +func (c CommandContext) ClientSet() *admin.Clientset { + return c.clientSet } func (c CommandContext) OutputPipe() io.Writer { diff --git a/flytectl/cmd/create/create_test.go b/flytectl/cmd/create/create_test.go index 40b8d5d861..dafd803a03 100644 --- a/flytectl/cmd/create/create_test.go +++ b/flytectl/cmd/create/create_test.go @@ -1,26 +1,15 @@ package create import ( - "context" "sort" "testing" - cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/stretchr/testify/assert" ) const testDataFolder = "../testdata/" -var ( - err error - ctx context.Context - mockClient *mocks.AdminServiceClient - args []string - cmdCtx cmdCore.CommandContext -) var setup = testutils.Setup var tearDownAndVerify = testutils.TearDownAndVerify diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index d671e0f5b0..1a3a7217e5 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -15,13 +15,17 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) +type TestStruct struct { + executionConfig *ExecutionConfig + args []string +} + // This function needs to be called after testutils.Steup() -func createExecutionSetup() { - ctx = testutils.Ctx - mockClient = testutils.MockClient - executionConfig = &ExecutionConfig{} +func createExecutionSetup(s *testutils.TestStruct) (t TestStruct) { + ctx := s.Ctx + t.executionConfig = &ExecutionConfig{} // TODO: migrate to new command context from testutils - cmdCtx = cmdCore.NewCommandContext(mockClient, testutils.MockOutStream) + s.CmdCtx = cmdCore.NewCommandContext(s.MockClient, s.MockOutStream) sortedListLiteralType := core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_CollectionType{ @@ -56,7 +60,7 @@ func createExecutionSetup() { }, }, } - mockClient.OnGetTaskMatch(ctx, mock.Anything).Return(task1, nil) + s.MockAdminClient.OnGetTaskMatch(ctx, mock.Anything).Return(task1, nil) parameterMap := map[string]*core.Parameter{ "numbers": { Var: &core.Variable{ @@ -128,15 +132,20 @@ func createExecutionSetup() { Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: "core.advanced.run_merge_sort.merge_sort", - Version: "v3", + Version: "v2", }, } - mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan1, nil) + s.MockAdminClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan1, nil) + + return TestStruct{ + executionConfig: executionConfig, + args: []string{}, + } } func TestCreateTaskExecutionFunc(t *testing.T) { - setup() - createExecutionSetup() + s := setup() + ts := createExecutionSetup(&s) executionCreateResponseTask := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -144,28 +153,31 @@ func TestCreateTaskExecutionFunc(t *testing.T) { Name: "ff513c0e44b5b4a35aa5", }, } - mockClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseTask, nil) - executionConfig.ExecFile = testDataFolder + "task_execution_spec_with_iamrole.yaml" - err = createExecutionCommand(ctx, args, cmdCtx) + + ctx := s.Ctx + s.MockAdminClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseTask, nil) + ts.executionConfig.ExecFile = testDataFolder + "task_execution_spec_with_iamrole.yaml" + err := createExecutionCommand(ctx, ts.args, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) - tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) + s.MockAdminClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) + tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) } func TestCreateTaskExecutionFuncError(t *testing.T) { - setup() - createExecutionSetup() - mockClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(nil, fmt.Errorf("error launching task")) - executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" - err = createExecutionCommand(ctx, args, cmdCtx) + s := setup() + ts := createExecutionSetup(&s) + ctx := s.Ctx + s.MockAdminClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(nil, fmt.Errorf("error launching task")) + ts.executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" + err := createExecutionCommand(ctx, ts.args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error launching task"), err) - mockClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) + s.MockAdminClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) } func TestCreateLaunchPlanExecutionFunc(t *testing.T) { - setup() - createExecutionSetup() + s := setup() + ts := createExecutionSetup(&s) executionCreateResponseLP := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -173,18 +185,20 @@ func TestCreateLaunchPlanExecutionFunc(t *testing.T) { Name: "f652ea3596e7f4d80a0e", }, } - mockClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseLP, nil) - executionConfig.ExecFile = testDataFolder + "launchplan_execution_spec.yaml" - err = createExecutionCommand(ctx, args, cmdCtx) + + ctx := s.Ctx + s.MockAdminClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseLP, nil) + ts.executionConfig.ExecFile = testDataFolder + "launchplan_execution_spec.yaml" + err := createExecutionCommand(ctx, ts.args, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) - tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e" `) + s.MockAdminClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) + tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e" `) } func TestCreateRelaunchExecutionFunc(t *testing.T) { - setup() - createExecutionSetup() - defer func() { executionConfig.Relaunch = "" }() + s := setup() + ts := createExecutionSetup(&s) + defer func() { ts.executionConfig.Relaunch = "" }() relaunchExecResponse := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -193,7 +207,7 @@ func TestCreateRelaunchExecutionFunc(t *testing.T) { }, } - executionConfig.Relaunch = relaunchExecResponse.Id.Name + ts.executionConfig.Relaunch = relaunchExecResponse.Id.Name relaunchRequest := &admin.ExecutionRelaunchRequest{ Id: &core.WorkflowExecutionIdentifier{ Name: executionConfig.Relaunch, @@ -201,17 +215,18 @@ func TestCreateRelaunchExecutionFunc(t *testing.T) { Domain: config.GetConfig().Domain, }, } - mockClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(relaunchExecResponse, nil) - err = createExecutionCommand(ctx, args, cmdCtx) + ctx := s.Ctx + s.MockAdminClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(relaunchExecResponse, nil) + err := createExecutionCommand(ctx, ts.args, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "RelaunchExecution", ctx, relaunchRequest) - tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) + s.MockAdminClient.AssertCalled(t, "RelaunchExecution", ctx, relaunchRequest) + tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) } func TestCreateRecoverExecutionFunc(t *testing.T) { - setup() - createExecutionSetup() - defer func() { executionConfig.Recover = "" }() + s := setup() + ts := createExecutionSetup(&s) + defer func() { ts.executionConfig.Recover = "" }() originalExecutionName := "abc123" recoverExecResponse := &admin.ExecutionCreateResponse{ @@ -222,7 +237,7 @@ func TestCreateRecoverExecutionFunc(t *testing.T) { }, } - executionConfig.Recover = originalExecutionName + ts.executionConfig.Recover = originalExecutionName recoverRequest := &admin.ExecutionRecoverRequest{ Id: &core.WorkflowExecutionIdentifier{ Name: originalExecutionName, @@ -230,28 +245,31 @@ func TestCreateRecoverExecutionFunc(t *testing.T) { Domain: config.GetConfig().Domain, }, } - mockClient.OnRecoverExecutionMatch(ctx, recoverRequest).Return(recoverExecResponse, nil) - err = createExecutionCommand(ctx, args, cmdCtx) + + ctx := s.Ctx + s.MockAdminClient.OnRecoverExecutionMatch(ctx, recoverRequest).Return(recoverExecResponse, nil) + err := createExecutionCommand(ctx, ts.args, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "RecoverExecution", ctx, recoverRequest) - tearDownAndVerify(t, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) - executionConfig.Relaunch = "" + s.MockAdminClient.AssertCalled(t, "RecoverExecution", ctx, recoverRequest) + tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) + ts.executionConfig.Relaunch = "" } func TestCreateExecutionFuncInvalid(t *testing.T) { - setup() - createExecutionSetup() + s := setup() + ts := createExecutionSetup(&s) + executionConfig := ts.executionConfig executionConfig.Relaunch = "" executionConfig.ExecFile = "" - err = createExecutionCommand(ctx, args, cmdCtx) + err := createExecutionCommand(s.Ctx, ts.args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("executionConfig, relaunch and recover can't be empty. Run the flytectl get task/launchplan to generate the config"), err) executionConfig.ExecFile = "Invalid-file" - err = createExecutionCommand(ctx, args, cmdCtx) + err = createExecutionCommand(s.Ctx, ts.args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from %v yaml file", executionConfig.ExecFile), err) executionConfig.ExecFile = testDataFolder + "invalid_execution_spec.yaml" - err = createExecutionCommand(ctx, args, cmdCtx) + err = createExecutionCommand(s.Ctx, ts.args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("either task or workflow name should be specified to launch an execution"), err) } diff --git a/flytectl/cmd/create/execution_util_test.go b/flytectl/cmd/create/execution_util_test.go index 9d6bf63d41..643248daaa 100644 --- a/flytectl/cmd/create/execution_util_test.go +++ b/flytectl/cmd/create/execution_util_test.go @@ -5,7 +5,6 @@ import ( "testing" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -20,9 +19,6 @@ var ( // This function needs to be called after testutils.Steup() func createExecutionUtilSetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient executionCreateResponse = &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -47,35 +43,35 @@ func createExecutionUtilSetup() { } func TestCreateExecutionForRelaunch(t *testing.T) { - setup() + s := setup() createExecutionUtilSetup() - mockClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(executionCreateResponse, nil) - err = relaunchExecution(ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) + s.MockAdminClient.OnRelaunchExecutionMatch(s.Ctx, relaunchRequest).Return(executionCreateResponse, nil) + err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx) assert.Nil(t, err) } func TestCreateExecutionForRelaunchNotFound(t *testing.T) { - setup() + s := setup() createExecutionUtilSetup() - mockClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(nil, errors.New("unknown execution")) - err = relaunchExecution(ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) + s.MockAdminClient.OnRelaunchExecutionMatch(s.Ctx, relaunchRequest).Return(nil, errors.New("unknown execution")) + err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, err, errors.New("unknown execution")) } func TestCreateExecutionForRecovery(t *testing.T) { - setup() + s := setup() createExecutionUtilSetup() - mockClient.OnRecoverExecutionMatch(ctx, recoverRequest).Return(executionCreateResponse, nil) - err = recoverExecution(ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) + s.MockAdminClient.OnRecoverExecutionMatch(s.Ctx, recoverRequest).Return(executionCreateResponse, nil) + err := recoverExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx) assert.Nil(t, err) } func TestCreateExecutionForRecoveryNotFound(t *testing.T) { - setup() + s := setup() createExecutionUtilSetup() - mockClient.OnRecoverExecutionMatch(ctx, recoverRequest).Return(nil, errors.New("unknown execution")) - err = recoverExecution(ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, cmdCtx) + s.MockAdminClient.OnRecoverExecutionMatch(s.Ctx, recoverRequest).Return(nil, errors.New("unknown execution")) + err := recoverExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, err, errors.New("unknown execution")) } diff --git a/flytectl/cmd/create/project_test.go b/flytectl/cmd/create/project_test.go index 538fd70f62..2de7ee24e1 100644 --- a/flytectl/cmd/create/project_test.go +++ b/flytectl/cmd/create/project_test.go @@ -9,7 +9,6 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/project" - "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -23,9 +22,6 @@ var ( ) func createProjectSetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient projectRegisterRequest = &admin.ProjectRegisterRequest{ Project: &admin.Project{ Id: projectValue, @@ -42,39 +38,39 @@ func createProjectSetup() { project.DefaultProjectConfig.Description = "" } func TestCreateProjectFunc(t *testing.T) { - setup() + s := setup() createProjectSetup() - defer tearDownAndVerify(t, "project created successfully.") + defer tearDownAndVerify(t, s.Writer, "project created successfully.") project.DefaultProjectConfig.ID = projectValue project.DefaultProjectConfig.Name = projectValue project.DefaultProjectConfig.Labels = map[string]string{} project.DefaultProjectConfig.Description = "" - mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) - err := createProjectsCommand(ctx, args, cmdCtx) + s.MockAdminClient.OnRegisterProjectMatch(s.Ctx, projectRegisterRequest).Return(nil, nil) + err := createProjectsCommand(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "RegisterProject", ctx, projectRegisterRequest) + s.MockAdminClient.AssertCalled(t, "RegisterProject", s.Ctx, projectRegisterRequest) } func TestEmptyProjectID(t *testing.T) { - setup() + s := setup() createProjectSetup() - defer tearDownAndVerify(t, "") + defer tearDownAndVerify(t, s.Writer, "") project.DefaultProjectConfig = &project.ConfigProject{} - mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) - err := createProjectsCommand(ctx, args, cmdCtx) + s.MockAdminClient.OnRegisterProjectMatch(s.Ctx, projectRegisterRequest).Return(nil, nil) + err := createProjectsCommand(s.Ctx, []string{}, s.CmdCtx) assert.Equal(t, errors.New(clierrors.ErrProjectNotPassed), err) - mockClient.AssertNotCalled(t, "RegisterProject", ctx, mock.Anything) + s.MockAdminClient.AssertNotCalled(t, "RegisterProject", s.Ctx, mock.Anything) } func TestEmptyProjectName(t *testing.T) { - setup() + s := setup() createProjectSetup() - defer tearDownAndVerify(t, "") + defer tearDownAndVerify(t, s.Writer, "") project.DefaultProjectConfig.ID = projectValue project.DefaultProjectConfig.Labels = map[string]string{} project.DefaultProjectConfig.Description = "" - mockClient.OnRegisterProjectMatch(ctx, projectRegisterRequest).Return(nil, nil) - err := createProjectsCommand(ctx, args, cmdCtx) + s.MockAdminClient.OnRegisterProjectMatch(s.Ctx, projectRegisterRequest).Return(nil, nil) + err := createProjectsCommand(s.Ctx, []string{}, s.CmdCtx) assert.Equal(t, fmt.Errorf("project name is a required flag"), err) - mockClient.AssertNotCalled(t, "RegisterProject", ctx, mock.Anything) + s.MockAdminClient.AssertNotCalled(t, "RegisterProject", s.Ctx, mock.Anything) } diff --git a/flytectl/cmd/delete/delete_test.go b/flytectl/cmd/delete/delete_test.go index 70af741071..88119c37cd 100644 --- a/flytectl/cmd/delete/delete_test.go +++ b/flytectl/cmd/delete/delete_test.go @@ -1,24 +1,13 @@ package delete import ( - "context" "sort" "testing" - cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/stretchr/testify/assert" ) -var ( - err error - ctx context.Context - mockClient *mocks.AdminServiceClient - cmdCtx cmdCore.CommandContext -) - const ( testDataNonExistentFile = "testdata/non-existent-file" testDataInvalidAttrFile = "testdata/invalid_attribute.yaml" diff --git a/flytectl/cmd/delete/execution_test.go b/flytectl/cmd/delete/execution_test.go index c9a5b11c62..1d74a9d524 100644 --- a/flytectl/cmd/delete/execution_test.go +++ b/flytectl/cmd/delete/execution_test.go @@ -5,7 +5,6 @@ import ( "testing" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -18,9 +17,6 @@ var ( ) func terminateExecutionSetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient args = append(args, "exec1", "exec2") terminateExecRequests = []*admin.ExecutionTerminateRequest{ {Id: &core.WorkflowExecutionIdentifier{ @@ -37,40 +33,40 @@ func terminateExecutionSetup() { } func TestTerminateExecutionFunc(t *testing.T) { - setup() + s := setup() terminateExecutionSetup() terminateExecResponse := &admin.ExecutionTerminateResponse{} - mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[0]).Return(terminateExecResponse, nil) - mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[1]).Return(terminateExecResponse, nil) - err = terminateExecutionFunc(ctx, args, cmdCtx) + s.MockAdminClient.OnTerminateExecutionMatch(s.Ctx, terminateExecRequests[0]).Return(terminateExecResponse, nil) + s.MockAdminClient.OnTerminateExecutionMatch(s.Ctx, terminateExecRequests[1]).Return(terminateExecResponse, nil) + err := terminateExecutionFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[0]) - mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[1]) - tearDownAndVerify(t, "") + s.MockAdminClient.AssertCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[0]) + s.MockAdminClient.AssertCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[1]) + tearDownAndVerify(t, s.Writer, "") } func TestTerminateExecutionFuncWithError(t *testing.T) { - setup() + s := setup() terminateExecutionSetup() terminateExecResponse := &admin.ExecutionTerminateResponse{} - mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[0]).Return(nil, errors.New("failed to terminate")) - mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[1]).Return(terminateExecResponse, nil) - err = terminateExecutionFunc(ctx, args, cmdCtx) + s.MockAdminClient.OnTerminateExecutionMatch(s.Ctx, terminateExecRequests[0]).Return(nil, errors.New("failed to terminate")) + s.MockAdminClient.OnTerminateExecutionMatch(s.Ctx, terminateExecRequests[1]).Return(terminateExecResponse, nil) + err := terminateExecutionFunc(s.Ctx, args, s.CmdCtx) assert.Equal(t, errors.New("failed to terminate"), err) - mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[0]) - mockClient.AssertNotCalled(t, "TerminateExecution", ctx, terminateExecRequests[1]) - tearDownAndVerify(t, "") + s.MockAdminClient.AssertCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[0]) + s.MockAdminClient.AssertNotCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[1]) + tearDownAndVerify(t, s.Writer, "") } func TestTerminateExecutionFuncWithPartialSuccess(t *testing.T) { - setup() + s := setup() terminateExecutionSetup() terminateExecResponse := &admin.ExecutionTerminateResponse{} - mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[0]).Return(terminateExecResponse, nil) - mockClient.OnTerminateExecutionMatch(ctx, terminateExecRequests[1]).Return(nil, errors.New("failed to terminate")) - err = terminateExecutionFunc(ctx, args, cmdCtx) + s.MockAdminClient.OnTerminateExecutionMatch(s.Ctx, terminateExecRequests[0]).Return(terminateExecResponse, nil) + s.MockAdminClient.OnTerminateExecutionMatch(s.Ctx, terminateExecRequests[1]).Return(nil, errors.New("failed to terminate")) + err := terminateExecutionFunc(s.Ctx, args, s.CmdCtx) assert.Equal(t, errors.New("failed to terminate"), err) - mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[0]) - mockClient.AssertCalled(t, "TerminateExecution", ctx, terminateExecRequests[1]) - tearDownAndVerify(t, "") + s.MockAdminClient.AssertCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[0]) + s.MockAdminClient.AssertCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[1]) + tearDownAndVerify(t, s.Writer, "") } diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go index f9290ad6b7..d4556224ff 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go @@ -6,7 +6,6 @@ import ( "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -14,121 +13,118 @@ import ( ) func deleteClusterResourceAttributeSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient clusterresourceattribute.DefaultDelConfig = &clusterresourceattribute.AttrDeleteConfig{} args = []string{} } func TestDeleteClusterResourceAttributes(t *testing.T) { t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { - setup() + s := setup() deleteClusterResourceAttributeSetup() // Empty attribute file clusterresourceattribute.DefaultDelConfig.AttrFile = "" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + err := deleteClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) }) t.Run("failed project domain attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteClusterResourceAttributeSetup() // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) - err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + err := deleteClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) }) t.Run("successful project domain attribute deletion file", func(t *testing.T) { - setup() + s := setup() deleteClusterResourceAttributeSetup() // Empty attribute file clusterresourceattribute.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_cluster_attribute.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + err := deleteClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_CLUSTER_RESOURCE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_CLUSTER_RESOURCE) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteClusterResourceAttributeSetup() // Empty attribute file clusterresourceattribute.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + err := deleteClusterResourceAttributes(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_CLUSTER_RESOURCE) }) t.Run("failed workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteClusterResourceAttributeSetup() // Empty attribute file clusterresourceattribute.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) - err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + err := deleteClusterResourceAttributes(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_CLUSTER_RESOURCE) }) t.Run("successful workflow attribute deletion file", func(t *testing.T) { - setup() + s := setup() deleteClusterResourceAttributeSetup() // Empty attribute file clusterresourceattribute.DefaultDelConfig.AttrFile = "testdata/valid_workflow_cluster_attribute.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + err := deleteClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_CLUSTER_RESOURCE) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { - setup() + s := setup() deleteClusterResourceAttributeSetup() // Empty attribute file clusterresourceattribute.DefaultDelConfig.AttrFile = testDataNonExistentFile // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + err := deleteClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) - u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_CLUSTER_RESOURCE) }) t.Run("attribute deletion invalid file", func(t *testing.T) { - setup() + s := setup() deleteClusterResourceAttributeSetup() // Empty attribute file clusterresourceattribute.DefaultDelConfig.AttrFile = testDataInvalidAttrFile // No args implying project domain attribute deletion - err = deleteClusterResourceAttributes(ctx, args, cmdCtx) + err := deleteClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_CLUSTER_RESOURCE) + s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_CLUSTER_RESOURCE) }) } diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label_test.go b/flytectl/cmd/delete/matchable_execution_cluster_label_test.go index 834e5afb66..c36248c267 100644 --- a/flytectl/cmd/delete/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/delete/matchable_execution_cluster_label_test.go @@ -6,7 +6,6 @@ import ( "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -14,121 +13,118 @@ import ( ) func deleteExecutionClusterLabelSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient executionclusterlabel.DefaultDelConfig = &executionclusterlabel.AttrDeleteConfig{} args = []string{} } func TestDeleteExecutionClusterLabels(t *testing.T) { t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { - setup() + s := setup() deleteExecutionClusterLabelSetup() // Empty attribute file executionclusterlabel.DefaultDelConfig.AttrFile = "" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + err := deleteExecutionClusterLabel(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) t.Run("failed project domain attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteExecutionClusterLabelSetup() // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete project domain attributes")) - err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + err := deleteExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delete project domain attributes"), err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) t.Run("successful project domain attribute deletion file", func(t *testing.T) { - setup() + s := setup() deleteExecutionClusterLabelSetup() // Empty attribute file executionclusterlabel.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_execution_cluster_label.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + err := deleteExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteExecutionClusterLabelSetup() // Empty attribute file executionclusterlabel.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + err := deleteExecutionClusterLabel(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) t.Run("failed workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteExecutionClusterLabelSetup() // Empty attribute file executionclusterlabel.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) - err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + err := deleteExecutionClusterLabel(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) t.Run("successful workflow attribute deletion file", func(t *testing.T) { - setup() + s := setup() deleteExecutionClusterLabelSetup() // Empty attribute file executionclusterlabel.DefaultDelConfig.AttrFile = "testdata/valid_workflow_execution_cluster_label.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + err := deleteExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { - setup() + s := setup() deleteExecutionClusterLabelSetup() // Empty attribute file executionclusterlabel.DefaultDelConfig.AttrFile = testDataNonExistentFile // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + err := deleteExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) - u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) t.Run("attribute deletion invalid file", func(t *testing.T) { - setup() + s := setup() deleteExecutionClusterLabelSetup() // Empty attribute file executionclusterlabel.DefaultDelConfig.AttrFile = testDataInvalidAttrFile // No args implying project domain attribute deletion - err = deleteExecutionClusterLabel(ctx, args, cmdCtx) + err := deleteExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) } diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go b/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go index ef5b2975c0..5c4843ede3 100644 --- a/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go @@ -6,7 +6,6 @@ import ( "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -14,121 +13,118 @@ import ( ) func deleteExecutionQueueAttributeSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient executionqueueattribute.DefaultDelConfig = &executionqueueattribute.AttrDeleteConfig{} args = []string{} } func TestDeleteExecutionQueueAttributes(t *testing.T) { t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { - setup() + s := setup() deleteExecutionQueueAttributeSetup() // Empty attribute file executionqueueattribute.DefaultDelConfig.AttrFile = "" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + err := deleteExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) }) t.Run("failed project domain attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) - err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + err := deleteExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) }) t.Run("successful project domain attribute deletion file", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file executionqueueattribute.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_execution_queue_attribute.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + err := deleteExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_QUEUE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_QUEUE) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file executionqueueattribute.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + err := deleteExecutionQueueAttributes(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_EXECUTION_QUEUE) }) t.Run("failed workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file executionqueueattribute.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) - err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + err := deleteExecutionQueueAttributes(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_EXECUTION_QUEUE) }) t.Run("successful workflow attribute deletion file", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file executionqueueattribute.DefaultDelConfig.AttrFile = "testdata/valid_workflow_execution_queue_attribute.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + err := deleteExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_EXECUTION_QUEUE) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file executionqueueattribute.DefaultDelConfig.AttrFile = testDataNonExistentFile // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + err := deleteExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) - u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_EXECUTION_QUEUE) }) t.Run("attribute deletion invalid file", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file executionqueueattribute.DefaultDelConfig.AttrFile = testDataInvalidAttrFile // No args implying project domain attribute deletion - err = deleteExecutionQueueAttributes(ctx, args, cmdCtx) + err := deleteExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_QUEUE) + s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_QUEUE) }) } diff --git a/flytectl/cmd/delete/matchable_plugin_override_test.go b/flytectl/cmd/delete/matchable_plugin_override_test.go index d8ed34818f..af64254d3c 100644 --- a/flytectl/cmd/delete/matchable_plugin_override_test.go +++ b/flytectl/cmd/delete/matchable_plugin_override_test.go @@ -6,7 +6,6 @@ import ( "github.com/flyteorg/flytectl/cmd/config" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -14,121 +13,118 @@ import ( ) func deletePluginOverrideSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient pluginoverride.DefaultDelConfig = &pluginoverride.AttrDeleteConfig{} args = []string{} } func TestPluginOverride(t *testing.T) { t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { - setup() + s := setup() deletePluginOverrideSetup() // Empty attribute file pluginoverride.DefaultDelConfig.AttrFile = "" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deletePluginOverride(ctx, args, cmdCtx) + err := deletePluginOverride(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) }) t.Run("failed project domain attribute deletion", func(t *testing.T) { - setup() + s := setup() deletePluginOverrideSetup() // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) - err = deletePluginOverride(ctx, args, cmdCtx) + err := deletePluginOverride(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) }) t.Run("successful project domain attribute deletion file", func(t *testing.T) { - setup() + s := setup() deletePluginOverrideSetup() // Empty attribute file pluginoverride.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_plugin_override.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deletePluginOverride(ctx, args, cmdCtx) + err := deletePluginOverride(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_PLUGIN_OVERRIDE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_PLUGIN_OVERRIDE) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deletePluginOverrideSetup() // Empty attribute file pluginoverride.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deletePluginOverride(ctx, args, cmdCtx) + err := deletePluginOverride(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_PLUGIN_OVERRIDE) }) t.Run("failed workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deletePluginOverrideSetup() // Empty attribute file pluginoverride.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) - err = deletePluginOverride(ctx, args, cmdCtx) + err := deletePluginOverride(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_PLUGIN_OVERRIDE) }) t.Run("successful workflow attribute deletion file", func(t *testing.T) { - setup() + s := setup() deletePluginOverrideSetup() // Empty attribute file pluginoverride.DefaultDelConfig.AttrFile = "testdata/valid_workflow_plugin_override.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deletePluginOverride(ctx, args, cmdCtx) + err := deletePluginOverride(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_PLUGIN_OVERRIDE) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { - setup() + s := setup() deletePluginOverrideSetup() // Empty attribute file pluginoverride.DefaultDelConfig.AttrFile = testDataNonExistentFile // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deletePluginOverride(ctx, args, cmdCtx) + err := deletePluginOverride(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) - u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_PLUGIN_OVERRIDE) }) t.Run("attribute deletion invalid file", func(t *testing.T) { - setup() + s := setup() deletePluginOverrideSetup() // Empty attribute file pluginoverride.DefaultDelConfig.AttrFile = testDataInvalidAttrFile // No args implying project domain attribute deletion - err = deletePluginOverride(ctx, args, cmdCtx) + err := deletePluginOverride(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_PLUGIN_OVERRIDE) + s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_PLUGIN_OVERRIDE) }) } diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go index 204d46f8c7..62dd7930ce 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go @@ -6,7 +6,6 @@ import ( "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -14,121 +13,118 @@ import ( ) func deleteTaskResourceAttributeSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient taskresourceattribute.DefaultDelConfig = &taskresourceattribute.AttrDeleteConfig{} args = []string{} } func TestDeleteTaskResourceAttributes(t *testing.T) { t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file taskresourceattribute.DefaultDelConfig.AttrFile = "" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + err := deleteTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) }) t.Run("failed project domain attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delte project domain attributes")) - err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + err := deleteTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delte project domain attributes"), err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) }) t.Run("successful project domain attribute deletion file", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file taskresourceattribute.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + err := deleteTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_TASK_RESOURCE) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_TASK_RESOURCE) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file taskresourceattribute.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + err := deleteTaskResourceAttributes(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_TASK_RESOURCE) }) t.Run("failed workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file taskresourceattribute.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) - err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + err := deleteTaskResourceAttributes(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_TASK_RESOURCE) }) t.Run("successful workflow attribute deletion file", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file taskresourceattribute.DefaultDelConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + err := deleteTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_TASK_RESOURCE) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file taskresourceattribute.DefaultDelConfig.AttrFile = testDataNonExistentFile // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + err := deleteTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) - u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_TASK_RESOURCE) }) t.Run("attribute deletion invalid file", func(t *testing.T) { - setup() + s := setup() deleteTaskResourceAttributeSetup() // Empty attribute file taskresourceattribute.DefaultDelConfig.AttrFile = testDataInvalidAttrFile // No args implying project domain attribute deletion - err = deleteTaskResourceAttributes(ctx, args, cmdCtx) + err := deleteTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_TASK_RESOURCE) + s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_TASK_RESOURCE) }) } diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config_test.go b/flytectl/cmd/delete/matchable_workflow_execution_config_test.go index acebc7d06b..592a53edba 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config_test.go @@ -7,7 +7,6 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" "github.com/flyteorg/flytectl/cmd/config" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -15,121 +14,118 @@ import ( ) func deleteWorkflowExecutionConfigSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient workflowexecutionconfig.DefaultDelConfig = &workflowexecutionconfig.AttrDeleteConfig{} args = []string{} } func TestDeleteWorkflowExecutionConfig(t *testing.T) { t.Run("successful project domain attribute deletion commandline", func(t *testing.T) { - setup() + s := setup() deleteWorkflowExecutionConfigSetup() // Empty attribute file workflowexecutionconfig.DefaultDelConfig.AttrFile = "" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + err := deleteWorkflowExecutionConfig(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) t.Run("failed project domain attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteWorkflowExecutionConfigSetup() // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete project domain attributes")) - err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + err := deleteWorkflowExecutionConfig(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delete project domain attributes"), err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) t.Run("successful project domain attribute deletion file", func(t *testing.T) { - setup() + s := setup() deleteWorkflowExecutionConfigSetup() // Empty attribute file workflowexecutionconfig.DefaultDelConfig.AttrFile = "testdata/valid_project_domain_workflow_execution_config.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + err := deleteWorkflowExecutionConfig(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteWorkflowExecutionConfigSetup() // Empty attribute file workflowexecutionconfig.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + err := deleteWorkflowExecutionConfig(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) t.Run("failed workflow attribute deletion", func(t *testing.T) { - setup() + s := setup() deleteWorkflowExecutionConfigSetup() // Empty attribute file workflowexecutionconfig.DefaultDelConfig.AttrFile = "" args := []string{"workflow1"} - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to delete workflow attribute")) - err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + err := deleteWorkflowExecutionConfig(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to delete workflow attribute"), err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow1", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) t.Run("successful workflow attribute deletion file", func(t *testing.T) { - setup() + s := setup() deleteWorkflowExecutionConfigSetup() // Empty attribute file workflowexecutionconfig.DefaultDelConfig.AttrFile = "testdata/valid_workflow_workflow_execution_config.yaml" // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + err := deleteWorkflowExecutionConfig(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { - setup() + s := setup() deleteWorkflowExecutionConfigSetup() // Empty attribute file workflowexecutionconfig.DefaultDelConfig.AttrFile = testDataNonExistentFile // No args implying project domain attribute deletion - u.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.DeleterExt.OnDeleteWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + err := deleteWorkflowExecutionConfig(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) - u.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", + s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) t.Run("attribute deletion invalid file", func(t *testing.T) { - setup() + s := setup() deleteWorkflowExecutionConfigSetup() // Empty attribute file workflowexecutionconfig.DefaultDelConfig.AttrFile = testDataInvalidAttrFile // No args implying project domain attribute deletion - err = deleteWorkflowExecutionConfig(ctx, args, cmdCtx) + err := deleteWorkflowExecutionConfig(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - u.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - ctx, "flytectldemo", "development", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", + s.Ctx, "flytectldemo", "development", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) } diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go index bcedf1f6d3..ff11d03db0 100644 --- a/flytectl/cmd/get/execution_test.go +++ b/flytectl/cmd/get/execution_test.go @@ -4,14 +4,12 @@ import ( "context" "errors" "fmt" - "io" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - u "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -32,12 +30,9 @@ func getExecutionSetup() { } func TestListExecutionFunc(t *testing.T) { - ctx := context.Background() getExecutionSetup() - var args []string - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + s := setup() + ctx := s.Ctx execListRequest := &admin.ResourceListRequest{ Limit: 100, SortBy: &admin.Sort{ @@ -77,21 +72,15 @@ func TestListExecutionFunc(t *testing.T) { executionList := &admin.ExecutionList{ Executions: executions, } - mockClient.OnListExecutionsMatch(mock.Anything, mock.MatchedBy(func(o *admin.ResourceListRequest) bool { - return execListRequest.SortBy.Key == o.SortBy.Key && execListRequest.SortBy.Direction == o.SortBy.Direction && execListRequest.Filters == o.Filters && execListRequest.Limit == o.Limit - })).Return(executionList, nil) - err := getExecutionFunc(ctx, args, cmdCtx) + s.MockAdminClient.OnListExecutionsMatch(mock.Anything, execListRequest).Return(executionList, nil) + err := getExecutionFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListExecutions", ctx, execListRequest) + s.MockAdminClient.AssertCalled(t, "ListExecutions", ctx, execListRequest) } func TestListExecutionFuncWithError(t *testing.T) { ctx := context.Background() getExecutionSetup() - var args []string - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) execListRequest := &admin.ResourceListRequest{ Limit: 100, SortBy: &admin.Sort{ @@ -102,6 +91,7 @@ func TestListExecutionFuncWithError(t *testing.T) { Domain: domainValue, }, } + _ = &admin.Execution{ Id: &core.WorkflowExecutionIdentifier{ Project: projectValue, @@ -126,21 +116,18 @@ func TestListExecutionFuncWithError(t *testing.T) { Phase: core.WorkflowExecution_SUCCEEDED, }, } - mockClient.OnListExecutionsMatch(mock.Anything, mock.MatchedBy(func(o *admin.ResourceListRequest) bool { - return execListRequest.SortBy.Key == o.SortBy.Key && execListRequest.SortBy.Direction == o.SortBy.Direction && execListRequest.Filters == o.Filters && execListRequest.Limit == o.Limit - })).Return(nil, errors.New("executions NotFound")) - err := getExecutionFunc(ctx, args, cmdCtx) + s := setup() + s.FetcherExt.OnListExecutionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("executions NotFound")) + s.MockAdminClient.OnListExecutionsMatch(mock.Anything, execListRequest).Return(nil, errors.New("executions NotFound")) + err := getExecutionFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, err, errors.New("executions NotFound")) - mockClient.AssertCalled(t, "ListExecutions", ctx, execListRequest) + s.MockAdminClient.AssertCalled(t, "ListExecutions", ctx, execListRequest) } func TestGetExecutionFunc(t *testing.T) { ctx := context.Background() getExecutionSetup() - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) execGetRequest := &admin.WorkflowExecutionGetRequest{ Id: &core.WorkflowExecutionIdentifier{ Project: projectValue, @@ -173,37 +160,39 @@ func TestGetExecutionFunc(t *testing.T) { }, } args := []string{executionNameValue} - mockClient.OnGetExecutionMatch(ctx, execGetRequest).Return(executionResponse, nil) - err := getExecutionFunc(ctx, args, cmdCtx) - assert.Nil(t, err) - mockClient.AssertCalled(t, "GetExecution", ctx, execGetRequest) + s := setup() + //executionList := &admin.ExecutionList{ + // Executions: []*admin.Execution{executionResponse}, + //} + s.MockAdminClient.OnGetExecutionMatch(ctx, execGetRequest).Return(executionResponse, nil) + err := getExecutionFunc(s.Ctx, args, s.CmdCtx) + assert.Nil(t, err) + s.MockAdminClient.AssertCalled(t, "GetExecution", ctx, execGetRequest) } func TestGetExecutionFuncForDetails(t *testing.T) { - setup() + s := testutils.SetupWithExt() getExecutionSetup() - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockClient = u.MockClient - mockFetcherExt := u.FetcherExt + ctx := s.Ctx + mockCmdCtx := s.CmdCtx + mockFetcherExt := s.FetcherExt execution.DefaultConfig.Details = true args := []string{dummyExec} mockFetcherExt.OnFetchExecutionMatch(ctx, dummyExec, dummyProject, dummyDomain).Return(&admin.Execution{}, nil) mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nil, fmt.Errorf("unable to fetch details")) - err = getExecutionFunc(ctx, args, mockCmdCtx) + err := getExecutionFunc(ctx, args, mockCmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to fetch details"), err) } func TestGetExecutionFuncWithIOData(t *testing.T) { t.Run("successful inputs outputs", func(t *testing.T) { - setup() + s := testutils.SetupWithExt() getExecutionSetup() - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockClient = u.MockClient - mockFetcherExt := u.FetcherExt + ctx := s.Ctx + mockCmdCtx := s.CmdCtx + mockFetcherExt := s.FetcherExt execution.DefaultConfig.NodeID = nodeID args := []string{dummyExec} @@ -259,16 +248,15 @@ func TestGetExecutionFuncWithIOData(t *testing.T) { }, nil) mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(dataResp, nil) - err = getExecutionFunc(ctx, args, mockCmdCtx) + err := getExecutionFunc(ctx, args, mockCmdCtx) assert.Nil(t, err) }) t.Run("fetch data error from admin", func(t *testing.T) { - setup() + s := testutils.SetupWithExt() getExecutionSetup() - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockClient = u.MockClient - mockFetcherExt := u.FetcherExt + ctx := s.Ctx + mockCmdCtx := s.CmdCtx + mockFetcherExt := s.FetcherExt execution.DefaultConfig.NodeID = nodeID args := []string{dummyExec} @@ -285,7 +273,7 @@ func TestGetExecutionFuncWithIOData(t *testing.T) { }, nil) mockFetcherExt.OnFetchNodeExecutionDataMatch(ctx, mock.Anything, dummyExec, dummyProject, dummyDomain).Return(nil, fmt.Errorf("error in fetching data")) - err = getExecutionFunc(ctx, args, mockCmdCtx) + err := getExecutionFunc(ctx, args, mockCmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error in fetching data"), err) }) @@ -304,13 +292,13 @@ func TestGetExecutionFuncWithIOData(t *testing.T) { args := []string{dummyExec} for _, tt := range tests { - setup() + s := testutils.SetupWithExt() config.GetConfig().Output = tt.outputFormat execution.DefaultConfig.NodeID = tt.nodeID - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockFetcherExt := u.FetcherExt + ctx := s.Ctx + mockCmdCtx := s.CmdCtx + mockFetcherExt := s.FetcherExt nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} nodeExec1 := createDummyNodeWithID("n0", false) @@ -377,16 +365,6 @@ func TestGetExecutionFuncWithIOData(t *testing.T) { func TestGetExecutionFuncWithError(t *testing.T) { ctx := context.Background() getExecutionSetup() - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) - execGetRequest := &admin.WorkflowExecutionGetRequest{ - Id: &core.WorkflowExecutionIdentifier{ - Project: projectValue, - Domain: domainValue, - Name: executionNameValue, - }, - } _ = &admin.Execution{ Id: &core.WorkflowExecutionIdentifier{ Project: projectValue, @@ -413,9 +391,10 @@ func TestGetExecutionFuncWithError(t *testing.T) { } args := []string{executionNameValue} - mockClient.OnGetExecutionMatch(ctx, execGetRequest).Return(nil, errors.New("execution NotFound")) - err := getExecutionFunc(ctx, args, cmdCtx) + s := testutils.SetupWithExt() + s.FetcherExt.OnFetchExecutionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("execution NotFound")) + err := getExecutionFunc(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, err, errors.New("execution NotFound")) - mockClient.AssertCalled(t, "GetExecution", ctx, execGetRequest) + s.FetcherExt.AssertCalled(t, "FetchExecution", ctx, "e124", "dummyProject", "dummyDomain") } diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index e92d7c1261..e4a1aec40d 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -1,15 +1,11 @@ package get import ( - "context" "fmt" "sort" "testing" - cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/stretchr/testify/assert" ) @@ -23,12 +19,6 @@ const workflowNameValue = "wf_name" const workflowVersionValue = "wf_version" const testDataFolder = "../testdata/" -var ( - err error - ctx context.Context - mockClient *mocks.AdminServiceClient - cmdCtx cmdCore.CommandContext -) var setup = testutils.Setup var tearDownAndVerify = testutils.TearDownAndVerify diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index a36cd2ec77..3831631f87 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -5,14 +5,14 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/printer" "github.com/flyteorg/flytectl/pkg/filters" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -35,10 +35,7 @@ var ( ) func getLaunchPlanSetup() { - ctx = u.Ctx - mockClient = u.MockClient // TODO: migrate to new command context from testutils - cmdCtx = cmdCore.NewCommandContext(mockClient, u.MockOutStream) argsLp = []string{"launchplan1"} parameterMap := map[string]*core.Parameter{ "numbers": { @@ -196,158 +193,168 @@ func getLaunchPlanSetup() { func TestGetLaunchPlanFuncWithError(t *testing.T) { t.Run("failure fetch latest", func(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) launchplan.DefaultConfig.Latest = true launchplan.DefaultConfig.Filter = filters.Filters{} mockFetcher.OnFetchLPLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) - _, err = FetchLPForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + _, err := FetchLPForName(s.Ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) t.Run("failure fetching version ", func(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) launchplan.DefaultConfig.Version = "v1" launchplan.DefaultConfig.Filter = filters.Filters{} mockFetcher.OnFetchLPVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching version")) - _, err = FetchLPForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + _, err := FetchLPForName(s.Ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) t.Run("failure fetching all version ", func(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() launchplan.DefaultConfig.Filter = filters.Filters{} launchplan.DefaultConfig.Filter = filters.Filters{} mockFetcher := new(mocks.AdminFetcherExtInterface) mockFetcher.OnFetchAllVerOfLPMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) - _, err = FetchLPForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + _, err := FetchLPForName(s.Ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) t.Run("failure fetching ", func(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() - mockClient.OnListLaunchPlansMatch(ctx, resourceGetRequest).Return(nil, fmt.Errorf("error fetching all version")) - mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(nil, fmt.Errorf("error fetching lanuch plan")) - mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(nil, fmt.Errorf("error listing lanuch plan ids")) - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + s.FetcherExt.OnFetchAllVerOfLP(s.Ctx, "launchplan1", "dummyProject", "dummyDomain", filters.Filters{}).Return(nil, fmt.Errorf("error fetching all version")) + s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceGetRequest).Return(nil, fmt.Errorf("error fetching all version")) + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(nil, fmt.Errorf("error fetching lanuch plan")) + s.MockAdminClient.OnListLaunchPlanIdsMatch(s.Ctx, namedIDRequest).Return(nil, fmt.Errorf("error listing lanuch plan ids")) + err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.NotNil(t, err) }) t.Run("failure fetching list", func(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() argsLp = []string{} - mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(nil, fmt.Errorf("error fetching all version")) - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + s.FetcherExt.OnFetchAllVerOfLP(s.Ctx, "", "dummyProject", "dummyDomain", filters.Filters{}).Return(nil, fmt.Errorf("error fetching all version")) + s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceListRequest).Return(nil, fmt.Errorf("error fetching all version")) + err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.NotNil(t, err) }) } func TestGetLaunchPlanFunc(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() - mockClient.OnListLaunchPlansMatch(ctx, resourceGetRequest).Return(launchPlanListResponse, nil) - mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) - mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceGetRequest).Return(launchPlanListResponse, nil) + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(launchPlan2, nil) + s.MockAdminClient.OnListLaunchPlanIdsMatch(s.Ctx, namedIDRequest).Return(namedIdentifierList, nil) + s.FetcherExt.OnFetchAllVerOfLP(s.Ctx, "launchplan1", "dummyProject", "dummyDomain", filters.Filters{}).Return(launchPlanListResponse.LaunchPlans, nil) + err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceGetRequest) - tearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + s.MockAdminClient.AssertCalled(t, "ListLaunchPlans", s.Ctx, resourceGetRequest) + tearDownAndVerify(t, s.Writer, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetLaunchPlanFuncLatest(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() launchplan.DefaultConfig.Latest = true launchplan.DefaultConfig.Filter = filters.Filters{} - mockClient.OnListLaunchPlansMatch(ctx, resourceGetRequest).Return(launchPlanListResponse, nil) - mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceGetRequest).Return(launchPlanListResponse, nil) + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(launchPlan2, nil) + err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceGetRequest) - tearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + s.MockAdminClient.AssertCalled(t, "ListLaunchPlans", s.Ctx, resourceGetRequest) + tearDownAndVerify(t, s.Writer, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlanWithVersion(t *testing.T) { - setup() + s := testutils.SetupWithExt() getLaunchPlanSetup() launchplan.DefaultConfig.Version = "v2" - mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) - mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) - mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceListRequest).Return(launchPlanListResponse, nil) + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(launchPlan2, nil) + s.MockAdminClient.OnListLaunchPlanIdsMatch(s.Ctx, namedIDRequest).Return(namedIdentifierList, nil) + s.FetcherExt.OnFetchLPVersion(s.Ctx, "launchplan1", "v2", "dummyProject", "dummyDomain").Return(launchPlan2, nil) + err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "GetLaunchPlan", ctx, objectGetRequest) - tearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + s.FetcherExt.AssertCalled(t, "FetchLPVersion", s.Ctx, "launchplan1", "v2", "dummyProject", "dummyDomain") + tearDownAndVerify(t, s.Writer, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlans(t *testing.T) { t.Run("no workflow filter", func(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() - mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) + s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceListRequest).Return(launchPlanListResponse, nil) + s.FetcherExt.OnFetchAllVerOfLP(s.Ctx, "", "dummyProject", "dummyDomain", filters.Filters{}).Return(launchPlanListResponse.LaunchPlans, nil) argsLp = []string{} - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + tearDownAndVerify(t, s.Writer, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) }) t.Run("workflow filter", func(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() resourceListRequest.Filters = "eq(workflow.name,workflow2)" - mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(filteredLaunchPlanListResponse, nil) + s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceListRequest).Return(filteredLaunchPlanListResponse, nil) + s.FetcherExt.OnFetchAllVerOfLP(s.Ctx, "", "dummyProject", "dummyDomain", filters.Filters{ + FieldSelector: "workflow.name=workflow2", + }).Return(launchPlanListResponse.LaunchPlans, nil) argsLp = []string{} launchplan.DefaultConfig.Workflow = "workflow2" - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + tearDownAndVerify(t, s.Writer, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) }) t.Run("workflow filter error", func(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() argsLp = []string{} launchplan.DefaultConfig.Workflow = "workflow2" launchplan.DefaultConfig.Filter.FieldSelector = "workflow.name" - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("fieldSelector cannot be specified with workflow flag"), err) }) } func TestGetLaunchPlansWithExecFile(t *testing.T) { - setup() + s := testutils.SetupWithExt() getLaunchPlanSetup() - mockClient.OnListLaunchPlansMatch(ctx, resourceListRequest).Return(launchPlanListResponse, nil) - mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) - mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) + s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceListRequest).Return(launchPlanListResponse, nil) + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(launchPlan2, nil) + s.MockAdminClient.OnListLaunchPlanIdsMatch(s.Ctx, namedIDRequest).Return(namedIdentifierList, nil) + s.FetcherExt.OnFetchLPVersion(s.Ctx, "launchplan1", "v2", "dummyProject", "dummyDomain").Return(launchPlan2, nil) launchplan.DefaultConfig.Version = "v2" launchplan.DefaultConfig.ExecFile = testDataFolder + "exec_file" - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) os.Remove(launchplan.DefaultConfig.ExecFile) assert.Nil(t, err) - mockClient.AssertCalled(t, "GetLaunchPlan", ctx, objectGetRequest) - tearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + s.FetcherExt.AssertCalled(t, "FetchLPVersion", s.Ctx, "launchplan1", "v2", "dummyProject", "dummyDomain") + tearDownAndVerify(t, s.Writer, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlanTableFunc(t *testing.T) { - setup() + s := testutils.SetupWithExt() getLaunchPlanSetup() - mockClient.OnListLaunchPlansMatch(ctx, resourceGetRequest).Return(launchPlanListResponse, nil) - mockClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan2, nil) - mockClient.OnListLaunchPlanIdsMatch(ctx, namedIDRequest).Return(namedIdentifierList, nil) + s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceGetRequest).Return(launchPlanListResponse, nil) + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(launchPlan2, nil) + s.MockAdminClient.OnListLaunchPlanIdsMatch(s.Ctx, namedIDRequest).Return(namedIdentifierList, nil) + s.FetcherExt.OnFetchAllVerOfLP(s.Ctx, "launchplan1", "dummyProject", "dummyDomain", filters.Filters{}).Return(launchPlanListResponse.LaunchPlans, nil) config.GetConfig().Output = printer.OutputFormatTABLE.String() - err = getLaunchPlanFunc(ctx, argsLp, cmdCtx) + err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListLaunchPlans", ctx, resourceGetRequest) - tearDownAndVerify(t, ` + s.FetcherExt.AssertCalled(t, "FetchAllVerOfLP", s.Ctx, "launchplan1", "dummyProject", "dummyDomain", filters.Filters{}) + tearDownAndVerify(t, s.Writer, ` --------- ------------- ------ ------- ---------- --------------------------- --------- | VERSION | NAME | TYPE | STATE | SCHEDULE | INPUTS | OUTPUTS | --------- ------------- ------ ------- ---------- --------------------------- --------- diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go index 9991e3688d..82fba0a6c8 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go @@ -5,9 +5,10 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -15,9 +16,6 @@ import ( ) func getClusterResourceAttributeSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient clusterresourceattribute.DefaultFetchConfig = &clusterresourceattribute.AttrFetchConfig{} // Clean up the temp directory. _ = os.Remove(testDataTempFile) @@ -51,88 +49,82 @@ func TestGetClusterResourceAttributes(t *testing.T) { }, } t.Run("successful get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getClusterResourceAttributeSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getClusterResourceAttributes(ctx, args, cmdCtx) + err := getClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","attributes":{"foo":"bar"}}`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","attributes":{"foo":"bar"}}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getClusterResourceAttributeSetup() clusterresourceattribute.DefaultFetchConfig.AttrFile = testDataTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getClusterResourceAttributes(ctx, args, cmdCtx) + err := getClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, `wrote the config to file temp-output-file`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getClusterResourceAttributeSetup() clusterresourceattribute.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getClusterResourceAttributes(ctx, args, cmdCtx) + err := getClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getClusterResourceAttributeSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getClusterResourceAttributes(ctx, args, cmdCtx) + err := getClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getClusterResourceAttributeSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(workflowResp, nil) - err = getClusterResourceAttributes(ctx, args, cmdCtx) + err := getClusterResourceAttributes(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","attributes":{"foo":"bar"}}`) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","attributes":{"foo":"bar"}}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getClusterResourceAttributeSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getClusterResourceAttributes(ctx, args, cmdCtx) + err := getClusterResourceAttributes(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/get/matchable_execution_cluster_label_test.go b/flytectl/cmd/get/matchable_execution_cluster_label_test.go index b49aab9d8b..d3aff8d6a5 100644 --- a/flytectl/cmd/get/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/get/matchable_execution_cluster_label_test.go @@ -5,9 +5,10 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -15,9 +16,6 @@ import ( ) func getExecutionClusterLabelSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient executionclusterlabel.DefaultFetchConfig = &executionclusterlabel.AttrFetchConfig{} // Clean up the temp directory. _ = os.Remove(testDataTempFile) @@ -51,88 +49,82 @@ func TestGetExecutionClusterLabel(t *testing.T) { }, } t.Run("successful get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionClusterLabelSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getExecutionClusterLabel(ctx, args, cmdCtx) + err := getExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","value":"foo"}`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","value":"foo"}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionClusterLabelSetup() executionclusterlabel.DefaultFetchConfig.AttrFile = testDataTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getExecutionClusterLabel(ctx, args, cmdCtx) + err := getExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, `wrote the config to file temp-output-file`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionClusterLabelSetup() executionclusterlabel.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getExecutionClusterLabel(ctx, args, cmdCtx) + err := getExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("failed to get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionClusterLabelSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getExecutionClusterLabel(ctx, args, cmdCtx) + err := getExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionClusterLabelSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(workflowResp, nil) - err = getExecutionClusterLabel(ctx, args, cmdCtx) + err := getExecutionClusterLabel(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","value":"foo"}`) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","value":"foo"}`) }) t.Run("failed to get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionClusterLabelSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getExecutionClusterLabel(ctx, args, cmdCtx) + err := getExecutionClusterLabel(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute_test.go b/flytectl/cmd/get/matchable_execution_queue_attribute_test.go index 92bf156d95..521ee8e522 100644 --- a/flytectl/cmd/get/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/get/matchable_execution_queue_attribute_test.go @@ -5,9 +5,10 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -15,9 +16,6 @@ import ( ) func getExecutionQueueAttributeSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient executionqueueattribute.DefaultFetchConfig = &executionqueueattribute.AttrFetchConfig{} // Clean up the temp directory. _ = os.Remove(testDataTempFile) @@ -51,88 +49,82 @@ func TestGetExecutionQueueAttributes(t *testing.T) { }, } t.Run("successful get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionQueueAttributeSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getExecutionQueueAttributes(ctx, args, cmdCtx) + err := getExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","tags":["foo","bar"]}`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","tags":["foo","bar"]}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionQueueAttributeSetup() executionqueueattribute.DefaultFetchConfig.AttrFile = testDataTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getExecutionQueueAttributes(ctx, args, cmdCtx) + err := getExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, `wrote the config to file temp-output-file`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionQueueAttributeSetup() executionqueueattribute.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getExecutionQueueAttributes(ctx, args, cmdCtx) + err := getExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionQueueAttributeSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getExecutionQueueAttributes(ctx, args, cmdCtx) + err := getExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionQueueAttributeSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(workflowResp, nil) - err = getExecutionQueueAttributes(ctx, args, cmdCtx) + err := getExecutionQueueAttributes(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","tags":["foo","bar"]}`) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","tags":["foo","bar"]}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getExecutionQueueAttributeSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getExecutionQueueAttributes(ctx, args, cmdCtx) + err := getExecutionQueueAttributes(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/get/matchable_plugin_override_test.go b/flytectl/cmd/get/matchable_plugin_override_test.go index b72ab6524e..16ec913754 100644 --- a/flytectl/cmd/get/matchable_plugin_override_test.go +++ b/flytectl/cmd/get/matchable_plugin_override_test.go @@ -5,9 +5,10 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/cmd/config" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -15,9 +16,6 @@ import ( ) func getPluginOverrideSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient pluginoverride.DefaultFetchConfig = &pluginoverride.AttrFetchConfig{} // Clean up the temp directory. _ = os.Remove(testDataTempFile) @@ -63,86 +61,80 @@ func TestGetPluginOverride(t *testing.T) { }, } t.Run("successful get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getPluginOverrideSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getPluginOverridesFunc(ctx, args, cmdCtx) + err := getPluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","overrides":[{"task_type":"python_task","plugin_id":["plugin-override1","plugin-override2"]},{"task_type":"java_task","plugin_id":["plugin-override3","plugin-override3"],"missing_plugin_behavior":1}]}`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","overrides":[{"task_type":"python_task","plugin_id":["plugin-override1","plugin-override2"]},{"task_type":"java_task","plugin_id":["plugin-override3","plugin-override3"],"missing_plugin_behavior":1}]}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getPluginOverrideSetup() pluginoverride.DefaultFetchConfig.AttrFile = testDataTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getPluginOverridesFunc(ctx, args, cmdCtx) + err := getPluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, `wrote the config to file temp-output-file`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getPluginOverrideSetup() pluginoverride.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getPluginOverridesFunc(ctx, args, cmdCtx) + err := getPluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getPluginOverrideSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getPluginOverridesFunc(ctx, args, cmdCtx) + err := getPluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getPluginOverrideSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(workflowResp, nil) - err = getPluginOverridesFunc(ctx, args, cmdCtx) + err := getPluginOverridesFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","overrides":[{"task_type":"python_task","plugin_id":["plugin-override1","plugin-override2"]},{"task_type":"java_task","plugin_id":["plugin-override3","plugin-override3"],"missing_plugin_behavior":1}]}`) + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","overrides":[{"task_type":"python_task","plugin_id":["plugin-override1","plugin-override2"]},{"task_type":"java_task","plugin_id":["plugin-override3","plugin-override3"],"missing_plugin_behavior":1}]}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getPluginOverrideSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getPluginOverridesFunc(ctx, args, cmdCtx) + err := getPluginOverridesFunc(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_PLUGIN_OVERRIDE) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/get/matchable_task_resource_attribute_test.go b/flytectl/cmd/get/matchable_task_resource_attribute_test.go index 6df5479859..021f02ea7f 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute_test.go @@ -5,9 +5,10 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -15,9 +16,6 @@ import ( ) func getTaskResourceAttributeSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient taskresourceattribute.DefaultFetchConfig = &taskresourceattribute.AttrFetchConfig{} // Clean up the temp directory. _ = os.Remove(testDataTempFile) @@ -58,88 +56,82 @@ func TestGetTaskResourceAttributes(t *testing.T) { }, } t.Run("successful get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getTaskResourceAttributeSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getTaskResourceAttributes(ctx, args, cmdCtx) + err := getTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getTaskResourceAttributeSetup() taskresourceattribute.DefaultFetchConfig.AttrFile = testDataTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getTaskResourceAttributes(ctx, args, cmdCtx) + err := getTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `wrote the config to file temp-output-file`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getTaskResourceAttributeSetup() taskresourceattribute.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getTaskResourceAttributes(ctx, args, cmdCtx) + err := getTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getTaskResourceAttributeSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getTaskResourceAttributes(ctx, args, cmdCtx) + err := getTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getTaskResourceAttributeSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(workflowResp, nil) - err = getTaskResourceAttributes(ctx, args, cmdCtx) + err := getTaskResourceAttributes(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getTaskResourceAttributeSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getTaskResourceAttributes(ctx, args, cmdCtx) + err := getTaskResourceAttributes(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/get/matchable_workflow_execution_config_test.go b/flytectl/cmd/get/matchable_workflow_execution_config_test.go index c3c97829a6..e477bb3158 100644 --- a/flytectl/cmd/get/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/get/matchable_workflow_execution_config_test.go @@ -5,9 +5,10 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -15,9 +16,6 @@ import ( ) func getWorkflowExecutionConfigSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient workflowexecutionconfig.DefaultFetchConfig = &workflowexecutionconfig.AttrFetchConfig{} // Clean up the temp directory. _ = os.Remove(testDataTempFile) @@ -51,88 +49,82 @@ func TestGetWorkflowExecutionConfig(t *testing.T) { }, } t.Run("successful get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getWorkflowExecutionConfigSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + err := getWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","max_parallelism":5}`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","max_parallelism":5}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getWorkflowExecutionConfigSetup() workflowexecutionconfig.DefaultFetchConfig.AttrFile = testDataTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + err := getWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, `wrote the config to file temp-output-file`) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getWorkflowExecutionConfigSetup() workflowexecutionconfig.DefaultFetchConfig.AttrFile = testDataNotExistentTempFile // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(projectDomainResp, nil) - err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + err := getWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getWorkflowExecutionConfigSetup() // No args implying project domain attribute deletion - u.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + err := getWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, ``) + s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getWorkflowExecutionConfigSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(workflowResp, nil) - err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + err := getWorkflowExecutionConfigFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","max_parallelism":5}`) + tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","max_parallelism":5}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { - var args []string - setup() + s := testutils.SetupWithExt() getWorkflowExecutionConfigSetup() - args = []string{"workflow"} - u.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + args := []string{"workflow"} + s.FetcherExt.OnFetchWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to fetch response")) - err = getWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + err := getWorkflowExecutionConfigFunc(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to fetch response"), err) - u.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", - ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", + s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", + s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/get/node_execution_test.go b/flytectl/cmd/get/node_execution_test.go index 05d5c2372f..1958f6a5c6 100644 --- a/flytectl/cmd/get/node_execution_test.go +++ b/flytectl/cmd/get/node_execution_test.go @@ -5,7 +5,8 @@ import ( "testing" "time" - u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/event" @@ -159,10 +160,10 @@ func createDummyTaskExecutionForNode(nodeID string, taskID string) *admin.TaskEx func TestGetExecutionDetails(t *testing.T) { t.Run("successful get details default view", func(t *testing.T) { - setup() - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockFetcherExt := u.FetcherExt + s := testutils.SetupWithExt() + ctx := s.Ctx + mockCmdCtx := s.CmdCtx + mockFetcherExt := s.FetcherExt nodeExecStart := createDummyNodeWithID("start-node", false) nodeExecN2 := createDummyNodeWithID("n2", true) @@ -225,10 +226,10 @@ func TestGetExecutionDetails(t *testing.T) { }) t.Run("successful get details default view for node-id", func(t *testing.T) { - setup() - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockFetcherExt := u.FetcherExt + s := testutils.SetupWithExt() + ctx := s.Ctx + mockCmdCtx := s.CmdCtx + mockFetcherExt := s.FetcherExt nodeExec1 := createDummyNodeWithID("n0", false) taskExec1 := createDummyTaskExecutionForNode("n0", "task21") @@ -288,10 +289,10 @@ func TestGetExecutionDetails(t *testing.T) { }) t.Run("failure task exec fetch", func(t *testing.T) { - setup() - ctx := u.Ctx - mockCmdCtx := u.CmdCtx - mockFetcherExt := u.FetcherExt + s := testutils.SetupWithExt() + ctx := s.Ctx + mockCmdCtx := s.CmdCtx + mockFetcherExt := s.FetcherExt nodeExecToTaskExec := map[string]*admin.TaskExecutionList{} nodeExec1 := createDummyNodeWithID("n0", false) @@ -307,7 +308,7 @@ func TestGetExecutionDetails(t *testing.T) { mockFetcherExt.OnFetchNodeExecutionDetailsMatch(ctx, dummyExec, dummyProject, dummyDomain, "").Return(nodeExecList, nil) mockFetcherExt.OnFetchTaskExecutionsOnNodeMatch(ctx, "n0", dummyExec, dummyProject, dummyDomain).Return(nil, fmt.Errorf("unable to fetch task exec details")) - _, err = getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, "", mockCmdCtx) + _, err := getExecutionDetails(ctx, dummyProject, dummyDomain, dummyExec, "", mockCmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to fetch task exec details"), err) }) diff --git a/flytectl/cmd/get/project_test.go b/flytectl/cmd/get/project_test.go index 264aa35c1c..d2a3a1abe7 100644 --- a/flytectl/cmd/get/project_test.go +++ b/flytectl/cmd/get/project_test.go @@ -2,15 +2,13 @@ package get import ( "fmt" - "io" "testing" - cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) @@ -18,16 +16,11 @@ import ( var ( resourceListRequestProject *admin.ProjectListRequest projectListResponse *admin.Projects - argsProject []string + argsProject = []string{"flyteexample"} project1 *admin.Project ) func getProjectSetup() { - - mockOutStream := new(io.Writer) - cmdCtx = cmdCore.NewCommandContext(mockClient, *mockOutStream) - - argsProject = []string{"flyteexample"} resourceListRequestProject = &admin.ProjectListRequest{} project1 = &admin.Project{ @@ -60,40 +53,40 @@ func getProjectSetup() { } func TestListProjectFunc(t *testing.T) { - setup() + s := testutils.SetupWithExt() getProjectSetup() - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) - project.DefaultConfig.Filter = filters.Filters{} - mockClient.OnListProjectsMatch(ctx, resourceListRequestProject).Return(projectListResponse, nil) - err = getProjectsFunc(ctx, argsProject, cmdCtx) + s.MockAdminClient.OnListProjectsMatch(s.Ctx, resourceListRequestProject).Return(projectListResponse, nil) + s.FetcherExt.OnListProjects(s.Ctx, filters.Filters{}).Return(projectListResponse, nil) + err := getProjectsFunc(s.Ctx, argsProject, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListProjects", ctx, resourceListRequestProject) + s.FetcherExt.AssertCalled(t, "ListProjects", s.Ctx, filters.Filters{}) } func TestGetProjectFunc(t *testing.T) { - setup() + s := testutils.SetupWithExt() getProjectSetup() - argsProject = []string{} project.DefaultConfig.Filter = filters.Filters{} - mockClient.OnListProjectsMatch(ctx, resourceListRequestProject).Return(projectListResponse, nil) - err = getProjectsFunc(ctx, argsProject, cmdCtx) + s.MockAdminClient.OnListProjectsMatch(s.Ctx, resourceListRequestProject).Return(projectListResponse, nil) + s.FetcherExt.OnListProjects(s.Ctx, filters.Filters{}).Return(projectListResponse, nil) + err := getProjectsFunc(s.Ctx, argsProject, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListProjects", ctx, resourceListRequestProject) + s.FetcherExt.AssertCalled(t, "ListProjects", s.Ctx, filters.Filters{}) } func TestGetProjectFuncError(t *testing.T) { - setup() + s := testutils.SetupWithExt() getProjectSetup() project.DefaultConfig.Filter = filters.Filters{ FieldSelector: "hello=", } - mockClient.OnListProjectsMatch(ctx, resourceListRequestProject).Return(nil, fmt.Errorf("Please add a valid field selector")) - err = getProjectsFunc(ctx, argsProject, cmdCtx) + s.MockAdminClient.OnListProjectsMatch(s.Ctx, resourceListRequestProject).Return(nil, fmt.Errorf("Please add a valid field selector")) + s.FetcherExt.OnListProjects(s.Ctx, filters.Filters{ + FieldSelector: "hello=", + }).Return(nil, fmt.Errorf("Please add a valid field selector")) + err := getProjectsFunc(s.Ctx, argsProject, s.CmdCtx) assert.NotNil(t, err) } diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index 0133c20f46..28816e8a1c 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -5,14 +5,14 @@ import ( "os" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/cmd/config" taskConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/task" "github.com/flyteorg/flytectl/pkg/filters" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" @@ -37,10 +37,6 @@ var ( ) func getTaskSetup() { - ctx = u.Ctx - mockClient = u.MockClient - // TODO: migrate to new command context from testutils - cmdCtx = cmdCore.NewCommandContext(mockClient, u.MockOutStream) argsTask = []string{"task1"} sortedListLiteralType := core.Variable{ Type: &core.LiteralType{ @@ -179,73 +175,79 @@ func getTaskSetup() { func TestGetTaskFuncWithError(t *testing.T) { t.Run("failure fetch latest", func(t *testing.T) { - setup() + s := setup() getTaskSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) taskConfig.DefaultConfig.Latest = true taskConfig.DefaultConfig.Filter = filters.Filters{} mockFetcher.OnFetchTaskLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) - _, err = FetchTaskForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + _, err := FetchTaskForName(s.Ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) t.Run("failure fetching version ", func(t *testing.T) { - setup() + s := setup() getTaskSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) taskConfig.DefaultConfig.Version = "v1" taskConfig.DefaultConfig.Filter = filters.Filters{} mockFetcher.OnFetchTaskVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching version")) - _, err = FetchTaskForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + _, err := FetchTaskForName(s.Ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) t.Run("failure fetching all version ", func(t *testing.T) { - setup() + s := setup() getTaskSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) taskConfig.DefaultConfig.Filter = filters.Filters{} mockFetcher.OnFetchAllVerOfTaskMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) - _, err = FetchTaskForName(ctx, mockFetcher, "lpName", projectValue, domainValue) + _, err := FetchTaskForName(s.Ctx, mockFetcher, "lpName", projectValue, domainValue) assert.NotNil(t, err) }) t.Run("failure fetching ", func(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() - mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(nil, fmt.Errorf("error fetching all version")) - mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(nil, fmt.Errorf("error fetching task")) - mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(nil, fmt.Errorf("error listing task ids")) - err = getTaskFunc(ctx, argsTask, cmdCtx) + s.MockAdminClient.OnListTasksMatch(s.Ctx, resourceListRequestTask).Return(nil, fmt.Errorf("error fetching all version")) + s.MockAdminClient.OnGetTaskMatch(s.Ctx, objectGetRequestTask).Return(nil, fmt.Errorf("error fetching task")) + s.MockAdminClient.OnListTaskIdsMatch(s.Ctx, namedIDRequestTask).Return(nil, fmt.Errorf("error listing task ids")) + s.FetcherExt.OnFetchAllVerOfTaskMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) + err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.NotNil(t, err) }) t.Run("failure fetching list task", func(t *testing.T) { - setup() + s := setup() getLaunchPlanSetup() taskConfig.DefaultConfig.Filter = filters.Filters{} argsTask = []string{} - mockClient.OnListTasksMatch(ctx, resourceListTaskRequest).Return(nil, fmt.Errorf("error fetching all version")) - mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(nil, fmt.Errorf("error fetching task")) - mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(nil, fmt.Errorf("error listing task ids")) - err = getTaskFunc(ctx, argsTask, cmdCtx) + s.MockAdminClient.OnListTasksMatch(s.Ctx, resourceListTaskRequest).Return(nil, fmt.Errorf("error fetching all version")) + s.MockAdminClient.OnGetTaskMatch(s.Ctx, objectGetRequestTask).Return(nil, fmt.Errorf("error fetching task")) + s.MockAdminClient.OnListTaskIdsMatch(s.Ctx, namedIDRequestTask).Return(nil, fmt.Errorf("error listing task ids")) + s.FetcherExt.OnFetchAllVerOfTaskMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) + err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.NotNil(t, err) }) } func TestGetTaskFunc(t *testing.T) { - setup() + s := testutils.SetupWithExt() getTaskSetup() taskConfig.DefaultConfig.Filter = filters.Filters{} - mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) - mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) - err = getTaskFunc(ctx, argsTask, cmdCtx) + s.MockAdminClient.OnListTasksMatch(s.Ctx, resourceListRequestTask).Return(taskListResponse, nil) + s.MockAdminClient.OnGetTaskMatch(s.Ctx, objectGetRequestTask).Return(task2, nil) + s.FetcherExt.OnFetchAllVerOfTaskMatch(mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(taskListResponse.Tasks, nil) + err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListTasks", ctx, resourceListRequestTask) - tearDownAndVerify(t, `[ + s.FetcherExt.AssertCalled(t, "FetchAllVerOfTask", s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{}) + tearDownAndVerify(t, s.Writer, `[ { "id": { "name": "task1", @@ -320,16 +322,17 @@ func TestGetTaskFunc(t *testing.T) { } func TestGetTaskFuncWithTable(t *testing.T) { - setup() + s := testutils.SetupWithExt() getTaskSetup() taskConfig.DefaultConfig.Filter = filters.Filters{} - mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) - mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) + s.MockAdminClient.OnListTasksMatch(s.Ctx, resourceListRequestTask).Return(taskListResponse, nil) + s.MockAdminClient.OnGetTaskMatch(s.Ctx, objectGetRequestTask).Return(task2, nil) + s.FetcherExt.OnFetchAllVerOfTask(s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{}).Return(taskListResponse.Tasks, nil) config.GetConfig().Output = "table" - err = getTaskFunc(ctx, argsTask, cmdCtx) + err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListTasks", ctx, resourceListRequestTask) - tearDownAndVerify(t, ` + s.FetcherExt.AssertCalled(t, "FetchAllVerOfTask", s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{}) + tearDownAndVerify(t, s.Writer, ` --------- ------- ------ --------------------------- --------- -------------- ------------------- ---------------------- | VERSION | NAME | TYPE | INPUTS | OUTPUTS | DISCOVERABLE | DISCOVERY VERSION | CREATED AT | --------- ------- ------ --------------------------- --------- -------------- ------------------- ---------------------- @@ -343,17 +346,18 @@ func TestGetTaskFuncWithTable(t *testing.T) { } func TestGetTaskFuncLatest(t *testing.T) { - setup() + s := testutils.SetupWithExt() getTaskSetup() taskConfig.DefaultConfig.Filter = filters.Filters{} - mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) - mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) - mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) + s.MockAdminClient.OnListTasksMatch(s.Ctx, resourceListRequestTask).Return(taskListResponse, nil) + s.MockAdminClient.OnGetTaskMatch(s.Ctx, objectGetRequestTask).Return(task2, nil) + s.MockAdminClient.OnListTaskIdsMatch(s.Ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) + s.FetcherExt.OnFetchTaskLatestVersion(s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{}).Return(task2, nil) taskConfig.DefaultConfig.Latest = true - err = getTaskFunc(ctx, argsTask, cmdCtx) + err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "ListTasks", ctx, resourceListRequestTask) - tearDownAndVerify(t, `{ + s.FetcherExt.AssertCalled(t, "FetchTaskLatestVersion", s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{}) + tearDownAndVerify(t, s.Writer, `{ "id": { "name": "task1", "version": "v2" @@ -391,18 +395,19 @@ func TestGetTaskFuncLatest(t *testing.T) { } func TestGetTaskWithVersion(t *testing.T) { - setup() + s := testutils.SetupWithExt() getTaskSetup() taskConfig.DefaultConfig.Filter = filters.Filters{} - mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) - mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) - mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) + s.MockAdminClient.OnListTasksMatch(s.Ctx, resourceListRequestTask).Return(taskListResponse, nil) + s.MockAdminClient.OnGetTaskMatch(s.Ctx, objectGetRequestTask).Return(task2, nil) + s.MockAdminClient.OnListTaskIdsMatch(s.Ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) + s.FetcherExt.OnFetchTaskVersion(s.Ctx, "task1", "v2", "dummyProject", "dummyDomain").Return(task2, nil) taskConfig.DefaultConfig.Version = "v2" objectGetRequestTask.Id.ResourceType = core.ResourceType_TASK - err = getTaskFunc(ctx, argsTask, cmdCtx) + err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "GetTask", ctx, objectGetRequestTask) - tearDownAndVerify(t, `{ + s.FetcherExt.AssertCalled(t, "FetchTaskVersion", s.Ctx, "task1", "v2", "dummyProject", "dummyDomain") + tearDownAndVerify(t, s.Writer, `{ "id": { "name": "task1", "version": "v2" @@ -440,41 +445,47 @@ func TestGetTaskWithVersion(t *testing.T) { } func TestGetTasks(t *testing.T) { - setup() + s := testutils.SetupWithExt() getTaskSetup() taskConfig.DefaultConfig.Filter = filters.Filters{} - mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) - mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) - err = getTaskFunc(ctx, argsTask, cmdCtx) + s.MockAdminClient.OnListTasksMatch(s.Ctx, resourceListRequestTask).Return(taskListResponse, nil) + s.MockAdminClient.OnGetTaskMatch(s.Ctx, objectGetRequestTask).Return(task2, nil) + s.FetcherExt.OnFetchAllVerOfTask(s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{}).Return(taskListResponse.Tasks, nil) + + err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `[{"id": {"name": "task1","version": "v2"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + tearDownAndVerify(t, s.Writer, `[{"id": {"name": "task1","version": "v2"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetTasksFilters(t *testing.T) { - setup() + s := testutils.SetupWithExt() getTaskSetup() taskConfig.DefaultConfig.Filter = filters.Filters{ FieldSelector: "task.name=task1,task.version=v1", } - mockClient.OnListTasksMatch(ctx, resourceListFilterRequestTask).Return(taskListFilterResponse, nil) - err = getTaskFunc(ctx, argsTask, cmdCtx) + s.MockAdminClient.OnListTasksMatch(s.Ctx, resourceListFilterRequestTask).Return(taskListFilterResponse, nil) + s.FetcherExt.OnFetchAllVerOfTask(s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{ + FieldSelector: "task.name=task1,task.version=v1", + }).Return(taskListResponse.Tasks, nil) + err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}`) + tearDownAndVerify(t, s.Writer, `{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}`) } func TestGetTaskWithExecFile(t *testing.T) { - setup() + s := testutils.SetupWithExt() getTaskSetup() - mockClient.OnListTasksMatch(ctx, resourceListRequestTask).Return(taskListResponse, nil) - mockClient.OnGetTaskMatch(ctx, objectGetRequestTask).Return(task2, nil) - mockClient.OnListTaskIdsMatch(ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) + s.MockAdminClient.OnListTasksMatch(s.Ctx, resourceListRequestTask).Return(taskListResponse, nil) + s.MockAdminClient.OnGetTaskMatch(s.Ctx, objectGetRequestTask).Return(task2, nil) + s.MockAdminClient.OnListTaskIdsMatch(s.Ctx, namedIDRequestTask).Return(namedIdentifierListTask, nil) + s.FetcherExt.OnFetchTaskVersion(s.Ctx, "task1", "v2", "dummyProject", "dummyDomain").Return(task2, nil) taskConfig.DefaultConfig.Version = "v2" taskConfig.DefaultConfig.ExecFile = testDataFolder + "task_exec_file" - err = getTaskFunc(ctx, argsTask, cmdCtx) + err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) os.Remove(taskConfig.DefaultConfig.ExecFile) assert.Nil(t, err) - mockClient.AssertCalled(t, "GetTask", ctx, objectGetRequestTask) - tearDownAndVerify(t, `{ + s.FetcherExt.AssertCalled(t, "FetchTaskVersion", s.Ctx, "task1", "v2", "dummyProject", "dummyDomain") + tearDownAndVerify(t, s.Writer, `{ "id": { "name": "task1", "version": "v2" diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go index 46ad846cdd..d0b50007ca 100644 --- a/flytectl/cmd/get/workflow_test.go +++ b/flytectl/cmd/get/workflow_test.go @@ -4,6 +4,8 @@ import ( "fmt" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/pkg/filters" "github.com/flyteorg/flytectl/pkg/printer" @@ -17,7 +19,6 @@ import ( "github.com/stretchr/testify/mock" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" - u "github.com/flyteorg/flytectl/cmd/testutils" ) var ( @@ -29,9 +30,6 @@ var ( ) func getWorkflowSetup() { - ctx = u.Ctx - mockClient = u.MockClient - cmdCtx = u.CmdCtx resourceListRequestWorkflow = &admin.ResourceListRequest{ Id: &admin.NamedEntityIdentifier{ Project: projectValue, @@ -110,59 +108,59 @@ func getWorkflowSetup() { func TestGetWorkflowFuncWithError(t *testing.T) { t.Run("failure fetch latest", func(t *testing.T) { - setup() + s := setup() getWorkflowSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) workflow.DefaultConfig.Latest = true mockFetcher.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) - _, _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) + _, _, err := FetchWorkflowForName(s.Ctx, mockFetcher, "workflowName", projectValue, domainValue) assert.NotNil(t, err) }) t.Run("failure fetching version ", func(t *testing.T) { - setup() + s := setup() getWorkflowSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) workflow.DefaultConfig.Version = "v1" mockFetcher.OnFetchWorkflowVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching version")) - _, _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) + _, _, err := FetchWorkflowForName(s.Ctx, mockFetcher, "workflowName", projectValue, domainValue) assert.NotNil(t, err) }) t.Run("failure fetching all version ", func(t *testing.T) { - setup() + s := setup() getWorkflowSetup() mockFetcher := new(mocks.AdminFetcherExtInterface) mockFetcher.OnFetchAllVerOfWorkflowMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching all version")) - _, _, err = FetchWorkflowForName(ctx, mockFetcher, "workflowName", projectValue, domainValue) + _, _, err := FetchWorkflowForName(s.Ctx, mockFetcher, "workflowName", projectValue, domainValue) assert.NotNil(t, err) }) t.Run("failure fetching ", func(t *testing.T) { - setup() + s := testutils.SetupWithExt() getWorkflowSetup() workflow.DefaultConfig.Latest = true args := []string{"workflowName"} - u.FetcherExt.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, + s.FetcherExt.OnFetchWorkflowLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching latest version")) - err = getWorkflowFunc(ctx, args, cmdCtx) + err := getWorkflowFunc(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) }) } func TestGetWorkflowFuncLatestWithTable(t *testing.T) { - setup() + s := testutils.SetupWithExt() getWorkflowSetup() workflow.DefaultConfig.Latest = true workflow.DefaultConfig.Filter = filters.Filters{} config.GetConfig().Output = printer.OutputFormatTABLE.String() - u.FetcherExt.OnFetchWorkflowLatestVersionMatch(ctx, "workflow1", projectValue, domainValue, filters.Filters{}).Return(workflow1, nil) - err = getWorkflowFunc(ctx, argsWf, cmdCtx) + s.FetcherExt.OnFetchWorkflowLatestVersionMatch(s.Ctx, "workflow1", projectValue, domainValue, filters.Filters{}).Return(workflow1, nil) + err := getWorkflowFunc(s.Ctx, argsWf, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ` + tearDownAndVerify(t, s.Writer, ` --------- ----------- --------------------------- --------- ---------------------- | VERSION | NAME | INPUTS | OUTPUTS | CREATED AT | --------- ----------- --------------------------- --------- ---------------------- @@ -173,14 +171,14 @@ func TestGetWorkflowFuncLatestWithTable(t *testing.T) { } func TestListWorkflowFuncWithTable(t *testing.T) { - setup() + s := testutils.SetupWithExt() getWorkflowSetup() workflow.DefaultConfig.Filter = filters.Filters{} config.GetConfig().Output = printer.OutputFormatTABLE.String() - u.FetcherExt.OnFetchAllVerOfWorkflowMatch(ctx, "workflow1", projectValue, domainValue, filters.Filters{}).Return(workflows, nil) - err = getWorkflowFunc(ctx, argsWf, cmdCtx) + s.FetcherExt.OnFetchAllVerOfWorkflowMatch(s.Ctx, "workflow1", projectValue, domainValue, filters.Filters{}).Return(workflows, nil) + err := getWorkflowFunc(s.Ctx, argsWf, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, ` + tearDownAndVerify(t, s.Writer, ` --------- ----------- ---------------------- | VERSION | NAME | CREATED AT | --------- ----------- ---------------------- diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index 8d1434294e..eb3feff8ec 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -4,6 +4,8 @@ import ( "context" "fmt" + "github.com/flyteorg/flytectl/cmd/config" + "github.com/flyteorg/flytestdlib/logger" "github.com/google/go-github/v42/github" @@ -54,8 +56,8 @@ func registerExamplesFunc(ctx context.Context, args []string, cmdCtx cmdCore.Com args := []string{ *v.BrowserDownloadURL, } - if err := Register(ctx, args, cmdCtx); err != nil { - return fmt.Errorf("Example %v failed to register %v", v.Name, err) + if err := Register(ctx, args, config.GetConfig(), cmdCtx); err != nil { + return fmt.Errorf("example %v failed to register %v", v.Name, err) } } return nil diff --git a/flytectl/cmd/register/examples_test.go b/flytectl/cmd/register/examples_test.go index f405d44284..fc3996f185 100644 --- a/flytectl/cmd/register/examples_test.go +++ b/flytectl/cmd/register/examples_test.go @@ -7,19 +7,18 @@ import ( ) func TestRegisterExamplesFunc(t *testing.T) { - setup() + s := setup() registerFilesSetup() - args = []string{""} - err := registerExamplesFunc(ctx, args, cmdCtx) + args := []string{""} + err := registerExamplesFunc(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) } func TestRegisterExamplesFuncErr(t *testing.T) { - setup() + s := setup() registerFilesSetup() flytesnacks = "testingsnacks" - args = []string{""} - - err := registerExamplesFunc(ctx, args, cmdCtx) + args := []string{""} + err := registerExamplesFunc(s.Ctx, args, s.CmdCtx) // TODO (Yuvraj) make test to success after fixing flytesnacks bug assert.NotNil(t, err) flytesnacks = "flytesnacks" diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index c66ceddf7a..18f43c40c0 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -5,7 +5,10 @@ import ( "encoding/json" "fmt" "os" - "path/filepath" + + "github.com/flyteorg/flytectl/cmd/config" + + "github.com/flyteorg/flytestdlib/storage" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -106,10 +109,10 @@ Usage ) func registerFromFilesFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - return Register(ctx, args, cmdCtx) + return Register(ctx, args, config.GetConfig(), cmdCtx) } -func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { +func Register(ctx context.Context, args []string, cfg *config.Config, cmdCtx cmdCore.CommandContext) error { var regErr error var dataRefs []string @@ -125,7 +128,7 @@ func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) logger.Infof(ctx, "Parsing file... Total(%v)", len(dataRefs)) // It will segregate serialize output files in valid proto,Invalid files if have any and source code(In case of fast serialize input files) - sourceCode, validProto, InvalidFiles := segregateSourceAndProtos(dataRefs) + sourceCodePath, validProto, InvalidFiles := segregateSourceAndProtos(dataRefs) // If any invalid files provide in input then through an error if len(InvalidFiles) > 0 { @@ -133,20 +136,22 @@ func Register(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) } // In case of fast serialize input upload source code to destination bucket - var sourceCodeName string - if len(sourceCode) > 0 { + var uploadLocation storage.DataReference + if len(sourceCodePath) > 0 { logger.Infof(ctx, "Fast Registration detected") - _, sourceCodeName = filepath.Split(sourceCode) - if err = uploadFastRegisterArtifact(ctx, sourceCode, sourceCodeName, rconfig.DefaultFilesConfig.Version, &rconfig.DefaultFilesConfig.SourceUploadPath); err != nil { - return fmt.Errorf("please check your Storage Config. It failed while uploading the source code. %v", err) + uploadLocation, err = uploadFastRegisterArtifact(ctx, cfg.Project, cfg.Domain, sourceCodePath, rconfig.DefaultFilesConfig.Version, + cmdCtx.ClientSet().DataProxyClient(), rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath) + if err != nil { + return fmt.Errorf("failed to upload source code from [%v]. Error: %w", sourceCodePath, err) } - logger.Infof(ctx, "Source code successfully uploaded %v/%v ", rconfig.DefaultFilesConfig.SourceUploadPath, sourceCodeName) + + logger.Infof(ctx, "Source code successfully uploaded to [%v]", uploadLocation) } var registerResults []Result fastFail := !rconfig.DefaultFilesConfig.ContinueOnError for i := 0; i < len(validProto) && !(fastFail && regErr != nil); i++ { - registerResults, regErr = registerFile(ctx, validProto[i], sourceCodeName, registerResults, cmdCtx, *rconfig.DefaultFilesConfig) + registerResults, regErr = registerFile(ctx, validProto[i], registerResults, cmdCtx, uploadLocation, *rconfig.DefaultFilesConfig) } payload, _ := json.Marshal(registerResults) diff --git a/flytectl/cmd/register/files_test.go b/flytectl/cmd/register/files_test.go index 744e9cef2c..ea167f2971 100644 --- a/flytectl/cmd/register/files_test.go +++ b/flytectl/cmd/register/files_test.go @@ -4,6 +4,10 @@ import ( "fmt" "testing" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytestdlib/contextutils" "github.com/flyteorg/flytestdlib/promutils/labeled" "github.com/flyteorg/flytestdlib/storage" @@ -20,161 +24,169 @@ const ( func TestRegisterFromFiles(t *testing.T) { t.Run("Valid registration", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"testdata/valid-parent-folder-register.tar"} - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) - err := registerFromFilesFunc(ctx, args, cmdCtx) + args := []string{"testdata/valid-parent-folder-register.tar"} + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + err := registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) }) t.Run("Valid fast registration", func(t *testing.T) { - setup() + s := setup() testScope := promutils.NewTestScope() labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output - rconfig.DefaultFilesConfig.SourceUploadPath = s3Output + rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath = s3Output mockStorage, err := storage.NewDataStore(&storage.Config{ Type: storage.TypeMemory, }, testScope.NewSubScope("flytectl")) assert.Nil(t, err) Client = mockStorage - args = []string{"testdata/flytesnacks-core.tgz"} - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + args := []string{"testdata/flytesnacks-core.tgz"} + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + + mockDataProxy := s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient) + mockDataProxy.OnCreateUploadLocationMatch(s.Ctx, mock.Anything).Return(&service.CreateUploadLocationResponse{}, nil) - err = registerFromFilesFunc(ctx, args, cmdCtx) + err = registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) }) t.Run("Failed fast registration while uploading the codebase", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() testScope := promutils.NewTestScope() labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) rconfig.DefaultFilesConfig.Archive = true rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output - s, err := storage.NewDataStore(&storage.Config{ + store, err := storage.NewDataStore(&storage.Config{ Type: storage.TypeMemory, }, testScope.NewSubScope("flytectl")) assert.Nil(t, err) - Client = s - args = []string{"testdata/flytesnacks-core.tgz"} - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) - err = Register(ctx, args, cmdCtx) + Client = store + args := []string{"testdata/flytesnacks-core.tgz"} + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(mock.Anything, mock.Anything).Return(&service.CreateUploadLocationResponse{}, nil) + err = Register(s.Ctx, args, config.GetConfig(), s.CmdCtx) assert.Nil(t, err) }) t.Run("Failed registration because of invalid files", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() testScope := promutils.NewTestScope() labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) rconfig.DefaultFilesConfig.Archive = true - rconfig.DefaultFilesConfig.SourceUploadPath = "" - s, err := storage.NewDataStore(&storage.Config{ + rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath = "" + store, err := storage.NewDataStore(&storage.Config{ Type: storage.TypeMemory, }, testScope.NewSubScope("flytectl")) - Client = s + Client = store assert.Nil(t, err) - args = []string{"testdata/invalid-fast.tgz"} - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) - err = registerFromFilesFunc(ctx, args, cmdCtx) + args := []string{"testdata/invalid-fast.tgz"} + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + err = registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) }) t.Run("Failure registration of fast serialize", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() testScope := promutils.NewTestScope() labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) rconfig.DefaultFilesConfig.Archive = true rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output - rconfig.DefaultFilesConfig.SourceUploadPath = s3Output - s, err := storage.NewDataStore(&storage.Config{ + rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath = s3Output + store, err := storage.NewDataStore(&storage.Config{ Type: storage.TypeMemory, }, testScope.NewSubScope("flytectl")) - Client = s + Client = store assert.Nil(t, err) - args = []string{"testdata/flytesnacks-core.tgz"} - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(1) - mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(1) - mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(1) - err = registerFromFilesFunc(ctx, args, cmdCtx) + args := []string{"testdata/flytesnacks-core.tgz"} + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(1) + s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(1) + s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(1) + s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(mock.Anything, mock.Anything).Return(&service.CreateUploadLocationResponse{}, nil) + err = registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed"), err) }) t.Run("Failure registration of fast serialize continue on error", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() testScope := promutils.NewTestScope() labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) rconfig.DefaultFilesConfig.Archive = true rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output - rconfig.DefaultFilesConfig.SourceUploadPath = s3Output + rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath = s3Output rconfig.DefaultFilesConfig.ContinueOnError = true - s, err := storage.NewDataStore(&storage.Config{ + store, err := storage.NewDataStore(&storage.Config{ Type: storage.TypeMemory, }, testScope.NewSubScope("flytectl")) - Client = s + Client = store assert.Nil(t, err) - args = []string{"testdata/flytesnacks-core.tgz"} - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(39) - mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(21) - mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(24) - err = registerFromFilesFunc(ctx, args, cmdCtx) + args := []string{"testdata/flytesnacks-core.tgz"} + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(39) + s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(21) + s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")).Call.Times(24) + s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(mock.Anything, mock.Anything).Return(&service.CreateUploadLocationResponse{}, nil) + err = registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed"), err) }) t.Run("Valid registration of fast serialize", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() testScope := promutils.NewTestScope() labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) rconfig.DefaultFilesConfig.Archive = true rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output - rconfig.DefaultFilesConfig.SourceUploadPath = s3Output - s, err := storage.NewDataStore(&storage.Config{ + rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath = s3Output + store, err := storage.NewDataStore(&storage.Config{ Type: storage.TypeMemory, }, testScope.NewSubScope("flytectl")) - Client = s + Client = store assert.Nil(t, err) - args = []string{"testdata/flytesnacks-core.tgz"} - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) - err = registerFromFilesFunc(ctx, args, cmdCtx) + args := []string{"testdata/flytesnacks-core.tgz"} + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(mock.Anything, mock.Anything).Return(&service.CreateUploadLocationResponse{}, nil) + err = registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) }) t.Run("Registration with proto files ", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() testScope := promutils.NewTestScope() labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) rconfig.DefaultFilesConfig.Archive = false rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output - rconfig.DefaultFilesConfig.SourceUploadPath = "" - s, err := storage.NewDataStore(&storage.Config{ + rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath = "" + store, err := storage.NewDataStore(&storage.Config{ Type: storage.TypeMemory, }, testScope.NewSubScope("flytectl")) - Client = s + Client = store assert.Nil(t, err) - args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) - mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) - err = registerFromFilesFunc(ctx, args, cmdCtx) + args := []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(mock.Anything, mock.Anything).Return(&service.CreateUploadLocationResponse{}, nil) + err = registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) }) } diff --git a/flytectl/cmd/register/register_test.go b/flytectl/cmd/register/register_test.go index 871fc2523b..26a3186344 100644 --- a/flytectl/cmd/register/register_test.go +++ b/flytectl/cmd/register/register_test.go @@ -1,25 +1,17 @@ package register import ( - "context" "fmt" "net/http" "sort" "testing" - cmdCore "github.com/flyteorg/flytectl/cmd/core" u "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/stretchr/testify/assert" ) var ( - ctx context.Context - mockAdminClient *mocks.AdminServiceClient - cmdCtx cmdCore.CommandContext - args []string - GetDoFunc func(req *http.Request) (*http.Response, error) + GetDoFunc func(req *http.Request) (*http.Response, error) ) var setup = u.Setup diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index f81c438fec..1982417f16 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -4,7 +4,6 @@ import ( "archive/tar" "compress/gzip" "context" - "encoding/json" "errors" "fmt" "io" @@ -12,9 +11,15 @@ import ( "net/http" "os" "path/filepath" + "regexp" "sort" + "strconv" "strings" + errors2 "github.com/flyteorg/flytestdlib/errors" + + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + "github.com/flyteorg/flytectl/pkg/githubutil" "github.com/flyteorg/flytestdlib/contextutils" @@ -54,6 +59,12 @@ var supportedExtensions = []string{".tar", ".tgz", ".tar.gz"} // All supported extensions for gzip compress var validGzipExtensions = []string{".tgz", ".tar.gz"} +type SignedURLPatternMatcher = *regexp.Regexp + +var ( + SignedURLPattern SignedURLPatternMatcher = regexp.MustCompile(`https://((storage\.googleapis\.com/(?P[^/]+))|((?P[^\.]+)\.s3\.amazonaws\.com)|(.*\.blob\.core\.windows\.net/(?P[^/]+)))/(?P[^?]*)`) +) + type Result struct { Name string Status string @@ -81,21 +92,34 @@ var projectColumns = []printer.Column{ func unMarshalContents(ctx context.Context, fileContents []byte, fname string) (proto.Message, error) { workflowSpec := &admin.WorkflowSpec{} - if err := proto.Unmarshal(fileContents, workflowSpec); err == nil { + errCollection := errors2.ErrorCollection{} + err := proto.Unmarshal(fileContents, workflowSpec) + if err == nil { return workflowSpec, nil } + + errCollection.Append(fmt.Errorf("as a Workflow: %w", err)) + logger.Debugf(ctx, "Failed to unmarshal file %v for workflow type", fname) taskSpec := &admin.TaskSpec{} - if err := proto.Unmarshal(fileContents, taskSpec); err == nil { + err = proto.Unmarshal(fileContents, taskSpec) + if err == nil { return taskSpec, nil } - logger.Debugf(ctx, "Failed to unmarshal file %v for task type", fname) + + errCollection.Append(fmt.Errorf("as a Task: %w", err)) + + logger.Debugf(ctx, "Failed to unmarshal file %v for task type", fname) launchPlan := &admin.LaunchPlan{} - if err := proto.Unmarshal(fileContents, launchPlan); err == nil { + err = proto.Unmarshal(fileContents, launchPlan) + if err == nil { return launchPlan, nil } + + errCollection.Append(fmt.Errorf("as a Launchplan: %w", err)) + logger.Debugf(ctx, "Failed to unmarshal file %v for launch plan type", fname) - return nil, fmt.Errorf("failed unmarshalling file %v", fname) + return nil, fmt.Errorf("failed unmarshalling file %v. Errors: %w", fname, errCollection.ErrorOrDefault()) } @@ -221,15 +245,11 @@ func hydrateIdentifier(identifier *core.Identifier, version string, force bool) } } -func hydrateTaskSpec(task *admin.TaskSpec, sourceCode, sourceUploadPath, version, destinationDir string) error { +func hydrateTaskSpec(task *admin.TaskSpec, sourceUploadedLocation storage.DataReference, destinationDir string) error { if task.Template.GetContainer() != nil { for k := range task.Template.GetContainer().Args { if task.Template.GetContainer().Args[k] == registrationRemotePackagePattern { - remotePath, err := getRemoteStoragePath(context.Background(), Client, sourceUploadPath, sourceCode, version) - if err != nil { - return err - } - task.Template.GetContainer().Args[k] = string(remotePath) + task.Template.GetContainer().Args[k] = sourceUploadedLocation.String() } if task.Template.GetContainer().Args[k] == registrationDestDirPattern { task.Template.GetContainer().Args[k] = "." @@ -247,11 +267,7 @@ func hydrateTaskSpec(task *admin.TaskSpec, sourceCode, sourceUploadPath, version for containerIdx, container := range podSpec.Containers { for argIdx, arg := range container.Args { if arg == registrationRemotePackagePattern { - remotePath, err := getRemoteStoragePath(context.Background(), Client, sourceUploadPath, sourceCode, version) - if err != nil { - return err - } - podSpec.Containers[containerIdx].Args[argIdx] = string(remotePath) + podSpec.Containers[containerIdx].Args[argIdx] = sourceUploadedLocation.String() } if arg == registrationDestDirPattern { podSpec.Containers[containerIdx].Args[argIdx] = "." @@ -392,7 +408,7 @@ func validateSpec(ctx context.Context, message proto.Message, cmdCtx cmdCore.Com return nil } -func hydrateSpec(message proto.Message, sourceCode string, config rconfig.FilesConfig) error { +func hydrateSpec(message proto.Message, uploadLocation storage.DataReference, config rconfig.FilesConfig) error { switch v := message.(type) { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) @@ -421,7 +437,7 @@ func hydrateSpec(message proto.Message, sourceCode string, config rconfig.FilesC taskSpec := message.(*admin.TaskSpec) hydrateIdentifier(taskSpec.Template.Id, config.Version, config.Force) // In case of fast serialize input proto also have on additional variable to substitute i.e destination bucket for source code - if err := hydrateTaskSpec(taskSpec, sourceCode, config.SourceUploadPath, config.Version, config.DestinationDirectory); err != nil { + if err := hydrateTaskSpec(taskSpec, uploadLocation, config.DestinationDirectory); err != nil { return err } @@ -456,8 +472,18 @@ func getSerializeOutputFiles(ctx context.Context, args []string, archive bool) ( * generated otherwise the registration can fail if the dependent files are not registered earlier. */ - sort.Strings(args) - return args, "", nil + finalList := make([]string, 0, len(args)) + for _, arg := range args { + matches, err := filepath.Glob(arg) + if err != nil { + return nil, "", fmt.Errorf("failed to glob [%v]. Error: %w", arg, err) + } + + finalList = append(finalList, matches...) + } + + sort.Strings(finalList) + return finalList, "", nil } tempDir, err := ioutil.TempDir("/tmp", "register") @@ -523,7 +549,9 @@ func readAndCopyArchive(src io.Reader, tempDir string, unarchivedFiles []string) } } -func registerFile(ctx context.Context, fileName, sourceCode string, registerResults []Result, cmdCtx cmdCore.CommandContext, config rconfig.FilesConfig) ([]Result, error) { +func registerFile(ctx context.Context, fileName string, registerResults []Result, + cmdCtx cmdCore.CommandContext, uploadLocation storage.DataReference, config rconfig.FilesConfig) ([]Result, error) { + var registerResult Result var fileContents []byte var err error @@ -539,7 +567,7 @@ func registerFile(ctx context.Context, fileName, sourceCode string, registerResu return registerResults, err } - if err := hydrateSpec(spec, sourceCode, config); err != nil { + if err := hydrateSpec(spec, uploadLocation, config); err != nil { registerResult = Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error hydrating spec due to %v", err)} registerResults = append(registerResults, registerResult) return registerResults, err @@ -642,44 +670,124 @@ func getAllExample(repository, version string) ([]*github.ReleaseAsset, *github. func getRemoteStoragePath(ctx context.Context, s *storage.DataStore, remoteLocation, file, identifier string) (storage.DataReference, error) { remotePath, err := s.ConstructReference(ctx, storage.DataReference(remoteLocation), fmt.Sprintf("%v-%v", identifier, file)) if err != nil { - return storage.DataReference(""), err + return "", err } + return remotePath, nil } -func uploadFastRegisterArtifact(ctx context.Context, file, sourceCodeName, version string, sourceUploadPath *string) error { +func getTotalSize(reader io.Reader) (size int64, err error) { + page := make([]byte, 512) + size = 0 + + n := 0 + for n, err = reader.Read(page); n > 0 && err == nil; n, err = reader.Read(page) { + size += int64(n) + } + + if err == io.EOF { + return size + int64(n), nil + } + + return size, err +} + +func uploadFastRegisterArtifact(ctx context.Context, project, domain, sourceCodeFilePath, version string, + dataProxyClient service.DataProxyServiceClient, deprecatedSourceUploadPath string) (uploadLocation storage.DataReference, err error) { + + fileHandle, err := os.Open(sourceCodeFilePath) + if err != nil { + return "", err + } + + dataRefReaderCloser, err := gzip.NewReader(fileHandle) + if err != nil { + return "", err + } + + size, err := getTotalSize(dataRefReaderCloser) + if err != nil { + return "", err + } + + _, err = fileHandle.Seek(0, 0) + if err != nil { + return "", err + } + + err = dataRefReaderCloser.Reset(fileHandle) + if err != nil { + return "", err + } + + remotePath := storage.DataReference(deprecatedSourceUploadPath) + _, fileName := filepath.Split(sourceCodeFilePath) + resp, err := dataProxyClient.CreateUploadLocation(ctx, &service.CreateUploadLocationRequest{ + Project: project, + Domain: domain, + Suffix: strings.Join([]string{version, fileName}, "/"), + }) + + if err != nil { + if status.Code(err) == codes.Unimplemented { + logger.Infof(ctx, "Using an older version of FlyteAdmin. Falling back to the configured storage client.") + } else { + return "", fmt.Errorf("failed to create an upload location. Error: %w", err) + } + } + + if resp != nil && len(resp.SignedUrl) > 0 { + return storage.DataReference(resp.NativeUrl), DirectUpload(resp.SignedUrl, size, dataRefReaderCloser) + } + dataStore, err := getStorageClient(ctx) if err != nil { - return err + return "", err } - var dataRefReaderCloser io.ReadCloser - remotePath := storage.DataReference(*sourceUploadPath) - if len(*sourceUploadPath) == 0 { + + if len(deprecatedSourceUploadPath) == 0 { remotePath, err = dataStore.ConstructReference(ctx, dataStore.GetBaseContainerFQN(ctx), "fast") if err != nil { - return err + return "", err } } - *sourceUploadPath = string(remotePath) - fullRemotePath, err := getRemoteStoragePath(ctx, dataStore, *sourceUploadPath, sourceCodeName, version) + + remotePath, err = getRemoteStoragePath(ctx, dataStore, remotePath.String(), fileName, version) if err != nil { - return err + return "", err } - raw, err := json.Marshal(file) - if err != nil { - return err + + if err := dataStore.ComposedProtobufStore.WriteRaw(ctx, remotePath, size, storage.Options{}, dataRefReaderCloser); err != nil { + return "", err } - dataRefReaderCloser, err = os.Open(file) + + return remotePath, nil +} + +func DirectUpload(url string, size int64, data io.Reader) error { + req, err := http.NewRequest(http.MethodPut, url, data) if err != nil { return err } - dataRefReaderCloser, err = gzip.NewReader(dataRefReaderCloser) + + req.ContentLength = size + req.Header.Set("Content-Length", strconv.FormatInt(size, 10)) + + client := &http.Client{} + res, err := client.Do(req) if err != nil { return err } - if err := dataStore.ComposedProtobufStore.WriteRaw(ctx, fullRemotePath, int64(len(raw)), storage.Options{}, dataRefReaderCloser); err != nil { - return err + + if res.StatusCode != http.StatusOK { + raw, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("received response code [%v]. Failed to read response body. Error: %w", res.StatusCode, err) + } + + return fmt.Errorf("bad status: %s : %s", res.Status, string(raw)) } + return nil } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 491c0c1f98..e9b4caae05 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -1,6 +1,7 @@ package register import ( + "bytes" "context" "errors" "fmt" @@ -11,6 +12,9 @@ import ( "strings" "testing" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + "github.com/flyteorg/flytestdlib/utils" v1 "k8s.io/api/core/v1" @@ -23,8 +27,6 @@ import ( "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -54,9 +56,6 @@ func registerFilesSetup() { GetDoFunc = func(*http.Request) (*http.Response, error) { return response, nil } - ctx = u.Ctx - mockAdminClient = u.MockClient - cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) rconfig.DefaultFilesConfig.AssumableIamRole = "" rconfig.DefaultFilesConfig.K8sServiceAccount = "" @@ -64,11 +63,11 @@ func registerFilesSetup() { } func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { - setup() + s := setup() registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"testdata/valid-parent-folder-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + args := []string{"testdata/valid-parent-folder-register.tar"} + fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -81,11 +80,11 @@ func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { } func TestGetSortedArchivedFileList(t *testing.T) { - setup() + s := setup() registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"testdata/valid-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + args := []string{"testdata/valid-register.tar"} + fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -98,11 +97,11 @@ func TestGetSortedArchivedFileList(t *testing.T) { } func TestGetSortedArchivedFileUnorderedList(t *testing.T) { - setup() + s := setup() registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"testdata/valid-unordered-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + args := []string{"testdata/valid-unordered-register.tar"} + fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -115,11 +114,11 @@ func TestGetSortedArchivedFileUnorderedList(t *testing.T) { } func TestGetSortedArchivedCorruptedFileList(t *testing.T) { - setup() + s := setup() registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"testdata/invalid.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + args := []string{"testdata/invalid.tar"} + fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 0) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -128,11 +127,11 @@ func TestGetSortedArchivedCorruptedFileList(t *testing.T) { } func TestGetSortedArchivedTgzList(t *testing.T) { - setup() + s := setup() registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"testdata/valid-register.tgz"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + args := []string{"testdata/valid-register.tgz"} + fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -145,10 +144,10 @@ func TestGetSortedArchivedTgzList(t *testing.T) { } func TestGetSortedArchivedCorruptedTgzFileList(t *testing.T) { - setup() + s := setup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"testdata/invalid.tgz"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + args := []string{"testdata/invalid.tgz"} + fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -157,11 +156,11 @@ func TestGetSortedArchivedCorruptedTgzFileList(t *testing.T) { } func TestGetSortedArchivedInvalidArchiveFileList(t *testing.T) { - setup() + s := setup() registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"testdata/invalid-extension-register.zip"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + args := []string{"testdata/invalid-extension-register.zip"} + fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -171,10 +170,10 @@ func TestGetSortedArchivedInvalidArchiveFileList(t *testing.T) { } func TestGetSortedArchivedFileThroughInvalidHttpList(t *testing.T) { - setup() + s := setup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"http://invalidhost:invalidport/testdata/valid-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + args := []string{"http://invalidhost:invalidport/testdata/valid-register.tar"} + fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -183,11 +182,11 @@ func TestGetSortedArchivedFileThroughInvalidHttpList(t *testing.T) { } func TestGetSortedArchivedFileThroughValidHttpList(t *testing.T) { - setup() + s := setup() registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"http://dummyhost:80/testdata/valid-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + args := []string{"http://dummyhost:80/testdata/valid-register.tar"} + fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -203,10 +202,10 @@ func TestGetSortedArchivedFileThroughValidHttpWithNullContextList(t *testing.T) setup() registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true - args = []string{"http://dummyhost:80/testdata/valid-register.tar"} - ctx = nil + args := []string{"http://dummyhost:80/testdata/valid-register.tar"} + var ctx context.Context = nil fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) - assert.Equal(t, len(fileList), 0) + assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) assert.Equal(t, errors.New("net/http: nil Context"), err) @@ -214,21 +213,28 @@ func TestGetSortedArchivedFileThroughValidHttpWithNullContextList(t *testing.T) assert.Nil(t, os.RemoveAll(tmpDir), "unable to delete temp dir %v", tmpDir) } +func Test_getTotalSize(t *testing.T) { + b := bytes.NewBufferString("hello world") + size, err := getTotalSize(b) + assert.NoError(t, err) + assert.Equal(t, int64(11), size) +} + func TestRegisterFile(t *testing.T) { t.Run("Successful run", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) - args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + args := []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) + results, err := registerFile(s.Ctx, args[0], registerResults, s.CmdCtx, "", *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Nil(t, err) }) t.Run("Failed Scheduled launch plan registration", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() - mockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) variableMap := map[string]*core.Variable{ "var1": { Type: &core.LiteralType{ @@ -270,58 +276,60 @@ func TestRegisterFile(t *testing.T) { }, }, } - mockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) - args = []string{"testdata/152_my_cron_scheduled_lp_3.pb"} + s.MockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) + s.FetcherExt.OnFetchWorkflowVersion(s.Ctx, "core.scheduled_workflows.lp_schedules.date_formatter_wf", "v0.3.59", "dummyProject", "dummyDomain").Return(wf, nil) + s.FetcherExt.OnFetchWorkflowVersion(s.Ctx, "core.scheduled_workflows.lp_schedules.date_formatter_wf", "", "dummyProject", "dummyDomain").Return(wf, nil) + args := []string{"testdata/152_my_cron_scheduled_lp_3.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) + results, err := registerFile(s.Ctx, args[0], registerResults, s.CmdCtx, "", *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) assert.Contains(t, results[0].Info, "param values are missing on scheduled workflow for the following params") assert.NotNil(t, err) }) t.Run("Non existent file", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() - args = []string{"testdata/non-existent.pb"} + args := []string{"testdata/non-existent.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) + results, err := registerFile(s.Ctx, args[0], registerResults, s.CmdCtx, "", *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) assert.Equal(t, "Error reading file due to open testdata/non-existent.pb: no such file or directory", results[0].Info) assert.NotNil(t, err) }) t.Run("unmarhal failure", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() - args = []string{"testdata/valid-register.tar"} + args := []string{"testdata/valid-register.tar"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) + results, err := registerFile(s.Ctx, args[0], registerResults, s.CmdCtx, "", *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) - assert.Equal(t, "Error unmarshalling file due to failed unmarshalling file testdata/valid-register.tar", results[0].Info) + assert.True(t, strings.HasPrefix(results[0].Info, "Error unmarshalling file due to failed unmarshalling file testdata/valid-register.tar")) assert.NotNil(t, err) }) t.Run("AlreadyExists", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, status.Error(codes.AlreadyExists, "AlreadyExists")) - args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} + args := []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) + results, err := registerFile(s.Ctx, args[0], registerResults, s.CmdCtx, "", *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Equal(t, "Success", results[0].Status) assert.Equal(t, "AlreadyExists", results[0].Info) assert.Nil(t, err) }) t.Run("Registration Error", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() - mockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, status.Error(codes.InvalidArgument, "Invalid")) - args = []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} + args := []string{"testdata/69_core.flyte_basics.lp.greet_1.pb"} var registerResults []Result - results, err := registerFile(ctx, args[0], "", registerResults, cmdCtx, *rconfig.DefaultFilesConfig) + results, err := registerFile(s.Ctx, args[0], registerResults, s.CmdCtx, "", *rconfig.DefaultFilesConfig) assert.Equal(t, 1, len(results)) assert.Equal(t, "Failed", results[0].Status) assert.Equal(t, "Error registering file due to rpc error: code = InvalidArgument desc = Invalid", results[0].Info) @@ -340,7 +348,6 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole"}, lpSpec.AuthRole) }) t.Run("k8sService account override", func(t *testing.T) { - setup() registerFilesSetup() rconfig.DefaultFilesConfig.K8sServiceAccount = "k8Account" lpSpec := &admin.LaunchPlanSpec{} @@ -349,7 +356,6 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { assert.Equal(t, &admin.AuthRole{KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) }) t.Run("Both k8sService and IamRole", func(t *testing.T) { - setup() registerFilesSetup() rconfig.DefaultFilesConfig.AssumableIamRole = "iamRole" rconfig.DefaultFilesConfig.K8sServiceAccount = "k8Account" @@ -360,7 +366,6 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) }) t.Run("Output prefix", func(t *testing.T) { - setup() registerFilesSetup() rconfig.DefaultFilesConfig.OutputLocationPrefix = "prefix" lpSpec := &admin.LaunchPlanSpec{} @@ -372,25 +377,37 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { func TestUploadFastRegisterArtifact(t *testing.T) { t.Run("Successful upload", func(t *testing.T) { + s := setup() testScope := promutils.NewTestScope() labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) - s, err := storage.NewDataStore(&storage.Config{ + store, err := storage.NewDataStore(&storage.Config{ Type: storage.TypeMemory, }, testScope.NewSubScope("flytectl")) assert.Nil(t, err) - Client = s - err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacks-core.tgz", "flytesnacks-core.tgz", "", &rconfig.DefaultFilesConfig.SourceUploadPath) + Client = store + s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(s.Ctx, &service.CreateUploadLocationRequest{ + Project: "flytesnacks", + Domain: "development", + Suffix: "/flytesnacks-core.tgz", + }).Return(&service.CreateUploadLocationResponse{}, nil) + _, err = uploadFastRegisterArtifact(s.Ctx, "flytesnacks", "development", "testdata/flytesnacks-core.tgz", "", s.MockClient.DataProxyClient(), rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath) assert.Nil(t, err) }) t.Run("Failed upload", func(t *testing.T) { + s := setup() testScope := promutils.NewTestScope() labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) - s, err := storage.NewDataStore(&storage.Config{ + store, err := storage.NewDataStore(&storage.Config{ Type: storage.TypeMemory, }, testScope.NewSubScope("flytectl")) assert.Nil(t, err) - Client = s - err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacks-core.tgz", "", "", &rconfig.DefaultFilesConfig.SourceUploadPath) + Client = store + s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(s.Ctx, &service.CreateUploadLocationRequest{ + Project: "flytesnacks", + Domain: "development", + Suffix: "/flytesnacks-core.tgz", + }).Return(&service.CreateUploadLocationResponse{}, nil) + _, err = uploadFastRegisterArtifact(context.Background(), "flytesnacks", "development", "testdata/flytesnacks-core.tgz", "", s.MockClient.DataProxyClient(), rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath) assert.Nil(t, err) }) t.Run("Failed upload", func(t *testing.T) { @@ -401,7 +418,7 @@ func TestUploadFastRegisterArtifact(t *testing.T) { }, testScope.NewSubScope("flytectl")) assert.Nil(t, err) Client = s - err = uploadFastRegisterArtifact(ctx, "testdata/flytesnacksre.tgz", "", "", &rconfig.DefaultFilesConfig.SourceUploadPath) + _, err = uploadFastRegisterArtifact(context.Background(), "flytesnacks", "development", "testdata/flytesnacksre.tgz", "", nil, rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath) assert.NotNil(t, err) }) } @@ -409,7 +426,7 @@ func TestUploadFastRegisterArtifact(t *testing.T) { func TestGetStorageClient(t *testing.T) { t.Run("Failed to create storage client", func(t *testing.T) { Client = nil - s, err := getStorageClient(ctx) + s, err := getStorageClient(context.Background()) assert.NotNil(t, err) assert.Nil(t, s) }) @@ -434,17 +451,16 @@ func TestGetAllFlytesnacksExample(t *testing.T) { func TestRegister(t *testing.T) { t.Run("Failed to register", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() node := &admin.NodeExecution{} - err := register(ctx, node, cmdCtx, rconfig.DefaultFilesConfig.DryRun) + err := register(s.Ctx, node, s.CmdCtx, rconfig.DefaultFilesConfig.DryRun) assert.NotNil(t, err) }) } func TestHydrateNode(t *testing.T) { t.Run("Failed hydrate node", func(t *testing.T) { - setup() registerFilesSetup() node := &core.Node{} err := hydrateNode(node, rconfig.DefaultFilesConfig.Version, true) @@ -452,7 +468,6 @@ func TestHydrateNode(t *testing.T) { }) t.Run("hydrateSpec with wrong type", func(t *testing.T) { - setup() registerFilesSetup() task := &admin.Task{} err := hydrateSpec(task, "", *rconfig.DefaultFilesConfig) @@ -503,13 +518,13 @@ func TestHydrateTaskSpec(t *testing.T) { }, }, } - err = hydrateTaskSpec(task, "sourcey", rconfig.DefaultFilesConfig.SourceUploadPath, rconfig.DefaultFilesConfig.Version, "") + err = hydrateTaskSpec(task, storage.DataReference("file://somewhere"), "sourcey") assert.NoError(t, err) var hydratedPodSpec = v1.PodSpec{} err = utils.UnmarshalStructToObj(task.Template.GetK8SPod().PodSpec, &hydratedPodSpec) assert.NoError(t, err) assert.Len(t, hydratedPodSpec.Containers[1].Args, 2) - assert.True(t, strings.HasSuffix(hydratedPodSpec.Containers[1].Args[1], "sourcey")) + assert.Contains(t, hydratedPodSpec.Containers[1].Args[1], "somewhere") } func TestLeftDiff(t *testing.T) { @@ -564,17 +579,20 @@ func TestLeftDiff(t *testing.T) { func TestValidateLaunchSpec(t *testing.T) { ctx := context.Background() t.Run("nil launchplan spec", func(t *testing.T) { + s := setup() registerFilesSetup() - err := validateLaunchSpec(ctx, nil, cmdCtx) + err := validateLaunchSpec(ctx, nil, s.CmdCtx) assert.Nil(t, err) }) t.Run("launchplan spec with nil workflow id", func(t *testing.T) { + s := setup() registerFilesSetup() lpSpec := &admin.LaunchPlanSpec{} - err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + err := validateLaunchSpec(ctx, lpSpec, s.CmdCtx) assert.Nil(t, err) }) t.Run("launchplan spec with empty metadata", func(t *testing.T) { + s := setup() registerFilesSetup() lpSpec := &admin.LaunchPlanSpec{ WorkflowId: &core.Identifier{ @@ -584,10 +602,11 @@ func TestValidateLaunchSpec(t *testing.T) { Version: "workflowVersionValue", }, } - err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + err := validateLaunchSpec(ctx, lpSpec, s.CmdCtx) assert.Nil(t, err) }) t.Run("launchplan spec with metadata and empty schedule", func(t *testing.T) { + s := setup() registerFilesSetup() lpSpec := &admin.LaunchPlanSpec{ WorkflowId: &core.Identifier{ @@ -598,14 +617,14 @@ func TestValidateLaunchSpec(t *testing.T) { }, EntityMetadata: &admin.LaunchPlanMetadata{}, } - err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + err := validateLaunchSpec(ctx, lpSpec, s.CmdCtx) assert.Nil(t, err) }) t.Run("validate spec failed to fetch workflow", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() - mockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + s.MockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) lpSpec := &admin.LaunchPlanSpec{ WorkflowId: &core.Identifier{ Project: "projectValue", @@ -622,15 +641,15 @@ func TestValidateLaunchSpec(t *testing.T) { lp := &admin.LaunchPlan{ Spec: lpSpec, } - err := validateSpec(ctx, lp, cmdCtx) + err := validateSpec(ctx, lp, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, "failed", err.Error()) }) t.Run("failed to fetch workflow", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() - mockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + s.MockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) lpSpec := &admin.LaunchPlanSpec{ WorkflowId: &core.Identifier{ Project: "projectValue", @@ -644,12 +663,12 @@ func TestValidateLaunchSpec(t *testing.T) { }, }, } - err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + err := validateLaunchSpec(ctx, lpSpec, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, "failed", err.Error()) }) t.Run("launchplan spec missing required param schedule", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() variableMap := map[string]*core.Variable{ "var1": { @@ -692,7 +711,7 @@ func TestValidateLaunchSpec(t *testing.T) { }, }, } - mockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) + s.MockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) lpSpec := &admin.LaunchPlanSpec{ WorkflowId: &core.Identifier{ Project: "projectValue", @@ -706,12 +725,12 @@ func TestValidateLaunchSpec(t *testing.T) { }, }, } - err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + err := validateLaunchSpec(ctx, lpSpec, s.CmdCtx) assert.NotNil(t, err) assert.Contains(t, err.Error(), "param values are missing on scheduled workflow for the following params") }) t.Run("launchplan spec non empty schedule required param success", func(t *testing.T) { - setup() + s := setup() registerFilesSetup() variableMap := map[string]*core.Variable{ "var1": { @@ -754,7 +773,7 @@ func TestValidateLaunchSpec(t *testing.T) { }, }, } - mockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) + s.MockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) lpSpec := &admin.LaunchPlanSpec{ WorkflowId: &core.Identifier{ Project: "projectValue", @@ -796,7 +815,7 @@ func TestValidateLaunchSpec(t *testing.T) { }, }, } - err := validateLaunchSpec(ctx, lpSpec, cmdCtx) + err := validateLaunchSpec(ctx, lpSpec, s.CmdCtx) assert.Nil(t, err) }) } diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index dba5b8f85a..ca08c94966 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -3,13 +3,8 @@ package cmd import ( "context" "fmt" - "os" - "github.com/flyteorg/flytectl/cmd/sandbox" - - f "github.com/flyteorg/flytectl/pkg/filesystemutils" - "github.com/flyteorg/flytectl/cmd/config" configuration "github.com/flyteorg/flytectl/cmd/configuration" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -17,9 +12,11 @@ import ( "github.com/flyteorg/flytectl/cmd/delete" "github.com/flyteorg/flytectl/cmd/get" "github.com/flyteorg/flytectl/cmd/register" + "github.com/flyteorg/flytectl/cmd/sandbox" "github.com/flyteorg/flytectl/cmd/update" "github.com/flyteorg/flytectl/cmd/upgrade" "github.com/flyteorg/flytectl/cmd/version" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/flyteorg/flytectl/pkg/printer" stdConfig "github.com/flyteorg/flytestdlib/config" "github.com/flyteorg/flytestdlib/config/viper" diff --git a/flytectl/cmd/sandbox/exec_test.go b/flytectl/cmd/sandbox/exec_test.go index 4aa0e2148a..8cd7059c19 100644 --- a/flytectl/cmd/sandbox/exec_test.go +++ b/flytectl/cmd/sandbox/exec_test.go @@ -8,6 +8,10 @@ import ( "strings" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + + admin2 "github.com/flyteorg/flyteidl/clients/go/admin" + cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/stretchr/testify/assert" @@ -21,7 +25,8 @@ func TestSandboxClusterExec(t *testing.T) { mockDocker := &mocks.Docker{} mockOutStream := new(io.Writer) ctx := context.Background() - cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + mockClient := admin2.InitializeMockClientset() + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) reader := bufio.NewReader(strings.NewReader("test")) mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ @@ -46,10 +51,9 @@ func TestSandboxClusterExec(t *testing.T) { func TestSandboxClusterExecWithoutCmd(t *testing.T) { mockDocker := &mocks.Docker{} - mockOutStream := new(io.Writer) - ctx := context.Background() - cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) reader := bufio.NewReader(strings.NewReader("test")) + s := testutils.Setup() + ctx := s.Ctx mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ { @@ -66,7 +70,7 @@ func TestSandboxClusterExecWithoutCmd(t *testing.T) { Reader: reader, }, fmt.Errorf("Test")) docker.Client = mockDocker - err := sandboxClusterExec(ctx, []string{}, cmdCtx) + err := sandboxClusterExec(ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) } diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 979e666788..7c373bb2ed 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -201,7 +201,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu fmt.Printf("%v Running Flyte %s release\n", emoji.Whale, version) } fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, sandboxImage) - if err := docker.PullDockerImage(ctx, cli, sandboxImage, sandboxConfig.DefaultConfig.ImagePullPolicy); err != nil { + if err := docker.PullDockerImage(ctx, cli, sandboxImage, sandboxConfig.DefaultConfig.ImagePullPolicy, sandboxConfig.DefaultConfig.ImagePullOptions); err != nil { return nil, err } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index a70e136334..ae938ab1e2 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -10,6 +10,8 @@ import ( "strings" "testing" + "github.com/flyteorg/flyteidl/clients/go/admin" + "github.com/flyteorg/flytectl/pkg/githubutil" "github.com/flyteorg/flytectl/pkg/k8s" @@ -511,7 +513,7 @@ func TestStartSandboxFunc(t *testing.T) { t.Run("Successfully run sandbox cluster command", func(t *testing.T) { mockOutStream := new(io.Writer) ctx := context.Background() - cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) mockDocker := &mocks.Docker{} errCh := make(chan error) client := testclient.NewSimpleClientset() @@ -561,7 +563,7 @@ func TestStartSandboxFunc(t *testing.T) { t.Run("Error in running sandbox cluster command", func(t *testing.T) { mockOutStream := new(io.Writer) ctx := context.Background() - cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) mockDocker := &mocks.Docker{} errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) diff --git a/flytectl/cmd/sandbox/status_test.go b/flytectl/cmd/sandbox/status_test.go index fa5fbf424a..e38cfb0271 100644 --- a/flytectl/cmd/sandbox/status_test.go +++ b/flytectl/cmd/sandbox/status_test.go @@ -1,12 +1,11 @@ package sandbox import ( - "context" - "io" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/docker/docker/api/types" - cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/docker/mocks" "github.com/stretchr/testify/assert" @@ -14,19 +13,16 @@ import ( func TestSandboxStatus(t *testing.T) { t.Run("Sandbox status with zero result", func(t *testing.T) { - ctx := context.Background() - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) mockDocker := &mocks.Docker{} - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + s := testutils.Setup() + mockDocker.OnContainerList(s.Ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) docker.Client = mockDocker - err := sandboxClusterStatus(ctx, []string{}, cmdCtx) + err := sandboxClusterStatus(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) }) t.Run("Sandbox status with running sandbox", func(t *testing.T) { - ctx := context.Background() - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + s := testutils.Setup() + ctx := s.Ctx mockDocker := &mocks.Docker{} mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ { @@ -37,7 +33,7 @@ func TestSandboxStatus(t *testing.T) { }, }, nil) docker.Client = mockDocker - err := sandboxClusterStatus(ctx, []string{}, cmdCtx) + err := sandboxClusterStatus(ctx, []string{}, s.CmdCtx) assert.Nil(t, err) }) } diff --git a/flytectl/cmd/sandbox/teardown_test.go b/flytectl/cmd/sandbox/teardown_test.go index 224c905ae1..d95b12221d 100644 --- a/flytectl/cmd/sandbox/teardown_test.go +++ b/flytectl/cmd/sandbox/teardown_test.go @@ -3,14 +3,13 @@ package sandbox import ( "context" "fmt" - "io" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/configutil" "github.com/flyteorg/flytectl/pkg/util" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/docker/docker/api/types" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/docker/mocks" @@ -52,13 +51,12 @@ func TestTearDownFunc(t *testing.T) { func TestTearDownClusterFunc(t *testing.T) { _ = util.SetupFlyteDir() _ = util.WriteIntoFile([]byte("data"), configutil.FlytectlConfig) - mockOutStream := new(io.Writer) - ctx := context.Background() - cmdCtx := cmdCore.NewCommandContext(nil, *mockOutStream) + s := testutils.Setup() + ctx := s.Ctx mockDocker := &mocks.Docker{} mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) docker.Client = mockDocker - err := teardownSandboxCluster(ctx, []string{}, cmdCtx) + err := teardownSandboxCluster(ctx, []string{}, s.CmdCtx) assert.Nil(t, err) } diff --git a/flytectl/cmd/testutils/test_utils.go b/flytectl/cmd/testutils/test_utils.go index c04be45a52..86577b1323 100644 --- a/flytectl/cmd/testutils/test_utils.go +++ b/flytectl/cmd/testutils/test_utils.go @@ -10,11 +10,15 @@ import ( "strings" "testing" + "github.com/flyteorg/flytectl/pkg/ext" + + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + + "github.com/flyteorg/flyteidl/clients/go/admin" + "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" extMocks "github.com/flyteorg/flytectl/pkg/ext/mocks" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/stretchr/testify/assert" ) @@ -22,51 +26,83 @@ const projectValue = "dummyProject" const domainValue = "dummyDomain" const output = "json" -var ( - reader *os.File - writer *os.File - Err error - Ctx context.Context - MockClient *mocks.AdminServiceClient - FetcherExt *extMocks.AdminFetcherExtInterface - UpdaterExt *extMocks.AdminUpdaterExtInterface - DeleterExt *extMocks.AdminDeleterExtInterface - MockOutStream io.Writer - CmdCtx cmdCore.CommandContext - stdOut *os.File - stderr *os.File -) +type TestStruct struct { + Reader *os.File + Writer *os.File + Err error + Ctx context.Context + MockClient *admin.Clientset + MockAdminClient *mocks.AdminServiceClient + FetcherExt *extMocks.AdminFetcherExtInterface + UpdaterExt *extMocks.AdminUpdaterExtInterface + DeleterExt *extMocks.AdminDeleterExtInterface + MockOutStream io.Writer + CmdCtx cmdCore.CommandContext + StdOut *os.File + Stderr *os.File +} -func Setup() { - Ctx = context.Background() - reader, writer, Err = os.Pipe() - if Err != nil { - panic(Err) +func Setup() (s TestStruct) { + s.Ctx = context.Background() + s.Reader, s.Writer, s.Err = os.Pipe() + if s.Err != nil { + panic(s.Err) + } + s.StdOut = os.Stdout + s.Stderr = os.Stderr + os.Stdout = s.Writer + os.Stderr = s.Writer + log.SetOutput(s.Writer) + s.MockClient = admin.InitializeMockClientset() + s.FetcherExt = new(extMocks.AdminFetcherExtInterface) + s.UpdaterExt = new(extMocks.AdminUpdaterExtInterface) + s.DeleterExt = new(extMocks.AdminDeleterExtInterface) + s.FetcherExt.OnAdminServiceClient().Return(s.MockClient.AdminClient()) + s.UpdaterExt.OnAdminServiceClient().Return(s.MockClient.AdminClient()) + s.DeleterExt.OnAdminServiceClient().Return(s.MockClient.AdminClient()) + s.MockAdminClient = s.MockClient.AdminClient().(*mocks.AdminServiceClient) + fetcher := &ext.AdminFetcherExtClient{ + AdminClient: s.MockAdminClient, } - stdOut = os.Stdout - stderr = os.Stderr - os.Stdout = writer - os.Stderr = writer - log.SetOutput(writer) - MockClient = new(mocks.AdminServiceClient) - FetcherExt = new(extMocks.AdminFetcherExtInterface) - UpdaterExt = new(extMocks.AdminUpdaterExtInterface) - DeleterExt = new(extMocks.AdminDeleterExtInterface) - FetcherExt.OnAdminServiceClient().Return(MockClient) - UpdaterExt.OnAdminServiceClient().Return(MockClient) - DeleterExt.OnAdminServiceClient().Return(MockClient) - MockOutStream = writer - CmdCtx = cmdCore.NewCommandContextWithExt(MockClient, FetcherExt, UpdaterExt, DeleterExt, MockOutStream) + s.MockOutStream = s.Writer + s.CmdCtx = cmdCore.NewCommandContextWithExt(s.MockClient, fetcher, s.UpdaterExt, s.DeleterExt, s.MockOutStream) config.GetConfig().Project = projectValue config.GetConfig().Domain = domainValue config.GetConfig().Output = output + + return s +} + +func SetupWithExt() (s TestStruct) { + s.Ctx = context.Background() + s.Reader, s.Writer, s.Err = os.Pipe() + if s.Err != nil { + panic(s.Err) + } + s.StdOut = os.Stdout + s.Stderr = os.Stderr + os.Stdout = s.Writer + os.Stderr = s.Writer + log.SetOutput(s.Writer) + s.MockClient = admin.InitializeMockClientset() + s.FetcherExt = new(extMocks.AdminFetcherExtInterface) + s.UpdaterExt = new(extMocks.AdminUpdaterExtInterface) + s.DeleterExt = new(extMocks.AdminDeleterExtInterface) + s.FetcherExt.OnAdminServiceClient().Return(s.MockClient.AdminClient()) + s.UpdaterExt.OnAdminServiceClient().Return(s.MockClient.AdminClient()) + s.DeleterExt.OnAdminServiceClient().Return(s.MockClient.AdminClient()) + s.MockAdminClient = s.MockClient.AdminClient().(*mocks.AdminServiceClient) + s.MockOutStream = s.Writer + s.CmdCtx = cmdCore.NewCommandContextWithExt(s.MockClient, s.FetcherExt, s.UpdaterExt, s.DeleterExt, s.MockOutStream) + config.GetConfig().Project = projectValue + config.GetConfig().Domain = domainValue + config.GetConfig().Output = output + + return s } // TearDownAndVerify TODO: Change this to verify log lines from context -func TearDownAndVerify(t *testing.T, expectedLog string) { - writer.Close() - os.Stdout = stdOut - os.Stderr = stderr +func TearDownAndVerify(t *testing.T, reader io.Reader, expectedLog string) { var buf bytes.Buffer if _, err := io.Copy(&buf, reader); err == nil { assert.Equal(t, sanitizeString(expectedLog), sanitizeString(buf.String())) diff --git a/flytectl/cmd/update/execution_test.go b/flytectl/cmd/update/execution_test.go index 2f7e5423ba..35ab591212 100644 --- a/flytectl/cmd/update/execution_test.go +++ b/flytectl/cmd/update/execution_test.go @@ -12,60 +12,50 @@ import ( "github.com/stretchr/testify/mock" ) -func UpdateExecutionSetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient -} - func TestExecutionUpdate(t *testing.T) { - testutils.Setup() - UpdateExecutionSetup() - args = []string{"execution1"} + s := testutils.Setup() + args := []string{"execution1"} // Activate execution.UConfig.Activate = true - mockClient.OnUpdateExecutionMatch(mock.Anything, mock.Anything).Return(&admin.ExecutionUpdateResponse{}, nil) - assert.Nil(t, updateExecutionFunc(ctx, args, cmdCtx)) + s.MockAdminClient.OnUpdateExecutionMatch(mock.Anything, mock.Anything).Return(&admin.ExecutionUpdateResponse{}, nil) + assert.Nil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) // Archive execution.UConfig.Activate = false execution.UConfig.Archive = true - assert.Nil(t, updateExecutionFunc(ctx, args, cmdCtx)) + assert.Nil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) // Reset execution.UConfig.Activate = false execution.UConfig.Archive = false // Dry run execution.UConfig.DryRun = true - assert.Nil(t, updateExecutionFunc(ctx, args, cmdCtx)) - mockClient.AssertNotCalled(t, "UpdateExecution", mock.Anything) + assert.Nil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) + s.MockAdminClient.AssertNotCalled(t, "UpdateExecution", mock.Anything) // Reset execution.UConfig.DryRun = false } func TestExecutionUpdateValidationFailure(t *testing.T) { - testutils.Setup() - UpdateExecutionSetup() - args = []string{"execution1"} + s := testutils.Setup() + args := []string{"execution1"} execution.UConfig.Activate = true execution.UConfig.Archive = true - assert.NotNil(t, updateExecutionFunc(ctx, args, cmdCtx)) + assert.NotNil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) // Reset execution.UConfig.Activate = false execution.UConfig.Archive = false } func TestExecutionUpdateFail(t *testing.T) { - testutils.Setup() - UpdateExecutionSetup() - args = []string{"execution1"} - mockClient.OnUpdateExecutionMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, updateExecutionFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + args := []string{"execution1"} + s.MockAdminClient.OnUpdateExecutionMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) } func TestExecutionUpdateInvalidArgs(t *testing.T) { - testutils.Setup() - UpdateExecutionSetup() - args = []string{} - assert.NotNil(t, updateExecutionFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + args := []string{} + assert.NotNil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) } diff --git a/flytectl/cmd/update/launch_plan_meta.go b/flytectl/cmd/update/launch_plan_meta.go index c3efa3b254..9efa37533e 100644 --- a/flytectl/cmd/update/launch_plan_meta.go +++ b/flytectl/cmd/update/launch_plan_meta.go @@ -32,18 +32,20 @@ Usage ` ) -func updateLPMetaFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - project := config.GetConfig().Project - domain := config.GetConfig().Domain - if len(args) != 1 { - return fmt.Errorf(clierrors.ErrLPNotPassed) +func getUpdateLPMetaFunc(namedEntityConfig *NamedEntityConfig) func(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + return func(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + project := config.GetConfig().Project + domain := config.GetConfig().Domain + if len(args) != 1 { + return fmt.Errorf(clierrors.ErrLPNotPassed) + } + name := args[0] + err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_LAUNCH_PLAN, cmdCtx) + if err != nil { + fmt.Printf(clierrors.ErrFailedLPUpdate, name, err) + return err + } + fmt.Printf("updated metadata successfully on %v", name) + return nil } - name := args[0] - err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_LAUNCH_PLAN, cmdCtx) - if err != nil { - fmt.Printf(clierrors.ErrFailedLPUpdate, name, err) - return err - } - fmt.Printf("updated metadata successfully on %v", name) - return nil } diff --git a/flytectl/cmd/update/launch_plan_meta_test.go b/flytectl/cmd/update/launch_plan_meta_test.go index 0427964fc6..f0119b9eb1 100644 --- a/flytectl/cmd/update/launch_plan_meta_test.go +++ b/flytectl/cmd/update/launch_plan_meta_test.go @@ -11,34 +11,25 @@ import ( "github.com/stretchr/testify/mock" ) -func UpdateLPMetaSetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient -} - func TestLPMetaUpdate(t *testing.T) { - testutils.Setup() - UpdateLPMetaSetup() - namedEntityConfig = &NamedEntityConfig{} - args = []string{"task1"} - mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) - assert.Nil(t, updateLPMetaFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + namedEntityConfig := &NamedEntityConfig{} + args := []string{"task1"} + s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) + assert.Nil(t, getUpdateLPMetaFunc(namedEntityConfig)(s.Ctx, args, s.CmdCtx)) } func TestLPMetaUpdateFail(t *testing.T) { - testutils.Setup() - UpdateLPMetaSetup() - namedEntityConfig = &NamedEntityConfig{} - args = []string{"task1"} - mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + namedEntityConfig := &NamedEntityConfig{} + args := []string{"task1"} + s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, getUpdateTaskFunc(namedEntityConfig)(s.Ctx, args, s.CmdCtx)) } func TestLPMetaUpdateInvalidArgs(t *testing.T) { - testutils.Setup() - UpdateLPMetaSetup() - namedEntityConfig = &NamedEntityConfig{} - args = []string{} - assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + namedEntityConfig := &NamedEntityConfig{} + args := []string{} + assert.NotNil(t, getUpdateTaskFunc(namedEntityConfig)(s.Ctx, args, s.CmdCtx)) } diff --git a/flytectl/cmd/update/launch_plan_test.go b/flytectl/cmd/update/launch_plan_test.go index 3ef074277b..0e5010c5cf 100644 --- a/flytectl/cmd/update/launch_plan_test.go +++ b/flytectl/cmd/update/launch_plan_test.go @@ -12,34 +12,25 @@ import ( "github.com/stretchr/testify/mock" ) -func UpdateLPSetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient -} - func TestLPUpdate(t *testing.T) { - testutils.Setup() - UpdateLPSetup() + s := testutils.Setup() launchplan.UConfig = &launchplan.UpdateConfig{Version: "v1", Archive: true} - args = []string{"lp1"} - mockClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(&admin.LaunchPlanUpdateResponse{}, nil) - assert.Nil(t, updateLPFunc(ctx, args, cmdCtx)) + args := []string{"lp1"} + s.MockAdminClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(&admin.LaunchPlanUpdateResponse{}, nil) + assert.Nil(t, updateLPFunc(s.Ctx, args, s.CmdCtx)) } func TestLPUpdateFail(t *testing.T) { - testutils.Setup() - UpdateLPSetup() + s := testutils.Setup() launchplan.UConfig = &launchplan.UpdateConfig{Version: "v1", Archive: true} - args = []string{"task1"} - mockClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, updateLPFunc(ctx, args, cmdCtx)) + args := []string{"task1"} + s.MockAdminClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, updateLPFunc(s.Ctx, args, s.CmdCtx)) } func TestLPUpdateInvalidArgs(t *testing.T) { - testutils.Setup() - UpdateLPSetup() + s := testutils.Setup() launchplan.UConfig = &launchplan.UpdateConfig{Version: "v1", Archive: true, Activate: true} - args = []string{} - assert.NotNil(t, updateLPFunc(ctx, args, cmdCtx)) + args := []string{} + assert.NotNil(t, updateLPFunc(s.Ctx, args, s.CmdCtx)) } diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go index d091125cdc..19c9257d69 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go @@ -5,90 +5,85 @@ import ( "testing" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" - u "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) func updateClusterResourceAttributeSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient clusterresourceattribute.DefaultUpdateConfig = &clusterresourceattribute.AttrUpdateConfig{} } func TestUpdateClusterResourceAttributes(t *testing.T) { t.Run("no input file for update", func(t *testing.T) { - setup() + s := setup() updateClusterResourceAttributeSetup() - err = updateClusterResourceAttributesFunc(ctx, args, cmdCtx) + err := updateClusterResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for cluster resource attribute"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successfully updated project domain attribute", func(t *testing.T) { - setup() + s := setup() updateClusterResourceAttributeSetup() clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_cluster_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updateClusterResourceAttributesFunc(ctx, args, cmdCtx) + err := updateClusterResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed to update project domain attribute", func(t *testing.T) { - setup() + s := setup() updateClusterResourceAttributeSetup() clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_cluster_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updateClusterResourceAttributesFunc(ctx, args, cmdCtx) + err := updateClusterResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successfully updated workflow attribute", func(t *testing.T) { - setup() + s := setup() updateClusterResourceAttributeSetup() clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_cluster_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) + err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed to update workflow attribute", func(t *testing.T) { - setup() + s := setup() updateClusterResourceAttributeSetup() clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_cluster_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) + err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("non existent file", func(t *testing.T) { - setup() + s := setup() updateClusterResourceAttributeSetup() clusterresourceattribute.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) + err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("invalid update file", func(t *testing.T) { - setup() + s := setup() updateClusterResourceAttributeSetup() clusterresourceattribute.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err = updateClusterResourceAttributesFunc(ctx, nil, cmdCtx) + err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/update/matchable_execution_cluster_label_test.go b/flytectl/cmd/update/matchable_execution_cluster_label_test.go index 0a84237cc0..500c082673 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label_test.go @@ -5,90 +5,85 @@ import ( "testing" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" - u "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) func updateExecutionClusterLabelSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient executionclusterlabel.DefaultUpdateConfig = &executionclusterlabel.AttrUpdateConfig{} } func TestExecutionClusterLabel(t *testing.T) { t.Run("no input file for update", func(t *testing.T) { - setup() + s := setup() updateExecutionClusterLabelSetup() - err = updateExecutionClusterLabelFunc(ctx, args, cmdCtx) + err := updateExecutionClusterLabelFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for execution cluster label"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful update project domain attribute", func(t *testing.T) { - setup() + s := setup() updateExecutionClusterLabelSetup() executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_cluster_label.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updateExecutionClusterLabelFunc(ctx, args, cmdCtx) + err := updateExecutionClusterLabelFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { - setup() + s := setup() updateExecutionClusterLabelSetup() executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_cluster_label.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updateExecutionClusterLabelFunc(ctx, args, cmdCtx) + err := updateExecutionClusterLabelFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful update workflow attribute", func(t *testing.T) { - setup() + s := setup() updateExecutionClusterLabelSetup() executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_cluster_label.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updateExecutionClusterLabelFunc(ctx, nil, cmdCtx) + err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { - setup() + s := setup() updateExecutionClusterLabelSetup() executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_cluster_label.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updateExecutionClusterLabelFunc(ctx, nil, cmdCtx) + err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("non existent file", func(t *testing.T) { - setup() + s := setup() updateExecutionClusterLabelSetup() executionclusterlabel.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err = updateExecutionClusterLabelFunc(ctx, nil, cmdCtx) + err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("invalid update file", func(t *testing.T) { - setup() + s := setup() updateExecutionClusterLabelSetup() executionclusterlabel.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err = updateExecutionClusterLabelFunc(ctx, nil, cmdCtx) + err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go index f0751b32da..4ba42eadc2 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go @@ -5,90 +5,85 @@ import ( "testing" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" - u "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) func updateExecutionQueueAttributeSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient executionqueueattribute.DefaultUpdateConfig = &executionqueueattribute.AttrUpdateConfig{} } func TestExecutionQueueAttributes(t *testing.T) { t.Run("no input file for update", func(t *testing.T) { - setup() + s := setup() updateExecutionQueueAttributeSetup() - err = updateExecutionQueueAttributesFunc(ctx, args, cmdCtx) + err := updateExecutionQueueAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for execution queue attribute"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful update project domain attribute", func(t *testing.T) { - setup() + s := setup() updateExecutionQueueAttributeSetup() executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_queue_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updateExecutionQueueAttributesFunc(ctx, args, cmdCtx) + err := updateExecutionQueueAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { - setup() + s := setup() updateExecutionQueueAttributeSetup() executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_queue_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updateExecutionQueueAttributesFunc(ctx, args, cmdCtx) + err := updateExecutionQueueAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful update workflow attribute", func(t *testing.T) { - setup() + s := setup() updateExecutionQueueAttributeSetup() executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_queue_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updateExecutionQueueAttributesFunc(ctx, nil, cmdCtx) + err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { - setup() + s := setup() updateExecutionQueueAttributeSetup() executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_queue_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updateExecutionQueueAttributesFunc(ctx, nil, cmdCtx) + err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("non existent file", func(t *testing.T) { - setup() + s := setup() updateExecutionQueueAttributeSetup() executionqueueattribute.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err = updateExecutionQueueAttributesFunc(ctx, nil, cmdCtx) + err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("invalid update file", func(t *testing.T) { - setup() + s := setup() updateExecutionQueueAttributeSetup() executionqueueattribute.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err = updateExecutionQueueAttributesFunc(ctx, nil, cmdCtx) + err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/update/matchable_plugin_override_test.go b/flytectl/cmd/update/matchable_plugin_override_test.go index 8f59d1e1e4..644144a29c 100644 --- a/flytectl/cmd/update/matchable_plugin_override_test.go +++ b/flytectl/cmd/update/matchable_plugin_override_test.go @@ -5,90 +5,85 @@ import ( "testing" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" - u "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) func updatePluginOverrideSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient pluginoverride.DefaultUpdateConfig = &pluginoverride.AttrUpdateConfig{} } func TestPluginOverride(t *testing.T) { t.Run("no input file for update", func(t *testing.T) { - setup() + s := setup() updatePluginOverrideSetup() - err = updatePluginOverridesFunc(ctx, args, cmdCtx) + err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for plugin override"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful update project domain attribute", func(t *testing.T) { - setup() + s := setup() updatePluginOverrideSetup() pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_plugin_override.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updatePluginOverridesFunc(ctx, args, cmdCtx) + err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { - setup() + s := setup() updatePluginOverrideSetup() pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_plugin_override.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updatePluginOverridesFunc(ctx, args, cmdCtx) + err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful update workflow attribute", func(t *testing.T) { - setup() + s := setup() updatePluginOverrideSetup() pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_plugin_override.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updatePluginOverridesFunc(ctx, nil, cmdCtx) + err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { - setup() + s := setup() updatePluginOverrideSetup() pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_plugin_override.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updatePluginOverridesFunc(ctx, nil, cmdCtx) + err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("non existent file", func(t *testing.T) { - setup() + s := setup() updatePluginOverrideSetup() pluginoverride.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err = updatePluginOverridesFunc(ctx, nil, cmdCtx) + err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("invalid update file", func(t *testing.T) { - setup() + s := setup() updatePluginOverrideSetup() pluginoverride.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err = updatePluginOverridesFunc(ctx, nil, cmdCtx) + err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/update/matchable_task_resource_attribute_test.go b/flytectl/cmd/update/matchable_task_resource_attribute_test.go index e91f6476d9..39f1cffc9b 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute_test.go @@ -5,90 +5,85 @@ import ( "testing" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" - u "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) func updateTaskResourceAttributeSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient taskresourceattribute.DefaultUpdateConfig = &taskresourceattribute.AttrUpdateConfig{} } func TestUpdateTaskResourceAttributes(t *testing.T) { t.Run("no input file for update", func(t *testing.T) { - setup() + s := setup() updateTaskResourceAttributeSetup() - err = updateTaskResourceAttributesFunc(ctx, args, cmdCtx) + err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for task resource attribute"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful update project domain attribute", func(t *testing.T) { - setup() + s := setup() updateTaskResourceAttributeSetup() taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updateTaskResourceAttributesFunc(ctx, args, cmdCtx) + err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { - setup() + s := setup() updateTaskResourceAttributeSetup() taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updateTaskResourceAttributesFunc(ctx, args, cmdCtx) + err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful update workflow attribute", func(t *testing.T) { - setup() + s := setup() updateTaskResourceAttributeSetup() taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) + err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { - setup() + s := setup() updateTaskResourceAttributeSetup() taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) + err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("non existent file", func(t *testing.T) { - setup() + s := setup() updateTaskResourceAttributeSetup() taskresourceattribute.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) + err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("invalid update file", func(t *testing.T) { - setup() + s := setup() updateTaskResourceAttributeSetup() taskresourceattribute.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err = updateTaskResourceAttributesFunc(ctx, nil, cmdCtx) + err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/update/matchable_workflow_execution_config_test.go b/flytectl/cmd/update/matchable_workflow_execution_config_test.go index 8afcfda1bf..9b9ba63001 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config_test.go @@ -6,90 +6,85 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" - u "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) func updateWorkflowExecutionConfigSetup() { - ctx = u.Ctx - cmdCtx = u.CmdCtx - mockClient = u.MockClient workflowexecutionconfig.DefaultUpdateConfig = &workflowexecutionconfig.AttrUpdateConfig{} } func TestWorkflowExecutionConfigs(t *testing.T) { t.Run("no input file for update", func(t *testing.T) { - setup() + s := setup() updateWorkflowExecutionConfigSetup() - err = updateWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for workflow execution config"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful update project domain attribute", func(t *testing.T) { - setup() + s := setup() updateWorkflowExecutionConfigSetup() workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_workflow_execution_config.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updateWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { - setup() + s := setup() updateWorkflowExecutionConfigSetup() workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_workflow_execution_config.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updateWorkflowExecutionConfigFunc(ctx, args, cmdCtx) + err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("successful update workflow attribute", func(t *testing.T) { - setup() + s := setup() updateWorkflowExecutionConfigSetup() workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_workflow_execution_config.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = updateWorkflowExecutionConfigFunc(ctx, nil, cmdCtx) + err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { - setup() + s := setup() updateWorkflowExecutionConfigSetup() workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_workflow_execution_config.yaml" // No args implying project domain attribute deletion - u.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, + s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err = updateWorkflowExecutionConfigFunc(ctx, nil, cmdCtx) + err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("non existent file", func(t *testing.T) { - setup() + s := setup() updateWorkflowExecutionConfigSetup() workflowexecutionconfig.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err = updateWorkflowExecutionConfigFunc(ctx, nil, cmdCtx) + err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) t.Run("invalid update file", func(t *testing.T) { - setup() + s := setup() updateWorkflowExecutionConfigSetup() workflowexecutionconfig.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err = updateWorkflowExecutionConfigFunc(ctx, nil, cmdCtx) + err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, ``) + tearDownAndVerify(t, s.Writer, ``) }) } diff --git a/flytectl/cmd/update/named_entity.go b/flytectl/cmd/update/named_entity.go index 25d537f380..c7644f4907 100644 --- a/flytectl/cmd/update/named_entity.go +++ b/flytectl/cmd/update/named_entity.go @@ -24,9 +24,9 @@ type NamedEntityConfig struct { DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` } -func (n NamedEntityConfig) UpdateNamedEntity(ctx context.Context, name string, project string, domain string, rsType core.ResourceType, cmdCtx cmdCore.CommandContext) error { - archiveProject := n.Archive - activateProject := n.Activate +func (cfg NamedEntityConfig) UpdateNamedEntity(ctx context.Context, name string, project string, domain string, rsType core.ResourceType, cmdCtx cmdCore.CommandContext) error { + archiveProject := cfg.Archive + activateProject := cfg.Activate if activateProject == archiveProject && activateProject { return fmt.Errorf(clierrors.ErrInvalidStateUpdate) } @@ -36,7 +36,7 @@ func (n NamedEntityConfig) UpdateNamedEntity(ctx context.Context, name string, p } else if archiveProject { nameEntityState = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED } - if namedEntityConfig.DryRun { + if cfg.DryRun { logger.Infof(ctx, "skipping UpdateNamedEntity request (dryRun)") } else { _, err := cmdCtx.AdminClient().UpdateNamedEntity(ctx, &admin.NamedEntityUpdateRequest{ @@ -47,7 +47,7 @@ func (n NamedEntityConfig) UpdateNamedEntity(ctx context.Context, name string, p Name: name, }, Metadata: &admin.NamedEntityMetadata{ - Description: n.Description, + Description: cfg.Description, State: nameEntityState, }, }) diff --git a/flytectl/cmd/update/named_entity_test.go b/flytectl/cmd/update/named_entity_test.go index 9c322f1840..4e0086d7c6 100644 --- a/flytectl/cmd/update/named_entity_test.go +++ b/flytectl/cmd/update/named_entity_test.go @@ -12,37 +12,28 @@ import ( "github.com/stretchr/testify/assert" ) -func NamedEntitySetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient -} - func TestNamedEntity(t *testing.T) { - testutils.Setup() - NamedEntitySetup() - mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) + s := testutils.Setup() + s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) namedEntityConfig = &NamedEntityConfig{Archive: false, Activate: true, Description: "named entity description"} - assert.Nil(t, namedEntityConfig.UpdateNamedEntity(ctx, "namedEntity", "project", "domain", - core.ResourceType_WORKFLOW, cmdCtx)) + assert.Nil(t, namedEntityConfig.UpdateNamedEntity(s.Ctx, "namedEntity", "project", "domain", + core.ResourceType_WORKFLOW, s.CmdCtx)) namedEntityConfig = &NamedEntityConfig{Archive: true, Activate: false, Description: "named entity description"} - assert.Nil(t, namedEntityConfig.UpdateNamedEntity(ctx, "namedEntity", "project", "domain", - core.ResourceType_WORKFLOW, cmdCtx)) + assert.Nil(t, namedEntityConfig.UpdateNamedEntity(s.Ctx, "namedEntity", "project", "domain", + core.ResourceType_WORKFLOW, s.CmdCtx)) } func TestNamedEntityValidationFailure(t *testing.T) { - testutils.Setup() - NamedEntitySetup() - namedEntityConfig = &NamedEntityConfig{Archive: true, Activate: true, Description: "named entity description"} - assert.NotNil(t, namedEntityConfig.UpdateNamedEntity(ctx, "namedEntity", "project", "domain", - core.ResourceType_WORKFLOW, cmdCtx)) + s := testutils.Setup() + namedEntityConfig := &NamedEntityConfig{Archive: true, Activate: true, Description: "named entity description"} + assert.NotNil(t, namedEntityConfig.UpdateNamedEntity(s.Ctx, "namedEntity", "project", "domain", + core.ResourceType_WORKFLOW, s.CmdCtx)) } func TestNamedEntityFailure(t *testing.T) { - testutils.Setup() - NamedEntitySetup() - namedEntityConfig = &NamedEntityConfig{Archive: true, Activate: true, Description: "named entity description"} - mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, namedEntityConfig.UpdateNamedEntity(ctx, "namedEntity", "project", "domain", - core.ResourceType_WORKFLOW, cmdCtx)) + s := testutils.Setup() + namedEntityConfig := &NamedEntityConfig{Archive: true, Activate: true, Description: "named entity description"} + s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, namedEntityConfig.UpdateNamedEntity(s.Ctx, "namedEntity", "project", "domain", + core.ResourceType_WORKFLOW, s.CmdCtx)) } diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index db1f52c7cd..d33ce6e374 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -9,7 +9,6 @@ import ( "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" - u "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" @@ -18,13 +17,10 @@ import ( const projectValue = "dummyProject" var ( - args []string projectUpdateRequest *admin.Project ) func updateProjectSetup() { - mockClient = u.MockClient - cmdCtx = u.CmdCtx projectUpdateRequest = &admin.Project{ Id: projectValue, State: admin.Project_ACTIVE, @@ -37,7 +33,7 @@ func modifyProjectFlags(archiveProject *bool, newArchiveVal bool, activateProjec } func TestActivateProjectFunc(t *testing.T) { - setup() + s := setup() updateProjectSetup() config.GetConfig().Project = projectValue project.DefaultProjectConfig.Name = projectValue @@ -50,15 +46,15 @@ func TestActivateProjectFunc(t *testing.T) { }, State: admin.Project_ACTIVE, } - mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) - err = updateProjectsFunc(ctx, args, cmdCtx) + s.MockAdminClient.OnUpdateProjectMatch(s.Ctx, projectUpdateRequest).Return(nil, nil) + err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project dummyProject updated\n") + s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) + tearDownAndVerify(t, s.Writer, "Project dummyProject updated\n") } func TestActivateProjectFuncWithError(t *testing.T) { - setup() + s := setup() updateProjectSetup() config.GetConfig().Project = projectValue project.DefaultProjectConfig.Name = projectValue @@ -71,15 +67,15 @@ func TestActivateProjectFuncWithError(t *testing.T) { }, State: admin.Project_ACTIVE, } - mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) - err = updateProjectsFunc(ctx, args, cmdCtx) + s.MockAdminClient.OnUpdateProjectMatch(s.Ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) + err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) - mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project dummyProject failed to update due to Error Updating Project\n") + s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) + tearDownAndVerify(t, s.Writer, "Project dummyProject failed to update due to Error Updating Project\n") } func TestArchiveProjectFunc(t *testing.T) { - setup() + s := setup() updateProjectSetup() config.GetConfig().Project = projectValue project.DefaultProjectConfig = &project.ConfigProject{} @@ -93,15 +89,15 @@ func TestArchiveProjectFunc(t *testing.T) { }, State: admin.Project_ARCHIVED, } - mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, nil) - err = updateProjectsFunc(ctx, args, cmdCtx) + s.MockAdminClient.OnUpdateProjectMatch(s.Ctx, projectUpdateRequest).Return(nil, nil) + err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project dummyProject updated\n") + s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) + tearDownAndVerify(t, s.Writer, "Project dummyProject updated\n") } func TestArchiveProjectFuncWithError(t *testing.T) { - setup() + s := setup() updateProjectSetup() project.DefaultProjectConfig.Name = projectValue project.DefaultProjectConfig.Labels = map[string]string{} @@ -114,32 +110,32 @@ func TestArchiveProjectFuncWithError(t *testing.T) { }, State: admin.Project_ARCHIVED, } - mockClient.OnUpdateProjectMatch(ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) - err = updateProjectsFunc(ctx, args, cmdCtx) + s.MockAdminClient.OnUpdateProjectMatch(s.Ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) + err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) - mockClient.AssertCalled(t, "UpdateProject", ctx, projectUpdateRequest) - tearDownAndVerify(t, "Project dummyProject failed to update"+ + s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) + tearDownAndVerify(t, s.Writer, "Project dummyProject failed to update"+ " due to Error Updating Project\n") } func TestEmptyProjectInput(t *testing.T) { - setup() + s := setup() updateProjectSetup() config.GetConfig().Project = "" modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), false, &(project.DefaultProjectConfig.ActivateProject), true) - err = updateProjectsFunc(ctx, args, cmdCtx) + err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf(clierrors.ErrProjectNotPassed), err) } func TestInvalidInput(t *testing.T) { - setup() + s := setup() updateProjectSetup() config.GetConfig().Project = projectValue project.DefaultProjectConfig.Name = projectValue modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), true, &(project.DefaultProjectConfig.ActivateProject), true) - err = updateProjectsFunc(ctx, args, cmdCtx) + err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf(clierrors.ErrInvalidStateUpdate), err) - tearDownAndVerify(t, "") + tearDownAndVerify(t, s.Writer, "") } diff --git a/flytectl/cmd/update/task_meta.go b/flytectl/cmd/update/task_meta.go index 80f2b6c7b0..40d4ee4410 100644 --- a/flytectl/cmd/update/task_meta.go +++ b/flytectl/cmd/update/task_meta.go @@ -32,18 +32,22 @@ Usage ` ) -func updateTaskFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - project := config.GetConfig().Project - domain := config.GetConfig().Domain - if len(args) != 1 { - return fmt.Errorf(clierrors.ErrTaskNotPassed) +func getUpdateTaskFunc(namedEntityConfig *NamedEntityConfig) func(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + return func(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + project := config.GetConfig().Project + domain := config.GetConfig().Domain + if len(args) != 1 { + return fmt.Errorf(clierrors.ErrTaskNotPassed) + } + + name := args[0] + err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_TASK, cmdCtx) + if err != nil { + fmt.Printf(clierrors.ErrFailedTaskUpdate, name, err) + return err + } + + fmt.Printf("updated metadata successfully on %v", name) + return nil } - name := args[0] - err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_TASK, cmdCtx) - if err != nil { - fmt.Printf(clierrors.ErrFailedTaskUpdate, name, err) - return err - } - fmt.Printf("updated metadata successfully on %v", name) - return nil } diff --git a/flytectl/cmd/update/task_meta_test.go b/flytectl/cmd/update/task_meta_test.go index 250f7f9fde..e121cbe8bd 100644 --- a/flytectl/cmd/update/task_meta_test.go +++ b/flytectl/cmd/update/task_meta_test.go @@ -11,34 +11,21 @@ import ( "github.com/stretchr/testify/mock" ) -func UpdateTaskSetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient -} - func TestTaskUpdate(t *testing.T) { - testutils.Setup() - UpdateTaskSetup() - namedEntityConfig = &NamedEntityConfig{} - args = []string{"task1"} - mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) - assert.Nil(t, updateTaskFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + args := []string{"task1"} + s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) + assert.Nil(t, getUpdateTaskFunc(&NamedEntityConfig{})(s.Ctx, args, s.CmdCtx)) } func TestTaskUpdateFail(t *testing.T) { - testutils.Setup() - UpdateWorkflowSetup() - namedEntityConfig = &NamedEntityConfig{} - args = []string{"workflow1"} - mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + args := []string{"workflow1"} + s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, getUpdateTaskFunc(&NamedEntityConfig{})(s.Ctx, args, s.CmdCtx)) } func TestTaskUpdateInvalidArgs(t *testing.T) { - testutils.Setup() - UpdateWorkflowSetup() - namedEntityConfig = &NamedEntityConfig{} - args = []string{} - assert.NotNil(t, updateTaskFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + assert.NotNil(t, getUpdateTaskFunc(&NamedEntityConfig{})(s.Ctx, []string{}, s.CmdCtx)) } diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 7f48226b0c..23c69ac608 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -39,15 +39,15 @@ func CreateUpdateCommand() *cobra.Command { updateResourcesFuncs := map[string]cmdCore.CommandEntry{ "launchplan": {CmdFunc: updateLPFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: launchplan.UConfig, Short: updateLPShort, Long: updateLPLong}, - "launchplan-meta": {CmdFunc: updateLPMetaFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, + "launchplan-meta": {CmdFunc: getUpdateLPMetaFunc(namedEntityConfig), Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateLPMetaShort, Long: updateLPMetaLong}, "project": {CmdFunc: updateProjectsFunc, Aliases: []string{}, ProjectDomainNotRequired: true, PFlagProvider: project.DefaultProjectConfig, Short: projectShort, Long: projectLong}, "execution": {CmdFunc: updateExecutionFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: execution.UConfig, Short: updateExecutionShort, Long: updateExecutionLong}, - "task-meta": {CmdFunc: updateTaskFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, + "task-meta": {CmdFunc: getUpdateTaskFunc(namedEntityConfig), Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateTaskShort, Long: updateTaskLong}, - "workflow-meta": {CmdFunc: updateWorkflowFunc, Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, + "workflow-meta": {CmdFunc: getUpdateWorkflowFunc(namedEntityConfig), Aliases: []string{}, ProjectDomainNotRequired: false, PFlagProvider: namedEntityConfig, Short: updateWorkflowShort, Long: updateWorkflowLong}, "task-resource-attribute": {CmdFunc: updateTaskResourceAttributesFunc, Aliases: []string{}, PFlagProvider: taskresourceattribute.DefaultUpdateConfig, Short: taskResourceAttributesShort, Long: taskResourceAttributesLong, ProjectDomainNotRequired: true}, diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index b289b0a4cd..b17bae11e8 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -1,24 +1,13 @@ package update import ( - "context" "sort" "testing" - cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/stretchr/testify/assert" ) -var ( - err error - ctx context.Context - mockClient *mocks.AdminServiceClient - cmdCtx cmdCore.CommandContext -) - const ( testDataNonExistentFile = "testdata/non-existent-file" testDataInvalidAttrFile = "testdata/invalid_attribute.yaml" diff --git a/flytectl/cmd/update/workflow_meta.go b/flytectl/cmd/update/workflow_meta.go index f84c1e87e4..5db98b44de 100644 --- a/flytectl/cmd/update/workflow_meta.go +++ b/flytectl/cmd/update/workflow_meta.go @@ -32,18 +32,20 @@ Usage ` ) -func updateWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - project := config.GetConfig().Project - domain := config.GetConfig().Domain - if len(args) != 1 { - return fmt.Errorf(clierrors.ErrWorkflowNotPassed) +func getUpdateWorkflowFunc(namedEntityConfig *NamedEntityConfig) func(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + return func(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + project := config.GetConfig().Project + domain := config.GetConfig().Domain + if len(args) != 1 { + return fmt.Errorf(clierrors.ErrWorkflowNotPassed) + } + name := args[0] + err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_WORKFLOW, cmdCtx) + if err != nil { + fmt.Printf(clierrors.ErrFailedWorkflowUpdate, name, err) + return err + } + fmt.Printf("updated metadata successfully on %v", name) + return nil } - name := args[0] - err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_WORKFLOW, cmdCtx) - if err != nil { - fmt.Printf(clierrors.ErrFailedWorkflowUpdate, name, err) - return err - } - fmt.Printf("updated metadata successfully on %v", name) - return nil } diff --git a/flytectl/cmd/update/workflow_meta_test.go b/flytectl/cmd/update/workflow_meta_test.go index d6b5ba06ad..7c7a1fc78e 100644 --- a/flytectl/cmd/update/workflow_meta_test.go +++ b/flytectl/cmd/update/workflow_meta_test.go @@ -11,34 +11,21 @@ import ( "github.com/stretchr/testify/mock" ) -func UpdateWorkflowSetup() { - ctx = testutils.Ctx - cmdCtx = testutils.CmdCtx - mockClient = testutils.MockClient -} - func TestWorkflowUpdate(t *testing.T) { - testutils.Setup() - UpdateWorkflowSetup() - namedEntityConfig = &NamedEntityConfig{} - args = []string{"workflow1"} - mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) - assert.Nil(t, updateWorkflowFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + args := []string{"workflow1"} + s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) + assert.Nil(t, getUpdateWorkflowFunc(&NamedEntityConfig{})(s.Ctx, args, s.CmdCtx)) } func TestWorkflowUpdateFail(t *testing.T) { - testutils.Setup() - UpdateWorkflowSetup() - namedEntityConfig = &NamedEntityConfig{} - args = []string{"workflow1"} - mockClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, updateWorkflowFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + args := []string{"workflow1"} + s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) + assert.NotNil(t, getUpdateWorkflowFunc(&NamedEntityConfig{})(s.Ctx, args, s.CmdCtx)) } func TestWorkflowUpdateInvalidArgs(t *testing.T) { - testutils.Setup() - UpdateWorkflowSetup() - namedEntityConfig = &NamedEntityConfig{} - args = []string{} - assert.NotNil(t, updateWorkflowFunc(ctx, args, cmdCtx)) + s := testutils.Setup() + assert.NotNil(t, getUpdateWorkflowFunc(&NamedEntityConfig{})(s.Ctx, []string{}, s.CmdCtx)) } diff --git a/flytectl/cmd/upgrade/upgrade_test.go b/flytectl/cmd/upgrade/upgrade_test.go index 473621bb9e..5d4ac283ef 100644 --- a/flytectl/cmd/upgrade/upgrade_test.go +++ b/flytectl/cmd/upgrade/upgrade_test.go @@ -1,20 +1,18 @@ package upgrade import ( - "io" "sort" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/githubutil" "github.com/flyteorg/flytectl/pkg/util" "github.com/flyteorg/flytectl/pkg/platformutil" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" stdlibversion "github.com/flyteorg/flytestdlib/version" - "context" - cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" "github.com/stretchr/testify/assert" @@ -111,16 +109,12 @@ func TestSelfUpgrade(t *testing.T) { githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt goos = platformutil.Linux t.Run("Successful upgrade", func(t *testing.T) { - ctx := context.Background() - var args []string - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + s := testutils.Setup() stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = version - assert.Nil(t, selfUpgrade(ctx, args, cmdCtx)) + assert.Nil(t, selfUpgrade(s.Ctx, []string{}, s.CmdCtx)) }) } @@ -129,16 +123,12 @@ func TestSelfUpgradeError(t *testing.T) { githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt goos = platformutil.Linux t.Run("Successful upgrade", func(t *testing.T) { - ctx := context.Background() - var args []string - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + s := testutils.Setup() stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = "v" - assert.NotNil(t, selfUpgrade(ctx, args, cmdCtx)) + assert.NotNil(t, selfUpgrade(s.Ctx, []string{}, s.CmdCtx)) }) } @@ -148,53 +138,41 @@ func TestSelfUpgradeRollback(t *testing.T) { githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt goos = platformutil.Linux t.Run("Successful rollback", func(t *testing.T) { - ctx := context.Background() + s := testutils.Setup() var args = []string{rollBackSubCommand} - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = version - assert.Nil(t, selfUpgrade(ctx, args, cmdCtx)) + assert.Nil(t, selfUpgrade(s.Ctx, args, s.CmdCtx)) }) t.Run("Successful rollback failed", func(t *testing.T) { - ctx := context.Background() + s := testutils.Setup() var args = []string{rollBackSubCommand} - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = "v100.0.0" - assert.NotNil(t, selfUpgrade(ctx, args, cmdCtx)) + assert.NotNil(t, selfUpgrade(s.Ctx, args, s.CmdCtx)) }) t.Run("Successful rollback for windows", func(t *testing.T) { - ctx := context.Background() + s := testutils.Setup() var args = []string{rollBackSubCommand} - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = version goos = platformutil.Windows - assert.Nil(t, selfUpgrade(ctx, args, cmdCtx)) + assert.Nil(t, selfUpgrade(s.Ctx, args, s.CmdCtx)) }) t.Run("Successful rollback for windows", func(t *testing.T) { - ctx := context.Background() + s := testutils.Setup() var args = []string{rollBackSubCommand} - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = version githubutil.FlytectlReleaseConfig.OverrideExecutable = "/" - assert.Nil(t, selfUpgrade(ctx, args, cmdCtx)) + assert.Nil(t, selfUpgrade(s.Ctx, args, s.CmdCtx)) }) } diff --git a/flytectl/cmd/version/version_test.go b/flytectl/cmd/version/version_test.go index 0be22c97c2..991d50765e 100644 --- a/flytectl/cmd/version/version_test.go +++ b/flytectl/cmd/version/version_test.go @@ -8,6 +8,10 @@ import ( "sort" "testing" + "github.com/flyteorg/flytectl/cmd/testutils" + + admin2 "github.com/flyteorg/flyteidl/clients/go/admin" + "github.com/spf13/cobra" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -53,47 +57,38 @@ func TestVersionCommand(t *testing.T) { func TestVersionCommandFunc(t *testing.T) { ctx := context.Background() - var args []string - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + s := testutils.Setup() stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = testVersion - mockClient.OnGetVersionMatch(ctx, versionRequest).Return(versionResponse, nil) - err := getVersion(ctx, args, cmdCtx) + s.MockClient.AdminClient().(*mocks.AdminServiceClient).OnGetVersionMatch(ctx, versionRequest).Return(versionResponse, nil) + err := getVersion(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "GetVersion", ctx, versionRequest) + s.MockClient.AdminClient().(*mocks.AdminServiceClient).AssertCalled(t, "GetVersion", ctx, versionRequest) } func TestVersionCommandFuncError(t *testing.T) { ctx := context.Background() - var args []string - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + s := testutils.Setup() stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = "v" - mockClient.OnGetVersionMatch(ctx, versionRequest).Return(versionResponse, nil) - err := getVersion(ctx, args, cmdCtx) + s.MockClient.AdminClient().(*mocks.AdminServiceClient).OnGetVersionMatch(ctx, versionRequest).Return(versionResponse, nil) + err := getVersion(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "GetVersion", ctx, versionRequest) + s.MockClient.AdminClient().(*mocks.AdminServiceClient).AssertCalled(t, "GetVersion", ctx, versionRequest) } func TestVersionCommandFuncErr(t *testing.T) { ctx := context.Background() - var args []string - mockClient := new(mocks.AdminServiceClient) - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + s := testutils.Setup() stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = testVersion - mockClient.OnGetVersionMatch(ctx, versionRequest).Return(versionResponse, errors.New("error")) - err := getVersion(ctx, args, cmdCtx) + s.MockAdminClient.OnGetVersionMatch(ctx, versionRequest).Return(versionResponse, errors.New("error")) + err := getVersion(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - mockClient.AssertCalled(t, "GetVersion", ctx, versionRequest) + s.MockAdminClient.AssertCalled(t, "GetVersion", ctx, versionRequest) } func TestVersionUtilFunc(t *testing.T) { @@ -102,19 +97,21 @@ func TestVersionUtilFunc(t *testing.T) { stdlibversion.Version = testVersion t.Run("Error in getting control plan version", func(t *testing.T) { ctx := context.Background() - mockClient := new(mocks.AdminServiceClient) + mockClient := admin2.InitializeMockClientset() + adminClient := mockClient.AdminClient().(*mocks.AdminServiceClient) mockOutStream := new(io.Writer) cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) - mockClient.OnGetVersionMatch(ctx, &admin.GetVersionRequest{}).Return(nil, fmt.Errorf("error")) + adminClient.OnGetVersionMatch(ctx, &admin.GetVersionRequest{}).Return(nil, fmt.Errorf("error")) err := getControlPlaneVersion(ctx, cmdCtx) assert.NotNil(t, err) }) t.Run("Failed in getting version", func(t *testing.T) { ctx := context.Background() - mockClient := new(mocks.AdminServiceClient) + mockClient := admin2.InitializeMockClientset() + adminClient := mockClient.AdminClient().(*mocks.AdminServiceClient) mockOutStream := new(io.Writer) cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) - mockClient.OnGetVersionMatch(ctx, &admin.GetVersionRequest{}).Return(nil, fmt.Errorf("error")) + adminClient.OnGetVersionMatch(ctx, &admin.GetVersionRequest{}).Return(nil, fmt.Errorf("error")) err := getVersion(ctx, []string{}, cmdCtx) assert.Nil(t, err) }) diff --git a/flytectl/go.mod b/flytectl/go.mod index 695533b176..dcadd78d31 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,12 +9,13 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.24.6 - github.com/flyteorg/flytestdlib v0.4.14 + github.com/flyteorg/flyteidl v0.24.10 + github.com/flyteorg/flytestdlib v0.4.16 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 github.com/golang/protobuf v1.5.0 github.com/google/go-github/v42 v42.0.0 + github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.2.0 github.com/hashicorp/go-version v1.3.0 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 @@ -44,10 +45,15 @@ require ( sigs.k8s.io/yaml v1.2.0 ) +require golang.org/x/text v0.3.7 + require ( cloud.google.com/go v0.75.0 // indirect cloud.google.com/go/storage v1.12.0 // indirect - github.com/Azure/azure-sdk-for-go v51.0.0+incompatible // indirect + github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.17 // indirect github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect @@ -71,19 +77,19 @@ require ( github.com/dustin/go-humanize v1.0.0 // indirect github.com/evanphx/json-patch v4.9.0+incompatible // indirect github.com/fatih/color v1.10.0 // indirect + github.com/flyteorg/stow v0.3.1 // indirect github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/go-logr/logr v0.4.0 // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect + github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/google/go-cmp v0.5.6 // indirect - github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/googleapis/gax-go/v2 v2.0.5 // indirect github.com/googleapis/gnostic v0.4.1 // indirect github.com/gorilla/mux v1.8.0 // indirect - github.com/graymeta/stow v0.2.7 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect @@ -116,7 +122,6 @@ require ( github.com/prometheus/procfs v0.6.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect - github.com/satori/go.uuid v1.2.0 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/spf13/afero v1.5.1 // indirect github.com/spf13/cast v1.3.1 // indirect @@ -125,15 +130,14 @@ require ( github.com/stretchr/objx v0.3.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.22.6 // indirect - golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect - golang.org/x/mod v0.4.1 // indirect - golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect + golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect + golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect + golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect - golang.org/x/text v0.3.5 // indirect golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect - golang.org/x/tools v0.1.0 // indirect + golang.org/x/tools v0.1.10 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/api v0.38.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index 5402048521..357cec6285 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -42,8 +42,15 @@ cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7ni dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v51.0.0+incompatible h1:p7blnyJSjJqf5jflHbSGhIhEpXIgIFmYZNg5uwqweso= github.com/Azure/azure-sdk-for-go v51.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= +github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -310,8 +317,9 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/disiqueira/gotree v1.0.0 h1:en5wk87n7/Jyk6gVME3cx3xN9KmUCstJ1IjHr4Se4To= github.com/disiqueira/gotree v1.0.0/go.mod h1:7CwL+VWsWAU95DovkdRZAtA7YbtHwGk+tLV/kNi8niU= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -356,11 +364,13 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.24.6 h1:n2796X9Sw7mNDtXWwsJr84DLQpz8Cptvb7LptfJLxag= -github.com/flyteorg/flyteidl v0.24.6/go.mod h1:576W2ViEyjTpT+kEVHAGbrTP3HARNUZ/eCwrNPmdx9U= +github.com/flyteorg/flyteidl v0.24.10 h1:fCYpfp5fxKbhRMSkP0Hdw5lOPBTItLU1A3WA1Lc7sEU= +github.com/flyteorg/flyteidl v0.24.10/go.mod h1:vHSugApgS3hRITIafzQDU8DZD/W8wFRfFcgaFU35Dww= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= -github.com/flyteorg/flytestdlib v0.4.14 h1:qpPwvJ+DqM1fI/y5uPKAP8p8VONz8oRp9Fz0jFl/5aI= -github.com/flyteorg/flytestdlib v0.4.14/go.mod h1:fv1ar34LJLMTaf0tbfetisLykUlARi7rP+NQTUn6QQs= +github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= +github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= +github.com/flyteorg/stow v0.3.1 h1:cBMbWl03Gsy5KoA5mutUYTuYpqtT7Pb8+ANGCLnmFEs= +github.com/flyteorg/stow v0.3.1/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -408,6 +418,8 @@ github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6 github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= @@ -514,7 +526,6 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graymeta/stow v0.2.7 h1:b31cB1Ylw/388sYSZxnmpjT2QxC21AaQ8fRnUtE13b4= github.com/graymeta/stow v0.2.7/go.mod h1:JAs139Zr29qfsecy7b+h9DRsWXbFbsd7LCrbCDYI84k= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -611,6 +622,7 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -700,7 +712,6 @@ github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -840,7 +851,6 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= @@ -940,6 +950,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= @@ -986,8 +997,9 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1021,8 +1033,9 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1064,6 +1077,7 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1071,8 +1085,11 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1093,6 +1110,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1170,10 +1188,11 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1185,8 +1204,10 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1256,8 +1277,9 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1389,8 +1411,9 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= diff --git a/flytectl/pkg/configutil/version.yaml b/flytectl/pkg/configutil/version.yaml new file mode 100644 index 0000000000..2f492d603a --- /dev/null +++ b/flytectl/pkg/configutil/version.yaml @@ -0,0 +1,8 @@ +admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:///localhost:30081 + authType: Pkce + insecure: true +logger: + show-source: true + level: 0 \ No newline at end of file diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index cf8f96a2c6..3b6be1c91c 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -104,7 +104,9 @@ func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, e } // PullDockerImage will Pull docker image -func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy sandboxConfig.ImagePullPolicy) error { +func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy sandboxConfig.ImagePullPolicy, + imagePullOptions sandboxConfig.ImagePullOptions) error { + if pullPolicy == sandboxConfig.ImagePullPolicyAlways || pullPolicy == sandboxConfig.ImagePullPolicyIfNotPresent { if pullPolicy == sandboxConfig.ImagePullPolicyIfNotPresent { imageSummary, err := cli.ImageList(ctx, types.ImageListOptions{}) @@ -119,7 +121,11 @@ func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy s } } } - r, err := cli.ImagePull(ctx, image, types.ImagePullOptions{}) + + r, err := cli.ImagePull(ctx, image, types.ImagePullOptions{ + RegistryAuth: imagePullOptions.RegistryAuth, + Platform: imagePullOptions.Platform, + }) if err != nil { return err } diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 1915722640..a5124fb2bf 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -17,21 +17,15 @@ import ( "github.com/stretchr/testify/mock" "github.com/docker/docker/api/types" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - u "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/stretchr/testify/assert" ) var ( - cmdCtx cmdCore.CommandContext containers []types.Container imageName = "cr.flyte.org/flyteorg/flyte-sandbox" ) func setupSandbox() { - mockAdminClient := u.MockClient - cmdCtx = cmdCore.NewCommandContext(mockAdminClient, u.MockOutStream) err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte"), os.ModePerm) if err != nil { fmt.Println(err) @@ -110,7 +104,7 @@ func TestPullDockerImage(t *testing.T) { context := context.Background() // Verify the attributes mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways) + err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways, sandboxConfig.ImagePullOptions{}) assert.Nil(t, err) }) @@ -120,7 +114,7 @@ func TestPullDockerImage(t *testing.T) { context := context.Background() // Verify the attributes mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) - err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways) + err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways, sandboxConfig.ImagePullOptions{}) assert.NotNil(t, err) }) @@ -131,7 +125,7 @@ func TestPullDockerImage(t *testing.T) { // Verify the attributes mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) mockDocker.OnImageListMatch(context, types.ImageListOptions{}).Return([]types.ImageSummary{}, nil) - err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyIfNotPresent) + err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyIfNotPresent, sandboxConfig.ImagePullOptions{}) assert.Nil(t, err) }) @@ -139,7 +133,7 @@ func TestPullDockerImage(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} context := context.Background() - err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyNever) + err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyNever, sandboxConfig.ImagePullOptions{}) assert.Nil(t, err) }) } diff --git a/flytectl/pkg/githubutil/githubutil.go b/flytectl/pkg/githubutil/githubutil.go index b948fe880d..d36fe78800 100644 --- a/flytectl/pkg/githubutil/githubutil.go +++ b/flytectl/pkg/githubutil/githubutil.go @@ -8,6 +8,9 @@ import ( "runtime" "strings" + "golang.org/x/text/cases" + "golang.org/x/text/language" + "github.com/flyteorg/flytectl/pkg/util" "github.com/flyteorg/flytestdlib/logger" @@ -131,7 +134,7 @@ func getFlytectlAssetName() string { } else if arch == platformutil.ArchX86 { arch = platformutil.Archi386 } - return fmt.Sprintf("flytectl_%s_%s.tar.gz", strings.Title(runtime.GOOS), arch.String()) + return fmt.Sprintf("flytectl_%s_%s.tar.gz", cases.Title(language.English).String(runtime.GOOS), arch.String()) } // CheckVersionExist returns the provided version release if version exist in repository diff --git a/flytectl/pkg/githubutil/githubutil_test.go b/flytectl/pkg/githubutil/githubutil_test.go index 70f383034d..5de7709940 100644 --- a/flytectl/pkg/githubutil/githubutil_test.go +++ b/flytectl/pkg/githubutil/githubutil_test.go @@ -6,6 +6,9 @@ import ( "strings" "testing" + "golang.org/x/text/cases" + "golang.org/x/text/language" + stdlibversion "github.com/flyteorg/flytestdlib/version" "github.com/flyteorg/flytectl/pkg/platformutil" @@ -99,7 +102,7 @@ func TestGetAssetsFromRelease(t *testing.T) { func TestGetAssetsName(t *testing.T) { t.Run("Get Assets name", func(t *testing.T) { - expected := fmt.Sprintf("flytectl_%s_386.tar.gz", strings.Title(runtime.GOOS)) + expected := fmt.Sprintf("flytectl_%s_386.tar.gz", cases.Title(language.English).String(runtime.GOOS)) arch = platformutil.Arch386 assert.Equal(t, expected, getFlytectlAssetName()) }) diff --git a/flytectl/pkg/util/version.yaml b/flytectl/pkg/util/version.yaml new file mode 100755 index 0000000000..e69de29bb2 From 59340aee1ba04ad549f2b4a0e124a5cf5ee75569 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 5 Apr 2022 16:26:07 +0530 Subject: [PATCH 238/645] Passing security context only if its non empty (#300) * Rebase and fixes tests Signed-off-by: Prafulla Mahindrakar * updating to setup-go@v3 Signed-off-by: Prafulla Mahindrakar * Fixing the tests for go 1.18 by adding mocking for k8s copy context Signed-off-by: Prafulla Mahindrakar * fixes Signed-off-by: Prafulla Mahindrakar * test fixes Signed-off-by: Prafulla Mahindrakar * Fixes Signed-off-by: Prafulla Mahindrakar * Fixes Signed-off-by: Prafulla Mahindrakar --- flytectl/.github/workflows/checks.yml | 2 +- flytectl/cmd/create/execution.go | 8 +- flytectl/cmd/create/execution_util.go | 56 +++++---- flytectl/cmd/create/execution_util_test.go | 125 +++++++++++++++++++- flytectl/cmd/get/execution_test.go | 46 +------ flytectl/cmd/get/launch_plan_test.go | 16 +-- flytectl/cmd/register/register_util_test.go | 12 +- flytectl/cmd/sandbox/start.go | 8 +- flytectl/cmd/sandbox/start_test.go | 4 + flytectl/cmd/sandbox/teardown.go | 5 +- flytectl/cmd/sandbox/teardown_test.go | 12 +- flytectl/cmd/testutils/test_utils.go | 7 +- flytectl/pkg/k8s/k8s.go | 79 ++++++++----- flytectl/pkg/k8s/mocks/context_ops.go | 78 ++++++++++++ 14 files changed, 317 insertions(+), 141 deletions(-) create mode 100644 flytectl/pkg/k8s/mocks/context_ops.go diff --git a/flytectl/.github/workflows/checks.yml b/flytectl/.github/workflows/checks.yml index d31399b768..eee6209b0c 100644 --- a/flytectl/.github/workflows/checks.yml +++ b/flytectl/.github/workflows/checks.yml @@ -50,7 +50,7 @@ jobs: ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: go-version: '1.17' - name: Run GoReleaser dry run diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index 3693c97424..3ca734d3ed 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -177,15 +177,15 @@ func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.C var executionRequest *admin.ExecutionCreateRequest switch execParams.execType { case Relaunch: - return relaunchExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx) + return relaunchExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig) case Recover: - return recoverExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx) + return recoverExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig) case Task: - if executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx); err != nil { + if executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig); err != nil { return err } case Workflow: - if executionRequest, err = createExecutionRequestForWorkflow(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx); err != nil { + if executionRequest, err = createExecutionRequestForWorkflow(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig); err != nil { return err } default: diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 82adaf6110..ed862783d0 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -16,7 +16,7 @@ import ( ) func createExecutionRequestForWorkflow(ctx context.Context, workflowName, project, domain string, - cmdCtx cmdCore.CommandContext) (*admin.ExecutionCreateRequest, error) { + cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig) (*admin.ExecutionCreateRequest, error) { // Fetch the launch plan lp, err := cmdCtx.AdminFetcherExt().FetchLPVersion(ctx, workflowName, executionConfig.Version, project, domain) if err != nil { @@ -35,23 +35,27 @@ func createExecutionRequestForWorkflow(ctx context.Context, workflowName, projec } // Set both deprecated field and new field for security identity passing - authRole := &admin.AuthRole{ - KubernetesServiceAccount: executionConfig.KubeServiceAcct, - AssumableIamRole: executionConfig.IamRoleARN, - } - - securityContext := &core.SecurityContext{ - RunAs: &core.Identity{ - K8SServiceAccount: executionConfig.KubeServiceAcct, - IamRole: executionConfig.IamRoleARN, - }, + var securityContext *core.SecurityContext + var authRole *admin.AuthRole + + if len(executionConfig.KubeServiceAcct) > 0 || len(executionConfig.IamRoleARN) > 0 { + authRole = &admin.AuthRole{ + KubernetesServiceAccount: executionConfig.KubeServiceAcct, + AssumableIamRole: executionConfig.IamRoleARN, + } + securityContext = &core.SecurityContext{ + RunAs: &core.Identity{ + K8SServiceAccount: executionConfig.KubeServiceAcct, + IamRole: executionConfig.IamRoleARN, + }, + } } return createExecutionRequest(lp.Id, inputs, securityContext, authRole), nil } func createExecutionRequestForTask(ctx context.Context, taskName string, project string, domain string, - cmdCtx cmdCore.CommandContext) (*admin.ExecutionCreateRequest, error) { + cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig) (*admin.ExecutionCreateRequest, error) { // Fetch the task task, err := cmdCtx.AdminFetcherExt().FetchTaskVersion(ctx, taskName, executionConfig.Version, project, domain) if err != nil { @@ -69,16 +73,20 @@ func createExecutionRequestForTask(ctx context.Context, taskName string, project } // Set both deprecated field and new field for security identity passing - authRole := &admin.AuthRole{ - KubernetesServiceAccount: executionConfig.KubeServiceAcct, - AssumableIamRole: executionConfig.IamRoleARN, - } - - securityContext := &core.SecurityContext{ - RunAs: &core.Identity{ - K8SServiceAccount: executionConfig.KubeServiceAcct, - IamRole: executionConfig.IamRoleARN, - }, + var securityContext *core.SecurityContext + var authRole *admin.AuthRole + + if len(executionConfig.KubeServiceAcct) > 0 || len(executionConfig.IamRoleARN) > 0 { + authRole = &admin.AuthRole{ + KubernetesServiceAccount: executionConfig.KubeServiceAcct, + AssumableIamRole: executionConfig.IamRoleARN, + } + securityContext = &core.SecurityContext{ + RunAs: &core.Identity{ + K8SServiceAccount: executionConfig.KubeServiceAcct, + IamRole: executionConfig.IamRoleARN, + }, + } } id := &core.Identifier{ @@ -93,7 +101,7 @@ func createExecutionRequestForTask(ctx context.Context, taskName string, project } func relaunchExecution(ctx context.Context, executionName string, project string, domain string, - cmdCtx cmdCore.CommandContext) error { + cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig) error { if executionConfig.DryRun { logger.Debugf(ctx, "skipping RelaunchExecution request (DryRun)") return nil @@ -113,7 +121,7 @@ func relaunchExecution(ctx context.Context, executionName string, project string } func recoverExecution(ctx context.Context, executionName string, project string, domain string, - cmdCtx cmdCore.CommandContext) error { + cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig) error { if executionConfig.DryRun { logger.Debugf(ctx, "skipping RecoverExecution request (DryRun)") return nil diff --git a/flytectl/cmd/create/execution_util_test.go b/flytectl/cmd/create/execution_util_test.go index 643248daaa..0342d4b5c7 100644 --- a/flytectl/cmd/create/execution_util_test.go +++ b/flytectl/cmd/create/execution_util_test.go @@ -2,6 +2,7 @@ package create import ( "errors" + "fmt" "testing" "github.com/flyteorg/flytectl/cmd/config" @@ -9,6 +10,7 @@ import ( "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" ) var ( @@ -40,13 +42,14 @@ func createExecutionUtilSetup() { Domain: config.GetConfig().Domain, }, } + executionConfig = &ExecutionConfig{} } func TestCreateExecutionForRelaunch(t *testing.T) { s := setup() createExecutionUtilSetup() s.MockAdminClient.OnRelaunchExecutionMatch(s.Ctx, relaunchRequest).Return(executionCreateResponse, nil) - err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx) + err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) assert.Nil(t, err) } @@ -54,7 +57,8 @@ func TestCreateExecutionForRelaunchNotFound(t *testing.T) { s := setup() createExecutionUtilSetup() s.MockAdminClient.OnRelaunchExecutionMatch(s.Ctx, relaunchRequest).Return(nil, errors.New("unknown execution")) - err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx) + err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + assert.NotNil(t, err) assert.Equal(t, err, errors.New("unknown execution")) } @@ -63,7 +67,7 @@ func TestCreateExecutionForRecovery(t *testing.T) { s := setup() createExecutionUtilSetup() s.MockAdminClient.OnRecoverExecutionMatch(s.Ctx, recoverRequest).Return(executionCreateResponse, nil) - err := recoverExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx) + err := recoverExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) assert.Nil(t, err) } @@ -71,7 +75,120 @@ func TestCreateExecutionForRecoveryNotFound(t *testing.T) { s := setup() createExecutionUtilSetup() s.MockAdminClient.OnRecoverExecutionMatch(s.Ctx, recoverRequest).Return(nil, errors.New("unknown execution")) - err := recoverExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx) + err := recoverExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) assert.NotNil(t, err) assert.Equal(t, err, errors.New("unknown execution")) } + +func TestCreateExecutionRequestForWorkflow(t *testing.T) { + t.Run("successful", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + launchPlan := &admin.LaunchPlan{} + s.FetcherExt.OnFetchLPVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(launchPlan, nil) + execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + assert.Nil(t, err) + assert.NotNil(t, execCreateRequest) + }) + t.Run("failed literal conversion", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + launchPlan := &admin.LaunchPlan{ + Spec: &admin.LaunchPlanSpec{ + DefaultInputs: &core.ParameterMap{ + Parameters: map[string]*core.Parameter{"nilparam": nil}, + }, + }, + } + s.FetcherExt.OnFetchLPVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(launchPlan, nil) + execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + assert.NotNil(t, err) + assert.Nil(t, execCreateRequest) + assert.Equal(t, fmt.Errorf("parameter [nilparam] has nil Variable"), err) + }) + t.Run("failed fetch", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + s.FetcherExt.OnFetchLPVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + assert.NotNil(t, err) + assert.Nil(t, execCreateRequest) + assert.Equal(t, err, errors.New("failed")) + }) + t.Run("with security context", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + executionConfig.KubeServiceAcct = "default" + launchPlan := &admin.LaunchPlan{} + s.FetcherExt.OnFetchLPVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(launchPlan, nil) + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, mock.Anything).Return(launchPlan, nil) + execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + assert.Nil(t, err) + assert.NotNil(t, execCreateRequest) + executionConfig.KubeServiceAcct = "" + }) +} + +func TestCreateExecutionRequestForTask(t *testing.T) { + t.Run("successful", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + task := &admin.Task{ + Id: &core.Identifier{ + Name: "taskName", + }, + } + s.FetcherExt.OnFetchTaskVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(task, nil) + execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + assert.Nil(t, err) + assert.NotNil(t, execCreateRequest) + }) + t.Run("failed literal conversion", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + task := &admin.Task{ + Closure: &admin.TaskClosure{ + CompiledTask: &core.CompiledTask{ + Template: &core.TaskTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: map[string]*core.Variable{ + "nilvar": nil, + }, + }, + }, + }, + }, + }, + } + s.FetcherExt.OnFetchTaskVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(task, nil) + execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + assert.NotNil(t, err) + assert.Nil(t, execCreateRequest) + assert.Equal(t, fmt.Errorf("variable [nilvar] has nil type"), err) + }) + t.Run("failed fetch", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + s.FetcherExt.OnFetchTaskVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + assert.NotNil(t, err) + assert.Nil(t, execCreateRequest) + assert.Equal(t, err, errors.New("failed")) + }) + t.Run("with security context", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + executionConfig.KubeServiceAcct = "default" + task := &admin.Task{ + Id: &core.Identifier{ + Name: "taskName", + }, + } + s.FetcherExt.OnFetchTaskVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(task, nil) + execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + assert.Nil(t, err) + assert.NotNil(t, execCreateRequest) + executionConfig.KubeServiceAcct = "" + }) +} diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go index ff11d03db0..64476ad82f 100644 --- a/flytectl/cmd/get/execution_test.go +++ b/flytectl/cmd/get/execution_test.go @@ -32,18 +32,6 @@ func getExecutionSetup() { func TestListExecutionFunc(t *testing.T) { getExecutionSetup() s := setup() - ctx := s.Ctx - execListRequest := &admin.ResourceListRequest{ - Limit: 100, - SortBy: &admin.Sort{ - Key: "created_at", - Direction: admin.Sort_DESCENDING, - }, - Id: &admin.NamedEntityIdentifier{ - Project: projectValue, - Domain: domainValue, - }, - } executionResponse := &admin.Execution{ Id: &core.WorkflowExecutionIdentifier{ Project: projectValue, @@ -72,26 +60,14 @@ func TestListExecutionFunc(t *testing.T) { executionList := &admin.ExecutionList{ Executions: executions, } - s.MockAdminClient.OnListExecutionsMatch(mock.Anything, execListRequest).Return(executionList, nil) + s.FetcherExt.OnListExecutionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(executionList, nil) err := getExecutionFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "ListExecutions", ctx, execListRequest) + s.FetcherExt.AssertCalled(t, "ListExecution", s.Ctx, projectValue, domainValue, execution.DefaultConfig.Filter) } func TestListExecutionFuncWithError(t *testing.T) { - ctx := context.Background() getExecutionSetup() - execListRequest := &admin.ResourceListRequest{ - Limit: 100, - SortBy: &admin.Sort{ - Key: "created_at", - }, - Id: &admin.NamedEntityIdentifier{ - Project: projectValue, - Domain: domainValue, - }, - } - _ = &admin.Execution{ Id: &core.WorkflowExecutionIdentifier{ Project: projectValue, @@ -118,23 +94,14 @@ func TestListExecutionFuncWithError(t *testing.T) { } s := setup() s.FetcherExt.OnListExecutionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("executions NotFound")) - s.MockAdminClient.OnListExecutionsMatch(mock.Anything, execListRequest).Return(nil, errors.New("executions NotFound")) err := getExecutionFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, err, errors.New("executions NotFound")) - s.MockAdminClient.AssertCalled(t, "ListExecutions", ctx, execListRequest) + s.FetcherExt.AssertCalled(t, "ListExecution", s.Ctx, projectValue, domainValue, execution.DefaultConfig.Filter) } func TestGetExecutionFunc(t *testing.T) { - ctx := context.Background() getExecutionSetup() - execGetRequest := &admin.WorkflowExecutionGetRequest{ - Id: &core.WorkflowExecutionIdentifier{ - Project: projectValue, - Domain: domainValue, - Name: executionNameValue, - }, - } executionResponse := &admin.Execution{ Id: &core.WorkflowExecutionIdentifier{ Project: projectValue, @@ -161,14 +128,11 @@ func TestGetExecutionFunc(t *testing.T) { } args := []string{executionNameValue} s := setup() - //executionList := &admin.ExecutionList{ - // Executions: []*admin.Execution{executionResponse}, - //} - s.MockAdminClient.OnGetExecutionMatch(ctx, execGetRequest).Return(executionResponse, nil) + s.FetcherExt.OnFetchExecutionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything).Return(executionResponse, nil) err := getExecutionFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "GetExecution", ctx, execGetRequest) + s.FetcherExt.AssertCalled(t, "FetchExecution", s.Ctx, executionNameValue, projectValue, domainValue) } func TestGetExecutionFuncForDetails(t *testing.T) { diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index 3831631f87..d04698d8b0 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -253,13 +253,10 @@ func TestGetLaunchPlanFuncWithError(t *testing.T) { func TestGetLaunchPlanFunc(t *testing.T) { s := setup() getLaunchPlanSetup() - s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceGetRequest).Return(launchPlanListResponse, nil) - s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(launchPlan2, nil) - s.MockAdminClient.OnListLaunchPlanIdsMatch(s.Ctx, namedIDRequest).Return(namedIdentifierList, nil) - s.FetcherExt.OnFetchAllVerOfLP(s.Ctx, "launchplan1", "dummyProject", "dummyDomain", filters.Filters{}).Return(launchPlanListResponse.LaunchPlans, nil) + s.FetcherExt.OnFetchAllVerOfLPMatch(mock.Anything, mock.Anything, "dummyProject", "dummyDomain", filters.Filters{}).Return(launchPlanListResponse.LaunchPlans, nil) err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "ListLaunchPlans", s.Ctx, resourceGetRequest) + s.FetcherExt.AssertCalled(t, "FetchAllVerOfLP", s.Ctx, "launchplan1", "dummyProject", "dummyDomain", launchplan.DefaultConfig.Filter) tearDownAndVerify(t, s.Writer, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } @@ -268,11 +265,10 @@ func TestGetLaunchPlanFuncLatest(t *testing.T) { getLaunchPlanSetup() launchplan.DefaultConfig.Latest = true launchplan.DefaultConfig.Filter = filters.Filters{} - s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceGetRequest).Return(launchPlanListResponse, nil) - s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(launchPlan2, nil) + s.FetcherExt.OnFetchLPLatestVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(launchPlan2, nil) err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "ListLaunchPlans", s.Ctx, resourceGetRequest) + s.FetcherExt.AssertCalled(t, "FetchLPLatestVersion", s.Ctx, "launchplan1", projectValue, domainValue, launchplan.DefaultConfig.Filter) tearDownAndVerify(t, s.Writer, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } @@ -280,9 +276,6 @@ func TestGetLaunchPlanWithVersion(t *testing.T) { s := testutils.SetupWithExt() getLaunchPlanSetup() launchplan.DefaultConfig.Version = "v2" - s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceListRequest).Return(launchPlanListResponse, nil) - s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(launchPlan2, nil) - s.MockAdminClient.OnListLaunchPlanIdsMatch(s.Ctx, namedIDRequest).Return(namedIdentifierList, nil) s.FetcherExt.OnFetchLPVersion(s.Ctx, "launchplan1", "v2", "dummyProject", "dummyDomain").Return(launchPlan2, nil) err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) @@ -294,7 +287,6 @@ func TestGetLaunchPlans(t *testing.T) { t.Run("no workflow filter", func(t *testing.T) { s := setup() getLaunchPlanSetup() - s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceListRequest).Return(launchPlanListResponse, nil) s.FetcherExt.OnFetchAllVerOfLP(s.Ctx, "", "dummyProject", "dummyDomain", filters.Filters{}).Return(launchPlanListResponse.LaunchPlans, nil) argsLp = []string{} err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index e9b4caae05..ca55bb348c 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -276,9 +276,7 @@ func TestRegisterFile(t *testing.T) { }, }, } - s.MockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) - s.FetcherExt.OnFetchWorkflowVersion(s.Ctx, "core.scheduled_workflows.lp_schedules.date_formatter_wf", "v0.3.59", "dummyProject", "dummyDomain").Return(wf, nil) - s.FetcherExt.OnFetchWorkflowVersion(s.Ctx, "core.scheduled_workflows.lp_schedules.date_formatter_wf", "", "dummyProject", "dummyDomain").Return(wf, nil) + s.FetcherExt.OnFetchWorkflowVersionMatch(s.Ctx, "core.scheduled_workflows.lp_schedules.date_formatter_wf", mock.Anything, "dummyProject", "dummyDomain").Return(wf, nil) args := []string{"testdata/152_my_cron_scheduled_lp_3.pb"} var registerResults []Result results, err := registerFile(s.Ctx, args[0], registerResults, s.CmdCtx, "", *rconfig.DefaultFilesConfig) @@ -624,7 +622,7 @@ func TestValidateLaunchSpec(t *testing.T) { s := setup() registerFilesSetup() - s.MockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + s.FetcherExt.OnFetchWorkflowVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) lpSpec := &admin.LaunchPlanSpec{ WorkflowId: &core.Identifier{ Project: "projectValue", @@ -649,7 +647,7 @@ func TestValidateLaunchSpec(t *testing.T) { s := setup() registerFilesSetup() - s.MockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + s.FetcherExt.OnFetchWorkflowVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) lpSpec := &admin.LaunchPlanSpec{ WorkflowId: &core.Identifier{ Project: "projectValue", @@ -711,7 +709,7 @@ func TestValidateLaunchSpec(t *testing.T) { }, }, } - s.MockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) + s.FetcherExt.OnFetchWorkflowVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(wf, nil) lpSpec := &admin.LaunchPlanSpec{ WorkflowId: &core.Identifier{ Project: "projectValue", @@ -773,7 +771,7 @@ func TestValidateLaunchSpec(t *testing.T) { }, }, } - s.MockAdminClient.OnGetWorkflowMatch(mock.Anything, mock.Anything).Return(wf, nil) + s.FetcherExt.OnFetchWorkflowVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(wf, nil) lpSpec := &admin.LaunchPlanSpec{ WorkflowId: &core.Identifier{ Project: "projectValue", diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 7c373bb2ed..f45c791f08 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -150,14 +150,12 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm } func updateLocalKubeContext() error { - localConfigAccess := clientcmd.NewDefaultPathOptions() - - dockerConfigAccess := &clientcmd.PathOptions{ + srcConfigAccess := &clientcmd.PathOptions{ GlobalFile: docker.Kubeconfig, LoadingRules: clientcmd.NewDefaultClientConfigLoadingRules(), } - - return k8s.CopyKubeContext(dockerConfigAccess, localConfigAccess, sandboxDockerContext, sandboxContextName) + k8sCtxMgr := k8s.NewK8sContextManager() + return k8sCtxMgr.CopyContext(srcConfigAccess, sandboxDockerContext, sandboxContextName) } func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio.Scanner, error) { diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index ae938ab1e2..d6c789fd7b 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -24,6 +24,7 @@ import ( "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/docker/mocks" f "github.com/flyteorg/flytectl/pkg/filesystemutils" + k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" "github.com/flyteorg/flytectl/pkg/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -554,9 +555,12 @@ func TestStartSandboxFunc(t *testing.T) { Follow: true, }).Return(reader, nil) mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + mockK8sContextMgr := &k8sMocks.ContextOps{} docker.Client = mockDocker sandboxConfig.DefaultConfig.Source = "" sandboxConfig.DefaultConfig.Version = "" + k8s.ContextMgr = mockK8sContextMgr + mockK8sContextMgr.OnCopyContextMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) err = startSandboxCluster(ctx, []string{}, cmdCtx) assert.Nil(t, err) }) diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index bbdfa303c6..16ca11bf20 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -13,7 +13,6 @@ import ( cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/k8s" - "k8s.io/client-go/tools/clientcmd" ) const ( @@ -58,6 +57,6 @@ func tearDownSandbox(ctx context.Context, cli docker.Docker) error { } func removeSandboxKubeContext() error { - localConfigAccess := clientcmd.NewDefaultPathOptions() - return k8s.RemoveKubeContext(localConfigAccess, sandboxContextName) + k8sCtxMgr := k8s.NewK8sContextManager() + return k8sCtxMgr.RemoveContext(sandboxContextName) } diff --git a/flytectl/cmd/sandbox/teardown_test.go b/flytectl/cmd/sandbox/teardown_test.go index d95b12221d..0664342979 100644 --- a/flytectl/cmd/sandbox/teardown_test.go +++ b/flytectl/cmd/sandbox/teardown_test.go @@ -5,14 +5,14 @@ import ( "fmt" "testing" + "github.com/docker/docker/api/types" "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flytectl/pkg/configutil" - "github.com/flyteorg/flytectl/pkg/util" - - "github.com/docker/docker/api/types" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/flyteorg/flytectl/pkg/k8s" + k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" + "github.com/flyteorg/flytectl/pkg/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) @@ -33,7 +33,9 @@ func TestTearDownFunc(t *testing.T) { mockDocker := &mocks.Docker{} mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) - + mockK8sContextMgr := &k8sMocks.ContextOps{} + k8s.ContextMgr = mockK8sContextMgr + mockK8sContextMgr.OnRemoveContextMatch(mock.Anything).Return(nil) err := tearDownSandbox(ctx, mockDocker) assert.Nil(t, err) }) diff --git a/flytectl/cmd/testutils/test_utils.go b/flytectl/cmd/testutils/test_utils.go index 86577b1323..b94b7d3671 100644 --- a/flytectl/cmd/testutils/test_utils.go +++ b/flytectl/cmd/testutils/test_utils.go @@ -10,8 +10,6 @@ import ( "strings" "testing" - "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/clients/go/admin" @@ -61,11 +59,8 @@ func Setup() (s TestStruct) { s.UpdaterExt.OnAdminServiceClient().Return(s.MockClient.AdminClient()) s.DeleterExt.OnAdminServiceClient().Return(s.MockClient.AdminClient()) s.MockAdminClient = s.MockClient.AdminClient().(*mocks.AdminServiceClient) - fetcher := &ext.AdminFetcherExtClient{ - AdminClient: s.MockAdminClient, - } s.MockOutStream = s.Writer - s.CmdCtx = cmdCore.NewCommandContextWithExt(s.MockClient, fetcher, s.UpdaterExt, s.DeleterExt, s.MockOutStream) + s.CmdCtx = cmdCore.NewCommandContextWithExt(s.MockClient, s.FetcherExt, s.UpdaterExt, s.DeleterExt, s.MockOutStream) config.GetConfig().Project = projectValue config.GetConfig().Domain = domainValue config.GetConfig().Output = output diff --git a/flytectl/pkg/k8s/k8s.go b/flytectl/pkg/k8s/k8s.go index 74086d76a2..6f9ca3e07d 100644 --- a/flytectl/pkg/k8s/k8s.go +++ b/flytectl/pkg/k8s/k8s.go @@ -15,7 +15,29 @@ type K8s interface { CoreV1() corev1.CoreV1Interface } +//go:generate mockery -name=ContextOps -case=underscore +type ContextOps interface { + CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName, targetCtxName string) error + RemoveContext(ctxName string) error +} + +// ContextManager context manager implementing ContextOps +type ContextManager struct { + configAccess clientcmd.ConfigAccess +} + +func NewK8sContextManager() ContextOps { + if ContextMgr != nil { + return ContextMgr + } + ContextMgr = &ContextManager{ + configAccess: clientcmd.NewDefaultPathOptions(), + } + return ContextMgr +} + var Client K8s +var ContextMgr ContextOps // GetK8sClient return the k8s client from sandbox kubeconfig func GetK8sClient(cfg, master string) (K8s, error) { @@ -34,70 +56,69 @@ func GetK8sClient(cfg, master string) (K8s, error) { return Client, nil } -// CopyKubeContext copies context fromContext part of fromConfigAccess to toContext part of toConfigAccess. -func CopyKubeContext(fromConfigAccess, toConfigAccess clientcmd.ConfigAccess, fromContext, toContext string) error { - _, err := toConfigAccess.GetStartingConfig() +// CopyKubeContext copies context srcCtxName part of srcConfigAccess to targetCtxName part of targetConfigAccess. +func (k *ContextManager) CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName, targetCtxName string) error { + _, err := k.configAccess.GetStartingConfig() if err != nil { return err } - fromStartingConfig, err := fromConfigAccess.GetStartingConfig() + fromStartingConfig, err := srcConfigAccess.GetStartingConfig() if err != nil { return err } - _, exists := fromStartingConfig.Contexts[fromContext] + _, exists := fromStartingConfig.Contexts[srcCtxName] if !exists { - return fmt.Errorf("context %v doesn't exist", fromContext) + return fmt.Errorf("context %v doesn't exist", srcCtxName) } - toStartingConfig, err := toConfigAccess.GetStartingConfig() + toStartingConfig, err := k.configAccess.GetStartingConfig() if err != nil { return err } - _, exists = toStartingConfig.Contexts[toContext] + _, exists = toStartingConfig.Contexts[targetCtxName] if exists { - fmt.Printf("context %v already exist. Overwriting it\n", toContext) + fmt.Printf("context %v already exist. Overwriting it\n", targetCtxName) } else { - toStartingConfig.Contexts[toContext] = clientcmdapi.NewContext() + toStartingConfig.Contexts[targetCtxName] = clientcmdapi.NewContext() } - toStartingConfig.Clusters[toContext] = fromStartingConfig.Clusters[fromContext] - toStartingConfig.Clusters[toContext].LocationOfOrigin = toConfigAccess.GetDefaultFilename() - toStartingConfig.AuthInfos[toContext] = fromStartingConfig.AuthInfos[fromContext] - toStartingConfig.AuthInfos[toContext].LocationOfOrigin = toConfigAccess.GetDefaultFilename() - toStartingConfig.Contexts[toContext].Cluster = toContext - toStartingConfig.Contexts[toContext].AuthInfo = toContext - toStartingConfig.CurrentContext = toContext - - if err := clientcmd.ModifyConfig(toConfigAccess, *toStartingConfig, true); err != nil { + toStartingConfig.Clusters[targetCtxName] = fromStartingConfig.Clusters[srcCtxName] + toStartingConfig.Clusters[targetCtxName].LocationOfOrigin = k.configAccess.GetDefaultFilename() + toStartingConfig.AuthInfos[targetCtxName] = fromStartingConfig.AuthInfos[srcCtxName] + toStartingConfig.AuthInfos[targetCtxName].LocationOfOrigin = k.configAccess.GetDefaultFilename() + toStartingConfig.Contexts[targetCtxName].Cluster = targetCtxName + toStartingConfig.Contexts[targetCtxName].AuthInfo = targetCtxName + toStartingConfig.CurrentContext = targetCtxName + if err := clientcmd.ModifyConfig(k.configAccess, *toStartingConfig, true); err != nil { return err } - fmt.Printf("context modified for %q and switched over to it.\n", toContext) + fmt.Printf("context modified for %q and switched over to it.\n", targetCtxName) return nil } // RemoveKubeContext removes the contextToRemove from the kubeContext pointed to be fromConfigAccess -func RemoveKubeContext(fromConfigAccess clientcmd.ConfigAccess, contextToRemove string) error { - fromStartingConfig, err := fromConfigAccess.GetStartingConfig() +func (k *ContextManager) RemoveContext(ctxName string) error { + fromStartingConfig, err := k.configAccess.GetStartingConfig() if err != nil { return err } - _, exists := fromStartingConfig.Contexts[contextToRemove] + _, exists := fromStartingConfig.Contexts[ctxName] if !exists { - return fmt.Errorf("context %v doesn't exist", contextToRemove) + return fmt.Errorf("context %v doesn't exist", ctxName) } - delete(fromStartingConfig.Clusters, contextToRemove) - delete(fromStartingConfig.AuthInfos, contextToRemove) - delete(fromStartingConfig.Contexts, contextToRemove) + delete(fromStartingConfig.Clusters, ctxName) + delete(fromStartingConfig.AuthInfos, ctxName) + delete(fromStartingConfig.Contexts, ctxName) fromStartingConfig.CurrentContext = "" - if err := clientcmd.ModifyConfig(fromConfigAccess, *fromStartingConfig, true); err != nil { + if err := clientcmd.ModifyConfig(k.configAccess, *fromStartingConfig, true); err != nil { return err } - fmt.Printf("context removed for %q.\n", contextToRemove) + fmt.Printf("context removed for %q.\n", ctxName) return nil } diff --git a/flytectl/pkg/k8s/mocks/context_ops.go b/flytectl/pkg/k8s/mocks/context_ops.go new file mode 100644 index 0000000000..11b7003d0f --- /dev/null +++ b/flytectl/pkg/k8s/mocks/context_ops.go @@ -0,0 +1,78 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + clientcmd "k8s.io/client-go/tools/clientcmd" + + mock "github.com/stretchr/testify/mock" +) + +// ContextOps is an autogenerated mock type for the ContextOps type +type ContextOps struct { + mock.Mock +} + +type ContextOps_CopyContext struct { + *mock.Call +} + +func (_m ContextOps_CopyContext) Return(_a0 error) *ContextOps_CopyContext { + return &ContextOps_CopyContext{Call: _m.Call.Return(_a0)} +} + +func (_m *ContextOps) OnCopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName string, targetCtxName string) *ContextOps_CopyContext { + c := _m.On("CopyContext", srcConfigAccess, srcCtxName, targetCtxName) + return &ContextOps_CopyContext{Call: c} +} + +func (_m *ContextOps) OnCopyContextMatch(matchers ...interface{}) *ContextOps_CopyContext { + c := _m.On("CopyContext", matchers...) + return &ContextOps_CopyContext{Call: c} +} + +// CopyContext provides a mock function with given fields: srcConfigAccess, srcCtxName, targetCtxName +func (_m *ContextOps) CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName string, targetCtxName string) error { + ret := _m.Called(srcConfigAccess, srcCtxName, targetCtxName) + + var r0 error + if rf, ok := ret.Get(0).(func(clientcmd.ConfigAccess, string, string) error); ok { + r0 = rf(srcConfigAccess, srcCtxName, targetCtxName) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type ContextOps_RemoveContext struct { + *mock.Call +} + +func (_m ContextOps_RemoveContext) Return(_a0 error) *ContextOps_RemoveContext { + return &ContextOps_RemoveContext{Call: _m.Call.Return(_a0)} +} + +func (_m *ContextOps) OnRemoveContext(ctxName string) *ContextOps_RemoveContext { + c := _m.On("RemoveContext", ctxName) + return &ContextOps_RemoveContext{Call: c} +} + +func (_m *ContextOps) OnRemoveContextMatch(matchers ...interface{}) *ContextOps_RemoveContext { + c := _m.On("RemoveContext", matchers...) + return &ContextOps_RemoveContext{Call: c} +} + +// RemoveContext provides a mock function with given fields: ctxName +func (_m *ContextOps) RemoveContext(ctxName string) error { + ret := _m.Called(ctxName) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(ctxName) + } else { + r0 = ret.Error(0) + } + + return r0 +} From 58f2ab7ef98cf79c5bad7f9c83334eabbe9c8628 Mon Sep 17 00:00:00 2001 From: Alekhya Sai Date: Thu, 7 Apr 2022 16:02:10 +0530 Subject: [PATCH 239/645] Minor updates to Readme (#304) Signed-off-by: Alekhya Sai Punnamaraju --- flytectl/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/flytectl/README.md b/flytectl/README.md index d7c8081889..b7676ec842 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -26,8 +26,7 @@ ![Commit since last release](https://img.shields.io/github/commits-since/lyft/flytectl/latest.svg?style=plastic) [![Slack](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social)](https://slack.flyte.org) -FlyteCTL was designed as a portable and lightweight command-line interface to work with Flyte. It is written in Golang -and accesses [FlyteAdmin](https://github.com/flyteorg/flyteadmin/), the control plane for Flyte. +Flytectl was designed as a portable and lightweight command-line interface to work with Flyte. It is written in Golang and accesses [FlyteAdmin](https://github.com/flyteorg/flyteadmin/), the control plane for Flyte. ## 🚀 Quick Start @@ -68,5 +67,5 @@ You can find the detailed contribution guide [here](docs/source/contribute.rst).

-Refer to the [issues](https://docs.flyte.org/en/latest/community/contribute.html#issues) section in the contribution +Refer to the [issues](https://docs.flyte.org/en/latest/community/contribute.html#file-an-issue) section in the contribution guide if you'd like to file an issue. From a4702fbcd9058b498b7b88c5cf3a4c12d533858d Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Fri, 8 Apr 2022 23:05:57 +0530 Subject: [PATCH 240/645] Filtering on activation state of workflows (#305) * Added named entity fetch on workflow which also support state filter Signed-off-by: Prafulla Mahindrakar * Fixed docs Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/get/workflow.go | 27 ++++++++---- flytectl/cmd/get/workflow_test.go | 37 +++++++++------- flytectl/pkg/ext/fetcher.go | 3 ++ .../ext/mocks/admin_fetcher_ext_interface.go | 41 ++++++++++++++++++ flytectl/pkg/ext/workflow_fetcher.go | 16 +++++++ flytectl/pkg/ext/workflow_fetcher_test.go | 42 +++++++++++++++++-- flytectl/pkg/filters/util.go | 20 +++++++++ 7 files changed, 162 insertions(+), 24 deletions(-) diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index f2b3650250..c428c2d6a7 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -23,7 +23,7 @@ Retrieve all the workflows within project and domain (workflow/workflows can be flytectl get workflow -p flytesnacks -d development -Retrieve workflow by name within project and domain: +Retrieve all versions of a workflow by name within project and domain: :: @@ -103,6 +103,14 @@ var listWorkflowColumns = []printer.Column{ {Header: "Created At", JSONPath: "$.closure.createdAt"}, } +var namedEntityColumns = []printer.Column{ + {Header: "Project", JSONPath: "$.id.project"}, + {Header: "Domain", JSONPath: "$.id.domain"}, + {Header: "Name", JSONPath: "$.id.name"}, + {Header: "Description", JSONPath: "$.metadata.description"}, + {Header: "State", JSONPath: "$.metadata.state"}, +} + func WorkflowToProtoMessages(l []*admin.Workflow) []proto.Message { messages := make([]proto.Message, 0, len(l)) for _, m := range l { @@ -111,6 +119,14 @@ func WorkflowToProtoMessages(l []*admin.Workflow) []proto.Message { return messages } +func NamedEntityToProtoMessages(l []*admin.NamedEntity) []proto.Message { + messages := make([]proto.Message, 0, len(l)) + for _, m := range l { + messages = append(messages, m) + } + return messages +} + func WorkflowToTableProtoMessages(l []*admin.Workflow) []proto.Message { messages := make([]proto.Message, 0, len(l)) for _, m := range l { @@ -155,16 +171,13 @@ func getWorkflowFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandC return adminPrinter.Print(config.GetConfig().MustOutputFormat(), columns, WorkflowToProtoMessages(workflows)...) } - workflows, err = cmdCtx.AdminFetcherExt().FetchAllVerOfWorkflow(ctx, "", config.GetConfig().Project, config.GetConfig().Domain, workflowconfig.DefaultConfig.Filter) + nameEntities, err := cmdCtx.AdminFetcherExt().FetchAllWorkflows(ctx, config.GetConfig().Project, config.GetConfig().Domain, workflowconfig.DefaultConfig.Filter) if err != nil { return err } - logger.Debugf(ctx, "Retrieved %v workflows", len(workflows)) - if config.GetConfig().MustOutputFormat() == printer.OutputFormatTABLE { - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), listWorkflowColumns, WorkflowToTableProtoMessages(workflows)...) - } - return adminPrinter.Print(config.GetConfig().MustOutputFormat(), listWorkflowColumns, WorkflowToProtoMessages(workflows)...) + logger.Debugf(ctx, "Retrieved %v workflows", len(nameEntities)) + return adminPrinter.Print(config.GetConfig().MustOutputFormat(), namedEntityColumns, NamedEntityToProtoMessages(nameEntities)...) } // FetchWorkflowForName fetches the workflow give it name. diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go index d0b50007ca..c622d8e3fc 100644 --- a/flytectl/cmd/get/workflow_test.go +++ b/flytectl/cmd/get/workflow_test.go @@ -22,20 +22,12 @@ import ( ) var ( - resourceListRequestWorkflow *admin.ResourceListRequest - workflowListResponse *admin.WorkflowList - argsWf []string - workflow1 *admin.Workflow - workflows []*admin.Workflow + argsWf []string + workflow1 *admin.Workflow + workflows []*admin.Workflow ) func getWorkflowSetup() { - resourceListRequestWorkflow = &admin.ResourceListRequest{ - Id: &admin.NamedEntityIdentifier{ - Project: projectValue, - Domain: domainValue, - }, - } variableMap := map[string]*core.Variable{ "var1": { @@ -97,9 +89,6 @@ func getWorkflowSetup() { }, } workflows = []*admin.Workflow{workflow1, workflow2} - workflowListResponse = &admin.WorkflowList{ - Workflows: workflows, - } argsWf = []string{"workflow1"} workflow.DefaultConfig.Latest = false workflow.DefaultConfig.Version = "" @@ -149,6 +138,26 @@ func TestGetWorkflowFuncWithError(t *testing.T) { assert.NotNil(t, err) }) + t.Run("fetching all workflow success", func(t *testing.T) { + s := setup() + getWorkflowSetup() + var args []string + s.FetcherExt.OnFetchAllWorkflowsMatch(mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return([]*admin.NamedEntity{}, nil) + err := getWorkflowFunc(s.Ctx, args, s.CmdCtx) + assert.Nil(t, err) + }) + + t.Run("fetching all workflow error", func(t *testing.T) { + s := setup() + getWorkflowSetup() + var args []string + s.FetcherExt.OnFetchAllWorkflowsMatch(mock.Anything, mock.Anything, + mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error fetching all workflows")) + err := getWorkflowFunc(s.Ctx, args, s.CmdCtx) + assert.NotNil(t, err) + }) + } func TestGetWorkflowFuncLatestWithTable(t *testing.T) { diff --git a/flytectl/pkg/ext/fetcher.go b/flytectl/pkg/ext/fetcher.go index 2b8b96f793..2c40e388f6 100644 --- a/flytectl/pkg/ext/fetcher.go +++ b/flytectl/pkg/ext/fetcher.go @@ -49,6 +49,9 @@ type AdminFetcherExtInterface interface { // FetchTaskVersion fetches particular version of task in a project, domain FetchTaskVersion(ctx context.Context, name, version, project, domain string) (*admin.Task, error) + // FetchAllWorkflows fetches all workflows in project domain + FetchAllWorkflows(ctx context.Context, project, domain string, filter filters.Filters) ([]*admin.NamedEntity, error) + // FetchAllVerOfWorkflow fetches all versions of task in a project, domain FetchAllVerOfWorkflow(ctx context.Context, name, project, domain string, filter filters.Filters) ([]*admin.Workflow, error) diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index 623199b9f9..18906ce863 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -176,6 +176,47 @@ func (_m *AdminFetcherExtInterface) FetchAllVerOfWorkflow(ctx context.Context, n return r0, r1 } +type AdminFetcherExtInterface_FetchAllWorkflows struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchAllWorkflows) Return(_a0 []*admin.NamedEntity, _a1 error) *AdminFetcherExtInterface_FetchAllWorkflows { + return &AdminFetcherExtInterface_FetchAllWorkflows{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchAllWorkflows(ctx context.Context, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchAllWorkflows { + c := _m.On("FetchAllWorkflows", ctx, project, domain, filter) + return &AdminFetcherExtInterface_FetchAllWorkflows{Call: c} +} + +func (_m *AdminFetcherExtInterface) OnFetchAllWorkflowsMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchAllWorkflows { + c := _m.On("FetchAllWorkflows", matchers...) + return &AdminFetcherExtInterface_FetchAllWorkflows{Call: c} +} + +// FetchAllWorkflows provides a mock function with given fields: ctx, project, domain, filter +func (_m *AdminFetcherExtInterface) FetchAllWorkflows(ctx context.Context, project string, domain string, filter filters.Filters) ([]*admin.NamedEntity, error) { + ret := _m.Called(ctx, project, domain, filter) + + var r0 []*admin.NamedEntity + if rf, ok := ret.Get(0).(func(context.Context, string, string, filters.Filters) []*admin.NamedEntity); ok { + r0 = rf(ctx, project, domain, filter) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*admin.NamedEntity) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, filters.Filters) error); ok { + r1 = rf(ctx, project, domain, filter) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type AdminFetcherExtInterface_FetchExecution struct { *mock.Call } diff --git a/flytectl/pkg/ext/workflow_fetcher.go b/flytectl/pkg/ext/workflow_fetcher.go index 734298a5d4..98438e06f8 100644 --- a/flytectl/pkg/ext/workflow_fetcher.go +++ b/flytectl/pkg/ext/workflow_fetcher.go @@ -26,6 +26,22 @@ func (a *AdminFetcherExtClient) FetchAllVerOfWorkflow(ctx context.Context, workf return wList.Workflows, nil } +// FetchAllWorkflows fetches all workflows in project domain +func (a *AdminFetcherExtClient) FetchAllWorkflows(ctx context.Context, project, domain string, filter filters.Filters) ([]*admin.NamedEntity, error) { + tranformFilters, err := filters.BuildNamedEntityListRequest(filter, project, domain, core.ResourceType_WORKFLOW) + if err != nil { + return nil, err + } + wList, err := a.AdminServiceClient().ListNamedEntities(ctx, tranformFilters) + if err != nil { + return nil, err + } + if len(wList.Entities) == 0 { + return nil, fmt.Errorf("no workflow retrieved for %v project %v domain", project, domain) + } + return wList.Entities, nil +} + // FetchWorkflowLatestVersion fetches latest version for given workflow name func (a *AdminFetcherExtClient) FetchWorkflowLatestVersion(ctx context.Context, name, project, domain string, filter filters.Filters) (*admin.Workflow, error) { // Fetch the latest version of the workflow. diff --git a/flytectl/pkg/ext/workflow_fetcher_test.go b/flytectl/pkg/ext/workflow_fetcher_test.go index 9ae96612a6..da027566e2 100644 --- a/flytectl/pkg/ext/workflow_fetcher_test.go +++ b/flytectl/pkg/ext/workflow_fetcher_test.go @@ -17,9 +17,10 @@ import ( ) var ( - workflowListResponse *admin.WorkflowList - workflowFilter = filters.Filters{} - workflowResponse *admin.Workflow + workflowListResponse *admin.WorkflowList + namedEntityListResponse *admin.NamedEntityList + workflowFilter = filters.Filters{} + workflowResponse *admin.Workflow ) func getWorkflowFetcherSetup() { @@ -79,14 +80,49 @@ func getWorkflowFetcherSetup() { }, } + namedEntity := &admin.NamedEntity{ + Id: &admin.NamedEntityIdentifier{ + Project: "project", + Domain: "domain", + Name: "workflow", + }, + ResourceType: core.ResourceType_WORKFLOW, + } + workflows := []*admin.Workflow{workflow2, workflow1} + namedEntityListResponse = &admin.NamedEntityList{ + Entities: []*admin.NamedEntity{namedEntity}, + } workflowListResponse = &admin.WorkflowList{ Workflows: workflows, } workflowResponse = workflows[0] } +func TestFetchAllWorkflows(t *testing.T) { + t.Run("non empty response", func(t *testing.T) { + getWorkflowFetcherSetup() + adminClient.OnListNamedEntitiesMatch(mock.Anything, mock.Anything).Return(namedEntityListResponse, nil) + _, err := adminFetcherExt.FetchAllWorkflows(ctx, "project", "domain", workflowFilter) + assert.Nil(t, err) + }) + t.Run("empty response", func(t *testing.T) { + getWorkflowFetcherSetup() + namedEntityListResponse := &admin.NamedEntityList{} + adminClient.OnListNamedEntitiesMatch(mock.Anything, mock.Anything).Return(namedEntityListResponse, nil) + _, err := adminFetcherExt.FetchAllWorkflows(ctx, "project", "domain", workflowFilter) + assert.Equal(t, fmt.Errorf("no workflow retrieved for project project domain domain"), err) + }) +} + +func TestFetchAllWorkflowsError(t *testing.T) { + getWorkflowFetcherSetup() + adminClient.OnListNamedEntitiesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchAllWorkflows(ctx, "project", "domain", workflowFilter) + assert.Equal(t, fmt.Errorf("failed"), err) +} + func TestFetchAllVerOfWorkflow(t *testing.T) { getWorkflowFetcherSetup() adminClient.OnListWorkflowsMatch(mock.Anything, mock.Anything).Return(workflowListResponse, nil) diff --git a/flytectl/pkg/filters/util.go b/flytectl/pkg/filters/util.go index 6d2501e4d5..b8584a7a57 100644 --- a/flytectl/pkg/filters/util.go +++ b/flytectl/pkg/filters/util.go @@ -4,6 +4,7 @@ import ( "strconv" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) func BuildResourceListRequestWithName(c Filters, project, domain, name string) (*admin.ResourceListRequest, error) { @@ -29,6 +30,25 @@ func BuildResourceListRequestWithName(c Filters, project, domain, name string) ( return request, nil } +func BuildNamedEntityListRequest(c Filters, project, domain string, resourceType core.ResourceType) (*admin.NamedEntityListRequest, error) { + fieldSelector, err := Transform(SplitTerms(c.FieldSelector)) + if err != nil { + return nil, err + } + request := &admin.NamedEntityListRequest{ + Limit: uint32(c.Limit), + Token: getToken(c), + Filters: fieldSelector, + Project: project, + Domain: domain, + ResourceType: resourceType, + } + if sort := buildSortingRequest(c); sort != nil { + request.SortBy = sort + } + return request, nil +} + func BuildProjectListRequest(c Filters) (*admin.ProjectListRequest, error) { fieldSelector, err := Transform(SplitTerms(c.FieldSelector)) if err != nil { From dd4655d7abbf729772ff1d5f2d7190f3c945b9c9 Mon Sep 17 00:00:00 2001 From: Haytham Abuelfutuh Date: Fri, 8 Apr 2022 17:16:19 -0700 Subject: [PATCH 241/645] Add ContentMD5 to fast register upload request (#303) * Pass file hash Signed-off-by: Haytham Abuelfutuh * Send MD5 as []byte Signed-off-by: Haytham Abuelfutuh * Update deps Signed-off-by: Haytham Abuelfutuh * Fix compile error and unit tests Signed-off-by: Haytham Abuelfutuh --- flytectl/cmd/register/register_util.go | 22 ++++++++++++++------- flytectl/cmd/register/register_util_test.go | 14 +++++++------ flytectl/go.mod | 2 +- flytectl/go.sum | 4 ++-- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 1982417f16..3d68cca648 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -4,6 +4,8 @@ import ( "archive/tar" "compress/gzip" "context" + "crypto/md5" //#nosec + "encoding/base64" "errors" "fmt" "io" @@ -705,7 +707,10 @@ func uploadFastRegisterArtifact(ctx context.Context, project, domain, sourceCode return "", err } - size, err := getTotalSize(dataRefReaderCloser) + /* #nosec */ + hash := md5.New() + /* #nosec */ + size, err := io.Copy(hash, dataRefReaderCloser) if err != nil { return "", err } @@ -720,12 +725,14 @@ func uploadFastRegisterArtifact(ctx context.Context, project, domain, sourceCode return "", err } + h := hash.Sum(nil) remotePath := storage.DataReference(deprecatedSourceUploadPath) _, fileName := filepath.Split(sourceCodeFilePath) resp, err := dataProxyClient.CreateUploadLocation(ctx, &service.CreateUploadLocationRequest{ - Project: project, - Domain: domain, - Suffix: strings.Join([]string{version, fileName}, "/"), + Project: project, + Domain: domain, + Filename: fileName, + ContentMd5: h, }) if err != nil { @@ -737,7 +744,7 @@ func uploadFastRegisterArtifact(ctx context.Context, project, domain, sourceCode } if resp != nil && len(resp.SignedUrl) > 0 { - return storage.DataReference(resp.NativeUrl), DirectUpload(resp.SignedUrl, size, dataRefReaderCloser) + return storage.DataReference(resp.NativeUrl), DirectUpload(resp.SignedUrl, h, size, dataRefReaderCloser) } dataStore, err := getStorageClient(ctx) @@ -764,7 +771,7 @@ func uploadFastRegisterArtifact(ctx context.Context, project, domain, sourceCode return remotePath, nil } -func DirectUpload(url string, size int64, data io.Reader) error { +func DirectUpload(url string, contentMD5 []byte, size int64, data io.Reader) error { req, err := http.NewRequest(http.MethodPut, url, data) if err != nil { return err @@ -772,6 +779,7 @@ func DirectUpload(url string, size int64, data io.Reader) error { req.ContentLength = size req.Header.Set("Content-Length", strconv.FormatInt(size, 10)) + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(contentMD5)) client := &http.Client{} res, err := client.Do(req) @@ -785,7 +793,7 @@ func DirectUpload(url string, size int64, data io.Reader) error { return fmt.Errorf("received response code [%v]. Failed to read response body. Error: %w", res.StatusCode, err) } - return fmt.Errorf("bad status: %s : %s", res.Status, string(raw)) + return fmt.Errorf("failed uploading to [%v]. bad status: %s: %s", url, res.Status, string(raw)) } return nil diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index ca55bb348c..8b614ed0f6 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -384,9 +384,10 @@ func TestUploadFastRegisterArtifact(t *testing.T) { assert.Nil(t, err) Client = store s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(s.Ctx, &service.CreateUploadLocationRequest{ - Project: "flytesnacks", - Domain: "development", - Suffix: "/flytesnacks-core.tgz", + Project: "flytesnacks", + Domain: "development", + Filename: "flytesnacks-core.tgz", + ContentMd5: []uint8{0x19, 0x72, 0x39, 0xcd, 0x85, 0x2d, 0xf1, 0x79, 0x8f, 0x6b, 0x3, 0xb3, 0xa9, 0x6c, 0xec, 0xa0}, }).Return(&service.CreateUploadLocationResponse{}, nil) _, err = uploadFastRegisterArtifact(s.Ctx, "flytesnacks", "development", "testdata/flytesnacks-core.tgz", "", s.MockClient.DataProxyClient(), rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath) assert.Nil(t, err) @@ -401,9 +402,10 @@ func TestUploadFastRegisterArtifact(t *testing.T) { assert.Nil(t, err) Client = store s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(s.Ctx, &service.CreateUploadLocationRequest{ - Project: "flytesnacks", - Domain: "development", - Suffix: "/flytesnacks-core.tgz", + Project: "flytesnacks", + Domain: "development", + Filename: "flytesnacks-core.tgz", + ContentMd5: []uint8{0x19, 0x72, 0x39, 0xcd, 0x85, 0x2d, 0xf1, 0x79, 0x8f, 0x6b, 0x3, 0xb3, 0xa9, 0x6c, 0xec, 0xa0}, }).Return(&service.CreateUploadLocationResponse{}, nil) _, err = uploadFastRegisterArtifact(context.Background(), "flytesnacks", "development", "testdata/flytesnacks-core.tgz", "", s.MockClient.DataProxyClient(), rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath) assert.Nil(t, err) diff --git a/flytectl/go.mod b/flytectl/go.mod index dcadd78d31..2d68091af6 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.24.10 + github.com/flyteorg/flyteidl v0.24.15 github.com/flyteorg/flytestdlib v0.4.16 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 357cec6285..23095dc02a 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -364,8 +364,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.24.10 h1:fCYpfp5fxKbhRMSkP0Hdw5lOPBTItLU1A3WA1Lc7sEU= -github.com/flyteorg/flyteidl v0.24.10/go.mod h1:vHSugApgS3hRITIafzQDU8DZD/W8wFRfFcgaFU35Dww= +github.com/flyteorg/flyteidl v0.24.15 h1:Iqbwx3w1a4Dh6byRZrZMlHsKPKoOZbBiS9vR0iXzacY= +github.com/flyteorg/flyteidl v0.24.15/go.mod h1:vHSugApgS3hRITIafzQDU8DZD/W8wFRfFcgaFU35Dww= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= From e22bce68fadbbfc9c415c33e2543b724c3555efb Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Mon, 11 Apr 2022 14:15:17 -0700 Subject: [PATCH 242/645] Update documentation (#301) Signed-off-by: Flyte-Bot Co-authored-by: EngHabu --- flytectl/docs/source/gen/flytectl.rst | 13 ++++ .../docs/source/gen/flytectl_completion.rst | 13 ++++ flytectl/docs/source/gen/flytectl_config.rst | 13 ++++ .../source/gen/flytectl_config_discover.rst | 13 ++++ .../docs/source/gen/flytectl_config_docs.rst | 13 ++++ .../docs/source/gen/flytectl_config_init.rst | 13 ++++ .../source/gen/flytectl_config_validate.rst | 13 ++++ flytectl/docs/source/gen/flytectl_create.rst | 13 ++++ .../source/gen/flytectl_create_execution.rst | 68 ++++--------------- .../source/gen/flytectl_create_project.rst | 13 ++++ flytectl/docs/source/gen/flytectl_delete.rst | 13 ++++ ...ectl_delete_cluster-resource-attribute.rst | 13 ++++ ...lytectl_delete_execution-cluster-label.rst | 13 ++++ ...tectl_delete_execution-queue-attribute.rst | 13 ++++ .../source/gen/flytectl_delete_execution.rst | 13 ++++ .../gen/flytectl_delete_plugin-override.rst | 13 ++++ ...lytectl_delete_task-resource-attribute.rst | 13 ++++ ...tectl_delete_workflow-execution-config.rst | 13 ++++ flytectl/docs/source/gen/flytectl_get.rst | 13 ++++ ...lytectl_get_cluster-resource-attribute.rst | 13 ++++ .../flytectl_get_execution-cluster-label.rst | 13 ++++ ...flytectl_get_execution-queue-attribute.rst | 13 ++++ .../source/gen/flytectl_get_execution.rst | 13 ++++ .../source/gen/flytectl_get_launchplan.rst | 13 ++++ .../gen/flytectl_get_plugin-override.rst | 13 ++++ .../docs/source/gen/flytectl_get_project.rst | 13 ++++ .../flytectl_get_task-resource-attribute.rst | 13 ++++ .../docs/source/gen/flytectl_get_task.rst | 13 ++++ ...flytectl_get_workflow-execution-config.rst | 14 ++++ .../docs/source/gen/flytectl_get_workflow.rst | 15 +++- .../docs/source/gen/flytectl_register.rst | 13 ++++ .../source/gen/flytectl_register_examples.rst | 35 +++++++--- .../source/gen/flytectl_register_files.rst | 35 +++++++--- flytectl/docs/source/gen/flytectl_sandbox.rst | 13 ++++ .../docs/source/gen/flytectl_sandbox_exec.rst | 13 ++++ .../source/gen/flytectl_sandbox_start.rst | 29 ++++++-- .../source/gen/flytectl_sandbox_status.rst | 13 ++++ .../source/gen/flytectl_sandbox_teardown.rst | 13 ++++ flytectl/docs/source/gen/flytectl_update.rst | 13 ++++ ...ectl_update_cluster-resource-attribute.rst | 13 ++++ ...lytectl_update_execution-cluster-label.rst | 13 ++++ ...tectl_update_execution-queue-attribute.rst | 13 ++++ .../source/gen/flytectl_update_execution.rst | 13 ++++ .../gen/flytectl_update_launchplan-meta.rst | 13 ++++ .../source/gen/flytectl_update_launchplan.rst | 13 ++++ .../gen/flytectl_update_plugin-override.rst | 13 ++++ .../source/gen/flytectl_update_project.rst | 13 ++++ .../source/gen/flytectl_update_task-meta.rst | 13 ++++ ...lytectl_update_task-resource-attribute.rst | 13 ++++ ...tectl_update_workflow-execution-config.rst | 13 ++++ .../gen/flytectl_update_workflow-meta.rst | 13 ++++ flytectl/docs/source/gen/flytectl_upgrade.rst | 13 ++++ flytectl/docs/source/gen/flytectl_version.rst | 13 ++++ 53 files changed, 724 insertions(+), 83 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 03357644e9..fd883f5a55 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -16,6 +16,7 @@ Options :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -31,10 +32,22 @@ Options --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. -h, --help help for flytectl --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index e9a33b0ae6..cec584ee98 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -85,6 +85,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -100,10 +101,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 86138b2491..43e3c3f1e7 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -25,6 +25,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -40,10 +41,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index a2c248fdac..63144832b5 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -27,6 +27,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -42,12 +43,24 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --file stringArray Passes the config file to load. If empty, it'll first search for the config file path then, if found, will load config from there. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_config_docs.rst b/flytectl/docs/source/gen/flytectl_config_docs.rst index ec4ee408d7..79a9313af6 100644 --- a/flytectl/docs/source/gen/flytectl_config_docs.rst +++ b/flytectl/docs/source/gen/flytectl_config_docs.rst @@ -27,6 +27,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -42,12 +43,24 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --file stringArray Passes the config file to load. If empty, it'll first search for the config file path then, if found, will load config from there. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index 26c1eae2ac..d26dd15c91 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -59,6 +59,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -74,12 +75,24 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --file stringArray Passes the config file to load. If empty, it'll first search for the config file path then, if found, will load config from there. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index bcb53f6e61..28c7fe2002 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -29,6 +29,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -44,12 +45,24 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. --file stringArray Passes the config file to load. If empty, it'll first search for the config file path then, if found, will load config from there. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index 3839af1a4a..3caac8361c 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -28,6 +28,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -43,10 +44,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 55ab913ddb..a46f88cc0e 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -10,15 +10,10 @@ Synopsis -Create execution resources for a given workflow or task in a project and domain. - +Create execution resources for a given workflow or task in a project and domain. There are three steps to generate an execution, as outlined below: - -Create execution for a task -=========================== - 1. Generate the execution spec file using the :ref:`get task ` command. :: @@ -68,53 +63,6 @@ It is worth noting that the source's and target's project and domain can be diff flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d staging --targetProject flytesnacks -Create execution for a workflow -=============================== - -1. Generate an execution spec file. -:: - - flytectl get launchplan --project flytesnacks --domain development flyte.workflows.example.my_wf --latest --execFile exec_spec.yaml - -The generated file would look similar to the following: - -.. code-block:: yaml - - iamRoleARN: "" - inputs: {} - kubeServiceAcct: "" - targetDomain: "" - targetProject: "" - version: v1 - workflow: flyte.workflows.example.my_wf - -2. [Optional] Update the inputs for the execution, if needed. The generated spec file can be modified to change the input values, as shown below: - -.. code-block:: yaml - - iamRoleARN: 'arn:aws:iam::12345678:role/defaultrole' - inputs: - sorted_list1: - - 2 - - 4 - - 6 - sorted_list2: - - 1 - - 3 - - 5 - kubeServiceAcct: "" - targetDomain: "" - targetProject: "" - version: "v1" - workflow: flyte.workflows.example.my_wf - -3. Run the execution using the exec spec file. The file can then be passed through the command line. It is worth noting that the source’s and target’s project and domain can be different. -:: - - flytectl create execution --project flytesnacks --domain development --execFile exec_spec.yaml - -The following commands are common to both task and worflow: - To relaunch an execution, pass the current execution ID as follows: :: @@ -175,6 +123,7 @@ Modified file with struct data populated for 'x' and 'y' parameters for the task Usage + :: flytectl create execution [flags] @@ -202,6 +151,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -217,10 +167,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index 6cf6174288..0164bdb98c 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -64,6 +64,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -79,10 +80,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index c5a5d389fc..e4541836e6 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -28,6 +28,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -43,10 +44,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 0fdfa84c68..ffe631f9fa 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -63,6 +63,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -78,10 +79,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index e83edad12e..2ada648bd1 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -60,6 +60,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -75,10 +76,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 710e8e7f10..890563a367 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -64,6 +64,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -79,10 +80,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 711b2a3ffd..0275e5661a 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -71,6 +71,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -86,10 +87,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index f3b01a02c9..a581ac9339 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -65,6 +65,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -80,10 +81,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index ac26e320de..25e05a9ee1 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -65,6 +65,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -80,10 +81,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 0f36d5dd7a..8094452bd6 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -60,6 +60,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -75,10 +76,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 0be6546db4..59ca8cb792 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -28,6 +28,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -43,10 +44,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index 6ea320d7cf..9b390ba8a5 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -71,6 +71,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -86,10 +87,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index c8eed6cbb6..aaedb7f86d 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -70,6 +70,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -85,10 +86,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index 719ac51458..ab34f09fd6 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -73,6 +73,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -88,10 +89,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index ba5c4a0801..cf7579c496 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -103,6 +103,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -118,10 +119,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 2d47156ba8..c1de87a09f 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -127,6 +127,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -142,10 +143,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index aa1ed4f7a1..d4708a6f27 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -92,6 +92,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -107,10 +108,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index f917911908..98b6d84989 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -75,6 +75,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -90,10 +91,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 7cdb8bc5ae..a2bf5a7f87 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -75,6 +75,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -90,10 +91,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 0ce16463f4..3fad267133 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -119,6 +119,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -134,10 +135,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index ce38e4be29..0faeb3c3a7 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -74,6 +74,7 @@ Options :: --attrFile string attribute file name to be used for generating attribute for the resource type. + --gen generates an empty workflow execution config file with conformance to the api format. -h, --help help for workflow-execution-config Options inherited from parent commands @@ -81,6 +82,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -96,10 +98,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 92960d0ddb..e3ddfded83 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -15,7 +15,7 @@ Retrieve all the workflows within project and domain (workflow/workflows can be flytectl get workflow -p flytesnacks -d development -Retrieve workflow by name within project and domain: +Retrieve all versions of a workflow by name within project and domain: :: @@ -103,6 +103,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -118,10 +119,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index aeea164696..556ba2a7c2 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -28,6 +28,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -43,10 +44,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 75d25ea88e..4fa44a4876 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -35,24 +35,25 @@ Options :: - --archive pass in archive file either an http link or local path. - --assumableIamRole string custom assumable iam auth role to register launch plans with. - --continueOnError continue on error when registering files. - --destinationDirectory string Location of source code in container. - --dryRun execute command without making any modifications. - --force force use of version number on entities registered with flyte. + --archive Pass in archive file either an http link or local path. + --assumableIamRole string Custom assumable iam auth role to register launch plans with. + --continueOnError Continue on error when registering files. + --destinationDirectory string Location of source code in container. + --dryRun Execute command without making any modifications. + --force Force use of version number on entities registered with flyte. -h, --help help for examples - --k8ServiceAccount string deprecated. Please use --K8sServiceAccount - --k8sServiceAccount string custom kubernetes service account auth role to register launch plans with. - --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). - --sourceUploadPath string Location for source code in storage. - --version string version of the entity to be registered with flyte which are un-versioned after serialization. + --k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --version string Version of the entity to be registered with flyte which are un-versioned after serialization. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -68,10 +69,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 7c20d694bb..acf414b3e7 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -106,24 +106,25 @@ Options :: - --archive pass in archive file either an http link or local path. - --assumableIamRole string custom assumable iam auth role to register launch plans with. - --continueOnError continue on error when registering files. - --destinationDirectory string Location of source code in container. - --dryRun execute command without making any modifications. - --force force use of version number on entities registered with flyte. + --archive Pass in archive file either an http link or local path. + --assumableIamRole string Custom assumable iam auth role to register launch plans with. + --continueOnError Continue on error when registering files. + --destinationDirectory string Location of source code in container. + --dryRun Execute command without making any modifications. + --force Force use of version number on entities registered with flyte. -h, --help help for files - --k8ServiceAccount string deprecated. Please use --K8sServiceAccount - --k8sServiceAccount string custom kubernetes service account auth role to register launch plans with. - --outputLocationPrefix string custom output location prefix for offloaded types (files/schemas). - --sourceUploadPath string Location for source code in storage. - --version string version of the entity to be registered with flyte which are un-versioned after serialization. + --k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --version string Version of the entity to be registered with flyte which are un-versioned after serialization. Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -139,10 +140,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index dcc3f886cd..97a8478b8e 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -46,6 +46,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -61,10 +62,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index ebe3141dda..0cf40d8033 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -35,6 +35,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -50,10 +51,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 75169d7cec..a638e5cfd0 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -83,19 +83,22 @@ Options :: - --env strings Optional. Provide Env variable in key=value format which can be passed to sandbox container. - -h, --help help for start - --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. - --imagePullPolicy ImagePullPolicy Optional. Defines the image pull behavior [Always/IfNotPresent/Never] (default Always) - --pre Optional. Pre release Version of flyte will be used for sandbox. - --source string Path of your source code - --version string Version of flyte. Only supports flyte releases greater than v0.10.0 + --env strings Optional. Provide Env variable in key=value format which can be passed to sandbox container. + -h, --help help for start + --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. + --imagePullOptions.platform string Forces a specific platform's image to be pulled.' + --imagePullOptions.registryAuth string The base64 encoded credentials for the registry. + --imagePullPolicy ImagePullPolicy Optional. Defines the image pull behavior [Always/IfNotPresent/Never] (default Always) + --pre Optional. Pre release Version of flyte will be used for sandbox. + --source string Path of your source code + --version string Version of flyte. Only supports flyte releases greater than v0.10.0 Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -111,10 +114,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 41b13a1307..b887fe1fcb 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -35,6 +35,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -50,10 +51,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index 18a97a7fb8..2f0a8963da 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -35,6 +35,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -50,10 +51,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index f4c8ae3e06..e65d21155c 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -30,6 +30,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -45,10 +46,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 43f4f034bc..c18ed0d263 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -70,6 +70,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -85,10 +86,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index e809f7c70a..978a731b9e 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -63,6 +63,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -78,10 +79,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 53122c5a8f..593716c991 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -74,6 +74,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -89,10 +90,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_execution.rst b/flytectl/docs/source/gen/flytectl_update_execution.rst index 4ad95da247..6f6096fbd5 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution.rst @@ -43,6 +43,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -58,10 +59,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index b08cd29e4b..a80d575972 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -48,6 +48,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -63,10 +64,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index ca27b38679..d5140d52fb 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -44,6 +44,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -59,10 +60,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 3460f9498b..047c6a41db 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -76,6 +76,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -91,10 +92,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 9277927bae..97e00e97ef 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -103,6 +103,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -118,10 +119,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index b6fec0258c..da3faef868 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -48,6 +48,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -63,10 +64,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 0c9f31dc50..ba6124eca8 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -76,6 +76,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -91,10 +92,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index ae43ff1982..783ef3795c 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -66,6 +66,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -81,10 +82,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index 6e220472c6..5a09fd32aa 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -48,6 +48,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -63,10 +64,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index d1a1e34ee3..802356b635 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -43,6 +43,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -58,10 +59,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 41ad6f8030..1ce459bfec 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -32,6 +32,7 @@ Options inherited from parent commands :: + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") --admin.authorizationHeader string Custom metadata header to pass JWT --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. @@ -47,10 +48,22 @@ Options inherited from parent commands --admin.pkceConfig.refreshTime string (default "5m0s") --admin.pkceConfig.timeout string (default "15s") --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. -c, --config string config file (default is $HOME/.flyte/config.yaml) -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") --logger.level int Sets the minimum logging level. (default 4) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. From f103848633087540cf0876052d45115870ca50c9 Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Tue, 12 Apr 2022 06:06:58 +0000 Subject: [PATCH 243/645] Launch Flyte cluster in the single binary mode (#306) * Using sandbox-lite Signed-off-by: Kevin Su * Add demo command Signed-off-by: Kevin Su * wip Signed-off-by: Kevin Su * wip Signed-off-by: Kevin Su --- flytectl/cmd/demo/demo.go | 64 +++ flytectl/cmd/demo/demo_test.go | 39 ++ flytectl/cmd/demo/exec.go | 47 ++ flytectl/cmd/demo/exec_test.go | 76 +++ flytectl/cmd/demo/start.go | 306 ++++++++++++ flytectl/cmd/demo/start_test.go | 731 +++++++++++++++++++++++++++++ flytectl/cmd/demo/status.go | 42 ++ flytectl/cmd/demo/status_test.go | 39 ++ flytectl/cmd/demo/teardown.go | 62 +++ flytectl/cmd/demo/teardown_test.go | 64 +++ flytectl/cmd/root.go | 2 + flytectl/cmd/sandbox/start.go | 4 +- flytectl/pkg/docker/docker_util.go | 8 +- flytectl/pkg/util/util.go | 10 +- flytectl/pkg/util/util_test.go | 2 +- 15 files changed, 1485 insertions(+), 11 deletions(-) create mode 100644 flytectl/cmd/demo/demo.go create mode 100644 flytectl/cmd/demo/demo_test.go create mode 100644 flytectl/cmd/demo/exec.go create mode 100644 flytectl/cmd/demo/exec_test.go create mode 100644 flytectl/cmd/demo/start.go create mode 100644 flytectl/cmd/demo/start_test.go create mode 100644 flytectl/cmd/demo/status.go create mode 100644 flytectl/cmd/demo/status_test.go create mode 100644 flytectl/cmd/demo/teardown.go create mode 100644 flytectl/cmd/demo/teardown_test.go diff --git a/flytectl/cmd/demo/demo.go b/flytectl/cmd/demo/demo.go new file mode 100644 index 0000000000..83cb8afe11 --- /dev/null +++ b/flytectl/cmd/demo/demo.go @@ -0,0 +1,64 @@ +package demo + +import ( + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + cmdcore "github.com/flyteorg/flytectl/cmd/core" + "github.com/spf13/cobra" +) + +// Long descriptions are whitespace sensitive when generating docs using sphinx. +const ( + demoShort = `Helps with demo interactions like start, teardown, status, and exec.` + demoLong = ` +Flyte Demo is a fully standalone minimal environment for running Flyte. +It provides a simplified way of running Flyte demo as a single Docker container locally. + +To create a demo cluster, run: +:: + + flytectl demo start + +To remove a demo cluster, run: +:: + + flytectl demo teardown + +To check the status of the demo container, run: +:: + + flytectl demo status + +To execute commands inside the demo container, use exec: +:: + + flytectl demo exec -- pwd +` +) + +// CreateDemoCommand will return demo command +func CreateDemoCommand() *cobra.Command { + demo := &cobra.Command{ + Use: "demo", + Short: demoShort, + Long: demoLong, + } + + demoResourcesFuncs := map[string]cmdcore.CommandEntry{ + "start": {CmdFunc: startDemoCluster, Aliases: []string{}, ProjectDomainNotRequired: true, + Short: startShort, + Long: startLong, PFlagProvider: sandboxConfig.DefaultConfig}, + "teardown": {CmdFunc: teardownDemoCluster, Aliases: []string{}, ProjectDomainNotRequired: true, + Short: teardownShort, + Long: teardownLong}, + "status": {CmdFunc: demoClusterStatus, Aliases: []string{}, ProjectDomainNotRequired: true, + Short: statusShort, + Long: statusLong}, + "exec": {CmdFunc: demoClusterExec, Aliases: []string{}, ProjectDomainNotRequired: true, + Short: execShort, + Long: execLong}, + } + + cmdcore.AddCommands(demo, demoResourcesFuncs) + + return demo +} diff --git a/flytectl/cmd/demo/demo_test.go b/flytectl/cmd/demo/demo_test.go new file mode 100644 index 0000000000..0ce332867a --- /dev/null +++ b/flytectl/cmd/demo/demo_test.go @@ -0,0 +1,39 @@ +package demo + +import ( + "fmt" + "sort" + "testing" + + "gotest.tools/assert" +) + +func TestCreateDemoCommand(t *testing.T) { + demoCommand := CreateDemoCommand() + assert.Equal(t, demoCommand.Use, "demo") + assert.Equal(t, demoCommand.Short, "Helps with demo interactions like start, teardown, status, and exec.") + fmt.Println(demoCommand.Commands()) + assert.Equal(t, len(demoCommand.Commands()), 4) + cmdNouns := demoCommand.Commands() + // Sort by Use value. + sort.Slice(cmdNouns, func(i, j int) bool { + return cmdNouns[i].Use < cmdNouns[j].Use + }) + + assert.Equal(t, cmdNouns[0].Use, "exec") + assert.Equal(t, cmdNouns[0].Short, execShort) + assert.Equal(t, cmdNouns[0].Long, execLong) + + assert.Equal(t, cmdNouns[1].Use, "start") + assert.Equal(t, cmdNouns[1].Short, startShort) + assert.Equal(t, cmdNouns[1].Long, startLong) + + assert.Equal(t, cmdNouns[2].Use, "status") + assert.Equal(t, cmdNouns[2].Short, statusShort) + assert.Equal(t, cmdNouns[2].Long, statusLong) + + assert.Equal(t, cmdNouns[3].Use, "teardown") + assert.Equal(t, cmdNouns[3].Short, teardownShort) + assert.Equal(t, cmdNouns[3].Long, teardownLong) + +} diff --git a/flytectl/cmd/demo/exec.go b/flytectl/cmd/demo/exec.go new file mode 100644 index 0000000000..b0d9510c72 --- /dev/null +++ b/flytectl/cmd/demo/exec.go @@ -0,0 +1,47 @@ +package demo + +import ( + "context" + "fmt" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/docker" +) + +const ( + execShort = "Executes non-interactive command inside the demo container" + execLong = ` +Run non-interactive commands inside the demo container and immediately return the output. +By default, "flytectl exec" is present in the /root directory inside the demo container. + +:: + + flytectl demo exec -- ls -al + +Usage` +) + +func demoClusterExec(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + cli, err := docker.GetDockerClient() + if err != nil { + return err + } + if len(args) > 0 { + return execute(ctx, cli, args) + } + return fmt.Errorf("missing argument. Please check usage examples by running flytectl demo exec --help") +} + +func execute(ctx context.Context, cli docker.Docker, args []string) error { + c := docker.GetSandbox(ctx, cli) + if c != nil { + exec, err := docker.ExecCommend(ctx, cli, c.ID, args) + if err != nil { + return err + } + if err := docker.InspectExecResp(ctx, cli, exec.ID); err != nil { + return err + } + } + return nil +} diff --git a/flytectl/cmd/demo/exec_test.go b/flytectl/cmd/demo/exec_test.go new file mode 100644 index 0000000000..0375be916c --- /dev/null +++ b/flytectl/cmd/demo/exec_test.go @@ -0,0 +1,76 @@ +package demo + +import ( + "bufio" + "context" + "fmt" + "io" + "strings" + "testing" + + "github.com/flyteorg/flytectl/cmd/testutils" + + admin2 "github.com/flyteorg/flyteidl/clients/go/admin" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/stretchr/testify/assert" + + "github.com/docker/docker/api/types" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/stretchr/testify/mock" +) + +func TestDemoClusterExec(t *testing.T) { + mockDocker := &mocks.Docker{} + mockOutStream := new(io.Writer) + ctx := context.Background() + mockClient := admin2.InitializeMockClientset() + cmdCtx := cmdCore.NewCommandContext(mockClient, *mockOutStream) + reader := bufio.NewReader(strings.NewReader("test")) + + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + docker.ExecConfig.Cmd = []string{"ls -al"} + mockDocker.OnContainerExecCreateMatch(ctx, mock.Anything, docker.ExecConfig).Return(types.IDResponse{}, nil) + mockDocker.OnContainerExecInspectMatch(ctx, mock.Anything).Return(types.ContainerExecInspect{}, nil) + mockDocker.OnContainerExecAttachMatch(ctx, mock.Anything, types.ExecStartCheck{}).Return(types.HijackedResponse{ + Reader: reader, + }, fmt.Errorf("Test")) + docker.Client = mockDocker + err := demoClusterExec(ctx, []string{"ls -al"}, cmdCtx) + + assert.NotNil(t, err) +} + +func TestSandboxClusterExecWithoutCmd(t *testing.T) { + mockDocker := &mocks.Docker{} + reader := bufio.NewReader(strings.NewReader("test")) + s := testutils.Setup() + ctx := s.Ctx + + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + docker.ExecConfig.Cmd = []string{} + mockDocker.OnContainerExecCreateMatch(ctx, mock.Anything, docker.ExecConfig).Return(types.IDResponse{}, nil) + mockDocker.OnContainerExecInspectMatch(ctx, mock.Anything).Return(types.ContainerExecInspect{}, nil) + mockDocker.OnContainerExecAttachMatch(ctx, mock.Anything, types.ExecStartCheck{}).Return(types.HijackedResponse{ + Reader: reader, + }, fmt.Errorf("Test")) + docker.Client = mockDocker + err := demoClusterExec(ctx, []string{}, s.CmdCtx) + + assert.NotNil(t, err) +} diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go new file mode 100644 index 0000000000..459b5568f4 --- /dev/null +++ b/flytectl/cmd/demo/start.go @@ -0,0 +1,306 @@ +package demo + +import ( + "bufio" + "context" + "fmt" + "io" + "os" + "path/filepath" + "time" + + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/pkg/githubutil" + + "github.com/avast/retry-go" + "github.com/olekukonko/tablewriter" + corev1api "k8s.io/api/core/v1" + corev1 "k8s.io/client-go/kubernetes/typed/core/v1" + + "github.com/docker/docker/api/types/mount" + "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flytectl/pkg/k8s" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/enescakir/emoji" + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/util" + "k8s.io/client-go/tools/clientcmd" +) + +const ( + startShort = "Starts the Flyte demo cluster." + startLong = ` +Flyte demo is a fully standalone minimal environment for running Flyte. +It provides a simplified way of running Flyte demo as a single Docker container locally. + +Starts the demo cluster without any source code: +:: + + flytectl demo start + +Mounts your source code repository inside the demo cluster: +:: + + flytectl demo start --source=$HOME/flyteorg/flytesnacks + +Specify a Flyte demo compliant image with the registry. This is useful in case you want to use an image from your registry. +:: + + flytectl demo start --image docker.io/my-override:latest + +Note: If image flag is passed then Flytectl will ignore version and pre flags. + +Specify a Flyte demo image pull policy. Possible pull policy values are Always, IfNotPresent, or Never: +:: + + flytectl demo start --image docker.io/my-override:latest --imagePullPolicy Always + +Start demo cluster passing environment variables. This can be used to pass docker specific env variables or flyte specific env variables. +eg : for passing timeout value in secs for the demo container use the following. +:: + + flytectl demo start --env FLYTE_TIMEOUT=700 + + +The DURATION can be a positive integer or a floating-point number, followed by an optional unit suffix:: +s - seconds (default) +m - minutes +h - hours +d - days +When no unit is used, it defaults to seconds. If the duration is set to zero, the associated timeout is disabled. + + +eg : for passing multiple environment variables +:: + + flytectl demo start --env USER=foo --env PASSWORD=bar + + +Usage +` + k8sEndpoint = "https://127.0.0.1:30086" + flyteNamespace = "flyte" + diskPressureTaint = "node.kubernetes.io/disk-pressure" + taintEffect = "NoSchedule" + demoContextName = "flyte-sandbox" + demoDockerContext = "default" + demoImageName = "cr.flyte.org/flyteorg/flyte-sandbox-lite" +) + +type ExecResult struct { + StdOut string + StdErr string + ExitCode int +} + +func startDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + cli, err := docker.GetDockerClient() + if err != nil { + return err + } + + reader, err := startDemo(ctx, cli, os.Stdin) + if err != nil { + return err + } + if reader != nil { + docker.WaitForSandbox(reader, docker.SuccessMessage) + } + + if reader != nil { + var k8sClient k8s.K8s + err = retry.Do( + func() error { + k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, k8sEndpoint) + return err + }, + retry.Attempts(10), + ) + if err != nil { + return err + } + if err = updateLocalKubeContext(); err != nil { + return err + } + + if err := watchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { + return err + } + util.PrintSandboxMessage(util.DemoConsolePort) + } + return nil +} + +func updateLocalKubeContext() error { + srcConfigAccess := &clientcmd.PathOptions{ + GlobalFile: docker.Kubeconfig, + LoadingRules: clientcmd.NewDefaultClientConfigLoadingRules(), + } + k8sCtxMgr := k8s.NewK8sContextManager() + return k8sCtxMgr.CopyContext(srcConfigAccess, demoDockerContext, demoContextName) +} + +func startDemo(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio.Scanner, error) { + fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) + + if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { + if err.Error() != clierrors.ErrSandboxExists { + return nil, err + } + fmt.Printf("Existing details of your demo cluster") + util.PrintSandboxMessage(util.DemoConsolePort) + return nil, nil + } + + if err := util.SetupFlyteDir(); err != nil { + return nil, err + } + + templateValues := configutil.ConfigTemplateSpec{ + Host: "localhost:30081", + Insecure: true, + } + if err := configutil.SetupConfig(configutil.FlytectlConfig, configutil.GetSandboxTemplate(), templateValues); err != nil { + return nil, err + } + + volumes := docker.Volumes + sandboxDefaultConfig := sandboxConfig.DefaultConfig + if vol, err := mountVolume(sandboxDefaultConfig.Source, docker.Source); err != nil { + return nil, err + } else if vol != nil { + volumes = append(volumes, *vol) + } + demoImage := sandboxConfig.DefaultConfig.Image + if len(demoImage) == 0 { + image, version, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, demoImageName, sandboxConfig.DefaultConfig.Prerelease) + if err != nil { + return nil, err + } + demoImage = image + fmt.Printf("%v Running Flyte %s release\n", emoji.Whale, version) + } + fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, demoImage) + if err := docker.PullDockerImage(ctx, cli, demoImage, sandboxConfig.DefaultConfig.ImagePullPolicy, sandboxConfig.DefaultConfig.ImagePullOptions); err != nil { + return nil, err + } + + fmt.Printf("%v booting flyte-demo container\n", emoji.FactoryWorker) + exposedPorts, portBindings, _ := docker.GetSandboxPorts() + ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, + demoImage, sandboxDefaultConfig.Env) + + if err != nil { + fmt.Printf("%v Something went wrong: Failed to start demo container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) + return nil, err + } + + logReader, err := docker.ReadLogs(ctx, cli, ID) + if err != nil { + return nil, err + } + + return logReader, nil +} + +func mountVolume(file, destination string) (*mount.Mount, error) { + if len(file) > 0 { + source, err := filepath.Abs(file) + if err != nil { + return nil, err + } + return &mount.Mount{ + Type: mount.TypeBind, + Source: source, + Target: destination, + }, nil + } + return nil, nil +} + +func watchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface) error { + var data = os.Stdout + table := tablewriter.NewWriter(data) + table.SetHeader([]string{"Service", "Status", "Namespace"}) + table.SetRowLine(true) + + for { + isTaint, err := isNodeTainted(ctx, appsClient) + if err != nil { + return err + } + if isTaint { + return fmt.Errorf("docker sandbox doesn't have sufficient memory available. Please run docker system prune -a --volumes") + } + + pods, err := getFlyteDeployment(ctx, appsClient) + if err != nil { + return err + } + table.ClearRows() + table.SetAutoWrapText(false) + table.SetAutoFormatHeaders(true) + + // Clear os.Stdout + _, _ = data.WriteString("\x1b[3;J\x1b[H\x1b[2J") + + var total, ready int + total = len(pods.Items) + ready = 0 + if total != 0 { + for _, v := range pods.Items { + if isPodReady(v) { + ready++ + } + if len(v.Status.Conditions) > 0 { + table.Append([]string{v.GetName(), string(v.Status.Phase), v.GetNamespace()}) + } + } + table.Render() + if total == ready { + break + } + } + + time.Sleep(40 * time.Second) + } + + return nil +} + +func isPodReady(v corev1api.Pod) bool { + if (v.Status.Phase == corev1api.PodRunning) || (v.Status.Phase == corev1api.PodSucceeded) { + return true + } + return false +} + +func getFlyteDeployment(ctx context.Context, client corev1.CoreV1Interface) (*corev1api.PodList, error) { + pods, err := client.Pods(flyteNamespace).List(ctx, v1.ListOptions{}) + if err != nil { + return nil, err + } + return pods, nil +} + +func isNodeTainted(ctx context.Context, client corev1.CoreV1Interface) (bool, error) { + nodes, err := client.Nodes().List(ctx, v1.ListOptions{}) + if err != nil { + return false, err + } + match := 0 + for _, node := range nodes.Items { + for _, c := range node.Spec.Taints { + if c.Key == diskPressureTaint && c.Effect == taintEffect { + match++ + } + } + } + if match > 0 { + return true, nil + } + return false, nil +} diff --git a/flytectl/cmd/demo/start_test.go b/flytectl/cmd/demo/start_test.go new file mode 100644 index 0000000000..50fe22d78d --- /dev/null +++ b/flytectl/cmd/demo/start_test.go @@ -0,0 +1,731 @@ +package demo + +import ( + "context" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/flyteorg/flyteidl/clients/go/admin" + + "github.com/flyteorg/flytectl/pkg/githubutil" + + "github.com/flyteorg/flytectl/pkg/k8s" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/mount" + sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" + k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" + "github.com/flyteorg/flytectl/pkg/util" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + testclient "k8s.io/client-go/kubernetes/fake" +) + +var content = ` +apiVersion: v1 +clusters: +- cluster: + server: https://localhost:8080 + extensions: + - name: client.authentication.k8s.io/exec + extension: + audience: foo + other: bar + name: default +contexts: +- context: + cluster: default + user: default + namespace: bar + name: default +current-context: default +kind: Config +users: +- name: default + user: + exec: + apiVersion: client.authentication.k8s.io/v1alpha1 + args: + - arg-1 + - arg-2 + command: foo-command + provideClusterInfo: true +` + +var fakeNode = &corev1.Node{ + Spec: corev1.NodeSpec{ + Taints: []corev1.Taint{}, + }, +} + +var fakePod = corev1.Pod{ + Status: corev1.PodStatus{ + Phase: corev1.PodRunning, + Conditions: []corev1.PodCondition{}, + }, +} + +func TestStartDemoFunc(t *testing.T) { + p1, p2, _ := docker.GetSandboxPorts() + assert.Nil(t, util.SetupFlyteDir()) + assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm)) + assert.Nil(t, ioutil.WriteFile(docker.Kubeconfig, []byte(content), os.ModePerm)) + + fakePod.SetName("flyte") + + t.Run("Successfully run demo cluster", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + errCh := make(chan error) + sandboxConfig.DefaultConfig.Version = "v0.19.1" + bodyStatus := make(chan container.ContainerWaitOKBody) + image, _, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, demoImageName, false) + assert.Nil(t, err) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: docker.Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startDemo(ctx, mockDocker, os.Stdin) + assert.Nil(t, err) + }) + t.Run("Successfully exit when demo cluster exist", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + errCh := make(chan error) + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: docker.Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + reader, err := startDemo(ctx, mockDocker, strings.NewReader("n")) + assert.Nil(t, err) + assert.Nil(t, reader) + }) + t.Run("Successfully run demo cluster with source code", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() + sandboxConfig.DefaultConfig.Version = "" + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.Source, + Target: docker.Source, + }) + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startDemo(ctx, mockDocker, os.Stdin) + assert.Nil(t, err) + }) + t.Run("Successfully run demo cluster with abs path of source code", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Source = "../" + sandboxConfig.DefaultConfig.Version = "" + absPath, err := filepath.Abs(sandboxConfig.DefaultConfig.Source) + assert.Nil(t, err) + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ + Type: mount.TypeBind, + Source: absPath, + Target: docker.Source, + }) + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startDemo(ctx, mockDocker, os.Stdin) + assert.Nil(t, err) + }) + t.Run("Successfully run demo cluster with specific version", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Version = "v0.18.0" + sandboxConfig.DefaultConfig.Source = "" + + image, _, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, demoImageName, false) + assert.Nil(t, err) + volumes := docker.Volumes + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startDemo(ctx, mockDocker, os.Stdin) + assert.Nil(t, err) + }) + t.Run("Failed run demo cluster with wrong version", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Version = "v0.1444.0" + sandboxConfig.DefaultConfig.Source = "" + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + volumes := docker.Volumes + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startDemo(ctx, mockDocker, os.Stdin) + assert.NotNil(t, err) + }) + t.Run("Error in pulling image", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.Source, + Target: docker.Source, + }) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startDemo(ctx, mockDocker, os.Stdin) + assert.NotNil(t, err) + }) + t.Run("Error in removing existing cluster", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.Source, + Target: docker.Source, + }) + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("error")) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startDemo(ctx, mockDocker, strings.NewReader("y")) + assert.NotNil(t, err) + }) + t.Run("Error in start container", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Source = "" + sandboxConfig.DefaultConfig.Version = "" + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: docker.Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, fmt.Errorf("error")) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startDemo(ctx, mockDocker, os.Stdin) + assert.NotNil(t, err) + }) + t.Run("Error in reading logs", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.Source, + Target: docker.Source, + }) + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, fmt.Errorf("error")) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startDemo(ctx, mockDocker, os.Stdin) + assert.NotNil(t, err) + }) + t.Run("Error in list container", func(t *testing.T) { + ctx := context.Background() + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker := &mocks.Docker{} + sandboxConfig.DefaultConfig.Source = f.UserHomeDir() + sandboxConfig.DefaultConfig.Version = "" + volumes := docker.Volumes + volumes = append(volumes, mount.Mount{ + Type: mount.TypeBind, + Source: sandboxConfig.DefaultConfig.Source, + Target: docker.Source, + }) + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, fmt.Errorf("error")) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + _, err = startDemo(ctx, mockDocker, os.Stdin) + assert.Nil(t, err) + }) + t.Run("Successfully run demo cluster command", func(t *testing.T) { + mockOutStream := new(io.Writer) + ctx := context.Background() + cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) + mockDocker := &mocks.Docker{} + errCh := make(chan error) + client := testclient.NewSimpleClientset() + k8s.Client = client + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + fakeNode.SetName("master") + _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + bodyStatus := make(chan container.ContainerWaitOKBody) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: docker.Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + stringReader := strings.NewReader(docker.SuccessMessage) + reader := ioutil.NopCloser(stringReader) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(reader, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + mockK8sContextMgr := &k8sMocks.ContextOps{} + docker.Client = mockDocker + sandboxConfig.DefaultConfig.Source = "" + sandboxConfig.DefaultConfig.Version = "" + k8s.ContextMgr = mockK8sContextMgr + mockK8sContextMgr.OnCopyContextMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) + err = startDemoCluster(ctx, []string{}, cmdCtx) + assert.Nil(t, err) + }) + t.Run("Error in running demo cluster command", func(t *testing.T) { + mockOutStream := new(io.Writer) + ctx := context.Background() + cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) + mockDocker := &mocks.Docker{} + errCh := make(chan error) + bodyStatus := make(chan container.ContainerWaitOKBody) + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + mockDocker.OnContainerCreate(ctx, &container.Config{ + Env: docker.Environment, + Image: image, + Tty: false, + ExposedPorts: p1, + }, &container.HostConfig{ + Mounts: docker.Volumes, + PortBindings: p2, + Privileged: true, + }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, fmt.Errorf("error")) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + stringReader := strings.NewReader(docker.SuccessMessage) + reader := ioutil.NopCloser(stringReader) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(reader, nil) + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) + docker.Client = mockDocker + sandboxConfig.DefaultConfig.Source = "" + err = startDemoCluster(ctx, []string{}, cmdCtx) + assert.NotNil(t, err) + }) +} + +func TestMonitorFlyteDeployment(t *testing.T) { + t.Run("Monitor k8s deployment fail because of storage", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + k8s.Client = client + fakePod.SetName("flyte") + fakePod.SetName("flyte") + + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + fakeNode.SetName("master") + fakeNode.Spec.Taints = append(fakeNode.Spec.Taints, corev1.Taint{ + Effect: "NoSchedule", + Key: "node.kubernetes.io/disk-pressure", + }) + _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + + err = watchFlyteDeployment(ctx, client.CoreV1()) + assert.NotNil(t, err) + + }) + + t.Run("Monitor k8s deployment success", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + k8s.Client = client + fakePod.SetName("flyte") + fakePod.SetName("flyte") + + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + fakeNode.SetName("master") + fakeNode.Spec.Taints = []corev1.Taint{} + _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + + err = watchFlyteDeployment(ctx, client.CoreV1()) + assert.Nil(t, err) + + }) + +} + +func TestGetFlyteDeploymentCount(t *testing.T) { + + ctx := context.Background() + client := testclient.NewSimpleClientset() + c, err := getFlyteDeployment(ctx, client.CoreV1()) + assert.Nil(t, err) + assert.Equal(t, 0, len(c.Items)) +} + +func TestGetNodeTaintStatus(t *testing.T) { + t.Run("Check node taint with success", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + fakeNode.SetName("master") + _, err := client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + c, err := isNodeTainted(ctx, client.CoreV1()) + assert.Nil(t, err) + assert.Equal(t, false, c) + }) + t.Run("Check node taint with fail", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + fakeNode.SetName("master") + _, err := client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + node, err := client.CoreV1().Nodes().Get(ctx, "master", v1.GetOptions{}) + if err != nil { + t.Error(err) + } + node.Spec.Taints = append(node.Spec.Taints, corev1.Taint{ + Effect: taintEffect, + Key: diskPressureTaint, + }) + _, err = client.CoreV1().Nodes().Update(ctx, node, v1.UpdateOptions{}) + if err != nil { + t.Error(err) + } + c, err := isNodeTainted(ctx, client.CoreV1()) + assert.Nil(t, err) + assert.Equal(t, true, c) + }) +} + +func TestGetDemoImage(t *testing.T) { + t.Run("Get Latest demo cluster", func(t *testing.T) { + image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(image, "cr.flyte.org/flyteorg/flyte-sandbox-lite:dind-")) + }) + + t.Run("Get demo image with version ", func(t *testing.T) { + image, _, err := githubutil.GetFullyQualifiedImageName("v0.14.0", demoImageName, false) + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(image, demoImageName)) + }) + t.Run("Get demo image with wrong version ", func(t *testing.T) { + _, _, err := githubutil.GetFullyQualifiedImageName("v100.1.0", demoImageName, false) + assert.NotNil(t, err) + }) + t.Run("Get demo image with wrong version ", func(t *testing.T) { + _, _, err := githubutil.GetFullyQualifiedImageName("aaaaaa", demoImageName, false) + assert.NotNil(t, err) + }) + t.Run("Get demo image with version that is not supported", func(t *testing.T) { + _, _, err := githubutil.GetFullyQualifiedImageName("v0.10.0", demoImageName, false) + assert.NotNil(t, err) + }) + +} diff --git a/flytectl/cmd/demo/status.go b/flytectl/cmd/demo/status.go new file mode 100644 index 0000000000..67a7767afb --- /dev/null +++ b/flytectl/cmd/demo/status.go @@ -0,0 +1,42 @@ +package demo + +import ( + "context" + "fmt" + + "github.com/enescakir/emoji" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/docker" +) + +const ( + statusShort = "Gets the status of the demo environment." + statusLong = ` +Retrieves the status of the demo environment. Currently, Flyte demo runs as a local Docker container. + +Usage +:: + + flytectl demo status + +` +) + +func demoClusterStatus(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + cli, err := docker.GetDockerClient() + if err != nil { + return err + } + + return printStatus(ctx, cli) +} + +func printStatus(ctx context.Context, cli docker.Docker) error { + c := docker.GetSandbox(ctx, cli) + if c == nil { + fmt.Printf("%v no demo cluster found \n", emoji.StopSign) + return nil + } + fmt.Printf("Flyte demo cluster container image [%s] with status [%s] is in state [%s]", c.Image, c.Status, c.State) + return nil +} diff --git a/flytectl/cmd/demo/status_test.go b/flytectl/cmd/demo/status_test.go new file mode 100644 index 0000000000..7fae8bc43a --- /dev/null +++ b/flytectl/cmd/demo/status_test.go @@ -0,0 +1,39 @@ +package demo + +import ( + "testing" + + "github.com/flyteorg/flytectl/cmd/testutils" + + "github.com/docker/docker/api/types" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/stretchr/testify/assert" +) + +func TestDemoStatus(t *testing.T) { + t.Run("Demo status with zero result", func(t *testing.T) { + mockDocker := &mocks.Docker{} + s := testutils.Setup() + mockDocker.OnContainerList(s.Ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + docker.Client = mockDocker + err := demoClusterStatus(s.Ctx, []string{}, s.CmdCtx) + assert.Nil(t, err) + }) + t.Run("Demo status with running", func(t *testing.T) { + s := testutils.Setup() + ctx := s.Ctx + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + docker.Client = mockDocker + err := demoClusterStatus(ctx, []string{}, s.CmdCtx) + assert.Nil(t, err) + }) +} diff --git a/flytectl/cmd/demo/teardown.go b/flytectl/cmd/demo/teardown.go new file mode 100644 index 0000000000..1308b10b14 --- /dev/null +++ b/flytectl/cmd/demo/teardown.go @@ -0,0 +1,62 @@ +package demo + +import ( + "context" + "fmt" + + "github.com/flyteorg/flytectl/pkg/configutil" + + "github.com/flyteorg/flytectl/pkg/docker" + + "github.com/docker/docker/api/types" + "github.com/enescakir/emoji" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/k8s" +) + +const ( + teardownShort = "Cleans up the demo environment" + teardownLong = ` +Removes the demo cluster and all the Flyte config created by 'demo start': +:: + + flytectl demo teardown + + +Usage +` +) + +func teardownDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + cli, err := docker.GetDockerClient() + if err != nil { + return err + } + + return tearDownDemo(ctx, cli) +} + +func tearDownDemo(ctx context.Context, cli docker.Docker) error { + c := docker.GetSandbox(ctx, cli) + if c != nil { + if err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ + Force: true, + }); err != nil { + return err + } + } + if err := configutil.ConfigCleanup(); err != nil { + fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) + } + if err := removeDemoKubeContext(); err != nil { + fmt.Printf("Kubecontext cleanup failed. Which Failed due to %v \n ", err) + } + fmt.Printf("%v %v Demo cluster is removed successfully. \n", emoji.Broom, emoji.Broom) + return nil +} + +func removeDemoKubeContext() error { + k8sCtxMgr := k8s.NewK8sContextManager() + return k8sCtxMgr.RemoveContext(demoContextName) +} diff --git a/flytectl/cmd/demo/teardown_test.go b/flytectl/cmd/demo/teardown_test.go new file mode 100644 index 0000000000..7741272a2b --- /dev/null +++ b/flytectl/cmd/demo/teardown_test.go @@ -0,0 +1,64 @@ +package demo + +import ( + "context" + "fmt" + "testing" + + "github.com/docker/docker/api/types" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/flyteorg/flytectl/pkg/k8s" + k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" + "github.com/flyteorg/flytectl/pkg/util" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +var containers []types.Container + +func TestTearDownFunc(t *testing.T) { + container1 := types.Container{ + ID: "FlyteSandboxClusterName", + Names: []string{ + docker.FlyteSandboxClusterName, + }, + } + containers = append(containers, container1) + + t.Run("Success", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + mockK8sContextMgr := &k8sMocks.ContextOps{} + k8s.ContextMgr = mockK8sContextMgr + mockK8sContextMgr.OnRemoveContextMatch(mock.Anything).Return(nil) + err := tearDownDemo(ctx, mockDocker) + assert.Nil(t, err) + }) + t.Run("Error", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("err")) + err := tearDownDemo(ctx, mockDocker) + assert.NotNil(t, err) + }) + +} + +func TestTearDownClusterFunc(t *testing.T) { + _ = util.SetupFlyteDir() + _ = util.WriteIntoFile([]byte("data"), configutil.FlytectlConfig) + s := testutils.Setup() + ctx := s.Ctx + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + docker.Client = mockDocker + err := teardownDemoCluster(ctx, []string{}, s.CmdCtx) + assert.Nil(t, err) +} diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index ca08c94966..7ebdd46ab2 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -10,6 +10,7 @@ import ( cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/create" "github.com/flyteorg/flytectl/cmd/delete" + "github.com/flyteorg/flytectl/cmd/demo" "github.com/flyteorg/flytectl/cmd/get" "github.com/flyteorg/flytectl/cmd/register" "github.com/flyteorg/flytectl/cmd/sandbox" @@ -61,6 +62,7 @@ func newRootCmd() *cobra.Command { rootCmd.AddCommand(register.RemoteRegisterCommand()) rootCmd.AddCommand(delete.RemoteDeleteCommand()) rootCmd.AddCommand(sandbox.CreateSandboxCommand()) + rootCmd.AddCommand(demo.CreateDemoCommand()) rootCmd.AddCommand(configuration.CreateConfigCommand()) rootCmd.AddCommand(completionCmd) // Added version command diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index f45c791f08..ceda4c04cd 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -144,7 +144,7 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm if err := watchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { return err } - util.PrintSandboxMessage() + util.PrintSandboxMessage(util.SandBoxConsolePort) } return nil } @@ -166,7 +166,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu return nil, err } fmt.Printf("Existing details of your sandbox") - util.PrintSandboxMessage() + util.PrintSandboxMessage(util.SandBoxConsolePort) return nil, nil } diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 3b6be1c91c..a3825841fc 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -94,11 +94,11 @@ func RemoveSandbox(ctx context.Context, cli Docker, reader io.Reader) error { // GetSandboxPorts will return sandbox ports func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, error) { return nat.ParsePortSpecs([]string{ - "0.0.0.0:30081:30081", // Flyteconsole Port - "0.0.0.0:30082:30082", // Flyteadmin Port + "0.0.0.0:30080:30080", // Flyteconsole Port + "0.0.0.0:30081:30081", // Flyteadmin Port + "0.0.0.0:30082:30082", // K8s Dashboard Port "0.0.0.0:30084:30084", // Minio API Port - "0.0.0.0:30086:30086", // K8s Dashboard Port - "0.0.0.0:30087:30087", // Old Minio Console Port, keeping around for old images + "0.0.0.0:30086:30086", // K8s cluster "0.0.0.0:30088:30088", // Minio Console Port }) } diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index c5f5470dc0..a34aeba5c4 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -18,7 +18,9 @@ import ( ) const ( - progressSuccessMessage = "Flyte is ready! Flyte UI is available at http://localhost:30081/console" + ProgressSuccessMessage = "Flyte is ready! Flyte UI is available at" + SandBoxConsolePort = 30081 + DemoConsolePort = 30080 ) var Ext string @@ -51,14 +53,14 @@ func SetupFlyteDir() error { } // PrintSandboxMessage will print sandbox success message -func PrintSandboxMessage() { +func PrintSandboxMessage(flyteConsolePort int) { kubeconfig := strings.Join([]string{ "$KUBECONFIG", f.FilePathJoin(f.UserHomeDir(), ".kube", "config"), docker.Kubeconfig, }, ":") - - fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, progressSuccessMessage, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) + successMsg := fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessage, flyteConsolePort) + fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, successMsg, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) fmt.Printf("Add KUBECONFIG and FLYTECTL_CONFIG to your environment variable \n") fmt.Printf("export KUBECONFIG=%v \n", kubeconfig) fmt.Printf("export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index 185b20db82..718a244d9c 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -25,7 +25,7 @@ func TestSetupFlyteDir(t *testing.T) { func TestPrintSandboxMessage(t *testing.T) { t.Run("Print Sandbox Message", func(t *testing.T) { - PrintSandboxMessage() + PrintSandboxMessage(SandBoxConsolePort) }) } From d5c31339b42bd22cb353e5e036a7bbcffd52e33a Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Tue, 12 Apr 2022 22:07:59 +0530 Subject: [PATCH 244/645] Added port for postgres in sandbox lite (#308) Signed-off-by: Yuvraj Co-authored-by: Yuvraj --- flytectl/pkg/docker/docker_util.go | 1 + 1 file changed, 1 insertion(+) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index a3825841fc..84374481ea 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -100,6 +100,7 @@ func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, e "0.0.0.0:30084:30084", // Minio API Port "0.0.0.0:30086:30086", // K8s cluster "0.0.0.0:30088:30088", // Minio Console Port + "0.0.0.0:30089:30089", // Postgres Port }) } From 0a1850dd7f6e7d0af6f3f6c3383454c388e5b3a4 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Tue, 12 Apr 2022 09:39:20 -0700 Subject: [PATCH 245/645] Update documentation (#307) Signed-off-by: Flyte-Bot Co-authored-by: EngHabu --- flytectl/docs/source/gen/flytectl.rst | 1 + flytectl/docs/source/gen/flytectl_demo.rst | 111 ++++++++++++++ .../docs/source/gen/flytectl_demo_exec.rst | 96 ++++++++++++ .../docs/source/gen/flytectl_demo_start.rst | 144 ++++++++++++++++++ .../docs/source/gen/flytectl_demo_status.rst | 96 ++++++++++++ .../source/gen/flytectl_demo_teardown.rst | 96 ++++++++++++ 6 files changed, 544 insertions(+) create mode 100644 flytectl/docs/source/gen/flytectl_demo.rst create mode 100644 flytectl/docs/source/gen/flytectl_demo_exec.rst create mode 100644 flytectl/docs/source/gen/flytectl_demo_start.rst create mode 100644 flytectl/docs/source/gen/flytectl_demo_status.rst create mode 100644 flytectl/docs/source/gen/flytectl_demo_teardown.rst diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index fd883f5a55..08ff0e3b50 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -78,6 +78,7 @@ SEE ALSO * :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. * :doc:`flytectl_create` - Creates various Flyte resources such as tasks, workflows, launch plans, executions, and projects. * :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_demo` - Helps with demo interactions like start, teardown, status, and exec. * :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. * :doc:`flytectl_register` - Registers tasks, workflows, and launch plans from a list of generated serialized files. * :doc:`flytectl_sandbox` - Helps with sandbox interactions like start, teardown, status, and exec. diff --git a/flytectl/docs/source/gen/flytectl_demo.rst b/flytectl/docs/source/gen/flytectl_demo.rst new file mode 100644 index 0000000000..47949f304f --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_demo.rst @@ -0,0 +1,111 @@ +.. _flytectl_demo: + +flytectl demo +------------- + +Helps with demo interactions like start, teardown, status, and exec. + +Synopsis +~~~~~~~~ + + + +Flyte Demo is a fully standalone minimal environment for running Flyte. +It provides a simplified way of running Flyte demo as a single Docker container locally. + +To create a demo cluster, run: +:: + + flytectl demo start + +To remove a demo cluster, run: +:: + + flytectl demo teardown + +To check the status of the demo container, run: +:: + + flytectl demo status + +To execute commands inside the demo container, use exec: +:: + + flytectl demo exec -- pwd + + +Options +~~~~~~~ + +:: + + -h, --help help for demo + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - Flytectl CLI tool +* :doc:`flytectl_demo_exec` - Executes non-interactive command inside the demo container +* :doc:`flytectl_demo_start` - Starts the Flyte demo cluster. +* :doc:`flytectl_demo_status` - Gets the status of the demo environment. +* :doc:`flytectl_demo_teardown` - Cleans up the demo environment + diff --git a/flytectl/docs/source/gen/flytectl_demo_exec.rst b/flytectl/docs/source/gen/flytectl_demo_exec.rst new file mode 100644 index 0000000000..9d71ade418 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_demo_exec.rst @@ -0,0 +1,96 @@ +.. _flytectl_demo_exec: + +flytectl demo exec +------------------ + +Executes non-interactive command inside the demo container + +Synopsis +~~~~~~~~ + + + +Run non-interactive commands inside the demo container and immediately return the output. +By default, "flytectl exec" is present in the /root directory inside the demo container. + +:: + + flytectl demo exec -- ls -al + +Usage + +:: + + flytectl demo exec [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for exec + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_demo` - Helps with demo interactions like start, teardown, status, and exec. + diff --git a/flytectl/docs/source/gen/flytectl_demo_start.rst b/flytectl/docs/source/gen/flytectl_demo_start.rst new file mode 100644 index 0000000000..694f0e1390 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_demo_start.rst @@ -0,0 +1,144 @@ +.. _flytectl_demo_start: + +flytectl demo start +------------------- + +Starts the Flyte demo cluster. + +Synopsis +~~~~~~~~ + + + +Flyte demo is a fully standalone minimal environment for running Flyte. +It provides a simplified way of running Flyte demo as a single Docker container locally. + +Starts the demo cluster without any source code: +:: + + flytectl demo start + +Mounts your source code repository inside the demo cluster: +:: + + flytectl demo start --source=$HOME/flyteorg/flytesnacks + +Specify a Flyte demo compliant image with the registry. This is useful in case you want to use an image from your registry. +:: + + flytectl demo start --image docker.io/my-override:latest + +Note: If image flag is passed then Flytectl will ignore version and pre flags. + +Specify a Flyte demo image pull policy. Possible pull policy values are Always, IfNotPresent, or Never: +:: + + flytectl demo start --image docker.io/my-override:latest --imagePullPolicy Always + +Start demo cluster passing environment variables. This can be used to pass docker specific env variables or flyte specific env variables. +eg : for passing timeout value in secs for the demo container use the following. +:: + + flytectl demo start --env FLYTE_TIMEOUT=700 + + +The DURATION can be a positive integer or a floating-point number, followed by an optional unit suffix:: +s - seconds (default) +m - minutes +h - hours +d - days +When no unit is used, it defaults to seconds. If the duration is set to zero, the associated timeout is disabled. + + +eg : for passing multiple environment variables +:: + + flytectl demo start --env USER=foo --env PASSWORD=bar + + +Usage + + +:: + + flytectl demo start [flags] + +Options +~~~~~~~ + +:: + + --env strings Optional. Provide Env variable in key=value format which can be passed to sandbox container. + -h, --help help for start + --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. + --imagePullOptions.platform string Forces a specific platform's image to be pulled.' + --imagePullOptions.registryAuth string The base64 encoded credentials for the registry. + --imagePullPolicy ImagePullPolicy Optional. Defines the image pull behavior [Always/IfNotPresent/Never] (default Always) + --pre Optional. Pre release Version of flyte will be used for sandbox. + --source string Path of your source code + --version string Version of flyte. Only supports flyte releases greater than v0.10.0 + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_demo` - Helps with demo interactions like start, teardown, status, and exec. + diff --git a/flytectl/docs/source/gen/flytectl_demo_status.rst b/flytectl/docs/source/gen/flytectl_demo_status.rst new file mode 100644 index 0000000000..6308a14c4a --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_demo_status.rst @@ -0,0 +1,96 @@ +.. _flytectl_demo_status: + +flytectl demo status +-------------------- + +Gets the status of the demo environment. + +Synopsis +~~~~~~~~ + + + +Retrieves the status of the demo environment. Currently, Flyte demo runs as a local Docker container. + +Usage +:: + + flytectl demo status + + + +:: + + flytectl demo status [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for status + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_demo` - Helps with demo interactions like start, teardown, status, and exec. + diff --git a/flytectl/docs/source/gen/flytectl_demo_teardown.rst b/flytectl/docs/source/gen/flytectl_demo_teardown.rst new file mode 100644 index 0000000000..3ba921e968 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_demo_teardown.rst @@ -0,0 +1,96 @@ +.. _flytectl_demo_teardown: + +flytectl demo teardown +---------------------- + +Cleans up the demo environment + +Synopsis +~~~~~~~~ + + + +Removes the demo cluster and all the Flyte config created by 'demo start': +:: + + flytectl demo teardown + + +Usage + + +:: + + flytectl demo teardown [flags] + +Options +~~~~~~~ + +:: + + -h, --help help for teardown + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 4) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_demo` - Helps with demo interactions like start, teardown, status, and exec. + From d04b1e22b32ee0bf0eb503efb230db6ae02a1a03 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 12 Apr 2022 23:22:54 +0530 Subject: [PATCH 246/645] Adding overriden filter for get workflow (#310) Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/config/subcommand/workflow/workflow_config.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/flytectl/cmd/config/subcommand/workflow/workflow_config.go b/flytectl/cmd/config/subcommand/workflow/workflow_config.go index 34049e08b9..a731cd2f25 100644 --- a/flytectl/cmd/config/subcommand/workflow/workflow_config.go +++ b/flytectl/cmd/config/subcommand/workflow/workflow_config.go @@ -7,8 +7,12 @@ import ( //go:generate pflags Config --default-var DefaultConfig --bind-default-var var ( + wfDefaultFilter = filters.Filters{ + Limit: filters.DefaultLimit, + Page: 1, + } DefaultConfig = &Config{ - Filter: filters.DefaultFilter, + Filter: wfDefaultFilter, } ) From f0930de1faf8809488d43c4db2a62cda6f2b8764 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Wed, 13 Apr 2022 15:12:21 -0700 Subject: [PATCH 247/645] flytectl demo start should print nicely (#311) Signed-off-by: Ketan Umare --- flytectl/cmd/demo/start.go | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index 459b5568f4..116bee98a4 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -96,6 +96,28 @@ type ExecResult struct { ExitCode int } +func primeFlytekitPod(ctx context.Context, podService corev1.PodInterface) { + _, err := podService.Create(ctx, &corev1api.Pod{ + ObjectMeta: v1.ObjectMeta{ + Name: "py39-cacher", + }, + Spec: corev1api.PodSpec{ + RestartPolicy: corev1api.RestartPolicyNever, + Containers: []corev1api.Container{ + { + Name: "flytekit", + Image: "ghcr.io/flyteorg/flytekit:py3.9-latest", + Command: []string{"echo"}, + Args: []string{"Flyte"}, + }, + }, + }, + }, v1.CreateOptions{}) + if err != nil { + fmt.Printf("Failed to create primer pod - %s", err) + } +} + func startDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { cli, err := docker.GetDockerClient() if err != nil { @@ -129,6 +151,7 @@ func startDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.Command if err := watchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { return err } + primeFlytekitPod(ctx, k8sClient.CoreV1().Pods("default")) util.PrintSandboxMessage(util.DemoConsolePort) } return nil @@ -250,7 +273,7 @@ func watchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface var total, ready int total = len(pods.Items) ready = 0 - if total != 0 { + if total > 0 { for _, v := range pods.Items { if isPodReady(v) { ready++ @@ -261,14 +284,15 @@ func watchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface } table.Render() if total == ready { - break + return nil } + } else { + table.Append([]string{"k8s: This might take a little bit", "Bootstrapping", ""}) + table.Render() } - time.Sleep(40 * time.Second) + time.Sleep(10 * time.Second) } - - return nil } func isPodReady(v corev1api.Pod) bool { From e5e923f3db2e15264f7787c64347fac65846dd3d Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Fri, 15 Apr 2022 05:35:42 +0530 Subject: [PATCH 248/645] fix: revert sandbox lite image tag prefix to sha (#312) * fix: revert sandbox lite image tag prefix to sha Signed-off-by: Yuvraj * fix: make lint Signed-off-by: Yuvraj * fix: unit test fixed for sandbox lite Signed-off-by: Yuvraj * Remove mentions of sandbox in the docs and remove extraneous space Signed-off-by: eduardo apolinario Co-authored-by: Yuvraj Co-authored-by: eduardo apolinario --- .../flyte/golang_support_tools/tools.go | 3 +- flytectl/cmd/demo/start.go | 24 +++++++++--- flytectl/cmd/demo/start_test.go | 38 +++++++++---------- flytectl/cmd/sandbox/start.go | 12 +++--- flytectl/cmd/sandbox/start_test.go | 36 +++++++++--------- flytectl/pkg/githubutil/githubutil.go | 4 +- flytectl/pkg/githubutil/githubutil_test.go | 6 +-- 7 files changed, 68 insertions(+), 55 deletions(-) diff --git a/flytectl/boilerplate/flyte/golang_support_tools/tools.go b/flytectl/boilerplate/flyte/golang_support_tools/tools.go index d970d2106a..da7b933302 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/tools.go +++ b/flytectl/boilerplate/flyte/golang_support_tools/tools.go @@ -1,3 +1,4 @@ +//go:build tools // +build tools package tools @@ -6,6 +7,6 @@ import ( _ "github.com/alvaroloes/enumer" _ "github.com/flyteorg/flytestdlib/cli/pflags" _ "github.com/golangci/golangci-lint/cmd/golangci-lint" - _ "github.com/vektra/mockery/cmd/mockery" _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" + _ "github.com/vektra/mockery/cmd/mockery" ) diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index 116bee98a4..0102b9d8cb 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -40,11 +40,11 @@ Starts the demo cluster without any source code: :: flytectl demo start - + Mounts your source code repository inside the demo cluster: :: - flytectl demo start --source=$HOME/flyteorg/flytesnacks + flytectl demo start --source=$HOME/flyteorg/flytesnacks Specify a Flyte demo compliant image with the registry. This is useful in case you want to use an image from your registry. :: @@ -52,11 +52,24 @@ Specify a Flyte demo compliant image with the registry. This is useful in case y flytectl demo start --image docker.io/my-override:latest Note: If image flag is passed then Flytectl will ignore version and pre flags. - + Specify a Flyte demo image pull policy. Possible pull policy values are Always, IfNotPresent, or Never: :: - flytectl demo start --image docker.io/my-override:latest --imagePullPolicy Always + flytectl demo start --image docker.io/my-override:latest --imagePullPolicy Always + +Runs a specific version of Flyte. Flytectl demo only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. +:: + + flytectl demo start --version=v0.14.0 + +.. note:: + Flytectl demo is only supported for Flyte versions >= v1.0.0 + +Runs the latest pre release of Flyte. +:: + + flytectl demo start --pre Start demo cluster passing environment variables. This can be used to pass docker specific env variables or flyte specific env variables. eg : for passing timeout value in secs for the demo container use the following. @@ -64,7 +77,6 @@ eg : for passing timeout value in secs for the demo container use the following. flytectl demo start --env FLYTE_TIMEOUT=700 - The DURATION can be a positive integer or a floating-point number, followed by an optional unit suffix:: s - seconds (default) m - minutes @@ -199,7 +211,7 @@ func startDemo(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio } demoImage := sandboxConfig.DefaultConfig.Image if len(demoImage) == 0 { - image, version, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, demoImageName, sandboxConfig.DefaultConfig.Prerelease) + image, version, err := githubutil.GetFullyQualifiedImageName("sha", sandboxConfig.DefaultConfig.Version, demoImageName, sandboxConfig.DefaultConfig.Prerelease) if err != nil { return nil, err } diff --git a/flytectl/cmd/demo/start_test.go b/flytectl/cmd/demo/start_test.go index 50fe22d78d..b04a595a91 100644 --- a/flytectl/cmd/demo/start_test.go +++ b/flytectl/cmd/demo/start_test.go @@ -91,7 +91,7 @@ func TestStartDemoFunc(t *testing.T) { errCh := make(chan error) sandboxConfig.DefaultConfig.Version = "v0.19.1" bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", sandboxConfig.DefaultConfig.Version, demoImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -122,7 +122,7 @@ func TestStartDemoFunc(t *testing.T) { ctx := context.Background() mockDocker := &mocks.Docker{} errCh := make(chan error) - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -171,7 +171,7 @@ func TestStartDemoFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -213,7 +213,7 @@ func TestStartDemoFunc(t *testing.T) { Source: absPath, Target: docker.Source, }) - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -248,7 +248,7 @@ func TestStartDemoFunc(t *testing.T) { sandboxConfig.DefaultConfig.Version = "v0.18.0" sandboxConfig.DefaultConfig.Source = "" - image, _, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", sandboxConfig.DefaultConfig.Version, demoImageName, false) assert.Nil(t, err) volumes := docker.Volumes mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -283,7 +283,7 @@ func TestStartDemoFunc(t *testing.T) { mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Version = "v0.1444.0" sandboxConfig.DefaultConfig.Source = "" - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) volumes := docker.Volumes mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -316,7 +316,7 @@ func TestStartDemoFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := docker.Volumes @@ -362,7 +362,7 @@ func TestStartDemoFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -404,7 +404,7 @@ func TestStartDemoFunc(t *testing.T) { mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = "" sandboxConfig.DefaultConfig.Version = "" - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -443,7 +443,7 @@ func TestStartDemoFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -483,7 +483,7 @@ func TestStartDemoFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -527,7 +527,7 @@ func TestStartDemoFunc(t *testing.T) { if err != nil { t.Error(err) } - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -570,7 +570,7 @@ func TestStartDemoFunc(t *testing.T) { mockDocker := &mocks.Docker{} errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -705,26 +705,26 @@ func TestGetNodeTaintStatus(t *testing.T) { func TestGetDemoImage(t *testing.T) { t.Run("Get Latest demo cluster", func(t *testing.T) { - image, _, err := githubutil.GetFullyQualifiedImageName("", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(image, "cr.flyte.org/flyteorg/flyte-sandbox-lite:dind-")) + assert.Equal(t, true, strings.HasPrefix(image, "cr.flyte.org/flyteorg/flyte-sandbox-lite:sha-")) }) t.Run("Get demo image with version ", func(t *testing.T) { - image, _, err := githubutil.GetFullyQualifiedImageName("v0.14.0", demoImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("sha", "v0.14.0", demoImageName, false) assert.Nil(t, err) assert.Equal(t, true, strings.HasPrefix(image, demoImageName)) }) t.Run("Get demo image with wrong version ", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("v100.1.0", demoImageName, false) + _, _, err := githubutil.GetFullyQualifiedImageName("sha", "v100.1.0", demoImageName, false) assert.NotNil(t, err) }) t.Run("Get demo image with wrong version ", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("aaaaaa", demoImageName, false) + _, _, err := githubutil.GetFullyQualifiedImageName("sha", "aaaaaa", demoImageName, false) assert.NotNil(t, err) }) t.Run("Get demo image with version that is not supported", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("v0.10.0", demoImageName, false) + _, _, err := githubutil.GetFullyQualifiedImageName("sha", "v0.10.0", demoImageName, false) assert.NotNil(t, err) }) diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index ceda4c04cd..c7afba967b 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -40,12 +40,12 @@ Starts the sandbox cluster without any source code: :: flytectl sandbox start - + Mounts your source code repository inside the sandbox: :: - flytectl sandbox start --source=$HOME/flyteorg/flytesnacks - + flytectl sandbox start --source=$HOME/flyteorg/flytesnacks + Runs a specific version of Flyte. Flytectl sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. :: @@ -59,7 +59,7 @@ Runs the latest pre release of Flyte. flytectl sandbox start --pre -Note: The pre release flag will be ignored if the user passes the version flag. In that case, Flytectl will use a specific version. +Note: The pre release flag will be ignored if the user passes the version flag. In that case, Flytectl will use a specific version. Specify a Flyte Sandbox compliant image with the registry. This is useful in case you want to use an image from your registry. :: @@ -67,7 +67,7 @@ Specify a Flyte Sandbox compliant image with the registry. This is useful in cas flytectl sandbox start --image docker.io/my-override:latest Note: If image flag is passed then Flytectl will ignore version and pre flags. - + Specify a Flyte Sandbox image pull policy. Possible pull policy values are Always, IfNotPresent, or Never: :: @@ -191,7 +191,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu } sandboxImage := sandboxConfig.DefaultConfig.Image if len(sandboxImage) == 0 { - image, version, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, sandboxImageName, sandboxConfig.DefaultConfig.Prerelease) + image, version, err := githubutil.GetFullyQualifiedImageName("dind", sandboxConfig.DefaultConfig.Version, sandboxImageName, sandboxConfig.DefaultConfig.Prerelease) if err != nil { return nil, err } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index d6c789fd7b..fd6623c766 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -92,7 +92,7 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) sandboxConfig.DefaultConfig.Version = "v0.19.1" bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", sandboxConfig.DefaultConfig.Version, sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -123,7 +123,7 @@ func TestStartSandboxFunc(t *testing.T) { ctx := context.Background() mockDocker := &mocks.Docker{} errCh := make(chan error) - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -172,7 +172,7 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -214,7 +214,7 @@ func TestStartSandboxFunc(t *testing.T) { Source: absPath, Target: docker.Source, }) - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -249,7 +249,7 @@ func TestStartSandboxFunc(t *testing.T) { sandboxConfig.DefaultConfig.Version = "v0.18.0" sandboxConfig.DefaultConfig.Source = "" - image, _, err := githubutil.GetFullyQualifiedImageName(sandboxConfig.DefaultConfig.Version, sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", sandboxConfig.DefaultConfig.Version, sandboxImageName, false) assert.Nil(t, err) volumes := docker.Volumes mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -284,7 +284,7 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Version = "v0.1444.0" sandboxConfig.DefaultConfig.Source = "" - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) volumes := docker.Volumes mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -317,7 +317,7 @@ func TestStartSandboxFunc(t *testing.T) { errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker := &mocks.Docker{} - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) sandboxConfig.DefaultConfig.Source = f.UserHomeDir() volumes := docker.Volumes @@ -363,7 +363,7 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -405,7 +405,7 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = "" sandboxConfig.DefaultConfig.Version = "" - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -444,7 +444,7 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -484,7 +484,7 @@ func TestStartSandboxFunc(t *testing.T) { Source: sandboxConfig.DefaultConfig.Source, Target: docker.Source, }) - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -528,7 +528,7 @@ func TestStartSandboxFunc(t *testing.T) { if err != nil { t.Error(err) } - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) bodyStatus := make(chan container.ContainerWaitOKBody) mockDocker.OnContainerCreate(ctx, &container.Config{ @@ -571,7 +571,7 @@ func TestStartSandboxFunc(t *testing.T) { mockDocker := &mocks.Docker{} errCh := make(chan error) bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) mockDocker.OnContainerCreate(ctx, &container.Config{ Env: docker.Environment, @@ -706,26 +706,26 @@ func TestGetNodeTaintStatus(t *testing.T) { func TestGetSandboxImage(t *testing.T) { t.Run("Get Latest sandbox", func(t *testing.T) { - image, _, err := githubutil.GetFullyQualifiedImageName("", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) assert.Equal(t, true, strings.HasPrefix(image, "cr.flyte.org/flyteorg/flyte-sandbox:dind-")) }) t.Run("Get sandbox image with version ", func(t *testing.T) { - image, _, err := githubutil.GetFullyQualifiedImageName("v0.14.0", sandboxImageName, false) + image, _, err := githubutil.GetFullyQualifiedImageName("dind", "v0.14.0", sandboxImageName, false) assert.Nil(t, err) assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) }) t.Run("Get sandbox image with wrong version ", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("v100.1.0", sandboxImageName, false) + _, _, err := githubutil.GetFullyQualifiedImageName("dind", "v100.1.0", sandboxImageName, false) assert.NotNil(t, err) }) t.Run("Get sandbox image with wrong version ", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("aaaaaa", sandboxImageName, false) + _, _, err := githubutil.GetFullyQualifiedImageName("dind", "aaaaaa", sandboxImageName, false) assert.NotNil(t, err) }) t.Run("Get sandbox image with version that is not supported", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("v0.10.0", sandboxImageName, false) + _, _, err := githubutil.GetFullyQualifiedImageName("dind", "v0.10.0", sandboxImageName, false) assert.NotNil(t, err) }) diff --git a/flytectl/pkg/githubutil/githubutil.go b/flytectl/pkg/githubutil/githubutil.go index d36fe78800..5fa3dacc6e 100644 --- a/flytectl/pkg/githubutil/githubutil.go +++ b/flytectl/pkg/githubutil/githubutil.go @@ -218,11 +218,11 @@ func CheckBrewInstall(goos platformutil.Platform) (string, error) { // if no version is specified then the Latest release of cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA} is used // else cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA}, where sha is derived from the version. // If pre release is true then use latest pre release of Flyte, In that case User don't need to pass version -func GetFullyQualifiedImageName(version, image string, pre bool) (string, string, error) { +func GetFullyQualifiedImageName(prefix, version, image string, pre bool) (string, string, error) { sha, version, err := GetSandboxImageSha(version, pre) if err != nil { return "", version, err } - return fmt.Sprintf("%s:%s", image, fmt.Sprintf("dind-%s", sha)), version, nil + return fmt.Sprintf("%s:%s", image, fmt.Sprintf("%s-%s", prefix, sha)), version, nil } diff --git a/flytectl/pkg/githubutil/githubutil_test.go b/flytectl/pkg/githubutil/githubutil_test.go index 5de7709940..037a0ede14 100644 --- a/flytectl/pkg/githubutil/githubutil_test.go +++ b/flytectl/pkg/githubutil/githubutil_test.go @@ -49,19 +49,19 @@ func TestCheckVersionExist(t *testing.T) { func TestGetFullyQualifiedImageName(t *testing.T) { t.Run("Get tFully Qualified Image Name ", func(t *testing.T) { - image, tag, err := GetFullyQualifiedImageName("", sandboxImageName, false) + image, tag, err := GetFullyQualifiedImageName("dind", "", sandboxImageName, false) assert.Nil(t, err) assert.Equal(t, true, strings.HasPrefix(tag, "v")) assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) }) t.Run("Get tFully Qualified Image Name with pre release", func(t *testing.T) { - image, tag, err := GetFullyQualifiedImageName("", sandboxImageName, true) + image, tag, err := GetFullyQualifiedImageName("dind", "", sandboxImageName, true) assert.Nil(t, err) assert.Equal(t, true, strings.HasPrefix(tag, "v")) assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) }) t.Run("Get tFully Qualified Image Name with specific version", func(t *testing.T) { - image, tag, err := GetFullyQualifiedImageName("v0.19.0", sandboxImageName, true) + image, tag, err := GetFullyQualifiedImageName("dind", "v0.19.0", sandboxImageName, true) assert.Nil(t, err) assert.Equal(t, "v0.19.0", tag) assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) From 790a96566d195c601017e8a95aa0aec986b6ff7e Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Wed, 20 Apr 2022 11:38:14 -0700 Subject: [PATCH 249/645] Bind 30080 to 30081 in the case of sandbox (#313) Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- flytectl/cmd/demo/start.go | 2 +- flytectl/cmd/demo/start_test.go | 2 +- flytectl/pkg/docker/docker_util.go | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index 0102b9d8cb..2ee48d9a0f 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -224,7 +224,7 @@ func startDemo(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio } fmt.Printf("%v booting flyte-demo container\n", emoji.FactoryWorker) - exposedPorts, portBindings, _ := docker.GetSandboxPorts() + exposedPorts, portBindings, _ := docker.GetDemoPorts() ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, demoImage, sandboxDefaultConfig.Env) diff --git a/flytectl/cmd/demo/start_test.go b/flytectl/cmd/demo/start_test.go index b04a595a91..70ab2cb749 100644 --- a/flytectl/cmd/demo/start_test.go +++ b/flytectl/cmd/demo/start_test.go @@ -78,7 +78,7 @@ var fakePod = corev1.Pod{ } func TestStartDemoFunc(t *testing.T) { - p1, p2, _ := docker.GetSandboxPorts() + p1, p2, _ := docker.GetDemoPorts() assert.Nil(t, util.SetupFlyteDir()) assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm)) assert.Nil(t, ioutil.WriteFile(docker.Kubeconfig, []byte(content), os.ModePerm)) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 84374481ea..b6bef9549e 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -93,6 +93,21 @@ func RemoveSandbox(ctx context.Context, cli Docker, reader io.Reader) error { // GetSandboxPorts will return sandbox ports func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, error) { + return nat.ParsePortSpecs([]string{ + // Notice that two host ports are mapped to the same container port in the case of Flyteconsole, this is done to + // support the generated URLs produced by pyflyte run + "0.0.0.0:30080:30081", // Flyteconsole Port. + "0.0.0.0:30081:30081", // Flyteadmin Port + "0.0.0.0:30082:30082", // K8s Dashboard Port + "0.0.0.0:30084:30084", // Minio API Port + "0.0.0.0:30086:30086", // K8s cluster + "0.0.0.0:30088:30088", // Minio Console Port + "0.0.0.0:30089:30089", // Postgres Port + }) +} + +// GetDemoPorts will return demo ports +func GetDemoPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, error) { return nat.ParsePortSpecs([]string{ "0.0.0.0:30080:30080", // Flyteconsole Port "0.0.0.0:30081:30081", // Flyteadmin Port From 440ad3171f187867be35b916851ad81936b8e91a Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Sat, 23 Apr 2022 00:23:03 +0530 Subject: [PATCH 250/645] Demo fit and finish (#317) Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/demo/start.go | 6 +++--- flytectl/pkg/configutil/configutil.go | 5 +++++ flytectl/pkg/configutil/configutil_test.go | 1 + flytectl/pkg/util/util.go | 13 +++++++++---- flytectl/pkg/util/util_test.go | 6 ++++++ 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index 2ee48d9a0f..893bdce116 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -164,7 +164,7 @@ func startDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.Command return err } primeFlytekitPod(ctx, k8sClient.CoreV1().Pods("default")) - util.PrintSandboxMessage(util.DemoConsolePort) + util.PrintDemoMessage(util.DemoConsolePort) } return nil } @@ -186,7 +186,7 @@ func startDemo(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio return nil, err } fmt.Printf("Existing details of your demo cluster") - util.PrintSandboxMessage(util.DemoConsolePort) + util.PrintDemoMessage(util.DemoConsolePort) return nil, nil } @@ -198,7 +198,7 @@ func startDemo(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio Host: "localhost:30081", Insecure: true, } - if err := configutil.SetupConfig(configutil.FlytectlConfig, configutil.GetSandboxTemplate(), templateValues); err != nil { + if err := configutil.SetupConfig(configutil.ConfigFile, configutil.GetDemoTemplate(), templateValues); err != nil { return nil, err } diff --git a/flytectl/pkg/configutil/configutil.go b/flytectl/pkg/configutil/configutil.go index c0df7f9b31..cedad69146 100644 --- a/flytectl/pkg/configutil/configutil.go +++ b/flytectl/pkg/configutil/configutil.go @@ -65,6 +65,11 @@ func GetSandboxTemplate() string { return AdminConfigTemplate + StorageConfigTemplate } +// GetDemoTemplate return demo cluster config +func GetDemoTemplate() string { + return AdminConfigTemplate +} + // GetAWSCloudTemplate return aws Flyte config with storage config func GetAWSCloudTemplate() string { return AdminConfigTemplate + StorageS3ConfigTemplate diff --git a/flytectl/pkg/configutil/configutil_test.go b/flytectl/pkg/configutil/configutil_test.go index 6908f06144..e79964af18 100644 --- a/flytectl/pkg/configutil/configutil_test.go +++ b/flytectl/pkg/configutil/configutil_test.go @@ -52,4 +52,5 @@ func TestAwsConfig(t *testing.T) { assert.Equal(t, AdminConfigTemplate+StorageS3ConfigTemplate, GetAWSCloudTemplate()) assert.Equal(t, AdminConfigTemplate+StorageGCSConfigTemplate, GetGoogleCloudTemplate()) assert.Equal(t, AdminConfigTemplate+StorageConfigTemplate, GetSandboxTemplate()) + assert.Equal(t, AdminConfigTemplate, GetDemoTemplate()) } diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index a34aeba5c4..091ea21707 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -5,16 +5,15 @@ import ( "io" "io/ioutil" "net/http" - "os" "strings" - hversion "github.com/hashicorp/go-version" - - "github.com/enescakir/emoji" "github.com/flyteorg/flytectl/pkg/configutil" "github.com/flyteorg/flytectl/pkg/docker" f "github.com/flyteorg/flytectl/pkg/filesystemutils" + + "github.com/enescakir/emoji" + hversion "github.com/hashicorp/go-version" ) const ( @@ -66,6 +65,12 @@ func PrintSandboxMessage(flyteConsolePort int) { fmt.Printf("export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) } +// PrintDemoMessage will print demo success message +func PrintDemoMessage(flyteConsolePort int) { + successMsg := fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessage, flyteConsolePort) + fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, successMsg, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) +} + // SendRequest will create request and return the response func SendRequest(method, url string, option io.Reader) (*http.Response, error) { client := &http.Client{} diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index 718a244d9c..ebf67a902d 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -29,6 +29,12 @@ func TestPrintSandboxMessage(t *testing.T) { }) } +func TestPrintDemoMessage(t *testing.T) { + t.Run("Print Demo Message", func(t *testing.T) { + PrintDemoMessage(DemoConsolePort) + }) +} + func TestSendRequest(t *testing.T) { t.Run("Successful get request", func(t *testing.T) { response, err := SendRequest("GET", "https://github.com", nil) From 262af6e268743233eee677195203c83f33b668ee Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Mon, 25 Apr 2022 22:29:55 +0530 Subject: [PATCH 251/645] Mocking github repo service and refactoring (#315) * Mocking github repo service and refactoring Signed-off-by: Prafulla Mahindrakar * compilation fix Signed-off-by: Prafulla Mahindrakar * More fixes Signed-off-by: Prafulla Mahindrakar * Refactored tests and fix error checks Signed-off-by: Prafulla Mahindrakar * more fixes Signed-off-by: Prafulla Mahindrakar * more fixes Signed-off-by: Prafulla Mahindrakar * more fixes Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/demo/exec.go | 5 +- flytectl/cmd/demo/start.go | 10 +- flytectl/cmd/demo/start_test.go | 495 ++++------------- flytectl/cmd/demo/status.go | 5 +- flytectl/cmd/demo/teardown.go | 5 +- flytectl/cmd/register/examples.go | 10 +- flytectl/cmd/register/register_util.go | 8 +- flytectl/cmd/register/register_util_test.go | 28 +- flytectl/cmd/sandbox/exec.go | 5 +- flytectl/cmd/sandbox/start.go | 12 +- flytectl/cmd/sandbox/start_test.go | 516 ++++-------------- flytectl/cmd/sandbox/status.go | 5 +- flytectl/cmd/sandbox/teardown.go | 5 +- flytectl/cmd/upgrade/upgrade.go | 12 +- flytectl/cmd/upgrade/upgrade_test.go | 18 +- flytectl/cmd/version/version.go | 6 +- flytectl/go.mod | 2 +- flytectl/go.sum | 4 +- flytectl/pkg/docker/docker_util.go | 17 +- flytectl/pkg/docker/docker_util_test.go | 106 ++-- .../pkg/{githubutil => github}/githubutil.go | 152 +++--- flytectl/pkg/github/githubutil_test.go | 205 +++++++ flytectl/pkg/github/mocks/gh_repo_service.go | 213 ++++++++ flytectl/pkg/githubutil/githubutil_test.go | 150 ----- 24 files changed, 858 insertions(+), 1136 deletions(-) rename flytectl/pkg/{githubutil => github}/githubutil.go (64%) create mode 100644 flytectl/pkg/github/githubutil_test.go create mode 100644 flytectl/pkg/github/mocks/gh_repo_service.go delete mode 100644 flytectl/pkg/githubutil/githubutil_test.go diff --git a/flytectl/cmd/demo/exec.go b/flytectl/cmd/demo/exec.go index b0d9510c72..1cda6d0e49 100644 --- a/flytectl/cmd/demo/exec.go +++ b/flytectl/cmd/demo/exec.go @@ -33,7 +33,10 @@ func demoClusterExec(ctx context.Context, args []string, cmdCtx cmdCore.CommandC } func execute(ctx context.Context, cli docker.Docker, args []string) error { - c := docker.GetSandbox(ctx, cli) + c, err := docker.GetSandbox(ctx, cli) + if err != nil { + return err + } if c != nil { exec, err := docker.ExecCommend(ctx, cli, c.ID, args) if err != nil { diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index 893bdce116..ceff28febb 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -10,7 +10,7 @@ import ( "time" "github.com/flyteorg/flytectl/clierrors" - "github.com/flyteorg/flytectl/pkg/githubutil" + "github.com/flyteorg/flytectl/pkg/github" "github.com/avast/retry-go" "github.com/olekukonko/tablewriter" @@ -136,7 +136,9 @@ func startDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.Command return err } - reader, err := startDemo(ctx, cli, os.Stdin) + ghRepo := github.GetGHRepoService() + + reader, err := startDemo(ctx, cli, ghRepo, os.Stdin) if err != nil { return err } @@ -178,7 +180,7 @@ func updateLocalKubeContext() error { return k8sCtxMgr.CopyContext(srcConfigAccess, demoDockerContext, demoContextName) } -func startDemo(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio.Scanner, error) { +func startDemo(ctx context.Context, cli docker.Docker, g github.GHRepoService, reader io.Reader) (*bufio.Scanner, error) { fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { @@ -211,7 +213,7 @@ func startDemo(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio } demoImage := sandboxConfig.DefaultConfig.Image if len(demoImage) == 0 { - image, version, err := githubutil.GetFullyQualifiedImageName("sha", sandboxConfig.DefaultConfig.Version, demoImageName, sandboxConfig.DefaultConfig.Prerelease) + image, version, err := github.GetFullyQualifiedImageName("sha", sandboxConfig.DefaultConfig.Version, demoImageName, sandboxConfig.DefaultConfig.Prerelease, g) if err != nil { return nil, err } diff --git a/flytectl/cmd/demo/start_test.go b/flytectl/cmd/demo/start_test.go index 70ab2cb749..11ebacc796 100644 --- a/flytectl/cmd/demo/start_test.go +++ b/flytectl/cmd/demo/start_test.go @@ -6,26 +6,23 @@ import ( "io" "io/ioutil" "os" - "path/filepath" "strings" "testing" - "github.com/flyteorg/flyteidl/clients/go/admin" - - "github.com/flyteorg/flytectl/pkg/githubutil" - - "github.com/flyteorg/flytectl/pkg/k8s" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/mount" sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/docker/mocks" f "github.com/flyteorg/flytectl/pkg/filesystemutils" + ghMocks "github.com/flyteorg/flytectl/pkg/github/mocks" + "github.com/flyteorg/flytectl/pkg/k8s" k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" "github.com/flyteorg/flytectl/pkg/util" + "github.com/flyteorg/flyteidl/clients/go/admin" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/google/go-github/v42/github" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" corev1 "k8s.io/api/core/v1" @@ -64,6 +61,12 @@ users: provideClusterInfo: true ` +var ( + githubMock *ghMocks.GHRepoService + ctx context.Context + mockDocker *mocks.Docker +) + var fakeNode = &corev1.Node{ Spec: corev1.NodeSpec{ Taints: []corev1.Taint{}, @@ -77,8 +80,22 @@ var fakePod = corev1.Pod{ }, } +func demoSetup() { + ctx = context.Background() + mockDocker = &mocks.Docker{} + errCh := make(chan error) + sandboxConfig.DefaultConfig.Version = "v0.19.1" + bodyStatus := make(chan container.ContainerWaitOKBody) + githubMock = &ghMocks.GHRepoService{} + sandboxConfig.DefaultConfig.Image = "dummyimage" + mockDocker.OnContainerCreateMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) +} + func TestStartDemoFunc(t *testing.T) { - p1, p2, _ := docker.GetDemoPorts() assert.Nil(t, util.SetupFlyteDir()) assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm)) assert.Nil(t, ioutil.WriteFile(docker.Kubeconfig, []byte(content), os.ModePerm)) @@ -86,58 +103,21 @@ func TestStartDemoFunc(t *testing.T) { fakePod.SetName("flyte") t.Run("Successfully run demo cluster", func(t *testing.T) { - ctx := context.Background() - mockDocker := &mocks.Docker{} - errCh := make(chan error) - sandboxConfig.DefaultConfig.Version = "v0.19.1" - bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetFullyQualifiedImageName("sha", sandboxConfig.DefaultConfig.Version, demoImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: docker.Volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startDemo(ctx, mockDocker, os.Stdin) + _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) assert.Nil(t, err) }) t.Run("Successfully exit when demo cluster exist", func(t *testing.T) { - ctx := context.Background() - mockDocker := &mocks.Docker{} - errCh := make(chan error) - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: docker.Volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ { ID: docker.FlyteSandboxClusterName, @@ -147,46 +127,23 @@ func TestStartDemoFunc(t *testing.T) { }, }, nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - reader, err := startDemo(ctx, mockDocker, strings.NewReader("n")) + reader, err := startDemo(ctx, mockDocker, githubMock, strings.NewReader("n")) assert.Nil(t, err) assert.Nil(t, reader) }) t.Run("Successfully run demo cluster with source code", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = f.UserHomeDir() sandboxConfig.DefaultConfig.Version = "" - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, @@ -194,41 +151,15 @@ func TestStartDemoFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startDemo(ctx, mockDocker, os.Stdin) + _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) assert.Nil(t, err) }) t.Run("Successfully run demo cluster with abs path of source code", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} sandboxConfig.DefaultConfig.Source = "../" sandboxConfig.DefaultConfig.Version = "" - absPath, err := filepath.Abs(sandboxConfig.DefaultConfig.Source) - assert.Nil(t, err) - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: absPath, - Target: docker.Source, - }) - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, @@ -236,35 +167,13 @@ func TestStartDemoFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startDemo(ctx, mockDocker, os.Stdin) + _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) assert.Nil(t, err) }) t.Run("Successfully run demo cluster with specific version", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Version = "v0.18.0" - sandboxConfig.DefaultConfig.Source = "" - - image, _, err := githubutil.GetFullyQualifiedImageName("sha", sandboxConfig.DefaultConfig.Version, demoImageName, false) - assert.Nil(t, err) - volumes := docker.Volumes - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, @@ -272,111 +181,42 @@ func TestStartDemoFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startDemo(ctx, mockDocker, os.Stdin) + sandboxConfig.DefaultConfig.Image = "" + tag := "v0.15.0" + githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + }, nil, nil) + + githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) + _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) assert.Nil(t, err) }) t.Run("Failed run demo cluster with wrong version", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Version = "v0.1444.0" - sandboxConfig.DefaultConfig.Source = "" - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - volumes := docker.Volumes - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startDemo(ctx, mockDocker, os.Stdin) + sandboxConfig.DefaultConfig.Image = "" + githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("non-existent-tag")) + _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) assert.NotNil(t, err) + assert.Equal(t, "non-existent-tag", err.Error()) }) t.Run("Error in pulling image", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startDemo(ctx, mockDocker, os.Stdin) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("failed to pull")) + sandboxConfig.DefaultConfig.Image = "" + tag := "v0.15.0" + githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + }, nil, nil) + + githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) + _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) assert.NotNil(t, err) + assert.Equal(t, "failed to pull", err.Error()) }) t.Run("Error in removing existing cluster", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ { ID: docker.FlyteSandboxClusterName, @@ -386,136 +226,53 @@ func TestStartDemoFunc(t *testing.T) { }, }, nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("error")) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startDemo(ctx, mockDocker, strings.NewReader("y")) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("failed to remove container")) + _, err := startDemo(ctx, mockDocker, githubMock, strings.NewReader("y")) assert.NotNil(t, err) + assert.Equal(t, "failed to remove container", err.Error()) }) t.Run("Error in start container", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Source = "" - sandboxConfig.DefaultConfig.Version = "" - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: docker.Volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, fmt.Errorf("error")) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startDemo(ctx, mockDocker, os.Stdin) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("failed to run container")) + _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) assert.NotNil(t, err) + assert.Equal(t, "failed to run container", err.Error()) }) t.Run("Error in reading logs", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, - }).Return(nil, fmt.Errorf("error")) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startDemo(ctx, mockDocker, os.Stdin) + }).Return(nil, fmt.Errorf("failed to get container logs")) + _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) assert.NotNil(t, err) + assert.Equal(t, "failed to get container logs", err.Error()) }) t.Run("Error in list container", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - sandboxConfig.DefaultConfig.Version = "" - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, fmt.Errorf("error")) + demoSetup() + mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startDemo(ctx, mockDocker, os.Stdin) - assert.Nil(t, err) + _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) + assert.NotNil(t, err) + assert.Equal(t, "failed to list containers", err.Error()) }) t.Run("Successfully run demo cluster command", func(t *testing.T) { mockOutStream := new(io.Writer) - ctx := context.Background() cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) - mockDocker := &mocks.Docker{} - errCh := make(chan error) client := testclient.NewSimpleClientset() k8s.Client = client _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) @@ -527,24 +284,11 @@ func TestStartDemoFunc(t *testing.T) { if err != nil { t.Error(err) } - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: docker.Volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + demoSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(mock.Anything, mock.Anything, mock.Anything).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + stringReader := strings.NewReader(docker.SuccessMessage) reader := ioutil.NopCloser(stringReader) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ @@ -553,7 +297,6 @@ func TestStartDemoFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(reader, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) mockK8sContextMgr := &k8sMocks.ContextOps{} docker.Client = mockDocker sandboxConfig.DefaultConfig.Source = "" @@ -565,40 +308,19 @@ func TestStartDemoFunc(t *testing.T) { }) t.Run("Error in running demo cluster command", func(t *testing.T) { mockOutStream := new(io.Writer) - ctx := context.Background() cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) - mockDocker := &mocks.Docker{} - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: docker.Volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, fmt.Errorf("error")) + demoSetup() + docker.Client = mockDocker + mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - stringReader := strings.NewReader(docker.SuccessMessage) - reader := ioutil.NopCloser(stringReader) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, - }).Return(reader, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - docker.Client = mockDocker - sandboxConfig.DefaultConfig.Source = "" - err = startDemoCluster(ctx, []string{}, cmdCtx) + }).Return(nil, nil) + err := startDemoCluster(ctx, []string{}, cmdCtx) assert.NotNil(t, err) }) } @@ -702,30 +424,3 @@ func TestGetNodeTaintStatus(t *testing.T) { assert.Equal(t, true, c) }) } - -func TestGetDemoImage(t *testing.T) { - t.Run("Get Latest demo cluster", func(t *testing.T) { - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "", demoImageName, false) - assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(image, "cr.flyte.org/flyteorg/flyte-sandbox-lite:sha-")) - }) - - t.Run("Get demo image with version ", func(t *testing.T) { - image, _, err := githubutil.GetFullyQualifiedImageName("sha", "v0.14.0", demoImageName, false) - assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(image, demoImageName)) - }) - t.Run("Get demo image with wrong version ", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("sha", "v100.1.0", demoImageName, false) - assert.NotNil(t, err) - }) - t.Run("Get demo image with wrong version ", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("sha", "aaaaaa", demoImageName, false) - assert.NotNil(t, err) - }) - t.Run("Get demo image with version that is not supported", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("sha", "v0.10.0", demoImageName, false) - assert.NotNil(t, err) - }) - -} diff --git a/flytectl/cmd/demo/status.go b/flytectl/cmd/demo/status.go index 67a7767afb..942b561d8c 100644 --- a/flytectl/cmd/demo/status.go +++ b/flytectl/cmd/demo/status.go @@ -32,7 +32,10 @@ func demoClusterStatus(ctx context.Context, args []string, cmdCtx cmdCore.Comman } func printStatus(ctx context.Context, cli docker.Docker) error { - c := docker.GetSandbox(ctx, cli) + c, err := docker.GetSandbox(ctx, cli) + if err != nil { + return err + } if c == nil { fmt.Printf("%v no demo cluster found \n", emoji.StopSign) return nil diff --git a/flytectl/cmd/demo/teardown.go b/flytectl/cmd/demo/teardown.go index 1308b10b14..bd98b22e37 100644 --- a/flytectl/cmd/demo/teardown.go +++ b/flytectl/cmd/demo/teardown.go @@ -38,7 +38,10 @@ func teardownDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm } func tearDownDemo(ctx context.Context, cli docker.Docker) error { - c := docker.GetSandbox(ctx, cli) + c, err := docker.GetSandbox(ctx, cli) + if err != nil { + return err + } if c != nil { if err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ Force: true, diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index eb3feff8ec..04d34be9e1 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -5,13 +5,12 @@ import ( "fmt" "github.com/flyteorg/flytectl/cmd/config" - + rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + g "github.com/flyteorg/flytectl/pkg/github" "github.com/flyteorg/flytestdlib/logger" "github.com/google/go-github/v42/github" - - rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" - cmdCore "github.com/flyteorg/flytectl/cmd/core" ) const ( @@ -44,7 +43,8 @@ func registerExamplesFunc(ctx context.Context, args []string, cmdCtx cmdCore.Com // Deprecated checks for --k8Service deprecatedCheck(ctx, &rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.K8ServiceAccount) - examples, tag, err := getAllExample(flytesnacks, rconfig.DefaultFilesConfig.Version) + ghRepo := g.GetGHRepoService() + examples, tag, err := getAllExample(flytesnacks, rconfig.DefaultFilesConfig.Version, ghRepo) if err != nil { return err } diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 3d68cca648..90c18c7444 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -22,7 +22,7 @@ import ( "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" - "github.com/flyteorg/flytectl/pkg/githubutil" + g "github.com/flyteorg/flytectl/pkg/github" "github.com/flyteorg/flytestdlib/contextutils" "github.com/flyteorg/flytestdlib/promutils" @@ -654,15 +654,15 @@ func filterExampleFromRelease(releases *github.RepositoryRelease) []*github.Rele return assets } -func getAllExample(repository, version string) ([]*github.ReleaseAsset, *github.RepositoryRelease, error) { +func getAllExample(repository, version string, repoService g.GHRepoService) ([]*github.ReleaseAsset, *github.RepositoryRelease, error) { if len(version) > 0 { - release, err := githubutil.CheckVersionExist(version, repository) + release, err := g.GetReleaseByTag(version, repository, repoService) if err != nil { return nil, nil, err } return filterExampleFromRelease(release), release, nil } - release, err := githubutil.GetLatestVersion(repository) + release, err := g.GetLatestRelease(repository, repoService) if err != nil { return nil, nil, err } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 8b614ed0f6..e1d3093410 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -12,6 +12,7 @@ import ( "strings" "testing" + ghMocks "github.com/flyteorg/flytectl/pkg/github/mocks" "github.com/flyteorg/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" @@ -29,6 +30,7 @@ import ( rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/google/go-github/v42/github" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "google.golang.org/grpc/codes" @@ -434,15 +436,35 @@ func TestGetStorageClient(t *testing.T) { func TestGetAllFlytesnacksExample(t *testing.T) { t.Run("Failed to get manifest with wrong name", func(t *testing.T) { - _, _, err := getAllExample("no////ne", "") + mockGh := &ghMocks.GHRepoService{} + mockGh.OnGetLatestReleaseMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("failed")) + _, _, err := getAllExample("no////ne", "", mockGh) assert.NotNil(t, err) }) t.Run("Failed to get release", func(t *testing.T) { - _, _, err := getAllExample("homebrew-tap", "") + mockGh := &ghMocks.GHRepoService{} + tag := "v0.15.0" + sandboxManifest := "flyte_sandbox_manifest.tgz" + mockGh.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + Assets: []*github.ReleaseAsset{{ + Name: &sandboxManifest, + }}, + }, nil, fmt.Errorf("failed")) + _, _, err := getAllExample("homebrew-tap", "1.0", mockGh) assert.NotNil(t, err) }) t.Run("Successfully get examples", func(t *testing.T) { - assets, r, err := getAllExample("flytesnacks", "v0.2.175") + mockGh := &ghMocks.GHRepoService{} + tag := "v0.15.0" + sandboxManifest := "flyte_sandbox_manifest.tgz" + mockGh.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + Assets: []*github.ReleaseAsset{{ + Name: &sandboxManifest, + }}, + }, nil, nil) + assets, r, err := getAllExample("flytesnacks", tag, mockGh) assert.Nil(t, err) assert.Greater(t, len(*r.TagName), 0) assert.Greater(t, len(assets), 0) diff --git a/flytectl/cmd/sandbox/exec.go b/flytectl/cmd/sandbox/exec.go index 327d2e4f23..0d45c235e4 100644 --- a/flytectl/cmd/sandbox/exec.go +++ b/flytectl/cmd/sandbox/exec.go @@ -33,7 +33,10 @@ func sandboxClusterExec(ctx context.Context, args []string, cmdCtx cmdCore.Comma } func execute(ctx context.Context, cli docker.Docker, args []string) error { - c := docker.GetSandbox(ctx, cli) + c, err := docker.GetSandbox(ctx, cli) + if err != nil { + return err + } if c != nil { exec, err := docker.ExecCommend(ctx, cli, c.ID, args) if err != nil { diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index c7afba967b..9e9013b6f5 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -10,7 +10,7 @@ import ( "time" "github.com/flyteorg/flytectl/clierrors" - "github.com/flyteorg/flytectl/pkg/githubutil" + "github.com/flyteorg/flytectl/pkg/github" "github.com/avast/retry-go" "github.com/olekukonko/tablewriter" @@ -42,11 +42,13 @@ Starts the sandbox cluster without any source code: flytectl sandbox start Mounts your source code repository inside the sandbox: + :: flytectl sandbox start --source=$HOME/flyteorg/flytesnacks Runs a specific version of Flyte. Flytectl sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. + :: flytectl sandbox start --version=v0.14.0 @@ -117,7 +119,9 @@ func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm return err } - reader, err := startSandbox(ctx, cli, os.Stdin) + ghRepo := github.GetGHRepoService() + + reader, err := startSandbox(ctx, cli, ghRepo, os.Stdin) if err != nil { return err } @@ -158,7 +162,7 @@ func updateLocalKubeContext() error { return k8sCtxMgr.CopyContext(srcConfigAccess, sandboxDockerContext, sandboxContextName) } -func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bufio.Scanner, error) { +func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService, reader io.Reader) (*bufio.Scanner, error) { fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { @@ -191,7 +195,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, reader io.Reader) (*bu } sandboxImage := sandboxConfig.DefaultConfig.Image if len(sandboxImage) == 0 { - image, version, err := githubutil.GetFullyQualifiedImageName("dind", sandboxConfig.DefaultConfig.Version, sandboxImageName, sandboxConfig.DefaultConfig.Prerelease) + image, version, err := github.GetFullyQualifiedImageName("dind", sandboxConfig.DefaultConfig.Version, sandboxImageName, sandboxConfig.DefaultConfig.Prerelease, g) if err != nil { return nil, err } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index fd6623c766..8e1f28c5c8 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -6,26 +6,24 @@ import ( "io" "io/ioutil" "os" - "path/filepath" "strings" "testing" - "github.com/flyteorg/flyteidl/clients/go/admin" - - "github.com/flyteorg/flytectl/pkg/githubutil" - - "github.com/flyteorg/flytectl/pkg/k8s" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/mount" sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/docker/mocks" f "github.com/flyteorg/flytectl/pkg/filesystemutils" + ghutil "github.com/flyteorg/flytectl/pkg/github" + ghMocks "github.com/flyteorg/flytectl/pkg/github/mocks" + "github.com/flyteorg/flytectl/pkg/k8s" k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" "github.com/flyteorg/flytectl/pkg/util" + "github.com/flyteorg/flyteidl/clients/go/admin" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/google/go-github/v42/github" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" corev1 "k8s.io/api/core/v1" @@ -77,68 +75,50 @@ var fakePod = corev1.Pod{ }, } -func TestStartSandboxFunc(t *testing.T) { - p1, p2, _ := docker.GetSandboxPorts() +var ( + githubMock *ghMocks.GHRepoService + ctx context.Context + mockDocker *mocks.Docker +) + +func sandboxSetup() { + ctx = context.Background() + mockDocker = &mocks.Docker{} + errCh := make(chan error) + sandboxConfig.DefaultConfig.Version = "v0.19.1" + bodyStatus := make(chan container.ContainerWaitOKBody) + githubMock = &ghMocks.GHRepoService{} + sandboxConfig.DefaultConfig.Image = "dummyimage" + mockDocker.OnContainerCreateMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) +} + +func TestStartFunc(t *testing.T) { assert.Nil(t, util.SetupFlyteDir()) assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm)) assert.Nil(t, ioutil.WriteFile(docker.Kubeconfig, []byte(content), os.ModePerm)) - fakePod.SetName("flyte") fakePod.SetName("flyte") - t.Run("Successfully run sandbox cluster", func(t *testing.T) { - ctx := context.Background() - mockDocker := &mocks.Docker{} - errCh := make(chan error) - sandboxConfig.DefaultConfig.Version = "v0.19.1" - bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetFullyQualifiedImageName("dind", sandboxConfig.DefaultConfig.Version, sandboxImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: docker.Volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + t.Run("Successfully run demo cluster", func(t *testing.T) { + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startSandbox(ctx, mockDocker, os.Stdin) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) assert.Nil(t, err) }) - t.Run("Successfully exit when sandbox cluster exist", func(t *testing.T) { - ctx := context.Background() - mockDocker := &mocks.Docker{} - errCh := make(chan error) - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: docker.Volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + t.Run("Successfully exit when demo cluster exist", func(t *testing.T) { + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ { ID: docker.FlyteSandboxClusterName, @@ -148,46 +128,23 @@ func TestStartSandboxFunc(t *testing.T) { }, }, nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - reader, err := startSandbox(ctx, mockDocker, strings.NewReader("n")) + reader, err := startSandbox(ctx, mockDocker, githubMock, strings.NewReader("n")) assert.Nil(t, err) assert.Nil(t, reader) }) - t.Run("Successfully run sandbox cluster with source code", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} + t.Run("Successfully run demo cluster with source code", func(t *testing.T) { sandboxConfig.DefaultConfig.Source = f.UserHomeDir() sandboxConfig.DefaultConfig.Version = "" - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, @@ -195,41 +152,15 @@ func TestStartSandboxFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startSandbox(ctx, mockDocker, os.Stdin) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) assert.Nil(t, err) }) - t.Run("Successfully run sandbox cluster with abs path of source code", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} + t.Run("Successfully run demo cluster with abs path of source code", func(t *testing.T) { sandboxConfig.DefaultConfig.Source = "../" sandboxConfig.DefaultConfig.Version = "" - absPath, err := filepath.Abs(sandboxConfig.DefaultConfig.Source) - assert.Nil(t, err) - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: absPath, - Target: docker.Source, - }) - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, @@ -237,35 +168,13 @@ func TestStartSandboxFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startSandbox(ctx, mockDocker, os.Stdin) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) assert.Nil(t, err) }) - t.Run("Successfully run sandbox cluster with specific version", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Version = "v0.18.0" - sandboxConfig.DefaultConfig.Source = "" - - image, _, err := githubutil.GetFullyQualifiedImageName("dind", sandboxConfig.DefaultConfig.Version, sandboxImageName, false) - assert.Nil(t, err) - volumes := docker.Volumes - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + t.Run("Successfully run demo cluster with specific version", func(t *testing.T) { + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, @@ -273,111 +182,42 @@ func TestStartSandboxFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startSandbox(ctx, mockDocker, os.Stdin) + sandboxConfig.DefaultConfig.Image = "" + tag := "v0.15.0" + githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + }, nil, nil) + + githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) assert.Nil(t, err) }) - t.Run("Failed run sandbox cluster with wrong version", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Version = "v0.1444.0" - sandboxConfig.DefaultConfig.Source = "" - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - volumes := docker.Volumes - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + t.Run("Failed run demo cluster with wrong version", func(t *testing.T) { + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startSandbox(ctx, mockDocker, os.Stdin) + sandboxConfig.DefaultConfig.Image = "" + githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("non-existent-tag")) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) assert.NotNil(t, err) + assert.Equal(t, "non-existent-tag", err.Error()) }) t.Run("Error in pulling image", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startSandbox(ctx, mockDocker, os.Stdin) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("failed to pull")) + sandboxConfig.DefaultConfig.Image = "" + tag := "v0.15.0" + githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + }, nil, nil) + + githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) assert.NotNil(t, err) + assert.Equal(t, "failed to pull", err.Error()) }) t.Run("Error in removing existing cluster", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ { ID: docker.FlyteSandboxClusterName, @@ -387,136 +227,53 @@ func TestStartSandboxFunc(t *testing.T) { }, }, nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("error")) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startSandbox(ctx, mockDocker, strings.NewReader("y")) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("failed to remove container")) + _, err := startSandbox(ctx, mockDocker, githubMock, strings.NewReader("y")) assert.NotNil(t, err) + assert.Equal(t, "failed to remove container", err.Error()) }) t.Run("Error in start container", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Source = "" - sandboxConfig.DefaultConfig.Version = "" - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: docker.Volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, fmt.Errorf("error")) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startSandbox(ctx, mockDocker, os.Stdin) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("failed to run container")) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) assert.NotNil(t, err) + assert.Equal(t, "failed to run container", err.Error()) }) t.Run("Error in reading logs", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, - }).Return(nil, fmt.Errorf("error")) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startSandbox(ctx, mockDocker, os.Stdin) + }).Return(nil, fmt.Errorf("failed to get container logs")) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) assert.NotNil(t, err) + assert.Equal(t, "failed to get container logs", err.Error()) }) t.Run("Error in list container", func(t *testing.T) { - ctx := context.Background() - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker := &mocks.Docker{} - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - sandboxConfig.DefaultConfig.Version = "" - volumes := docker.Volumes - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: sandboxConfig.DefaultConfig.Source, - Target: docker.Source, - }) - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, fmt.Errorf("error")) + sandboxSetup() + mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, }).Return(nil, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - _, err = startSandbox(ctx, mockDocker, os.Stdin) - assert.Nil(t, err) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) + assert.NotNil(t, err) + assert.Equal(t, "failed to list containers", err.Error()) }) - t.Run("Successfully run sandbox cluster command", func(t *testing.T) { + t.Run("Successfully run demo cluster command", func(t *testing.T) { mockOutStream := new(io.Writer) - ctx := context.Background() cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) - mockDocker := &mocks.Docker{} - errCh := make(chan error) client := testclient.NewSimpleClientset() k8s.Client = client _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) @@ -528,24 +285,11 @@ func TestStartSandboxFunc(t *testing.T) { if err != nil { t.Error(err) } - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - bodyStatus := make(chan container.ContainerWaitOKBody) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: docker.Volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(mock.Anything, mock.Anything, mock.Anything).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + stringReader := strings.NewReader(docker.SuccessMessage) reader := ioutil.NopCloser(stringReader) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ @@ -554,52 +298,31 @@ func TestStartSandboxFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(reader, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) mockK8sContextMgr := &k8sMocks.ContextOps{} docker.Client = mockDocker sandboxConfig.DefaultConfig.Source = "" sandboxConfig.DefaultConfig.Version = "" k8s.ContextMgr = mockK8sContextMgr + ghutil.Client = githubMock mockK8sContextMgr.OnCopyContextMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) err = startSandboxCluster(ctx, []string{}, cmdCtx) assert.Nil(t, err) }) - t.Run("Error in running sandbox cluster command", func(t *testing.T) { + t.Run("Error in running demo cluster command", func(t *testing.T) { mockOutStream := new(io.Writer) - ctx := context.Background() cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) - mockDocker := &mocks.Docker{} - errCh := make(chan error) - bodyStatus := make(chan container.ContainerWaitOKBody) - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - mockDocker.OnContainerCreate(ctx, &container.Config{ - Env: docker.Environment, - Image: image, - Tty: false, - ExposedPorts: p1, - }, &container.HostConfig{ - Mounts: docker.Volumes, - PortBindings: p2, - Privileged: true, - }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, fmt.Errorf("error")) + sandboxSetup() + docker.Client = mockDocker + mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - stringReader := strings.NewReader(docker.SuccessMessage) - reader := ioutil.NopCloser(stringReader) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, - }).Return(reader, nil) - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) - docker.Client = mockDocker - sandboxConfig.DefaultConfig.Source = "" - err = startSandboxCluster(ctx, []string{}, cmdCtx) + }).Return(nil, nil) + err := startSandboxCluster(ctx, []string{}, cmdCtx) assert.NotNil(t, err) }) } @@ -703,30 +426,3 @@ func TestGetNodeTaintStatus(t *testing.T) { assert.Equal(t, true, c) }) } - -func TestGetSandboxImage(t *testing.T) { - t.Run("Get Latest sandbox", func(t *testing.T) { - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(image, "cr.flyte.org/flyteorg/flyte-sandbox:dind-")) - }) - - t.Run("Get sandbox image with version ", func(t *testing.T) { - image, _, err := githubutil.GetFullyQualifiedImageName("dind", "v0.14.0", sandboxImageName, false) - assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) - }) - t.Run("Get sandbox image with wrong version ", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("dind", "v100.1.0", sandboxImageName, false) - assert.NotNil(t, err) - }) - t.Run("Get sandbox image with wrong version ", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("dind", "aaaaaa", sandboxImageName, false) - assert.NotNil(t, err) - }) - t.Run("Get sandbox image with version that is not supported", func(t *testing.T) { - _, _, err := githubutil.GetFullyQualifiedImageName("dind", "v0.10.0", sandboxImageName, false) - assert.NotNil(t, err) - }) - -} diff --git a/flytectl/cmd/sandbox/status.go b/flytectl/cmd/sandbox/status.go index 49e5fb77b7..30160ef7e8 100644 --- a/flytectl/cmd/sandbox/status.go +++ b/flytectl/cmd/sandbox/status.go @@ -32,7 +32,10 @@ func sandboxClusterStatus(ctx context.Context, args []string, cmdCtx cmdCore.Com } func printStatus(ctx context.Context, cli docker.Docker) error { - c := docker.GetSandbox(ctx, cli) + c, err := docker.GetSandbox(ctx, cli) + if err != nil { + return err + } if c == nil { fmt.Printf("%v no Sandbox found \n", emoji.StopSign) return nil diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index 16ca11bf20..9280e303a5 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -38,7 +38,10 @@ func teardownSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.C } func tearDownSandbox(ctx context.Context, cli docker.Docker) error { - c := docker.GetSandbox(ctx, cli) + c, err := docker.GetSandbox(ctx, cli) + if err != nil { + return err + } if c != nil { if err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ Force: true, diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go index eb1dde2b3e..f8c4099e4e 100644 --- a/flytectl/cmd/upgrade/upgrade.go +++ b/flytectl/cmd/upgrade/upgrade.go @@ -12,7 +12,7 @@ import ( stdlibversion "github.com/flyteorg/flytestdlib/version" - "github.com/flyteorg/flytectl/pkg/githubutil" + "github.com/flyteorg/flytectl/pkg/github" "github.com/flyteorg/flytestdlib/logger" "github.com/mouuff/go-rocket-update/pkg/updater" @@ -67,7 +67,7 @@ func selfUpgrade(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte if args[0] == rollBackSubCommand && !isRollBackSupported(goos) { return nil } - ext, err := githubutil.FlytectlReleaseConfig.GetExecutable() + ext, err := github.FlytectlReleaseConfig.GetExecutable() if err != nil { return err } @@ -75,7 +75,7 @@ func selfUpgrade(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte if _, err := os.Stat(backupBinary); err != nil { return errors.New("flytectl backup doesn't exist. Rollback is not possible") } - return githubutil.FlytectlReleaseConfig.Rollback() + return github.FlytectlReleaseConfig.Rollback() } if isSupported, err := isUpgradeSupported(goos); err != nil { @@ -84,7 +84,7 @@ func selfUpgrade(ctx context.Context, args []string, cmdCtx cmdCore.CommandConte return nil } - if message, err := upgrade(githubutil.FlytectlReleaseConfig); err != nil { + if message, err := upgrade(github.FlytectlReleaseConfig); err != nil { return err } else if len(message) > 0 { logger.Info(ctx, message) @@ -109,7 +109,7 @@ func upgrade(u *updater.Updater) (string, error) { } func isUpgradeSupported(goos platformutil.Platform) (bool, error) { - latest, err := githubutil.FlytectlReleaseConfig.GetLatestVersion() + latest, err := github.FlytectlReleaseConfig.GetLatestVersion() if err != nil { return false, err } @@ -121,7 +121,7 @@ func isUpgradeSupported(goos platformutil.Platform) (bool, error) { return false, nil } - message, err := githubutil.GetUpgradeMessage(latest, goos) + message, err := github.GetUpgradeMessage(latest, goos) if err != nil { return false, err } diff --git a/flytectl/cmd/upgrade/upgrade_test.go b/flytectl/cmd/upgrade/upgrade_test.go index 5d4ac283ef..7b5b211e41 100644 --- a/flytectl/cmd/upgrade/upgrade_test.go +++ b/flytectl/cmd/upgrade/upgrade_test.go @@ -6,7 +6,7 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flytectl/pkg/githubutil" + "github.com/flyteorg/flytectl/pkg/github" "github.com/flyteorg/flytectl/pkg/util" "github.com/flyteorg/flytectl/pkg/platformutil" @@ -48,9 +48,9 @@ func TestUpgradeCommand(t *testing.T) { func TestUpgrade(t *testing.T) { _ = util.WriteIntoFile([]byte("data"), tempExt) stdlibversion.Version = version - githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + github.FlytectlReleaseConfig.OverrideExecutable = tempExt t.Run("Successful upgrade", func(t *testing.T) { - message, err := upgrade(githubutil.FlytectlReleaseConfig) + message, err := upgrade(github.FlytectlReleaseConfig) assert.Nil(t, err) assert.Contains(t, message, "Successfully updated to version") }) @@ -61,7 +61,7 @@ func TestCheckGoosForRollback(t *testing.T) { linux := platformutil.Linux windows := platformutil.Windows darwin := platformutil.Darwin - githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + github.FlytectlReleaseConfig.OverrideExecutable = tempExt t.Run("checkGOOSForRollback on linux", func(t *testing.T) { assert.Equal(t, true, isRollBackSupported(linux)) assert.Equal(t, false, isRollBackSupported(windows)) @@ -71,7 +71,7 @@ func TestCheckGoosForRollback(t *testing.T) { func TestIsUpgradeable(t *testing.T) { stdlibversion.Version = version - githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + github.FlytectlReleaseConfig.OverrideExecutable = tempExt linux := platformutil.Linux windows := platformutil.Windows darwin := platformutil.Darwin @@ -106,7 +106,7 @@ func TestIsUpgradeable(t *testing.T) { func TestSelfUpgrade(t *testing.T) { stdlibversion.Version = version - githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + github.FlytectlReleaseConfig.OverrideExecutable = tempExt goos = platformutil.Linux t.Run("Successful upgrade", func(t *testing.T) { s := testutils.Setup() @@ -120,7 +120,7 @@ func TestSelfUpgrade(t *testing.T) { func TestSelfUpgradeError(t *testing.T) { stdlibversion.Version = version - githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + github.FlytectlReleaseConfig.OverrideExecutable = tempExt goos = platformutil.Linux t.Run("Successful upgrade", func(t *testing.T) { s := testutils.Setup() @@ -135,7 +135,7 @@ func TestSelfUpgradeError(t *testing.T) { func TestSelfUpgradeRollback(t *testing.T) { stdlibversion.Version = version - githubutil.FlytectlReleaseConfig.OverrideExecutable = tempExt + github.FlytectlReleaseConfig.OverrideExecutable = tempExt goos = platformutil.Linux t.Run("Successful rollback", func(t *testing.T) { s := testutils.Setup() @@ -171,7 +171,7 @@ func TestSelfUpgradeRollback(t *testing.T) { stdlibversion.Build = "" stdlibversion.BuildTime = "" stdlibversion.Version = version - githubutil.FlytectlReleaseConfig.OverrideExecutable = "/" + github.FlytectlReleaseConfig.OverrideExecutable = "/" assert.Nil(t, selfUpgrade(s.Ctx, args, s.CmdCtx)) }) diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go index 927ca755f5..f802c69b10 100644 --- a/flytectl/cmd/version/version.go +++ b/flytectl/cmd/version/version.go @@ -6,7 +6,7 @@ import ( "fmt" "runtime" - "github.com/flyteorg/flytectl/pkg/githubutil" + "github.com/flyteorg/flytectl/pkg/github" "github.com/flyteorg/flytectl/pkg/platformutil" @@ -53,11 +53,11 @@ func GetVersionCommand(rootCmd *cobra.Command) map[string]cmdCore.CommandEntry { func getVersion(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { goos := platformutil.Platform(runtime.GOOS) - version, err := githubutil.FlytectlReleaseConfig.GetLatestVersion() + version, err := github.FlytectlReleaseConfig.GetLatestVersion() if err != nil { logger.Error(ctx, "Unable to get the latest version because %v", err) } else { - message, err := githubutil.GetUpgradeMessage(version, goos) + message, err := github.GetUpgradeMessage(version, goos) if err != nil { logger.Error(ctx, "Unable to detect a new version because %v", err) } diff --git a/flytectl/go.mod b/flytectl/go.mod index 2d68091af6..30190ad03f 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.24.15 + github.com/flyteorg/flyteidl v0.24.21 github.com/flyteorg/flytestdlib v0.4.16 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 23095dc02a..5a749e8e12 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -364,8 +364,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.24.15 h1:Iqbwx3w1a4Dh6byRZrZMlHsKPKoOZbBiS9vR0iXzacY= -github.com/flyteorg/flyteidl v0.24.15/go.mod h1:vHSugApgS3hRITIafzQDU8DZD/W8wFRfFcgaFU35Dww= +github.com/flyteorg/flyteidl v0.24.21 h1:9dowP4gQHBe/1sRfYa5PP2snT/7/ZwgRsYkof4zr19c= +github.com/flyteorg/flyteidl v0.24.21/go.mod h1:vHSugApgS3hRITIafzQDU8DZD/W8wFRfFcgaFU35Dww= github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index b6bef9549e..aeaae89510 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -65,21 +65,28 @@ func GetDockerClient() (Docker, error) { } // GetSandbox will return sandbox container if it exist -func GetSandbox(ctx context.Context, cli Docker) *types.Container { - containers, _ := cli.ContainerList(ctx, types.ContainerListOptions{ +func GetSandbox(ctx context.Context, cli Docker) (*types.Container, error) { + containers, err := cli.ContainerList(ctx, types.ContainerListOptions{ All: true, }) + if err != nil { + return nil, err + } for _, v := range containers { if strings.Contains(v.Names[0], FlyteSandboxClusterName) { - return &v + return &v, nil } } - return nil + return nil, nil } // RemoveSandbox will remove sandbox container if exist func RemoveSandbox(ctx context.Context, cli Docker, reader io.Reader) error { - if c := GetSandbox(ctx, cli); c != nil { + c, err := GetSandbox(ctx, cli) + if err != nil { + return err + } + if c != nil { if cmdUtil.AskForConfirmation("delete existing sandbox cluster", reader) { err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ Force: true, diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index a5124fb2bf..37d91f9085 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -43,29 +43,31 @@ func TestGetSandbox(t *testing.T) { setupSandbox() t.Run("Successfully get sandbox container", func(t *testing.T) { mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() - mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return(containers, nil) - c := GetSandbox(context, mockDocker) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + c, err := GetSandbox(ctx, mockDocker) assert.Equal(t, c.Names[0], FlyteSandboxClusterName) + assert.Nil(t, err) }) t.Run("Successfully get sandbox container with zero result", func(t *testing.T) { mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() - mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - c := GetSandbox(context, mockDocker) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + c, err := GetSandbox(ctx, mockDocker) assert.Nil(t, c) + assert.Nil(t, err) }) t.Run("Error in get sandbox container", func(t *testing.T) { mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() - mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return(containers, nil) - mockDocker.OnContainerRemove(context, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) - err := RemoveSandbox(context, mockDocker, strings.NewReader("y")) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + err := RemoveSandbox(ctx, mockDocker, strings.NewReader("y")) assert.Nil(t, err) }) @@ -75,23 +77,23 @@ func TestRemoveSandboxWithNoReply(t *testing.T) { setupSandbox() t.Run("Successfully remove sandbox container", func(t *testing.T) { mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() // Verify the attributes - mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return(containers, nil) - mockDocker.OnContainerRemove(context, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) - err := RemoveSandbox(context, mockDocker, strings.NewReader("n")) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + err := RemoveSandbox(ctx, mockDocker, strings.NewReader("n")) assert.NotNil(t, err) }) t.Run("Successfully remove sandbox container with zero sandbox containers are running", func(t *testing.T) { mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() // Verify the attributes - mockDocker.OnContainerList(context, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnContainerRemove(context, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) - err := RemoveSandbox(context, mockDocker, strings.NewReader("n")) + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + err := RemoveSandbox(ctx, mockDocker, strings.NewReader("n")) assert.Nil(t, err) }) @@ -101,39 +103,39 @@ func TestPullDockerImage(t *testing.T) { t.Run("Successfully pull image Always", func(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() // Verify the attributes - mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways, sandboxConfig.ImagePullOptions{}) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways, sandboxConfig.ImagePullOptions{}) assert.Nil(t, err) }) t.Run("Error in pull image", func(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() // Verify the attributes - mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) - err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways, sandboxConfig.ImagePullOptions{}) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways, sandboxConfig.ImagePullOptions{}) assert.NotNil(t, err) }) t.Run("Successfully pull image IfNotPresent", func(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() // Verify the attributes - mockDocker.OnImagePullMatch(context, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnImageListMatch(context, types.ImageListOptions{}).Return([]types.ImageSummary{}, nil) - err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyIfNotPresent, sandboxConfig.ImagePullOptions{}) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImageListMatch(ctx, types.ImageListOptions{}).Return([]types.ImageSummary{}, nil) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyIfNotPresent, sandboxConfig.ImagePullOptions{}) assert.Nil(t, err) }) t.Run("Successfully pull image Never", func(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} - context := context.Background() - err := PullDockerImage(context, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyNever, sandboxConfig.ImagePullOptions{}) + ctx := context.Background() + err := PullDockerImage(ctx, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyNever, sandboxConfig.ImagePullOptions{}) assert.Nil(t, err) }) } @@ -144,10 +146,10 @@ func TestStartContainer(t *testing.T) { t.Run("Successfully create a container", func(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() // Verify the attributes - mockDocker.OnContainerCreate(context, &container.Config{ + mockDocker.OnContainerCreate(ctx, &container.Config{ Env: Environment, Image: imageName, Tty: false, @@ -159,8 +161,8 @@ func TestStartContainer(t *testing.T) { }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ ID: "Hello", }, nil) - mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(nil) - id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) assert.Nil(t, err) assert.Greater(t, len(id), 0) assert.Equal(t, id, "Hello") @@ -169,14 +171,14 @@ func TestStartContainer(t *testing.T) { t.Run("Successfully create a container with Env", func(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() // Setup additional env additionalEnv := []string{"a=1", "b=2"} expectedEnv := append(Environment, "a=1") expectedEnv = append(expectedEnv, "b=2") // Verify the attributes - mockDocker.OnContainerCreate(context, &container.Config{ + mockDocker.OnContainerCreate(ctx, &container.Config{ Env: expectedEnv, Image: imageName, Tty: false, @@ -188,8 +190,8 @@ func TestStartContainer(t *testing.T) { }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ ID: "Hello", }, nil) - mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(nil) - id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName, additionalEnv) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, additionalEnv) assert.Nil(t, err) assert.Greater(t, len(id), 0) assert.Equal(t, id, "Hello") @@ -199,10 +201,10 @@ func TestStartContainer(t *testing.T) { t.Run("Error in creating container", func(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() // Verify the attributes - mockDocker.OnContainerCreate(context, &container.Config{ + mockDocker.OnContainerCreate(ctx, &container.Config{ Env: Environment, Image: imageName, Tty: false, @@ -214,8 +216,8 @@ func TestStartContainer(t *testing.T) { }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ ID: "", }, fmt.Errorf("error")) - mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(nil) - id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) assert.NotNil(t, err) assert.Equal(t, len(id), 0) assert.Equal(t, id, "") @@ -224,10 +226,10 @@ func TestStartContainer(t *testing.T) { t.Run("Error in start of a container", func(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} - context := context.Background() + ctx := context.Background() // Verify the attributes - mockDocker.OnContainerCreate(context, &container.Config{ + mockDocker.OnContainerCreate(ctx, &container.Config{ Env: Environment, Image: imageName, Tty: false, @@ -239,8 +241,8 @@ func TestStartContainer(t *testing.T) { }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ ID: "Hello", }, nil) - mockDocker.OnContainerStart(context, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) - id, err := StartContainer(context, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) + id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) assert.NotNil(t, err) assert.Equal(t, len(id), 0) assert.Equal(t, id, "") @@ -252,27 +254,27 @@ func TestReadLogs(t *testing.T) { t.Run("Successfully read logs", func(t *testing.T) { mockDocker := &mocks.Docker{} - context := context.Background() - mockDocker.OnContainerLogsMatch(context, mock.Anything, types.ContainerLogsOptions{ + ctx := context.Background() + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, }).Return(nil, nil) - _, err := ReadLogs(context, mockDocker, "test") + _, err := ReadLogs(ctx, mockDocker, "test") assert.Nil(t, err) }) t.Run("Error in reading logs", func(t *testing.T) { mockDocker := &mocks.Docker{} - context := context.Background() - mockDocker.OnContainerLogsMatch(context, mock.Anything, types.ContainerLogsOptions{ + ctx := context.Background() + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, }).Return(nil, fmt.Errorf("error")) - _, err := ReadLogs(context, mockDocker, "test") + _, err := ReadLogs(ctx, mockDocker, "test") assert.NotNil(t, err) }) } diff --git a/flytectl/pkg/githubutil/githubutil.go b/flytectl/pkg/github/githubutil.go similarity index 64% rename from flytectl/pkg/githubutil/githubutil.go rename to flytectl/pkg/github/githubutil.go index 5fa3dacc6e..e65feaa189 100644 --- a/flytectl/pkg/githubutil/githubutil.go +++ b/flytectl/pkg/github/githubutil.go @@ -1,36 +1,30 @@ -package githubutil +package github import ( "context" + "fmt" "net/http" "os" "path/filepath" "runtime" "strings" - "golang.org/x/text/cases" - "golang.org/x/text/language" - + "github.com/flyteorg/flytectl/pkg/platformutil" "github.com/flyteorg/flytectl/pkg/util" - "github.com/flyteorg/flytestdlib/logger" - - "golang.org/x/oauth2" - - "github.com/flyteorg/flytectl/pkg/platformutil" stdlibversion "github.com/flyteorg/flytestdlib/version" - "github.com/mouuff/go-rocket-update/pkg/provider" - "github.com/mouuff/go-rocket-update/pkg/updater" - - "fmt" "github.com/google/go-github/v42/github" + "github.com/mouuff/go-rocket-update/pkg/provider" + "github.com/mouuff/go-rocket-update/pkg/updater" + "golang.org/x/oauth2" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) const ( owner = "flyteorg" flyte = "flyte" - sandboxManifest = "flyte_sandbox_manifest.yaml" flytectl = "flytectl" sandboxSupportedVersion = "v0.10.0" flytectlRepository = "github.com/flyteorg/flytectl" @@ -42,6 +36,8 @@ const ( brewInstallDirectory = "/Cellar/flytectl" ) +var Client GHRepoService + // FlytectlReleaseConfig represent the updater config for flytectl binary var FlytectlReleaseConfig = &updater.Updater{ Provider: &provider.Github{ @@ -56,31 +52,28 @@ var ( arch = platformutil.Arch(runtime.GOARCH) ) -//GetGHClient will return github client -func GetGHClient() *github.Client { - if len(os.Getenv("GITHUB_TOKEN")) > 0 { - return github.NewClient(oauth2.NewClient(context.Background(), oauth2.StaticTokenSource( - &oauth2.Token{AccessToken: os.Getenv("GITHUB_TOKEN")}, - ))) - } - return github.NewClient(&http.Client{}) +//go:generate mockery -name=GHRepoService -case=underscore + +type GHRepoService interface { + GetLatestRelease(ctx context.Context, owner, repo string) (*github.RepositoryRelease, *github.Response, error) + ListReleases(ctx context.Context, owner, repo string, opts *github.ListOptions) ([]*github.RepositoryRelease, *github.Response, error) + GetReleaseByTag(ctx context.Context, owner, repo, tag string) (*github.RepositoryRelease, *github.Response, error) + GetCommitSHA1(ctx context.Context, owner, repo, ref, lastSHA string) (string, *github.Response, error) } -// GetLatestVersion returns the latest non-prerelease version of provided repository, as +// GetLatestRelease returns the latest non-prerelease version of provided repoName, as // described in https://docs.github.com/en/rest/reference/releases#get-the-latest-release -func GetLatestVersion(repository string) (*github.RepositoryRelease, error) { - client := GetGHClient() - release, _, err := client.Repositories.GetLatestRelease(context.Background(), owner, repository) +func GetLatestRelease(repoName string, g GHRepoService) (*github.RepositoryRelease, error) { + release, _, err := g.GetLatestRelease(context.Background(), owner, repoName) if err != nil { return nil, err } return release, err } -// GetListRelease returns the list of release of provided repository -func GetListRelease(repository string) ([]*github.RepositoryRelease, error) { - client := GetGHClient() - releases, _, err := client.Repositories.ListReleases(context.Background(), owner, repository, &github.ListOptions{ +// ListReleases returns the list of release of provided repoName +func ListReleases(repoName string, g GHRepoService) ([]*github.RepositoryRelease, error) { + releases, _, err := g.ListReleases(context.Background(), owner, repoName, &github.ListOptions{ PerPage: 100, }) if err != nil { @@ -89,11 +82,43 @@ func GetListRelease(repository string) ([]*github.RepositoryRelease, error) { return releases, err } +// GetReleaseByTag returns the provided tag release if tag exist in repository +func GetReleaseByTag(repoName, tag string, g GHRepoService) (*github.RepositoryRelease, error) { + release, _, err := g.GetReleaseByTag(context.Background(), owner, repoName, tag) + if err != nil { + return nil, err + } + return release, err +} + +// GetCommitSHA1 returns sha hash against the version +func GetCommitSHA1(repoName, version string, g GHRepoService) (string, error) { + sha, _, err := g.GetCommitSHA1(context.Background(), owner, repoName, version, "") + if err != nil { + return "", err + } + return sha, err +} + +// GetAssetFromRelease returns the asset using assetName from github release with tag +func GetAssetFromRelease(tag, assetName, repoName string, g GHRepoService) (*github.ReleaseAsset, error) { + release, _, err := g.GetReleaseByTag(context.Background(), owner, repoName, tag) + if err != nil { + return nil, err + } + for _, v := range release.Assets { + if v.GetName() == assetName { + return v, nil + } + } + return nil, fmt.Errorf("assest is not found in %s[%s] release", repoName, tag) +} + // GetSandboxImageSha returns the sha as per input -func GetSandboxImageSha(version string, pre bool) (string, string, error) { +func GetSandboxImageSha(tag string, pre bool, g GHRepoService) (string, string, error) { var release *github.RepositoryRelease - if len(version) == 0 { - releases, err := GetListRelease(flyte) + if len(tag) == 0 { + releases, err := ListReleases(flyte, g) if err != nil { return "", release.GetTagName(), err } @@ -107,8 +132,8 @@ func GetSandboxImageSha(version string, pre bool) (string, string, error) { } } logger.Infof(context.Background(), "starting with release %s", release.GetTagName()) - } else if len(version) > 0 { - r, err := CheckVersionExist(version, flyte) + } else if len(tag) > 0 { + r, err := GetReleaseByTag(flyte, tag, g) if err != nil { return "", r.GetTagName(), err } @@ -121,7 +146,7 @@ func GetSandboxImageSha(version string, pre bool) (string, string, error) { if !isGreater { return "", release.GetTagName(), fmt.Errorf("version flag only supported with flyte %s+ release", sandboxSupportedVersion) } - sha, err := GetSHAFromVersion(release.GetTagName(), flyte) + sha, err := GetCommitSHA1(flyte, release.GetTagName(), g) if err != nil { return "", release.GetTagName(), err } @@ -137,40 +162,6 @@ func getFlytectlAssetName() string { return fmt.Sprintf("flytectl_%s_%s.tar.gz", cases.Title(language.English).String(runtime.GOOS), arch.String()) } -// CheckVersionExist returns the provided version release if version exist in repository -func CheckVersionExist(version, repository string) (*github.RepositoryRelease, error) { - client := GetGHClient() - release, _, err := client.Repositories.GetReleaseByTag(context.Background(), owner, repository, version) - if err != nil { - return nil, err - } - return release, err -} - -// GetSHAFromVersion returns sha commit hash against a release -func GetSHAFromVersion(version, repository string) (string, error) { - client := GetGHClient() - sha, _, err := client.Repositories.GetCommitSHA1(context.Background(), owner, repository, version, "") - if err != nil { - return "", err - } - return sha, err -} - -// GetAssetsFromRelease returns the asset from github release -func GetAssetsFromRelease(version, assets, repository string) (*github.ReleaseAsset, error) { - release, err := CheckVersionExist(version, repository) - if err != nil { - return nil, err - } - for _, v := range release.Assets { - if v.GetName() == assets { - return v, nil - } - } - return nil, fmt.Errorf("assest is not found in %s[%s] release", repository, version) -} - // GetUpgradeMessage return the upgrade message func GetUpgradeMessage(latest string, goos platformutil.Platform) (string, error) { isGreater, err := util.IsVersionGreaterThan(latest, stdlibversion.Version) @@ -218,11 +209,28 @@ func CheckBrewInstall(goos platformutil.Platform) (string, error) { // if no version is specified then the Latest release of cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA} is used // else cr.flyte.org/flyteorg/flyte-sandbox:dind-{SHA}, where sha is derived from the version. // If pre release is true then use latest pre release of Flyte, In that case User don't need to pass version -func GetFullyQualifiedImageName(prefix, version, image string, pre bool) (string, string, error) { - sha, version, err := GetSandboxImageSha(version, pre) + +func GetFullyQualifiedImageName(prefix, version, image string, pre bool, g GHRepoService) (string, string, error) { + sha, version, err := GetSandboxImageSha(version, pre, g) if err != nil { return "", version, err } return fmt.Sprintf("%s:%s", image, fmt.Sprintf("%s-%s", prefix, sha)), version, nil } + +// GetGHRepoService returns the initialized github repo service client. +func GetGHRepoService() GHRepoService { + if Client == nil { + var gh *github.Client + if len(os.Getenv("GITHUB_TOKEN")) > 0 { + gh = github.NewClient(oauth2.NewClient(context.Background(), oauth2.StaticTokenSource( + &oauth2.Token{AccessToken: os.Getenv("GITHUB_TOKEN")}, + ))) + } else { + gh = github.NewClient(&http.Client{}) + } + return gh.Repositories + } + return Client +} diff --git a/flytectl/pkg/github/githubutil_test.go b/flytectl/pkg/github/githubutil_test.go new file mode 100644 index 0000000000..920f7682ec --- /dev/null +++ b/flytectl/pkg/github/githubutil_test.go @@ -0,0 +1,205 @@ +package github + +import ( + "fmt" + "runtime" + "strings" + "testing" + + "github.com/flyteorg/flytectl/pkg/github/mocks" + "github.com/flyteorg/flytectl/pkg/platformutil" + stdlibversion "github.com/flyteorg/flytestdlib/version" + "github.com/google/go-github/v42/github" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "golang.org/x/text/cases" + "golang.org/x/text/language" +) + +var sandboxImageName = "cr.flyte.org/flyteorg/flyte-sandbox" + +func TestGetLatestVersion(t *testing.T) { + t.Run("Get latest release with wrong url", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + mockGh.OnGetLatestReleaseMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("failed")) + _, err := GetLatestRelease("fl", mockGh) + assert.NotNil(t, err) + }) + t.Run("Get latest release", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + mockGh.OnGetLatestReleaseMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil) + _, err := GetLatestRelease("flytectl", mockGh) + assert.Nil(t, err) + }) +} + +func TestGetLatestRelease(t *testing.T) { + mockGh := &mocks.GHRepoService{} + tag := "v1.0.0" + mockGh.OnGetLatestReleaseMatch(mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + }, nil, nil) + release, err := GetLatestRelease("flyte", mockGh) + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(release.GetTagName(), "v")) +} + +func TestCheckVersionExist(t *testing.T) { + t.Run("Invalid Tag", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + mockGh.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("failed")) + _, err := GetReleaseByTag("v100.0.0", "flyte", mockGh) + assert.NotNil(t, err) + }) + t.Run("Valid Tag", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + tag := "v1.0.0" + mockGh.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + }, nil, nil) + release, err := GetReleaseByTag(tag, "flyte", mockGh) + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(release.GetTagName(), "v")) + }) +} + +func TestGetFullyQualifiedImageName(t *testing.T) { + t.Run("Get tFully Qualified Image Name ", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + tag := "v0.15.0" + isPreRelease := false + releases := []*github.RepositoryRelease{{ + TagName: &tag, + Prerelease: &isPreRelease, + }} + mockGh.OnListReleasesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(releases, nil, nil) + mockGh.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sandboxImageName, nil, nil) + image, tag, err := GetFullyQualifiedImageName("dind", "", sandboxImageName, false, mockGh) + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(tag, "v")) + assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) + }) + t.Run("Get Fully Qualified Image Name with pre release", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + tag := "v0.15.0-pre" + isPreRelease := true + releases := []*github.RepositoryRelease{{ + TagName: &tag, + Prerelease: &isPreRelease, + }} + mockGh.OnListReleasesMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(releases, nil, nil) + mockGh.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sandboxImageName, nil, nil) + image, tag, err := GetFullyQualifiedImageName("dind", "", sandboxImageName, isPreRelease, mockGh) + assert.Nil(t, err) + assert.Equal(t, true, strings.HasPrefix(tag, "v")) + assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) + }) + t.Run("Get Fully Qualified Image Name with specific version", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + tag := "v0.19.0" + isPreRelease := true + release := &github.RepositoryRelease{ + TagName: &tag, + Prerelease: &isPreRelease, + } + mockGh.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(release, nil, nil) + mockGh.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(sandboxImageName, nil, nil) + image, tag, err := GetFullyQualifiedImageName("dind", "v0.19.0", sandboxImageName, isPreRelease, mockGh) + assert.Nil(t, err) + assert.Equal(t, "v0.19.0", tag) + assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) + }) +} + +func TestGetSHAFromVersion(t *testing.T) { + t.Run("Invalid Tag", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + mockGh.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("", nil, fmt.Errorf("failed")) + _, err := GetCommitSHA1("v100.0.0", "flyte", mockGh) + assert.NotNil(t, err) + }) + t.Run("Valid Tag", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + mockGh.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("v1.15.0", nil, nil) + release, err := GetCommitSHA1("v0.15.0", "flyte", mockGh) + assert.Nil(t, err) + assert.Greater(t, len(release), 0) + }) +} + +func TestGetAssetsFromRelease(t *testing.T) { + t.Run("Successful get assets", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + tag := "v0.15.0" + sandboxManifest := "flyte_sandbox_manifest.yaml" + mockGh.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + Assets: []*github.ReleaseAsset{{ + Name: &sandboxManifest, + }, + }, + }, nil, nil) + assets, err := GetAssetFromRelease(tag, sandboxManifest, flyte, mockGh) + assert.Nil(t, err) + assert.NotNil(t, assets) + assert.Equal(t, sandboxManifest, *assets.Name) + }) + + t.Run("Failed get assets with wrong name", func(t *testing.T) { + mockGh := &mocks.GHRepoService{} + mockGh.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("failed")) + assets, err := GetAssetFromRelease("v0.15.0", "test", flyte, mockGh) + assert.NotNil(t, err) + assert.Nil(t, assets) + }) +} + +func TestGetAssetsName(t *testing.T) { + t.Run("Get Assets name", func(t *testing.T) { + expected := fmt.Sprintf("flytectl_%s_386.tar.gz", cases.Title(language.English).String(runtime.GOOS)) + arch = platformutil.Arch386 + assert.Equal(t, expected, getFlytectlAssetName()) + }) +} + +func TestCheckBrewInstall(t *testing.T) { + symlink, err := CheckBrewInstall(platformutil.Darwin) + assert.Nil(t, err) + assert.Equal(t, len(symlink), 0) + symlink, err = CheckBrewInstall(platformutil.Linux) + assert.Nil(t, err) + assert.Equal(t, 0, len(symlink)) +} + +func TestGetUpgradeMessage(t *testing.T) { + var darwin = platformutil.Darwin + var linux = platformutil.Linux + var windows = platformutil.Linux + + var version = "v0.2.20" + stdlibversion.Version = "v0.2.10" + message, err := GetUpgradeMessage(version, darwin) + assert.Nil(t, err) + assert.Equal(t, 157, len(message)) + + version = "v0.2.09" + message, err = GetUpgradeMessage(version, darwin) + assert.Nil(t, err) + assert.Equal(t, 63, len(message)) + + version = "v" + message, err = GetUpgradeMessage(version, darwin) + assert.NotNil(t, err) + assert.Equal(t, 0, len(message)) + + version = "v0.2.20" + message, err = GetUpgradeMessage(version, windows) + assert.Nil(t, err) + assert.Equal(t, 157, len(message)) + + version = "v0.2.20" + message, err = GetUpgradeMessage(version, linux) + assert.Nil(t, err) + assert.Equal(t, 157, len(message)) +} diff --git a/flytectl/pkg/github/mocks/gh_repo_service.go b/flytectl/pkg/github/mocks/gh_repo_service.go new file mode 100644 index 0000000000..04c2bfebc1 --- /dev/null +++ b/flytectl/pkg/github/mocks/gh_repo_service.go @@ -0,0 +1,213 @@ +// Code generated by mockery v1.0.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + github "github.com/google/go-github/v42/github" + mock "github.com/stretchr/testify/mock" +) + +// GHRepoService is an autogenerated mock type for the GHRepoService type +type GHRepoService struct { + mock.Mock +} + +type GHRepoService_GetCommitSHA1 struct { + *mock.Call +} + +func (_m GHRepoService_GetCommitSHA1) Return(_a0 string, _a1 *github.Response, _a2 error) *GHRepoService_GetCommitSHA1 { + return &GHRepoService_GetCommitSHA1{Call: _m.Call.Return(_a0, _a1, _a2)} +} + +func (_m *GHRepoService) OnGetCommitSHA1(ctx context.Context, owner string, repo string, ref string, lastSHA string) *GHRepoService_GetCommitSHA1 { + c := _m.On("GetCommitSHA1", ctx, owner, repo, ref, lastSHA) + return &GHRepoService_GetCommitSHA1{Call: c} +} + +func (_m *GHRepoService) OnGetCommitSHA1Match(matchers ...interface{}) *GHRepoService_GetCommitSHA1 { + c := _m.On("GetCommitSHA1", matchers...) + return &GHRepoService_GetCommitSHA1{Call: c} +} + +// GetCommitSHA1 provides a mock function with given fields: ctx, owner, repo, ref, lastSHA +func (_m *GHRepoService) GetCommitSHA1(ctx context.Context, owner string, repo string, ref string, lastSHA string) (string, *github.Response, error) { + ret := _m.Called(ctx, owner, repo, ref, lastSHA) + + var r0 string + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) string); ok { + r0 = rf(ctx, owner, repo, ref, lastSHA) + } else { + r0 = ret.Get(0).(string) + } + + var r1 *github.Response + if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) *github.Response); ok { + r1 = rf(ctx, owner, repo, ref, lastSHA) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*github.Response) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(context.Context, string, string, string, string) error); ok { + r2 = rf(ctx, owner, repo, ref, lastSHA) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +type GHRepoService_GetLatestRelease struct { + *mock.Call +} + +func (_m GHRepoService_GetLatestRelease) Return(_a0 *github.RepositoryRelease, _a1 *github.Response, _a2 error) *GHRepoService_GetLatestRelease { + return &GHRepoService_GetLatestRelease{Call: _m.Call.Return(_a0, _a1, _a2)} +} + +func (_m *GHRepoService) OnGetLatestRelease(ctx context.Context, owner string, repo string) *GHRepoService_GetLatestRelease { + c := _m.On("GetLatestRelease", ctx, owner, repo) + return &GHRepoService_GetLatestRelease{Call: c} +} + +func (_m *GHRepoService) OnGetLatestReleaseMatch(matchers ...interface{}) *GHRepoService_GetLatestRelease { + c := _m.On("GetLatestRelease", matchers...) + return &GHRepoService_GetLatestRelease{Call: c} +} + +// GetLatestRelease provides a mock function with given fields: ctx, owner, repo +func (_m *GHRepoService) GetLatestRelease(ctx context.Context, owner string, repo string) (*github.RepositoryRelease, *github.Response, error) { + ret := _m.Called(ctx, owner, repo) + + var r0 *github.RepositoryRelease + if rf, ok := ret.Get(0).(func(context.Context, string, string) *github.RepositoryRelease); ok { + r0 = rf(ctx, owner, repo) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*github.RepositoryRelease) + } + } + + var r1 *github.Response + if rf, ok := ret.Get(1).(func(context.Context, string, string) *github.Response); ok { + r1 = rf(ctx, owner, repo) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*github.Response) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(context.Context, string, string) error); ok { + r2 = rf(ctx, owner, repo) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +type GHRepoService_GetReleaseByTag struct { + *mock.Call +} + +func (_m GHRepoService_GetReleaseByTag) Return(_a0 *github.RepositoryRelease, _a1 *github.Response, _a2 error) *GHRepoService_GetReleaseByTag { + return &GHRepoService_GetReleaseByTag{Call: _m.Call.Return(_a0, _a1, _a2)} +} + +func (_m *GHRepoService) OnGetReleaseByTag(ctx context.Context, owner string, repo string, tag string) *GHRepoService_GetReleaseByTag { + c := _m.On("GetReleaseByTag", ctx, owner, repo, tag) + return &GHRepoService_GetReleaseByTag{Call: c} +} + +func (_m *GHRepoService) OnGetReleaseByTagMatch(matchers ...interface{}) *GHRepoService_GetReleaseByTag { + c := _m.On("GetReleaseByTag", matchers...) + return &GHRepoService_GetReleaseByTag{Call: c} +} + +// GetReleaseByTag provides a mock function with given fields: ctx, owner, repo, tag +func (_m *GHRepoService) GetReleaseByTag(ctx context.Context, owner string, repo string, tag string) (*github.RepositoryRelease, *github.Response, error) { + ret := _m.Called(ctx, owner, repo, tag) + + var r0 *github.RepositoryRelease + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *github.RepositoryRelease); ok { + r0 = rf(ctx, owner, repo, tag) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*github.RepositoryRelease) + } + } + + var r1 *github.Response + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) *github.Response); ok { + r1 = rf(ctx, owner, repo, tag) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*github.Response) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(context.Context, string, string, string) error); ok { + r2 = rf(ctx, owner, repo, tag) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +type GHRepoService_ListReleases struct { + *mock.Call +} + +func (_m GHRepoService_ListReleases) Return(_a0 []*github.RepositoryRelease, _a1 *github.Response, _a2 error) *GHRepoService_ListReleases { + return &GHRepoService_ListReleases{Call: _m.Call.Return(_a0, _a1, _a2)} +} + +func (_m *GHRepoService) OnListReleases(ctx context.Context, owner string, repo string, opts *github.ListOptions) *GHRepoService_ListReleases { + c := _m.On("ListReleases", ctx, owner, repo, opts) + return &GHRepoService_ListReleases{Call: c} +} + +func (_m *GHRepoService) OnListReleasesMatch(matchers ...interface{}) *GHRepoService_ListReleases { + c := _m.On("ListReleases", matchers...) + return &GHRepoService_ListReleases{Call: c} +} + +// ListReleases provides a mock function with given fields: ctx, owner, repo, opts +func (_m *GHRepoService) ListReleases(ctx context.Context, owner string, repo string, opts *github.ListOptions) ([]*github.RepositoryRelease, *github.Response, error) { + ret := _m.Called(ctx, owner, repo, opts) + + var r0 []*github.RepositoryRelease + if rf, ok := ret.Get(0).(func(context.Context, string, string, *github.ListOptions) []*github.RepositoryRelease); ok { + r0 = rf(ctx, owner, repo, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*github.RepositoryRelease) + } + } + + var r1 *github.Response + if rf, ok := ret.Get(1).(func(context.Context, string, string, *github.ListOptions) *github.Response); ok { + r1 = rf(ctx, owner, repo, opts) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*github.Response) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(context.Context, string, string, *github.ListOptions) error); ok { + r2 = rf(ctx, owner, repo, opts) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} diff --git a/flytectl/pkg/githubutil/githubutil_test.go b/flytectl/pkg/githubutil/githubutil_test.go deleted file mode 100644 index 037a0ede14..0000000000 --- a/flytectl/pkg/githubutil/githubutil_test.go +++ /dev/null @@ -1,150 +0,0 @@ -package githubutil - -import ( - "fmt" - "runtime" - "strings" - "testing" - - "golang.org/x/text/cases" - "golang.org/x/text/language" - - stdlibversion "github.com/flyteorg/flytestdlib/version" - - "github.com/flyteorg/flytectl/pkg/platformutil" - - "github.com/stretchr/testify/assert" -) - -var sandboxImageName = "cr.flyte.org/flyteorg/flyte-sandbox" - -func TestGetLatestVersion(t *testing.T) { - t.Run("Get latest release with wrong url", func(t *testing.T) { - _, err := GetLatestVersion("fl") - assert.NotNil(t, err) - }) - t.Run("Get latest release", func(t *testing.T) { - _, err := GetLatestVersion("flytectl") - assert.Nil(t, err) - }) -} - -func TestGetLatestRelease(t *testing.T) { - release, err := GetLatestVersion("flyte") - assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(release.GetTagName(), "v")) -} - -func TestCheckVersionExist(t *testing.T) { - t.Run("Invalid Tag", func(t *testing.T) { - _, err := CheckVersionExist("v100.0.0", "flyte") - assert.NotNil(t, err) - }) - t.Run("Valid Tag", func(t *testing.T) { - release, err := CheckVersionExist("v0.15.0", "flyte") - assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(release.GetTagName(), "v")) - }) -} - -func TestGetFullyQualifiedImageName(t *testing.T) { - t.Run("Get tFully Qualified Image Name ", func(t *testing.T) { - image, tag, err := GetFullyQualifiedImageName("dind", "", sandboxImageName, false) - assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(tag, "v")) - assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) - }) - t.Run("Get tFully Qualified Image Name with pre release", func(t *testing.T) { - image, tag, err := GetFullyQualifiedImageName("dind", "", sandboxImageName, true) - assert.Nil(t, err) - assert.Equal(t, true, strings.HasPrefix(tag, "v")) - assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) - }) - t.Run("Get tFully Qualified Image Name with specific version", func(t *testing.T) { - image, tag, err := GetFullyQualifiedImageName("dind", "v0.19.0", sandboxImageName, true) - assert.Nil(t, err) - assert.Equal(t, "v0.19.0", tag) - assert.Equal(t, true, strings.HasPrefix(image, sandboxImageName)) - }) -} - -func TestGetSHAFromVersion(t *testing.T) { - t.Run("Invalid Tag", func(t *testing.T) { - _, err := GetSHAFromVersion("v100.0.0", "flyte") - assert.NotNil(t, err) - }) - t.Run("Valid Tag", func(t *testing.T) { - release, err := GetSHAFromVersion("v0.15.0", "flyte") - assert.Nil(t, err) - assert.Greater(t, len(release), 0) - }) -} - -func TestGetAssetsFromRelease(t *testing.T) { - t.Run("Successful get assets", func(t *testing.T) { - assets, err := GetAssetsFromRelease("v0.15.0", sandboxManifest, flyte) - assert.Nil(t, err) - assert.NotNil(t, assets) - assert.Equal(t, sandboxManifest, *assets.Name) - }) - - t.Run("Failed get assets with wrong name", func(t *testing.T) { - assets, err := GetAssetsFromRelease("v0.15.0", "test", flyte) - assert.NotNil(t, err) - assert.Nil(t, assets) - }) - t.Run("Successful get assets with wrong version", func(t *testing.T) { - assets, err := GetAssetsFromRelease("v100.15.0", "test", flyte) - assert.NotNil(t, err) - assert.Nil(t, assets) - }) -} - -func TestGetAssetsName(t *testing.T) { - t.Run("Get Assets name", func(t *testing.T) { - expected := fmt.Sprintf("flytectl_%s_386.tar.gz", cases.Title(language.English).String(runtime.GOOS)) - arch = platformutil.Arch386 - assert.Equal(t, expected, getFlytectlAssetName()) - }) -} - -func TestCheckBrewInstall(t *testing.T) { - symlink, err := CheckBrewInstall(platformutil.Darwin) - assert.Nil(t, err) - assert.Equal(t, len(symlink), 0) - symlink, err = CheckBrewInstall(platformutil.Linux) - assert.Nil(t, err) - assert.Equal(t, 0, len(symlink)) -} - -func TestGetUpgradeMessage(t *testing.T) { - var darwin = platformutil.Darwin - var linux = platformutil.Linux - var windows = platformutil.Linux - - var version = "v0.2.20" - stdlibversion.Version = "v0.2.10" - message, err := GetUpgradeMessage(version, darwin) - assert.Nil(t, err) - assert.Equal(t, 157, len(message)) - - version = "v0.2.09" - message, err = GetUpgradeMessage(version, darwin) - assert.Nil(t, err) - assert.Equal(t, 63, len(message)) - - version = "v" - message, err = GetUpgradeMessage(version, darwin) - assert.NotNil(t, err) - assert.Equal(t, 0, len(message)) - - version = "v0.2.20" - message, err = GetUpgradeMessage(version, windows) - assert.Nil(t, err) - assert.Equal(t, 157, len(message)) - - version = "v0.2.20" - message, err = GetUpgradeMessage(version, linux) - assert.Nil(t, err) - assert.Equal(t, 157, len(message)) -} From 3b49630cfbd4c957583f850e952b927c2968f945 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Thu, 28 Apr 2022 09:36:51 +0530 Subject: [PATCH 252/645] Added docs for demo and updated docs for workflow execution config with more details (#316) --- .../matchable_workflow_execution_config.go | 3 ++ .../matchable_workflow_execution_config.go | 50 +++++++++++++++++++ .../matchable_workflow_execution_config.go | 6 +++ flytectl/docs/source/demo.rst | 12 +++++ ...tectl_delete_workflow-execution-config.rst | 3 ++ .../docs/source/gen/flytectl_demo_start.rst | 22 ++++++-- ...flytectl_get_workflow-execution-config.rst | 50 +++++++++++++++++++ .../docs/source/gen/flytectl_get_workflow.rst | 2 +- .../source/gen/flytectl_sandbox_start.rst | 10 ++-- ...tectl_update_workflow-execution-config.rst | 6 +++ flytectl/docs/source/nouns.rst | 1 + flytectl/docs/source/verbs.rst | 1 + 12 files changed, 155 insertions(+), 11 deletions(-) create mode 100644 flytectl/docs/source/demo.rst diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config.go b/flytectl/cmd/delete/matchable_workflow_execution_config.go index 4aa47acc23..fda9525f80 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config.go @@ -34,6 +34,9 @@ For example, here's the config file wec.yaml: domain: development project: flytectldemo max_parallelism: 5 + security_context: + run_as: + k8s_service_account: demo Max_parallelism is optional in the file as it is unread during the delete command but can be retained since the same file can be used for get, update and delete commands. diff --git a/flytectl/cmd/get/matchable_workflow_execution_config.go b/flytectl/cmd/get/matchable_workflow_execution_config.go index 7e75c2a93b..35fd4ce06d 100644 --- a/flytectl/cmd/get/matchable_workflow_execution_config.go +++ b/flytectl/cmd/get/matchable_workflow_execution_config.go @@ -69,6 +69,56 @@ Example: content of wec.yaml: project: flytectldemo max_parallelism: 5 +Generate a sample workflow execution config file to be used for creating a new workflow execution config at project domain + +:: + flytectl get workflow-execution-config -p flytesnacks -d development --attrFile wec.yaml --gen + + +.. code-block:: yaml + + annotations: + values: + cliAnnotationKey: cliAnnotationValue + domain: development + labels: + values: + cliLabelKey: cliLabelValue + max_parallelism: 10 + project: flytesnacks + raw_output_data_config: + output_location_prefix: cliOutputLocationPrefix + security_context: + run_as: + k8s_service_account: default + + + +Generate a sample workflow execution config file to be used for creating a new workflow execution config at project domain workflow level + +:: + flytectl get workflow-execution-config -p flytesnacks -d development --attrFile wec.yaml flytectl get workflow-execution-config --gen + + +.. code-block:: yaml + + annotations: + values: + cliAnnotationKey: cliAnnotationValue + domain: development + labels: + values: + cliLabelKey: cliLabelValue + max_parallelism: 10 + project: flytesnacks + workflow: k8s_spark.dataframe_passing.my_smart_structured_dataset + raw_output_data_config: + output_location_prefix: cliOutputLocationPrefix + security_context: + run_as: + k8s_service_account: default + + Usage ` ) diff --git a/flytectl/cmd/update/matchable_workflow_execution_config.go b/flytectl/cmd/update/matchable_workflow_execution_config.go index 57e20c065d..5a1c28d2d2 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config.go @@ -27,6 +27,9 @@ Example: content of wec.yaml: domain: development project: flytectldemo max_parallelism: 5 + security_context: + run_as: + k8s_service_account: demo :: @@ -42,6 +45,9 @@ For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo proje project: flytectldemo workflow: core.control_flow.run_merge_sort.merge_sort max_parallelism: 5 + security_context: + run_as: + k8s_service_account: mergesortsa :: diff --git a/flytectl/docs/source/demo.rst b/flytectl/docs/source/demo.rst new file mode 100644 index 0000000000..38e7b49374 --- /dev/null +++ b/flytectl/docs/source/demo.rst @@ -0,0 +1,12 @@ +Sandbox +------- +It specifies the actions to be performed on the 'demo' resource. + +.. toctree:: + :maxdepth: 1 + :caption: Sandbox + + gen/flytectl_demo_start + gen/flytectl_demo_status + gen/flytectl_demo_teardown + gen/flytectl_demo_exec diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 8094452bd6..3f0ef09907 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -30,6 +30,9 @@ For example, here's the config file wec.yaml: domain: development project: flytectldemo max_parallelism: 5 + security_context: + run_as: + k8s_service_account: demo Max_parallelism is optional in the file as it is unread during the delete command but can be retained since the same file can be used for get, update and delete commands. diff --git a/flytectl/docs/source/gen/flytectl_demo_start.rst b/flytectl/docs/source/gen/flytectl_demo_start.rst index 694f0e1390..71bcb4a1df 100644 --- a/flytectl/docs/source/gen/flytectl_demo_start.rst +++ b/flytectl/docs/source/gen/flytectl_demo_start.rst @@ -17,11 +17,11 @@ Starts the demo cluster without any source code: :: flytectl demo start - + Mounts your source code repository inside the demo cluster: :: - flytectl demo start --source=$HOME/flyteorg/flytesnacks + flytectl demo start --source=$HOME/flyteorg/flytesnacks Specify a Flyte demo compliant image with the registry. This is useful in case you want to use an image from your registry. :: @@ -29,11 +29,24 @@ Specify a Flyte demo compliant image with the registry. This is useful in case y flytectl demo start --image docker.io/my-override:latest Note: If image flag is passed then Flytectl will ignore version and pre flags. - + Specify a Flyte demo image pull policy. Possible pull policy values are Always, IfNotPresent, or Never: :: - flytectl demo start --image docker.io/my-override:latest --imagePullPolicy Always + flytectl demo start --image docker.io/my-override:latest --imagePullPolicy Always + +Runs a specific version of Flyte. Flytectl demo only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. +:: + + flytectl demo start --version=v0.14.0 + +.. note:: + Flytectl demo is only supported for Flyte versions >= v1.0.0 + +Runs the latest pre release of Flyte. +:: + + flytectl demo start --pre Start demo cluster passing environment variables. This can be used to pass docker specific env variables or flyte specific env variables. eg : for passing timeout value in secs for the demo container use the following. @@ -41,7 +54,6 @@ eg : for passing timeout value in secs for the demo container use the following. flytectl demo start --env FLYTE_TIMEOUT=700 - The DURATION can be a positive integer or a floating-point number, followed by an optional unit suffix:: s - seconds (default) m - minutes diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index 0faeb3c3a7..c3b6123c00 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -61,6 +61,56 @@ Example: content of wec.yaml: project: flytectldemo max_parallelism: 5 +Generate a sample workflow execution config file to be used for creating a new workflow execution config at project domain + +:: + flytectl get workflow-execution-config -p flytesnacks -d development --attrFile wec.yaml --gen + + +.. code-block:: yaml + + annotations: + values: + cliAnnotationKey: cliAnnotationValue + domain: development + labels: + values: + cliLabelKey: cliLabelValue + max_parallelism: 10 + project: flytesnacks + raw_output_data_config: + output_location_prefix: cliOutputLocationPrefix + security_context: + run_as: + k8s_service_account: default + + + +Generate a sample workflow execution config file to be used for creating a new workflow execution config at project domain workflow level + +:: + flytectl get workflow-execution-config -p flytesnacks -d development --attrFile wec.yaml flytectl get workflow-execution-config --gen + + +.. code-block:: yaml + + annotations: + values: + cliAnnotationKey: cliAnnotationValue + domain: development + labels: + values: + cliLabelKey: cliLabelValue + max_parallelism: 10 + project: flytesnacks + workflow: k8s_spark.dataframe_passing.my_smart_structured_dataset + raw_output_data_config: + output_location_prefix: cliOutputLocationPrefix + security_context: + run_as: + k8s_service_account: default + + Usage diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index e3ddfded83..845a89ab86 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -93,7 +93,7 @@ Options --filter.fieldSelector string Specifies the Field selector --filter.limit int32 Specifies the limit (default 100) --filter.page int32 Specifies the page number, in case there are multiple pages of results (default 1) - --filter.sortBy string Specifies which field to sort results (default "created_at") + --filter.sortBy string Specifies which field to sort results -h, --help help for workflow --latest flag to indicate to fetch the latest version, version flag will be ignored in this case --version string version of the workflow to be fetched. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index a638e5cfd0..bfde221cfe 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -17,12 +17,12 @@ Starts the sandbox cluster without any source code: :: flytectl sandbox start - + Mounts your source code repository inside the sandbox: :: - flytectl sandbox start --source=$HOME/flyteorg/flytesnacks - + flytectl sandbox start --source=$HOME/flyteorg/flytesnacks + Runs a specific version of Flyte. Flytectl sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. :: @@ -36,7 +36,7 @@ Runs the latest pre release of Flyte. flytectl sandbox start --pre -Note: The pre release flag will be ignored if the user passes the version flag. In that case, Flytectl will use a specific version. +Note: The pre release flag will be ignored if the user passes the version flag. In that case, Flytectl will use a specific version. Specify a Flyte Sandbox compliant image with the registry. This is useful in case you want to use an image from your registry. :: @@ -44,7 +44,7 @@ Specify a Flyte Sandbox compliant image with the registry. This is useful in cas flytectl sandbox start --image docker.io/my-override:latest Note: If image flag is passed then Flytectl will ignore version and pre flags. - + Specify a Flyte Sandbox image pull policy. Possible pull policy values are Always, IfNotPresent, or Never: :: diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index 783ef3795c..a3ec158822 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -24,6 +24,9 @@ Example: content of wec.yaml: domain: development project: flytectldemo max_parallelism: 5 + security_context: + run_as: + k8s_service_account: demo :: @@ -39,6 +42,9 @@ For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo proje project: flytectldemo workflow: core.control_flow.run_merge_sort.merge_sort max_parallelism: 5 + security_context: + run_as: + k8s_service_account: mergesortsa :: diff --git a/flytectl/docs/source/nouns.rst b/flytectl/docs/source/nouns.rst index 197ce67a02..150d3cab0c 100644 --- a/flytectl/docs/source/nouns.rst +++ b/flytectl/docs/source/nouns.rst @@ -23,3 +23,4 @@ Flytectl nouns specify the resource on which the action needs to be performed. E files config sandbox + demo diff --git a/flytectl/docs/source/verbs.rst b/flytectl/docs/source/verbs.rst index a1763a35b2..50eb37071e 100644 --- a/flytectl/docs/source/verbs.rst +++ b/flytectl/docs/source/verbs.rst @@ -15,5 +15,6 @@ Flytectl verbs specify the actions to be performed on the resources. Example: cr gen/flytectl_register gen/flytectl_config gen/flytectl_sandbox + gen/flytectl_demo gen/flytectl_version gen/flytectl_upgrade From b69fc961fac4f11f543a58c68b2272307e44d2f2 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Sat, 30 Apr 2022 09:53:09 +0530 Subject: [PATCH 253/645] Removed storage config and updated boilerplate (#319) --- .../flyte/golang_support_tools/go.mod | 6 +- .../flyte/golang_support_tools/go.sum | 8 +- .../flyte/golang_support_tools/tools.go | 2 +- .../golang_test_targets/download_tooling.sh | 4 +- .../config/subcommand/config/config_flags.go | 1 - .../subcommand/config/config_flags_test.go | 14 -- .../config/subcommand/config/init_flags.go | 2 - flytectl/cmd/configuration/configuration.go | 27 +--- .../cmd/configuration/configuration_test.go | 12 +- flytectl/cmd/demo/start.go | 2 +- flytectl/cmd/sandbox/start.go | 2 +- .../cmd/update/interfaces/mocks/updater.go | 8 +- .../docs/source/gen/flytectl_completion.rst | 2 + flytectl/docs/source/index.rst | 27 ---- flytectl/pkg/configutil/configutil.go | 50 +----- flytectl/pkg/configutil/configutil_test.go | 5 +- flytectl/pkg/docker/mocks/docker.go | 88 +++++----- .../ext/mocks/admin_deleter_ext_interface.go | 24 +-- .../ext/mocks/admin_fetcher_ext_interface.go | 152 +++++++++--------- .../ext/mocks/admin_updater_ext_interface.go | 24 +-- flytectl/pkg/github/mocks/gh_repo_service.go | 32 ++-- flytectl/pkg/k8s/mocks/context_ops.go | 16 +- flytectl/pkg/visualize/mocks/graphvizer.go | 64 ++++---- 23 files changed, 228 insertions(+), 344 deletions(-) diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.mod b/flytectl/boilerplate/flyte/golang_support_tools/go.mod index 441224926c..dbf94f4113 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.mod +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.mod @@ -3,11 +3,11 @@ module github.com/flyteorg/boilerplate go 1.17 require ( + github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf github.com/alvaroloes/enumer v1.1.2 github.com/flyteorg/flytestdlib v0.4.16 github.com/golangci/golangci-lint v1.38.0 github.com/pseudomuto/protoc-gen-doc v1.4.1 - github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5 ) require ( @@ -152,7 +152,7 @@ require ( github.com/spf13/viper v1.7.1 // indirect github.com/ssgreg/nlreturn/v2 v2.1.0 // indirect github.com/stretchr/objx v0.3.0 // indirect - github.com/stretchr/testify v1.7.0 // indirect + github.com/stretchr/testify v1.7.1 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b // indirect github.com/tetafro/godot v1.4.4 // indirect @@ -191,6 +191,4 @@ require ( mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7 // indirect ) -replace github.com/vektra/mockery => github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0 - replace github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.sum b/flytectl/boilerplate/flyte/golang_support_tools/go.sum index 755f8cf6ef..02895fb574 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.sum +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.sum @@ -79,6 +79,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf h1:M7A2Tn3R8rVgsoJHHKkmkpiNOItys4GxJj6JytRjdDg= +github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf/go.mod h1:Kya4Y46gyq/3TEyAzeNe5UkCk+W9apy5KbuX+5KnZ6M= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= @@ -194,8 +196,6 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0 h1:qxIJwfSemSCqhG3/lEw1Rm+wYbegjuKsqy0ZqnIpL14= -github.com/enghabu/mockery v0.0.0-20191009061720-9d0c8670c2f0/go.mod h1:KfdIkmkpVY3n2sc1ykFj01uMviOiXH2HMhUCvA5FYGg= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -773,8 +773,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b h1:HxLVTlqcHhFAz3nWUcuvpH7WuOMv8LQoCWmruLfFH2U= @@ -1035,7 +1036,6 @@ golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181112210238-4b1f3b6b1646/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/flytectl/boilerplate/flyte/golang_support_tools/tools.go b/flytectl/boilerplate/flyte/golang_support_tools/tools.go index da7b933302..43de03450c 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/tools.go +++ b/flytectl/boilerplate/flyte/golang_support_tools/tools.go @@ -4,9 +4,9 @@ package tools import ( + _ "github.com/EngHabu/mockery/cmd/mockery" _ "github.com/alvaroloes/enumer" _ "github.com/flyteorg/flytestdlib/cli/pflags" _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" - _ "github.com/vektra/mockery/cmd/mockery" ) diff --git a/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh index f205cb9cd0..003220ea70 100755 --- a/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh @@ -16,8 +16,8 @@ set -e # List of tools to go get # In the format of ":" or ":" if no cli tools=( - "github.com/vektra/mockery/cmd/mockery" - "github.com/flyteorg/flytestdlib/cli/pflags" + "github.com/EngHabu/mockery/cmd/mockery" + "github.com/flyteorg/flytestdlib/cli/pflags@latest" "github.com/golangci/golangci-lint/cmd/golangci-lint@latest" "github.com/alvaroloes/enumer" "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" diff --git a/flytectl/cmd/config/subcommand/config/config_flags.go b/flytectl/cmd/config/subcommand/config/config_flags.go index f22213b004..21ce498e28 100755 --- a/flytectl/cmd/config/subcommand/config/config_flags.go +++ b/flytectl/cmd/config/subcommand/config/config_flags.go @@ -52,6 +52,5 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) cmdFlags.StringVar(&DefaultConfig.Host, fmt.Sprintf("%v%v", prefix, "host"), DefaultConfig.Host, "Endpoint of flyte admin") cmdFlags.BoolVar(&DefaultConfig.Insecure, fmt.Sprintf("%v%v", prefix, "insecure"), DefaultConfig.Insecure, "Enable insecure mode") - cmdFlags.BoolVar(&DefaultConfig.Storage, fmt.Sprintf("%v%v", prefix, "storage"), DefaultConfig.Storage, "Enable storage provider config") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/config/config_flags_test.go b/flytectl/cmd/config/subcommand/config/config_flags_test.go index aaf191eb4e..c7cf208df4 100755 --- a/flytectl/cmd/config/subcommand/config/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/config/config_flags_test.go @@ -127,18 +127,4 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_storage", func(t *testing.T) { - - t.Run("Override", func(t *testing.T) { - testValue := "1" - - cmdFlags.Set("storage", testValue) - if vBool, err := cmdFlags.GetBool("storage"); err == nil { - testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Storage) - - } else { - assert.FailNow(t, err.Error()) - } - }) - }) } diff --git a/flytectl/cmd/config/subcommand/config/init_flags.go b/flytectl/cmd/config/subcommand/config/init_flags.go index cb2047dec6..1e14634711 100755 --- a/flytectl/cmd/config/subcommand/config/init_flags.go +++ b/flytectl/cmd/config/subcommand/config/init_flags.go @@ -4,7 +4,6 @@ package config var ( DefaultConfig = &Config{ Insecure: false, - Storage: false, } ) @@ -12,5 +11,4 @@ var ( type Config struct { Host string `json:"host" pflag:",Endpoint of flyte admin"` Insecure bool `json:"insecure" pflag:",Enable insecure mode"` - Storage bool `json:"storage" pflag:",Enable storage provider config"` } diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index 30e506c2f1..6d660583a7 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -8,8 +8,6 @@ import ( "os" "strings" - "github.com/flyteorg/flytestdlib/logger" - "github.com/flyteorg/flytectl/pkg/util" "github.com/flyteorg/flytectl/pkg/configutil" @@ -19,7 +17,6 @@ import ( cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" "github.com/flyteorg/flytestdlib/config/viper" "github.com/go-ozzo/ozzo-validation/v4/is" - "github.com/manifoldco/promptui" "github.com/spf13/cobra" ) @@ -58,11 +55,6 @@ Generate Flytectl config with a storage provider: ` ) -var prompt = promptui.Select{ - Label: "Select Storage Provider", - Items: []string{"S3", "GCS"}, -} - var endpointPrefix = [3]string{"dns:///", "http://", "https://"} // CreateConfigCommand will return configuration command @@ -80,10 +72,10 @@ func CreateConfigCommand() *cobra.Command { } func configInitFunc(ctx context.Context, args []string, cmdCtx cmdcore.CommandContext) error { - return initFlytectlConfig(ctx, os.Stdin) + return initFlytectlConfig(os.Stdin) } -func initFlytectlConfig(ctx context.Context, reader io.Reader) error { +func initFlytectlConfig(reader io.Reader) error { if err := util.SetupFlyteDir(); err != nil { return err @@ -93,7 +85,7 @@ func initFlytectlConfig(ctx context.Context, reader io.Reader) error { Host: "dns:///localhost:30081", Insecure: true, } - templateStr := configutil.GetSandboxTemplate() + templateStr := configutil.GetTemplate() if len(initConfig.DefaultConfig.Host) > 0 { trimHost := trimEndpoint(initConfig.DefaultConfig.Host) @@ -102,19 +94,6 @@ func initFlytectlConfig(ctx context.Context, reader io.Reader) error { } templateValues.Host = fmt.Sprintf("dns:///%s", trimHost) templateValues.Insecure = initConfig.DefaultConfig.Insecure - templateStr = configutil.AdminConfigTemplate - if initConfig.DefaultConfig.Storage { - templateStr = configutil.GetAWSCloudTemplate() - _, result, err := prompt.Run() - if err != nil { - return err - } - if strings.ToUpper(result) == "GCS" { - templateStr = configutil.GetGoogleCloudTemplate() - } - } else { - logger.Infof(ctx, "Init flytectl config for remote cluster, Please update your storage config in %s. Learn more about the config here https://docs.flyte.org/projects/flytectl/en/latest/index.html#configure", configutil.ConfigFile) - } } var _err error if _, err := os.Stat(configutil.ConfigFile); os.IsNotExist(err) { diff --git a/flytectl/cmd/configuration/configuration_test.go b/flytectl/cmd/configuration/configuration_test.go index da5b0a6f97..19c90a13f4 100644 --- a/flytectl/cmd/configuration/configuration_test.go +++ b/flytectl/cmd/configuration/configuration_test.go @@ -59,15 +59,13 @@ func TestSetupConfigFunc(t *testing.T) { initConfig.DefaultConfig.Host = "" assert.Nil(t, err) - assert.Nil(t, initFlytectlConfig(ctx, yes)) - assert.Nil(t, initFlytectlConfig(ctx, yes)) - assert.Nil(t, initFlytectlConfig(ctx, no)) + assert.Nil(t, initFlytectlConfig(yes)) + assert.Nil(t, initFlytectlConfig(no)) initConfig.DefaultConfig.Host = "flyte.org" - assert.Nil(t, initFlytectlConfig(ctx, no)) + assert.Nil(t, initFlytectlConfig(no)) initConfig.DefaultConfig.Host = "localhost:30081" - assert.Nil(t, initFlytectlConfig(ctx, no)) - initConfig.DefaultConfig.Storage = true - assert.NotNil(t, initFlytectlConfig(ctx, yes)) + assert.Nil(t, initFlytectlConfig(no)) + assert.Nil(t, initFlytectlConfig(yes)) } func TestTrimFunc(t *testing.T) { diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index ceff28febb..4cb13d54e3 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -200,7 +200,7 @@ func startDemo(ctx context.Context, cli docker.Docker, g github.GHRepoService, r Host: "localhost:30081", Insecure: true, } - if err := configutil.SetupConfig(configutil.ConfigFile, configutil.GetDemoTemplate(), templateValues); err != nil { + if err := configutil.SetupConfig(configutil.ConfigFile, configutil.GetTemplate(), templateValues); err != nil { return nil, err } diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index 9e9013b6f5..af09b1f64d 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -182,7 +182,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService Host: "localhost:30081", Insecure: true, } - if err := configutil.SetupConfig(configutil.FlytectlConfig, configutil.GetSandboxTemplate(), templateValues); err != nil { + if err := configutil.SetupConfig(configutil.FlytectlConfig, configutil.GetTemplate(), templateValues); err != nil { return nil, err } diff --git a/flytectl/cmd/update/interfaces/mocks/updater.go b/flytectl/cmd/update/interfaces/mocks/updater.go index 30935bb156..3b56f35add 100644 --- a/flytectl/cmd/update/interfaces/mocks/updater.go +++ b/flytectl/cmd/update/interfaces/mocks/updater.go @@ -26,13 +26,13 @@ func (_m Updater_UpdateNamedEntity) Return(_a0 error) *Updater_UpdateNamedEntity } func (_m *Updater) OnUpdateNamedEntity(ctx context.Context, name string, project string, domain string, rsType core.ResourceType, cmdCtx cmdcore.CommandContext) *Updater_UpdateNamedEntity { - c := _m.On("UpdateNamedEntity", ctx, name, project, domain, rsType, cmdCtx) - return &Updater_UpdateNamedEntity{Call: c} + c_call := _m.On("UpdateNamedEntity", ctx, name, project, domain, rsType, cmdCtx) + return &Updater_UpdateNamedEntity{Call: c_call} } func (_m *Updater) OnUpdateNamedEntityMatch(matchers ...interface{}) *Updater_UpdateNamedEntity { - c := _m.On("UpdateNamedEntity", matchers...) - return &Updater_UpdateNamedEntity{Call: c} + c_call := _m.On("UpdateNamedEntity", matchers...) + return &Updater_UpdateNamedEntity{Call: c_call} } // UpdateNamedEntity provides a mock function with given fields: ctx, name, project, domain, rsType, cmdCtx diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index cec584ee98..27579c223f 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -19,11 +19,13 @@ To load completion, run the following commands in accordance with the shell you To load completions for each session: - Linux + :: $ flytectl completion bash > /etc/bash_completion.d/flytectl - macOS + :: $ flytectl completion bash > /usr/local/etc/bash_completion.d/flytectl diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index e78875f917..3a10b2437a 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -72,16 +72,6 @@ The full list of available configurable options can be found by running ``flytec endpoint: dns:///localhost:30081 insecure: true # Set to false to enable TLS/SSL connection (not recommended except on local sandbox deployment). authType: Pkce # authType: Pkce # if using authentication or just drop this. - storage: - connection: - access-key: minio - auth-type: accesskey - disable-ssl: true - endpoint: http://localhost:30084 - region: my-region-here - secret-key: miniostorage - container: my-s3-bucket - type: minio .. tabbed:: AWS Configuration @@ -92,14 +82,6 @@ The full list of available configurable options can be found by running ``flytec endpoint: dns:/// authType: Pkce # authType: Pkce # if using authentication or just drop this. insecure: true # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) - storage: - type: stow - stow: - kind: s3 - config: - auth_type: iam - region: # Example: us-east-2 - container: # Example my-bucket. Flyte k8s cluster / service account for execution should have read access to this bucket .. tabbed:: GCS Configuration @@ -110,15 +92,6 @@ The full list of available configurable options can be found by running ``flytec endpoint: dns:/// authType: Pkce # authType: Pkce # if using authentication or just drop this. insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) - storage: - type: stow - stow: - kind: google - config: - json: "" - project_id: # TODO: replace with the GCP project ID - scopes: https://www.googleapis.com/auth/devstorage.read_write - container: # Example my-bucket. Flyte k8s cluster / service account for execution should have access to this bucket .. tabbed:: Others diff --git a/flytectl/pkg/configutil/configutil.go b/flytectl/pkg/configutil/configutil.go index cedad69146..dc60c3d35f 100644 --- a/flytectl/pkg/configutil/configutil.go +++ b/flytectl/pkg/configutil/configutil.go @@ -16,37 +16,6 @@ const ( logger: show-source: true level: 0` - StorageConfigTemplate = ` -storage: - connection: - access-key: minio - auth-type: accesskey - disable-ssl: true - endpoint: http://localhost:30084 - region: us-east-1 - secret-key: miniostorage - type: minio - container: "my-s3-bucket" - enable-multicontainer: true` - StorageS3ConfigTemplate = ` -storage: - type: stow - stow: - kind: s3 - config: - auth_type: iam - region: # Example: us-east-2 - container: # Example my-bucket. Flyte k8s cluster / service account for execution should have read access to this bucket` - StorageGCSConfigTemplate = ` -storage: - type: stow - stow: - kind: google - config: - json: "" - project_id: # TODO: replace with the GCP project ID - scopes: https://www.googleapis.com/auth/devstorage.read_write - container: # Example my-bucket. Flyte k8s cluster / service account for execution should have read access to this bucket` ) type ConfigTemplateSpec struct { @@ -60,26 +29,11 @@ var ( Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") ) -// GetSandboxTemplate return sandbox cluster config -func GetSandboxTemplate() string { - return AdminConfigTemplate + StorageConfigTemplate -} - -// GetDemoTemplate return demo cluster config -func GetDemoTemplate() string { +// GetTemplate returns cluster config +func GetTemplate() string { return AdminConfigTemplate } -// GetAWSCloudTemplate return aws Flyte config with storage config -func GetAWSCloudTemplate() string { - return AdminConfigTemplate + StorageS3ConfigTemplate -} - -// GetGoogleCloudTemplate return google Flyte config with storage config -func GetGoogleCloudTemplate() string { - return AdminConfigTemplate + StorageGCSConfigTemplate -} - // SetupConfig download the Flyte sandbox config func SetupConfig(filename, templateStr string, templateSpec ConfigTemplateSpec) error { tmpl := template.New("config") diff --git a/flytectl/pkg/configutil/configutil_test.go b/flytectl/pkg/configutil/configutil_test.go index e79964af18..936e0ea682 100644 --- a/flytectl/pkg/configutil/configutil_test.go +++ b/flytectl/pkg/configutil/configutil_test.go @@ -49,8 +49,5 @@ func TestSetupFlytectlConfig(t *testing.T) { } func TestAwsConfig(t *testing.T) { - assert.Equal(t, AdminConfigTemplate+StorageS3ConfigTemplate, GetAWSCloudTemplate()) - assert.Equal(t, AdminConfigTemplate+StorageGCSConfigTemplate, GetGoogleCloudTemplate()) - assert.Equal(t, AdminConfigTemplate+StorageConfigTemplate, GetSandboxTemplate()) - assert.Equal(t, AdminConfigTemplate, GetDemoTemplate()) + assert.Equal(t, AdminConfigTemplate, GetTemplate()) } diff --git a/flytectl/pkg/docker/mocks/docker.go b/flytectl/pkg/docker/mocks/docker.go index b08cf0d51a..b1f234f97f 100644 --- a/flytectl/pkg/docker/mocks/docker.go +++ b/flytectl/pkg/docker/mocks/docker.go @@ -32,13 +32,13 @@ func (_m Docker_ContainerCreate) Return(_a0 container.ContainerCreateCreatedBody } func (_m *Docker) OnContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *v1.Platform, containerName string) *Docker_ContainerCreate { - c := _m.On("ContainerCreate", ctx, config, hostConfig, networkingConfig, platform, containerName) - return &Docker_ContainerCreate{Call: c} + c_call := _m.On("ContainerCreate", ctx, config, hostConfig, networkingConfig, platform, containerName) + return &Docker_ContainerCreate{Call: c_call} } func (_m *Docker) OnContainerCreateMatch(matchers ...interface{}) *Docker_ContainerCreate { - c := _m.On("ContainerCreate", matchers...) - return &Docker_ContainerCreate{Call: c} + c_call := _m.On("ContainerCreate", matchers...) + return &Docker_ContainerCreate{Call: c_call} } // ContainerCreate provides a mock function with given fields: ctx, config, hostConfig, networkingConfig, platform, containerName @@ -71,13 +71,13 @@ func (_m Docker_ContainerExecAttach) Return(_a0 types.HijackedResponse, _a1 erro } func (_m *Docker) OnContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) *Docker_ContainerExecAttach { - c := _m.On("ContainerExecAttach", ctx, execID, config) - return &Docker_ContainerExecAttach{Call: c} + c_call := _m.On("ContainerExecAttach", ctx, execID, config) + return &Docker_ContainerExecAttach{Call: c_call} } func (_m *Docker) OnContainerExecAttachMatch(matchers ...interface{}) *Docker_ContainerExecAttach { - c := _m.On("ContainerExecAttach", matchers...) - return &Docker_ContainerExecAttach{Call: c} + c_call := _m.On("ContainerExecAttach", matchers...) + return &Docker_ContainerExecAttach{Call: c_call} } // ContainerExecAttach provides a mock function with given fields: ctx, execID, config @@ -110,13 +110,13 @@ func (_m Docker_ContainerExecCreate) Return(_a0 types.IDResponse, _a1 error) *Do } func (_m *Docker) OnContainerExecCreate(ctx context.Context, _a1 string, config types.ExecConfig) *Docker_ContainerExecCreate { - c := _m.On("ContainerExecCreate", ctx, _a1, config) - return &Docker_ContainerExecCreate{Call: c} + c_call := _m.On("ContainerExecCreate", ctx, _a1, config) + return &Docker_ContainerExecCreate{Call: c_call} } func (_m *Docker) OnContainerExecCreateMatch(matchers ...interface{}) *Docker_ContainerExecCreate { - c := _m.On("ContainerExecCreate", matchers...) - return &Docker_ContainerExecCreate{Call: c} + c_call := _m.On("ContainerExecCreate", matchers...) + return &Docker_ContainerExecCreate{Call: c_call} } // ContainerExecCreate provides a mock function with given fields: ctx, _a1, config @@ -149,13 +149,13 @@ func (_m Docker_ContainerExecInspect) Return(_a0 types.ContainerExecInspect, _a1 } func (_m *Docker) OnContainerExecInspect(ctx context.Context, execID string) *Docker_ContainerExecInspect { - c := _m.On("ContainerExecInspect", ctx, execID) - return &Docker_ContainerExecInspect{Call: c} + c_call := _m.On("ContainerExecInspect", ctx, execID) + return &Docker_ContainerExecInspect{Call: c_call} } func (_m *Docker) OnContainerExecInspectMatch(matchers ...interface{}) *Docker_ContainerExecInspect { - c := _m.On("ContainerExecInspect", matchers...) - return &Docker_ContainerExecInspect{Call: c} + c_call := _m.On("ContainerExecInspect", matchers...) + return &Docker_ContainerExecInspect{Call: c_call} } // ContainerExecInspect provides a mock function with given fields: ctx, execID @@ -188,13 +188,13 @@ func (_m Docker_ContainerList) Return(_a0 []types.Container, _a1 error) *Docker_ } func (_m *Docker) OnContainerList(ctx context.Context, options types.ContainerListOptions) *Docker_ContainerList { - c := _m.On("ContainerList", ctx, options) - return &Docker_ContainerList{Call: c} + c_call := _m.On("ContainerList", ctx, options) + return &Docker_ContainerList{Call: c_call} } func (_m *Docker) OnContainerListMatch(matchers ...interface{}) *Docker_ContainerList { - c := _m.On("ContainerList", matchers...) - return &Docker_ContainerList{Call: c} + c_call := _m.On("ContainerList", matchers...) + return &Docker_ContainerList{Call: c_call} } // ContainerList provides a mock function with given fields: ctx, options @@ -229,13 +229,13 @@ func (_m Docker_ContainerLogs) Return(_a0 io.ReadCloser, _a1 error) *Docker_Cont } func (_m *Docker) OnContainerLogs(ctx context.Context, _a1 string, options types.ContainerLogsOptions) *Docker_ContainerLogs { - c := _m.On("ContainerLogs", ctx, _a1, options) - return &Docker_ContainerLogs{Call: c} + c_call := _m.On("ContainerLogs", ctx, _a1, options) + return &Docker_ContainerLogs{Call: c_call} } func (_m *Docker) OnContainerLogsMatch(matchers ...interface{}) *Docker_ContainerLogs { - c := _m.On("ContainerLogs", matchers...) - return &Docker_ContainerLogs{Call: c} + c_call := _m.On("ContainerLogs", matchers...) + return &Docker_ContainerLogs{Call: c_call} } // ContainerLogs provides a mock function with given fields: ctx, _a1, options @@ -270,13 +270,13 @@ func (_m Docker_ContainerRemove) Return(_a0 error) *Docker_ContainerRemove { } func (_m *Docker) OnContainerRemove(ctx context.Context, containerID string, options types.ContainerRemoveOptions) *Docker_ContainerRemove { - c := _m.On("ContainerRemove", ctx, containerID, options) - return &Docker_ContainerRemove{Call: c} + c_call := _m.On("ContainerRemove", ctx, containerID, options) + return &Docker_ContainerRemove{Call: c_call} } func (_m *Docker) OnContainerRemoveMatch(matchers ...interface{}) *Docker_ContainerRemove { - c := _m.On("ContainerRemove", matchers...) - return &Docker_ContainerRemove{Call: c} + c_call := _m.On("ContainerRemove", matchers...) + return &Docker_ContainerRemove{Call: c_call} } // ContainerRemove provides a mock function with given fields: ctx, containerID, options @@ -302,13 +302,13 @@ func (_m Docker_ContainerStart) Return(_a0 error) *Docker_ContainerStart { } func (_m *Docker) OnContainerStart(ctx context.Context, containerID string, options types.ContainerStartOptions) *Docker_ContainerStart { - c := _m.On("ContainerStart", ctx, containerID, options) - return &Docker_ContainerStart{Call: c} + c_call := _m.On("ContainerStart", ctx, containerID, options) + return &Docker_ContainerStart{Call: c_call} } func (_m *Docker) OnContainerStartMatch(matchers ...interface{}) *Docker_ContainerStart { - c := _m.On("ContainerStart", matchers...) - return &Docker_ContainerStart{Call: c} + c_call := _m.On("ContainerStart", matchers...) + return &Docker_ContainerStart{Call: c_call} } // ContainerStart provides a mock function with given fields: ctx, containerID, options @@ -334,13 +334,13 @@ func (_m Docker_ContainerWait) Return(_a0 <-chan container.ContainerWaitOKBody, } func (_m *Docker) OnContainerWait(ctx context.Context, containerID string, condition container.WaitCondition) *Docker_ContainerWait { - c := _m.On("ContainerWait", ctx, containerID, condition) - return &Docker_ContainerWait{Call: c} + c_call := _m.On("ContainerWait", ctx, containerID, condition) + return &Docker_ContainerWait{Call: c_call} } func (_m *Docker) OnContainerWaitMatch(matchers ...interface{}) *Docker_ContainerWait { - c := _m.On("ContainerWait", matchers...) - return &Docker_ContainerWait{Call: c} + c_call := _m.On("ContainerWait", matchers...) + return &Docker_ContainerWait{Call: c_call} } // ContainerWait provides a mock function with given fields: ctx, containerID, condition @@ -377,13 +377,13 @@ func (_m Docker_ImageList) Return(_a0 []types.ImageSummary, _a1 error) *Docker_I } func (_m *Docker) OnImageList(ctx context.Context, listOption types.ImageListOptions) *Docker_ImageList { - c := _m.On("ImageList", ctx, listOption) - return &Docker_ImageList{Call: c} + c_call := _m.On("ImageList", ctx, listOption) + return &Docker_ImageList{Call: c_call} } func (_m *Docker) OnImageListMatch(matchers ...interface{}) *Docker_ImageList { - c := _m.On("ImageList", matchers...) - return &Docker_ImageList{Call: c} + c_call := _m.On("ImageList", matchers...) + return &Docker_ImageList{Call: c_call} } // ImageList provides a mock function with given fields: ctx, listOption @@ -418,13 +418,13 @@ func (_m Docker_ImagePull) Return(_a0 io.ReadCloser, _a1 error) *Docker_ImagePul } func (_m *Docker) OnImagePull(ctx context.Context, refStr string, options types.ImagePullOptions) *Docker_ImagePull { - c := _m.On("ImagePull", ctx, refStr, options) - return &Docker_ImagePull{Call: c} + c_call := _m.On("ImagePull", ctx, refStr, options) + return &Docker_ImagePull{Call: c_call} } func (_m *Docker) OnImagePullMatch(matchers ...interface{}) *Docker_ImagePull { - c := _m.On("ImagePull", matchers...) - return &Docker_ImagePull{Call: c} + c_call := _m.On("ImagePull", matchers...) + return &Docker_ImagePull{Call: c_call} } // ImagePull provides a mock function with given fields: ctx, refStr, options diff --git a/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go b/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go index 2f55293a80..1456f4e3bf 100644 --- a/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go @@ -26,13 +26,13 @@ func (_m AdminDeleterExtInterface_AdminServiceClient) Return(_a0 service.AdminSe } func (_m *AdminDeleterExtInterface) OnAdminServiceClient() *AdminDeleterExtInterface_AdminServiceClient { - c := _m.On("AdminServiceClient") - return &AdminDeleterExtInterface_AdminServiceClient{Call: c} + c_call := _m.On("AdminServiceClient") + return &AdminDeleterExtInterface_AdminServiceClient{Call: c_call} } func (_m *AdminDeleterExtInterface) OnAdminServiceClientMatch(matchers ...interface{}) *AdminDeleterExtInterface_AdminServiceClient { - c := _m.On("AdminServiceClient", matchers...) - return &AdminDeleterExtInterface_AdminServiceClient{Call: c} + c_call := _m.On("AdminServiceClient", matchers...) + return &AdminDeleterExtInterface_AdminServiceClient{Call: c_call} } // AdminServiceClient provides a mock function with given fields: @@ -60,13 +60,13 @@ func (_m AdminDeleterExtInterface_DeleteProjectDomainAttributes) Return(_a0 erro } func (_m *AdminDeleterExtInterface) OnDeleteProjectDomainAttributes(ctx context.Context, project string, domain string, rsType admin.MatchableResource) *AdminDeleterExtInterface_DeleteProjectDomainAttributes { - c := _m.On("DeleteProjectDomainAttributes", ctx, project, domain, rsType) - return &AdminDeleterExtInterface_DeleteProjectDomainAttributes{Call: c} + c_call := _m.On("DeleteProjectDomainAttributes", ctx, project, domain, rsType) + return &AdminDeleterExtInterface_DeleteProjectDomainAttributes{Call: c_call} } func (_m *AdminDeleterExtInterface) OnDeleteProjectDomainAttributesMatch(matchers ...interface{}) *AdminDeleterExtInterface_DeleteProjectDomainAttributes { - c := _m.On("DeleteProjectDomainAttributes", matchers...) - return &AdminDeleterExtInterface_DeleteProjectDomainAttributes{Call: c} + c_call := _m.On("DeleteProjectDomainAttributes", matchers...) + return &AdminDeleterExtInterface_DeleteProjectDomainAttributes{Call: c_call} } // DeleteProjectDomainAttributes provides a mock function with given fields: ctx, project, domain, rsType @@ -92,13 +92,13 @@ func (_m AdminDeleterExtInterface_DeleteWorkflowAttributes) Return(_a0 error) *A } func (_m *AdminDeleterExtInterface) OnDeleteWorkflowAttributes(ctx context.Context, project string, domain string, name string, rsType admin.MatchableResource) *AdminDeleterExtInterface_DeleteWorkflowAttributes { - c := _m.On("DeleteWorkflowAttributes", ctx, project, domain, name, rsType) - return &AdminDeleterExtInterface_DeleteWorkflowAttributes{Call: c} + c_call := _m.On("DeleteWorkflowAttributes", ctx, project, domain, name, rsType) + return &AdminDeleterExtInterface_DeleteWorkflowAttributes{Call: c_call} } func (_m *AdminDeleterExtInterface) OnDeleteWorkflowAttributesMatch(matchers ...interface{}) *AdminDeleterExtInterface_DeleteWorkflowAttributes { - c := _m.On("DeleteWorkflowAttributes", matchers...) - return &AdminDeleterExtInterface_DeleteWorkflowAttributes{Call: c} + c_call := _m.On("DeleteWorkflowAttributes", matchers...) + return &AdminDeleterExtInterface_DeleteWorkflowAttributes{Call: c_call} } // DeleteWorkflowAttributes provides a mock function with given fields: ctx, project, domain, name, rsType diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index 18906ce863..b1032f05b2 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -28,13 +28,13 @@ func (_m AdminFetcherExtInterface_AdminServiceClient) Return(_a0 service.AdminSe } func (_m *AdminFetcherExtInterface) OnAdminServiceClient() *AdminFetcherExtInterface_AdminServiceClient { - c := _m.On("AdminServiceClient") - return &AdminFetcherExtInterface_AdminServiceClient{Call: c} + c_call := _m.On("AdminServiceClient") + return &AdminFetcherExtInterface_AdminServiceClient{Call: c_call} } func (_m *AdminFetcherExtInterface) OnAdminServiceClientMatch(matchers ...interface{}) *AdminFetcherExtInterface_AdminServiceClient { - c := _m.On("AdminServiceClient", matchers...) - return &AdminFetcherExtInterface_AdminServiceClient{Call: c} + c_call := _m.On("AdminServiceClient", matchers...) + return &AdminFetcherExtInterface_AdminServiceClient{Call: c_call} } // AdminServiceClient provides a mock function with given fields: @@ -62,13 +62,13 @@ func (_m AdminFetcherExtInterface_FetchAllVerOfLP) Return(_a0 []*admin.LaunchPla } func (_m *AdminFetcherExtInterface) OnFetchAllVerOfLP(ctx context.Context, lpName string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchAllVerOfLP { - c := _m.On("FetchAllVerOfLP", ctx, lpName, project, domain, filter) - return &AdminFetcherExtInterface_FetchAllVerOfLP{Call: c} + c_call := _m.On("FetchAllVerOfLP", ctx, lpName, project, domain, filter) + return &AdminFetcherExtInterface_FetchAllVerOfLP{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchAllVerOfLPMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchAllVerOfLP { - c := _m.On("FetchAllVerOfLP", matchers...) - return &AdminFetcherExtInterface_FetchAllVerOfLP{Call: c} + c_call := _m.On("FetchAllVerOfLP", matchers...) + return &AdminFetcherExtInterface_FetchAllVerOfLP{Call: c_call} } // FetchAllVerOfLP provides a mock function with given fields: ctx, lpName, project, domain, filter @@ -103,13 +103,13 @@ func (_m AdminFetcherExtInterface_FetchAllVerOfTask) Return(_a0 []*admin.Task, _ } func (_m *AdminFetcherExtInterface) OnFetchAllVerOfTask(ctx context.Context, name string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchAllVerOfTask { - c := _m.On("FetchAllVerOfTask", ctx, name, project, domain, filter) - return &AdminFetcherExtInterface_FetchAllVerOfTask{Call: c} + c_call := _m.On("FetchAllVerOfTask", ctx, name, project, domain, filter) + return &AdminFetcherExtInterface_FetchAllVerOfTask{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchAllVerOfTaskMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchAllVerOfTask { - c := _m.On("FetchAllVerOfTask", matchers...) - return &AdminFetcherExtInterface_FetchAllVerOfTask{Call: c} + c_call := _m.On("FetchAllVerOfTask", matchers...) + return &AdminFetcherExtInterface_FetchAllVerOfTask{Call: c_call} } // FetchAllVerOfTask provides a mock function with given fields: ctx, name, project, domain, filter @@ -144,13 +144,13 @@ func (_m AdminFetcherExtInterface_FetchAllVerOfWorkflow) Return(_a0 []*admin.Wor } func (_m *AdminFetcherExtInterface) OnFetchAllVerOfWorkflow(ctx context.Context, name string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchAllVerOfWorkflow { - c := _m.On("FetchAllVerOfWorkflow", ctx, name, project, domain, filter) - return &AdminFetcherExtInterface_FetchAllVerOfWorkflow{Call: c} + c_call := _m.On("FetchAllVerOfWorkflow", ctx, name, project, domain, filter) + return &AdminFetcherExtInterface_FetchAllVerOfWorkflow{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchAllVerOfWorkflowMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchAllVerOfWorkflow { - c := _m.On("FetchAllVerOfWorkflow", matchers...) - return &AdminFetcherExtInterface_FetchAllVerOfWorkflow{Call: c} + c_call := _m.On("FetchAllVerOfWorkflow", matchers...) + return &AdminFetcherExtInterface_FetchAllVerOfWorkflow{Call: c_call} } // FetchAllVerOfWorkflow provides a mock function with given fields: ctx, name, project, domain, filter @@ -185,13 +185,13 @@ func (_m AdminFetcherExtInterface_FetchAllWorkflows) Return(_a0 []*admin.NamedEn } func (_m *AdminFetcherExtInterface) OnFetchAllWorkflows(ctx context.Context, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchAllWorkflows { - c := _m.On("FetchAllWorkflows", ctx, project, domain, filter) - return &AdminFetcherExtInterface_FetchAllWorkflows{Call: c} + c_call := _m.On("FetchAllWorkflows", ctx, project, domain, filter) + return &AdminFetcherExtInterface_FetchAllWorkflows{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchAllWorkflowsMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchAllWorkflows { - c := _m.On("FetchAllWorkflows", matchers...) - return &AdminFetcherExtInterface_FetchAllWorkflows{Call: c} + c_call := _m.On("FetchAllWorkflows", matchers...) + return &AdminFetcherExtInterface_FetchAllWorkflows{Call: c_call} } // FetchAllWorkflows provides a mock function with given fields: ctx, project, domain, filter @@ -226,13 +226,13 @@ func (_m AdminFetcherExtInterface_FetchExecution) Return(_a0 *admin.Execution, _ } func (_m *AdminFetcherExtInterface) OnFetchExecution(ctx context.Context, name string, project string, domain string) *AdminFetcherExtInterface_FetchExecution { - c := _m.On("FetchExecution", ctx, name, project, domain) - return &AdminFetcherExtInterface_FetchExecution{Call: c} + c_call := _m.On("FetchExecution", ctx, name, project, domain) + return &AdminFetcherExtInterface_FetchExecution{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchExecutionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchExecution { - c := _m.On("FetchExecution", matchers...) - return &AdminFetcherExtInterface_FetchExecution{Call: c} + c_call := _m.On("FetchExecution", matchers...) + return &AdminFetcherExtInterface_FetchExecution{Call: c_call} } // FetchExecution provides a mock function with given fields: ctx, name, project, domain @@ -267,13 +267,13 @@ func (_m AdminFetcherExtInterface_FetchLPLatestVersion) Return(_a0 *admin.Launch } func (_m *AdminFetcherExtInterface) OnFetchLPLatestVersion(ctx context.Context, name string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchLPLatestVersion { - c := _m.On("FetchLPLatestVersion", ctx, name, project, domain, filter) - return &AdminFetcherExtInterface_FetchLPLatestVersion{Call: c} + c_call := _m.On("FetchLPLatestVersion", ctx, name, project, domain, filter) + return &AdminFetcherExtInterface_FetchLPLatestVersion{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchLPLatestVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchLPLatestVersion { - c := _m.On("FetchLPLatestVersion", matchers...) - return &AdminFetcherExtInterface_FetchLPLatestVersion{Call: c} + c_call := _m.On("FetchLPLatestVersion", matchers...) + return &AdminFetcherExtInterface_FetchLPLatestVersion{Call: c_call} } // FetchLPLatestVersion provides a mock function with given fields: ctx, name, project, domain, filter @@ -308,13 +308,13 @@ func (_m AdminFetcherExtInterface_FetchLPVersion) Return(_a0 *admin.LaunchPlan, } func (_m *AdminFetcherExtInterface) OnFetchLPVersion(ctx context.Context, name string, version string, project string, domain string) *AdminFetcherExtInterface_FetchLPVersion { - c := _m.On("FetchLPVersion", ctx, name, version, project, domain) - return &AdminFetcherExtInterface_FetchLPVersion{Call: c} + c_call := _m.On("FetchLPVersion", ctx, name, version, project, domain) + return &AdminFetcherExtInterface_FetchLPVersion{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchLPVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchLPVersion { - c := _m.On("FetchLPVersion", matchers...) - return &AdminFetcherExtInterface_FetchLPVersion{Call: c} + c_call := _m.On("FetchLPVersion", matchers...) + return &AdminFetcherExtInterface_FetchLPVersion{Call: c_call} } // FetchLPVersion provides a mock function with given fields: ctx, name, version, project, domain @@ -349,13 +349,13 @@ func (_m AdminFetcherExtInterface_FetchNodeExecutionData) Return(_a0 *admin.Node } func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionData(ctx context.Context, nodeID string, execName string, project string, domain string) *AdminFetcherExtInterface_FetchNodeExecutionData { - c := _m.On("FetchNodeExecutionData", ctx, nodeID, execName, project, domain) - return &AdminFetcherExtInterface_FetchNodeExecutionData{Call: c} + c_call := _m.On("FetchNodeExecutionData", ctx, nodeID, execName, project, domain) + return &AdminFetcherExtInterface_FetchNodeExecutionData{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDataMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchNodeExecutionData { - c := _m.On("FetchNodeExecutionData", matchers...) - return &AdminFetcherExtInterface_FetchNodeExecutionData{Call: c} + c_call := _m.On("FetchNodeExecutionData", matchers...) + return &AdminFetcherExtInterface_FetchNodeExecutionData{Call: c_call} } // FetchNodeExecutionData provides a mock function with given fields: ctx, nodeID, execName, project, domain @@ -390,13 +390,13 @@ func (_m AdminFetcherExtInterface_FetchNodeExecutionDetails) Return(_a0 *admin.N } func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDetails(ctx context.Context, name string, project string, domain string, uniqueParentID string) *AdminFetcherExtInterface_FetchNodeExecutionDetails { - c := _m.On("FetchNodeExecutionDetails", ctx, name, project, domain, uniqueParentID) - return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: c} + c_call := _m.On("FetchNodeExecutionDetails", ctx, name, project, domain, uniqueParentID) + return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchNodeExecutionDetailsMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchNodeExecutionDetails { - c := _m.On("FetchNodeExecutionDetails", matchers...) - return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: c} + c_call := _m.On("FetchNodeExecutionDetails", matchers...) + return &AdminFetcherExtInterface_FetchNodeExecutionDetails{Call: c_call} } // FetchNodeExecutionDetails provides a mock function with given fields: ctx, name, project, domain, uniqueParentID @@ -431,13 +431,13 @@ func (_m AdminFetcherExtInterface_FetchProjectDomainAttributes) Return(_a0 *admi } func (_m *AdminFetcherExtInterface) OnFetchProjectDomainAttributes(ctx context.Context, project string, domain string, rsType admin.MatchableResource) *AdminFetcherExtInterface_FetchProjectDomainAttributes { - c := _m.On("FetchProjectDomainAttributes", ctx, project, domain, rsType) - return &AdminFetcherExtInterface_FetchProjectDomainAttributes{Call: c} + c_call := _m.On("FetchProjectDomainAttributes", ctx, project, domain, rsType) + return &AdminFetcherExtInterface_FetchProjectDomainAttributes{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchProjectDomainAttributesMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchProjectDomainAttributes { - c := _m.On("FetchProjectDomainAttributes", matchers...) - return &AdminFetcherExtInterface_FetchProjectDomainAttributes{Call: c} + c_call := _m.On("FetchProjectDomainAttributes", matchers...) + return &AdminFetcherExtInterface_FetchProjectDomainAttributes{Call: c_call} } // FetchProjectDomainAttributes provides a mock function with given fields: ctx, project, domain, rsType @@ -472,13 +472,13 @@ func (_m AdminFetcherExtInterface_FetchTaskExecutionsOnNode) Return(_a0 *admin.T } func (_m *AdminFetcherExtInterface) OnFetchTaskExecutionsOnNode(ctx context.Context, nodeID string, execName string, project string, domain string) *AdminFetcherExtInterface_FetchTaskExecutionsOnNode { - c := _m.On("FetchTaskExecutionsOnNode", ctx, nodeID, execName, project, domain) - return &AdminFetcherExtInterface_FetchTaskExecutionsOnNode{Call: c} + c_call := _m.On("FetchTaskExecutionsOnNode", ctx, nodeID, execName, project, domain) + return &AdminFetcherExtInterface_FetchTaskExecutionsOnNode{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchTaskExecutionsOnNodeMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchTaskExecutionsOnNode { - c := _m.On("FetchTaskExecutionsOnNode", matchers...) - return &AdminFetcherExtInterface_FetchTaskExecutionsOnNode{Call: c} + c_call := _m.On("FetchTaskExecutionsOnNode", matchers...) + return &AdminFetcherExtInterface_FetchTaskExecutionsOnNode{Call: c_call} } // FetchTaskExecutionsOnNode provides a mock function with given fields: ctx, nodeID, execName, project, domain @@ -513,13 +513,13 @@ func (_m AdminFetcherExtInterface_FetchTaskLatestVersion) Return(_a0 *admin.Task } func (_m *AdminFetcherExtInterface) OnFetchTaskLatestVersion(ctx context.Context, name string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchTaskLatestVersion { - c := _m.On("FetchTaskLatestVersion", ctx, name, project, domain, filter) - return &AdminFetcherExtInterface_FetchTaskLatestVersion{Call: c} + c_call := _m.On("FetchTaskLatestVersion", ctx, name, project, domain, filter) + return &AdminFetcherExtInterface_FetchTaskLatestVersion{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchTaskLatestVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchTaskLatestVersion { - c := _m.On("FetchTaskLatestVersion", matchers...) - return &AdminFetcherExtInterface_FetchTaskLatestVersion{Call: c} + c_call := _m.On("FetchTaskLatestVersion", matchers...) + return &AdminFetcherExtInterface_FetchTaskLatestVersion{Call: c_call} } // FetchTaskLatestVersion provides a mock function with given fields: ctx, name, project, domain, filter @@ -554,13 +554,13 @@ func (_m AdminFetcherExtInterface_FetchTaskVersion) Return(_a0 *admin.Task, _a1 } func (_m *AdminFetcherExtInterface) OnFetchTaskVersion(ctx context.Context, name string, version string, project string, domain string) *AdminFetcherExtInterface_FetchTaskVersion { - c := _m.On("FetchTaskVersion", ctx, name, version, project, domain) - return &AdminFetcherExtInterface_FetchTaskVersion{Call: c} + c_call := _m.On("FetchTaskVersion", ctx, name, version, project, domain) + return &AdminFetcherExtInterface_FetchTaskVersion{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchTaskVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchTaskVersion { - c := _m.On("FetchTaskVersion", matchers...) - return &AdminFetcherExtInterface_FetchTaskVersion{Call: c} + c_call := _m.On("FetchTaskVersion", matchers...) + return &AdminFetcherExtInterface_FetchTaskVersion{Call: c_call} } // FetchTaskVersion provides a mock function with given fields: ctx, name, version, project, domain @@ -595,13 +595,13 @@ func (_m AdminFetcherExtInterface_FetchWorkflowAttributes) Return(_a0 *admin.Wor } func (_m *AdminFetcherExtInterface) OnFetchWorkflowAttributes(ctx context.Context, project string, domain string, name string, rsType admin.MatchableResource) *AdminFetcherExtInterface_FetchWorkflowAttributes { - c := _m.On("FetchWorkflowAttributes", ctx, project, domain, name, rsType) - return &AdminFetcherExtInterface_FetchWorkflowAttributes{Call: c} + c_call := _m.On("FetchWorkflowAttributes", ctx, project, domain, name, rsType) + return &AdminFetcherExtInterface_FetchWorkflowAttributes{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchWorkflowAttributesMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchWorkflowAttributes { - c := _m.On("FetchWorkflowAttributes", matchers...) - return &AdminFetcherExtInterface_FetchWorkflowAttributes{Call: c} + c_call := _m.On("FetchWorkflowAttributes", matchers...) + return &AdminFetcherExtInterface_FetchWorkflowAttributes{Call: c_call} } // FetchWorkflowAttributes provides a mock function with given fields: ctx, project, domain, name, rsType @@ -636,13 +636,13 @@ func (_m AdminFetcherExtInterface_FetchWorkflowLatestVersion) Return(_a0 *admin. } func (_m *AdminFetcherExtInterface) OnFetchWorkflowLatestVersion(ctx context.Context, name string, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_FetchWorkflowLatestVersion { - c := _m.On("FetchWorkflowLatestVersion", ctx, name, project, domain, filter) - return &AdminFetcherExtInterface_FetchWorkflowLatestVersion{Call: c} + c_call := _m.On("FetchWorkflowLatestVersion", ctx, name, project, domain, filter) + return &AdminFetcherExtInterface_FetchWorkflowLatestVersion{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchWorkflowLatestVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchWorkflowLatestVersion { - c := _m.On("FetchWorkflowLatestVersion", matchers...) - return &AdminFetcherExtInterface_FetchWorkflowLatestVersion{Call: c} + c_call := _m.On("FetchWorkflowLatestVersion", matchers...) + return &AdminFetcherExtInterface_FetchWorkflowLatestVersion{Call: c_call} } // FetchWorkflowLatestVersion provides a mock function with given fields: ctx, name, project, domain, filter @@ -677,13 +677,13 @@ func (_m AdminFetcherExtInterface_FetchWorkflowVersion) Return(_a0 *admin.Workfl } func (_m *AdminFetcherExtInterface) OnFetchWorkflowVersion(ctx context.Context, name string, version string, project string, domain string) *AdminFetcherExtInterface_FetchWorkflowVersion { - c := _m.On("FetchWorkflowVersion", ctx, name, version, project, domain) - return &AdminFetcherExtInterface_FetchWorkflowVersion{Call: c} + c_call := _m.On("FetchWorkflowVersion", ctx, name, version, project, domain) + return &AdminFetcherExtInterface_FetchWorkflowVersion{Call: c_call} } func (_m *AdminFetcherExtInterface) OnFetchWorkflowVersionMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchWorkflowVersion { - c := _m.On("FetchWorkflowVersion", matchers...) - return &AdminFetcherExtInterface_FetchWorkflowVersion{Call: c} + c_call := _m.On("FetchWorkflowVersion", matchers...) + return &AdminFetcherExtInterface_FetchWorkflowVersion{Call: c_call} } // FetchWorkflowVersion provides a mock function with given fields: ctx, name, version, project, domain @@ -718,13 +718,13 @@ func (_m AdminFetcherExtInterface_ListExecution) Return(_a0 *admin.ExecutionList } func (_m *AdminFetcherExtInterface) OnListExecution(ctx context.Context, project string, domain string, filter filters.Filters) *AdminFetcherExtInterface_ListExecution { - c := _m.On("ListExecution", ctx, project, domain, filter) - return &AdminFetcherExtInterface_ListExecution{Call: c} + c_call := _m.On("ListExecution", ctx, project, domain, filter) + return &AdminFetcherExtInterface_ListExecution{Call: c_call} } func (_m *AdminFetcherExtInterface) OnListExecutionMatch(matchers ...interface{}) *AdminFetcherExtInterface_ListExecution { - c := _m.On("ListExecution", matchers...) - return &AdminFetcherExtInterface_ListExecution{Call: c} + c_call := _m.On("ListExecution", matchers...) + return &AdminFetcherExtInterface_ListExecution{Call: c_call} } // ListExecution provides a mock function with given fields: ctx, project, domain, filter @@ -759,13 +759,13 @@ func (_m AdminFetcherExtInterface_ListProjects) Return(_a0 *admin.Projects, _a1 } func (_m *AdminFetcherExtInterface) OnListProjects(ctx context.Context, filter filters.Filters) *AdminFetcherExtInterface_ListProjects { - c := _m.On("ListProjects", ctx, filter) - return &AdminFetcherExtInterface_ListProjects{Call: c} + c_call := _m.On("ListProjects", ctx, filter) + return &AdminFetcherExtInterface_ListProjects{Call: c_call} } func (_m *AdminFetcherExtInterface) OnListProjectsMatch(matchers ...interface{}) *AdminFetcherExtInterface_ListProjects { - c := _m.On("ListProjects", matchers...) - return &AdminFetcherExtInterface_ListProjects{Call: c} + c_call := _m.On("ListProjects", matchers...) + return &AdminFetcherExtInterface_ListProjects{Call: c_call} } // ListProjects provides a mock function with given fields: ctx, filter diff --git a/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go b/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go index d944ff5a82..93f8370556 100644 --- a/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go @@ -26,13 +26,13 @@ func (_m AdminUpdaterExtInterface_AdminServiceClient) Return(_a0 service.AdminSe } func (_m *AdminUpdaterExtInterface) OnAdminServiceClient() *AdminUpdaterExtInterface_AdminServiceClient { - c := _m.On("AdminServiceClient") - return &AdminUpdaterExtInterface_AdminServiceClient{Call: c} + c_call := _m.On("AdminServiceClient") + return &AdminUpdaterExtInterface_AdminServiceClient{Call: c_call} } func (_m *AdminUpdaterExtInterface) OnAdminServiceClientMatch(matchers ...interface{}) *AdminUpdaterExtInterface_AdminServiceClient { - c := _m.On("AdminServiceClient", matchers...) - return &AdminUpdaterExtInterface_AdminServiceClient{Call: c} + c_call := _m.On("AdminServiceClient", matchers...) + return &AdminUpdaterExtInterface_AdminServiceClient{Call: c_call} } // AdminServiceClient provides a mock function with given fields: @@ -60,13 +60,13 @@ func (_m AdminUpdaterExtInterface_UpdateProjectDomainAttributes) Return(_a0 erro } func (_m *AdminUpdaterExtInterface) OnUpdateProjectDomainAttributes(ctx context.Context, project string, domain string, matchingAttr *admin.MatchingAttributes) *AdminUpdaterExtInterface_UpdateProjectDomainAttributes { - c := _m.On("UpdateProjectDomainAttributes", ctx, project, domain, matchingAttr) - return &AdminUpdaterExtInterface_UpdateProjectDomainAttributes{Call: c} + c_call := _m.On("UpdateProjectDomainAttributes", ctx, project, domain, matchingAttr) + return &AdminUpdaterExtInterface_UpdateProjectDomainAttributes{Call: c_call} } func (_m *AdminUpdaterExtInterface) OnUpdateProjectDomainAttributesMatch(matchers ...interface{}) *AdminUpdaterExtInterface_UpdateProjectDomainAttributes { - c := _m.On("UpdateProjectDomainAttributes", matchers...) - return &AdminUpdaterExtInterface_UpdateProjectDomainAttributes{Call: c} + c_call := _m.On("UpdateProjectDomainAttributes", matchers...) + return &AdminUpdaterExtInterface_UpdateProjectDomainAttributes{Call: c_call} } // UpdateProjectDomainAttributes provides a mock function with given fields: ctx, project, domain, matchingAttr @@ -92,13 +92,13 @@ func (_m AdminUpdaterExtInterface_UpdateWorkflowAttributes) Return(_a0 error) *A } func (_m *AdminUpdaterExtInterface) OnUpdateWorkflowAttributes(ctx context.Context, project string, domain string, name string, matchingAttr *admin.MatchingAttributes) *AdminUpdaterExtInterface_UpdateWorkflowAttributes { - c := _m.On("UpdateWorkflowAttributes", ctx, project, domain, name, matchingAttr) - return &AdminUpdaterExtInterface_UpdateWorkflowAttributes{Call: c} + c_call := _m.On("UpdateWorkflowAttributes", ctx, project, domain, name, matchingAttr) + return &AdminUpdaterExtInterface_UpdateWorkflowAttributes{Call: c_call} } func (_m *AdminUpdaterExtInterface) OnUpdateWorkflowAttributesMatch(matchers ...interface{}) *AdminUpdaterExtInterface_UpdateWorkflowAttributes { - c := _m.On("UpdateWorkflowAttributes", matchers...) - return &AdminUpdaterExtInterface_UpdateWorkflowAttributes{Call: c} + c_call := _m.On("UpdateWorkflowAttributes", matchers...) + return &AdminUpdaterExtInterface_UpdateWorkflowAttributes{Call: c_call} } // UpdateWorkflowAttributes provides a mock function with given fields: ctx, project, domain, name, matchingAttr diff --git a/flytectl/pkg/github/mocks/gh_repo_service.go b/flytectl/pkg/github/mocks/gh_repo_service.go index 04c2bfebc1..fd3f932152 100644 --- a/flytectl/pkg/github/mocks/gh_repo_service.go +++ b/flytectl/pkg/github/mocks/gh_repo_service.go @@ -23,13 +23,13 @@ func (_m GHRepoService_GetCommitSHA1) Return(_a0 string, _a1 *github.Response, _ } func (_m *GHRepoService) OnGetCommitSHA1(ctx context.Context, owner string, repo string, ref string, lastSHA string) *GHRepoService_GetCommitSHA1 { - c := _m.On("GetCommitSHA1", ctx, owner, repo, ref, lastSHA) - return &GHRepoService_GetCommitSHA1{Call: c} + c_call := _m.On("GetCommitSHA1", ctx, owner, repo, ref, lastSHA) + return &GHRepoService_GetCommitSHA1{Call: c_call} } func (_m *GHRepoService) OnGetCommitSHA1Match(matchers ...interface{}) *GHRepoService_GetCommitSHA1 { - c := _m.On("GetCommitSHA1", matchers...) - return &GHRepoService_GetCommitSHA1{Call: c} + c_call := _m.On("GetCommitSHA1", matchers...) + return &GHRepoService_GetCommitSHA1{Call: c_call} } // GetCommitSHA1 provides a mock function with given fields: ctx, owner, repo, ref, lastSHA @@ -71,13 +71,13 @@ func (_m GHRepoService_GetLatestRelease) Return(_a0 *github.RepositoryRelease, _ } func (_m *GHRepoService) OnGetLatestRelease(ctx context.Context, owner string, repo string) *GHRepoService_GetLatestRelease { - c := _m.On("GetLatestRelease", ctx, owner, repo) - return &GHRepoService_GetLatestRelease{Call: c} + c_call := _m.On("GetLatestRelease", ctx, owner, repo) + return &GHRepoService_GetLatestRelease{Call: c_call} } func (_m *GHRepoService) OnGetLatestReleaseMatch(matchers ...interface{}) *GHRepoService_GetLatestRelease { - c := _m.On("GetLatestRelease", matchers...) - return &GHRepoService_GetLatestRelease{Call: c} + c_call := _m.On("GetLatestRelease", matchers...) + return &GHRepoService_GetLatestRelease{Call: c_call} } // GetLatestRelease provides a mock function with given fields: ctx, owner, repo @@ -121,13 +121,13 @@ func (_m GHRepoService_GetReleaseByTag) Return(_a0 *github.RepositoryRelease, _a } func (_m *GHRepoService) OnGetReleaseByTag(ctx context.Context, owner string, repo string, tag string) *GHRepoService_GetReleaseByTag { - c := _m.On("GetReleaseByTag", ctx, owner, repo, tag) - return &GHRepoService_GetReleaseByTag{Call: c} + c_call := _m.On("GetReleaseByTag", ctx, owner, repo, tag) + return &GHRepoService_GetReleaseByTag{Call: c_call} } func (_m *GHRepoService) OnGetReleaseByTagMatch(matchers ...interface{}) *GHRepoService_GetReleaseByTag { - c := _m.On("GetReleaseByTag", matchers...) - return &GHRepoService_GetReleaseByTag{Call: c} + c_call := _m.On("GetReleaseByTag", matchers...) + return &GHRepoService_GetReleaseByTag{Call: c_call} } // GetReleaseByTag provides a mock function with given fields: ctx, owner, repo, tag @@ -171,13 +171,13 @@ func (_m GHRepoService_ListReleases) Return(_a0 []*github.RepositoryRelease, _a1 } func (_m *GHRepoService) OnListReleases(ctx context.Context, owner string, repo string, opts *github.ListOptions) *GHRepoService_ListReleases { - c := _m.On("ListReleases", ctx, owner, repo, opts) - return &GHRepoService_ListReleases{Call: c} + c_call := _m.On("ListReleases", ctx, owner, repo, opts) + return &GHRepoService_ListReleases{Call: c_call} } func (_m *GHRepoService) OnListReleasesMatch(matchers ...interface{}) *GHRepoService_ListReleases { - c := _m.On("ListReleases", matchers...) - return &GHRepoService_ListReleases{Call: c} + c_call := _m.On("ListReleases", matchers...) + return &GHRepoService_ListReleases{Call: c_call} } // ListReleases provides a mock function with given fields: ctx, owner, repo, opts diff --git a/flytectl/pkg/k8s/mocks/context_ops.go b/flytectl/pkg/k8s/mocks/context_ops.go index 11b7003d0f..0d9e82dd38 100644 --- a/flytectl/pkg/k8s/mocks/context_ops.go +++ b/flytectl/pkg/k8s/mocks/context_ops.go @@ -22,13 +22,13 @@ func (_m ContextOps_CopyContext) Return(_a0 error) *ContextOps_CopyContext { } func (_m *ContextOps) OnCopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName string, targetCtxName string) *ContextOps_CopyContext { - c := _m.On("CopyContext", srcConfigAccess, srcCtxName, targetCtxName) - return &ContextOps_CopyContext{Call: c} + c_call := _m.On("CopyContext", srcConfigAccess, srcCtxName, targetCtxName) + return &ContextOps_CopyContext{Call: c_call} } func (_m *ContextOps) OnCopyContextMatch(matchers ...interface{}) *ContextOps_CopyContext { - c := _m.On("CopyContext", matchers...) - return &ContextOps_CopyContext{Call: c} + c_call := _m.On("CopyContext", matchers...) + return &ContextOps_CopyContext{Call: c_call} } // CopyContext provides a mock function with given fields: srcConfigAccess, srcCtxName, targetCtxName @@ -54,13 +54,13 @@ func (_m ContextOps_RemoveContext) Return(_a0 error) *ContextOps_RemoveContext { } func (_m *ContextOps) OnRemoveContext(ctxName string) *ContextOps_RemoveContext { - c := _m.On("RemoveContext", ctxName) - return &ContextOps_RemoveContext{Call: c} + c_call := _m.On("RemoveContext", ctxName) + return &ContextOps_RemoveContext{Call: c_call} } func (_m *ContextOps) OnRemoveContextMatch(matchers ...interface{}) *ContextOps_RemoveContext { - c := _m.On("RemoveContext", matchers...) - return &ContextOps_RemoveContext{Call: c} + c_call := _m.On("RemoveContext", matchers...) + return &ContextOps_RemoveContext{Call: c_call} } // RemoveContext provides a mock function with given fields: ctxName diff --git a/flytectl/pkg/visualize/mocks/graphvizer.go b/flytectl/pkg/visualize/mocks/graphvizer.go index e36204ed77..1b1f8b6e24 100644 --- a/flytectl/pkg/visualize/mocks/graphvizer.go +++ b/flytectl/pkg/visualize/mocks/graphvizer.go @@ -21,13 +21,13 @@ func (_m Graphvizer_AddAttr) Return(_a0 error) *Graphvizer_AddAttr { } func (_m *Graphvizer) OnAddAttr(parentGraph string, field string, value string) *Graphvizer_AddAttr { - c := _m.On("AddAttr", parentGraph, field, value) - return &Graphvizer_AddAttr{Call: c} + c_call := _m.On("AddAttr", parentGraph, field, value) + return &Graphvizer_AddAttr{Call: c_call} } func (_m *Graphvizer) OnAddAttrMatch(matchers ...interface{}) *Graphvizer_AddAttr { - c := _m.On("AddAttr", matchers...) - return &Graphvizer_AddAttr{Call: c} + c_call := _m.On("AddAttr", matchers...) + return &Graphvizer_AddAttr{Call: c_call} } // AddAttr provides a mock function with given fields: parentGraph, field, value @@ -53,13 +53,13 @@ func (_m Graphvizer_AddEdge) Return(_a0 error) *Graphvizer_AddEdge { } func (_m *Graphvizer) OnAddEdge(src string, dst string, directed bool, attrs map[string]string) *Graphvizer_AddEdge { - c := _m.On("AddEdge", src, dst, directed, attrs) - return &Graphvizer_AddEdge{Call: c} + c_call := _m.On("AddEdge", src, dst, directed, attrs) + return &Graphvizer_AddEdge{Call: c_call} } func (_m *Graphvizer) OnAddEdgeMatch(matchers ...interface{}) *Graphvizer_AddEdge { - c := _m.On("AddEdge", matchers...) - return &Graphvizer_AddEdge{Call: c} + c_call := _m.On("AddEdge", matchers...) + return &Graphvizer_AddEdge{Call: c_call} } // AddEdge provides a mock function with given fields: src, dst, directed, attrs @@ -85,13 +85,13 @@ func (_m Graphvizer_AddNode) Return(_a0 error) *Graphvizer_AddNode { } func (_m *Graphvizer) OnAddNode(parentGraph string, name string, attrs map[string]string) *Graphvizer_AddNode { - c := _m.On("AddNode", parentGraph, name, attrs) - return &Graphvizer_AddNode{Call: c} + c_call := _m.On("AddNode", parentGraph, name, attrs) + return &Graphvizer_AddNode{Call: c_call} } func (_m *Graphvizer) OnAddNodeMatch(matchers ...interface{}) *Graphvizer_AddNode { - c := _m.On("AddNode", matchers...) - return &Graphvizer_AddNode{Call: c} + c_call := _m.On("AddNode", matchers...) + return &Graphvizer_AddNode{Call: c_call} } // AddNode provides a mock function with given fields: parentGraph, name, attrs @@ -117,13 +117,13 @@ func (_m Graphvizer_AddSubGraph) Return(_a0 error) *Graphvizer_AddSubGraph { } func (_m *Graphvizer) OnAddSubGraph(parentGraph string, name string, attrs map[string]string) *Graphvizer_AddSubGraph { - c := _m.On("AddSubGraph", parentGraph, name, attrs) - return &Graphvizer_AddSubGraph{Call: c} + c_call := _m.On("AddSubGraph", parentGraph, name, attrs) + return &Graphvizer_AddSubGraph{Call: c_call} } func (_m *Graphvizer) OnAddSubGraphMatch(matchers ...interface{}) *Graphvizer_AddSubGraph { - c := _m.On("AddSubGraph", matchers...) - return &Graphvizer_AddSubGraph{Call: c} + c_call := _m.On("AddSubGraph", matchers...) + return &Graphvizer_AddSubGraph{Call: c_call} } // AddSubGraph provides a mock function with given fields: parentGraph, name, attrs @@ -149,13 +149,13 @@ func (_m Graphvizer_DoesEdgeExist) Return(_a0 bool) *Graphvizer_DoesEdgeExist { } func (_m *Graphvizer) OnDoesEdgeExist(src string, dest string) *Graphvizer_DoesEdgeExist { - c := _m.On("DoesEdgeExist", src, dest) - return &Graphvizer_DoesEdgeExist{Call: c} + c_call := _m.On("DoesEdgeExist", src, dest) + return &Graphvizer_DoesEdgeExist{Call: c_call} } func (_m *Graphvizer) OnDoesEdgeExistMatch(matchers ...interface{}) *Graphvizer_DoesEdgeExist { - c := _m.On("DoesEdgeExist", matchers...) - return &Graphvizer_DoesEdgeExist{Call: c} + c_call := _m.On("DoesEdgeExist", matchers...) + return &Graphvizer_DoesEdgeExist{Call: c_call} } // DoesEdgeExist provides a mock function with given fields: src, dest @@ -181,13 +181,13 @@ func (_m Graphvizer_GetEdge) Return(_a0 *gographviz.Edge) *Graphvizer_GetEdge { } func (_m *Graphvizer) OnGetEdge(src string, dest string) *Graphvizer_GetEdge { - c := _m.On("GetEdge", src, dest) - return &Graphvizer_GetEdge{Call: c} + c_call := _m.On("GetEdge", src, dest) + return &Graphvizer_GetEdge{Call: c_call} } func (_m *Graphvizer) OnGetEdgeMatch(matchers ...interface{}) *Graphvizer_GetEdge { - c := _m.On("GetEdge", matchers...) - return &Graphvizer_GetEdge{Call: c} + c_call := _m.On("GetEdge", matchers...) + return &Graphvizer_GetEdge{Call: c_call} } // GetEdge provides a mock function with given fields: src, dest @@ -215,13 +215,13 @@ func (_m Graphvizer_GetNode) Return(_a0 *gographviz.Node) *Graphvizer_GetNode { } func (_m *Graphvizer) OnGetNode(key string) *Graphvizer_GetNode { - c := _m.On("GetNode", key) - return &Graphvizer_GetNode{Call: c} + c_call := _m.On("GetNode", key) + return &Graphvizer_GetNode{Call: c_call} } func (_m *Graphvizer) OnGetNodeMatch(matchers ...interface{}) *Graphvizer_GetNode { - c := _m.On("GetNode", matchers...) - return &Graphvizer_GetNode{Call: c} + c_call := _m.On("GetNode", matchers...) + return &Graphvizer_GetNode{Call: c_call} } // GetNode provides a mock function with given fields: key @@ -249,13 +249,13 @@ func (_m Graphvizer_SetName) Return(_a0 error) *Graphvizer_SetName { } func (_m *Graphvizer) OnSetName(name string) *Graphvizer_SetName { - c := _m.On("SetName", name) - return &Graphvizer_SetName{Call: c} + c_call := _m.On("SetName", name) + return &Graphvizer_SetName{Call: c_call} } func (_m *Graphvizer) OnSetNameMatch(matchers ...interface{}) *Graphvizer_SetName { - c := _m.On("SetName", matchers...) - return &Graphvizer_SetName{Call: c} + c_call := _m.On("SetName", matchers...) + return &Graphvizer_SetName{Call: c_call} } // SetName provides a mock function with given fields: name From 86e764778e05994d77024becc574e9f4d78c5cbf Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Wed, 4 May 2022 18:06:38 -0700 Subject: [PATCH 254/645] Fix getAllExample (#320) Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- flytectl/cmd/register/register_util.go | 2 +- flytectl/cmd/register/register_util_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 90c18c7444..8231026385 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -656,7 +656,7 @@ func filterExampleFromRelease(releases *github.RepositoryRelease) []*github.Rele func getAllExample(repository, version string, repoService g.GHRepoService) ([]*github.ReleaseAsset, *github.RepositoryRelease, error) { if len(version) > 0 { - release, err := g.GetReleaseByTag(version, repository, repoService) + release, err := g.GetReleaseByTag(repository, version, repoService) if err != nil { return nil, nil, err } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index e1d3093410..c9d90280dd 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -458,7 +458,7 @@ func TestGetAllFlytesnacksExample(t *testing.T) { mockGh := &ghMocks.GHRepoService{} tag := "v0.15.0" sandboxManifest := "flyte_sandbox_manifest.tgz" - mockGh.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + mockGh.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, tag).Return(&github.RepositoryRelease{ TagName: &tag, Assets: []*github.ReleaseAsset{{ Name: &sandboxManifest, From d32425d47f132d0e60c603c3274cf7d653b58f5b Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Wed, 11 May 2022 20:11:55 +0800 Subject: [PATCH 255/645] flyetcl version should ignore talking to admin if host is not configures (#318) * flyetcl version should ignore talking to admin if host is not configures Signed-off-by: Kevin Su * update test Signed-off-by: Kevin Su * fix test Signed-off-by: Kevin Su * fix test Signed-off-by: Kevin Su * update Signed-off-by: Kevin Su * More tests Signed-off-by: Kevin Su --- flytectl/cmd/core/cmd.go | 4 ++++ flytectl/cmd/core/cmd_test.go | 25 ++++++++++++++++++------- flytectl/cmd/version/version.go | 6 ++++++ flytectl/cmd/version/version_test.go | 7 ++++++- flytectl/pkg/github/githubutil.go | 4 +++- flytectl/pkg/github/githubutil_test.go | 2 +- 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 20188130a6..3c37f28ab6 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -61,6 +61,10 @@ func generateCommandFunc(cmdEntry CommandEntry) func(cmd *cobra.Command, args [] } adminCfg := admin.GetConfig(ctx) + if len(adminCfg.Endpoint.String()) == 0 { + return cmdEntry.CmdFunc(ctx, args, CommandContext{}) + } + clientSet, err := admin.ClientSetBuilder().WithConfig(admin.GetConfig(ctx)). WithTokenCache(pkce.TokenCacheKeyringProvider{ ServiceUser: fmt.Sprintf("%s:%s", adminCfg.Endpoint.String(), pkce.KeyRingServiceUser), diff --git a/flytectl/cmd/core/cmd_test.go b/flytectl/cmd/core/cmd_test.go index f0bab3bc53..7ed13743a9 100644 --- a/flytectl/cmd/core/cmd_test.go +++ b/flytectl/cmd/core/cmd_test.go @@ -17,11 +17,22 @@ func testCommandFunc(ctx context.Context, args []string, cmdCtx CommandContext) } func TestGenerateCommandFunc(t *testing.T) { - adminCfg := admin.GetConfig(context.Background()) - adminCfg.Endpoint = config.URL{URL: url.URL{Host: "dummyHost"}} - adminCfg.AuthType = admin.AuthTypePkce - rootCmd := &cobra.Command{} - cmdEntry := CommandEntry{CmdFunc: testCommandFunc, ProjectDomainNotRequired: true} - fn := generateCommandFunc(cmdEntry) - assert.Nil(t, fn(rootCmd, []string{})) + t.Run("dummy host name", func(t *testing.T) { + adminCfg := admin.GetConfig(context.Background()) + adminCfg.Endpoint = config.URL{URL: url.URL{Host: "dummyHost"}} + adminCfg.AuthType = admin.AuthTypePkce + rootCmd := &cobra.Command{} + cmdEntry := CommandEntry{CmdFunc: testCommandFunc, ProjectDomainNotRequired: true} + fn := generateCommandFunc(cmdEntry) + assert.Nil(t, fn(rootCmd, []string{})) + }) + + t.Run("host is not configured", func(t *testing.T) { + adminCfg := admin.GetConfig(context.Background()) + adminCfg.Endpoint = config.URL{URL: url.URL{Host: ""}} + rootCmd := &cobra.Command{} + cmdEntry := CommandEntry{CmdFunc: testCommandFunc, ProjectDomainNotRequired: true} + fn := generateCommandFunc(cmdEntry) + assert.Nil(t, fn(rootCmd, []string{})) + }) } diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go index f802c69b10..89e3c9eb80 100644 --- a/flytectl/cmd/version/version.go +++ b/flytectl/cmd/version/version.go @@ -75,6 +75,7 @@ func getVersion(ctx context.Context, args []string, cmdCtx cmdCore.CommandContex }); err != nil { return err } + // Print Flyteadmin version if available if err := getControlPlaneVersion(ctx, cmdCtx); err != nil { logger.Debug(ctx, err) @@ -92,6 +93,11 @@ func printVersion(response versionOutput) error { } func getControlPlaneVersion(ctx context.Context, cmdCtx cmdCore.CommandContext) error { + if cmdCtx.ClientSet() == nil { + logger.Debug(ctx, "Ignore talking to admin if host is not configured") + return nil + } + v, err := cmdCtx.AdminClient().GetVersion(ctx, &admin.GetVersionRequest{}) if err != nil || v == nil { logger.Debugf(ctx, "Failed to get version of control plane %v: \n", err) diff --git a/flytectl/cmd/version/version_test.go b/flytectl/cmd/version/version_test.go index 991d50765e..9f67577aa9 100644 --- a/flytectl/cmd/version/version_test.go +++ b/flytectl/cmd/version/version_test.go @@ -115,5 +115,10 @@ func TestVersionUtilFunc(t *testing.T) { err := getVersion(ctx, []string{}, cmdCtx) assert.Nil(t, err) }) - + t.Run("ClientSet is empty", func(t *testing.T) { + ctx := context.Background() + cmdCtx := cmdCore.CommandContext{} + err := getVersion(ctx, []string{}, cmdCtx) + assert.Nil(t, err) + }) } diff --git a/flytectl/pkg/github/githubutil.go b/flytectl/pkg/github/githubutil.go index e65feaa189..142bc5ca51 100644 --- a/flytectl/pkg/github/githubutil.go +++ b/flytectl/pkg/github/githubutil.go @@ -168,8 +168,10 @@ func GetUpgradeMessage(latest string, goos platformutil.Platform) (string, error if err != nil { return "", err } - message := fmt.Sprintf(commonMessage, stdlibversion.Version, latest) + + var message string if isGreater { + message = fmt.Sprintf(commonMessage, stdlibversion.Version, latest) symlink, err := CheckBrewInstall(goos) if err != nil { return "", err diff --git a/flytectl/pkg/github/githubutil_test.go b/flytectl/pkg/github/githubutil_test.go index 920f7682ec..ec303bd03e 100644 --- a/flytectl/pkg/github/githubutil_test.go +++ b/flytectl/pkg/github/githubutil_test.go @@ -186,7 +186,7 @@ func TestGetUpgradeMessage(t *testing.T) { version = "v0.2.09" message, err = GetUpgradeMessage(version, darwin) assert.Nil(t, err) - assert.Equal(t, 63, len(message)) + assert.Equal(t, 0, len(message)) version = "v" message, err = GetUpgradeMessage(version, darwin) From 931c651f0b484141d2f9f4005021452bc4c6f147 Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Tue, 17 May 2022 09:55:02 +0800 Subject: [PATCH 256/645] Expose webhook service (#323) Signed-off-by: Kevin Su --- flytectl/pkg/docker/docker_util.go | 1 + 1 file changed, 1 insertion(+) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index aeaae89510..8c9d47348f 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -123,6 +123,7 @@ func GetDemoPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, erro "0.0.0.0:30086:30086", // K8s cluster "0.0.0.0:30088:30088", // Minio Console Port "0.0.0.0:30089:30089", // Postgres Port + "0.0.0.0:30090:30090", // Webhook service }) } From 02cf19ed61788ba306a71d0f3bcda46bd7ef6851 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Thu, 19 May 2022 21:26:51 +0530 Subject: [PATCH 257/645] Added enableSchedule option on registration and linked missing docs (#324) * Added enableSchedule option on registration Signed-off-by: Prafulla Mahindrakar * Added docs and linked missing docs Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/completion.go | 4 ++++ .../subcommand/register/files_config.go | 1 + .../subcommand/register/filesconfig_flags.go | 1 + .../register/filesconfig_flags_test.go | 14 ++++++++++++ flytectl/cmd/get/execution.go | 1 + flytectl/cmd/register/files.go | 6 +++++ flytectl/cmd/register/files_test.go | 6 ++++- flytectl/cmd/register/register_util.go | 22 ++++++++++++++++--- flytectl/cmd/register/register_util_test.go | 3 ++- flytectl/docs/source/config.rst | 1 + flytectl/docs/source/execution.rst | 1 + flytectl/docs/source/gen/flytectl.rst | 1 + .../docs/source/gen/flytectl_completion.rst | 3 +++ flytectl/docs/source/gen/flytectl_config.rst | 1 + .../source/gen/flytectl_config_discover.rst | 1 + .../docs/source/gen/flytectl_config_docs.rst | 1 + .../docs/source/gen/flytectl_config_init.rst | 2 +- .../source/gen/flytectl_config_validate.rst | 1 + flytectl/docs/source/gen/flytectl_create.rst | 1 + .../source/gen/flytectl_create_execution.rst | 1 + .../source/gen/flytectl_create_project.rst | 1 + flytectl/docs/source/gen/flytectl_delete.rst | 1 + ...ectl_delete_cluster-resource-attribute.rst | 1 + ...lytectl_delete_execution-cluster-label.rst | 1 + ...tectl_delete_execution-queue-attribute.rst | 1 + .../source/gen/flytectl_delete_execution.rst | 1 + .../gen/flytectl_delete_plugin-override.rst | 1 + ...lytectl_delete_task-resource-attribute.rst | 1 + ...tectl_delete_workflow-execution-config.rst | 1 + flytectl/docs/source/gen/flytectl_demo.rst | 1 + .../docs/source/gen/flytectl_demo_exec.rst | 1 + .../docs/source/gen/flytectl_demo_start.rst | 1 + .../docs/source/gen/flytectl_demo_status.rst | 1 + .../source/gen/flytectl_demo_teardown.rst | 1 + flytectl/docs/source/gen/flytectl_get.rst | 1 + ...lytectl_get_cluster-resource-attribute.rst | 1 + .../flytectl_get_execution-cluster-label.rst | 1 + ...flytectl_get_execution-queue-attribute.rst | 1 + .../source/gen/flytectl_get_execution.rst | 1 + .../source/gen/flytectl_get_launchplan.rst | 1 + .../gen/flytectl_get_plugin-override.rst | 1 + .../docs/source/gen/flytectl_get_project.rst | 1 + .../flytectl_get_task-resource-attribute.rst | 1 + .../docs/source/gen/flytectl_get_task.rst | 1 + ...flytectl_get_workflow-execution-config.rst | 1 + .../docs/source/gen/flytectl_get_workflow.rst | 1 + .../docs/source/gen/flytectl_register.rst | 1 + .../source/gen/flytectl_register_examples.rst | 2 ++ .../source/gen/flytectl_register_files.rst | 8 +++++++ flytectl/docs/source/gen/flytectl_sandbox.rst | 1 + .../docs/source/gen/flytectl_sandbox_exec.rst | 1 + .../source/gen/flytectl_sandbox_start.rst | 3 +++ .../source/gen/flytectl_sandbox_status.rst | 1 + .../source/gen/flytectl_sandbox_teardown.rst | 1 + flytectl/docs/source/gen/flytectl_update.rst | 1 + ...ectl_update_cluster-resource-attribute.rst | 1 + ...lytectl_update_execution-cluster-label.rst | 1 + ...tectl_update_execution-queue-attribute.rst | 1 + .../source/gen/flytectl_update_execution.rst | 1 + .../gen/flytectl_update_launchplan-meta.rst | 1 + .../source/gen/flytectl_update_launchplan.rst | 1 + .../gen/flytectl_update_plugin-override.rst | 1 + .../source/gen/flytectl_update_project.rst | 1 + .../source/gen/flytectl_update_task-meta.rst | 1 + ...lytectl_update_task-resource-attribute.rst | 1 + ...tectl_update_workflow-execution-config.rst | 1 + .../gen/flytectl_update_workflow-meta.rst | 1 + flytectl/docs/source/gen/flytectl_upgrade.rst | 1 + flytectl/docs/source/gen/flytectl_version.rst | 1 + 69 files changed, 125 insertions(+), 6 deletions(-) diff --git a/flytectl/cmd/completion.go b/flytectl/cmd/completion.go index 34b3c17104..a243c7f0c1 100644 --- a/flytectl/cmd/completion.go +++ b/flytectl/cmd/completion.go @@ -35,11 +35,13 @@ var completionCmd = &cobra.Command{ To load completions for each session: - Linux + :: $ flytectl completion bash > /etc/bash_completion.d/flytectl - macOS + :: $ flytectl completion bash > /usr/local/etc/bash_completion.d/flytectl @@ -61,6 +63,7 @@ var completionCmd = &cobra.Command{ Start a new shell for this setup to take effect. - fish + :: $ flytectl completion fish | source @@ -72,6 +75,7 @@ var completionCmd = &cobra.Command{ $ flytectl completion fish > ~/.config/fish/completions/flytectl.fish - PowerShell + :: PS> flytectl completion powershell | Out-String | Invoke-Expression diff --git a/flytectl/cmd/config/subcommand/register/files_config.go b/flytectl/cmd/config/subcommand/register/files_config.go index ea2333583a..3a54203478 100644 --- a/flytectl/cmd/config/subcommand/register/files_config.go +++ b/flytectl/cmd/config/subcommand/register/files_config.go @@ -26,6 +26,7 @@ type FilesConfig struct { DeprecatedSourceUploadPath string `json:"sourceUploadPath" pflag:",Deprecated: Update flyte admin to avoid having to configure storage access from flytectl."` DestinationDirectory string `json:"destinationDirectory" pflag:",Location of source code in container."` DryRun bool `json:"dryRun" pflag:",Execute command without making any modifications."` + EnableSchedule bool `json:"enableSchedule" pflag:",Enable the schedule if the files contain schedulable launchplan."` } func GetConfig() *FilesConfig { diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go index 9ca76123d8..10d4756cfb 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags.go @@ -61,5 +61,6 @@ func (cfg FilesConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultFilesConfig.DeprecatedSourceUploadPath, fmt.Sprintf("%v%v", prefix, "sourceUploadPath"), DefaultFilesConfig.DeprecatedSourceUploadPath, "Deprecated: Update flyte admin to avoid having to configure storage access from flytectl.") cmdFlags.StringVar(&DefaultFilesConfig.DestinationDirectory, fmt.Sprintf("%v%v", prefix, "destinationDirectory"), DefaultFilesConfig.DestinationDirectory, "Location of source code in container.") cmdFlags.BoolVar(&DefaultFilesConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultFilesConfig.DryRun, "Execute command without making any modifications.") + cmdFlags.BoolVar(&DefaultFilesConfig.EnableSchedule, fmt.Sprintf("%v%v", prefix, "enableSchedule"), DefaultFilesConfig.EnableSchedule, "Enable the schedule if the files contain schedulable launchplan.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go index 911df3dc31..14fbc00ed2 100755 --- a/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/register/filesconfig_flags_test.go @@ -253,4 +253,18 @@ func TestFilesConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_enableSchedule", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("enableSchedule", testValue) + if vBool, err := cmdFlags.GetBool("enableSchedule"); err == nil { + testDecodeJson_FilesConfig(t, fmt.Sprintf("%v", vBool), &actual.EnableSchedule) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 657d283499..26ec0b792a 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -93,6 +93,7 @@ var hundredChars = 100 var executionColumns = []printer.Column{ {Header: "Name", JSONPath: "$.id.name"}, {Header: "Launch Plan Name", JSONPath: "$.spec.launchPlan.name"}, + {Header: "Version", JSONPath: "$.spec.launchPlan.version"}, {Header: "Type", JSONPath: "$.spec.launchPlan.resourceType"}, {Header: "Phase", JSONPath: "$.closure.phase"}, {Header: "Scheduled Time", JSONPath: "$.spec.metadata.scheduledAt"}, diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index 18f43c40c0..10421a66e4 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -102,6 +102,12 @@ Override Destination dir of source code in container during registration: :: flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 --destinationDirectory "/root" + +Enable schedule for the launchplans part of the serialized protobuf files: + +:: + + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --enableSchedule Usage ` diff --git a/flytectl/cmd/register/files_test.go b/flytectl/cmd/register/files_test.go index ea167f2971..0a9eb330e3 100644 --- a/flytectl/cmd/register/files_test.go +++ b/flytectl/cmd/register/files_test.go @@ -31,6 +31,7 @@ func TestRegisterFromFiles(t *testing.T) { s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) err := registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) }) @@ -52,7 +53,7 @@ func TestRegisterFromFiles(t *testing.T) { s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) - + s.MockAdminClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) mockDataProxy := s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient) mockDataProxy.OnCreateUploadLocationMatch(s.Ctx, mock.Anything).Return(&service.CreateUploadLocationResponse{}, nil) @@ -75,6 +76,7 @@ func TestRegisterFromFiles(t *testing.T) { s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(mock.Anything, mock.Anything).Return(&service.CreateUploadLocationResponse{}, nil) err = Register(s.Ctx, args, config.GetConfig(), s.CmdCtx) assert.Nil(t, err) @@ -95,6 +97,7 @@ func TestRegisterFromFiles(t *testing.T) { s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) err = registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.NotNil(t, err) }) @@ -163,6 +166,7 @@ func TestRegisterFromFiles(t *testing.T) { s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient).OnCreateUploadLocationMatch(mock.Anything, mock.Anything).Return(&service.CreateUploadLocationResponse{}, nil) err = registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 8231026385..9d61085ffa 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -125,7 +125,7 @@ func unMarshalContents(ctx context.Context, fileContents []byte, fname string) ( } -func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.CommandContext, dryRun bool) error { +func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.CommandContext, dryRun, enableSchedule bool) error { switch v := message.(type) { case *admin.LaunchPlan: launchPlan := message.(*admin.LaunchPlan) @@ -144,7 +144,23 @@ func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.Command }, Spec: launchPlan.Spec, }) - return err + if err != nil { + return err + } + // Activate the launchplan + if enableSchedule { + _, err = cmdCtx.AdminClient().UpdateLaunchPlan(ctx, &admin.LaunchPlanUpdateRequest{ + Id: &core.Identifier{ + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + Name: launchPlan.Id.Name, + Version: launchPlan.Id.Version, + }, + State: admin.LaunchPlanState_ACTIVE, + }) + return err + } + return nil case *admin.WorkflowSpec: workflowSpec := message.(*admin.WorkflowSpec) if dryRun { @@ -581,7 +597,7 @@ func registerFile(ctx context.Context, fileName string, registerResults []Result registerResults = append(registerResults, registerResult) return registerResults, err } - if err := register(ctx, spec, cmdCtx, config.DryRun); err != nil { + if err := register(ctx, spec, cmdCtx, config.DryRun, config.EnableSchedule); err != nil { // If error is AlreadyExists then dont consider this to be an error but just a warning state if grpcError := status.Code(err); grpcError == codes.AlreadyExists { registerResult = Result{Name: fileName, Status: "Success", Info: fmt.Sprintf("%v", grpcError.String())} diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index c9d90280dd..13ae96cd18 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -62,6 +62,7 @@ func registerFilesSetup() { rconfig.DefaultFilesConfig.AssumableIamRole = "" rconfig.DefaultFilesConfig.K8sServiceAccount = "" rconfig.DefaultFilesConfig.OutputLocationPrefix = "" + rconfig.DefaultFilesConfig.EnableSchedule = true } func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { @@ -476,7 +477,7 @@ func TestRegister(t *testing.T) { s := setup() registerFilesSetup() node := &admin.NodeExecution{} - err := register(s.Ctx, node, s.CmdCtx, rconfig.DefaultFilesConfig.DryRun) + err := register(s.Ctx, node, s.CmdCtx, rconfig.DefaultFilesConfig.DryRun, rconfig.DefaultFilesConfig.EnableSchedule) assert.NotNil(t, err) }) } diff --git a/flytectl/docs/source/config.rst b/flytectl/docs/source/config.rst index 1bf12d6016..60dd45ea3c 100644 --- a/flytectl/docs/source/config.rst +++ b/flytectl/docs/source/config.rst @@ -8,4 +8,5 @@ It specifies the actions to be performed on the resource 'config'. gen/flytectl_config_validate gen/flytectl_config_init + gen/flytectl_config_docs gen/flytectl_config_discover diff --git a/flytectl/docs/source/execution.rst b/flytectl/docs/source/execution.rst index 2669831019..6acfc7e3e8 100644 --- a/flytectl/docs/source/execution.rst +++ b/flytectl/docs/source/execution.rst @@ -8,4 +8,5 @@ It specifies the actions to be performed on the 'execution' resource. gen/flytectl_create_execution gen/flytectl_get_execution + gen/flytectl_update_execution gen/flytectl_delete_execution diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 08ff0e3b50..06511bf337 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -42,6 +42,7 @@ Options --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index 27579c223f..f6529fbf6e 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -47,6 +47,7 @@ To load completion, run the following commands in accordance with the shell you Start a new shell for this setup to take effect. - fish + :: $ flytectl completion fish | source @@ -58,6 +59,7 @@ To load completion, run the following commands in accordance with the shell you $ flytectl completion fish > ~/.config/fish/completions/flytectl.fish - PowerShell + :: PS> flytectl completion powershell | Out-String | Invoke-Expression @@ -113,6 +115,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 43e3c3f1e7..493ab33653 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -51,6 +51,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 63144832b5..fefd54f7ea 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -55,6 +55,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_config_docs.rst b/flytectl/docs/source/gen/flytectl_config_docs.rst index 79a9313af6..5c02341006 100644 --- a/flytectl/docs/source/gen/flytectl_config_docs.rst +++ b/flytectl/docs/source/gen/flytectl_config_docs.rst @@ -55,6 +55,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index d26dd15c91..7ca884adc5 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -52,7 +52,6 @@ Options -h, --help help for init --host string Endpoint of flyte admin --insecure Enable insecure mode - --storage Enable storage provider config Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -87,6 +86,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 28c7fe2002..5a46a46637 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -57,6 +57,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index 3caac8361c..2d6c94f998 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -54,6 +54,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index a46f88cc0e..48ee14600e 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -177,6 +177,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index 0164bdb98c..b5f7aa04bc 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -90,6 +90,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index e4541836e6..aa1453c301 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -54,6 +54,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index ffe631f9fa..1591bd4750 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -89,6 +89,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 2ada648bd1..ea415b6a99 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -86,6 +86,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 890563a367..6d48e44e96 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -90,6 +90,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 0275e5661a..6aac95b551 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -97,6 +97,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index a581ac9339..ed7ba605f7 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -91,6 +91,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 25e05a9ee1..42d305438a 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -91,6 +91,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 3f0ef09907..38f59eb659 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -89,6 +89,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_demo.rst b/flytectl/docs/source/gen/flytectl_demo.rst index 47949f304f..504b770678 100644 --- a/flytectl/docs/source/gen/flytectl_demo.rst +++ b/flytectl/docs/source/gen/flytectl_demo.rst @@ -72,6 +72,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_demo_exec.rst b/flytectl/docs/source/gen/flytectl_demo_exec.rst index 9d71ade418..c55169861a 100644 --- a/flytectl/docs/source/gen/flytectl_demo_exec.rst +++ b/flytectl/docs/source/gen/flytectl_demo_exec.rst @@ -61,6 +61,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_demo_start.rst b/flytectl/docs/source/gen/flytectl_demo_start.rst index 71bcb4a1df..dc62740582 100644 --- a/flytectl/docs/source/gen/flytectl_demo_start.rst +++ b/flytectl/docs/source/gen/flytectl_demo_start.rst @@ -121,6 +121,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_demo_status.rst b/flytectl/docs/source/gen/flytectl_demo_status.rst index 6308a14c4a..aaa7ff3814 100644 --- a/flytectl/docs/source/gen/flytectl_demo_status.rst +++ b/flytectl/docs/source/gen/flytectl_demo_status.rst @@ -61,6 +61,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_demo_teardown.rst b/flytectl/docs/source/gen/flytectl_demo_teardown.rst index 3ba921e968..58650c4bca 100644 --- a/flytectl/docs/source/gen/flytectl_demo_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_demo_teardown.rst @@ -61,6 +61,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 59ca8cb792..71d85bcf15 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -54,6 +54,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index 9b390ba8a5..73de33c82f 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -97,6 +97,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index aaedb7f86d..1186dd1835 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -96,6 +96,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index ab34f09fd6..2bf8699323 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -99,6 +99,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index cf7579c496..618e621eae 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -129,6 +129,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index c1de87a09f..c2cd4a8697 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -153,6 +153,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index d4708a6f27..ce88f36675 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -118,6 +118,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 98b6d84989..7bfb482d1e 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -101,6 +101,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index a2bf5a7f87..ddfb59c910 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -101,6 +101,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 3fad267133..0d3076e683 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -145,6 +145,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index c3b6123c00..1c126ef959 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -158,6 +158,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 845a89ab86..a7e46b607e 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -129,6 +129,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 556ba2a7c2..5c61b1b818 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -54,6 +54,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 4fa44a4876..5086fb491e 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -40,6 +40,7 @@ Options --continueOnError Continue on error when registering files. --destinationDirectory string Location of source code in container. --dryRun Execute command without making any modifications. + --enableSchedule Enable the schedule if the files contain schedulable launchplan. --force Force use of version number on entities registered with flyte. -h, --help help for examples --k8ServiceAccount string Deprecated. Please use --K8sServiceAccount @@ -79,6 +80,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index acf414b3e7..a30391d3fb 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -93,6 +93,12 @@ Override Destination dir of source code in container during registration: :: flytectl register file _pb_output/* -d development -p flytesnacks --continueOnError --version v2 --destinationDirectory "/root" + +Enable schedule for the launchplans part of the serialized protobuf files: + +:: + + flytectl register file _pb_output/* -d development -p flytesnacks --version v2 --enableSchedule Usage @@ -111,6 +117,7 @@ Options --continueOnError Continue on error when registering files. --destinationDirectory string Location of source code in container. --dryRun Execute command without making any modifications. + --enableSchedule Enable the schedule if the files contain schedulable launchplan. --force Force use of version number on entities registered with flyte. -h, --help help for files --k8ServiceAccount string Deprecated. Please use --K8sServiceAccount @@ -150,6 +157,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 97a8478b8e..ddebcdefdc 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -72,6 +72,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index 0cf40d8033..65f131a303 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -61,6 +61,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index bfde221cfe..765e9f3df4 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -19,11 +19,13 @@ Starts the sandbox cluster without any source code: flytectl sandbox start Mounts your source code repository inside the sandbox: + :: flytectl sandbox start --source=$HOME/flyteorg/flytesnacks Runs a specific version of Flyte. Flytectl sandbox only supports Flyte version available in the Github release, https://github.com/flyteorg/flyte/tags. + :: flytectl sandbox start --version=v0.14.0 @@ -124,6 +126,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index b887fe1fcb..2891e7d53d 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -61,6 +61,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index 2f0a8963da..9c3c5c9bf5 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -61,6 +61,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index e65d21155c..6cc96e9b60 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -56,6 +56,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index c18ed0d263..0dab5c753a 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -96,6 +96,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 978a731b9e..61e0588dc6 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -89,6 +89,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 593716c991..fa5c5ec997 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -100,6 +100,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_execution.rst b/flytectl/docs/source/gen/flytectl_update_execution.rst index 6f6096fbd5..f46100530d 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution.rst @@ -69,6 +69,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index a80d575972..235a93f0dd 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -74,6 +74,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index d5140d52fb..8b41776a43 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -70,6 +70,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 047c6a41db..d574bcf93e 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -102,6 +102,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 97e00e97ef..22d93ef02a 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -129,6 +129,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index da3faef868..507db9cfa5 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -74,6 +74,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index ba6124eca8..5faa148be2 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -102,6 +102,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index a3ec158822..f7ae581c08 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -98,6 +98,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index 5a09fd32aa..6a3905d8df 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -74,6 +74,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index 802356b635..be4ce3f70a 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -69,6 +69,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 1ce459bfec..d0ecf3a2d8 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -58,6 +58,7 @@ Options inherited from parent commands --files.continueOnError Continue on error when registering files. --files.destinationDirectory string Location of source code in container. --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. --files.force Force use of version number on entities registered with flyte. --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. From b09214614127ff85e002f8a4af24370c643ac52e Mon Sep 17 00:00:00 2001 From: David Przybilla Date: Mon, 23 May 2022 18:06:50 +0900 Subject: [PATCH 258/645] Compile command (#321) * adding flytepropeller dep Signed-off-by: David Przybilla * add compile cmd Signed-off-by: David Przybilla * printing summary Signed-off-by: David Przybilla * compile cmd tests Signed-off-by: David Przybilla This reverts commit 75665de7db90646a3e5d7ec65f64c61739c31955. Signed-off-by: David Przybilla * ci fix: go 1.18 Signed-off-by: David Przybilla * compilecmd: fix typos & err handling Signed-off-by: David Przybilla * compilecmd: more tests Signed-off-by: David Przybilla * exporting UnMarshalContents Signed-off-by: David Przybilla * compile uses UnMarshalContents Signed-off-by: David Przybilla * compile cmd usage examples Signed-off-by: David Przybilla * compilecmd: popping errors up Signed-off-by: David Przybilla * compilecmd: add flag config Signed-off-by: David Przybilla * compilecmd better docstring Signed-off-by: David Przybilla * compilecmd uses flags config Signed-off-by: David Przybilla * clean up Signed-off-by: David Przybilla --- flytectl/.github/workflows/checks.yml | 12 +- flytectl/cmd/compile/compile.go | 146 +++++++++ flytectl/cmd/compile/compile_test.go | 71 ++++ .../compile/testdata/bad-workflow-package.tgz | Bin 0 -> 1289 bytes flytectl/cmd/compile/testdata/invalid.tgz | 1 + .../compile/testdata/invalidlaunchplan.tgz | Bin 0 -> 214 bytes flytectl/cmd/compile/testdata/invalidtask.tgz | Bin 0 -> 200 bytes .../cmd/compile/testdata/invalidworkflow.tgz | Bin 0 -> 217 bytes .../cmd/compile/testdata/valid-package.tgz | Bin 0 -> 999 bytes .../subcommand/compile/compile_config.go | 11 + .../config/subcommand/compile/config_flags.go | 55 ++++ .../subcommand/compile/config_flags_test.go | 116 +++++++ flytectl/cmd/register/files.go | 2 +- flytectl/cmd/register/register_util.go | 6 +- flytectl/cmd/register/register_util_test.go | 20 +- flytectl/cmd/root.go | 3 + flytectl/go.mod | 39 +-- flytectl/go.sum | 307 ++++++++++++++++-- 18 files changed, 719 insertions(+), 70 deletions(-) create mode 100644 flytectl/cmd/compile/compile.go create mode 100644 flytectl/cmd/compile/compile_test.go create mode 100644 flytectl/cmd/compile/testdata/bad-workflow-package.tgz create mode 100644 flytectl/cmd/compile/testdata/invalid.tgz create mode 100644 flytectl/cmd/compile/testdata/invalidlaunchplan.tgz create mode 100644 flytectl/cmd/compile/testdata/invalidtask.tgz create mode 100644 flytectl/cmd/compile/testdata/invalidworkflow.tgz create mode 100644 flytectl/cmd/compile/testdata/valid-package.tgz create mode 100644 flytectl/cmd/config/subcommand/compile/compile_config.go create mode 100755 flytectl/cmd/config/subcommand/compile/config_flags.go create mode 100755 flytectl/cmd/config/subcommand/compile/config_flags_test.go diff --git a/flytectl/.github/workflows/checks.yml b/flytectl/.github/workflows/checks.yml index eee6209b0c..2283b69920 100644 --- a/flytectl/.github/workflows/checks.yml +++ b/flytectl/.github/workflows/checks.yml @@ -20,7 +20,7 @@ jobs: name: Lint uses: flyteorg/flytetools/.github/workflows/lint.yml@master with: - go-version: 1.17 + go-version: 1.18 tests: name: Unit Tests @@ -28,13 +28,13 @@ jobs: secrets: FLYTE_BOT_PAT: ${{ secrets.FLYTE_BOT_PAT }} with: - go-version: 1.17 + go-version: 1.18 generate: name: Check Go Gennerate uses: flyteorg/flytetools/.github/workflows/go_generate.yml@master with: - go-version: 1.17 + go-version: 1.18 dry_run_goreleaser: name: Dry Run Goreleaser @@ -52,7 +52,7 @@ jobs: key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - uses: actions/setup-go@v3 with: - go-version: '1.17' + go-version: '1.18' - name: Run GoReleaser dry run uses: goreleaser/goreleaser-action@v2 with: @@ -74,7 +74,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.17 + go-version: 1.18 - name: Build Flytectl binary run: make compile - name: Create a sandbox cluster @@ -104,7 +104,7 @@ jobs: lfs: true - uses: actions/setup-go@v1 with: - go-version: '1.17' + go-version: '1.18' - uses: actions/setup-python@v1 with: python-version: 3.8 diff --git a/flytectl/cmd/compile/compile.go b/flytectl/cmd/compile/compile.go new file mode 100644 index 0000000000..ffbbbad90e --- /dev/null +++ b/flytectl/cmd/compile/compile.go @@ -0,0 +1,146 @@ +package compile + +import ( + "context" + "fmt" + "io/ioutil" + "os" + + config "github.com/flyteorg/flytectl/cmd/config/subcommand/compile" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/register" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytepropeller/pkg/compiler" + "github.com/flyteorg/flytepropeller/pkg/compiler/common" +) + +// Utility function for compiling a list of Tasks +func compileTasks(tasks []*core.TaskTemplate) ([]*core.CompiledTask, error) { + res := make([]*core.CompiledTask, 0, len(tasks)) + for _, task := range tasks { + compiledTask, err := compiler.CompileTask(task) + if err != nil { + return nil, err + } + res = append(res, compiledTask) + } + return res, nil +} + +/* + Utility to compile a packaged workflow locally. + compilation is done locally so no flyte cluster is required. +*/ +func compileFromPackage(packagePath string) error { + args := []string{packagePath} + fileList, tmpDir, err := register.GetSerializeOutputFiles(context.Background(), args, true) + defer os.RemoveAll(tmpDir) + if err != nil { + fmt.Println("Error found while extracting package..") + return err + } + fmt.Println("Successfully extracted package...") + fmt.Println("Processing Protobuf files...") + workflows := make(map[string]*admin.WorkflowSpec) + plans := make(map[string]*admin.LaunchPlan) + tasks := []*admin.TaskSpec{} + + for _, pbFilePath := range fileList { + rawTsk, err := ioutil.ReadFile(pbFilePath) + if err != nil { + fmt.Printf("error unmarshalling task..") + return err + } + spec, err := register.UnMarshalContents(context.Background(), rawTsk, pbFilePath) + if err != nil { + return err + } + + switch v := spec.(type) { + case *admin.TaskSpec: + tasks = append(tasks, v) + case *admin.WorkflowSpec: + workflows[v.Template.Id.Name] = v + case *admin.LaunchPlan: + plans[v.Id.Name] = v + } + } + + // compile tasks + taskTemplates := []*core.TaskTemplate{} + for _, task := range tasks { + taskTemplates = append(taskTemplates, task.Template) + } + + fmt.Println("\nCompiling tasks...") + compiledTasks, err := compileTasks(taskTemplates) + if err != nil { + fmt.Println("Error while compiling tasks...") + return err + } + + // compile workflows + for wfName, workflow := range workflows { + + fmt.Println("\nCompiling workflow:", wfName) + plan := plans[wfName] + + _, err := compiler.CompileWorkflow(workflow.Template, + workflow.SubWorkflows, + compiledTasks, + []common.InterfaceProvider{compiler.NewLaunchPlanInterfaceProvider(*plan)}) + if err != nil { + fmt.Println(":( Error Compiling workflow:", wfName) + return err + } + + } + + fmt.Println("All Workflows compiled successfully!") + fmt.Println("\nSummary:") + fmt.Println(len(workflows), " workflows found in package") + fmt.Println(len(tasks), " Tasks found in package") + fmt.Println(len(plans), " Launch plans found in package") + return nil +} + +const ( + compileShort = `Validate flyte packages without registration needed.` + compileLong = ` +Validate workflows by compiling flyte's serialized protobuf files (task, workflows and launch plans). This is useful for testing workflows and tasks without neededing to talk with a flyte cluster. + +:: + + flytectl compile --file my-flyte-package.tgz + +:: + + flytectl compile --file /home/user/dags/my-flyte-package.tgz + +.. note:: + Input file is a path to a tgz. This file is generated by either pyflyte or jflyte. tgz file contains protobuf files describing workflows, tasks and launch plans. + +` +) + +func compile(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + packageFilePath := config.DefaultCompileConfig.File + if packageFilePath == "" { + return fmt.Errorf("path to package tgz's file is a required flag") + } + return compileFromPackage(packageFilePath) +} + +func CreateCompileCommand() map[string]cmdCore.CommandEntry { + compileResourcesFuncs := map[string]cmdCore.CommandEntry{ + "compile": { + Short: compileShort, + Long: compileLong, + CmdFunc: compile, + PFlagProvider: config.DefaultCompileConfig, + ProjectDomainNotRequired: true, + }, + } + return compileResourcesFuncs +} diff --git a/flytectl/cmd/compile/compile_test.go b/flytectl/cmd/compile/compile_test.go new file mode 100644 index 0000000000..83c555964c --- /dev/null +++ b/flytectl/cmd/compile/compile_test.go @@ -0,0 +1,71 @@ +package compile + +import ( + "context" + "testing" + + config "github.com/flyteorg/flytectl/cmd/config/subcommand/compile" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + u "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" +) + +func TestCompileCommand(t *testing.T) { + rootCmd := &cobra.Command{ + Long: "Flytectl is a CLI tool written in Go to interact with the FlyteAdmin service.", + Short: "Flytectl CLI tool", + Use: "flytectl", + DisableAutoGenTag: true, + } + compileCommand := CreateCompileCommand() + cmdCore.AddCommands(rootCmd, compileCommand) + cmdNouns := rootCmd.Commands() + assert.Equal(t, cmdNouns[0].Use, "compile") + assert.Equal(t, cmdNouns[0].Flags().Lookup("file").Name, "file") + // check shorthand + assert.Equal(t, cmdNouns[0].Short, compileShort) + + // compiling via cobra command + compileCfg := config.DefaultCompileConfig + compileCfg.File = "testdata/valid-package.tgz" + var setup = u.Setup + s := setup() + compileCmd := CreateCompileCommand()["compile"] + err := compileCmd.CmdFunc(context.Background(), []string{}, s.CmdCtx) + assert.Nil(t, err, "compiling via cmd returns err") + + // calling command with empty file flag + compileCfg = config.DefaultCompileConfig + compileCfg.File = "" + err = compileCmd.CmdFunc(context.Background(), []string{}, s.CmdCtx) + assert.NotNil(t, err, "calling compile with Empty file flag does not error") +} + +func TestCompilePackage(t *testing.T) { + // valid package contains two workflows + // with three tasks + err := compileFromPackage("testdata/valid-package.tgz") + assert.Nil(t, err, "unable to compile a valid package") + + // invalid gzip header + err = compileFromPackage("testdata/invalid.tgz") + assert.NotNil(t, err, "compiling an invalid package returns no error") + + // invalid workflow, types do not match + err = compileFromPackage("testdata/bad-workflow-package.tgz") + assert.NotNil(t, err, "compilin an invalid workflow returns no error") + + // testing badly serialized task + err = compileFromPackage("testdata/invalidtask.tgz") + assert.NotNil(t, err, "unable to handle invalid task") + + // testing badly serialized launchplan + err = compileFromPackage("testdata/invalidlaunchplan.tgz") + assert.NotNil(t, err, "unable to handle invalid launchplan") + + // testing badly serialized workflow + err = compileFromPackage("testdata/invalidworkflow.tgz") + assert.NotNil(t, err, "unable to handle invalid workflow") + +} diff --git a/flytectl/cmd/compile/testdata/bad-workflow-package.tgz b/flytectl/cmd/compile/testdata/bad-workflow-package.tgz new file mode 100644 index 0000000000000000000000000000000000000000..183be1bae5aae6d4d97eb2485bd8fe4fbc25b3e8 GIT binary patch literal 1289 zcmV+k1@`(MiwFqpE_Gr8|7L7?bY(4YVPk7yXJsyQXLR|qCux)?q-~Z? z(rhUc%(RCvQnaf#D>EG!;J~dt04HWN!d@qy*p{*7ywK@|;Z%li!H41F6qw=6N{$^{ zRva@;)HHs6K6tfSN$W_@{{Op=V|`cO{o+M%@{I_pqN7|3MxTq`4a2m~%W*wpmd%yz z6D0?F-6-hD%U|_}d{5xz?PgSOif7ERS=n;R9@n|YoHDaPL2f;}Ib0)-2lp&AT*vN* z2v5cQc>MD?{_Q;DzZx7FhIes0*{oK(eetj3_>bd%di*bYj%`>t{?7r1FHVAHyCL+! z`@U$2P7n#d6?U3I!>`tSrni55%g}Hv>!R_W8J0U9|C~v^P_~Uc<9|-afB0h&o~ngX z>GH>bthP_1gRrGVLHCe8CR=KOtQop|eO47mq7k;~oqmfQrSu(?;Q=gl>-)`stU^&O zlKut|SZs=*MIfn6%J2acT4Y&P6o@Qr!6p<#gRH~qmn&qs9dv%`iHOK5{%;Z14n(67 z`p03XQQc$oUi-AxIE{oRPDG^_394#Zz18kTT?#K>>Phj{D|%1U!d@iHTDv1^^%J@- zclK*uBo(sFLrv=h$Afm&APNSJAIipZ*Yjl0*K)`3m~~C79Ei$cJFK_lxr69{K9Y^k z>z-B-h^VQY{*65X(IBs$bfKIUOP(ko#{=>5O6AM~QouY|2A zsLT7MS4A!8H6lO0MgH*6qNdT+xJqk=)m}r;d#SrkSCYN0peZPsyz?a-CvPk0|Iq(s z_&<+Z9{RsIfKB+nO4yWwC43ndQTJ`F-)#QRuv7leU=~OJmy7@VWf4A+{_pYB$KZci zzh{sbIB6Ku22NIO!(Hj^7*P}VCrin;G2AxzUuf~J+v2T_-CT5c=>O3Fq5m7n|40RP z8T!9DfKT|pDJyhg2I%QbHu=3v0iph*{%8FEFY|2F|9Qa4)PFNq{pYqlssASGe=hpJsV-!T z|8Iq9#sD)wIR8iezqR^rSr-2O$2{O>=)ZXb=Kn6{f8O={-%QW{7jXWM^Z#qne{)j* z8R~y7`tN4yzw4p=&jsa7{m*;;?@sDJ{{G85o&THU_rf$|un$|Y7(al4F(50lD7Bdz z#;mjcSym8m1pq-11VIo4K@bE%5ClOG1VIo4K@bE%5ClOGB%A*LVr*eU0C)fZAi<>g literal 0 HcmV?d00001 diff --git a/flytectl/cmd/compile/testdata/invalid.tgz b/flytectl/cmd/compile/testdata/invalid.tgz new file mode 100644 index 0000000000..3f37575e6a --- /dev/null +++ b/flytectl/cmd/compile/testdata/invalid.tgz @@ -0,0 +1 @@ +invalid tgz file diff --git a/flytectl/cmd/compile/testdata/invalidlaunchplan.tgz b/flytectl/cmd/compile/testdata/invalidlaunchplan.tgz new file mode 100644 index 0000000000000000000000000000000000000000..650a0d5a92ef86771d9d2dac9da85d069f33c20d GIT binary patch literal 214 zcmb2|=3po^YffTdetX`!i^)->^`Vr{9EWm+Ff+HR-;rmuVw{3=mAmft{$Mgb7?8#+ zyi+u`!`i@X>(+xVX*@hGKlVQfIJ)rFy~KSRUK-52`Etc%-NiT50<)f1<{S9s%2mEC zTr*EiY2o|V-m?sLEZgyPrwGffkFoJi=Zj<9yOVpwwRF$d|GiOTwRv*Vlp}gB`~JTZ z-CFm5e)%ciFS_?#ii1P#=f92!?c3cSRk-o~yj_uZbMkwquKXh>6~F51CP_vHWbpmm M0uR>d3>pj!0M_bY3jhEB literal 0 HcmV?d00001 diff --git a/flytectl/cmd/compile/testdata/invalidtask.tgz b/flytectl/cmd/compile/testdata/invalidtask.tgz new file mode 100644 index 0000000000000000000000000000000000000000..cb129ab1604f347f7edae04efd15c7d1d0550b09 GIT binary patch literal 200 zcmb2|=3to5*__0{{Pw&p*C7LmV;?=lWxuc`na%yutD-yakg~^8jz{c|+z8v`;pu$$fWi^~xP4F(1PZbe)1 literal 0 HcmV?d00001 diff --git a/flytectl/cmd/compile/testdata/invalidworkflow.tgz b/flytectl/cmd/compile/testdata/invalidworkflow.tgz new file mode 100644 index 0000000000000000000000000000000000000000..4192456119db8dbabe729f3ef268fbf715d8d93c GIT binary patch literal 217 zcmb2|=3q!PYffTdetX_F>#%{uvBIf3ZztSa5E5;zx<2>jqUA3HdwL98YIfY{bKd4~ zYyx-5snA=^U)bjEKGu2A+haG2*MtAjaw>95zRRA?GM8LBRr~nimqvauQu?2g=J%=N8 z?`LO4emiabR&Cd5?TS zi8l%0ut*LLNbgc4Wg7@mG(Gf|9GY7JVk@m;!F+|HY`H-$J?3-t!}Q~%m!7kv9pJF3=Pk5F53S&Q^7tF|29|oLfc_w#{Yuu|M1r`Jkl$M z@%h())RMF8D2~ibbdTwMvaMIhImVcgxXJQWHk}#>z>SrGTHxDVf{!3LF}K# zY0x_4bR#)y2WOcyWnVUXnWVaDcA})0bt$}gV->}>Z|R0<#=T6H%_NoWPM>b7%7NuY zVNgDIOfwayBfpl&#K`%Ma#mH(i<+NR#kkF;X*Q2!^Ein+k?LDyNA#|8{%CtXIfn9A zeV&|aM7NcHZhJO1jlDt5NOt4kM5gqhc+BHYW;NqfT7&eQSxgKC!r{?oj{X_n$@8fAhcpcS`(<@5gmb3Dxd3qXBd z{;!vt|7~|p{&z6{my-Xt^rgAU|6S!1x+M)KYqS0kFCdMj)AP9mW2!bF8f*=TjAP9mW2!bF8 Vf*=TjAP9nt_yA(=Xtn@Q000(Y3oQTu literal 0 HcmV?d00001 diff --git a/flytectl/cmd/config/subcommand/compile/compile_config.go b/flytectl/cmd/config/subcommand/compile/compile_config.go new file mode 100644 index 0000000000..6fe24bca41 --- /dev/null +++ b/flytectl/cmd/config/subcommand/compile/compile_config.go @@ -0,0 +1,11 @@ +package compile + +//go:generate pflags Config --default-var DefaultCompileConfig --bind-default-var +var ( + DefaultCompileConfig = &Config{} +) + +// Config stores the flags required by compile command +type Config struct { + File string `json:"file" pflag:",Path to a flyte package file. Flyte packages are tgz files generated by pyflyte or jflyte."` +} diff --git a/flytectl/cmd/config/subcommand/compile/config_flags.go b/flytectl/cmd/config/subcommand/compile/config_flags.go new file mode 100755 index 0000000000..4e826f1b67 --- /dev/null +++ b/flytectl/cmd/config/subcommand/compile/config_flags.go @@ -0,0 +1,55 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package compile + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.StringVar(&DefaultCompileConfig.File, fmt.Sprintf("%v%v", prefix, "file"), DefaultCompileConfig.File, "Path to a flyte package file. Flyte packages are tgz files generated by pyflyte or jflyte.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/compile/config_flags_test.go b/flytectl/cmd/config/subcommand/compile/config_flags_test.go new file mode 100755 index 0000000000..be3845ec1a --- /dev/null +++ b/flytectl/cmd/config/subcommand/compile/config_flags_test.go @@ -0,0 +1,116 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package compile + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_Config(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_Config(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) +} + +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) +} + +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_file", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("file", testValue) + if vString, err := cmdFlags.GetString("file"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.File) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index 10421a66e4..f87f353efc 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -126,7 +126,7 @@ func Register(ctx context.Context, args []string, cfg *config.Config, cmdCtx cmd deprecatedCheck(ctx, &rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.K8ServiceAccount) // getSerializeOutputFiles will return you all proto and source code compress file in sorted order - dataRefs, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + dataRefs, tmpDir, err := GetSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) if err != nil { logger.Errorf(ctx, "error while un-archiving files in tmp dir due to %v", err) return err diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 9d61085ffa..d05aa25d67 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -92,7 +92,7 @@ var projectColumns = []printer.Column{ {Header: "Additional Info", JSONPath: "$.Info"}, } -func unMarshalContents(ctx context.Context, fileContents []byte, fname string) (proto.Message, error) { +func UnMarshalContents(ctx context.Context, fileContents []byte, fname string) (proto.Message, error) { workflowSpec := &admin.WorkflowSpec{} errCollection := errors2.ErrorCollection{} err := proto.Unmarshal(fileContents, workflowSpec) @@ -482,7 +482,7 @@ Get serialize output file list from the args list. If the archive flag is on then download the archives to temp directory and extract it. In case of fast register it will also return the compressed source code The o/p of this function would be sorted list of the file locations. */ -func getSerializeOutputFiles(ctx context.Context, args []string, archive bool) ([]string, string, error) { +func GetSerializeOutputFiles(ctx context.Context, args []string, archive bool) ([]string, string, error) { if !archive { /* * Sorting is required for non-archived case since its possible for the user to pass in a list of unordered @@ -578,7 +578,7 @@ func registerFile(ctx context.Context, fileName string, registerResults []Result registerResults = append(registerResults, Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error reading file due to %v", err)}) return registerResults, err } - spec, err := unMarshalContents(ctx, fileContents, fileName) + spec, err := UnMarshalContents(ctx, fileContents, fileName) if err != nil { registerResult = Result{Name: fileName, Status: "Failed", Info: fmt.Sprintf("Error unmarshalling file due to %v", err)} registerResults = append(registerResults, registerResult) diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 13ae96cd18..7820913573 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -70,7 +70,7 @@ func TestGetSortedArchivedFileWithParentFolderList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args := []string{"testdata/valid-parent-folder-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) + fileList, tmpDir, err := GetSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "parentfolder", "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -87,7 +87,7 @@ func TestGetSortedArchivedFileList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args := []string{"testdata/valid-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) + fileList, tmpDir, err := GetSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -104,7 +104,7 @@ func TestGetSortedArchivedFileUnorderedList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args := []string{"testdata/valid-unordered-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) + fileList, tmpDir, err := GetSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -121,7 +121,7 @@ func TestGetSortedArchivedCorruptedFileList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args := []string{"testdata/invalid.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) + fileList, tmpDir, err := GetSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 0) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -134,7 +134,7 @@ func TestGetSortedArchivedTgzList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args := []string{"testdata/valid-register.tgz"} - fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) + fileList, tmpDir, err := GetSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -150,7 +150,7 @@ func TestGetSortedArchivedCorruptedTgzFileList(t *testing.T) { s := setup() rconfig.DefaultFilesConfig.Archive = true args := []string{"testdata/invalid.tgz"} - fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) + fileList, tmpDir, err := GetSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -163,7 +163,7 @@ func TestGetSortedArchivedInvalidArchiveFileList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args := []string{"testdata/invalid-extension-register.zip"} - fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) + fileList, tmpDir, err := GetSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -176,7 +176,7 @@ func TestGetSortedArchivedFileThroughInvalidHttpList(t *testing.T) { s := setup() rconfig.DefaultFilesConfig.Archive = true args := []string{"http://invalidhost:invalidport/testdata/valid-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) + fileList, tmpDir, err := GetSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) @@ -189,7 +189,7 @@ func TestGetSortedArchivedFileThroughValidHttpList(t *testing.T) { registerFilesSetup() rconfig.DefaultFilesConfig.Archive = true args := []string{"http://dummyhost:80/testdata/valid-register.tar"} - fileList, tmpDir, err := getSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) + fileList, tmpDir, err := GetSerializeOutputFiles(s.Ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, len(fileList), 4) assert.Equal(t, filepath.Join(tmpDir, "014_recipes.core.basic.basic_workflow.t1_1.pb"), fileList[0]) assert.Equal(t, filepath.Join(tmpDir, "015_recipes.core.basic.basic_workflow.t2_1.pb"), fileList[1]) @@ -207,7 +207,7 @@ func TestGetSortedArchivedFileThroughValidHttpWithNullContextList(t *testing.T) rconfig.DefaultFilesConfig.Archive = true args := []string{"http://dummyhost:80/testdata/valid-register.tar"} var ctx context.Context = nil - fileList, tmpDir, err := getSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) + fileList, tmpDir, err := GetSerializeOutputFiles(ctx, args, rconfig.DefaultFilesConfig.Archive) assert.Equal(t, 0, len(fileList)) assert.True(t, strings.HasPrefix(tmpDir, "/tmp/register")) assert.NotNil(t, err) diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 7ebdd46ab2..760cf3bafc 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -5,6 +5,7 @@ import ( "fmt" "os" + "github.com/flyteorg/flytectl/cmd/compile" "github.com/flyteorg/flytectl/cmd/config" configuration "github.com/flyteorg/flytectl/cmd/configuration" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -57,6 +58,8 @@ func newRootCmd() *cobra.Command { rootCmd.PersistentFlags().StringVarP(&(config.GetConfig().Output), "output", "o", printer.OutputFormatTABLE.String(), fmt.Sprintf("Specifies the output type - supported formats %s. NOTE: dot, doturl are only supported for Workflow", printer.OutputFormats())) rootCmd.AddCommand(get.CreateGetCommand()) + compileCmd := compile.CreateCompileCommand() + cmdCore.AddCommands(rootCmd, compileCmd) rootCmd.AddCommand(create.RemoteCreateCommand()) rootCmd.AddCommand(update.CreateUpdateCommand()) rootCmd.AddCommand(register.RemoteRegisterCommand()) diff --git a/flytectl/go.mod b/flytectl/go.mod index 30190ad03f..8b95a84bd6 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -1,6 +1,6 @@ module github.com/flyteorg/flytectl -go 1.17 +go 1.18 require ( github.com/avast/retry-go v3.0.0+incompatible @@ -9,8 +9,8 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v0.24.21 - github.com/flyteorg/flytestdlib v0.4.16 + github.com/flyteorg/flyteidl v1.1.0 + github.com/flyteorg/flytestdlib v1.0.0 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 github.com/golang/protobuf v1.5.0 @@ -20,7 +20,6 @@ require ( github.com/hashicorp/go-version v1.3.0 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 - github.com/manifoldco/promptui v0.8.0 github.com/mitchellh/mapstructure v1.4.1 github.com/mouuff/go-rocket-update v1.5.1 github.com/olekukonko/tablewriter v0.0.5 @@ -33,7 +32,7 @@ require ( github.com/stretchr/testify v1.7.0 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 github.com/zalando/go-keyring v0.1.1 - golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 + golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 google.golang.org/grpc v1.36.0 google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v2 v2.4.0 @@ -45,10 +44,13 @@ require ( sigs.k8s.io/yaml v1.2.0 ) -require golang.org/x/text v0.3.7 +require ( + github.com/flyteorg/flytepropeller v1.1.1 + golang.org/x/text v0.3.7 +) require ( - cloud.google.com/go v0.75.0 // indirect + cloud.google.com/go v0.78.0 // indirect cloud.google.com/go/storage v1.12.0 // indirect github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect @@ -62,11 +64,10 @@ require ( github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/Microsoft/go-winio v0.5.0 // indirect github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect - github.com/aws/aws-sdk-go v1.37.1 // indirect + github.com/aws/aws-sdk-go v1.37.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.1 // indirect - github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect github.com/containerd/containerd v1.5.10 // indirect github.com/coocood/freecache v1.1.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect @@ -77,7 +78,8 @@ require ( github.com/dustin/go-humanize v1.0.0 // indirect github.com/evanphx/json-patch v4.9.0+incompatible // indirect github.com/fatih/color v1.10.0 // indirect - github.com/flyteorg/stow v0.3.1 // indirect + github.com/flyteorg/flyteplugins v1.0.0 // indirect + github.com/flyteorg/stow v0.3.3 // indirect github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/go-logr/logr v0.4.0 // indirect @@ -86,9 +88,9 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/google/go-cmp v0.5.6 // indirect - github.com/google/gofuzz v1.1.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/googleapis/gax-go/v2 v2.0.5 // indirect - github.com/googleapis/gnostic v0.4.1 // indirect + github.com/googleapis/gnostic v0.5.1 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect @@ -100,9 +102,7 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.10 // indirect github.com/jstemmer/go-junit-report v0.9.1 // indirect - github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a // indirect github.com/magiconair/properties v1.8.4 // indirect github.com/mattn/go-colorable v0.1.8 // indirect github.com/mattn/go-isatty v0.0.13 // indirect @@ -116,9 +116,9 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/pelletier/go-toml v1.8.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.9.0 // indirect + github.com/prometheus/client_golang v1.10.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.15.0 // indirect + github.com/prometheus/common v0.18.0 // indirect github.com/prometheus/procfs v0.6.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect @@ -131,6 +131,7 @@ require ( github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.22.6 // indirect golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect + golang.org/x/exp v0.0.0-20220428152302-39d4317da171 // indirect golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect @@ -139,13 +140,13 @@ require ( golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect golang.org/x/tools v0.1.10 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - google.golang.org/api v0.38.0 // indirect + google.golang.org/api v0.40.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 // indirect + google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.62.0 // indirect k8s.io/klog/v2 v2.8.0 // indirect k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect - k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect + k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect ) diff --git a/flytectl/go.sum b/flytectl/go.sum index 5a749e8e12..9bdfe27256 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -7,6 +7,7 @@ cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= @@ -17,8 +18,9 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0 h1:XgtDnVJRCPEUG21gjFiRPz4zI1Mjg16R+NYQjfmU4XY= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0 h1:oKpsiyKMfVpwR3zSAkQixGzlVE5ovitBuO0qSmCf0bI= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -41,8 +43,6 @@ cloud.google.com/go/storage v1.12.0 h1:4y3gHptW1EHVtcPAVE0eBBlFuGqEejTTG3KdIE0lU cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v51.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= @@ -57,20 +57,24 @@ github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSW github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= @@ -84,7 +88,11 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DiSiqueira/GoTree v1.0.1-0.20180907134536-53a8e837f295/go.mod h1:e0aH495YLkrsIe9fhedd6aSR6fgU/qhKvtroi6y7G/M= +github.com/GoogleCloudPlatform/spark-on-k8s-operator v0.0.0-20200723154620-6f35a1152625/go.mod h1:6PnrZv6zUDkrNMw0mIoGRmGBR7i9LulhKPmxFq4rUiM= +github.com/Jeffail/gabs/v2 v2.5.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -108,19 +116,26 @@ github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:m github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/adammck/venv v0.0.0-20160819025605-8a9c907a37d3/go.mod h1:3zXR2a/VSQndtpShh783rUTaEA2mpqN2VqZclBARBc0= +github.com/adammck/venv v0.0.0-20200610172036-e77789703e7c/go.mod h1:3zXR2a/VSQndtpShh783rUTaEA2mpqN2VqZclBARBc0= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -129,6 +144,7 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= @@ -136,13 +152,25 @@ github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHS github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= +github.com/aws/amazon-sagemaker-operator-for-k8s v1.0.1-0.20210303003444-0fb33b1fd49d/go.mod h1:mZUP7GJmjiWtf8v3FD1X/QdK08BqyeH/1Ejt0qhNzCs= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.37.3 h1:1f0groABc4AuapskpHf6EBRaG2tqw0Sx3ebCMwfp1Ys= +github.com/aws/aws-sdk-go v1.37.3/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.0.0/go.mod h1:smfAbmpW+tcRVuNUjo3MOArSZmW72t62rkCzc2i0TWM= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.0.0/go.mod h1:WysE/OpUgE37tjtmtJd8GXgT8s1euilE5XtUkRNUQ1w= +github.com/aws/aws-sdk-go-v2/credentials v1.0.0/go.mod h1:/SvsiqBf509hG4Bddigr3NB12MIpfHhZapyBurJe8aY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.0/go.mod h1:wpMHDCXvOXZxGCRSidyepa8uJHY4vaBGfY2/+oKU/Bc= +github.com/aws/aws-sdk-go-v2/service/athena v1.0.0/go.mod h1:qY8QFbemf2ceqweXcS6hQqiiIe1z42WqTvHsK2Lb0rE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.0/go.mod h1:3jExOmpbjgPnz2FJaMOfbSk1heTkZ66aD3yNtVhnjvI= +github.com/aws/aws-sdk-go-v2/service/sts v1.0.0/go.mod h1:5f+cELGATgill5Pu3/vK3Ebuigstc+qYEHW5MvGWZO4= +github.com/aws/smithy-go v1.0.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -154,6 +182,7 @@ github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngE github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bradleyfalzon/ghinstallation/v2 v2.0.3/go.mod h1:tlgi+JWCXnKFx/Y4WtnDbZEINo31N5bcvnCoqieefmk= @@ -174,11 +203,8 @@ github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOo github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= @@ -281,6 +307,7 @@ github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kp github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= @@ -293,7 +320,10 @@ github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -325,6 +355,7 @@ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -333,6 +364,7 @@ github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6Uezg github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= @@ -348,6 +380,7 @@ github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaB github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/enescakir/emoji v1.0.0 h1:W+HsNql8swfCQFtioDGDHCHri8nudlK1n5p2rHCJoog= github.com/enescakir/emoji v1.0.0/go.mod h1:Bt1EKuLnKDTYpLALApstIkAjdDrS/8IAgTkKp+WKFD0= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= @@ -358,19 +391,26 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= +github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v0.24.21 h1:9dowP4gQHBe/1sRfYa5PP2snT/7/ZwgRsYkof4zr19c= -github.com/flyteorg/flyteidl v0.24.21/go.mod h1:vHSugApgS3hRITIafzQDU8DZD/W8wFRfFcgaFU35Dww= -github.com/flyteorg/flytestdlib v0.3.13/go.mod h1:Tz8JCECAbX6VWGwFT6cmEQ+RJpZ/6L9pswu3fzWs220= -github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= -github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= -github.com/flyteorg/stow v0.3.1 h1:cBMbWl03Gsy5KoA5mutUYTuYpqtT7Pb8+ANGCLnmFEs= -github.com/flyteorg/stow v0.3.1/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= +github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= +github.com/flyteorg/flyteidl v1.1.0 h1:f8tdMXOuorS/d+4Ut2QarfDbdCOriK0S+EnlQzrwz9E= +github.com/flyteorg/flyteidl v1.1.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= +github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= +github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= +github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= +github.com/flyteorg/flytepropeller v1.1.1/go.mod h1:x7vIuy9vmOPw9JSd+xAijeiHShmuieFZsTT1yLXhR90= +github.com/flyteorg/flytestdlib v1.0.0 h1:gb99ignMsVcNTUmWzArtcIDdkRjyzQQVBkWNOQakiFg= +github.com/flyteorg/flytestdlib v1.0.0/go.mod h1:QSVN5wIM1lM9d60eAEbX7NwweQXW96t5x4jbyftn89c= +github.com/flyteorg/stow v0.3.3 h1:tzeNl8mSZFL3oJDi0ACZj6FAineQAF4qyEp6bXtIdQY= +github.com/flyteorg/stow v0.3.3/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -384,6 +424,8 @@ github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYis github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -396,21 +438,68 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.2.1/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= +github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es= github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew= +github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= @@ -446,6 +535,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -484,8 +574,9 @@ github.com/google/go-github/v42 v42.0.0/go.mod h1:jgg/jvyI0YlDOM1/ps6XYh04HNQ3vK github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -502,6 +593,7 @@ github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -512,8 +604,13 @@ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwuTCM= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -526,7 +623,6 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graymeta/stow v0.2.7/go.mod h1:JAs139Zr29qfsecy7b+h9DRsWXbFbsd7LCrbCDYI84k= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -574,6 +670,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= @@ -582,6 +679,9 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -590,6 +690,7 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -601,8 +702,6 @@ github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfE github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= -github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= @@ -629,28 +728,34 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kubeflow/common v0.4.0/go.mod h1:X15/dRQQoB77wrqrPwVn4GqG2ubgk8xR24A80i61d/4= +github.com/kubeflow/mpi-operator/v2 v2.0.0-20210920181600-c5c0c3ef99ec/go.mod h1:cTBmZKLlrIXBWQ0A9Ik8h0i4zoGhR7ApHwUfrLDbhQc= +github.com/kubeflow/pytorch-operator v0.6.0/go.mod h1:zHblV+yTwVG4PCgKTU2wPfOmQ6TJdfT87lDfHrP1a1Y= +github.com/kubeflow/tf-operator v0.5.3/go.mod h1:EBtz5LQoKaHUl/5fV5vD1qXVNVNyn3TrFaH6eVoQ8SY= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= -github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/manifoldco/promptui v0.8.0 h1:R95mMF+McvXZQ7j1g8ucVZE1gLP3Sv6j9vlF9kyRqQo= -github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -728,13 +833,17 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= +github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= @@ -805,8 +914,9 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -823,8 +933,9 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -834,6 +945,7 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -846,6 +958,8 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -854,6 +968,7 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -883,6 +998,7 @@ github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= @@ -896,11 +1012,13 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -924,13 +1042,16 @@ github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= @@ -960,7 +1081,11 @@ go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -975,28 +1100,42 @@ go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1010,6 +1149,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171 h1:TfdoLivD44QwvssI9Sv1xwa5DcL5XQr4au4sZ2F2NV4= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1034,11 +1175,15 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1048,6 +1193,7 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1071,6 +1217,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -1086,6 +1233,7 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= @@ -1098,8 +1246,10 @@ golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 h1:55H5j7lotzuFCEOKDsMch+fRNUQ9DgtyHOUP31FNqKc= golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 h1:alLDrZkL34Y2bnGHfvC1CYBRBXCXgx8AC2vY4MRtYX4= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1111,6 +1261,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1119,8 +1270,12 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1164,6 +1319,7 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1187,9 +1343,13 @@ golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1198,6 +1358,7 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1219,8 +1380,10 @@ golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1231,14 +1394,17 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1260,8 +1426,10 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -1278,6 +1446,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1285,6 +1454,8 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -1307,8 +1478,9 @@ google.golang.org/api v0.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQW google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.38.0 h1:vDyWk6eup8eQAidaZ31sNWIn8tZEL8qpbtGkBD4ytQo= google.golang.org/api v0.38.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.40.0 h1:uWrpz12dpVPn7cojP82mk02XDgTJLDPc2KbVTxrWb4A= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1362,8 +1534,9 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 h1:uLBY0yHDCj2PMQ98KWDSIDFwn9zK2zh+tgWtbvPPBjI= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c h1:7A9LQhrZmuCPI79/sYSbscFqBp4XFYf6oaIQuV1xji4= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1443,9 +1616,12 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/gorm v1.22.4/go.mod h1:1aeVC+pe9ZmvKZban/gW4QPra7PRoTEssyc922qCAkk= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= @@ -1460,52 +1636,120 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= +k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= +k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= +k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= +k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= +k8s.io/api v0.19.6/go.mod h1:Plxx44Nh4zVblkJrIgxVPgPre1mvng6tXf1Sj3bs0fU= +k8s.io/api v0.19.9/go.mod h1:RcFj+riKQ1fAITdmtA6InI3LVEeKi+9LuvU7GVMeXJI= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= k8s.io/api v0.21.3 h1:cblWILbLO8ar+Fj6xdDGr603HRsf8Wu9E9rngJeprZQ= k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg= +k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= +k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= +k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= +k8s.io/apiextensions-apiserver v0.20.1 h1:ZrXQeslal+6zKM/HjDXLzThlz/vPSxrfK3OqL8txgVQ= +k8s.io/apiextensions-apiserver v0.20.1/go.mod h1:ntnrZV+6a3dB504qwC5PN/Yg9PBiDNt1EVqbW2kORVk= k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= +k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= +k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= +k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= +k8s.io/apimachinery v0.19.6/go.mod h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6Q= +k8s.io/apimachinery v0.19.9/go.mod h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6Q= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= k8s.io/apimachinery v0.21.3 h1:3Ju4nvjCngxxMYby0BimUk+pQHPOQp3eCGChk5kfVII= k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI= +k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= +k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= +k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= +k8s.io/apiserver v0.19.6/go.mod h1:05XquZxCDzQ27ebk7uV2LrFIK4lm5Yt47XkkUvLAoAM= +k8s.io/apiserver v0.19.9/go.mod h1:g6zpD+kcZFlO73pktPWRvL0tUGqj7/KaOowmRk8EpGg= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= +k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= +k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= +k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= +k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= +k8s.io/client-go v0.19.6/go.mod h1:gEiS+efRlXYUEQ9Oz4lmNXlxAl5JZ8y2zbTDGhvXXnk= +k8s.io/client-go v0.19.9/go.mod h1:8GArfSmN7MwTidMGcLGM3QTYa7uekI/B6IOrM0s1XPs= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.2/go.mod h1:kH5brqWqp7HDxUFKoEgiI4v8G1xzbe9giaCenUWJzgE= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= k8s.io/client-go v0.21.3 h1:J9nxZTOmvkInRDCzcSNQmPJbDYN/PjlxXT9Mos3HcLg= k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU= +k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= +k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= +k8s.io/code-generator v0.19.6/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/code-generator v0.19.9/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= +k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= +k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= +k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= +k8s.io/component-base v0.19.6/go.mod h1:8Btsf8J00/fVDa/YFmXjei7gVkcFrlKZXjSeP4SZNJg= +k8s.io/component-base v0.19.9/go.mod h1:x9UmpImvXgVry1s9/hINgLz6iGBYUGvy3Xm7KZh1nnI= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.2/go.mod h1:pzFtCiwe/ASD0iV7ySMu8SYVJjCapNM9bjvk7ptpKh0= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= +k8s.io/sample-controller v0.19.9/go.mod h1:pzC7f1rPpf0+o9rg45Ju8GY83nGARzWABmPblej9v/M= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ= +k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E= +sigs.k8s.io/controller-runtime v0.7.2/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= +sigs.k8s.io/controller-runtime v0.8.2/go.mod h1:U/l+DUopBc1ecfRZ5aviA9JDmGFQKvLf5YkZNx2e0sU= +sigs.k8s.io/controller-tools v0.3.0/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= @@ -1514,3 +1758,4 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +volcano.sh/apis v1.2.0-k8s1.19.6/go.mod h1:UaeJ/s5Hyd+ZhFLc+Kw9YlgM8gRZ/5OzXqHa0yKOoXY= From 096e377e10f507ada36a32771ea71d581851b1a2 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Sat, 4 Jun 2022 22:19:06 +0530 Subject: [PATCH 259/645] Using security context during registration (#328) Signed-off-by: Prafulla Mahindrakar --- flytectl/cmd/register/register_util.go | 8 +++++++- flytectl/cmd/register/register_util_test.go | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index d05aa25d67..922ff211da 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -402,8 +402,14 @@ func hydrateLaunchPlanSpec(configAssumableIamRole string, configK8sServiceAccoun outputLocationPrefix := len(configOutputLocationPrefix) > 0 if assumableIamRole || k8sServiceAcct { lpSpec.AuthRole = &admin.AuthRole{ - AssumableIamRole: configAssumableIamRole, KubernetesServiceAccount: configK8sServiceAccount, + AssumableIamRole: configAssumableIamRole, + } + lpSpec.SecurityContext = &core.SecurityContext{ + RunAs: &core.Identity{ + IamRole: configAssumableIamRole, + K8SServiceAccount: configK8sServiceAccount, + }, } } if outputLocationPrefix { diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 7820913573..7be93359c0 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -347,6 +347,7 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) assert.Nil(t, err) assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole"}, lpSpec.AuthRole) + assert.Equal(t, &core.SecurityContext{RunAs: &core.Identity{IamRole: "iamRole"}}, lpSpec.SecurityContext) }) t.Run("k8sService account override", func(t *testing.T) { registerFilesSetup() @@ -355,6 +356,7 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { err := hydrateLaunchPlanSpec(rconfig.DefaultFilesConfig.AssumableIamRole, rconfig.DefaultFilesConfig.K8sServiceAccount, rconfig.DefaultFilesConfig.OutputLocationPrefix, lpSpec) assert.Nil(t, err) assert.Equal(t, &admin.AuthRole{KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) + assert.Equal(t, &core.SecurityContext{RunAs: &core.Identity{K8SServiceAccount: "k8Account"}}, lpSpec.SecurityContext) }) t.Run("Both k8sService and IamRole", func(t *testing.T) { registerFilesSetup() @@ -365,6 +367,7 @@ func TestHydrateLaunchPlanSpec(t *testing.T) { assert.Nil(t, err) assert.Equal(t, &admin.AuthRole{AssumableIamRole: "iamRole", KubernetesServiceAccount: "k8Account"}, lpSpec.AuthRole) + assert.Equal(t, &core.SecurityContext{RunAs: &core.Identity{IamRole: "iamRole", K8SServiceAccount: "k8Account"}}, lpSpec.SecurityContext) }) t.Run("Output prefix", func(t *testing.T) { registerFilesSetup() From 5b70d88e91b67bef44beb56cca69720a48baa0d8 Mon Sep 17 00:00:00 2001 From: David Przybilla Date: Mon, 6 Jun 2022 17:32:11 +0900 Subject: [PATCH 260/645] Start sandbox logic shared for demo/sandbox cmds #minor (#326) --- .../subcommand/sandbox/sandbox_config.go | 42 +- flytectl/cmd/demo/demo.go | 4 +- flytectl/cmd/demo/start.go | 272 +---------- flytectl/cmd/demo/start_test.go | 425 ----------------- flytectl/cmd/sandbox/sandbox.go | 4 +- flytectl/cmd/sandbox/start.go | 250 +--------- flytectl/cmd/sandbox/start_test.go | 427 ----------------- flytectl/pkg/docker/docker.go | 30 ++ flytectl/pkg/docker/docker_util.go | 10 +- flytectl/pkg/docker/docker_util_test.go | 10 +- .../docker}/imagepullpolicy_enumer.go | 2 +- flytectl/pkg/sandbox/start.go | 308 ++++++++++++ flytectl/pkg/sandbox/start_test.go | 438 ++++++++++++++++++ 13 files changed, 806 insertions(+), 1416 deletions(-) rename flytectl/{cmd/config/subcommand/sandbox => pkg/docker}/imagepullpolicy_enumer.go (99%) create mode 100644 flytectl/pkg/sandbox/start.go create mode 100644 flytectl/pkg/sandbox/start_test.go diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index 7381a398b7..44f76f614c 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -1,34 +1,6 @@ package sandbox -//go:generate enumer -type=ImagePullPolicy -trimprefix=ImagePullPolicy --json -type ImagePullPolicy int - -const ( - ImagePullPolicyAlways ImagePullPolicy = iota - ImagePullPolicyIfNotPresent - ImagePullPolicyNever -) - -// Set implements PFlag's Value interface to attempt to set the value of the flag from string. -func (i *ImagePullPolicy) Set(val string) error { - policy, err := ImagePullPolicyString(val) - if err != nil { - return err - } - - *i = policy - return nil -} - -// Type implements PFlag's Value interface to return type name. -func (i ImagePullPolicy) Type() string { - return "ImagePullPolicy" -} - -//go:generate pflags Config --default-var DefaultConfig --bind-default-var -var ( - DefaultConfig = &Config{} -) +import "github.com/flyteorg/flytectl/pkg/docker" //Config holds configuration flags for sandbox command. type Config struct { @@ -52,12 +24,12 @@ type Config struct { // Optionally it is possible to use local sandbox image // Flytectl will not pull the image from the registry if the local flag passes. It is usually useful while testing your local images without pushing them to a registry. - ImagePullPolicy ImagePullPolicy `json:"imagePullPolicy" pflag:",Optional. Defines the image pull behavior [Always/IfNotPresent/Never]"` + ImagePullPolicy docker.ImagePullPolicy `json:"imagePullPolicy" pflag:",Optional. Defines the image pull behavior [Always/IfNotPresent/Never]"` - ImagePullOptions ImagePullOptions `json:"imagePullOptions" pflag:",Optional. Defines image pull options (e.g. auth)"` + ImagePullOptions docker.ImagePullOptions `json:"imagePullOptions" pflag:",Optional. Defines image pull options (e.g. auth)"` } -type ImagePullOptions struct { - RegistryAuth string `json:"registryAuth" pflag:",The base64 encoded credentials for the registry."` - Platform string `json:"platform" pflag:",Forces a specific platform's image to be pulled.'"` -} +//go:generate pflags Config --default-var DefaultConfig --bind-default-var +var ( + DefaultConfig = &Config{} +) diff --git a/flytectl/cmd/demo/demo.go b/flytectl/cmd/demo/demo.go index 83cb8afe11..30b29c8040 100644 --- a/flytectl/cmd/demo/demo.go +++ b/flytectl/cmd/demo/demo.go @@ -1,7 +1,7 @@ package demo import ( - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" ) @@ -46,7 +46,7 @@ func CreateDemoCommand() *cobra.Command { demoResourcesFuncs := map[string]cmdcore.CommandEntry{ "start": {CmdFunc: startDemoCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: startShort, - Long: startLong, PFlagProvider: sandboxConfig.DefaultConfig}, + Long: startLong, PFlagProvider: sandboxCmdConfig.DefaultConfig}, "teardown": {CmdFunc: teardownDemoCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: teardownShort, Long: teardownLong}, diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index 4cb13d54e3..247111ffca 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -1,33 +1,12 @@ package demo import ( - "bufio" "context" - "fmt" - "io" - "os" - "path/filepath" - "time" - "github.com/flyteorg/flytectl/clierrors" - "github.com/flyteorg/flytectl/pkg/github" + "github.com/flyteorg/flytectl/pkg/sandbox" - "github.com/avast/retry-go" - "github.com/olekukonko/tablewriter" - corev1api "k8s.io/api/core/v1" - corev1 "k8s.io/client-go/kubernetes/typed/core/v1" - - "github.com/docker/docker/api/types/mount" - "github.com/flyteorg/flytectl/pkg/configutil" - "github.com/flyteorg/flytectl/pkg/k8s" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "github.com/enescakir/emoji" - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/docker" - "github.com/flyteorg/flytectl/pkg/util" - "k8s.io/client-go/tools/clientcmd" ) const ( @@ -93,252 +72,11 @@ eg : for passing multiple environment variables Usage ` - k8sEndpoint = "https://127.0.0.1:30086" - flyteNamespace = "flyte" - diskPressureTaint = "node.kubernetes.io/disk-pressure" - taintEffect = "NoSchedule" - demoContextName = "flyte-sandbox" - demoDockerContext = "default" - demoImageName = "cr.flyte.org/flyteorg/flyte-sandbox-lite" + demoContextName = "flyte-sandbox" ) -type ExecResult struct { - StdOut string - StdErr string - ExitCode int -} - -func primeFlytekitPod(ctx context.Context, podService corev1.PodInterface) { - _, err := podService.Create(ctx, &corev1api.Pod{ - ObjectMeta: v1.ObjectMeta{ - Name: "py39-cacher", - }, - Spec: corev1api.PodSpec{ - RestartPolicy: corev1api.RestartPolicyNever, - Containers: []corev1api.Container{ - { - Name: "flytekit", - Image: "ghcr.io/flyteorg/flytekit:py3.9-latest", - Command: []string{"echo"}, - Args: []string{"Flyte"}, - }, - }, - }, - }, v1.CreateOptions{}) - if err != nil { - fmt.Printf("Failed to create primer pod - %s", err) - } -} - func startDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - cli, err := docker.GetDockerClient() - if err != nil { - return err - } - - ghRepo := github.GetGHRepoService() - - reader, err := startDemo(ctx, cli, ghRepo, os.Stdin) - if err != nil { - return err - } - if reader != nil { - docker.WaitForSandbox(reader, docker.SuccessMessage) - } - - if reader != nil { - var k8sClient k8s.K8s - err = retry.Do( - func() error { - k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, k8sEndpoint) - return err - }, - retry.Attempts(10), - ) - if err != nil { - return err - } - if err = updateLocalKubeContext(); err != nil { - return err - } - - if err := watchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { - return err - } - primeFlytekitPod(ctx, k8sClient.CoreV1().Pods("default")) - util.PrintDemoMessage(util.DemoConsolePort) - } - return nil -} - -func updateLocalKubeContext() error { - srcConfigAccess := &clientcmd.PathOptions{ - GlobalFile: docker.Kubeconfig, - LoadingRules: clientcmd.NewDefaultClientConfigLoadingRules(), - } - k8sCtxMgr := k8s.NewK8sContextManager() - return k8sCtxMgr.CopyContext(srcConfigAccess, demoDockerContext, demoContextName) -} - -func startDemo(ctx context.Context, cli docker.Docker, g github.GHRepoService, reader io.Reader) (*bufio.Scanner, error) { - fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) - - if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { - if err.Error() != clierrors.ErrSandboxExists { - return nil, err - } - fmt.Printf("Existing details of your demo cluster") - util.PrintDemoMessage(util.DemoConsolePort) - return nil, nil - } - - if err := util.SetupFlyteDir(); err != nil { - return nil, err - } - - templateValues := configutil.ConfigTemplateSpec{ - Host: "localhost:30081", - Insecure: true, - } - if err := configutil.SetupConfig(configutil.ConfigFile, configutil.GetTemplate(), templateValues); err != nil { - return nil, err - } - - volumes := docker.Volumes - sandboxDefaultConfig := sandboxConfig.DefaultConfig - if vol, err := mountVolume(sandboxDefaultConfig.Source, docker.Source); err != nil { - return nil, err - } else if vol != nil { - volumes = append(volumes, *vol) - } - demoImage := sandboxConfig.DefaultConfig.Image - if len(demoImage) == 0 { - image, version, err := github.GetFullyQualifiedImageName("sha", sandboxConfig.DefaultConfig.Version, demoImageName, sandboxConfig.DefaultConfig.Prerelease, g) - if err != nil { - return nil, err - } - demoImage = image - fmt.Printf("%v Running Flyte %s release\n", emoji.Whale, version) - } - fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, demoImage) - if err := docker.PullDockerImage(ctx, cli, demoImage, sandboxConfig.DefaultConfig.ImagePullPolicy, sandboxConfig.DefaultConfig.ImagePullOptions); err != nil { - return nil, err - } - - fmt.Printf("%v booting flyte-demo container\n", emoji.FactoryWorker) - exposedPorts, portBindings, _ := docker.GetDemoPorts() - ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, - demoImage, sandboxDefaultConfig.Env) - - if err != nil { - fmt.Printf("%v Something went wrong: Failed to start demo container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) - return nil, err - } - - logReader, err := docker.ReadLogs(ctx, cli, ID) - if err != nil { - return nil, err - } - - return logReader, nil -} - -func mountVolume(file, destination string) (*mount.Mount, error) { - if len(file) > 0 { - source, err := filepath.Abs(file) - if err != nil { - return nil, err - } - return &mount.Mount{ - Type: mount.TypeBind, - Source: source, - Target: destination, - }, nil - } - return nil, nil -} - -func watchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface) error { - var data = os.Stdout - table := tablewriter.NewWriter(data) - table.SetHeader([]string{"Service", "Status", "Namespace"}) - table.SetRowLine(true) - - for { - isTaint, err := isNodeTainted(ctx, appsClient) - if err != nil { - return err - } - if isTaint { - return fmt.Errorf("docker sandbox doesn't have sufficient memory available. Please run docker system prune -a --volumes") - } - - pods, err := getFlyteDeployment(ctx, appsClient) - if err != nil { - return err - } - table.ClearRows() - table.SetAutoWrapText(false) - table.SetAutoFormatHeaders(true) - - // Clear os.Stdout - _, _ = data.WriteString("\x1b[3;J\x1b[H\x1b[2J") - - var total, ready int - total = len(pods.Items) - ready = 0 - if total > 0 { - for _, v := range pods.Items { - if isPodReady(v) { - ready++ - } - if len(v.Status.Conditions) > 0 { - table.Append([]string{v.GetName(), string(v.Status.Phase), v.GetNamespace()}) - } - } - table.Render() - if total == ready { - return nil - } - } else { - table.Append([]string{"k8s: This might take a little bit", "Bootstrapping", ""}) - table.Render() - } - - time.Sleep(10 * time.Second) - } -} - -func isPodReady(v corev1api.Pod) bool { - if (v.Status.Phase == corev1api.PodRunning) || (v.Status.Phase == corev1api.PodSucceeded) { - return true - } - return false -} - -func getFlyteDeployment(ctx context.Context, client corev1.CoreV1Interface) (*corev1api.PodList, error) { - pods, err := client.Pods(flyteNamespace).List(ctx, v1.ListOptions{}) - if err != nil { - return nil, err - } - return pods, nil -} + sandboxDefaultConfig := sandboxCmdConfig.DefaultConfig + return sandbox.StartDemoCluster(ctx, args, sandboxDefaultConfig) -func isNodeTainted(ctx context.Context, client corev1.CoreV1Interface) (bool, error) { - nodes, err := client.Nodes().List(ctx, v1.ListOptions{}) - if err != nil { - return false, err - } - match := 0 - for _, node := range nodes.Items { - for _, c := range node.Spec.Taints { - if c.Key == diskPressureTaint && c.Effect == taintEffect { - match++ - } - } - } - if match > 0 { - return true, nil - } - return false, nil } diff --git a/flytectl/cmd/demo/start_test.go b/flytectl/cmd/demo/start_test.go index 11ebacc796..bed5a16777 100644 --- a/flytectl/cmd/demo/start_test.go +++ b/flytectl/cmd/demo/start_test.go @@ -1,426 +1 @@ package demo - -import ( - "context" - "fmt" - "io" - "io/ioutil" - "os" - "strings" - "testing" - - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/docker" - "github.com/flyteorg/flytectl/pkg/docker/mocks" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" - ghMocks "github.com/flyteorg/flytectl/pkg/github/mocks" - "github.com/flyteorg/flytectl/pkg/k8s" - k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" - "github.com/flyteorg/flytectl/pkg/util" - "github.com/flyteorg/flyteidl/clients/go/admin" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/google/go-github/v42/github" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - corev1 "k8s.io/api/core/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - testclient "k8s.io/client-go/kubernetes/fake" -) - -var content = ` -apiVersion: v1 -clusters: -- cluster: - server: https://localhost:8080 - extensions: - - name: client.authentication.k8s.io/exec - extension: - audience: foo - other: bar - name: default -contexts: -- context: - cluster: default - user: default - namespace: bar - name: default -current-context: default -kind: Config -users: -- name: default - user: - exec: - apiVersion: client.authentication.k8s.io/v1alpha1 - args: - - arg-1 - - arg-2 - command: foo-command - provideClusterInfo: true -` - -var ( - githubMock *ghMocks.GHRepoService - ctx context.Context - mockDocker *mocks.Docker -) - -var fakeNode = &corev1.Node{ - Spec: corev1.NodeSpec{ - Taints: []corev1.Taint{}, - }, -} - -var fakePod = corev1.Pod{ - Status: corev1.PodStatus{ - Phase: corev1.PodRunning, - Conditions: []corev1.PodCondition{}, - }, -} - -func demoSetup() { - ctx = context.Background() - mockDocker = &mocks.Docker{} - errCh := make(chan error) - sandboxConfig.DefaultConfig.Version = "v0.19.1" - bodyStatus := make(chan container.ContainerWaitOKBody) - githubMock = &ghMocks.GHRepoService{} - sandboxConfig.DefaultConfig.Image = "dummyimage" - mockDocker.OnContainerCreateMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) -} - -func TestStartDemoFunc(t *testing.T) { - assert.Nil(t, util.SetupFlyteDir()) - assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm)) - assert.Nil(t, ioutil.WriteFile(docker.Kubeconfig, []byte(content), os.ModePerm)) - - fakePod.SetName("flyte") - - t.Run("Successfully run demo cluster", func(t *testing.T) { - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) - assert.Nil(t, err) - }) - t.Run("Successfully exit when demo cluster exist", func(t *testing.T) { - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ - { - ID: docker.FlyteSandboxClusterName, - Names: []string{ - docker.FlyteSandboxClusterName, - }, - }, - }, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - reader, err := startDemo(ctx, mockDocker, githubMock, strings.NewReader("n")) - assert.Nil(t, err) - assert.Nil(t, reader) - }) - t.Run("Successfully run demo cluster with source code", func(t *testing.T) { - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - sandboxConfig.DefaultConfig.Version = "" - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) - assert.Nil(t, err) - }) - t.Run("Successfully run demo cluster with abs path of source code", func(t *testing.T) { - sandboxConfig.DefaultConfig.Source = "../" - sandboxConfig.DefaultConfig.Version = "" - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) - assert.Nil(t, err) - }) - t.Run("Successfully run demo cluster with specific version", func(t *testing.T) { - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - sandboxConfig.DefaultConfig.Image = "" - tag := "v0.15.0" - githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ - TagName: &tag, - }, nil, nil) - - githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) - _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) - assert.Nil(t, err) - }) - t.Run("Failed run demo cluster with wrong version", func(t *testing.T) { - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - sandboxConfig.DefaultConfig.Image = "" - githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("non-existent-tag")) - _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) - assert.NotNil(t, err) - assert.Equal(t, "non-existent-tag", err.Error()) - }) - t.Run("Error in pulling image", func(t *testing.T) { - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("failed to pull")) - sandboxConfig.DefaultConfig.Image = "" - tag := "v0.15.0" - githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ - TagName: &tag, - }, nil, nil) - - githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) - _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) - assert.NotNil(t, err) - assert.Equal(t, "failed to pull", err.Error()) - }) - t.Run("Error in removing existing cluster", func(t *testing.T) { - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ - { - ID: docker.FlyteSandboxClusterName, - Names: []string{ - docker.FlyteSandboxClusterName, - }, - }, - }, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("failed to remove container")) - _, err := startDemo(ctx, mockDocker, githubMock, strings.NewReader("y")) - assert.NotNil(t, err) - assert.Equal(t, "failed to remove container", err.Error()) - }) - t.Run("Error in start container", func(t *testing.T) { - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("failed to run container")) - _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) - assert.NotNil(t, err) - assert.Equal(t, "failed to run container", err.Error()) - }) - t.Run("Error in reading logs", func(t *testing.T) { - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, fmt.Errorf("failed to get container logs")) - _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) - assert.NotNil(t, err) - assert.Equal(t, "failed to get container logs", err.Error()) - }) - t.Run("Error in list container", func(t *testing.T) { - demoSetup() - mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - _, err := startDemo(ctx, mockDocker, githubMock, os.Stdin) - assert.NotNil(t, err) - assert.Equal(t, "failed to list containers", err.Error()) - }) - t.Run("Successfully run demo cluster command", func(t *testing.T) { - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) - client := testclient.NewSimpleClientset() - k8s.Client = client - _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - fakeNode.SetName("master") - _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - demoSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(mock.Anything, mock.Anything, mock.Anything).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - - stringReader := strings.NewReader(docker.SuccessMessage) - reader := ioutil.NopCloser(stringReader) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(reader, nil) - mockK8sContextMgr := &k8sMocks.ContextOps{} - docker.Client = mockDocker - sandboxConfig.DefaultConfig.Source = "" - sandboxConfig.DefaultConfig.Version = "" - k8s.ContextMgr = mockK8sContextMgr - mockK8sContextMgr.OnCopyContextMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = startDemoCluster(ctx, []string{}, cmdCtx) - assert.Nil(t, err) - }) - t.Run("Error in running demo cluster command", func(t *testing.T) { - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) - demoSetup() - docker.Client = mockDocker - mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - err := startDemoCluster(ctx, []string{}, cmdCtx) - assert.NotNil(t, err) - }) -} - -func TestMonitorFlyteDeployment(t *testing.T) { - t.Run("Monitor k8s deployment fail because of storage", func(t *testing.T) { - ctx := context.Background() - client := testclient.NewSimpleClientset() - k8s.Client = client - fakePod.SetName("flyte") - fakePod.SetName("flyte") - - _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - fakeNode.SetName("master") - fakeNode.Spec.Taints = append(fakeNode.Spec.Taints, corev1.Taint{ - Effect: "NoSchedule", - Key: "node.kubernetes.io/disk-pressure", - }) - _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - - err = watchFlyteDeployment(ctx, client.CoreV1()) - assert.NotNil(t, err) - - }) - - t.Run("Monitor k8s deployment success", func(t *testing.T) { - ctx := context.Background() - client := testclient.NewSimpleClientset() - k8s.Client = client - fakePod.SetName("flyte") - fakePod.SetName("flyte") - - _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - fakeNode.SetName("master") - fakeNode.Spec.Taints = []corev1.Taint{} - _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - - err = watchFlyteDeployment(ctx, client.CoreV1()) - assert.Nil(t, err) - - }) - -} - -func TestGetFlyteDeploymentCount(t *testing.T) { - - ctx := context.Background() - client := testclient.NewSimpleClientset() - c, err := getFlyteDeployment(ctx, client.CoreV1()) - assert.Nil(t, err) - assert.Equal(t, 0, len(c.Items)) -} - -func TestGetNodeTaintStatus(t *testing.T) { - t.Run("Check node taint with success", func(t *testing.T) { - ctx := context.Background() - client := testclient.NewSimpleClientset() - fakeNode.SetName("master") - _, err := client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - c, err := isNodeTainted(ctx, client.CoreV1()) - assert.Nil(t, err) - assert.Equal(t, false, c) - }) - t.Run("Check node taint with fail", func(t *testing.T) { - ctx := context.Background() - client := testclient.NewSimpleClientset() - fakeNode.SetName("master") - _, err := client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - node, err := client.CoreV1().Nodes().Get(ctx, "master", v1.GetOptions{}) - if err != nil { - t.Error(err) - } - node.Spec.Taints = append(node.Spec.Taints, corev1.Taint{ - Effect: taintEffect, - Key: diskPressureTaint, - }) - _, err = client.CoreV1().Nodes().Update(ctx, node, v1.UpdateOptions{}) - if err != nil { - t.Error(err) - } - c, err := isNodeTainted(ctx, client.CoreV1()) - assert.Nil(t, err) - assert.Equal(t, true, c) - }) -} diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go index 26e9453f7e..2dc5ab95a4 100644 --- a/flytectl/cmd/sandbox/sandbox.go +++ b/flytectl/cmd/sandbox/sandbox.go @@ -1,7 +1,7 @@ package sandbox import ( - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdcore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" ) @@ -46,7 +46,7 @@ func CreateSandboxCommand() *cobra.Command { sandboxResourcesFuncs := map[string]cmdcore.CommandEntry{ "start": {CmdFunc: startSandboxCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: startShort, - Long: startLong, PFlagProvider: sandboxConfig.DefaultConfig}, + Long: startLong, PFlagProvider: sandboxCmdConfig.DefaultConfig}, "teardown": {CmdFunc: teardownSandboxCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: teardownShort, Long: teardownLong}, diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index af09b1f64d..d409637032 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -1,33 +1,11 @@ package sandbox import ( - "bufio" "context" - "fmt" - "io" - "os" - "path/filepath" - "time" - "github.com/flyteorg/flytectl/clierrors" - "github.com/flyteorg/flytectl/pkg/github" - - "github.com/avast/retry-go" - "github.com/olekukonko/tablewriter" - corev1api "k8s.io/api/core/v1" - corev1 "k8s.io/client-go/kubernetes/typed/core/v1" - - "github.com/docker/docker/api/types/mount" - "github.com/flyteorg/flytectl/pkg/configutil" - "github.com/flyteorg/flytectl/pkg/k8s" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "github.com/enescakir/emoji" - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/docker" - "github.com/flyteorg/flytectl/pkg/util" - "k8s.io/client-go/tools/clientcmd" + "github.com/flyteorg/flytectl/pkg/sandbox" ) const ( @@ -98,228 +76,10 @@ eg : for passing multiple environment variables Usage ` - k8sEndpoint = "https://127.0.0.1:30086" - flyteNamespace = "flyte" - diskPressureTaint = "node.kubernetes.io/disk-pressure" - taintEffect = "NoSchedule" - sandboxContextName = "flyte-sandbox" - sandboxDockerContext = "default" - sandboxImageName = "cr.flyte.org/flyteorg/flyte-sandbox" + sandboxContextName = "flyte-sandbox" ) -type ExecResult struct { - StdOut string - StdErr string - ExitCode int -} - func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - cli, err := docker.GetDockerClient() - if err != nil { - return err - } - - ghRepo := github.GetGHRepoService() - - reader, err := startSandbox(ctx, cli, ghRepo, os.Stdin) - if err != nil { - return err - } - if reader != nil { - docker.WaitForSandbox(reader, docker.SuccessMessage) - } - - if reader != nil { - var k8sClient k8s.K8s - err = retry.Do( - func() error { - k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, k8sEndpoint) - return err - }, - retry.Attempts(10), - ) - if err != nil { - return err - } - if err = updateLocalKubeContext(); err != nil { - return err - } - - if err := watchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { - return err - } - util.PrintSandboxMessage(util.SandBoxConsolePort) - } - return nil -} - -func updateLocalKubeContext() error { - srcConfigAccess := &clientcmd.PathOptions{ - GlobalFile: docker.Kubeconfig, - LoadingRules: clientcmd.NewDefaultClientConfigLoadingRules(), - } - k8sCtxMgr := k8s.NewK8sContextManager() - return k8sCtxMgr.CopyContext(srcConfigAccess, sandboxDockerContext, sandboxContextName) -} - -func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService, reader io.Reader) (*bufio.Scanner, error) { - fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) - - if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { - if err.Error() != clierrors.ErrSandboxExists { - return nil, err - } - fmt.Printf("Existing details of your sandbox") - util.PrintSandboxMessage(util.SandBoxConsolePort) - return nil, nil - } - - if err := util.SetupFlyteDir(); err != nil { - return nil, err - } - - templateValues := configutil.ConfigTemplateSpec{ - Host: "localhost:30081", - Insecure: true, - } - if err := configutil.SetupConfig(configutil.FlytectlConfig, configutil.GetTemplate(), templateValues); err != nil { - return nil, err - } - - volumes := docker.Volumes - sandboxDefaultConfig := sandboxConfig.DefaultConfig - if vol, err := mountVolume(sandboxDefaultConfig.Source, docker.Source); err != nil { - return nil, err - } else if vol != nil { - volumes = append(volumes, *vol) - } - sandboxImage := sandboxConfig.DefaultConfig.Image - if len(sandboxImage) == 0 { - image, version, err := github.GetFullyQualifiedImageName("dind", sandboxConfig.DefaultConfig.Version, sandboxImageName, sandboxConfig.DefaultConfig.Prerelease, g) - if err != nil { - return nil, err - } - sandboxImage = image - fmt.Printf("%v Running Flyte %s release\n", emoji.Whale, version) - } - fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, sandboxImage) - if err := docker.PullDockerImage(ctx, cli, sandboxImage, sandboxConfig.DefaultConfig.ImagePullPolicy, sandboxConfig.DefaultConfig.ImagePullOptions); err != nil { - return nil, err - } - - fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) - exposedPorts, portBindings, _ := docker.GetSandboxPorts() - ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, - sandboxImage, sandboxDefaultConfig.Env) - - if err != nil { - fmt.Printf("%v Something went wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) - return nil, err - } - - logReader, err := docker.ReadLogs(ctx, cli, ID) - if err != nil { - return nil, err - } - - return logReader, nil -} - -func mountVolume(file, destination string) (*mount.Mount, error) { - if len(file) > 0 { - source, err := filepath.Abs(file) - if err != nil { - return nil, err - } - return &mount.Mount{ - Type: mount.TypeBind, - Source: source, - Target: destination, - }, nil - } - return nil, nil -} - -func watchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface) error { - var data = os.Stdout - table := tablewriter.NewWriter(data) - table.SetHeader([]string{"Service", "Status", "Namespace"}) - table.SetRowLine(true) - - for { - isTaint, err := isNodeTainted(ctx, appsClient) - if err != nil { - return err - } - if isTaint { - return fmt.Errorf("docker sandbox doesn't have sufficient memory available. Please run docker system prune -a --volumes") - } - - pods, err := getFlyteDeployment(ctx, appsClient) - if err != nil { - return err - } - table.ClearRows() - table.SetAutoWrapText(false) - table.SetAutoFormatHeaders(true) - - // Clear os.Stdout - _, _ = data.WriteString("\x1b[3;J\x1b[H\x1b[2J") - - var total, ready int - total = len(pods.Items) - ready = 0 - if total != 0 { - for _, v := range pods.Items { - if isPodReady(v) { - ready++ - } - if len(v.Status.Conditions) > 0 { - table.Append([]string{v.GetName(), string(v.Status.Phase), v.GetNamespace()}) - } - } - table.Render() - if total == ready { - break - } - } - - time.Sleep(40 * time.Second) - } - - return nil -} - -func isPodReady(v corev1api.Pod) bool { - if (v.Status.Phase == corev1api.PodRunning) || (v.Status.Phase == corev1api.PodSucceeded) { - return true - } - return false -} - -func getFlyteDeployment(ctx context.Context, client corev1.CoreV1Interface) (*corev1api.PodList, error) { - pods, err := client.Pods(flyteNamespace).List(ctx, v1.ListOptions{}) - if err != nil { - return nil, err - } - return pods, nil -} - -func isNodeTainted(ctx context.Context, client corev1.CoreV1Interface) (bool, error) { - nodes, err := client.Nodes().List(ctx, v1.ListOptions{}) - if err != nil { - return false, err - } - match := 0 - for _, node := range nodes.Items { - for _, c := range node.Spec.Taints { - if c.Key == diskPressureTaint && c.Effect == taintEffect { - match++ - } - } - } - if match > 0 { - return true, nil - } - return false, nil + sandboxDefaultConfig := sandboxCmdConfig.DefaultConfig + return sandbox.StartSandboxCluster(ctx, args, sandboxDefaultConfig) } diff --git a/flytectl/cmd/sandbox/start_test.go b/flytectl/cmd/sandbox/start_test.go index 8e1f28c5c8..3bee1abdbc 100644 --- a/flytectl/cmd/sandbox/start_test.go +++ b/flytectl/cmd/sandbox/start_test.go @@ -1,428 +1 @@ package sandbox - -import ( - "context" - "fmt" - "io" - "io/ioutil" - "os" - "strings" - "testing" - - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/docker" - "github.com/flyteorg/flytectl/pkg/docker/mocks" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" - ghutil "github.com/flyteorg/flytectl/pkg/github" - ghMocks "github.com/flyteorg/flytectl/pkg/github/mocks" - "github.com/flyteorg/flytectl/pkg/k8s" - k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" - "github.com/flyteorg/flytectl/pkg/util" - "github.com/flyteorg/flyteidl/clients/go/admin" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/google/go-github/v42/github" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - corev1 "k8s.io/api/core/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - testclient "k8s.io/client-go/kubernetes/fake" -) - -var content = ` -apiVersion: v1 -clusters: -- cluster: - server: https://localhost:8080 - extensions: - - name: client.authentication.k8s.io/exec - extension: - audience: foo - other: bar - name: default -contexts: -- context: - cluster: default - user: default - namespace: bar - name: default -current-context: default -kind: Config -users: -- name: default - user: - exec: - apiVersion: client.authentication.k8s.io/v1alpha1 - args: - - arg-1 - - arg-2 - command: foo-command - provideClusterInfo: true -` - -var fakeNode = &corev1.Node{ - Spec: corev1.NodeSpec{ - Taints: []corev1.Taint{}, - }, -} - -var fakePod = corev1.Pod{ - Status: corev1.PodStatus{ - Phase: corev1.PodRunning, - Conditions: []corev1.PodCondition{}, - }, -} - -var ( - githubMock *ghMocks.GHRepoService - ctx context.Context - mockDocker *mocks.Docker -) - -func sandboxSetup() { - ctx = context.Background() - mockDocker = &mocks.Docker{} - errCh := make(chan error) - sandboxConfig.DefaultConfig.Version = "v0.19.1" - bodyStatus := make(chan container.ContainerWaitOKBody) - githubMock = &ghMocks.GHRepoService{} - sandboxConfig.DefaultConfig.Image = "dummyimage" - mockDocker.OnContainerCreateMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(container.ContainerCreateCreatedBody{ - ID: "Hello", - }, nil) - - mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) -} - -func TestStartFunc(t *testing.T) { - assert.Nil(t, util.SetupFlyteDir()) - assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm)) - assert.Nil(t, ioutil.WriteFile(docker.Kubeconfig, []byte(content), os.ModePerm)) - - fakePod.SetName("flyte") - - t.Run("Successfully run demo cluster", func(t *testing.T) { - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) - assert.Nil(t, err) - }) - t.Run("Successfully exit when demo cluster exist", func(t *testing.T) { - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ - { - ID: docker.FlyteSandboxClusterName, - Names: []string{ - docker.FlyteSandboxClusterName, - }, - }, - }, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - reader, err := startSandbox(ctx, mockDocker, githubMock, strings.NewReader("n")) - assert.Nil(t, err) - assert.Nil(t, reader) - }) - t.Run("Successfully run demo cluster with source code", func(t *testing.T) { - sandboxConfig.DefaultConfig.Source = f.UserHomeDir() - sandboxConfig.DefaultConfig.Version = "" - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) - assert.Nil(t, err) - }) - t.Run("Successfully run demo cluster with abs path of source code", func(t *testing.T) { - sandboxConfig.DefaultConfig.Source = "../" - sandboxConfig.DefaultConfig.Version = "" - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) - assert.Nil(t, err) - }) - t.Run("Successfully run demo cluster with specific version", func(t *testing.T) { - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - sandboxConfig.DefaultConfig.Image = "" - tag := "v0.15.0" - githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ - TagName: &tag, - }, nil, nil) - - githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) - assert.Nil(t, err) - }) - t.Run("Failed run demo cluster with wrong version", func(t *testing.T) { - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - sandboxConfig.DefaultConfig.Image = "" - githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("non-existent-tag")) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) - assert.NotNil(t, err) - assert.Equal(t, "non-existent-tag", err.Error()) - }) - t.Run("Error in pulling image", func(t *testing.T) { - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("failed to pull")) - sandboxConfig.DefaultConfig.Image = "" - tag := "v0.15.0" - githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ - TagName: &tag, - }, nil, nil) - - githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) - assert.NotNil(t, err) - assert.Equal(t, "failed to pull", err.Error()) - }) - t.Run("Error in removing existing cluster", func(t *testing.T) { - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ - { - ID: docker.FlyteSandboxClusterName, - Names: []string{ - docker.FlyteSandboxClusterName, - }, - }, - }, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("failed to remove container")) - _, err := startSandbox(ctx, mockDocker, githubMock, strings.NewReader("y")) - assert.NotNil(t, err) - assert.Equal(t, "failed to remove container", err.Error()) - }) - t.Run("Error in start container", func(t *testing.T) { - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("failed to run container")) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) - assert.NotNil(t, err) - assert.Equal(t, "failed to run container", err.Error()) - }) - t.Run("Error in reading logs", func(t *testing.T) { - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, fmt.Errorf("failed to get container logs")) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) - assert.NotNil(t, err) - assert.Equal(t, "failed to get container logs", err.Error()) - }) - t.Run("Error in list container", func(t *testing.T) { - sandboxSetup() - mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin) - assert.NotNil(t, err) - assert.Equal(t, "failed to list containers", err.Error()) - }) - t.Run("Successfully run demo cluster command", func(t *testing.T) { - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) - client := testclient.NewSimpleClientset() - k8s.Client = client - _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - fakeNode.SetName("master") - _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - sandboxSetup() - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(mock.Anything, mock.Anything, mock.Anything).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - - stringReader := strings.NewReader(docker.SuccessMessage) - reader := ioutil.NopCloser(stringReader) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(reader, nil) - mockK8sContextMgr := &k8sMocks.ContextOps{} - docker.Client = mockDocker - sandboxConfig.DefaultConfig.Source = "" - sandboxConfig.DefaultConfig.Version = "" - k8s.ContextMgr = mockK8sContextMgr - ghutil.Client = githubMock - mockK8sContextMgr.OnCopyContextMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = startSandboxCluster(ctx, []string{}, cmdCtx) - assert.Nil(t, err) - }) - t.Run("Error in running demo cluster command", func(t *testing.T) { - mockOutStream := new(io.Writer) - cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) - sandboxSetup() - docker.Client = mockDocker - mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: true, - Follow: true, - }).Return(nil, nil) - err := startSandboxCluster(ctx, []string{}, cmdCtx) - assert.NotNil(t, err) - }) -} - -func TestMonitorFlyteDeployment(t *testing.T) { - t.Run("Monitor k8s deployment fail because of storage", func(t *testing.T) { - ctx := context.Background() - client := testclient.NewSimpleClientset() - k8s.Client = client - fakePod.SetName("flyte") - fakePod.SetName("flyte") - - _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - fakeNode.SetName("master") - fakeNode.Spec.Taints = append(fakeNode.Spec.Taints, corev1.Taint{ - Effect: "NoSchedule", - Key: "node.kubernetes.io/disk-pressure", - }) - _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - - err = watchFlyteDeployment(ctx, client.CoreV1()) - assert.NotNil(t, err) - - }) - - t.Run("Monitor k8s deployment success", func(t *testing.T) { - ctx := context.Background() - client := testclient.NewSimpleClientset() - k8s.Client = client - fakePod.SetName("flyte") - fakePod.SetName("flyte") - - _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - fakeNode.SetName("master") - fakeNode.Spec.Taints = []corev1.Taint{} - _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - - err = watchFlyteDeployment(ctx, client.CoreV1()) - assert.Nil(t, err) - - }) - -} - -func TestGetFlyteDeploymentCount(t *testing.T) { - - ctx := context.Background() - client := testclient.NewSimpleClientset() - c, err := getFlyteDeployment(ctx, client.CoreV1()) - assert.Nil(t, err) - assert.Equal(t, 0, len(c.Items)) -} - -func TestGetNodeTaintStatus(t *testing.T) { - t.Run("Check node taint with success", func(t *testing.T) { - ctx := context.Background() - client := testclient.NewSimpleClientset() - fakeNode.SetName("master") - _, err := client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - c, err := isNodeTainted(ctx, client.CoreV1()) - assert.Nil(t, err) - assert.Equal(t, false, c) - }) - t.Run("Check node taint with fail", func(t *testing.T) { - ctx := context.Background() - client := testclient.NewSimpleClientset() - fakeNode.SetName("master") - _, err := client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) - if err != nil { - t.Error(err) - } - node, err := client.CoreV1().Nodes().Get(ctx, "master", v1.GetOptions{}) - if err != nil { - t.Error(err) - } - node.Spec.Taints = append(node.Spec.Taints, corev1.Taint{ - Effect: taintEffect, - Key: diskPressureTaint, - }) - _, err = client.CoreV1().Nodes().Update(ctx, node, v1.UpdateOptions{}) - if err != nil { - t.Error(err) - } - c, err := isNodeTainted(ctx, client.CoreV1()) - assert.Nil(t, err) - assert.Equal(t, true, c) - }) -} diff --git a/flytectl/pkg/docker/docker.go b/flytectl/pkg/docker/docker.go index cb08092b5f..84f9fb3365 100644 --- a/flytectl/pkg/docker/docker.go +++ b/flytectl/pkg/docker/docker.go @@ -30,3 +30,33 @@ type Docker interface { type FlyteDocker struct { *client.Client } + +//go:generate enumer -type=ImagePullPolicy -trimprefix=ImagePullPolicy --json +type ImagePullPolicy int + +const ( + ImagePullPolicyAlways ImagePullPolicy = iota + ImagePullPolicyIfNotPresent + ImagePullPolicyNever +) + +// Set implements PFlag's Value interface to attempt to set the value of the flag from string. +func (i *ImagePullPolicy) Set(val string) error { + policy, err := ImagePullPolicyString(val) + if err != nil { + return err + } + + *i = policy + return nil +} + +// Type implements PFlag's Value interface to return type name. +func (i ImagePullPolicy) Type() string { + return "ImagePullPolicy" +} + +type ImagePullOptions struct { + RegistryAuth string `json:"registryAuth" pflag:",The base64 encoded credentials for the registry."` + Platform string `json:"platform" pflag:",Forces a specific platform's image to be pulled.'"` +} diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 8c9d47348f..de7adda9b9 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -12,8 +12,6 @@ import ( "github.com/docker/docker/client" "github.com/enescakir/emoji" - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" - "github.com/flyteorg/flytectl/clierrors" "github.com/docker/docker/api/types" @@ -128,11 +126,11 @@ func GetDemoPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, erro } // PullDockerImage will Pull docker image -func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy sandboxConfig.ImagePullPolicy, - imagePullOptions sandboxConfig.ImagePullOptions) error { +func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy ImagePullPolicy, + imagePullOptions ImagePullOptions) error { - if pullPolicy == sandboxConfig.ImagePullPolicyAlways || pullPolicy == sandboxConfig.ImagePullPolicyIfNotPresent { - if pullPolicy == sandboxConfig.ImagePullPolicyIfNotPresent { + if pullPolicy == ImagePullPolicyAlways || pullPolicy == ImagePullPolicyIfNotPresent { + if pullPolicy == ImagePullPolicyIfNotPresent { imageSummary, err := cli.ImageList(ctx, types.ImageListOptions{}) if err != nil { return err diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 37d91f9085..8524443641 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -8,8 +8,6 @@ import ( "strings" "testing" - sandboxConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/docker/docker/api/types/container" @@ -106,7 +104,7 @@ func TestPullDockerImage(t *testing.T) { ctx := context.Background() // Verify the attributes mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - err := PullDockerImage(ctx, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways, sandboxConfig.ImagePullOptions{}) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyAlways, ImagePullOptions{}) assert.Nil(t, err) }) @@ -116,7 +114,7 @@ func TestPullDockerImage(t *testing.T) { ctx := context.Background() // Verify the attributes mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) - err := PullDockerImage(ctx, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyAlways, sandboxConfig.ImagePullOptions{}) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyAlways, ImagePullOptions{}) assert.NotNil(t, err) }) @@ -127,7 +125,7 @@ func TestPullDockerImage(t *testing.T) { // Verify the attributes mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) mockDocker.OnImageListMatch(ctx, types.ImageListOptions{}).Return([]types.ImageSummary{}, nil) - err := PullDockerImage(ctx, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyIfNotPresent, sandboxConfig.ImagePullOptions{}) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyIfNotPresent, ImagePullOptions{}) assert.Nil(t, err) }) @@ -135,7 +133,7 @@ func TestPullDockerImage(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} ctx := context.Background() - err := PullDockerImage(ctx, mockDocker, "nginx:latest", sandboxConfig.ImagePullPolicyNever, sandboxConfig.ImagePullOptions{}) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyNever, ImagePullOptions{}) assert.Nil(t, err) }) } diff --git a/flytectl/cmd/config/subcommand/sandbox/imagepullpolicy_enumer.go b/flytectl/pkg/docker/imagepullpolicy_enumer.go similarity index 99% rename from flytectl/cmd/config/subcommand/sandbox/imagepullpolicy_enumer.go rename to flytectl/pkg/docker/imagepullpolicy_enumer.go index 8416741819..a5f09b9ee8 100644 --- a/flytectl/cmd/config/subcommand/sandbox/imagepullpolicy_enumer.go +++ b/flytectl/pkg/docker/imagepullpolicy_enumer.go @@ -1,7 +1,7 @@ // Code generated by "enumer -type=ImagePullPolicy -trimprefix=ImagePullPolicy --json"; DO NOT EDIT. // -package sandbox +package docker import ( "encoding/json" diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go new file mode 100644 index 0000000000..e934ab5372 --- /dev/null +++ b/flytectl/pkg/sandbox/start.go @@ -0,0 +1,308 @@ +package sandbox + +import ( + "bufio" + "context" + "fmt" + "io" + "os" + "path/filepath" + "time" + + "github.com/avast/retry-go" + "github.com/docker/docker/api/types/mount" + "github.com/docker/go-connections/nat" + "github.com/enescakir/emoji" + "github.com/flyteorg/flytectl/clierrors" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/github" + "github.com/flyteorg/flytectl/pkg/k8s" + "github.com/flyteorg/flytectl/pkg/util" + "github.com/kataras/tablewriter" + corev1api "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/client-go/kubernetes/typed/core/v1" + "k8s.io/client-go/tools/clientcmd" +) + +const ( + flyteNamespace = "flyte" + diskPressureTaint = "node.kubernetes.io/disk-pressure" + taintEffect = "NoSchedule" + sandboxContextName = "flyte-sandbox" + sandboxDockerContext = "default" + k8sEndpoint = "https://127.0.0.1:30086" + sandboxImageName = "cr.flyte.org/flyteorg/flyte-sandbox" + demoImageName = "cr.flyte.org/flyteorg/flyte-sandbox-lite" +) + +func isNodeTainted(ctx context.Context, client corev1.CoreV1Interface) (bool, error) { + nodes, err := client.Nodes().List(ctx, v1.ListOptions{}) + if err != nil { + return false, err + } + match := 0 + for _, node := range nodes.Items { + for _, c := range node.Spec.Taints { + if c.Key == diskPressureTaint && c.Effect == taintEffect { + match++ + } + } + } + if match > 0 { + return true, nil + } + return false, nil +} + +func isPodReady(v corev1api.Pod) bool { + if (v.Status.Phase == corev1api.PodRunning) || (v.Status.Phase == corev1api.PodSucceeded) { + return true + } + return false +} + +func getFlyteDeployment(ctx context.Context, client corev1.CoreV1Interface) (*corev1api.PodList, error) { + pods, err := client.Pods(flyteNamespace).List(ctx, v1.ListOptions{}) + if err != nil { + return nil, err + } + return pods, nil +} + +func WatchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface) error { + var data = os.Stdout + table := tablewriter.NewWriter(data) + table.SetHeader([]string{"Service", "Status", "Namespace"}) + table.SetRowLine(true) + + for { + isTaint, err := isNodeTainted(ctx, appsClient) + if err != nil { + return err + } + if isTaint { + return fmt.Errorf("docker sandbox doesn't have sufficient memory available. Please run docker system prune -a --volumes") + } + + pods, err := getFlyteDeployment(ctx, appsClient) + if err != nil { + return err + } + table.ClearRows() + table.SetAutoWrapText(false) + table.SetAutoFormatHeaders(true) + + // Clear os.Stdout + _, _ = data.WriteString("\x1b[3;J\x1b[H\x1b[2J") + + var total, ready int + total = len(pods.Items) + ready = 0 + if total != 0 { + for _, v := range pods.Items { + if isPodReady(v) { + ready++ + } + if len(v.Status.Conditions) > 0 { + table.Append([]string{v.GetName(), string(v.Status.Phase), v.GetNamespace()}) + } + } + table.Render() + if total == ready { + break + } + } else { + table.Append([]string{"k8s: This might take a little bit", "Bootstrapping", ""}) + table.Render() + } + + time.Sleep(40 * time.Second) + } + + return nil +} + +func MountVolume(file, destination string) (*mount.Mount, error) { + if len(file) > 0 { + source, err := filepath.Abs(file) + if err != nil { + return nil, err + } + return &mount.Mount{ + Type: mount.TypeBind, + Source: source, + Target: destination, + }, nil + } + return nil, nil +} + +func UpdateLocalKubeContext(dockerCtx string, contextName string) error { + srcConfigAccess := &clientcmd.PathOptions{ + GlobalFile: docker.Kubeconfig, + LoadingRules: clientcmd.NewDefaultClientConfigLoadingRules(), + } + k8sCtxMgr := k8s.NewK8sContextManager() + return k8sCtxMgr.CopyContext(srcConfigAccess, dockerCtx, contextName) +} + +func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService, reader io.Reader, sandboxConfig *sandboxCmdConfig.Config, defaultImageName string, defaultImagePrefix string, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, consolePort int) (*bufio.Scanner, error) { + fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) + + if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { + if err.Error() != clierrors.ErrSandboxExists { + return nil, err + } + fmt.Printf("Existing details of your sandbox") + util.PrintSandboxMessage(consolePort) + return nil, nil + } + + if err := util.SetupFlyteDir(); err != nil { + return nil, err + } + + templateValues := configutil.ConfigTemplateSpec{ + Host: "localhost:30081", + Insecure: true, + } + if err := configutil.SetupConfig(configutil.FlytectlConfig, configutil.GetTemplate(), templateValues); err != nil { + return nil, err + } + + volumes := docker.Volumes + if vol, err := MountVolume(sandboxConfig.Source, docker.Source); err != nil { + return nil, err + } else if vol != nil { + volumes = append(volumes, *vol) + } + sandboxImage := sandboxConfig.Image + if len(sandboxImage) == 0 { + image, version, err := github.GetFullyQualifiedImageName(defaultImagePrefix, sandboxConfig.Version, defaultImageName, sandboxConfig.Prerelease, g) + if err != nil { + return nil, err + } + sandboxImage = image + fmt.Printf("%s Fully Qualified image\n", image) + fmt.Printf("%v Running Flyte %s release\n", emoji.Whale, version) + } + fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, sandboxImage) + if err := docker.PullDockerImage(ctx, cli, sandboxImage, sandboxConfig.ImagePullPolicy, sandboxConfig.ImagePullOptions); err != nil { + return nil, err + } + + fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) + ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, + sandboxImage, sandboxConfig.Env) + + if err != nil { + fmt.Printf("%v Something went wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) + return nil, err + } + + logReader, err := docker.ReadLogs(ctx, cli, ID) + if err != nil { + return nil, err + } + + return logReader, nil +} + +func primeFlytekitPod(ctx context.Context, podService corev1.PodInterface) { + _, err := podService.Create(ctx, &corev1api.Pod{ + ObjectMeta: v1.ObjectMeta{ + Name: "py39-cacher", + }, + Spec: corev1api.PodSpec{ + RestartPolicy: corev1api.RestartPolicyNever, + Containers: []corev1api.Container{ + { + + Name: "flytekit", + Image: "ghcr.io/flyteorg/flytekit:py3.9-latest", + Command: []string{"echo"}, + Args: []string{"Flyte"}, + }, + }, + }, + }, v1.CreateOptions{}) + if err != nil { + fmt.Printf("Failed to create primer pod - %s", err) + } +} + +func StartCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config, primePod bool, defaultImageName string, defaultImagePrefix string, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, consolePort int) error { + cli, err := docker.GetDockerClient() + if err != nil { + return err + } + + ghRepo := github.GetGHRepoService() + + reader, err := startSandbox(ctx, cli, ghRepo, os.Stdin, sandboxConfig, defaultImageName, defaultImagePrefix, exposedPorts, portBindings, consolePort) + if err != nil { + return err + } + if reader != nil { + docker.WaitForSandbox(reader, docker.SuccessMessage) + } + + if reader != nil { + var k8sClient k8s.K8s + err = retry.Do( + func() error { + k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, k8sEndpoint) + return err + }, + retry.Attempts(10), + ) + if err != nil { + return err + } + if err = UpdateLocalKubeContext(sandboxDockerContext, sandboxContextName); err != nil { + return err + } + + if err := WatchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { + return err + } + if primePod { + primeFlytekitPod(ctx, k8sClient.CoreV1().Pods("default")) + } + + } + return nil +} + +func StartDemoCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config) error { + primePod := true + sandboxImagePrefix := "sha" + exposedPorts, portBindings, err := docker.GetDemoPorts() + if err != nil { + return err + } + err = StartCluster(ctx, args, sandboxConfig, primePod, demoImageName, sandboxImagePrefix, exposedPorts, portBindings, util.DemoConsolePort) + if err != nil { + return err + } + util.PrintDemoMessage(util.DemoConsolePort) + return nil +} + +func StartSandboxCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config) error { + primePod := false + demoImagePrefix := "dind" + exposedPorts, portBindings, err := docker.GetSandboxPorts() + if err != nil { + return err + } + err = StartCluster(ctx, args, sandboxConfig, primePod, sandboxImageName, demoImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + if err != nil { + return err + } + util.PrintSandboxMessage(util.SandBoxConsolePort) + return nil +} diff --git a/flytectl/pkg/sandbox/start_test.go b/flytectl/pkg/sandbox/start_test.go new file mode 100644 index 0000000000..f4d46b2321 --- /dev/null +++ b/flytectl/pkg/sandbox/start_test.go @@ -0,0 +1,438 @@ +package sandbox + +import ( + "context" + "fmt" + "io/ioutil" + "os" + "strings" + "testing" + + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + f "github.com/flyteorg/flytectl/pkg/filesystemutils" + ghutil "github.com/flyteorg/flytectl/pkg/github" + ghMocks "github.com/flyteorg/flytectl/pkg/github/mocks" + "github.com/flyteorg/flytectl/pkg/k8s" + k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" + "github.com/flyteorg/flytectl/pkg/util" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" + "github.com/google/go-github/v42/github" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + testclient "k8s.io/client-go/kubernetes/fake" +) + +var content = ` +apiVersion: v1 +clusters: +- cluster: + server: https://localhost:8080 + extensions: + - name: client.authentication.k8s.io/exec + extension: + audience: foo + other: bar + name: default +contexts: +- context: + cluster: default + user: default + namespace: bar + name: default +current-context: default +kind: Config +users: +- name: default + user: + exec: + apiVersion: client.authentication.k8s.io/v1alpha1 + args: + - arg-1 + - arg-2 + command: foo-command + provideClusterInfo: true +` + +var fakeNode = &corev1.Node{ + Spec: corev1.NodeSpec{ + Taints: []corev1.Taint{}, + }, +} + +var fakePod = corev1.Pod{ + Status: corev1.PodStatus{ + Phase: corev1.PodRunning, + Conditions: []corev1.PodCondition{}, + }, +} + +var ( + githubMock *ghMocks.GHRepoService + ctx context.Context + mockDocker *mocks.Docker +) + +func sandboxSetup() { + ctx = context.Background() + mockDocker = &mocks.Docker{} + errCh := make(chan error) + sandboxCmdConfig.DefaultConfig.Version = "v0.19.1" + bodyStatus := make(chan container.ContainerWaitOKBody) + githubMock = &ghMocks.GHRepoService{} + sandboxCmdConfig.DefaultConfig.Image = "dummyimage" + mockDocker.OnContainerCreateMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(container.ContainerCreateCreatedBody{ + ID: "Hello", + }, nil) + + mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) +} + +func TestStartFunc(t *testing.T) { + defaultImagePrefix := "dind" + exposedPorts, portBindings, _ := docker.GetSandboxPorts() + config := sandboxCmdConfig.DefaultConfig + config.Image = "dummyimage" + config.ImagePullOptions = docker.ImagePullOptions{ + RegistryAuth: "", + Platform: "", + } + assert.Nil(t, util.SetupFlyteDir()) + assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm)) + assert.Nil(t, ioutil.WriteFile(docker.Kubeconfig, []byte(content), os.ModePerm)) + + fakePod.SetName("flyte") + + t.Run("Successfully run demo cluster", func(t *testing.T) { + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.Nil(t, err) + }) + t.Run("Successfully exit when demo cluster exist", func(t *testing.T) { + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + reader, err := startSandbox(ctx, mockDocker, githubMock, strings.NewReader("n"), config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.Nil(t, err) + assert.Nil(t, reader) + }) + t.Run("Successfully run demo cluster with source code", func(t *testing.T) { + sandboxCmdConfig.DefaultConfig.Source = f.UserHomeDir() + sandboxCmdConfig.DefaultConfig.Version = "" + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.Nil(t, err) + }) + t.Run("Successfully run demo cluster with abs path of source code", func(t *testing.T) { + sandboxCmdConfig.DefaultConfig.Source = "../" + sandboxCmdConfig.DefaultConfig.Version = "" + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.Nil(t, err) + }) + t.Run("Successfully run demo cluster with specific version", func(t *testing.T) { + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + sandboxCmdConfig.DefaultConfig.Image = "" + tag := "v0.15.0" + githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + }, nil, nil) + + githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.Nil(t, err) + }) + t.Run("Failed run demo cluster with wrong version", func(t *testing.T) { + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + sandboxCmdConfig.DefaultConfig.Image = "" + githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("non-existent-tag")) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.NotNil(t, err) + assert.Equal(t, "non-existent-tag", err.Error()) + }) + t.Run("Error in pulling image", func(t *testing.T) { + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("failed to pull")) + sandboxCmdConfig.DefaultConfig.Image = "" + tag := "v0.15.0" + githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ + TagName: &tag, + }, nil, nil) + + githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.NotNil(t, err) + assert.Equal(t, "failed to pull", err.Error()) + }) + t.Run("Error in removing existing cluster", func(t *testing.T) { + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("failed to remove container")) + _, err := startSandbox(ctx, mockDocker, githubMock, strings.NewReader("y"), sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.NotNil(t, err) + assert.Equal(t, "failed to remove container", err.Error()) + }) + t.Run("Error in start container", func(t *testing.T) { + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("failed to run container")) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.NotNil(t, err) + assert.Equal(t, "failed to run container", err.Error()) + }) + t.Run("Error in reading logs", func(t *testing.T) { + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, fmt.Errorf("failed to get container logs")) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.NotNil(t, err) + assert.Equal(t, "failed to get container logs", err.Error()) + }) + t.Run("Error in list container", func(t *testing.T) { + sandboxSetup() + mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + assert.NotNil(t, err) + assert.Equal(t, "failed to list containers", err.Error()) + }) + t.Run("Successfully run demo cluster command", func(t *testing.T) { + // mockOutStream := new(io.Writer) + //cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) + client := testclient.NewSimpleClientset() + k8s.Client = client + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + fakeNode.SetName("master") + _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + sandboxSetup() + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + mockDocker.OnImagePullMatch(mock.Anything, mock.Anything, mock.Anything).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + + stringReader := strings.NewReader(docker.SuccessMessage) + reader := ioutil.NopCloser(stringReader) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(reader, nil) + mockK8sContextMgr := &k8sMocks.ContextOps{} + docker.Client = mockDocker + sandboxCmdConfig.DefaultConfig.Source = "" + sandboxCmdConfig.DefaultConfig.Version = "" + k8s.ContextMgr = mockK8sContextMgr + ghutil.Client = githubMock + mockK8sContextMgr.OnCopyContextMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) + err = StartSandboxCluster(context.Background(), []string{}, config) + assert.Nil(t, err) + err = StartDemoCluster(context.Background(), []string{}, config) + assert.Nil(t, err) + }) + t.Run("Error in running demo cluster command", func(t *testing.T) { + //mockOutStream := new(io.Writer) + //cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) + sandboxSetup() + docker.Client = mockDocker + mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) + mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: true, + Follow: true, + }).Return(nil, nil) + err := StartSandboxCluster(context.Background(), []string{}, config) + assert.NotNil(t, err) + err = StartDemoCluster(context.Background(), []string{}, config) + assert.NotNil(t, err) + }) +} + +func TestMonitorFlyteDeployment(t *testing.T) { + t.Run("Monitor k8s deployment fail because of storage", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + k8s.Client = client + fakePod.SetName("flyte") + fakePod.SetName("flyte") + + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + fakeNode.SetName("master") + fakeNode.Spec.Taints = append(fakeNode.Spec.Taints, corev1.Taint{ + Effect: "NoSchedule", + Key: "node.kubernetes.io/disk-pressure", + }) + _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + + err = WatchFlyteDeployment(ctx, client.CoreV1()) + assert.NotNil(t, err) + + }) + + t.Run("Monitor k8s deployment success", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + k8s.Client = client + fakePod.SetName("flyte") + fakePod.SetName("flyte") + + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + fakeNode.SetName("master") + fakeNode.Spec.Taints = []corev1.Taint{} + _, err = client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + + err = WatchFlyteDeployment(ctx, client.CoreV1()) + assert.Nil(t, err) + + }) + +} + +func TestGetFlyteDeploymentCount(t *testing.T) { + + ctx := context.Background() + client := testclient.NewSimpleClientset() + c, err := getFlyteDeployment(ctx, client.CoreV1()) + assert.Nil(t, err) + assert.Equal(t, 0, len(c.Items)) +} + +func TestGetNodeTaintStatus(t *testing.T) { + t.Run("Check node taint with success", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + fakeNode.SetName("master") + _, err := client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + c, err := isNodeTainted(ctx, client.CoreV1()) + assert.Nil(t, err) + assert.Equal(t, false, c) + }) + t.Run("Check node taint with fail", func(t *testing.T) { + ctx := context.Background() + client := testclient.NewSimpleClientset() + fakeNode.SetName("master") + _, err := client.CoreV1().Nodes().Create(ctx, fakeNode, v1.CreateOptions{}) + if err != nil { + t.Error(err) + } + node, err := client.CoreV1().Nodes().Get(ctx, "master", v1.GetOptions{}) + if err != nil { + t.Error(err) + } + node.Spec.Taints = append(node.Spec.Taints, corev1.Taint{ + Effect: taintEffect, + Key: diskPressureTaint, + }) + _, err = client.CoreV1().Nodes().Update(ctx, node, v1.UpdateOptions{}) + if err != nil { + t.Error(err) + } + c, err := isNodeTainted(ctx, client.CoreV1()) + assert.Nil(t, err) + assert.Equal(t, true, c) + }) +} From 4d78b8e93b743fe31649f3d409c2aa4cd4070bd7 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Wed, 15 Jun 2022 20:42:34 +0530 Subject: [PATCH 261/645] add the missing exports for demo (#330) Signed-off-by: Prafulla Mahindrakar --- flytectl/pkg/sandbox/start.go | 2 +- flytectl/pkg/util/util.go | 6 ------ flytectl/pkg/util/util_test.go | 6 ------ 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index e934ab5372..012f104b41 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -288,7 +288,7 @@ func StartDemoCluster(ctx context.Context, args []string, sandboxConfig *sandbox if err != nil { return err } - util.PrintDemoMessage(util.DemoConsolePort) + util.PrintSandboxMessage(util.DemoConsolePort) return nil } diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index 091ea21707..5fc54438ec 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -65,12 +65,6 @@ func PrintSandboxMessage(flyteConsolePort int) { fmt.Printf("export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) } -// PrintDemoMessage will print demo success message -func PrintDemoMessage(flyteConsolePort int) { - successMsg := fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessage, flyteConsolePort) - fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, successMsg, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) -} - // SendRequest will create request and return the response func SendRequest(method, url string, option io.Reader) (*http.Response, error) { client := &http.Client{} diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index ebf67a902d..718a244d9c 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -29,12 +29,6 @@ func TestPrintSandboxMessage(t *testing.T) { }) } -func TestPrintDemoMessage(t *testing.T) { - t.Run("Print Demo Message", func(t *testing.T) { - PrintDemoMessage(DemoConsolePort) - }) -} - func TestSendRequest(t *testing.T) { t.Run("Successful get request", func(t *testing.T) { response, err := SendRequest("GET", "https://github.com", nil) From 3e9525f6b8659bfee99f5356ef25300270c26a29 Mon Sep 17 00:00:00 2001 From: SmritiSatyanV <94349093+SmritiSatyanV@users.noreply.github.com> Date: Mon, 20 Jun 2022 15:50:50 +0530 Subject: [PATCH 262/645] Add commands to fetch active and archived launchplans (#331) Issue: https://github.com/flyteorg/flyte/issues/2620 Slack conversation: https://flyte-org.slack.com/archives/CP2HDHKE1/p1655433353538459 * Add commands to fetch active and archived launchplans * Removed 'with filters' * Update based on comments Signed-off-by: SmritiSatyanV --- flytectl/cmd/get/launch_plan.go | 10 ++ flytectl/docs/source/contribute.rst | 1 + flytectl/docs/source/gen/flytectl.rst | 7 +- flytectl/docs/source/gen/flytectl_compile.rst | 104 ++++++++++++++++++ .../docs/source/gen/flytectl_completion.rst | 6 +- flytectl/docs/source/gen/flytectl_config.rst | 6 +- .../source/gen/flytectl_config_discover.rst | 6 +- .../docs/source/gen/flytectl_config_docs.rst | 6 +- .../docs/source/gen/flytectl_config_init.rst | 6 +- .../source/gen/flytectl_config_validate.rst | 6 +- flytectl/docs/source/gen/flytectl_create.rst | 6 +- .../source/gen/flytectl_create_execution.rst | 6 +- .../source/gen/flytectl_create_project.rst | 6 +- flytectl/docs/source/gen/flytectl_delete.rst | 6 +- ...ectl_delete_cluster-resource-attribute.rst | 6 +- ...lytectl_delete_execution-cluster-label.rst | 6 +- ...tectl_delete_execution-queue-attribute.rst | 6 +- .../source/gen/flytectl_delete_execution.rst | 6 +- .../gen/flytectl_delete_plugin-override.rst | 6 +- ...lytectl_delete_task-resource-attribute.rst | 6 +- ...tectl_delete_workflow-execution-config.rst | 6 +- flytectl/docs/source/gen/flytectl_demo.rst | 6 +- .../docs/source/gen/flytectl_demo_exec.rst | 6 +- .../docs/source/gen/flytectl_demo_start.rst | 6 +- .../docs/source/gen/flytectl_demo_status.rst | 6 +- .../source/gen/flytectl_demo_teardown.rst | 6 +- flytectl/docs/source/gen/flytectl_get.rst | 6 +- ...lytectl_get_cluster-resource-attribute.rst | 6 +- .../flytectl_get_execution-cluster-label.rst | 6 +- ...flytectl_get_execution-queue-attribute.rst | 6 +- .../source/gen/flytectl_get_execution.rst | 6 +- .../source/gen/flytectl_get_launchplan.rst | 16 ++- .../gen/flytectl_get_plugin-override.rst | 6 +- .../docs/source/gen/flytectl_get_project.rst | 6 +- .../flytectl_get_task-resource-attribute.rst | 6 +- .../docs/source/gen/flytectl_get_task.rst | 6 +- ...flytectl_get_workflow-execution-config.rst | 6 +- .../docs/source/gen/flytectl_get_workflow.rst | 6 +- .../docs/source/gen/flytectl_register.rst | 6 +- .../source/gen/flytectl_register_examples.rst | 6 +- .../source/gen/flytectl_register_files.rst | 6 +- flytectl/docs/source/gen/flytectl_sandbox.rst | 6 +- .../docs/source/gen/flytectl_sandbox_exec.rst | 6 +- .../source/gen/flytectl_sandbox_start.rst | 6 +- .../source/gen/flytectl_sandbox_status.rst | 6 +- .../source/gen/flytectl_sandbox_teardown.rst | 6 +- flytectl/docs/source/gen/flytectl_update.rst | 6 +- ...ectl_update_cluster-resource-attribute.rst | 6 +- ...lytectl_update_execution-cluster-label.rst | 6 +- ...tectl_update_execution-queue-attribute.rst | 6 +- .../source/gen/flytectl_update_execution.rst | 6 +- .../gen/flytectl_update_launchplan-meta.rst | 6 +- .../source/gen/flytectl_update_launchplan.rst | 6 +- .../gen/flytectl_update_plugin-override.rst | 6 +- .../source/gen/flytectl_update_project.rst | 6 +- .../source/gen/flytectl_update_task-meta.rst | 6 +- ...lytectl_update_task-resource-attribute.rst | 6 +- ...tectl_update_workflow-execution-config.rst | 6 +- .../gen/flytectl_update_workflow-meta.rst | 6 +- flytectl/docs/source/gen/flytectl_upgrade.rst | 6 +- flytectl/docs/source/gen/flytectl_version.rst | 6 +- flytectl/docs/source/verbs.rst | 1 + 62 files changed, 301 insertions(+), 174 deletions(-) create mode 100644 flytectl/docs/source/gen/flytectl_compile.rst diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index 65071c2f7c..c9c1d053de 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -55,6 +55,16 @@ Retrieve all the launch plans with filters: flytectl get launchplan -p flytesnacks -d development --filter.fieldSelector="name=core.basic.lp.go_greet" +Retrieve all active launch plans: +:: + + flytectl get launchplan -p flytesnacks -d development -o yaml --filter.fieldSelector "state=1" + +Retrieve all archived launch plans: +:: + + flytectl get launchplan -p flytesnacks -d development -o yaml --filter.fieldSelector "state=0" + Retrieve launch plans entity search across all versions with filters: :: diff --git a/flytectl/docs/source/contribute.rst b/flytectl/docs/source/contribute.rst index 9859618635..f5bea5d584 100644 --- a/flytectl/docs/source/contribute.rst +++ b/flytectl/docs/source/contribute.rst @@ -67,6 +67,7 @@ To update the documentation, follow these steps: * - ``version`` - ``flytectl version ...`` - Fetches Flytectl version + Find all the Flytectl commands :ref:`here `. * Run appropriate tests to view the changes by running ``go test ./... -race -coverprofile=coverage.txt -covermode=atomic -v`` in the root directory. diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 06511bf337..302570ce23 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -51,7 +51,7 @@ Options --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. -h, --help help for flytectl --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -68,13 +68,14 @@ Options --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ +* :doc:`flytectl_compile` - Validate flyte packages without registration needed. * :doc:`flytectl_completion` - Generates completion script. * :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. * :doc:`flytectl_create` - Creates various Flyte resources such as tasks, workflows, launch plans, executions, and projects. diff --git a/flytectl/docs/source/gen/flytectl_compile.rst b/flytectl/docs/source/gen/flytectl_compile.rst new file mode 100644 index 0000000000..8abba58378 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_compile.rst @@ -0,0 +1,104 @@ +.. _flytectl_compile: + +flytectl compile +---------------- + +Validate flyte packages without registration needed. + +Synopsis +~~~~~~~~ + + + +Validate workflows by compiling flyte's serialized protobuf files (task, workflows and launch plans). This is useful for testing workflows and tasks without neededing to talk with a flyte cluster. + +:: + + flytectl compile --file my-flyte-package.tgz + +:: + + flytectl compile --file /home/user/dags/my-flyte-package.tgz + +.. note:: + Input file is a path to a tgz. This file is generated by either pyflyte or jflyte. tgz file contains protobuf files describing workflows, tasks and launch plans. + + + +:: + + flytectl compile [flags] + +Options +~~~~~~~ + +:: + + --file string Path to a flyte package file. Flyte packages are tgz files generated by pyflyte or jflyte. + -h, --help help for compile + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string (default "5m0s") + --admin.pkceConfig.timeout string (default "15s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl` - Flytectl CLI tool + diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index f6529fbf6e..9453d90396 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -123,7 +123,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -140,8 +140,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 493ab33653..cdc118c07c 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -59,7 +59,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -76,8 +76,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index fefd54f7ea..564cd8b006 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -63,7 +63,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -80,8 +80,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_config_docs.rst b/flytectl/docs/source/gen/flytectl_config_docs.rst index 5c02341006..632ea87208 100644 --- a/flytectl/docs/source/gen/flytectl_config_docs.rst +++ b/flytectl/docs/source/gen/flytectl_config_docs.rst @@ -63,7 +63,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -80,8 +80,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index 7ca884adc5..978db2958f 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -94,7 +94,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -111,8 +111,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 5a46a46637..22a7b134b1 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -65,7 +65,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -82,8 +82,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index 2d6c94f998..947c32362e 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -62,7 +62,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -79,8 +79,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 48ee14600e..95daf83376 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -185,7 +185,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -202,8 +202,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index b5f7aa04bc..27395b40bf 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -98,7 +98,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -115,8 +115,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index aa1453c301..1b47f263e9 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -62,7 +62,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -79,8 +79,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 1591bd4750..7ba18dab58 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -97,7 +97,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -114,8 +114,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index ea415b6a99..bb4c71a599 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -94,7 +94,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -111,8 +111,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 6d48e44e96..f73ccb7f9d 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -98,7 +98,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -115,8 +115,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 6aac95b551..6ac42e93e0 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -105,7 +105,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -122,8 +122,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index ed7ba605f7..b7aef23a38 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -99,7 +99,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -116,8 +116,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 42d305438a..659f599781 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -99,7 +99,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -116,8 +116,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 38f59eb659..11625d7bed 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -97,7 +97,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -114,8 +114,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_demo.rst b/flytectl/docs/source/gen/flytectl_demo.rst index 504b770678..e5b0f470d1 100644 --- a/flytectl/docs/source/gen/flytectl_demo.rst +++ b/flytectl/docs/source/gen/flytectl_demo.rst @@ -80,7 +80,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -97,8 +97,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_demo_exec.rst b/flytectl/docs/source/gen/flytectl_demo_exec.rst index c55169861a..56386d2357 100644 --- a/flytectl/docs/source/gen/flytectl_demo_exec.rst +++ b/flytectl/docs/source/gen/flytectl_demo_exec.rst @@ -69,7 +69,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -86,8 +86,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_demo_start.rst b/flytectl/docs/source/gen/flytectl_demo_start.rst index dc62740582..19e894a589 100644 --- a/flytectl/docs/source/gen/flytectl_demo_start.rst +++ b/flytectl/docs/source/gen/flytectl_demo_start.rst @@ -129,7 +129,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -146,8 +146,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_demo_status.rst b/flytectl/docs/source/gen/flytectl_demo_status.rst index aaa7ff3814..776c61dce7 100644 --- a/flytectl/docs/source/gen/flytectl_demo_status.rst +++ b/flytectl/docs/source/gen/flytectl_demo_status.rst @@ -69,7 +69,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -86,8 +86,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_demo_teardown.rst b/flytectl/docs/source/gen/flytectl_demo_teardown.rst index 58650c4bca..75bb1489ff 100644 --- a/flytectl/docs/source/gen/flytectl_demo_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_demo_teardown.rst @@ -69,7 +69,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -86,8 +86,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 71d85bcf15..76ab0c3b66 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -62,7 +62,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -79,8 +79,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index 73de33c82f..f80498937b 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -105,7 +105,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -122,8 +122,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index 1186dd1835..b7ef8253f9 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -104,7 +104,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -121,8 +121,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index 2bf8699323..c455f435b8 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -107,7 +107,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -124,8 +124,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 618e621eae..e86fdfc04d 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -137,7 +137,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -154,8 +154,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index c2cd4a8697..6d805622bf 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -48,6 +48,16 @@ Retrieve all the launch plans with filters: flytectl get launchplan -p flytesnacks -d development --filter.fieldSelector="name=core.basic.lp.go_greet" +Retrieve all active launch plans: +:: + + flytectl get launchplan -p flytesnacks -d development -o yaml --filter.fieldSelector "state=1" + +Retrieve all archived launch plans: +:: + + flytectl get launchplan -p flytesnacks -d development -o yaml --filter.fieldSelector "state=0" + Retrieve launch plans entity search across all versions with filters: :: @@ -161,7 +171,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -178,8 +188,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index ce88f36675..fd5f2254d3 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -126,7 +126,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -143,8 +143,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 7bfb482d1e..8325efae74 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -109,7 +109,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -126,8 +126,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index ddfb59c910..b367830e9c 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -109,7 +109,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -126,8 +126,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 0d3076e683..172a0e8c75 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -153,7 +153,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -170,8 +170,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index 1c126ef959..d120edbe0c 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -166,7 +166,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -183,8 +183,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index a7e46b607e..5ea33497e5 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -137,7 +137,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -154,8 +154,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 5c61b1b818..3d5846a8b5 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -62,7 +62,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -79,8 +79,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 5086fb491e..63834c91f9 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -88,7 +88,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -105,8 +105,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index a30391d3fb..42f429e1b9 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -165,7 +165,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -182,8 +182,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index ddebcdefdc..704ddb5351 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -80,7 +80,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -97,8 +97,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index 65f131a303..86c47cda19 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -69,7 +69,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -86,8 +86,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 765e9f3df4..003470fb4b 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -134,7 +134,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -151,8 +151,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 2891e7d53d..8d86bad084 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -69,7 +69,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -86,8 +86,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index 9c3c5c9bf5..187871f39f 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -69,7 +69,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -86,8 +86,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 6cc96e9b60..3b101a52cd 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -64,7 +64,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -81,8 +81,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 0dab5c753a..563bfa1750 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -104,7 +104,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -121,8 +121,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 61e0588dc6..1fbbe717d5 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -97,7 +97,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -114,8 +114,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index fa5c5ec997..7e9275abbe 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -108,7 +108,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -125,8 +125,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_execution.rst b/flytectl/docs/source/gen/flytectl_update_execution.rst index f46100530d..433b6d7a9b 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution.rst @@ -77,7 +77,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -94,8 +94,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index 235a93f0dd..1d23d714fa 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -82,7 +82,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -99,8 +99,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 8b41776a43..45d7e1853d 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -78,7 +78,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -95,8 +95,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index d574bcf93e..bfb615e6bd 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -110,7 +110,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -127,8 +127,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 22d93ef02a..b8da2dc0a9 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -137,7 +137,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -154,8 +154,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index 507db9cfa5..d733ddb9eb 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -82,7 +82,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -99,8 +99,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 5faa148be2..4a75a91c71 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -110,7 +110,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -127,8 +127,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index f7ae581c08..2c89aa80bf 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -106,7 +106,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -123,8 +123,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index 6a3905d8df..ba2bb2cf87 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -82,7 +82,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -99,8 +99,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index be4ce3f70a..3ba85d765d 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -77,7 +77,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -94,8 +94,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index d0ecf3a2d8..f45d8f236e 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -66,7 +66,7 @@ Options inherited from parent commands --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 4) + --logger.level int Sets the minimum logging level. (default 3) --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. --logger.show-source Includes source code location in logs. -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") @@ -83,8 +83,8 @@ Options inherited from parent commands --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/graymeta/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/graymeta/stow + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO diff --git a/flytectl/docs/source/verbs.rst b/flytectl/docs/source/verbs.rst index 50eb37071e..403a96ec31 100644 --- a/flytectl/docs/source/verbs.rst +++ b/flytectl/docs/source/verbs.rst @@ -14,6 +14,7 @@ Flytectl verbs specify the actions to be performed on the resources. Example: cr gen/flytectl_delete gen/flytectl_register gen/flytectl_config + gen/flytectl_compile gen/flytectl_sandbox gen/flytectl_demo gen/flytectl_version From f35bb2eddf877108c405113c66f6aea01aad882f Mon Sep 17 00:00:00 2001 From: Yuvraj Date: Fri, 1 Jul 2022 14:14:42 +0530 Subject: [PATCH 263/645] rename upgrade workflow (#332) Signed-off-by: Yuvraj Co-authored-by: Yuvraj --- .../workflows/{upgrade_automtion.yml => upgrade_automation.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename flytectl/.github/workflows/{upgrade_automtion.yml => upgrade_automation.yml} (100%) diff --git a/flytectl/.github/workflows/upgrade_automtion.yml b/flytectl/.github/workflows/upgrade_automation.yml similarity index 100% rename from flytectl/.github/workflows/upgrade_automtion.yml rename to flytectl/.github/workflows/upgrade_automation.yml From c7e543ae802e0c1c5edb69715925a8ffbf9f1d6f Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Wed, 6 Jul 2022 06:18:13 +0300 Subject: [PATCH 264/645] fix: doc-requirements.txt to reduce vulnerabilities (#334) The following vulnerabilities are fixed by pinning transitive dependencies: - https://snyk.io/vuln/SNYK-PYTHON-LXML-2940874 --- flytectl/doc-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index f0ff7cad16..070d7493af 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -31,7 +31,7 @@ imagesize==1.3.0 # via sphinx jinja2==3.0.3 # via sphinx -lxml==4.7.1 +lxml==4.9.1 # via sphinx-material markupsafe==2.0.1 # via jinja2 From 305adae20228cc679d086b234d08b649f710e9d9 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Tue, 5 Jul 2022 20:18:46 -0700 Subject: [PATCH 265/645] Update flyteidl version (#333) Signed-off-by: Flyte-Bot Co-authored-by: flyte-bot --- flytectl/go.mod | 2 +- flytectl/go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 8b95a84bd6..a74e398177 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.1.0 + github.com/flyteorg/flyteidl v1.1.8 github.com/flyteorg/flytestdlib v1.0.0 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 9bdfe27256..736f6cc89f 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -403,6 +403,8 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= github.com/flyteorg/flyteidl v1.1.0 h1:f8tdMXOuorS/d+4Ut2QarfDbdCOriK0S+EnlQzrwz9E= github.com/flyteorg/flyteidl v1.1.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= +github.com/flyteorg/flyteidl v1.1.8 h1:F4daAffMefK+LiW1Wni75Vw6ya6uWlVHySWF6UhbzaQ= +github.com/flyteorg/flyteidl v1.1.8/go.mod h1:f1tvw5CDjqmrzNxKpRYr6BdAhHL8f7Wp1Duxl0ZOV4g= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= From 09f9d213fea5c23889fb89b0a7ab0cf203fba195 Mon Sep 17 00:00:00 2001 From: David Przybilla Date: Mon, 11 Jul 2022 15:11:12 +0900 Subject: [PATCH 266/645] Teardown logic shared for demo/sandbox cmds (#329) --- flytectl/cmd/demo/start.go | 1 - flytectl/cmd/demo/teardown.go | 37 ++------------------- flytectl/cmd/demo/teardown_test.go | 13 ++++++-- flytectl/cmd/sandbox/start.go | 1 - flytectl/cmd/sandbox/teardown.go | 38 ++------------------- flytectl/cmd/sandbox/teardown_test.go | 40 +++------------------- flytectl/pkg/sandbox/teardown.go | 39 ++++++++++++++++++++++ flytectl/pkg/sandbox/teardown_test.go | 48 +++++++++++++++++++++++++++ 8 files changed, 107 insertions(+), 110 deletions(-) create mode 100644 flytectl/pkg/sandbox/teardown.go create mode 100644 flytectl/pkg/sandbox/teardown_test.go diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index 247111ffca..a1e3113398 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -72,7 +72,6 @@ eg : for passing multiple environment variables Usage ` - demoContextName = "flyte-sandbox" ) func startDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { diff --git a/flytectl/cmd/demo/teardown.go b/flytectl/cmd/demo/teardown.go index bd98b22e37..399a904ab7 100644 --- a/flytectl/cmd/demo/teardown.go +++ b/flytectl/cmd/demo/teardown.go @@ -2,17 +2,12 @@ package demo import ( "context" - "fmt" - "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flytectl/pkg/sandbox" "github.com/flyteorg/flytectl/pkg/docker" - "github.com/docker/docker/api/types" - "github.com/enescakir/emoji" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/k8s" ) const ( @@ -33,33 +28,5 @@ func teardownDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm if err != nil { return err } - - return tearDownDemo(ctx, cli) -} - -func tearDownDemo(ctx context.Context, cli docker.Docker) error { - c, err := docker.GetSandbox(ctx, cli) - if err != nil { - return err - } - if c != nil { - if err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ - Force: true, - }); err != nil { - return err - } - } - if err := configutil.ConfigCleanup(); err != nil { - fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) - } - if err := removeDemoKubeContext(); err != nil { - fmt.Printf("Kubecontext cleanup failed. Which Failed due to %v \n ", err) - } - fmt.Printf("%v %v Demo cluster is removed successfully. \n", emoji.Broom, emoji.Broom) - return nil -} - -func removeDemoKubeContext() error { - k8sCtxMgr := k8s.NewK8sContextManager() - return k8sCtxMgr.RemoveContext(demoContextName) + return sandbox.Teardown(ctx, cli) } diff --git a/flytectl/cmd/demo/teardown_test.go b/flytectl/cmd/demo/teardown_test.go index 7741272a2b..34a25f23f5 100644 --- a/flytectl/cmd/demo/teardown_test.go +++ b/flytectl/cmd/demo/teardown_test.go @@ -12,6 +12,7 @@ import ( "github.com/flyteorg/flytectl/pkg/docker/mocks" "github.com/flyteorg/flytectl/pkg/k8s" k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" + "github.com/flyteorg/flytectl/pkg/sandbox" "github.com/flyteorg/flytectl/pkg/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -36,7 +37,7 @@ func TestTearDownFunc(t *testing.T) { mockK8sContextMgr := &k8sMocks.ContextOps{} k8s.ContextMgr = mockK8sContextMgr mockK8sContextMgr.OnRemoveContextMatch(mock.Anything).Return(nil) - err := tearDownDemo(ctx, mockDocker) + err := sandbox.Teardown(ctx, mockDocker) assert.Nil(t, err) }) t.Run("Error", func(t *testing.T) { @@ -44,7 +45,15 @@ func TestTearDownFunc(t *testing.T) { mockDocker := &mocks.Docker{} mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("err")) - err := tearDownDemo(ctx, mockDocker) + err := sandbox.Teardown(ctx, mockDocker) + assert.NotNil(t, err) + }) + + t.Run("Error", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(nil, fmt.Errorf("err")) + err := sandbox.Teardown(ctx, mockDocker) assert.NotNil(t, err) }) diff --git a/flytectl/cmd/sandbox/start.go b/flytectl/cmd/sandbox/start.go index d409637032..1996a7f17d 100644 --- a/flytectl/cmd/sandbox/start.go +++ b/flytectl/cmd/sandbox/start.go @@ -76,7 +76,6 @@ eg : for passing multiple environment variables Usage ` - sandboxContextName = "flyte-sandbox" ) func startSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index 9280e303a5..4e209a19c1 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -2,17 +2,11 @@ package sandbox import ( "context" - "fmt" - - "github.com/flyteorg/flytectl/pkg/configutil" "github.com/flyteorg/flytectl/pkg/docker" - - "github.com/docker/docker/api/types" - "github.com/enescakir/emoji" + "github.com/flyteorg/flytectl/pkg/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/pkg/k8s" ) const ( @@ -33,33 +27,5 @@ func teardownSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.C if err != nil { return err } - - return tearDownSandbox(ctx, cli) -} - -func tearDownSandbox(ctx context.Context, cli docker.Docker) error { - c, err := docker.GetSandbox(ctx, cli) - if err != nil { - return err - } - if c != nil { - if err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ - Force: true, - }); err != nil { - return err - } - } - if err := configutil.ConfigCleanup(); err != nil { - fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) - } - if err := removeSandboxKubeContext(); err != nil { - fmt.Printf("Kubecontext cleanup failed. Which Failed due to %v \n ", err) - } - fmt.Printf("%v %v Sandbox cluster is removed successfully. \n", emoji.Broom, emoji.Broom) - return nil -} - -func removeSandboxKubeContext() error { - k8sCtxMgr := k8s.NewK8sContextManager() - return k8sCtxMgr.RemoveContext(sandboxContextName) + return sandbox.Teardown(ctx, cli) } diff --git a/flytectl/cmd/sandbox/teardown_test.go b/flytectl/cmd/sandbox/teardown_test.go index 0664342979..63509c22ec 100644 --- a/flytectl/cmd/sandbox/teardown_test.go +++ b/flytectl/cmd/sandbox/teardown_test.go @@ -1,8 +1,6 @@ package sandbox import ( - "context" - "fmt" "testing" "github.com/docker/docker/api/types" @@ -17,40 +15,8 @@ import ( "github.com/stretchr/testify/mock" ) -var containers []types.Container - -func TestTearDownFunc(t *testing.T) { - container1 := types.Container{ - ID: "FlyteSandboxClusterName", - Names: []string{ - docker.FlyteSandboxClusterName, - }, - } - containers = append(containers, container1) - - t.Run("Success", func(t *testing.T) { - ctx := context.Background() - mockDocker := &mocks.Docker{} - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) - mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) - mockK8sContextMgr := &k8sMocks.ContextOps{} - k8s.ContextMgr = mockK8sContextMgr - mockK8sContextMgr.OnRemoveContextMatch(mock.Anything).Return(nil) - err := tearDownSandbox(ctx, mockDocker) - assert.Nil(t, err) - }) - t.Run("Error", func(t *testing.T) { - ctx := context.Background() - mockDocker := &mocks.Docker{} - mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) - mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("err")) - err := tearDownSandbox(ctx, mockDocker) - assert.NotNil(t, err) - }) - -} - func TestTearDownClusterFunc(t *testing.T) { + var containers []types.Container _ = util.SetupFlyteDir() _ = util.WriteIntoFile([]byte("data"), configutil.FlytectlConfig) s := testutils.Setup() @@ -58,6 +24,10 @@ func TestTearDownClusterFunc(t *testing.T) { mockDocker := &mocks.Docker{} mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + mockK8sContextMgr := &k8sMocks.ContextOps{} + mockK8sContextMgr.OnRemoveContext(mock.Anything).Return(nil) + k8s.ContextMgr = mockK8sContextMgr + docker.Client = mockDocker err := teardownSandboxCluster(ctx, []string{}, s.CmdCtx) assert.Nil(t, err) diff --git a/flytectl/pkg/sandbox/teardown.go b/flytectl/pkg/sandbox/teardown.go new file mode 100644 index 0000000000..633d026833 --- /dev/null +++ b/flytectl/pkg/sandbox/teardown.go @@ -0,0 +1,39 @@ +package sandbox + +import ( + "context" + "fmt" + + "github.com/docker/docker/api/types" + "github.com/enescakir/emoji" + "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/k8s" +) + +func Teardown(ctx context.Context, cli docker.Docker) error { + c, err := docker.GetSandbox(ctx, cli) + if err != nil { + return err + } + if c != nil { + if err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ + Force: true, + }); err != nil { + return err + } + } + if err := configutil.ConfigCleanup(); err != nil { + fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) + } + if err := removeSandboxKubeContext(); err != nil { + fmt.Printf("Kubecontext cleanup failed. Which Failed due to %v \n ", err) + } + fmt.Printf("%v %v Sandbox cluster is removed successfully. \n", emoji.Broom, emoji.Broom) + return nil +} + +func removeSandboxKubeContext() error { + k8sCtxMgr := k8s.NewK8sContextManager() + return k8sCtxMgr.RemoveContext(sandboxContextName) +} diff --git a/flytectl/pkg/sandbox/teardown_test.go b/flytectl/pkg/sandbox/teardown_test.go new file mode 100644 index 0000000000..9047ee7614 --- /dev/null +++ b/flytectl/pkg/sandbox/teardown_test.go @@ -0,0 +1,48 @@ +package sandbox + +import ( + "context" + "fmt" + "testing" + + "github.com/docker/docker/api/types" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/flyteorg/flytectl/pkg/k8s" + k8sMocks "github.com/flyteorg/flytectl/pkg/k8s/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func TestTearDownFunc(t *testing.T) { + var containers []types.Container + container1 := types.Container{ + ID: "FlyteSandboxClusterName", + Names: []string{ + docker.FlyteSandboxClusterName, + }, + } + containers = append(containers, container1) + ctx := context.Background() + + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("err")) + err := Teardown(ctx, mockDocker) + assert.NotNil(t, err) + + mockDocker = &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(nil, fmt.Errorf("err")) + err = Teardown(ctx, mockDocker) + assert.NotNil(t, err) + + mockDocker = &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + mockK8sContextMgr := &k8sMocks.ContextOps{} + mockK8sContextMgr.OnRemoveContext(mock.Anything).Return(nil) + k8s.ContextMgr = mockK8sContextMgr + err = Teardown(ctx, mockDocker) + assert.Nil(t, err) + +} From e0d7284217a1ab4721e0e377203af523a0a28dac Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Wed, 27 Jul 2022 16:30:18 +0530 Subject: [PATCH 267/645] remove welcome bot from boilerplate (#337) Signed-off-by: Samhita Alla --- flytectl/.github/config.yml | 16 ---------------- .../boilerplate/flyte/welcome_bot/Readme.rst | 8 -------- .../boilerplate/flyte/welcome_bot/config.yml | 16 ---------------- flytectl/boilerplate/flyte/welcome_bot/update.sh | 15 --------------- flytectl/boilerplate/update.cfg | 1 - 5 files changed, 56 deletions(-) delete mode 100644 flytectl/.github/config.yml delete mode 100644 flytectl/boilerplate/flyte/welcome_bot/Readme.rst delete mode 100644 flytectl/boilerplate/flyte/welcome_bot/config.yml delete mode 100755 flytectl/boilerplate/flyte/welcome_bot/update.sh diff --git a/flytectl/.github/config.yml b/flytectl/.github/config.yml deleted file mode 100644 index 73da252e52..0000000000 --- a/flytectl/.github/config.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Comment to be posted on PRs from first-time contributors in your repository -newPRWelcomeComment: | - Thank you for opening this pull request! 🙌 - - These tips will help get your PR across the finish line: - - - Most of the repos have a PR template; if not, fill it out to the best of your knowledge. - - Sign off your commits (Reference: [DCO Guide](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md)). - -# Comment to be posted to on pull requests merged by a first time user -firstPRMergeComment: > - Congrats on merging your first pull request! 🎉 - -# Comment to be posted on first-time issues -newIssueWelcomeComment: > - Thank you for opening your first issue here! 🛠 diff --git a/flytectl/boilerplate/flyte/welcome_bot/Readme.rst b/flytectl/boilerplate/flyte/welcome_bot/Readme.rst deleted file mode 100644 index ea18781185..0000000000 --- a/flytectl/boilerplate/flyte/welcome_bot/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -Config File -- Welcome Bot -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Provides a ``config.yml`` file. - -**To Enable:** - -Add ``flyte/config.yml`` to your ``boilerplate/update.cfg`` file. \ No newline at end of file diff --git a/flytectl/boilerplate/flyte/welcome_bot/config.yml b/flytectl/boilerplate/flyte/welcome_bot/config.yml deleted file mode 100644 index 73da252e52..0000000000 --- a/flytectl/boilerplate/flyte/welcome_bot/config.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Comment to be posted on PRs from first-time contributors in your repository -newPRWelcomeComment: | - Thank you for opening this pull request! 🙌 - - These tips will help get your PR across the finish line: - - - Most of the repos have a PR template; if not, fill it out to the best of your knowledge. - - Sign off your commits (Reference: [DCO Guide](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md)). - -# Comment to be posted to on pull requests merged by a first time user -firstPRMergeComment: > - Congrats on merging your first pull request! 🎉 - -# Comment to be posted on first-time issues -newIssueWelcomeComment: > - Thank you for opening your first issue here! 🛠 diff --git a/flytectl/boilerplate/flyte/welcome_bot/update.sh b/flytectl/boilerplate/flyte/welcome_bot/update.sh deleted file mode 100755 index 2db64ac3f1..0000000000 --- a/flytectl/boilerplate/flyte/welcome_bot/update.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -# Clone the config.yml file -echo " - copying ${DIR}/config.yml to the root directory." -cp "${DIR}"/config.yml "${DIR}"/../../../.github/config.yml - diff --git a/flytectl/boilerplate/update.cfg b/flytectl/boilerplate/update.cfg index f64279bc22..8920ca4162 100644 --- a/flytectl/boilerplate/update.cfg +++ b/flytectl/boilerplate/update.cfg @@ -2,6 +2,5 @@ flyte/golang_test_targets flyte/golangci_file flyte/golang_support_tools flyte/pull_request_template -flyte/welcome_bot flyte/precommit flyte/code_of_conduct From 3989ec8178f3fa3506123c17b7d9cdb21019172b Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Fri, 29 Jul 2022 01:07:30 -0700 Subject: [PATCH 268/645] Update documentation (#335) Signed-off-by: Flyte-Bot Co-authored-by: samhita-alla --- flytectl/docs/source/gen/flytectl.rst | 1 + flytectl/docs/source/gen/flytectl_compile.rst | 1 + flytectl/docs/source/gen/flytectl_completion.rst | 1 + flytectl/docs/source/gen/flytectl_config.rst | 1 + flytectl/docs/source/gen/flytectl_config_discover.rst | 1 + flytectl/docs/source/gen/flytectl_config_docs.rst | 1 + flytectl/docs/source/gen/flytectl_config_init.rst | 1 + flytectl/docs/source/gen/flytectl_config_validate.rst | 1 + flytectl/docs/source/gen/flytectl_create.rst | 1 + flytectl/docs/source/gen/flytectl_create_execution.rst | 1 + flytectl/docs/source/gen/flytectl_create_project.rst | 1 + flytectl/docs/source/gen/flytectl_delete.rst | 1 + .../source/gen/flytectl_delete_cluster-resource-attribute.rst | 1 + .../docs/source/gen/flytectl_delete_execution-cluster-label.rst | 1 + .../source/gen/flytectl_delete_execution-queue-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_delete_execution.rst | 1 + flytectl/docs/source/gen/flytectl_delete_plugin-override.rst | 1 + .../docs/source/gen/flytectl_delete_task-resource-attribute.rst | 1 + .../source/gen/flytectl_delete_workflow-execution-config.rst | 1 + flytectl/docs/source/gen/flytectl_demo.rst | 1 + flytectl/docs/source/gen/flytectl_demo_exec.rst | 1 + flytectl/docs/source/gen/flytectl_demo_start.rst | 1 + flytectl/docs/source/gen/flytectl_demo_status.rst | 1 + flytectl/docs/source/gen/flytectl_demo_teardown.rst | 1 + flytectl/docs/source/gen/flytectl_get.rst | 1 + .../docs/source/gen/flytectl_get_cluster-resource-attribute.rst | 1 + .../docs/source/gen/flytectl_get_execution-cluster-label.rst | 1 + .../docs/source/gen/flytectl_get_execution-queue-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_get_execution.rst | 1 + flytectl/docs/source/gen/flytectl_get_launchplan.rst | 1 + flytectl/docs/source/gen/flytectl_get_plugin-override.rst | 1 + flytectl/docs/source/gen/flytectl_get_project.rst | 1 + .../docs/source/gen/flytectl_get_task-resource-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_get_task.rst | 1 + .../docs/source/gen/flytectl_get_workflow-execution-config.rst | 1 + flytectl/docs/source/gen/flytectl_get_workflow.rst | 1 + flytectl/docs/source/gen/flytectl_register.rst | 1 + flytectl/docs/source/gen/flytectl_register_examples.rst | 1 + flytectl/docs/source/gen/flytectl_register_files.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox_exec.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox_start.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox_status.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox_teardown.rst | 1 + flytectl/docs/source/gen/flytectl_update.rst | 1 + .../source/gen/flytectl_update_cluster-resource-attribute.rst | 1 + .../docs/source/gen/flytectl_update_execution-cluster-label.rst | 1 + .../source/gen/flytectl_update_execution-queue-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_update_execution.rst | 1 + flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst | 1 + flytectl/docs/source/gen/flytectl_update_launchplan.rst | 1 + flytectl/docs/source/gen/flytectl_update_plugin-override.rst | 1 + flytectl/docs/source/gen/flytectl_update_project.rst | 1 + flytectl/docs/source/gen/flytectl_update_task-meta.rst | 1 + .../docs/source/gen/flytectl_update_task-resource-attribute.rst | 1 + .../source/gen/flytectl_update_workflow-execution-config.rst | 1 + flytectl/docs/source/gen/flytectl_update_workflow-meta.rst | 1 + flytectl/docs/source/gen/flytectl_upgrade.rst | 1 + flytectl/docs/source/gen/flytectl_version.rst | 1 + 59 files changed, 59 insertions(+) diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 302570ce23..afe6a41400 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -23,6 +23,7 @@ Options --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_compile.rst b/flytectl/docs/source/gen/flytectl_compile.rst index 8abba58378..9d92df44fe 100644 --- a/flytectl/docs/source/gen/flytectl_compile.rst +++ b/flytectl/docs/source/gen/flytectl_compile.rst @@ -49,6 +49,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index 9453d90396..e18446b99d 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -96,6 +96,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index cdc118c07c..fded48039c 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -32,6 +32,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 564cd8b006..526b9ad732 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -34,6 +34,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_config_docs.rst b/flytectl/docs/source/gen/flytectl_config_docs.rst index 632ea87208..b258a60b14 100644 --- a/flytectl/docs/source/gen/flytectl_config_docs.rst +++ b/flytectl/docs/source/gen/flytectl_config_docs.rst @@ -34,6 +34,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index 978db2958f..a26a1c7cf1 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -65,6 +65,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 22a7b134b1..570193c891 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -36,6 +36,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index 947c32362e..f64c70dd05 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -35,6 +35,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 95daf83376..35ee472b27 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -158,6 +158,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index 27395b40bf..eb040758fa 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -71,6 +71,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 1b47f263e9..f26ed92613 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -35,6 +35,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 7ba18dab58..ee68b7ad4d 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -70,6 +70,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index bb4c71a599..62d9ba8b7a 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -67,6 +67,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index f73ccb7f9d..298a66eedc 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -71,6 +71,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 6ac42e93e0..6ee69b6711 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -78,6 +78,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index b7aef23a38..778ea57581 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -72,6 +72,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 659f599781..ed77f80fd3 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -72,6 +72,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 11625d7bed..212567054a 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -70,6 +70,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_demo.rst b/flytectl/docs/source/gen/flytectl_demo.rst index e5b0f470d1..74889b9c3e 100644 --- a/flytectl/docs/source/gen/flytectl_demo.rst +++ b/flytectl/docs/source/gen/flytectl_demo.rst @@ -53,6 +53,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_demo_exec.rst b/flytectl/docs/source/gen/flytectl_demo_exec.rst index 56386d2357..08539b44b0 100644 --- a/flytectl/docs/source/gen/flytectl_demo_exec.rst +++ b/flytectl/docs/source/gen/flytectl_demo_exec.rst @@ -42,6 +42,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_demo_start.rst b/flytectl/docs/source/gen/flytectl_demo_start.rst index 19e894a589..f1865e41d5 100644 --- a/flytectl/docs/source/gen/flytectl_demo_start.rst +++ b/flytectl/docs/source/gen/flytectl_demo_start.rst @@ -102,6 +102,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_demo_status.rst b/flytectl/docs/source/gen/flytectl_demo_status.rst index 776c61dce7..2f6d3e8e08 100644 --- a/flytectl/docs/source/gen/flytectl_demo_status.rst +++ b/flytectl/docs/source/gen/flytectl_demo_status.rst @@ -42,6 +42,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_demo_teardown.rst b/flytectl/docs/source/gen/flytectl_demo_teardown.rst index 75bb1489ff..8c8305c0d3 100644 --- a/flytectl/docs/source/gen/flytectl_demo_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_demo_teardown.rst @@ -42,6 +42,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 76ab0c3b66..8272b62ba7 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -35,6 +35,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index f80498937b..f175399b2d 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -78,6 +78,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index b7ef8253f9..79e9f40e11 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -77,6 +77,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index c455f435b8..4be1826963 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -80,6 +80,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index e86fdfc04d..ed4f653928 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -110,6 +110,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 6d805622bf..eded03d90d 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -144,6 +144,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index fd5f2254d3..a2fc2dc06f 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -99,6 +99,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 8325efae74..1d104b3e04 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -82,6 +82,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index b367830e9c..586049d874 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -82,6 +82,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 172a0e8c75..7237869310 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -126,6 +126,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index d120edbe0c..17cd83c401 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -139,6 +139,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 5ea33497e5..5efc06419f 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -110,6 +110,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 3d5846a8b5..cc600b42f4 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -35,6 +35,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 63834c91f9..ea1a4cf9b2 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -61,6 +61,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 42f429e1b9..3f51de91dd 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -138,6 +138,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 704ddb5351..5e03e92672 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -53,6 +53,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index 86c47cda19..812c30f211 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -42,6 +42,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 003470fb4b..7e9904d1a9 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -107,6 +107,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 8d86bad084..17462d2788 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -42,6 +42,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index 187871f39f..d8a2554777 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -42,6 +42,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 3b101a52cd..f89628772c 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -37,6 +37,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 563bfa1750..97504d3ac8 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -77,6 +77,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 1fbbe717d5..0d196fa31d 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -70,6 +70,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 7e9275abbe..180ed4fda1 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -81,6 +81,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_execution.rst b/flytectl/docs/source/gen/flytectl_update_execution.rst index 433b6d7a9b..3920171b12 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution.rst @@ -50,6 +50,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index 1d23d714fa..b7a8fbb1aa 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -55,6 +55,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 45d7e1853d..295ac45c9e 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -51,6 +51,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index bfb615e6bd..24320676a7 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -83,6 +83,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index b8da2dc0a9..91cfbe14ee 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -110,6 +110,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index d733ddb9eb..f1f807a842 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -55,6 +55,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 4a75a91c71..b0b8b58d42 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -83,6 +83,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index 2c89aa80bf..69dcabe7ad 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -79,6 +79,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index ba2bb2cf87..d19d66b4de 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -55,6 +55,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index 3ba85d765d..9dda7fc0aa 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -50,6 +50,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index f45d8f236e..1cdc8560a6 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -39,6 +39,7 @@ Options inherited from parent commands --admin.clientId string Client ID (default "flytepropeller") --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' From 9af534f35624bed9247c0401af2b17040f5976c3 Mon Sep 17 00:00:00 2001 From: Tao He Date: Tue, 9 Aug 2022 13:18:25 +0800 Subject: [PATCH 269/645] Fixes the project name and workflow name in the flytectl documentation. (#339) It seems that flytectl no longer register examples to a `flytectldemo` project, rather, the project name should be `flytesnacks`. And, the workflow name `core.advanced.run_merge_sort.merge_sort` and `core.control_flow.run_merge_sort.merge_sort` should be `core.control_flow.merge_sort.merge_sort`. Signed-off-by: Tao He --- flytectl/cmd/create/execution.go | 12 ++++++------ flytectl/cmd/create/execution_test.go | 4 ++-- .../matchable_cluster_resource_attribute.go | 10 +++++----- ...atchable_cluster_resource_attribute_test.go | 8 ++++---- .../matchable_execution_cluster_label.go | 10 +++++----- .../matchable_execution_cluster_label_test.go | 8 ++++---- .../matchable_execution_queue_attribute.go | 10 +++++----- ...matchable_execution_queue_attribute_test.go | 8 ++++---- .../cmd/delete/matchable_plugin_override.go | 10 +++++----- .../delete/matchable_plugin_override_test.go | 8 ++++---- .../matchable_task_resource_attribute.go | 10 +++++----- .../matchable_task_resource_attribute_test.go | 8 ++++---- .../matchable_workflow_execution_config.go | 10 +++++----- ...matchable_workflow_execution_config_test.go | 8 ++++---- .../cmd/delete/testdata/invalid_attribute.yaml | 2 +- ...valid_project_domain_cluster_attribute.yaml | 2 +- ...project_domain_execution_cluster_label.yaml | 2 +- ...oject_domain_execution_queue_attribute.yaml | 2 +- .../valid_project_domain_plugin_override.yaml | 2 +- .../valid_project_domain_task_attribute.yaml | 2 +- ...oject_domain_workflow_execution_config.yaml | 2 +- .../valid_workflow_cluster_attribute.yaml | 4 ++-- ...valid_workflow_execution_cluster_label.yaml | 4 ++-- ...lid_workflow_execution_queue_attribute.yaml | 4 ++-- .../valid_workflow_plugin_override.yaml | 4 ++-- .../valid_workflow_task_attribute.yaml | 4 ++-- ...lid_workflow_workflow_execution_config.yaml | 4 ++-- flytectl/cmd/get/launch_plan.go | 4 ++-- .../matchable_cluster_resource_attribute.go | 14 +++++++------- .../get/matchable_execution_cluster_label.go | 14 +++++++------- .../get/matchable_execution_queue_attribute.go | 14 +++++++------- flytectl/cmd/get/matchable_plugin_override.go | 16 ++++++++-------- .../get/matchable_task_resource_attribute.go | 14 +++++++------- .../get/matchable_workflow_execution_config.go | 18 +++++++++--------- flytectl/cmd/get/task.go | 4 ++-- .../cmd/testdata/invalid_execution_spec.yaml | 4 ++-- .../testdata/launchplan_execution_spec.yaml | 2 +- flytectl/cmd/testdata/task_execution_spec.yaml | 2 +- .../task_execution_spec_with_iamrole.yaml | 2 +- flytectl/cmd/update/execution.go | 4 ++-- flytectl/cmd/update/launch_plan.go | 4 ++-- flytectl/cmd/update/launch_plan_meta.go | 6 +++--- .../matchable_cluster_resource_attribute.go | 8 ++++---- ...atchable_cluster_resource_attribute_test.go | 4 ++-- .../matchable_execution_cluster_label.go | 8 ++++---- .../matchable_execution_cluster_label_test.go | 4 ++-- .../matchable_execution_queue_attribute.go | 8 ++++---- ...matchable_execution_queue_attribute_test.go | 4 ++-- .../cmd/update/matchable_plugin_override.go | 8 ++++---- .../update/matchable_plugin_override_test.go | 4 ++-- .../matchable_task_resource_attribute.go | 8 ++++---- .../matchable_task_resource_attribute_test.go | 4 ++-- .../matchable_workflow_execution_config.go | 8 ++++---- ...matchable_workflow_execution_config_test.go | 4 ++-- flytectl/cmd/update/task_meta.go | 6 +++--- .../cmd/update/testdata/invalid_attribute.yaml | 2 +- ...valid_project_domain_cluster_attribute.yaml | 2 +- ...project_domain_execution_cluster_label.yaml | 2 +- ...oject_domain_execution_queue_attribute.yaml | 2 +- .../valid_project_domain_plugin_override.yaml | 2 +- .../valid_project_domain_task_attribute.yaml | 2 +- ...oject_domain_workflow_execution_config.yaml | 2 +- .../valid_workflow_cluster_attribute.yaml | 4 ++-- ...valid_workflow_execution_cluster_label.yaml | 4 ++-- ...lid_workflow_execution_queue_attribute.yaml | 4 ++-- .../valid_workflow_plugin_override.yaml | 4 ++-- .../valid_workflow_task_attribute.yaml | 4 ++-- ...lid_workflow_workflow_execution_config.yaml | 4 ++-- flytectl/cmd/update/workflow_meta.go | 8 ++++---- .../source/gen/flytectl_create_execution.rst | 12 ++++++------ ...tectl_delete_cluster-resource-attribute.rst | 10 +++++----- ...flytectl_delete_execution-cluster-label.rst | 10 +++++----- ...ytectl_delete_execution-queue-attribute.rst | 10 +++++----- .../gen/flytectl_delete_plugin-override.rst | 10 +++++----- ...flytectl_delete_task-resource-attribute.rst | 10 +++++----- ...ytectl_delete_workflow-execution-config.rst | 10 +++++----- ...flytectl_get_cluster-resource-attribute.rst | 14 +++++++------- .../flytectl_get_execution-cluster-label.rst | 14 +++++++------- .../flytectl_get_execution-queue-attribute.rst | 14 +++++++------- .../source/gen/flytectl_get_launchplan.rst | 4 ++-- .../gen/flytectl_get_plugin-override.rst | 16 ++++++++-------- .../flytectl_get_task-resource-attribute.rst | 14 +++++++------- flytectl/docs/source/gen/flytectl_get_task.rst | 4 ++-- .../flytectl_get_workflow-execution-config.rst | 18 +++++++++--------- ...tectl_update_cluster-resource-attribute.rst | 8 ++++---- ...flytectl_update_execution-cluster-label.rst | 8 ++++---- ...ytectl_update_execution-queue-attribute.rst | 8 ++++---- .../source/gen/flytectl_update_execution.rst | 4 ++-- .../gen/flytectl_update_launchplan-meta.rst | 6 +++--- .../source/gen/flytectl_update_launchplan.rst | 4 ++-- .../gen/flytectl_update_plugin-override.rst | 8 ++++---- .../source/gen/flytectl_update_task-meta.rst | 6 +++--- ...flytectl_update_task-resource-attribute.rst | 8 ++++---- ...ytectl_update_workflow-execution-config.rst | 8 ++++---- .../gen/flytectl_update_workflow-meta.rst | 8 ++++---- 95 files changed, 327 insertions(+), 327 deletions(-) diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index 3ca734d3ed..dc1ba493c1 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -20,7 +20,7 @@ There are three steps to generate an execution, as outlined below: 1. Generate the execution spec file using the :ref:` + "`get task `" + ` command. :: - flytectl get tasks -d development -p flytectldemo core.advanced.run_merge_sort.merge --version v2 --execFile execution_spec.yaml + flytectl get tasks -d development -p flytesnacks core.control_flow.merge_sort.merge --version v2 --execFile execution_spec.yaml The generated file would look similar to the following: @@ -35,7 +35,7 @@ The generated file would look similar to the following: kubeServiceAcct: "" targetDomain: "" targetProject: "" - task: core.advanced.run_merge_sort.merge + task: core.control_flow.merge_sort.merge version: "v2" 2. [Optional] Update the inputs for the execution, if needed. @@ -56,7 +56,7 @@ The generated spec file can be modified to change the input values, as shown bel kubeServiceAcct: "" targetDomain: "" targetProject: "" - task: core.advanced.run_merge_sort.merge + task: core.control_flow.merge_sort.merge version: "v2" 3. Run the execution by passing the generated YAML file. @@ -70,13 +70,13 @@ To relaunch an execution, pass the current execution ID as follows: :: - flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development + flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytesnacks -d development To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: :: - flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytectldemo -d development + flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytesnacks -d development See :ref:` + "`ref_flyteidl.admin.ExecutionRecoverRequest`" + ` for more details. @@ -85,7 +85,7 @@ The following is an example of how generic data can be specified while creating :: - flytectl get task -d development -p flytectldemo core.type_system.custom_objects.add --execFile adddatanum.yaml + flytectl get task -d development -p flytesnacks core.type_system.custom_objects.add --execFile adddatanum.yaml The generated file would look similar to this. Here, empty values have been dumped for generic data types 'x' and 'y'. :: diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index 1a3a7217e5..cad187f9d0 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -111,7 +111,7 @@ func createExecutionSetup(s *testutils.TestStruct) (t TestStruct) { } launchPlan1 := &admin.LaunchPlan{ Id: &core.Identifier{ - Name: "core.advanced.run_merge_sort.merge_sort", + Name: "core.control_flow.merge_sort.merge_sort", Version: "v3", }, Spec: &admin.LaunchPlanSpec{ @@ -131,7 +131,7 @@ func createExecutionSetup(s *testutils.TestStruct) (t TestStruct) { ResourceType: core.ResourceType_LAUNCH_PLAN, Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, - Name: "core.advanced.run_merge_sort.merge_sort", + Name: "core.control_flow.merge_sort.merge_sort", Version: "v2", }, } diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go index d94a71741a..2f3eec61ed 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go @@ -15,10 +15,10 @@ const ( clusterResourceAttributesLong = ` Delete cluster resource attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete cluster-resource-attribute -p flytectldemo -d development + flytectl delete cluster-resource-attribute -p flytesnacks -d development To delete cluster resource attribute using the config file that was used to create it, run: @@ -32,18 +32,18 @@ For example, here's the config file cra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks attributes: foo: "bar" buzz: "lightyear" Attributes are optional in the file, which are unread during the 'delete' command but can be retained since the same file can be used for 'get', 'update' and 'delete' commands. -To delete cluster resource attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run: +To delete cluster resource attribute for the workflow 'core.control_flow.merge_sort.merge_sort', run: :: - flytectl delete cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete cluster-resource-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage ` diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go index d4556224ff..17d8f02ae3 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go @@ -54,7 +54,7 @@ func TestDeleteClusterResourceAttributes(t *testing.T) { err := deleteClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_CLUSTER_RESOURCE) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_CLUSTER_RESOURCE) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { s := setup() @@ -96,7 +96,7 @@ func TestDeleteClusterResourceAttributes(t *testing.T) { err := deleteClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_CLUSTER_RESOURCE) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { @@ -110,7 +110,7 @@ func TestDeleteClusterResourceAttributes(t *testing.T) { err := deleteClusterResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_CLUSTER_RESOURCE) }) t.Run("attribute deletion invalid file", func(t *testing.T) { @@ -125,6 +125,6 @@ func TestDeleteClusterResourceAttributes(t *testing.T) { fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_CLUSTER_RESOURCE) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_CLUSTER_RESOURCE) }) } diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label.go b/flytectl/cmd/delete/matchable_execution_cluster_label.go index ff88f7a788..eea32e3256 100644 --- a/flytectl/cmd/delete/matchable_execution_cluster_label.go +++ b/flytectl/cmd/delete/matchable_execution_cluster_label.go @@ -15,10 +15,10 @@ const ( executionClusterLabelLong = ` Delete execution cluster label for a given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete execution-cluster-label -p flytectldemo -d development + flytectl delete execution-cluster-label -p flytesnacks -d development To delete execution cluster label using the config file that was used to create it, run: @@ -31,16 +31,16 @@ For example, here's the config file ecl.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks value: foo Value is optional in the file as it is unread during the delete command, but it can be retained since the same file can be used for 'get', 'update' and 'delete' commands. -To delete the execution cluster label of the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following: +To delete the execution cluster label of the workflow 'core.control_flow.merge_sort.merge_sort', run the following: :: - flytectl delete execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete execution-cluster-label -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage ` diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label_test.go b/flytectl/cmd/delete/matchable_execution_cluster_label_test.go index c36248c267..30d60f93e9 100644 --- a/flytectl/cmd/delete/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/delete/matchable_execution_cluster_label_test.go @@ -54,7 +54,7 @@ func TestDeleteExecutionClusterLabels(t *testing.T) { err := deleteExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { s := setup() @@ -96,7 +96,7 @@ func TestDeleteExecutionClusterLabels(t *testing.T) { err := deleteExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { @@ -110,7 +110,7 @@ func TestDeleteExecutionClusterLabels(t *testing.T) { err := deleteExecutionClusterLabel(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) t.Run("attribute deletion invalid file", func(t *testing.T) { @@ -125,6 +125,6 @@ func TestDeleteExecutionClusterLabels(t *testing.T) { fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) }) } diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute.go b/flytectl/cmd/delete/matchable_execution_queue_attribute.go index 0c222065ac..63ae7ff561 100644 --- a/flytectl/cmd/delete/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute.go @@ -15,10 +15,10 @@ const ( executionQueueAttributesLong = ` Delete execution queue attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete execution-queue-attribute -p flytectldemo -d development + flytectl delete execution-queue-attribute -p flytesnacks -d development Delete execution queue attribute using the config file which was used to create it. @@ -31,7 +31,7 @@ For example, here's the config file era.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks tags: - foo - bar @@ -40,11 +40,11 @@ For example, here's the config file era.yaml: Value is optional in the file as it is unread during the delete command but it can be retained since the same file can be used for get, update and delete commands. -To delete the execution queue attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: +To delete the execution queue attribute for the workflow 'core.control_flow.merge_sort.merge_sort', run the following command: :: - flytectl delete execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete execution-queue-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage ` diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go b/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go index 5c4843ede3..834ae48e78 100644 --- a/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go @@ -54,7 +54,7 @@ func TestDeleteExecutionQueueAttributes(t *testing.T) { err := deleteExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_QUEUE) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_EXECUTION_QUEUE) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { s := setup() @@ -96,7 +96,7 @@ func TestDeleteExecutionQueueAttributes(t *testing.T) { err := deleteExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_EXECUTION_QUEUE) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { @@ -110,7 +110,7 @@ func TestDeleteExecutionQueueAttributes(t *testing.T) { err := deleteExecutionQueueAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_EXECUTION_QUEUE) }) t.Run("attribute deletion invalid file", func(t *testing.T) { @@ -125,6 +125,6 @@ func TestDeleteExecutionQueueAttributes(t *testing.T) { fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_EXECUTION_QUEUE) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_EXECUTION_QUEUE) }) } diff --git a/flytectl/cmd/delete/matchable_plugin_override.go b/flytectl/cmd/delete/matchable_plugin_override.go index c96493cd91..a7705ed8d9 100644 --- a/flytectl/cmd/delete/matchable_plugin_override.go +++ b/flytectl/cmd/delete/matchable_plugin_override.go @@ -15,10 +15,10 @@ const ( pluginOverrideLong = ` Delete plugin override for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete plugin-override -p flytectldemo -d development + flytectl delete plugin-override -p flytesnacks -d development To delete plugin override using the config file which was used to create it, run: @@ -31,7 +31,7 @@ For example, here's the config file po.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks overrides: - task_type: python_task # Task type for which to apply plugin implementation overrides plugin_id: # Plugin id(s) to be used in place of the default for the task type. @@ -41,11 +41,11 @@ For example, here's the config file po.yaml: Overrides are optional in the file as they are unread during the delete command but can be retained since the same file can be used for get, update and delete commands. -To delete plugin override for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: +To delete plugin override for the workflow 'core.control_flow.merge_sort.merge_sort', run the following command: :: - flytectl delete plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete plugin-override -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage ` diff --git a/flytectl/cmd/delete/matchable_plugin_override_test.go b/flytectl/cmd/delete/matchable_plugin_override_test.go index af64254d3c..380412293c 100644 --- a/flytectl/cmd/delete/matchable_plugin_override_test.go +++ b/flytectl/cmd/delete/matchable_plugin_override_test.go @@ -54,7 +54,7 @@ func TestPluginOverride(t *testing.T) { err := deletePluginOverride(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_PLUGIN_OVERRIDE) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_PLUGIN_OVERRIDE) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { s := setup() @@ -96,7 +96,7 @@ func TestPluginOverride(t *testing.T) { err := deletePluginOverride(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_PLUGIN_OVERRIDE) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { @@ -110,7 +110,7 @@ func TestPluginOverride(t *testing.T) { err := deletePluginOverride(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_PLUGIN_OVERRIDE) }) t.Run("attribute deletion invalid file", func(t *testing.T) { @@ -125,6 +125,6 @@ func TestPluginOverride(t *testing.T) { fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_PLUGIN_OVERRIDE) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_PLUGIN_OVERRIDE) }) } diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute.go b/flytectl/cmd/delete/matchable_task_resource_attribute.go index 903c1f7dc8..f948ff8c5a 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute.go @@ -15,10 +15,10 @@ const ( taskResourceAttributesLong = ` Delete task resource attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete task-resource-attribute -p flytectldemo -d development + flytectl delete task-resource-attribute -p flytesnacks -d development To delete task resource attribute using the config file which was used to create it, run: @@ -31,7 +31,7 @@ For example, here's the config file tra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks defaults: cpu: "1" memory: "150Mi" @@ -41,11 +41,11 @@ For example, here's the config file tra.yaml: The defaults/limits are optional in the file as they are unread during the delete command, but can be retained since the same file can be used for 'get', 'update' and 'delete' commands. -To delete task resource attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: +To delete task resource attribute for the workflow 'core.control_flow.merge_sort.merge_sort', run the following command: :: - flytectl delete task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete task-resource-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage ` diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go index 62dd7930ce..71efaafac8 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go @@ -54,7 +54,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { err := deleteTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_TASK_RESOURCE) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_TASK_RESOURCE) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { s := setup() @@ -96,7 +96,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { err := deleteTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_TASK_RESOURCE) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { @@ -110,7 +110,7 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { err := deleteTaskResourceAttributes(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_TASK_RESOURCE) }) t.Run("attribute deletion invalid file", func(t *testing.T) { @@ -125,6 +125,6 @@ func TestDeleteTaskResourceAttributes(t *testing.T) { fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_TASK_RESOURCE) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_TASK_RESOURCE) }) } diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config.go b/flytectl/cmd/delete/matchable_workflow_execution_config.go index fda9525f80..d0a40c15c4 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config.go @@ -16,10 +16,10 @@ const ( workflowExecutionConfigLong = ` Delete workflow execution config for the given project and domain combination or additionally the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete workflow-execution-config -p flytectldemo -d development + flytectl delete workflow-execution-config -p flytesnacks -d development To delete workflow execution config using the config file which was used to create it, run: @@ -32,7 +32,7 @@ For example, here's the config file wec.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks max_parallelism: 5 security_context: run_as: @@ -40,11 +40,11 @@ For example, here's the config file wec.yaml: Max_parallelism is optional in the file as it is unread during the delete command but can be retained since the same file can be used for get, update and delete commands. -To delete workflow execution config for the workflow 'core.control_flow.run_merge_sort.merge_sort', run: +To delete workflow execution config for the workflow 'core.control_flow.merge_sort.merge_sort', run: :: - flytectl delete workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete workflow-execution-config -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage ` diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config_test.go b/flytectl/cmd/delete/matchable_workflow_execution_config_test.go index 592a53edba..800c7329d5 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config_test.go @@ -55,7 +55,7 @@ func TestDeleteWorkflowExecutionConfig(t *testing.T) { err := deleteWorkflowExecutionConfig(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) t.Run("successful workflow attribute deletion", func(t *testing.T) { s := setup() @@ -97,7 +97,7 @@ func TestDeleteWorkflowExecutionConfig(t *testing.T) { err := deleteWorkflowExecutionConfig(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.DeleterExt.AssertCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) t.Run("workflow attribute deletion non existent file", func(t *testing.T) { @@ -111,7 +111,7 @@ func TestDeleteWorkflowExecutionConfig(t *testing.T) { err := deleteWorkflowExecutionConfig(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) s.DeleterExt.AssertNotCalled(t, "DeleteWorkflowAttributes", - s.Ctx, "flytectldemo", "development", "core.control_flow.run_merge_sort.merge_sort", + s.Ctx, "flytesnacks", "development", "core.control_flow.merge_sort.merge_sort", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) t.Run("attribute deletion invalid file", func(t *testing.T) { @@ -126,6 +126,6 @@ func TestDeleteWorkflowExecutionConfig(t *testing.T) { fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) s.DeleterExt.AssertNotCalled(t, "DeleteProjectDomainAttributes", - s.Ctx, "flytectldemo", "development", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) + s.Ctx, "flytesnacks", "development", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) }) } diff --git a/flytectl/cmd/delete/testdata/invalid_attribute.yaml b/flytectl/cmd/delete/testdata/invalid_attribute.yaml index 3804d837a3..1e7868c1e2 100644 --- a/flytectl/cmd/delete/testdata/invalid_attribute.yaml +++ b/flytectl/cmd/delete/testdata/invalid_attribute.yaml @@ -1,5 +1,5 @@ InvalidDomain: development -InvalidProject: flytectldemo +InvalidProject: flytesnacks InvalidWorkflow: "" cpu: "1" memory: 150Mi \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_cluster_attribute.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_cluster_attribute.yaml index c6c25fa904..586fe522f3 100644 --- a/flytectl/cmd/delete/testdata/valid_project_domain_cluster_attribute.yaml +++ b/flytectl/cmd/delete/testdata/valid_project_domain_cluster_attribute.yaml @@ -1,5 +1,5 @@ domain: development -project: flytectldemo +project: flytesnacks attributes: "foo": "bar" "buzz": "lightyear" \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_execution_cluster_label.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_execution_cluster_label.yaml index 37f8a630c2..afade68509 100644 --- a/flytectl/cmd/delete/testdata/valid_project_domain_execution_cluster_label.yaml +++ b/flytectl/cmd/delete/testdata/valid_project_domain_execution_cluster_label.yaml @@ -1,3 +1,3 @@ domain: development -project: flytectldemo +project: flytesnacks value: foo \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_execution_queue_attribute.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_execution_queue_attribute.yaml index d04a525b88..1620c65762 100644 --- a/flytectl/cmd/delete/testdata/valid_project_domain_execution_queue_attribute.yaml +++ b/flytectl/cmd/delete/testdata/valid_project_domain_execution_queue_attribute.yaml @@ -1,5 +1,5 @@ domain: development -project: flytectldemo +project: flytesnacks tags: - foo - bar diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_plugin_override.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_plugin_override.yaml index a8ffc0fef8..9749e17100 100644 --- a/flytectl/cmd/delete/testdata/valid_project_domain_plugin_override.yaml +++ b/flytectl/cmd/delete/testdata/valid_project_domain_plugin_override.yaml @@ -1,5 +1,5 @@ domain: development -project: flytectldemo +project: flytesnacks overrides: - task_type: python_task plugin_id: diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml index a16186c80b..cd1a5c9abc 100644 --- a/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml +++ b/flytectl/cmd/delete/testdata/valid_project_domain_task_attribute.yaml @@ -1,5 +1,5 @@ domain: development -project: flytectldemo +project: flytesnacks defaults: cpu: "1" memory: 150Mi diff --git a/flytectl/cmd/delete/testdata/valid_project_domain_workflow_execution_config.yaml b/flytectl/cmd/delete/testdata/valid_project_domain_workflow_execution_config.yaml index c13e67fcd2..84b87197a1 100644 --- a/flytectl/cmd/delete/testdata/valid_project_domain_workflow_execution_config.yaml +++ b/flytectl/cmd/delete/testdata/valid_project_domain_workflow_execution_config.yaml @@ -1,3 +1,3 @@ domain: development -project: flytectldemo +project: flytesnacks max_parallelism: 5 \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_workflow_cluster_attribute.yaml b/flytectl/cmd/delete/testdata/valid_workflow_cluster_attribute.yaml index f8e7b17f65..e4030e455d 100644 --- a/flytectl/cmd/delete/testdata/valid_workflow_cluster_attribute.yaml +++ b/flytectl/cmd/delete/testdata/valid_workflow_cluster_attribute.yaml @@ -1,6 +1,6 @@ Domain: development -Project: flytectldemo -Workflow: core.control_flow.run_merge_sort.merge_sort +Project: flytesnacks +Workflow: core.control_flow.merge_sort.merge_sort attributes: "foo": "bar" "buzz": "lightyear" \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_workflow_execution_cluster_label.yaml b/flytectl/cmd/delete/testdata/valid_workflow_execution_cluster_label.yaml index ccd978fa76..068cbe9926 100644 --- a/flytectl/cmd/delete/testdata/valid_workflow_execution_cluster_label.yaml +++ b/flytectl/cmd/delete/testdata/valid_workflow_execution_cluster_label.yaml @@ -1,4 +1,4 @@ domain: development -project: flytectldemo -workflow: core.control_flow.run_merge_sort.merge_sort +project: flytesnacks +workflow: core.control_flow.merge_sort.merge_sort value: foo \ No newline at end of file diff --git a/flytectl/cmd/delete/testdata/valid_workflow_execution_queue_attribute.yaml b/flytectl/cmd/delete/testdata/valid_workflow_execution_queue_attribute.yaml index 7c69c43fec..d8952b1a6c 100644 --- a/flytectl/cmd/delete/testdata/valid_workflow_execution_queue_attribute.yaml +++ b/flytectl/cmd/delete/testdata/valid_workflow_execution_queue_attribute.yaml @@ -1,6 +1,6 @@ domain: development -project: flytectldemo -workflow: core.control_flow.run_merge_sort.merge_sort +project: flytesnacks +workflow: core.control_flow.merge_sort.merge_sort tags: - foo - bar diff --git a/flytectl/cmd/delete/testdata/valid_workflow_plugin_override.yaml b/flytectl/cmd/delete/testdata/valid_workflow_plugin_override.yaml index 6fbb58eae0..5b35e23e31 100644 --- a/flytectl/cmd/delete/testdata/valid_workflow_plugin_override.yaml +++ b/flytectl/cmd/delete/testdata/valid_workflow_plugin_override.yaml @@ -1,6 +1,6 @@ domain: development -project: flytectldemo -workflow: core.control_flow.run_merge_sort.merge_sort +project: flytesnacks +workflow: core.control_flow.merge_sort.merge_sort overrides: - task_type: python_task plugin_id: diff --git a/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml b/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml index 3b8d08cc79..7c22207689 100644 --- a/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml +++ b/flytectl/cmd/delete/testdata/valid_workflow_task_attribute.yaml @@ -1,6 +1,6 @@ domain: development -project: flytectldemo -workflow: core.control_flow.run_merge_sort.merge_sort +project: flytesnacks +workflow: core.control_flow.merge_sort.merge_sort defaults: cpu: "2" memory: 250Mi diff --git a/flytectl/cmd/delete/testdata/valid_workflow_workflow_execution_config.yaml b/flytectl/cmd/delete/testdata/valid_workflow_workflow_execution_config.yaml index c2b0879f1e..e4f6ec0049 100644 --- a/flytectl/cmd/delete/testdata/valid_workflow_workflow_execution_config.yaml +++ b/flytectl/cmd/delete/testdata/valid_workflow_workflow_execution_config.yaml @@ -1,4 +1,4 @@ domain: development -project: flytectldemo -workflow: core.control_flow.run_merge_sort.merge_sort +project: flytesnacks +workflow: core.control_flow.merge_sort.merge_sort max_parallelism: 5 \ No newline at end of file diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index c9c1d053de..edd7ea7c38 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -97,7 +97,7 @@ Retrieve a launch plan within the project and domain as per a version and genera :: - flytectl get launchplan -d development -p flytectldemo core.advanced.run_merge_sort.merge_sort --execFile execution_spec.yaml + flytectl get launchplan -d development -p flytesnacks core.control_flow.merge_sort.merge_sort --execFile execution_spec.yaml The generated file would look similar to this: @@ -113,7 +113,7 @@ The generated file would look similar to this: targetDomain: "" targetProject: "" version: v3 - workflow: core.advanced.run_merge_sort.merge_sort + workflow: core.control_flow.merge_sort.merge_sort Check the :ref:` + "`create execution section`" + ` on how to launch one using the generated file. Usage diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute.go b/flytectl/cmd/get/matchable_cluster_resource_attribute.go index 89830dfec8..6fcf66213e 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute.go @@ -14,28 +14,28 @@ const ( clusterResourceAttributesShort = "Gets matchable resources of cluster resource attributes." clusterResourceAttributesLong = ` Retrieve cluster resource attributes for the given project and domain. -For project flytectldemo and development domain: +For project flytesnacks and development domain: :: - flytectl get cluster-resource-attribute -p flytectldemo -d development + flytectl get cluster-resource-attribute -p flytesnacks -d development Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} + {"project":"flytesnacks","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} Retrieve cluster resource attributes for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain, and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get cluster-resource-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} + {"project":"flytesnacks","domain":"development","workflow":"core.control_flow.merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} Write the cluster resource attributes to a file. If there are no cluster resource attributes, the command throws an error. The config file is written to cra.yaml file. @@ -49,7 +49,7 @@ Example: content of cra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks attributes: foo: "bar" buzz: "lightyear" diff --git a/flytectl/cmd/get/matchable_execution_cluster_label.go b/flytectl/cmd/get/matchable_execution_cluster_label.go index c665a48db0..89cf5cf48d 100644 --- a/flytectl/cmd/get/matchable_execution_cluster_label.go +++ b/flytectl/cmd/get/matchable_execution_cluster_label.go @@ -15,28 +15,28 @@ const ( executionClusterLabelLong = ` Retrieve the execution cluster label for a given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl get execution-cluster-label -p flytectldemo -d development + flytectl get execution-cluster-label -p flytesnacks -d development The output would look like: .. code-block:: json - {"project":"flytectldemo","domain":"development","value":"foo"} + {"project":"flytesnacks","domain":"development","value":"foo"} Retrieve the execution cluster label for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain, and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get execution-cluster-label -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","value":"foo"} + {"project":"flytesnacks","domain":"development","workflow":"core.control_flow.merge_sort.merge_sort","value":"foo"} Write the execution cluster label to a file. If there is no execution cluster label, the command throws an error. The config file is written to ecl.yaml file. @@ -50,7 +50,7 @@ Example: content of ecl.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks value: foo Usage diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute.go b/flytectl/cmd/get/matchable_execution_queue_attribute.go index 796b405d0d..533b53a6d6 100644 --- a/flytectl/cmd/get/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/get/matchable_execution_queue_attribute.go @@ -14,28 +14,28 @@ const ( executionQueueAttributesShort = "Gets matchable resources of execution queue attributes." executionQueueAttributesLong = ` Retrieve the execution queue attribute for the given project and domain. -For project flytectldemo and development domain: +For project flytesnacks and development domain: :: - flytectl get execution-queue-attribute -p flytectldemo -d development + flytectl get execution-queue-attribute -p flytesnacks -d development Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} + {"project":"flytesnacks","domain":"development","tags":["foo", "bar"]} Retrieve the execution queue attribute for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain, and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get execution-queue-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","tags":["foo", "bar"]} + {"project":"flytesnacks","domain":"development","workflow":"core.control_flow.merge_sort.merge_sort","tags":["foo", "bar"]} Write the execution queue attribute to a file. If there are no execution queue attributes, the command throws an error. The config file is written to era.yaml file. @@ -49,7 +49,7 @@ Example: content of era.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks tags: - foo - bar diff --git a/flytectl/cmd/get/matchable_plugin_override.go b/flytectl/cmd/get/matchable_plugin_override.go index eaac3d0dee..8ff08ee615 100644 --- a/flytectl/cmd/get/matchable_plugin_override.go +++ b/flytectl/cmd/get/matchable_plugin_override.go @@ -14,18 +14,18 @@ const ( pluginOverrideShort = "Gets matchable resources of plugin override." pluginOverrideLong = ` Retrieve the plugin override for the given project and domain. -For project flytectldemo and development domain: +For project flytesnacks and development domain: :: - flytectl get plugin-override -p flytectldemo -d development + flytectl get plugin-override -p flytesnacks -d development Example: output from the command .. code-block:: json { - "project": "flytectldemo", + "project": "flytesnacks", "domain": "development", "overrides": [{ "task_type": "python_task", @@ -35,19 +35,19 @@ Example: output from the command } Retrieve the plugin override for the given project, domain, and workflow. -For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get plugin-override -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json { - "project": "flytectldemo", + "project": "flytesnacks", "domain": "development", - "workflow": "core.control_flow.run_merge_sort.merge_sort" + "workflow": "core.control_flow.merge_sort.merge_sort" "overrides": [{ "task_type": "python_task", "plugin_id": ["pluginoverride1", "pluginoverride2"], @@ -67,7 +67,7 @@ Example: content of po.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks overrides: - task_type: python_task # Task type for which to apply plugin implementation overrides plugin_id: # Plugin id(s) to be used in place of the default for the task type. diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go index 63ef50da19..40183615c1 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -14,28 +14,28 @@ const ( taskResourceAttributesShort = "Gets matchable resources of task attributes." taskResourceAttributesLong = ` Retrieve task resource attributes for the given project and domain. -For project flytectldemo and development domain: +For project flytesnacks and development domain: :: - flytectl get task-resource-attribute -p flytectldemo -d development + flytectl get task-resource-attribute -p flytesnacks -d development Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + {"project":"flytesnacks","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} Retrieve task resource attributes for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain, and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get task-resource-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + {"project":"flytesnacks","domain":"development","workflow":"core.control_flow.merge_sort.merge_sort","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} Write the task resource attributes to a file. If there are no task resource attributes, a file would be populated with the basic data. @@ -50,7 +50,7 @@ Example: content of tra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks defaults: cpu: "1" memory: "150Mi" diff --git a/flytectl/cmd/get/matchable_workflow_execution_config.go b/flytectl/cmd/get/matchable_workflow_execution_config.go index 35fd4ce06d..59098e4a1d 100644 --- a/flytectl/cmd/get/matchable_workflow_execution_config.go +++ b/flytectl/cmd/get/matchable_workflow_execution_config.go @@ -20,37 +20,37 @@ const ( workflowExecutionConfigLong = ` Retrieve workflow execution config for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain: +For project flytesnacks and development domain: :: - flytectl get workflow-execution-config -p flytectldemo -d development + flytectl get workflow-execution-config -p flytesnacks -d development Example: output from the command: .. code-block:: json { - "project": "flytectldemo", + "project": "flytesnacks", "domain": "development", "max_parallelism": 5 } Retrieve workflow execution config for the project, domain, and workflow. -For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get workflow-execution-config -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json { - "project": "flytectldemo", + "project": "flytesnacks", "domain": "development", - "workflow": "core.control_flow.run_merge_sort.merge_sort" + "workflow": "core.control_flow.merge_sort.merge_sort" "max_parallelism": 5 } @@ -60,13 +60,13 @@ Example: content of wec.yaml: :: - flytectl get workflow-execution-config -p flytectldemo -d development --attrFile wec.yaml + flytectl get workflow-execution-config -p flytesnacks -d development --attrFile wec.yaml .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks max_parallelism: 5 Generate a sample workflow execution config file to be used for creating a new workflow execution config at project domain diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index d4226d86dd..7a5e9dc70d 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -78,7 +78,7 @@ Retrieve tasks within project and domain for a version and generate the executio :: - flytectl get tasks -d development -p flytesnacks core.advanced.run_merge_sort.merge --execFile execution_spec.yaml --version v2 + flytectl get tasks -d development -p flytesnacks core.control_flow.merge_sort.merge --execFile execution_spec.yaml --version v2 The generated file would look similar to this: @@ -93,7 +93,7 @@ The generated file would look similar to this: kubeServiceAcct: "" targetDomain: "" targetProject: "" - task: core.advanced.run_merge_sort.merge + task: core.control_flow.merge_sort.merge version: v2 Check the create execution section on how to launch one using the generated file. diff --git a/flytectl/cmd/testdata/invalid_execution_spec.yaml b/flytectl/cmd/testdata/invalid_execution_spec.yaml index 556bb512c7..cc7d0c32a8 100644 --- a/flytectl/cmd/testdata/invalid_execution_spec.yaml +++ b/flytectl/cmd/testdata/invalid_execution_spec.yaml @@ -8,5 +8,5 @@ kubeServiceAcct: "" targetDomain: "" targetProject: "" version: v3 -workflow: core.advanced.run_merge_sort.merge_sort -task: core.advanced.run_merge_sort.merge +workflow: core.control_flow.merge_sort.merge_sort +task: core.control_flow.merge_sort.merge diff --git a/flytectl/cmd/testdata/launchplan_execution_spec.yaml b/flytectl/cmd/testdata/launchplan_execution_spec.yaml index aa23903ed8..a396f67ba2 100644 --- a/flytectl/cmd/testdata/launchplan_execution_spec.yaml +++ b/flytectl/cmd/testdata/launchplan_execution_spec.yaml @@ -8,4 +8,4 @@ kubeServiceAcct: "" targetDomain: "" targetProject: "" version: v3 -workflow: core.advanced.run_merge_sort.merge_sort +workflow: core.control_flow.merge_sort.merge_sort diff --git a/flytectl/cmd/testdata/task_execution_spec.yaml b/flytectl/cmd/testdata/task_execution_spec.yaml index aa33cdb355..4381c1df75 100644 --- a/flytectl/cmd/testdata/task_execution_spec.yaml +++ b/flytectl/cmd/testdata/task_execution_spec.yaml @@ -11,5 +11,5 @@ inputs: kubeServiceAcct: "kubeServiceAcct" targetDomain: "development" targetProject: "flytesnacks" -task: core.advanced.run_merge_sort.merge +task: core.control_flow.merge_sort.merge version: v2 diff --git a/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml b/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml index 14cd2df32d..c74db53eef 100644 --- a/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml +++ b/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml @@ -11,5 +11,5 @@ inputs: kubeServiceAcct: "" targetDomain: "development" targetProject: "flytesnacks" -task: core.advanced.run_merge_sort.merge +task: core.control_flow.merge_sort.merge version: v2 diff --git a/flytectl/cmd/update/execution.go b/flytectl/cmd/update/execution.go index a32d4cddc4..517a28a352 100644 --- a/flytectl/cmd/update/execution.go +++ b/flytectl/cmd/update/execution.go @@ -19,12 +19,12 @@ const ( Activate an execution; and it shows up in the CLI and UI: :: - flytectl update execution -p flytectldemo -d development oeh94k9r2r --activate + flytectl update execution -p flytesnacks -d development oeh94k9r2r --activate Archive an execution; and it is hidden from the CLI and UI: :: - flytectl update execution -p flytectldemo -d development oeh94k9r2r --archive + flytectl update execution -p flytesnacks -d development oeh94k9r2r --archive Usage diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go index 51552fbf8a..58befbbd65 100644 --- a/flytectl/cmd/update/launch_plan.go +++ b/flytectl/cmd/update/launch_plan.go @@ -19,12 +19,12 @@ const ( Activates a launch plan which activates the scheduled job associated with it: :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --activate + flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --activate Archives a launch plan which deschedules any scheduled job associated with it: :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --archive + flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --archive Usage diff --git a/flytectl/cmd/update/launch_plan_meta.go b/flytectl/cmd/update/launch_plan_meta.go index 9efa37533e..e9aa1ae9a1 100644 --- a/flytectl/cmd/update/launch_plan_meta.go +++ b/flytectl/cmd/update/launch_plan_meta.go @@ -16,17 +16,17 @@ const ( Update the description on the launch plan: :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort example" + flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --description "Mergesort example" Archiving launch plan named entity is not supported and would throw an error: :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --archive Activating launch plan named entity would be a noop: :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate + flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --activate Usage ` diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute.go b/flytectl/cmd/update/matchable_cluster_resource_attribute.go index 7da3bc3c1c..79c03480ba 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute.go @@ -21,7 +21,7 @@ Example: content of cra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks attributes: foo: "bar" buzz: "lightyear" @@ -35,13 +35,13 @@ resource attribute defined at project domain level. This will completely overwrite any existing custom project, domain and workflow combination attributes. It is preferable to do get and generate an attribute file if there is an existing attribute that is already set and then update it to have new values. Refer to get cluster-resource-attribute section on how to generate this file. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort attributes: foo: "bar" buzz: "lightyear" diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go index 19c9257d69..c9261393a8 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go @@ -31,7 +31,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { mock.Anything).Return(nil) err := updateClusterResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed to update project domain attribute", func(t *testing.T) { s := setup() @@ -54,7 +54,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed to update workflow attribute", func(t *testing.T) { s := setup() diff --git a/flytectl/cmd/update/matchable_execution_cluster_label.go b/flytectl/cmd/update/matchable_execution_cluster_label.go index 223001cdfb..e3c41e1015 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label.go @@ -21,7 +21,7 @@ Example: content of ecl.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks value: foo :: @@ -30,13 +30,13 @@ Example: content of ecl.yaml: Update execution cluster label for project, domain, and workflow combination. This will take precedence over any other execution cluster label defined at project domain level. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort value: foo :: diff --git a/flytectl/cmd/update/matchable_execution_cluster_label_test.go b/flytectl/cmd/update/matchable_execution_cluster_label_test.go index 500c082673..2a4e7d500c 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label_test.go @@ -31,7 +31,7 @@ func TestExecutionClusterLabel(t *testing.T) { mock.Anything).Return(nil) err := updateExecutionClusterLabelFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { s := setup() @@ -54,7 +54,7 @@ func TestExecutionClusterLabel(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { s := setup() diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute.go b/flytectl/cmd/update/matchable_execution_queue_attribute.go index e324fee2e0..feb8d5224b 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute.go @@ -24,7 +24,7 @@ Example: content of era.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks tags: - foo - bar @@ -37,13 +37,13 @@ Example: content of era.yaml: Update execution queue attribute for project, domain, and workflow combination. This will take precedence over any other execution queue attribute defined at project domain level. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort tags: - foo - bar diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go index 4ba42eadc2..f789c0d8cc 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go @@ -31,7 +31,7 @@ func TestExecutionQueueAttributes(t *testing.T) { mock.Anything).Return(nil) err := updateExecutionQueueAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { s := setup() @@ -54,7 +54,7 @@ func TestExecutionQueueAttributes(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { s := setup() diff --git a/flytectl/cmd/update/matchable_plugin_override.go b/flytectl/cmd/update/matchable_plugin_override.go index 52a2837ab8..981a124b50 100644 --- a/flytectl/cmd/update/matchable_plugin_override.go +++ b/flytectl/cmd/update/matchable_plugin_override.go @@ -24,7 +24,7 @@ Example: content of po.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks overrides: - task_type: python_task # Task type for which to apply plugin implementation overrides plugin_id: # Plugin id(s) to be used in place of the default for the task type. @@ -38,13 +38,13 @@ Example: content of po.yaml: Update plugin override for project, domain, and workflow combination. This will take precedence over any other plugin overrides defined at project domain level. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort overrides: - task_type: python_task # Task type for which to apply plugin implementation overrides plugin_id: # Plugin id(s) to be used in place of the default for the task type. diff --git a/flytectl/cmd/update/matchable_plugin_override_test.go b/flytectl/cmd/update/matchable_plugin_override_test.go index 644144a29c..f8fcef96a7 100644 --- a/flytectl/cmd/update/matchable_plugin_override_test.go +++ b/flytectl/cmd/update/matchable_plugin_override_test.go @@ -31,7 +31,7 @@ func TestPluginOverride(t *testing.T) { mock.Anything).Return(nil) err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { s := setup() @@ -54,7 +54,7 @@ func TestPluginOverride(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { s := setup() diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go index 7b3e72cfda..e18825c069 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -24,7 +24,7 @@ Example: content of tra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks defaults: cpu: "1" memory: "150Mi" @@ -38,13 +38,13 @@ Example: content of tra.yaml: Update task resource attribute for project, domain, and workflow combination. This will take precedence over any other resource attribute defined at project domain level. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort defaults: cpu: "1" memory: "150Mi" diff --git a/flytectl/cmd/update/matchable_task_resource_attribute_test.go b/flytectl/cmd/update/matchable_task_resource_attribute_test.go index 39f1cffc9b..079fee9dce 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute_test.go @@ -31,7 +31,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { mock.Anything).Return(nil) err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { s := setup() @@ -54,7 +54,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { s := setup() diff --git a/flytectl/cmd/update/matchable_workflow_execution_config.go b/flytectl/cmd/update/matchable_workflow_execution_config.go index 5a1c28d2d2..d6bf2a2ad5 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config.go @@ -25,7 +25,7 @@ Example: content of wec.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks max_parallelism: 5 security_context: run_as: @@ -37,13 +37,13 @@ Example: content of wec.yaml: Update workflow execution config for project, domain, and workflow combination. This will take precedence over any other execution config defined at project domain level. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort max_parallelism: 5 security_context: run_as: diff --git a/flytectl/cmd/update/matchable_workflow_execution_config_test.go b/flytectl/cmd/update/matchable_workflow_execution_config_test.go index 9b9ba63001..f4f1834c83 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config_test.go @@ -32,7 +32,7 @@ func TestWorkflowExecutionConfigs(t *testing.T) { mock.Anything).Return(nil) err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { s := setup() @@ -55,7 +55,7 @@ func TestWorkflowExecutionConfigs(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytectldemo project and domain development and workflow core.control_flow.run_merge_sort.merge_sort`) + tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { s := setup() diff --git a/flytectl/cmd/update/task_meta.go b/flytectl/cmd/update/task_meta.go index 40d4ee4410..82f6d7a238 100644 --- a/flytectl/cmd/update/task_meta.go +++ b/flytectl/cmd/update/task_meta.go @@ -16,17 +16,17 @@ const ( Update the description on the task: :: - flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --description "Merge sort example" + flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --description "Merge sort example" Archiving task named entity is not supported and would throw an error: :: - flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --archive + flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --archive Activating task named entity would be a noop since archiving is not possible: :: - flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --activate + flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --activate Usage ` diff --git a/flytectl/cmd/update/testdata/invalid_attribute.yaml b/flytectl/cmd/update/testdata/invalid_attribute.yaml index 3804d837a3..1e7868c1e2 100644 --- a/flytectl/cmd/update/testdata/invalid_attribute.yaml +++ b/flytectl/cmd/update/testdata/invalid_attribute.yaml @@ -1,5 +1,5 @@ InvalidDomain: development -InvalidProject: flytectldemo +InvalidProject: flytesnacks InvalidWorkflow: "" cpu: "1" memory: 150Mi \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_project_domain_cluster_attribute.yaml b/flytectl/cmd/update/testdata/valid_project_domain_cluster_attribute.yaml index c6c25fa904..586fe522f3 100644 --- a/flytectl/cmd/update/testdata/valid_project_domain_cluster_attribute.yaml +++ b/flytectl/cmd/update/testdata/valid_project_domain_cluster_attribute.yaml @@ -1,5 +1,5 @@ domain: development -project: flytectldemo +project: flytesnacks attributes: "foo": "bar" "buzz": "lightyear" \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_project_domain_execution_cluster_label.yaml b/flytectl/cmd/update/testdata/valid_project_domain_execution_cluster_label.yaml index 37f8a630c2..afade68509 100644 --- a/flytectl/cmd/update/testdata/valid_project_domain_execution_cluster_label.yaml +++ b/flytectl/cmd/update/testdata/valid_project_domain_execution_cluster_label.yaml @@ -1,3 +1,3 @@ domain: development -project: flytectldemo +project: flytesnacks value: foo \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_project_domain_execution_queue_attribute.yaml b/flytectl/cmd/update/testdata/valid_project_domain_execution_queue_attribute.yaml index d04a525b88..1620c65762 100644 --- a/flytectl/cmd/update/testdata/valid_project_domain_execution_queue_attribute.yaml +++ b/flytectl/cmd/update/testdata/valid_project_domain_execution_queue_attribute.yaml @@ -1,5 +1,5 @@ domain: development -project: flytectldemo +project: flytesnacks tags: - foo - bar diff --git a/flytectl/cmd/update/testdata/valid_project_domain_plugin_override.yaml b/flytectl/cmd/update/testdata/valid_project_domain_plugin_override.yaml index a8ffc0fef8..9749e17100 100644 --- a/flytectl/cmd/update/testdata/valid_project_domain_plugin_override.yaml +++ b/flytectl/cmd/update/testdata/valid_project_domain_plugin_override.yaml @@ -1,5 +1,5 @@ domain: development -project: flytectldemo +project: flytesnacks overrides: - task_type: python_task plugin_id: diff --git a/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml b/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml index a16186c80b..cd1a5c9abc 100644 --- a/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml +++ b/flytectl/cmd/update/testdata/valid_project_domain_task_attribute.yaml @@ -1,5 +1,5 @@ domain: development -project: flytectldemo +project: flytesnacks defaults: cpu: "1" memory: 150Mi diff --git a/flytectl/cmd/update/testdata/valid_project_domain_workflow_execution_config.yaml b/flytectl/cmd/update/testdata/valid_project_domain_workflow_execution_config.yaml index c13e67fcd2..84b87197a1 100644 --- a/flytectl/cmd/update/testdata/valid_project_domain_workflow_execution_config.yaml +++ b/flytectl/cmd/update/testdata/valid_project_domain_workflow_execution_config.yaml @@ -1,3 +1,3 @@ domain: development -project: flytectldemo +project: flytesnacks max_parallelism: 5 \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_workflow_cluster_attribute.yaml b/flytectl/cmd/update/testdata/valid_workflow_cluster_attribute.yaml index f8e7b17f65..e4030e455d 100644 --- a/flytectl/cmd/update/testdata/valid_workflow_cluster_attribute.yaml +++ b/flytectl/cmd/update/testdata/valid_workflow_cluster_attribute.yaml @@ -1,6 +1,6 @@ Domain: development -Project: flytectldemo -Workflow: core.control_flow.run_merge_sort.merge_sort +Project: flytesnacks +Workflow: core.control_flow.merge_sort.merge_sort attributes: "foo": "bar" "buzz": "lightyear" \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_workflow_execution_cluster_label.yaml b/flytectl/cmd/update/testdata/valid_workflow_execution_cluster_label.yaml index ccd978fa76..068cbe9926 100644 --- a/flytectl/cmd/update/testdata/valid_workflow_execution_cluster_label.yaml +++ b/flytectl/cmd/update/testdata/valid_workflow_execution_cluster_label.yaml @@ -1,4 +1,4 @@ domain: development -project: flytectldemo -workflow: core.control_flow.run_merge_sort.merge_sort +project: flytesnacks +workflow: core.control_flow.merge_sort.merge_sort value: foo \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_workflow_execution_queue_attribute.yaml b/flytectl/cmd/update/testdata/valid_workflow_execution_queue_attribute.yaml index 7c69c43fec..d8952b1a6c 100644 --- a/flytectl/cmd/update/testdata/valid_workflow_execution_queue_attribute.yaml +++ b/flytectl/cmd/update/testdata/valid_workflow_execution_queue_attribute.yaml @@ -1,6 +1,6 @@ domain: development -project: flytectldemo -workflow: core.control_flow.run_merge_sort.merge_sort +project: flytesnacks +workflow: core.control_flow.merge_sort.merge_sort tags: - foo - bar diff --git a/flytectl/cmd/update/testdata/valid_workflow_plugin_override.yaml b/flytectl/cmd/update/testdata/valid_workflow_plugin_override.yaml index 6fbb58eae0..5b35e23e31 100644 --- a/flytectl/cmd/update/testdata/valid_workflow_plugin_override.yaml +++ b/flytectl/cmd/update/testdata/valid_workflow_plugin_override.yaml @@ -1,6 +1,6 @@ domain: development -project: flytectldemo -workflow: core.control_flow.run_merge_sort.merge_sort +project: flytesnacks +workflow: core.control_flow.merge_sort.merge_sort overrides: - task_type: python_task plugin_id: diff --git a/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml b/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml index 3b8d08cc79..7c22207689 100644 --- a/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml +++ b/flytectl/cmd/update/testdata/valid_workflow_task_attribute.yaml @@ -1,6 +1,6 @@ domain: development -project: flytectldemo -workflow: core.control_flow.run_merge_sort.merge_sort +project: flytesnacks +workflow: core.control_flow.merge_sort.merge_sort defaults: cpu: "2" memory: 250Mi diff --git a/flytectl/cmd/update/testdata/valid_workflow_workflow_execution_config.yaml b/flytectl/cmd/update/testdata/valid_workflow_workflow_execution_config.yaml index c2b0879f1e..e4f6ec0049 100644 --- a/flytectl/cmd/update/testdata/valid_workflow_workflow_execution_config.yaml +++ b/flytectl/cmd/update/testdata/valid_workflow_workflow_execution_config.yaml @@ -1,4 +1,4 @@ domain: development -project: flytectldemo -workflow: core.control_flow.run_merge_sort.merge_sort +project: flytesnacks +workflow: core.control_flow.merge_sort.merge_sort max_parallelism: 5 \ No newline at end of file diff --git a/flytectl/cmd/update/workflow_meta.go b/flytectl/cmd/update/workflow_meta.go index 5db98b44de..6da5c6bff0 100644 --- a/flytectl/cmd/update/workflow_meta.go +++ b/flytectl/cmd/update/workflow_meta.go @@ -16,17 +16,17 @@ const ( Update the description on the workflow: :: - flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort workflow example" + flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --description "Mergesort workflow example" -Archiving workflow named entity would cause this to disapper from flyteconsole UI: +Archiving workflow named entity would cause this to disappear from flyteconsole UI: :: - flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --archive Activate workflow named entity: :: - flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate + flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --activate Usage ` diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 35ee472b27..4654bb338e 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -17,7 +17,7 @@ There are three steps to generate an execution, as outlined below: 1. Generate the execution spec file using the :ref:`get task ` command. :: - flytectl get tasks -d development -p flytectldemo core.advanced.run_merge_sort.merge --version v2 --execFile execution_spec.yaml + flytectl get tasks -d development -p flytesnacks core.control_flow.merge_sort.merge --version v2 --execFile execution_spec.yaml The generated file would look similar to the following: @@ -32,7 +32,7 @@ The generated file would look similar to the following: kubeServiceAcct: "" targetDomain: "" targetProject: "" - task: core.advanced.run_merge_sort.merge + task: core.control_flow.merge_sort.merge version: "v2" 2. [Optional] Update the inputs for the execution, if needed. @@ -53,7 +53,7 @@ The generated spec file can be modified to change the input values, as shown bel kubeServiceAcct: "" targetDomain: "" targetProject: "" - task: core.advanced.run_merge_sort.merge + task: core.control_flow.merge_sort.merge version: "v2" 3. Run the execution by passing the generated YAML file. @@ -67,13 +67,13 @@ To relaunch an execution, pass the current execution ID as follows: :: - flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytectldemo -d development + flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytesnacks -d development To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: :: - flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytectldemo -d development + flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytesnacks -d development See :ref:`ref_flyteidl.admin.ExecutionRecoverRequest` for more details. @@ -82,7 +82,7 @@ The following is an example of how generic data can be specified while creating :: - flytectl get task -d development -p flytectldemo core.type_system.custom_objects.add --execFile adddatanum.yaml + flytectl get task -d development -p flytesnacks core.type_system.custom_objects.add --execFile adddatanum.yaml The generated file would look similar to this. Here, empty values have been dumped for generic data types 'x' and 'y'. :: diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index ee68b7ad4d..e2037d0d82 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -12,10 +12,10 @@ Synopsis Delete cluster resource attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete cluster-resource-attribute -p flytectldemo -d development + flytectl delete cluster-resource-attribute -p flytesnacks -d development To delete cluster resource attribute using the config file that was used to create it, run: @@ -29,18 +29,18 @@ For example, here's the config file cra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks attributes: foo: "bar" buzz: "lightyear" Attributes are optional in the file, which are unread during the 'delete' command but can be retained since the same file can be used for 'get', 'update' and 'delete' commands. -To delete cluster resource attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run: +To delete cluster resource attribute for the workflow 'core.control_flow.merge_sort.merge_sort', run: :: - flytectl delete cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete cluster-resource-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 62d9ba8b7a..cafac8401b 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -12,10 +12,10 @@ Synopsis Delete execution cluster label for a given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete execution-cluster-label -p flytectldemo -d development + flytectl delete execution-cluster-label -p flytesnacks -d development To delete execution cluster label using the config file that was used to create it, run: @@ -28,16 +28,16 @@ For example, here's the config file ecl.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks value: foo Value is optional in the file as it is unread during the delete command, but it can be retained since the same file can be used for 'get', 'update' and 'delete' commands. -To delete the execution cluster label of the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following: +To delete the execution cluster label of the workflow 'core.control_flow.merge_sort.merge_sort', run the following: :: - flytectl delete execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete execution-cluster-label -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 298a66eedc..9bb961ffe4 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -12,10 +12,10 @@ Synopsis Delete execution queue attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete execution-queue-attribute -p flytectldemo -d development + flytectl delete execution-queue-attribute -p flytesnacks -d development Delete execution queue attribute using the config file which was used to create it. @@ -28,7 +28,7 @@ For example, here's the config file era.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks tags: - foo - bar @@ -37,11 +37,11 @@ For example, here's the config file era.yaml: Value is optional in the file as it is unread during the delete command but it can be retained since the same file can be used for get, update and delete commands. -To delete the execution queue attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: +To delete the execution queue attribute for the workflow 'core.control_flow.merge_sort.merge_sort', run the following command: :: - flytectl delete execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete execution-queue-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index 778ea57581..2a535f6ec5 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -12,10 +12,10 @@ Synopsis Delete plugin override for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete plugin-override -p flytectldemo -d development + flytectl delete plugin-override -p flytesnacks -d development To delete plugin override using the config file which was used to create it, run: @@ -28,7 +28,7 @@ For example, here's the config file po.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks overrides: - task_type: python_task # Task type for which to apply plugin implementation overrides plugin_id: # Plugin id(s) to be used in place of the default for the task type. @@ -38,11 +38,11 @@ For example, here's the config file po.yaml: Overrides are optional in the file as they are unread during the delete command but can be retained since the same file can be used for get, update and delete commands. -To delete plugin override for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: +To delete plugin override for the workflow 'core.control_flow.merge_sort.merge_sort', run the following command: :: - flytectl delete plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete plugin-override -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index ed77f80fd3..c4ad6b2f11 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -12,10 +12,10 @@ Synopsis Delete task resource attributes for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete task-resource-attribute -p flytectldemo -d development + flytectl delete task-resource-attribute -p flytesnacks -d development To delete task resource attribute using the config file which was used to create it, run: @@ -28,7 +28,7 @@ For example, here's the config file tra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks defaults: cpu: "1" memory: "150Mi" @@ -38,11 +38,11 @@ For example, here's the config file tra.yaml: The defaults/limits are optional in the file as they are unread during the delete command, but can be retained since the same file can be used for 'get', 'update' and 'delete' commands. -To delete task resource attribute for the workflow 'core.control_flow.run_merge_sort.merge_sort', run the following command: +To delete task resource attribute for the workflow 'core.control_flow.merge_sort.merge_sort', run the following command: :: - flytectl delete task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete task-resource-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 212567054a..fb5c34af6f 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -12,10 +12,10 @@ Synopsis Delete workflow execution config for the given project and domain combination or additionally the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl delete workflow-execution-config -p flytectldemo -d development + flytectl delete workflow-execution-config -p flytesnacks -d development To delete workflow execution config using the config file which was used to create it, run: @@ -28,7 +28,7 @@ For example, here's the config file wec.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks max_parallelism: 5 security_context: run_as: @@ -36,11 +36,11 @@ For example, here's the config file wec.yaml: Max_parallelism is optional in the file as it is unread during the delete command but can be retained since the same file can be used for get, update and delete commands. -To delete workflow execution config for the workflow 'core.control_flow.run_merge_sort.merge_sort', run: +To delete workflow execution config for the workflow 'core.control_flow.merge_sort.merge_sort', run: :: - flytectl delete workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl delete workflow-execution-config -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Usage diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index f175399b2d..beb1a279db 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -11,28 +11,28 @@ Synopsis Retrieve cluster resource attributes for the given project and domain. -For project flytectldemo and development domain: +For project flytesnacks and development domain: :: - flytectl get cluster-resource-attribute -p flytectldemo -d development + flytectl get cluster-resource-attribute -p flytesnacks -d development Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} + {"project":"flytesnacks","domain":"development","attributes":{"buzz":"lightyear","foo":"bar"}} Retrieve cluster resource attributes for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain, and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get cluster-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get cluster-resource-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} + {"project":"flytesnacks","domain":"development","workflow":"core.control_flow.merge_sort.merge_sort","attributes":{"buzz":"lightyear","foo":"bar"}} Write the cluster resource attributes to a file. If there are no cluster resource attributes, the command throws an error. The config file is written to cra.yaml file. @@ -46,7 +46,7 @@ Example: content of cra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks attributes: foo: "bar" buzz: "lightyear" diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index 79e9f40e11..bc79f39878 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -12,28 +12,28 @@ Synopsis Retrieve the execution cluster label for a given project and domain, in combination with the workflow name. -For project flytectldemo and development domain, run: +For project flytesnacks and development domain, run: :: - flytectl get execution-cluster-label -p flytectldemo -d development + flytectl get execution-cluster-label -p flytesnacks -d development The output would look like: .. code-block:: json - {"project":"flytectldemo","domain":"development","value":"foo"} + {"project":"flytesnacks","domain":"development","value":"foo"} Retrieve the execution cluster label for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain, and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get execution-cluster-label -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get execution-cluster-label -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","value":"foo"} + {"project":"flytesnacks","domain":"development","workflow":"core.control_flow.merge_sort.merge_sort","value":"foo"} Write the execution cluster label to a file. If there is no execution cluster label, the command throws an error. The config file is written to ecl.yaml file. @@ -47,7 +47,7 @@ Example: content of ecl.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks value: foo Usage diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index 4be1826963..acf7b493c6 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -11,28 +11,28 @@ Synopsis Retrieve the execution queue attribute for the given project and domain. -For project flytectldemo and development domain: +For project flytesnacks and development domain: :: - flytectl get execution-queue-attribute -p flytectldemo -d development + flytectl get execution-queue-attribute -p flytesnacks -d development Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","tags":["foo", "bar"]} + {"project":"flytesnacks","domain":"development","tags":["foo", "bar"]} Retrieve the execution queue attribute for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain, and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get execution-queue-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get execution-queue-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","tags":["foo", "bar"]} + {"project":"flytesnacks","domain":"development","workflow":"core.control_flow.merge_sort.merge_sort","tags":["foo", "bar"]} Write the execution queue attribute to a file. If there are no execution queue attributes, the command throws an error. The config file is written to era.yaml file. @@ -46,7 +46,7 @@ Example: content of era.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks tags: - foo - bar diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index eded03d90d..73d6259e0c 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -90,7 +90,7 @@ Retrieve a launch plan within the project and domain as per a version and genera :: - flytectl get launchplan -d development -p flytectldemo core.advanced.run_merge_sort.merge_sort --execFile execution_spec.yaml + flytectl get launchplan -d development -p flytesnacks core.control_flow.merge_sort.merge_sort --execFile execution_spec.yaml The generated file would look similar to this: @@ -106,7 +106,7 @@ The generated file would look similar to this: targetDomain: "" targetProject: "" version: v3 - workflow: core.advanced.run_merge_sort.merge_sort + workflow: core.control_flow.merge_sort.merge_sort Check the :ref:`create execution section` on how to launch one using the generated file. Usage diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index a2fc2dc06f..09b9bf774e 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -11,18 +11,18 @@ Synopsis Retrieve the plugin override for the given project and domain. -For project flytectldemo and development domain: +For project flytesnacks and development domain: :: - flytectl get plugin-override -p flytectldemo -d development + flytectl get plugin-override -p flytesnacks -d development Example: output from the command .. code-block:: json { - "project": "flytectldemo", + "project": "flytesnacks", "domain": "development", "overrides": [{ "task_type": "python_task", @@ -32,19 +32,19 @@ Example: output from the command } Retrieve the plugin override for the given project, domain, and workflow. -For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get plugin-override -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get plugin-override -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json { - "project": "flytectldemo", + "project": "flytesnacks", "domain": "development", - "workflow": "core.control_flow.run_merge_sort.merge_sort" + "workflow": "core.control_flow.merge_sort.merge_sort" "overrides": [{ "task_type": "python_task", "plugin_id": ["pluginoverride1", "pluginoverride2"], @@ -64,7 +64,7 @@ Example: content of po.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks overrides: - task_type: python_task # Task type for which to apply plugin implementation overrides plugin_id: # Plugin id(s) to be used in place of the default for the task type. diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 586049d874..b03b8d4e21 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -11,28 +11,28 @@ Synopsis Retrieve task resource attributes for the given project and domain. -For project flytectldemo and development domain: +For project flytesnacks and development domain: :: - flytectl get task-resource-attribute -p flytectldemo -d development + flytectl get task-resource-attribute -p flytesnacks -d development Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + {"project":"flytesnacks","domain":"development","workflow":"","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} Retrieve task resource attributes for the given project, domain, and workflow. -For project flytectldemo, development domain, and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain, and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get task-resource-attribute -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get task-resource-attribute -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json - {"project":"flytectldemo","domain":"development","workflow":"core.control_flow.run_merge_sort.merge_sort","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} + {"project":"flytesnacks","domain":"development","workflow":"core.control_flow.merge_sort.merge_sort","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"450Mi"}} Write the task resource attributes to a file. If there are no task resource attributes, a file would be populated with the basic data. @@ -47,7 +47,7 @@ Example: content of tra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks defaults: cpu: "1" memory: "150Mi" diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 7237869310..e8556a3828 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -72,7 +72,7 @@ Retrieve tasks within project and domain for a version and generate the executio :: - flytectl get tasks -d development -p flytesnacks core.advanced.run_merge_sort.merge --execFile execution_spec.yaml --version v2 + flytectl get tasks -d development -p flytesnacks core.control_flow.merge_sort.merge --execFile execution_spec.yaml --version v2 The generated file would look similar to this: @@ -87,7 +87,7 @@ The generated file would look similar to this: kubeServiceAcct: "" targetDomain: "" targetProject: "" - task: core.advanced.run_merge_sort.merge + task: core.control_flow.merge_sort.merge version: v2 Check the create execution section on how to launch one using the generated file. diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index 17cd83c401..01a8aec44f 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -12,37 +12,37 @@ Synopsis Retrieve workflow execution config for the given project and domain, in combination with the workflow name. -For project flytectldemo and development domain: +For project flytesnacks and development domain: :: - flytectl get workflow-execution-config -p flytectldemo -d development + flytectl get workflow-execution-config -p flytesnacks -d development Example: output from the command: .. code-block:: json { - "project": "flytectldemo", + "project": "flytesnacks", "domain": "development", "max_parallelism": 5 } Retrieve workflow execution config for the project, domain, and workflow. -For project flytectldemo, development domain and workflow 'core.control_flow.run_merge_sort.merge_sort': +For project flytesnacks, development domain and workflow 'core.control_flow.merge_sort.merge_sort': :: - flytectl get workflow-execution-config -p flytectldemo -d development core.control_flow.run_merge_sort.merge_sort + flytectl get workflow-execution-config -p flytesnacks -d development core.control_flow.merge_sort.merge_sort Example: output from the command: .. code-block:: json { - "project": "flytectldemo", + "project": "flytesnacks", "domain": "development", - "workflow": "core.control_flow.run_merge_sort.merge_sort" + "workflow": "core.control_flow.merge_sort.merge_sort" "max_parallelism": 5 } @@ -52,13 +52,13 @@ Example: content of wec.yaml: :: - flytectl get workflow-execution-config -p flytectldemo -d development --attrFile wec.yaml + flytectl get workflow-execution-config -p flytesnacks -d development --attrFile wec.yaml .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks max_parallelism: 5 Generate a sample workflow execution config file to be used for creating a new workflow execution config at project domain diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 97504d3ac8..8bd54375f7 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -19,7 +19,7 @@ Example: content of cra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks attributes: foo: "bar" buzz: "lightyear" @@ -33,13 +33,13 @@ resource attribute defined at project domain level. This will completely overwrite any existing custom project, domain and workflow combination attributes. It is preferable to do get and generate an attribute file if there is an existing attribute that is already set and then update it to have new values. Refer to get cluster-resource-attribute section on how to generate this file. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort attributes: foo: "bar" buzz: "lightyear" diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 0d196fa31d..fedc306bd8 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -19,7 +19,7 @@ Example: content of ecl.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks value: foo :: @@ -28,13 +28,13 @@ Example: content of ecl.yaml: Update execution cluster label for project, domain, and workflow combination. This will take precedence over any other execution cluster label defined at project domain level. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort value: foo :: diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 180ed4fda1..660a9e2e08 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -22,7 +22,7 @@ Example: content of era.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks tags: - foo - bar @@ -35,13 +35,13 @@ Example: content of era.yaml: Update execution queue attribute for project, domain, and workflow combination. This will take precedence over any other execution queue attribute defined at project domain level. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort tags: - foo - bar diff --git a/flytectl/docs/source/gen/flytectl_update_execution.rst b/flytectl/docs/source/gen/flytectl_update_execution.rst index 3920171b12..8db38998d0 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution.rst @@ -13,12 +13,12 @@ Synopsis Activate an execution; and it shows up in the CLI and UI: :: - flytectl update execution -p flytectldemo -d development oeh94k9r2r --activate + flytectl update execution -p flytesnacks -d development oeh94k9r2r --activate Archive an execution; and it is hidden from the CLI and UI: :: - flytectl update execution -p flytectldemo -d development oeh94k9r2r --archive + flytectl update execution -p flytesnacks -d development oeh94k9r2r --archive Usage diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index b7a8fbb1aa..bb16f09286 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -13,17 +13,17 @@ Synopsis Update the description on the launch plan: :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort example" + flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --description "Mergesort example" Archiving launch plan named entity is not supported and would throw an error: :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --archive Activating launch plan named entity would be a noop: :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate + flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --activate Usage diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 295ac45c9e..603fc5ad4d 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -13,12 +13,12 @@ Synopsis Activates a launch plan which activates the scheduled job associated with it: :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --activate + flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --activate Archives a launch plan which deschedules any scheduled job associated with it: :: - flytectl update launchplan -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --version v1 --archive + flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --archive Usage diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 24320676a7..ed5385fcaa 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -22,7 +22,7 @@ Example: content of po.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks overrides: - task_type: python_task # Task type for which to apply plugin implementation overrides plugin_id: # Plugin id(s) to be used in place of the default for the task type. @@ -36,13 +36,13 @@ Example: content of po.yaml: Update plugin override for project, domain, and workflow combination. This will take precedence over any other plugin overrides defined at project domain level. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort overrides: - task_type: python_task # Task type for which to apply plugin implementation overrides plugin_id: # Plugin id(s) to be used in place of the default for the task type. diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index f1f807a842..5c3b608b29 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -13,17 +13,17 @@ Synopsis Update the description on the task: :: - flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --description "Merge sort example" + flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --description "Merge sort example" Archiving task named entity is not supported and would throw an error: :: - flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --archive + flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --archive Activating task named entity would be a noop since archiving is not possible: :: - flytectl update task -d development -p flytectldemo core.advanced.run_merge_sort.merge --activate + flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --activate Usage diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index b0b8b58d42..83eeba649a 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -22,7 +22,7 @@ Example: content of tra.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks defaults: cpu: "1" memory: "150Mi" @@ -36,13 +36,13 @@ Example: content of tra.yaml: Update task resource attribute for project, domain, and workflow combination. This will take precedence over any other resource attribute defined at project domain level. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort defaults: cpu: "1" memory: "150Mi" diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index 69dcabe7ad..381dc9f293 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -22,7 +22,7 @@ Example: content of wec.yaml: .. code-block:: yaml domain: development - project: flytectldemo + project: flytesnacks max_parallelism: 5 security_context: run_as: @@ -34,13 +34,13 @@ Example: content of wec.yaml: Update workflow execution config for project, domain, and workflow combination. This will take precedence over any other execution config defined at project domain level. -For workflow 'core.control_flow.run_merge_sort.merge_sort' in flytectldemo project, development domain, it is: +For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, development domain, it is: .. code-block:: yaml domain: development - project: flytectldemo - workflow: core.control_flow.run_merge_sort.merge_sort + project: flytesnacks + workflow: core.control_flow.merge_sort.merge_sort max_parallelism: 5 security_context: run_as: diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index d19d66b4de..304d123230 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -13,17 +13,17 @@ Synopsis Update the description on the workflow: :: - flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --description "Mergesort workflow example" + flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --description "Mergesort workflow example" -Archiving workflow named entity would cause this to disapper from flyteconsole UI: +Archiving workflow named entity would cause this to disappear from flyteconsole UI: :: - flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --archive + flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --archive Activate workflow named entity: :: - flytectl update workflow -p flytectldemo -d development core.advanced.run_merge_sort.merge_sort --activate + flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --activate Usage From 5ff3c6d6ada0e4e72f799aacf65f6c0649f2a81b Mon Sep 17 00:00:00 2001 From: Yukesh Kumar Date: Tue, 9 Aug 2022 10:49:20 +0530 Subject: [PATCH 270/645] fixes update message when the version is same (#322) Signed-off-by: Yukesh Kumar --- flytectl/pkg/github/githubutil.go | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/flytectl/pkg/github/githubutil.go b/flytectl/pkg/github/githubutil.go index 142bc5ca51..486e75845e 100644 --- a/flytectl/pkg/github/githubutil.go +++ b/flytectl/pkg/github/githubutil.go @@ -169,22 +169,23 @@ func GetUpgradeMessage(latest string, goos platformutil.Platform) (string, error return "", err } - var message string - if isGreater { - message = fmt.Sprintf(commonMessage, stdlibversion.Version, latest) - symlink, err := CheckBrewInstall(goos) - if err != nil { - return "", err - } - if len(symlink) > 0 { - message += brewMessage - } else if goos == platformutil.Darwin { - message += darwinMessage - } else if goos == platformutil.Linux { - message += linuxMessage - } - message += fmt.Sprintf(releaseURL, latest) + if !isGreater { + return "", err + } + message := fmt.Sprintf(commonMessage, stdlibversion.Version, latest) + + symlink, err := CheckBrewInstall(goos) + if err != nil { + return "", err + } + if len(symlink) > 0 { + message += brewMessage + } else if goos == platformutil.Darwin { + message += darwinMessage + } else if goos == platformutil.Linux { + message += linuxMessage } + message += fmt.Sprintf(releaseURL, latest) return message, nil } From ae1f5c01824bf2b5f326d2c3a491316fc01f1402 Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Tue, 9 Aug 2022 14:27:51 -0700 Subject: [PATCH 271/645] Update flyteidl version (#341) Signed-off-by: Katrina Rogan --- flytectl/go.mod | 3 +-- flytectl/go.sum | 22 ++-------------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index a74e398177..5d93271a10 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.1.8 + github.com/flyteorg/flyteidl v1.1.12 github.com/flyteorg/flytestdlib v1.0.0 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 @@ -22,7 +22,6 @@ require ( github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 github.com/mitchellh/mapstructure v1.4.1 github.com/mouuff/go-rocket-update v1.5.1 - github.com/olekukonko/tablewriter v0.0.5 github.com/opencontainers/image-spec v1.0.2 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 github.com/pkg/errors v0.9.1 diff --git a/flytectl/go.sum b/flytectl/go.sum index 736f6cc89f..fdefa1ef5b 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -88,7 +88,6 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DiSiqueira/GoTree v1.0.1-0.20180907134536-53a8e837f295/go.mod h1:e0aH495YLkrsIe9fhedd6aSR6fgU/qhKvtroi6y7G/M= github.com/GoogleCloudPlatform/spark-on-k8s-operator v0.0.0-20200723154620-6f35a1152625/go.mod h1:6PnrZv6zUDkrNMw0mIoGRmGBR7i9LulhKPmxFq4rUiM= github.com/Jeffail/gabs/v2 v2.5.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= @@ -185,7 +184,6 @@ github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bradleyfalzon/ghinstallation/v2 v2.0.3/go.mod h1:tlgi+JWCXnKFx/Y4WtnDbZEINo31N5bcvnCoqieefmk= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= @@ -322,7 +320,6 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= @@ -401,10 +398,8 @@ github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.1.0 h1:f8tdMXOuorS/d+4Ut2QarfDbdCOriK0S+EnlQzrwz9E= -github.com/flyteorg/flyteidl v1.1.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.1.8 h1:F4daAffMefK+LiW1Wni75Vw6ya6uWlVHySWF6UhbzaQ= -github.com/flyteorg/flyteidl v1.1.8/go.mod h1:f1tvw5CDjqmrzNxKpRYr6BdAhHL8f7Wp1Duxl0ZOV4g= +github.com/flyteorg/flyteidl v1.1.12 h1:Rmuq7C/A4AXfYtw24GV9bN5MiPNFV96o6tHu8DMzUoM= +github.com/flyteorg/flyteidl v1.1.12/go.mod h1:f1tvw5CDjqmrzNxKpRYr6BdAhHL8f7Wp1Duxl0ZOV4g= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= @@ -496,7 +491,6 @@ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2K github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es= github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew= -github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= @@ -504,7 +498,6 @@ github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= @@ -522,7 +515,6 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -570,7 +562,6 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github/v39 v39.0.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= github.com/google/go-github/v42 v42.0.0 h1:YNT0FwjPrEysRkLIiKuEfSvBPCGKphW5aS5PxwaoLec= github.com/google/go-github/v42 v42.0.0/go.mod h1:jgg/jvyI0YlDOM1/ps6XYh04HNQ3vKf0CVko62/EhRg= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -762,7 +753,6 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= @@ -826,8 +816,6 @@ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtb github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -960,7 +948,6 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1138,7 +1125,6 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1177,8 +1163,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1448,7 +1432,6 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1715,7 +1698,6 @@ k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= From 1fe32fa39b08fcbe8dc54ff37115781c49234e29 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Mon, 15 Aug 2022 22:25:44 +0530 Subject: [PATCH 272/645] Fix flytectl sandbox crash on M1 macs due to json-iterate (#342) Signed-off-by: Prafulla Mahindrakar Signed-off-by: Prafulla Mahindrakar --- flytectl/go.mod | 4 ++-- flytectl/go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 5d93271a10..a01ef12ff7 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -99,7 +99,7 @@ require ( github.com/imdario/mergo v0.3.12 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/json-iterator/go v1.1.10 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/jstemmer/go-junit-report v0.9.1 // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/magiconair/properties v1.8.4 // indirect @@ -109,7 +109,7 @@ require ( github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/ncw/swift v1.0.53 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index fdefa1ef5b..4caf6b8796 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -688,8 +688,9 @@ github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -785,8 +786,9 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= From bbd546e11994bcf4f43c44d0e13f667b0fe05184 Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Tue, 16 Aug 2022 22:07:10 -0700 Subject: [PATCH 273/645] Update launch plan archive help string (#343) --- flytectl/cmd/config/subcommand/launchplan/updateconfig.go | 2 +- flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig.go index 9fcbb8869d..b7bd87bbc7 100644 --- a/flytectl/cmd/config/subcommand/launchplan/updateconfig.go +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig.go @@ -7,7 +7,7 @@ var ( // Config type UpdateConfig struct { - Archive bool `json:"archive" pflag:",archive launchplan."` + Archive bool `json:"archive" pflag:",disable the launch plan schedule (if it has an active schedule associated with it)."` Activate bool `json:"activate" pflag:",activate launchplan."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` Version string `json:"version" pflag:",version of the launchplan to be fetched."` diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go index b217372c76..14570a00ca 100755 --- a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go @@ -50,7 +50,7 @@ func (UpdateConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg UpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("UpdateConfig", pflag.ExitOnError) - cmdFlags.BoolVar(&UConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), UConfig.Archive, "archive launchplan.") + cmdFlags.BoolVar(&UConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), UConfig.Archive, "disable the launch plan schedule (if it has an active schedule associated with it).") cmdFlags.BoolVar(&UConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), UConfig.Activate, "activate launchplan.") cmdFlags.BoolVar(&UConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), UConfig.DryRun, "execute command without making any modifications.") cmdFlags.StringVar(&UConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), UConfig.Version, "version of the launchplan to be fetched.") From 63d38bf0887a5ee8ca762f6ebb4275fd0c0a33a2 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Wed, 17 Aug 2022 04:39:22 -0700 Subject: [PATCH 274/645] Update documentation (#340) Signed-off-by: Flyte-Bot Signed-off-by: Flyte-Bot Co-authored-by: pmahindrakar-oss --- flytectl/docs/source/gen/flytectl.rst | 1 + flytectl/docs/source/gen/flytectl_compile.rst | 1 + flytectl/docs/source/gen/flytectl_completion.rst | 1 + flytectl/docs/source/gen/flytectl_config.rst | 1 + flytectl/docs/source/gen/flytectl_config_discover.rst | 1 + flytectl/docs/source/gen/flytectl_config_docs.rst | 1 + flytectl/docs/source/gen/flytectl_config_init.rst | 1 + flytectl/docs/source/gen/flytectl_config_validate.rst | 1 + flytectl/docs/source/gen/flytectl_create.rst | 1 + flytectl/docs/source/gen/flytectl_create_execution.rst | 1 + flytectl/docs/source/gen/flytectl_create_project.rst | 1 + flytectl/docs/source/gen/flytectl_delete.rst | 1 + .../gen/flytectl_delete_cluster-resource-attribute.rst | 1 + .../source/gen/flytectl_delete_execution-cluster-label.rst | 1 + .../gen/flytectl_delete_execution-queue-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_delete_execution.rst | 1 + .../docs/source/gen/flytectl_delete_plugin-override.rst | 1 + .../source/gen/flytectl_delete_task-resource-attribute.rst | 1 + .../gen/flytectl_delete_workflow-execution-config.rst | 1 + flytectl/docs/source/gen/flytectl_demo.rst | 1 + flytectl/docs/source/gen/flytectl_demo_exec.rst | 1 + flytectl/docs/source/gen/flytectl_demo_start.rst | 1 + flytectl/docs/source/gen/flytectl_demo_status.rst | 1 + flytectl/docs/source/gen/flytectl_demo_teardown.rst | 1 + flytectl/docs/source/gen/flytectl_get.rst | 1 + .../source/gen/flytectl_get_cluster-resource-attribute.rst | 1 + .../source/gen/flytectl_get_execution-cluster-label.rst | 1 + .../source/gen/flytectl_get_execution-queue-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_get_execution.rst | 1 + flytectl/docs/source/gen/flytectl_get_launchplan.rst | 1 + flytectl/docs/source/gen/flytectl_get_plugin-override.rst | 1 + flytectl/docs/source/gen/flytectl_get_project.rst | 1 + .../source/gen/flytectl_get_task-resource-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_get_task.rst | 1 + .../source/gen/flytectl_get_workflow-execution-config.rst | 1 + flytectl/docs/source/gen/flytectl_get_workflow.rst | 1 + flytectl/docs/source/gen/flytectl_register.rst | 1 + flytectl/docs/source/gen/flytectl_register_examples.rst | 1 + flytectl/docs/source/gen/flytectl_register_files.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox_exec.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox_start.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox_status.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox_teardown.rst | 1 + flytectl/docs/source/gen/flytectl_update.rst | 1 + .../gen/flytectl_update_cluster-resource-attribute.rst | 1 + .../source/gen/flytectl_update_execution-cluster-label.rst | 1 + .../gen/flytectl_update_execution-queue-attribute.rst | 1 + flytectl/docs/source/gen/flytectl_update_execution.rst | 1 + .../docs/source/gen/flytectl_update_launchplan-meta.rst | 7 ++++--- flytectl/docs/source/gen/flytectl_update_launchplan.rst | 3 ++- .../docs/source/gen/flytectl_update_plugin-override.rst | 1 + flytectl/docs/source/gen/flytectl_update_project.rst | 1 + flytectl/docs/source/gen/flytectl_update_task-meta.rst | 1 + .../source/gen/flytectl_update_task-resource-attribute.rst | 1 + .../gen/flytectl_update_workflow-execution-config.rst | 1 + flytectl/docs/source/gen/flytectl_update_workflow-meta.rst | 1 + flytectl/docs/source/gen/flytectl_upgrade.rst | 1 + flytectl/docs/source/gen/flytectl_version.rst | 1 + 59 files changed, 63 insertions(+), 4 deletions(-) diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index afe6a41400..3ab23acf44 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -21,6 +21,7 @@ Options --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_compile.rst b/flytectl/docs/source/gen/flytectl_compile.rst index 9d92df44fe..ad2fc9b207 100644 --- a/flytectl/docs/source/gen/flytectl_compile.rst +++ b/flytectl/docs/source/gen/flytectl_compile.rst @@ -47,6 +47,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index e18446b99d..197129d77a 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -94,6 +94,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index fded48039c..7a21b2b490 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -30,6 +30,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 526b9ad732..6937304aa5 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -32,6 +32,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_config_docs.rst b/flytectl/docs/source/gen/flytectl_config_docs.rst index b258a60b14..390891fc17 100644 --- a/flytectl/docs/source/gen/flytectl_config_docs.rst +++ b/flytectl/docs/source/gen/flytectl_config_docs.rst @@ -32,6 +32,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index a26a1c7cf1..46b00cbda4 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -63,6 +63,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 570193c891..fef71a32aa 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -34,6 +34,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index f64c70dd05..cf6d658bd8 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -33,6 +33,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 4654bb338e..c4982a939d 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -156,6 +156,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index eb040758fa..68cd30b40e 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -69,6 +69,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index f26ed92613..a9e5109b6b 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -33,6 +33,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index e2037d0d82..08e825a06d 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -68,6 +68,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index cafac8401b..b5536698aa 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -65,6 +65,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 9bb961ffe4..63ea3a140b 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -69,6 +69,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 6ee69b6711..750ef913e6 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -76,6 +76,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index 2a535f6ec5..260a2f6771 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -70,6 +70,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index c4ad6b2f11..90f484e560 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -70,6 +70,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index fb5c34af6f..5659c05253 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -68,6 +68,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_demo.rst b/flytectl/docs/source/gen/flytectl_demo.rst index 74889b9c3e..1ff897a135 100644 --- a/flytectl/docs/source/gen/flytectl_demo.rst +++ b/flytectl/docs/source/gen/flytectl_demo.rst @@ -51,6 +51,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_demo_exec.rst b/flytectl/docs/source/gen/flytectl_demo_exec.rst index 08539b44b0..5f85653189 100644 --- a/flytectl/docs/source/gen/flytectl_demo_exec.rst +++ b/flytectl/docs/source/gen/flytectl_demo_exec.rst @@ -40,6 +40,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_demo_start.rst b/flytectl/docs/source/gen/flytectl_demo_start.rst index f1865e41d5..4c4d62f210 100644 --- a/flytectl/docs/source/gen/flytectl_demo_start.rst +++ b/flytectl/docs/source/gen/flytectl_demo_start.rst @@ -100,6 +100,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_demo_status.rst b/flytectl/docs/source/gen/flytectl_demo_status.rst index 2f6d3e8e08..1d44f1de5a 100644 --- a/flytectl/docs/source/gen/flytectl_demo_status.rst +++ b/flytectl/docs/source/gen/flytectl_demo_status.rst @@ -40,6 +40,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_demo_teardown.rst b/flytectl/docs/source/gen/flytectl_demo_teardown.rst index 8c8305c0d3..f7d9608965 100644 --- a/flytectl/docs/source/gen/flytectl_demo_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_demo_teardown.rst @@ -40,6 +40,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 8272b62ba7..e80e57b43e 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -33,6 +33,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index beb1a279db..03ba02c382 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -76,6 +76,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index bc79f39878..74b6acb350 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -75,6 +75,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index acf7b493c6..ef8d50e124 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -78,6 +78,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index ed4f653928..8c735a726f 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -108,6 +108,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 73d6259e0c..8e8bcdb4f1 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -142,6 +142,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index 09b9bf774e..bc9267aaa8 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -97,6 +97,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 1d104b3e04..91d3b2e5c4 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -80,6 +80,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index b03b8d4e21..c9077ea1a3 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -80,6 +80,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index e8556a3828..3502df9aa2 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -124,6 +124,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index 01a8aec44f..1b505cd60a 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -137,6 +137,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 5efc06419f..1d356e1028 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -108,6 +108,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index cc600b42f4..ab165d19c9 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -33,6 +33,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index ea1a4cf9b2..91d8ade049 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -59,6 +59,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 3f51de91dd..a70618de81 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -136,6 +136,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 5e03e92672..21084366a4 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -51,6 +51,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index 812c30f211..51dac4ef61 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -40,6 +40,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 7e9904d1a9..fc1c0ca112 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -105,6 +105,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 17462d2788..497eeed6ef 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -40,6 +40,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index d8a2554777..89adadd478 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -40,6 +40,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index f89628772c..a82adf140e 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -35,6 +35,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 8bd54375f7..d9c40d97fd 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -75,6 +75,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index fedc306bd8..867cc54e9c 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -68,6 +68,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 660a9e2e08..73ac2f84c0 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -79,6 +79,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_execution.rst b/flytectl/docs/source/gen/flytectl_update_execution.rst index 8db38998d0..5df845f7ab 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution.rst @@ -48,6 +48,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index bb16f09286..33633ec6e4 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -13,17 +13,17 @@ Synopsis Update the description on the launch plan: :: - flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --description "Mergesort example" + flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --description "Mergesort example" Archiving launch plan named entity is not supported and would throw an error: :: - flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --archive + flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --archive Activating launch plan named entity would be a noop: :: - flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --activate + flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --activate Usage @@ -53,6 +53,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 603fc5ad4d..01bc49a6a4 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -34,7 +34,7 @@ Options :: --activate activate launchplan. - --archive archive launchplan. + --archive disable the launch plan schedule (if it has an active schedule associated with it). --dryRun execute command without making any modifications. -h, --help help for launchplan --version string version of the launchplan to be fetched. @@ -49,6 +49,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index ed5385fcaa..570d234da8 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -81,6 +81,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 91cfbe14ee..ffcef7e10a 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -108,6 +108,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index 5c3b608b29..7e7256abfc 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -53,6 +53,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 83eeba649a..33f5ca64b4 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -81,6 +81,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index 381dc9f293..79cc25e306 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -77,6 +77,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index 304d123230..d1f4079d0d 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -53,6 +53,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index 9dda7fc0aa..9c1141fe7a 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -48,6 +48,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 1cdc8560a6..406996f5bd 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -37,6 +37,7 @@ Options inherited from parent commands --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation --admin.defaultServiceConfig string From 727e952094c66ea33d349c495cf8c37931a53086 Mon Sep 17 00:00:00 2001 From: SmritiSatyanV <94349093+SmritiSatyanV@users.noreply.github.com> Date: Wed, 17 Aug 2022 17:20:10 +0530 Subject: [PATCH 275/645] update launch_plan.go (#344) Archive/deactivate launch plan [Issue](https://github.com/flyteorg/flyte/issues/2776) Signed-off-by: SmritiSatyanV smriti@union.ai --- flytectl/cmd/update/launch_plan.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go index 58befbbd65..87af549359 100644 --- a/flytectl/cmd/update/launch_plan.go +++ b/flytectl/cmd/update/launch_plan.go @@ -21,7 +21,7 @@ Activates a launch plan which activates the scheduled job associated with it: flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --activate -Archives a launch plan which deschedules any scheduled job associated with it: +Archives (deactivates) a launch plan which deschedules any scheduled job associated with it: :: flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --archive From 3be778c2ff051489af8ee902fc8a6c729cb7003b Mon Sep 17 00:00:00 2001 From: James Brady Date: Thu, 18 Aug 2022 03:13:58 -0700 Subject: [PATCH 276/645] Fix "Sandbox" typo on Demo page. (#346) Signed-off-by: James Brady Signed-off-by: James Brady --- flytectl/docs/source/demo.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flytectl/docs/source/demo.rst b/flytectl/docs/source/demo.rst index 38e7b49374..b103d98ff5 100644 --- a/flytectl/docs/source/demo.rst +++ b/flytectl/docs/source/demo.rst @@ -1,10 +1,10 @@ -Sandbox +Demo ------- -It specifies the actions to be performed on the 'demo' resource. +These are the actions which can be performed on the 'demo' resource. .. toctree:: :maxdepth: 1 - :caption: Sandbox + :caption: Demo gen/flytectl_demo_start gen/flytectl_demo_status From d75142cc4e391dc52feee55127bf8845e03fb1b4 Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Fri, 19 Aug 2022 02:32:29 -0700 Subject: [PATCH 277/645] 3 usability improvements -Named executions, improved connection handling and better logging (#349) * Flytectl will clearly print the endpoint that is unable to connect to https://github.com/flyteorg/flyte/issues/2762 Signed-off-by: Ketan Umare * Use an optional name argument to run an execution Signed-off-by: Ketan Umare * Support for skipping initializing flyte client Signed-off-by: Ketan Umare Signed-off-by: Ketan Umare --- flytectl/cmd/compile/compile.go | 1 + flytectl/cmd/core/cmd.go | 32 ++++++++++++++++++---- flytectl/cmd/core/cmd_ctx.go | 21 ++++++++++---- flytectl/cmd/create/execution.go | 30 ++++++++++++++------ flytectl/cmd/create/execution_util.go | 21 ++++++++------ flytectl/cmd/create/execution_util_test.go | 24 ++++++++-------- flytectl/cmd/demo/demo.go | 6 ++-- flytectl/cmd/sandbox/sandbox.go | 6 ++-- flytectl/cmd/upgrade/upgrade.go | 11 ++++++-- 9 files changed, 103 insertions(+), 49 deletions(-) diff --git a/flytectl/cmd/compile/compile.go b/flytectl/cmd/compile/compile.go index ffbbbad90e..d64f079152 100644 --- a/flytectl/cmd/compile/compile.go +++ b/flytectl/cmd/compile/compile.go @@ -140,6 +140,7 @@ func CreateCompileCommand() map[string]cmdCore.CommandEntry { CmdFunc: compile, PFlagProvider: config.DefaultCompileConfig, ProjectDomainNotRequired: true, + DisableFlyteClient: true, }, } return compileResourcesFuncs diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index 3c37f28ab6..a6f7c391df 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -4,6 +4,10 @@ import ( "context" "fmt" + "github.com/pkg/errors" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/pkg/pkce" "github.com/flyteorg/flyteidl/clients/go/admin" @@ -23,6 +27,7 @@ type CommandEntry struct { Short string Long string PFlagProvider PFlagProvider + DisableFlyteClient bool } func AddCommands(rootCmd *cobra.Command, cmdFuncs map[string]CommandEntry) { @@ -65,14 +70,29 @@ func generateCommandFunc(cmdEntry CommandEntry) func(cmd *cobra.Command, args [] return cmdEntry.CmdFunc(ctx, args, CommandContext{}) } - clientSet, err := admin.ClientSetBuilder().WithConfig(admin.GetConfig(ctx)). - WithTokenCache(pkce.TokenCacheKeyringProvider{ - ServiceUser: fmt.Sprintf("%s:%s", adminCfg.Endpoint.String(), pkce.KeyRingServiceUser), - ServiceName: pkce.KeyRingServiceName, - }).Build(ctx) + cmdCtx := NewCommandContextNoClient(cmd.OutOrStdout()) + if !cmdEntry.DisableFlyteClient { + clientSet, err := admin.ClientSetBuilder().WithConfig(admin.GetConfig(ctx)). + WithTokenCache(pkce.TokenCacheKeyringProvider{ + ServiceUser: fmt.Sprintf("%s:%s", adminCfg.Endpoint.String(), pkce.KeyRingServiceUser), + ServiceName: pkce.KeyRingServiceName, + }).Build(ctx) + if err != nil { + return err + } + cmdCtx = NewCommandContext(clientSet, cmd.OutOrStdout()) + } + + err := cmdEntry.CmdFunc(ctx, args, cmdCtx) if err != nil { + if s, ok := status.FromError(err); ok { + if s.Code() == codes.Unavailable || s.Code() == codes.Unauthenticated || s.Code() == codes.Unknown { + return errors.WithMessage(err, + fmt.Sprintf("Connection Info: [Endpoint: %s, InsecureConnection?: %v, AuthMode: %v]", adminCfg.Endpoint.String(), adminCfg.UseInsecureConnection, adminCfg.AuthType)) + } + } return err } - return cmdEntry.CmdFunc(ctx, args, NewCommandContext(clientSet, cmd.OutOrStdout())) + return nil } } diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go index 7d02474490..f5cd095c4f 100644 --- a/flytectl/cmd/core/cmd_ctx.go +++ b/flytectl/cmd/core/cmd_ctx.go @@ -18,14 +18,23 @@ type CommandContext struct { out io.Writer } +// NewCommandContextNoClient returns a new commandContext +func NewCommandContextNoClient(out io.Writer) CommandContext { + return NewCommandContext(nil, out) +} + func NewCommandContext(clientSet *admin.Clientset, out io.Writer) CommandContext { - return CommandContext{ - clientSet: clientSet, - out: out, - adminClientFetcherExt: &ext.AdminFetcherExtClient{AdminClient: clientSet.AdminClient()}, - adminClientUpdateExt: &ext.AdminUpdaterExtClient{AdminClient: clientSet.AdminClient()}, - adminClientDeleteExt: &ext.AdminDeleterExtClient{AdminClient: clientSet.AdminClient()}, + var adminClient service.AdminServiceClient + if clientSet != nil { + adminClient = clientSet.AdminClient() } + return NewCommandContextWithExt( + clientSet, + &ext.AdminFetcherExtClient{AdminClient: adminClient}, + &ext.AdminUpdaterExtClient{AdminClient: adminClient}, + &ext.AdminDeleterExtClient{AdminClient: adminClient}, + out, + ) } // NewCommandContextWithExt construct command context with injected extensions. Helps in injecting mocked ones for testing. diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index dc1ba493c1..b3711c49a2 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -66,13 +66,13 @@ It is worth noting that the source's and target's project and domain can be diff flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d staging --targetProject flytesnacks -To relaunch an execution, pass the current execution ID as follows: +4. To relaunch an execution, pass the current execution ID as follows: :: flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytesnacks -d development -To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: +5. To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: :: @@ -80,7 +80,15 @@ To recover an execution, i.e., recreate it from the last known failure point for See :ref:` + "`ref_flyteidl.admin.ExecutionRecoverRequest`" + ` for more details. -Generic data types are supported for execution in a similar manner. +6. You can create executions idempotently by naming them. This is also a way to *name* an execution for discovery. Note, +an execution id has to be unique within a project domain. So if the *name* matches an existing execution an already exists exceptioj +will be raised. + +:: + + flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytesnacks -d development custom_name + +7. Generic/Struct/Dataclass/JSON types are supported for execution in a similar manner. The following is an example of how generic data can be specified while creating the execution. :: @@ -100,7 +108,7 @@ The generated file would look similar to this. Here, empty values have been dump task: core.type_system.custom_objects.add version: v3 -Modified file with struct data populated for 'x' and 'y' parameters for the task "core.type_system.custom_objects.add": +8. Modified file with struct data populated for 'x' and 'y' parameters for the task "core.type_system.custom_objects.add": :: @@ -171,21 +179,27 @@ func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.C var err error sourceProject := config.GetConfig().Project sourceDomain := config.GetConfig().Domain + + var targetExecName string + if len(args) > 0 { + targetExecName = args[0] + } + if execParams, err = readConfigAndValidate(config.GetConfig().Project, config.GetConfig().Domain); err != nil { return err } var executionRequest *admin.ExecutionCreateRequest switch execParams.execType { case Relaunch: - return relaunchExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig) + return relaunchExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName) case Recover: - return recoverExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig) + return recoverExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName) case Task: - if executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig); err != nil { + if executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName); err != nil { return err } case Workflow: - if executionRequest, err = createExecutionRequestForWorkflow(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig); err != nil { + if executionRequest, err = createExecutionRequestForWorkflow(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName); err != nil { return err } default: diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index ed862783d0..41c438f274 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -16,7 +16,7 @@ import ( ) func createExecutionRequestForWorkflow(ctx context.Context, workflowName, project, domain string, - cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig) (*admin.ExecutionCreateRequest, error) { + cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig, targetExecName string) (*admin.ExecutionCreateRequest, error) { // Fetch the launch plan lp, err := cmdCtx.AdminFetcherExt().FetchLPVersion(ctx, workflowName, executionConfig.Version, project, domain) if err != nil { @@ -51,11 +51,11 @@ func createExecutionRequestForWorkflow(ctx context.Context, workflowName, projec } } - return createExecutionRequest(lp.Id, inputs, securityContext, authRole), nil + return createExecutionRequest(lp.Id, inputs, securityContext, authRole, targetExecName), nil } func createExecutionRequestForTask(ctx context.Context, taskName string, project string, domain string, - cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig) (*admin.ExecutionCreateRequest, error) { + cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig, targetExecName string) (*admin.ExecutionCreateRequest, error) { // Fetch the task task, err := cmdCtx.AdminFetcherExt().FetchTaskVersion(ctx, taskName, executionConfig.Version, project, domain) if err != nil { @@ -97,11 +97,11 @@ func createExecutionRequestForTask(ctx context.Context, taskName string, project Version: task.Id.Version, } - return createExecutionRequest(id, inputs, securityContext, authRole), nil + return createExecutionRequest(id, inputs, securityContext, authRole, targetExecName), nil } func relaunchExecution(ctx context.Context, executionName string, project string, domain string, - cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig) error { + cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig, targetExecutionName string) error { if executionConfig.DryRun { logger.Debugf(ctx, "skipping RelaunchExecution request (DryRun)") return nil @@ -112,6 +112,7 @@ func relaunchExecution(ctx context.Context, executionName string, project string Project: project, Domain: domain, }, + Name: targetExecutionName, }) if err != nil { return err @@ -121,7 +122,7 @@ func relaunchExecution(ctx context.Context, executionName string, project string } func recoverExecution(ctx context.Context, executionName string, project string, domain string, - cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig) error { + cmdCtx cmdCore.CommandContext, executionConfig *ExecutionConfig, targetExecName string) error { if executionConfig.DryRun { logger.Debugf(ctx, "skipping RecoverExecution request (DryRun)") return nil @@ -132,6 +133,7 @@ func recoverExecution(ctx context.Context, executionName string, project string, Project: project, Domain: domain, }, + Name: targetExecName, }) if err != nil { return err @@ -141,12 +143,15 @@ func recoverExecution(ctx context.Context, executionName string, project string, } func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, securityContext *core.SecurityContext, - authRole *admin.AuthRole) *admin.ExecutionCreateRequest { + authRole *admin.AuthRole, targetExecName string) *admin.ExecutionCreateRequest { + if len(targetExecName) == 0 { + targetExecName = "f" + strings.ReplaceAll(uuid.New().String(), "-", "")[:19] + } return &admin.ExecutionCreateRequest{ Project: executionConfig.TargetProject, Domain: executionConfig.TargetDomain, - Name: "f" + strings.ReplaceAll(uuid.New().String(), "-", "")[:19], + Name: targetExecName, Spec: &admin.ExecutionSpec{ LaunchPlan: ID, Metadata: &admin.ExecutionMetadata{ diff --git a/flytectl/cmd/create/execution_util_test.go b/flytectl/cmd/create/execution_util_test.go index 0342d4b5c7..e36b957890 100644 --- a/flytectl/cmd/create/execution_util_test.go +++ b/flytectl/cmd/create/execution_util_test.go @@ -49,7 +49,7 @@ func TestCreateExecutionForRelaunch(t *testing.T) { s := setup() createExecutionUtilSetup() s.MockAdminClient.OnRelaunchExecutionMatch(s.Ctx, relaunchRequest).Return(executionCreateResponse, nil) - err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.Nil(t, err) } @@ -57,7 +57,7 @@ func TestCreateExecutionForRelaunchNotFound(t *testing.T) { s := setup() createExecutionUtilSetup() s.MockAdminClient.OnRelaunchExecutionMatch(s.Ctx, relaunchRequest).Return(nil, errors.New("unknown execution")) - err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.NotNil(t, err) assert.Equal(t, err, errors.New("unknown execution")) @@ -67,7 +67,7 @@ func TestCreateExecutionForRecovery(t *testing.T) { s := setup() createExecutionUtilSetup() s.MockAdminClient.OnRecoverExecutionMatch(s.Ctx, recoverRequest).Return(executionCreateResponse, nil) - err := recoverExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + err := recoverExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.Nil(t, err) } @@ -75,7 +75,7 @@ func TestCreateExecutionForRecoveryNotFound(t *testing.T) { s := setup() createExecutionUtilSetup() s.MockAdminClient.OnRecoverExecutionMatch(s.Ctx, recoverRequest).Return(nil, errors.New("unknown execution")) - err := recoverExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + err := recoverExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.NotNil(t, err) assert.Equal(t, err, errors.New("unknown execution")) } @@ -86,7 +86,7 @@ func TestCreateExecutionRequestForWorkflow(t *testing.T) { createExecutionUtilSetup() launchPlan := &admin.LaunchPlan{} s.FetcherExt.OnFetchLPVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(launchPlan, nil) - execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.Nil(t, err) assert.NotNil(t, execCreateRequest) }) @@ -101,7 +101,7 @@ func TestCreateExecutionRequestForWorkflow(t *testing.T) { }, } s.FetcherExt.OnFetchLPVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(launchPlan, nil) - execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.NotNil(t, err) assert.Nil(t, execCreateRequest) assert.Equal(t, fmt.Errorf("parameter [nilparam] has nil Variable"), err) @@ -110,7 +110,7 @@ func TestCreateExecutionRequestForWorkflow(t *testing.T) { s := setup() createExecutionUtilSetup() s.FetcherExt.OnFetchLPVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) - execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.NotNil(t, err) assert.Nil(t, execCreateRequest) assert.Equal(t, err, errors.New("failed")) @@ -122,7 +122,7 @@ func TestCreateExecutionRequestForWorkflow(t *testing.T) { launchPlan := &admin.LaunchPlan{} s.FetcherExt.OnFetchLPVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(launchPlan, nil) s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, mock.Anything).Return(launchPlan, nil) - execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.Nil(t, err) assert.NotNil(t, execCreateRequest) executionConfig.KubeServiceAcct = "" @@ -139,7 +139,7 @@ func TestCreateExecutionRequestForTask(t *testing.T) { }, } s.FetcherExt.OnFetchTaskVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(task, nil) - execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.Nil(t, err) assert.NotNil(t, execCreateRequest) }) @@ -162,7 +162,7 @@ func TestCreateExecutionRequestForTask(t *testing.T) { }, } s.FetcherExt.OnFetchTaskVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(task, nil) - execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.NotNil(t, err) assert.Nil(t, execCreateRequest) assert.Equal(t, fmt.Errorf("variable [nilvar] has nil type"), err) @@ -171,7 +171,7 @@ func TestCreateExecutionRequestForTask(t *testing.T) { s := setup() createExecutionUtilSetup() s.FetcherExt.OnFetchTaskVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) - execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.NotNil(t, err) assert.Nil(t, execCreateRequest) assert.Equal(t, err, errors.New("failed")) @@ -186,7 +186,7 @@ func TestCreateExecutionRequestForTask(t *testing.T) { }, } s.FetcherExt.OnFetchTaskVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(task, nil) - execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig) + execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") assert.Nil(t, err) assert.NotNil(t, execCreateRequest) executionConfig.KubeServiceAcct = "" diff --git a/flytectl/cmd/demo/demo.go b/flytectl/cmd/demo/demo.go index 30b29c8040..35149b6823 100644 --- a/flytectl/cmd/demo/demo.go +++ b/flytectl/cmd/demo/demo.go @@ -46,16 +46,16 @@ func CreateDemoCommand() *cobra.Command { demoResourcesFuncs := map[string]cmdcore.CommandEntry{ "start": {CmdFunc: startDemoCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: startShort, - Long: startLong, PFlagProvider: sandboxCmdConfig.DefaultConfig}, + Long: startLong, PFlagProvider: sandboxCmdConfig.DefaultConfig, DisableFlyteClient: true}, "teardown": {CmdFunc: teardownDemoCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: teardownShort, - Long: teardownLong}, + Long: teardownLong, DisableFlyteClient: true}, "status": {CmdFunc: demoClusterStatus, Aliases: []string{}, ProjectDomainNotRequired: true, Short: statusShort, Long: statusLong}, "exec": {CmdFunc: demoClusterExec, Aliases: []string{}, ProjectDomainNotRequired: true, Short: execShort, - Long: execLong}, + Long: execLong, DisableFlyteClient: true}, } cmdcore.AddCommands(demo, demoResourcesFuncs) diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go index 2dc5ab95a4..2e342c41e4 100644 --- a/flytectl/cmd/sandbox/sandbox.go +++ b/flytectl/cmd/sandbox/sandbox.go @@ -46,16 +46,16 @@ func CreateSandboxCommand() *cobra.Command { sandboxResourcesFuncs := map[string]cmdcore.CommandEntry{ "start": {CmdFunc: startSandboxCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: startShort, - Long: startLong, PFlagProvider: sandboxCmdConfig.DefaultConfig}, + Long: startLong, PFlagProvider: sandboxCmdConfig.DefaultConfig, DisableFlyteClient: true}, "teardown": {CmdFunc: teardownSandboxCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: teardownShort, - Long: teardownLong}, + Long: teardownLong, DisableFlyteClient: true}, "status": {CmdFunc: sandboxClusterStatus, Aliases: []string{}, ProjectDomainNotRequired: true, Short: statusShort, Long: statusLong}, "exec": {CmdFunc: sandboxClusterExec, Aliases: []string{}, ProjectDomainNotRequired: true, Short: execShort, - Long: execLong}, + Long: execLong, DisableFlyteClient: true}, } cmdcore.AddCommands(sandbox, sandboxResourcesFuncs) diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go index f8c4099e4e..b760975a5a 100644 --- a/flytectl/cmd/upgrade/upgrade.go +++ b/flytectl/cmd/upgrade/upgrade.go @@ -54,9 +54,14 @@ var ( // SelfUpgrade will return self upgrade command func SelfUpgrade(rootCmd *cobra.Command) map[string]cmdCore.CommandEntry { getResourcesFuncs := map[string]cmdCore.CommandEntry{ - "upgrade": {CmdFunc: selfUpgrade, Aliases: []string{"upgrade"}, ProjectDomainNotRequired: true, - Short: upgradeCmdShort, - Long: upgradeCmdLong}, + "upgrade": { + CmdFunc: selfUpgrade, + Aliases: []string{"upgrade"}, + ProjectDomainNotRequired: true, + Short: upgradeCmdShort, + Long: upgradeCmdLong, + DisableFlyteClient: true, + }, } return getResourcesFuncs } From 68324ce51f4ca1f47b6ba5e3b7c38e003442c64b Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Wed, 7 Sep 2022 11:24:06 +0530 Subject: [PATCH 278/645] Consuming device flow IDL (#350) Signed-off-by: Prafulla Mahindrakar Signed-off-by: Prafulla Mahindrakar --- flytectl/go.mod | 2 +- flytectl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index a01ef12ff7..93d601fe38 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.1.12 + github.com/flyteorg/flyteidl v1.1.13 github.com/flyteorg/flytestdlib v1.0.0 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 4caf6b8796..5670790b95 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -398,8 +398,8 @@ github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.1.12 h1:Rmuq7C/A4AXfYtw24GV9bN5MiPNFV96o6tHu8DMzUoM= -github.com/flyteorg/flyteidl v1.1.12/go.mod h1:f1tvw5CDjqmrzNxKpRYr6BdAhHL8f7Wp1Duxl0ZOV4g= +github.com/flyteorg/flyteidl v1.1.13 h1:xRUOu9+6c/zTZRTv+He1s4kX7uxmd/K5y7tAP598f8A= +github.com/flyteorg/flyteidl v1.1.13/go.mod h1:SLTYz2JgIKvM5MbPVlMP7uILb65fnuuZQZFHHIEYh2U= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= From fce2910db16157eb06566adaeb3642ee01628cb3 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Tue, 13 Sep 2022 13:00:04 -0700 Subject: [PATCH 279/645] Update flyteidl version (#336) Signed-off-by: Flyte-Bot Signed-off-by: Flyte-Bot Co-authored-by: flyte-bot --- flytectl/go.mod | 2 +- flytectl/go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 93d601fe38..3cc27ebf02 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.1.13 + github.com/flyteorg/flyteidl v1.1.15 github.com/flyteorg/flytestdlib v1.0.0 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 5670790b95..3a940fe8d9 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -400,6 +400,8 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= github.com/flyteorg/flyteidl v1.1.13 h1:xRUOu9+6c/zTZRTv+He1s4kX7uxmd/K5y7tAP598f8A= github.com/flyteorg/flyteidl v1.1.13/go.mod h1:SLTYz2JgIKvM5MbPVlMP7uILb65fnuuZQZFHHIEYh2U= +github.com/flyteorg/flyteidl v1.1.15 h1:h+T8yeya5OEt7POav0wZkjPdtUatilraVTuwrioqzuA= +github.com/flyteorg/flyteidl v1.1.15/go.mod h1:SLTYz2JgIKvM5MbPVlMP7uILb65fnuuZQZFHHIEYh2U= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= From 9c10cd1b2585456f047c622bc1503ba76fe142c9 Mon Sep 17 00:00:00 2001 From: SmritiSatyanV <94349093+SmritiSatyanV@users.noreply.github.com> Date: Tue, 20 Sep 2022 15:52:09 +0530 Subject: [PATCH 280/645] update launch_plan.go (#354) * update launch_plan.go add links to activating and deactivating a launch plan Signed-off-by: SmritiSatyanV smriti@union.ai * render correctly Fix rendering Signed-off-by: SmritiSatyanV smriti@union.ai --- flytectl/cmd/get/launch_plan.go | 5 +++-- flytectl/cmd/update/launch_plan.go | 5 ++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index edd7ea7c38..f83a1d1d4b 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -23,9 +23,10 @@ Retrieve all launch plans within the project and domain: flytectl get launchplan -p flytesnacks -d development .. note:: - The terms launchplan/launchplans are interchangeable in these commands. + + The terms launchplan/launchplans are interchangeable in these commands. - Retrieve a launch plan by name within the project and domain: +Retrieve a launch plan by name within the project and domain: :: diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go index 87af549359..369f756cd7 100644 --- a/flytectl/cmd/update/launch_plan.go +++ b/flytectl/cmd/update/launch_plan.go @@ -16,17 +16,16 @@ import ( const ( updateLPShort = "Updates launch plan status" updateLPLong = ` -Activates a launch plan which activates the scheduled job associated with it: +Activates a ` + "`launch plan `__" + ` which activates the scheduled job associated with it: :: flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --activate -Archives (deactivates) a launch plan which deschedules any scheduled job associated with it: +Archives ` + "`(deactivates) `__" + ` a launch plan which deschedules any scheduled job associated with it: :: flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --archive - Usage ` ) From b484b2fcc9f7f32134974b89654edfe7932aaf01 Mon Sep 17 00:00:00 2001 From: Iaroslav Ciupin Date: Sat, 1 Oct 2022 01:08:01 +0300 Subject: [PATCH 281/645] Specify cluster pool when creating execution (#355) * Create execution with specifying clusterPool Signed-off-by: Iaroslav Ciupin * format Signed-off-by: Iaroslav Ciupin * update flyteidl Signed-off-by: Iaroslav Ciupin * refactor Signed-off-by: Iaroslav Ciupin * Address comments Signed-off-by: Iaroslav Ciupin * update flyteidl Signed-off-by: Iaroslav Ciupin * increase coverage Signed-off-by: Iaroslav Ciupin Signed-off-by: Iaroslav Ciupin --- flytectl/cmd/create/execution.go | 29 ++- flytectl/cmd/create/execution_test.go | 237 +++++++++++------- flytectl/cmd/create/execution_util.go | 14 +- flytectl/cmd/create/executionconfig_flags.go | 1 + .../cmd/create/executionconfig_flags_test.go | 14 ++ .../task_execution_spec_with_iamrole.yaml | 1 + flytectl/go.mod | 2 +- flytectl/go.sum | 6 +- 8 files changed, 196 insertions(+), 108 deletions(-) diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index b3711c49a2..0d0c8786fc 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -4,10 +4,11 @@ import ( "context" "fmt" - "github.com/flyteorg/flytectl/cmd/config" - cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" + + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" ) const ( @@ -132,6 +133,13 @@ The generated file would look similar to this. Here, empty values have been dump task: core.type_system.custom_objects.add version: v3 +9. If you have configured a plugin that implements github.com/flyteorg/flyteadmin/pkg/workflowengine/interfaces/WorkflowExecutor + that supports cluster pools, then when creating a new execution, you can assign it to a specific cluster pool: + +:: + + flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d development --clusterPool my-gpu-cluster + Usage ` ) @@ -150,6 +158,7 @@ type ExecutionConfig struct { Recover string `json:"recover" pflag:",execution id to be recreated from the last known failure point."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` Version string `json:"version" pflag:",specify version of execution workflow/task."` + ClusterPool string `json:"clusterPool" pflag:",specify which cluster pool to assign execution to."` // Non plfag section is read from the execution config generated by get task/launch plan Workflow string `json:"workflow,omitempty"` Task string `json:"task,omitempty"` @@ -170,13 +179,9 @@ type ExecutionParams struct { execType ExecutionType } -var ( - executionConfig = &ExecutionConfig{} -) +var executionConfig = &ExecutionConfig{} func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - var execParams ExecutionParams - var err error sourceProject := config.GetConfig().Project sourceDomain := config.GetConfig().Domain @@ -185,7 +190,8 @@ func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.C targetExecName = args[0] } - if execParams, err = readConfigAndValidate(config.GetConfig().Project, config.GetConfig().Domain); err != nil { + execParams, err := readConfigAndValidate(config.GetConfig().Project, config.GetConfig().Domain) + if err != nil { return err } var executionRequest *admin.ExecutionCreateRequest @@ -195,16 +201,19 @@ func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.C case Recover: return recoverExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName) case Task: - if executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName); err != nil { + executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName) + if err != nil { return err } case Workflow: - if executionRequest, err = createExecutionRequestForWorkflow(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName); err != nil { + executionRequest, err = createExecutionRequestForWorkflow(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName) + if err != nil { return err } default: return fmt.Errorf("invalid execution type %v", execParams.execType) } + if executionConfig.DryRun { logger.Debugf(ctx, "skipping CreateExecution request (DryRun)") } else { diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index cad187f9d0..7aabf5897d 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -4,28 +4,39 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - - "github.com/stretchr/testify/assert" + "github.com/golang/protobuf/proto" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/suite" "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/testutils" ) -type TestStruct struct { - executionConfig *ExecutionConfig - args []string +type createSuite struct { + suite.Suite + testutils.TestStruct + originalExecConfig ExecutionConfig } -// This function needs to be called after testutils.Steup() -func createExecutionSetup(s *testutils.TestStruct) (t TestStruct) { - ctx := s.Ctx - t.executionConfig = &ExecutionConfig{} +func (s *createSuite) SetupTest() { + s.TestStruct = setup() + // TODO: migrate to new command context from testutils s.CmdCtx = cmdCore.NewCommandContext(s.MockClient, s.MockOutStream) + s.originalExecConfig = *executionConfig +} + +func (s *createSuite) TearDownTest() { + orig := s.originalExecConfig + executionConfig = &orig + s.MockAdminClient.AssertExpectations(s.T()) +} + +func (s *createSuite) onGetTask() { sortedListLiteralType := core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_CollectionType{ @@ -60,7 +71,10 @@ func createExecutionSetup(s *testutils.TestStruct) (t TestStruct) { }, }, } - s.MockAdminClient.OnGetTaskMatch(ctx, mock.Anything).Return(task1, nil) + s.MockAdminClient.OnGetTaskMatch(s.Ctx, mock.Anything).Return(task1, nil) +} + +func (s *createSuite) onGetLaunchPlan() { parameterMap := map[string]*core.Parameter{ "numbers": { Var: &core.Variable{ @@ -132,20 +146,14 @@ func createExecutionSetup(s *testutils.TestStruct) (t TestStruct) { Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: "core.control_flow.merge_sort.merge_sort", - Version: "v2", + Version: "v3", }, } - s.MockAdminClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan1, nil) - - return TestStruct{ - executionConfig: executionConfig, - args: []string{}, - } + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(launchPlan1, nil).Once() } -func TestCreateTaskExecutionFunc(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) +func (s *createSuite) Test_CreateTaskExecution() { + s.onGetTask() executionCreateResponseTask := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -153,31 +161,73 @@ func TestCreateTaskExecutionFunc(t *testing.T) { Name: "ff513c0e44b5b4a35aa5", }, } + expected := &admin.ExecutionCreateRequest{ + Project: "dummyProject", + Domain: "dummyDomain", + Spec: &admin.ExecutionSpec{ + LaunchPlan: &core.Identifier{ + ResourceType: core.ResourceType_TASK, + Project: "dummyProject", + Domain: "dummyDomain", + Name: "task1", + Version: "v2", + }, + Metadata: &admin.ExecutionMetadata{Mode: admin.ExecutionMetadata_MANUAL, Principal: "sdk", Nesting: 0}, + AuthRole: &admin.AuthRole{ + KubernetesServiceAccount: executionConfig.KubeServiceAcct, + AssumableIamRole: "iamRoleARN", + }, + SecurityContext: &core.SecurityContext{ + RunAs: &core.Identity{ + K8SServiceAccount: executionConfig.KubeServiceAcct, + IamRole: "iamRoleARN", + }, + }, + ClusterAssignment: &admin.ClusterAssignment{ClusterPoolName: "gpu"}, + }, + } + s.MockAdminClient. + OnCreateExecutionMatch(s.Ctx, mock.Anything). + Run(func(args mock.Arguments) { + actual := args.Get(1).(*admin.ExecutionCreateRequest) + actual.Name = "" + actual.Inputs = nil + s.True(proto.Equal(expected, actual), actual.String()) + }). + Return(executionCreateResponseTask, nil). + Once() + executionConfig.ExecFile = testDataFolder + "task_execution_spec_with_iamrole.yaml" + + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) - ctx := s.Ctx - s.MockAdminClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseTask, nil) - ts.executionConfig.ExecFile = testDataFolder + "task_execution_spec_with_iamrole.yaml" - err := createExecutionCommand(ctx, ts.args, s.CmdCtx) - assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) - tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) + s.NoError(err) + tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) } -func TestCreateTaskExecutionFuncError(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) - ctx := s.Ctx - s.MockAdminClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(nil, fmt.Errorf("error launching task")) - ts.executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" - err := createExecutionCommand(ctx, ts.args, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("error launching task"), err) - s.MockAdminClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) +func (s *createSuite) Test_CreateTaskExecution_GetTaskError() { + expected := fmt.Errorf("error") + s.MockAdminClient.OnGetTaskMatch(s.Ctx, mock.Anything).Return(nil, expected).Once() + executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" + + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + + s.Equal(expected, err) +} + +func (s *createSuite) Test_CreateTaskExecution_CreateExecutionError() { + s.onGetTask() + s.MockAdminClient. + OnCreateExecutionMatch(s.Ctx, mock.Anything). + Return(nil, fmt.Errorf("error launching task")). + Once() + executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" + + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + + s.EqualError(err, "error launching task") } -func TestCreateLaunchPlanExecutionFunc(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) +func (s *createSuite) Test_CreateLaunchPlanExecution() { executionCreateResponseLP := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -185,20 +235,27 @@ func TestCreateLaunchPlanExecutionFunc(t *testing.T) { Name: "f652ea3596e7f4d80a0e", }, } + s.onGetLaunchPlan() + s.MockAdminClient.OnCreateExecutionMatch(s.Ctx, mock.Anything).Return(executionCreateResponseLP, nil) + executionConfig.ExecFile = testDataFolder + "launchplan_execution_spec.yaml" + + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) - ctx := s.Ctx - s.MockAdminClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseLP, nil) - ts.executionConfig.ExecFile = testDataFolder + "launchplan_execution_spec.yaml" - err := createExecutionCommand(ctx, ts.args, s.CmdCtx) - assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) - tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e" `) + s.NoError(err) + tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e" `) } -func TestCreateRelaunchExecutionFunc(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) - defer func() { ts.executionConfig.Relaunch = "" }() +func (s *createSuite) Test_CreateLaunchPlan_GetLaunchPlanError() { + expected := fmt.Errorf("error") + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, mock.Anything).Return(nil, expected).Once() + executionConfig.ExecFile = testDataFolder + "launchplan_execution_spec.yaml" + + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + + s.Equal(expected, err) +} + +func (s *createSuite) Test_CreateRelaunchExecution() { relaunchExecResponse := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -206,8 +263,7 @@ func TestCreateRelaunchExecutionFunc(t *testing.T) { Name: "f652ea3596e7f4d80a0e", }, } - - ts.executionConfig.Relaunch = relaunchExecResponse.Id.Name + executionConfig.Relaunch = relaunchExecResponse.Id.Name relaunchRequest := &admin.ExecutionRelaunchRequest{ Id: &core.WorkflowExecutionIdentifier{ Name: executionConfig.Relaunch, @@ -215,19 +271,15 @@ func TestCreateRelaunchExecutionFunc(t *testing.T) { Domain: config.GetConfig().Domain, }, } - ctx := s.Ctx - s.MockAdminClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(relaunchExecResponse, nil) - err := createExecutionCommand(ctx, ts.args, s.CmdCtx) - assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "RelaunchExecution", ctx, relaunchRequest) - tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) -} + s.MockAdminClient.OnRelaunchExecutionMatch(s.Ctx, relaunchRequest).Return(relaunchExecResponse, nil).Once() -func TestCreateRecoverExecutionFunc(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) - defer func() { ts.executionConfig.Recover = "" }() + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + s.NoError(err) + tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) +} + +func (s *createSuite) Test_CreateRecoverExecution() { originalExecutionName := "abc123" recoverExecResponse := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ @@ -236,8 +288,7 @@ func TestCreateRecoverExecutionFunc(t *testing.T) { Name: "f652ea3596e7f4d80a0e", }, } - - ts.executionConfig.Recover = originalExecutionName + executionConfig.Recover = originalExecutionName recoverRequest := &admin.ExecutionRecoverRequest{ Id: &core.WorkflowExecutionIdentifier{ Name: originalExecutionName, @@ -245,31 +296,39 @@ func TestCreateRecoverExecutionFunc(t *testing.T) { Domain: config.GetConfig().Domain, }, } + s.MockAdminClient.OnRecoverExecutionMatch(s.Ctx, recoverRequest).Return(recoverExecResponse, nil).Once() - ctx := s.Ctx - s.MockAdminClient.OnRecoverExecutionMatch(ctx, recoverRequest).Return(recoverExecResponse, nil) - err := createExecutionCommand(ctx, ts.args, s.CmdCtx) - assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "RecoverExecution", ctx, recoverRequest) - tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) - ts.executionConfig.Relaunch = "" + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + + s.NoError(err) + tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) } -func TestCreateExecutionFuncInvalid(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) - executionConfig := ts.executionConfig +func (s *createSuite) TestCreateExecutionFuncInvalid() { executionConfig.Relaunch = "" executionConfig.ExecFile = "" - err := createExecutionCommand(s.Ctx, ts.args, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("executionConfig, relaunch and recover can't be empty. Run the flytectl get task/launchplan to generate the config"), err) + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + s.EqualError(err, "executionConfig, relaunch and recover can't be empty. Run the flytectl get task/launchplan to generate the config") + executionConfig.ExecFile = "Invalid-file" - err = createExecutionCommand(s.Ctx, ts.args, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to read from %v yaml file", executionConfig.ExecFile), err) + err = createExecutionCommand(s.Ctx, nil, s.CmdCtx) + s.EqualError(err, fmt.Sprintf("unable to read from %v yaml file", executionConfig.ExecFile)) + executionConfig.ExecFile = testDataFolder + "invalid_execution_spec.yaml" - err = createExecutionCommand(s.Ctx, ts.args, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("either task or workflow name should be specified to launch an execution"), err) + err = createExecutionCommand(s.Ctx, nil, s.CmdCtx) + s.EqualError(err, "either task or workflow name should be specified to launch an execution") +} + +func (s *createSuite) Test_CreateTaskExecution_DryRun() { + s.onGetTask() + executionConfig.DryRun = true + executionConfig.ExecFile = testDataFolder + "task_execution_spec_with_iamrole.yaml" + + err := createExecutionCommand(s.Ctx, []string{"target"}, s.CmdCtx) + + s.NoError(err) +} + +func TestCreateSuite(t *testing.T) { + suite.Run(t, &createSuite{originalExecConfig: *executionConfig}) } diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 41c438f274..85f9dd34a2 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -6,13 +6,14 @@ import ( "io/ioutil" "strings" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - cmdGet "github.com/flyteorg/flytectl/cmd/get" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytestdlib/logger" "github.com/google/uuid" "sigs.k8s.io/yaml" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + cmdGet "github.com/flyteorg/flytectl/cmd/get" ) func createExecutionRequestForWorkflow(ctx context.Context, workflowName, project, domain string, @@ -148,6 +149,10 @@ func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, securi if len(targetExecName) == 0 { targetExecName = "f" + strings.ReplaceAll(uuid.New().String(), "-", "")[:19] } + var clusterAssignment *admin.ClusterAssignment + if executionConfig.ClusterPool != "" { + clusterAssignment = &admin.ClusterAssignment{ClusterPoolName: executionConfig.ClusterPool} + } return &admin.ExecutionCreateRequest{ Project: executionConfig.TargetProject, Domain: executionConfig.TargetDomain, @@ -159,8 +164,9 @@ func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, securi Principal: "sdk", Nesting: 0, }, - AuthRole: authRole, - SecurityContext: securityContext, + AuthRole: authRole, + SecurityContext: securityContext, + ClusterAssignment: clusterAssignment, }, Inputs: inputs, } diff --git a/flytectl/cmd/create/executionconfig_flags.go b/flytectl/cmd/create/executionconfig_flags.go index 621a53d253..052d0a74d5 100755 --- a/flytectl/cmd/create/executionconfig_flags.go +++ b/flytectl/cmd/create/executionconfig_flags.go @@ -59,6 +59,7 @@ func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&executionConfig.Recover, fmt.Sprintf("%v%v", prefix, "recover"), executionConfig.Recover, "execution id to be recreated from the last known failure point.") cmdFlags.BoolVar(&executionConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), executionConfig.DryRun, "execute command without making any modifications.") cmdFlags.StringVar(&executionConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), executionConfig.Version, "specify version of execution workflow/task.") + cmdFlags.StringVar(&executionConfig.ClusterPool, fmt.Sprintf("%v%v", prefix, "clusterPool"), executionConfig.ClusterPool, "specify which cluster pool to assign execution to.") cmdFlags.StringVar(&executionConfig.Workflow, fmt.Sprintf("%v%v", prefix, "workflow"), executionConfig.Workflow, "") cmdFlags.StringVar(&executionConfig.Task, fmt.Sprintf("%v%v", prefix, "task"), executionConfig.Task, "") return cmdFlags diff --git a/flytectl/cmd/create/executionconfig_flags_test.go b/flytectl/cmd/create/executionconfig_flags_test.go index dcae9e6516..ac59b4fe0b 100755 --- a/flytectl/cmd/create/executionconfig_flags_test.go +++ b/flytectl/cmd/create/executionconfig_flags_test.go @@ -225,6 +225,20 @@ func TestExecutionConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_clusterPool", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("clusterPool", testValue) + if vString, err := cmdFlags.GetString("clusterPool"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.ClusterPool) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_workflow", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml b/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml index c74db53eef..30aea6cbd1 100644 --- a/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml +++ b/flytectl/cmd/testdata/task_execution_spec_with_iamrole.yaml @@ -13,3 +13,4 @@ targetDomain: "development" targetProject: "flytesnacks" task: core.control_flow.merge_sort.merge version: v2 +clusterPool: gpu diff --git a/flytectl/go.mod b/flytectl/go.mod index 3cc27ebf02..cc7402ff3f 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.1.15 + github.com/flyteorg/flyteidl v1.1.19 github.com/flyteorg/flytestdlib v1.0.0 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 3a940fe8d9..eea38f8a99 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -398,10 +398,8 @@ github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.1.13 h1:xRUOu9+6c/zTZRTv+He1s4kX7uxmd/K5y7tAP598f8A= -github.com/flyteorg/flyteidl v1.1.13/go.mod h1:SLTYz2JgIKvM5MbPVlMP7uILb65fnuuZQZFHHIEYh2U= -github.com/flyteorg/flyteidl v1.1.15 h1:h+T8yeya5OEt7POav0wZkjPdtUatilraVTuwrioqzuA= -github.com/flyteorg/flyteidl v1.1.15/go.mod h1:SLTYz2JgIKvM5MbPVlMP7uILb65fnuuZQZFHHIEYh2U= +github.com/flyteorg/flyteidl v1.1.19 h1:1CtSbuFhFHwUbKdv66PqbcER01iacAJU+snh0eTsXc4= +github.com/flyteorg/flyteidl v1.1.19/go.mod h1:SLTYz2JgIKvM5MbPVlMP7uILb65fnuuZQZFHHIEYh2U= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= From 92104a8fcb3cb0e751d6fe918bfb7939a1002d80 Mon Sep 17 00:00:00 2001 From: Iaroslav Ciupin Date: Fri, 7 Oct 2022 16:17:59 +0300 Subject: [PATCH 282/645] Fix --clusterPool argument override (#360) * fix clusterPool override * increase coverage Signed-off-by: Iaroslav Ciupin --- flytectl/cmd/create/execution_util.go | 3 +++ flytectl/cmd/create/execution_util_test.go | 22 +++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 85f9dd34a2..2fdf247688 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -201,6 +201,9 @@ func resolveOverrides(toBeOverridden *ExecutionConfig, project string, domain st if executionConfig.Version != "" { toBeOverridden.Version = executionConfig.Version } + if executionConfig.ClusterPool != "" { + toBeOverridden.ClusterPool = executionConfig.ClusterPool + } // Use the root project and domain to launch the task/workflow if target is unspecified if executionConfig.TargetProject == "" { toBeOverridden.TargetProject = project diff --git a/flytectl/cmd/create/execution_util_test.go b/flytectl/cmd/create/execution_util_test.go index e36b957890..4ce9befcd5 100644 --- a/flytectl/cmd/create/execution_util_test.go +++ b/flytectl/cmd/create/execution_util_test.go @@ -5,10 +5,11 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytectl/cmd/config" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) @@ -192,3 +193,22 @@ func TestCreateExecutionRequestForTask(t *testing.T) { executionConfig.KubeServiceAcct = "" }) } + +func Test_resolveOverrides(t *testing.T) { + executionConfig.KubeServiceAcct = "k8s-acct" + executionConfig.IamRoleARN = "iam-role" + executionConfig.TargetProject = "t-proj" + executionConfig.TargetDomain = "t-domain" + executionConfig.Version = "v1" + executionConfig.ClusterPool = "gpu" + cfg := &ExecutionConfig{} + + resolveOverrides(cfg, "p1", "d1") + + assert.Equal(t, "k8s-acct", cfg.KubeServiceAcct) + assert.Equal(t, "iam-role", cfg.IamRoleARN) + assert.Equal(t, "t-proj", cfg.TargetProject) + assert.Equal(t, "t-domain", cfg.TargetDomain) + assert.Equal(t, "v1", cfg.Version) + assert.Equal(t, "gpu", cfg.ClusterPool) +} From a64a4162ec0946301a90b66d9fa79bbde8f9b107 Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Wed, 12 Oct 2022 23:17:19 +0800 Subject: [PATCH 283/645] Add support dev cluster (#353) * Add support dev cluster Signed-off-by: Kevin Su * nit Signed-off-by: Kevin Su * nit Signed-off-by: Kevin Su * nit Signed-off-by: Kevin Su * make generate Signed-off-by: Kevin Su * lint Signed-off-by: Kevin Su Signed-off-by: Kevin Su --- flytectl/cmd/compile/compile.go | 4 ++-- flytectl/cmd/completion.go | 2 +- .../cmd/config/subcommand/config/init_flags.go | 2 +- .../config/subcommand/project/project_config.go | 4 ++-- .../cmd/config/subcommand/sandbox/config_flags.go | 1 + .../config/subcommand/sandbox/config_flags_test.go | 14 ++++++++++++++ .../config/subcommand/sandbox/sandbox_config.go | 5 ++++- flytectl/cmd/demo/start.go | 7 ++++++- flytectl/cmd/upgrade/upgrade_test.go | 1 - flytectl/pkg/docker/docker_util.go | 11 +++++++++++ flytectl/pkg/sandbox/start.go | 9 ++++++++- 11 files changed, 50 insertions(+), 10 deletions(-) diff --git a/flytectl/cmd/compile/compile.go b/flytectl/cmd/compile/compile.go index d64f079152..f8f6957b10 100644 --- a/flytectl/cmd/compile/compile.go +++ b/flytectl/cmd/compile/compile.go @@ -29,8 +29,8 @@ func compileTasks(tasks []*core.TaskTemplate) ([]*core.CompiledTask, error) { } /* - Utility to compile a packaged workflow locally. - compilation is done locally so no flyte cluster is required. +Utility to compile a packaged workflow locally. +compilation is done locally so no flyte cluster is required. */ func compileFromPackage(packagePath string) error { args := []string{packagePath} diff --git a/flytectl/cmd/completion.go b/flytectl/cmd/completion.go index a243c7f0c1..b404cb57dd 100644 --- a/flytectl/cmd/completion.go +++ b/flytectl/cmd/completion.go @@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/flytectl/cmd/config/subcommand/config/init_flags.go b/flytectl/cmd/config/subcommand/config/init_flags.go index 1e14634711..22427f0964 100755 --- a/flytectl/cmd/config/subcommand/config/init_flags.go +++ b/flytectl/cmd/config/subcommand/config/init_flags.go @@ -7,7 +7,7 @@ var ( } ) -//Configs +// Configs type Config struct { Host string `json:"host" pflag:",Endpoint of flyte admin"` Insecure bool `json:"insecure" pflag:",Enable insecure mode"` diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go index 36e6c41cb9..0cf927f67a 100644 --- a/flytectl/cmd/config/subcommand/project/project_config.go +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -44,7 +44,7 @@ var DefaultProjectConfig = &ConfigProject{ Labels: map[string]string{}, } -//GetProjectSpec return project spec from a file/flags +// GetProjectSpec return project spec from a file/flags func (c *ConfigProject) GetProjectSpec(id string) (*admin.Project, error) { projectSpec := admin.Project{} if len(c.File) > 0 { @@ -71,7 +71,7 @@ func (c *ConfigProject) GetProjectSpec(id string) (*admin.Project, error) { return &projectSpec, nil } -//MapToAdminState return project spec from a file/flags +// MapToAdminState return project spec from a file/flags func (c *ConfigProject) MapToAdminState() (admin.Project_ProjectState, error) { if c.ActivateProject { c.Activate = c.ActivateProject diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index 426e24204b..eaa7c88091 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -58,5 +58,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.Var(&DefaultConfig.ImagePullPolicy, fmt.Sprintf("%v%v", prefix, "imagePullPolicy"), "Optional. Defines the image pull behavior [Always/IfNotPresent/Never]") cmdFlags.StringVar(&DefaultConfig.ImagePullOptions.RegistryAuth, fmt.Sprintf("%v%v", prefix, "imagePullOptions.registryAuth"), DefaultConfig.ImagePullOptions.RegistryAuth, "The base64 encoded credentials for the registry.") cmdFlags.StringVar(&DefaultConfig.ImagePullOptions.Platform, fmt.Sprintf("%v%v", prefix, "imagePullOptions.platform"), DefaultConfig.ImagePullOptions.Platform, "Forces a specific platform's image to be pulled.'") + cmdFlags.BoolVar(&DefaultConfig.Dev, fmt.Sprintf("%v%v", prefix, "dev"), DefaultConfig.Dev, "Optional. Only start minio and postgres in the sandbox.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index 3fdc64ba40..39dc790cfe 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -209,4 +209,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dev", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dev", testValue) + if vBool, err := cmdFlags.GetBool("dev"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Dev) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index 44f76f614c..c2d37c6407 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -2,7 +2,7 @@ package sandbox import "github.com/flyteorg/flytectl/pkg/docker" -//Config holds configuration flags for sandbox command. +// Config holds configuration flags for sandbox command. type Config struct { Source string `json:"source" pflag:",Path of your source code"` @@ -27,6 +27,9 @@ type Config struct { ImagePullPolicy docker.ImagePullPolicy `json:"imagePullPolicy" pflag:",Optional. Defines the image pull behavior [Always/IfNotPresent/Never]"` ImagePullOptions docker.ImagePullOptions `json:"imagePullOptions" pflag:",Optional. Defines image pull options (e.g. auth)"` + + // It's used for development. Users are able to start flyte locally via single binary and save the data to the minio or postgres in the sandbox. + Dev bool `json:"dev" pflag:",Optional. Only start minio and postgres in the sandbox."` } //go:generate pflags Config --default-var DefaultConfig --bind-default-var diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index a1e3113398..1300496a2a 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -20,6 +20,11 @@ Starts the demo cluster without any source code: flytectl demo start +Runs a dev cluster, which only has minio and postgres pod. +:: + + flytectl demo start --dev + Mounts your source code repository inside the demo cluster: :: @@ -45,7 +50,7 @@ Runs a specific version of Flyte. Flytectl demo only supports Flyte version avai .. note:: Flytectl demo is only supported for Flyte versions >= v1.0.0 -Runs the latest pre release of Flyte. +Runs the latest pre release of Flyte. :: flytectl demo start --pre diff --git a/flytectl/cmd/upgrade/upgrade_test.go b/flytectl/cmd/upgrade/upgrade_test.go index 7b5b211e41..44095a5c13 100644 --- a/flytectl/cmd/upgrade/upgrade_test.go +++ b/flytectl/cmd/upgrade/upgrade_test.go @@ -44,7 +44,6 @@ func TestUpgradeCommand(t *testing.T) { assert.Equal(t, cmdNouns[0].Long, upgradeCmdLong) } -// func TestUpgrade(t *testing.T) { _ = util.WriteIntoFile([]byte("data"), tempExt) stdlibversion.Version = version diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index de7adda9b9..404db17fbc 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -96,6 +96,17 @@ func RemoveSandbox(ctx context.Context, cli Docker, reader io.Reader) error { return nil } +// GetDevPorts will return dev cluster (minio + postgres) ports +func GetDevPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, error) { + return nat.ParsePortSpecs([]string{ + "0.0.0.0:30082:30082", // K8s Dashboard Port + "0.0.0.0:30084:30084", // Minio API Port + "0.0.0.0:30086:30086", // K8s cluster + "0.0.0.0:30088:30088", // Minio Console Port + "0.0.0.0:30089:30089", // Postgres Port + }) +} + // GetSandboxPorts will return sandbox ports func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, error) { return nat.ParsePortSpecs([]string{ diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index 012f104b41..94cb21c0e0 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -193,10 +193,14 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService if err := docker.PullDockerImage(ctx, cli, sandboxImage, sandboxConfig.ImagePullPolicy, sandboxConfig.ImagePullOptions); err != nil { return nil, err } + sandboxEnv := sandboxConfig.Env + if sandboxConfig.Dev { + sandboxEnv = append(sandboxEnv, "FLYTE_DEV=True") + } fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, - sandboxImage, sandboxConfig.Env) + sandboxImage, sandboxEnv) if err != nil { fmt.Printf("%v Something went wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) @@ -281,6 +285,9 @@ func StartDemoCluster(ctx context.Context, args []string, sandboxConfig *sandbox primePod := true sandboxImagePrefix := "sha" exposedPorts, portBindings, err := docker.GetDemoPorts() + if sandboxConfig.Dev { + exposedPorts, portBindings, err = docker.GetDevPorts() + } if err != nil { return err } From e2ed56258e9e29a4b9c8b192c32e787670573d0f Mon Sep 17 00:00:00 2001 From: Andrew Dye Date: Thu, 13 Oct 2022 12:43:09 -0700 Subject: [PATCH 284/645] Add console endpoint config section and init arg (#361) * Add console endpoint init arg and config section Signed-off-by: Andrew Dye * Log invalid endpoint Signed-off-by: Andrew Dye Signed-off-by: Andrew Dye --- .../config/subcommand/config/config_flags.go | 1 + .../subcommand/config/config_flags_test.go | 14 +++ .../config/subcommand/config/console_flags.go | 20 +++ .../subcommand/config/consoleconfig_flags.go | 55 +++++++++ .../config/consoleconfig_flags_test.go | 116 ++++++++++++++++++ .../config/subcommand/config/init_flags.go | 1 + flytectl/cmd/configuration/configuration.go | 16 ++- flytectl/config.yaml | 2 + flytectl/pkg/configutil/configutil.go | 5 + flytectl/pkg/configutil/configutil_test.go | 52 ++++++++ flytectl/pkg/sandbox/start.go | 1 + 11 files changed, 280 insertions(+), 3 deletions(-) create mode 100644 flytectl/cmd/config/subcommand/config/console_flags.go create mode 100755 flytectl/cmd/config/subcommand/config/consoleconfig_flags.go create mode 100755 flytectl/cmd/config/subcommand/config/consoleconfig_flags_test.go diff --git a/flytectl/cmd/config/subcommand/config/config_flags.go b/flytectl/cmd/config/subcommand/config/config_flags.go index 21ce498e28..35b08563cd 100755 --- a/flytectl/cmd/config/subcommand/config/config_flags.go +++ b/flytectl/cmd/config/subcommand/config/config_flags.go @@ -50,6 +50,7 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.StringVar(&DefaultConfig.Console, fmt.Sprintf("%v%v", prefix, "console"), DefaultConfig.Console, "Endpoint of console, if different than flyte admin") cmdFlags.StringVar(&DefaultConfig.Host, fmt.Sprintf("%v%v", prefix, "host"), DefaultConfig.Host, "Endpoint of flyte admin") cmdFlags.BoolVar(&DefaultConfig.Insecure, fmt.Sprintf("%v%v", prefix, "insecure"), DefaultConfig.Insecure, "Enable insecure mode") return cmdFlags diff --git a/flytectl/cmd/config/subcommand/config/config_flags_test.go b/flytectl/cmd/config/subcommand/config/config_flags_test.go index c7cf208df4..142d145bc3 100755 --- a/flytectl/cmd/config/subcommand/config/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/config/config_flags_test.go @@ -99,6 +99,20 @@ func TestConfig_SetFlags(t *testing.T) { cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) + t.Run("Test_console", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("console", testValue) + if vString, err := cmdFlags.GetString("console"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Console) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_host", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/config/subcommand/config/console_flags.go b/flytectl/cmd/config/subcommand/config/console_flags.go new file mode 100644 index 0000000000..f980b3ce2f --- /dev/null +++ b/flytectl/cmd/config/subcommand/config/console_flags.go @@ -0,0 +1,20 @@ +package config + +import "github.com/flyteorg/flytestdlib/config" + +//go:generate pflags ConsoleConfig --default-var DefaultConsoleConfig --bind-default-var + +var ( + DefaultConsoleConfig = &ConsoleConfig{} + + cfg = config.MustRegisterSection("console", DefaultConsoleConfig) +) + +// FilesConfig containing flags used for registration +type ConsoleConfig struct { + Endpoint string `json:"endpoint" pflag:",Endpoint of console, if different than flyte admin"` +} + +func GetConfig() *ConsoleConfig { + return cfg.GetConfig().(*ConsoleConfig) +} diff --git a/flytectl/cmd/config/subcommand/config/consoleconfig_flags.go b/flytectl/cmd/config/subcommand/config/consoleconfig_flags.go new file mode 100755 index 0000000000..4135f44009 --- /dev/null +++ b/flytectl/cmd/config/subcommand/config/consoleconfig_flags.go @@ -0,0 +1,55 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package config + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (ConsoleConfig) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (ConsoleConfig) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (ConsoleConfig) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in ConsoleConfig and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg ConsoleConfig) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("ConsoleConfig", pflag.ExitOnError) + cmdFlags.StringVar(&DefaultConsoleConfig.Endpoint, fmt.Sprintf("%v%v", prefix, "endpoint"), DefaultConsoleConfig.Endpoint, "Endpoint of console, if different than flyte admin") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/config/consoleconfig_flags_test.go b/flytectl/cmd/config/subcommand/config/consoleconfig_flags_test.go new file mode 100755 index 0000000000..77cf7ad56c --- /dev/null +++ b/flytectl/cmd/config/subcommand/config/consoleconfig_flags_test.go @@ -0,0 +1,116 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package config + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsConsoleConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementConsoleConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConsoleConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookConsoleConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementConsoleConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_ConsoleConfig(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookConsoleConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_ConsoleConfig(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_ConsoleConfig(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_ConsoleConfig(val, result)) +} + +func testDecodeRaw_ConsoleConfig(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_ConsoleConfig(vStringSlice, result)) +} + +func TestConsoleConfig_GetPFlagSet(t *testing.T) { + val := ConsoleConfig{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestConsoleConfig_SetFlags(t *testing.T) { + actual := ConsoleConfig{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_endpoint", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("endpoint", testValue) + if vString, err := cmdFlags.GetString("endpoint"); err == nil { + testDecodeJson_ConsoleConfig(t, fmt.Sprintf("%v", vString), &actual.Endpoint) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/config/init_flags.go b/flytectl/cmd/config/subcommand/config/init_flags.go index 22427f0964..9c31fa998d 100755 --- a/flytectl/cmd/config/subcommand/config/init_flags.go +++ b/flytectl/cmd/config/subcommand/config/init_flags.go @@ -9,6 +9,7 @@ var ( // Configs type Config struct { + Console string `json:"console" pflag:",Endpoint of console, if different than flyte admin"` Host string `json:"host" pflag:",Endpoint of flyte admin"` Insecure bool `json:"insecure" pflag:",Enable insecure mode"` } diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index 6d660583a7..e759758164 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -34,7 +34,6 @@ Flyte Sandbox is a fully standalone minimal environment for running Flyte. Read more about the Sandbox deployment :ref:` + "`here `" + `. Generate remote cluster config: - :: flytectl config init --host=flyte.myexample.com @@ -43,11 +42,15 @@ By default, the connection is secure. Read more about remote deployment :ref:` + "`here `" + `. Generate remote cluster config with insecure connection: - :: flytectl config init --host=flyte.myexample.com --insecure + Generate remote cluster config with separate console endpoint: + :: + + flytectl config init --host=flyte.myexample.com --console=console.myexample.com + Generate Flytectl config with a storage provider: :: @@ -90,11 +93,18 @@ func initFlytectlConfig(reader io.Reader) error { if len(initConfig.DefaultConfig.Host) > 0 { trimHost := trimEndpoint(initConfig.DefaultConfig.Host) if !validateEndpointName(trimHost) { - return errors.New("Please use a valid endpoint") + return fmt.Errorf("%s invalid, please use a valid admin endpoint", trimHost) } templateValues.Host = fmt.Sprintf("dns:///%s", trimHost) templateValues.Insecure = initConfig.DefaultConfig.Insecure } + if len(initConfig.DefaultConfig.Console) > 0 { + trimConsole := trimEndpoint(initConfig.DefaultConfig.Console) + if !validateEndpointName(trimConsole) { + return fmt.Errorf("%s invalid, please use a valid console endpoint", trimConsole) + } + templateValues.Console = initConfig.DefaultConfig.Console + } var _err error if _, err := os.Stat(configutil.ConfigFile); os.IsNotExist(err) { _err = configutil.SetupConfig(configutil.ConfigFile, templateStr, templateValues) diff --git a/flytectl/config.yaml b/flytectl/config.yaml index 6447502e59..c26a2e5aef 100644 --- a/flytectl/config.yaml +++ b/flytectl/config.yaml @@ -3,6 +3,8 @@ admin: endpoint: dns:///localhost:30081 insecure: true authType: Pkce +console: + endpoint: http://localhost:30080 logger: show-source: true level: 0 diff --git a/flytectl/pkg/configutil/configutil.go b/flytectl/pkg/configutil/configutil.go index dc60c3d35f..5dcde9bd69 100644 --- a/flytectl/pkg/configutil/configutil.go +++ b/flytectl/pkg/configutil/configutil.go @@ -13,6 +13,10 @@ const ( endpoint: {{.Host}} authType: Pkce insecure: {{.Insecure}} +{{- if .Console}} +console: + endpoint: {{.Console}} +{{- end}} logger: show-source: true level: 0` @@ -21,6 +25,7 @@ logger: type ConfigTemplateSpec struct { Host string Insecure bool + Console string } var ( diff --git a/flytectl/pkg/configutil/configutil_test.go b/flytectl/pkg/configutil/configutil_test.go index 936e0ea682..6a689366e0 100644 --- a/flytectl/pkg/configutil/configutil_test.go +++ b/flytectl/pkg/configutil/configutil_test.go @@ -7,8 +7,60 @@ import ( f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) +func TestSetupConfig(t *testing.T) { + file, err := os.CreateTemp("", "*.yaml") + require.NoError(t, err) + + templateValue := ConfigTemplateSpec{ + Host: "dns:///localhost:30081", + Insecure: true, + } + err = SetupConfig(file.Name(), AdminConfigTemplate, templateValue) + assert.NoError(t, err) + configBytes, err := ioutil.ReadAll(file) + assert.NoError(t, err) + expected := `admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:///localhost:30081 + authType: Pkce + insecure: true +logger: + show-source: true + level: 0` + assert.Equal(t, expected, string(configBytes)) + + file, err = os.Create(file.Name()) + require.NoError(t, err) + templateValue = ConfigTemplateSpec{ + Host: "dns:///admin.example.com", + Insecure: true, + Console: "https://console.example.com", + } + err = SetupConfig(file.Name(), AdminConfigTemplate, templateValue) + assert.NoError(t, err) + configBytes, err = ioutil.ReadAll(file) + assert.NoError(t, err) + expected = `admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:///admin.example.com + authType: Pkce + insecure: true +console: + endpoint: https://console.example.com +logger: + show-source: true + level: 0` + assert.Equal(t, expected, string(configBytes)) + + // Cleanup + if file != nil { + _ = os.Remove(file.Name()) + } +} + func TestConfigCleanup(t *testing.T) { _, err := os.Stat(f.FilePathJoin(f.UserHomeDir(), ".flyte")) if os.IsNotExist(err) { diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index 94cb21c0e0..bbcc7f719b 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -168,6 +168,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService templateValues := configutil.ConfigTemplateSpec{ Host: "localhost:30081", Insecure: true, + Console: fmt.Sprintf("http://localhost:%d", consolePort), } if err := configutil.SetupConfig(configutil.FlytectlConfig, configutil.GetTemplate(), templateValues); err != nil { return nil, err From b62243b222d311587ca1f0e10f3357bed42c3191 Mon Sep 17 00:00:00 2001 From: Daniel Shuy Date: Wed, 26 Oct 2022 02:14:36 +0800 Subject: [PATCH 285/645] Share demo/sandbox status command logic (#364) Signed-off-by: Daniel Shuy Signed-off-by: Daniel Shuy --- flytectl/cmd/demo/status.go | 19 +++------------ flytectl/cmd/sandbox/status.go | 19 +++------------ flytectl/pkg/sandbox/status.go | 22 +++++++++++++++++ flytectl/pkg/sandbox/status_test.go | 37 +++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 32 deletions(-) create mode 100644 flytectl/pkg/sandbox/status.go create mode 100644 flytectl/pkg/sandbox/status_test.go diff --git a/flytectl/cmd/demo/status.go b/flytectl/cmd/demo/status.go index 942b561d8c..7b34bed7e5 100644 --- a/flytectl/cmd/demo/status.go +++ b/flytectl/cmd/demo/status.go @@ -2,9 +2,9 @@ package demo import ( "context" - "fmt" - "github.com/enescakir/emoji" + "github.com/flyteorg/flytectl/pkg/sandbox" + cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/docker" ) @@ -28,18 +28,5 @@ func demoClusterStatus(ctx context.Context, args []string, cmdCtx cmdCore.Comman return err } - return printStatus(ctx, cli) -} - -func printStatus(ctx context.Context, cli docker.Docker) error { - c, err := docker.GetSandbox(ctx, cli) - if err != nil { - return err - } - if c == nil { - fmt.Printf("%v no demo cluster found \n", emoji.StopSign) - return nil - } - fmt.Printf("Flyte demo cluster container image [%s] with status [%s] is in state [%s]", c.Image, c.Status, c.State) - return nil + return sandbox.PrintStatus(ctx, cli) } diff --git a/flytectl/cmd/sandbox/status.go b/flytectl/cmd/sandbox/status.go index 30160ef7e8..69476a4301 100644 --- a/flytectl/cmd/sandbox/status.go +++ b/flytectl/cmd/sandbox/status.go @@ -2,9 +2,9 @@ package sandbox import ( "context" - "fmt" - "github.com/enescakir/emoji" + "github.com/flyteorg/flytectl/pkg/sandbox" + cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/docker" ) @@ -28,18 +28,5 @@ func sandboxClusterStatus(ctx context.Context, args []string, cmdCtx cmdCore.Com return err } - return printStatus(ctx, cli) -} - -func printStatus(ctx context.Context, cli docker.Docker) error { - c, err := docker.GetSandbox(ctx, cli) - if err != nil { - return err - } - if c == nil { - fmt.Printf("%v no Sandbox found \n", emoji.StopSign) - return nil - } - fmt.Printf("Flyte local sandbox cluster container image [%s] with status [%s] is in state [%s]", c.Image, c.Status, c.State) - return nil + return sandbox.PrintStatus(ctx, cli) } diff --git a/flytectl/pkg/sandbox/status.go b/flytectl/pkg/sandbox/status.go new file mode 100644 index 0000000000..dc965ab138 --- /dev/null +++ b/flytectl/pkg/sandbox/status.go @@ -0,0 +1,22 @@ +package sandbox + +import ( + "context" + "fmt" + + "github.com/enescakir/emoji" + "github.com/flyteorg/flytectl/pkg/docker" +) + +func PrintStatus(ctx context.Context, cli docker.Docker) error { + c, err := docker.GetSandbox(ctx, cli) + if err != nil { + return err + } + if c == nil { + fmt.Printf("%v no Sandbox found \n", emoji.StopSign) + return nil + } + fmt.Printf("Flyte local sandbox container image [%s] with status [%s] is in state [%s]", c.Image, c.Status, c.State) + return nil +} diff --git a/flytectl/pkg/sandbox/status_test.go b/flytectl/pkg/sandbox/status_test.go new file mode 100644 index 0000000000..9d3e847b70 --- /dev/null +++ b/flytectl/pkg/sandbox/status_test.go @@ -0,0 +1,37 @@ +package sandbox + +import ( + "testing" + + "github.com/flyteorg/flytectl/cmd/testutils" + + "github.com/docker/docker/api/types" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/stretchr/testify/assert" +) + +func TestSandboxStatus(t *testing.T) { + t.Run("Sandbox status with zero result", func(t *testing.T) { + mockDocker := &mocks.Docker{} + s := testutils.Setup() + mockDocker.OnContainerList(s.Ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) + err := PrintStatus(s.Ctx, mockDocker) + assert.Nil(t, err) + }) + t.Run("Sandbox status with running sandbox", func(t *testing.T) { + s := testutils.Setup() + ctx := s.Ctx + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + err := PrintStatus(ctx, mockDocker) + assert.Nil(t, err) + }) +} From 35e67f6a9ca32b06d130d4ba6193a90dcb0bcff8 Mon Sep 17 00:00:00 2001 From: Daniel Shuy Date: Wed, 26 Oct 2022 15:09:56 +0800 Subject: [PATCH 286/645] Check kubeConfig before starting sandbox (#363) Signed-off-by: Daniel Shuy Signed-off-by: Daniel Shuy --- flytectl/pkg/k8s/k8s.go | 9 +++++++- flytectl/pkg/k8s/mocks/context_ops.go | 32 +++++++++++++++++++++++++++ flytectl/pkg/sandbox/start.go | 11 ++++++--- flytectl/pkg/sandbox/start_test.go | 1 + 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/flytectl/pkg/k8s/k8s.go b/flytectl/pkg/k8s/k8s.go index 6f9ca3e07d..1a34a93bca 100644 --- a/flytectl/pkg/k8s/k8s.go +++ b/flytectl/pkg/k8s/k8s.go @@ -17,6 +17,7 @@ type K8s interface { //go:generate mockery -name=ContextOps -case=underscore type ContextOps interface { + CheckConfig() error CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName, targetCtxName string) error RemoveContext(ctxName string) error } @@ -56,9 +57,15 @@ func GetK8sClient(cfg, master string) (K8s, error) { return Client, nil } +// CheckConfig checks if the kubeConfig pointed to by configAccess exists +func (k *ContextManager) CheckConfig() error { + _, err := k.configAccess.GetStartingConfig() + return err +} + // CopyKubeContext copies context srcCtxName part of srcConfigAccess to targetCtxName part of targetConfigAccess. func (k *ContextManager) CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName, targetCtxName string) error { - _, err := k.configAccess.GetStartingConfig() + err := k.CheckConfig() if err != nil { return err } diff --git a/flytectl/pkg/k8s/mocks/context_ops.go b/flytectl/pkg/k8s/mocks/context_ops.go index 0d9e82dd38..6229f02b45 100644 --- a/flytectl/pkg/k8s/mocks/context_ops.go +++ b/flytectl/pkg/k8s/mocks/context_ops.go @@ -13,6 +13,38 @@ type ContextOps struct { mock.Mock } +type ContextOps_CheckConfig struct { + *mock.Call +} + +func (_m ContextOps_CheckConfig) Return(_a0 error) *ContextOps_CheckConfig { + return &ContextOps_CheckConfig{Call: _m.Call.Return(_a0)} +} + +func (_m *ContextOps) OnCheckConfig() *ContextOps_CheckConfig { + c_call := _m.On("CheckConfig") + return &ContextOps_CheckConfig{Call: c_call} +} + +func (_m *ContextOps) OnCheckConfigMatch(matchers ...interface{}) *ContextOps_CheckConfig { + c_call := _m.On("CheckConfig", matchers...) + return &ContextOps_CheckConfig{Call: c_call} +} + +// CheckConfig provides a mock function with given fields: +func (_m *ContextOps) CheckConfig() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + type ContextOps_CopyContext struct { *mock.Call } diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index bbcc7f719b..9260c7f32c 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -140,12 +140,11 @@ func MountVolume(file, destination string) (*mount.Mount, error) { return nil, nil } -func UpdateLocalKubeContext(dockerCtx string, contextName string) error { +func UpdateLocalKubeContext(k8sCtxMgr k8s.ContextOps, dockerCtx string, contextName string) error { srcConfigAccess := &clientcmd.PathOptions{ GlobalFile: docker.Kubeconfig, LoadingRules: clientcmd.NewDefaultClientConfigLoadingRules(), } - k8sCtxMgr := k8s.NewK8sContextManager() return k8sCtxMgr.CopyContext(srcConfigAccess, dockerCtx, contextName) } @@ -240,6 +239,12 @@ func primeFlytekitPod(ctx context.Context, podService corev1.PodInterface) { } func StartCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config, primePod bool, defaultImageName string, defaultImagePrefix string, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, consolePort int) error { + k8sCtxMgr := k8s.NewK8sContextManager() + err := k8sCtxMgr.CheckConfig() + if err != nil { + return err + } + cli, err := docker.GetDockerClient() if err != nil { return err @@ -267,7 +272,7 @@ func StartCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdC if err != nil { return err } - if err = UpdateLocalKubeContext(sandboxDockerContext, sandboxContextName); err != nil { + if err = UpdateLocalKubeContext(k8sCtxMgr, sandboxDockerContext, sandboxContextName); err != nil { return err } diff --git a/flytectl/pkg/sandbox/start_test.go b/flytectl/pkg/sandbox/start_test.go index f4d46b2321..c3b22c6be4 100644 --- a/flytectl/pkg/sandbox/start_test.go +++ b/flytectl/pkg/sandbox/start_test.go @@ -310,6 +310,7 @@ func TestStartFunc(t *testing.T) { sandboxCmdConfig.DefaultConfig.Version = "" k8s.ContextMgr = mockK8sContextMgr ghutil.Client = githubMock + mockK8sContextMgr.OnCheckConfig().Return(nil) mockK8sContextMgr.OnCopyContextMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) err = StartSandboxCluster(context.Background(), []string{}, config) assert.Nil(t, err) From 26d976d92ec5e0166369de6ba551f9012efe4965 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Fri, 4 Nov 2022 11:10:22 +0530 Subject: [PATCH 287/645] Add default input default behavior check for scheduler workflow registration (#368) --- flytectl/cmd/register/register_util.go | 4 +- flytectl/cmd/register/register_util_test.go | 79 ++++++++++++++++++++- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 922ff211da..0f646c89b5 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -328,8 +328,8 @@ func validateLPWithSchedule(lpSpec *admin.LaunchPlanSpec, wf *admin.Workflow) er var scheduleParamsWithValues []string // Check for default values if lpSpec.DefaultInputs != nil { - for paramName := range lpSpec.DefaultInputs.Parameters { - if paramName != schedule.KickoffTimeInputArg { + for paramName, paramValue := range lpSpec.DefaultInputs.Parameters { + if paramName != schedule.KickoffTimeInputArg && paramValue.GetDefault() != nil { scheduleParamsWithValues = append(scheduleParamsWithValues, paramName) } } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 7be93359c0..6e31565cec 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -755,7 +755,7 @@ func TestValidateLaunchSpec(t *testing.T) { assert.NotNil(t, err) assert.Contains(t, err.Error(), "param values are missing on scheduled workflow for the following params") }) - t.Run("launchplan spec non empty schedule required param success", func(t *testing.T) { + t.Run("launchplan spec non empty schedule default param success", func(t *testing.T) { s := setup() registerFilesSetup() variableMap := map[string]*core.Variable{ @@ -820,6 +820,21 @@ func TestValidateLaunchSpec(t *testing.T) { Type: &core.LiteralType_Simple{Simple: core.SimpleType_INTEGER}, }, }, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Primitive{ + Primitive: &core.Primitive{ + Value: &core.Primitive_Integer{ + Integer: 10, + }, + }, + }, + }, + }, + }, + }, }, }, }, @@ -844,4 +859,66 @@ func TestValidateLaunchSpec(t *testing.T) { err := validateLaunchSpec(ctx, lpSpec, s.CmdCtx) assert.Nil(t, err) }) + + t.Run("launchplan spec non empty schedule required param without value fail", func(t *testing.T) { + s := setup() + registerFilesSetup() + variableMap := map[string]*core.Variable{ + "var1": { + Type: &core.LiteralType{ + Type: &core.LiteralType_CollectionType{ + CollectionType: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_INTEGER, + }, + }, + }, + }, + Description: "var1", + }, + } + wf := &admin.Workflow{ + Closure: &admin.WorkflowClosure{ + CompiledWorkflow: &core.CompiledWorkflowClosure{ + Primary: &core.CompiledWorkflow{ + Template: &core.WorkflowTemplate{ + Interface: &core.TypedInterface{ + Inputs: &core.VariableMap{ + Variables: variableMap, + }, + }, + }, + }, + }, + }, + } + s.FetcherExt.OnFetchWorkflowVersionMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(wf, nil) + lpSpec := &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Project: "projectValue", + Domain: "domainValue", + Name: "workflowNameValue", + Version: "workflowVersionValue", + }, + EntityMetadata: &admin.LaunchPlanMetadata{ + Schedule: &admin.Schedule{ + KickoffTimeInputArg: "kick_off_time_arg", + }, + }, + DefaultInputs: &core.ParameterMap{ + Parameters: map[string]*core.Parameter{ + "var1": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{Simple: core.SimpleType_INTEGER}, + }, + }, + }, + }, + }, + } + err := validateLaunchSpec(ctx, lpSpec, s.CmdCtx) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("param values are missing on scheduled workflow for the following params [var1]. Either specify them having a default or fixed value"), err) + }) } From fc3c99e0fd8732b63fd1e311f4ece147ac7fd00b Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Mon, 7 Nov 2022 23:27:42 +0530 Subject: [PATCH 288/645] Added dryRun flag for printing docker command for demo and sandbox (#367) * Added printCommand flag for printing docker command for demo and sandbox Signed-off-by: pmahindrakar-oss * test fixes Signed-off-by: pmahindrakar-oss * Added pull image command aswell Signed-off-by: pmahindrakar-oss * using dryRun Signed-off-by: pmahindrakar-oss * flytectl config export Signed-off-by: pmahindrakar-oss Signed-off-by: pmahindrakar-oss --- .../config/subcommand/sandbox/config_flags.go | 1 + .../subcommand/sandbox/config_flags_test.go | 14 +++++ .../subcommand/sandbox/sandbox_config.go | 3 +- flytectl/cmd/demo/start.go | 6 ++ flytectl/cmd/sandbox/sandbox.go | 6 ++ flytectl/pkg/docker/docker_util.go | 62 +++++++++++++++++-- flytectl/pkg/docker/docker_util_test.go | 16 ++--- flytectl/pkg/sandbox/start.go | 40 ++++++------ flytectl/pkg/util/util.go | 27 +++++--- flytectl/pkg/util/util_test.go | 2 +- 10 files changed, 136 insertions(+), 41 deletions(-) diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index eaa7c88091..e9fbd5a60e 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -59,5 +59,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.ImagePullOptions.RegistryAuth, fmt.Sprintf("%v%v", prefix, "imagePullOptions.registryAuth"), DefaultConfig.ImagePullOptions.RegistryAuth, "The base64 encoded credentials for the registry.") cmdFlags.StringVar(&DefaultConfig.ImagePullOptions.Platform, fmt.Sprintf("%v%v", prefix, "imagePullOptions.platform"), DefaultConfig.ImagePullOptions.Platform, "Forces a specific platform's image to be pulled.'") cmdFlags.BoolVar(&DefaultConfig.Dev, fmt.Sprintf("%v%v", prefix, "dev"), DefaultConfig.Dev, "Optional. Only start minio and postgres in the sandbox.") + cmdFlags.BoolVar(&DefaultConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultConfig.DryRun, "Optional. Only print the docker commands to bring up flyte sandbox/demo container.This will still call github api's to get the latest flyte release to use'") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index 39dc790cfe..0d7021b76d 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -223,4 +223,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_dryRun", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("dryRun", testValue) + if vBool, err := cmdFlags.GetBool("dryRun"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.DryRun) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index c2d37c6407..463f751ecc 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -29,7 +29,8 @@ type Config struct { ImagePullOptions docker.ImagePullOptions `json:"imagePullOptions" pflag:",Optional. Defines image pull options (e.g. auth)"` // It's used for development. Users are able to start flyte locally via single binary and save the data to the minio or postgres in the sandbox. - Dev bool `json:"dev" pflag:",Optional. Only start minio and postgres in the sandbox."` + Dev bool `json:"dev" pflag:",Optional. Only start minio and postgres in the sandbox."` + DryRun bool `json:"dryRun" pflag:",Optional. Only print the docker commands to bring up flyte sandbox/demo container.This will still call github api's to get the latest flyte release to use'"` } //go:generate pflags Config --default-var DefaultConfig --bind-default-var diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index 1300496a2a..a800ed1795 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -75,6 +75,12 @@ eg : for passing multiple environment variables flytectl demo start --env USER=foo --env PASSWORD=bar +For just printing the docker commands for bringingup the demo container +:: + + flytectl demo start --dryRun + + Usage ` ) diff --git a/flytectl/cmd/sandbox/sandbox.go b/flytectl/cmd/sandbox/sandbox.go index 2e342c41e4..0e20df4312 100644 --- a/flytectl/cmd/sandbox/sandbox.go +++ b/flytectl/cmd/sandbox/sandbox.go @@ -32,6 +32,12 @@ To execute commands inside the sandbox container, use exec: :: flytectl sandbox exec -- pwd + +For just printing the docker commands for bringingup the demo container +:: + + flytectl demo start --dryRun + ` ) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 404db17fbc..a3ae226bc8 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -138,8 +138,12 @@ func GetDemoPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, erro // PullDockerImage will Pull docker image func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy ImagePullPolicy, - imagePullOptions ImagePullOptions) error { - + imagePullOptions ImagePullOptions, dryRun bool) error { + if dryRun { + PrintPullImage(image, imagePullOptions) + return nil + } + fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, image) if pullPolicy == ImagePullPolicyAlways || pullPolicy == ImagePullPolicyIfNotPresent { if pullPolicy == ImagePullPolicyIfNotPresent { imageSummary, err := cli.ImageList(ctx, types.ImageListOptions{}) @@ -169,11 +173,61 @@ func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy I return nil } -//StartContainer will create and start docker container +// PrintPullImage helper function to print the sandbox pull image command +func PrintPullImage(image string, pullOptions ImagePullOptions) { + fmt.Printf("%v Run the following command to pull the sandbox image from registry.\n", emoji.Sparkle) + var sb strings.Builder + sb.WriteString("docker pull ") + if len(pullOptions.Platform) > 0 { + sb.WriteString(fmt.Sprintf("--platform %v ", pullOptions.Platform)) + } + sb.WriteString(fmt.Sprintf("%v", image)) + fmt.Printf(" %v \n", sb.String()) +} + +// PrintRemoveContainer helper function to remove sandbox container +func PrintRemoveContainer(name string) { + fmt.Printf("%v Run the following command to remove the existing sandbox\n", emoji.Sparkle) + fmt.Printf(" docker container rm %v --force\n", name) +} + +// PrintCreateContainer helper function to print the docker command to run +func PrintCreateContainer(volumes []mount.Mount, portBindings map[nat.Port][]nat.PortBinding, name, image string, environment []string) { + var sb strings.Builder + fmt.Printf("%v Run the following command to create new sandbox container\n", emoji.Sparkle) + sb.WriteString(" docker create --privileged ") + for portProto, bindings := range portBindings { + srcPort := portProto.Port() + for _, binding := range bindings { + sb.WriteString(fmt.Sprintf("-p %v:%v:%v ", binding.HostIP, srcPort, binding.HostPort)) + } + } + for _, env := range environment { + sb.WriteString(fmt.Sprintf("--env %v ", env)) + } + + for _, volume := range volumes { + sb.WriteString(fmt.Sprintf("--mount type=%v,source=%v,target=%v ", volume.Type, volume.Source, volume.Target)) + } + sb.WriteString(fmt.Sprintf("--name %v ", name)) + sb.WriteString(fmt.Sprintf("%v", image)) + fmt.Printf("%v\n", sb.String()) + fmt.Printf("%v Run the following command to start the sandbox container\n", emoji.Sparkle) + fmt.Printf(" docker start %v\n", name) + fmt.Printf("%v Run the following command to check the logs and monitor the sandbox container and make sure there are no error during startup and then visit flyteconsole\n", emoji.EightSpokedAsterisk) + fmt.Printf(" docker logs -f %v\n", name) +} + +// StartContainer will create and start docker container func StartContainer(ctx context.Context, cli Docker, volumes []mount.Mount, exposedPorts map[nat.Port]struct{}, - portBindings map[nat.Port][]nat.PortBinding, name, image string, additionalEnvVars []string) (string, error) { + portBindings map[nat.Port][]nat.PortBinding, name, image string, additionalEnvVars []string, dryRun bool) (string, error) { // Append the additional env variables to the default list of env Environment = append(Environment, additionalEnvVars...) + if dryRun { + PrintCreateContainer(volumes, portBindings, name, image, Environment) + return "", nil + } + fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) resp, err := cli.ContainerCreate(ctx, &container.Config{ Env: Environment, Image: image, diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 8524443641..7b33be9425 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -104,7 +104,7 @@ func TestPullDockerImage(t *testing.T) { ctx := context.Background() // Verify the attributes mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) - err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyAlways, ImagePullOptions{}) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyAlways, ImagePullOptions{}, false) assert.Nil(t, err) }) @@ -114,7 +114,7 @@ func TestPullDockerImage(t *testing.T) { ctx := context.Background() // Verify the attributes mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) - err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyAlways, ImagePullOptions{}) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyAlways, ImagePullOptions{}, false) assert.NotNil(t, err) }) @@ -125,7 +125,7 @@ func TestPullDockerImage(t *testing.T) { // Verify the attributes mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) mockDocker.OnImageListMatch(ctx, types.ImageListOptions{}).Return([]types.ImageSummary{}, nil) - err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyIfNotPresent, ImagePullOptions{}) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyIfNotPresent, ImagePullOptions{}, false) assert.Nil(t, err) }) @@ -133,7 +133,7 @@ func TestPullDockerImage(t *testing.T) { setupSandbox() mockDocker := &mocks.Docker{} ctx := context.Background() - err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyNever, ImagePullOptions{}) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyNever, ImagePullOptions{}, false) assert.Nil(t, err) }) } @@ -160,7 +160,7 @@ func TestStartContainer(t *testing.T) { ID: "Hello", }, nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) + id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, nil, false) assert.Nil(t, err) assert.Greater(t, len(id), 0) assert.Equal(t, id, "Hello") @@ -189,7 +189,7 @@ func TestStartContainer(t *testing.T) { ID: "Hello", }, nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, additionalEnv) + id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, additionalEnv, false) assert.Nil(t, err) assert.Greater(t, len(id), 0) assert.Equal(t, id, "Hello") @@ -215,7 +215,7 @@ func TestStartContainer(t *testing.T) { ID: "", }, fmt.Errorf("error")) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) + id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, nil, false) assert.NotNil(t, err) assert.Equal(t, len(id), 0) assert.Equal(t, id, "") @@ -240,7 +240,7 @@ func TestStartContainer(t *testing.T) { ID: "Hello", }, nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("error")) - id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, nil) + id, err := StartContainer(ctx, mockDocker, Volumes, p1, p2, "nginx", imageName, nil, false) assert.NotNil(t, err) assert.Equal(t, len(id), 0) assert.Equal(t, id, "") diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index 9260c7f32c..3a53923ca1 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -150,16 +150,18 @@ func UpdateLocalKubeContext(k8sCtxMgr k8s.ContextOps, dockerCtx string, contextN func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService, reader io.Reader, sandboxConfig *sandboxCmdConfig.Config, defaultImageName string, defaultImagePrefix string, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, consolePort int) (*bufio.Scanner, error) { fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) - - if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { - if err.Error() != clierrors.ErrSandboxExists { - return nil, err + if sandboxConfig.DryRun { + docker.PrintRemoveContainer(docker.FlyteSandboxClusterName) + } else { + if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { + if err.Error() != clierrors.ErrSandboxExists { + return nil, err + } + fmt.Printf("Existing details of your sandbox") + util.PrintSandboxMessage(consolePort, sandboxConfig.DryRun) + return nil, nil } - fmt.Printf("Existing details of your sandbox") - util.PrintSandboxMessage(consolePort) - return nil, nil } - if err := util.SetupFlyteDir(); err != nil { return nil, err } @@ -186,11 +188,9 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService return nil, err } sandboxImage = image - fmt.Printf("%s Fully Qualified image\n", image) - fmt.Printf("%v Running Flyte %s release\n", emoji.Whale, version) + fmt.Printf("%v Going to use Flyte %s release with image %s \n", emoji.Whale, version, image) } - fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, sandboxImage) - if err := docker.PullDockerImage(ctx, cli, sandboxImage, sandboxConfig.ImagePullPolicy, sandboxConfig.ImagePullOptions); err != nil { + if err := docker.PullDockerImage(ctx, cli, sandboxImage, sandboxConfig.ImagePullPolicy, sandboxConfig.ImagePullOptions, sandboxConfig.DryRun); err != nil { return nil, err } sandboxEnv := sandboxConfig.Env @@ -198,18 +198,20 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService sandboxEnv = append(sandboxEnv, "FLYTE_DEV=True") } - fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, - sandboxImage, sandboxEnv) + sandboxImage, sandboxEnv, sandboxConfig.DryRun) if err != nil { fmt.Printf("%v Something went wrong: Failed to start Sandbox container %v, Please check your docker client and try again. \n", emoji.GrimacingFace, emoji.Whale) return nil, err } - logReader, err := docker.ReadLogs(ctx, cli, ID) - if err != nil { - return nil, err + var logReader *bufio.Scanner + if !sandboxConfig.DryRun { + logReader, err = docker.ReadLogs(ctx, cli, ID) + if err != nil { + return nil, err + } } return logReader, nil @@ -301,7 +303,7 @@ func StartDemoCluster(ctx context.Context, args []string, sandboxConfig *sandbox if err != nil { return err } - util.PrintSandboxMessage(util.DemoConsolePort) + util.PrintSandboxMessage(util.DemoConsolePort, sandboxConfig.DryRun) return nil } @@ -316,6 +318,6 @@ func StartSandboxCluster(ctx context.Context, args []string, sandboxConfig *sand if err != nil { return err } - util.PrintSandboxMessage(util.SandBoxConsolePort) + util.PrintSandboxMessage(util.SandBoxConsolePort, sandboxConfig.DryRun) return nil } diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index 5fc54438ec..afdb35967b 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -17,9 +17,10 @@ import ( ) const ( - ProgressSuccessMessage = "Flyte is ready! Flyte UI is available at" - SandBoxConsolePort = 30081 - DemoConsolePort = 30080 + ProgressSuccessMessage = "Flyte is ready! Flyte UI is available at" + ProgressSuccessMessagePending = "Flyte would be ready after this! Flyte UI would be available at" + SandBoxConsolePort = 30081 + DemoConsolePort = 30080 ) var Ext string @@ -52,17 +53,27 @@ func SetupFlyteDir() error { } // PrintSandboxMessage will print sandbox success message -func PrintSandboxMessage(flyteConsolePort int) { +func PrintSandboxMessage(flyteConsolePort int, dryRun bool) { kubeconfig := strings.Join([]string{ "$KUBECONFIG", f.FilePathJoin(f.UserHomeDir(), ".kube", "config"), docker.Kubeconfig, }, ":") - successMsg := fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessage, flyteConsolePort) + + var successMsg string + if dryRun { + successMsg = fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessagePending, flyteConsolePort) + } else { + successMsg = fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessage, flyteConsolePort) + + } fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, successMsg, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) - fmt.Printf("Add KUBECONFIG and FLYTECTL_CONFIG to your environment variable \n") - fmt.Printf("export KUBECONFIG=%v \n", kubeconfig) - fmt.Printf("export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) + fmt.Printf("%v Run the following command to export sandbox environment variables for accessing flytectl\n", emoji.Sparkle) + fmt.Printf(" export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) + if dryRun { + fmt.Printf("%v Run the following command to export kubeconfig variables for accessing flyte pods locally\n", emoji.Sparkle) + fmt.Printf(" export KUBECONFIG=%v \n", kubeconfig) + } } // SendRequest will create request and return the response diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index 718a244d9c..9bbb89964f 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -25,7 +25,7 @@ func TestSetupFlyteDir(t *testing.T) { func TestPrintSandboxMessage(t *testing.T) { t.Run("Print Sandbox Message", func(t *testing.T) { - PrintSandboxMessage(SandBoxConsolePort) + PrintSandboxMessage(SandBoxConsolePort, false) }) } From 3749e3f8fff588ecd8856e6566f3d8dec5066c3f Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Tue, 8 Nov 2022 22:22:31 +0530 Subject: [PATCH 289/645] Adding changes for project level matchable attr api (#357) * Adding changes for project level matchable attr api Signed-off-by: pmahindrakar-oss * Added test for project attribute Signed-off-by: pmahindrakar-oss Signed-off-by: pmahindrakar-oss --- .../cmd/delete/matchable_attribute_util.go | 17 ++++++-- flytectl/cmd/get/get.go | 2 +- flytectl/cmd/get/matchable_attribute_util.go | 21 +++++++--- .../cmd/update/matchable_attribute_util.go | 17 ++++++-- .../pkg/ext/attribute_match_deleter_test.go | 14 +++++++ flytectl/pkg/ext/attribute_match_fetcher.go | 16 ++++++++ .../pkg/ext/attribute_match_fetcher_test.go | 17 ++++++++ flytectl/pkg/ext/attribute_match_updater.go | 11 +++++ .../pkg/ext/attribute_match_updater_test.go | 17 ++++++++ flytectl/pkg/ext/attribute_matcher_deleter.go | 8 ++++ flytectl/pkg/ext/deleter.go | 3 ++ flytectl/pkg/ext/fetcher.go | 3 ++ .../ext/mocks/admin_deleter_ext_interface.go | 32 +++++++++++++++ .../ext/mocks/admin_fetcher_ext_interface.go | 41 +++++++++++++++++++ .../ext/mocks/admin_updater_ext_interface.go | 32 +++++++++++++++ flytectl/pkg/ext/updater.go | 3 ++ 16 files changed, 239 insertions(+), 15 deletions(-) diff --git a/flytectl/cmd/delete/matchable_attribute_util.go b/flytectl/cmd/delete/matchable_attribute_util.go index b2482270e8..020a60968d 100644 --- a/flytectl/cmd/delete/matchable_attribute_util.go +++ b/flytectl/cmd/delete/matchable_attribute_util.go @@ -26,12 +26,21 @@ func deleteMatchableAttr(ctx context.Context, project, domain, workflowName stri if dryRun { fmt.Print("skipping DeleteProjectDomainAttributes request (dryRun)\n") } else { - err := deleter.DeleteProjectDomainAttributes(ctx, project, domain, rsType) - if err != nil { - return err + if len(domain) == 0 { + err := deleter.DeleteProjectAttributes(ctx, project, rsType) + if err != nil { + return err + } + fmt.Printf("Deleted matchable resources from %v project \n", project) + } else { + err := deleter.DeleteProjectDomainAttributes(ctx, project, domain, rsType) + if err != nil { + return err + } + fmt.Printf("Deleted matchable resources from %v project and domain %v\n", project, domain) } } - fmt.Printf("Deleted matchable resources from %v project and domain %v\n", project, domain) + } return nil } diff --git a/flytectl/cmd/get/get.go b/flytectl/cmd/get/get.go index 2e0792166d..7c1b5ea164 100644 --- a/flytectl/cmd/get/get.go +++ b/flytectl/cmd/get/get.go @@ -65,7 +65,7 @@ func CreateGetCommand() *cobra.Command { Long: pluginOverrideLong, PFlagProvider: pluginoverride.DefaultFetchConfig}, "workflow-execution-config": {CmdFunc: getWorkflowExecutionConfigFunc, Aliases: []string{"workflow-execution-config"}, Short: workflowExecutionConfigShort, - Long: workflowExecutionConfigLong, PFlagProvider: workflowexecutionconfig.DefaultFetchConfig}, + Long: workflowExecutionConfigLong, PFlagProvider: workflowexecutionconfig.DefaultFetchConfig, ProjectDomainNotRequired: true}, } cmdcore.AddCommands(getCmd, getResourcesFuncs) diff --git a/flytectl/cmd/get/matchable_attribute_util.go b/flytectl/cmd/get/matchable_attribute_util.go index cddfdab348..0a6358bf39 100644 --- a/flytectl/cmd/get/matchable_attribute_util.go +++ b/flytectl/cmd/get/matchable_attribute_util.go @@ -20,13 +20,22 @@ func FetchAndUnDecorateMatchableAttr(ctx context.Context, project, domain, workf // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. unDecorator.UnDecorate(workflowAttr.GetAttributes().GetMatchingAttributes()) } else { - // Fetch the project domain attribute from the admin - projectDomainAttr, err := fetcher.FetchProjectDomainAttributes(ctx, project, domain, rsType) - if err != nil { - return err + if len(domain) == 0 { + projectAttr, err := fetcher.FetchProjectAttributes(ctx, project, rsType) + if err != nil { + return err + } + // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. + unDecorator.UnDecorate(projectAttr.GetAttributes().GetMatchingAttributes()) + } else { + // Fetch the project domain attribute from the admin + projectDomainAttr, err := fetcher.FetchProjectDomainAttributes(ctx, project, domain, rsType) + if err != nil { + return err + } + // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. + unDecorator.UnDecorate(projectDomainAttr.GetAttributes().GetMatchingAttributes()) } - // Update the shadow config with the fetched taskResourceAttribute which can then be written to a file which can then be called for an update. - unDecorator.UnDecorate(projectDomainAttr.GetAttributes().GetMatchingAttributes()) } return nil } diff --git a/flytectl/cmd/update/matchable_attribute_util.go b/flytectl/cmd/update/matchable_attribute_util.go index e3f4a2d296..23efa16912 100644 --- a/flytectl/cmd/update/matchable_attribute_util.go +++ b/flytectl/cmd/update/matchable_attribute_util.go @@ -27,12 +27,21 @@ func DecorateAndUpdateMatchableAttr(ctx context.Context, project, domain, workfl if dryRun { fmt.Printf("skipping UpdateProjectDomainAttributes request (dryRun)\n") } else { - err := updater.UpdateProjectDomainAttributes(ctx, project, domain, matchingAttr) - if err != nil { - return err + if len(domain) == 0 { + err := updater.UpdateProjectAttributes(ctx, project, matchingAttr) + if err != nil { + return err + } + fmt.Printf("Updated attributes from %v project\n", project) + } else { + err := updater.UpdateProjectDomainAttributes(ctx, project, domain, matchingAttr) + if err != nil { + return err + } + fmt.Printf("Updated attributes from %v project and domain %v\n", project, domain) } } - fmt.Printf("Updated attributes from %v project and domain %v\n", project, domain) + } return nil } diff --git a/flytectl/pkg/ext/attribute_match_deleter_test.go b/flytectl/pkg/ext/attribute_match_deleter_test.go index 9c8c665b08..c0105f99ce 100644 --- a/flytectl/pkg/ext/attribute_match_deleter_test.go +++ b/flytectl/pkg/ext/attribute_match_deleter_test.go @@ -47,3 +47,17 @@ func TestDeleteProjectDomainAttributesError(t *testing.T) { err := adminDeleterExt.DeleteProjectDomainAttributes(ctx, "dummyProject", "domainValue", admin.MatchableResource_TASK_RESOURCE) assert.Equal(t, fmt.Errorf("failed"), err) } + +func TestDeleteProjectAttributes(t *testing.T) { + deleteAttributeMatchFetcherSetup() + adminClient.OnDeleteProjectAttributesMatch(mock.Anything, mock.Anything).Return(nil, nil) + err := adminDeleterExt.DeleteProjectAttributes(ctx, "dummyProject", admin.MatchableResource_TASK_RESOURCE) + assert.Nil(t, err) +} + +func TestDeleteProjectAttributesError(t *testing.T) { + deleteAttributeMatchFetcherSetup() + adminClient.OnDeleteProjectAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + err := adminDeleterExt.DeleteProjectAttributes(ctx, "dummyProject", admin.MatchableResource_TASK_RESOURCE) + assert.Equal(t, fmt.Errorf("failed"), err) +} diff --git a/flytectl/pkg/ext/attribute_match_fetcher.go b/flytectl/pkg/ext/attribute_match_fetcher.go index 0af146e8e1..3e33609b3b 100644 --- a/flytectl/pkg/ext/attribute_match_fetcher.go +++ b/flytectl/pkg/ext/attribute_match_fetcher.go @@ -40,3 +40,19 @@ func (a *AdminFetcherExtClient) FetchProjectDomainAttributes(ctx context.Context } return projectDomainAttr, nil } + +func (a *AdminFetcherExtClient) FetchProjectAttributes(ctx context.Context, project string, + rsType admin.MatchableResource) (*admin.ProjectAttributesGetResponse, error) { + projectDomainAttr, err := a.AdminServiceClient().GetProjectAttributes(ctx, + &admin.ProjectAttributesGetRequest{ + Project: project, + ResourceType: rsType, + }) + if err != nil { + return nil, err + } + if projectDomainAttr.GetAttributes() == nil || projectDomainAttr.GetAttributes().GetMatchingAttributes() == nil { + return nil, fmt.Errorf("attribute doesn't exist") + } + return projectDomainAttr, nil +} diff --git a/flytectl/pkg/ext/attribute_match_fetcher_test.go b/flytectl/pkg/ext/attribute_match_fetcher_test.go index ea7f29929a..81352d6bc2 100644 --- a/flytectl/pkg/ext/attribute_match_fetcher_test.go +++ b/flytectl/pkg/ext/attribute_match_fetcher_test.go @@ -79,3 +79,20 @@ func TestFetchProjectDomainAttributesError(t *testing.T) { assert.Equal(t, fmt.Errorf("attribute doesn't exist"), err) }) } + +func TestFetchProjectAttributesError(t *testing.T) { + t.Run("failed api", func(t *testing.T) { + getAttributeMatchFetcherSetup() + adminClient.OnGetProjectAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + _, err := adminFetcherExt.FetchProjectAttributes(ctx, "dummyProject", admin.MatchableResource_TASK_RESOURCE) + assert.Equal(t, fmt.Errorf("failed"), err) + }) + t.Run("empty data from api", func(t *testing.T) { + getAttributeMatchFetcherSetup() + pResp := &admin.ProjectAttributesGetResponse{} + adminClient.OnGetProjectAttributesMatch(mock.Anything, mock.Anything).Return(pResp, nil) + _, err := adminFetcherExt.FetchProjectAttributes(ctx, "dummyProject", admin.MatchableResource_TASK_RESOURCE) + assert.NotNil(t, err) + assert.Equal(t, fmt.Errorf("attribute doesn't exist"), err) + }) +} diff --git a/flytectl/pkg/ext/attribute_match_updater.go b/flytectl/pkg/ext/attribute_match_updater.go index d06e22155e..44d00c394c 100644 --- a/flytectl/pkg/ext/attribute_match_updater.go +++ b/flytectl/pkg/ext/attribute_match_updater.go @@ -29,3 +29,14 @@ func (a *AdminUpdaterExtClient) UpdateProjectDomainAttributes(ctx context.Contex }) return err } + +func (a *AdminUpdaterExtClient) UpdateProjectAttributes(ctx context.Context, project string, matchingAttr *admin.MatchingAttributes) error { + _, err := a.AdminServiceClient().UpdateProjectAttributes(ctx, + &admin.ProjectAttributesUpdateRequest{ + Attributes: &admin.ProjectAttributes{ + Project: project, + MatchingAttributes: matchingAttr, + }, + }) + return err +} diff --git a/flytectl/pkg/ext/attribute_match_updater_test.go b/flytectl/pkg/ext/attribute_match_updater_test.go index f57d86a369..0c331c9ef5 100644 --- a/flytectl/pkg/ext/attribute_match_updater_test.go +++ b/flytectl/pkg/ext/attribute_match_updater_test.go @@ -53,3 +53,20 @@ func TestUpdateProjectDomainAttributesError(t *testing.T) { err := adminUpdaterExt.UpdateProjectDomainAttributes(ctx, "dummyProject", "domainValue", nil) assert.Equal(t, fmt.Errorf("failed"), err) } + +func TestUpdateProjectAttributes(t *testing.T) { + updateAttributeMatchFetcherSetup() + matchingAttr := &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{}, + } + adminClient.OnUpdateProjectAttributesMatch(mock.Anything, mock.Anything).Return(nil, nil) + err := adminUpdaterExt.UpdateProjectAttributes(ctx, "dummyProject", matchingAttr) + assert.Nil(t, err) +} + +func TestUpdateProjectAttributesError(t *testing.T) { + updateAttributeMatchFetcherSetup() + adminClient.OnUpdateProjectAttributesMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed")) + err := adminUpdaterExt.UpdateProjectAttributes(ctx, "dummyProject", nil) + assert.Equal(t, fmt.Errorf("failed"), err) +} diff --git a/flytectl/pkg/ext/attribute_matcher_deleter.go b/flytectl/pkg/ext/attribute_matcher_deleter.go index b7fdaec9b2..ef8a5730fb 100644 --- a/flytectl/pkg/ext/attribute_matcher_deleter.go +++ b/flytectl/pkg/ext/attribute_matcher_deleter.go @@ -24,3 +24,11 @@ func (a *AdminDeleterExtClient) DeleteProjectDomainAttributes(ctx context.Contex }) return err } + +func (a *AdminDeleterExtClient) DeleteProjectAttributes(ctx context.Context, project string, rsType admin.MatchableResource) error { + _, err := a.AdminServiceClient().DeleteProjectAttributes(ctx, &admin.ProjectAttributesDeleteRequest{ + Project: project, + ResourceType: rsType, + }) + return err +} diff --git a/flytectl/pkg/ext/deleter.go b/flytectl/pkg/ext/deleter.go index 03827d1079..db5d97a748 100644 --- a/flytectl/pkg/ext/deleter.go +++ b/flytectl/pkg/ext/deleter.go @@ -18,6 +18,9 @@ type AdminDeleterExtInterface interface { // DeleteProjectDomainAttributes deletes project domain attributes for a particular matchable resource DeleteProjectDomainAttributes(ctx context.Context, project, domain string, rsType admin.MatchableResource) error + + // DeleteProjectAttributes deletes project attributes for a particular matchable resource + DeleteProjectAttributes(ctx context.Context, project string, rsType admin.MatchableResource) error } // AdminDeleterExtClient is used for interacting with extended features used for deleting/archiving data in admin service diff --git a/flytectl/pkg/ext/fetcher.go b/flytectl/pkg/ext/fetcher.go index 2c40e388f6..b706bf8a53 100644 --- a/flytectl/pkg/ext/fetcher.go +++ b/flytectl/pkg/ext/fetcher.go @@ -67,6 +67,9 @@ type AdminFetcherExtInterface interface { // FetchProjectDomainAttributes fetches project domain attributes particular resource type in a project, domain FetchProjectDomainAttributes(ctx context.Context, project, domain string, rsType admin.MatchableResource) (*admin.ProjectDomainAttributesGetResponse, error) + // FetchProjectAttributes fetches project attributes particular resource type in a project + FetchProjectAttributes(ctx context.Context, project string, rsType admin.MatchableResource) (*admin.ProjectAttributesGetResponse, error) + // ListProjects fetches all projects ListProjects(ctx context.Context, filter filters.Filters) (*admin.Projects, error) } diff --git a/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go b/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go index 1456f4e3bf..414cd17f54 100644 --- a/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go @@ -51,6 +51,38 @@ func (_m *AdminDeleterExtInterface) AdminServiceClient() service.AdminServiceCli return r0 } +type AdminDeleterExtInterface_DeleteProjectAttributes struct { + *mock.Call +} + +func (_m AdminDeleterExtInterface_DeleteProjectAttributes) Return(_a0 error) *AdminDeleterExtInterface_DeleteProjectAttributes { + return &AdminDeleterExtInterface_DeleteProjectAttributes{Call: _m.Call.Return(_a0)} +} + +func (_m *AdminDeleterExtInterface) OnDeleteProjectAttributes(ctx context.Context, project string, rsType admin.MatchableResource) *AdminDeleterExtInterface_DeleteProjectAttributes { + c_call := _m.On("DeleteProjectAttributes", ctx, project, rsType) + return &AdminDeleterExtInterface_DeleteProjectAttributes{Call: c_call} +} + +func (_m *AdminDeleterExtInterface) OnDeleteProjectAttributesMatch(matchers ...interface{}) *AdminDeleterExtInterface_DeleteProjectAttributes { + c_call := _m.On("DeleteProjectAttributes", matchers...) + return &AdminDeleterExtInterface_DeleteProjectAttributes{Call: c_call} +} + +// DeleteProjectAttributes provides a mock function with given fields: ctx, project, rsType +func (_m *AdminDeleterExtInterface) DeleteProjectAttributes(ctx context.Context, project string, rsType admin.MatchableResource) error { + ret := _m.Called(ctx, project, rsType) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, admin.MatchableResource) error); ok { + r0 = rf(ctx, project, rsType) + } else { + r0 = ret.Error(0) + } + + return r0 +} + type AdminDeleterExtInterface_DeleteProjectDomainAttributes struct { *mock.Call } diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index b1032f05b2..3162a6b278 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -422,6 +422,47 @@ func (_m *AdminFetcherExtInterface) FetchNodeExecutionDetails(ctx context.Contex return r0, r1 } +type AdminFetcherExtInterface_FetchProjectAttributes struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_FetchProjectAttributes) Return(_a0 *admin.ProjectAttributesGetResponse, _a1 error) *AdminFetcherExtInterface_FetchProjectAttributes { + return &AdminFetcherExtInterface_FetchProjectAttributes{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnFetchProjectAttributes(ctx context.Context, project string, rsType admin.MatchableResource) *AdminFetcherExtInterface_FetchProjectAttributes { + c_call := _m.On("FetchProjectAttributes", ctx, project, rsType) + return &AdminFetcherExtInterface_FetchProjectAttributes{Call: c_call} +} + +func (_m *AdminFetcherExtInterface) OnFetchProjectAttributesMatch(matchers ...interface{}) *AdminFetcherExtInterface_FetchProjectAttributes { + c_call := _m.On("FetchProjectAttributes", matchers...) + return &AdminFetcherExtInterface_FetchProjectAttributes{Call: c_call} +} + +// FetchProjectAttributes provides a mock function with given fields: ctx, project, rsType +func (_m *AdminFetcherExtInterface) FetchProjectAttributes(ctx context.Context, project string, rsType admin.MatchableResource) (*admin.ProjectAttributesGetResponse, error) { + ret := _m.Called(ctx, project, rsType) + + var r0 *admin.ProjectAttributesGetResponse + if rf, ok := ret.Get(0).(func(context.Context, string, admin.MatchableResource) *admin.ProjectAttributesGetResponse); ok { + r0 = rf(ctx, project, rsType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.ProjectAttributesGetResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, admin.MatchableResource) error); ok { + r1 = rf(ctx, project, rsType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type AdminFetcherExtInterface_FetchProjectDomainAttributes struct { *mock.Call } diff --git a/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go b/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go index 93f8370556..a59d8ca748 100644 --- a/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go @@ -51,6 +51,38 @@ func (_m *AdminUpdaterExtInterface) AdminServiceClient() service.AdminServiceCli return r0 } +type AdminUpdaterExtInterface_UpdateProjectAttributes struct { + *mock.Call +} + +func (_m AdminUpdaterExtInterface_UpdateProjectAttributes) Return(_a0 error) *AdminUpdaterExtInterface_UpdateProjectAttributes { + return &AdminUpdaterExtInterface_UpdateProjectAttributes{Call: _m.Call.Return(_a0)} +} + +func (_m *AdminUpdaterExtInterface) OnUpdateProjectAttributes(ctx context.Context, project string, matchingAttr *admin.MatchingAttributes) *AdminUpdaterExtInterface_UpdateProjectAttributes { + c_call := _m.On("UpdateProjectAttributes", ctx, project, matchingAttr) + return &AdminUpdaterExtInterface_UpdateProjectAttributes{Call: c_call} +} + +func (_m *AdminUpdaterExtInterface) OnUpdateProjectAttributesMatch(matchers ...interface{}) *AdminUpdaterExtInterface_UpdateProjectAttributes { + c_call := _m.On("UpdateProjectAttributes", matchers...) + return &AdminUpdaterExtInterface_UpdateProjectAttributes{Call: c_call} +} + +// UpdateProjectAttributes provides a mock function with given fields: ctx, project, matchingAttr +func (_m *AdminUpdaterExtInterface) UpdateProjectAttributes(ctx context.Context, project string, matchingAttr *admin.MatchingAttributes) error { + ret := _m.Called(ctx, project, matchingAttr) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, *admin.MatchingAttributes) error); ok { + r0 = rf(ctx, project, matchingAttr) + } else { + r0 = ret.Error(0) + } + + return r0 +} + type AdminUpdaterExtInterface_UpdateProjectDomainAttributes struct { *mock.Call } diff --git a/flytectl/pkg/ext/updater.go b/flytectl/pkg/ext/updater.go index ddf9f5841e..a87afd4ca0 100644 --- a/flytectl/pkg/ext/updater.go +++ b/flytectl/pkg/ext/updater.go @@ -18,6 +18,9 @@ type AdminUpdaterExtInterface interface { // UpdateProjectDomainAttributes updates project domain attributes for a particular matchable resource UpdateProjectDomainAttributes(ctx context.Context, project, domain string, matchingAttr *admin.MatchingAttributes) error + + // UpdateProjectAttributes updates project attributes for a particular matchable resource + UpdateProjectAttributes(ctx context.Context, project string, matchingAttr *admin.MatchingAttributes) error } // AdminUpdaterExtClient is used for interacting with extended features used for updating data in admin service From d330473e2f4b26055dcd9d86b1ef9727dafbbeb6 Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Fri, 11 Nov 2022 00:01:32 +0800 Subject: [PATCH 290/645] Add extra host to start command (#369) * Add extra host to start command Signed-off-by: Kevin Su * Fix tests Signed-off-by: Kevin Su * Fix tests Signed-off-by: Kevin Su * Make generate Signed-off-by: Kevin Su * update Signed-off-by: Kevin Su Signed-off-by: Kevin Su --- flytectl/pkg/docker/docker_util.go | 2 ++ flytectl/pkg/docker/docker_util_test.go | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index a3ae226bc8..bca12b1953 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -47,6 +47,7 @@ var ( } StdWriterPrefixLen = 8 StartingBufLen = 32*1024 + StdWriterPrefixLen + 1 + ExtraHosts = []string{"host.docker.internal:127.0.0.1"} ) // GetDockerClient will returns the docker client @@ -237,6 +238,7 @@ func StartContainer(ctx context.Context, cli Docker, volumes []mount.Mount, expo Mounts: volumes, PortBindings: portBindings, Privileged: true, + ExtraHosts: ExtraHosts, // add it because linux machine doesn't have this host name by default }, nil, nil, name) diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 7b33be9425..de1d6b09d2 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -156,6 +156,7 @@ func TestStartContainer(t *testing.T) { Mounts: Volumes, PortBindings: p2, Privileged: true, + ExtraHosts: ExtraHosts, }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ ID: "Hello", }, nil) @@ -185,6 +186,7 @@ func TestStartContainer(t *testing.T) { Mounts: Volumes, PortBindings: p2, Privileged: true, + ExtraHosts: ExtraHosts, }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ ID: "Hello", }, nil) @@ -211,6 +213,7 @@ func TestStartContainer(t *testing.T) { Mounts: Volumes, PortBindings: p2, Privileged: true, + ExtraHosts: ExtraHosts, }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ ID: "", }, fmt.Errorf("error")) @@ -236,6 +239,7 @@ func TestStartContainer(t *testing.T) { Mounts: Volumes, PortBindings: p2, Privileged: true, + ExtraHosts: ExtraHosts, }, nil, nil, mock.Anything).Return(container.ContainerCreateCreatedBody{ ID: "Hello", }, nil) From ebe66f25450addb1dc427e407634f279d046bbfe Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Wed, 16 Nov 2022 10:12:05 -0800 Subject: [PATCH 291/645] New Demo image (#370) # TL;DR This will let flytectl demo use the new bundled sandbox image instead. See the issue for additional information. `flytectl demo start` * Brings up the new container * kubeconfig will now be published to `~/.flyte/state/kubeconfig` (but the context will still be copied to the user's main kubeconfig with "flyte-sandbox" as the context name). `flytectl demo reload` Kills the Flyte pod, allowing the new one to come up. Signed-off-by: Yee Hing Tong --- .../config/subcommand/sandbox/config_flags.go | 2 +- .../subcommand/sandbox/config_flags_test.go | 2 +- .../subcommand/sandbox/sandbox_config.go | 2 +- flytectl/cmd/demo/demo.go | 8 + flytectl/cmd/demo/demo_test.go | 24 +-- flytectl/cmd/demo/reload.go | 58 +++++++ flytectl/cmd/demo/reload_test.go | 51 ++++++ flytectl/cmd/demo/start.go | 13 +- flytectl/cmd/register/files.go | 2 +- flytectl/go.mod | 2 +- flytectl/pkg/docker/docker.go | 2 + flytectl/pkg/docker/docker_util.go | 59 +++++-- flytectl/pkg/docker/docker_util_test.go | 79 ++++++++++ flytectl/pkg/docker/mocks/docker.go | 87 +++++++++++ .../pkg/filesystemutils/file_system_utils.go | 48 ++++++ .../filesystemutils/file_system_utils_test.go | 112 ++++++++++++++ .../flile_system_utils_test.go | 42 ----- flytectl/pkg/k8s/k8s.go | 2 +- flytectl/pkg/sandbox/start.go | 146 +++++++++++++++--- flytectl/pkg/sandbox/start_test.go | 20 +-- flytectl/pkg/util/util.go | 55 ++++++- flytectl/pkg/util/util_test.go | 18 ++- 22 files changed, 726 insertions(+), 108 deletions(-) create mode 100644 flytectl/cmd/demo/reload.go create mode 100644 flytectl/cmd/demo/reload_test.go create mode 100644 flytectl/pkg/filesystemutils/file_system_utils_test.go delete mode 100644 flytectl/pkg/filesystemutils/flile_system_utils_test.go diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index e9fbd5a60e..7b025f541d 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -50,7 +50,7 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.StringVar(&DefaultConfig.Source, fmt.Sprintf("%v%v", prefix, "source"), DefaultConfig.Source, "Path of your source code") + cmdFlags.StringVar(&DefaultConfig.DeprecatedSource, fmt.Sprintf("%v%v", prefix, "source"), DefaultConfig.DeprecatedSource, "deprecated, path of your source code, please build images with local daemon") cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "Version of flyte. Only supports flyte releases greater than v0.10.0") cmdFlags.StringVar(&DefaultConfig.Image, fmt.Sprintf("%v%v", prefix, "image"), DefaultConfig.Image, "Optional. Provide a fully qualified path to a Flyte compliant docker image.") cmdFlags.BoolVar(&DefaultConfig.Prerelease, fmt.Sprintf("%v%v", prefix, "pre"), DefaultConfig.Prerelease, "Optional. Pre release Version of flyte will be used for sandbox.") diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index 0d7021b76d..79f6e88f49 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -106,7 +106,7 @@ func TestConfig_SetFlags(t *testing.T) { cmdFlags.Set("source", testValue) if vString, err := cmdFlags.GetString("source"); err == nil { - testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.Source) + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.DeprecatedSource) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index 463f751ecc..1dfce6430f 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -4,7 +4,7 @@ import "github.com/flyteorg/flytectl/pkg/docker" // Config holds configuration flags for sandbox command. type Config struct { - Source string `json:"source" pflag:",Path of your source code"` + DeprecatedSource string `json:"source" pflag:",deprecated, path of your source code, please build images with local daemon"` // Flytectl sandbox only supports Flyte version available in Github release https://github.com/flyteorg/flyte/tags. // Flytectl sandbox will only work for v0.10.0+. diff --git a/flytectl/cmd/demo/demo.go b/flytectl/cmd/demo/demo.go index 35149b6823..23052175bb 100644 --- a/flytectl/cmd/demo/demo.go +++ b/flytectl/cmd/demo/demo.go @@ -6,6 +6,11 @@ import ( "github.com/spf13/cobra" ) +const ( + flyteNs = "flyte" + K8sEndpoint = "https://127.0.0.1:6443" +) + // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( demoShort = `Helps with demo interactions like start, teardown, status, and exec.` @@ -47,6 +52,9 @@ func CreateDemoCommand() *cobra.Command { "start": {CmdFunc: startDemoCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: startShort, Long: startLong, PFlagProvider: sandboxCmdConfig.DefaultConfig, DisableFlyteClient: true}, + "reload": {CmdFunc: reloadDemoCluster, Aliases: []string{}, ProjectDomainNotRequired: true, + Short: reloadShort, + Long: reloadLong, PFlagProvider: sandboxCmdConfig.DefaultConfig, DisableFlyteClient: true}, "teardown": {CmdFunc: teardownDemoCluster, Aliases: []string{}, ProjectDomainNotRequired: true, Short: teardownShort, Long: teardownLong, DisableFlyteClient: true}, diff --git a/flytectl/cmd/demo/demo_test.go b/flytectl/cmd/demo/demo_test.go index 0ce332867a..fdc2c09b56 100644 --- a/flytectl/cmd/demo/demo_test.go +++ b/flytectl/cmd/demo/demo_test.go @@ -13,7 +13,8 @@ func TestCreateDemoCommand(t *testing.T) { assert.Equal(t, demoCommand.Use, "demo") assert.Equal(t, demoCommand.Short, "Helps with demo interactions like start, teardown, status, and exec.") fmt.Println(demoCommand.Commands()) - assert.Equal(t, len(demoCommand.Commands()), 4) + + assert.Equal(t, len(demoCommand.Commands()), 5) cmdNouns := demoCommand.Commands() // Sort by Use value. sort.Slice(cmdNouns, func(i, j int) bool { @@ -24,16 +25,19 @@ func TestCreateDemoCommand(t *testing.T) { assert.Equal(t, cmdNouns[0].Short, execShort) assert.Equal(t, cmdNouns[0].Long, execLong) - assert.Equal(t, cmdNouns[1].Use, "start") - assert.Equal(t, cmdNouns[1].Short, startShort) - assert.Equal(t, cmdNouns[1].Long, startLong) + assert.Equal(t, cmdNouns[1].Use, "reload") + assert.Equal(t, cmdNouns[1].Short, reloadShort) + assert.Equal(t, cmdNouns[1].Long, reloadLong) - assert.Equal(t, cmdNouns[2].Use, "status") - assert.Equal(t, cmdNouns[2].Short, statusShort) - assert.Equal(t, cmdNouns[2].Long, statusLong) + assert.Equal(t, cmdNouns[2].Use, "start") + assert.Equal(t, cmdNouns[2].Short, startShort) + assert.Equal(t, cmdNouns[2].Long, startLong) - assert.Equal(t, cmdNouns[3].Use, "teardown") - assert.Equal(t, cmdNouns[3].Short, teardownShort) - assert.Equal(t, cmdNouns[3].Long, teardownLong) + assert.Equal(t, cmdNouns[3].Use, "status") + assert.Equal(t, cmdNouns[3].Short, statusShort) + assert.Equal(t, cmdNouns[3].Long, statusLong) + assert.Equal(t, cmdNouns[4].Use, "teardown") + assert.Equal(t, cmdNouns[4].Short, teardownShort) + assert.Equal(t, cmdNouns[4].Long, teardownLong) } diff --git a/flytectl/cmd/demo/reload.go b/flytectl/cmd/demo/reload.go new file mode 100644 index 0000000000..f7441cf7c6 --- /dev/null +++ b/flytectl/cmd/demo/reload.go @@ -0,0 +1,58 @@ +package demo + +import ( + "context" + "fmt" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/k8s" + "github.com/flyteorg/flytestdlib/logger" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +const ( + labelSelector = "app=flyte" +) +const ( + reloadShort = "Power cycle the Flyte executable pod, effectively picking up an updated config." + reloadLong = ` +If you've changed the ~/.flyte/state/flyte.yaml file, run this command to restart the Flyte binary pod, effectively +picking up the new settings: + +Usage +:: + + flytectl demo reload + +` +) + +// reloadDemoCluster will kill the flyte binary pod so the new one can pick up a new config file +func reloadDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + k8sClient, err := k8s.GetK8sClient(docker.Kubeconfig, K8sEndpoint) + if err != nil { + fmt.Println("Could not get K8s client") + return err + } + pi := k8sClient.CoreV1().Pods(flyteNs) + podList, err := pi.List(ctx, v1.ListOptions{LabelSelector: labelSelector}) + if err != nil { + fmt.Println("could not list pods") + return err + } + if len(podList.Items) != 1 { + return fmt.Errorf("should only have one pod running, %d found, %v", len(podList.Items), podList.Items) + } + logger.Debugf(ctx, "Found %d pods\n", len(podList.Items)) + var grace = int64(0) + err = pi.Delete(ctx, podList.Items[0].Name, v1.DeleteOptions{ + GracePeriodSeconds: &grace, + }) + if err != nil { + fmt.Printf("Could not delete Flyte pod, old configuration may still be in effect. Err: %s\n", err) + return err + } + + return nil +} diff --git a/flytectl/cmd/demo/reload_test.go b/flytectl/cmd/demo/reload_test.go new file mode 100644 index 0000000000..35ceea040a --- /dev/null +++ b/flytectl/cmd/demo/reload_test.go @@ -0,0 +1,51 @@ +package demo + +import ( + "context" + "testing" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/k8s" + "github.com/stretchr/testify/assert" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + testclient "k8s.io/client-go/kubernetes/fake" +) + +var fakePod = corev1.Pod{ + Status: corev1.PodStatus{ + Phase: corev1.PodRunning, + Conditions: []corev1.PodCondition{}, + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "dummyflytepod", + Labels: map[string]string{"app": "flyte"}, + }, +} + +func TestDemoReload(t *testing.T) { + ctx := context.Background() + commandCtx := cmdCore.CommandContext{} + + t.Run("No errors", func(t *testing.T) { + client := testclient.NewSimpleClientset() + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + assert.NoError(t, err) + k8s.Client = client + err = reloadDemoCluster(ctx, []string{}, commandCtx) + assert.NoError(t, err) + }) + + t.Run("Multiple pods will error", func(t *testing.T) { + client := testclient.NewSimpleClientset() + _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + assert.NoError(t, err) + fakePod.SetName("othername") + _, err = client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) + assert.NoError(t, err) + k8s.Client = client + err = reloadDemoCluster(ctx, []string{}, commandCtx) + assert.Errorf(t, err, "should only have one pod") + }) +} diff --git a/flytectl/cmd/demo/start.go b/flytectl/cmd/demo/start.go index a800ed1795..c542d615ae 100644 --- a/flytectl/cmd/demo/start.go +++ b/flytectl/cmd/demo/start.go @@ -3,6 +3,8 @@ package demo import ( "context" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/sandbox" sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" @@ -75,18 +77,21 @@ eg : for passing multiple environment variables flytectl demo start --env USER=foo --env PASSWORD=bar -For just printing the docker commands for bringingup the demo container +For just printing the docker commands for bringing up the demo container :: flytectl demo start --dryRun - Usage ` ) func startDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - sandboxDefaultConfig := sandboxCmdConfig.DefaultConfig - return sandbox.StartDemoCluster(ctx, args, sandboxDefaultConfig) + cfg := sandboxCmdConfig.DefaultConfig + err := cfg.ImagePullPolicy.Set(docker.ImagePullPolicyIfNotPresent.String()) + if err != nil { + return err + } + return sandbox.StartDemoCluster(ctx, args, cfg) } diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index f87f353efc..e866743183 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -151,7 +151,7 @@ func Register(ctx context.Context, args []string, cfg *config.Config, cmdCtx cmd return fmt.Errorf("failed to upload source code from [%v]. Error: %w", sourceCodePath, err) } - logger.Infof(ctx, "Source code successfully uploaded to [%v]", uploadLocation) + logger.Infof(ctx, "DeprecatedSource code successfully uploaded to [%v]", uploadLocation) } var registerResults []Result diff --git a/flytectl/go.mod b/flytectl/go.mod index cc7402ff3f..b1f6e1bcba 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -3,7 +3,6 @@ module github.com/flyteorg/flytectl go 1.18 require ( - github.com/avast/retry-go v3.0.0+incompatible github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/disiqueira/gotree v1.0.0 github.com/docker/docker v20.10.7+incompatible @@ -44,6 +43,7 @@ require ( ) require ( + github.com/avast/retry-go v3.0.0+incompatible github.com/flyteorg/flytepropeller v1.1.1 golang.org/x/text v0.3.7 ) diff --git a/flytectl/pkg/docker/docker.go b/flytectl/pkg/docker/docker.go index 84f9fb3365..46ea3ea141 100644 --- a/flytectl/pkg/docker/docker.go +++ b/flytectl/pkg/docker/docker.go @@ -25,6 +25,8 @@ type Docker interface { ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) ImageList(ctx context.Context, listOption types.ImageListOptions) ([]types.ImageSummary, error) + ContainerStatPath(ctx context.Context, containerID, path string) (types.ContainerPathStat, error) + CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) } type FlyteDocker struct { diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index bca12b1953..da7ce9bcab 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -24,11 +24,14 @@ import ( ) var ( - Kubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") + FlyteStateDir = f.FilePathJoin(f.UserHomeDir(), ".flyte", "state") + Kubeconfig = f.FilePathJoin(FlyteStateDir, "kubeconfig") + SandboxKubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") SuccessMessage = "Deploying Flyte..." FlyteSandboxClusterName = "flyte-sandbox" Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} Source = "/root" + StateDirMountDest = "/srv/flyte" K3sDir = "/etc/rancher/" Client Docker Volumes = []mount.Mount{ @@ -126,20 +129,18 @@ func GetSandboxPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, e // GetDemoPorts will return demo ports func GetDemoPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, error) { return nat.ParsePortSpecs([]string{ - "0.0.0.0:30080:30080", // Flyteconsole Port - "0.0.0.0:30081:30081", // Flyteadmin Port - "0.0.0.0:30082:30082", // K8s Dashboard Port - "0.0.0.0:30084:30084", // Minio API Port - "0.0.0.0:30086:30086", // K8s cluster - "0.0.0.0:30088:30088", // Minio Console Port - "0.0.0.0:30089:30089", // Postgres Port - "0.0.0.0:30090:30090", // Webhook service + "0.0.0.0:6443:6443", // K3s API Port + "0.0.0.0:30080:30080", // HTTP Port + "0.0.0.0:30000:30000", // Registry Port + "0.0.0.0:30001:30001", // Postgres Port + "0.0.0.0:30002:30002", // Minio API Port (use HTTP port for minio console) }) } // PullDockerImage will Pull docker image func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy ImagePullPolicy, imagePullOptions ImagePullOptions, dryRun bool) error { + if dryRun { PrintPullImage(image, imagePullOptions) return nil @@ -222,6 +223,7 @@ func PrintCreateContainer(volumes []mount.Mount, portBindings map[nat.Port][]nat // StartContainer will create and start docker container func StartContainer(ctx context.Context, cli Docker, volumes []mount.Mount, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, name, image string, additionalEnvVars []string, dryRun bool) (string, error) { + // Append the additional env variables to the default list of env Environment = append(Environment, additionalEnvVars...) if dryRun { @@ -252,6 +254,45 @@ func StartContainer(ctx context.Context, cli Docker, volumes []mount.Mount, expo return resp.ID, nil } +// CopyContainerFile try to create the container, see if the source file is there, copy it to the destination +func CopyContainerFile(ctx context.Context, cli Docker, source, destination, name, image string) error { + resp, err := cli.ContainerCreate(ctx, &container.Config{Image: image}, &container.HostConfig{}, nil, nil, name) + if err != nil { + return err + } + var removeErr error + defer func() { + removeErr = cli.ContainerRemove(context.Background(), resp.ID, types.ContainerRemoveOptions{ + Force: true, + }) + }() + _, err = cli.ContainerStatPath(ctx, resp.ID, source) + if err != nil { + return err + } + reader, _, err := cli.CopyFromContainer(ctx, resp.ID, source) + if err != nil { + return err + } + tarFile := destination + ".tar" + outFile, err := os.Create(tarFile) + if err != nil { + return err + } + defer outFile.Close() + defer reader.Close() + _, err = io.Copy(outFile, reader) + if err != nil { + return err + } + r, _ := os.Open(tarFile) + err = f.ExtractTar(r, destination) + if err != nil { + return err + } + return removeErr +} + // ReadLogs will return io scanner for reading the logs of a container func ReadLogs(ctx context.Context, cli Docker, id string) (*bufio.Scanner, error) { reader, err := cli.ContainerLogs(ctx, id, types.ContainerLogsOptions{ diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index de1d6b09d2..79e7dae72e 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -1,17 +1,21 @@ package docker import ( + "archive/tar" "bufio" "context" "fmt" "os" + "path/filepath" "strings" "testing" + "time" f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/docker/docker/api/types/container" "github.com/flyteorg/flytectl/pkg/docker/mocks" + "github.com/stretchr/testify/mock" "github.com/docker/docker/api/types" @@ -370,3 +374,78 @@ func TestInspectExecResp(t *testing.T) { }) } + +func TestDemoPorts(t *testing.T) { + _, ports, _ := GetDemoPorts() + assert.Equal(t, 5, len(ports)) +} + +func TestCopyFile(t *testing.T) { + ctx := context.Background() + // Create a fake tar file in tmp. + fo, err := os.CreateTemp("", "sampledata") + assert.NoError(t, err) + tarWriter := tar.NewWriter(fo) + err = tarWriter.WriteHeader(&tar.Header{ + Typeflag: tar.TypeReg, + Name: "flyte.yaml", + Size: 4, + Mode: 0640, + ModTime: time.Unix(1245206587, 0), + }) + assert.NoError(t, err) + cnt, err := tarWriter.Write([]byte("a: b")) + assert.NoError(t, err) + assert.Equal(t, 4, cnt) + tarWriter.Close() + fo.Close() + + image := "some:image" + containerName := "my-container" + + t.Run("No errors", func(t *testing.T) { + // Create reader of the tar file + reader, err := os.Open(fo.Name()) + assert.NoError(t, err) + // Create destination file name + destDir, err := os.MkdirTemp("", "dest") + assert.NoError(t, err) + destination := filepath.Join(destDir, "destfile") + + // Mocks + mockDocker := &mocks.Docker{} + mockDocker.OnContainerCreate( + ctx, &container.Config{Image: image}, &container.HostConfig{}, nil, nil, containerName).Return( + container.ContainerCreateCreatedBody{ID: containerName}, nil) + mockDocker.OnContainerStatPath(ctx, containerName, "some source").Return(types.ContainerPathStat{}, nil) + mockDocker.OnCopyFromContainer(ctx, containerName, "some source").Return(reader, types.ContainerPathStat{}, nil) + mockDocker.OnContainerRemove(ctx, containerName, types.ContainerRemoveOptions{Force: true}).Return(nil) + assert.Nil(t, err) + + // Run + err = CopyContainerFile(ctx, mockDocker, "some source", destination, containerName, image) + assert.NoError(t, err) + + // Read the file and make sure it's correct + strBytes, err := os.ReadFile(destination) + assert.NoError(t, err) + assert.Equal(t, "a: b", string(strBytes)) + }) + + t.Run("Erroring on stat", func(t *testing.T) { + myErr := fmt.Errorf("erroring on stat") + + // Mocks + mockDocker := &mocks.Docker{} + mockDocker.OnContainerCreate( + ctx, &container.Config{Image: image}, &container.HostConfig{}, nil, nil, containerName).Return( + container.ContainerCreateCreatedBody{ID: containerName}, nil) + mockDocker.OnContainerStatPath(ctx, containerName, "some source").Return(types.ContainerPathStat{}, myErr) + mockDocker.OnContainerRemove(ctx, containerName, types.ContainerRemoveOptions{Force: true}).Return(nil) + assert.Nil(t, err) + + // Run + err = CopyContainerFile(ctx, mockDocker, "some source", "", containerName, image) + assert.Equal(t, myErr, err) + }) +} diff --git a/flytectl/pkg/docker/mocks/docker.go b/flytectl/pkg/docker/mocks/docker.go index b1f234f97f..a2ddc27cb7 100644 --- a/flytectl/pkg/docker/mocks/docker.go +++ b/flytectl/pkg/docker/mocks/docker.go @@ -325,6 +325,45 @@ func (_m *Docker) ContainerStart(ctx context.Context, containerID string, option return r0 } +type Docker_ContainerStatPath struct { + *mock.Call +} + +func (_m Docker_ContainerStatPath) Return(_a0 types.ContainerPathStat, _a1 error) *Docker_ContainerStatPath { + return &Docker_ContainerStatPath{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnContainerStatPath(ctx context.Context, containerID string, path string) *Docker_ContainerStatPath { + c_call := _m.On("ContainerStatPath", ctx, containerID, path) + return &Docker_ContainerStatPath{Call: c_call} +} + +func (_m *Docker) OnContainerStatPathMatch(matchers ...interface{}) *Docker_ContainerStatPath { + c_call := _m.On("ContainerStatPath", matchers...) + return &Docker_ContainerStatPath{Call: c_call} +} + +// ContainerStatPath provides a mock function with given fields: ctx, containerID, path +func (_m *Docker) ContainerStatPath(ctx context.Context, containerID string, path string) (types.ContainerPathStat, error) { + ret := _m.Called(ctx, containerID, path) + + var r0 types.ContainerPathStat + if rf, ok := ret.Get(0).(func(context.Context, string, string) types.ContainerPathStat); ok { + r0 = rf(ctx, containerID, path) + } else { + r0 = ret.Get(0).(types.ContainerPathStat) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { + r1 = rf(ctx, containerID, path) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type Docker_ContainerWait struct { *mock.Call } @@ -368,6 +407,54 @@ func (_m *Docker) ContainerWait(ctx context.Context, containerID string, conditi return r0, r1 } +type Docker_CopyFromContainer struct { + *mock.Call +} + +func (_m Docker_CopyFromContainer) Return(_a0 io.ReadCloser, _a1 types.ContainerPathStat, _a2 error) *Docker_CopyFromContainer { + return &Docker_CopyFromContainer{Call: _m.Call.Return(_a0, _a1, _a2)} +} + +func (_m *Docker) OnCopyFromContainer(ctx context.Context, containerID string, srcPath string) *Docker_CopyFromContainer { + c_call := _m.On("CopyFromContainer", ctx, containerID, srcPath) + return &Docker_CopyFromContainer{Call: c_call} +} + +func (_m *Docker) OnCopyFromContainerMatch(matchers ...interface{}) *Docker_CopyFromContainer { + c_call := _m.On("CopyFromContainer", matchers...) + return &Docker_CopyFromContainer{Call: c_call} +} + +// CopyFromContainer provides a mock function with given fields: ctx, containerID, srcPath +func (_m *Docker) CopyFromContainer(ctx context.Context, containerID string, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) { + ret := _m.Called(ctx, containerID, srcPath) + + var r0 io.ReadCloser + if rf, ok := ret.Get(0).(func(context.Context, string, string) io.ReadCloser); ok { + r0 = rf(ctx, containerID, srcPath) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.ReadCloser) + } + } + + var r1 types.ContainerPathStat + if rf, ok := ret.Get(1).(func(context.Context, string, string) types.ContainerPathStat); ok { + r1 = rf(ctx, containerID, srcPath) + } else { + r1 = ret.Get(1).(types.ContainerPathStat) + } + + var r2 error + if rf, ok := ret.Get(2).(func(context.Context, string, string) error); ok { + r2 = rf(ctx, containerID, srcPath) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + type Docker_ImageList struct { *mock.Call } diff --git a/flytectl/pkg/filesystemutils/file_system_utils.go b/flytectl/pkg/filesystemutils/file_system_utils.go index 2f0b756c90..77ac4d8eb0 100644 --- a/flytectl/pkg/filesystemutils/file_system_utils.go +++ b/flytectl/pkg/filesystemutils/file_system_utils.go @@ -1,6 +1,9 @@ package filesystemutils import ( + "archive/tar" + "fmt" + "io" "os" "path/filepath" ) @@ -20,3 +23,48 @@ func UserHomeDir() string { func FilePathJoin(elems ...string) string { return filePathJoinFunc(elems...) } + +func ExtractTar(ss io.Reader, destination string) error { + tarReader := tar.NewReader(ss) + + for { + header, err := tarReader.Next() + + if err == io.EOF { + break + } + + if err != nil { + return err + } + + switch header.Typeflag { + case tar.TypeDir: + if err := os.Mkdir(header.Name, 0755); err != nil { + return err + } + case tar.TypeReg: + fmt.Printf("Creating Flyte configuration file at: %s\n", destination) + outFile, err := os.Create(destination) + if err != nil { + return err + } + for { + // Read one 1MB at a time. + if _, err := io.CopyN(outFile, tarReader, 1024*1024); err != nil { + if err == io.EOF { + break + } + return err + } + } + outFile.Close() + + default: + return fmt.Errorf("ExtractTarGz: unknown type: %v in %s", + header.Typeflag, + header.Name) + } + } + return nil +} diff --git a/flytectl/pkg/filesystemutils/file_system_utils_test.go b/flytectl/pkg/filesystemutils/file_system_utils_test.go new file mode 100644 index 0000000000..2bca38d827 --- /dev/null +++ b/flytectl/pkg/filesystemutils/file_system_utils_test.go @@ -0,0 +1,112 @@ +package filesystemutils + +import ( + "archive/tar" + "fmt" + "os" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +var ( + homeDirVal = "/home/user" + homeDirErr error +) + +func FakeUserHomeDir() (string, error) { + return homeDirVal, homeDirErr +} + +func TestUserHomeDir(t *testing.T) { + t.Run("User home dir", func(t *testing.T) { + osUserHomDirFunc = FakeUserHomeDir + homeDir := UserHomeDir() + assert.Equal(t, homeDirVal, homeDir) + }) + t.Run("User home dir fail", func(t *testing.T) { + homeDirErr = fmt.Errorf("failed to get users home directory") + homeDirVal = "." + osUserHomDirFunc = FakeUserHomeDir + homeDir := UserHomeDir() + assert.Equal(t, ".", homeDir) + // Reset + homeDirErr = nil + homeDirVal = "/home/user" + }) +} + +func TestFilePathJoin(t *testing.T) { + t.Run("File path join", func(t *testing.T) { + homeDir := FilePathJoin("/", "home", "user") + assert.Equal(t, "/home/user", homeDir) + }) +} + +func TestTaring(t *testing.T) { + // Create a fake tar file in tmp. + text := "a: b" + fo, err := os.CreateTemp("", "sampledata") + assert.NoError(t, err) + tarWriter := tar.NewWriter(fo) + err = tarWriter.WriteHeader(&tar.Header{ + Typeflag: tar.TypeReg, + Name: "flyte.yaml", + Size: 4, + Mode: 0640, + ModTime: time.Unix(1245206587, 0), + }) + assert.NoError(t, err) + cnt, err := tarWriter.Write([]byte(text)) + assert.NoError(t, err) + assert.Equal(t, 4, cnt) + tarWriter.Close() + fo.Close() + + t.Run("Basic testing", func(t *testing.T) { + destFile, err := os.CreateTemp("", "sampledata") + assert.NoError(t, err) + reader, err := os.Open(fo.Name()) + assert.NoError(t, err) + err = ExtractTar(reader, destFile.Name()) + assert.NoError(t, err) + fileBytes, err := os.ReadFile(destFile.Name()) + assert.NoError(t, err) + readString := string(fileBytes) + assert.Equal(t, text, readString) + + // Try to extract the file we just extracted again. It's not a tar file obviously so it should error + reader, err = os.Open(destFile.Name()) + assert.NoError(t, err) + err = ExtractTar(reader, destFile.Name()) + assert.Errorf(t, err, "unexpected EOF") + }) +} + +func TestTarBadHeader(t *testing.T) { + // Create a fake tar file in tmp. + fo, err := os.CreateTemp("", "sampledata") + assert.NoError(t, err) + tarWriter := tar.NewWriter(fo) + // Write a symlink, we should not know how to parse. + err = tarWriter.WriteHeader(&tar.Header{ + Typeflag: tar.TypeLink, + Name: "flyte.yaml", + Size: 4, + Mode: 0640, + ModTime: time.Unix(1245206587, 0), + }) + assert.NoError(t, err) + tarWriter.Close() + fo.Close() + + t.Run("Basic testing", func(t *testing.T) { + destFile, err := os.CreateTemp("", "sampledata") + assert.NoError(t, err) + reader, err := os.Open(fo.Name()) + assert.NoError(t, err) + err = ExtractTar(reader, destFile.Name()) + assert.Errorf(t, err, "ExtractTarGz: unknown type") + }) +} diff --git a/flytectl/pkg/filesystemutils/flile_system_utils_test.go b/flytectl/pkg/filesystemutils/flile_system_utils_test.go deleted file mode 100644 index 9698d1709d..0000000000 --- a/flytectl/pkg/filesystemutils/flile_system_utils_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package filesystemutils - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" -) - -var ( - homeDirVal = "/home/user" - homeDirErr error -) - -func FakeUserHomeDir() (string, error) { - return homeDirVal, homeDirErr -} - -func TestUserHomeDir(t *testing.T) { - t.Run("User home dir", func(t *testing.T) { - osUserHomDirFunc = FakeUserHomeDir - homeDir := UserHomeDir() - assert.Equal(t, homeDirVal, homeDir) - }) - t.Run("User home dir fail", func(t *testing.T) { - homeDirErr = fmt.Errorf("failed to get users home directory") - homeDirVal = "." - osUserHomDirFunc = FakeUserHomeDir - homeDir := UserHomeDir() - assert.Equal(t, ".", homeDir) - // Reset - homeDirErr = nil - homeDirVal = "/home/user" - }) -} - -func TestFilePathJoin(t *testing.T) { - t.Run("File path join", func(t *testing.T) { - homeDir := FilePathJoin("/", "home", "user") - assert.Equal(t, "/home/user", homeDir) - }) -} diff --git a/flytectl/pkg/k8s/k8s.go b/flytectl/pkg/k8s/k8s.go index 1a34a93bca..705c6887e6 100644 --- a/flytectl/pkg/k8s/k8s.go +++ b/flytectl/pkg/k8s/k8s.go @@ -63,7 +63,7 @@ func (k *ContextManager) CheckConfig() error { return err } -// CopyKubeContext copies context srcCtxName part of srcConfigAccess to targetCtxName part of targetConfigAccess. +// CopyContext copies context srcCtxName part of srcConfigAccess to targetCtxName part of targetConfigAccess. func (k *ContextManager) CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName, targetCtxName string) error { err := k.CheckConfig() if err != nil { diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index 3a53923ca1..f7ac5ed9e9 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -20,6 +20,7 @@ import ( "github.com/flyteorg/flytectl/pkg/github" "github.com/flyteorg/flytectl/pkg/k8s" "github.com/flyteorg/flytectl/pkg/util" + "github.com/flyteorg/flytestdlib/logger" "github.com/kataras/tablewriter" corev1api "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -33,9 +34,12 @@ const ( taintEffect = "NoSchedule" sandboxContextName = "flyte-sandbox" sandboxDockerContext = "default" - k8sEndpoint = "https://127.0.0.1:30086" + K8sEndpoint = "https://127.0.0.1:6443" + sandboxK8sEndpoint = "https://127.0.0.1:30086" sandboxImageName = "cr.flyte.org/flyteorg/flyte-sandbox" - demoImageName = "cr.flyte.org/flyteorg/flyte-sandbox-lite" + demoImageName = "cr.flyte.org/flyteorg/flyte-sandbox-bundled" + DefaultFlyteConfig = "/opt/flyte/defaults.flyte.yaml" + k3sKubeConfigEnvVar = "K3S_KUBECONFIG_OUTPUT=/srv/flyte/kubeconfig" ) func isNodeTainted(ctx context.Context, client corev1.CoreV1Interface) (bool, error) { @@ -140,9 +144,9 @@ func MountVolume(file, destination string) (*mount.Mount, error) { return nil, nil } -func UpdateLocalKubeContext(k8sCtxMgr k8s.ContextOps, dockerCtx string, contextName string) error { +func UpdateLocalKubeContext(k8sCtxMgr k8s.ContextOps, dockerCtx string, contextName string, kubeConfigPath string) error { srcConfigAccess := &clientcmd.PathOptions{ - GlobalFile: docker.Kubeconfig, + GlobalFile: kubeConfigPath, LoadingRules: clientcmd.NewDefaultClientConfigLoadingRules(), } return k8sCtxMgr.CopyContext(srcConfigAccess, dockerCtx, contextName) @@ -158,16 +162,13 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService return nil, err } fmt.Printf("Existing details of your sandbox") - util.PrintSandboxMessage(consolePort, sandboxConfig.DryRun) + util.PrintSandboxMessage(consolePort, docker.Kubeconfig, sandboxConfig.DryRun) return nil, nil } } - if err := util.SetupFlyteDir(); err != nil { - return nil, err - } templateValues := configutil.ConfigTemplateSpec{ - Host: "localhost:30081", + Host: "localhost:30080", Insecure: true, Console: fmt.Sprintf("http://localhost:%d", consolePort), } @@ -176,11 +177,25 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService } volumes := docker.Volumes - if vol, err := MountVolume(sandboxConfig.Source, docker.Source); err != nil { + // Mount this even though it should no longer be necessary. This is for user code + if vol, err := MountVolume(sandboxConfig.DeprecatedSource, docker.Source); err != nil { return nil, err } else if vol != nil { volumes = append(volumes, *vol) } + + // This is the state directory mount, flyte will write the kubeconfig here. May hold more in future releases + // To be interoperable with the old sandbox, only mount if the directory exists, should've created by StartCluster + if fileInfo, err := os.Stat(docker.FlyteStateDir); err == nil { + if fileInfo.IsDir() { + if vol, err := MountVolume(docker.FlyteStateDir, docker.StateDirMountDest); err != nil { + return nil, err + } else if vol != nil { + volumes = append(volumes, *vol) + } + } + } + sandboxImage := sandboxConfig.Image if len(sandboxImage) == 0 { image, version, err := github.GetFullyQualifiedImageName(defaultImagePrefix, sandboxConfig.Version, defaultImageName, sandboxConfig.Prerelease, g) @@ -253,6 +268,101 @@ func StartCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdC } ghRepo := github.GetGHRepoService() + if err := util.CreatePathAndFile(docker.Kubeconfig); err != nil { + return err + } + + reader, err := startSandbox(ctx, cli, ghRepo, os.Stdin, sandboxConfig, defaultImageName, defaultImagePrefix, exposedPorts, portBindings, consolePort) + if err != nil { + return err + } + + if reader != nil { + var k8sClient k8s.K8s + err = retry.Do( + func() error { + // This should wait for the kubeconfig file being there. + k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, K8sEndpoint) + return err + }, + retry.Attempts(10), + ) + if err != nil { + return err + } + + // Live-ness check + err = retry.Do( + func() error { + // Have to get a new client every time because you run into x509 errors if not + fmt.Println("Waiting for cluster to come up...") + k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, K8sEndpoint) + if err != nil { + logger.Debugf(ctx, "Error getting K8s client in liveness check %s", err) + return err + } + req := k8sClient.CoreV1().RESTClient().Get() + req = req.RequestURI("livez") + res := req.Do(ctx) + return res.Error() + }, + retry.Attempts(15), + ) + if err != nil { + return err + } + + // Readiness check + err = retry.Do( + func() error { + // No need to refresh client here + req := k8sClient.CoreV1().RESTClient().Get() + req = req.RequestURI("readyz") + res := req.Do(ctx) + return res.Error() + }, + retry.Attempts(10), + ) + if err != nil { + return err + } + + // This will copy the kubeconfig from where k3s writes it () to the main file. + // This code is located after the waits above since it appears that k3s goes through at least a couple versions + // of the config keys/certs. If this copy is done too early, the copied credentials won't work. + if err = UpdateLocalKubeContext(k8sCtxMgr, sandboxDockerContext, sandboxContextName, docker.Kubeconfig); err != nil { + return err + } + + // Watch for Flyte Deployment + if err := WatchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { + return err + } + if primePod { + primeFlytekitPod(ctx, k8sClient.CoreV1().Pods("default")) + } + } + return nil +} + +// StartClusterForSandbox is the code for the original multi deploy version of sandbox, should be removed once we +// document the new development experience for plugins. +func StartClusterForSandbox(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config, primePod bool, defaultImageName string, defaultImagePrefix string, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, consolePort int) error { + k8sCtxMgr := k8s.NewK8sContextManager() + err := k8sCtxMgr.CheckConfig() + if err != nil { + return err + } + cli, err := docker.GetDockerClient() + if err != nil { + return err + } + + ghRepo := github.GetGHRepoService() + + if err := util.CreatePathAndFile(docker.SandboxKubeconfig); err != nil { + return err + } reader, err := startSandbox(ctx, cli, ghRepo, os.Stdin, sandboxConfig, defaultImageName, defaultImagePrefix, exposedPorts, portBindings, consolePort) if err != nil { @@ -266,7 +376,7 @@ func StartCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdC var k8sClient k8s.K8s err = retry.Do( func() error { - k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, k8sEndpoint) + k8sClient, err = k8s.GetK8sClient(docker.SandboxKubeconfig, sandboxK8sEndpoint) return err }, retry.Attempts(10), @@ -274,10 +384,11 @@ func StartCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdC if err != nil { return err } - if err = UpdateLocalKubeContext(k8sCtxMgr, sandboxDockerContext, sandboxContextName); err != nil { + if err = UpdateLocalKubeContext(k8sCtxMgr, sandboxDockerContext, sandboxContextName, docker.SandboxKubeconfig); err != nil { return err } + // TODO: This doesn't appear to correctly watch for the Flyte deployment but doesn't do so on master either. if err := WatchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { return err } @@ -293,17 +404,16 @@ func StartDemoCluster(ctx context.Context, args []string, sandboxConfig *sandbox primePod := true sandboxImagePrefix := "sha" exposedPorts, portBindings, err := docker.GetDemoPorts() - if sandboxConfig.Dev { - exposedPorts, portBindings, err = docker.GetDevPorts() - } if err != nil { return err } + // K3s will automatically write the file specified by this var, which is mounted from user's local state dir. + sandboxConfig.Env = append(sandboxConfig.Env, k3sKubeConfigEnvVar) err = StartCluster(ctx, args, sandboxConfig, primePod, demoImageName, sandboxImagePrefix, exposedPorts, portBindings, util.DemoConsolePort) if err != nil { return err } - util.PrintSandboxMessage(util.DemoConsolePort, sandboxConfig.DryRun) + util.PrintDemoMessage(util.DemoConsolePort, docker.Kubeconfig, sandboxConfig.DryRun) return nil } @@ -314,10 +424,10 @@ func StartSandboxCluster(ctx context.Context, args []string, sandboxConfig *sand if err != nil { return err } - err = StartCluster(ctx, args, sandboxConfig, primePod, sandboxImageName, demoImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + err = StartClusterForSandbox(ctx, args, sandboxConfig, primePod, sandboxImageName, demoImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) if err != nil { return err } - util.PrintSandboxMessage(util.SandBoxConsolePort, sandboxConfig.DryRun) + util.PrintSandboxMessage(util.SandBoxConsolePort, docker.SandboxKubeconfig, sandboxConfig.DryRun) return nil } diff --git a/flytectl/pkg/sandbox/start_test.go b/flytectl/pkg/sandbox/start_test.go index c3b22c6be4..7bc204ac34 100644 --- a/flytectl/pkg/sandbox/start_test.go +++ b/flytectl/pkg/sandbox/start_test.go @@ -103,7 +103,7 @@ func TestStartFunc(t *testing.T) { Platform: "", } assert.Nil(t, util.SetupFlyteDir()) - assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm)) + assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "state"), os.ModePerm)) assert.Nil(t, ioutil.WriteFile(docker.Kubeconfig, []byte(content), os.ModePerm)) fakePod.SetName("flyte") @@ -146,7 +146,7 @@ func TestStartFunc(t *testing.T) { assert.Nil(t, reader) }) t.Run("Successfully run demo cluster with source code", func(t *testing.T) { - sandboxCmdConfig.DefaultConfig.Source = f.UserHomeDir() + sandboxCmdConfig.DefaultConfig.DeprecatedSource = f.UserHomeDir() sandboxCmdConfig.DefaultConfig.Version = "" sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) @@ -162,7 +162,7 @@ func TestStartFunc(t *testing.T) { assert.Nil(t, err) }) t.Run("Successfully run demo cluster with abs path of source code", func(t *testing.T) { - sandboxCmdConfig.DefaultConfig.Source = "../" + sandboxCmdConfig.DefaultConfig.DeprecatedSource = "../" sandboxCmdConfig.DefaultConfig.Version = "" sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) @@ -279,7 +279,7 @@ func TestStartFunc(t *testing.T) { }) t.Run("Successfully run demo cluster command", func(t *testing.T) { // mockOutStream := new(io.Writer) - //cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) + // cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) client := testclient.NewSimpleClientset() k8s.Client = client _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) @@ -306,7 +306,7 @@ func TestStartFunc(t *testing.T) { }).Return(reader, nil) mockK8sContextMgr := &k8sMocks.ContextOps{} docker.Client = mockDocker - sandboxCmdConfig.DefaultConfig.Source = "" + sandboxCmdConfig.DefaultConfig.DeprecatedSource = "" sandboxCmdConfig.DefaultConfig.Version = "" k8s.ContextMgr = mockK8sContextMgr ghutil.Client = githubMock @@ -314,12 +314,10 @@ func TestStartFunc(t *testing.T) { mockK8sContextMgr.OnCopyContextMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) err = StartSandboxCluster(context.Background(), []string{}, config) assert.Nil(t, err) - err = StartDemoCluster(context.Background(), []string{}, config) - assert.Nil(t, err) }) t.Run("Error in running demo cluster command", func(t *testing.T) { - //mockOutStream := new(io.Writer) - //cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) + // mockOutStream := new(io.Writer) + // cmdCtx := cmdCore.NewCommandContext(admin.InitializeMockClientset(), *mockOutStream) sandboxSetup() docker.Client = mockDocker mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) @@ -362,7 +360,6 @@ func TestMonitorFlyteDeployment(t *testing.T) { err = WatchFlyteDeployment(ctx, client.CoreV1()) assert.NotNil(t, err) - }) t.Run("Monitor k8s deployment success", func(t *testing.T) { @@ -385,13 +382,10 @@ func TestMonitorFlyteDeployment(t *testing.T) { err = WatchFlyteDeployment(ctx, client.CoreV1()) assert.Nil(t, err) - }) - } func TestGetFlyteDeploymentCount(t *testing.T) { - ctx := context.Background() client := testclient.NewSimpleClientset() c, err := getFlyteDeployment(ctx, client.CoreV1()) diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index afdb35967b..ece882279a 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "net/http" "os" + "path/filepath" "strings" "github.com/flyteorg/flytectl/pkg/configutil" @@ -34,16 +35,36 @@ func WriteIntoFile(data []byte, file string) error { return nil } +func CreatePathAndFile(pathToConfig string) error { + p, err := filepath.Abs(pathToConfig) + if err != nil { + return err + } + if err := os.MkdirAll(filepath.Dir(p), os.ModePerm); err != nil { + return err + } + + // Created a empty file with right permission + if _, err := os.Stat(p); err != nil { + if os.IsNotExist(err) { + if err := os.WriteFile(p, []byte(""), os.ModePerm); err != nil { + return err + } + } + } + return nil +} + // SetupFlyteDir will create .flyte dir if not exist func SetupFlyteDir() error { - if err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s"), os.ModePerm); err != nil { + if err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "state"), os.ModePerm); err != nil { return err } // Created a empty file with right permission if _, err := os.Stat(docker.Kubeconfig); err != nil { if os.IsNotExist(err) { - if err := ioutil.WriteFile(docker.Kubeconfig, []byte(""), os.ModePerm); err != nil { + if err := os.WriteFile(docker.Kubeconfig, []byte(""), os.ModePerm); err != nil { return err } } @@ -52,12 +73,36 @@ func SetupFlyteDir() error { return nil } +// PrintDemoMessage will print sandbox success message +func PrintDemoMessage(flyteConsolePort int, kubeconfigLocation string, dryRun bool) { + kubeconfig := strings.Join([]string{ + "$KUBECONFIG", + kubeconfigLocation, + }, ":") + + var successMsg string + if dryRun { + successMsg = fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessagePending, flyteConsolePort) + } else { + successMsg = fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessage, flyteConsolePort) + + } + fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, successMsg, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) + fmt.Printf("%v Run the following command to export sandbox environment variables for accessing flytectl\n", emoji.Sparkle) + fmt.Printf(" export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) + if dryRun { + fmt.Printf("%v Run the following command to export kubeconfig variables for accessing flyte pods locally\n", emoji.Sparkle) + fmt.Printf(" export KUBECONFIG=%v \n", kubeconfig) + } + fmt.Printf("%s Flyte sandbox ships with a Docker registry. Tag and push custom workflow images to localhost:30000\n", emoji.Whale) + fmt.Printf("%s The Minio API is hosted on localhost:30002. Use http://localhost:30080/minio/login for Minio console\n", emoji.OpenFileFolder) +} + // PrintSandboxMessage will print sandbox success message -func PrintSandboxMessage(flyteConsolePort int, dryRun bool) { +func PrintSandboxMessage(flyteConsolePort int, kubeconfigLocation string, dryRun bool) { kubeconfig := strings.Join([]string{ "$KUBECONFIG", - f.FilePathJoin(f.UserHomeDir(), ".kube", "config"), - docker.Kubeconfig, + kubeconfigLocation, }, ":") var successMsg string diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index 9bbb89964f..492dc2623f 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -1,8 +1,12 @@ package util import ( + "os" + "path/filepath" "testing" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/stretchr/testify/assert" ) @@ -25,7 +29,7 @@ func TestSetupFlyteDir(t *testing.T) { func TestPrintSandboxMessage(t *testing.T) { t.Run("Print Sandbox Message", func(t *testing.T) { - PrintSandboxMessage(SandBoxConsolePort, false) + PrintSandboxMessage(SandBoxConsolePort, docker.SandboxKubeconfig, false) }) } @@ -80,3 +84,15 @@ func TestIsVersionGreaterThan(t *testing.T) { assert.NotNil(t, err) }) } + +func TestCreatePathAndFile(t *testing.T) { + dir, err := os.MkdirTemp("", "flytectl") + assert.NoError(t, err) + defer os.RemoveAll(dir) + + testFile := filepath.Join(dir, "testfile.yaml") + err = CreatePathAndFile(testFile) + assert.NoError(t, err) + _, err = os.Stat(testFile) + assert.NoError(t, err) +} From 8b5696e24daedcaca2f2a520c23c9bf05830c7f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nick=20M=C3=BCller?= Date: Wed, 16 Nov 2022 20:07:12 +0100 Subject: [PATCH 292/645] OverwriteCache flag for creating/relaunching executions (#358) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added direnv .envrc to gitignore Signed-off-by: Nick Müller * Implemented skipCache flag for creating executions Signed-off-by: Nick Müller * Renamed skipCache flag to overwriteCache Updated to latest released version of flyteidl Signed-off-by: Nick Müller * Updated to latest released versions of flyteidl and flytestdlib Signed-off-by: Nick Müller * Removed unneeded overwriteCache parameter in favor of global executionConfig Signed-off-by: Nick Müller Signed-off-by: Nick Müller --- flytectl/.gitignore | 2 + flytectl/cmd/create/execution.go | 11 +- flytectl/cmd/create/execution_util.go | 4 +- flytectl/cmd/create/execution_util_test.go | 10 + flytectl/cmd/create/executionconfig_flags.go | 7 +- .../cmd/create/executionconfig_flags_test.go | 14 + flytectl/go.mod | 107 +++--- flytectl/go.sum | 345 ++++++++++++++---- 8 files changed, 373 insertions(+), 127 deletions(-) diff --git a/flytectl/.gitignore b/flytectl/.gitignore index 0cfb4d69b2..3e69f20c81 100644 --- a/flytectl/.gitignore +++ b/flytectl/.gitignore @@ -8,3 +8,5 @@ _test docs/build/* cmd/upgrade/flyte.ext .vscode +# direnv +.envrc diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index 0d0c8786fc..5c6c01b327 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -138,9 +138,7 @@ The generated file would look similar to this. Here, empty values have been dump :: - flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d development --clusterPool my-gpu-cluster - -Usage + flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d development --clusterPool my-gpu-cluster ` ) @@ -149,9 +147,9 @@ Usage // ExecutionConfig hold configuration for create execution flags and configuration of the actual task or workflow to be launched. type ExecutionConfig struct { // pflag section - ExecFile string `json:"execFile,omitempty" pflag:",file for the execution params.If not specified defaults to <_name>.execution_spec.yaml"` - TargetDomain string `json:"targetDomain" pflag:",project where execution needs to be created.If not specified configured domain would be used."` - TargetProject string `json:"targetProject" pflag:",project where execution needs to be created.If not specified configured project would be used."` + ExecFile string `json:"execFile,omitempty" pflag:",file for the execution params. If not specified defaults to <_name>.execution_spec.yaml"` + TargetDomain string `json:"targetDomain" pflag:",project where execution needs to be created. If not specified configured domain would be used."` + TargetProject string `json:"targetProject" pflag:",project where execution needs to be created. If not specified configured project would be used."` KubeServiceAcct string `json:"kubeServiceAcct" pflag:",kubernetes service account AuthRole for launching execution."` IamRoleARN string `json:"iamRoleARN" pflag:",iam role ARN AuthRole for launching execution."` Relaunch string `json:"relaunch" pflag:",execution id to be relaunched."` @@ -159,6 +157,7 @@ type ExecutionConfig struct { DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` Version string `json:"version" pflag:",specify version of execution workflow/task."` ClusterPool string `json:"clusterPool" pflag:",specify which cluster pool to assign execution to."` + OverwriteCache bool `json:"overwriteCache" pflag:",skip cached results when performing execution,causing all outputs to be re-calculated and stored data to be overwritten. Does not work for recovered executions."` // Non plfag section is read from the execution config generated by get task/launch plan Workflow string `json:"workflow,omitempty"` Task string `json:"task,omitempty"` diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 2fdf247688..0f81b80636 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -113,7 +113,8 @@ func relaunchExecution(ctx context.Context, executionName string, project string Project: project, Domain: domain, }, - Name: targetExecutionName, + Name: targetExecutionName, + OverwriteCache: executionConfig.OverwriteCache, }) if err != nil { return err @@ -167,6 +168,7 @@ func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, securi AuthRole: authRole, SecurityContext: securityContext, ClusterAssignment: clusterAssignment, + OverwriteCache: executionConfig.OverwriteCache, }, Inputs: inputs, } diff --git a/flytectl/cmd/create/execution_util_test.go b/flytectl/cmd/create/execution_util_test.go index 4ce9befcd5..87eb39bd38 100644 --- a/flytectl/cmd/create/execution_util_test.go +++ b/flytectl/cmd/create/execution_util_test.go @@ -212,3 +212,13 @@ func Test_resolveOverrides(t *testing.T) { assert.Equal(t, "v1", cfg.Version) assert.Equal(t, "gpu", cfg.ClusterPool) } + +func TestCreateExecutionForRelaunchOverwritingCache(t *testing.T) { + s := setup() + createExecutionUtilSetup() + executionConfig.OverwriteCache = true + relaunchRequest.OverwriteCache = true // ensure request has overwriteCache param set + s.MockAdminClient.OnRelaunchExecutionMatch(s.Ctx, relaunchRequest).Return(executionCreateResponse, nil) + err := relaunchExecution(s.Ctx, "execName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfig, "") + assert.Nil(t, err) +} diff --git a/flytectl/cmd/create/executionconfig_flags.go b/flytectl/cmd/create/executionconfig_flags.go index 052d0a74d5..9908df93b1 100755 --- a/flytectl/cmd/create/executionconfig_flags.go +++ b/flytectl/cmd/create/executionconfig_flags.go @@ -50,9 +50,9 @@ func (ExecutionConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("ExecutionConfig", pflag.ExitOnError) - cmdFlags.StringVar(&executionConfig.ExecFile, fmt.Sprintf("%v%v", prefix, "execFile"), executionConfig.ExecFile, "file for the execution params.If not specified defaults to <_name>.execution_spec.yaml") - cmdFlags.StringVar(&executionConfig.TargetDomain, fmt.Sprintf("%v%v", prefix, "targetDomain"), executionConfig.TargetDomain, "project where execution needs to be created.If not specified configured domain would be used.") - cmdFlags.StringVar(&executionConfig.TargetProject, fmt.Sprintf("%v%v", prefix, "targetProject"), executionConfig.TargetProject, "project where execution needs to be created.If not specified configured project would be used.") + cmdFlags.StringVar(&executionConfig.ExecFile, fmt.Sprintf("%v%v", prefix, "execFile"), executionConfig.ExecFile, "file for the execution params. If not specified defaults to <_name>.execution_spec.yaml") + cmdFlags.StringVar(&executionConfig.TargetDomain, fmt.Sprintf("%v%v", prefix, "targetDomain"), executionConfig.TargetDomain, "project where execution needs to be created. If not specified configured domain would be used.") + cmdFlags.StringVar(&executionConfig.TargetProject, fmt.Sprintf("%v%v", prefix, "targetProject"), executionConfig.TargetProject, "project where execution needs to be created. If not specified configured project would be used.") cmdFlags.StringVar(&executionConfig.KubeServiceAcct, fmt.Sprintf("%v%v", prefix, "kubeServiceAcct"), executionConfig.KubeServiceAcct, "kubernetes service account AuthRole for launching execution.") cmdFlags.StringVar(&executionConfig.IamRoleARN, fmt.Sprintf("%v%v", prefix, "iamRoleARN"), executionConfig.IamRoleARN, "iam role ARN AuthRole for launching execution.") cmdFlags.StringVar(&executionConfig.Relaunch, fmt.Sprintf("%v%v", prefix, "relaunch"), executionConfig.Relaunch, "execution id to be relaunched.") @@ -60,6 +60,7 @@ func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.BoolVar(&executionConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), executionConfig.DryRun, "execute command without making any modifications.") cmdFlags.StringVar(&executionConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), executionConfig.Version, "specify version of execution workflow/task.") cmdFlags.StringVar(&executionConfig.ClusterPool, fmt.Sprintf("%v%v", prefix, "clusterPool"), executionConfig.ClusterPool, "specify which cluster pool to assign execution to.") + cmdFlags.BoolVar(&executionConfig.OverwriteCache, fmt.Sprintf("%v%v", prefix, "overwriteCache"), executionConfig.OverwriteCache, "skip cached results when performing execution, causing all outputs to be re-calculated and stored data to be overwritten. Does not work for recovered executions.") cmdFlags.StringVar(&executionConfig.Workflow, fmt.Sprintf("%v%v", prefix, "workflow"), executionConfig.Workflow, "") cmdFlags.StringVar(&executionConfig.Task, fmt.Sprintf("%v%v", prefix, "task"), executionConfig.Task, "") return cmdFlags diff --git a/flytectl/cmd/create/executionconfig_flags_test.go b/flytectl/cmd/create/executionconfig_flags_test.go index ac59b4fe0b..7891b4f9ba 100755 --- a/flytectl/cmd/create/executionconfig_flags_test.go +++ b/flytectl/cmd/create/executionconfig_flags_test.go @@ -239,6 +239,20 @@ func TestExecutionConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_overwriteCache", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("overwriteCache", testValue) + if vBool, err := cmdFlags.GetBool("overwriteCache"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vBool), &actual.OverwriteCache) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_workflow", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/go.mod b/flytectl/go.mod index b1f6e1bcba..50360bd287 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -8,31 +8,30 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.1.19 - github.com/flyteorg/flytestdlib v1.0.0 + github.com/flyteorg/flyteidl v1.2.5 + github.com/flyteorg/flytestdlib v1.0.13 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 - github.com/golang/protobuf v1.5.0 + github.com/golang/protobuf v1.5.2 github.com/google/go-github/v42 v42.0.0 - github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.2.0 github.com/hashicorp/go-version v1.3.0 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 - github.com/mitchellh/mapstructure v1.4.1 + github.com/mitchellh/mapstructure v1.4.3 github.com/mouuff/go-rocket-update v1.5.1 github.com/opencontainers/image-spec v1.0.2 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.8.1 - github.com/spf13/cobra v1.1.3 + github.com/spf13/cobra v1.4.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.7.0 + github.com/stretchr/testify v1.7.1 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 github.com/zalando/go-keyring v0.1.1 - golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 - google.golang.org/grpc v1.36.0 - google.golang.org/protobuf v1.27.1 + golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 + google.golang.org/grpc v1.46.0 + google.golang.org/protobuf v1.28.0 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b gotest.tools v2.2.0+incompatible @@ -49,47 +48,51 @@ require ( ) require ( - cloud.google.com/go v0.78.0 // indirect - cloud.google.com/go/storage v1.12.0 // indirect - github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 // indirect + cloud.google.com/go v0.101.0 // indirect + cloud.google.com/go/compute v1.6.1 // indirect + cloud.google.com/go/iam v0.3.0 // indirect + cloud.google.com/go/storage v1.22.0 // indirect + github.com/Azure/azure-sdk-for-go v63.4.0+incompatible // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v0.23.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.0 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.17 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect + github.com/Azure/go-autorest/autorest v0.11.27 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.18 // indirect github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.0 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/Microsoft/go-winio v0.5.0 // indirect github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect - github.com/aws/aws-sdk-go v1.37.3 // indirect + github.com/aws/aws-sdk-go v1.44.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/containerd/containerd v1.5.10 // indirect github.com/coocood/freecache v1.1.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect github.com/danieljoos/wincred v1.1.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.0+incompatible // indirect github.com/docker/go-units v0.4.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/evanphx/json-patch v4.9.0+incompatible // indirect - github.com/fatih/color v1.10.0 // indirect + github.com/fatih/color v1.13.0 // indirect github.com/flyteorg/flyteplugins v1.0.0 // indirect - github.com/flyteorg/stow v0.3.3 // indirect - github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/flyteorg/stow v0.3.6 // indirect + github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/go-logr/logr v0.4.0 // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/google/go-cmp v0.5.6 // indirect + github.com/golang-jwt/jwt/v4 v4.4.1 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/go-cmp v0.5.8 // indirect + github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.0.5 // indirect + github.com/googleapis/gax-go/v2 v2.3.0 // indirect github.com/googleapis/gnostic v0.5.1 // indirect + github.com/googleapis/go-type-adapters v1.0.0 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect @@ -100,11 +103,10 @@ require ( github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/jstemmer/go-junit-report v0.9.1 // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/magiconair/properties v1.8.4 // indirect - github.com/mattn/go-colorable v0.1.8 // indirect - github.com/mattn/go-isatty v0.0.13 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect @@ -113,37 +115,34 @@ require ( github.com/morikuni/aec v1.0.0 // indirect github.com/ncw/swift v1.0.53 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/pelletier/go-toml v1.8.1 // indirect + github.com/pelletier/go-toml v1.9.4 // indirect + github.com/pelletier/go-toml/v2 v2.0.0-beta.8 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.10.0 // indirect + github.com/prometheus/client_golang v1.12.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.18.0 // indirect - github.com/prometheus/procfs v0.6.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect github.com/rivo/uniseg v0.2.0 // indirect - github.com/russross/blackfriday/v2 v2.0.1 // indirect - github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect - github.com/spf13/afero v1.5.1 // indirect - github.com/spf13/cast v1.3.1 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/viper v1.7.1 // indirect + github.com/spf13/viper v1.11.0 // indirect github.com/stretchr/objx v0.3.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect - go.opencensus.io v0.22.6 // indirect - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect + go.opencensus.io v0.23.0 // indirect + golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f // indirect golang.org/x/exp v0.0.0-20220428152302-39d4317da171 // indirect - golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect - golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect - golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect - golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect - golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect + golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect + golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect - golang.org/x/tools v0.1.10 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - google.golang.org/api v0.40.0 // indirect + golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect + google.golang.org/api v0.76.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c // indirect + google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.62.0 // indirect + gopkg.in/ini.v1 v1.66.4 // indirect k8s.io/klog/v2 v2.8.0 // indirect k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index eea38f8a99..b489281258 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -4,6 +4,7 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -19,17 +20,37 @@ cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0K cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0 h1:oKpsiyKMfVpwR3zSAkQixGzlVE5ovitBuO0qSmCf0bI= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.101.0 h1:g+LL+JvpvdyGtcaD2xw2mSByE/6F9s471eJSoaysM84= +cloud.google.com/go v0.101.0/go.mod h1:hEiddgDb77jDQ+I80tURYNJEnuwPzFU8awCFFRLKjW0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -39,18 +60,25 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.12.0 h1:4y3gHptW1EHVtcPAVE0eBBlFuGqEejTTG3KdIE0lUX4= cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.0 h1:NUV0NNp9nkBuW66BFRLuMgldN60C57ET3dhbwLIYio8= +cloud.google.com/go/storage v1.22.0/go.mod h1:GbaLEoMqbVm6sx3Z0R++gSiBlgMv6yUi2q1DeGFKQgE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= +github.com/Azure/azure-sdk-for-go v63.4.0+incompatible h1:fle3M5Q7vr8auaiPffKyUQmLbvYeqpw30bKU6PrWJFo= +github.com/Azure/azure-sdk-for-go v63.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.23.1 h1:3CVsSo4mp8NDWO11tHzN/mdo2zP0CtaSK5IcwBjfqRA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.23.1/go.mod h1:w5pDIZuawUmY3Bj4tVx3Xb8KS96ToB0j315w9rqpAg0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.14.0 h1:NVS/4LOQfkBpk+B1VopIzv1ptmYeEskA8w/3K/w7vjo= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.2 h1:Px2KVERcYEg2Lv25AqC2hVr0xUWaq94wuEObLIkYzmA= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.2/go.mod h1:CdSJQNNzZhCkwDaV27XV1w48ZBPtxe7mlrZAsPNxD5g= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.0 h1:0nJeKDmB7a1a8RDMjTltahlPsaNlWjq/LpkZleSwINk= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.0/go.mod h1:mbwxKc/fW+IkF0GG591MuXw0KuEQBDkeRoZ9vmVJPxg= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -60,14 +88,16 @@ github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+B github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A= +github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= +github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= @@ -76,16 +106,19 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= +github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0 h1:WVsrXCnHlDDX8ls+tootqRE87/hL9S/g4ewig9RsD/c= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/spark-on-k8s-operator v0.0.0-20200723154620-6f35a1152625/go.mod h1:6PnrZv6zUDkrNMw0mIoGRmGBR7i9LulhKPmxFq4rUiM= @@ -157,8 +190,9 @@ github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZo github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.37.3 h1:1f0groABc4AuapskpHf6EBRaG2tqw0Sx3ebCMwfp1Ys= github.com/aws/aws-sdk-go v1.37.3/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.44.2 h1:5VBk5r06bgxgRKVaUtm1/4NT/rtrnH2E4cnAYv5zgQc= +github.com/aws/aws-sdk-go v1.44.2/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.0.0/go.mod h1:smfAbmpW+tcRVuNUjo3MOArSZmW72t62rkCzc2i0TWM= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= @@ -195,8 +229,9 @@ github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= @@ -214,6 +249,12 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= @@ -322,8 +363,9 @@ github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfc github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -386,6 +428,10 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= @@ -394,28 +440,31 @@ github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.1.19 h1:1CtSbuFhFHwUbKdv66PqbcER01iacAJU+snh0eTsXc4= -github.com/flyteorg/flyteidl v1.1.19/go.mod h1:SLTYz2JgIKvM5MbPVlMP7uILb65fnuuZQZFHHIEYh2U= +github.com/flyteorg/flyteidl v1.2.5 h1:oPs0PX9opR9JtWjP5ZH2YMChkbGGL45PIy+90FlaxYc= +github.com/flyteorg/flyteidl v1.2.5/go.mod h1:OJAq333OpInPnMhvVz93AlEjmlQ+t0FAD4aakIYE4OU= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= github.com/flyteorg/flytepropeller v1.1.1/go.mod h1:x7vIuy9vmOPw9JSd+xAijeiHShmuieFZsTT1yLXhR90= -github.com/flyteorg/flytestdlib v1.0.0 h1:gb99ignMsVcNTUmWzArtcIDdkRjyzQQVBkWNOQakiFg= github.com/flyteorg/flytestdlib v1.0.0/go.mod h1:QSVN5wIM1lM9d60eAEbX7NwweQXW96t5x4jbyftn89c= -github.com/flyteorg/stow v0.3.3 h1:tzeNl8mSZFL3oJDi0ACZj6FAineQAF4qyEp6bXtIdQY= +github.com/flyteorg/flytestdlib v1.0.13 h1:mmU+k0Bc7HB5kWCgxoNJ9lZeD9tV1c7e5oCgyXKgO8c= +github.com/flyteorg/flytestdlib v1.0.13/go.mod h1:nIBmBHtjTJvhZEn3e/EwVC/iMkR2tUX8hEiXjRBpH/s= github.com/flyteorg/stow v0.3.3/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/flyteorg/stow v0.3.6 h1:jt50ciM14qhKBaIrB+ppXXY+SXB59FNREFgTJqCyqIk= +github.com/flyteorg/stow v0.3.6/go.mod h1:5dfBitPM004dwaZdoVylVjxFT4GWAgI0ghAndhNUzCo= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -430,6 +479,7 @@ github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3I github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -515,13 +565,19 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.1 h1:pC5DB52sCeK48Wlb9oPcdhnjkz1TKt1D/P7WKJ0kUcQ= +github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -529,6 +585,8 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -544,9 +602,12 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -560,8 +621,10 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v42 v42.0.0 h1:YNT0FwjPrEysRkLIiKuEfSvBPCGKphW5aS5PxwaoLec= github.com/google/go-github/v42 v42.0.0/go.mod h1:jgg/jvyI0YlDOM1/ps6XYh04HNQ3vKf0CVko62/EhRg= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -573,8 +636,10 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -587,6 +652,10 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -595,16 +664,22 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0 h1:nRJtk3y8Fm770D42QV6T90ZnvFZyk7agSo3Q+Z9p3WI= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwuTCM= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= @@ -673,6 +748,8 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= +github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -689,12 +766,11 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -726,6 +802,7 @@ github.com/kubeflow/common v0.4.0/go.mod h1:X15/dRQQoB77wrqrPwVn4GqG2ubgk8xR24A8 github.com/kubeflow/mpi-operator/v2 v2.0.0-20210920181600-c5c0c3ef99ec/go.mod h1:cTBmZKLlrIXBWQ0A9Ik8h0i4zoGhR7ApHwUfrLDbhQc= github.com/kubeflow/pytorch-operator v0.6.0/go.mod h1:zHblV+yTwVG4PCgKTU2wPfOmQ6TJdfT87lDfHrP1a1Y= github.com/kubeflow/tf-operator v0.5.3/go.mod h1:EBtz5LQoKaHUl/5fV5vD1qXVNVNyn3TrFaH6eVoQ8SY= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= @@ -733,8 +810,9 @@ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0U github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -745,14 +823,16 @@ github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -771,8 +851,9 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= @@ -877,8 +958,11 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0= +github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= @@ -893,6 +977,7 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -907,8 +992,10 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= -github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -926,8 +1013,10 @@ github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -941,8 +1030,9 @@ github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= @@ -951,8 +1041,9 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= @@ -960,7 +1051,6 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -971,10 +1061,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= @@ -982,18 +1070,20 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1006,8 +1096,9 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= +github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1025,8 +1116,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1043,6 +1135,7 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/vektra/mockery v1.1.2/go.mod h1:VcfZjKaFOPO+MpN4ZvwPjs4c48lkq1o3Ym8yHZJu0jU= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= @@ -1062,6 +1155,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= @@ -1086,8 +1180,10 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.22.6 h1:BdkrbWrzDlV9dnbzoP7sfN+dHheJ4J9JOaYxcUDL+ok= go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1126,9 +1222,13 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f h1:OeJjE6G4dgCY4PIXvIRQbE8+RX+uXZyGhUy/ksMGJoc= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1153,8 +1253,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1165,7 +1265,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1221,11 +1321,20 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1236,8 +1345,17 @@ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 h1:alLDrZkL34Y2bnGHfvC1CYBRBXCXgx8AC2vY4MRtYX4= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1332,20 +1450,44 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1412,6 +1554,7 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200323144430-8dcfad9e016e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1434,13 +1577,18 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -1466,8 +1614,26 @@ google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.38.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.40.0 h1:uWrpz12dpVPn7cojP82mk02XDgTJLDPc2KbVTxrWb4A= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.76.0 h1:UkZl25bR1FHNqtK/EKs3vCdpZtUO6gea3YElTwc8pQg= +google.golang.org/api v0.76.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1522,8 +1688,47 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c h1:7A9LQhrZmuCPI79/sYSbscFqBp4XFYf6oaIQuV1xji4= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220405205423-9d709892a2bf/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 h1:G1IeWbjrqEq9ChWxEuRPJu6laA67+XgTFHVSAvepr38= +google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1549,8 +1754,20 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0 h1:o1bcQ6imQMIOpdrO3SWf2z5RV72WbDwdXuK0MDlc8As= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0 h1:oCjezcn6g6A75TGoKYBPgKmVBLexhYLM6MebdrPApP8= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1563,8 +1780,9 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1582,8 +1800,9 @@ gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKW gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= From d2ef7daf686f9be83341dac77ea420a0e1bc3bde Mon Sep 17 00:00:00 2001 From: Felix Ruess Date: Sat, 19 Nov 2022 23:06:45 +0100 Subject: [PATCH 293/645] fix confusing doc for flytectl delete (#377) --- flytectl/cmd/delete/delete.go | 2 +- flytectl/docs/source/gen/flytectl.rst | 4 ++-- flytectl/docs/source/gen/flytectl_delete.rst | 4 ++-- ...ectl_delete_cluster-resource-attribute.rst | 4 ++-- ...lytectl_delete_execution-cluster-label.rst | 4 ++-- ...tectl_delete_execution-queue-attribute.rst | 4 ++-- .../source/gen/flytectl_delete_execution.rst | 20 +++++++++---------- .../gen/flytectl_delete_plugin-override.rst | 4 ++-- ...lytectl_delete_task-resource-attribute.rst | 4 ++-- ...tectl_delete_workflow-execution-config.rst | 4 ++-- 10 files changed, 27 insertions(+), 27 deletions(-) diff --git a/flytectl/cmd/delete/delete.go b/flytectl/cmd/delete/delete.go index fa51fd2fbb..b25c91babd 100644 --- a/flytectl/cmd/delete/delete.go +++ b/flytectl/cmd/delete/delete.go @@ -15,7 +15,7 @@ import ( // Long descriptions are whitespace sensitive when generating docs using Sphinx. const ( - deleteCmdShort = `Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects.` + deleteCmdShort = `Terminates/deletes various Flyte resources such as executions and resource attributes.` deleteCmdLong = ` Delete a resource; if an execution: :: diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 3ab23acf44..274e087f25 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -24,7 +24,7 @@ Options --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' @@ -81,7 +81,7 @@ SEE ALSO * :doc:`flytectl_completion` - Generates completion script. * :doc:`flytectl_config` - Runs various config commands, look at the help of this command to get a list of available commands.. * :doc:`flytectl_create` - Creates various Flyte resources such as tasks, workflows, launch plans, executions, and projects. -* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as executions and resource attributes. * :doc:`flytectl_demo` - Helps with demo interactions like start, teardown, status, and exec. * :doc:`flytectl_get` - Fetches various Flyte resources such as tasks, workflows, launch plans, executions, and projects. * :doc:`flytectl_register` - Registers tasks, workflows, and launch plans from a list of generated serialized files. diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index a9e5109b6b..1be2ff2eff 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -3,7 +3,7 @@ flytectl delete --------------- -Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +Terminates/deletes various Flyte resources such as executions and resource attributes. Synopsis ~~~~~~~~ @@ -36,7 +36,7 @@ Options inherited from parent commands --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 08e825a06d..8b85c1038b 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -71,7 +71,7 @@ Options inherited from parent commands --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' @@ -123,5 +123,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as executions and resource attributes. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index b5536698aa..dc7d898967 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -68,7 +68,7 @@ Options inherited from parent commands --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' @@ -120,5 +120,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as executions and resource attributes. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 63ea3a140b..54c7eca54d 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -72,7 +72,7 @@ Options inherited from parent commands --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' @@ -124,5 +124,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as executions and resource attributes. diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 750ef913e6..b15f4bf245 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -25,11 +25,11 @@ Get an execution to check its state: :: flytectl get execution -d development -p flytesnacks - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | c6a51x2l9e | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:13:04.680476300Z | 15.540361300s | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- Terminate multiple executions with their names: :: @@ -41,15 +41,15 @@ Get an execution to find the state of previously terminated executions: :: flytectl get execution -d development -p flytesnacks - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | c6a51x2l9e | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:13:04.680476300Z | 15.540361300s | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | eeam9s8sny | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:14:04.803084100Z | 42.306385500s | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | p4wv4hwgc4 | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:14:27.476307400Z | 19.727504400s | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- Usage @@ -79,7 +79,7 @@ Options inherited from parent commands --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' @@ -131,5 +131,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as executions and resource attributes. diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index 260a2f6771..7d90fbbe23 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -73,7 +73,7 @@ Options inherited from parent commands --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' @@ -125,5 +125,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as executions and resource attributes. diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 90f484e560..2a0c41edfd 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -73,7 +73,7 @@ Options inherited from parent commands --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' @@ -125,5 +125,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as executions and resource attributes. diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 5659c05253..e30e564be7 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -71,7 +71,7 @@ Options inherited from parent commands --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.endpoint string For admin types, specify where the uri of the service is located. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' @@ -123,5 +123,5 @@ Options inherited from parent commands SEE ALSO ~~~~~~~~ -* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as tasks, workflows, launch plans, executions, and projects. +* :doc:`flytectl_delete` - Terminates/deletes various Flyte resources such as executions and resource attributes. From fc2ac0a26682b0217044ce833725f096315cb7ab Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Wed, 11 Jan 2023 15:14:14 -0800 Subject: [PATCH 294/645] Change extra host to host-gateway (#380) Signed-off-by: Yee Hing Tong --- flytectl/pkg/docker/docker_util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index da7ce9bcab..cf8901e558 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -50,7 +50,7 @@ var ( } StdWriterPrefixLen = 8 StartingBufLen = 32*1024 + StdWriterPrefixLen + 1 - ExtraHosts = []string{"host.docker.internal:127.0.0.1"} + ExtraHosts = []string{"host.docker.internal:host-gateway"} ) // GetDockerClient will returns the docker client From 249cd10166be059155b24d81dbc9b02908202d3e Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Thu, 2 Feb 2023 07:08:14 -0800 Subject: [PATCH 295/645] Upgrade IDL version (#382) --- flytectl/go.mod | 2 +- flytectl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 50360bd287..28b02e0289 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -8,7 +8,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.2.5 + github.com/flyteorg/flyteidl v1.3.5 github.com/flyteorg/flytestdlib v1.0.13 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index b489281258..ef5c6c7dc3 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -445,8 +445,8 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.2.5 h1:oPs0PX9opR9JtWjP5ZH2YMChkbGGL45PIy+90FlaxYc= -github.com/flyteorg/flyteidl v1.2.5/go.mod h1:OJAq333OpInPnMhvVz93AlEjmlQ+t0FAD4aakIYE4OU= +github.com/flyteorg/flyteidl v1.3.5 h1:rSaWMndeENr0QxRKj02kp6N/qQdbgDwpFeZsZbvU45A= +github.com/flyteorg/flyteidl v1.3.5/go.mod h1:OJAq333OpInPnMhvVz93AlEjmlQ+t0FAD4aakIYE4OU= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= From 73d9cb7bc83eef578515fac6c06b48b3c1c5f173 Mon Sep 17 00:00:00 2001 From: Dan Rammer Date: Wed, 8 Feb 2023 14:41:47 -0600 Subject: [PATCH 296/645] Bumping go version to 1.19 (#384) * bumping go version to 1.19 Signed-off-by: Daniel Rammer * update flyte deps Signed-off-by: Daniel Rammer * fixed go generate Signed-off-by: Daniel Rammer * removed dependency upgrades Signed-off-by: Daniel Rammer --------- Signed-off-by: Daniel Rammer --- flytectl/.github/workflows/checks.yml | 12 ++++++------ flytectl/go.mod | 2 +- flytectl/pkg/docker/imagepullpolicy_enumer.go | 1 - flytectl/pkg/printer/outputformat_enumer.go | 1 - 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/flytectl/.github/workflows/checks.yml b/flytectl/.github/workflows/checks.yml index 2283b69920..f8291164fe 100644 --- a/flytectl/.github/workflows/checks.yml +++ b/flytectl/.github/workflows/checks.yml @@ -20,7 +20,7 @@ jobs: name: Lint uses: flyteorg/flytetools/.github/workflows/lint.yml@master with: - go-version: 1.18 + go-version: 1.19 tests: name: Unit Tests @@ -28,13 +28,13 @@ jobs: secrets: FLYTE_BOT_PAT: ${{ secrets.FLYTE_BOT_PAT }} with: - go-version: 1.18 + go-version: 1.19 generate: name: Check Go Gennerate uses: flyteorg/flytetools/.github/workflows/go_generate.yml@master with: - go-version: 1.18 + go-version: 1.19 dry_run_goreleaser: name: Dry Run Goreleaser @@ -52,7 +52,7 @@ jobs: key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - uses: actions/setup-go@v3 with: - go-version: '1.18' + go-version: '1.19' - name: Run GoReleaser dry run uses: goreleaser/goreleaser-action@v2 with: @@ -74,7 +74,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.18 + go-version: 1.19 - name: Build Flytectl binary run: make compile - name: Create a sandbox cluster @@ -104,7 +104,7 @@ jobs: lfs: true - uses: actions/setup-go@v1 with: - go-version: '1.18' + go-version: '1.19' - uses: actions/setup-python@v1 with: python-version: 3.8 diff --git a/flytectl/go.mod b/flytectl/go.mod index 28b02e0289..7204ca0e6b 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -1,6 +1,6 @@ module github.com/flyteorg/flytectl -go 1.18 +go 1.19 require ( github.com/awalterschulze/gographviz v2.0.3+incompatible diff --git a/flytectl/pkg/docker/imagepullpolicy_enumer.go b/flytectl/pkg/docker/imagepullpolicy_enumer.go index a5f09b9ee8..9a44dc09ab 100644 --- a/flytectl/pkg/docker/imagepullpolicy_enumer.go +++ b/flytectl/pkg/docker/imagepullpolicy_enumer.go @@ -1,6 +1,5 @@ // Code generated by "enumer -type=ImagePullPolicy -trimprefix=ImagePullPolicy --json"; DO NOT EDIT. -// package docker import ( diff --git a/flytectl/pkg/printer/outputformat_enumer.go b/flytectl/pkg/printer/outputformat_enumer.go index ab56b2a009..9085e9209d 100644 --- a/flytectl/pkg/printer/outputformat_enumer.go +++ b/flytectl/pkg/printer/outputformat_enumer.go @@ -1,6 +1,5 @@ // Code generated by "enumer --type=OutputFormat -json -yaml -trimprefix=OutputFormat"; DO NOT EDIT. -// package printer import ( From cbe889de88e59deaa43000f9a8f05e59daa5551c Mon Sep 17 00:00:00 2001 From: Jeev B Date: Thu, 9 Feb 2023 14:01:38 -0800 Subject: [PATCH 297/645] Support new sandbox-bundled features (#381) * Create a docker volume to persist database and object store Signed-off-by: Jeev B * Cleanup sandbox configuration directory and mount Signed-off-by: Jeev B * Add logic for backward-compatible demo reload Signed-off-by: Jeev B * Fix working directory for exec Signed-off-by: Jeev B * Generate mocks Signed-off-by: Jeev B * Get existing tests passing Signed-off-by: Jeev B * Cleanup volume creation and add a dryRun message Signed-off-by: Jeev B * Use fmt.Errorf in place of errors.New Signed-off-by: Jeev B * Fix build Signed-off-by: Jeev B * Add tests for volume creation Signed-off-by: Jeev B * Add test for volume teardown Signed-off-by: Jeev B * Include code path for volume creation in sandbox start test Signed-off-by: Jeev B * Add tests for demo reload with backward compatibility Signed-off-by: Jeev B * Suppress output of `which` when testing for sandbox version during demo reload --------- Signed-off-by: Jeev B --- .../cmd/config/subcommand/sandbox/teardown.go | 21 ++++ flytectl/cmd/demo/demo.go | 6 +- flytectl/cmd/demo/reload.go | 65 +++++++++- flytectl/cmd/demo/reload_test.go | 72 ++++++++++- flytectl/cmd/demo/teardown.go | 6 +- flytectl/cmd/demo/teardown_test.go | 29 ++++- flytectl/cmd/sandbox/teardown.go | 3 +- flytectl/pkg/docker/docker.go | 5 + flytectl/pkg/docker/docker_util.go | 65 ++++++++-- flytectl/pkg/docker/docker_util_test.go | 27 +++++ flytectl/pkg/docker/mocks/docker.go | 114 ++++++++++++++++++ flytectl/pkg/sandbox/start.go | 24 +++- flytectl/pkg/sandbox/start_test.go | 8 +- flytectl/pkg/sandbox/teardown.go | 16 ++- flytectl/pkg/sandbox/teardown_test.go | 7 +- flytectl/pkg/util/util.go | 3 +- 16 files changed, 427 insertions(+), 44 deletions(-) create mode 100644 flytectl/cmd/config/subcommand/sandbox/teardown.go diff --git a/flytectl/cmd/config/subcommand/sandbox/teardown.go b/flytectl/cmd/config/subcommand/sandbox/teardown.go new file mode 100644 index 0000000000..0e315d6bd0 --- /dev/null +++ b/flytectl/cmd/config/subcommand/sandbox/teardown.go @@ -0,0 +1,21 @@ +package sandbox + +import ( + "fmt" + + "github.com/spf13/pflag" +) + +type TeardownFlags struct { + Volume bool +} + +var ( + DefaultTeardownFlags = &TeardownFlags{} +) + +func (f *TeardownFlags) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("TeardownFlags", pflag.ExitOnError) + cmdFlags.BoolVarP(&f.Volume, fmt.Sprintf("%v%v", prefix, "volume"), "v", f.Volume, "Optional. Clean up Docker volume. This will result in a permanent loss of all data within the database and object store. Use with caution!") + return cmdFlags +} diff --git a/flytectl/cmd/demo/demo.go b/flytectl/cmd/demo/demo.go index 23052175bb..a26b06e657 100644 --- a/flytectl/cmd/demo/demo.go +++ b/flytectl/cmd/demo/demo.go @@ -56,8 +56,10 @@ func CreateDemoCommand() *cobra.Command { Short: reloadShort, Long: reloadLong, PFlagProvider: sandboxCmdConfig.DefaultConfig, DisableFlyteClient: true}, "teardown": {CmdFunc: teardownDemoCluster, Aliases: []string{}, ProjectDomainNotRequired: true, - Short: teardownShort, - Long: teardownLong, DisableFlyteClient: true}, + Short: teardownShort, + Long: teardownLong, + PFlagProvider: sandboxCmdConfig.DefaultTeardownFlags, + DisableFlyteClient: true}, "status": {CmdFunc: demoClusterStatus, Aliases: []string{}, ProjectDomainNotRequired: true, Short: statusShort, Long: statusLong}, diff --git a/flytectl/cmd/demo/reload.go b/flytectl/cmd/demo/reload.go index f7441cf7c6..e7100802de 100644 --- a/flytectl/cmd/demo/reload.go +++ b/flytectl/cmd/demo/reload.go @@ -12,7 +12,8 @@ import ( ) const ( - labelSelector = "app=flyte" + internalBootstrapAgent = "flyte-sandbox-bootstrap" + labelSelector = "app.kubernetes.io/name=flyte-binary" ) const ( reloadShort = "Power cycle the Flyte executable pod, effectively picking up an updated config." @@ -28,8 +29,68 @@ Usage ` ) -// reloadDemoCluster will kill the flyte binary pod so the new one can pick up a new config file +func isLegacySandbox(ctx context.Context, cli docker.Docker, containerID string) (bool, error) { + var result bool + + // Check if sandbox is compatible with new bootstrap mechanism + exec, err := docker.ExecCommend( + ctx, + cli, + containerID, + []string{"sh", "-c", fmt.Sprintf("which %s > /dev/null", internalBootstrapAgent)}, + ) + if err != nil { + return result, err + } + if err = docker.InspectExecResp(ctx, cli, exec.ID); err != nil { + return result, err + } + res, err := cli.ContainerExecInspect(ctx, exec.ID) + if err != nil { + return result, err + } + + result = res.ExitCode != 0 + return result, nil +} + func reloadDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + cli, err := docker.GetDockerClient() + if err != nil { + return err + } + c, err := docker.GetSandbox(ctx, cli) + if err != nil { + return err + } + if c == nil { + return fmt.Errorf("reload failed - could not find an active sandbox") + } + + // Working with a legacy sandbox - fallback to legacy reload mechanism + useLegacyMethod, err := isLegacySandbox(ctx, cli, c.ID) + if err != nil { + return err + } + if useLegacyMethod { + return legacyReloadDemoCluster(ctx) + } + + // At this point we know that we are on a modern sandbox, and we can use the + // internal bootstrap agent to reload the cluster + exec, err := docker.ExecCommend(ctx, cli, c.ID, []string{internalBootstrapAgent}) + if err != nil { + return err + } + if err = docker.InspectExecResp(ctx, cli, exec.ID); err != nil { + return err + } + + return nil +} + +// legacyReloadDemoCluster will kill the flyte binary pod so the new one can pick up a new config file +func legacyReloadDemoCluster(ctx context.Context) error { k8sClient, err := k8s.GetK8sClient(docker.Kubeconfig, K8sEndpoint) if err != nil { fmt.Println("Could not get K8s client") diff --git a/flytectl/cmd/demo/reload_test.go b/flytectl/cmd/demo/reload_test.go index 35ceea040a..ef50033dc7 100644 --- a/flytectl/cmd/demo/reload_test.go +++ b/flytectl/cmd/demo/reload_test.go @@ -1,10 +1,16 @@ package demo import ( + "bufio" + "bytes" "context" + "fmt" "testing" + "github.com/docker/docker/api/types" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/docker/mocks" "github.com/flyteorg/flytectl/pkg/k8s" "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" @@ -20,14 +26,76 @@ var fakePod = corev1.Pod{ }, ObjectMeta: metav1.ObjectMeta{ Name: "dummyflytepod", - Labels: map[string]string{"app": "flyte"}, + Labels: map[string]string{"app.kubernetes.io/name": "flyte-binary"}, }, } -func TestDemoReload(t *testing.T) { +func sandboxSetup(ctx context.Context, legacy bool) { + mockDocker := &mocks.Docker{} + docker.Client = mockDocker + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{ + { + ID: docker.FlyteSandboxClusterName, + Names: []string{ + docker.FlyteSandboxClusterName, + }, + }, + }, nil) + + // This first set of mocks is for the check for the bootstrap agent. This is + // Expected to fail in legacy sandboxes + var checkLegacySandboxExecExitCode int + if legacy { + checkLegacySandboxExecExitCode = 1 + } + mockDocker.OnContainerExecCreateMatch( + ctx, + docker.FlyteSandboxClusterName, + types.ExecConfig{ + AttachStderr: true, + Tty: true, + WorkingDir: "/", + AttachStdout: true, + Cmd: []string{"sh", "-c", fmt.Sprintf("which %s > /dev/null", internalBootstrapAgent)}, + }, + ).Return(types.IDResponse{ID: "0"}, nil) + mockDocker.OnContainerExecAttachMatch(ctx, "0", types.ExecStartCheck{}).Return(types.HijackedResponse{ + Reader: bufio.NewReader(bytes.NewReader([]byte{})), + }, nil) + mockDocker.OnContainerExecInspectMatch(ctx, "0").Return(types.ContainerExecInspect{ExitCode: checkLegacySandboxExecExitCode}, nil) + + // Register additional mocks for the actual execution of the bootstrap agent + // in non-legacy sandboxes + if !legacy { + mockDocker.OnContainerExecCreateMatch( + ctx, + docker.FlyteSandboxClusterName, + types.ExecConfig{ + AttachStderr: true, + Tty: true, + WorkingDir: "/", + AttachStdout: true, + Cmd: []string{internalBootstrapAgent}, + }, + ).Return(types.IDResponse{ID: "1"}, nil) + mockDocker.OnContainerExecAttachMatch(ctx, "1", types.ExecStartCheck{}).Return(types.HijackedResponse{ + Reader: bufio.NewReader(bytes.NewReader([]byte{})), + }, nil) + } +} + +func TestReloadLegacy(t *testing.T) { ctx := context.Background() commandCtx := cmdCore.CommandContext{} + sandboxSetup(ctx, false) + err := reloadDemoCluster(ctx, []string{}, commandCtx) + assert.Nil(t, err) +} +func TestDemoReloadLegacy(t *testing.T) { + ctx := context.Background() + commandCtx := cmdCore.CommandContext{} + sandboxSetup(ctx, true) t.Run("No errors", func(t *testing.T) { client := testclient.NewSimpleClientset() _, err := client.CoreV1().Pods("flyte").Create(ctx, &fakePod, v1.CreateOptions{}) diff --git a/flytectl/cmd/demo/teardown.go b/flytectl/cmd/demo/teardown.go index 399a904ab7..2fc59769be 100644 --- a/flytectl/cmd/demo/teardown.go +++ b/flytectl/cmd/demo/teardown.go @@ -3,10 +3,10 @@ package demo import ( "context" - "github.com/flyteorg/flytectl/pkg/sandbox" - "github.com/flyteorg/flytectl/pkg/docker" + "github.com/flyteorg/flytectl/pkg/sandbox" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" ) @@ -28,5 +28,5 @@ func teardownDemoCluster(ctx context.Context, args []string, cmdCtx cmdCore.Comm if err != nil { return err } - return sandbox.Teardown(ctx, cli) + return sandbox.Teardown(ctx, cli, sandboxCmdConfig.DefaultTeardownFlags) } diff --git a/flytectl/cmd/demo/teardown_test.go b/flytectl/cmd/demo/teardown_test.go index 34a25f23f5..cfe8bcfea7 100644 --- a/flytectl/cmd/demo/teardown_test.go +++ b/flytectl/cmd/demo/teardown_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/docker/docker/api/types" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/configutil" "github.com/flyteorg/flytectl/pkg/docker" @@ -29,7 +30,7 @@ func TestTearDownFunc(t *testing.T) { } containers = append(containers, container1) - t.Run("Success", func(t *testing.T) { + t.Run("SuccessKeepVolume", func(t *testing.T) { ctx := context.Background() mockDocker := &mocks.Docker{} mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) @@ -37,23 +38,39 @@ func TestTearDownFunc(t *testing.T) { mockK8sContextMgr := &k8sMocks.ContextOps{} k8s.ContextMgr = mockK8sContextMgr mockK8sContextMgr.OnRemoveContextMatch(mock.Anything).Return(nil) - err := sandbox.Teardown(ctx, mockDocker) + err := sandbox.Teardown(ctx, mockDocker, sandboxCmdConfig.DefaultTeardownFlags) assert.Nil(t, err) }) - t.Run("Error", func(t *testing.T) { + t.Run("SuccessRemoveVolume", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) + mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) + mockDocker.OnVolumeRemove(ctx, docker.FlyteSandboxVolumeName, true).Return(nil) + mockK8sContextMgr := &k8sMocks.ContextOps{} + k8s.ContextMgr = mockK8sContextMgr + mockK8sContextMgr.OnRemoveContextMatch(mock.Anything).Return(nil) + err := sandbox.Teardown( + ctx, + mockDocker, + &sandboxCmdConfig.TeardownFlags{Volume: true}, + ) + assert.Nil(t, err) + }) + t.Run("ErrorOnContainerRemove", func(t *testing.T) { ctx := context.Background() mockDocker := &mocks.Docker{} mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("err")) - err := sandbox.Teardown(ctx, mockDocker) + err := sandbox.Teardown(ctx, mockDocker, sandboxCmdConfig.DefaultTeardownFlags) assert.NotNil(t, err) }) - t.Run("Error", func(t *testing.T) { + t.Run("ErrorOnContainerList", func(t *testing.T) { ctx := context.Background() mockDocker := &mocks.Docker{} mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(nil, fmt.Errorf("err")) - err := sandbox.Teardown(ctx, mockDocker) + err := sandbox.Teardown(ctx, mockDocker, sandboxCmdConfig.DefaultTeardownFlags) assert.NotNil(t, err) }) diff --git a/flytectl/cmd/sandbox/teardown.go b/flytectl/cmd/sandbox/teardown.go index 4e209a19c1..4b2fcd0469 100644 --- a/flytectl/cmd/sandbox/teardown.go +++ b/flytectl/cmd/sandbox/teardown.go @@ -6,6 +6,7 @@ import ( "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/sandbox" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" cmdCore "github.com/flyteorg/flytectl/cmd/core" ) @@ -27,5 +28,5 @@ func teardownSandboxCluster(ctx context.Context, args []string, cmdCtx cmdCore.C if err != nil { return err } - return sandbox.Teardown(ctx, cli) + return sandbox.Teardown(ctx, cli, sandboxCmdConfig.DefaultTeardownFlags) } diff --git a/flytectl/pkg/docker/docker.go b/flytectl/pkg/docker/docker.go index 46ea3ea141..9d3ccb4efe 100644 --- a/flytectl/pkg/docker/docker.go +++ b/flytectl/pkg/docker/docker.go @@ -6,7 +6,9 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/network" + "github.com/docker/docker/api/types/volume" "github.com/docker/docker/client" specs "github.com/opencontainers/image-spec/specs-go/v1" ) @@ -27,6 +29,9 @@ type Docker interface { ImageList(ctx context.Context, listOption types.ImageListOptions) ([]types.ImageSummary, error) ContainerStatPath(ctx context.Context, containerID, path string) (types.ContainerPathStat, error) CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) + VolumeCreate(ctx context.Context, options volume.VolumeCreateBody) (types.Volume, error) + VolumeList(ctx context.Context, filter filters.Args) (volume.VolumeListOKBody, error) + VolumeRemove(ctx context.Context, volumeID string, force bool) error } type FlyteDocker struct { diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index cf8901e558..221fb32eab 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -16,7 +16,9 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/mount" + "github.com/docker/docker/api/types/volume" "github.com/docker/docker/pkg/stdcopy" "github.com/docker/go-connections/nat" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" @@ -24,17 +26,20 @@ import ( ) var ( - FlyteStateDir = f.FilePathJoin(f.UserHomeDir(), ".flyte", "state") - Kubeconfig = f.FilePathJoin(FlyteStateDir, "kubeconfig") - SandboxKubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") - SuccessMessage = "Deploying Flyte..." - FlyteSandboxClusterName = "flyte-sandbox" - Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} - Source = "/root" - StateDirMountDest = "/srv/flyte" - K3sDir = "/etc/rancher/" - Client Docker - Volumes = []mount.Mount{ + FlyteSandboxConfigDir = f.FilePathJoin(f.UserHomeDir(), ".flyte", "sandbox") + Kubeconfig = f.FilePathJoin(FlyteSandboxConfigDir, "kubeconfig") + SandboxKubeconfig = f.FilePathJoin(f.UserHomeDir(), ".flyte", "k3s", "k3s.yaml") + SuccessMessage = "Deploying Flyte..." + FlyteSandboxClusterName = "flyte-sandbox" + FlyteSandboxVolumeName = "flyte-sandbox" + FlyteSandboxInternalDir = "/var/lib/flyte" + FlyteSandboxInternalConfigDir = f.FilePathJoin(FlyteSandboxInternalDir, "config") + FlyteSandboxInternalStorageDir = f.FilePathJoin(FlyteSandboxInternalDir, "storage") + Environment = []string{"SANDBOX=1", "KUBERNETES_API_PORT=30086", "FLYTE_HOST=localhost:30081", "FLYTE_AWS_ENDPOINT=http://localhost:30084"} + Source = "/root" + K3sDir = "/etc/rancher/" + Client Docker + Volumes = []mount.Mount{ { Type: mount.TypeBind, Source: f.FilePathJoin(f.UserHomeDir(), ".flyte"), @@ -44,7 +49,7 @@ var ( ExecConfig = types.ExecConfig{ AttachStderr: true, Tty: true, - WorkingDir: Source, + WorkingDir: "/", AttachStdout: true, Cmd: []string{}, } @@ -75,7 +80,7 @@ func GetSandbox(ctx context.Context, cli Docker) (*types.Container, error) { return nil, err } for _, v := range containers { - if strings.Contains(v.Names[0], FlyteSandboxClusterName) { + if strings.TrimLeft(v.Names[0], "/") == FlyteSandboxClusterName { return &v, nil } } @@ -339,3 +344,37 @@ func InspectExecResp(ctx context.Context, cli Docker, containerID string) error } return nil } + +func PrintCreateVolume(name string) { + fmt.Printf("%v Run the following command to create a volume\n", emoji.Sparkle) + fmt.Printf(" docker volume create %v\n", name) +} + +func GetOrCreateVolume( + ctx context.Context, cli Docker, volumeName string, dryRun bool, +) (*types.Volume, error) { + if dryRun { + PrintCreateVolume(volumeName) + return nil, nil + } + + resp, err := cli.VolumeList(ctx, filters.NewArgs( + filters.KeyValuePair{Key: "name", Value: fmt.Sprintf("^%s$", volumeName)}, + )) + if err != nil { + return nil, err + } + switch len(resp.Volumes) { + case 0: + v, err := cli.VolumeCreate(ctx, volume.VolumeCreateBody{Name: volumeName}) + if err != nil { + return nil, err + } + return &v, nil + case 1: + return resp.Volumes[0], nil + default: + // We don't expect to ever arrive at this point + return nil, fmt.Errorf("unexpected error - found multiple volumes with name: %s", volumeName) + } +} diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 79e7dae72e..f1b8f7b33a 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -14,6 +14,8 @@ import ( f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/volume" "github.com/flyteorg/flytectl/pkg/docker/mocks" "github.com/stretchr/testify/mock" @@ -375,6 +377,31 @@ func TestInspectExecResp(t *testing.T) { } +func TestGetOrCreateVolume(t *testing.T) { + t.Run("VolumeExists", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + expected := &types.Volume{Name: "test"} + + mockDocker.OnVolumeList(ctx, filters.NewArgs(filters.KeyValuePair{Key: "name", Value: "^test$"})).Return(volume.VolumeListOKBody{Volumes: []*types.Volume{expected}}, nil) + actual, err := GetOrCreateVolume(ctx, mockDocker, "test", false) + assert.Equal(t, expected, actual, "volumes should match") + assert.Nil(t, err) + }) + t.Run("VolumeDoesNotExist", func(t *testing.T) { + ctx := context.Background() + mockDocker := &mocks.Docker{} + expected := types.Volume{Name: "test"} + + mockDocker.OnVolumeList(ctx, filters.NewArgs(filters.KeyValuePair{Key: "name", Value: "^test$"})).Return(volume.VolumeListOKBody{Volumes: []*types.Volume{}}, nil) + mockDocker.OnVolumeCreate(ctx, volume.VolumeCreateBody{Name: "test"}).Return(expected, nil) + actual, err := GetOrCreateVolume(ctx, mockDocker, "test", false) + assert.Equal(t, expected, *actual, "volumes should match") + assert.Nil(t, err) + }) + +} + func TestDemoPorts(t *testing.T) { _, ports, _ := GetDemoPorts() assert.Equal(t, 5, len(ports)) diff --git a/flytectl/pkg/docker/mocks/docker.go b/flytectl/pkg/docker/mocks/docker.go index a2ddc27cb7..b5361fc957 100644 --- a/flytectl/pkg/docker/mocks/docker.go +++ b/flytectl/pkg/docker/mocks/docker.go @@ -7,6 +7,8 @@ import ( container "github.com/docker/docker/api/types/container" + filters "github.com/docker/docker/api/types/filters" + io "io" mock "github.com/stretchr/testify/mock" @@ -16,6 +18,8 @@ import ( types "github.com/docker/docker/api/types" v1 "github.com/opencontainers/image-spec/specs-go/v1" + + volume "github.com/docker/docker/api/types/volume" ) // Docker is an autogenerated mock type for the Docker type @@ -536,3 +540,113 @@ func (_m *Docker) ImagePull(ctx context.Context, refStr string, options types.Im return r0, r1 } + +type Docker_VolumeCreate struct { + *mock.Call +} + +func (_m Docker_VolumeCreate) Return(_a0 types.Volume, _a1 error) *Docker_VolumeCreate { + return &Docker_VolumeCreate{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnVolumeCreate(ctx context.Context, options volume.VolumeCreateBody) *Docker_VolumeCreate { + c_call := _m.On("VolumeCreate", ctx, options) + return &Docker_VolumeCreate{Call: c_call} +} + +func (_m *Docker) OnVolumeCreateMatch(matchers ...interface{}) *Docker_VolumeCreate { + c_call := _m.On("VolumeCreate", matchers...) + return &Docker_VolumeCreate{Call: c_call} +} + +// VolumeCreate provides a mock function with given fields: ctx, options +func (_m *Docker) VolumeCreate(ctx context.Context, options volume.VolumeCreateBody) (types.Volume, error) { + ret := _m.Called(ctx, options) + + var r0 types.Volume + if rf, ok := ret.Get(0).(func(context.Context, volume.VolumeCreateBody) types.Volume); ok { + r0 = rf(ctx, options) + } else { + r0 = ret.Get(0).(types.Volume) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, volume.VolumeCreateBody) error); ok { + r1 = rf(ctx, options) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type Docker_VolumeList struct { + *mock.Call +} + +func (_m Docker_VolumeList) Return(_a0 volume.VolumeListOKBody, _a1 error) *Docker_VolumeList { + return &Docker_VolumeList{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *Docker) OnVolumeList(ctx context.Context, filter filters.Args) *Docker_VolumeList { + c_call := _m.On("VolumeList", ctx, filter) + return &Docker_VolumeList{Call: c_call} +} + +func (_m *Docker) OnVolumeListMatch(matchers ...interface{}) *Docker_VolumeList { + c_call := _m.On("VolumeList", matchers...) + return &Docker_VolumeList{Call: c_call} +} + +// VolumeList provides a mock function with given fields: ctx, filter +func (_m *Docker) VolumeList(ctx context.Context, filter filters.Args) (volume.VolumeListOKBody, error) { + ret := _m.Called(ctx, filter) + + var r0 volume.VolumeListOKBody + if rf, ok := ret.Get(0).(func(context.Context, filters.Args) volume.VolumeListOKBody); ok { + r0 = rf(ctx, filter) + } else { + r0 = ret.Get(0).(volume.VolumeListOKBody) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, filters.Args) error); ok { + r1 = rf(ctx, filter) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type Docker_VolumeRemove struct { + *mock.Call +} + +func (_m Docker_VolumeRemove) Return(_a0 error) *Docker_VolumeRemove { + return &Docker_VolumeRemove{Call: _m.Call.Return(_a0)} +} + +func (_m *Docker) OnVolumeRemove(ctx context.Context, volumeID string, force bool) *Docker_VolumeRemove { + c_call := _m.On("VolumeRemove", ctx, volumeID, force) + return &Docker_VolumeRemove{Call: c_call} +} + +func (_m *Docker) OnVolumeRemoveMatch(matchers ...interface{}) *Docker_VolumeRemove { + c_call := _m.On("VolumeRemove", matchers...) + return &Docker_VolumeRemove{Call: c_call} +} + +// VolumeRemove provides a mock function with given fields: ctx, volumeID, force +func (_m *Docker) VolumeRemove(ctx context.Context, volumeID string, force bool) error { + ret := _m.Called(ctx, volumeID, force) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, bool) error); ok { + r0 = rf(ctx, volumeID, force) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index f7ac5ed9e9..744bc0a923 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -39,7 +39,7 @@ const ( sandboxImageName = "cr.flyte.org/flyteorg/flyte-sandbox" demoImageName = "cr.flyte.org/flyteorg/flyte-sandbox-bundled" DefaultFlyteConfig = "/opt/flyte/defaults.flyte.yaml" - k3sKubeConfigEnvVar = "K3S_KUBECONFIG_OUTPUT=/srv/flyte/kubeconfig" + k3sKubeConfigEnvVar = "K3S_KUBECONFIG_OUTPUT=/var/lib/flyte/config/kubeconfig" ) func isNodeTainted(ctx context.Context, client corev1.CoreV1Interface) (bool, error) { @@ -184,11 +184,11 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService volumes = append(volumes, *vol) } - // This is the state directory mount, flyte will write the kubeconfig here. May hold more in future releases + // This is the sandbox configuration directory mount, flyte will write the kubeconfig here. May hold more in future releases // To be interoperable with the old sandbox, only mount if the directory exists, should've created by StartCluster - if fileInfo, err := os.Stat(docker.FlyteStateDir); err == nil { + if fileInfo, err := os.Stat(docker.FlyteSandboxConfigDir); err == nil { if fileInfo.IsDir() { - if vol, err := MountVolume(docker.FlyteStateDir, docker.StateDirMountDest); err != nil { + if vol, err := MountVolume(docker.FlyteSandboxConfigDir, docker.FlyteSandboxInternalConfigDir); err != nil { return nil, err } else if vol != nil { volumes = append(volumes, *vol) @@ -196,6 +196,22 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService } } + // Create and mount a docker volume that will be used to persist data + // across sandbox clusters + if _, err := docker.GetOrCreateVolume( + ctx, + cli, + docker.FlyteSandboxVolumeName, + sandboxConfig.DryRun, + ); err != nil { + return nil, err + } + volumes = append(volumes, mount.Mount{ + Type: mount.TypeVolume, + Source: docker.FlyteSandboxVolumeName, + Target: docker.FlyteSandboxInternalStorageDir, + }) + sandboxImage := sandboxConfig.Image if len(sandboxImage) == 0 { image, version, err := github.GetFullyQualifiedImageName(defaultImagePrefix, sandboxConfig.Version, defaultImageName, sandboxConfig.Prerelease, g) diff --git a/flytectl/pkg/sandbox/start_test.go b/flytectl/pkg/sandbox/start_test.go index 7bc204ac34..a09797d363 100644 --- a/flytectl/pkg/sandbox/start_test.go +++ b/flytectl/pkg/sandbox/start_test.go @@ -19,6 +19,8 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/volume" sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" "github.com/google/go-github/v42/github" "github.com/stretchr/testify/assert" @@ -86,6 +88,8 @@ func sandboxSetup() { bodyStatus := make(chan container.ContainerWaitOKBody) githubMock = &ghMocks.GHRepoService{} sandboxCmdConfig.DefaultConfig.Image = "dummyimage" + mockDocker.OnVolumeList(ctx, filters.NewArgs(filters.KeyValuePair{Key: "name", Value: fmt.Sprintf("^%s$", docker.FlyteSandboxVolumeName)})).Return(volume.VolumeListOKBody{Volumes: []*types.Volume{}}, nil) + mockDocker.OnVolumeCreate(ctx, volume.VolumeCreateBody{Name: docker.FlyteSandboxVolumeName}).Return(types.Volume{Name: docker.FlyteSandboxVolumeName}, nil) mockDocker.OnContainerCreateMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(container.ContainerCreateCreatedBody{ ID: "Hello", }, nil) @@ -119,7 +123,8 @@ func TestStartFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(nil, nil) - + mockDocker.OnVolumeList(ctx, filters.NewArgs(filters.KeyValuePair{Key: mock.Anything, Value: mock.Anything})).Return(volume.VolumeListOKBody{Volumes: []*types.Volume{}}, nil) + mockDocker.OnVolumeCreate(ctx, volume.VolumeCreateBody{Name: mock.Anything}).Return(types.Volume{}, nil) _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.Nil(t, err) }) @@ -295,7 +300,6 @@ func TestStartFunc(t *testing.T) { mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) mockDocker.OnImagePullMatch(mock.Anything, mock.Anything, mock.Anything).Return(os.Stdin, nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - stringReader := strings.NewReader(docker.SuccessMessage) reader := ioutil.NopCloser(stringReader) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ diff --git a/flytectl/pkg/sandbox/teardown.go b/flytectl/pkg/sandbox/teardown.go index 633d026833..3881617db6 100644 --- a/flytectl/pkg/sandbox/teardown.go +++ b/flytectl/pkg/sandbox/teardown.go @@ -6,12 +6,13 @@ import ( "github.com/docker/docker/api/types" "github.com/enescakir/emoji" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" "github.com/flyteorg/flytectl/pkg/configutil" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/k8s" ) -func Teardown(ctx context.Context, cli docker.Docker) error { +func Teardown(ctx context.Context, cli docker.Docker, teardownFlags *sandboxCmdConfig.TeardownFlags) error { c, err := docker.GetSandbox(ctx, cli) if err != nil { return err @@ -24,12 +25,19 @@ func Teardown(ctx context.Context, cli docker.Docker) error { } } if err := configutil.ConfigCleanup(); err != nil { - fmt.Printf("Config cleanup failed. Which Failed due to %v \n ", err) + fmt.Printf("Config cleanup failed. Which Failed due to %v\n", err) } if err := removeSandboxKubeContext(); err != nil { - fmt.Printf("Kubecontext cleanup failed. Which Failed due to %v \n ", err) + fmt.Printf("Kubecontext cleanup failed. Which Failed due to %v\n", err) } - fmt.Printf("%v %v Sandbox cluster is removed successfully. \n", emoji.Broom, emoji.Broom) + // Teardown volume if option is specified + if teardownFlags.Volume { + if err := cli.VolumeRemove(ctx, docker.FlyteSandboxVolumeName, true); err != nil { + fmt.Printf("Volume cleanup failed. Which Failed due to %v\n", err) + } + } + + fmt.Printf("%v %v Sandbox cluster is removed successfully.\n", emoji.Broom, emoji.Broom) return nil } diff --git a/flytectl/pkg/sandbox/teardown_test.go b/flytectl/pkg/sandbox/teardown_test.go index 9047ee7614..3f3702c9ad 100644 --- a/flytectl/pkg/sandbox/teardown_test.go +++ b/flytectl/pkg/sandbox/teardown_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/docker/docker/api/types" + sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/docker/mocks" "github.com/flyteorg/flytectl/pkg/k8s" @@ -28,12 +29,12 @@ func TestTearDownFunc(t *testing.T) { mockDocker := &mocks.Docker{} mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(containers, nil) mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("err")) - err := Teardown(ctx, mockDocker) + err := Teardown(ctx, mockDocker, sandboxCmdConfig.DefaultTeardownFlags) assert.NotNil(t, err) mockDocker = &mocks.Docker{} mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return(nil, fmt.Errorf("err")) - err = Teardown(ctx, mockDocker) + err = Teardown(ctx, mockDocker, sandboxCmdConfig.DefaultTeardownFlags) assert.NotNil(t, err) mockDocker = &mocks.Docker{} @@ -42,7 +43,7 @@ func TestTearDownFunc(t *testing.T) { mockK8sContextMgr := &k8sMocks.ContextOps{} mockK8sContextMgr.OnRemoveContext(mock.Anything).Return(nil) k8s.ContextMgr = mockK8sContextMgr - err = Teardown(ctx, mockDocker) + err = Teardown(ctx, mockDocker, sandboxCmdConfig.DefaultTeardownFlags) assert.Nil(t, err) } diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index ece882279a..a851ac4e9d 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -11,7 +11,6 @@ import ( "github.com/flyteorg/flytectl/pkg/configutil" "github.com/flyteorg/flytectl/pkg/docker" - f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/enescakir/emoji" hversion "github.com/hashicorp/go-version" @@ -57,7 +56,7 @@ func CreatePathAndFile(pathToConfig string) error { // SetupFlyteDir will create .flyte dir if not exist func SetupFlyteDir() error { - if err := os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "state"), os.ModePerm); err != nil { + if err := os.MkdirAll(docker.FlyteSandboxConfigDir, os.ModePerm); err != nil { return err } From 9e3af15dd3924732a0331490e0cc88a33e5dc683 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Sat, 11 Feb 2023 10:59:48 -0800 Subject: [PATCH 298/645] Recognize windows arm as a valid OS+arch combination (#386) Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- flytectl/install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/flytectl/install.sh b/flytectl/install.sh index 57860ba297..1110e4e737 100755 --- a/flytectl/install.sh +++ b/flytectl/install.sh @@ -68,6 +68,7 @@ get_binaries() { linux/arm64) BINARIES="flytectl" ;; windows/386) BINARIES="flytectl" ;; windows/amd64) BINARIES="flytectl" ;; + windows/arm64) BINARIES="flytectl" ;; *) log_crit "platform $PLATFORM is not supported. Make sure this script is up-to-date and file request at https://github.com/${PREFIX}/issues/new" exit 1 From ce18a96e5111d27d67257d76b7c94c33eb2bd779 Mon Sep 17 00:00:00 2001 From: Eng Zer Jun Date: Tue, 14 Feb 2023 09:13:59 +0800 Subject: [PATCH 299/645] refactor: remove redundant YAML packages (#387) At the time of making this commit, the package `github.com/ghodss/yaml` is no longer actively maintained. `sigs.k8s.io/yaml` is a permanent fork of `ghodss/yaml` and is actively maintained by Kubernetes SIG. Signed-off-by: Eng Zer Jun --- .../config/subcommand/project/project_config.go | 4 ++-- flytectl/go.mod | 17 +++++++---------- flytectl/go.sum | 6 ++++-- flytectl/pkg/printer/printer.go | 5 ++--- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go index 0cf927f67a..8fa34ff6a5 100644 --- a/flytectl/cmd/config/subcommand/project/project_config.go +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -5,10 +5,10 @@ import ( "io/ioutil" "github.com/flyteorg/flytectl/clierrors" - "github.com/flyteorg/flytectl/pkg/filters" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "gopkg.in/yaml.v2" + + "gopkg.in/yaml.v3" ) //go:generate pflags Config --default-var DefaultConfig --bind-default-var diff --git a/flytectl/go.mod b/flytectl/go.mod index 7204ca0e6b..4c82429e98 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -3,14 +3,15 @@ module github.com/flyteorg/flytectl go 1.19 require ( + github.com/avast/retry-go v3.0.0+incompatible github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/disiqueira/gotree v1.0.0 github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 github.com/flyteorg/flyteidl v1.3.5 + github.com/flyteorg/flytepropeller v1.1.1 github.com/flyteorg/flytestdlib v1.0.13 - github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 github.com/golang/protobuf v1.5.2 github.com/google/go-github/v42 v42.0.0 @@ -30,21 +31,15 @@ require ( github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 github.com/zalando/go-keyring v0.1.1 golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 + golang.org/x/text v0.3.7 google.golang.org/grpc v1.46.0 google.golang.org/protobuf v1.28.0 - gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b + gopkg.in/yaml.v3 v3.0.1 gotest.tools v2.2.0+incompatible k8s.io/api v0.21.3 k8s.io/apimachinery v0.21.3 k8s.io/client-go v0.21.3 - sigs.k8s.io/yaml v1.2.0 -) - -require ( - github.com/avast/retry-go v3.0.0+incompatible - github.com/flyteorg/flytepropeller v1.1.1 - golang.org/x/text v0.3.7 + sigs.k8s.io/yaml v1.3.0 ) require ( @@ -81,6 +76,7 @@ require ( github.com/flyteorg/flyteplugins v1.0.0 // indirect github.com/flyteorg/stow v0.3.6 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/ghodss/yaml v1.0.0 // indirect github.com/go-logr/logr v0.4.0 // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect github.com/gofrs/uuid v4.2.0+incompatible // indirect @@ -143,6 +139,7 @@ require ( google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/klog/v2 v2.8.0 // indirect k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index ef5c6c7dc3..196a6544a0 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -1825,8 +1825,9 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/gorm v1.22.4/go.mod h1:1aeVC+pe9ZmvKZban/gW4QPra7PRoTEssyc922qCAkk= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= @@ -1960,7 +1961,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= volcano.sh/apis v1.2.0-k8s1.19.6/go.mod h1:UaeJ/s5Hyd+ZhFLc+Kw9YlgM8gRZ/5OzXqHa0yKOoXY= diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index f231c32baf..f1b23d92a8 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -9,19 +9,18 @@ import ( "sort" "strings" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flytectl/pkg/visualize" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytestdlib/errors" - "github.com/ghodss/yaml" "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" "github.com/kataras/tablewriter" "github.com/landoop/tableprinter" "github.com/pkg/browser" "github.com/yalp/jsonpath" + "sigs.k8s.io/yaml" ) //go:generate enumer --type=OutputFormat -json -yaml -trimprefix=OutputFormat From 5f9a2fb16ba848692c6f7c337fa0954a49258388 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Wed, 22 Feb 2023 11:45:14 -0800 Subject: [PATCH 300/645] Adding support for structured dataset and also for node outputs in details flag (#390) * Adding support for structured dataset and also for node outputs in details flag Signed-off-by: pmahindrakar-oss * using released idl Signed-off-by: pmahindrakar-oss --------- Signed-off-by: pmahindrakar-oss --- flytectl/cmd/get/node_execution.go | 8 ++++++++ flytectl/go.mod | 2 +- flytectl/go.sum | 7 ++----- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/flytectl/cmd/get/node_execution.go b/flytectl/cmd/get/node_execution.go index 8700272c0f..61695ece53 100644 --- a/flytectl/cmd/get/node_execution.go +++ b/flytectl/cmd/get/node_execution.go @@ -3,6 +3,7 @@ package get import ( "bytes" "context" + "fmt" "sort" "strconv" @@ -37,6 +38,7 @@ const ( taskExtResourceTokenPrefix = "Ext Resource Token : " //nolint taskResourcePrefix = "Resource Pool Info" taskLogsPrefix = "Logs :" + outputsPrefix = "Outputs :" taskLogsNamePrefix = "Name :" taskLogURIPrefix = "URI :" hyphenPrefix = " - " @@ -249,6 +251,12 @@ func createNodeDetailsTreeView(rootView gotree.Tree, nodeExecutionClosures []*No createNodeDetailsTreeView(nExecView, nodeExecWrapper.ChildNodes) } createNodeTaskExecTreeView(nExecView, nodeExecWrapper.TaskExecutions) + if len(nodeExecWrapper.Outputs) > 0 { + outputsView := nExecView.Add(outputsPrefix) + for outputKey, outputVal := range nodeExecWrapper.Outputs { + outputsView.Add(fmt.Sprintf("%s: %v", outputKey, outputVal)) + } + } } return rootView } diff --git a/flytectl/go.mod b/flytectl/go.mod index 4c82429e98..a6c1a397ec 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.3.5 + github.com/flyteorg/flyteidl v1.3.8 github.com/flyteorg/flytepropeller v1.1.1 github.com/flyteorg/flytestdlib v1.0.13 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 196a6544a0..3c52c3091f 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -445,8 +445,8 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.3.5 h1:rSaWMndeENr0QxRKj02kp6N/qQdbgDwpFeZsZbvU45A= -github.com/flyteorg/flyteidl v1.3.5/go.mod h1:OJAq333OpInPnMhvVz93AlEjmlQ+t0FAD4aakIYE4OU= +github.com/flyteorg/flyteidl v1.3.8 h1:3/7P/I2VpNNrLTw95kLge1IEyPGXPIgenw2itiuSPh0= +github.com/flyteorg/flyteidl v1.3.8/go.mod h1:Pkt2skI1LiHs/2ZoekBnyPhuGOFMiuul6HHcKGZBsbM= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= @@ -749,7 +749,6 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= -github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -1135,7 +1134,6 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/vektra/mockery v1.1.2/go.mod h1:VcfZjKaFOPO+MpN4ZvwPjs4c48lkq1o3Ym8yHZJu0jU= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= @@ -1554,7 +1552,6 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200323144430-8dcfad9e016e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= From a0a2fc2788006ed58e7f4bab07ce334e47abcd3c Mon Sep 17 00:00:00 2001 From: Honnix Date: Tue, 7 Mar 2023 01:32:19 +0100 Subject: [PATCH 301/645] Remove go as dependency of brew formula (#395) Signed-off-by: Honnix --- flytectl/.goreleaser.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/flytectl/.goreleaser.yml b/flytectl/.goreleaser.yml index 17e2499506..cb93a7fb2f 100644 --- a/flytectl/.goreleaser.yml +++ b/flytectl/.goreleaser.yml @@ -84,6 +84,3 @@ brews: # Default is false. skip_upload: auto - - dependencies: - - name: go From 083cdbd84309b5313e195c67cfb7c56d8be8c7a4 Mon Sep 17 00:00:00 2001 From: pmahindrakar-oss Date: Wed, 8 Mar 2023 04:13:52 +0530 Subject: [PATCH 302/645] Doc updates (#398) Signed-off-by: pmahindrakar-oss --- flytectl/docs/source/demo.rst | 1 + flytectl/docs/source/gen/flytectl.rst | 120 +++++++------- flytectl/docs/source/gen/flytectl_compile.rst | 118 +++++++------- .../docs/source/gen/flytectl_completion.rst | 118 +++++++------- flytectl/docs/source/gen/flytectl_config.rst | 118 +++++++------- .../source/gen/flytectl_config_discover.rst | 122 +++++++------- .../docs/source/gen/flytectl_config_docs.rst | 122 +++++++------- .../docs/source/gen/flytectl_config_init.rst | 136 ++++++++-------- .../source/gen/flytectl_config_validate.rst | 122 +++++++------- flytectl/docs/source/gen/flytectl_create.rst | 118 +++++++------- .../source/gen/flytectl_create_execution.rst | 149 ++++++++++-------- .../source/gen/flytectl_create_project.rst | 118 +++++++------- flytectl/docs/source/gen/flytectl_delete.rst | 118 +++++++------- ...ectl_delete_cluster-resource-attribute.rst | 118 +++++++------- ...lytectl_delete_execution-cluster-label.rst | 118 +++++++------- ...tectl_delete_execution-queue-attribute.rst | 118 +++++++------- .../source/gen/flytectl_delete_execution.rst | 134 ++++++++-------- .../gen/flytectl_delete_plugin-override.rst | 118 +++++++------- ...lytectl_delete_task-resource-attribute.rst | 118 +++++++------- ...tectl_delete_workflow-execution-config.rst | 118 +++++++------- flytectl/docs/source/gen/flytectl_demo.rst | 119 +++++++------- .../docs/source/gen/flytectl_demo_exec.rst | 118 +++++++------- .../docs/source/gen/flytectl_demo_reload.rst | 116 ++++++++++++++ .../docs/source/gen/flytectl_demo_start.rst | 134 +++++++++------- .../docs/source/gen/flytectl_demo_status.rst | 118 +++++++------- .../source/gen/flytectl_demo_teardown.rst | 121 +++++++------- flytectl/docs/source/gen/flytectl_get.rst | 118 +++++++------- ...lytectl_get_cluster-resource-attribute.rst | 118 +++++++------- .../flytectl_get_execution-cluster-label.rst | 118 +++++++------- ...flytectl_get_execution-queue-attribute.rst | 118 +++++++------- .../source/gen/flytectl_get_execution.rst | 118 +++++++------- .../source/gen/flytectl_get_launchplan.rst | 123 ++++++++------- .../gen/flytectl_get_plugin-override.rst | 118 +++++++------- .../docs/source/gen/flytectl_get_project.rst | 118 +++++++------- .../flytectl_get_task-resource-attribute.rst | 118 +++++++------- .../docs/source/gen/flytectl_get_task.rst | 118 +++++++------- ...flytectl_get_workflow-execution-config.rst | 118 +++++++------- .../docs/source/gen/flytectl_get_workflow.rst | 118 +++++++------- .../docs/source/gen/flytectl_register.rst | 118 +++++++------- .../source/gen/flytectl_register_examples.rst | 118 +++++++------- .../source/gen/flytectl_register_files.rst | 118 +++++++------- flytectl/docs/source/gen/flytectl_sandbox.rst | 124 ++++++++------- .../docs/source/gen/flytectl_sandbox_exec.rst | 118 +++++++------- .../source/gen/flytectl_sandbox_start.rst | 122 +++++++------- .../source/gen/flytectl_sandbox_status.rst | 118 +++++++------- .../source/gen/flytectl_sandbox_teardown.rst | 118 +++++++------- flytectl/docs/source/gen/flytectl_update.rst | 118 +++++++------- ...ectl_update_cluster-resource-attribute.rst | 118 +++++++------- ...lytectl_update_execution-cluster-label.rst | 118 +++++++------- ...tectl_update_execution-queue-attribute.rst | 118 +++++++------- .../source/gen/flytectl_update_execution.rst | 118 +++++++------- .../gen/flytectl_update_launchplan-meta.rst | 118 +++++++------- .../source/gen/flytectl_update_launchplan.rst | 123 ++++++++------- .../gen/flytectl_update_plugin-override.rst | 118 +++++++------- .../source/gen/flytectl_update_project.rst | 118 +++++++------- .../source/gen/flytectl_update_task-meta.rst | 118 +++++++------- ...lytectl_update_task-resource-attribute.rst | 118 +++++++------- ...tectl_update_workflow-execution-config.rst | 118 +++++++------- .../gen/flytectl_update_workflow-meta.rst | 118 +++++++------- flytectl/docs/source/gen/flytectl_upgrade.rst | 118 +++++++------- flytectl/docs/source/gen/flytectl_version.rst | 118 +++++++------- 61 files changed, 3855 insertions(+), 3343 deletions(-) create mode 100644 flytectl/docs/source/gen/flytectl_demo_reload.rst diff --git a/flytectl/docs/source/demo.rst b/flytectl/docs/source/demo.rst index b103d98ff5..ce9a3b00e1 100644 --- a/flytectl/docs/source/demo.rst +++ b/flytectl/docs/source/demo.rst @@ -10,3 +10,4 @@ These are the actions which can be performed on the 'demo' resource. gen/flytectl_demo_status gen/flytectl_demo_teardown gen/flytectl_demo_exec + gen/flytectl_demo_reload diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index 274e087f25..c30c126970 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -16,63 +16,69 @@ Options :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - -h, --help help for flytectl - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + -h, --help help for flytectl + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_compile.rst b/flytectl/docs/source/gen/flytectl_compile.rst index ad2fc9b207..0e1785242f 100644 --- a/flytectl/docs/source/gen/flytectl_compile.rst +++ b/flytectl/docs/source/gen/flytectl_compile.rst @@ -42,62 +42,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index 197129d77a..aedf9442c5 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -89,62 +89,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 7a21b2b490..98b30282d7 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -25,62 +25,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 6937304aa5..092093e469 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -27,64 +27,70 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --file stringArray Passes the config file to load. - If empty, it'll first search for the config file path then, if found, will load config from there. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_config_docs.rst b/flytectl/docs/source/gen/flytectl_config_docs.rst index 390891fc17..b6c9cb869e 100644 --- a/flytectl/docs/source/gen/flytectl_config_docs.rst +++ b/flytectl/docs/source/gen/flytectl_config_docs.rst @@ -27,64 +27,70 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --file stringArray Passes the config file to load. - If empty, it'll first search for the config file path then, if found, will load config from there. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index 46b00cbda4..07cd65bd1c 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -20,7 +20,6 @@ Flyte Sandbox is a fully standalone minimal environment for running Flyte. Read more about the Sandbox deployment :ref:`here `. Generate remote cluster config: - :: flytectl config init --host=flyte.myexample.com @@ -29,11 +28,15 @@ By default, the connection is secure. Read more about remote deployment :ref:`here `. Generate remote cluster config with insecure connection: - :: flytectl config init --host=flyte.myexample.com --insecure + Generate remote cluster config with separate console endpoint: + :: + + flytectl config init --host=flyte.myexample.com --console=console.myexample.com + Generate Flytectl config with a storage provider: :: @@ -49,73 +52,80 @@ Options :: - -h, --help help for init - --host string Endpoint of flyte admin - --insecure Enable insecure mode + --console string Endpoint of console, if different than flyte admin + -h, --help help for init + --host string Endpoint of flyte admin + --insecure Enable insecure mode Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --file stringArray Passes the config file to load. - If empty, it'll first search for the config file path then, if found, will load config from there. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index fef71a32aa..9d9491da9b 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -29,64 +29,70 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --file stringArray Passes the config file to load. - If empty, it'll first search for the config file path then, if found, will load config from there. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --file stringArray Passes the config file to load. + If empty, it'll first search for the config file path then, if found, will load config from there. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index cf6d658bd8..7a28ca97aa 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -28,62 +28,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index c4982a939d..4fdbf89b93 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -63,13 +63,13 @@ It is worth noting that the source's and target's project and domain can be diff flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d staging --targetProject flytesnacks -To relaunch an execution, pass the current execution ID as follows: +4. To relaunch an execution, pass the current execution ID as follows: :: flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytesnacks -d development -To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: +5. To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: :: @@ -77,7 +77,15 @@ To recover an execution, i.e., recreate it from the last known failure point for See :ref:`ref_flyteidl.admin.ExecutionRecoverRequest` for more details. -Generic data types are supported for execution in a similar manner. +6. You can create executions idempotently by naming them. This is also a way to *name* an execution for discovery. Note, +an execution id has to be unique within a project domain. So if the *name* matches an existing execution an already exists exceptioj +will be raised. + +:: + + flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytesnacks -d development custom_name + +7. Generic/Struct/Dataclass/JSON types are supported for execution in a similar manner. The following is an example of how generic data can be specified while creating the execution. :: @@ -97,7 +105,7 @@ The generated file would look similar to this. Here, empty values have been dump task: core.type_system.custom_objects.add version: v3 -Modified file with struct data populated for 'x' and 'y' parameters for the task "core.type_system.custom_objects.add": +8. Modified file with struct data populated for 'x' and 'y' parameters for the task "core.type_system.custom_objects.add": :: @@ -121,7 +129,12 @@ Modified file with struct data populated for 'x' and 'y' parameters for the task task: core.type_system.custom_objects.add version: v3 -Usage +9. If you have configured a plugin that implements github.com/flyteorg/flyteadmin/pkg/workflowengine/interfaces/WorkflowExecutor + that supports cluster pools, then when creating a new execution, you can assign it to a specific cluster pool: + +:: + + flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d development --clusterPool my-gpu-cluster :: @@ -133,15 +146,17 @@ Options :: + --clusterPool string specify which cluster pool to assign execution to. --dryRun execute command without making any modifications. - --execFile string file for the execution params.If not specified defaults to <_name>.execution_spec.yaml + --execFile string file for the execution params. If not specified defaults to <_name>.execution_spec.yaml -h, --help help for execution --iamRoleARN string iam role ARN AuthRole for launching execution. --kubeServiceAcct string kubernetes service account AuthRole for launching execution. + --overwriteCache skip cached results when performing execution, causing all outputs to be re-calculated and stored data to be overwritten. Does not work for recovered executions. --recover string execution id to be recreated from the last known failure point. --relaunch string execution id to be relaunched. - --targetDomain string project where execution needs to be created.If not specified configured domain would be used. - --targetProject string project where execution needs to be created.If not specified configured project would be used. + --targetDomain string project where execution needs to be created. If not specified configured domain would be used. + --targetProject string project where execution needs to be created. If not specified configured project would be used. --task string --version string specify version of execution workflow/task. --workflow string @@ -151,62 +166,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index 68cd30b40e..a8e6b370aa 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -64,62 +64,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index 1be2ff2eff..d338a8618b 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -28,62 +28,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index 8b85c1038b..a8ae5e39ac 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -63,62 +63,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index dc7d898967..92ac7a3b5b 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -60,62 +60,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 54c7eca54d..74c8504ed8 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -64,62 +64,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index b15f4bf245..71577b850b 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -25,11 +25,11 @@ Get an execution to check its state: :: flytectl get execution -d development -p flytesnacks - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | c6a51x2l9e | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:13:04.680476300Z | 15.540361300s | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- Terminate multiple executions with their names: :: @@ -41,15 +41,15 @@ Get an execution to find the state of previously terminated executions: :: flytectl get execution -d development -p flytesnacks - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | NAME (7) | WORKFLOW NAME | TYPE | PHASE | STARTED | ELAPSED TIME | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | c6a51x2l9e | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:13:04.680476300Z | 15.540361300s | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | eeam9s8sny | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:14:04.803084100Z | 42.306385500s | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- | p4wv4hwgc4 | recipes.core.basic.lp.go_greet | WORKFLOW | ABORTED | 2021-02-17T08:14:27.476307400Z | 19.727504400s | - ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- + ------------ ------------------------------------------------------------------------- ---------- ----------- -------------------------------- --------------- Usage @@ -71,62 +71,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index 7d90fbbe23..e2e2d6f426 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -65,62 +65,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 2a0c41edfd..8e3c540585 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -65,62 +65,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index e30e564be7..7678e17fd6 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -63,62 +63,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_demo.rst b/flytectl/docs/source/gen/flytectl_demo.rst index 1ff897a135..904d048264 100644 --- a/flytectl/docs/source/gen/flytectl_demo.rst +++ b/flytectl/docs/source/gen/flytectl_demo.rst @@ -46,68 +46,75 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ * :doc:`flytectl` - Flytectl CLI tool * :doc:`flytectl_demo_exec` - Executes non-interactive command inside the demo container +* :doc:`flytectl_demo_reload` - Power cycle the Flyte executable pod, effectively picking up an updated config. * :doc:`flytectl_demo_start` - Starts the Flyte demo cluster. * :doc:`flytectl_demo_status` - Gets the status of the demo environment. * :doc:`flytectl_demo_teardown` - Cleans up the demo environment diff --git a/flytectl/docs/source/gen/flytectl_demo_exec.rst b/flytectl/docs/source/gen/flytectl_demo_exec.rst index 5f85653189..6b360fbe38 100644 --- a/flytectl/docs/source/gen/flytectl_demo_exec.rst +++ b/flytectl/docs/source/gen/flytectl_demo_exec.rst @@ -35,62 +35,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_demo_reload.rst b/flytectl/docs/source/gen/flytectl_demo_reload.rst new file mode 100644 index 0000000000..09bd874661 --- /dev/null +++ b/flytectl/docs/source/gen/flytectl_demo_reload.rst @@ -0,0 +1,116 @@ +.. _flytectl_demo_reload: + +flytectl demo reload +-------------------- + +Power cycle the Flyte executable pod, effectively picking up an updated config. + +Synopsis +~~~~~~~~ + + + +If you've changed the ~/.flyte/state/flyte.yaml file, run this command to restart the Flyte binary pod, effectively +picking up the new settings: + +Usage +:: + + flytectl demo reload + + + +:: + + flytectl demo reload [flags] + +Options +~~~~~~~ + +:: + + --dev Optional. Only start minio and postgres in the sandbox. + --dryRun Optional. Only print the docker commands to bring up flyte sandbox/demo container.This will still call github api's to get the latest flyte release to use' + --env strings Optional. Provide Env variable in key=value format which can be passed to sandbox container. + -h, --help help for reload + --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. + --imagePullOptions.platform string Forces a specific platform's image to be pulled.' + --imagePullOptions.registryAuth string The base64 encoded credentials for the registry. + --imagePullPolicy ImagePullPolicy Optional. Defines the image pull behavior [Always/IfNotPresent/Never] (default Always) + --pre Optional. Pre release Version of flyte will be used for sandbox. + --source string deprecated, path of your source code, please build images with local daemon + --version string Version of flyte. Only supports flyte releases greater than v0.10.0 + +Options inherited from parent commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + +SEE ALSO +~~~~~~~~ + +* :doc:`flytectl_demo` - Helps with demo interactions like start, teardown, status, and exec. + diff --git a/flytectl/docs/source/gen/flytectl_demo_start.rst b/flytectl/docs/source/gen/flytectl_demo_start.rst index 4c4d62f210..ef1ae5ad90 100644 --- a/flytectl/docs/source/gen/flytectl_demo_start.rst +++ b/flytectl/docs/source/gen/flytectl_demo_start.rst @@ -18,6 +18,11 @@ Starts the demo cluster without any source code: flytectl demo start +Runs a dev cluster, which only has minio and postgres pod. +:: + + flytectl demo start --dev + Mounts your source code repository inside the demo cluster: :: @@ -43,7 +48,7 @@ Runs a specific version of Flyte. Flytectl demo only supports Flyte version avai .. note:: Flytectl demo is only supported for Flyte versions >= v1.0.0 -Runs the latest pre release of Flyte. +Runs the latest pre release of Flyte. :: flytectl demo start --pre @@ -68,6 +73,11 @@ eg : for passing multiple environment variables flytectl demo start --env USER=foo --env PASSWORD=bar +For just printing the docker commands for bringing up the demo container +:: + + flytectl demo start --dryRun + Usage @@ -80,6 +90,8 @@ Options :: + --dev Optional. Only start minio and postgres in the sandbox. + --dryRun Optional. Only print the docker commands to bring up flyte sandbox/demo container.This will still call github api's to get the latest flyte release to use' --env strings Optional. Provide Env variable in key=value format which can be passed to sandbox container. -h, --help help for start --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. @@ -87,7 +99,7 @@ Options --imagePullOptions.registryAuth string The base64 encoded credentials for the registry. --imagePullPolicy ImagePullPolicy Optional. Defines the image pull behavior [Always/IfNotPresent/Never] (default Always) --pre Optional. Pre release Version of flyte will be used for sandbox. - --source string Path of your source code + --source string deprecated, path of your source code, please build images with local daemon --version string Version of flyte. Only supports flyte releases greater than v0.10.0 Options inherited from parent commands @@ -95,62 +107,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_demo_status.rst b/flytectl/docs/source/gen/flytectl_demo_status.rst index 1d44f1de5a..296de34f75 100644 --- a/flytectl/docs/source/gen/flytectl_demo_status.rst +++ b/flytectl/docs/source/gen/flytectl_demo_status.rst @@ -35,62 +35,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_demo_teardown.rst b/flytectl/docs/source/gen/flytectl_demo_teardown.rst index f7d9608965..544f9179bc 100644 --- a/flytectl/docs/source/gen/flytectl_demo_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_demo_teardown.rst @@ -28,69 +28,76 @@ Options :: - -h, --help help for teardown + -h, --help help for teardown + -v, --volume Optional. Clean up Docker volume. This will result in a permanent loss of all data within the database and object store. Use with caution! Options inherited from parent commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index e80e57b43e..1710535505 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -28,62 +28,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index 03ba02c382..e047a87002 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -71,62 +71,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index 74b6acb350..ed79e39e96 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -70,62 +70,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index ef8d50e124..3be1a9b9a7 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -73,62 +73,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 8c735a726f..e460dbecde 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -103,62 +103,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 8e8bcdb4f1..12df2747f5 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -16,9 +16,10 @@ Retrieve all launch plans within the project and domain: flytectl get launchplan -p flytesnacks -d development .. note:: - The terms launchplan/launchplans are interchangeable in these commands. + + The terms launchplan/launchplans are interchangeable in these commands. - Retrieve a launch plan by name within the project and domain: +Retrieve a launch plan by name within the project and domain: :: @@ -137,62 +138,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index bc9267aaa8..21d69b8bc6 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -92,62 +92,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index 91d3b2e5c4..b3136ffe85 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -75,62 +75,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index c9077ea1a3..095c0c5983 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -75,62 +75,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 3502df9aa2..8f54e8f280 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -119,62 +119,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index 1b505cd60a..9850f7bf6f 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -132,62 +132,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 1d356e1028..7584c765c4 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -103,62 +103,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index ab165d19c9..234c1210da 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -28,62 +28,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 91d8ade049..438b6feff4 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -54,62 +54,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index a70618de81..633984e3ba 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -131,62 +131,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 21084366a4..87f1cda5ee 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -33,6 +33,12 @@ To execute commands inside the sandbox container, use exec: flytectl sandbox exec -- pwd +For just printing the docker commands for bringingup the demo container +:: + + flytectl demo start --dryRun + + Options ~~~~~~~ @@ -46,62 +52,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index 51dac4ef61..1bfbb38742 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -35,62 +35,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index fc1c0ca112..13d0af086a 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -85,6 +85,8 @@ Options :: + --dev Optional. Only start minio and postgres in the sandbox. + --dryRun Optional. Only print the docker commands to bring up flyte sandbox/demo container.This will still call github api's to get the latest flyte release to use' --env strings Optional. Provide Env variable in key=value format which can be passed to sandbox container. -h, --help help for start --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. @@ -92,7 +94,7 @@ Options --imagePullOptions.registryAuth string The base64 encoded credentials for the registry. --imagePullPolicy ImagePullPolicy Optional. Defines the image pull behavior [Always/IfNotPresent/Never] (default Always) --pre Optional. Pre release Version of flyte will be used for sandbox. - --source string Path of your source code + --source string deprecated, path of your source code, please build images with local daemon --version string Version of flyte. Only supports flyte releases greater than v0.10.0 Options inherited from parent commands @@ -100,62 +102,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 497eeed6ef..0eb7f19c07 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -35,62 +35,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index 89adadd478..7a52bc5dff 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -35,62 +35,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index a82adf140e..0dfd304ab4 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -30,62 +30,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index d9c40d97fd..21f631bb28 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -70,62 +70,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 867cc54e9c..67cfd6f911 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -63,62 +63,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 73ac2f84c0..5b6f11e623 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -74,62 +74,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_execution.rst b/flytectl/docs/source/gen/flytectl_update_execution.rst index 5df845f7ab..3dd6920c9d 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution.rst @@ -43,62 +43,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index 33633ec6e4..a6fc2310c6 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -48,62 +48,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 01bc49a6a4..a3292dc8a0 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -10,17 +10,16 @@ Synopsis -Activates a launch plan which activates the scheduled job associated with it: +Activates a `launch plan `__ which activates the scheduled job associated with it: :: flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --activate -Archives a launch plan which deschedules any scheduled job associated with it: +Archives `(deactivates) `__ a launch plan which deschedules any scheduled job associated with it: :: flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --archive - Usage @@ -44,62 +43,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index 570d234da8..ebfb2fb165 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -76,62 +76,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index ffcef7e10a..051de3238b 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -103,62 +103,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index 7e7256abfc..6470e908fd 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -48,62 +48,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 33f5ca64b4..91512cacd4 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -76,62 +76,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index 79cc25e306..0049564cd7 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -72,62 +72,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index d1f4079d0d..0e8fa19a82 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -48,62 +48,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index 9c1141fe7a..b44645a51d 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -43,62 +43,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index 406996f5bd..ce0ea2e057 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -32,62 +32,68 @@ Options inherited from parent commands :: - --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") - --admin.authorizationHeader string Custom metadata header to pass JWT - --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint - --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. - --admin.clientId string Client ID (default "flytepropeller") - --admin.clientSecretEnvVar string Environment variable containing the client secret - --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") - --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string - --admin.endpoint string For admin types, specify where the uri of the service is located. - --admin.insecure Use insecure connection. - --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' - --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") - --admin.maxRetries int Max number of gRPC retries (default 4) - --admin.perRetryTimeout string gRPC per retry timeout (default "15s") - --admin.pkceConfig.refreshTime string (default "5m0s") - --admin.pkceConfig.timeout string (default "15s") - --admin.scopes strings List of scopes to request - --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") - --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. - --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. - -c, --config string config file (default is $HOME/.flyte/config.yaml) - -d, --domain string Specifies the Flyte project's domain. - --files.archive Pass in archive file either an http link or local path. - --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. - --files.continueOnError Continue on error when registering files. - --files.destinationDirectory string Location of source code in container. - --files.dryRun Execute command without making any modifications. - --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. - --files.force Force use of version number on entities registered with flyte. - --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount - --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. - --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). - --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. - --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. - --logger.formatter.type string Sets logging format type. (default "json") - --logger.level int Sets the minimum logging level. (default 3) - --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. - --logger.show-source Includes source code location in logs. - -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") - -p, --project string Specifies the Flyte project. - --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used - --storage.cache.target_gc_percent int Sets the garbage collection target percentage. - --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. - --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") - --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. - --storage.connection.endpoint string URL for storage client to connect to. - --storage.connection.region string Region to connect to. (default "us-east-1") - --storage.connection.secret-key string Secret to use when accesskey is set. - --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' - --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") - --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered - --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) - --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) - --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow - --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") + --admin.audience string Audience to use when initiating OAuth2 authorization requests. + --admin.authType string Type of OAuth2 flow used for communicating with admin.ClientSecret, Pkce, ExternalCommand are valid values (default "ClientSecret") + --admin.authorizationHeader string Custom metadata header to pass JWT + --admin.authorizationServerUrl string This is the URL to your IdP's authorization server. It'll default to Endpoint + --admin.caCertFilePath string Use specified certificate file to verify the admin server peer. + --admin.clientId string Client ID (default "flytepropeller") + --admin.clientSecretEnvVar string Environment variable containing the client secret + --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") + --admin.command strings Command for external authentication token generation + --admin.defaultServiceConfig string + --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") + --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") + --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.insecure Use insecure connection. + --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' + --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") + --admin.maxRetries int Max number of gRPC retries (default 4) + --admin.perRetryTimeout string gRPC per retry timeout (default "15s") + --admin.pkceConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") + --admin.pkceConfig.timeout string Amount of time the browser session would be active for authentication from client app. (default "2m0s") + --admin.scopes strings List of scopes to request + --admin.tokenRefreshWindow string Max duration between token refresh attempt and token expiry. (default "0s") + --admin.tokenUrl string OPTIONAL: Your IdP's token endpoint. It'll be discovered from flyte admin's OAuth Metadata endpoint if not provided. + --admin.useAudienceFromAdmin Use Audience configured from admins public endpoint config. + --admin.useAuth Deprecated: Auth will be enabled/disabled based on admin's dynamically discovered information. + -c, --config string config file (default is $HOME/.flyte/config.yaml) + --console.endpoint string Endpoint of console, if different than flyte admin + -d, --domain string Specifies the Flyte project's domain. + --files.archive Pass in archive file either an http link or local path. + --files.assumableIamRole string Custom assumable iam auth role to register launch plans with. + --files.continueOnError Continue on error when registering files. + --files.destinationDirectory string Location of source code in container. + --files.dryRun Execute command without making any modifications. + --files.enableSchedule Enable the schedule if the files contain schedulable launchplan. + --files.force Force use of version number on entities registered with flyte. + --files.k8ServiceAccount string Deprecated. Please use --K8sServiceAccount + --files.k8sServiceAccount string Custom kubernetes service account auth role to register launch plans with. + --files.outputLocationPrefix string Custom output location prefix for offloaded types (files/schemas). + --files.sourceUploadPath string Deprecated: Update flyte admin to avoid having to configure storage access from flytectl. + --files.version string Version of the entity to be registered with flyte which are un-versioned after serialization. + --logger.formatter.type string Sets logging format type. (default "json") + --logger.level int Sets the minimum logging level. (default 3) + --logger.mute Mutes all logs regardless of severity. Intended for benchmarks/tests only. + --logger.show-source Includes source code location in logs. + -o, --output string Specifies the output type - supported formats [TABLE JSON YAML DOT DOTURL]. NOTE: dot, doturl are only supported for Workflow (default "TABLE") + -p, --project string Specifies the Flyte project. + --storage.cache.max_size_mbs int Maximum size of the cache where the Blob store data is cached in-memory. If not specified or set to 0, cache is not used + --storage.cache.target_gc_percent int Sets the garbage collection target percentage. + --storage.connection.access-key string Access key to use. Only required when authtype is set to accesskey. + --storage.connection.auth-type string Auth Type to use [iam, accesskey]. (default "iam") + --storage.connection.disable-ssl Disables SSL connection. Should only be used for development. + --storage.connection.endpoint string URL for storage client to connect to. + --storage.connection.region string Region to connect to. (default "us-east-1") + --storage.connection.secret-key string Secret to use when accesskey is set. + --storage.container string Initial container (in s3 a bucket) to create -if it doesn't exist-.' + --storage.defaultHttpClient.timeout string Sets time out on the http client. (default "0s") + --storage.enable-multicontainer If this is true, then the container argument is overlooked and redundant. This config will automatically open new connections to new containers/buckets as they are encountered + --storage.limits.maxDownloadMBs int Maximum allowed download size (in MBs) per call. (default 2) + --storage.stow.config stringToString Configuration for stow backend. Refer to github/flyteorg/stow (default []) + --storage.stow.kind string Kind of Stow backend to use. Refer to github/flyteorg/stow + --storage.type string Sets the type of storage to configure [s3/minio/local/mem/stow]. (default "s3") SEE ALSO ~~~~~~~~ From b8770eec77024300586bf4e8d897c5f0af50389b Mon Sep 17 00:00:00 2001 From: Ankit Goyal Date: Wed, 8 Mar 2023 01:32:20 -0800 Subject: [PATCH 303/645] Fix docs for updating description using workflow-meta subcommand (#394) * Fix docs Signed-off-by: Ankit Goyal * add generated docs Signed-off-by: Ankit Goyal --------- Signed-off-by: Ankit Goyal Signed-off-by: Ankit Goyal --- flytectl/cmd/update/workflow_meta.go | 6 +++--- flytectl/docs/source/gen/flytectl_update_workflow-meta.rst | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flytectl/cmd/update/workflow_meta.go b/flytectl/cmd/update/workflow_meta.go index 6da5c6bff0..b30743b67f 100644 --- a/flytectl/cmd/update/workflow_meta.go +++ b/flytectl/cmd/update/workflow_meta.go @@ -16,17 +16,17 @@ const ( Update the description on the workflow: :: - flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --description "Mergesort workflow example" + flytectl update workflow-meta -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --description "Mergesort workflow example" Archiving workflow named entity would cause this to disappear from flyteconsole UI: :: - flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --archive + flytectl update workflow-meta -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --archive Activate workflow named entity: :: - flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --activate + flytectl update workflow-meta -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --activate Usage ` diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index 0e8fa19a82..6765578ab8 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -13,17 +13,17 @@ Synopsis Update the description on the workflow: :: - flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --description "Mergesort workflow example" + flytectl update workflow-meta -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --description "Mergesort workflow example" Archiving workflow named entity would cause this to disappear from flyteconsole UI: :: - flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --archive + flytectl update workflow-meta -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --archive Activate workflow named entity: :: - flytectl update workflow -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --activate + flytectl update workflow-meta -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --activate Usage From d69f4b754fcfda948a6a1424aae2b1e927764749 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Tue, 14 Mar 2023 13:53:47 -0700 Subject: [PATCH 304/645] Add support for gate nodes (#399) * Add support for gate nodes Signed-off-by: eduardo apolinario * Linting Signed-off-by: eduardo apolinario --------- Signed-off-by: eduardo apolinario Co-authored-by: eduardo apolinario --- flytectl/cmd/register/register_util.go | 2 + flytectl/cmd/register/register_util_test.go | 59 +++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 0f646c89b5..714e30c76b 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -245,6 +245,8 @@ func hydrateNode(node *core.Node, version string, force bool) error { default: return fmt.Errorf("unknown type %T", branchNodeWrapper.BranchNode.IfElse.Default) } + case *core.Node_GateNode: + // Do nothing. default: return fmt.Errorf("unknown type %T", v) } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 6e31565cec..97a39082d2 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -35,6 +35,7 @@ import ( "github.com/stretchr/testify/mock" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/durationpb" ) type MockHTTPClient struct { @@ -501,6 +502,64 @@ func TestHydrateNode(t *testing.T) { }) } +func TestHydrateGateNode(t *testing.T) { + t.Run("Hydrate Sleep", func(t *testing.T) { + registerFilesSetup() + // Write a node that contains a GateNode + node := &core.Node{ + Target: &core.Node_GateNode{ + GateNode: &core.GateNode{ + Condition: &core.GateNode_Sleep{ + Sleep: &core.SleepCondition{ + Duration: &durationpb.Duration{ + Seconds: 10, + }, + }, + }, + }, + }, + } + err := hydrateNode(node, rconfig.DefaultFilesConfig.Version, true) + assert.Nil(t, err) + }) + + t.Run("Hydrate Signal", func(t *testing.T) { + registerFilesSetup() + // Write a node that contains a GateNode + node := &core.Node{ + Target: &core.Node_GateNode{ + GateNode: &core.GateNode{ + Condition: &core.GateNode_Signal{ + Signal: &core.SignalCondition{ + SignalId: "abc", + }, + }, + }, + }, + } + err := hydrateNode(node, rconfig.DefaultFilesConfig.Version, true) + assert.Nil(t, err) + }) + + t.Run("Hydrate Approve", func(t *testing.T) { + registerFilesSetup() + // Write a node that contains a GateNode + node := &core.Node{ + Target: &core.Node_GateNode{ + GateNode: &core.GateNode{ + Condition: &core.GateNode_Approve{ + Approve: &core.ApproveCondition{ + SignalId: "abc", + }, + }, + }, + }, + } + err := hydrateNode(node, rconfig.DefaultFilesConfig.Version, true) + assert.Nil(t, err) + }) +} + func TestHydrateTaskSpec(t *testing.T) { testScope := promutils.NewTestScope() labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) From e292dd98b536c65453eace9d20f6752b6d069fb8 Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Fri, 14 Apr 2023 00:21:42 +0800 Subject: [PATCH 305/645] Update workflow_execution_config (#401) * update workflow_execution_config Signed-off-by: Kevin Su * update workflow_execution_config Signed-off-by: Kevin Su --------- Signed-off-by: Kevin Su --- .../delete/matchable_workflow_execution_config.go | 6 +++--- .../update/matchable_workflow_execution_config.go | 12 ++++++------ .../flytectl_delete_workflow-execution-config.rst | 6 +++--- .../flytectl_update_workflow-execution-config.rst | 12 ++++++------ 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config.go b/flytectl/cmd/delete/matchable_workflow_execution_config.go index d0a40c15c4..ad387d4ccd 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config.go @@ -34,9 +34,9 @@ For example, here's the config file wec.yaml: domain: development project: flytesnacks max_parallelism: 5 - security_context: - run_as: - k8s_service_account: demo + security_context: + run_as: + k8s_service_account: demo Max_parallelism is optional in the file as it is unread during the delete command but can be retained since the same file can be used for get, update and delete commands. diff --git a/flytectl/cmd/update/matchable_workflow_execution_config.go b/flytectl/cmd/update/matchable_workflow_execution_config.go index d6bf2a2ad5..b9489d67ff 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config.go @@ -27,9 +27,9 @@ Example: content of wec.yaml: domain: development project: flytesnacks max_parallelism: 5 - security_context: - run_as: - k8s_service_account: demo + security_context: + run_as: + k8s_service_account: demo :: @@ -45,9 +45,9 @@ For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, d project: flytesnacks workflow: core.control_flow.merge_sort.merge_sort max_parallelism: 5 - security_context: - run_as: - k8s_service_account: mergesortsa + security_context: + run_as: + k8s_service_account: mergesortsa :: diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 7678e17fd6..6376d8d73c 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -30,9 +30,9 @@ For example, here's the config file wec.yaml: domain: development project: flytesnacks max_parallelism: 5 - security_context: - run_as: - k8s_service_account: demo + security_context: + run_as: + k8s_service_account: demo Max_parallelism is optional in the file as it is unread during the delete command but can be retained since the same file can be used for get, update and delete commands. diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index 0049564cd7..9d8bc3188a 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -24,9 +24,9 @@ Example: content of wec.yaml: domain: development project: flytesnacks max_parallelism: 5 - security_context: - run_as: - k8s_service_account: demo + security_context: + run_as: + k8s_service_account: demo :: @@ -42,9 +42,9 @@ For workflow 'core.control_flow.merge_sort.merge_sort' in flytesnacks project, d project: flytesnacks workflow: core.control_flow.merge_sort.merge_sort max_parallelism: 5 - security_context: - run_as: - k8s_service_account: mergesortsa + security_context: + run_as: + k8s_service_account: mergesortsa :: From 3ae90aa6f77022427e80bb40950319978ed728f9 Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Mon, 17 Apr 2023 15:17:10 -0700 Subject: [PATCH 306/645] Respect project state in project.yaml file (#402) --- .../subcommand/project/project_config.go | 5 +++++ flytectl/cmd/update/project.go | 5 ----- flytectl/cmd/update/project_test.go | 20 ++++++++++--------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go index 8fa34ff6a5..a6e8fcebd6 100644 --- a/flytectl/cmd/config/subcommand/project/project_config.go +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -68,6 +68,11 @@ func (c *ConfigProject) GetProjectSpec(id string) (*admin.Project, error) { projectSpec.Labels = &admin.Labels{ Values: c.Labels, } + projectState, err := c.MapToAdminState() + if err != nil { + return nil, err + } + projectSpec.State = projectState return &projectSpec, nil } diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 0da542b763..7f8b2589e9 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -92,11 +92,6 @@ func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comma return fmt.Errorf(clierrors.ErrProjectNotPassed) } - state, err := project.DefaultProjectConfig.MapToAdminState() - if err != nil { - return err - } - projectSpec.State = state if project.DefaultProjectConfig.DryRun { logger.Infof(ctx, "skipping UpdateProject request (dryRun)") } else { diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index d33ce6e374..b3838b59ac 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -27,9 +27,11 @@ func updateProjectSetup() { } } -func modifyProjectFlags(archiveProject *bool, newArchiveVal bool, activateProject *bool, newActivateVal bool) { - *archiveProject = newArchiveVal - *activateProject = newActivateVal +func modifyProjectFlags(newArchiveVal bool, newActivateVal bool) { + project.DefaultProjectConfig.ArchiveProject = newArchiveVal + project.DefaultProjectConfig.Archive = newArchiveVal + project.DefaultProjectConfig.ActivateProject = newActivateVal + project.DefaultProjectConfig.Activate = newActivateVal } func TestActivateProjectFunc(t *testing.T) { @@ -37,7 +39,7 @@ func TestActivateProjectFunc(t *testing.T) { updateProjectSetup() config.GetConfig().Project = projectValue project.DefaultProjectConfig.Name = projectValue - modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), false, &(project.DefaultProjectConfig.ActivateProject), true) + modifyProjectFlags(false, true) projectUpdateRequest = &admin.Project{ Id: projectValue, Name: projectValue, @@ -58,7 +60,7 @@ func TestActivateProjectFuncWithError(t *testing.T) { updateProjectSetup() config.GetConfig().Project = projectValue project.DefaultProjectConfig.Name = projectValue - modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), false, &(project.DefaultProjectConfig.ActivateProject), true) + modifyProjectFlags(false, true) projectUpdateRequest = &admin.Project{ Id: projectValue, Name: projectValue, @@ -80,7 +82,7 @@ func TestArchiveProjectFunc(t *testing.T) { config.GetConfig().Project = projectValue project.DefaultProjectConfig = &project.ConfigProject{} project.DefaultProjectConfig.Name = projectValue - modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), true, &(project.DefaultProjectConfig.ActivateProject), false) + modifyProjectFlags(true, false) projectUpdateRequest = &admin.Project{ Id: projectValue, Name: projectValue, @@ -101,7 +103,7 @@ func TestArchiveProjectFuncWithError(t *testing.T) { updateProjectSetup() project.DefaultProjectConfig.Name = projectValue project.DefaultProjectConfig.Labels = map[string]string{} - modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), true, &(project.DefaultProjectConfig.ActivateProject), false) + modifyProjectFlags(true, false) projectUpdateRequest = &admin.Project{ Id: projectValue, Name: projectValue, @@ -122,7 +124,7 @@ func TestEmptyProjectInput(t *testing.T) { s := setup() updateProjectSetup() config.GetConfig().Project = "" - modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), false, &(project.DefaultProjectConfig.ActivateProject), true) + modifyProjectFlags(false, true) err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf(clierrors.ErrProjectNotPassed), err) @@ -133,7 +135,7 @@ func TestInvalidInput(t *testing.T) { updateProjectSetup() config.GetConfig().Project = projectValue project.DefaultProjectConfig.Name = projectValue - modifyProjectFlags(&(project.DefaultProjectConfig.ArchiveProject), true, &(project.DefaultProjectConfig.ActivateProject), true) + modifyProjectFlags(true, true) err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf(clierrors.ErrInvalidStateUpdate), err) From b8ee84f0d76c96e5a672262b1d285dd0d99c7e58 Mon Sep 17 00:00:00 2001 From: Honnix Date: Thu, 18 May 2023 01:35:33 +0200 Subject: [PATCH 307/645] Print instruction after teardown (#403) * Print instruction after teardown Signed-off-by: Hongxin Liang * Add unit test Signed-off-by: Hongxin Liang * Fix import Signed-off-by: Hongxin Liang * Delete unused functions Signed-off-by: Hongxin Liang * Try fixing doc build Signed-off-by: Hongxin Liang * Name Signed-off-by: Hongxin Liang --------- Signed-off-by: Hongxin Liang --- flytectl/doc-requirements.in | 2 +- flytectl/doc-requirements.txt | 2 +- flytectl/docs/source/conf.py | 2 +- flytectl/pkg/sandbox/start.go | 6 +++--- flytectl/pkg/sandbox/teardown.go | 2 ++ flytectl/pkg/util/util.go | 18 +++++++++++------- flytectl/pkg/util/util_test.go | 10 ++++++++-- 7 files changed, 27 insertions(+), 15 deletions(-) diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in index 1bcf77f9be..0bdd65dd01 100644 --- a/flytectl/doc-requirements.in +++ b/flytectl/doc-requirements.in @@ -5,5 +5,5 @@ sphinx-material sphinx-code-include sphinx-copybutton sphinx_fontawesome -sphinxcontrib-yt +sphinxcontrib-youtube sphinx-panels diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index 070d7493af..65b0f20ea3 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -90,7 +90,7 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -sphinxcontrib-yt==0.2.2 +sphinxcontrib-youtube==1.2.0 # via -r doc-requirements.in text-unidecode==1.3 # via python-slugify diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 419e02fd71..9d28a8f1d3 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -43,7 +43,7 @@ "sphinx-prompt", "sphinx_copybutton", "sphinx_fontawesome", - "sphinxcontrib.yt", + "sphinxcontrib.youtube", "sphinx_panels", ] diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index 744bc0a923..344003ca94 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -162,7 +162,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService return nil, err } fmt.Printf("Existing details of your sandbox") - util.PrintSandboxMessage(consolePort, docker.Kubeconfig, sandboxConfig.DryRun) + util.PrintSandboxStartMessage(consolePort, docker.Kubeconfig, sandboxConfig.DryRun) return nil, nil } } @@ -429,7 +429,7 @@ func StartDemoCluster(ctx context.Context, args []string, sandboxConfig *sandbox if err != nil { return err } - util.PrintDemoMessage(util.DemoConsolePort, docker.Kubeconfig, sandboxConfig.DryRun) + util.PrintDemoStartMessage(util.DemoConsolePort, docker.Kubeconfig, sandboxConfig.DryRun) return nil } @@ -444,6 +444,6 @@ func StartSandboxCluster(ctx context.Context, args []string, sandboxConfig *sand if err != nil { return err } - util.PrintSandboxMessage(util.SandBoxConsolePort, docker.SandboxKubeconfig, sandboxConfig.DryRun) + util.PrintSandboxStartMessage(util.SandBoxConsolePort, docker.SandboxKubeconfig, sandboxConfig.DryRun) return nil } diff --git a/flytectl/pkg/sandbox/teardown.go b/flytectl/pkg/sandbox/teardown.go index 3881617db6..231a4eb309 100644 --- a/flytectl/pkg/sandbox/teardown.go +++ b/flytectl/pkg/sandbox/teardown.go @@ -10,6 +10,7 @@ import ( "github.com/flyteorg/flytectl/pkg/configutil" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/k8s" + "github.com/flyteorg/flytectl/pkg/util" ) func Teardown(ctx context.Context, cli docker.Docker, teardownFlags *sandboxCmdConfig.TeardownFlags) error { @@ -38,6 +39,7 @@ func Teardown(ctx context.Context, cli docker.Docker, teardownFlags *sandboxCmdC } fmt.Printf("%v %v Sandbox cluster is removed successfully.\n", emoji.Broom, emoji.Broom) + util.PrintSandboxTeardownMessage(util.SandBoxConsolePort, docker.SandboxKubeconfig) return nil } diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index a851ac4e9d..146ba6ec50 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -72,8 +72,8 @@ func SetupFlyteDir() error { return nil } -// PrintDemoMessage will print sandbox success message -func PrintDemoMessage(flyteConsolePort int, kubeconfigLocation string, dryRun bool) { +// PrintDemoStartMessage will print demo start success message +func PrintDemoStartMessage(flyteConsolePort int, kubeconfigLocation string, dryRun bool) { kubeconfig := strings.Join([]string{ "$KUBECONFIG", kubeconfigLocation, @@ -84,10 +84,9 @@ func PrintDemoMessage(flyteConsolePort int, kubeconfigLocation string, dryRun bo successMsg = fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessagePending, flyteConsolePort) } else { successMsg = fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessage, flyteConsolePort) - } fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, successMsg, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) - fmt.Printf("%v Run the following command to export sandbox environment variables for accessing flytectl\n", emoji.Sparkle) + fmt.Printf("%v Run the following command to export demo environment variables for accessing flytectl\n", emoji.Sparkle) fmt.Printf(" export FLYTECTL_CONFIG=%v \n", configutil.FlytectlConfig) if dryRun { fmt.Printf("%v Run the following command to export kubeconfig variables for accessing flyte pods locally\n", emoji.Sparkle) @@ -97,8 +96,8 @@ func PrintDemoMessage(flyteConsolePort int, kubeconfigLocation string, dryRun bo fmt.Printf("%s The Minio API is hosted on localhost:30002. Use http://localhost:30080/minio/login for Minio console\n", emoji.OpenFileFolder) } -// PrintSandboxMessage will print sandbox success message -func PrintSandboxMessage(flyteConsolePort int, kubeconfigLocation string, dryRun bool) { +// PrintSandboxStartMessage will print sandbox start success message +func PrintSandboxStartMessage(flyteConsolePort int, kubeconfigLocation string, dryRun bool) { kubeconfig := strings.Join([]string{ "$KUBECONFIG", kubeconfigLocation, @@ -109,7 +108,6 @@ func PrintSandboxMessage(flyteConsolePort int, kubeconfigLocation string, dryRun successMsg = fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessagePending, flyteConsolePort) } else { successMsg = fmt.Sprintf("%v http://localhost:%v/console", ProgressSuccessMessage, flyteConsolePort) - } fmt.Printf("%v %v %v %v %v \n", emoji.ManTechnologist, successMsg, emoji.Rocket, emoji.Rocket, emoji.PartyPopper) fmt.Printf("%v Run the following command to export sandbox environment variables for accessing flytectl\n", emoji.Sparkle) @@ -120,6 +118,12 @@ func PrintSandboxMessage(flyteConsolePort int, kubeconfigLocation string, dryRun } } +// PrintSandboxTeardownMessage will print sandbox teardown success message +func PrintSandboxTeardownMessage(flyteConsolePort int, kubeconfigLocation string) { + fmt.Printf("%v Run the following command to unset sandbox environment variables for accessing flytectl\n", emoji.Sparkle) + fmt.Printf(" unset FLYTECTL_CONFIG \n") +} + // SendRequest will create request and return the response func SendRequest(method, url string, option io.Reader) (*http.Response, error) { client := &http.Client{} diff --git a/flytectl/pkg/util/util_test.go b/flytectl/pkg/util/util_test.go index 492dc2623f..dd9de2a1c1 100644 --- a/flytectl/pkg/util/util_test.go +++ b/flytectl/pkg/util/util_test.go @@ -27,9 +27,15 @@ func TestSetupFlyteDir(t *testing.T) { assert.Nil(t, SetupFlyteDir()) } -func TestPrintSandboxMessage(t *testing.T) { +func TestPrintSandboxStartMessage(t *testing.T) { t.Run("Print Sandbox Message", func(t *testing.T) { - PrintSandboxMessage(SandBoxConsolePort, docker.SandboxKubeconfig, false) + PrintSandboxStartMessage(SandBoxConsolePort, docker.SandboxKubeconfig, false) + }) +} + +func TestPrintSandboxTeardownMessage(t *testing.T) { + t.Run("Print Sandbox Message", func(t *testing.T) { + PrintSandboxTeardownMessage(SandBoxConsolePort, docker.SandboxKubeconfig) }) } From d7f247b13c0ceab851e462a11dce8c3075b81adb Mon Sep 17 00:00:00 2001 From: Jeev B Date: Sat, 27 May 2023 21:20:06 -0700 Subject: [PATCH 308/645] When preleases are allowed for demo sandbox, simply choose the latest release (#407) Signed-off-by: Jeev B --- flytectl/pkg/github/githubutil.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/flytectl/pkg/github/githubutil.go b/flytectl/pkg/github/githubutil.go index 486e75845e..f76d7f7580 100644 --- a/flytectl/pkg/github/githubutil.go +++ b/flytectl/pkg/github/githubutil.go @@ -123,10 +123,11 @@ func GetSandboxImageSha(tag string, pre bool, g GHRepoService) (string, string, return "", release.GetTagName(), err } for _, v := range releases { - if *v.Prerelease && pre { + // When pre-releases are allowed, simply choose the latest release + if pre { release = v break - } else if !*v.Prerelease && !pre { + } else if !*v.Prerelease { release = v break } From 2c3ffc2963f7e63b053785356f63bd3db82d0948 Mon Sep 17 00:00:00 2001 From: Honnix Date: Mon, 5 Jun 2023 20:26:14 +0200 Subject: [PATCH 309/645] Support envs when creating execution (#408) * Support envs when creating execution Signed-off-by: Hongxin Liang * Update doc Signed-off-by: Hongxin Liang --------- Signed-off-by: Hongxin Liang --- flytectl/cmd/create/execution.go | 34 +- flytectl/cmd/create/execution_test.go | 1 + flytectl/cmd/create/execution_util.go | 20 +- flytectl/cmd/create/execution_util_test.go | 56 ++++ flytectl/cmd/get/execution_util.go | 1 + flytectl/go.mod | 2 +- flytectl/go.sum | 366 ++++++++++++++++++++- 7 files changed, 466 insertions(+), 14 deletions(-) diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index 5c6c01b327..839fa6e34e 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -60,20 +60,39 @@ The generated spec file can be modified to change the input values, as shown bel task: core.control_flow.merge_sort.merge version: "v2" -3. Run the execution by passing the generated YAML file. +3. [Optional] Update the envs for the execution, if needed. +The generated spec file can be modified to change the envs values, as shown below: + +.. code-block:: yaml + + iamRoleARN: "" + inputs: + sorted_list1: + - 0 + sorted_list2: + - 0 + envs: + foo: bar + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.control_flow.merge_sort.merge + version: "v2" + +4. Run the execution by passing the generated YAML file. The file can then be passed through the command line. It is worth noting that the source's and target's project and domain can be different. :: flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d staging --targetProject flytesnacks -4. To relaunch an execution, pass the current execution ID as follows: +5. To relaunch an execution, pass the current execution ID as follows: :: flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytesnacks -d development -5. To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: +6. To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: :: @@ -81,7 +100,7 @@ It is worth noting that the source's and target's project and domain can be diff See :ref:` + "`ref_flyteidl.admin.ExecutionRecoverRequest`" + ` for more details. -6. You can create executions idempotently by naming them. This is also a way to *name* an execution for discovery. Note, +7. You can create executions idempotently by naming them. This is also a way to *name* an execution for discovery. Note, an execution id has to be unique within a project domain. So if the *name* matches an existing execution an already exists exceptioj will be raised. @@ -89,7 +108,7 @@ will be raised. flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytesnacks -d development custom_name -7. Generic/Struct/Dataclass/JSON types are supported for execution in a similar manner. +8. Generic/Struct/Dataclass/JSON types are supported for execution in a similar manner. The following is an example of how generic data can be specified while creating the execution. :: @@ -109,7 +128,7 @@ The generated file would look similar to this. Here, empty values have been dump task: core.type_system.custom_objects.add version: v3 -8. Modified file with struct data populated for 'x' and 'y' parameters for the task "core.type_system.custom_objects.add": +9. Modified file with struct data populated for 'x' and 'y' parameters for the task "core.type_system.custom_objects.add": :: @@ -133,7 +152,7 @@ The generated file would look similar to this. Here, empty values have been dump task: core.type_system.custom_objects.add version: v3 -9. If you have configured a plugin that implements github.com/flyteorg/flyteadmin/pkg/workflowengine/interfaces/WorkflowExecutor +10. If you have configured a plugin that implements github.com/flyteorg/flyteadmin/pkg/workflowengine/interfaces/WorkflowExecutor that supports cluster pools, then when creating a new execution, you can assign it to a specific cluster pool: :: @@ -162,6 +181,7 @@ type ExecutionConfig struct { Workflow string `json:"workflow,omitempty"` Task string `json:"task,omitempty"` Inputs map[string]interface{} `json:"inputs" pflag:"-"` + Envs map[string]string `json:"envs" pflag:"-"` } type ExecutionType int diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index 7aabf5897d..399f97abb2 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -184,6 +184,7 @@ func (s *createSuite) Test_CreateTaskExecution() { }, }, ClusterAssignment: &admin.ClusterAssignment{ClusterPoolName: "gpu"}, + Envs: &admin.Envs{}, }, } s.MockAdminClient. diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index 0f81b80636..ea67980004 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -35,6 +35,8 @@ func createExecutionRequestForWorkflow(ctx context.Context, workflowName, projec Literals: paramLiterals, } + envs := makeEnvs(executionConfig) + // Set both deprecated field and new field for security identity passing var securityContext *core.SecurityContext var authRole *admin.AuthRole @@ -52,7 +54,7 @@ func createExecutionRequestForWorkflow(ctx context.Context, workflowName, projec } } - return createExecutionRequest(lp.Id, inputs, securityContext, authRole, targetExecName), nil + return createExecutionRequest(lp.Id, inputs, envs, securityContext, authRole, targetExecName), nil } func createExecutionRequestForTask(ctx context.Context, taskName string, project string, domain string, @@ -73,6 +75,8 @@ func createExecutionRequestForTask(ctx context.Context, taskName string, project Literals: variableLiterals, } + envs := makeEnvs(executionConfig) + // Set both deprecated field and new field for security identity passing var securityContext *core.SecurityContext var authRole *admin.AuthRole @@ -98,7 +102,7 @@ func createExecutionRequestForTask(ctx context.Context, taskName string, project Version: task.Id.Version, } - return createExecutionRequest(id, inputs, securityContext, authRole, targetExecName), nil + return createExecutionRequest(id, inputs, envs, securityContext, authRole, targetExecName), nil } func relaunchExecution(ctx context.Context, executionName string, project string, domain string, @@ -144,8 +148,7 @@ func recoverExecution(ctx context.Context, executionName string, project string, return nil } -func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, securityContext *core.SecurityContext, - authRole *admin.AuthRole, targetExecName string) *admin.ExecutionCreateRequest { +func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, envs *admin.Envs, securityContext *core.SecurityContext, authRole *admin.AuthRole, targetExecName string) *admin.ExecutionCreateRequest { if len(targetExecName) == 0 { targetExecName = "f" + strings.ReplaceAll(uuid.New().String(), "-", "")[:19] @@ -169,6 +172,7 @@ func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, securi SecurityContext: securityContext, ClusterAssignment: clusterAssignment, OverwriteCache: executionConfig.OverwriteCache, + Envs: envs, }, Inputs: inputs, } @@ -251,3 +255,11 @@ func readConfigAndValidate(project string, domain string) (ExecutionParams, erro } return ExecutionParams{name: name, execType: execType}, nil } + +func makeEnvs(executionConfig *ExecutionConfig) *admin.Envs { + var values []*core.KeyValuePair + for key, value := range executionConfig.Envs { + values = append(values, &core.KeyValuePair{Key: key, Value: value}) + } + return &admin.Envs{Values: values} +} diff --git a/flytectl/cmd/create/execution_util_test.go b/flytectl/cmd/create/execution_util_test.go index 87eb39bd38..bbfeccdc56 100644 --- a/flytectl/cmd/create/execution_util_test.go +++ b/flytectl/cmd/create/execution_util_test.go @@ -91,6 +91,30 @@ func TestCreateExecutionRequestForWorkflow(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, execCreateRequest) }) + t.Run("successful with envs", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + launchPlan := &admin.LaunchPlan{} + s.FetcherExt.OnFetchLPVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(launchPlan, nil) + var executionConfigWithEnvs = &ExecutionConfig{ + Envs: map[string]string{"foo": "bar"}, + } + execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfigWithEnvs, "") + assert.Nil(t, err) + assert.NotNil(t, execCreateRequest) + }) + t.Run("successful with empty envs", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + launchPlan := &admin.LaunchPlan{} + s.FetcherExt.OnFetchLPVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(launchPlan, nil) + var executionConfigWithEnvs = &ExecutionConfig{ + Envs: map[string]string{}, + } + execCreateRequest, err := createExecutionRequestForWorkflow(s.Ctx, "wfName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfigWithEnvs, "") + assert.Nil(t, err) + assert.NotNil(t, execCreateRequest) + }) t.Run("failed literal conversion", func(t *testing.T) { s := setup() createExecutionUtilSetup() @@ -144,6 +168,38 @@ func TestCreateExecutionRequestForTask(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, execCreateRequest) }) + t.Run("successful with envs", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + task := &admin.Task{ + Id: &core.Identifier{ + Name: "taskName", + }, + } + s.FetcherExt.OnFetchTaskVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(task, nil) + var executionConfigWithEnvs = &ExecutionConfig{ + Envs: map[string]string{"foo": "bar"}, + } + execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfigWithEnvs, "") + assert.Nil(t, err) + assert.NotNil(t, execCreateRequest) + }) + t.Run("successful with empty envs", func(t *testing.T) { + s := setup() + createExecutionUtilSetup() + task := &admin.Task{ + Id: &core.Identifier{ + Name: "taskName", + }, + } + s.FetcherExt.OnFetchTaskVersionMatch(s.Ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(task, nil) + var executionConfigWithEnvs = &ExecutionConfig{ + Envs: map[string]string{}, + } + execCreateRequest, err := createExecutionRequestForTask(s.Ctx, "taskName", config.GetConfig().Project, config.GetConfig().Domain, s.CmdCtx, executionConfigWithEnvs, "") + assert.Nil(t, err) + assert.NotNil(t, execCreateRequest) + }) t.Run("failed literal conversion", func(t *testing.T) { s := setup() createExecutionUtilSetup() diff --git a/flytectl/cmd/get/execution_util.go b/flytectl/cmd/get/execution_util.go index 65b72175a5..2397ee2ff8 100644 --- a/flytectl/cmd/get/execution_util.go +++ b/flytectl/cmd/get/execution_util.go @@ -19,6 +19,7 @@ import ( type ExecutionConfig struct { IamRoleARN string `yaml:"iamRoleARN"` Inputs map[string]yaml.Node `yaml:"inputs"` + Envs map[string]string `yaml:"envs"` KubeServiceAcct string `yaml:"kubeServiceAcct"` TargetDomain string `yaml:"targetDomain"` TargetProject string `yaml:"targetProject"` diff --git a/flytectl/go.mod b/flytectl/go.mod index a6c1a397ec..7a58eb186b 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.3.8 + github.com/flyteorg/flyteidl v1.5.10 github.com/flyteorg/flytepropeller v1.1.1 github.com/flyteorg/flytestdlib v1.0.13 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 3c52c3091f..53f29a7edd 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -1,3 +1,4 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898 h1:SC+c6A1qTFstO9qmB86mPV2IpYme/2ZoEQ0hrP+wo+Q= bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -39,6 +40,7 @@ cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNF cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= @@ -47,13 +49,16 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1 h1:8rBq3zRjnHx8UtBvaOWqBB1xq9jH6/wltfQLlTMh2Fw= cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= @@ -64,6 +69,7 @@ cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7ni cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.0 h1:NUV0NNp9nkBuW66BFRLuMgldN60C57ET3dhbwLIYio8= cloud.google.com/go/storage v1.22.0/go.mod h1:GbaLEoMqbVm6sx3Z0R++gSiBlgMv6yUi2q1DeGFKQgE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= @@ -119,11 +125,18 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0 h1:WVsrXCnHlDDX8ls+tootqRE87/hL9S/g4ewig9RsD/c= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DiSiqueira/GoTree v1.0.1-0.20180907134536-53a8e837f295 h1:xJ0dAkuxJXfwdH7IaSzBEbSQxEDz36YUmt7+CB4zoNA= +github.com/GoogleCloudPlatform/spark-on-k8s-operator v0.0.0-20200723154620-6f35a1152625 h1:cQyO5JQ2iuHnEcF3v24kdDMsgh04RjyFPDtuvD6PCE0= github.com/GoogleCloudPlatform/spark-on-k8s-operator v0.0.0-20200723154620-6f35a1152625/go.mod h1:6PnrZv6zUDkrNMw0mIoGRmGBR7i9LulhKPmxFq4rUiM= +github.com/Jeffail/gabs/v2 v2.5.1 h1:ANfZYjpMlfTTKebycu4X1AgkVWumFVDYQl7JwOr4mDk= github.com/Jeffail/gabs/v2 v2.5.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= @@ -142,39 +155,62 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3 github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.23 h1:47MSwtKGXet80aIn+7h4YI6fwPmwIghAnsx2aOUrG2M= github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3 h1:4FA+QBaydEHlwxg0lMN3rhwoDaQy6LKhVWR4qvq4BuA= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 h1:lsxEuwrXEAokXB9qhlbKWPpo3KMLZQ5WB5WLQRW1uq0= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/Shopify/sarama v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adammck/venv v0.0.0-20160819025605-8a9c907a37d3/go.mod h1:3zXR2a/VSQndtpShh783rUTaEA2mpqN2VqZclBARBc0= +github.com/adammck/venv v0.0.0-20200610172036-e77789703e7c h1:RoL0r3mR3JSkLur8q8AD59cByJ+kRwJHODNimZBd7GI= github.com/adammck/venv v0.0.0-20200610172036-e77789703e7c/go.mod h1:3zXR2a/VSQndtpShh783rUTaEA2mpqN2VqZclBARBc0= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae h1:AMzIhMUqU3jMrZiTuW0zkYeKlKDAFD+DG20IoO421/Y= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a h1:pv34s756C4pEXnjgPfGYgdhg/ZdajGhyOvzx8k+23nw= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= @@ -184,7 +220,9 @@ github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHS github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= +github.com/aws/amazon-sagemaker-operator-for-k8s v1.0.1-0.20210303003444-0fb33b1fd49d h1:O+ayl/Vp3bDEXReXItmYHzCnsz/LKusXdRNiJKVxjPs= github.com/aws/amazon-sagemaker-operator-for-k8s v1.0.1-0.20210303003444-0fb33b1fd49d/go.mod h1:mZUP7GJmjiWtf8v3FD1X/QdK08BqyeH/1Ejt0qhNzCs= +github.com/aws/aws-lambda-go v1.13.3 h1:SuCy7H3NLyp+1Mrfp+m80jcbi9KYWAs9/BXwppwRDzY= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -195,74 +233,113 @@ github.com/aws/aws-sdk-go v1.44.2 h1:5VBk5r06bgxgRKVaUtm1/4NT/rtrnH2E4cnAYv5zgQc github.com/aws/aws-sdk-go v1.44.2/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.0.0/go.mod h1:smfAbmpW+tcRVuNUjo3MOArSZmW72t62rkCzc2i0TWM= +github.com/aws/aws-sdk-go-v2 v1.2.0 h1:BS+UYpbsElC82gB+2E2jiCBg36i8HlubTB/dO/moQ9c= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.0.0 h1:x6vSFAwqAvhYPeSu60f0ZUlGHo3PKKmwDOTL8aMXtv4= github.com/aws/aws-sdk-go-v2/config v1.0.0/go.mod h1:WysE/OpUgE37tjtmtJd8GXgT8s1euilE5XtUkRNUQ1w= +github.com/aws/aws-sdk-go-v2/credentials v1.0.0 h1:0M7netgZ8gCV4v7z1km+Fbl7j6KQYyZL7SS0/l5Jn/4= github.com/aws/aws-sdk-go-v2/credentials v1.0.0/go.mod h1:/SvsiqBf509hG4Bddigr3NB12MIpfHhZapyBurJe8aY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.0 h1:lO7fH5n7Q1dKcDBpuTmwJylD1bOQiRig8LI6TD9yVQk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.0/go.mod h1:wpMHDCXvOXZxGCRSidyepa8uJHY4vaBGfY2/+oKU/Bc= +github.com/aws/aws-sdk-go-v2/service/athena v1.0.0 h1:UfrZP3NMTTKpOsf/P8uCaOxz3U2CNGEizdQKcObY7Ds= github.com/aws/aws-sdk-go-v2/service/athena v1.0.0/go.mod h1:qY8QFbemf2ceqweXcS6hQqiiIe1z42WqTvHsK2Lb0rE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.0 h1:IAutMPSrynpvKOpHG6HyWHmh1xmxWAmYOK84NrQVqVQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.0/go.mod h1:3jExOmpbjgPnz2FJaMOfbSk1heTkZ66aD3yNtVhnjvI= +github.com/aws/aws-sdk-go-v2/service/sts v1.0.0 h1:6XCgxNfE4L/Fnq+InhVNd16DKc6Ue1f3dJl3IwwJRUQ= github.com/aws/aws-sdk-go-v2/service/sts v1.0.0/go.mod h1:5f+cELGATgill5Pu3/vK3Ebuigstc+qYEHW5MvGWZO4= github.com/aws/smithy-go v1.0.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +github.com/aws/smithy-go v1.1.0 h1:D6CSsM3gdxaGaqXnPgOBCeL6Mophqzu7KJOu7zW78sU= github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1 h1:VRtJdDi2lqc3MFwmouppm2jlm6icF+7H3WYKpLENMTo= github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bradleyfalzon/ghinstallation/v2 v2.0.3 h1:ywF/8q+GVpvlsEuvRb1SGSDQDUxntW1d4kFu/9q/YAE= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1 h1:pgAtgj+A31JBVtEHu2uHuEx0n+2ukqUJnS2vVe5pQNA= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44 h1:y853v6rXx+zefEcjET3JuKAqvhj+FKflQijjeaSv2iA= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/casbin/casbin/v2 v2.1.2 h1:bTwon/ECRx9dwBy2ewRVr5OiqjeXSGiTUY74sDPQi/g= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v4 v4.1.0 h1:WW2B2uxx9KWF6bGlHqhm8Okiafwwx7Y2kcpn8lCpjgo= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0 h1:TW8f/UvntYoVDMN1K2HlT82qH1rb0sOjpGw3m6Ym+i4= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2 h1:iHsfF/t4aW4heW2YKfeHrVPGdtYTL4C4KocpM8KTSnI= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec h1:EdRZT3IeKQmfCSrgo8SZ8V3MEnskuJP0wCYNpe+aiXo= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4 h1:hzAQntlaYRkVSFEfj9OTWlVV1H155FMD8BTKktLv0QI= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 h1:zH8ljVhhq7yC0MIeUL/IviMtY8hx2mK8cN9wEYb8ggw= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0 h1:osn1exbzdub9L5SouXO5swW4ea/xVdJZ3wokxN5GrnA= github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= @@ -270,11 +347,13 @@ github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1 github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1 h1:iJnMvco9XGvKUvNQkv88bE4uJXxRQH18efbKo9w5vHQ= github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2 h1:Pi6D+aZXM+oUw1czuKgH5IJ+y0jhYcwBJfx5/Ghn9dE= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -297,70 +376,92 @@ github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU= github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2 h1:YbJAhpTevL2v6u8JC1NhCYRwf+3Vzxcc5vGnYoJ7VeE= github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1 h1:LBwiTfoUsdiEGAR1TpvxE+Gzt7469oVu87iR3mv3Byc= github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0 h1:6QioHRlThlKh2RkRTR4kIT3PKAcrLo3gIWnjkM4dQmQ= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0 h1:cXLJbx+4Jj7rNsTiqVfm6i+RNLx6FFA2fMmDlEf+Wm8= github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1 h1:7zpDnQ3T3s4ucOuJ/ZCLrYBxzkg0AELFfII3Epo9TmI= github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1 h1:FD1tADPls2EEi3flPc2OegIY1M9pUa9r2Quag7HMLV8= github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1 h1:prL8l9w3ntVqXvNH1CiNn5ENjcCnr38JqpSyvKKB4GI= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= +github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0 h1:mw6SAibtHKZcNzAsOxjoHIG0gy5YFHhypWSSNc6EjbQ= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -368,20 +469,29 @@ github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKY github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c h1:Xo2rK1pzOm0jO6abTPIQwbAmqBIOj132otexc1mmzFc= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0 h1:suYBsYZIkSlUMEz4TAYCczKf62IA2UWC+O8+KtdOhCo= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5 h1:+CpLbZIeUn94m02LdEKPcgErLJ347NUwxPKs5u8ieiY= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4 h1:itqmmf1PFpC4n5JW+j4BU7X4MTfVurhYRTjODoPb2Y8= github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/danieljoos/wincred v1.1.0 h1:3RNcEpBg4IhIChZdFRSdlQt1QjCp1sMAPIrOnm7Yf8g= github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/disiqueira/gotree v1.0.0 h1:en5wk87n7/Jyk6gVME3cx3xN9KmUCstJ1IjHr4Se4To= github.com/disiqueira/gotree v1.0.0/go.mod h1:7CwL+VWsWAU95DovkdRZAtA7YbtHwGk+tLV/kNi8niU= @@ -400,25 +510,36 @@ github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05b github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.6+incompatible h1:tfrHha8zJ01ywiOEC1miGY8st1/igzWB8OmvPgoYX7w= github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/enescakir/emoji v1.0.0 h1:W+HsNql8swfCQFtioDGDHCHri8nudlK1n5p2rHCJoog= github.com/enescakir/emoji v1.0.0/go.mod h1:Bt1EKuLnKDTYpLALApstIkAjdDrS/8IAgTkKp+WKFD0= @@ -431,8 +552,11 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 h1:xvqufLtNVwAhN8NMyWklVgxnWohi+wtMGQMhtxexlm0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -443,10 +567,11 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.3.8 h1:3/7P/I2VpNNrLTw95kLge1IEyPGXPIgenw2itiuSPh0= -github.com/flyteorg/flyteidl v1.3.8/go.mod h1:Pkt2skI1LiHs/2ZoekBnyPhuGOFMiuul6HHcKGZBsbM= +github.com/flyteorg/flyteidl v1.5.10 h1:SHeiaWRt8EAVuFsat+BJswtc07HTZ4DqhfTEYSm621k= +github.com/flyteorg/flyteidl v1.5.10/go.mod h1:EtE/muM2lHHgBabjYcxqe9TWeJSL0kXwbI0RgVwI4Og= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= @@ -457,31 +582,44 @@ github.com/flyteorg/flytestdlib v1.0.13/go.mod h1:nIBmBHtjTJvhZEn3e/EwVC/iMkR2tU github.com/flyteorg/stow v0.3.3/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= github.com/flyteorg/stow v0.3.6 h1:jt50ciM14qhKBaIrB+ppXXY+SXB59FNREFgTJqCyqIk= github.com/flyteorg/stow v0.3.6/go.mod h1:5dfBitPM004dwaZdoVylVjxFT4GWAgI0ghAndhNUzCo= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db h1:gb2Z18BhTPJPpLQWj4T+rfKHYCHxRHCtRxhKKjRidVw= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCgVZh26+ZbGyoVJG7yb5SSzF5H54= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= @@ -491,63 +629,79 @@ github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= +github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY= github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.5 h1:QhCBKRYqZR+SKo4gl1lPhPahope8/RLt6EVgY8X80w0= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es= github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew= +github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U= +github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= @@ -556,6 +710,7 @@ github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZg github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -571,6 +726,7 @@ github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw github.com/golang-jwt/jwt/v4 v4.4.1 h1:pC5DB52sCeK48Wlb9oPcdhnjkz1TKt1D/P7WKJ0kUcQ= github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -586,6 +742,7 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -607,8 +764,10 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -625,6 +784,7 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github/v39 v39.0.0 h1:pygGA5ySwxEez1N39GnDauD0PaWWuGgayudyZAc941s= github.com/google/go-github/v42 v42.0.0 h1:YNT0FwjPrEysRkLIiKuEfSvBPCGKphW5aS5PxwaoLec= github.com/google/go-github/v42 v42.0.0/go.mod h1:jgg/jvyI0YlDOM1/ps6XYh04HNQ3vKf0CVko62/EhRg= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -655,8 +815,11 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/readahead v0.0.0-20161222183148-eaceba169032 h1:6Be3nkuJFyRfCgr6qTIzmRp8y9QwDIbqy/nYr9WDPos= github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -678,10 +841,15 @@ github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwu github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33 h1:893HsJqtxp9z1SF76gg6hY70hRY1wVlTSnC/h1yUDCo= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -690,7 +858,9 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -704,23 +874,36 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -728,13 +911,20 @@ github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+l github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0 h1:WhIgCr5a7AaVH6jPUwjtRuuE7/RDufnUvzIr48smyxs= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.7 h1:hkdgbqizGQHuU5IPqYM1JdSMV8nKfpuOnZYXssk9muY= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hudl/fargo v1.3.0 h1:0U6+BtN6LhaYuTnIJq4Wyq5cpn6O2kWrxAtcqBmYY6w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -745,11 +935,16 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56 h1:742eGXur0715JMq73aD95/FU0XpVKXqNuTnEfXsLOYQ= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.3 h1:PlHq1bSCSZL9K0wUhbm2pGLoTWs2GwVhsP6emvGV/ZI= github.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -758,8 +953,11 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -769,9 +967,12 @@ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= @@ -779,33 +980,47 @@ github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 h1:M8exrBzuhWc github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23/go.mod h1:kBSna6b0/RzsOcOZf515vAXwSsXYusl2U7SA0XP09yI= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13 h1:eSvu8Tmq6j2psUJqJrLcWH6K3w5Dwc+qipbaA6eVEN4= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kubeflow/common v0.4.0 h1:7NQzVoN9fvFP6npj4pG6iii/IC+K6NHy3OJPew96Eyw= github.com/kubeflow/common v0.4.0/go.mod h1:X15/dRQQoB77wrqrPwVn4GqG2ubgk8xR24A80i61d/4= +github.com/kubeflow/mpi-operator/v2 v2.0.0-20210920181600-c5c0c3ef99ec h1:TQEPmrkz2xJH6nR8BJxGBIoZlJ1UTp6yYbIz/PiY9ts= github.com/kubeflow/mpi-operator/v2 v2.0.0-20210920181600-c5c0c3ef99ec/go.mod h1:cTBmZKLlrIXBWQ0A9Ik8h0i4zoGhR7ApHwUfrLDbhQc= +github.com/kubeflow/pytorch-operator v0.6.0 h1:y9Vzk7Jd5H/s610Y+ucURypCHgJugB25UL8GEz4DRL4= github.com/kubeflow/pytorch-operator v0.6.0/go.mod h1:zHblV+yTwVG4PCgKTU2wPfOmQ6TJdfT87lDfHrP1a1Y= +github.com/kubeflow/tf-operator v0.5.3 h1:Ejn5vEAwHBKHU2sJTlUIRpezqIX3WeqXZ2dZx6zn6vY= github.com/kubeflow/tf-operator v0.5.3/go.mod h1:EBtz5LQoKaHUl/5fV5vD1qXVNVNyn3TrFaH6eVoQ8SY= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1 h1:vi1F1IQ8N7hNWytK9DpJsUfQhGuNSc19z330K6vl4zk= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lyft/protoc-gen-validate v0.0.13 h1:KNt/RhmQTOLr7Aj8PsJ7mTronaFyx80mRTT9qF261dA= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -818,7 +1033,9 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -835,29 +1052,43 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.3 h1:K/VxK7SZ+cvuPgFSLKi5QPI9Vr/ipOf4C1gN+ntueUk= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/pkcs11 v1.0.3 h1:iMwmD7I5225wv84WxIG/bmxz9AXjWvTWIbM/TYHvWtw= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f h1:2+myh5ml7lgEU/51gbeLHfKGNfgEQQIWrlbdaOsidbQ= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1 h1:1O+1cHA1aujwEwwVMa2Xm2l+gIpUHyd3+D+d7LZh1kM= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/symlink v0.1.0 h1:MTFZ74KtNI6qQQpuBxU+uKCim4WtOMokr03hCfJcazE= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= @@ -869,34 +1100,49 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mouuff/go-rocket-update v1.5.1 h1:qGgUu/MP+aVQ63laEguRNimmNTPKs29xz0lZW6QRFaQ= github.com/mouuff/go-rocket-update v1.5.1/go.mod h1:CnOyUYCxAJyC1g1mebSGC7gJysLTlX+RpxKgD1B0zLs= +github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2 h1:+RB5hMpXUUA2dfxuhBTEkMOrYmM+gKIZYS1KjSostMI= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2 h1:i2Ly0B+1+rzNZHHWtD4ZwKi+OU5l+uQo1iDHZ2PmiIc= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1 h1:ik3HbLhZ0YABLto7iX80pZLPw/6dx3T+++MZJwLnMrQ= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3 h1:6JrEfig+HzTH85yxzhSVbjHRJv9cn0p6n3IngIcM5/k= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/oklog v0.3.2 h1:wVfs8F+in6nTBMkA7CbRw+zZMIB7nNM825cM1wuzoTk= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 h1:58+kh9C6jJVXYjt8IE48G2eWl6BjwU5Gj0gqY84fy78= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -918,6 +1164,7 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -934,27 +1181,39 @@ github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59P github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2 h1:opHZMaswlyxz1OuGpBE53Dwe4/xF7EZTY0A2L/FpCOg= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39 h1:H7DMc6FAjgwZZi8BRqjrAAHWoqEr5e5L6pS4V0ezet4= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2 h1:c4ca10UMgRcvZ6h0K4HtS15UaVSBEaE+iln2LVpAuGc= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5 h1:ZCnq+JUrvXcDVhX/xRolRBZifmabN1HcS1wrPSvxhrU= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2 h1:nY8Hti+WKaP0cRsSeQ026wU03QsM762XBeCXBb9NAWI= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4 h1:OYkFijGHoZAYbOIb1LWXrwKQbMMRUv1oQ89blD2Mh2Q= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= @@ -962,9 +1221,12 @@ github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhEC github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0= github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/performancecopilot/speed v3.0.0+incompatible h1:2WnRzIquHa5QxaJKShDkLM+sc0JPuwhXzK8OYOyt3Vg= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= @@ -973,15 +1235,20 @@ github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1 h1:F++O52m40owAmADcojzM+9gyjmMOY/T4oYJkgFDH8RE= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pkg/sftp v1.13.4 h1:Lb0RYJCmgUcBgZosfoi9Y9sbl6+LJgOIgk/2Y4YjMFg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021 h1:0XM1XL/OFFJjXsYXlG30spTkV/E9+gmd5GD1w2HE8xM= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -1032,24 +1299,38 @@ github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8 h1:2c1EFnZHIPCW8qKWgHMH/fX2PkSabFc5mrVzfUNdg5U= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/crypt v0.5.0 h1:K6qABjdpr5rjHCw6q4rSdeM+8kNmdIHvEPDvEMkoai4= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da h1:p3Vo3i64TCLY7gIfzeQaUJ+kppEO5WQG3cL8iE8tGHU= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1 h1:NJjM5DNFOs0s3kYE1WUOr6G8V97sdt46rlXTMfXGWBo= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -1060,10 +1341,14 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1098,10 +1383,14 @@ github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271 h1:WhxRHzgeVGETMlmVfqhRn8RIeeNoPr2Czh33I4Zdccw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a h1:AhmOdSHeswKHBjhsLs/7+1voOxT+LLrSk/Nxvk35fug= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1122,30 +1411,46 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia v2.2.6+incompatible h1:JvoDL7JSoIP2HDE8AbDH3zC8QBPxmzYe32HHy5yQ+Ck= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vektah/gqlparser v1.1.2 h1:ZsyLGn7/7jDNI+y4SEhI4yAxRChlv15pUHMjijT+e68= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 h1:cPXZWzzG0NllBLdjWoD1nDfaqu98YMv+OneaKc8sPOA= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae h1:4hwBBUfQCFe3Cym0ZtKyq7L16eZUtYKs+BaHDN6mAns= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f h1:mvXjJIHRZyhNuGassLTcXTwjiWq7NmjdavZsUnmFybQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= @@ -1154,21 +1459,32 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1 h1:/vn0k+RBvwlxEmP5E7SZMqNxPhfMVFEJiykr15/0XKM= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zalando/go-keyring v0.1.1 h1:w2V9lcx/Uj4l+dzAf1m9s+DJ1O8ROkEHnynonHjTcYE= github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRzC8UFJH9+L8= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.2 h1:tXok5yLlKyuQ/SXSjtqHc4uzNaMqZi2XsoSPr/LlJXI= +go.etcd.io/etcd/client/pkg/v3 v3.5.2 h1:4hzqQ6hIb3blLyQ8usCU4h3NghkqcsohEQ3o3VetYxE= +go.etcd.io/etcd/client/v2 v2.305.2 h1:ymrVwTkefuqA/rPkSW7/B4ApijbPVefRumkY+stNfS0= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2 h1:jxcFYjlkl8xaERsgLo+RNquI0epW6zuy/ZRQs6jnrFA= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1181,22 +1497,28 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1240,6 +1562,7 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/exp v0.0.0-20220428152302-39d4317da171 h1:TfdoLivD44QwvssI9Sv1xwa5DcL5XQr4au4sZ2F2NV4= golang.org/x/exp v0.0.0-20220428152302-39d4317da171/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -1252,8 +1575,10 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= @@ -1265,6 +1590,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1364,6 +1690,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1580,6 +1907,7 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1587,6 +1915,7 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k= gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= @@ -1640,6 +1969,7 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 h1:Cpp2P6TPjujNoC5M2KHY6g7wfyLYfIWRZaSdIKfDasA= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1764,6 +2094,7 @@ google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5 google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0 h1:oCjezcn6g6A75TGoKYBPgKmVBLexhYLM6MebdrPApP8= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1780,7 +2111,9 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1789,10 +2122,15 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -1801,13 +2139,18 @@ gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= +gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 h1:2TSTkQ8PMvGOD5eeqqRVv6Z9+BYI+bowK97RCr3W+9M= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1825,6 +2168,7 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/gorm v1.22.4 h1:8aPcyEJhY0MAt8aY6Dc524Pn+pO29K+ydu+e/cXSpQM= gorm.io/gorm v1.22.4/go.mod h1:1aeVC+pe9ZmvKZban/gW4QPra7PRoTEssyc922qCAkk= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= @@ -1838,6 +2182,7 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= @@ -1877,6 +2222,7 @@ k8s.io/apiserver v0.19.6/go.mod h1:05XquZxCDzQ27ebk7uV2LrFIK4lm5Yt47XkkUvLAoAM= k8s.io/apiserver v0.19.9/go.mod h1:g6zpD+kcZFlO73pktPWRvL0tUGqj7/KaOowmRk8EpGg= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6 h1:NnVriMMOpqQX+dshbDoZixqmBhfgrPk2uOh2fzp9vHE= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= @@ -1896,6 +2242,7 @@ k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8 k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= k8s.io/code-generator v0.19.6/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= k8s.io/code-generator v0.19.9/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/code-generator v0.20.1 h1:kre3GNich5gbO3d1FyTT8fHI4ZJezZV217yFdWlQaRQ= k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= @@ -1905,18 +2252,22 @@ k8s.io/component-base v0.19.9/go.mod h1:x9UmpImvXgVry1s9/hINgLz6iGBYUGvy3Xm7KZh1 k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.2/go.mod h1:pzFtCiwe/ASD0iV7ySMu8SYVJjCapNM9bjvk7ptpKh0= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6 h1:G0inASS5vAqCpzs7M4Sp9dv9d0aElpz39zDHbSB4f4g= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6 h1:iXX0K2pRrbR8yXbZtDK/bSnmg/uSqIFiVJK1x4LUOMc= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded h1:JApXBKYyB7l9xx+DK7/+mFjC7A9Bt5A93FPvFD0HIFE= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= @@ -1930,7 +2281,9 @@ k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/sample-controller v0.19.9 h1:t1d9lOiVbxHs77/XljqtvdQkqWI1G0olWZZo6RUBnPA= k8s.io/sample-controller v0.19.9/go.mod h1:pzC7f1rPpf0+o9rg45Ju8GY83nGARzWABmPblej9v/M= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= @@ -1939,18 +2292,25 @@ k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ= k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15 h1:4uqm9Mv+w2MmBYD+F4qf/v6tDFUdPOk29C095RbU5mY= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E= sigs.k8s.io/controller-runtime v0.7.2/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= +sigs.k8s.io/controller-runtime v0.8.2 h1:SBWmI0b3uzMIUD/BIXWNegrCeZmPJ503pOtwxY0LPHM= sigs.k8s.io/controller-runtime v0.8.2/go.mod h1:U/l+DUopBc1ecfRZ5aviA9JDmGFQKvLf5YkZNx2e0sU= +sigs.k8s.io/controller-tools v0.3.0 h1:y3YD99XOyWaXkiF1kd41uRvfp/64teWcrEZFuHxPhJ4= sigs.k8s.io/controller-tools v0.3.0/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= @@ -1961,5 +2321,7 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +volcano.sh/apis v1.2.0-k8s1.19.6 h1:ddSHBrxHOVpGVSYQC/e696tDmCQ2dPm/Adg7aTQdOPI= volcano.sh/apis v1.2.0-k8s1.19.6/go.mod h1:UaeJ/s5Hyd+ZhFLc+Kw9YlgM8gRZ/5OzXqHa0yKOoXY= From d9cdd21cb22fb9fc9d7a3235e1fc85e723277cdd Mon Sep 17 00:00:00 2001 From: Jeev B Date: Wed, 5 Jul 2023 16:41:35 -0700 Subject: [PATCH 310/645] Remove flytekit image priming (#412) * Remove flytekit image priming Signed-off-by: Jeev B * Fix goreleaser Signed-off-by: Jeev B --------- Signed-off-by: Jeev B --- flytectl/.goreleaser.yml | 17 +++++++++------ flytectl/pkg/sandbox/start.go | 40 ++++------------------------------- 2 files changed, 14 insertions(+), 43 deletions(-) diff --git a/flytectl/.goreleaser.yml b/flytectl/.goreleaser.yml index cb93a7fb2f..732586b758 100644 --- a/flytectl/.goreleaser.yml +++ b/flytectl/.goreleaser.yml @@ -36,13 +36,16 @@ builds: ldflags: - -s -w -X github.com/flyteorg/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flytestdlib/version.BuildTime={{.Date}} archives: - - name_template: '{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}' - replacements: - darwin: Darwin - linux: Linux - windows: Windows - 386: i386 - amd64: x86_64 + - name_template: |- + {{ .ProjectName }}_ + {{- if eq .Os "darwin" }}Darwin + {{- else if eq .Os "linux" }}Linux + {{- else if eq .Os "windows" }}Windows + {{- else }}{{ .Os }}{{ end }}_ + {{- if eq .Arch "amd64" }}x86_64 + {{- else if eq .Arch "386" }}i386 + {{- else }}{{ .Arch }}{{ end }} + {{- if .Arm }}v{{ .Arm }}{{ end }} format_overrides: - goos: windows format: zip diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index 344003ca94..e79ec0162f 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -248,30 +248,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService return logReader, nil } -func primeFlytekitPod(ctx context.Context, podService corev1.PodInterface) { - _, err := podService.Create(ctx, &corev1api.Pod{ - ObjectMeta: v1.ObjectMeta{ - Name: "py39-cacher", - }, - Spec: corev1api.PodSpec{ - RestartPolicy: corev1api.RestartPolicyNever, - Containers: []corev1api.Container{ - { - - Name: "flytekit", - Image: "ghcr.io/flyteorg/flytekit:py3.9-latest", - Command: []string{"echo"}, - Args: []string{"Flyte"}, - }, - }, - }, - }, v1.CreateOptions{}) - if err != nil { - fmt.Printf("Failed to create primer pod - %s", err) - } -} - -func StartCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config, primePod bool, defaultImageName string, defaultImagePrefix string, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, consolePort int) error { +func StartCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config, defaultImageName string, defaultImagePrefix string, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, consolePort int) error { k8sCtxMgr := k8s.NewK8sContextManager() err := k8sCtxMgr.CheckConfig() if err != nil { @@ -354,16 +331,13 @@ func StartCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdC if err := WatchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { return err } - if primePod { - primeFlytekitPod(ctx, k8sClient.CoreV1().Pods("default")) - } } return nil } // StartClusterForSandbox is the code for the original multi deploy version of sandbox, should be removed once we // document the new development experience for plugins. -func StartClusterForSandbox(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config, primePod bool, defaultImageName string, defaultImagePrefix string, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, consolePort int) error { +func StartClusterForSandbox(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config, defaultImageName string, defaultImagePrefix string, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, consolePort int) error { k8sCtxMgr := k8s.NewK8sContextManager() err := k8sCtxMgr.CheckConfig() if err != nil { @@ -408,16 +382,11 @@ func StartClusterForSandbox(ctx context.Context, args []string, sandboxConfig *s if err := WatchFlyteDeployment(ctx, k8sClient.CoreV1()); err != nil { return err } - if primePod { - primeFlytekitPod(ctx, k8sClient.CoreV1().Pods("default")) - } - } return nil } func StartDemoCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config) error { - primePod := true sandboxImagePrefix := "sha" exposedPorts, portBindings, err := docker.GetDemoPorts() if err != nil { @@ -425,7 +394,7 @@ func StartDemoCluster(ctx context.Context, args []string, sandboxConfig *sandbox } // K3s will automatically write the file specified by this var, which is mounted from user's local state dir. sandboxConfig.Env = append(sandboxConfig.Env, k3sKubeConfigEnvVar) - err = StartCluster(ctx, args, sandboxConfig, primePod, demoImageName, sandboxImagePrefix, exposedPorts, portBindings, util.DemoConsolePort) + err = StartCluster(ctx, args, sandboxConfig, demoImageName, sandboxImagePrefix, exposedPorts, portBindings, util.DemoConsolePort) if err != nil { return err } @@ -434,13 +403,12 @@ func StartDemoCluster(ctx context.Context, args []string, sandboxConfig *sandbox } func StartSandboxCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdConfig.Config) error { - primePod := false demoImagePrefix := "dind" exposedPorts, portBindings, err := docker.GetSandboxPorts() if err != nil { return err } - err = StartClusterForSandbox(ctx, args, sandboxConfig, primePod, sandboxImageName, demoImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + err = StartClusterForSandbox(ctx, args, sandboxConfig, sandboxImageName, demoImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) if err != nil { return err } From 95fcceaee8e258ac52e21a139165c94b1c26789b Mon Sep 17 00:00:00 2001 From: Keqiu Hu Date: Thu, 6 Jul 2023 14:12:34 -0700 Subject: [PATCH 311/645] Fix the error message for the update cmd (#411) --- flytectl/clierrors/errors.go | 1 + .../subcommand/project/project_config.go | 38 +++++++++++++------ .../subcommand/project/project_config_test.go | 20 ++++++++-- flytectl/cmd/create/project.go | 3 +- flytectl/cmd/create/project_test.go | 2 + flytectl/cmd/update/project.go | 8 ++-- 6 files changed, 52 insertions(+), 20 deletions(-) diff --git a/flytectl/clierrors/errors.go b/flytectl/clierrors/errors.go index a8ff701cb3..3ced52fee7 100644 --- a/flytectl/clierrors/errors.go +++ b/flytectl/clierrors/errors.go @@ -4,6 +4,7 @@ var ( ErrInvalidStateUpdate = "invalid state passed. Specify either activate or archive\n" ErrProjectNotPassed = "project id wasn't passed\n" // #nosec + ErrProjectIDBothPassed = "both project and id are passed\n" ErrProjectNameNotPassed = "project name is a required flag" ErrFailedProjectUpdate = "Project %v failed to update due to %v\n" diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go index a6e8fcebd6..96b9c643dd 100644 --- a/flytectl/cmd/config/subcommand/project/project_config.go +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/pkg/filters" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -45,8 +46,9 @@ var DefaultProjectConfig = &ConfigProject{ } // GetProjectSpec return project spec from a file/flags -func (c *ConfigProject) GetProjectSpec(id string) (*admin.Project, error) { +func (c *ConfigProject) GetProjectSpec(cf *config.Config) (*admin.Project, error) { projectSpec := admin.Project{} + if len(c.File) > 0 { yamlFile, err := ioutil.ReadFile(c.File) if err != nil { @@ -56,23 +58,35 @@ func (c *ConfigProject) GetProjectSpec(id string) (*admin.Project, error) { if err != nil { return nil, err } - if len(id) > 0 { - projectSpec.Id = id + } else { + projectSpec.Id = c.ID + projectSpec.Name = c.Name + projectSpec.Description = c.Description + projectSpec.Labels = &admin.Labels{ + Values: c.Labels, + } + projectState, err := c.MapToAdminState() + if err != nil { + return nil, err } - return &projectSpec, nil + projectSpec.State = projectState } - projectSpec.Id = id - projectSpec.Name = c.Name - projectSpec.Description = c.Description - projectSpec.Labels = &admin.Labels{ - Values: c.Labels, + project := cf.Project + if len(projectSpec.Id) == 0 && len(project) == 0 { + err := fmt.Errorf(clierrors.ErrProjectNotPassed) + return nil, err } - projectState, err := c.MapToAdminState() - if err != nil { + + if len(projectSpec.Id) > 0 && len(project) > 0 { + err := fmt.Errorf(clierrors.ErrProjectIDBothPassed) return nil, err } - projectSpec.State = projectState + + // Get projectId from file, if not provided, fall back to project + if len(projectSpec.Id) == 0 { + projectSpec.Id = project + } return &projectSpec, nil } diff --git a/flytectl/cmd/config/subcommand/project/project_config_test.go b/flytectl/cmd/config/subcommand/project/project_config_test.go index a44cd0b423..b02daa4972 100644 --- a/flytectl/cmd/config/subcommand/project/project_config_test.go +++ b/flytectl/cmd/config/subcommand/project/project_config_test.go @@ -5,25 +5,39 @@ import ( "testing" "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) func TestGetProjectSpec(t *testing.T) { + cf := &config.Config{ + Project: "flytesnacks1", + } t.Run("Successful get project spec", func(t *testing.T) { c := &ConfigProject{ Name: "flytesnacks", } - response, err := c.GetProjectSpec("flytesnacks") + response, err := c.GetProjectSpec(cf) assert.Nil(t, err) - assert.NotNil(t, response) + assert.Equal(t, "flytesnacks1", response.Id) }) + + t.Run("Error if project and ID both exist", func(t *testing.T) { + c := &ConfigProject{ + ID: "flytesnacks", + Name: "flytesnacks", + } + _, err := c.GetProjectSpec(cf) + assert.NotNil(t, err) + }) + t.Run("Successful get request spec from file", func(t *testing.T) { c := &ConfigProject{ File: "testdata/project.yaml", } - response, err := c.GetProjectSpec("flytesnacks") + response, err := c.GetProjectSpec(&config.Config{}) assert.Nil(t, err) assert.Equal(t, "flytesnacks", response.Name) assert.Equal(t, "flytesnacks test", response.Description) diff --git a/flytectl/cmd/create/project.go b/flytectl/cmd/create/project.go index b0bb4eba73..c6db389d05 100644 --- a/flytectl/cmd/create/project.go +++ b/flytectl/cmd/create/project.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -45,7 +46,7 @@ Create a project by definition file. ) func createProjectsCommand(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - projectSpec, err := project.DefaultProjectConfig.GetProjectSpec(project.DefaultProjectConfig.ID) + projectSpec, err := project.DefaultProjectConfig.GetProjectSpec(config.GetConfig()) if err != nil { return err } diff --git a/flytectl/cmd/create/project_test.go b/flytectl/cmd/create/project_test.go index 2de7ee24e1..e0c166db5c 100644 --- a/flytectl/cmd/create/project_test.go +++ b/flytectl/cmd/create/project_test.go @@ -7,6 +7,7 @@ import ( "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" @@ -36,6 +37,7 @@ func createProjectSetup() { project.DefaultProjectConfig.Name = "" project.DefaultProjectConfig.Labels = map[string]string{} project.DefaultProjectConfig.Description = "" + config.GetConfig().Project = "" } func TestCreateProjectFunc(t *testing.T) { s := setup() diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 7f8b2589e9..bec3d36b96 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -4,9 +4,8 @@ import ( "context" "fmt" - "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytestdlib/logger" @@ -54,7 +53,7 @@ Update projects.(project/projects can be used interchangeably in these commands) Update a project by definition file. Note: The name shouldn't contain any whitespace characters. :: - flytectl update project --file project.yaml + flytectl update project --file project.yaml .. code-block:: yaml @@ -84,10 +83,11 @@ Usage ) func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - projectSpec, err := project.DefaultProjectConfig.GetProjectSpec(config.GetConfig().Project) + projectSpec, err := project.DefaultProjectConfig.GetProjectSpec(config.GetConfig()) if err != nil { return err } + if projectSpec.Id == "" { return fmt.Errorf(clierrors.ErrProjectNotPassed) } From 9bcf5cc91441830abe141ac82d1a00f7a5bdcca5 Mon Sep 17 00:00:00 2001 From: Dan Rammer Date: Mon, 10 Jul 2023 14:32:24 -0500 Subject: [PATCH 312/645] Adding support for ArrayNode (#406) * hydrating arraynode subnode Signed-off-by: Daniel Rammer * updating flyteidl Signed-off-by: Daniel Rammer * added unit tests Signed-off-by: Daniel Rammer --------- Signed-off-by: Daniel Rammer --- flytectl/cmd/register/register_util.go | 4 + flytectl/cmd/register/register_util_test.go | 27 ++ flytectl/go.mod | 2 +- flytectl/go.sum | 366 +------------------- 4 files changed, 34 insertions(+), 365 deletions(-) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 714e30c76b..87d8be43db 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -247,6 +247,10 @@ func hydrateNode(node *core.Node, version string, force bool) error { } case *core.Node_GateNode: // Do nothing. + case *core.Node_ArrayNode: + if err := hydrateNode(v.ArrayNode.Node, version, force); err != nil { + return fmt.Errorf("failed to hydrateNode") + } default: return fmt.Errorf("unknown type %T", v) } diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 97a39082d2..9c9877ab6e 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -502,6 +502,33 @@ func TestHydrateNode(t *testing.T) { }) } +func TestHydrateArrayNode(t *testing.T) { + registerFilesSetup() + node := &core.Node{ + Target: &core.Node_ArrayNode{ + ArrayNode: &core.ArrayNode{ + Node: &core.Node{ + Target: &core.Node_TaskNode{ + TaskNode: &core.TaskNode{ + Reference: &core.TaskNode_ReferenceId{ + ReferenceId: &core.Identifier{ + ResourceType: core.ResourceType_TASK, + Project: "flytesnacks", + Domain: "development", + Name: "n1", + Version: "v1", + }, + }, + }, + }, + }, + }, + }, + } + err := hydrateNode(node, rconfig.DefaultFilesConfig.Version, true) + assert.Nil(t, err) +} + func TestHydrateGateNode(t *testing.T) { t.Run("Hydrate Sleep", func(t *testing.T) { registerFilesSetup() diff --git a/flytectl/go.mod b/flytectl/go.mod index 7a58eb186b..a3587885f0 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.5.10 + github.com/flyteorg/flyteidl v1.5.12 github.com/flyteorg/flytepropeller v1.1.1 github.com/flyteorg/flytestdlib v1.0.13 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/flytectl/go.sum b/flytectl/go.sum index 53f29a7edd..95855b56ca 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -1,4 +1,3 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898 h1:SC+c6A1qTFstO9qmB86mPV2IpYme/2ZoEQ0hrP+wo+Q= bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -40,7 +39,6 @@ cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNF cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= @@ -49,16 +47,13 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1 h1:8rBq3zRjnHx8UtBvaOWqBB1xq9jH6/wltfQLlTMh2Fw= cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= @@ -69,7 +64,6 @@ cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7ni cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.0 h1:NUV0NNp9nkBuW66BFRLuMgldN60C57ET3dhbwLIYio8= cloud.google.com/go/storage v1.22.0/go.mod h1:GbaLEoMqbVm6sx3Z0R++gSiBlgMv6yUi2q1DeGFKQgE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= @@ -125,18 +119,11 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0 h1:WVsrXCnHlDDX8ls+tootqRE87/hL9S/g4ewig9RsD/c= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DiSiqueira/GoTree v1.0.1-0.20180907134536-53a8e837f295 h1:xJ0dAkuxJXfwdH7IaSzBEbSQxEDz36YUmt7+CB4zoNA= -github.com/GoogleCloudPlatform/spark-on-k8s-operator v0.0.0-20200723154620-6f35a1152625 h1:cQyO5JQ2iuHnEcF3v24kdDMsgh04RjyFPDtuvD6PCE0= github.com/GoogleCloudPlatform/spark-on-k8s-operator v0.0.0-20200723154620-6f35a1152625/go.mod h1:6PnrZv6zUDkrNMw0mIoGRmGBR7i9LulhKPmxFq4rUiM= -github.com/Jeffail/gabs/v2 v2.5.1 h1:ANfZYjpMlfTTKebycu4X1AgkVWumFVDYQl7JwOr4mDk= github.com/Jeffail/gabs/v2 v2.5.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= @@ -155,62 +142,39 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3 github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.23 h1:47MSwtKGXet80aIn+7h4YI6fwPmwIghAnsx2aOUrG2M= github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3 h1:4FA+QBaydEHlwxg0lMN3rhwoDaQy6LKhVWR4qvq4BuA= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 h1:lsxEuwrXEAokXB9qhlbKWPpo3KMLZQ5WB5WLQRW1uq0= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/Shopify/sarama v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adammck/venv v0.0.0-20160819025605-8a9c907a37d3/go.mod h1:3zXR2a/VSQndtpShh783rUTaEA2mpqN2VqZclBARBc0= -github.com/adammck/venv v0.0.0-20200610172036-e77789703e7c h1:RoL0r3mR3JSkLur8q8AD59cByJ+kRwJHODNimZBd7GI= github.com/adammck/venv v0.0.0-20200610172036-e77789703e7c/go.mod h1:3zXR2a/VSQndtpShh783rUTaEA2mpqN2VqZclBARBc0= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae h1:AMzIhMUqU3jMrZiTuW0zkYeKlKDAFD+DG20IoO421/Y= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a h1:pv34s756C4pEXnjgPfGYgdhg/ZdajGhyOvzx8k+23nw= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= @@ -220,9 +184,7 @@ github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHS github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= -github.com/aws/amazon-sagemaker-operator-for-k8s v1.0.1-0.20210303003444-0fb33b1fd49d h1:O+ayl/Vp3bDEXReXItmYHzCnsz/LKusXdRNiJKVxjPs= github.com/aws/amazon-sagemaker-operator-for-k8s v1.0.1-0.20210303003444-0fb33b1fd49d/go.mod h1:mZUP7GJmjiWtf8v3FD1X/QdK08BqyeH/1Ejt0qhNzCs= -github.com/aws/aws-lambda-go v1.13.3 h1:SuCy7H3NLyp+1Mrfp+m80jcbi9KYWAs9/BXwppwRDzY= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -233,113 +195,74 @@ github.com/aws/aws-sdk-go v1.44.2 h1:5VBk5r06bgxgRKVaUtm1/4NT/rtrnH2E4cnAYv5zgQc github.com/aws/aws-sdk-go v1.44.2/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.0.0/go.mod h1:smfAbmpW+tcRVuNUjo3MOArSZmW72t62rkCzc2i0TWM= -github.com/aws/aws-sdk-go-v2 v1.2.0 h1:BS+UYpbsElC82gB+2E2jiCBg36i8HlubTB/dO/moQ9c= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.0.0 h1:x6vSFAwqAvhYPeSu60f0ZUlGHo3PKKmwDOTL8aMXtv4= github.com/aws/aws-sdk-go-v2/config v1.0.0/go.mod h1:WysE/OpUgE37tjtmtJd8GXgT8s1euilE5XtUkRNUQ1w= -github.com/aws/aws-sdk-go-v2/credentials v1.0.0 h1:0M7netgZ8gCV4v7z1km+Fbl7j6KQYyZL7SS0/l5Jn/4= github.com/aws/aws-sdk-go-v2/credentials v1.0.0/go.mod h1:/SvsiqBf509hG4Bddigr3NB12MIpfHhZapyBurJe8aY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.0 h1:lO7fH5n7Q1dKcDBpuTmwJylD1bOQiRig8LI6TD9yVQk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.0/go.mod h1:wpMHDCXvOXZxGCRSidyepa8uJHY4vaBGfY2/+oKU/Bc= -github.com/aws/aws-sdk-go-v2/service/athena v1.0.0 h1:UfrZP3NMTTKpOsf/P8uCaOxz3U2CNGEizdQKcObY7Ds= github.com/aws/aws-sdk-go-v2/service/athena v1.0.0/go.mod h1:qY8QFbemf2ceqweXcS6hQqiiIe1z42WqTvHsK2Lb0rE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.0 h1:IAutMPSrynpvKOpHG6HyWHmh1xmxWAmYOK84NrQVqVQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.0/go.mod h1:3jExOmpbjgPnz2FJaMOfbSk1heTkZ66aD3yNtVhnjvI= -github.com/aws/aws-sdk-go-v2/service/sts v1.0.0 h1:6XCgxNfE4L/Fnq+InhVNd16DKc6Ue1f3dJl3IwwJRUQ= github.com/aws/aws-sdk-go-v2/service/sts v1.0.0/go.mod h1:5f+cELGATgill5Pu3/vK3Ebuigstc+qYEHW5MvGWZO4= github.com/aws/smithy-go v1.0.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/aws/smithy-go v1.1.0 h1:D6CSsM3gdxaGaqXnPgOBCeL6Mophqzu7KJOu7zW78sU= github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1 h1:VRtJdDi2lqc3MFwmouppm2jlm6icF+7H3WYKpLENMTo= github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bradleyfalzon/ghinstallation/v2 v2.0.3 h1:ywF/8q+GVpvlsEuvRb1SGSDQDUxntW1d4kFu/9q/YAE= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1 h1:pgAtgj+A31JBVtEHu2uHuEx0n+2ukqUJnS2vVe5pQNA= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44 h1:y853v6rXx+zefEcjET3JuKAqvhj+FKflQijjeaSv2iA= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/casbin/casbin/v2 v2.1.2 h1:bTwon/ECRx9dwBy2ewRVr5OiqjeXSGiTUY74sDPQi/g= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0 h1:WW2B2uxx9KWF6bGlHqhm8Okiafwwx7Y2kcpn8lCpjgo= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0 h1:TW8f/UvntYoVDMN1K2HlT82qH1rb0sOjpGw3m6Ym+i4= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2 h1:iHsfF/t4aW4heW2YKfeHrVPGdtYTL4C4KocpM8KTSnI= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec h1:EdRZT3IeKQmfCSrgo8SZ8V3MEnskuJP0wCYNpe+aiXo= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4 h1:hzAQntlaYRkVSFEfj9OTWlVV1H155FMD8BTKktLv0QI= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 h1:zH8ljVhhq7yC0MIeUL/IviMtY8hx2mK8cN9wEYb8ggw= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0 h1:osn1exbzdub9L5SouXO5swW4ea/xVdJZ3wokxN5GrnA= github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= @@ -347,13 +270,11 @@ github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1 github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1 h1:iJnMvco9XGvKUvNQkv88bE4uJXxRQH18efbKo9w5vHQ= github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2 h1:Pi6D+aZXM+oUw1czuKgH5IJ+y0jhYcwBJfx5/Ghn9dE= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -376,92 +297,70 @@ github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU= github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2 h1:YbJAhpTevL2v6u8JC1NhCYRwf+3Vzxcc5vGnYoJ7VeE= github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1 h1:LBwiTfoUsdiEGAR1TpvxE+Gzt7469oVu87iR3mv3Byc= github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0 h1:6QioHRlThlKh2RkRTR4kIT3PKAcrLo3gIWnjkM4dQmQ= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0 h1:cXLJbx+4Jj7rNsTiqVfm6i+RNLx6FFA2fMmDlEf+Wm8= github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1 h1:7zpDnQ3T3s4ucOuJ/ZCLrYBxzkg0AELFfII3Epo9TmI= github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1 h1:FD1tADPls2EEi3flPc2OegIY1M9pUa9r2Quag7HMLV8= github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1 h1:prL8l9w3ntVqXvNH1CiNn5ENjcCnr38JqpSyvKKB4GI= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= -github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0 h1:mw6SAibtHKZcNzAsOxjoHIG0gy5YFHhypWSSNc6EjbQ= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -469,29 +368,20 @@ github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKY github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c h1:Xo2rK1pzOm0jO6abTPIQwbAmqBIOj132otexc1mmzFc= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0 h1:suYBsYZIkSlUMEz4TAYCczKf62IA2UWC+O8+KtdOhCo= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5 h1:+CpLbZIeUn94m02LdEKPcgErLJ347NUwxPKs5u8ieiY= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4 h1:itqmmf1PFpC4n5JW+j4BU7X4MTfVurhYRTjODoPb2Y8= github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/danieljoos/wincred v1.1.0 h1:3RNcEpBg4IhIChZdFRSdlQt1QjCp1sMAPIrOnm7Yf8g= github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/disiqueira/gotree v1.0.0 h1:en5wk87n7/Jyk6gVME3cx3xN9KmUCstJ1IjHr4Se4To= github.com/disiqueira/gotree v1.0.0/go.mod h1:7CwL+VWsWAU95DovkdRZAtA7YbtHwGk+tLV/kNi8niU= @@ -510,36 +400,25 @@ github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05b github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.6+incompatible h1:tfrHha8zJ01ywiOEC1miGY8st1/igzWB8OmvPgoYX7w= github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/enescakir/emoji v1.0.0 h1:W+HsNql8swfCQFtioDGDHCHri8nudlK1n5p2rHCJoog= github.com/enescakir/emoji v1.0.0/go.mod h1:Bt1EKuLnKDTYpLALApstIkAjdDrS/8IAgTkKp+WKFD0= @@ -552,11 +431,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 h1:xvqufLtNVwAhN8NMyWklVgxnWohi+wtMGQMhtxexlm0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -567,11 +443,10 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.5.10 h1:SHeiaWRt8EAVuFsat+BJswtc07HTZ4DqhfTEYSm621k= -github.com/flyteorg/flyteidl v1.5.10/go.mod h1:EtE/muM2lHHgBabjYcxqe9TWeJSL0kXwbI0RgVwI4Og= +github.com/flyteorg/flyteidl v1.5.12 h1:bCSSie8Yru1e9yLHWPO3ORksHHskK+bmkxln/jV3bXM= +github.com/flyteorg/flyteidl v1.5.12/go.mod h1:EtE/muM2lHHgBabjYcxqe9TWeJSL0kXwbI0RgVwI4Og= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= @@ -582,44 +457,31 @@ github.com/flyteorg/flytestdlib v1.0.13/go.mod h1:nIBmBHtjTJvhZEn3e/EwVC/iMkR2tU github.com/flyteorg/stow v0.3.3/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= github.com/flyteorg/stow v0.3.6 h1:jt50ciM14qhKBaIrB+ppXXY+SXB59FNREFgTJqCyqIk= github.com/flyteorg/stow v0.3.6/go.mod h1:5dfBitPM004dwaZdoVylVjxFT4GWAgI0ghAndhNUzCo= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db h1:gb2Z18BhTPJPpLQWj4T+rfKHYCHxRHCtRxhKKjRidVw= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCgVZh26+ZbGyoVJG7yb5SSzF5H54= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= @@ -629,79 +491,63 @@ github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= -github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY= github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5 h1:QhCBKRYqZR+SKo4gl1lPhPahope8/RLt6EVgY8X80w0= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es= github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew= -github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U= -github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= -github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= @@ -710,7 +556,6 @@ github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZg github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -726,7 +571,6 @@ github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw github.com/golang-jwt/jwt/v4 v4.4.1 h1:pC5DB52sCeK48Wlb9oPcdhnjkz1TKt1D/P7WKJ0kUcQ= github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -742,7 +586,6 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -764,10 +607,8 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -784,7 +625,6 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-github/v39 v39.0.0 h1:pygGA5ySwxEez1N39GnDauD0PaWWuGgayudyZAc941s= github.com/google/go-github/v42 v42.0.0 h1:YNT0FwjPrEysRkLIiKuEfSvBPCGKphW5aS5PxwaoLec= github.com/google/go-github/v42 v42.0.0/go.mod h1:jgg/jvyI0YlDOM1/ps6XYh04HNQ3vKf0CVko62/EhRg= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -815,11 +655,8 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/readahead v0.0.0-20161222183148-eaceba169032 h1:6Be3nkuJFyRfCgr6qTIzmRp8y9QwDIbqy/nYr9WDPos= github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= -github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -841,15 +678,10 @@ github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwu github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33 h1:893HsJqtxp9z1SF76gg6hY70hRY1wVlTSnC/h1yUDCo= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -858,9 +690,7 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -874,36 +704,23 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -911,20 +728,13 @@ github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+l github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0 h1:WhIgCr5a7AaVH6jPUwjtRuuE7/RDufnUvzIr48smyxs= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.7 h1:hkdgbqizGQHuU5IPqYM1JdSMV8nKfpuOnZYXssk9muY= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0 h1:0U6+BtN6LhaYuTnIJq4Wyq5cpn6O2kWrxAtcqBmYY6w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -935,16 +745,11 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56 h1:742eGXur0715JMq73aD95/FU0XpVKXqNuTnEfXsLOYQ= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.3 h1:PlHq1bSCSZL9K0wUhbm2pGLoTWs2GwVhsP6emvGV/ZI= github.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -953,11 +758,8 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -967,12 +769,9 @@ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= @@ -980,47 +779,33 @@ github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 h1:M8exrBzuhWc github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23/go.mod h1:kBSna6b0/RzsOcOZf515vAXwSsXYusl2U7SA0XP09yI= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13 h1:eSvu8Tmq6j2psUJqJrLcWH6K3w5Dwc+qipbaA6eVEN4= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kubeflow/common v0.4.0 h1:7NQzVoN9fvFP6npj4pG6iii/IC+K6NHy3OJPew96Eyw= github.com/kubeflow/common v0.4.0/go.mod h1:X15/dRQQoB77wrqrPwVn4GqG2ubgk8xR24A80i61d/4= -github.com/kubeflow/mpi-operator/v2 v2.0.0-20210920181600-c5c0c3ef99ec h1:TQEPmrkz2xJH6nR8BJxGBIoZlJ1UTp6yYbIz/PiY9ts= github.com/kubeflow/mpi-operator/v2 v2.0.0-20210920181600-c5c0c3ef99ec/go.mod h1:cTBmZKLlrIXBWQ0A9Ik8h0i4zoGhR7ApHwUfrLDbhQc= -github.com/kubeflow/pytorch-operator v0.6.0 h1:y9Vzk7Jd5H/s610Y+ucURypCHgJugB25UL8GEz4DRL4= github.com/kubeflow/pytorch-operator v0.6.0/go.mod h1:zHblV+yTwVG4PCgKTU2wPfOmQ6TJdfT87lDfHrP1a1Y= -github.com/kubeflow/tf-operator v0.5.3 h1:Ejn5vEAwHBKHU2sJTlUIRpezqIX3WeqXZ2dZx6zn6vY= github.com/kubeflow/tf-operator v0.5.3/go.mod h1:EBtz5LQoKaHUl/5fV5vD1qXVNVNyn3TrFaH6eVoQ8SY= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1 h1:vi1F1IQ8N7hNWytK9DpJsUfQhGuNSc19z330K6vl4zk= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lyft/protoc-gen-validate v0.0.13 h1:KNt/RhmQTOLr7Aj8PsJ7mTronaFyx80mRTT9qF261dA= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -1033,9 +818,7 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -1052,43 +835,29 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.3 h1:K/VxK7SZ+cvuPgFSLKi5QPI9Vr/ipOf4C1gN+ntueUk= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/pkcs11 v1.0.3 h1:iMwmD7I5225wv84WxIG/bmxz9AXjWvTWIbM/TYHvWtw= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f h1:2+myh5ml7lgEU/51gbeLHfKGNfgEQQIWrlbdaOsidbQ= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1 h1:1O+1cHA1aujwEwwVMa2Xm2l+gIpUHyd3+D+d7LZh1kM= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/symlink v0.1.0 h1:MTFZ74KtNI6qQQpuBxU+uKCim4WtOMokr03hCfJcazE= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= @@ -1100,49 +869,34 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mouuff/go-rocket-update v1.5.1 h1:qGgUu/MP+aVQ63laEguRNimmNTPKs29xz0lZW6QRFaQ= github.com/mouuff/go-rocket-update v1.5.1/go.mod h1:CnOyUYCxAJyC1g1mebSGC7gJysLTlX+RpxKgD1B0zLs= -github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2 h1:+RB5hMpXUUA2dfxuhBTEkMOrYmM+gKIZYS1KjSostMI= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2 h1:i2Ly0B+1+rzNZHHWtD4ZwKi+OU5l+uQo1iDHZ2PmiIc= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1 h1:ik3HbLhZ0YABLto7iX80pZLPw/6dx3T+++MZJwLnMrQ= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3 h1:6JrEfig+HzTH85yxzhSVbjHRJv9cn0p6n3IngIcM5/k= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/oklog v0.3.2 h1:wVfs8F+in6nTBMkA7CbRw+zZMIB7nNM825cM1wuzoTk= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 h1:58+kh9C6jJVXYjt8IE48G2eWl6BjwU5Gj0gqY84fy78= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1164,7 +918,6 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -1181,39 +934,27 @@ github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59P github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2 h1:opHZMaswlyxz1OuGpBE53Dwe4/xF7EZTY0A2L/FpCOg= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39 h1:H7DMc6FAjgwZZi8BRqjrAAHWoqEr5e5L6pS4V0ezet4= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2 h1:c4ca10UMgRcvZ6h0K4HtS15UaVSBEaE+iln2LVpAuGc= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5 h1:ZCnq+JUrvXcDVhX/xRolRBZifmabN1HcS1wrPSvxhrU= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2 h1:nY8Hti+WKaP0cRsSeQ026wU03QsM762XBeCXBb9NAWI= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4 h1:OYkFijGHoZAYbOIb1LWXrwKQbMMRUv1oQ89blD2Mh2Q= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= @@ -1221,12 +962,9 @@ github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhEC github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0= github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/performancecopilot/speed v3.0.0+incompatible h1:2WnRzIquHa5QxaJKShDkLM+sc0JPuwhXzK8OYOyt3Vg= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= @@ -1235,20 +973,15 @@ github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1 h1:F++O52m40owAmADcojzM+9gyjmMOY/T4oYJkgFDH8RE= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pkg/sftp v1.13.4 h1:Lb0RYJCmgUcBgZosfoi9Y9sbl6+LJgOIgk/2Y4YjMFg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021 h1:0XM1XL/OFFJjXsYXlG30spTkV/E9+gmd5GD1w2HE8xM= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -1299,38 +1032,24 @@ github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8 h1:2c1EFnZHIPCW8qKWgHMH/fX2PkSabFc5mrVzfUNdg5U= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/sagikazarmark/crypt v0.5.0 h1:K6qABjdpr5rjHCw6q4rSdeM+8kNmdIHvEPDvEMkoai4= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da h1:p3Vo3i64TCLY7gIfzeQaUJ+kppEO5WQG3cL8iE8tGHU= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1 h1:NJjM5DNFOs0s3kYE1WUOr6G8V97sdt46rlXTMfXGWBo= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -1341,14 +1060,10 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1383,14 +1098,10 @@ github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271 h1:WhxRHzgeVGETMlmVfqhRn8RIeeNoPr2Czh33I4Zdccw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a h1:AhmOdSHeswKHBjhsLs/7+1voOxT+LLrSk/Nxvk35fug= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1411,46 +1122,30 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible h1:JvoDL7JSoIP2HDE8AbDH3zC8QBPxmzYe32HHy5yQ+Ck= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vektah/gqlparser v1.1.2 h1:ZsyLGn7/7jDNI+y4SEhI4yAxRChlv15pUHMjijT+e68= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 h1:cPXZWzzG0NllBLdjWoD1nDfaqu98YMv+OneaKc8sPOA= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae h1:4hwBBUfQCFe3Cym0ZtKyq7L16eZUtYKs+BaHDN6mAns= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f h1:mvXjJIHRZyhNuGassLTcXTwjiWq7NmjdavZsUnmFybQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= @@ -1459,32 +1154,21 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1 h1:/vn0k+RBvwlxEmP5E7SZMqNxPhfMVFEJiykr15/0XKM= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zalando/go-keyring v0.1.1 h1:w2V9lcx/Uj4l+dzAf1m9s+DJ1O8ROkEHnynonHjTcYE= github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRzC8UFJH9+L8= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.2 h1:tXok5yLlKyuQ/SXSjtqHc4uzNaMqZi2XsoSPr/LlJXI= -go.etcd.io/etcd/client/pkg/v3 v3.5.2 h1:4hzqQ6hIb3blLyQ8usCU4h3NghkqcsohEQ3o3VetYxE= -go.etcd.io/etcd/client/v2 v2.305.2 h1:ymrVwTkefuqA/rPkSW7/B4ApijbPVefRumkY+stNfS0= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2 h1:jxcFYjlkl8xaERsgLo+RNquI0epW6zuy/ZRQs6jnrFA= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1497,28 +1181,22 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1562,7 +1240,6 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/exp v0.0.0-20220428152302-39d4317da171 h1:TfdoLivD44QwvssI9Sv1xwa5DcL5XQr4au4sZ2F2NV4= golang.org/x/exp v0.0.0-20220428152302-39d4317da171/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -1575,10 +1252,8 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= @@ -1590,7 +1265,6 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1690,7 +1364,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1907,7 +1580,6 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1915,7 +1587,6 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k= gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= @@ -1969,7 +1640,6 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 h1:Cpp2P6TPjujNoC5M2KHY6g7wfyLYfIWRZaSdIKfDasA= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2094,7 +1764,6 @@ google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5 google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0 h1:oCjezcn6g6A75TGoKYBPgKmVBLexhYLM6MebdrPApP8= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2111,9 +1780,7 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2122,15 +1789,10 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -2139,18 +1801,13 @@ gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= -gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 h1:2TSTkQ8PMvGOD5eeqqRVv6Z9+BYI+bowK97RCr3W+9M= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2168,7 +1825,6 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/gorm v1.22.4 h1:8aPcyEJhY0MAt8aY6Dc524Pn+pO29K+ydu+e/cXSpQM= gorm.io/gorm v1.22.4/go.mod h1:1aeVC+pe9ZmvKZban/gW4QPra7PRoTEssyc922qCAkk= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= @@ -2182,7 +1838,6 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= @@ -2222,7 +1877,6 @@ k8s.io/apiserver v0.19.6/go.mod h1:05XquZxCDzQ27ebk7uV2LrFIK4lm5Yt47XkkUvLAoAM= k8s.io/apiserver v0.19.9/go.mod h1:g6zpD+kcZFlO73pktPWRvL0tUGqj7/KaOowmRk8EpGg= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6 h1:NnVriMMOpqQX+dshbDoZixqmBhfgrPk2uOh2fzp9vHE= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= @@ -2242,7 +1896,6 @@ k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8 k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= k8s.io/code-generator v0.19.6/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= k8s.io/code-generator v0.19.9/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.20.1 h1:kre3GNich5gbO3d1FyTT8fHI4ZJezZV217yFdWlQaRQ= k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= @@ -2252,22 +1905,18 @@ k8s.io/component-base v0.19.9/go.mod h1:x9UmpImvXgVry1s9/hINgLz6iGBYUGvy3Xm7KZh1 k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.2/go.mod h1:pzFtCiwe/ASD0iV7ySMu8SYVJjCapNM9bjvk7ptpKh0= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6 h1:G0inASS5vAqCpzs7M4Sp9dv9d0aElpz39zDHbSB4f4g= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6 h1:iXX0K2pRrbR8yXbZtDK/bSnmg/uSqIFiVJK1x4LUOMc= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded h1:JApXBKYyB7l9xx+DK7/+mFjC7A9Bt5A93FPvFD0HIFE= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= @@ -2281,9 +1930,7 @@ k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/sample-controller v0.19.9 h1:t1d9lOiVbxHs77/XljqtvdQkqWI1G0olWZZo6RUBnPA= k8s.io/sample-controller v0.19.9/go.mod h1:pzC7f1rPpf0+o9rg45Ju8GY83nGARzWABmPblej9v/M= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= @@ -2292,25 +1939,18 @@ k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ= k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15 h1:4uqm9Mv+w2MmBYD+F4qf/v6tDFUdPOk29C095RbU5mY= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E= sigs.k8s.io/controller-runtime v0.7.2/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= -sigs.k8s.io/controller-runtime v0.8.2 h1:SBWmI0b3uzMIUD/BIXWNegrCeZmPJ503pOtwxY0LPHM= sigs.k8s.io/controller-runtime v0.8.2/go.mod h1:U/l+DUopBc1ecfRZ5aviA9JDmGFQKvLf5YkZNx2e0sU= -sigs.k8s.io/controller-tools v0.3.0 h1:y3YD99XOyWaXkiF1kd41uRvfp/64teWcrEZFuHxPhJ4= sigs.k8s.io/controller-tools v0.3.0/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= @@ -2321,7 +1961,5 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -volcano.sh/apis v1.2.0-k8s1.19.6 h1:ddSHBrxHOVpGVSYQC/e696tDmCQ2dPm/Adg7aTQdOPI= volcano.sh/apis v1.2.0-k8s1.19.6/go.mod h1:UaeJ/s5Hyd+ZhFLc+Kw9YlgM8gRZ/5OzXqHa0yKOoXY= From e2adac497a08d16f5dbd7aa7a86cbcefefadcedd Mon Sep 17 00:00:00 2001 From: Jeev B Date: Fri, 21 Jul 2023 16:27:31 -0700 Subject: [PATCH 313/645] Expose buildkit port (#413) * Expose buildkit port Signed-off-by: Jeev B * fix test Signed-off-by: Jeev B --------- Signed-off-by: Jeev B --- flytectl/pkg/docker/docker_util.go | 1 + flytectl/pkg/docker/docker_util_test.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 221fb32eab..a4e768bb9b 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -139,6 +139,7 @@ func GetDemoPorts() (map[nat.Port]struct{}, map[nat.Port][]nat.PortBinding, erro "0.0.0.0:30000:30000", // Registry Port "0.0.0.0:30001:30001", // Postgres Port "0.0.0.0:30002:30002", // Minio API Port (use HTTP port for minio console) + "0.0.0.0:30003:30003", // Buildkit Port }) } diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index f1b8f7b33a..83e5bc9703 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -404,7 +404,7 @@ func TestGetOrCreateVolume(t *testing.T) { func TestDemoPorts(t *testing.T) { _, ports, _ := GetDemoPorts() - assert.Equal(t, 5, len(ports)) + assert.Equal(t, 6, len(ports)) } func TestCopyFile(t *testing.T) { From ee25d67b71f43ac4329d18e5f7d063e2fc0782c9 Mon Sep 17 00:00:00 2001 From: David Q Mertz Date: Tue, 25 Jul 2023 01:17:19 -0400 Subject: [PATCH 314/645] Consistent language about 'git revision SHA1' (#414) Signed-off-by: David Mertz --- flytectl/cmd/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go index 89e3c9eb80..b5ff9cfe6f 100644 --- a/flytectl/cmd/version/version.go +++ b/flytectl/cmd/version/version.go @@ -33,7 +33,7 @@ Fetch Flytectl version. type versionOutput struct { // Specifies the Name of app App string `json:"App,omitempty"` - // Specifies the GIT sha of the build + // Specifies the git revision SHA1 of the build Build string `json:"Build,omitempty"` // Version for the build, should follow a semver Version string `json:"Version,omitempty"` From 69232033df1a835509d1ce7e65160afd2cb17d38 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Tue, 25 Jul 2023 05:23:05 -0700 Subject: [PATCH 315/645] Force go 1.19.10 in goreleaser (#415) --- flytectl/.github/workflows/checks.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flytectl/.github/workflows/checks.yml b/flytectl/.github/workflows/checks.yml index f8291164fe..2a66200dac 100644 --- a/flytectl/.github/workflows/checks.yml +++ b/flytectl/.github/workflows/checks.yml @@ -152,6 +152,10 @@ jobs: name: Goreleaser needs: [ bump_version ] # Only to ensure it can successfully build uses: flyteorg/flytetools/.github/workflows/goreleaser.yml@master + with: + # https://github.com/docker/cli/issues/4437 describes an issue that affects the latest + # version of go 1.19 and 1.20, so pinning to latest known good version for now. + go-version: "1.19.10" secrets: FLYTE_BOT_PAT: ${{ secrets.FLYTE_BOT_PAT }} From 0e3f2a8626912db44577144fb21c64e244bdad7c Mon Sep 17 00:00:00 2001 From: Future-Outlier Date: Sun, 17 Sep 2023 15:17:50 +0800 Subject: [PATCH 316/645] Fix case for No string to no (#419) Signed-off-by: Future Outlier Co-authored-by: Future Outlier --- flytectl/pkg/commandutils/command_utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/pkg/commandutils/command_utils.go b/flytectl/pkg/commandutils/command_utils.go index 1593abf880..2d9dfbf81c 100644 --- a/flytectl/pkg/commandutils/command_utils.go +++ b/flytectl/pkg/commandutils/command_utils.go @@ -14,7 +14,7 @@ func AskForConfirmation(s string, reader io.Reader) bool { response := strings.ToLower(strings.TrimSpace(r.Text())) if response == "y" || response == "yes" { return true - } else if response == "n" || response == "No" { + } else if response == "n" || response == "no" { return false } } From b708356b8fc79cf4899b4d27645503b9c4144dd6 Mon Sep 17 00:00:00 2001 From: kamaleybov <54046807+kamaleybov@users.noreply.github.com> Date: Tue, 3 Oct 2023 15:17:05 -0700 Subject: [PATCH 317/645] Manually pull latest boilerplate (#427) Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> --- .../flyte/golang_support_tools/go.mod | 289 +++-- .../flyte/golang_support_tools/go.sum | 1037 ++++++++--------- .../golang_test_targets/download_tooling.sh | 2 +- 3 files changed, 646 insertions(+), 682 deletions(-) diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.mod b/flytectl/boilerplate/flyte/golang_support_tools/go.mod index dbf94f4113..2cfeb8aa3a 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.mod +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.mod @@ -1,19 +1,27 @@ module github.com/flyteorg/boilerplate -go 1.17 +go 1.19 require ( github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf github.com/alvaroloes/enumer v1.1.2 github.com/flyteorg/flytestdlib v0.4.16 - github.com/golangci/golangci-lint v1.38.0 + github.com/golangci/golangci-lint v1.53.3 github.com/pseudomuto/protoc-gen-doc v1.4.1 ) require ( - 4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a // indirect - cloud.google.com/go v0.75.0 // indirect - cloud.google.com/go/storage v1.12.0 // indirect + 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect + 4d63.com/gochecknoglobals v0.2.1 // indirect + cloud.google.com/go v0.110.2 // indirect + cloud.google.com/go/compute v1.19.3 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/iam v1.1.2 // indirect + cloud.google.com/go/storage v1.29.0 // indirect + github.com/4meepo/tagalign v1.2.2 // indirect + github.com/Abirdcfly/dupword v0.0.11 // indirect + github.com/Antonboom/errname v0.1.10 // indirect + github.com/Antonboom/nilnil v0.1.5 // indirect github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect @@ -24,171 +32,216 @@ require ( github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/logger v0.2.0 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v0.3.1 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect + github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.15.0+incompatible // indirect - github.com/OpenPeeDeeP/depguard v1.0.1 // indirect + github.com/OpenPeeDeeP/depguard/v2 v2.1.0 // indirect + github.com/alexkohler/nakedret/v2 v2.0.2 // indirect github.com/alexkohler/prealloc v1.0.0 // indirect + github.com/alingse/asasalint v0.0.11 // indirect github.com/aokoli/goutils v1.0.1 // indirect - github.com/ashanbrown/forbidigo v1.1.0 // indirect - github.com/ashanbrown/makezero v0.0.0-20201205152432-7b7cdbb3025a // indirect + github.com/ashanbrown/forbidigo v1.5.3 // indirect + github.com/ashanbrown/makezero v1.1.1 // indirect github.com/aws/aws-sdk-go v1.37.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bkielbasa/cyclop v1.2.0 // indirect - github.com/bombsimon/wsl/v3 v3.2.0 // indirect + github.com/bkielbasa/cyclop v1.2.1 // indirect + github.com/blizzy78/varnamelen v0.8.0 // indirect + github.com/bombsimon/wsl/v3 v3.4.0 // indirect + github.com/breml/bidichk v0.2.4 // indirect + github.com/breml/errchkjson v0.3.1 // indirect + github.com/butuzov/ireturn v0.2.0 // indirect + github.com/butuzov/mirror v1.1.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.1 // indirect - github.com/charithe/durationcheck v0.0.6 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/charithe/durationcheck v0.0.10 // indirect + github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 // indirect github.com/coocood/freecache v1.1.1 // indirect - github.com/daixiang0/gci v0.2.8 // indirect + github.com/curioswitch/go-reassign v0.2.0 // indirect + github.com/daixiang0/gci v0.10.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/denis-tingajkin/go-header v0.4.2 // indirect - github.com/envoyproxy/protoc-gen-validate v0.3.0-java // indirect + github.com/denis-tingaikin/go-header v0.4.3 // indirect + github.com/envoyproxy/protoc-gen-validate v0.10.0 // indirect github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 // indirect - github.com/esimonov/ifshort v1.0.1 // indirect - github.com/fatih/color v1.10.0 // indirect + github.com/esimonov/ifshort v1.0.4 // indirect + github.com/ettle/strcase v0.1.1 // indirect + github.com/fatih/color v1.15.0 // indirect github.com/fatih/structtag v1.2.0 // indirect + github.com/firefart/nonamedreturns v1.0.4 // indirect github.com/flyteorg/stow v0.3.1 // indirect github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/fzipp/gocyclo v0.3.1 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fzipp/gocyclo v0.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-critic/go-critic v0.5.4 // indirect - github.com/go-logr/logr v0.4.0 // indirect - github.com/go-toolsmith/astcast v1.0.0 // indirect - github.com/go-toolsmith/astcopy v1.0.0 // indirect - github.com/go-toolsmith/astequal v1.0.0 // indirect - github.com/go-toolsmith/astfmt v1.0.0 // indirect - github.com/go-toolsmith/astp v1.0.0 // indirect - github.com/go-toolsmith/strparse v1.0.0 // indirect - github.com/go-toolsmith/typep v1.0.2 // indirect - github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect + github.com/go-critic/go-critic v0.8.1 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-toolsmith/astcast v1.1.0 // indirect + github.com/go-toolsmith/astcopy v1.1.0 // indirect + github.com/go-toolsmith/astequal v1.1.0 // indirect + github.com/go-toolsmith/astfmt v1.1.0 // indirect + github.com/go-toolsmith/astp v1.1.0 // indirect + github.com/go-toolsmith/strparse v1.1.0 // indirect + github.com/go-toolsmith/typep v1.1.0 // indirect + github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/flock v0.8.0 // indirect + github.com/gofrs/flock v0.8.1 // indirect github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.4.3 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect - github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 // indirect - github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a // indirect + github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect + github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 // indirect github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect - github.com/golangci/misspell v0.3.5 // indirect - github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5 // indirect + github.com/golangci/misspell v0.4.0 // indirect + github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect - github.com/google/go-cmp v0.5.4 // indirect - github.com/google/uuid v1.1.2 // indirect - github.com/googleapis/gax-go/v2 v2.0.5 // indirect - github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 // indirect - github.com/gostaticanalysis/analysisutil v0.4.1 // indirect - github.com/gostaticanalysis/comment v1.4.1 // indirect - github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/s2a-go v0.1.4 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.11.0 // indirect + github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 // indirect + github.com/gostaticanalysis/analysisutil v0.7.1 // indirect + github.com/gostaticanalysis/comment v1.4.2 // indirect + github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect github.com/gostaticanalysis/nilerr v0.1.1 // indirect + github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hexops/gotextdiff v1.0.3 // indirect github.com/huandu/xstrings v1.0.0 // indirect github.com/imdario/mergo v0.3.5 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/jgautheron/goconst v1.4.0 // indirect - github.com/jingyugao/rowserrcheck v0.0.0-20210130005344-c6a0c12dd98d // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jgautheron/goconst v1.5.1 // indirect + github.com/jingyugao/rowserrcheck v1.1.1 // indirect github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/jstemmer/go-junit-report v0.9.1 // indirect - github.com/julz/importas v0.0.0-20210226073942-60b4fa260dd0 // indirect - github.com/kisielk/errcheck v1.6.0 // indirect + github.com/julz/importas v0.1.0 // indirect + github.com/kisielk/errcheck v1.6.3 // indirect github.com/kisielk/gotool v1.0.0 // indirect - github.com/kulti/thelper v0.4.0 // indirect - github.com/kunwardeep/paralleltest v1.0.2 // indirect - github.com/kyoh86/exportloopref v0.1.8 // indirect - github.com/magefile/mage v1.10.0 // indirect - github.com/magiconair/properties v1.8.4 // indirect - github.com/maratori/testpackage v1.0.1 // indirect - github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 // indirect - github.com/mattn/go-colorable v0.1.8 // indirect - github.com/mattn/go-isatty v0.0.12 // indirect - github.com/mattn/go-runewidth v0.0.7 // indirect + github.com/kkHAIKE/contextcheck v1.1.4 // indirect + github.com/kulti/thelper v0.6.3 // indirect + github.com/kunwardeep/paralleltest v1.0.7 // indirect + github.com/kyoh86/exportloopref v0.1.11 // indirect + github.com/ldez/gomoddirectives v0.2.3 // indirect + github.com/ldez/tagliatelle v0.5.0 // indirect + github.com/leonklingele/grouper v1.1.1 // indirect + github.com/lufeee/execinquery v1.2.1 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/maratori/testableexamples v1.0.0 // indirect + github.com/maratori/testpackage v1.1.1 // indirect + github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mbilski/exhaustivestruct v1.2.0 // indirect - github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 // indirect - github.com/mgechev/revive v1.0.3 // indirect + github.com/mgechev/revive v1.3.2 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.4.1 // indirect - github.com/moricho/tparallel v0.2.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moricho/tparallel v0.3.1 // indirect github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect - github.com/nakabonne/nestif v0.3.0 // indirect - github.com/nbutton23/zxcvbn-go v0.0.0-20201221231540-e56b841a3c88 // indirect + github.com/nakabonne/nestif v0.3.1 // indirect + github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect github.com/ncw/swift v1.0.53 // indirect - github.com/nishanths/exhaustive v0.1.0 // indirect - github.com/nishanths/predeclared v0.2.1 // indirect - github.com/olekukonko/tablewriter v0.0.4 // indirect + github.com/nishanths/exhaustive v0.11.0 // indirect + github.com/nishanths/predeclared v0.2.2 // indirect + github.com/nunnatsa/ginkgolinter v0.12.1 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 // indirect - github.com/pelletier/go-toml v1.8.1 // indirect - github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f // indirect - github.com/prometheus/client_golang v1.9.0 // indirect + github.com/polyfloyd/go-errorlint v1.4.2 // indirect + github.com/prometheus/client_golang v1.12.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.15.0 // indirect - github.com/prometheus/procfs v0.3.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect github.com/pseudomuto/protokit v0.2.0 // indirect - github.com/quasilyte/go-ruleguard v0.3.0 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 // indirect - github.com/ryancurrah/gomodguard v1.2.0 // indirect - github.com/ryanrolds/sqlclosecheck v0.3.0 // indirect - github.com/sanposhiho/wastedassign v0.1.3 // indirect - github.com/securego/gosec/v2 v2.6.1 // indirect + github.com/quasilyte/go-ruleguard v0.3.19 // indirect + github.com/quasilyte/gogrep v0.5.0 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect + github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect + github.com/ryancurrah/gomodguard v1.3.0 // indirect + github.com/ryanrolds/sqlclosecheck v0.4.0 // indirect + github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect + github.com/sashamelentyev/interfacebloat v1.1.0 // indirect + github.com/sashamelentyev/usestdlibvars v1.23.0 // indirect + github.com/securego/gosec/v2 v2.16.0 // indirect github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.8.0 // indirect - github.com/sonatard/noctx v0.0.1 // indirect - github.com/sourcegraph/go-diff v0.6.1 // indirect - github.com/spf13/afero v1.5.1 // indirect - github.com/spf13/cast v1.3.1 // indirect - github.com/spf13/cobra v1.1.3 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sivchari/containedctx v1.0.3 // indirect + github.com/sivchari/nosnakecase v1.7.0 // indirect + github.com/sivchari/tenv v1.7.1 // indirect + github.com/sonatard/noctx v0.0.2 // indirect + github.com/sourcegraph/go-diff v0.7.0 // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.7.1 // indirect - github.com/ssgreg/nlreturn/v2 v2.1.0 // indirect - github.com/stretchr/objx v0.3.0 // indirect - github.com/stretchr/testify v1.7.1 // indirect - github.com/subosito/gotenv v1.2.0 // indirect - github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b // indirect - github.com/tetafro/godot v1.4.4 // indirect - github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94 // indirect - github.com/tomarrell/wrapcheck v0.0.0-20201130113247-1683564d9756 // indirect - github.com/tommy-muehle/go-mnd/v2 v2.3.1 // indirect + github.com/spf13/viper v1.12.0 // indirect + github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect + github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect + github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/testify v1.8.4 // indirect + github.com/subosito/gotenv v1.4.1 // indirect + github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect + github.com/tdakkota/asciicheck v0.2.0 // indirect + github.com/tetafro/godot v1.4.11 // indirect + github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect + github.com/timonwong/loggercheck v0.9.4 // indirect + github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect + github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect github.com/ultraware/funlen v0.0.3 // indirect - github.com/ultraware/whitespace v0.0.4 // indirect - github.com/uudashr/gocognit v1.0.1 // indirect - go.opencensus.io v0.22.6 // indirect - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect - golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect - golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect - golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect - golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 // indirect - golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect - golang.org/x/text v0.3.7 // indirect + github.com/ultraware/whitespace v0.0.5 // indirect + github.com/uudashr/gocognit v1.0.6 // indirect + github.com/xen0n/gosmopolitan v1.2.1 // indirect + github.com/yagipy/maintidx v1.0.0 // indirect + github.com/yeya24/promlinter v0.2.0 // indirect + github.com/ykadowak/zerologlint v0.1.2 // indirect + gitlab.com/bosi/decorder v0.2.3 // indirect + go.opencensus.io v0.24.0 // indirect + go.tmz.dev/musttag v0.7.0 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.24.0 // indirect + golang.org/x/crypto v0.11.0 // indirect + golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect + golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.12.0 // indirect + golang.org/x/oauth2 v0.8.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect - golang.org/x/tools v0.1.10 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - google.golang.org/api v0.38.0 // indirect + golang.org/x/tools v0.11.1 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + google.golang.org/api v0.126.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 // indirect - google.golang.org/grpc v1.35.0 // indirect - google.golang.org/protobuf v1.25.0 // indirect - gopkg.in/ini.v1 v1.62.0 // indirect + google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/grpc v1.55.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - honnef.co/go/tools v0.1.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + honnef.co/go/tools v0.4.3 // indirect k8s.io/apimachinery v0.20.2 // indirect k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 // indirect k8s.io/klog/v2 v2.5.0 // indirect - mvdan.cc/gofumpt v0.1.0 // indirect + mvdan.cc/gofumpt v0.5.0 // indirect mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect - mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7 // indirect + mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d // indirect ) replace github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 diff --git a/flytectl/boilerplate/flyte/golang_support_tools/go.sum b/flytectl/boilerplate/flyte/golang_support_tools/go.sum index 02895fb574..4cc434803e 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/go.sum +++ b/flytectl/boilerplate/flyte/golang_support_tools/go.sum @@ -1,10 +1,13 @@ -4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a h1:wFEQiK85fRsEVF0CRrPAos5LoAryUsIX1kPW/WrIqFw= -4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA= +4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= +4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= +4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -15,20 +18,25 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0 h1:XgtDnVJRCPEUG21gjFiRPz4zI1Mjg16R+NYQjfmU4XY= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v1.19.3 h1:DcTwsFgGev/wV5+q8o2fzgcHOaac+DKGC91ZlvpsQds= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= +cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -38,9 +46,18 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.12.0 h1:4y3gHptW1EHVtcPAVE0eBBlFuGqEejTTG3KdIE0lUX4= -cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/4meepo/tagalign v1.2.2 h1:kQeUTkFTaBRtd/7jm8OKJl9iHk0gAO+TDFPHGSna0aw= +github.com/4meepo/tagalign v1.2.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= +github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= +github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= +github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9Bls= +github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= +github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= +github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= @@ -51,37 +68,31 @@ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf h1:M7A2Tn3R8rVgsoJHHKkmkpiNOItys4GxJj6JytRjdDg= github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf/go.mod h1:Kya4Y46gyq/3TEyAzeNe5UkCk+W9apy5KbuX+5KnZ6M= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -90,132 +101,118 @@ github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuN github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= +github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= +github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= +github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= -github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/ashanbrown/forbidigo v1.1.0 h1:SJOPJyqsrVL3CvR0veFZFmIM0fXS/Kvyikqvfphd0Z4= -github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v0.0.0-20201205152432-7b7cdbb3025a h1:/U9tbJzDRof4fOR51vwzWdIBsIH6R2yU0KG1MBRM2Js= -github.com/ashanbrown/makezero v0.0.0-20201205152432-7b7cdbb3025a/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/ashanbrown/forbidigo v1.5.3 h1:jfg+fkm/snMx+V9FBwsl1d340BV/99kZGv5jN9hBoXk= +github.com/ashanbrown/forbidigo v1.5.3/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= +github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= +github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A= -github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/bombsimon/wsl/v3 v3.2.0 h1:x3QUbwW7tPGcCNridvqmhSRthZMTALnkg5/1J+vaUas= -github.com/bombsimon/wsl/v3 v3.2.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= +github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= +github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= +github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= +github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= +github.com/breml/bidichk v0.2.4/go.mod h1:7Zk0kRFt1LIZxtQdl9W9JwGAcLTTkOs+tN7wuEYGJ3s= +github.com/breml/errchkjson v0.3.1 h1:hlIeXuspTyt8Y/UmP5qy1JocGNR00KQHgfaNtRAjoxQ= +github.com/breml/errchkjson v0.3.1/go.mod h1:XroxrzKjdiutFyW3nWhw34VGg7kiMsDQox73yWCGI2U= +github.com/butuzov/ireturn v0.2.0 h1:kCHi+YzC150GE98WFuZQu9yrTn6GEydO2AuPLbTgnO4= +github.com/butuzov/ireturn v0.2.0/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= +github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.6 h1:Tsy7EppNow2pDC0jN7Hsmcb6mHd71ZbI1vFissRBtc0= -github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= +github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= +github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= +github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/daixiang0/gci v0.2.8 h1:1mrIGMBQsBu0P7j7m1M8Lb+ZeZxsZL+jyGX4YoMJJpg= -github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= +github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= +github.com/daixiang0/gci v0.10.1 h1:eheNA3ljF6SxnPD/vE4lCBusVHmV3Rs3dkKvFrJ7MR0= +github.com/daixiang0/gci v0.10.1/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denis-tingajkin/go-header v0.4.2 h1:jEeSF4sdv8/3cT/WY8AgDHUoItNSoEZ7qg9dX7pc218= -github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= +github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java h1:bV5JGEB1ouEzZa0hgVDFFiClrUEuGWRaAc/3mxR2QK0= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= -github.com/esimonov/ifshort v1.0.1 h1:p7hlWD15c9XwvwxYg3W7f7UZHmwg7l9hC0hBiF95gd0= -github.com/esimonov/ifshort v1.0.1/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= +github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= +github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= +github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= +github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= @@ -224,32 +221,32 @@ github.com/flyteorg/stow v0.3.1 h1:cBMbWl03Gsy5KoA5mutUYTuYpqtT7Pb8+ANGCLnmFEs= github.com/flyteorg/stow v0.3.1/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fzipp/gocyclo v0.3.1 h1:A9UeX3HJSXTBzvHzhqoYVuE0eAhe+aM8XBCCwsPMZOc= -github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= +github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-critic/go-critic v0.5.4 h1:fPNMqImVjELN6Du7NVVuvKA4cgASNmc7e4zSYQCOnv8= -github.com/go-critic/go-critic v0.5.4/go.mod h1:cjB4YGw+n/+X8gREApej7150Uyy1Tg8If6F2XOAUXNE= +github.com/go-critic/go-critic v0.8.1 h1:16omCF1gN3gTzt4j4J6fKI/HnRojhEp+Eks6EuKw3vw= +github.com/go-critic/go-critic v0.8.1/go.mod h1:kpzXl09SIJX1cr9TB/g/sAG+eFEl7ZS9f9cqvZtyNl0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= @@ -257,49 +254,43 @@ github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL9 github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= -github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= +github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= +github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= +github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= +github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= +github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= +github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= +github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= +github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= +github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= +github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= +github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= +github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= +github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= +github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= +github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= -github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -320,27 +311,29 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.38.0 h1:hgZsLRzZrjhpp44Ak+fhXNzgrbDF39ETf22a+Jd3fJQ= -github.com/golangci/golangci-lint v1.38.0/go.mod h1:Knp/sd5ATrVp7EOzWzwIIFH+c8hUfpW+oOQb8NvdZDo= +github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe h1:6RGUuS7EGotKx6J5HIP8ZtyMdiDscjMLfRBSPuzVVeo= +github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= +github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= +github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= +github.com/golangci/golangci-lint v1.53.3 h1:CUcRafczT4t1F+mvdkUm6KuOpxUZTl0yWN/rSU6sSMo= +github.com/golangci/golangci-lint v1.53.3/go.mod h1:W4Gg3ONq6p3Jl+0s/h9Gr0j7yEgHJWWZO2bHl2tBUXM= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.3.5 h1:pLzmVdl3VxTOncgzHcvLOKirdvcx/TydsClUQXTehjo= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5 h1:c9Mqqrm/Clj5biNaG7rABrmwUq88nHh0uABo2b/WYmc= -github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= +github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0= +github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= +github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= +github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -354,15 +347,19 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -370,402 +367,303 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gookit/color v1.3.6/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 h1:Nb2aRlC404yz7gQIfRZxX9/MLvQiqXyiBTJtgAy6yrI= -github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= +github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.4.1 h1:/7clKqrVfiVwiBQLM0Uke4KvXnO6JcCTS7HwF2D6wG8= -github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1 h1:xHopR5L2lRz6OsjH4R2HG5wRhW9ySl3FsHIvi5pcXwc= +github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 h1:rx8127mFPqXXsfPSo8BwnIU97MKFZc89WHAHt8PwDVY= -github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= +github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/jgautheron/goconst v1.4.0 h1:hp9XKUpe/MPyDamUbfsrGpe+3dnY2whNK4EtB86dvLM= -github.com/jgautheron/goconst v1.4.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jingyugao/rowserrcheck v0.0.0-20210130005344-c6a0c12dd98d h1:BYDZtm80MLJpTWalkwHxNnIbO/2akQHERcfLq4TbIWE= -github.com/jingyugao/rowserrcheck v0.0.0-20210130005344-c6a0c12dd98d/go.mod h1:/EZlaYCnEX24i7qdVhT9du5JrtFWYRQr67bVgR7JJC8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= +github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= +github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.0.0-20210226073942-60b4fa260dd0 h1:exZBMUS/kB/AhxSj/9lIIxhqkCpXXdKScjFWQUTbi3M= -github.com/julz/importas v0.0.0-20210226073942-60b4fa260dd0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= +github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.0 h1:YTDO4pNy7AUN/021p+JGHycQyYNIyMoenM1YDVK6RlY= -github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= +github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= +github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kulti/thelper v0.4.0 h1:2Nx7XbdbE/BYZeoip2mURKUdtHQRuy6Ug+wR7K9ywNM= -github.com/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= -github.com/kunwardeep/paralleltest v1.0.2 h1:/jJRv0TiqPoEy/Y8dQxCFJhD56uS/pnvtatgTZBHokU= -github.com/kunwardeep/paralleltest v1.0.2/go.mod h1:ZPqNm1fVHPllh5LPVujzbVz1JN2GhLxSfY+oqUsvG30= -github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= -github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= -github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= +github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= +github.com/kunwardeep/paralleltest v1.0.7 h1:2uCk94js0+nVNQoHZNLBkAR1DQJrVzw6T0RMzJn55dQ= +github.com/kunwardeep/paralleltest v1.0.7/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= +github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= +github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= +github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= +github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= +github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= +github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= +github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= +github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= +github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= +github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 h1:pWxk9e//NbPwfxat7RXkts09K+dEBJWakUWwICVqYbA= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= +github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= +github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= +github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= +github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= +github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 h1:QASJXOGm2RZ5Ardbc86qNFvby9AqkLDibfChMtAg5QM= -github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.0.3 h1:z3FL6IFFN3JKzHYHD8O1ExH9g/4lAGJ5x1+9rPZgsFg= -github.com/mgechev/revive v1.0.3/go.mod h1:POGGZagSo/0frdr7VeAifzS5Uka0d0GPiM35MsTO8nE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= +github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EHf4= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= -github.com/mozilla/tls-observatory v0.0.0-20201209171846-0547674fceff/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= +github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw= -github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nbutton23/zxcvbn-go v0.0.0-20201221231540-e56b841a3c88 h1:o+O3Cd1HO9CTgxE3/C8p5I5Y4C0yYWbF8d4IkfOLtcQ= -github.com/nbutton23/zxcvbn-go v0.0.0-20201221231540-e56b841a3c88/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.1.0 h1:kVlMw8h2LHPMGUVqUj6230oQjjTMFjwcZrnkhXzFfl8= -github.com/nishanths/exhaustive v0.1.0/go.mod h1:S1j9110vxV1ECdCudXRkeMnFQ/DQk9ajLT0Uf2MYZQQ= -github.com/nishanths/predeclared v0.2.1 h1:1TXtjmy4f3YCFjTxRd8zcFHOmoUir+gp0ESzjFzG2sw= -github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/nishanths/exhaustive v0.11.0 h1:T3I8nUGhl/Cwu5Z2hfc92l0e04D2GEW6e0l8pzda2l0= +github.com/nishanths/exhaustive v0.11.0/go.mod h1:RqwDsZ1xY0dNdqHho2z6X+bgzizwbLYOWnZbbl2wLB4= +github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nunnatsa/ginkgolinter v0.12.1 h1:vwOqb5Nu05OikTXqhvLdHCGcx5uthIYIl0t79UVrERQ= +github.com/nunnatsa/ginkgolinter v0.12.1/go.mod h1:AK8Ab1PypVrcGUusuKD8RDcl2KgsIwvNaaxAlyHSzso= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= -github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.4 h1:NiTx7EEvBzu9sFOD1zORteLSt3o8gnlvZZwSE9TnY9U= -github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f h1:xAw10KgJqG5NJDfmRqJ05Z0IFblKumjtMeyiOLxj3+4= -github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/polyfloyd/go-errorlint v1.4.2 h1:CU+O4181IxFDdPH6t/HT7IiDj1I7zxNi1RIUxYwn8d0= +github.com/polyfloyd/go-errorlint v1.4.2/go.mod h1:k6fU/+fQe38ednoZS51T7gSIGQW1y94d6TkSr35OzH8= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU= -github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.3.0 h1:Uehi/mxLK0eiUc0H0++5tpMGTexB8wZ598MIgU8VpDM= -github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.3.0 h1:A3OfpsK2ynOTbz/KMi62qWzignjGCOZVChATSf4P+A0= -github.com/quasilyte/go-ruleguard v0.3.0/go.mod h1:p2miAhLp6fERzFNbcuQ4bevXs8rgK//uCHsUDkumITg= -github.com/quasilyte/go-ruleguard/dsl v0.0.0-20210106184943-e47d54850b18/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.0.0-20210115110123-c73ee1cbff1f/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= +github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= +github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= +github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.2.0 h1:YWfhGOrXwLGiqcC/u5EqG6YeS8nh+1fw0HEc85CVZro= -github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6W5lnUepvuMMgQ= -github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sanposhiho/wastedassign v0.1.3 h1:qIMpTh4NGZYRbFJ+DSpLoVn8F4SLciX2afRvXPefC7w= -github.com/sanposhiho/wastedassign v0.1.3/go.mod h1:LGpq5Hsv74QaqM47WtIsRSF/ik9kqk07kchgv66tLVE= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec/v2 v2.6.1 h1:+KCw+uz16FYfFyJ/A5aU6uP7mnrL+j1TbDnk1yN+8R0= -github.com/securego/gosec/v2 v2.6.1/go.mod h1:I76p3NTHBXsGhybUW+cEQ692q2Vp+A0Z6ZLzDIZy+Ao= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= +github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= +github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= +github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= +github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= +github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= +github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= +github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1jbEOPrEhDzGYq0= +github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= +github.com/securego/gosec/v2 v2.16.0 h1:Pi0JKoasQQ3NnoRao/ww/N/XdynIB9NRYYZT5CyOs5U= +github.com/securego/gosec/v2 v2.16.0/go.mod h1:xvLcVZqUfo4aAQu56TNv7/Ltz6emAOQAEsrZrt7uGlI= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil/v3 v3.21.1/go.mod h1:igHnfak0qnw1biGeI2qKQvu0ZkwvEkUcCLlYhZzdr/4= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU= -github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/go-diff v0.6.1 h1:hmA1LzxW0n1c3Q4YbrFgg4P99GSnebYa3x8gr0HZqLQ= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= +github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= +github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= +github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= +github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= +github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= +github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= +github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= +github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= +github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= -github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/ssgreg/nlreturn/v2 v2.1.0 h1:6/s4Rc49L6Uo6RLjhWZGBpWWjfzk2yrf1nIW8m4wgVA= -github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= +github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= -github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -774,76 +672,90 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b h1:HxLVTlqcHhFAz3nWUcuvpH7WuOMv8LQoCWmruLfFH2U= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tetafro/godot v1.4.4 h1:VAtLEoAMmopIzHVWVBrztjVWDeYm1OD/DKqhqXR4828= -github.com/tetafro/godot v1.4.4/go.mod h1:FVDd4JuKliW3UgjswZfJfHq4vAx0bD/Jd5brJjGeaz4= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94 h1:ig99OeTyDwQWhPe2iw9lwfQVF1KB3Q4fpP3X7/2VBG8= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck v0.0.0-20201130113247-1683564d9756 h1:zV5mu0ESwb+WnzqVaW2z1DdbAP0S46UtjY8DHQupQP4= -github.com/tomarrell/wrapcheck v0.0.0-20201130113247-1683564d9756/go.mod h1:yiFB6fFoV7saXirUGfuK+cPtUh4NX/Hf5y2WC2lehu0= -github.com/tommy-muehle/go-mnd/v2 v2.3.1 h1:a1S4+4HSXDJMgeODJH/t0EEKxcVla6Tasw+Zx9JJMog= -github.com/tommy-muehle/go-mnd/v2 v2.3.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= +github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= +github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= +github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= +github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= +github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= +github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= +github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= +github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= +github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= +github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= +github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= +github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= -github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= -github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= +github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= +github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= +github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= +github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= +github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= +github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= +github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= +github.com/ykadowak/zerologlint v0.1.2 h1:Um4P5RMmelfjQqQJKtE8ZW+dLZrXrENeIzWWKw800U4= +github.com/ykadowak/zerologlint v0.1.2/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= +gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= +go-simpler.org/assert v0.5.0 h1:+5L/lajuQtzmbtEfh69sr5cRf2/xZzyJhFjoOz/PPqs= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.22.6 h1:BdkrbWrzDlV9dnbzoP7sfN+dHheJ4J9JOaYxcUDL+ok= -go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.tmz.dev/musttag v0.7.0 h1:QfytzjTWGXZmChoX0L++7uQN+yRCPfyFm+whsM+lfGc= +go.tmz.dev/musttag v0.7.0/go.mod h1:oTFPvgOkJmp5kYL02S8+jrH0eLrBIl57rzWeA26zDEM= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -854,6 +766,12 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4= +golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= +golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -866,7 +784,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -878,17 +795,20 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -899,7 +819,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -911,25 +830,30 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -938,8 +862,10 @@ golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 h1:55H5j7lotzuFCEOKDsMch+fRNUQ9DgtyHOUP31FNqKc= -golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -952,16 +878,15 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -971,18 +896,12 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -993,28 +912,46 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201024232916-9f70ab9862d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1022,31 +959,27 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1058,12 +991,8 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1071,9 +1000,7 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1086,53 +1013,46 @@ golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210102185154-773b96fafca2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.11.1 h1:ojD5zOW8+7dOGzdnNgersm8aPfcDjhMp12UfG93NIMc= +golang.org/x/tools v0.11.1/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1149,14 +1069,12 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.38.0 h1:vDyWk6eup8eQAidaZ31sNWIn8tZEL8qpbtGkBD4ytQo= -google.golang.org/api v0.38.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -1170,7 +1088,6 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1189,32 +1106,30 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200831141814-d751682dd103/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506 h1:uLBY0yHDCj2PMQ98KWDSIDFwn9zK2zh+tgWtbvPPBjI= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1224,11 +1139,14 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1238,31 +1156,26 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1270,9 +1183,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1280,10 +1193,9 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.2 h1:SMdYLJl312RXuxXziCCHhRsp/tvct9cGKey0yv95tZM= -honnef.co/go/tools v0.1.2/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= +honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= -k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= @@ -1296,14 +1208,14 @@ k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.1.0 h1:hsVv+Y9UsZ/mFZTxJZuHVI6shSQCtzZ11h1JEFPAZLw= -mvdan.cc/gofumpt v0.1.0/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= +mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= +mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7 h1:HT3e4Krq+IE44tiN36RvVEb6tvqeIdtsVSsxmNPqlFU= -mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= +mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= +mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= @@ -1311,4 +1223,3 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh index 003220ea70..c7e5577ef3 100755 --- a/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ b/flytectl/boilerplate/flyte/golang_test_targets/download_tooling.sh @@ -18,7 +18,7 @@ set -e tools=( "github.com/EngHabu/mockery/cmd/mockery" "github.com/flyteorg/flytestdlib/cli/pflags@latest" - "github.com/golangci/golangci-lint/cmd/golangci-lint@latest" + "github.com/golangci/golangci-lint/cmd/golangci-lint" "github.com/alvaroloes/enumer" "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" ) From 58037023574f69663e5ff7a61c4dcc28683e81fe Mon Sep 17 00:00:00 2001 From: kamaleybov <54046807+kamaleybov@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:38:33 -0700 Subject: [PATCH 318/645] Updated readthedocs configuration - moved to build.os (#425) Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> --- flytectl/.readthedocs.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/flytectl/.readthedocs.yml b/flytectl/.readthedocs.yml index 1c0f039d3a..c24f894fd1 100644 --- a/flytectl/.readthedocs.yml +++ b/flytectl/.readthedocs.yml @@ -9,8 +9,11 @@ version: 2 sphinx: configuration: docs/source/conf.py -# Optionally set the version of Python and requirements required to build your docs python: - version: 3.8 install: - requirements: doc-requirements.txt + +build: + os: "ubuntu-22.04" + tools: + python: "3.8" From c5165962e502ab416c97dc148c64e6905d4f26a2 Mon Sep 17 00:00:00 2001 From: kamaleybov <54046807+kamaleybov@users.noreply.github.com> Date: Thu, 5 Oct 2023 10:59:40 -0700 Subject: [PATCH 319/645] Fix testutils.TearDownAndVerify #none (#424) * Stopped swallowing errors in testutils.TearDownAndVerify Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * Fixed tests. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> --------- Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> --- flytectl/cmd/create/create_test.go | 4 +-- flytectl/cmd/create/execution_test.go | 13 ++++---- flytectl/cmd/create/project_test.go | 6 ++-- flytectl/cmd/delete/delete_test.go | 4 +-- flytectl/cmd/delete/execution_test.go | 6 ++-- flytectl/cmd/get/get_test.go | 4 +-- flytectl/cmd/get/launch_plan_test.go | 19 ++++++------ ...tchable_cluster_resource_attribute_test.go | 12 ++++---- .../matchable_execution_cluster_label_test.go | 12 ++++---- ...atchable_execution_queue_attribute_test.go | 12 ++++---- .../cmd/get/matchable_plugin_override_test.go | 12 ++++---- .../matchable_task_resource_attribute_test.go | 12 ++++---- ...atchable_workflow_execution_config_test.go | 12 ++++---- flytectl/cmd/get/task_test.go | 27 +++++++++++------ flytectl/cmd/get/workflow_test.go | 9 +++--- flytectl/cmd/testutils/test_utils.go | 30 +++++++++++++++---- ...tchable_cluster_resource_attribute_test.go | 17 ++++++----- .../matchable_execution_cluster_label_test.go | 17 ++++++----- ...atchable_execution_queue_attribute_test.go | 17 ++++++----- .../update/matchable_plugin_override_test.go | 17 ++++++----- .../matchable_task_resource_attribute_test.go | 17 ++++++----- ...atchable_workflow_execution_config_test.go | 14 ++++----- flytectl/cmd/update/project_test.go | 10 +++---- flytectl/cmd/update/update_test.go | 4 +-- 24 files changed, 170 insertions(+), 137 deletions(-) diff --git a/flytectl/cmd/create/create_test.go b/flytectl/cmd/create/create_test.go index dafd803a03..bfa6816e91 100644 --- a/flytectl/cmd/create/create_test.go +++ b/flytectl/cmd/create/create_test.go @@ -4,14 +4,14 @@ import ( "sort" "testing" - "github.com/flyteorg/flytectl/cmd/testutils" "github.com/stretchr/testify/assert" + + "github.com/flyteorg/flytectl/cmd/testutils" ) const testDataFolder = "../testdata/" var setup = testutils.Setup -var tearDownAndVerify = testutils.TearDownAndVerify func TestCreateCommand(t *testing.T) { createCommand := RemoteCreateCommand() diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index 399f97abb2..6f25bab3cc 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -4,13 +4,14 @@ import ( "fmt" "testing" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/golang/protobuf/proto" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" "google.golang.org/protobuf/types/known/timestamppb" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/testutils" @@ -202,7 +203,7 @@ func (s *createSuite) Test_CreateTaskExecution() { err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) s.NoError(err) - tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) + s.TearDownAndVerify(s.T(), `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) } func (s *createSuite) Test_CreateTaskExecution_GetTaskError() { @@ -243,7 +244,7 @@ func (s *createSuite) Test_CreateLaunchPlanExecution() { err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) s.NoError(err) - tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e" `) + s.TearDownAndVerify(s.T(), `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e" `) } func (s *createSuite) Test_CreateLaunchPlan_GetLaunchPlanError() { @@ -277,7 +278,7 @@ func (s *createSuite) Test_CreateRelaunchExecution() { err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) s.NoError(err) - tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) + s.TearDownAndVerify(s.T(), `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e" `) } func (s *createSuite) Test_CreateRecoverExecution() { @@ -302,7 +303,7 @@ func (s *createSuite) Test_CreateRecoverExecution() { err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) s.NoError(err) - tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) + s.TearDownAndVerify(s.T(), `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) } func (s *createSuite) TestCreateExecutionFuncInvalid() { diff --git a/flytectl/cmd/create/project_test.go b/flytectl/cmd/create/project_test.go index e0c166db5c..f0263bc461 100644 --- a/flytectl/cmd/create/project_test.go +++ b/flytectl/cmd/create/project_test.go @@ -42,7 +42,7 @@ func createProjectSetup() { func TestCreateProjectFunc(t *testing.T) { s := setup() createProjectSetup() - defer tearDownAndVerify(t, s.Writer, "project created successfully.") + defer s.TearDownAndVerify(t, "project created successfully.") project.DefaultProjectConfig.ID = projectValue project.DefaultProjectConfig.Name = projectValue project.DefaultProjectConfig.Labels = map[string]string{} @@ -56,7 +56,7 @@ func TestCreateProjectFunc(t *testing.T) { func TestEmptyProjectID(t *testing.T) { s := setup() createProjectSetup() - defer tearDownAndVerify(t, s.Writer, "") + defer s.TearDownAndVerify(t, "") project.DefaultProjectConfig = &project.ConfigProject{} s.MockAdminClient.OnRegisterProjectMatch(s.Ctx, projectRegisterRequest).Return(nil, nil) err := createProjectsCommand(s.Ctx, []string{}, s.CmdCtx) @@ -67,7 +67,7 @@ func TestEmptyProjectID(t *testing.T) { func TestEmptyProjectName(t *testing.T) { s := setup() createProjectSetup() - defer tearDownAndVerify(t, s.Writer, "") + defer s.TearDownAndVerify(t, "") project.DefaultProjectConfig.ID = projectValue project.DefaultProjectConfig.Labels = map[string]string{} project.DefaultProjectConfig.Description = "" diff --git a/flytectl/cmd/delete/delete_test.go b/flytectl/cmd/delete/delete_test.go index 88119c37cd..4692e0e6dd 100644 --- a/flytectl/cmd/delete/delete_test.go +++ b/flytectl/cmd/delete/delete_test.go @@ -4,8 +4,9 @@ import ( "sort" "testing" - "github.com/flyteorg/flytectl/cmd/testutils" "github.com/stretchr/testify/assert" + + "github.com/flyteorg/flytectl/cmd/testutils" ) const ( @@ -14,7 +15,6 @@ const ( ) var setup = testutils.Setup -var tearDownAndVerify = testutils.TearDownAndVerify func TestDeleteCommand(t *testing.T) { deleteCommand := RemoteDeleteCommand() diff --git a/flytectl/cmd/delete/execution_test.go b/flytectl/cmd/delete/execution_test.go index 1d74a9d524..09d8a0e05d 100644 --- a/flytectl/cmd/delete/execution_test.go +++ b/flytectl/cmd/delete/execution_test.go @@ -42,7 +42,7 @@ func TestTerminateExecutionFunc(t *testing.T) { assert.Nil(t, err) s.MockAdminClient.AssertCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[0]) s.MockAdminClient.AssertCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[1]) - tearDownAndVerify(t, s.Writer, "") + s.TearDownAndVerify(t, "") } func TestTerminateExecutionFuncWithError(t *testing.T) { @@ -55,7 +55,7 @@ func TestTerminateExecutionFuncWithError(t *testing.T) { assert.Equal(t, errors.New("failed to terminate"), err) s.MockAdminClient.AssertCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[0]) s.MockAdminClient.AssertNotCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[1]) - tearDownAndVerify(t, s.Writer, "") + s.TearDownAndVerify(t, "") } func TestTerminateExecutionFuncWithPartialSuccess(t *testing.T) { @@ -68,5 +68,5 @@ func TestTerminateExecutionFuncWithPartialSuccess(t *testing.T) { assert.Equal(t, errors.New("failed to terminate"), err) s.MockAdminClient.AssertCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[0]) s.MockAdminClient.AssertCalled(t, "TerminateExecution", s.Ctx, terminateExecRequests[1]) - tearDownAndVerify(t, s.Writer, "") + s.TearDownAndVerify(t, "") } diff --git a/flytectl/cmd/get/get_test.go b/flytectl/cmd/get/get_test.go index e4a1aec40d..76452c0b01 100644 --- a/flytectl/cmd/get/get_test.go +++ b/flytectl/cmd/get/get_test.go @@ -5,8 +5,9 @@ import ( "sort" "testing" - "github.com/flyteorg/flytectl/cmd/testutils" "github.com/stretchr/testify/assert" + + "github.com/flyteorg/flytectl/cmd/testutils" ) const projectValue = "dummyProject" @@ -20,7 +21,6 @@ const workflowVersionValue = "wf_version" const testDataFolder = "../testdata/" var setup = testutils.Setup -var tearDownAndVerify = testutils.TearDownAndVerify const ( testDataTempFile = "temp-output-file" diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index d04698d8b0..4055b72376 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -11,12 +11,13 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" + "github.com/stretchr/testify/mock" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/stretchr/testify/mock" "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/timestamppb" @@ -257,7 +258,7 @@ func TestGetLaunchPlanFunc(t *testing.T) { err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchAllVerOfLP", s.Ctx, "launchplan1", "dummyProject", "dummyDomain", launchplan.DefaultConfig.Filter) - tearDownAndVerify(t, s.Writer, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + s.TearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetLaunchPlanFuncLatest(t *testing.T) { @@ -269,7 +270,7 @@ func TestGetLaunchPlanFuncLatest(t *testing.T) { err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchLPLatestVersion", s.Ctx, "launchplan1", projectValue, domainValue, launchplan.DefaultConfig.Filter) - tearDownAndVerify(t, s.Writer, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + s.TearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlanWithVersion(t *testing.T) { @@ -280,7 +281,7 @@ func TestGetLaunchPlanWithVersion(t *testing.T) { err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchLPVersion", s.Ctx, "launchplan1", "v2", "dummyProject", "dummyDomain") - tearDownAndVerify(t, s.Writer, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + s.TearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlans(t *testing.T) { @@ -291,13 +292,11 @@ func TestGetLaunchPlans(t *testing.T) { argsLp = []string{} err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + s.TearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) }) t.Run("workflow filter", func(t *testing.T) { s := setup() getLaunchPlanSetup() - resourceListRequest.Filters = "eq(workflow.name,workflow2)" - s.MockAdminClient.OnListLaunchPlansMatch(s.Ctx, resourceListRequest).Return(filteredLaunchPlanListResponse, nil) s.FetcherExt.OnFetchAllVerOfLP(s.Ctx, "", "dummyProject", "dummyDomain", filters.Filters{ FieldSelector: "workflow.name=workflow2", }).Return(launchPlanListResponse.LaunchPlans, nil) @@ -305,7 +304,7 @@ func TestGetLaunchPlans(t *testing.T) { launchplan.DefaultConfig.Workflow = "workflow2" err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + s.TearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) }) t.Run("workflow filter error", func(t *testing.T) { s := setup() @@ -332,7 +331,7 @@ func TestGetLaunchPlansWithExecFile(t *testing.T) { os.Remove(launchplan.DefaultConfig.ExecFile) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchLPVersion", s.Ctx, "launchplan1", "v2", "dummyProject", "dummyDomain") - tearDownAndVerify(t, s.Writer, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + s.TearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlanTableFunc(t *testing.T) { @@ -346,7 +345,7 @@ func TestGetLaunchPlanTableFunc(t *testing.T) { err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchAllVerOfLP", s.Ctx, "launchplan1", "dummyProject", "dummyDomain", filters.Filters{}) - tearDownAndVerify(t, s.Writer, ` + s.TearDownAndVerify(t, ` --------- ------------- ------ ------- ---------- --------------------------- --------- | VERSION | NAME | TYPE | STATE | SCHEDULE | INPUTS | OUTPUTS | --------- ------------- ------ ------- ---------- --------------------------- --------- diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go index 82fba0a6c8..5bf48ad809 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go @@ -58,7 +58,7 @@ func TestGetClusterResourceAttributes(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","attributes":{"foo":"bar"}}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","attributes":{"foo":"bar"}}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { s := testutils.SetupWithExt() @@ -71,7 +71,7 @@ func TestGetClusterResourceAttributes(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) + s.TearDownAndVerify(t, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { s := testutils.SetupWithExt() @@ -85,7 +85,7 @@ func TestGetClusterResourceAttributes(t *testing.T) { assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -98,7 +98,7 @@ func TestGetClusterResourceAttributes(t *testing.T) { assert.Equal(t, fmt.Errorf("failed to fetch response"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -111,7 +111,7 @@ func TestGetClusterResourceAttributes(t *testing.T) { s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","attributes":{"foo":"bar"}}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","attributes":{"foo":"bar"}}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -125,6 +125,6 @@ func TestGetClusterResourceAttributes(t *testing.T) { s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_CLUSTER_RESOURCE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/get/matchable_execution_cluster_label_test.go b/flytectl/cmd/get/matchable_execution_cluster_label_test.go index d3aff8d6a5..590fa1b53c 100644 --- a/flytectl/cmd/get/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/get/matchable_execution_cluster_label_test.go @@ -58,7 +58,7 @@ func TestGetExecutionClusterLabel(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","value":"foo"}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","value":"foo"}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { s := testutils.SetupWithExt() @@ -71,7 +71,7 @@ func TestGetExecutionClusterLabel(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) + s.TearDownAndVerify(t, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { s := testutils.SetupWithExt() @@ -85,7 +85,7 @@ func TestGetExecutionClusterLabel(t *testing.T) { assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("failed to get project domain attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -98,7 +98,7 @@ func TestGetExecutionClusterLabel(t *testing.T) { assert.Equal(t, fmt.Errorf("failed to fetch response"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -111,7 +111,7 @@ func TestGetExecutionClusterLabel(t *testing.T) { s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","value":"foo"}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","value":"foo"}`) }) t.Run("failed to get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -125,6 +125,6 @@ func TestGetExecutionClusterLabel(t *testing.T) { s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_EXECUTION_CLUSTER_LABEL) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute_test.go b/flytectl/cmd/get/matchable_execution_queue_attribute_test.go index 521ee8e522..e4e33e7ec8 100644 --- a/flytectl/cmd/get/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/get/matchable_execution_queue_attribute_test.go @@ -58,7 +58,7 @@ func TestGetExecutionQueueAttributes(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","tags":["foo","bar"]}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","tags":["foo","bar"]}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { s := testutils.SetupWithExt() @@ -71,7 +71,7 @@ func TestGetExecutionQueueAttributes(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) + s.TearDownAndVerify(t, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { s := testutils.SetupWithExt() @@ -85,7 +85,7 @@ func TestGetExecutionQueueAttributes(t *testing.T) { assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -98,7 +98,7 @@ func TestGetExecutionQueueAttributes(t *testing.T) { assert.Equal(t, fmt.Errorf("failed to fetch response"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -111,7 +111,7 @@ func TestGetExecutionQueueAttributes(t *testing.T) { s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","tags":["foo","bar"]}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","tags":["foo","bar"]}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -125,6 +125,6 @@ func TestGetExecutionQueueAttributes(t *testing.T) { s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_EXECUTION_QUEUE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/get/matchable_plugin_override_test.go b/flytectl/cmd/get/matchable_plugin_override_test.go index 16ec913754..24363966d3 100644 --- a/flytectl/cmd/get/matchable_plugin_override_test.go +++ b/flytectl/cmd/get/matchable_plugin_override_test.go @@ -70,7 +70,7 @@ func TestGetPluginOverride(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","overrides":[{"task_type":"python_task","plugin_id":["plugin-override1","plugin-override2"]},{"task_type":"java_task","plugin_id":["plugin-override3","plugin-override3"],"missing_plugin_behavior":1}]}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","overrides":[{"task_type":"python_task","plugin_id":["plugin-override1","plugin-override2"]},{"task_type":"java_task","plugin_id":["plugin-override3","plugin-override3"],"missing_plugin_behavior":1}]}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { s := testutils.SetupWithExt() @@ -83,7 +83,7 @@ func TestGetPluginOverride(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) + s.TearDownAndVerify(t, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { s := testutils.SetupWithExt() @@ -97,7 +97,7 @@ func TestGetPluginOverride(t *testing.T) { assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -110,7 +110,7 @@ func TestGetPluginOverride(t *testing.T) { assert.Equal(t, fmt.Errorf("failed to fetch response"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -122,7 +122,7 @@ func TestGetPluginOverride(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","overrides":[{"task_type":"python_task","plugin_id":["plugin-override1","plugin-override2"]},{"task_type":"java_task","plugin_id":["plugin-override3","plugin-override3"],"missing_plugin_behavior":1}]}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","overrides":[{"task_type":"python_task","plugin_id":["plugin-override1","plugin-override2"]},{"task_type":"java_task","plugin_id":["plugin-override3","plugin-override3"],"missing_plugin_behavior":1}]}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -135,6 +135,6 @@ func TestGetPluginOverride(t *testing.T) { assert.Equal(t, fmt.Errorf("failed to fetch response"), err) s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_PLUGIN_OVERRIDE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/get/matchable_task_resource_attribute_test.go b/flytectl/cmd/get/matchable_task_resource_attribute_test.go index 021f02ea7f..f9faba6eb9 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute_test.go @@ -65,7 +65,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { s := testutils.SetupWithExt() @@ -78,7 +78,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) + s.TearDownAndVerify(t, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { s := testutils.SetupWithExt() @@ -92,7 +92,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -105,7 +105,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { assert.Equal(t, fmt.Errorf("failed to fetch response"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -118,7 +118,7 @@ func TestGetTaskResourceAttributes(t *testing.T) { s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","defaults":{"cpu":"1","memory":"150Mi"},"limits":{"cpu":"2","memory":"350Mi"}}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -132,6 +132,6 @@ func TestGetTaskResourceAttributes(t *testing.T) { s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_TASK_RESOURCE) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/get/matchable_workflow_execution_config_test.go b/flytectl/cmd/get/matchable_workflow_execution_config_test.go index e477bb3158..1206e5b7f4 100644 --- a/flytectl/cmd/get/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/get/matchable_workflow_execution_config_test.go @@ -58,7 +58,7 @@ func TestGetWorkflowExecutionConfig(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","max_parallelism":5}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","max_parallelism":5}`) }) t.Run("successful get project domain attribute and write to file", func(t *testing.T) { s := testutils.SetupWithExt() @@ -71,7 +71,7 @@ func TestGetWorkflowExecutionConfig(t *testing.T) { assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, s.Writer, `wrote the config to file temp-output-file`) + s.TearDownAndVerify(t, `wrote the config to file temp-output-file`) }) t.Run("successful get project domain attribute and write to file failure", func(t *testing.T) { s := testutils.SetupWithExt() @@ -85,7 +85,7 @@ func TestGetWorkflowExecutionConfig(t *testing.T) { assert.Equal(t, fmt.Errorf("error dumping in file due to open non-existent-dir/temp-output-file: no such file or directory"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("failed get project domain attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -98,7 +98,7 @@ func TestGetWorkflowExecutionConfig(t *testing.T) { assert.Equal(t, fmt.Errorf("failed to fetch response"), err) s.FetcherExt.AssertCalled(t, "FetchProjectDomainAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -111,7 +111,7 @@ func TestGetWorkflowExecutionConfig(t *testing.T) { s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, s.Writer, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","max_parallelism":5}`) + s.TearDownAndVerify(t, `{"project":"dummyProject","domain":"dummyDomain","workflow":"workflow","max_parallelism":5}`) }) t.Run("failed get workflow attribute", func(t *testing.T) { s := testutils.SetupWithExt() @@ -125,6 +125,6 @@ func TestGetWorkflowExecutionConfig(t *testing.T) { s.FetcherExt.AssertCalled(t, "FetchWorkflowAttributes", s.Ctx, config.GetConfig().Project, config.GetConfig().Domain, "workflow", admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index 28816e8a1c..aea8e41cc1 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -13,10 +13,11 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" + "github.com/stretchr/testify/mock" + "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/stretchr/testify/mock" "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/timestamppb" @@ -247,7 +248,7 @@ func TestGetTaskFunc(t *testing.T) { err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchAllVerOfTask", s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{}) - tearDownAndVerify(t, s.Writer, `[ + s.TearDownAndVerify(t, `[ { "id": { "name": "task1", @@ -332,7 +333,7 @@ func TestGetTaskFuncWithTable(t *testing.T) { err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchAllVerOfTask", s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{}) - tearDownAndVerify(t, s.Writer, ` + s.TearDownAndVerify(t, ` --------- ------- ------ --------------------------- --------- -------------- ------------------- ---------------------- | VERSION | NAME | TYPE | INPUTS | OUTPUTS | DISCOVERABLE | DISCOVERY VERSION | CREATED AT | --------- ------- ------ --------------------------- --------- -------------- ------------------- ---------------------- @@ -357,7 +358,7 @@ func TestGetTaskFuncLatest(t *testing.T) { err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchTaskLatestVersion", s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{}) - tearDownAndVerify(t, s.Writer, `{ + s.TearDownAndVerify(t, `{ "id": { "name": "task1", "version": "v2" @@ -407,7 +408,7 @@ func TestGetTaskWithVersion(t *testing.T) { err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchTaskVersion", s.Ctx, "task1", "v2", "dummyProject", "dummyDomain") - tearDownAndVerify(t, s.Writer, `{ + s.TearDownAndVerify(t, `{ "id": { "name": "task1", "version": "v2" @@ -454,7 +455,7 @@ func TestGetTasks(t *testing.T) { err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `[{"id": {"name": "task1","version": "v2"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + s.TearDownAndVerify(t, `[{"id": {"name": "task1","version": "v2"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetTasksFilters(t *testing.T) { @@ -464,12 +465,20 @@ func TestGetTasksFilters(t *testing.T) { FieldSelector: "task.name=task1,task.version=v1", } s.MockAdminClient.OnListTasksMatch(s.Ctx, resourceListFilterRequestTask).Return(taskListFilterResponse, nil) + filteredTasks := []*admin.Task{} + for _, task := range taskListResponse.Tasks { + if task.Id.Name == "task1" && task.Id.Version == "v1" { + filteredTasks = append(filteredTasks, task) + } + } s.FetcherExt.OnFetchAllVerOfTask(s.Ctx, "task1", "dummyProject", "dummyDomain", filters.Filters{ FieldSelector: "task.name=task1,task.version=v1", - }).Return(taskListResponse.Tasks, nil) + }).Return(filteredTasks, nil) + err := getTaskFunc(s.Ctx, argsTask, s.CmdCtx) + assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}`) + s.TearDownAndVerify(t, `{"id": {"name": "task1","version": "v1"},"closure": {"compiledTask": {"template": {"interface": {"inputs": {"variables": {"sorted_list1": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"},"sorted_list2": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "var description"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}`) } func TestGetTaskWithExecFile(t *testing.T) { @@ -485,7 +494,7 @@ func TestGetTaskWithExecFile(t *testing.T) { os.Remove(taskConfig.DefaultConfig.ExecFile) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchTaskVersion", s.Ctx, "task1", "v2", "dummyProject", "dummyDomain") - tearDownAndVerify(t, s.Writer, `{ + s.TearDownAndVerify(t, `{ "id": { "name": "task1", "version": "v2" diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go index c622d8e3fc..ec8da17653 100644 --- a/flytectl/cmd/get/workflow_test.go +++ b/flytectl/cmd/get/workflow_test.go @@ -12,11 +12,12 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/flyteorg/flytectl/pkg/ext/mocks" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" ) @@ -169,7 +170,7 @@ func TestGetWorkflowFuncLatestWithTable(t *testing.T) { s.FetcherExt.OnFetchWorkflowLatestVersionMatch(s.Ctx, "workflow1", projectValue, domainValue, filters.Filters{}).Return(workflow1, nil) err := getWorkflowFunc(s.Ctx, argsWf, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, ` + s.TearDownAndVerify(t, ` --------- ----------- --------------------------- --------- ---------------------- | VERSION | NAME | INPUTS | OUTPUTS | CREATED AT | --------- ----------- --------------------------- --------- ---------------------- @@ -187,7 +188,7 @@ func TestListWorkflowFuncWithTable(t *testing.T) { s.FetcherExt.OnFetchAllVerOfWorkflowMatch(s.Ctx, "workflow1", projectValue, domainValue, filters.Filters{}).Return(workflows, nil) err := getWorkflowFunc(s.Ctx, argsWf, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, ` + s.TearDownAndVerify(t, ` --------- ----------- ---------------------- | VERSION | NAME | CREATED AT | --------- ----------- ---------------------- diff --git a/flytectl/cmd/testutils/test_utils.go b/flytectl/cmd/testutils/test_utils.go index b94b7d3671..067720c8ad 100644 --- a/flytectl/cmd/testutils/test_utils.go +++ b/flytectl/cmd/testutils/test_utils.go @@ -3,6 +3,7 @@ package testutils import ( "bytes" "context" + "fmt" "io" "log" "os" @@ -14,10 +15,11 @@ import ( "github.com/flyteorg/flyteidl/clients/go/admin" + "github.com/stretchr/testify/assert" + "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" extMocks "github.com/flyteorg/flytectl/pkg/ext/mocks" - "github.com/stretchr/testify/assert" ) const projectValue = "dummyProject" @@ -97,15 +99,31 @@ func SetupWithExt() (s TestStruct) { } // TearDownAndVerify TODO: Change this to verify log lines from context -func TearDownAndVerify(t *testing.T, reader io.Reader, expectedLog string) { +func (s *TestStruct) TearDownAndVerify(t *testing.T, expectedLog string) { + if err := s.Writer.Close(); err != nil { + panic(fmt.Errorf("could not close test context writer: %w", err)) + } + var buf bytes.Buffer - if _, err := io.Copy(&buf, reader); err == nil { - assert.Equal(t, sanitizeString(expectedLog), sanitizeString(buf.String())) + if _, err := io.Copy(&buf, s.Reader); err != nil { + panic(fmt.Errorf("could not read from test context reader: %w", err)) } + + assert.Equal(t, sanitizeString(expectedLog), sanitizeString(buf.String())) } func sanitizeString(str string) string { - // Not the most comprehensive ANSI pattern, but this should capture common color operations such as \x1b[107;0m and \x1b[0m. Expand if needed (insert regex 2 problems joke here). + // Not the most comprehensive ANSI pattern, but this should capture common color operations + // such as \x1b[107;0m and \x1b[0m. Expand if needed (insert regex 2 problems joke here). ansiRegex := regexp.MustCompile("\u001B\\[[\\d+\\;]*\\d+m") - return ansiRegex.ReplaceAllString(strings.Trim(strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(str, "\n", ""), "\t", ""), "", ""), " \t"), "") + replacer := strings.NewReplacer( + "\n", "", + "\t", "", + ) + + str = replacer.Replace(str) + str = ansiRegex.ReplaceAllString(str, "") + str = strings.Trim(str, " ") + + return str } diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go index c9261393a8..8b6f8b2faf 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go @@ -4,9 +4,10 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" ) func updateClusterResourceAttributeSetup() { @@ -20,7 +21,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { err := updateClusterResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for cluster resource attribute"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successfully updated project domain attribute", func(t *testing.T) { s := setup() @@ -31,7 +32,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { mock.Anything).Return(nil) err := updateClusterResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed to update project domain attribute", func(t *testing.T) { s := setup() @@ -43,7 +44,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { err := updateClusterResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successfully updated workflow attribute", func(t *testing.T) { s := setup() @@ -54,7 +55,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed to update workflow attribute", func(t *testing.T) { s := setup() @@ -66,7 +67,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("non existent file", func(t *testing.T) { s := setup() @@ -75,7 +76,7 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("invalid update file", func(t *testing.T) { s := setup() @@ -84,6 +85,6 @@ func TestUpdateClusterResourceAttributes(t *testing.T) { err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/update/matchable_execution_cluster_label_test.go b/flytectl/cmd/update/matchable_execution_cluster_label_test.go index 2a4e7d500c..fffbd0f250 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label_test.go @@ -4,9 +4,10 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" ) func updateExecutionClusterLabelSetup() { @@ -20,7 +21,7 @@ func TestExecutionClusterLabel(t *testing.T) { err := updateExecutionClusterLabelFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for execution cluster label"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful update project domain attribute", func(t *testing.T) { s := setup() @@ -31,7 +32,7 @@ func TestExecutionClusterLabel(t *testing.T) { mock.Anything).Return(nil) err := updateExecutionClusterLabelFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { s := setup() @@ -43,7 +44,7 @@ func TestExecutionClusterLabel(t *testing.T) { err := updateExecutionClusterLabelFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful update workflow attribute", func(t *testing.T) { s := setup() @@ -54,7 +55,7 @@ func TestExecutionClusterLabel(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { s := setup() @@ -66,7 +67,7 @@ func TestExecutionClusterLabel(t *testing.T) { err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("non existent file", func(t *testing.T) { s := setup() @@ -75,7 +76,7 @@ func TestExecutionClusterLabel(t *testing.T) { err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("invalid update file", func(t *testing.T) { s := setup() @@ -84,6 +85,6 @@ func TestExecutionClusterLabel(t *testing.T) { err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go index f789c0d8cc..cffad3da3d 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go @@ -4,9 +4,10 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" ) func updateExecutionQueueAttributeSetup() { @@ -20,7 +21,7 @@ func TestExecutionQueueAttributes(t *testing.T) { err := updateExecutionQueueAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for execution queue attribute"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful update project domain attribute", func(t *testing.T) { s := setup() @@ -31,7 +32,7 @@ func TestExecutionQueueAttributes(t *testing.T) { mock.Anything).Return(nil) err := updateExecutionQueueAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { s := setup() @@ -43,7 +44,7 @@ func TestExecutionQueueAttributes(t *testing.T) { err := updateExecutionQueueAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful update workflow attribute", func(t *testing.T) { s := setup() @@ -54,7 +55,7 @@ func TestExecutionQueueAttributes(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { s := setup() @@ -66,7 +67,7 @@ func TestExecutionQueueAttributes(t *testing.T) { err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("non existent file", func(t *testing.T) { s := setup() @@ -75,7 +76,7 @@ func TestExecutionQueueAttributes(t *testing.T) { err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("invalid update file", func(t *testing.T) { s := setup() @@ -84,6 +85,6 @@ func TestExecutionQueueAttributes(t *testing.T) { err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/update/matchable_plugin_override_test.go b/flytectl/cmd/update/matchable_plugin_override_test.go index f8fcef96a7..5165b0091e 100644 --- a/flytectl/cmd/update/matchable_plugin_override_test.go +++ b/flytectl/cmd/update/matchable_plugin_override_test.go @@ -4,9 +4,10 @@ import ( "fmt" "testing" - pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + + pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" ) func updatePluginOverrideSetup() { @@ -20,7 +21,7 @@ func TestPluginOverride(t *testing.T) { err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for plugin override"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful update project domain attribute", func(t *testing.T) { s := setup() @@ -31,7 +32,7 @@ func TestPluginOverride(t *testing.T) { mock.Anything).Return(nil) err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { s := setup() @@ -43,7 +44,7 @@ func TestPluginOverride(t *testing.T) { err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful update workflow attribute", func(t *testing.T) { s := setup() @@ -54,7 +55,7 @@ func TestPluginOverride(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { s := setup() @@ -66,7 +67,7 @@ func TestPluginOverride(t *testing.T) { err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("non existent file", func(t *testing.T) { s := setup() @@ -75,7 +76,7 @@ func TestPluginOverride(t *testing.T) { err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("invalid update file", func(t *testing.T) { s := setup() @@ -84,6 +85,6 @@ func TestPluginOverride(t *testing.T) { err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/update/matchable_task_resource_attribute_test.go b/flytectl/cmd/update/matchable_task_resource_attribute_test.go index 079fee9dce..e9135f1355 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute_test.go @@ -4,9 +4,10 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" ) func updateTaskResourceAttributeSetup() { @@ -20,7 +21,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for task resource attribute"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful update project domain attribute", func(t *testing.T) { s := setup() @@ -31,7 +32,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { mock.Anything).Return(nil) err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { s := setup() @@ -43,7 +44,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful update workflow attribute", func(t *testing.T) { s := setup() @@ -54,7 +55,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { s := setup() @@ -66,7 +67,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("non existent file", func(t *testing.T) { s := setup() @@ -75,7 +76,7 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("invalid update file", func(t *testing.T) { s := setup() @@ -84,6 +85,6 @@ func TestUpdateTaskResourceAttributes(t *testing.T) { err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/update/matchable_workflow_execution_config_test.go b/flytectl/cmd/update/matchable_workflow_execution_config_test.go index f4f1834c83..9f5ef81baf 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config_test.go @@ -21,7 +21,7 @@ func TestWorkflowExecutionConfigs(t *testing.T) { err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for workflow execution config"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful update project domain attribute", func(t *testing.T) { s := setup() @@ -32,7 +32,7 @@ func TestWorkflowExecutionConfigs(t *testing.T) { mock.Anything).Return(nil) err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) }) t.Run("failed update project domain attribute", func(t *testing.T) { s := setup() @@ -44,7 +44,7 @@ func TestWorkflowExecutionConfigs(t *testing.T) { err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("successful update workflow attribute", func(t *testing.T) { s := setup() @@ -55,7 +55,7 @@ func TestWorkflowExecutionConfigs(t *testing.T) { mock.Anything, mock.Anything).Return(nil) err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) - tearDownAndVerify(t, s.Writer, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) + s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) }) t.Run("failed update workflow attribute", func(t *testing.T) { s := setup() @@ -67,7 +67,7 @@ func TestWorkflowExecutionConfigs(t *testing.T) { err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("non existent file", func(t *testing.T) { s := setup() @@ -76,7 +76,7 @@ func TestWorkflowExecutionConfigs(t *testing.T) { err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) t.Run("invalid update file", func(t *testing.T) { s := setup() @@ -85,6 +85,6 @@ func TestWorkflowExecutionConfigs(t *testing.T) { err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - tearDownAndVerify(t, s.Writer, ``) + s.TearDownAndVerify(t, ``) }) } diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index b3838b59ac..25fb768f47 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -52,7 +52,7 @@ func TestActivateProjectFunc(t *testing.T) { err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) - tearDownAndVerify(t, s.Writer, "Project dummyProject updated\n") + s.TearDownAndVerify(t, "Project dummyProject updated\n") } func TestActivateProjectFuncWithError(t *testing.T) { @@ -73,7 +73,7 @@ func TestActivateProjectFuncWithError(t *testing.T) { err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) - tearDownAndVerify(t, s.Writer, "Project dummyProject failed to update due to Error Updating Project\n") + s.TearDownAndVerify(t, "Project dummyProject failed to update due to Error Updating Project\n") } func TestArchiveProjectFunc(t *testing.T) { @@ -95,7 +95,7 @@ func TestArchiveProjectFunc(t *testing.T) { err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.Nil(t, err) s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) - tearDownAndVerify(t, s.Writer, "Project dummyProject updated\n") + s.TearDownAndVerify(t, "Project dummyProject updated\n") } func TestArchiveProjectFuncWithError(t *testing.T) { @@ -116,7 +116,7 @@ func TestArchiveProjectFuncWithError(t *testing.T) { err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) - tearDownAndVerify(t, s.Writer, "Project dummyProject failed to update"+ + s.TearDownAndVerify(t, "Project dummyProject failed to update"+ " due to Error Updating Project\n") } @@ -139,5 +139,5 @@ func TestInvalidInput(t *testing.T) { err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) assert.NotNil(t, err) assert.Equal(t, fmt.Errorf(clierrors.ErrInvalidStateUpdate), err) - tearDownAndVerify(t, s.Writer, "") + s.TearDownAndVerify(t, "") } diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index b17bae11e8..d4a256e06c 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -4,8 +4,9 @@ import ( "sort" "testing" - "github.com/flyteorg/flytectl/cmd/testutils" "github.com/stretchr/testify/assert" + + "github.com/flyteorg/flytectl/cmd/testutils" ) const ( @@ -14,7 +15,6 @@ const ( ) var setup = testutils.Setup -var tearDownAndVerify = testutils.TearDownAndVerify func TestUpdateCommand(t *testing.T) { updateCommand := CreateUpdateCommand() From ec7c344c966efe82f0eecf63f5d07f1656130f74 Mon Sep 17 00:00:00 2001 From: Chao-Heng Lee Date: Mon, 9 Oct 2023 05:15:48 -0500 Subject: [PATCH 320/645] Hide global flags by overriding usage template of cobra. (#430) Signed-off-by: Chao-Heng Lee --- flytectl/cmd/root.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index 760cf3bafc..e682eb63d7 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -78,6 +78,29 @@ func newRootCmd() *cobra.Command { config.GetConfig() + // hide global flags + rootCmd.SetUsageTemplate(`Usage:{{if .Runnable}} + {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} + {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}} + +Aliases: + {{.NameAndAliases}}{{end}}{{if .HasExample}} + +Examples: +{{.Example}}{{end}}{{if .HasAvailableSubCommands}} + +Available Commands:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}} + {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} + +Flags: +{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} + +Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} + {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} + +Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} +`) + return rootCmd } From 49714a3cbebf8d5eb0c6c99d907376409eab4e7f Mon Sep 17 00:00:00 2001 From: kamaleybov <54046807+kamaleybov@users.noreply.github.com> Date: Thu, 12 Oct 2023 13:58:38 -0700 Subject: [PATCH 321/645] Require a user ACK or --force flag for update commands #minor (#423) * WIP. Marked places where an acknowledgement before an update is needed. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * (1) Added error handling for methods fetching matchable attributes when attributes do not exist. (2) Added fetching data that is needed for diffing during updates. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * Diff and ask for ack. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * Fixed some of the TODOs. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * Cleaned up error handling. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * Updated tests. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * More tests. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * Fix case for No string to no (#419) Signed-off-by: Future Outlier Co-authored-by: Future Outlier Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * Replaced diffing implementation. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * Addressed pull request comments. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * Fixed linter errors. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> --------- Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> Signed-off-by: Future Outlier Co-authored-by: Future-Outlier Co-authored-by: Future Outlier --- flytectl/clierrors/errors.go | 4 +- .../attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 + .../clusterresourceattribute/update_config.go | 1 + .../subcommand/execution/update_config.go | 1 + .../execution/updateconfig_flags.go | 1 + .../execution/updateconfig_flags_test.go | 14 + .../attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 + .../executionclusterlabel/update_config.go | 1 + .../attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 + .../executionqueueattribute/update_config.go | 1 + .../subcommand/launchplan/updateconfig.go | 1 + .../launchplan/updateconfig_flags.go | 1 + .../launchplan/updateconfig_flags_test.go | 14 + .../plugin_override/attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 + .../plugin_override/update_config.go | 1 + .../subcommand/project/configproject_flags.go | 1 + .../project/configproject_flags_test.go | 14 + .../subcommand/project/project_config.go | 1 + .../attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 + .../taskresourceattribute/update_config.go | 1 + .../attrupdateconfig_flags.go | 1 + .../attrupdateconfig_flags_test.go | 14 + .../workflowexecutionconfig/update_config.go | 1 + flytectl/cmd/testutils/test_utils.go | 35 +- flytectl/cmd/update/diff.go | 68 ++ flytectl/cmd/update/diff_test.go | 62 ++ flytectl/cmd/update/execution.go | 75 +- flytectl/cmd/update/execution_test.go | 262 +++++-- flytectl/cmd/update/launch_plan.go | 81 ++- flytectl/cmd/update/launch_plan_meta.go | 3 +- flytectl/cmd/update/launch_plan_meta_test.go | 193 +++++- flytectl/cmd/update/launch_plan_test.go | 269 +++++++- .../cmd/update/matchable_attribute_util.go | 191 +++++- .../matchable_cluster_resource_attribute.go | 7 +- ...tchable_cluster_resource_attribute_test.go | 629 +++++++++++++++-- .../matchable_execution_cluster_label.go | 7 +- .../matchable_execution_cluster_label_test.go | 617 +++++++++++++++-- .../matchable_execution_queue_attribute.go | 7 +- ...atchable_execution_queue_attribute_test.go | 629 +++++++++++++++-- .../cmd/update/matchable_plugin_override.go | 7 +- .../update/matchable_plugin_override_test.go | 647 ++++++++++++++++-- .../matchable_task_resource_attribute.go | 7 +- .../matchable_task_resource_attribute_test.go | 626 +++++++++++++++-- .../matchable_workflow_execution_config.go | 7 +- ...atchable_workflow_execution_config_test.go | 642 +++++++++++++++-- flytectl/cmd/update/named_entity.go | 95 ++- flytectl/cmd/update/named_entity_test.go | 104 ++- .../cmd/update/namedentityconfig_flags.go | 1 + .../update/namedentityconfig_flags_test.go | 14 + flytectl/cmd/update/project.go | 74 +- flytectl/cmd/update/project_test.go | 329 ++++++--- flytectl/cmd/update/task_meta_test.go | 189 ++++- .../valid_project_cluster_attribute.yaml | 4 + ...valid_project_execution_cluster_label.yaml | 2 + ...lid_project_execution_queue_attribute.yaml | 6 + .../valid_project_plugin_override.yaml | 7 + .../valid_project_task_attribute.yaml | 7 + ...lid_project_workflow_execution_config.yaml | 2 + flytectl/cmd/update/update.go | 7 +- flytectl/cmd/update/update_test.go | 4 - flytectl/cmd/update/workflow_meta_test.go | 189 ++++- flytectl/go.mod | 3 +- flytectl/go.sum | 2 + flytectl/pkg/ext/attribute_match_fetcher.go | 40 +- .../pkg/ext/attribute_match_fetcher_test.go | 9 +- flytectl/pkg/ext/errors.go | 24 + flytectl/pkg/ext/fetcher.go | 3 + .../ext/mocks/admin_fetcher_ext_interface.go | 41 ++ flytectl/pkg/ext/project_fetcher.go | 25 + flytectl/pkg/filters/filters.go | 10 + flytectl/pkg/filters/filters_test.go | 11 + 76 files changed, 5576 insertions(+), 845 deletions(-) create mode 100644 flytectl/cmd/update/diff.go create mode 100644 flytectl/cmd/update/diff_test.go create mode 100644 flytectl/cmd/update/testdata/valid_project_cluster_attribute.yaml create mode 100644 flytectl/cmd/update/testdata/valid_project_execution_cluster_label.yaml create mode 100644 flytectl/cmd/update/testdata/valid_project_execution_queue_attribute.yaml create mode 100644 flytectl/cmd/update/testdata/valid_project_plugin_override.yaml create mode 100644 flytectl/cmd/update/testdata/valid_project_task_attribute.yaml create mode 100644 flytectl/cmd/update/testdata/valid_project_workflow_execution_config.yaml create mode 100644 flytectl/pkg/ext/errors.go diff --git a/flytectl/clierrors/errors.go b/flytectl/clierrors/errors.go index 3ced52fee7..05ab96cb00 100644 --- a/flytectl/clierrors/errors.go +++ b/flytectl/clierrors/errors.go @@ -6,11 +6,11 @@ var ( ErrProjectNotPassed = "project id wasn't passed\n" // #nosec ErrProjectIDBothPassed = "both project and id are passed\n" ErrProjectNameNotPassed = "project name is a required flag" - ErrFailedProjectUpdate = "Project %v failed to update due to %v\n" + ErrFailedProjectUpdate = "Project %v failed to update due to %w\n" ErrLPNotPassed = "launch plan name wasn't passed\n" ErrLPVersionNotPassed = "launch plan version wasn't passed\n" //nolint - ErrFailedLPUpdate = "launch plan %v failed to update due to %v\n" + ErrFailedLPUpdate = "launch plan %v failed to update due to %w\n" ErrExecutionNotPassed = "execution name wasn't passed\n" ErrFailedExecutionUpdate = "execution %v failed to update due to %v\n" diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go index 4f05b3a8a8..f0f8103f12 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags.go @@ -52,5 +52,6 @@ func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") + cmdFlags.BoolVar(&DefaultUpdateConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultUpdateConfig.Force, "do not ask for an acknowledgement during updates.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go index 29c9328801..9396a2e9e4 100755 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/attrupdateconfig_flags_test.go @@ -127,4 +127,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go index 3727fbdb2a..9b4534eed7 100644 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/update_config.go @@ -6,6 +6,7 @@ package clusterresourceattribute type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/execution/update_config.go b/flytectl/cmd/config/subcommand/execution/update_config.go index 8623435784..7d55a5e9b0 100644 --- a/flytectl/cmd/config/subcommand/execution/update_config.go +++ b/flytectl/cmd/config/subcommand/execution/update_config.go @@ -10,4 +10,5 @@ type UpdateConfig struct { Archive bool `json:"archive" pflag:",archive execution."` Activate bool `json:"activate" pflag:",activate execution."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` } diff --git a/flytectl/cmd/config/subcommand/execution/updateconfig_flags.go b/flytectl/cmd/config/subcommand/execution/updateconfig_flags.go index 03c9d0f90b..a1b251c18d 100755 --- a/flytectl/cmd/config/subcommand/execution/updateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/execution/updateconfig_flags.go @@ -53,5 +53,6 @@ func (cfg UpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.BoolVar(&UConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), UConfig.Archive, "archive execution.") cmdFlags.BoolVar(&UConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), UConfig.Activate, "activate execution.") cmdFlags.BoolVar(&UConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), UConfig.DryRun, "execute command without making any modifications.") + cmdFlags.BoolVar(&UConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), UConfig.Force, "do not ask for an acknowledgement during updates.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/execution/updateconfig_flags_test.go b/flytectl/cmd/config/subcommand/execution/updateconfig_flags_test.go index 6c65c2d14b..2e6c693ea8 100755 --- a/flytectl/cmd/config/subcommand/execution/updateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/execution/updateconfig_flags_test.go @@ -141,4 +141,18 @@ func TestUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go index 8b1beee0bf..979e08ea50 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags.go @@ -52,5 +52,6 @@ func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") + cmdFlags.BoolVar(&DefaultUpdateConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultUpdateConfig.Force, "do not ask for an acknowledgement during updates.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go index 4712ba314e..e2a8fe2a2e 100755 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/attrupdateconfig_flags_test.go @@ -127,4 +127,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go index 62d853a7cc..be0de45cef 100644 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/update_config.go @@ -6,6 +6,7 @@ package executionclusterlabel type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go index cff8301fb7..7643a98017 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags.go @@ -52,5 +52,6 @@ func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") + cmdFlags.BoolVar(&DefaultUpdateConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultUpdateConfig.Force, "do not ask for an acknowledgement during updates.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go index ff19cfa42f..82c697d17a 100755 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/attrupdateconfig_flags_test.go @@ -127,4 +127,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go index 7826602ab6..65dd680d5a 100644 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/update_config.go @@ -6,6 +6,7 @@ package executionqueueattribute type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig.go index b7bd87bbc7..36e353c2e1 100644 --- a/flytectl/cmd/config/subcommand/launchplan/updateconfig.go +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig.go @@ -10,5 +10,6 @@ type UpdateConfig struct { Archive bool `json:"archive" pflag:",disable the launch plan schedule (if it has an active schedule associated with it)."` Activate bool `json:"activate" pflag:",activate launchplan."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` Version string `json:"version" pflag:",version of the launchplan to be fetched."` } diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go index 14570a00ca..4a9cad23ba 100755 --- a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go @@ -53,6 +53,7 @@ func (cfg UpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.BoolVar(&UConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), UConfig.Archive, "disable the launch plan schedule (if it has an active schedule associated with it).") cmdFlags.BoolVar(&UConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), UConfig.Activate, "activate launchplan.") cmdFlags.BoolVar(&UConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), UConfig.DryRun, "execute command without making any modifications.") + cmdFlags.BoolVar(&UConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), UConfig.Force, "do not ask for an acknowledgement during updates.") cmdFlags.StringVar(&UConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), UConfig.Version, "version of the launchplan to be fetched.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go index a0d1c1adf6..e9acca7bbe 100755 --- a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go @@ -141,6 +141,20 @@ func TestUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_version", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go index 8642031b92..82e5cb6661 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags.go @@ -52,5 +52,6 @@ func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") + cmdFlags.BoolVar(&DefaultUpdateConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultUpdateConfig.Force, "do not ask for an acknowledgement during updates.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go index 84628be5e7..309c31746a 100755 --- a/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/plugin_override/attrupdateconfig_flags_test.go @@ -127,4 +127,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/plugin_override/update_config.go b/flytectl/cmd/config/subcommand/plugin_override/update_config.go index 8e99970d4b..dc3c260074 100644 --- a/flytectl/cmd/config/subcommand/plugin_override/update_config.go +++ b/flytectl/cmd/config/subcommand/plugin_override/update_config.go @@ -6,6 +6,7 @@ package pluginoverride type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/project/configproject_flags.go b/flytectl/cmd/config/subcommand/project/configproject_flags.go index e0e1c75f08..6de8107e76 100755 --- a/flytectl/cmd/config/subcommand/project/configproject_flags.go +++ b/flytectl/cmd/config/subcommand/project/configproject_flags.go @@ -55,6 +55,7 @@ func (cfg ConfigProject) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.BoolVar(&DefaultProjectConfig.ArchiveProject, fmt.Sprintf("%v%v", prefix, "archiveProject"), DefaultProjectConfig.ArchiveProject, "(Deprecated) Archives the project specified as argument. Only used in update") cmdFlags.BoolVar(&DefaultProjectConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), DefaultProjectConfig.Activate, "Activates the project specified as argument. Only used in update") cmdFlags.BoolVar(&DefaultProjectConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), DefaultProjectConfig.Archive, "Archives the project specified as argument. Only used in update") + cmdFlags.BoolVar(&DefaultProjectConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultProjectConfig.Force, "Skips asking for an acknowledgement during an update operation. Only used in update") cmdFlags.StringVar(&DefaultProjectConfig.Name, fmt.Sprintf("%v%v", prefix, "name"), DefaultProjectConfig.Name, "name for the project specified as argument.") cmdFlags.BoolVar(&DefaultProjectConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultProjectConfig.DryRun, "execute command without making any modifications.") cmdFlags.StringVar(&DefaultProjectConfig.Description, fmt.Sprintf("%v%v", prefix, "description"), DefaultProjectConfig.Description, "description for the project specified as argument.") diff --git a/flytectl/cmd/config/subcommand/project/configproject_flags_test.go b/flytectl/cmd/config/subcommand/project/configproject_flags_test.go index abe5e1e627..98847d779a 100755 --- a/flytectl/cmd/config/subcommand/project/configproject_flags_test.go +++ b/flytectl/cmd/config/subcommand/project/configproject_flags_test.go @@ -169,6 +169,20 @@ func TestConfigProject_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_ConfigProject(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_name", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go index 96b9c643dd..c278443f16 100644 --- a/flytectl/cmd/config/subcommand/project/project_config.go +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -33,6 +33,7 @@ type ConfigProject struct { ArchiveProject bool `json:"archiveProject" pflag:",(Deprecated) Archives the project specified as argument. Only used in update"` Activate bool `json:"activate" pflag:",Activates the project specified as argument. Only used in update"` Archive bool `json:"archive" pflag:",Archives the project specified as argument. Only used in update"` + Force bool `json:"force" pflag:",Skips asking for an acknowledgement during an update operation. Only used in update"` Name string `json:"name" pflag:",name for the project specified as argument."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` Description string `json:"description" pflag:",description for the project specified as argument."` diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go index 1a0e3e3a86..402add1c0d 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags.go @@ -52,5 +52,6 @@ func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") + cmdFlags.BoolVar(&DefaultUpdateConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultUpdateConfig.Force, "do not ask for an acknowledgement during updates.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go index 2a141e049b..aaf429a732 100755 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/attrupdateconfig_flags_test.go @@ -127,4 +127,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go index 084c65d6d4..4ee836e433 100644 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/update_config.go @@ -6,6 +6,7 @@ package taskresourceattribute type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go index 571daa90d5..a8423cdb86 100755 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags.go @@ -52,5 +52,6 @@ func (cfg AttrUpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("AttrUpdateConfig", pflag.ExitOnError) cmdFlags.StringVar(&DefaultUpdateConfig.AttrFile, fmt.Sprintf("%v%v", prefix, "attrFile"), DefaultUpdateConfig.AttrFile, "attribute file name to be used for updating attribute for the resource type.") cmdFlags.BoolVar(&DefaultUpdateConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultUpdateConfig.DryRun, "execute command without making any modifications.") + cmdFlags.BoolVar(&DefaultUpdateConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultUpdateConfig.Force, "do not ask for an acknowledgement during updates.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go index 5707cccbc8..5c470ca066 100755 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/attrupdateconfig_flags_test.go @@ -127,4 +127,18 @@ func TestAttrUpdateConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_AttrUpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go index 7fd6a1de64..2b244000e2 100644 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/update_config.go @@ -6,6 +6,7 @@ package workflowexecutionconfig type AttrUpdateConfig struct { AttrFile string `json:"attrFile" pflag:",attribute file name to be used for updating attribute for the resource type."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` } var DefaultUpdateConfig = &AttrUpdateConfig{} diff --git a/flytectl/cmd/testutils/test_utils.go b/flytectl/cmd/testutils/test_utils.go index 067720c8ad..37f71af493 100644 --- a/flytectl/cmd/testutils/test_utils.go +++ b/flytectl/cmd/testutils/test_utils.go @@ -6,20 +6,19 @@ import ( "fmt" "io" "log" + "math/rand" "os" "regexp" "strings" "testing" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - - "github.com/flyteorg/flyteidl/clients/go/admin" - "github.com/stretchr/testify/assert" "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" extMocks "github.com/flyteorg/flytectl/pkg/ext/mocks" + "github.com/flyteorg/flyteidl/clients/go/admin" + "github.com/flyteorg/flyteidl/clients/go/admin/mocks" ) const projectValue = "dummyProject" @@ -112,6 +111,34 @@ func (s *TestStruct) TearDownAndVerify(t *testing.T, expectedLog string) { assert.Equal(t, sanitizeString(expectedLog), sanitizeString(buf.String())) } +func (s *TestStruct) TearDownAndVerifyContains(t *testing.T, expectedLog string) { + if err := s.Writer.Close(); err != nil { + panic(fmt.Errorf("could not close test context writer: %w", err)) + } + + var buf bytes.Buffer + if _, err := io.Copy(&buf, s.Reader); err != nil { + panic(fmt.Errorf("could not read from test context reader: %w", err)) + } + + assert.Contains(t, sanitizeString(buf.String()), sanitizeString(expectedLog)) +} + +// RandomName returns a string composed of random lowercase English letters of specified length. +func RandomName(length int) string { + if length < 0 { + panic("length should be a non-negative number") + } + + var b strings.Builder + for i := 0; i < length; i++ { + c := rune('a' + rand.Intn('z'-'a')) // #nosec G404 - we use this function for testing only, do not need a cryptographically secure random number generator + b.WriteRune(c) + } + + return b.String() +} + func sanitizeString(str string) string { // Not the most comprehensive ANSI pattern, but this should capture common color operations // such as \x1b[107;0m and \x1b[0m. Expand if needed (insert regex 2 problems joke here). diff --git a/flytectl/cmd/update/diff.go b/flytectl/cmd/update/diff.go new file mode 100644 index 0000000000..b0f9190f93 --- /dev/null +++ b/flytectl/cmd/update/diff.go @@ -0,0 +1,68 @@ +package update + +import ( + "encoding/json" + "fmt" + + "github.com/hexops/gotextdiff" + "github.com/hexops/gotextdiff/myers" + "gopkg.in/yaml.v3" +) + +const ( + diffPathBefore = "before" + diffPathAfter = "after" +) + +// DiffAsYaml marshals both objects as YAML and returns differences +// between marshalled values in unified format. Marshalling respects +// JSON field annotations. +func DiffAsYaml(path1, path2 string, object1, object2 any) (string, error) { + yaml1, err := marshalToYamlString(object1) + if err != nil { + return "", fmt.Errorf("diff as yaml: %w", err) + } + + yaml2, err := marshalToYamlString(object2) + if err != nil { + return "", fmt.Errorf("diff as yaml: %w", err) + } + + patch := diffStrings(path1, path2, yaml1, yaml2) + return patch, nil +} + +// marshalToYamlString marshals value to a YAML string, while respecting +// JSON field annotations. +func marshalToYamlString(value any) (string, error) { + jsonText, err := json.Marshal(value) + if err != nil { + return "", fmt.Errorf("marshalling object to json: %w", err) + } + + var jsonObject interface{} + if err := yaml.Unmarshal(jsonText, &jsonObject); err != nil { + return "", fmt.Errorf("unmarshalling yaml to object: %w", err) + } + + data, err := yaml.Marshal(jsonObject) + if err != nil { + return "", fmt.Errorf("marshalling object to yaml: %w", err) + } + + return string(data), nil +} + +// diffStrings returns differences between two strings in unified format. +// An empty string will be returned if both strings are equal. +func diffStrings(path1, path2, s1, s2 string) string { + // We add new lines at the end of each string to avoid + // "\ No newline at end of file" appended to each diff. + s1 += "\n" + s2 += "\n" + + edits := myers.ComputeEdits("", s1, s2) + diff := fmt.Sprint(gotextdiff.ToUnified(path1, path2, s1, edits)) + + return diff +} diff --git a/flytectl/cmd/update/diff_test.go b/flytectl/cmd/update/diff_test.go new file mode 100644 index 0000000000..0bb3df74c2 --- /dev/null +++ b/flytectl/cmd/update/diff_test.go @@ -0,0 +1,62 @@ +package update + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestMarshalToYamlStringRespectsJsonFieldAnnotations(t *testing.T) { + type T struct { + FieldIncluded1 int `json:"fieldIncluded1"` + FieldIncluded2 string `json:"fieldIncluded2"` + FieldOmitted string `json:"fieldOmitted,omitempty"` + } + value := T{} + + result, err := marshalToYamlString(value) + + assert.Nil(t, err) + assert.Equal(t, `fieldIncluded1: 0 +fieldIncluded2: "" +`, result) +} + +func TestDiffStringsReturnsAUnifiedDiff(t *testing.T) { + s1 := "abc\ndef\nghi" + s2 := "aaa\ndef\nghi" + + patch := diffStrings("before", "after", s1, s2) + + assert.Equal(t, `--- before ++++ after +@@ -1,3 +1,3 @@ +-abc ++aaa + def + ghi +`, patch) +} + +func TestDiffAsYamlReturnsAUnifiedDiffOfObjectsMarshalledAsYAML(t *testing.T) { + type T struct { + F1 int `json:"f1"` + F2 string `json:"f2"` + F3 string `json:"f3,omitempty"` + } + object1 := T{F1: 5, F2: "apple"} + object2 := T{F1: 10, F2: "apple", F3: "banana"} + + patch, err := DiffAsYaml("before", "after", object1, object2) + + assert.Nil(t, err) + assert.Equal(t, `--- before ++++ after +@@ -1,3 +1,4 @@ +-f1: 5 ++f1: 10 + f2: apple ++f3: banana + +`, patch) +} diff --git a/flytectl/cmd/update/execution.go b/flytectl/cmd/update/execution.go index 517a28a352..d3f1fccdd5 100644 --- a/flytectl/cmd/update/execution.go +++ b/flytectl/cmd/update/execution.go @@ -3,14 +3,15 @@ package update import ( "context" "fmt" + "os" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" cmdCore "github.com/flyteorg/flytectl/cmd/core" + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flytestdlib/logger" ) const ( @@ -38,36 +39,62 @@ func updateExecutionFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comm return fmt.Errorf(clierrors.ErrExecutionNotPassed) } executionName := args[0] - activateExec := execution.UConfig.Activate - archiveExec := execution.UConfig.Archive - if activateExec && archiveExec { + activate := execution.UConfig.Activate + archive := execution.UConfig.Archive + if activate && archive { return fmt.Errorf(clierrors.ErrInvalidStateUpdate) } - var executionState admin.ExecutionState - if activateExec { - executionState = admin.ExecutionState_EXECUTION_ACTIVE - } else if archiveExec { - executionState = admin.ExecutionState_EXECUTION_ARCHIVED + var newState admin.ExecutionState + if activate { + newState = admin.ExecutionState_EXECUTION_ACTIVE + } else if archive { + newState = admin.ExecutionState_EXECUTION_ARCHIVED } + exec, err := cmdCtx.AdminFetcherExt().FetchExecution(ctx, executionName, project, domain) + if err != nil { + return fmt.Errorf("update execution: could not fetch execution %s: %w", executionName, err) + } + oldState := exec.GetClosure().GetStateChangeDetails().GetState() + + type Execution struct { + State admin.ExecutionState `json:"state"` + } + patch, err := DiffAsYaml(diffPathBefore, diffPathAfter, Execution{oldState}, Execution{newState}) + if err != nil { + panic(err) + } + + if patch == "" { + fmt.Printf("No changes detected. Skipping the update.\n") + return nil + } + + fmt.Printf("The following changes are to be applied.\n%s\n", patch) + if execution.UConfig.DryRun { - logger.Debugf(ctx, "skipping UpdateExecution request (DryRun)") - } else { - _, err := cmdCtx.AdminClient().UpdateExecution(ctx, &admin.ExecutionUpdateRequest{ - Id: &core.WorkflowExecutionIdentifier{ - Project: project, - Domain: domain, - Name: executionName, - }, - State: executionState, - }) - if err != nil { - fmt.Printf(clierrors.ErrFailedExecutionUpdate, executionName, err) - return err - } + fmt.Printf("skipping UpdateExecution request (DryRun)\n") + return nil + } + + if !execution.UConfig.Force && !cmdUtil.AskForConfirmation("Continue?", os.Stdin) { + return fmt.Errorf("update aborted by user") + } + + _, err = cmdCtx.AdminClient().UpdateExecution(ctx, &admin.ExecutionUpdateRequest{ + Id: &core.WorkflowExecutionIdentifier{ + Project: project, + Domain: domain, + Name: executionName, + }, + State: newState, + }) + if err != nil { + fmt.Printf(clierrors.ErrFailedExecutionUpdate, executionName, err) + return err } - fmt.Printf("updated execution %s successfully to state %s\n", executionName, executionState.String()) + fmt.Printf("updated execution %s successfully to state %s\n", executionName, newState) return nil } diff --git a/flytectl/cmd/update/execution_test.go b/flytectl/cmd/update/execution_test.go index 35ab591212..44a790e415 100644 --- a/flytectl/cmd/update/execution_test.go +++ b/flytectl/cmd/update/execution_test.go @@ -4,58 +4,240 @@ import ( "fmt" "testing" + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) -func TestExecutionUpdate(t *testing.T) { - s := testutils.Setup() - args := []string{"execution1"} - // Activate - execution.UConfig.Activate = true - s.MockAdminClient.OnUpdateExecutionMatch(mock.Anything, mock.Anything).Return(&admin.ExecutionUpdateResponse{}, nil) - assert.Nil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) - // Archive - execution.UConfig.Activate = false - execution.UConfig.Archive = true - assert.Nil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) - // Reset - execution.UConfig.Activate = false - execution.UConfig.Archive = false - - // Dry run - execution.UConfig.DryRun = true - assert.Nil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) - s.MockAdminClient.AssertNotCalled(t, "UpdateExecution", mock.Anything) - - // Reset - execution.UConfig.DryRun = false -} - -func TestExecutionUpdateValidationFailure(t *testing.T) { - s := testutils.Setup() - args := []string{"execution1"} - execution.UConfig.Activate = true - execution.UConfig.Archive = true - assert.NotNil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) - // Reset - execution.UConfig.Activate = false - execution.UConfig.Archive = false +func TestExecutionCanBeActivated(t *testing.T) { + testExecutionUpdate( + /* setup */ func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution) { + execution.Closure.StateChangeDetails.State = admin.ExecutionState_EXECUTION_ARCHIVED + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateExecution", s.Ctx, + mock.MatchedBy( + func(r *admin.ExecutionUpdateRequest) bool { + return r.State == admin.ExecutionState_EXECUTION_ACTIVE + })) + }) +} + +func TestExecutionCanBeArchived(t *testing.T) { + testExecutionUpdate( + /* setup */ func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution) { + execution.Closure.StateChangeDetails.State = admin.ExecutionState_EXECUTION_ACTIVE + config.Archive = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateExecution", s.Ctx, + mock.MatchedBy( + func(r *admin.ExecutionUpdateRequest) bool { + return r.State == admin.ExecutionState_EXECUTION_ARCHIVED + })) + }) +} + +func TestExecutionCannotBeActivatedAndArchivedAtTheSameTime(t *testing.T) { + testExecutionUpdate( + /* setup */ func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution) { + config.Activate = true + config.Archive = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "Specify either activate or archive") + s.MockAdminClient.AssertNotCalled(t, "UpdateExecution", mock.Anything, mock.Anything) + }) +} + +func TestExecutionUpdateDoesNothingWhenThereAreNoChanges(t *testing.T) { + testExecutionUpdate( + /* setup */ func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution) { + execution.Closure.StateChangeDetails.State = admin.ExecutionState_EXECUTION_ACTIVE + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateExecution", mock.Anything, mock.Anything) + }) } -func TestExecutionUpdateFail(t *testing.T) { +func TestExecutionUpdateWithoutForceFlagFails(t *testing.T) { + testExecutionUpdate( + /* setup */ func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution) { + execution.Closure.StateChangeDetails.State = admin.ExecutionState_EXECUTION_ARCHIVED + config.Activate = true + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.MockAdminClient.AssertNotCalled(t, "UpdateExecution", mock.Anything, mock.Anything) + }) +} + +func TestExecutionUpdateDoesNothingWithDryRunFlag(t *testing.T) { + testExecutionUpdate( + /* setup */ func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution) { + execution.Closure.StateChangeDetails.State = admin.ExecutionState_EXECUTION_ARCHIVED + config.Activate = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateExecution", mock.Anything, mock.Anything) + }) +} + +func TestForceFlagIsIgnoredWithDryRunDuringExecutionUpdate(t *testing.T) { + t.Run("without --force", func(t *testing.T) { + testExecutionUpdate( + /* setup */ func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution) { + execution.Closure.StateChangeDetails.State = admin.ExecutionState_EXECUTION_ARCHIVED + config.Activate = true + + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateExecution", mock.Anything, mock.Anything) + }) + }) + + t.Run("with --force", func(t *testing.T) { + testExecutionUpdate( + /* setup */ func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution) { + execution.Closure.StateChangeDetails.State = admin.ExecutionState_EXECUTION_ARCHIVED + config.Activate = true + + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateExecution", mock.Anything, mock.Anything) + }) + }) +} + +func TestExecutionUpdateFailsWhenExecutionDoesNotExist(t *testing.T) { + testExecutionUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, execution *admin.Execution) { + s.FetcherExt. + OnFetchExecution(s.Ctx, execution.Id.Name, execution.Id.Project, execution.Id.Domain). + Return(nil, ext.NewNotFoundError("execution not found")) + s.MockAdminClient. + OnUpdateExecutionMatch(s.Ctx, mock.Anything). + Return(&admin.ExecutionUpdateResponse{}, nil) + }, + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateExecution", mock.Anything, mock.Anything) + }, + ) +} + +func TestExecutionUpdateFailsWhenAdminClientFails(t *testing.T) { + testExecutionUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, execution *admin.Execution) { + s.FetcherExt. + OnFetchExecution(s.Ctx, execution.Id.Name, execution.Id.Project, execution.Id.Domain). + Return(execution, nil) + s.MockAdminClient. + OnUpdateExecutionMatch(s.Ctx, mock.Anything). + Return(nil, fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution) { + execution.Closure.StateChangeDetails.State = admin.ExecutionState_EXECUTION_ARCHIVED + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertCalled(t, "UpdateExecution", mock.Anything, mock.Anything) + }, + ) +} + +func TestExecutionUpdateRequiresExecutionName(t *testing.T) { s := testutils.Setup() - args := []string{"execution1"} - s.MockAdminClient.OnUpdateExecutionMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) + err := updateExecutionFunc(s.Ctx, nil, s.CmdCtx) + + assert.ErrorContains(t, err, "execution name wasn't passed") +} + +func testExecutionUpdate( + setup func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution), + asserter func(s *testutils.TestStruct, err error), +) { + testExecutionUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, execution *admin.Execution) { + s.FetcherExt. + OnFetchExecution(s.Ctx, execution.Id.Name, execution.Id.Project, execution.Id.Domain). + Return(execution, nil) + s.MockAdminClient. + OnUpdateExecutionMatch(s.Ctx, mock.Anything). + Return(&admin.ExecutionUpdateResponse{}, nil) + }, + setup, + asserter, + ) } -func TestExecutionUpdateInvalidArgs(t *testing.T) { +func testExecutionUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, execution *admin.Execution), + setup func(s *testutils.TestStruct, config *execution.UpdateConfig, execution *admin.Execution), + asserter func(s *testutils.TestStruct, err error), +) { s := testutils.Setup() - args := []string{} - assert.NotNil(t, updateExecutionFunc(s.Ctx, args, s.CmdCtx)) + target := newTestExecution() + + if mockSetup != nil { + mockSetup(&s, target) + } + + execution.UConfig = &execution.UpdateConfig{} + if setup != nil { + setup(&s, execution.UConfig, target) + } + + args := []string{target.Id.Name} + err := updateExecutionFunc(s.Ctx, args, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + execution.UConfig = &execution.UpdateConfig{} +} + +func newTestExecution() *admin.Execution { + return &admin.Execution{ + Id: &core.WorkflowExecutionIdentifier{ + Name: testutils.RandomName(12), + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + }, + Closure: &admin.ExecutionClosure{ + StateChangeDetails: &admin.ExecutionStateChangeDetails{ + State: admin.ExecutionState_EXECUTION_ACTIVE, + }, + }, + } } diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go index 369f756cd7..f1a9474e7c 100644 --- a/flytectl/cmd/update/launch_plan.go +++ b/flytectl/cmd/update/launch_plan.go @@ -3,14 +3,15 @@ package update import ( "context" "fmt" + "os" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" cmdCore "github.com/flyteorg/flytectl/cmd/core" + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flytestdlib/logger" ) const ( @@ -41,37 +42,67 @@ func updateLPFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandCont if len(version) == 0 { return fmt.Errorf(clierrors.ErrLPVersionNotPassed) } - activateLP := launchplan.UConfig.Activate - archiveLP := launchplan.UConfig.Archive - if activateLP == archiveLP && archiveLP { + + activate := launchplan.UConfig.Activate + archive := launchplan.UConfig.Archive + if activate == archive && archive { return fmt.Errorf(clierrors.ErrInvalidStateUpdate) } - var lpState admin.LaunchPlanState - if activateLP { - lpState = admin.LaunchPlanState_ACTIVE - } else if archiveLP { - lpState = admin.LaunchPlanState_INACTIVE + var newState admin.LaunchPlanState + if activate { + newState = admin.LaunchPlanState_ACTIVE + } else if archive { + newState = admin.LaunchPlanState_INACTIVE + } + + id := &core.Identifier{ + Project: project, + Domain: domain, + Name: name, + Version: version, + ResourceType: core.ResourceType_LAUNCH_PLAN, + } + + launchPlan, err := cmdCtx.AdminClient().GetLaunchPlan(ctx, &admin.ObjectGetRequest{Id: id}) + if err != nil { + return fmt.Errorf("update launch plan %s: could not fetch launch plan: %w", name, err) + } + oldState := launchPlan.GetClosure().GetState() + + type LaunchPlan struct { + State admin.LaunchPlanState `json:"state"` + } + patch, err := DiffAsYaml(diffPathBefore, diffPathAfter, LaunchPlan{oldState}, LaunchPlan{newState}) + if err != nil { + panic(err) + } + + if patch == "" { + fmt.Printf("No changes detected. Skipping the update.\n") + return nil } + fmt.Printf("The following changes are to be applied.\n%s\n", patch) + if launchplan.UConfig.DryRun { - logger.Debugf(ctx, "skipping CreateExecution request (DryRun)") - } else { - _, err := cmdCtx.AdminClient().UpdateLaunchPlan(ctx, &admin.LaunchPlanUpdateRequest{ - Id: &core.Identifier{ - Project: project, - Domain: domain, - Name: name, - Version: version, - }, - State: lpState, - }) - if err != nil { - fmt.Printf(clierrors.ErrFailedLPUpdate, name, err) - return err - } + fmt.Printf("skipping LaunchPlanUpdate request (DryRun)") + return nil + } + + if !launchplan.UConfig.Force && !cmdUtil.AskForConfirmation("Continue?", os.Stdin) { + return fmt.Errorf("update aborted by user") + } + + _, err = cmdCtx.AdminClient().UpdateLaunchPlan(ctx, &admin.LaunchPlanUpdateRequest{ + Id: id, + State: newState, + }) + if err != nil { + return fmt.Errorf(clierrors.ErrFailedLPUpdate, name, err) } - fmt.Printf("updated launchplan successfully on %v", name) + + fmt.Printf("updated launch plan successfully on %s", name) return nil } diff --git a/flytectl/cmd/update/launch_plan_meta.go b/flytectl/cmd/update/launch_plan_meta.go index e9aa1ae9a1..123413d6bf 100644 --- a/flytectl/cmd/update/launch_plan_meta.go +++ b/flytectl/cmd/update/launch_plan_meta.go @@ -42,8 +42,7 @@ func getUpdateLPMetaFunc(namedEntityConfig *NamedEntityConfig) func(ctx context. name := args[0] err := namedEntityConfig.UpdateNamedEntity(ctx, name, project, domain, core.ResourceType_LAUNCH_PLAN, cmdCtx) if err != nil { - fmt.Printf(clierrors.ErrFailedLPUpdate, name, err) - return err + return fmt.Errorf(clierrors.ErrFailedLPUpdate, name, err) } fmt.Printf("updated metadata successfully on %v", name) return nil diff --git a/flytectl/cmd/update/launch_plan_meta_test.go b/flytectl/cmd/update/launch_plan_meta_test.go index f0119b9eb1..84187be99d 100644 --- a/flytectl/cmd/update/launch_plan_meta_test.go +++ b/flytectl/cmd/update/launch_plan_meta_test.go @@ -4,32 +4,193 @@ import ( "fmt" "testing" + "github.com/google/go-cmp/cmp" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) -func TestLPMetaUpdate(t *testing.T) { - s := testutils.Setup() - namedEntityConfig := &NamedEntityConfig{} - args := []string{"task1"} - s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) - assert.Nil(t, getUpdateLPMetaFunc(namedEntityConfig)(s.Ctx, args, s.CmdCtx)) +func TestLaunchPlanMetadataCanBeActivated(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_LAUNCH_PLAN, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateNamedEntity", s.Ctx, + mock.MatchedBy( + func(r *admin.NamedEntityUpdateRequest) bool { + return r.GetMetadata().GetState() == admin.NamedEntityState_NAMED_ENTITY_ACTIVE + })) + }) } -func TestLPMetaUpdateFail(t *testing.T) { - s := testutils.Setup() - namedEntityConfig := &NamedEntityConfig{} - args := []string{"task1"} - s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, getUpdateTaskFunc(namedEntityConfig)(s.Ctx, args, s.CmdCtx)) +func TestLaunchPlanMetadataCanBeArchived(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_LAUNCH_PLAN, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ACTIVE + config.Archive = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateNamedEntity", s.Ctx, + mock.MatchedBy( + func(r *admin.NamedEntityUpdateRequest) bool { + return r.GetMetadata().GetState() == admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + })) + }) +} + +func TestLaunchPlanMetadataCannotBeActivatedAndArchivedAtTheSameTime(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_LAUNCH_PLAN, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + config.Activate = true + config.Archive = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "Specify either activate or archive") + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) +} + +func TestLaunchPlanMetadataUpdateDoesNothingWhenThereAreNoChanges(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_LAUNCH_PLAN, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ACTIVE + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) +} + +func TestLaunchPlanMetadataUpdateWithoutForceFlagFails(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_LAUNCH_PLAN, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) +} + +func TestLaunchPlanMetadataUpdateDoesNothingWithDryRunFlag(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_LAUNCH_PLAN, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) } -func TestLPMetaUpdateInvalidArgs(t *testing.T) { +func TestForceFlagIsIgnoredWithDryRunDuringLaunchPlanMetadataUpdate(t *testing.T) { + t.Run("without --force", func(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_LAUNCH_PLAN, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) + }) + + t.Run("with --force", func(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_LAUNCH_PLAN, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) + }) +} + +func TestLaunchPlanMetadataUpdateFailsWhenLaunchPlanDoesNotExist(t *testing.T) { + testNamedEntityUpdateWithMockSetup( + core.ResourceType_LAUNCH_PLAN, + /* mockSetup */ func(s *testutils.TestStruct, namedEntity *admin.NamedEntity) { + s.MockAdminClient. + OnGetNamedEntityMatch( + s.Ctx, + mock.MatchedBy(func(r *admin.NamedEntityGetRequest) bool { + return r.ResourceType == namedEntity.ResourceType && + cmp.Equal(r.Id, namedEntity.Id) + })). + Return(nil, ext.NewNotFoundError("named entity not found")) + s.MockAdminClient. + OnUpdateNamedEntityMatch(s.Ctx, mock.Anything). + Return(&admin.NamedEntityUpdateResponse{}, nil) + }, + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }, + ) +} + +func TestLaunchPlanMetadataUpdateFailsWhenAdminClientFails(t *testing.T) { + testNamedEntityUpdateWithMockSetup( + core.ResourceType_LAUNCH_PLAN, + /* mockSetup */ func(s *testutils.TestStruct, namedEntity *admin.NamedEntity) { + s.MockAdminClient. + OnGetNamedEntityMatch( + s.Ctx, + mock.MatchedBy(func(r *admin.NamedEntityGetRequest) bool { + return r.ResourceType == namedEntity.ResourceType && + cmp.Equal(r.Id, namedEntity.Id) + })). + Return(namedEntity, nil) + s.MockAdminClient. + OnUpdateNamedEntityMatch(s.Ctx, mock.Anything). + Return(nil, fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }, + ) +} + +func TestLaunchPlanMetadataUpdateRequiresLaunchPlanName(t *testing.T) { s := testutils.Setup() - namedEntityConfig := &NamedEntityConfig{} - args := []string{} - assert.NotNil(t, getUpdateTaskFunc(namedEntityConfig)(s.Ctx, args, s.CmdCtx)) + config := &NamedEntityConfig{} + + err := getUpdateLPMetaFunc(config)(s.Ctx, nil, s.CmdCtx) + + assert.ErrorContains(t, err, "launch plan name wasn't passed") } diff --git a/flytectl/cmd/update/launch_plan_test.go b/flytectl/cmd/update/launch_plan_test.go index 0e5010c5cf..11eb15f8f0 100644 --- a/flytectl/cmd/update/launch_plan_test.go +++ b/flytectl/cmd/update/launch_plan_test.go @@ -4,33 +4,274 @@ import ( "fmt" "testing" + "github.com/google/go-cmp/cmp" + + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) -func TestLPUpdate(t *testing.T) { +func TestLaunchPlanCanBeActivated(t *testing.T) { + testLaunchPlanUpdate( + /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { + launchplan.Closure.State = admin.LaunchPlanState_INACTIVE + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateLaunchPlan", s.Ctx, + mock.MatchedBy( + func(r *admin.LaunchPlanUpdateRequest) bool { + return r.State == admin.LaunchPlanState_ACTIVE + })) + }) +} + +func TestLaunchPlanCanBeArchived(t *testing.T) { + testLaunchPlanUpdate( + /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { + launchplan.Closure.State = admin.LaunchPlanState_ACTIVE + config.Archive = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateLaunchPlan", s.Ctx, + mock.MatchedBy( + func(r *admin.LaunchPlanUpdateRequest) bool { + return r.State == admin.LaunchPlanState_INACTIVE + })) + }) +} + +func TestLaunchPlanCannotBeActivatedAndArchivedAtTheSameTime(t *testing.T) { + testLaunchPlanUpdate( + /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { + config.Activate = true + config.Archive = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "Specify either activate or archive") + s.MockAdminClient.AssertNotCalled(t, "UpdateLaunchPlan", mock.Anything, mock.Anything) + }) +} + +func TestLaunchPlanUpdateDoesNothingWhenThereAreNoChanges(t *testing.T) { + testLaunchPlanUpdate( + /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { + launchplan.Closure.State = admin.LaunchPlanState_ACTIVE + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateLaunchPlan", mock.Anything, mock.Anything) + }) +} + +func TestLaunchPlanUpdateWithoutForceFlagFails(t *testing.T) { + testLaunchPlanUpdate( + /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { + launchplan.Closure.State = admin.LaunchPlanState_INACTIVE + config.Activate = true + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.MockAdminClient.AssertNotCalled(t, "UpdateLaunchPlan", mock.Anything, mock.Anything) + }) +} + +func TestLaunchPlanUpdateDoesNothingWithDryRunFlag(t *testing.T) { + testLaunchPlanUpdate( + /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { + launchplan.Closure.State = admin.LaunchPlanState_INACTIVE + config.Activate = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateLaunchPlan", mock.Anything, mock.Anything) + }) +} + +func TestForceFlagIsIgnoredWithDryRunDuringLaunchPlanUpdate(t *testing.T) { + t.Run("without --force", func(t *testing.T) { + testLaunchPlanUpdate( + /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { + launchplan.Closure.State = admin.LaunchPlanState_INACTIVE + config.Activate = true + + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateLaunchPlan", mock.Anything, mock.Anything) + }) + }) + + t.Run("with --force", func(t *testing.T) { + testLaunchPlanUpdate( + /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { + launchplan.Closure.State = admin.LaunchPlanState_INACTIVE + config.Activate = true + + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateLaunchPlan", mock.Anything, mock.Anything) + }) + }) +} + +func TestLaunchPlanUpdateFailsWhenLaunchPlanDoesNotExist(t *testing.T) { + testLaunchPlanUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, launchplan *admin.LaunchPlan) { + s.MockAdminClient. + OnGetLaunchPlanMatch( + s.Ctx, + mock.MatchedBy(func(r *admin.ObjectGetRequest) bool { + return cmp.Equal(r.Id, launchplan.Id) + })). + Return(nil, ext.NewNotFoundError("launch plan not found")) + s.MockAdminClient. + OnUpdateLaunchPlanMatch(s.Ctx, mock.Anything). + Return(&admin.LaunchPlanUpdateResponse{}, nil) + }, + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateLaunchPlan", mock.Anything, mock.Anything) + }, + ) +} + +func TestLaunchPlanUpdateFailsWhenAdminClientFails(t *testing.T) { + testLaunchPlanUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, launchplan *admin.LaunchPlan) { + s.MockAdminClient. + OnGetLaunchPlanMatch( + s.Ctx, + mock.MatchedBy(func(r *admin.ObjectGetRequest) bool { + return cmp.Equal(r.Id, launchplan.Id) + })). + Return(launchplan, nil) + s.MockAdminClient. + OnUpdateLaunchPlanMatch(s.Ctx, mock.Anything). + Return(nil, fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { + launchplan.Closure.State = admin.LaunchPlanState_INACTIVE + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertCalled(t, "UpdateLaunchPlan", mock.Anything, mock.Anything) + }, + ) +} + +func TestLaunchPlanUpdateRequiresLaunchPlanName(t *testing.T) { s := testutils.Setup() - launchplan.UConfig = &launchplan.UpdateConfig{Version: "v1", Archive: true} - args := []string{"lp1"} - s.MockAdminClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(&admin.LaunchPlanUpdateResponse{}, nil) - assert.Nil(t, updateLPFunc(s.Ctx, args, s.CmdCtx)) + launchplan.UConfig = &launchplan.UpdateConfig{} + + launchplan.UConfig.Version = testutils.RandomName(2) + err := updateLPFunc(s.Ctx, nil, s.CmdCtx) + + assert.ErrorContains(t, err, "launch plan name wasn't passed") + + // cleanup + launchplan.UConfig = &launchplan.UpdateConfig{} } -func TestLPUpdateFail(t *testing.T) { +func TestLaunchPlanUpdateRequiresLaunchPlanVersion(t *testing.T) { s := testutils.Setup() - launchplan.UConfig = &launchplan.UpdateConfig{Version: "v1", Archive: true} - args := []string{"task1"} - s.MockAdminClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, updateLPFunc(s.Ctx, args, s.CmdCtx)) + launchplan.UConfig = &launchplan.UpdateConfig{} + + name := testutils.RandomName(12) + err := updateLPFunc(s.Ctx, []string{name}, s.CmdCtx) + + assert.ErrorContains(t, err, "launch plan version wasn't passed") + + // cleanup + launchplan.UConfig = &launchplan.UpdateConfig{} } -func TestLPUpdateInvalidArgs(t *testing.T) { +func testLaunchPlanUpdate( + setup func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan), + asserter func(s *testutils.TestStruct, err error), +) { + testLaunchPlanUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, launchplan *admin.LaunchPlan) { + s.MockAdminClient. + OnGetLaunchPlanMatch( + s.Ctx, + mock.MatchedBy(func(r *admin.ObjectGetRequest) bool { + return cmp.Equal(r.Id, launchplan.Id) + })). + Return(launchplan, nil) + s.MockAdminClient. + OnUpdateLaunchPlanMatch(s.Ctx, mock.Anything). + Return(&admin.LaunchPlanUpdateResponse{}, nil) + }, + setup, + asserter, + ) +} + +func testLaunchPlanUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, launchplan *admin.LaunchPlan), + setup func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan), + asserter func(s *testutils.TestStruct, err error), +) { s := testutils.Setup() - launchplan.UConfig = &launchplan.UpdateConfig{Version: "v1", Archive: true, Activate: true} - args := []string{} - assert.NotNil(t, updateLPFunc(s.Ctx, args, s.CmdCtx)) + target := newTestLaunchPlan() + + if mockSetup != nil { + mockSetup(&s, target) + } + + launchplan.UConfig = &launchplan.UpdateConfig{} + if setup != nil { + setup(&s, launchplan.UConfig, target) + } + + args := []string{target.Id.Name} + launchplan.UConfig.Version = target.Id.Version + err := updateLPFunc(s.Ctx, args, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + launchplan.UConfig = &launchplan.UpdateConfig{} +} + +func newTestLaunchPlan() *admin.LaunchPlan { + return &admin.LaunchPlan{ + Id: &core.Identifier{ + Name: testutils.RandomName(12), + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + ResourceType: core.ResourceType_LAUNCH_PLAN, + Version: testutils.RandomName(2), + }, + Closure: &admin.LaunchPlanClosure{ + State: admin.LaunchPlanState_ACTIVE, + }, + } } diff --git a/flytectl/cmd/update/matchable_attribute_util.go b/flytectl/cmd/update/matchable_attribute_util.go index 23efa16912..c978d9dd97 100644 --- a/flytectl/cmd/update/matchable_attribute_util.go +++ b/flytectl/cmd/update/matchable_attribute_util.go @@ -3,45 +3,170 @@ package update import ( "context" "fmt" + "os" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) -func DecorateAndUpdateMatchableAttr(ctx context.Context, project, domain, workflowName string, - updater ext.AdminUpdaterExtInterface, mcDecorator sconfig.MatchableAttributeDecorator, dryRun bool) error { - matchingAttr := mcDecorator.Decorate() - if len(workflowName) > 0 { - // Update the workflow attribute using the admin. - if dryRun { - fmt.Printf("skipping UpdateWorkflowAttributes request (dryRun)\n") - } else { - err := updater.UpdateWorkflowAttributes(ctx, project, domain, workflowName, matchingAttr) - if err != nil { - return err - } - } - fmt.Printf("Updated attributes from %v project and domain %v and workflow %v\n", project, domain, workflowName) - } else { - // Update the project domain attribute using the admin. - if dryRun { - fmt.Printf("skipping UpdateProjectDomainAttributes request (dryRun)\n") - } else { - if len(domain) == 0 { - err := updater.UpdateProjectAttributes(ctx, project, matchingAttr) - if err != nil { - return err - } - fmt.Printf("Updated attributes from %v project\n", project) - } else { - err := updater.UpdateProjectDomainAttributes(ctx, project, domain, matchingAttr) - if err != nil { - return err - } - fmt.Printf("Updated attributes from %v project and domain %v\n", project, domain) - } - } +func DecorateAndUpdateMatchableAttr( + ctx context.Context, + cmdCtx cmdCore.CommandContext, + project, domain, workflow string, + resourceType admin.MatchableResource, + attributeDecorator sconfig.MatchableAttributeDecorator, + dryRun bool, + force bool, +) error { + if project == "" { + return fmt.Errorf("project is required") + } + if domain == "" && workflow != "" { + return fmt.Errorf("domain is required") + } + + switch { + case workflow != "": + return updateWorkflowMatchableAttributes(ctx, cmdCtx, project, domain, workflow, resourceType, attributeDecorator, dryRun, force) + case domain != "": + return updateProjectDomainMatchableAttributes(ctx, cmdCtx, project, domain, resourceType, attributeDecorator, dryRun, force) + default: + return updateProjectMatchableAttributes(ctx, cmdCtx, project, resourceType, attributeDecorator, dryRun, force) + } +} + +func updateProjectMatchableAttributes( + ctx context.Context, + cmdCtx cmdCore.CommandContext, + project string, + resourceType admin.MatchableResource, + attributeDecorator sconfig.MatchableAttributeDecorator, + dryRun bool, + force bool, +) error { + if project == "" { + panic("project is empty") + } + + response, err := cmdCtx.AdminFetcherExt().FetchProjectAttributes(ctx, project, resourceType) + if err != nil && !ext.IsNotFoundError(err) { + return fmt.Errorf("update project %s matchable attributes: could not fetch attributes: %w", project, err) + } + + oldMatchingAttributes := response.GetAttributes().GetMatchingAttributes() + newMatchingAttributes := attributeDecorator.Decorate() + + if confirmed, err := confirmMatchableAttributeUpdate(oldMatchingAttributes, newMatchingAttributes, dryRun, force); err != nil || !confirmed { + return err + } + + if err := cmdCtx.AdminUpdaterExt().UpdateProjectAttributes(ctx, project, newMatchingAttributes); err != nil { + return fmt.Errorf("update project %s matchable attributes: update failed: %w", project, err) + } + + fmt.Printf("Updated attributes from %s project\n", project) + return nil +} + +func updateProjectDomainMatchableAttributes( + ctx context.Context, + cmdCtx cmdCore.CommandContext, + project, domain string, + resourceType admin.MatchableResource, + attributeDecorator sconfig.MatchableAttributeDecorator, + dryRun bool, + force bool, +) error { + if project == "" { + panic("project is empty") + } + if domain == "" { + panic("domain is empty") + } + response, err := cmdCtx.AdminFetcherExt().FetchProjectDomainAttributes(ctx, project, domain, resourceType) + if err != nil && !ext.IsNotFoundError(err) { + return fmt.Errorf("update project %s domain %s matchable attributes: could not fetch attributes: %w", project, domain, err) } + + oldMatchingAttributes := response.GetAttributes().GetMatchingAttributes() + newMatchingAttributes := attributeDecorator.Decorate() + + if confirmed, err := confirmMatchableAttributeUpdate(oldMatchingAttributes, newMatchingAttributes, dryRun, force); err != nil || !confirmed { + return err + } + + if err := cmdCtx.AdminUpdaterExt().UpdateProjectDomainAttributes(ctx, project, domain, newMatchingAttributes); err != nil { + return fmt.Errorf("update project %s domain %s matchable attributes: update failed: %w", project, domain, err) + } + + fmt.Printf("Updated attributes from %s project and domain %s\n", project, domain) return nil } + +func updateWorkflowMatchableAttributes( + ctx context.Context, + cmdCtx cmdCore.CommandContext, + project, domain, workflow string, + resourceType admin.MatchableResource, + attributeDecorator sconfig.MatchableAttributeDecorator, + dryRun bool, + force bool, +) error { + if project == "" { + panic("project is empty") + } + if domain == "" { + panic("domain is empty") + } + if workflow == "" { + panic("workflow is empty") + } + + response, err := cmdCtx.AdminFetcherExt().FetchWorkflowAttributes(ctx, project, domain, workflow, resourceType) + if err != nil && !ext.IsNotFoundError(err) { + return fmt.Errorf("update project %s domain %s workflow %s matchable attributes: could not fetch attributes: %w", project, domain, workflow, err) + } + + oldMatchingAttributes := response.GetAttributes().GetMatchingAttributes() + newMatchingAttributes := attributeDecorator.Decorate() + + if confirmed, err := confirmMatchableAttributeUpdate(oldMatchingAttributes, newMatchingAttributes, dryRun, force); err != nil || !confirmed { + return err + } + + if err := cmdCtx.AdminUpdaterExt().UpdateWorkflowAttributes(ctx, project, domain, workflow, newMatchingAttributes); err != nil { + return fmt.Errorf("update project %s domain %s workflow %s matchable attributes: update failed: %w", project, domain, workflow, err) + } + + fmt.Printf("Updated attributes from %s project and domain %s and workflow %s\n", project, domain, workflow) + return nil +} + +func confirmMatchableAttributeUpdate(old, new *admin.MatchingAttributes, dryRun, force bool) (bool, error) { + patch, err := DiffAsYaml(diffPathBefore, diffPathAfter, old.GetTarget(), new.GetTarget()) + if err != nil { + return false, fmt.Errorf("update matchable attributes: %w", err) + } + + if patch == "" { + fmt.Printf("No changes detected. Skipping the update.\n") + return false, nil + } + + fmt.Printf("The following changes are to be applied.\n%s\n", patch) + + if dryRun { + fmt.Printf("Skipping update request (dryRun)\n") + return false, nil + } + + if !force && !cmdUtil.AskForConfirmation("Continue?", os.Stdin) { + return false, fmt.Errorf("update aborted by user") + } + + return true, nil +} diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute.go b/flytectl/cmd/update/matchable_cluster_resource_attribute.go index 79c03480ba..d18896cac5 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute.go @@ -7,6 +7,7 @@ import ( sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( @@ -71,9 +72,9 @@ func updateClusterResourceAttributesFunc(ctx context.Context, args []string, cmd domain := clustrResourceAttrFileConfig.Domain workflowName := clustrResourceAttrFileConfig.Workflow - // Updates the admin matchable attribute from taskResourceAttrFileConfig - if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - clustrResourceAttrFileConfig, updateConfig.DryRun); err != nil { + if err := DecorateAndUpdateMatchableAttr(ctx, cmdCtx, project, domain, workflowName, + admin.MatchableResource_CLUSTER_RESOURCE, clustrResourceAttrFileConfig, + updateConfig.DryRun, updateConfig.Force); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go index 8b6f8b2faf..f355a53656 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go @@ -8,83 +8,564 @@ import ( "github.com/stretchr/testify/mock" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) -func updateClusterResourceAttributeSetup() { - clusterresourceattribute.DefaultUpdateConfig = &clusterresourceattribute.AttrUpdateConfig{} +const ( + validWorkflowClusterResourceAttributesFilePath = "testdata/valid_workflow_cluster_attribute.yaml" + validProjectDomainClusterResourceAttributesFilePath = "testdata/valid_project_domain_cluster_attribute.yaml" + validProjectClusterResourceAttributesFilePath = "testdata/valid_project_cluster_attribute.yaml" +) + +func TestClusterResourceAttributeUpdateRequiresAttributeFile(t *testing.T) { + testWorkflowClusterResourceAttributeUpdate( + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "attrFile is mandatory") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestClusterResourceAttributeUpdateFailsWhenAttributeFileDoesNotExist(t *testing.T) { + testWorkflowClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataNonExistentFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "unable to read from testdata/non-existent-file yaml file") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestClusterResourceAttributeUpdateFailsWhenAttributeFileIsMalformed(t *testing.T) { + testWorkflowClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataInvalidAttrFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\"") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestClusterResourceAttributeUpdateHappyPath(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowClusterResourceAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainClusterResourceAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectClusterResourceAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestClusterResourceAttributeUpdateFailsWithoutForceFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowClusterResourceAttributesFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainClusterResourceAttributesFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectClusterResourceAttributesFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestClusterResourceAttributeUpdateDoesNothingWithDryRunFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowClusterResourceAttributesFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainClusterResourceAttributesFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectClusterResourceAttributesFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) } -func TestUpdateClusterResourceAttributes(t *testing.T) { - t.Run("no input file for update", func(t *testing.T) { - s := setup() - updateClusterResourceAttributeSetup() - err := updateClusterResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for cluster resource attribute"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successfully updated project domain attribute", func(t *testing.T) { - s := setup() - updateClusterResourceAttributeSetup() - clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_cluster_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil) - err := updateClusterResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) - }) - t.Run("failed to update project domain attribute", func(t *testing.T) { - s := setup() - updateClusterResourceAttributeSetup() - clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_cluster_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updateClusterResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successfully updated workflow attribute", func(t *testing.T) { - s := setup() - updateClusterResourceAttributeSetup() - clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_cluster_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(nil) - err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) - }) - t.Run("failed to update workflow attribute", func(t *testing.T) { - s := setup() - updateClusterResourceAttributeSetup() - clusterresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_cluster_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("non existent file", func(t *testing.T) { - s := setup() - updateClusterResourceAttributeSetup() - clusterresourceattribute.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("invalid update file", func(t *testing.T) { - s := setup() - updateClusterResourceAttributeSetup() - clusterresourceattribute.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - s.TearDownAndVerify(t, ``) +func TestClusterResourceAttributeUpdateIgnoresForceFlagWithDryRun(t *testing.T) { + t.Run("workflow without --force", func(t *testing.T) { + testWorkflowClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowClusterResourceAttributesFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("workflow with --force", func(t *testing.T) { + testWorkflowClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowClusterResourceAttributesFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain without --force", func(t *testing.T) { + testProjectDomainClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainClusterResourceAttributesFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) }) + + t.Run("domain with --force", func(t *testing.T) { + testProjectDomainClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainClusterResourceAttributesFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project without --force", func(t *testing.T) { + testProjectClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectClusterResourceAttributesFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project with --force", func(t *testing.T) { + testProjectClusterResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectClusterResourceAttributesFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestClusterResourceAttributeUpdateSucceedsWhenAttributesDoNotExist(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowClusterResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_CLUSTER_RESOURCE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowClusterResourceAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainClusterResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_CLUSTER_RESOURCE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainClusterResourceAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectClusterResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_CLUSTER_RESOURCE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectClusterResourceAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestClusterResourceAttributeUpdateFailsWhenAdminClientFails(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowClusterResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_CLUSTER_RESOURCE). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowClusterResourceAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainClusterResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_CLUSTER_RESOURCE). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainClusterResourceAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectClusterResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_CLUSTER_RESOURCE). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectClusterResourceAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func testWorkflowClusterResourceAttributeUpdate( + setup func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testWorkflowClusterResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_CLUSTER_RESOURCE). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testWorkflowClusterResourceAttributeUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.WorkflowAttributes), + setup func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + clusterresourceattribute.DefaultUpdateConfig = &clusterresourceattribute.AttrUpdateConfig{} + target := newTestWorkflowClusterResourceAttribute() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, clusterresourceattribute.DefaultUpdateConfig, target) + } + + err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + clusterresourceattribute.DefaultUpdateConfig = &clusterresourceattribute.AttrUpdateConfig{} +} + +func newTestWorkflowClusterResourceAttribute() *admin.WorkflowAttributes { + return &admin.WorkflowAttributes{ + // project, domain, and workflow names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + Workflow: "core.control_flow.merge_sort.merge_sort", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ClusterResourceAttributes{ + ClusterResourceAttributes: &admin.ClusterResourceAttributes{ + Attributes: map[string]string{ + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + }, + }, + }, + }, + } +} + +func testProjectClusterResourceAttributeUpdate( + setup func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectClusterResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_CLUSTER_RESOURCE). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectClusterResourceAttributeUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectAttributes), + setup func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + clusterresourceattribute.DefaultUpdateConfig = &clusterresourceattribute.AttrUpdateConfig{} + target := newTestProjectClusterResourceAttribute() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, clusterresourceattribute.DefaultUpdateConfig, target) + } + + err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + clusterresourceattribute.DefaultUpdateConfig = &clusterresourceattribute.AttrUpdateConfig{} +} + +func newTestProjectClusterResourceAttribute() *admin.ProjectAttributes { + return &admin.ProjectAttributes{ + // project name needs to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ClusterResourceAttributes{ + ClusterResourceAttributes: &admin.ClusterResourceAttributes{ + Attributes: map[string]string{ + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + }, + }, + }, + }, + } +} + +func testProjectDomainClusterResourceAttributeUpdate( + setup func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectDomainClusterResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_CLUSTER_RESOURCE). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectDomainClusterResourceAttributeUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes), + setup func(s *testutils.TestStruct, config *clusterresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + clusterresourceattribute.DefaultUpdateConfig = &clusterresourceattribute.AttrUpdateConfig{} + target := newTestProjectDomainClusterResourceAttribute() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, clusterresourceattribute.DefaultUpdateConfig, target) + } + + err := updateClusterResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + clusterresourceattribute.DefaultUpdateConfig = &clusterresourceattribute.AttrUpdateConfig{} +} + +func newTestProjectDomainClusterResourceAttribute() *admin.ProjectDomainAttributes { + return &admin.ProjectDomainAttributes{ + // project and domain names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ClusterResourceAttributes{ + ClusterResourceAttributes: &admin.ClusterResourceAttributes{ + Attributes: map[string]string{ + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + }, + }, + }, + }, + } } diff --git a/flytectl/cmd/update/matchable_execution_cluster_label.go b/flytectl/cmd/update/matchable_execution_cluster_label.go index e3c41e1015..dee80cb459 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label.go @@ -7,6 +7,7 @@ import ( sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( @@ -64,9 +65,9 @@ func updateExecutionClusterLabelFunc(ctx context.Context, args []string, cmdCtx domain := executionClusterLabelFileConfig.Domain workflowName := executionClusterLabelFileConfig.Workflow - // Updates the admin matchable attribute from executionClusterLabelFileConfig - if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - executionClusterLabelFileConfig, updateConfig.DryRun); err != nil { + if err := DecorateAndUpdateMatchableAttr(ctx, cmdCtx, project, domain, workflowName, + admin.MatchableResource_EXECUTION_CLUSTER_LABEL, executionClusterLabelFileConfig, + updateConfig.DryRun, updateConfig.Force); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_execution_cluster_label_test.go b/flytectl/cmd/update/matchable_execution_cluster_label_test.go index fffbd0f250..3b234c4a22 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label_test.go @@ -8,83 +8,552 @@ import ( "github.com/stretchr/testify/mock" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) -func updateExecutionClusterLabelSetup() { - executionclusterlabel.DefaultUpdateConfig = &executionclusterlabel.AttrUpdateConfig{} +const ( + validProjectExecutionClusterLabelFilePath = "testdata/valid_project_execution_cluster_label.yaml" + validProjectDomainExecutionClusterLabelFilePath = "testdata/valid_project_domain_execution_cluster_label.yaml" + validWorkflowExecutionClusterLabelFilePath = "testdata/valid_workflow_execution_cluster_label.yaml" +) + +func TestExecutionClusterLabelUpdateRequiresAttributeFile(t *testing.T) { + testWorkflowExecutionClusterLabelUpdate( + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "attrFile is mandatory") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestExecutionClusterLabelUpdateFailsWhenAttributeFileDoesNotExist(t *testing.T) { + testWorkflowExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataNonExistentFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "unable to read from testdata/non-existent-file yaml file") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestExecutionClusterLabelUpdateFailsWhenAttributeFileIsMalformed(t *testing.T) { + testWorkflowExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataInvalidAttrFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\"") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestExecutionClusterLabelUpdateHappyPath(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionClusterLabelFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionClusterLabelFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionClusterLabelFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestExecutionClusterLabelUpdateFailsWithoutForceFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionClusterLabelFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionClusterLabelFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionClusterLabelFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestExecutionClusterLabelUpdateDoesNothingWithDryRunFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionClusterLabelFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionClusterLabelFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionClusterLabelFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) } -func TestExecutionClusterLabel(t *testing.T) { - t.Run("no input file for update", func(t *testing.T) { - s := setup() - updateExecutionClusterLabelSetup() - err := updateExecutionClusterLabelFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for execution cluster label"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successful update project domain attribute", func(t *testing.T) { - s := setup() - updateExecutionClusterLabelSetup() - executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_cluster_label.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil) - err := updateExecutionClusterLabelFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) - }) - t.Run("failed update project domain attribute", func(t *testing.T) { - s := setup() - updateExecutionClusterLabelSetup() - executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_cluster_label.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updateExecutionClusterLabelFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successful update workflow attribute", func(t *testing.T) { - s := setup() - updateExecutionClusterLabelSetup() - executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_cluster_label.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(nil) - err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) - }) - t.Run("failed update workflow attribute", func(t *testing.T) { - s := setup() - updateExecutionClusterLabelSetup() - executionclusterlabel.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_cluster_label.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("non existent file", func(t *testing.T) { - s := setup() - updateExecutionClusterLabelSetup() - executionclusterlabel.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("invalid update file", func(t *testing.T) { - s := setup() - updateExecutionClusterLabelSetup() - executionclusterlabel.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - s.TearDownAndVerify(t, ``) +func TestExecutionClusterLabelUpdateIgnoresForceFlagWithDryRun(t *testing.T) { + t.Run("workflow without --force", func(t *testing.T) { + testWorkflowExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionClusterLabelFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("workflow with --force", func(t *testing.T) { + testWorkflowExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionClusterLabelFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain without --force", func(t *testing.T) { + testProjectDomainExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionClusterLabelFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) }) + + t.Run("domain with --force", func(t *testing.T) { + testProjectDomainExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionClusterLabelFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project without --force", func(t *testing.T) { + testProjectExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionClusterLabelFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project with --force", func(t *testing.T) { + testProjectExecutionClusterLabelUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionClusterLabelFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestExecutionClusterLabelUpdateSucceedsWhenAttributesDoNotExist(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionClusterLabelUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_EXECUTION_CLUSTER_LABEL). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionClusterLabelFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainExecutionClusterLabelUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionClusterLabelFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectExecutionClusterLabelUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_EXECUTION_CLUSTER_LABEL). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionClusterLabelFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestExecutionClusterLabelUpdateFailsWhenAdminClientFails(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionClusterLabelUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_EXECUTION_CLUSTER_LABEL). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionClusterLabelFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainExecutionClusterLabelUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionClusterLabelFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectExecutionClusterLabelUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_EXECUTION_CLUSTER_LABEL). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionClusterLabelFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func testWorkflowExecutionClusterLabelUpdate( + setup func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testWorkflowExecutionClusterLabelUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_EXECUTION_CLUSTER_LABEL). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testWorkflowExecutionClusterLabelUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.WorkflowAttributes), + setup func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + executionclusterlabel.DefaultUpdateConfig = &executionclusterlabel.AttrUpdateConfig{} + target := newTestWorkflowExecutionClusterLabel() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, executionclusterlabel.DefaultUpdateConfig, target) + } + + err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + executionclusterlabel.DefaultUpdateConfig = &executionclusterlabel.AttrUpdateConfig{} +} + +func newTestWorkflowExecutionClusterLabel() *admin.WorkflowAttributes { + return &admin.WorkflowAttributes{ + // project, domain, and workflow names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + Workflow: "core.control_flow.merge_sort.merge_sort", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionClusterLabel{ + ExecutionClusterLabel: &admin.ExecutionClusterLabel{ + Value: testutils.RandomName(12), + }, + }, + }, + } +} + +func testProjectExecutionClusterLabelUpdate( + setup func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectExecutionClusterLabelUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_EXECUTION_CLUSTER_LABEL). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectExecutionClusterLabelUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectAttributes), + setup func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + executionclusterlabel.DefaultUpdateConfig = &executionclusterlabel.AttrUpdateConfig{} + target := newTestProjectExecutionClusterLabel() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, executionclusterlabel.DefaultUpdateConfig, target) + } + + err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + executionclusterlabel.DefaultUpdateConfig = &executionclusterlabel.AttrUpdateConfig{} +} + +func newTestProjectExecutionClusterLabel() *admin.ProjectAttributes { + return &admin.ProjectAttributes{ + // project name needs to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionClusterLabel{ + ExecutionClusterLabel: &admin.ExecutionClusterLabel{ + Value: testutils.RandomName(12), + }, + }, + }, + } +} + +func testProjectDomainExecutionClusterLabelUpdate( + setup func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectDomainExecutionClusterLabelUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_EXECUTION_CLUSTER_LABEL). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectDomainExecutionClusterLabelUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes), + setup func(s *testutils.TestStruct, config *executionclusterlabel.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + executionclusterlabel.DefaultUpdateConfig = &executionclusterlabel.AttrUpdateConfig{} + target := newTestProjectDomainExecutionClusterLabel() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, executionclusterlabel.DefaultUpdateConfig, target) + } + + err := updateExecutionClusterLabelFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + executionclusterlabel.DefaultUpdateConfig = &executionclusterlabel.AttrUpdateConfig{} +} + +func newTestProjectDomainExecutionClusterLabel() *admin.ProjectDomainAttributes { + return &admin.ProjectDomainAttributes{ + // project and domain names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionClusterLabel{ + ExecutionClusterLabel: &admin.ExecutionClusterLabel{ + Value: testutils.RandomName(12), + }, + }, + }, + } } diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute.go b/flytectl/cmd/update/matchable_execution_queue_attribute.go index feb8d5224b..966972e771 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute.go @@ -7,6 +7,7 @@ import ( sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( @@ -75,9 +76,9 @@ func updateExecutionQueueAttributesFunc(ctx context.Context, args []string, cmdC domain := executionQueueAttrFileConfig.Domain workflowName := executionQueueAttrFileConfig.Workflow - // Updates the admin matchable attribute from executionQueueAttrFileConfig - if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - executionQueueAttrFileConfig, updateConfig.DryRun); err != nil { + if err := DecorateAndUpdateMatchableAttr(ctx, cmdCtx, project, domain, workflowName, + admin.MatchableResource_EXECUTION_QUEUE, executionQueueAttrFileConfig, + updateConfig.DryRun, updateConfig.Force); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go index cffad3da3d..8a14997660 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go @@ -8,83 +8,564 @@ import ( "github.com/stretchr/testify/mock" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) -func updateExecutionQueueAttributeSetup() { - executionqueueattribute.DefaultUpdateConfig = &executionqueueattribute.AttrUpdateConfig{} +const ( + validWorkflowExecutionQueueMatchableAttributesFilePath = "testdata/valid_workflow_execution_queue_attribute.yaml" + validProjectDomainExecutionQueueMatchableAttributeFilePath = "testdata/valid_project_domain_execution_queue_attribute.yaml" + validProjectExecutionQueueMatchableAttributeFilePath = "testdata/valid_project_execution_queue_attribute.yaml" +) + +func TestExecutionQueueAttributeUpdateRequiresAttributeFile(t *testing.T) { + testWorkflowExecutionQueueAttributeUpdate( + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "attrFile is mandatory") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestExecutionQueueAttributeUpdateFailsWhenAttributeFileDoesNotExist(t *testing.T) { + testWorkflowExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataNonExistentFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "unable to read from testdata/non-existent-file yaml file") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestExecutionQueueAttributeUpdateFailsWhenAttributeFileIsMalformed(t *testing.T) { + testWorkflowExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataInvalidAttrFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\"") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestExecutionQueueAttributeUpdateHappyPath(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionQueueMatchableAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionQueueMatchableAttributeFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionQueueMatchableAttributeFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestExecutionQueueAttributeUpdateFailsWithoutForceFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionQueueMatchableAttributesFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionQueueMatchableAttributeFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionQueueMatchableAttributeFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestExecutionQueueAttributeUpdateDoesNothingWithDryRunFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionQueueMatchableAttributesFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionQueueMatchableAttributeFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionQueueMatchableAttributeFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) } -func TestExecutionQueueAttributes(t *testing.T) { - t.Run("no input file for update", func(t *testing.T) { - s := setup() - updateExecutionQueueAttributeSetup() - err := updateExecutionQueueAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for execution queue attribute"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successful update project domain attribute", func(t *testing.T) { - s := setup() - updateExecutionQueueAttributeSetup() - executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_queue_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil) - err := updateExecutionQueueAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) - }) - t.Run("failed update project domain attribute", func(t *testing.T) { - s := setup() - updateExecutionQueueAttributeSetup() - executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_execution_queue_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updateExecutionQueueAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successful update workflow attribute", func(t *testing.T) { - s := setup() - updateExecutionQueueAttributeSetup() - executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_queue_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(nil) - err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) - }) - t.Run("failed update workflow attribute", func(t *testing.T) { - s := setup() - updateExecutionQueueAttributeSetup() - executionqueueattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_execution_queue_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("non existent file", func(t *testing.T) { - s := setup() - updateExecutionQueueAttributeSetup() - executionqueueattribute.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("invalid update file", func(t *testing.T) { - s := setup() - updateExecutionQueueAttributeSetup() - executionqueueattribute.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - s.TearDownAndVerify(t, ``) +func TestExecutionQueueAttributeUpdateIgnoresForceFlagWithDryRun(t *testing.T) { + t.Run("workflow without --force", func(t *testing.T) { + testWorkflowExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionQueueMatchableAttributesFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("workflow with --force", func(t *testing.T) { + testWorkflowExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionQueueMatchableAttributesFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain without --force", func(t *testing.T) { + testProjectDomainExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionQueueMatchableAttributeFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) }) + + t.Run("domain with --force", func(t *testing.T) { + testProjectDomainExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionQueueMatchableAttributeFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project without --force", func(t *testing.T) { + testProjectExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionQueueMatchableAttributeFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project with --force", func(t *testing.T) { + testProjectExecutionQueueAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionQueueMatchableAttributeFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestExecutionQueueAttributeUpdateSucceedsWhenAttributesDoNotExist(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionQueueAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_EXECUTION_QUEUE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionQueueMatchableAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainExecutionQueueAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_EXECUTION_QUEUE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionQueueMatchableAttributeFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectExecutionQueueAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_EXECUTION_QUEUE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionQueueMatchableAttributeFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestExecutionQueueAttributeUpdateFailsWhenAdminClientFails(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionQueueAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_EXECUTION_QUEUE). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionQueueMatchableAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainExecutionQueueAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_EXECUTION_QUEUE). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainExecutionQueueMatchableAttributeFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectExecutionQueueAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_EXECUTION_QUEUE). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectExecutionQueueMatchableAttributeFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func testWorkflowExecutionQueueAttributeUpdate( + setup func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testWorkflowExecutionQueueAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_EXECUTION_QUEUE). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testWorkflowExecutionQueueAttributeUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.WorkflowAttributes), + setup func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + executionqueueattribute.DefaultUpdateConfig = &executionqueueattribute.AttrUpdateConfig{} + target := newTestWorkflowExecutionQueueAttribute() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, executionqueueattribute.DefaultUpdateConfig, target) + } + + err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + executionqueueattribute.DefaultUpdateConfig = &executionqueueattribute.AttrUpdateConfig{} +} + +func newTestWorkflowExecutionQueueAttribute() *admin.WorkflowAttributes { + return &admin.WorkflowAttributes{ + // project, domain, and workflow names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + Workflow: "core.control_flow.merge_sort.merge_sort", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionQueueAttributes{ + ExecutionQueueAttributes: &admin.ExecutionQueueAttributes{ + Tags: []string{ + testutils.RandomName(5), + testutils.RandomName(5), + testutils.RandomName(5), + }, + }, + }, + }, + } +} + +func testProjectExecutionQueueAttributeUpdate( + setup func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectExecutionQueueAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_EXECUTION_QUEUE). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectExecutionQueueAttributeUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectAttributes), + setup func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + executionqueueattribute.DefaultUpdateConfig = &executionqueueattribute.AttrUpdateConfig{} + target := newTestProjectExecutionQueueAttribute() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, executionqueueattribute.DefaultUpdateConfig, target) + } + + err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + executionqueueattribute.DefaultUpdateConfig = &executionqueueattribute.AttrUpdateConfig{} +} + +func newTestProjectExecutionQueueAttribute() *admin.ProjectAttributes { + return &admin.ProjectAttributes{ + // project name needs to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionQueueAttributes{ + ExecutionQueueAttributes: &admin.ExecutionQueueAttributes{ + Tags: []string{ + testutils.RandomName(5), + testutils.RandomName(5), + testutils.RandomName(5), + }, + }, + }, + }, + } +} + +func testProjectDomainExecutionQueueAttributeUpdate( + setup func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectDomainExecutionQueueAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_EXECUTION_QUEUE). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectDomainExecutionQueueAttributeUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes), + setup func(s *testutils.TestStruct, config *executionqueueattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + executionqueueattribute.DefaultUpdateConfig = &executionqueueattribute.AttrUpdateConfig{} + target := newTestProjectDomainExecutionQueueAttribute() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, executionqueueattribute.DefaultUpdateConfig, target) + } + + err := updateExecutionQueueAttributesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + executionqueueattribute.DefaultUpdateConfig = &executionqueueattribute.AttrUpdateConfig{} +} + +func newTestProjectDomainExecutionQueueAttribute() *admin.ProjectDomainAttributes { + return &admin.ProjectDomainAttributes{ + // project and domain names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_ExecutionQueueAttributes{ + ExecutionQueueAttributes: &admin.ExecutionQueueAttributes{ + Tags: []string{ + testutils.RandomName(5), + testutils.RandomName(5), + testutils.RandomName(5), + }, + }, + }, + }, + } } diff --git a/flytectl/cmd/update/matchable_plugin_override.go b/flytectl/cmd/update/matchable_plugin_override.go index 981a124b50..4b6d1358f1 100644 --- a/flytectl/cmd/update/matchable_plugin_override.go +++ b/flytectl/cmd/update/matchable_plugin_override.go @@ -7,6 +7,7 @@ import ( sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( @@ -77,9 +78,9 @@ func updatePluginOverridesFunc(ctx context.Context, args []string, cmdCtx cmdCor domain := pluginOverrideFileConfig.Domain workflowName := pluginOverrideFileConfig.Workflow - // Updates the admin matchable attribute from pluginOverrideFileConfig - if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - pluginOverrideFileConfig, updateConfig.DryRun); err != nil { + if err := DecorateAndUpdateMatchableAttr(ctx, cmdCtx, project, domain, workflowName, + admin.MatchableResource_PLUGIN_OVERRIDE, pluginOverrideFileConfig, + updateConfig.DryRun, updateConfig.Force); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_plugin_override_test.go b/flytectl/cmd/update/matchable_plugin_override_test.go index 5165b0091e..7089df984f 100644 --- a/flytectl/cmd/update/matchable_plugin_override_test.go +++ b/flytectl/cmd/update/matchable_plugin_override_test.go @@ -8,83 +8,582 @@ import ( "github.com/stretchr/testify/mock" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) -func updatePluginOverrideSetup() { - pluginoverride.DefaultUpdateConfig = &pluginoverride.AttrUpdateConfig{} +const ( + validProjectPluginOverrideFilePath = "testdata/valid_project_plugin_override.yaml" + validProjectDomainPluginOverrideFilePath = "testdata/valid_project_domain_plugin_override.yaml" + validWorkflowPluginOverrideFilePath = "testdata/valid_workflow_plugin_override.yaml" +) + +func TestPluginOverrideUpdateRequiresAttributeFile(t *testing.T) { + testWorkflowPluginOverrideUpdate( + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "attrFile is mandatory") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestPluginOverrideUpdateFailsWhenAttributeFileDoesNotExist(t *testing.T) { + testWorkflowPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataNonExistentFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "unable to read from testdata/non-existent-file yaml file") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestPluginOverrideUpdateFailsWhenAttributeFileIsMalformed(t *testing.T) { + testWorkflowPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataInvalidAttrFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\"") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestPluginOverrideUpdateHappyPath(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowPluginOverrideFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainPluginOverrideFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectPluginOverrideFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestPluginOverrideUpdateFailsWithoutForceFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowPluginOverrideFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainPluginOverrideFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectPluginOverrideFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestPluginOverrideUpdateDoesNothingWithDryRunFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowPluginOverrideFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainPluginOverrideFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectPluginOverrideFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) } -func TestPluginOverride(t *testing.T) { - t.Run("no input file for update", func(t *testing.T) { - s := setup() - updatePluginOverrideSetup() - err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for plugin override"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successful update project domain attribute", func(t *testing.T) { - s := setup() - updatePluginOverrideSetup() - pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_plugin_override.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil) - err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) - }) - t.Run("failed update project domain attribute", func(t *testing.T) { - s := setup() - updatePluginOverrideSetup() - pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_plugin_override.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successful update workflow attribute", func(t *testing.T) { - s := setup() - updatePluginOverrideSetup() - pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_plugin_override.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(nil) - err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) - }) - t.Run("failed update workflow attribute", func(t *testing.T) { - s := setup() - updatePluginOverrideSetup() - pluginoverride.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_plugin_override.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("non existent file", func(t *testing.T) { - s := setup() - updatePluginOverrideSetup() - pluginoverride.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("invalid update file", func(t *testing.T) { - s := setup() - updatePluginOverrideSetup() - pluginoverride.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err := updatePluginOverridesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - s.TearDownAndVerify(t, ``) +func TestPluginOverrideUpdateIgnoresForceFlagWithDryRun(t *testing.T) { + t.Run("workflow without --force", func(t *testing.T) { + testWorkflowPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowPluginOverrideFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("workflow with --force", func(t *testing.T) { + testWorkflowPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowPluginOverrideFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain without --force", func(t *testing.T) { + testProjectDomainPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainPluginOverrideFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) }) + + t.Run("domain with --force", func(t *testing.T) { + testProjectDomainPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainPluginOverrideFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project without --force", func(t *testing.T) { + testProjectPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectPluginOverrideFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project with --force", func(t *testing.T) { + testProjectPluginOverrideUpdate( + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectPluginOverrideFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestPluginOverrideUpdateSucceedsWhenAttributesDoNotExist(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowPluginOverrideUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_PLUGIN_OVERRIDE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowPluginOverrideFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainPluginOverrideUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_PLUGIN_OVERRIDE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainPluginOverrideFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectPluginOverrideUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_PLUGIN_OVERRIDE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectPluginOverrideFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestPluginOverrideUpdateFailsWhenAdminClientFails(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowPluginOverrideUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_PLUGIN_OVERRIDE). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowPluginOverrideFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainPluginOverrideUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_PLUGIN_OVERRIDE). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainPluginOverrideFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectPluginOverrideUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_PLUGIN_OVERRIDE). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectPluginOverrideFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func testWorkflowPluginOverrideUpdate( + setup func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testWorkflowPluginOverrideUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_PLUGIN_OVERRIDE). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testWorkflowPluginOverrideUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.WorkflowAttributes), + setup func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + pluginoverride.DefaultUpdateConfig = &pluginoverride.AttrUpdateConfig{} + target := newTestWorkflowPluginOverride() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, pluginoverride.DefaultUpdateConfig, target) + } + + err := updatePluginOverridesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + pluginoverride.DefaultUpdateConfig = &pluginoverride.AttrUpdateConfig{} +} + +func newTestWorkflowPluginOverride() *admin.WorkflowAttributes { + return &admin.WorkflowAttributes{ + // project, domain, and workflow names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + Workflow: "core.control_flow.merge_sort.merge_sort", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_PluginOverrides{ + PluginOverrides: &admin.PluginOverrides{ + Overrides: []*admin.PluginOverride{ + { + TaskType: testutils.RandomName(15), + PluginId: []string{ + testutils.RandomName(12), + testutils.RandomName(12), + testutils.RandomName(12), + }, + MissingPluginBehavior: admin.PluginOverride_FAIL, + }, + }, + }, + }, + }, + } +} + +func testProjectPluginOverrideUpdate( + setup func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectPluginOverrideUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_PLUGIN_OVERRIDE). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectPluginOverrideUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectAttributes), + setup func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + pluginoverride.DefaultUpdateConfig = &pluginoverride.AttrUpdateConfig{} + target := newTestProjectPluginOverride() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, pluginoverride.DefaultUpdateConfig, target) + } + + err := updatePluginOverridesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + pluginoverride.DefaultUpdateConfig = &pluginoverride.AttrUpdateConfig{} +} + +func newTestProjectPluginOverride() *admin.ProjectAttributes { + return &admin.ProjectAttributes{ + // project name needs to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_PluginOverrides{ + PluginOverrides: &admin.PluginOverrides{ + Overrides: []*admin.PluginOverride{ + { + TaskType: testutils.RandomName(15), + PluginId: []string{ + testutils.RandomName(12), + testutils.RandomName(12), + testutils.RandomName(12), + }, + MissingPluginBehavior: admin.PluginOverride_FAIL, + }, + }, + }, + }, + }, + } +} + +func testProjectDomainPluginOverrideUpdate( + setup func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectDomainPluginOverrideUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_PLUGIN_OVERRIDE). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectDomainPluginOverrideUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes), + setup func(s *testutils.TestStruct, config *pluginoverride.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + pluginoverride.DefaultUpdateConfig = &pluginoverride.AttrUpdateConfig{} + target := newTestProjectDomainPluginOverride() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, pluginoverride.DefaultUpdateConfig, target) + } + + err := updatePluginOverridesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + pluginoverride.DefaultUpdateConfig = &pluginoverride.AttrUpdateConfig{} +} + +func newTestProjectDomainPluginOverride() *admin.ProjectDomainAttributes { + return &admin.ProjectDomainAttributes{ + // project and domain names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_PluginOverrides{ + PluginOverrides: &admin.PluginOverrides{ + Overrides: []*admin.PluginOverride{ + { + TaskType: testutils.RandomName(15), + PluginId: []string{ + testutils.RandomName(12), + testutils.RandomName(12), + testutils.RandomName(12), + }, + MissingPluginBehavior: admin.PluginOverride_FAIL, + }, + }, + }, + }, + }, + } } diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go index e18825c069..a296a4bd51 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -7,6 +7,7 @@ import ( sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( @@ -77,9 +78,9 @@ func updateTaskResourceAttributesFunc(ctx context.Context, args []string, cmdCtx domain := taskResourceAttrFileConfig.Domain workflowName := taskResourceAttrFileConfig.Workflow - // Updates the admin matchable attribute from taskResourceAttrFileConfig - if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - taskResourceAttrFileConfig, updateConfig.DryRun); err != nil { + if err := DecorateAndUpdateMatchableAttr(ctx, cmdCtx, project, domain, workflowName, + admin.MatchableResource_TASK_RESOURCE, taskResourceAttrFileConfig, + updateConfig.DryRun, updateConfig.Force); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_task_resource_attribute_test.go b/flytectl/cmd/update/matchable_task_resource_attribute_test.go index e9135f1355..fd485f910c 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute_test.go @@ -8,83 +8,561 @@ import ( "github.com/stretchr/testify/mock" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) -func updateTaskResourceAttributeSetup() { - taskresourceattribute.DefaultUpdateConfig = &taskresourceattribute.AttrUpdateConfig{} +const ( + validProjectTaskAttributesFilePath = "testdata/valid_project_task_attribute.yaml" + validProjectDomainTaskAttributesFilePath = "testdata/valid_project_domain_task_attribute.yaml" + validWorkflowTaskAttributesFilePath = "testdata/valid_workflow_task_attribute.yaml" +) + +func TestTaskResourceAttributeUpdateRequiresAttributeFile(t *testing.T) { + testWorkflowTaskResourceAttributeUpdate( + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "attrFile is mandatory") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestTaskResourceAttributeUpdateFailsWhenAttributeFileDoesNotExist(t *testing.T) { + testWorkflowTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataNonExistentFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "unable to read from testdata/non-existent-file yaml file") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestTaskResourceAttributeUpdateFailsWhenAttributeFileIsMalformed(t *testing.T) { + testWorkflowTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataInvalidAttrFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\"") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestTaskResourceAttributeUpdateHappyPath(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowTaskAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainTaskAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectTaskAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestTaskResourceAttributeUpdateFailsWithoutForceFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowTaskAttributesFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainTaskAttributesFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectTaskAttributesFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestTaskResourceAttributeUpdateDoesNothingWithDryRunFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowTaskAttributesFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainTaskAttributesFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectTaskAttributesFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) } -func TestUpdateTaskResourceAttributes(t *testing.T) { - t.Run("no input file for update", func(t *testing.T) { - s := setup() - updateTaskResourceAttributeSetup() - err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for task resource attribute"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successful update project domain attribute", func(t *testing.T) { - s := setup() - updateTaskResourceAttributeSetup() - taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil) - err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) - }) - t.Run("failed update project domain attribute", func(t *testing.T) { - s := setup() - updateTaskResourceAttributeSetup() - taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_task_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successful update workflow attribute", func(t *testing.T) { - s := setup() - updateTaskResourceAttributeSetup() - taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(nil) - err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) - }) - t.Run("failed update workflow attribute", func(t *testing.T) { - s := setup() - updateTaskResourceAttributeSetup() - taskresourceattribute.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_task_attribute.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("non existent file", func(t *testing.T) { - s := setup() - updateTaskResourceAttributeSetup() - taskresourceattribute.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("invalid update file", func(t *testing.T) { - s := setup() - updateTaskResourceAttributeSetup() - taskresourceattribute.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err := updateTaskResourceAttributesFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - s.TearDownAndVerify(t, ``) +func TestTaskResourceAttributeUpdateIgnoresForceFlagWithDryRun(t *testing.T) { + t.Run("workflow without --force", func(t *testing.T) { + testWorkflowTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowTaskAttributesFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("workflow with --force", func(t *testing.T) { + testWorkflowTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowTaskAttributesFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain without --force", func(t *testing.T) { + testProjectDomainTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainTaskAttributesFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) }) + + t.Run("domain with --force", func(t *testing.T) { + testProjectDomainTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainTaskAttributesFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project without --force", func(t *testing.T) { + testProjectTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectTaskAttributesFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project with --force", func(t *testing.T) { + testProjectTaskResourceAttributeUpdate( + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectTaskAttributesFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestTaskResourceAttributeUpdateSucceedsWhenAttributesDoNotExist(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowTaskResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_TASK_RESOURCE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowTaskAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainTaskResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_TASK_RESOURCE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainTaskAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectTaskResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_TASK_RESOURCE). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectTaskAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestTaskResourceAttributeUpdateFailsWhenAdminClientFails(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowTaskResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_TASK_RESOURCE). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowTaskAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainTaskResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_TASK_RESOURCE). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainTaskAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectTaskResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_TASK_RESOURCE). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectTaskAttributesFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func testWorkflowTaskResourceAttributeUpdate( + setup func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testWorkflowTaskResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_TASK_RESOURCE). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testWorkflowTaskResourceAttributeUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.WorkflowAttributes), + setup func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + taskresourceattribute.DefaultUpdateConfig = &taskresourceattribute.AttrUpdateConfig{} + target := newTestWorkflowTaskResourceAttribute() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, taskresourceattribute.DefaultUpdateConfig, target) + } + + err := updateTaskResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + taskresourceattribute.DefaultUpdateConfig = &taskresourceattribute.AttrUpdateConfig{} +} + +func newTestWorkflowTaskResourceAttribute() *admin.WorkflowAttributes { + return &admin.WorkflowAttributes{ + // project, domain, and workflow names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + Workflow: "core.control_flow.merge_sort.merge_sort", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{ + TaskResourceAttributes: &admin.TaskResourceAttributes{ + Defaults: &admin.TaskResourceSpec{ + Cpu: testutils.RandomName(2), + Memory: testutils.RandomName(5), + }, + }, + }, + }, + } +} + +func testProjectTaskResourceAttributeUpdate( + setup func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectTaskResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_TASK_RESOURCE). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectTaskResourceAttributeUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectAttributes), + setup func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + taskresourceattribute.DefaultUpdateConfig = &taskresourceattribute.AttrUpdateConfig{} + target := newTestProjectTaskResourceAttribute() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, taskresourceattribute.DefaultUpdateConfig, target) + } + + err := updateTaskResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + taskresourceattribute.DefaultUpdateConfig = &taskresourceattribute.AttrUpdateConfig{} +} + +func newTestProjectTaskResourceAttribute() *admin.ProjectAttributes { + return &admin.ProjectAttributes{ + // project name needs to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{ + TaskResourceAttributes: &admin.TaskResourceAttributes{ + Defaults: &admin.TaskResourceSpec{ + Cpu: testutils.RandomName(2), + Memory: testutils.RandomName(5), + }, + }, + }, + }, + } +} + +func testProjectDomainTaskResourceAttributeUpdate( + setup func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectDomainTaskResourceAttributeUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_TASK_RESOURCE). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectDomainTaskResourceAttributeUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes), + setup func(s *testutils.TestStruct, config *taskresourceattribute.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + taskresourceattribute.DefaultUpdateConfig = &taskresourceattribute.AttrUpdateConfig{} + target := newTestProjectDomainTaskResourceAttribute() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, taskresourceattribute.DefaultUpdateConfig, target) + } + + err := updateTaskResourceAttributesFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + taskresourceattribute.DefaultUpdateConfig = &taskresourceattribute.AttrUpdateConfig{} +} + +func newTestProjectDomainTaskResourceAttribute() *admin.ProjectDomainAttributes { + return &admin.ProjectDomainAttributes{ + // project and domain names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_TaskResourceAttributes{ + TaskResourceAttributes: &admin.TaskResourceAttributes{ + Defaults: &admin.TaskResourceSpec{ + Cpu: testutils.RandomName(2), + Memory: testutils.RandomName(5), + }, + }, + }, + }, + } } diff --git a/flytectl/cmd/update/matchable_workflow_execution_config.go b/flytectl/cmd/update/matchable_workflow_execution_config.go index b9489d67ff..100ee7e77a 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" cmdCore "github.com/flyteorg/flytectl/cmd/core" @@ -74,9 +75,9 @@ func updateWorkflowExecutionConfigFunc(ctx context.Context, args []string, cmdCt domain := workflowExecutionConfigFileConfig.Domain workflowName := workflowExecutionConfigFileConfig.Workflow - // Updates the admin matchable attribute from workflowExecutionConfigFileConfig - if err := DecorateAndUpdateMatchableAttr(ctx, project, domain, workflowName, cmdCtx.AdminUpdaterExt(), - workflowExecutionConfigFileConfig, updateConfig.DryRun); err != nil { + if err := DecorateAndUpdateMatchableAttr(ctx, cmdCtx, project, domain, workflowName, + admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG, workflowExecutionConfigFileConfig, + updateConfig.DryRun, updateConfig.Force); err != nil { return err } return nil diff --git a/flytectl/cmd/update/matchable_workflow_execution_config_test.go b/flytectl/cmd/update/matchable_workflow_execution_config_test.go index 9f5ef81baf..f81f92a883 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config_test.go @@ -4,87 +4,577 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + + "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) -func updateWorkflowExecutionConfigSetup() { - workflowexecutionconfig.DefaultUpdateConfig = &workflowexecutionconfig.AttrUpdateConfig{} +const ( + validProjectWorkflowExecutionConfigFilePath = "testdata/valid_project_workflow_execution_config.yaml" + validProjectDomainWorkflowExecutionConfigFilePath = "testdata/valid_project_domain_workflow_execution_config.yaml" + validWorkflowExecutionConfigFilePath = "testdata/valid_workflow_workflow_execution_config.yaml" +) + +func TestWorkflowExecutionConfigUpdateRequiresAttributeFile(t *testing.T) { + testWorkflowExecutionConfigUpdate( + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "attrFile is mandatory") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestWorkflowExecutionConfigUpdateFailsWhenAttributeFileDoesNotExist(t *testing.T) { + testWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataNonExistentFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "unable to read from testdata/non-existent-file yaml file") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestWorkflowExecutionConfigUpdateFailsWhenAttributeFileIsMalformed(t *testing.T) { + testWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = testDataInvalidAttrFile + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\"") + s.UpdaterExt.AssertNotCalled(t, "FetchWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) +} + +func TestWorkflowExecutionConfigUpdateHappyPath(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionConfigFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainWorkflowExecutionConfigFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectWorkflowExecutionConfigFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestWorkflowExecutionConfigUpdateFailsWithoutForceFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionConfigFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainWorkflowExecutionConfigFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectWorkflowExecutionConfigFilePath + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestWorkflowExecutionConfigUpdateDoesNothingWithDryRunFlag(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionConfigFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainWorkflowExecutionConfigFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectWorkflowExecutionConfigFilePath + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func TestWorkflowExecutionConfigUpdateIgnoresForceFlagWithDryRun(t *testing.T) { + t.Run("workflow without --force", func(t *testing.T) { + testWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionConfigFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("workflow with --force", func(t *testing.T) { + testWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionConfigFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain without --force", func(t *testing.T) { + testProjectDomainWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainWorkflowExecutionConfigFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain with --force", func(t *testing.T) { + testProjectDomainWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainWorkflowExecutionConfigFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project without --force", func(t *testing.T) { + testProjectWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectWorkflowExecutionConfigFilePath + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project with --force", func(t *testing.T) { + testProjectWorkflowExecutionConfigUpdate( + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectWorkflowExecutionConfigFilePath + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertNotCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) } -func TestWorkflowExecutionConfigs(t *testing.T) { - t.Run("no input file for update", func(t *testing.T) { - s := setup() - updateWorkflowExecutionConfigSetup() - err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("attrFile is mandatory while calling update for workflow execution config"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successful update project domain attribute", func(t *testing.T) { - s := setup() - updateWorkflowExecutionConfigSetup() - workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_workflow_execution_config.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(nil) - err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development`) - }) - t.Run("failed update project domain attribute", func(t *testing.T) { - s := setup() - updateWorkflowExecutionConfigSetup() - workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_project_domain_workflow_execution_config.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateProjectDomainAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("successful update workflow attribute", func(t *testing.T) { - s := setup() - updateWorkflowExecutionConfigSetup() - workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_workflow_execution_config.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(nil) - err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.TearDownAndVerify(t, `Updated attributes from flytesnacks project and domain development and workflow core.control_flow.merge_sort.merge_sort`) - }) - t.Run("failed update workflow attribute", func(t *testing.T) { - s := setup() - updateWorkflowExecutionConfigSetup() - workflowexecutionconfig.DefaultUpdateConfig.AttrFile = "testdata/valid_workflow_workflow_execution_config.yaml" - // No args implying project domain attribute deletion - s.UpdaterExt.OnUpdateWorkflowAttributesMatch(mock.Anything, mock.Anything, mock.Anything, - mock.Anything, mock.Anything).Return(fmt.Errorf("failed to update attributes")) - err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("failed to update attributes"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("non existent file", func(t *testing.T) { - s := setup() - updateWorkflowExecutionConfigSetup() - workflowexecutionconfig.DefaultUpdateConfig.AttrFile = testDataNonExistentFile - err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to read from testdata/non-existent-file yaml file"), err) - s.TearDownAndVerify(t, ``) - }) - t.Run("invalid update file", func(t *testing.T) { - s := setup() - updateWorkflowExecutionConfigSetup() - workflowexecutionconfig.DefaultUpdateConfig.AttrFile = testDataInvalidAttrFile - err := updateWorkflowExecutionConfigFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("error unmarshaling JSON: while decoding JSON: json: unknown field \"InvalidDomain\""), err) - s.TearDownAndVerify(t, ``) +func TestWorkflowExecutionConfigUpdateSucceedsWhenAttributesDoNotExist(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionConfigUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionConfigFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainWorkflowExecutionConfigUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainWorkflowExecutionConfigFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project and domain development`) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectWorkflowExecutionConfigUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG). + Return(nil, ext.NewNotFoundError("attribute")) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectWorkflowExecutionConfigFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + s.TearDownAndVerifyContains(t, `Updated attributes from flytesnacks project`) + }) + }) +} + +func TestWorkflowExecutionConfigUpdateFailsWhenAdminClientFails(t *testing.T) { + t.Run("workflow", func(t *testing.T) { + testWorkflowExecutionConfigUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes) { + config.AttrFile = validWorkflowExecutionConfigFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateWorkflowAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("domain", func(t *testing.T) { + testProjectDomainWorkflowExecutionConfigUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectDomainAttributes) { + config.AttrFile = validProjectDomainWorkflowExecutionConfigFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectDomainAttributes", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + }) + + t.Run("project", func(t *testing.T) { + testProjectWorkflowExecutionConfigUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectAttributes) { + config.AttrFile = validProjectWorkflowExecutionConfigFilePath + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.UpdaterExt.AssertCalled(t, "UpdateProjectAttributes", mock.Anything, mock.Anything, mock.Anything) + }) + }) +} + +func testWorkflowExecutionConfigUpdate( + setup func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testWorkflowExecutionConfigUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.WorkflowAttributes) { + s.FetcherExt. + OnFetchWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG). + Return(&admin.WorkflowAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateWorkflowAttributesMatch(s.Ctx, target.Project, target.Domain, target.Workflow, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testWorkflowExecutionConfigUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.WorkflowAttributes), + setup func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.WorkflowAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + workflowexecutionconfig.DefaultUpdateConfig = &workflowexecutionconfig.AttrUpdateConfig{} + target := newTestWorkflowExecutionConfig() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, workflowexecutionconfig.DefaultUpdateConfig, target) + } + + err := updateWorkflowExecutionConfigFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + workflowexecutionconfig.DefaultUpdateConfig = &workflowexecutionconfig.AttrUpdateConfig{} +} + +func newTestWorkflowExecutionConfig() *admin.WorkflowAttributes { + return &admin.WorkflowAttributes{ + // project, domain, and workflow names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + Workflow: "core.control_flow.merge_sort.merge_sort", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_WorkflowExecutionConfig{ + WorkflowExecutionConfig: &admin.WorkflowExecutionConfig{ + MaxParallelism: 1337, + Annotations: &admin.Annotations{ + Values: map[string]string{ + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + }, + }, + }, + }, + }, + } +} + +func testProjectWorkflowExecutionConfigUpdate( + setup func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectWorkflowExecutionConfigUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectAttributes) { + s.FetcherExt. + OnFetchProjectAttributesMatch(s.Ctx, target.Project, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG). + Return(&admin.ProjectAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectAttributesMatch(s.Ctx, target.Project, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectWorkflowExecutionConfigUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectAttributes), + setup func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + workflowexecutionconfig.DefaultUpdateConfig = &workflowexecutionconfig.AttrUpdateConfig{} + target := newTestProjectWorkflowExecutionConfig() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, workflowexecutionconfig.DefaultUpdateConfig, target) + } + + err := updateWorkflowExecutionConfigFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + workflowexecutionconfig.DefaultUpdateConfig = &workflowexecutionconfig.AttrUpdateConfig{} +} + +func newTestProjectWorkflowExecutionConfig() *admin.ProjectAttributes { + return &admin.ProjectAttributes{ + // project name needs to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_WorkflowExecutionConfig{ + WorkflowExecutionConfig: &admin.WorkflowExecutionConfig{ + MaxParallelism: 1337, + Annotations: &admin.Annotations{ + Values: map[string]string{ + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + }, + }, + }, + }, + }, + } +} + +func testProjectDomainWorkflowExecutionConfigUpdate( + setup func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectDomainWorkflowExecutionConfigUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes) { + s.FetcherExt. + OnFetchProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, admin.MatchableResource_WORKFLOW_EXECUTION_CONFIG). + Return(&admin.ProjectDomainAttributesGetResponse{Attributes: target}, nil) + s.UpdaterExt. + OnUpdateProjectDomainAttributesMatch(s.Ctx, target.Project, target.Domain, mock.Anything). + Return(nil) + }, + setup, + asserter, + ) +} + +func testProjectDomainWorkflowExecutionConfigUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, target *admin.ProjectDomainAttributes), + setup func(s *testutils.TestStruct, config *workflowexecutionconfig.AttrUpdateConfig, target *admin.ProjectDomainAttributes), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + workflowexecutionconfig.DefaultUpdateConfig = &workflowexecutionconfig.AttrUpdateConfig{} + target := newTestProjectDomainWorkflowExecutionConfig() + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, workflowexecutionconfig.DefaultUpdateConfig, target) + } + + err := updateWorkflowExecutionConfigFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + workflowexecutionconfig.DefaultUpdateConfig = &workflowexecutionconfig.AttrUpdateConfig{} +} + +func newTestProjectDomainWorkflowExecutionConfig() *admin.ProjectDomainAttributes { + return &admin.ProjectDomainAttributes{ + // project and domain names need to be same as in the tests spec files in testdata folder + Project: "flytesnacks", + Domain: "development", + MatchingAttributes: &admin.MatchingAttributes{ + Target: &admin.MatchingAttributes_WorkflowExecutionConfig{ + WorkflowExecutionConfig: &admin.WorkflowExecutionConfig{ + MaxParallelism: 1337, + Annotations: &admin.Annotations{ + Values: map[string]string{ + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + testutils.RandomName(5): testutils.RandomName(10), + }, + }, + }, + }, + }, + } } diff --git a/flytectl/cmd/update/named_entity.go b/flytectl/cmd/update/named_entity.go index c7644f4907..3101e29ba2 100644 --- a/flytectl/cmd/update/named_entity.go +++ b/flytectl/cmd/update/named_entity.go @@ -3,12 +3,13 @@ package update import ( "context" "fmt" + "os" "github.com/flyteorg/flytectl/clierrors" cmdCore "github.com/flyteorg/flytectl/cmd/core" + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flytestdlib/logger" ) //go:generate pflags NamedEntityConfig --default-var namedEntityConfig --bind-default-var @@ -22,38 +23,80 @@ type NamedEntityConfig struct { Activate bool `json:"activate" pflag:",activate the named entity."` Description string `json:"description" pflag:",description of the named entity."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` } func (cfg NamedEntityConfig) UpdateNamedEntity(ctx context.Context, name string, project string, domain string, rsType core.ResourceType, cmdCtx cmdCore.CommandContext) error { - archiveProject := cfg.Archive - activateProject := cfg.Activate - if activateProject == archiveProject && activateProject { + if cfg.Activate && cfg.Archive { return fmt.Errorf(clierrors.ErrInvalidStateUpdate) } - var nameEntityState admin.NamedEntityState - if activateProject { - nameEntityState = admin.NamedEntityState_NAMED_ENTITY_ACTIVE - } else if archiveProject { - nameEntityState = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + + id := &admin.NamedEntityIdentifier{ + Project: project, + Domain: domain, + Name: name, + } + + namedEntity, err := cmdCtx.AdminClient().GetNamedEntity(ctx, &admin.NamedEntityGetRequest{ + ResourceType: rsType, + Id: id, + }) + if err != nil { + return fmt.Errorf("update metadata for %s: could not fetch metadata: %w", name, err) + } + + oldMetadata, newMetadata := composeNamedMetadataEdits(cfg, namedEntity.Metadata) + patch, err := DiffAsYaml(diffPathBefore, diffPathAfter, oldMetadata, newMetadata) + if err != nil { + panic(err) } + if patch == "" { + fmt.Printf("No changes detected. Skipping the update.\n") + return nil + } + + fmt.Printf("The following changes are to be applied.\n%s\n", patch) + if cfg.DryRun { - logger.Infof(ctx, "skipping UpdateNamedEntity request (dryRun)") - } else { - _, err := cmdCtx.AdminClient().UpdateNamedEntity(ctx, &admin.NamedEntityUpdateRequest{ - ResourceType: rsType, - Id: &admin.NamedEntityIdentifier{ - Project: project, - Domain: domain, - Name: name, - }, - Metadata: &admin.NamedEntityMetadata{ - Description: cfg.Description, - State: nameEntityState, - }, - }) - if err != nil { - return err - } + fmt.Printf("skipping UpdateNamedEntity request (dryRun)\n") + return nil + } + + if !cfg.Force && !cmdUtil.AskForConfirmation("Continue?", os.Stdin) { + return fmt.Errorf("update aborted by user") } + + _, err = cmdCtx.AdminClient().UpdateNamedEntity(ctx, &admin.NamedEntityUpdateRequest{ + ResourceType: rsType, + Id: id, + Metadata: newMetadata, + }) + if err != nil { + return fmt.Errorf("update metadata for %s: update failed: %w", name, err) + } + return nil } + +func composeNamedMetadataEdits(config NamedEntityConfig, current *admin.NamedEntityMetadata) (old *admin.NamedEntityMetadata, new *admin.NamedEntityMetadata) { + old = &admin.NamedEntityMetadata{} + new = &admin.NamedEntityMetadata{} + + switch { + case config.Activate && config.Archive: + panic("cannot both activate and archive") + case config.Activate: + old.State = current.State + new.State = admin.NamedEntityState_NAMED_ENTITY_ACTIVE + case config.Archive: + old.State = current.State + new.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + } + + if config.Description != "" { + old.Description = current.Description + new.Description = config.Description + } + + return old, new +} diff --git a/flytectl/cmd/update/named_entity_test.go b/flytectl/cmd/update/named_entity_test.go index 4e0086d7c6..732bc9d249 100644 --- a/flytectl/cmd/update/named_entity_test.go +++ b/flytectl/cmd/update/named_entity_test.go @@ -1,39 +1,97 @@ package update import ( + "context" "fmt" - "testing" + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/mock" + + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/stretchr/testify/mock" - - "github.com/stretchr/testify/assert" ) -func TestNamedEntity(t *testing.T) { - s := testutils.Setup() - s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) - namedEntityConfig = &NamedEntityConfig{Archive: false, Activate: true, Description: "named entity description"} - assert.Nil(t, namedEntityConfig.UpdateNamedEntity(s.Ctx, "namedEntity", "project", "domain", - core.ResourceType_WORKFLOW, s.CmdCtx)) - namedEntityConfig = &NamedEntityConfig{Archive: true, Activate: false, Description: "named entity description"} - assert.Nil(t, namedEntityConfig.UpdateNamedEntity(s.Ctx, "namedEntity", "project", "domain", - core.ResourceType_WORKFLOW, s.CmdCtx)) +func testNamedEntityUpdate( + resourceType core.ResourceType, + setup func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity), + asserter func(s *testutils.TestStruct, err error), +) { + testNamedEntityUpdateWithMockSetup( + resourceType, + /* mockSetup */ func(s *testutils.TestStruct, namedEntity *admin.NamedEntity) { + s.MockAdminClient. + OnGetNamedEntityMatch( + s.Ctx, + mock.MatchedBy(func(r *admin.NamedEntityGetRequest) bool { + return r.ResourceType == namedEntity.ResourceType && + cmp.Equal(r.Id, namedEntity.Id) + })). + Return(namedEntity, nil) + s.MockAdminClient. + OnUpdateNamedEntityMatch(s.Ctx, mock.Anything). + Return(&admin.NamedEntityUpdateResponse{}, nil) + }, + setup, + asserter, + ) } -func TestNamedEntityValidationFailure(t *testing.T) { +func testNamedEntityUpdateWithMockSetup( + resourceType core.ResourceType, + mockSetup func(s *testutils.TestStruct, namedEntity *admin.NamedEntity), + setup func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity), + asserter func(s *testutils.TestStruct, err error), +) { s := testutils.Setup() - namedEntityConfig := &NamedEntityConfig{Archive: true, Activate: true, Description: "named entity description"} - assert.NotNil(t, namedEntityConfig.UpdateNamedEntity(s.Ctx, "namedEntity", "project", "domain", - core.ResourceType_WORKFLOW, s.CmdCtx)) + config := &NamedEntityConfig{} + target := newTestNamedEntity(resourceType) + + if mockSetup != nil { + mockSetup(&s, target) + } + + if setup != nil { + setup(&s, config, target) + } + + updateMetadataFactory := getUpdateMetadataFactory(resourceType) + + args := []string{target.Id.Name} + err := updateMetadataFactory(config)(s.Ctx, args, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } } -func TestNamedEntityFailure(t *testing.T) { - s := testutils.Setup() - namedEntityConfig := &NamedEntityConfig{Archive: true, Activate: true, Description: "named entity description"} - s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, namedEntityConfig.UpdateNamedEntity(s.Ctx, "namedEntity", "project", "domain", - core.ResourceType_WORKFLOW, s.CmdCtx)) +func newTestNamedEntity(resourceType core.ResourceType) *admin.NamedEntity { + return &admin.NamedEntity{ + Id: &admin.NamedEntityIdentifier{ + Name: testutils.RandomName(12), + Project: config.GetConfig().Project, + Domain: config.GetConfig().Domain, + }, + ResourceType: resourceType, + Metadata: &admin.NamedEntityMetadata{ + State: admin.NamedEntityState_NAMED_ENTITY_ACTIVE, + Description: testutils.RandomName(50), + }, + } +} + +func getUpdateMetadataFactory(resourceType core.ResourceType) func(namedEntityConfig *NamedEntityConfig) func(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { + switch resourceType { + case core.ResourceType_LAUNCH_PLAN: + return getUpdateLPMetaFunc + case core.ResourceType_TASK: + return getUpdateTaskFunc + case core.ResourceType_WORKFLOW: + return getUpdateWorkflowFunc + } + + panic(fmt.Sprintf("no known mapping exists between resource type %s and "+ + "corresponding update metadata factory function", resourceType)) } diff --git a/flytectl/cmd/update/namedentityconfig_flags.go b/flytectl/cmd/update/namedentityconfig_flags.go index 8d3b7a96b8..2f1345bc98 100755 --- a/flytectl/cmd/update/namedentityconfig_flags.go +++ b/flytectl/cmd/update/namedentityconfig_flags.go @@ -54,5 +54,6 @@ func (cfg NamedEntityConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.BoolVar(&namedEntityConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), namedEntityConfig.Activate, "activate the named entity.") cmdFlags.StringVar(&namedEntityConfig.Description, fmt.Sprintf("%v%v", prefix, "description"), namedEntityConfig.Description, "description of the named entity.") cmdFlags.BoolVar(&namedEntityConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), namedEntityConfig.DryRun, "execute command without making any modifications.") + cmdFlags.BoolVar(&namedEntityConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), namedEntityConfig.Force, "do not ask for an acknowledgement during updates.") return cmdFlags } diff --git a/flytectl/cmd/update/namedentityconfig_flags_test.go b/flytectl/cmd/update/namedentityconfig_flags_test.go index 9c85b8be20..43cf00ec2a 100755 --- a/flytectl/cmd/update/namedentityconfig_flags_test.go +++ b/flytectl/cmd/update/namedentityconfig_flags_test.go @@ -155,4 +155,18 @@ func TestNamedEntityConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_NamedEntityConfig(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index bec3d36b96..881f61fec8 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -3,12 +3,14 @@ package update import ( "context" "fmt" + "os" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytestdlib/logger" + cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( @@ -30,7 +32,7 @@ Incorrect usage when passing both archive and activate: :: - flytectl update project -p flytesnacks --archiveProject --activate + flytectl update project -p flytesnacks --archive --activate Incorrect usage when passing unknown-project: @@ -42,7 +44,7 @@ project ID is required flag :: - flytectl update project unknown-project --archiveProject + flytectl update project unknown-project --archive Update projects.(project/projects can be used interchangeably in these commands) @@ -83,24 +85,70 @@ Usage ) func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - projectSpec, err := project.DefaultProjectConfig.GetProjectSpec(config.GetConfig()) + edits, err := project.DefaultProjectConfig.GetProjectSpec(config.GetConfig()) if err != nil { return err } - if projectSpec.Id == "" { + if edits.Id == "" { return fmt.Errorf(clierrors.ErrProjectNotPassed) } + currentProject, err := cmdCtx.AdminFetcherExt().GetProjectByID(ctx, edits.Id) + if err != nil { + return fmt.Errorf("update project %s: could not fetch project: %w", edits.Id, err) + } + + // We do not compare currentProject against edits directly, because edits does not + // have a complete set of project's fields - it will only contain fields that + // the update command allows updating. (For example, it won't have Domains field + // initialized.) + currentProjectWithEdits := copyProjectWithEdits(currentProject, edits) + patch, err := DiffAsYaml(diffPathBefore, diffPathAfter, currentProject, currentProjectWithEdits) + if err != nil { + panic(err) + } + if patch == "" { + fmt.Printf("No changes detected. Skipping the update.\n") + return nil + } + + fmt.Printf("The following changes are to be applied.\n%s\n", patch) + if project.DefaultProjectConfig.DryRun { - logger.Infof(ctx, "skipping UpdateProject request (dryRun)") - } else { - _, err := cmdCtx.AdminClient().UpdateProject(ctx, projectSpec) - if err != nil { - fmt.Printf(clierrors.ErrFailedProjectUpdate, projectSpec.Id, err) - return err - } + fmt.Printf("skipping UpdateProject request (dryRun)\n") + return nil + } + + if !project.DefaultProjectConfig.Force && !cmdUtil.AskForConfirmation("Continue?", os.Stdin) { + return fmt.Errorf("update aborted by user") } - fmt.Printf("Project %v updated\n", projectSpec.Id) + + _, err = cmdCtx.AdminClient().UpdateProject(ctx, edits) + if err != nil { + return fmt.Errorf(clierrors.ErrFailedProjectUpdate, edits.Id, err) + } + + fmt.Printf("project %s updated\n", edits.Id) return nil } + +// Makes a shallow copy of target and applies certain properties from edited to it. +// The properties applied are only the ones supported by update command: state, name, +// description, labels, etc. +func copyProjectWithEdits(target *admin.Project, edited *admin.Project) *admin.Project { + copy := *target + + copy.State = edited.State + if edited.Name != "" { + copy.Name = edited.Name + } + if edited.Description != "" { + copy.Description = edited.Description + } + if len(edited.GetLabels().GetValues()) != 0 { + copy.Labels = edited.Labels + } + + return © +} diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index 25fb768f47..a3152127d4 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -1,143 +1,258 @@ package update import ( - "errors" "fmt" "testing" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" ) -const projectValue = "dummyProject" +func TestProjectCanBeActivated(t *testing.T) { + testProjectUpdate( + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + project.State = admin.Project_ARCHIVED + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateProject", s.Ctx, + mock.MatchedBy( + func(r *admin.Project) bool { + return r.State == admin.Project_ACTIVE + })) + }) +} -var ( - projectUpdateRequest *admin.Project -) +func TestProjectCanBeArchived(t *testing.T) { + testProjectUpdate( + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + project.State = admin.Project_ACTIVE + config.Archive = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateProject", s.Ctx, + mock.MatchedBy( + func(r *admin.Project) bool { + return r.State == admin.Project_ARCHIVED + })) + }) +} -func updateProjectSetup() { - projectUpdateRequest = &admin.Project{ - Id: projectValue, - State: admin.Project_ACTIVE, - } +func TestProjectCannotBeActivatedAndArchivedAtTheSameTime(t *testing.T) { + testProjectUpdate( + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + config.Activate = true + config.Archive = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "Specify either activate or archive") + s.MockAdminClient.AssertNotCalled(t, "UpdateProject", mock.Anything, mock.Anything) + }) } -func modifyProjectFlags(newArchiveVal bool, newActivateVal bool) { - project.DefaultProjectConfig.ArchiveProject = newArchiveVal - project.DefaultProjectConfig.Archive = newArchiveVal - project.DefaultProjectConfig.ActivateProject = newActivateVal - project.DefaultProjectConfig.Activate = newActivateVal +func TestProjectUpdateDoesNothingWhenThereAreNoChanges(t *testing.T) { + testProjectUpdate( + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + project.State = admin.Project_ACTIVE + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateProject", mock.Anything, mock.Anything) + }) } -func TestActivateProjectFunc(t *testing.T) { - s := setup() - updateProjectSetup() - config.GetConfig().Project = projectValue - project.DefaultProjectConfig.Name = projectValue - modifyProjectFlags(false, true) - projectUpdateRequest = &admin.Project{ - Id: projectValue, - Name: projectValue, - Labels: &admin.Labels{ - Values: map[string]string{}, +func TestProjectUpdateWithoutForceFlagFails(t *testing.T) { + testProjectUpdate( + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + project.State = admin.Project_ARCHIVED + config.Activate = true + config.Force = false }, - State: admin.Project_ACTIVE, - } - s.MockAdminClient.OnUpdateProjectMatch(s.Ctx, projectUpdateRequest).Return(nil, nil) - err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) - s.TearDownAndVerify(t, "Project dummyProject updated\n") + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.MockAdminClient.AssertNotCalled(t, "UpdateProject", mock.Anything, mock.Anything) + }) } -func TestActivateProjectFuncWithError(t *testing.T) { - s := setup() - updateProjectSetup() - config.GetConfig().Project = projectValue - project.DefaultProjectConfig.Name = projectValue - modifyProjectFlags(false, true) - projectUpdateRequest = &admin.Project{ - Id: projectValue, - Name: projectValue, - Labels: &admin.Labels{ - Values: map[string]string{}, +func TestProjectUpdateDoesNothingWithDryRunFlag(t *testing.T) { + testProjectUpdate( + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + project.State = admin.Project_ARCHIVED + config.Activate = true + config.DryRun = true }, - State: admin.Project_ACTIVE, - } - s.MockAdminClient.OnUpdateProjectMatch(s.Ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) - err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) - s.TearDownAndVerify(t, "Project dummyProject failed to update due to Error Updating Project\n") + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateProject", mock.Anything, mock.Anything) + }) } -func TestArchiveProjectFunc(t *testing.T) { - s := setup() - updateProjectSetup() - config.GetConfig().Project = projectValue - project.DefaultProjectConfig = &project.ConfigProject{} - project.DefaultProjectConfig.Name = projectValue - modifyProjectFlags(true, false) - projectUpdateRequest = &admin.Project{ - Id: projectValue, - Name: projectValue, - Labels: &admin.Labels{ - Values: nil, +func TestForceFlagIsIgnoredWithDryRunDuringProjectUpdate(t *testing.T) { + t.Run("without --force", func(t *testing.T) { + testProjectUpdate( + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + project.State = admin.Project_ARCHIVED + config.Activate = true + + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateProject", mock.Anything, mock.Anything) + }) + }) + + t.Run("with --force", func(t *testing.T) { + testProjectUpdate( + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + project.State = admin.Project_ARCHIVED + config.Activate = true + + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateProject", mock.Anything, mock.Anything) + }) + }) +} + +func TestProjectUpdateFailsWhenProjectDoesNotExist(t *testing.T) { + testProjectUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, project *admin.Project) { + s.FetcherExt. + OnGetProjectByID(s.Ctx, project.Id). + Return(nil, ext.NewNotFoundError("project not found")) + s.MockAdminClient. + OnUpdateProjectMatch(s.Ctx, mock.Anything). + Return(&admin.ProjectUpdateResponse{}, nil) }, - State: admin.Project_ARCHIVED, - } - s.MockAdminClient.OnUpdateProjectMatch(s.Ctx, projectUpdateRequest).Return(nil, nil) - err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) - assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) - s.TearDownAndVerify(t, "Project dummyProject updated\n") + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateProject", mock.Anything, mock.Anything) + }, + ) } -func TestArchiveProjectFuncWithError(t *testing.T) { - s := setup() - updateProjectSetup() - project.DefaultProjectConfig.Name = projectValue - project.DefaultProjectConfig.Labels = map[string]string{} - modifyProjectFlags(true, false) - projectUpdateRequest = &admin.Project{ - Id: projectValue, - Name: projectValue, - Labels: &admin.Labels{ - Values: map[string]string{}, +func TestProjectUpdateFailsWhenAdminClientFails(t *testing.T) { + testProjectUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, project *admin.Project) { + s.FetcherExt. + OnGetProjectByID(s.Ctx, project.Id). + Return(project, nil) + s.MockAdminClient. + OnUpdateProjectMatch(s.Ctx, mock.Anything). + Return(nil, fmt.Errorf("network error")) }, - State: admin.Project_ARCHIVED, - } - s.MockAdminClient.OnUpdateProjectMatch(s.Ctx, projectUpdateRequest).Return(nil, errors.New("Error Updating Project")) - err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - s.MockAdminClient.AssertCalled(t, "UpdateProject", s.Ctx, projectUpdateRequest) - s.TearDownAndVerify(t, "Project dummyProject failed to update"+ - " due to Error Updating Project\n") + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + project.State = admin.Project_ARCHIVED + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertCalled(t, "UpdateProject", mock.Anything, mock.Anything) + }, + ) } -func TestEmptyProjectInput(t *testing.T) { - s := setup() - updateProjectSetup() +func TestProjectUpdateRequiresProjectId(t *testing.T) { + testProjectUpdate( + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + config.ID = "" + }, + func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "project id wasn't passed") + }) +} + +func testProjectUpdate( + setup func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project), + asserter func(s *testutils.TestStruct, err error), +) { + testProjectUpdateWithMockSetup( + /* mockSetup */ func(s *testutils.TestStruct, project *admin.Project) { + s.FetcherExt. + OnGetProjectByID(s.Ctx, project.Id). + Return(project, nil) + s.MockAdminClient. + OnUpdateProjectMatch(s.Ctx, mock.Anything). + Return(&admin.ProjectUpdateResponse{}, nil) + }, + setup, + asserter, + ) +} + +func testProjectUpdateWithMockSetup( + mockSetup func(s *testutils.TestStruct, project *admin.Project), + setup func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project), + asserter func(s *testutils.TestStruct, err error), +) { + s := testutils.Setup() + target := newTestProject() + + if mockSetup != nil { + mockSetup(&s, target) + } + + project.DefaultProjectConfig = &project.ConfigProject{ + ID: target.Id, + } config.GetConfig().Project = "" - modifyProjectFlags(false, true) - err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf(clierrors.ErrProjectNotPassed), err) + config.GetConfig().Domain = "" + if setup != nil { + setup(&s, project.DefaultProjectConfig, target) + } + + err := updateProjectsFunc(s.Ctx, nil, s.CmdCtx) + + if asserter != nil { + asserter(&s, err) + } + + // cleanup + project.DefaultProjectConfig = &project.ConfigProject{} + config.GetConfig().Project = "" + config.GetConfig().Domain = "" } -func TestInvalidInput(t *testing.T) { - s := setup() - updateProjectSetup() - config.GetConfig().Project = projectValue - project.DefaultProjectConfig.Name = projectValue - modifyProjectFlags(true, true) - err := updateProjectsFunc(s.Ctx, []string{}, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf(clierrors.ErrInvalidStateUpdate), err) - s.TearDownAndVerify(t, "") +func newTestProject() *admin.Project { + return &admin.Project{ + Id: testutils.RandomName(12), + Name: testutils.RandomName(12), + State: admin.Project_ACTIVE, + Domains: []*admin.Domain{ + { + Id: testutils.RandomName(12), + Name: testutils.RandomName(12), + }, + }, + Description: testutils.RandomName(12), + Labels: &admin.Labels{ + Values: map[string]string{ + testutils.RandomName(5): testutils.RandomName(12), + testutils.RandomName(5): testutils.RandomName(12), + testutils.RandomName(5): testutils.RandomName(12), + }, + }, + } } diff --git a/flytectl/cmd/update/task_meta_test.go b/flytectl/cmd/update/task_meta_test.go index e121cbe8bd..e1ffc9a13a 100644 --- a/flytectl/cmd/update/task_meta_test.go +++ b/flytectl/cmd/update/task_meta_test.go @@ -4,28 +4,193 @@ import ( "fmt" "testing" + "github.com/google/go-cmp/cmp" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) -func TestTaskUpdate(t *testing.T) { - s := testutils.Setup() - args := []string{"task1"} - s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) - assert.Nil(t, getUpdateTaskFunc(&NamedEntityConfig{})(s.Ctx, args, s.CmdCtx)) +func TestTaskMetadataCanBeActivated(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_TASK, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateNamedEntity", s.Ctx, + mock.MatchedBy( + func(r *admin.NamedEntityUpdateRequest) bool { + return r.GetMetadata().GetState() == admin.NamedEntityState_NAMED_ENTITY_ACTIVE + })) + }) } -func TestTaskUpdateFail(t *testing.T) { - s := testutils.Setup() - args := []string{"workflow1"} - s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, getUpdateTaskFunc(&NamedEntityConfig{})(s.Ctx, args, s.CmdCtx)) +func TestTaskMetadataCanBeArchived(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_TASK, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ACTIVE + config.Archive = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateNamedEntity", s.Ctx, + mock.MatchedBy( + func(r *admin.NamedEntityUpdateRequest) bool { + return r.GetMetadata().GetState() == admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + })) + }) +} + +func TestTaskMetadataCannotBeActivatedAndArchivedAtTheSameTime(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_TASK, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + config.Activate = true + config.Archive = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "Specify either activate or archive") + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) +} + +func TestTaskMetadataUpdateDoesNothingWhenThereAreNoChanges(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_TASK, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ACTIVE + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) +} + +func TestTaskMetadataUpdateWithoutForceFlagFails(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_TASK, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) +} + +func TestTaskMetadataUpdateDoesNothingWithDryRunFlag(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_TASK, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) } -func TestTaskUpdateInvalidArgs(t *testing.T) { +func TestForceFlagIsIgnoredWithDryRunDuringTaskMetadataUpdate(t *testing.T) { + t.Run("without --force", func(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_TASK, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) + }) + + t.Run("with --force", func(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_TASK, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) + }) +} + +func TestTaskMetadataUpdateFailsWhenTaskDoesNotExist(t *testing.T) { + testNamedEntityUpdateWithMockSetup( + core.ResourceType_TASK, + /* mockSetup */ func(s *testutils.TestStruct, namedEntity *admin.NamedEntity) { + s.MockAdminClient. + OnGetNamedEntityMatch( + s.Ctx, + mock.MatchedBy(func(r *admin.NamedEntityGetRequest) bool { + return r.ResourceType == namedEntity.ResourceType && + cmp.Equal(r.Id, namedEntity.Id) + })). + Return(nil, ext.NewNotFoundError("named entity not found")) + s.MockAdminClient. + OnUpdateNamedEntityMatch(s.Ctx, mock.Anything). + Return(&admin.NamedEntityUpdateResponse{}, nil) + }, + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }, + ) +} + +func TestTaskMetadataUpdateFailsWhenAdminClientFails(t *testing.T) { + testNamedEntityUpdateWithMockSetup( + core.ResourceType_TASK, + /* mockSetup */ func(s *testutils.TestStruct, namedEntity *admin.NamedEntity) { + s.MockAdminClient. + OnGetNamedEntityMatch( + s.Ctx, + mock.MatchedBy(func(r *admin.NamedEntityGetRequest) bool { + return r.ResourceType == namedEntity.ResourceType && + cmp.Equal(r.Id, namedEntity.Id) + })). + Return(namedEntity, nil) + s.MockAdminClient. + OnUpdateNamedEntityMatch(s.Ctx, mock.Anything). + Return(nil, fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }, + ) +} + +func TestTaskMetadataUpdateRequiresTaskName(t *testing.T) { s := testutils.Setup() - assert.NotNil(t, getUpdateTaskFunc(&NamedEntityConfig{})(s.Ctx, []string{}, s.CmdCtx)) + config := &NamedEntityConfig{} + + err := getUpdateTaskFunc(config)(s.Ctx, nil, s.CmdCtx) + + assert.ErrorContains(t, err, "task name wasn't passed") } diff --git a/flytectl/cmd/update/testdata/valid_project_cluster_attribute.yaml b/flytectl/cmd/update/testdata/valid_project_cluster_attribute.yaml new file mode 100644 index 0000000000..27dc7e2f3c --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_cluster_attribute.yaml @@ -0,0 +1,4 @@ +project: flytesnacks +attributes: + "foo": "bar" + "buzz": "lightyear" \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_project_execution_cluster_label.yaml b/flytectl/cmd/update/testdata/valid_project_execution_cluster_label.yaml new file mode 100644 index 0000000000..7d9e207ba7 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_execution_cluster_label.yaml @@ -0,0 +1,2 @@ +project: flytesnacks +value: foo \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_project_execution_queue_attribute.yaml b/flytectl/cmd/update/testdata/valid_project_execution_queue_attribute.yaml new file mode 100644 index 0000000000..7ddb5f135d --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_execution_queue_attribute.yaml @@ -0,0 +1,6 @@ +project: flytesnacks +tags: + - foo + - bar + - buzz + - lightyear \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_project_plugin_override.yaml b/flytectl/cmd/update/testdata/valid_project_plugin_override.yaml new file mode 100644 index 0000000000..1ad8e5cd01 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_plugin_override.yaml @@ -0,0 +1,7 @@ +project: flytesnacks +overrides: + - task_type: python_task + plugin_id: + - plugin_override1 + - plugin_override2 + missing_plugin_behavior: 1 # 0 : FAIL , 1: DEFAULT diff --git a/flytectl/cmd/update/testdata/valid_project_task_attribute.yaml b/flytectl/cmd/update/testdata/valid_project_task_attribute.yaml new file mode 100644 index 0000000000..77281d5a22 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_task_attribute.yaml @@ -0,0 +1,7 @@ +project: flytesnacks +defaults: + cpu: "1" + memory: 150Mi +limits: + cpu: "2" + memory: 450Mi \ No newline at end of file diff --git a/flytectl/cmd/update/testdata/valid_project_workflow_execution_config.yaml b/flytectl/cmd/update/testdata/valid_project_workflow_execution_config.yaml new file mode 100644 index 0000000000..414e3ecbb4 --- /dev/null +++ b/flytectl/cmd/update/testdata/valid_project_workflow_execution_config.yaml @@ -0,0 +1,2 @@ +project: flytesnacks +max_parallelism: 5 \ No newline at end of file diff --git a/flytectl/cmd/update/update.go b/flytectl/cmd/update/update.go index 23c69ac608..9677ee897e 100644 --- a/flytectl/cmd/update/update.go +++ b/flytectl/cmd/update/update.go @@ -20,12 +20,11 @@ const ( updateUse = "update" updateShort = `Update Flyte resources e.g., project.` updatecmdLong = ` -Currently, this command only provides subcommands to update project. -Take input project that needs to be archived or unarchived. Name of the project to be updated is a mandatory field. -Update Flyte resources; if a project: +Provides subcommands to update Flyte resources, such as tasks, workflows, launch plans, executions, and projects. +Update Flyte resource; e.g., to activate a project: :: - flytectl update project -p flytesnacks --activateProject + flytectl update project -p flytesnacks --activate ` ) diff --git a/flytectl/cmd/update/update_test.go b/flytectl/cmd/update/update_test.go index d4a256e06c..23ec7d3495 100644 --- a/flytectl/cmd/update/update_test.go +++ b/flytectl/cmd/update/update_test.go @@ -5,8 +5,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - - "github.com/flyteorg/flytectl/cmd/testutils" ) const ( @@ -14,8 +12,6 @@ const ( testDataInvalidAttrFile = "testdata/invalid_attribute.yaml" ) -var setup = testutils.Setup - func TestUpdateCommand(t *testing.T) { updateCommand := CreateUpdateCommand() assert.Equal(t, updateCommand.Use, updateUse) diff --git a/flytectl/cmd/update/workflow_meta_test.go b/flytectl/cmd/update/workflow_meta_test.go index 7c7a1fc78e..2d49de2b25 100644 --- a/flytectl/cmd/update/workflow_meta_test.go +++ b/flytectl/cmd/update/workflow_meta_test.go @@ -4,28 +4,193 @@ import ( "fmt" "testing" + "github.com/google/go-cmp/cmp" + "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) -func TestWorkflowUpdate(t *testing.T) { - s := testutils.Setup() - args := []string{"workflow1"} - s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(&admin.NamedEntityUpdateResponse{}, nil) - assert.Nil(t, getUpdateWorkflowFunc(&NamedEntityConfig{})(s.Ctx, args, s.CmdCtx)) +func TestWorkflowMetadataCanBeActivated(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_WORKFLOW, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateNamedEntity", s.Ctx, + mock.MatchedBy( + func(r *admin.NamedEntityUpdateRequest) bool { + return r.GetMetadata().GetState() == admin.NamedEntityState_NAMED_ENTITY_ACTIVE + })) + }) } -func TestWorkflowUpdateFail(t *testing.T) { - s := testutils.Setup() - args := []string{"workflow1"} - s.MockAdminClient.OnUpdateNamedEntityMatch(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("failed to update")) - assert.NotNil(t, getUpdateWorkflowFunc(&NamedEntityConfig{})(s.Ctx, args, s.CmdCtx)) +func TestWorkflowMetadataCanBeArchived(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_WORKFLOW, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ACTIVE + config.Archive = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateNamedEntity", s.Ctx, + mock.MatchedBy( + func(r *admin.NamedEntityUpdateRequest) bool { + return r.GetMetadata().GetState() == admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + })) + }) +} + +func TestWorkflowMetadataCannotBeActivatedAndArchivedAtTheSameTime(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_WORKFLOW, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + config.Activate = true + config.Archive = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "Specify either activate or archive") + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) +} + +func TestWorkflowMetadataUpdateDoesNothingWhenThereAreNoChanges(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_WORKFLOW, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ACTIVE + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) +} + +func TestWorkflowMetadataUpdateWithoutForceFlagFails(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_WORKFLOW, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.Force = false + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.ErrorContains(t, err, "update aborted by user") + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) +} + +func TestWorkflowMetadataUpdateDoesNothingWithDryRunFlag(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_WORKFLOW, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) } -func TestWorkflowUpdateInvalidArgs(t *testing.T) { +func TestForceFlagIsIgnoredWithDryRunDuringWorkflowMetadataUpdate(t *testing.T) { + t.Run("without --force", func(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_WORKFLOW, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + + config.Force = false + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) + }) + + t.Run("with --force", func(t *testing.T) { + testNamedEntityUpdate(core.ResourceType_WORKFLOW, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + + config.Force = true + config.DryRun = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }) + }) +} + +func TestWorkflowMetadataUpdateFailsWhenWorkflowDoesNotExist(t *testing.T) { + testNamedEntityUpdateWithMockSetup( + core.ResourceType_WORKFLOW, + /* mockSetup */ func(s *testutils.TestStruct, namedEntity *admin.NamedEntity) { + s.MockAdminClient. + OnGetNamedEntityMatch( + s.Ctx, + mock.MatchedBy(func(r *admin.NamedEntityGetRequest) bool { + return r.ResourceType == namedEntity.ResourceType && + cmp.Equal(r.Id, namedEntity.Id) + })). + Return(nil, ext.NewNotFoundError("named entity not found")) + s.MockAdminClient. + OnUpdateNamedEntityMatch(s.Ctx, mock.Anything). + Return(&admin.NamedEntityUpdateResponse{}, nil) + }, + /* setup */ nil, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertNotCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }, + ) +} + +func TestWorkflowMetadataUpdateFailsWhenAdminClientFails(t *testing.T) { + testNamedEntityUpdateWithMockSetup( + core.ResourceType_WORKFLOW, + /* mockSetup */ func(s *testutils.TestStruct, namedEntity *admin.NamedEntity) { + s.MockAdminClient. + OnGetNamedEntityMatch( + s.Ctx, + mock.MatchedBy(func(r *admin.NamedEntityGetRequest) bool { + return r.ResourceType == namedEntity.ResourceType && + cmp.Equal(r.Id, namedEntity.Id) + })). + Return(namedEntity, nil) + s.MockAdminClient. + OnUpdateNamedEntityMatch(s.Ctx, mock.Anything). + Return(nil, fmt.Errorf("network error")) + }, + /* setup */ func(s *testutils.TestStruct, config *NamedEntityConfig, namedEntity *admin.NamedEntity) { + namedEntity.Metadata.State = admin.NamedEntityState_NAMED_ENTITY_ARCHIVED + config.Activate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Error(t, err) + s.MockAdminClient.AssertCalled(t, "UpdateNamedEntity", mock.Anything, mock.Anything) + }, + ) +} + +func TestWorkflowMetadataUpdateRequiresWorkflowName(t *testing.T) { s := testutils.Setup() - assert.NotNil(t, getUpdateWorkflowFunc(&NamedEntityConfig{})(s.Ctx, []string{}, s.CmdCtx)) + config := &NamedEntityConfig{} + + err := getUpdateWorkflowFunc(config)(s.Ctx, nil, s.CmdCtx) + + assert.ErrorContains(t, err, "workflow name wasn't passed") } diff --git a/flytectl/go.mod b/flytectl/go.mod index a3587885f0..534c99baaa 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -14,9 +14,11 @@ require ( github.com/flyteorg/flytestdlib v1.0.13 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 github.com/golang/protobuf v1.5.2 + github.com/google/go-cmp v0.5.8 github.com/google/go-github/v42 v42.0.0 github.com/google/uuid v1.2.0 github.com/hashicorp/go-version v1.3.0 + github.com/hexops/gotextdiff v1.0.3 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 github.com/mitchellh/mapstructure v1.4.3 @@ -83,7 +85,6 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.4.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/google/go-cmp v0.5.8 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/googleapis/gax-go/v2 v2.3.0 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index 95855b56ca..38be461844 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -732,6 +732,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= diff --git a/flytectl/pkg/ext/attribute_match_fetcher.go b/flytectl/pkg/ext/attribute_match_fetcher.go index 3e33609b3b..5106a170a1 100644 --- a/flytectl/pkg/ext/attribute_match_fetcher.go +++ b/flytectl/pkg/ext/attribute_match_fetcher.go @@ -2,57 +2,65 @@ package ext import ( "context" - "fmt" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) func (a *AdminFetcherExtClient) FetchWorkflowAttributes(ctx context.Context, project, domain, name string, rsType admin.MatchableResource) (*admin.WorkflowAttributesGetResponse, error) { - workflowAttr, err := a.AdminServiceClient().GetWorkflowAttributes(ctx, &admin.WorkflowAttributesGetRequest{ + response, err := a.AdminServiceClient().GetWorkflowAttributes(ctx, &admin.WorkflowAttributesGetRequest{ Project: project, Domain: domain, Workflow: name, ResourceType: rsType, }) - if err != nil { + if err != nil && status.Code(err) != codes.NotFound { return nil, err } - if workflowAttr.GetAttributes() == nil || workflowAttr.GetAttributes().GetMatchingAttributes() == nil { - return nil, fmt.Errorf("attribute doesn't exist") + if status.Code(err) == codes.NotFound || + response.GetAttributes() == nil || + response.GetAttributes().GetMatchingAttributes() == nil { + return nil, NewNotFoundError("attribute") } - return workflowAttr, nil + return response, nil } func (a *AdminFetcherExtClient) FetchProjectDomainAttributes(ctx context.Context, project, domain string, rsType admin.MatchableResource) (*admin.ProjectDomainAttributesGetResponse, error) { - projectDomainAttr, err := a.AdminServiceClient().GetProjectDomainAttributes(ctx, + response, err := a.AdminServiceClient().GetProjectDomainAttributes(ctx, &admin.ProjectDomainAttributesGetRequest{ Project: project, Domain: domain, ResourceType: rsType, }) - if err != nil { + if err != nil && status.Code(err) != codes.NotFound { return nil, err } - if projectDomainAttr.GetAttributes() == nil || projectDomainAttr.GetAttributes().GetMatchingAttributes() == nil { - return nil, fmt.Errorf("attribute doesn't exist") + if status.Code(err) == codes.NotFound || + response.GetAttributes() == nil || + response.GetAttributes().GetMatchingAttributes() == nil { + return nil, NewNotFoundError("attribute") } - return projectDomainAttr, nil + return response, nil } func (a *AdminFetcherExtClient) FetchProjectAttributes(ctx context.Context, project string, rsType admin.MatchableResource) (*admin.ProjectAttributesGetResponse, error) { - projectDomainAttr, err := a.AdminServiceClient().GetProjectAttributes(ctx, + response, err := a.AdminServiceClient().GetProjectAttributes(ctx, &admin.ProjectAttributesGetRequest{ Project: project, ResourceType: rsType, }) - if err != nil { + if err != nil && status.Code(err) != codes.NotFound { return nil, err } - if projectDomainAttr.GetAttributes() == nil || projectDomainAttr.GetAttributes().GetMatchingAttributes() == nil { - return nil, fmt.Errorf("attribute doesn't exist") + if status.Code(err) == codes.NotFound || + response.GetAttributes() == nil || + response.GetAttributes().GetMatchingAttributes() == nil { + return nil, NewNotFoundError("attribute") } - return projectDomainAttr, nil + return response, nil } diff --git a/flytectl/pkg/ext/attribute_match_fetcher_test.go b/flytectl/pkg/ext/attribute_match_fetcher_test.go index 81352d6bc2..663e6e620b 100644 --- a/flytectl/pkg/ext/attribute_match_fetcher_test.go +++ b/flytectl/pkg/ext/attribute_match_fetcher_test.go @@ -52,7 +52,8 @@ func TestFetchWorkflowAttributesError(t *testing.T) { adminClient.OnGetWorkflowAttributesMatch(mock.Anything, mock.Anything).Return(wResp, nil) _, err := adminFetcherExt.FetchWorkflowAttributes(ctx, "dummyProject", "domainValue", "workflowName", admin.MatchableResource_TASK_RESOURCE) assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("attribute doesn't exist"), err) + assert.True(t, IsNotFoundError(err)) + assert.EqualError(t, err, "attribute not found") }) } @@ -76,7 +77,8 @@ func TestFetchProjectDomainAttributesError(t *testing.T) { adminClient.OnGetProjectDomainAttributesMatch(mock.Anything, mock.Anything).Return(pResp, nil) _, err := adminFetcherExt.FetchProjectDomainAttributes(ctx, "dummyProject", "domainValue", admin.MatchableResource_TASK_RESOURCE) assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("attribute doesn't exist"), err) + assert.True(t, IsNotFoundError(err)) + assert.EqualError(t, err, "attribute not found") }) } @@ -93,6 +95,7 @@ func TestFetchProjectAttributesError(t *testing.T) { adminClient.OnGetProjectAttributesMatch(mock.Anything, mock.Anything).Return(pResp, nil) _, err := adminFetcherExt.FetchProjectAttributes(ctx, "dummyProject", admin.MatchableResource_TASK_RESOURCE) assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("attribute doesn't exist"), err) + assert.True(t, IsNotFoundError(err)) + assert.EqualError(t, err, "attribute not found") }) } diff --git a/flytectl/pkg/ext/errors.go b/flytectl/pkg/ext/errors.go new file mode 100644 index 0000000000..4f51601a28 --- /dev/null +++ b/flytectl/pkg/ext/errors.go @@ -0,0 +1,24 @@ +package ext + +import ( + "errors" + "fmt" +) + +type NotFoundError struct { + Target string +} + +func (err *NotFoundError) Error() string { + return fmt.Sprintf("%s not found", err.Target) +} + +func NewNotFoundError(targetFormat string, formatArgs ...any) *NotFoundError { + target := fmt.Sprintf(targetFormat, formatArgs...) + return &NotFoundError{target} +} + +func IsNotFoundError(err error) bool { + var notFoundErr *NotFoundError + return errors.As(err, ¬FoundErr) +} diff --git a/flytectl/pkg/ext/fetcher.go b/flytectl/pkg/ext/fetcher.go index b706bf8a53..790eebde0e 100644 --- a/flytectl/pkg/ext/fetcher.go +++ b/flytectl/pkg/ext/fetcher.go @@ -72,6 +72,9 @@ type AdminFetcherExtInterface interface { // ListProjects fetches all projects ListProjects(ctx context.Context, filter filters.Filters) (*admin.Projects, error) + + // GetProjectByID fetches a single project by its identifier. If project does not exist, an error will be returned + GetProjectByID(ctx context.Context, projectID string) (*admin.Project, error) } // AdminFetcherExtClient is used for interacting with extended features used for fetching data from admin service diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index 3162a6b278..7d8e1ee284 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -750,6 +750,47 @@ func (_m *AdminFetcherExtInterface) FetchWorkflowVersion(ctx context.Context, na return r0, r1 } +type AdminFetcherExtInterface_GetProjectByID struct { + *mock.Call +} + +func (_m AdminFetcherExtInterface_GetProjectByID) Return(_a0 *admin.Project, _a1 error) *AdminFetcherExtInterface_GetProjectByID { + return &AdminFetcherExtInterface_GetProjectByID{Call: _m.Call.Return(_a0, _a1)} +} + +func (_m *AdminFetcherExtInterface) OnGetProjectByID(ctx context.Context, projectID string) *AdminFetcherExtInterface_GetProjectByID { + c_call := _m.On("GetProjectByID", ctx, projectID) + return &AdminFetcherExtInterface_GetProjectByID{Call: c_call} +} + +func (_m *AdminFetcherExtInterface) OnGetProjectByIDMatch(matchers ...interface{}) *AdminFetcherExtInterface_GetProjectByID { + c_call := _m.On("GetProjectByID", matchers...) + return &AdminFetcherExtInterface_GetProjectByID{Call: c_call} +} + +// GetProjectByID provides a mock function with given fields: ctx, projectID +func (_m *AdminFetcherExtInterface) GetProjectByID(ctx context.Context, projectID string) (*admin.Project, error) { + ret := _m.Called(ctx, projectID) + + var r0 *admin.Project + if rf, ok := ret.Get(0).(func(context.Context, string) *admin.Project); ok { + r0 = rf(ctx, projectID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*admin.Project) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, projectID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type AdminFetcherExtInterface_ListExecution struct { *mock.Call } diff --git a/flytectl/pkg/ext/project_fetcher.go b/flytectl/pkg/ext/project_fetcher.go index 4367bef9a6..3834952877 100644 --- a/flytectl/pkg/ext/project_fetcher.go +++ b/flytectl/pkg/ext/project_fetcher.go @@ -2,6 +2,7 @@ package ext import ( "context" + "fmt" "github.com/flyteorg/flytectl/pkg/filters" @@ -19,3 +20,27 @@ func (a *AdminFetcherExtClient) ListProjects(ctx context.Context, filter filters } return e, nil } + +func (a *AdminFetcherExtClient) GetProjectByID(ctx context.Context, projectID string) (*admin.Project, error) { + if projectID == "" { + return nil, fmt.Errorf("GetProjectByID: projectId is empty") + } + + response, err := a.AdminServiceClient().ListProjects(ctx, &admin.ProjectListRequest{ + Limit: 1, + Filters: fmt.Sprintf("eq(identifier,%s)", filters.EscapeValue(projectID)), + }) + if err != nil { + return nil, err + } + + if len(response.Projects) == 0 { + return nil, NewNotFoundError("project %s", projectID) + } + + if len(response.Projects) > 1 { + panic(fmt.Sprintf("unexpected number of projects in ListProjects response: %d - 0 or 1 expected", len(response.Projects))) + } + + return response.Projects[0], nil +} diff --git a/flytectl/pkg/filters/filters.go b/flytectl/pkg/filters/filters.go index 629b6a25c8..836dc50eba 100644 --- a/flytectl/pkg/filters/filters.go +++ b/flytectl/pkg/filters/filters.go @@ -65,6 +65,16 @@ func (i InvalidEscapeSequence) Error() string { return fmt.Sprintf("invalid field selector: invalid escape sequence: %s", i.sequence) } +// EscapeValue escapes strings to be used as values in filter queries. +func EscapeValue(s string) string { + replacer := strings.NewReplacer( + `\`, `\\`, + `,`, `\,`, + `=`, `\=`, + ) + return replacer.Replace(s) +} + // UnescapeValue unescapes a fieldSelector value and returns the original literal value. // May return the original string if it contains no escaped or special characters. func UnescapeValue(s string) (string, error) { diff --git a/flytectl/pkg/filters/filters_test.go b/flytectl/pkg/filters/filters_test.go index cd988f0c58..43cfb52d3b 100644 --- a/flytectl/pkg/filters/filters_test.go +++ b/flytectl/pkg/filters/filters_test.go @@ -71,3 +71,14 @@ func TestParseFailed(t *testing.T) { assert.Equal(t, "", op) } } + +func TestEscapeValue(t *testing.T) { + assert.Equal(t, "", EscapeValue("")) + assert.Equal(t, "abc", EscapeValue("abc")) + assert.Equal(t, `\\`, EscapeValue(`\`)) + assert.Equal(t, `\\\\`, EscapeValue(`\\`)) + assert.Equal(t, `\,`, EscapeValue(`,`)) + assert.Equal(t, `\,\,`, EscapeValue(`,,`)) + assert.Equal(t, `\=`, EscapeValue(`=`)) + assert.Equal(t, `\=\=`, EscapeValue(`==`)) +} From 7f80f02abee82ee4b4afa61f7ebccbd7a19e8323 Mon Sep 17 00:00:00 2001 From: Future-Outlier Date: Fri, 13 Oct 2023 05:05:12 +0800 Subject: [PATCH 322/645] force flag (#431) Signed-off-by: Future Outlier Co-authored-by: Future Outlier --- .../cmd/config/subcommand/config/config_flags.go | 1 + .../config/subcommand/config/config_flags_test.go | 14 ++++++++++++++ .../cmd/config/subcommand/config/init_flags.go | 2 ++ flytectl/cmd/configuration/configuration.go | 4 +++- flytectl/cmd/configuration/configuration_test.go | 15 ++++++++++++++- 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/flytectl/cmd/config/subcommand/config/config_flags.go b/flytectl/cmd/config/subcommand/config/config_flags.go index 35b08563cd..c3d727a3e2 100755 --- a/flytectl/cmd/config/subcommand/config/config_flags.go +++ b/flytectl/cmd/config/subcommand/config/config_flags.go @@ -53,5 +53,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.Console, fmt.Sprintf("%v%v", prefix, "console"), DefaultConfig.Console, "Endpoint of console, if different than flyte admin") cmdFlags.StringVar(&DefaultConfig.Host, fmt.Sprintf("%v%v", prefix, "host"), DefaultConfig.Host, "Endpoint of flyte admin") cmdFlags.BoolVar(&DefaultConfig.Insecure, fmt.Sprintf("%v%v", prefix, "insecure"), DefaultConfig.Insecure, "Enable insecure mode") + cmdFlags.BoolVar(&DefaultConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultConfig.Force, "Force to overwrite the default config file without confirmation") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/config/config_flags_test.go b/flytectl/cmd/config/subcommand/config/config_flags_test.go index 142d145bc3..51f52abb86 100755 --- a/flytectl/cmd/config/subcommand/config/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/config/config_flags_test.go @@ -141,4 +141,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/config/init_flags.go b/flytectl/cmd/config/subcommand/config/init_flags.go index 9c31fa998d..cbb8e60be5 100755 --- a/flytectl/cmd/config/subcommand/config/init_flags.go +++ b/flytectl/cmd/config/subcommand/config/init_flags.go @@ -4,6 +4,7 @@ package config var ( DefaultConfig = &Config{ Insecure: false, + Force: false, } ) @@ -12,4 +13,5 @@ type Config struct { Console string `json:"console" pflag:",Endpoint of console, if different than flyte admin"` Host string `json:"host" pflag:",Endpoint of flyte admin"` Insecure bool `json:"insecure" pflag:",Enable insecure mode"` + Force bool `json:"force" pflag:",Force to overwrite the default config file without confirmation"` } diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index e759758164..e6d120b1bb 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -70,6 +70,8 @@ func CreateConfigCommand() *cobra.Command { Long: initCmdLong, PFlagProvider: initConfig.DefaultConfig}, } + configCmd.Flags().BoolVar(&initConfig.DefaultConfig.Force, "force", false, "Force to overwrite the default config file without confirmation") + cmdcore.AddCommands(configCmd, getResourcesFuncs) return configCmd } @@ -109,7 +111,7 @@ func initFlytectlConfig(reader io.Reader) error { if _, err := os.Stat(configutil.ConfigFile); os.IsNotExist(err) { _err = configutil.SetupConfig(configutil.ConfigFile, templateStr, templateValues) } else { - if cmdUtil.AskForConfirmation(fmt.Sprintf("This action will overwrite an existing config file at [%s]. Do you want to continue?", configutil.ConfigFile), reader) { + if initConfig.DefaultConfig.Force || cmdUtil.AskForConfirmation(fmt.Sprintf("This action will overwrite an existing config file at [%s]. Do you want to continue?", configutil.ConfigFile), reader) { if err := os.Remove(configutil.ConfigFile); err != nil { return err } diff --git a/flytectl/cmd/configuration/configuration_test.go b/flytectl/cmd/configuration/configuration_test.go index 19c90a13f4..2f48d28597 100644 --- a/flytectl/cmd/configuration/configuration_test.go +++ b/flytectl/cmd/configuration/configuration_test.go @@ -41,12 +41,12 @@ func TestCreateInitCommand(t *testing.T) { assert.Equal(t, initCmdShort, cmdNouns[2].Short) assert.Equal(t, "validate", cmdNouns[3].Use) assert.Equal(t, "Validates the loaded config.", cmdNouns[3].Short) - } func TestSetupConfigFunc(t *testing.T) { var yes = strings.NewReader("Yes") var no = strings.NewReader("No") + var empty = strings.NewReader("") mockOutStream := new(io.Writer) ctx := context.Background() _ = os.Remove(configutil.FlytectlConfig) @@ -59,8 +59,13 @@ func TestSetupConfigFunc(t *testing.T) { initConfig.DefaultConfig.Host = "" assert.Nil(t, err) + initConfig.DefaultConfig.Force = false assert.Nil(t, initFlytectlConfig(yes)) assert.Nil(t, initFlytectlConfig(no)) + + initConfig.DefaultConfig.Force = true + assert.Nil(t, initFlytectlConfig(empty)) + initConfig.DefaultConfig.Host = "flyte.org" assert.Nil(t, initFlytectlConfig(no)) initConfig.DefaultConfig.Host = "localhost:30081" @@ -86,3 +91,11 @@ func TestValidateEndpointName(t *testing.T) { assert.Equal(t, false, validateEndpointName("112.11.1.1:8080/console")) assert.Equal(t, false, validateEndpointName("flyte")) } + +func TestForceFlagInCreateConfigCommand(t *testing.T) { + cmd := CreateConfigCommand() + assert.False(t, initConfig.DefaultConfig.Force) + err := cmd.Flags().Parse([]string{"--force"}) + assert.Nil(t, err) + assert.True(t, initConfig.DefaultConfig.Force) +} From 61eb8f2c36b3e4cab94f1834e6a3c0aeb1f9fd79 Mon Sep 17 00:00:00 2001 From: Future-Outlier Date: Tue, 17 Oct 2023 16:39:12 +0800 Subject: [PATCH 323/645] Flyte Add Enable/Disable Options for Agent Services (#420) --------- Signed-off-by: Future Outlier Signed-off-by: Future-Outlier Co-authored-by: Future Outlier Co-authored-by: Kevin Su --- .../cmd/config/subcommand/sandbox/config_flags.go | 1 + .../config/subcommand/sandbox/config_flags_test.go | 14 ++++++++++++++ .../config/subcommand/sandbox/sandbox_config.go | 3 +++ flytectl/pkg/sandbox/start.go | 5 +++++ flytectl/pkg/sandbox/start_test.go | 2 ++ 5 files changed, 25 insertions(+) diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index 7b025f541d..39b9ba1ba1 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -54,6 +54,7 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), DefaultConfig.Version, "Version of flyte. Only supports flyte releases greater than v0.10.0") cmdFlags.StringVar(&DefaultConfig.Image, fmt.Sprintf("%v%v", prefix, "image"), DefaultConfig.Image, "Optional. Provide a fully qualified path to a Flyte compliant docker image.") cmdFlags.BoolVar(&DefaultConfig.Prerelease, fmt.Sprintf("%v%v", prefix, "pre"), DefaultConfig.Prerelease, "Optional. Pre release Version of flyte will be used for sandbox.") + cmdFlags.BoolVar(&DefaultConfig.DisableAgent, fmt.Sprintf("%v%v", prefix, "disable-agent"), DefaultConfig.DisableAgent, "Optional. Disable the agent service.") cmdFlags.StringSliceVar(&DefaultConfig.Env, fmt.Sprintf("%v%v", prefix, "env"), DefaultConfig.Env, "Optional. Provide Env variable in key=value format which can be passed to sandbox container.") cmdFlags.Var(&DefaultConfig.ImagePullPolicy, fmt.Sprintf("%v%v", prefix, "imagePullPolicy"), "Optional. Defines the image pull behavior [Always/IfNotPresent/Never]") cmdFlags.StringVar(&DefaultConfig.ImagePullOptions.RegistryAuth, fmt.Sprintf("%v%v", prefix, "imagePullOptions.registryAuth"), DefaultConfig.ImagePullOptions.RegistryAuth, "The base64 encoded credentials for the registry.") diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index 79f6e88f49..37e2fc2ab7 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -155,6 +155,20 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_disable-agent", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("disable-agent", testValue) + if vBool, err := cmdFlags.GetBool("disable-agent"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.DisableAgent) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_env", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index 1dfce6430f..b1fa698541 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -19,6 +19,9 @@ type Config struct { // Default value false represents that Flytectl will not use the latest pre-release if it exists. Prerelease bool `json:"pre" pflag:",Optional. Pre release Version of flyte will be used for sandbox."` + // Agent Service + DisableAgent bool `json:"disable-agent" pflag:",Optional. Disable the agent service."` + // Optionally it is possible to pass in environment variables to sandbox container. Env []string `json:"env" pflag:",Optional. Provide Env variable in key=value format which can be passed to sandbox container."` diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index e79ec0162f..7a9551804b 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -229,6 +229,10 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService sandboxEnv = append(sandboxEnv, "FLYTE_DEV=True") } + if sandboxConfig.DisableAgent { + sandboxEnv = append(sandboxEnv, "DISABLE_AGENT=True") + } + ID, err := docker.StartContainer(ctx, cli, volumes, exposedPorts, portBindings, docker.FlyteSandboxClusterName, sandboxImage, sandboxEnv, sandboxConfig.DryRun) @@ -393,6 +397,7 @@ func StartDemoCluster(ctx context.Context, args []string, sandboxConfig *sandbox return err } // K3s will automatically write the file specified by this var, which is mounted from user's local state dir. + sandboxConfig.Env = append(sandboxConfig.Env, k3sKubeConfigEnvVar) err = StartCluster(ctx, args, sandboxConfig, demoImageName, sandboxImagePrefix, exposedPorts, portBindings, util.DemoConsolePort) if err != nil { diff --git a/flytectl/pkg/sandbox/start_test.go b/flytectl/pkg/sandbox/start_test.go index a09797d363..a99f5b91f5 100644 --- a/flytectl/pkg/sandbox/start_test.go +++ b/flytectl/pkg/sandbox/start_test.go @@ -106,6 +106,8 @@ func TestStartFunc(t *testing.T) { RegistryAuth: "", Platform: "", } + config.Dev = true + config.DisableAgent = true assert.Nil(t, util.SetupFlyteDir()) assert.Nil(t, os.MkdirAll(f.FilePathJoin(f.UserHomeDir(), ".flyte", "state"), os.ModePerm)) assert.Nil(t, ioutil.WriteFile(docker.Kubeconfig, []byte(content), os.ModePerm)) From 6898a8e6418d1b1172e73ad2dc1ec33a0ebdfddd Mon Sep 17 00:00:00 2001 From: Future-Outlier Date: Wed, 18 Oct 2023 09:22:46 +0800 Subject: [PATCH 324/645] enable --force flag in flyte demo start (#432) Signed-off-by: Future Outlier Co-authored-by: Future Outlier --- .../config/subcommand/docker/config_flags.go | 55 +++++++++ .../subcommand/docker/config_flags_test.go | 116 ++++++++++++++++++ .../config/subcommand/docker/docker_config.go | 13 ++ .../config/subcommand/sandbox/config_flags.go | 1 + .../subcommand/sandbox/config_flags_test.go | 14 +++ .../subcommand/sandbox/sandbox_config.go | 2 + flytectl/pkg/docker/docker_config.go | 12 ++ flytectl/pkg/docker/docker_util.go | 7 +- flytectl/pkg/docker/docker_util_test.go | 5 + flytectl/pkg/sandbox/start.go | 2 + 10 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 flytectl/cmd/config/subcommand/docker/config_flags.go create mode 100644 flytectl/cmd/config/subcommand/docker/config_flags_test.go create mode 100644 flytectl/cmd/config/subcommand/docker/docker_config.go create mode 100644 flytectl/pkg/docker/docker_config.go diff --git a/flytectl/cmd/config/subcommand/docker/config_flags.go b/flytectl/cmd/config/subcommand/docker/config_flags.go new file mode 100644 index 0000000000..6c2a9bcea5 --- /dev/null +++ b/flytectl/cmd/config/subcommand/docker/config_flags.go @@ -0,0 +1,55 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package docker + +import ( + "encoding/json" + "reflect" + + "fmt" + + "github.com/spf13/pflag" +) + +// If v is a pointer, it will get its element value or the zero value of the element type. +// If v is not a pointer, it will return it as is. +func (Config) elemValueOrNil(v interface{}) interface{} { + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + if reflect.ValueOf(v).IsNil() { + return reflect.Zero(t.Elem()).Interface() + } else { + return reflect.ValueOf(v).Interface() + } + } else if v == nil { + return reflect.Zero(t).Interface() + } + + return v +} + +func (Config) mustJsonMarshal(v interface{}) string { + raw, err := json.Marshal(v) + if err != nil { + panic(err) + } + + return string(raw) +} + +func (Config) mustMarshalJSON(v json.Marshaler) string { + raw, err := v.MarshalJSON() + if err != nil { + panic(err) + } + + return string(raw) +} + +// GetPFlagSet will return strongly types pflags for all fields in Config and its nested types. The format of the +// flags is json-name.json-sub-name... etc. +func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { + cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) + cmdFlags.BoolVar(&DefaultConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultConfig.Force, "Optional. Forcefully delete existing sandbox cluster if it exists.") + return cmdFlags +} diff --git a/flytectl/cmd/config/subcommand/docker/config_flags_test.go b/flytectl/cmd/config/subcommand/docker/config_flags_test.go new file mode 100644 index 0000000000..e1efe4a644 --- /dev/null +++ b/flytectl/cmd/config/subcommand/docker/config_flags_test.go @@ -0,0 +1,116 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots. + +package docker + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/mitchellh/mapstructure" + "github.com/stretchr/testify/assert" +) + +var dereferencableKindsConfig = map[reflect.Kind]struct{}{ + reflect.Array: {}, reflect.Chan: {}, reflect.Map: {}, reflect.Ptr: {}, reflect.Slice: {}, +} + +// Checks if t is a kind that can be dereferenced to get its underlying type. +func canGetElementConfig(t reflect.Kind) bool { + _, exists := dereferencableKindsConfig[t] + return exists +} + +// This decoder hook tests types for json unmarshaling capability. If implemented, it uses json unmarshal to build the +// object. Otherwise, it'll just pass on the original data. +func jsonUnmarshalerHookConfig(_, to reflect.Type, data interface{}) (interface{}, error) { + unmarshalerType := reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if to.Implements(unmarshalerType) || reflect.PtrTo(to).Implements(unmarshalerType) || + (canGetElementConfig(to.Kind()) && to.Elem().Implements(unmarshalerType)) { + + raw, err := json.Marshal(data) + if err != nil { + fmt.Printf("Failed to marshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + res := reflect.New(to).Interface() + err = json.Unmarshal(raw, &res) + if err != nil { + fmt.Printf("Failed to umarshal Data: %v. Error: %v. Skipping jsonUnmarshalHook", data, err) + return data, nil + } + + return res, nil + } + + return data, nil +} + +func decode_Config(input, result interface{}) error { + config := &mapstructure.DecoderConfig{ + TagName: "json", + WeaklyTypedInput: true, + Result: result, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + jsonUnmarshalerHookConfig, + ), + } + + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +func join_Config(arr interface{}, sep string) string { + listValue := reflect.ValueOf(arr) + strs := make([]string, 0, listValue.Len()) + for i := 0; i < listValue.Len(); i++ { + strs = append(strs, fmt.Sprintf("%v", listValue.Index(i))) + } + + return strings.Join(strs, sep) +} + +func testDecodeJson_Config(t *testing.T, val, result interface{}) { + assert.NoError(t, decode_Config(val, result)) +} + +func testDecodeRaw_Config(t *testing.T, vStringSlice, result interface{}) { + assert.NoError(t, decode_Config(vStringSlice, result)) +} + +func TestConfig_GetPFlagSet(t *testing.T) { + val := Config{} + cmdFlags := val.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) +} + +func TestConfig_SetFlags(t *testing.T) { + actual := Config{} + cmdFlags := actual.GetPFlagSet("") + assert.True(t, cmdFlags.HasFlags()) + + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) +} diff --git a/flytectl/cmd/config/subcommand/docker/docker_config.go b/flytectl/cmd/config/subcommand/docker/docker_config.go new file mode 100644 index 0000000000..17d8c78157 --- /dev/null +++ b/flytectl/cmd/config/subcommand/docker/docker_config.go @@ -0,0 +1,13 @@ +package docker + +//go:generate pflags Config --default-var DefaultConfig --bind-default-var +var ( + DefaultConfig = &Config{ + Force: false, + } +) + +// Configs +type Config struct { + Force bool `json:"force" pflag:",Optional. Forcefully delete existing sandbox cluster if it exists."` +} diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags.go b/flytectl/cmd/config/subcommand/sandbox/config_flags.go index 39b9ba1ba1..32e1423057 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags.go @@ -61,5 +61,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&DefaultConfig.ImagePullOptions.Platform, fmt.Sprintf("%v%v", prefix, "imagePullOptions.platform"), DefaultConfig.ImagePullOptions.Platform, "Forces a specific platform's image to be pulled.'") cmdFlags.BoolVar(&DefaultConfig.Dev, fmt.Sprintf("%v%v", prefix, "dev"), DefaultConfig.Dev, "Optional. Only start minio and postgres in the sandbox.") cmdFlags.BoolVar(&DefaultConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), DefaultConfig.DryRun, "Optional. Only print the docker commands to bring up flyte sandbox/demo container.This will still call github api's to get the latest flyte release to use'") + cmdFlags.BoolVar(&DefaultConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), DefaultConfig.Force, "Optional. Forcefully delete existing sandbox cluster if it exists.") return cmdFlags } diff --git a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go index 37e2fc2ab7..8519a75583 100755 --- a/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go +++ b/flytectl/cmd/config/subcommand/sandbox/config_flags_test.go @@ -251,4 +251,18 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_force", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("force", testValue) + if vBool, err := cmdFlags.GetBool("force"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vBool), &actual.Force) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go index b1fa698541..f566de0118 100644 --- a/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go +++ b/flytectl/cmd/config/subcommand/sandbox/sandbox_config.go @@ -34,6 +34,8 @@ type Config struct { // It's used for development. Users are able to start flyte locally via single binary and save the data to the minio or postgres in the sandbox. Dev bool `json:"dev" pflag:",Optional. Only start minio and postgres in the sandbox."` DryRun bool `json:"dryRun" pflag:",Optional. Only print the docker commands to bring up flyte sandbox/demo container.This will still call github api's to get the latest flyte release to use'"` + + Force bool `json:"force" pflag:",Optional. Forcefully delete existing sandbox cluster if it exists."` } //go:generate pflags Config --default-var DefaultConfig --bind-default-var diff --git a/flytectl/pkg/docker/docker_config.go b/flytectl/pkg/docker/docker_config.go new file mode 100644 index 0000000000..a3453d8012 --- /dev/null +++ b/flytectl/pkg/docker/docker_config.go @@ -0,0 +1,12 @@ +package docker + +// Config holds configuration flags for docker command. +var ( + DefaultConfig = &Config{ + Force: false, + } +) + +type Config struct { + Force bool `json:"force" pflag:",Optional. Forcefully delete existing sandbox cluster if it exists."` +} diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index a4e768bb9b..77475f8667 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -12,8 +12,6 @@ import ( "github.com/docker/docker/client" "github.com/enescakir/emoji" - "github.com/flyteorg/flytectl/clierrors" - "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/filters" @@ -21,6 +19,8 @@ import ( "github.com/docker/docker/api/types/volume" "github.com/docker/docker/pkg/stdcopy" "github.com/docker/go-connections/nat" + "github.com/flyteorg/flytectl/clierrors" + "github.com/flyteorg/flytectl/cmd/config/subcommand/docker" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" f "github.com/flyteorg/flytectl/pkg/filesystemutils" ) @@ -93,8 +93,9 @@ func RemoveSandbox(ctx context.Context, cli Docker, reader io.Reader) error { if err != nil { return err } + if c != nil { - if cmdUtil.AskForConfirmation("delete existing sandbox cluster", reader) { + if docker.DefaultConfig.Force || cmdUtil.AskForConfirmation("delete existing sandbox cluster", reader) { err := cli.ContainerRemove(context.Background(), c.ID, types.ContainerRemoveOptions{ Force: true, }) diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 83e5bc9703..32ad1cda12 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -21,6 +21,7 @@ import ( "github.com/stretchr/testify/mock" "github.com/docker/docker/api/types" + "github.com/flyteorg/flytectl/cmd/config/subcommand/docker" "github.com/stretchr/testify/assert" ) @@ -88,6 +89,10 @@ func TestRemoveSandboxWithNoReply(t *testing.T) { mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(nil) err := RemoveSandbox(ctx, mockDocker, strings.NewReader("n")) assert.NotNil(t, err) + + docker.DefaultConfig.Force = true + err = RemoveSandbox(ctx, mockDocker, strings.NewReader("")) + assert.Nil(t, err) }) t.Run("Successfully remove sandbox container with zero sandbox containers are running", func(t *testing.T) { diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index 7a9551804b..6fb649ab7b 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -14,6 +14,7 @@ import ( "github.com/docker/go-connections/nat" "github.com/enescakir/emoji" "github.com/flyteorg/flytectl/clierrors" + dockerCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/docker" sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" "github.com/flyteorg/flytectl/pkg/configutil" "github.com/flyteorg/flytectl/pkg/docker" @@ -157,6 +158,7 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService if sandboxConfig.DryRun { docker.PrintRemoveContainer(docker.FlyteSandboxClusterName) } else { + dockerCmdConfig.DefaultConfig.Force = sandboxConfig.Force if err := docker.RemoveSandbox(ctx, cli, reader); err != nil { if err.Error() != clierrors.ErrSandboxExists { return nil, err From 2657b262aaf26b7121be21e2b7b277dafdf26969 Mon Sep 17 00:00:00 2001 From: Honnix Date: Thu, 19 Oct 2023 08:03:25 +0200 Subject: [PATCH 325/645] Fix struct generation in execution file (#434) --- flytectl/cmd/get/execution_util.go | 11 ++++- flytectl/cmd/get/launch_plan_test.go | 66 ++++++++++++++++++++++++---- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/flytectl/cmd/get/execution_util.go b/flytectl/cmd/get/execution_util.go index 2397ee2ff8..bb460180af 100644 --- a/flytectl/cmd/get/execution_util.go +++ b/flytectl/cmd/get/execution_util.go @@ -6,6 +6,8 @@ import ( "io/ioutil" "os" + structpb "github.com/golang/protobuf/ptypes/struct" + "gopkg.in/yaml.v3" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" @@ -152,7 +154,14 @@ func ParamMapForWorkflow(lp *admin.LaunchPlan) (map[string]yaml.Node, error) { func getCommentedYamlNode(input interface{}, comment string) (yaml.Node, error) { var node yaml.Node - err := node.Encode(input) + var err error + + if s, ok := input.(*structpb.Struct); ok { + err = node.Encode(s.AsMap()) + } else { + err = node.Encode(input) + } + node.LineComment = comment return node, err } diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index 4055b72376..6e8618987e 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -5,6 +5,8 @@ import ( "os" "testing" + structpb "github.com/golang/protobuf/ptypes/struct" + "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/printer" @@ -88,6 +90,31 @@ func getLaunchPlanSetup() { }, }, }, + "generic": { + Var: &core.Variable{ + Type: &core.LiteralType{ + Type: &core.LiteralType_Simple{ + Simple: core.SimpleType_STRUCT, + }, + }, + Description: "generic", + }, + Behavior: &core.Parameter_Default{ + Default: &core.Literal{ + Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Generic{ + Generic: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "foo": {Kind: &structpb.Value_StringValue{StringValue: "foo"}}, + }, + }, + }, + }, + }, + }, + }, + }, } launchPlan1 := &admin.LaunchPlan{ Id: &core.Identifier{ @@ -258,7 +285,7 @@ func TestGetLaunchPlanFunc(t *testing.T) { err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchAllVerOfLP", s.Ctx, "launchplan1", "dummyProject", "dummyDomain", launchplan.DefaultConfig.Filter) - s.TearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + s.TearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) } func TestGetLaunchPlanFuncLatest(t *testing.T) { @@ -270,7 +297,7 @@ func TestGetLaunchPlanFuncLatest(t *testing.T) { err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchLPLatestVersion", s.Ctx, "launchplan1", projectValue, domainValue, launchplan.DefaultConfig.Filter) - s.TearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + s.TearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlanWithVersion(t *testing.T) { @@ -281,7 +308,7 @@ func TestGetLaunchPlanWithVersion(t *testing.T) { err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) s.FetcherExt.AssertCalled(t, "FetchLPVersion", s.Ctx, "launchplan1", "v2", "dummyProject", "dummyDomain") - s.TearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + s.TearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlans(t *testing.T) { @@ -292,7 +319,7 @@ func TestGetLaunchPlans(t *testing.T) { argsLp = []string{} err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - s.TearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + s.TearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) }) t.Run("workflow filter", func(t *testing.T) { s := setup() @@ -304,7 +331,7 @@ func TestGetLaunchPlans(t *testing.T) { launchplan.DefaultConfig.Workflow = "workflow2" err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) assert.Nil(t, err) - s.TearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) + s.TearDownAndVerify(t, `[{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}},{"id": {"name": "launchplan1","version": "v1"},"spec": {"workflowId": {"name": "workflow1"},"defaultInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:00Z"}}]`) }) t.Run("workflow filter error", func(t *testing.T) { s := setup() @@ -328,10 +355,29 @@ func TestGetLaunchPlansWithExecFile(t *testing.T) { launchplan.DefaultConfig.Version = "v2" launchplan.DefaultConfig.ExecFile = testDataFolder + "exec_file" err := getLaunchPlanFunc(s.Ctx, argsLp, s.CmdCtx) - os.Remove(launchplan.DefaultConfig.ExecFile) assert.Nil(t, err) + + data, err := os.ReadFile(launchplan.DefaultConfig.ExecFile) + assert.Nil(t, err) + assert.Equal(t, `iamRoleARN: "" +inputs: + generic: + foo: foo + numbers: + - 0 + numbers_count: 0 # long description will be truncated in table + run_local_at_count: 10 # short desc +envs: {} +kubeServiceAcct: "" +targetDomain: "" +targetProject: "" +version: v2 +workflow: launchplan1 +`, string(data)) + os.Remove(launchplan.DefaultConfig.ExecFile) + s.FetcherExt.AssertCalled(t, "FetchLPVersion", s.Ctx, "launchplan1", "v2", "dummyProject", "dummyDomain") - s.TearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) + s.TearDownAndVerify(t, `{"id": {"name": "launchplan1","version": "v2"},"spec": {"workflowId": {"name": "workflow2"},"defaultInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}}},"closure": {"expectedInputs": {"parameters": {"generic": {"var": {"type": {"simple": "STRUCT"},"description": "generic"},"default": {"scalar": {"generic": {"foo": "foo"}}}},"numbers": {"var": {"type": {"collectionType": {"simple": "INTEGER"}},"description": "short desc"}},"numbers_count": {"var": {"type": {"simple": "INTEGER"},"description": "long description will be truncated in table"}},"run_local_at_count": {"var": {"type": {"simple": "INTEGER"},"description": "run_local_at_count"},"default": {"scalar": {"primitive": {"integer": "10"}}}}}},"createdAt": "1970-01-01T00:00:01Z"}}`) } func TestGetLaunchPlanTableFunc(t *testing.T) { @@ -349,11 +395,13 @@ func TestGetLaunchPlanTableFunc(t *testing.T) { --------- ------------- ------ ------- ---------- --------------------------- --------- | VERSION | NAME | TYPE | STATE | SCHEDULE | INPUTS | OUTPUTS | --------- ------------- ------ ------- ---------- --------------------------- --------- -| v2 | launchplan1 | | | | numbers: short desc | | +| v2 | launchplan1 | | | | generic | | +| | | | | | numbers: short desc | | | | | | | | numbers_count: long de... | | | | | | | | run_local_at_count | | --------- ------------- ------ ------- ---------- --------------------------- --------- -| v1 | launchplan1 | | | | numbers: short desc | | +| v1 | launchplan1 | | | | generic | | +| | | | | | numbers: short desc | | | | | | | | numbers_count: long de... | | | | | | | | run_local_at_count | | --------- ------------- ------ ------- ---------- --------------------------- --------- From 7c9cf48f9238a1874aac640efe6615e13ea5da49 Mon Sep 17 00:00:00 2001 From: Honnix Date: Mon, 23 Oct 2023 22:25:58 +0200 Subject: [PATCH 326/645] Use proto file name to infer message type (#436) Signed-off-by: Hongxin Liang --- flytectl/cmd/register/register_util.go | 75 +++++++++++++++++++------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 87d8be43db..18ecede8ba 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -92,37 +92,74 @@ var projectColumns = []printer.Column{ {Header: "Additional Info", JSONPath: "$.Info"}, } +// Regex to match file name like xxx_1.pb, xxx_2.pb, or xxx_3.pb, and the subgroup catches the number 1, 2 or 3 +// This is used to match proto files created by pyflyte, where xxx_1.pb is a task spec, xxx_2.pb is a workflow spec, and xxx_3.pb is launch plan +var fnameRegex = regexp.MustCompile(`^.*_(?P[1-3])\.pb$`) + +type unMarshalFunc = func(ctx context.Context, fileContents []byte, fname string, errCollection errors2.ErrorCollection) (proto.Message, error) + +// Order matters here +var unMarshalFuncs = []unMarshalFunc{ + unMarshalTask, + unMarshalWorkflow, + unMarshalLaunchPlan, +} + func UnMarshalContents(ctx context.Context, fileContents []byte, fname string) (proto.Message, error) { - workflowSpec := &admin.WorkflowSpec{} errCollection := errors2.ErrorCollection{} - err := proto.Unmarshal(fileContents, workflowSpec) - if err == nil { - return workflowSpec, nil + + for _, f := range reorderUnMarshalFuncs(fname) { + if m, err := f(ctx, fileContents, fname, errCollection); err == nil { + return m, nil + } } - errCollection.Append(fmt.Errorf("as a Workflow: %w", err)) + return nil, fmt.Errorf("failed unmarshalling file %v. Errors: %w", fname, errCollection.ErrorOrDefault()) +} - logger.Debugf(ctx, "Failed to unmarshal file %v for workflow type", fname) - taskSpec := &admin.TaskSpec{} - err = proto.Unmarshal(fileContents, taskSpec) - if err == nil { - return taskSpec, nil - } +func unMarshalTask(ctx context.Context, fileContents []byte, fname string, errCollection errors2.ErrorCollection) (proto.Message, error) { + return unMarshal(ctx, fileContents, fname, errCollection, "Task", "task", &admin.TaskSpec{}) +} - errCollection.Append(fmt.Errorf("as a Task: %w", err)) +func unMarshalWorkflow(ctx context.Context, fileContents []byte, fname string, errCollection errors2.ErrorCollection) (proto.Message, error) { + return unMarshal(ctx, fileContents, fname, errCollection, "Workflow", "workflow", &admin.WorkflowSpec{}) +} + +func unMarshalLaunchPlan(ctx context.Context, fileContents []byte, fname string, errCollection errors2.ErrorCollection) (proto.Message, error) { + return unMarshal(ctx, fileContents, fname, errCollection, "Launchplan", "launch plan", &admin.LaunchPlan{}) +} - logger.Debugf(ctx, "Failed to unmarshal file %v for task type", fname) - launchPlan := &admin.LaunchPlan{} - err = proto.Unmarshal(fileContents, launchPlan) +func unMarshal(ctx context.Context, fileContents []byte, fname string, errCollection errors2.ErrorCollection, tpe string, typeAlt string, m proto.Message) (proto.Message, error) { + err := proto.Unmarshal(fileContents, m) if err == nil { - return launchPlan, nil + return m, nil } - errCollection.Append(fmt.Errorf("as a Launchplan: %w", err)) + errCollection.Append(fmt.Errorf("as a %s type: %w", tpe, err)) + logger.Debugf(ctx, "Failed to unmarshal file %s for %v type", fname, typeAlt) + return nil, err +} - logger.Debugf(ctx, "Failed to unmarshal file %v for launch plan type", fname) - return nil, fmt.Errorf("failed unmarshalling file %v. Errors: %w", fname, errCollection.ErrorOrDefault()) +func reorderUnMarshalFuncs(fname string) []unMarshalFunc { + if match := fnameRegex.FindStringSubmatch(fname); match != nil { + indexStr := match[fnameRegex.SubexpIndex("index")] + index, err := strconv.Atoi(indexStr) + if err != nil { + panic(fmt.Sprintf("unexpected error when coverting [%s] to int, file name [%s]", indexStr, fname)) + } + + var reordered []unMarshalFunc + for i, f := range unMarshalFuncs { + if i == index-1 { + reordered = append([]unMarshalFunc{f}, reordered...) + } else { + reordered = append(reordered, f) + } + } + return reordered + } + return unMarshalFuncs } func register(ctx context.Context, message proto.Message, cmdCtx cmdCore.CommandContext, dryRun, enableSchedule bool) error { From 65dd7f1af7945c298220bc5d9d02192444137d81 Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Mon, 23 Oct 2023 13:36:22 -0700 Subject: [PATCH 327/645] Update dependencies for Flyte monorepo migration (#429) * wowzas Signed-off-by: Katrina Rogan * group Signed-off-by: Katrina Rogan * Merge with master. Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> * merge conflicts Signed-off-by: Katrina Rogan --------- Signed-off-by: Katrina Rogan Signed-off-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> Co-authored-by: Kamal Eybov <54046807+kamaleybov@users.noreply.github.com> --- flytectl/.github/workflows/checks.yml | 3 - .../flyte/golang_support_tools/tools.go | 2 +- flytectl/cmd/compile/compile.go | 8 +- flytectl/cmd/config/config.go | 2 +- .../clusterresourceattribute/file_config.go | 2 +- .../file_config_test.go | 2 +- .../config/subcommand/config/console_flags.go | 2 +- .../executionclusterlabel/file_config.go | 2 +- .../executionclusterlabel/file_config_test.go | 2 +- .../executionqueueattribute/file_config.go | 2 +- .../file_config_test.go | 2 +- .../matchable_attribute_decorator.go | 2 +- .../subcommand/plugin_override/file_config.go | 2 +- .../plugin_override/file_config_test.go | 2 +- .../subcommand/project/project_config.go | 2 +- .../subcommand/project/project_config_test.go | 2 +- .../subcommand/register/files_config.go | 2 +- .../taskresourceattribute/file_config.go | 2 +- .../taskresourceattribute/file_config_test.go | 2 +- .../workflowexecutionconfig/file_config.go | 2 +- .../file_config_test.go | 2 +- flytectl/cmd/configuration/configuration.go | 2 +- .../cmd/configuration/configuration_test.go | 4 +- flytectl/cmd/core/cmd.go | 2 +- flytectl/cmd/core/cmd_ctx.go | 4 +- flytectl/cmd/core/cmd_test.go | 4 +- flytectl/cmd/create/execution.go | 4 +- flytectl/cmd/create/execution_test.go | 4 +- flytectl/cmd/create/execution_util.go | 6 +- flytectl/cmd/create/execution_util_test.go | 4 +- flytectl/cmd/create/project.go | 4 +- flytectl/cmd/create/project_test.go | 2 +- flytectl/cmd/create/serialization_utils.go | 4 +- .../cmd/create/serialization_utils_test.go | 2 +- flytectl/cmd/delete/execution.go | 6 +- flytectl/cmd/delete/execution_test.go | 4 +- .../cmd/delete/matchable_attribute_util.go | 2 +- .../matchable_cluster_resource_attribute.go | 2 +- ...tchable_cluster_resource_attribute_test.go | 2 +- .../matchable_execution_cluster_label.go | 2 +- .../matchable_execution_cluster_label_test.go | 2 +- .../matchable_execution_queue_attribute.go | 2 +- ...atchable_execution_queue_attribute_test.go | 2 +- .../cmd/delete/matchable_plugin_override.go | 2 +- .../delete/matchable_plugin_override_test.go | 2 +- .../matchable_task_resource_attribute.go | 2 +- .../matchable_task_resource_attribute_test.go | 2 +- .../matchable_workflow_execution_config.go | 2 +- ...atchable_workflow_execution_config_test.go | 2 +- flytectl/cmd/demo/exec_test.go | 2 +- flytectl/cmd/demo/reload.go | 2 +- flytectl/cmd/get/execution.go | 4 +- flytectl/cmd/get/execution_test.go | 4 +- flytectl/cmd/get/execution_util.go | 6 +- flytectl/cmd/get/execution_util_test.go | 4 +- flytectl/cmd/get/launch_plan.go | 4 +- flytectl/cmd/get/launch_plan_test.go | 4 +- flytectl/cmd/get/matchable_attribute_util.go | 2 +- .../matchable_cluster_resource_attribute.go | 2 +- ...tchable_cluster_resource_attribute_test.go | 2 +- .../get/matchable_execution_cluster_label.go | 2 +- .../matchable_execution_cluster_label_test.go | 2 +- .../matchable_execution_queue_attribute.go | 2 +- ...atchable_execution_queue_attribute_test.go | 2 +- flytectl/cmd/get/matchable_plugin_override.go | 2 +- .../cmd/get/matchable_plugin_override_test.go | 2 +- .../get/matchable_task_resource_attribute.go | 2 +- .../matchable_task_resource_attribute_test.go | 2 +- .../matchable_workflow_execution_config.go | 4 +- ...atchable_workflow_execution_config_test.go | 2 +- flytectl/cmd/get/node_execution.go | 6 +- flytectl/cmd/get/node_execution_test.go | 6 +- flytectl/cmd/get/project.go | 4 +- flytectl/cmd/get/project_test.go | 2 +- flytectl/cmd/get/task.go | 4 +- flytectl/cmd/get/task_test.go | 4 +- flytectl/cmd/get/workflow.go | 4 +- flytectl/cmd/get/workflow_test.go | 4 +- flytectl/cmd/register/examples.go | 2 +- flytectl/cmd/register/files.go | 4 +- flytectl/cmd/register/files_test.go | 12 +- flytectl/cmd/register/register_util.go | 20 +- flytectl/cmd/register/register_util_test.go | 18 +- flytectl/cmd/root.go | 4 +- flytectl/cmd/sandbox/exec_test.go | 2 +- flytectl/cmd/testutils/test_utils.go | 4 +- flytectl/cmd/update/execution.go | 4 +- flytectl/cmd/update/execution_test.go | 4 +- .../cmd/update/interfaces/mocks/updater.go | 2 +- flytectl/cmd/update/interfaces/updater.go | 2 +- flytectl/cmd/update/launch_plan.go | 4 +- flytectl/cmd/update/launch_plan_meta.go | 2 +- flytectl/cmd/update/launch_plan_meta_test.go | 4 +- flytectl/cmd/update/launch_plan_test.go | 4 +- .../cmd/update/matchable_attribute_util.go | 2 +- .../matchable_cluster_resource_attribute.go | 2 +- ...tchable_cluster_resource_attribute_test.go | 2 +- .../matchable_execution_cluster_label.go | 2 +- .../matchable_execution_cluster_label_test.go | 2 +- .../matchable_execution_queue_attribute.go | 2 +- ...atchable_execution_queue_attribute_test.go | 2 +- .../cmd/update/matchable_plugin_override.go | 2 +- .../update/matchable_plugin_override_test.go | 2 +- .../matchable_task_resource_attribute.go | 2 +- .../matchable_task_resource_attribute_test.go | 2 +- .../matchable_workflow_execution_config.go | 2 +- ...atchable_workflow_execution_config_test.go | 2 +- flytectl/cmd/update/named_entity.go | 4 +- flytectl/cmd/update/named_entity_test.go | 4 +- flytectl/cmd/update/project.go | 2 +- flytectl/cmd/update/project_test.go | 2 +- flytectl/cmd/update/task_meta.go | 2 +- flytectl/cmd/update/task_meta_test.go | 4 +- flytectl/cmd/update/workflow_meta.go | 2 +- flytectl/cmd/update/workflow_meta_test.go | 4 +- flytectl/cmd/upgrade/upgrade.go | 4 +- flytectl/cmd/upgrade/upgrade_test.go | 2 +- flytectl/cmd/version/version.go | 6 +- flytectl/cmd/version/version_test.go | 8 +- flytectl/docs/source/gen/flytectl_config.rst | 2 +- flytectl/go.mod | 108 ++- flytectl/go.sum | 784 +++--------------- flytectl/main.go | 2 +- flytectl/pkg/adminutils/config.go | 2 +- .../pkg/ext/attribute_match_deleter_test.go | 4 +- flytectl/pkg/ext/attribute_match_fetcher.go | 2 +- .../pkg/ext/attribute_match_fetcher_test.go | 4 +- flytectl/pkg/ext/attribute_match_updater.go | 2 +- .../pkg/ext/attribute_match_updater_test.go | 4 +- flytectl/pkg/ext/attribute_matcher_deleter.go | 2 +- flytectl/pkg/ext/deleter.go | 4 +- flytectl/pkg/ext/deleter_test.go | 2 +- flytectl/pkg/ext/execution_fetcher.go | 4 +- flytectl/pkg/ext/execution_fetcher_test.go | 6 +- flytectl/pkg/ext/fetcher.go | 4 +- flytectl/pkg/ext/fetcher_test.go | 2 +- flytectl/pkg/ext/launch_plan_fetcher.go | 4 +- flytectl/pkg/ext/launch_plan_fetcher_test.go | 6 +- .../ext/mocks/admin_deleter_ext_interface.go | 4 +- .../ext/mocks/admin_fetcher_ext_interface.go | 4 +- .../admin_service_fetcher_ext_interface.go | 4 +- .../ext/mocks/admin_updater_ext_interface.go | 4 +- flytectl/pkg/ext/project_fetcher.go | 2 +- flytectl/pkg/ext/project_fetcher_test.go | 4 +- flytectl/pkg/ext/task_fetcher.go | 4 +- flytectl/pkg/ext/task_fetcher_test.go | 6 +- flytectl/pkg/ext/updater.go | 4 +- flytectl/pkg/ext/updater_test.go | 2 +- flytectl/pkg/ext/workflow_fetcher.go | 4 +- flytectl/pkg/ext/workflow_fetcher_test.go | 6 +- flytectl/pkg/filters/util.go | 4 +- flytectl/pkg/filters/util_test.go | 2 +- flytectl/pkg/github/githubutil.go | 4 +- flytectl/pkg/github/githubutil_test.go | 2 +- flytectl/pkg/k8s/k8s_test.go | 2 +- flytectl/pkg/printer/printer.go | 6 +- flytectl/pkg/printer/printer_test.go | 4 +- flytectl/pkg/sandbox/start.go | 2 +- flytectl/pkg/visualize/graphviz.go | 4 +- flytectl/pkg/visualize/graphviz_test.go | 2 +- 160 files changed, 455 insertions(+), 958 deletions(-) diff --git a/flytectl/.github/workflows/checks.yml b/flytectl/.github/workflows/checks.yml index 2a66200dac..d7d36c4b18 100644 --- a/flytectl/.github/workflows/checks.yml +++ b/flytectl/.github/workflows/checks.yml @@ -143,9 +143,6 @@ jobs: - Auto-generated by [flyte-bot] labels: | documentation - team-reviewers: | - owners - maintainers draft: false goreleaser: diff --git a/flytectl/boilerplate/flyte/golang_support_tools/tools.go b/flytectl/boilerplate/flyte/golang_support_tools/tools.go index 43de03450c..a78b61162a 100644 --- a/flytectl/boilerplate/flyte/golang_support_tools/tools.go +++ b/flytectl/boilerplate/flyte/golang_support_tools/tools.go @@ -6,7 +6,7 @@ package tools import ( _ "github.com/EngHabu/mockery/cmd/mockery" _ "github.com/alvaroloes/enumer" - _ "github.com/flyteorg/flytestdlib/cli/pflags" + _ "github.com/flyteorg/flyte/flytestdlib/cli/pflags" _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" ) diff --git a/flytectl/cmd/compile/compile.go b/flytectl/cmd/compile/compile.go index f8f6957b10..035ea786e5 100644 --- a/flytectl/cmd/compile/compile.go +++ b/flytectl/cmd/compile/compile.go @@ -6,13 +6,13 @@ import ( "io/ioutil" "os" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flytepropeller/pkg/compiler" + "github.com/flyteorg/flyte/flytepropeller/pkg/compiler/common" config "github.com/flyteorg/flytectl/cmd/config/subcommand/compile" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/register" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flytepropeller/pkg/compiler" - "github.com/flyteorg/flytepropeller/pkg/compiler/common" ) // Utility function for compiling a list of Tasks diff --git a/flytectl/cmd/config/config.go b/flytectl/cmd/config/config.go index 0283313f24..8bf5cc986b 100644 --- a/flytectl/cmd/config/config.go +++ b/flytectl/cmd/config/config.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/flyteorg/flytestdlib/config" + "github.com/flyteorg/flyte/flytestdlib/config" "github.com/flyteorg/flytectl/pkg/printer" ) diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config.go index 5bfece378d..1e9543981d 100644 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config.go @@ -1,7 +1,7 @@ package clusterresourceattribute import ( - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) // AttrFileConfig shadow Config for ClusterResourceAttributes. diff --git a/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config_test.go b/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config_test.go index f9510c7d07..92b791cf0a 100644 --- a/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config_test.go +++ b/flytectl/cmd/config/subcommand/clusterresourceattribute/file_config_test.go @@ -3,7 +3,7 @@ package clusterresourceattribute import ( "testing" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/config/subcommand/config/console_flags.go b/flytectl/cmd/config/subcommand/config/console_flags.go index f980b3ce2f..168aca95c2 100644 --- a/flytectl/cmd/config/subcommand/config/console_flags.go +++ b/flytectl/cmd/config/subcommand/config/console_flags.go @@ -1,6 +1,6 @@ package config -import "github.com/flyteorg/flytestdlib/config" +import "github.com/flyteorg/flyte/flytestdlib/config" //go:generate pflags ConsoleConfig --default-var DefaultConsoleConfig --bind-default-var diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/file_config.go b/flytectl/cmd/config/subcommand/executionclusterlabel/file_config.go index c05c6ca167..39dfc2b570 100644 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/file_config.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/file_config.go @@ -1,7 +1,7 @@ package executionclusterlabel import ( - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) // FileConfig shadow Config for ExecutionClusterLabel. diff --git a/flytectl/cmd/config/subcommand/executionclusterlabel/file_config_test.go b/flytectl/cmd/config/subcommand/executionclusterlabel/file_config_test.go index 662f6658a4..79ea059930 100644 --- a/flytectl/cmd/config/subcommand/executionclusterlabel/file_config_test.go +++ b/flytectl/cmd/config/subcommand/executionclusterlabel/file_config_test.go @@ -3,7 +3,7 @@ package executionclusterlabel import ( "testing" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/file_config.go b/flytectl/cmd/config/subcommand/executionqueueattribute/file_config.go index 1726f0b693..cd538da67b 100644 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/file_config.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/file_config.go @@ -1,7 +1,7 @@ package executionqueueattribute import ( - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) // AttrFileConfig shadow Config for ExecutionQueueAttributes. diff --git a/flytectl/cmd/config/subcommand/executionqueueattribute/file_config_test.go b/flytectl/cmd/config/subcommand/executionqueueattribute/file_config_test.go index 8148d8b7cd..191cabb023 100644 --- a/flytectl/cmd/config/subcommand/executionqueueattribute/file_config_test.go +++ b/flytectl/cmd/config/subcommand/executionqueueattribute/file_config_test.go @@ -3,7 +3,7 @@ package executionqueueattribute import ( "testing" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/config/subcommand/matchable_attribute_decorator.go b/flytectl/cmd/config/subcommand/matchable_attribute_decorator.go index 728be8582f..9e6aadfa67 100644 --- a/flytectl/cmd/config/subcommand/matchable_attribute_decorator.go +++ b/flytectl/cmd/config/subcommand/matchable_attribute_decorator.go @@ -1,6 +1,6 @@ package subcommand -import "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" +import "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" // MatchableAttributeDecorator defines a decorator for any matchable attribute target. type MatchableAttributeDecorator interface { diff --git a/flytectl/cmd/config/subcommand/plugin_override/file_config.go b/flytectl/cmd/config/subcommand/plugin_override/file_config.go index af40066dd4..15349c83e7 100644 --- a/flytectl/cmd/config/subcommand/plugin_override/file_config.go +++ b/flytectl/cmd/config/subcommand/plugin_override/file_config.go @@ -1,7 +1,7 @@ package pluginoverride import ( - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) // FileConfig shadow Config for PluginOverrides. diff --git a/flytectl/cmd/config/subcommand/plugin_override/file_config_test.go b/flytectl/cmd/config/subcommand/plugin_override/file_config_test.go index e2ecaa5d06..13037945af 100644 --- a/flytectl/cmd/config/subcommand/plugin_override/file_config_test.go +++ b/flytectl/cmd/config/subcommand/plugin_override/file_config_test.go @@ -3,7 +3,7 @@ package pluginoverride import ( "testing" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/config/subcommand/project/project_config.go b/flytectl/cmd/config/subcommand/project/project_config.go index c278443f16..794f661df9 100644 --- a/flytectl/cmd/config/subcommand/project/project_config.go +++ b/flytectl/cmd/config/subcommand/project/project_config.go @@ -4,10 +4,10 @@ import ( "fmt" "io/ioutil" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "gopkg.in/yaml.v3" ) diff --git a/flytectl/cmd/config/subcommand/project/project_config_test.go b/flytectl/cmd/config/subcommand/project/project_config_test.go index b02daa4972..69a8bf4acb 100644 --- a/flytectl/cmd/config/subcommand/project/project_config_test.go +++ b/flytectl/cmd/config/subcommand/project/project_config_test.go @@ -4,9 +4,9 @@ import ( "errors" "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/config/subcommand/register/files_config.go b/flytectl/cmd/config/subcommand/register/files_config.go index 3a54203478..c1441d0567 100644 --- a/flytectl/cmd/config/subcommand/register/files_config.go +++ b/flytectl/cmd/config/subcommand/register/files_config.go @@ -1,6 +1,6 @@ package register -import "github.com/flyteorg/flytestdlib/config" +import "github.com/flyteorg/flyte/flytestdlib/config" //go:generate pflags FilesConfig --default-var DefaultFilesConfig --bind-default-var diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/file_config.go b/flytectl/cmd/config/subcommand/taskresourceattribute/file_config.go index 6c31553f87..9629a71ee5 100644 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/file_config.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/file_config.go @@ -1,7 +1,7 @@ package taskresourceattribute import ( - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) // TaskResourceAttrFileConfig shadow Config for TaskResourceAttribute. diff --git a/flytectl/cmd/config/subcommand/taskresourceattribute/file_config_test.go b/flytectl/cmd/config/subcommand/taskresourceattribute/file_config_test.go index 73b2248985..cba5ea672b 100644 --- a/flytectl/cmd/config/subcommand/taskresourceattribute/file_config_test.go +++ b/flytectl/cmd/config/subcommand/taskresourceattribute/file_config_test.go @@ -3,7 +3,7 @@ package taskresourceattribute import ( "testing" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config.go index 9dc6b01ed5..33ef8e1677 100644 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config.go @@ -1,7 +1,7 @@ package workflowexecutionconfig import ( - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) // FileConfig shadow Config for WorkflowExecutionConfig. diff --git a/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config_test.go b/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config_test.go index b6b8cfd840..45454f4536 100644 --- a/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config_test.go +++ b/flytectl/cmd/config/subcommand/workflowexecutionconfig/file_config_test.go @@ -3,7 +3,7 @@ package workflowexecutionconfig import ( "testing" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index e6d120b1bb..7f06f92094 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -12,10 +12,10 @@ import ( "github.com/flyteorg/flytectl/pkg/configutil" + "github.com/flyteorg/flyte/flytestdlib/config/viper" initConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/config" cmdcore "github.com/flyteorg/flytectl/cmd/core" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" - "github.com/flyteorg/flytestdlib/config/viper" "github.com/go-ozzo/ozzo-validation/v4/is" "github.com/spf13/cobra" ) diff --git a/flytectl/cmd/configuration/configuration_test.go b/flytectl/cmd/configuration/configuration_test.go index 2f48d28597..f48fe84e2f 100644 --- a/flytectl/cmd/configuration/configuration_test.go +++ b/flytectl/cmd/configuration/configuration_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - admin2 "github.com/flyteorg/flyteidl/clients/go/admin" + admin2 "github.com/flyteorg/flyte/flyteidl/clients/go/admin" "github.com/flyteorg/flytectl/pkg/configutil" @@ -35,7 +35,7 @@ func TestCreateInitCommand(t *testing.T) { assert.Equal(t, "discover", cmdNouns[0].Use) assert.Equal(t, "Searches for a config in one of the default search paths.", cmdNouns[0].Short) assert.Equal(t, "docs", cmdNouns[1].Use) - assert.Equal(t, "Generate configuration documetation in rst format", cmdNouns[1].Short) + assert.Equal(t, "Generate configuration documentation in rst format", cmdNouns[1].Short) assert.Equal(t, "init", cmdNouns[2].Use) assert.Equal(t, initCmdShort, cmdNouns[2].Short) diff --git a/flytectl/cmd/core/cmd.go b/flytectl/cmd/core/cmd.go index a6f7c391df..2d00adc04e 100644 --- a/flytectl/cmd/core/cmd.go +++ b/flytectl/cmd/core/cmd.go @@ -8,9 +8,9 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/pkg/pkce" - "github.com/flyteorg/flyteidl/clients/go/admin" "github.com/spf13/cobra" "github.com/spf13/pflag" diff --git a/flytectl/cmd/core/cmd_ctx.go b/flytectl/cmd/core/cmd_ctx.go index f5cd095c4f..d492c53c4a 100644 --- a/flytectl/cmd/core/cmd_ctx.go +++ b/flytectl/cmd/core/cmd_ctx.go @@ -3,10 +3,10 @@ package cmdcore import ( "io" - "github.com/flyteorg/flyteidl/clients/go/admin" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" ) type CommandContext struct { diff --git a/flytectl/cmd/core/cmd_test.go b/flytectl/cmd/core/cmd_test.go index 7ed13743a9..13737b4a61 100644 --- a/flytectl/cmd/core/cmd_test.go +++ b/flytectl/cmd/core/cmd_test.go @@ -5,8 +5,8 @@ import ( "net/url" "testing" - "github.com/flyteorg/flyteidl/clients/go/admin" - "github.com/flyteorg/flytestdlib/config" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin" + "github.com/flyteorg/flyte/flytestdlib/config" "github.com/spf13/cobra" "github.com/stretchr/testify/assert" diff --git a/flytectl/cmd/create/execution.go b/flytectl/cmd/create/execution.go index 839fa6e34e..7fc62f2045 100644 --- a/flytectl/cmd/create/execution.go +++ b/flytectl/cmd/create/execution.go @@ -4,8 +4,8 @@ import ( "context" "fmt" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" diff --git a/flytectl/cmd/create/execution_test.go b/flytectl/cmd/create/execution_test.go index 6f25bab3cc..ee5dc268ef 100644 --- a/flytectl/cmd/create/execution_test.go +++ b/flytectl/cmd/create/execution_test.go @@ -9,8 +9,8 @@ import ( "github.com/stretchr/testify/suite" "google.golang.org/protobuf/types/known/timestamppb" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" diff --git a/flytectl/cmd/create/execution_util.go b/flytectl/cmd/create/execution_util.go index ea67980004..63b6fe0871 100644 --- a/flytectl/cmd/create/execution_util.go +++ b/flytectl/cmd/create/execution_util.go @@ -6,9 +6,9 @@ import ( "io/ioutil" "strings" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flytestdlib/logger" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/google/uuid" "sigs.k8s.io/yaml" diff --git a/flytectl/cmd/create/execution_util_test.go b/flytectl/cmd/create/execution_util_test.go index bbfeccdc56..a865e77a64 100644 --- a/flytectl/cmd/create/execution_util_test.go +++ b/flytectl/cmd/create/execution_util_test.go @@ -5,8 +5,8 @@ import ( "fmt" "testing" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/config" diff --git a/flytectl/cmd/create/project.go b/flytectl/cmd/create/project.go index c6db389d05..bf4e70c09e 100644 --- a/flytectl/cmd/create/project.go +++ b/flytectl/cmd/create/project.go @@ -4,13 +4,13 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flytestdlib/logger" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytestdlib/logger" ) const ( diff --git a/flytectl/cmd/create/project_test.go b/flytectl/cmd/create/project_test.go index f0263bc461..a1f970e26b 100644 --- a/flytectl/cmd/create/project_test.go +++ b/flytectl/cmd/create/project_test.go @@ -10,7 +10,7 @@ import ( "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/create/serialization_utils.go b/flytectl/cmd/create/serialization_utils.go index 53045d2c9e..dfd772c604 100644 --- a/flytectl/cmd/create/serialization_utils.go +++ b/flytectl/cmd/create/serialization_utils.go @@ -3,8 +3,8 @@ package create import ( "fmt" - "github.com/flyteorg/flyteidl/clients/go/coreutils" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/clients/go/coreutils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" ) // TODO: Move all functions to flyteidl diff --git a/flytectl/cmd/create/serialization_utils_test.go b/flytectl/cmd/create/serialization_utils_test.go index 5c7326493d..7b10cf1b7c 100644 --- a/flytectl/cmd/create/serialization_utils_test.go +++ b/flytectl/cmd/create/serialization_utils_test.go @@ -3,7 +3,7 @@ package create import ( "testing" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/delete/execution.go b/flytectl/cmd/delete/execution.go index fab4cbe5d0..5d2e0ff421 100644 --- a/flytectl/cmd/delete/execution.go +++ b/flytectl/cmd/delete/execution.go @@ -3,12 +3,12 @@ package delete import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flytestdlib/logger" ) // Long descriptions are whitespace sensitive when generating docs using Sphinx. diff --git a/flytectl/cmd/delete/execution_test.go b/flytectl/cmd/delete/execution_test.go index 09d8a0e05d..63643a2c47 100644 --- a/flytectl/cmd/delete/execution_test.go +++ b/flytectl/cmd/delete/execution_test.go @@ -4,9 +4,9 @@ import ( "errors" "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/delete/matchable_attribute_util.go b/flytectl/cmd/delete/matchable_attribute_util.go index 020a60968d..63c018cbd3 100644 --- a/flytectl/cmd/delete/matchable_attribute_util.go +++ b/flytectl/cmd/delete/matchable_attribute_util.go @@ -4,8 +4,8 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) func deleteMatchableAttr(ctx context.Context, project, domain, workflowName string, diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go index 2f3eec61ed..5b7a04f8df 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute.go @@ -3,11 +3,11 @@ package delete import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go index 17d8f02ae3..37dd139475 100644 --- a/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/delete/matchable_cluster_resource_attribute_test.go @@ -4,9 +4,9 @@ import ( "fmt" "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label.go b/flytectl/cmd/delete/matchable_execution_cluster_label.go index eea32e3256..544b8ae64f 100644 --- a/flytectl/cmd/delete/matchable_execution_cluster_label.go +++ b/flytectl/cmd/delete/matchable_execution_cluster_label.go @@ -3,11 +3,11 @@ package delete import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/delete/matchable_execution_cluster_label_test.go b/flytectl/cmd/delete/matchable_execution_cluster_label_test.go index 30d60f93e9..f7cc5e7f53 100644 --- a/flytectl/cmd/delete/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/delete/matchable_execution_cluster_label_test.go @@ -4,9 +4,9 @@ import ( "fmt" "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute.go b/flytectl/cmd/delete/matchable_execution_queue_attribute.go index 63ae7ff561..082cfec4af 100644 --- a/flytectl/cmd/delete/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute.go @@ -3,11 +3,11 @@ package delete import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go b/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go index 834ae48e78..734323d9f1 100644 --- a/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/delete/matchable_execution_queue_attribute_test.go @@ -4,9 +4,9 @@ import ( "fmt" "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/delete/matchable_plugin_override.go b/flytectl/cmd/delete/matchable_plugin_override.go index a7705ed8d9..76b90b0235 100644 --- a/flytectl/cmd/delete/matchable_plugin_override.go +++ b/flytectl/cmd/delete/matchable_plugin_override.go @@ -3,11 +3,11 @@ package delete import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/delete/matchable_plugin_override_test.go b/flytectl/cmd/delete/matchable_plugin_override_test.go index 380412293c..1dcd10cadc 100644 --- a/flytectl/cmd/delete/matchable_plugin_override_test.go +++ b/flytectl/cmd/delete/matchable_plugin_override_test.go @@ -4,9 +4,9 @@ import ( "fmt" "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute.go b/flytectl/cmd/delete/matchable_task_resource_attribute.go index f948ff8c5a..3bd3f4d366 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute.go @@ -3,11 +3,11 @@ package delete import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go index 71efaafac8..33744489b1 100644 --- a/flytectl/cmd/delete/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/delete/matchable_task_resource_attribute_test.go @@ -4,9 +4,9 @@ import ( "fmt" "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config.go b/flytectl/cmd/delete/matchable_workflow_execution_config.go index ad387d4ccd..a284ca6d0e 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config.go @@ -5,10 +5,10 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/delete/matchable_workflow_execution_config_test.go b/flytectl/cmd/delete/matchable_workflow_execution_config_test.go index 800c7329d5..b3c41b09df 100644 --- a/flytectl/cmd/delete/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/delete/matchable_workflow_execution_config_test.go @@ -6,8 +6,8 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/demo/exec_test.go b/flytectl/cmd/demo/exec_test.go index 0375be916c..a842e39669 100644 --- a/flytectl/cmd/demo/exec_test.go +++ b/flytectl/cmd/demo/exec_test.go @@ -10,7 +10,7 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" - admin2 "github.com/flyteorg/flyteidl/clients/go/admin" + admin2 "github.com/flyteorg/flyte/flyteidl/clients/go/admin" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/stretchr/testify/assert" diff --git a/flytectl/cmd/demo/reload.go b/flytectl/cmd/demo/reload.go index e7100802de..05c1ccfd97 100644 --- a/flytectl/cmd/demo/reload.go +++ b/flytectl/cmd/demo/reload.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flytestdlib/logger" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/docker" "github.com/flyteorg/flytectl/pkg/k8s" - "github.com/flyteorg/flytestdlib/logger" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 26ec0b792a..55f9d26b77 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -4,12 +4,12 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" ) diff --git a/flytectl/cmd/get/execution_test.go b/flytectl/cmd/get/execution_test.go index 64476ad82f..635ccce875 100644 --- a/flytectl/cmd/get/execution_test.go +++ b/flytectl/cmd/get/execution_test.go @@ -8,10 +8,10 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/get/execution_util.go b/flytectl/cmd/get/execution_util.go index bb460180af..f9ad49a2e5 100644 --- a/flytectl/cmd/get/execution_util.go +++ b/flytectl/cmd/get/execution_util.go @@ -10,10 +10,10 @@ import ( "gopkg.in/yaml.v3" + "github.com/flyteorg/flyte/flyteidl/clients/go/coreutils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" - "github.com/flyteorg/flyteidl/clients/go/coreutils" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) // ExecutionConfig is duplicated struct from create with the same structure. This is to avoid the circular dependency. Only works with go-yaml. diff --git a/flytectl/cmd/get/execution_util_test.go b/flytectl/cmd/get/execution_util_test.go index 2d98c8b834..ff316ca4e0 100644 --- a/flytectl/cmd/get/execution_util_test.go +++ b/flytectl/cmd/get/execution_util_test.go @@ -3,8 +3,8 @@ package get import ( "testing" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/timestamppb" diff --git a/flytectl/cmd/get/launch_plan.go b/flytectl/cmd/get/launch_plan.go index f83a1d1d4b..1e23041679 100644 --- a/flytectl/cmd/get/launch_plan.go +++ b/flytectl/cmd/get/launch_plan.go @@ -4,13 +4,13 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flytectl/pkg/printer" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" ) diff --git a/flytectl/cmd/get/launch_plan_test.go b/flytectl/cmd/get/launch_plan_test.go index 6e8618987e..f7f8daf242 100644 --- a/flytectl/cmd/get/launch_plan_test.go +++ b/flytectl/cmd/get/launch_plan_test.go @@ -15,11 +15,11 @@ import ( "github.com/stretchr/testify/mock" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" "github.com/flyteorg/flytectl/pkg/ext/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/timestamppb" diff --git a/flytectl/cmd/get/matchable_attribute_util.go b/flytectl/cmd/get/matchable_attribute_util.go index 0a6358bf39..df4468c639 100644 --- a/flytectl/cmd/get/matchable_attribute_util.go +++ b/flytectl/cmd/get/matchable_attribute_util.go @@ -3,9 +3,9 @@ package get import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) func FetchAndUnDecorateMatchableAttr(ctx context.Context, project, domain, workflowName string, diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute.go b/flytectl/cmd/get/matchable_cluster_resource_attribute.go index 6fcf66213e..a9fd0b4082 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute.go @@ -3,11 +3,11 @@ package get import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go index 5bf48ad809..6e601f3c1c 100644 --- a/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/get/matchable_cluster_resource_attribute_test.go @@ -7,9 +7,9 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/get/matchable_execution_cluster_label.go b/flytectl/cmd/get/matchable_execution_cluster_label.go index 89cf5cf48d..e47e17ff5f 100644 --- a/flytectl/cmd/get/matchable_execution_cluster_label.go +++ b/flytectl/cmd/get/matchable_execution_cluster_label.go @@ -3,11 +3,11 @@ package get import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/get/matchable_execution_cluster_label_test.go b/flytectl/cmd/get/matchable_execution_cluster_label_test.go index 590fa1b53c..e418a5fc27 100644 --- a/flytectl/cmd/get/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/get/matchable_execution_cluster_label_test.go @@ -7,9 +7,9 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute.go b/flytectl/cmd/get/matchable_execution_queue_attribute.go index 533b53a6d6..f5ac300a8a 100644 --- a/flytectl/cmd/get/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/get/matchable_execution_queue_attribute.go @@ -3,11 +3,11 @@ package get import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/get/matchable_execution_queue_attribute_test.go b/flytectl/cmd/get/matchable_execution_queue_attribute_test.go index e4e33e7ec8..a47b9c78ae 100644 --- a/flytectl/cmd/get/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/get/matchable_execution_queue_attribute_test.go @@ -7,9 +7,9 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/get/matchable_plugin_override.go b/flytectl/cmd/get/matchable_plugin_override.go index 8ff08ee615..be6a1004fe 100644 --- a/flytectl/cmd/get/matchable_plugin_override.go +++ b/flytectl/cmd/get/matchable_plugin_override.go @@ -3,11 +3,11 @@ package get import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/get/matchable_plugin_override_test.go b/flytectl/cmd/get/matchable_plugin_override_test.go index 24363966d3..a4f6c1256f 100644 --- a/flytectl/cmd/get/matchable_plugin_override_test.go +++ b/flytectl/cmd/get/matchable_plugin_override_test.go @@ -7,9 +7,9 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go index 40183615c1..63ec690666 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -3,11 +3,11 @@ package get import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/get/matchable_task_resource_attribute_test.go b/flytectl/cmd/get/matchable_task_resource_attribute_test.go index f9faba6eb9..c21ddcd9df 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute_test.go @@ -7,9 +7,9 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/get/matchable_workflow_execution_config.go b/flytectl/cmd/get/matchable_workflow_execution_config.go index 59098e4a1d..ba414f7833 100644 --- a/flytectl/cmd/get/matchable_workflow_execution_config.go +++ b/flytectl/cmd/get/matchable_workflow_execution_config.go @@ -4,12 +4,12 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/flytectl/cmd/get/matchable_workflow_execution_config_test.go b/flytectl/cmd/get/matchable_workflow_execution_config_test.go index 1206e5b7f4..0f9658c7f4 100644 --- a/flytectl/cmd/get/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/get/matchable_workflow_execution_config_test.go @@ -7,9 +7,9 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/get/node_execution.go b/flytectl/cmd/get/node_execution.go index 61695ece53..bec0a5a9a0 100644 --- a/flytectl/cmd/get/node_execution.go +++ b/flytectl/cmd/get/node_execution.go @@ -7,11 +7,11 @@ import ( "sort" "strconv" + "github.com/flyteorg/flyte/flyteidl/clients/go/coreutils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" - "github.com/flyteorg/flyteidl/clients/go/coreutils" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/disiqueira/gotree" "github.com/golang/protobuf/jsonpb" diff --git a/flytectl/cmd/get/node_execution_test.go b/flytectl/cmd/get/node_execution_test.go index 1958f6a5c6..ca12baa41f 100644 --- a/flytectl/cmd/get/node_execution_test.go +++ b/flytectl/cmd/get/node_execution_test.go @@ -7,9 +7,9 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/event" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/event" "github.com/disiqueira/gotree" "github.com/stretchr/testify/assert" diff --git a/flytectl/cmd/get/project.go b/flytectl/cmd/get/project.go index 092935c59c..bf4b1473b9 100644 --- a/flytectl/cmd/get/project.go +++ b/flytectl/cmd/get/project.go @@ -5,8 +5,8 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/project" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/golang/protobuf/proto" "github.com/flyteorg/flytectl/cmd/config" diff --git a/flytectl/cmd/get/project_test.go b/flytectl/cmd/get/project_test.go index d2a3a1abe7..7efed267e2 100644 --- a/flytectl/cmd/get/project_test.go +++ b/flytectl/cmd/get/project_test.go @@ -8,8 +8,8 @@ import ( "github.com/flyteorg/flytectl/cmd/config/subcommand/project" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/cmd/get/task.go b/flytectl/cmd/get/task.go index 7a5e9dc70d..b5e1b13d8b 100644 --- a/flytectl/cmd/get/task.go +++ b/flytectl/cmd/get/task.go @@ -3,13 +3,13 @@ package get import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flytectl/cmd/config" taskConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/task" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flytectl/pkg/printer" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" ) diff --git a/flytectl/cmd/get/task_test.go b/flytectl/cmd/get/task_test.go index aea8e41cc1..2429f38171 100644 --- a/flytectl/cmd/get/task_test.go +++ b/flytectl/cmd/get/task_test.go @@ -15,9 +15,9 @@ import ( "github.com/stretchr/testify/mock" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/pkg/ext/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/timestamppb" diff --git a/flytectl/cmd/get/workflow.go b/flytectl/cmd/get/workflow.go index c428c2d6a7..d59437a3be 100644 --- a/flytectl/cmd/get/workflow.go +++ b/flytectl/cmd/get/workflow.go @@ -3,16 +3,16 @@ package get import ( "context" + "github.com/flyteorg/flyte/flytestdlib/logger" workflowconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flytestdlib/logger" "github.com/golang/protobuf/proto" "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/get/workflow_test.go b/flytectl/cmd/get/workflow_test.go index ec8da17653..e534e373e0 100644 --- a/flytectl/cmd/get/workflow_test.go +++ b/flytectl/cmd/get/workflow_test.go @@ -15,9 +15,9 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/pkg/ext/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflow" ) diff --git a/flytectl/cmd/register/examples.go b/flytectl/cmd/register/examples.go index 04d34be9e1..fdccad08d5 100644 --- a/flytectl/cmd/register/examples.go +++ b/flytectl/cmd/register/examples.go @@ -4,11 +4,11 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flytectl/cmd/config" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" g "github.com/flyteorg/flytectl/pkg/github" - "github.com/flyteorg/flytestdlib/logger" "github.com/google/go-github/v42/github" ) diff --git a/flytectl/cmd/register/files.go b/flytectl/cmd/register/files.go index e866743183..f9b70696ab 100644 --- a/flytectl/cmd/register/files.go +++ b/flytectl/cmd/register/files.go @@ -8,12 +8,12 @@ import ( "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytestdlib/storage" + "github.com/flyteorg/flyte/flytestdlib/storage" + "github.com/flyteorg/flyte/flytestdlib/logger" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" - "github.com/flyteorg/flytestdlib/logger" ) const ( diff --git a/flytectl/cmd/register/files_test.go b/flytectl/cmd/register/files_test.go index 0a9eb330e3..0eec77014b 100644 --- a/flytectl/cmd/register/files_test.go +++ b/flytectl/cmd/register/files_test.go @@ -4,16 +4,16 @@ import ( "fmt" "testing" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" + "github.com/flyteorg/flyte/flytestdlib/contextutils" + "github.com/flyteorg/flyte/flytestdlib/promutils/labeled" + "github.com/flyteorg/flyte/flytestdlib/storage" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flytestdlib/contextutils" - "github.com/flyteorg/flytestdlib/promutils/labeled" - "github.com/flyteorg/flytestdlib/storage" + "github.com/flyteorg/flyte/flytestdlib/promutils" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" - "github.com/flyteorg/flytestdlib/promutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index 18ecede8ba..e4dd4355ad 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -18,25 +18,25 @@ import ( "strconv" "strings" - errors2 "github.com/flyteorg/flytestdlib/errors" + errors2 "github.com/flyteorg/flyte/flytestdlib/errors" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" g "github.com/flyteorg/flytectl/pkg/github" - "github.com/flyteorg/flytestdlib/contextutils" - "github.com/flyteorg/flytestdlib/promutils" - "github.com/flyteorg/flytestdlib/promutils/labeled" - "github.com/flyteorg/flytestdlib/utils" + "github.com/flyteorg/flyte/flytestdlib/contextutils" + "github.com/flyteorg/flyte/flytestdlib/promutils" + "github.com/flyteorg/flyte/flytestdlib/promutils/labeled" + "github.com/flyteorg/flyte/flytestdlib/utils" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flytestdlib/logger" + "github.com/flyteorg/flyte/flytestdlib/storage" "github.com/flyteorg/flytectl/cmd/config" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/pkg/printer" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flytestdlib/logger" - "github.com/flyteorg/flytestdlib/storage" "github.com/google/go-github/v42/github" "github.com/golang/protobuf/jsonpb" diff --git a/flytectl/cmd/register/register_util_test.go b/flytectl/cmd/register/register_util_test.go index 9c9877ab6e..94dc1912cb 100644 --- a/flytectl/cmd/register/register_util_test.go +++ b/flytectl/cmd/register/register_util_test.go @@ -12,23 +12,23 @@ import ( "strings" "testing" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" ghMocks "github.com/flyteorg/flytectl/pkg/github/mocks" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" - "github.com/flyteorg/flytestdlib/utils" + "github.com/flyteorg/flyte/flytestdlib/utils" v1 "k8s.io/api/core/v1" - "github.com/flyteorg/flytestdlib/contextutils" - "github.com/flyteorg/flytestdlib/promutils" - "github.com/flyteorg/flytestdlib/promutils/labeled" - "github.com/flyteorg/flytestdlib/storage" + "github.com/flyteorg/flyte/flytestdlib/contextutils" + "github.com/flyteorg/flyte/flytestdlib/promutils" + "github.com/flyteorg/flyte/flytestdlib/promutils/labeled" + "github.com/flyteorg/flyte/flytestdlib/storage" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" rconfig "github.com/flyteorg/flytectl/cmd/config/subcommand/register" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/google/go-github/v42/github" "github.com/stretchr/testify/assert" diff --git a/flytectl/cmd/root.go b/flytectl/cmd/root.go index e682eb63d7..418406c034 100644 --- a/flytectl/cmd/root.go +++ b/flytectl/cmd/root.go @@ -5,6 +5,8 @@ import ( "fmt" "os" + stdConfig "github.com/flyteorg/flyte/flytestdlib/config" + "github.com/flyteorg/flyte/flytestdlib/config/viper" "github.com/flyteorg/flytectl/cmd/compile" "github.com/flyteorg/flytectl/cmd/config" configuration "github.com/flyteorg/flytectl/cmd/configuration" @@ -20,8 +22,6 @@ import ( "github.com/flyteorg/flytectl/cmd/version" f "github.com/flyteorg/flytectl/pkg/filesystemutils" "github.com/flyteorg/flytectl/pkg/printer" - stdConfig "github.com/flyteorg/flytestdlib/config" - "github.com/flyteorg/flytestdlib/config/viper" "github.com/sirupsen/logrus" "github.com/spf13/cobra" diff --git a/flytectl/cmd/sandbox/exec_test.go b/flytectl/cmd/sandbox/exec_test.go index 8cd7059c19..b86a9a781a 100644 --- a/flytectl/cmd/sandbox/exec_test.go +++ b/flytectl/cmd/sandbox/exec_test.go @@ -10,7 +10,7 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" - admin2 "github.com/flyteorg/flyteidl/clients/go/admin" + admin2 "github.com/flyteorg/flyte/flyteidl/clients/go/admin" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/stretchr/testify/assert" diff --git a/flytectl/cmd/testutils/test_utils.go b/flytectl/cmd/testutils/test_utils.go index 37f71af493..28b7856666 100644 --- a/flytectl/cmd/testutils/test_utils.go +++ b/flytectl/cmd/testutils/test_utils.go @@ -14,11 +14,11 @@ import ( "github.com/stretchr/testify/assert" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" extMocks "github.com/flyteorg/flytectl/pkg/ext/mocks" - "github.com/flyteorg/flyteidl/clients/go/admin" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" ) const projectValue = "dummyProject" diff --git a/flytectl/cmd/update/execution.go b/flytectl/cmd/update/execution.go index d3f1fccdd5..d70b36eddd 100644 --- a/flytectl/cmd/update/execution.go +++ b/flytectl/cmd/update/execution.go @@ -5,13 +5,13 @@ import ( "fmt" "os" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" cmdCore "github.com/flyteorg/flytectl/cmd/core" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) const ( diff --git a/flytectl/cmd/update/execution_test.go b/flytectl/cmd/update/execution_test.go index 44a790e415..e1695319b5 100644 --- a/flytectl/cmd/update/execution_test.go +++ b/flytectl/cmd/update/execution_test.go @@ -4,12 +4,12 @@ import ( "fmt" "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/execution" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/update/interfaces/mocks/updater.go b/flytectl/cmd/update/interfaces/mocks/updater.go index 3b56f35add..c702327116 100644 --- a/flytectl/cmd/update/interfaces/mocks/updater.go +++ b/flytectl/cmd/update/interfaces/mocks/updater.go @@ -7,7 +7,7 @@ import ( cmdcore "github.com/flyteorg/flytectl/cmd/core" - core "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + core "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" mock "github.com/stretchr/testify/mock" ) diff --git a/flytectl/cmd/update/interfaces/updater.go b/flytectl/cmd/update/interfaces/updater.go index 3ea18f678a..3aea6aec25 100644 --- a/flytectl/cmd/update/interfaces/updater.go +++ b/flytectl/cmd/update/interfaces/updater.go @@ -3,8 +3,8 @@ package interfaces import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) //go:generate mockery -name=Updater -case=underscore diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go index f1a9474e7c..28b7c6270b 100644 --- a/flytectl/cmd/update/launch_plan.go +++ b/flytectl/cmd/update/launch_plan.go @@ -5,13 +5,13 @@ import ( "fmt" "os" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" cmdCore "github.com/flyteorg/flytectl/cmd/core" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) const ( diff --git a/flytectl/cmd/update/launch_plan_meta.go b/flytectl/cmd/update/launch_plan_meta.go index 123413d6bf..2170ba22f1 100644 --- a/flytectl/cmd/update/launch_plan_meta.go +++ b/flytectl/cmd/update/launch_plan_meta.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) const ( diff --git a/flytectl/cmd/update/launch_plan_meta_test.go b/flytectl/cmd/update/launch_plan_meta_test.go index 84187be99d..c2a8d637df 100644 --- a/flytectl/cmd/update/launch_plan_meta_test.go +++ b/flytectl/cmd/update/launch_plan_meta_test.go @@ -6,10 +6,10 @@ import ( "github.com/google/go-cmp/cmp" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/update/launch_plan_test.go b/flytectl/cmd/update/launch_plan_test.go index 11eb15f8f0..f9c3d7dc8a 100644 --- a/flytectl/cmd/update/launch_plan_test.go +++ b/flytectl/cmd/update/launch_plan_test.go @@ -6,12 +6,12 @@ import ( "github.com/google/go-cmp/cmp" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/update/matchable_attribute_util.go b/flytectl/cmd/update/matchable_attribute_util.go index c978d9dd97..ddb2c11091 100644 --- a/flytectl/cmd/update/matchable_attribute_util.go +++ b/flytectl/cmd/update/matchable_attribute_util.go @@ -5,11 +5,11 @@ import ( "fmt" "os" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" cmdCore "github.com/flyteorg/flytectl/cmd/core" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) func DecorateAndUpdateMatchableAttr( diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute.go b/flytectl/cmd/update/matchable_cluster_resource_attribute.go index d18896cac5..51f5b64922 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go index f355a53656..f5d1c6c4e0 100644 --- a/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_cluster_resource_attribute_test.go @@ -7,10 +7,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config/subcommand/clusterresourceattribute" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/matchable_execution_cluster_label.go b/flytectl/cmd/update/matchable_execution_cluster_label.go index dee80cb459..08b0d7424e 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/matchable_execution_cluster_label_test.go b/flytectl/cmd/update/matchable_execution_cluster_label_test.go index 3b234c4a22..9aed3ebc96 100644 --- a/flytectl/cmd/update/matchable_execution_cluster_label_test.go +++ b/flytectl/cmd/update/matchable_execution_cluster_label_test.go @@ -7,10 +7,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionclusterlabel" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute.go b/flytectl/cmd/update/matchable_execution_queue_attribute.go index 966972e771..8af5bd7762 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go index 8a14997660..61638b7d51 100644 --- a/flytectl/cmd/update/matchable_execution_queue_attribute_test.go +++ b/flytectl/cmd/update/matchable_execution_queue_attribute_test.go @@ -7,10 +7,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config/subcommand/executionqueueattribute" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/matchable_plugin_override.go b/flytectl/cmd/update/matchable_plugin_override.go index 4b6d1358f1..c9f6ebe9aa 100644 --- a/flytectl/cmd/update/matchable_plugin_override.go +++ b/flytectl/cmd/update/matchable_plugin_override.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/matchable_plugin_override_test.go b/flytectl/cmd/update/matchable_plugin_override_test.go index 7089df984f..2b6e2e7f6b 100644 --- a/flytectl/cmd/update/matchable_plugin_override_test.go +++ b/flytectl/cmd/update/matchable_plugin_override_test.go @@ -7,10 +7,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" pluginoverride "github.com/flyteorg/flytectl/cmd/config/subcommand/plugin_override" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/matchable_task_resource_attribute.go b/flytectl/cmd/update/matchable_task_resource_attribute.go index a296a4bd51..3e4282defc 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/matchable_task_resource_attribute_test.go b/flytectl/cmd/update/matchable_task_resource_attribute_test.go index fd485f910c..cad06fa7e7 100644 --- a/flytectl/cmd/update/matchable_task_resource_attribute_test.go +++ b/flytectl/cmd/update/matchable_task_resource_attribute_test.go @@ -7,10 +7,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config/subcommand/taskresourceattribute" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/matchable_workflow_execution_config.go b/flytectl/cmd/update/matchable_workflow_execution_config.go index 100ee7e77a..2921dbcf17 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config.go @@ -4,8 +4,8 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" cmdCore "github.com/flyteorg/flytectl/cmd/core" diff --git a/flytectl/cmd/update/matchable_workflow_execution_config_test.go b/flytectl/cmd/update/matchable_workflow_execution_config_test.go index f81f92a883..3fd198e56a 100644 --- a/flytectl/cmd/update/matchable_workflow_execution_config_test.go +++ b/flytectl/cmd/update/matchable_workflow_execution_config_test.go @@ -7,10 +7,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config/subcommand/workflowexecutionconfig" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/named_entity.go b/flytectl/cmd/update/named_entity.go index 3101e29ba2..449639d751 100644 --- a/flytectl/cmd/update/named_entity.go +++ b/flytectl/cmd/update/named_entity.go @@ -5,11 +5,11 @@ import ( "fmt" "os" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/clierrors" cmdCore "github.com/flyteorg/flytectl/cmd/core" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) //go:generate pflags NamedEntityConfig --default-var namedEntityConfig --bind-default-var diff --git a/flytectl/cmd/update/named_entity_test.go b/flytectl/cmd/update/named_entity_test.go index 732bc9d249..b02d6a5086 100644 --- a/flytectl/cmd/update/named_entity_test.go +++ b/flytectl/cmd/update/named_entity_test.go @@ -7,11 +7,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/mock" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flytectl/cmd/testutils" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) func testNamedEntityUpdate( diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 881f61fec8..b9c2f17e90 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -5,12 +5,12 @@ import ( "fmt" "os" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" cmdCore "github.com/flyteorg/flytectl/cmd/core" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" ) const ( diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index a3152127d4..2f3fd11aed 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -4,12 +4,12 @@ import ( "fmt" "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/update/task_meta.go b/flytectl/cmd/update/task_meta.go index 82f6d7a238..cb9e3e927a 100644 --- a/flytectl/cmd/update/task_meta.go +++ b/flytectl/cmd/update/task_meta.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) const ( diff --git a/flytectl/cmd/update/task_meta_test.go b/flytectl/cmd/update/task_meta_test.go index e1ffc9a13a..01d9f3c742 100644 --- a/flytectl/cmd/update/task_meta_test.go +++ b/flytectl/cmd/update/task_meta_test.go @@ -6,10 +6,10 @@ import ( "github.com/google/go-cmp/cmp" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/update/workflow_meta.go b/flytectl/cmd/update/workflow_meta.go index b30743b67f..d2c94d7e3e 100644 --- a/flytectl/cmd/update/workflow_meta.go +++ b/flytectl/cmd/update/workflow_meta.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) const ( diff --git a/flytectl/cmd/update/workflow_meta_test.go b/flytectl/cmd/update/workflow_meta_test.go index 2d49de2b25..cfdc628751 100644 --- a/flytectl/cmd/update/workflow_meta_test.go +++ b/flytectl/cmd/update/workflow_meta_test.go @@ -6,10 +6,10 @@ import ( "github.com/google/go-cmp/cmp" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/cmd/upgrade/upgrade.go b/flytectl/cmd/upgrade/upgrade.go index b760975a5a..b01a795a3a 100644 --- a/flytectl/cmd/upgrade/upgrade.go +++ b/flytectl/cmd/upgrade/upgrade.go @@ -10,11 +10,11 @@ import ( "github.com/flyteorg/flytectl/pkg/util" - stdlibversion "github.com/flyteorg/flytestdlib/version" + stdlibversion "github.com/flyteorg/flyte/flytestdlib/version" "github.com/flyteorg/flytectl/pkg/github" - "github.com/flyteorg/flytestdlib/logger" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/mouuff/go-rocket-update/pkg/updater" cmdCore "github.com/flyteorg/flytectl/cmd/core" diff --git a/flytectl/cmd/upgrade/upgrade_test.go b/flytectl/cmd/upgrade/upgrade_test.go index 44095a5c13..852d93dd1d 100644 --- a/flytectl/cmd/upgrade/upgrade_test.go +++ b/flytectl/cmd/upgrade/upgrade_test.go @@ -11,7 +11,7 @@ import ( "github.com/flyteorg/flytectl/pkg/platformutil" - stdlibversion "github.com/flyteorg/flytestdlib/version" + stdlibversion "github.com/flyteorg/flyte/flytestdlib/version" cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/spf13/cobra" diff --git a/flytectl/cmd/version/version.go b/flytectl/cmd/version/version.go index b5ff9cfe6f..dadbde6407 100644 --- a/flytectl/cmd/version/version.go +++ b/flytectl/cmd/version/version.go @@ -10,10 +10,10 @@ import ( "github.com/flyteorg/flytectl/pkg/platformutil" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flytestdlib/logger" + stdlibversion "github.com/flyteorg/flyte/flytestdlib/version" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flytestdlib/logger" - stdlibversion "github.com/flyteorg/flytestdlib/version" "github.com/spf13/cobra" ) diff --git a/flytectl/cmd/version/version_test.go b/flytectl/cmd/version/version_test.go index 9f67577aa9..f694089b9a 100644 --- a/flytectl/cmd/version/version_test.go +++ b/flytectl/cmd/version/version_test.go @@ -10,14 +10,14 @@ import ( "github.com/flyteorg/flytectl/cmd/testutils" - admin2 "github.com/flyteorg/flyteidl/clients/go/admin" + admin2 "github.com/flyteorg/flyte/flyteidl/clients/go/admin" "github.com/spf13/cobra" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + stdlibversion "github.com/flyteorg/flyte/flytestdlib/version" cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - stdlibversion "github.com/flyteorg/flytestdlib/version" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 98b30282d7..60e755e686 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -93,7 +93,7 @@ SEE ALSO * :doc:`flytectl` - Flytectl CLI tool * :doc:`flytectl_config_discover` - Searches for a config in one of the default search paths. -* :doc:`flytectl_config_docs` - Generate configuration documetation in rst format +* :doc:`flytectl_config_docs` - Generate configuration documentation in rst format * :doc:`flytectl_config_init` - Generates a Flytectl config file in the user's home directory. * :doc:`flytectl_config_validate` - Validates the loaded config. diff --git a/flytectl/go.mod b/flytectl/go.mod index 534c99baaa..0344faeca5 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -9,19 +9,19 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.5.12 - github.com/flyteorg/flytepropeller v1.1.1 - github.com/flyteorg/flytestdlib v1.0.13 + github.com/flyteorg/flyte/flyteidl v1.9.12 + github.com/flyteorg/flyte/flytepropeller v1.9.12 + github.com/flyteorg/flyte/flytestdlib v1.9.12 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 - github.com/golang/protobuf v1.5.2 - github.com/google/go-cmp v0.5.8 + github.com/golang/protobuf v1.5.3 + github.com/google/go-cmp v0.5.9 github.com/google/go-github/v42 v42.0.0 - github.com/google/uuid v1.2.0 + github.com/google/uuid v1.3.0 github.com/hashicorp/go-version v1.3.0 github.com/hexops/gotextdiff v1.0.3 github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 - github.com/mitchellh/mapstructure v1.4.3 + github.com/mitchellh/mapstructure v1.5.0 github.com/mouuff/go-rocket-update v1.5.1 github.com/opencontainers/image-spec v1.0.2 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 @@ -29,26 +29,27 @@ require ( github.com/sirupsen/logrus v1.8.1 github.com/spf13/cobra v1.4.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.7.1 + github.com/stretchr/testify v1.8.4 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 github.com/zalando/go-keyring v0.1.1 - golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 - golang.org/x/text v0.3.7 - google.golang.org/grpc v1.46.0 - google.golang.org/protobuf v1.28.0 + golang.org/x/oauth2 v0.7.0 + golang.org/x/text v0.9.0 + google.golang.org/grpc v1.56.1 + google.golang.org/protobuf v1.30.0 gopkg.in/yaml.v3 v3.0.1 gotest.tools v2.2.0+incompatible - k8s.io/api v0.21.3 - k8s.io/apimachinery v0.21.3 - k8s.io/client-go v0.21.3 + k8s.io/api v0.24.1 + k8s.io/apimachinery v0.24.1 + k8s.io/client-go v0.24.1 sigs.k8s.io/yaml v1.3.0 ) require ( - cloud.google.com/go v0.101.0 // indirect - cloud.google.com/go/compute v1.6.1 // indirect - cloud.google.com/go/iam v0.3.0 // indirect - cloud.google.com/go/storage v1.22.0 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.19.1 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/iam v0.13.0 // indirect + cloud.google.com/go/storage v1.28.1 // indirect github.com/Azure/azure-sdk-for-go v63.4.0+incompatible // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v0.23.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.2 // indirect @@ -64,44 +65,50 @@ require ( github.com/aws/aws-sdk-go v1.44.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/containerd/containerd v1.5.10 // indirect github.com/coocood/freecache v1.1.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect github.com/danieljoos/wincred v1.1.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dnaeon/go-vcr v1.2.0 // indirect github.com/docker/distribution v2.8.0+incompatible // indirect github.com/docker/go-units v0.4.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect - github.com/evanphx/json-patch v4.9.0+incompatible // indirect + github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/evanphx/json-patch v4.12.0+incompatible // indirect github.com/fatih/color v1.13.0 // indirect - github.com/flyteorg/flyteplugins v1.0.0 // indirect - github.com/flyteorg/stow v0.3.6 // indirect + github.com/flyteorg/flyte/flyteplugins v0.0.0-00010101000000-000000000000 // indirect + github.com/flyteorg/stow v0.3.7 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v0.4.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.4.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.3.0 // indirect - github.com/googleapis/gnostic v0.5.1 // indirect - github.com/googleapis/go-type-adapters v1.0.0 // indirect - github.com/gorilla/mux v1.8.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect + github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/magiconair/properties v1.8.6 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect @@ -110,6 +117,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/morikuni/aec v1.0.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/ncw/swift v1.0.53 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/pelletier/go-toml v1.9.4 // indirect @@ -121,28 +129,36 @@ require ( github.com/prometheus/procfs v0.7.3 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.11.0 // indirect - github.com/stretchr/objx v0.3.0 // indirect + github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect - go.opencensus.io v0.23.0 // indirect - golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f // indirect - golang.org/x/exp v0.0.0-20220428152302-39d4317da171 // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect - golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect - golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect - google.golang.org/api v0.76.0 // indirect + go.opencensus.io v0.24.0 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/net v0.9.0 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/term v0.7.0 // indirect + golang.org/x/time v0.1.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + google.golang.org/api v0.114.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/klog/v2 v2.8.0 // indirect - k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect - k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect + k8s.io/klog/v2 v2.90.1 // indirect + k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect + k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect +) + +replace ( + github.com/flyteorg/flyte/flyteidl => github.com/flyteorg/flyte/flyteidl v1.9.12 + github.com/flyteorg/flyte/flyteplugins => github.com/flyteorg/flyte/flyteplugins v1.9.12 + github.com/flyteorg/flyte/flytepropeller => github.com/flyteorg/flyte/flytepropeller v1.9.12 + github.com/flyteorg/flyte/flytestdlib => github.com/flyteorg/flyte/flytestdlib v1.9.12 ) diff --git a/flytectl/go.sum b/flytectl/go.sum index 38be461844..41bdd143c0 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -8,7 +8,6 @@ cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= @@ -16,41 +15,29 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.101.0 h1:g+LL+JvpvdyGtcaD2xw2mSByE/6F9s471eJSoaysM84= -cloud.google.com/go v0.101.0/go.mod h1:hEiddgDb77jDQ+I80tURYNJEnuwPzFU8awCFFRLKjW0= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -60,23 +47,18 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.0 h1:NUV0NNp9nkBuW66BFRLuMgldN60C57ET3dhbwLIYio8= -cloud.google.com/go/storage v1.22.0/go.mod h1:GbaLEoMqbVm6sx3Z0R++gSiBlgMv6yUi2q1DeGFKQgE= +cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v63.4.0+incompatible h1:fle3M5Q7vr8auaiPffKyUQmLbvYeqpw30bKU6PrWJFo= github.com/Azure/azure-sdk-for-go v63.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.23.1 h1:3CVsSo4mp8NDWO11tHzN/mdo2zP0CtaSK5IcwBjfqRA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.23.1/go.mod h1:w5pDIZuawUmY3Bj4tVx3Xb8KS96ToB0j315w9rqpAg0= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.14.0 h1:NVS/4LOQfkBpk+B1VopIzv1ptmYeEskA8w/3K/w7vjo= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.2 h1:Px2KVERcYEg2Lv25AqC2hVr0xUWaq94wuEObLIkYzmA= github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.2/go.mod h1:CdSJQNNzZhCkwDaV27XV1w48ZBPtxe7mlrZAsPNxD5g= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.0 h1:0nJeKDmB7a1a8RDMjTltahlPsaNlWjq/LpkZleSwINk= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.0/go.mod h1:mbwxKc/fW+IkF0GG591MuXw0KuEQBDkeRoZ9vmVJPxg= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= @@ -84,47 +66,30 @@ github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A= github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0 h1:WVsrXCnHlDDX8ls+tootqRE87/hL9S/g4ewig9RsD/c= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/spark-on-k8s-operator v0.0.0-20200723154620-6f35a1152625/go.mod h1:6PnrZv6zUDkrNMw0mIoGRmGBR7i9LulhKPmxFq4rUiM= -github.com/Jeffail/gabs/v2 v2.5.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -148,35 +113,18 @@ github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:m github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/adammck/venv v0.0.0-20160819025605-8a9c907a37d3/go.mod h1:3zXR2a/VSQndtpShh783rUTaEA2mpqN2VqZclBARBc0= -github.com/adammck/venv v0.0.0-20200610172036-e77789703e7c/go.mod h1:3zXR2a/VSQndtpShh783rUTaEA2mpqN2VqZclBARBc0= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= @@ -184,27 +132,9 @@ github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHS github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= -github.com/aws/amazon-sagemaker-operator-for-k8s v1.0.1-0.20210303003444-0fb33b1fd49d/go.mod h1:mZUP7GJmjiWtf8v3FD1X/QdK08BqyeH/1Ejt0qhNzCs= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.23.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.37.3/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.2 h1:5VBk5r06bgxgRKVaUtm1/4NT/rtrnH2E4cnAYv5zgQc= github.com/aws/aws-sdk-go v1.44.2/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.0.0/go.mod h1:smfAbmpW+tcRVuNUjo3MOArSZmW72t62rkCzc2i0TWM= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.0.0/go.mod h1:WysE/OpUgE37tjtmtJd8GXgT8s1euilE5XtUkRNUQ1w= -github.com/aws/aws-sdk-go-v2/credentials v1.0.0/go.mod h1:/SvsiqBf509hG4Bddigr3NB12MIpfHhZapyBurJe8aY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.0/go.mod h1:wpMHDCXvOXZxGCRSidyepa8uJHY4vaBGfY2/+oKU/Bc= -github.com/aws/aws-sdk-go-v2/service/athena v1.0.0/go.mod h1:qY8QFbemf2ceqweXcS6hQqiiIe1z42WqTvHsK2Lb0rE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.0/go.mod h1:3jExOmpbjgPnz2FJaMOfbSk1heTkZ66aD3yNtVhnjvI= -github.com/aws/aws-sdk-go-v2/service/sts v1.0.0/go.mod h1:5f+cELGATgill5Pu3/vK3Ebuigstc+qYEHW5MvGWZO4= -github.com/aws/smithy-go v1.0.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/benlaurie/objecthash v0.0.0-20180202135721-d1e3d6079fc1/go.mod h1:jvdWlw8vowVGnZqSDC7yhPd7AifQeQbRDkZcQXV2nRg= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -213,9 +143,7 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= @@ -223,19 +151,17 @@ github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -244,19 +170,11 @@ github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLI github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -345,8 +263,6 @@ github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEka github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= @@ -359,9 +275,7 @@ github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= @@ -394,7 +308,6 @@ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -403,7 +316,6 @@ github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6Uezg github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= @@ -412,54 +324,37 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/enescakir/emoji v1.0.0 h1:W+HsNql8swfCQFtioDGDHCHri8nudlK1n5p2rHCJoog= github.com/enescakir/emoji v1.0.0/go.mod h1:Bt1EKuLnKDTYpLALApstIkAjdDrS/8IAgTkKp+WKFD0= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= -github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.5.12 h1:bCSSie8Yru1e9yLHWPO3ORksHHskK+bmkxln/jV3bXM= -github.com/flyteorg/flyteidl v1.5.12/go.mod h1:EtE/muM2lHHgBabjYcxqe9TWeJSL0kXwbI0RgVwI4Og= -github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= -github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= -github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64= -github.com/flyteorg/flytepropeller v1.1.1/go.mod h1:x7vIuy9vmOPw9JSd+xAijeiHShmuieFZsTT1yLXhR90= -github.com/flyteorg/flytestdlib v1.0.0/go.mod h1:QSVN5wIM1lM9d60eAEbX7NwweQXW96t5x4jbyftn89c= -github.com/flyteorg/flytestdlib v1.0.13 h1:mmU+k0Bc7HB5kWCgxoNJ9lZeD9tV1c7e5oCgyXKgO8c= -github.com/flyteorg/flytestdlib v1.0.13/go.mod h1:nIBmBHtjTJvhZEn3e/EwVC/iMkR2tUX8hEiXjRBpH/s= -github.com/flyteorg/stow v0.3.3/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= -github.com/flyteorg/stow v0.3.6 h1:jt50ciM14qhKBaIrB+ppXXY+SXB59FNREFgTJqCyqIk= -github.com/flyteorg/stow v0.3.6/go.mod h1:5dfBitPM004dwaZdoVylVjxFT4GWAgI0ghAndhNUzCo= +github.com/flyteorg/flyte/flyteidl v1.9.12 h1:9V3rng4g6wheLf3j4ISuT6YZR5NX2/wSqqbJiOBYt00= +github.com/flyteorg/flyte/flyteidl v1.9.12/go.mod h1:87ELgkbZ26Fz95zkUZZP3rFc5qi2KXBxlqZ/NBqRkWQ= +github.com/flyteorg/flyte/flyteplugins v1.9.12 h1:ceXJSePUchdqlGKx9Y1Yj6BnuXMO+PKMtTT4ongfdAk= +github.com/flyteorg/flyte/flyteplugins v1.9.12/go.mod h1:PCM5jdV3iASLgLcdHOj5bzkY5Bz4eBunll14jrJmJOQ= +github.com/flyteorg/flyte/flytepropeller v1.9.12 h1:8wkLq6nk6HMLCTwZrQzn6lc1f8qRmv7cuQKWoXJJPH8= +github.com/flyteorg/flyte/flytepropeller v1.9.12/go.mod h1:lTYcULg7WZXbz4OyCibNB3z3gv7Et1u1hfruHuD5mb4= +github.com/flyteorg/flyte/flytestdlib v1.9.12 h1:Rm4c6e+/G6yeW4wm/+A1pClasJtZolELJQyikuv5O1A= +github.com/flyteorg/flyte/flytestdlib v1.9.12/go.mod h1:ZnpzKetFifz05KvjX4/Au23m3gdTkYHnN/MvVZvvJYk= +github.com/flyteorg/stow v0.3.7 h1:Cx7j8/Ux6+toD5hp5fy++927V+yAcAttDeQAlUD/864= +github.com/flyteorg/stow v0.3.7/go.mod h1:5dfBitPM004dwaZdoVylVjxFT4GWAgI0ghAndhNUzCo= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -467,85 +362,45 @@ github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWp github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.2.1/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= -github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es= github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= -github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= @@ -554,11 +409,9 @@ github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -586,8 +439,6 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -604,12 +455,14 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -621,10 +474,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v42 v42.0.0 h1:YNT0FwjPrEysRkLIiKuEfSvBPCGKphW5aS5PxwaoLec= github.com/google/go-github/v42 v42.0.0/go.mod h1:jgg/jvyI0YlDOM1/ps6XYh04HNQ3vKf0CVko62/EhRg= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -637,9 +488,7 @@ github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPg github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -647,45 +496,29 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/readahead v0.0.0-20161222183148-eaceba169032/go.mod h1:qYysrqQXuV4tzsizt4oOQ6mrBZQ0xnQXP3ylXX8Jk5Y= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0 h1:nRJtk3y8Fm770D42QV6T90ZnvFZyk7agSo3Q+Z9p3WI= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwuTCM= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -694,78 +527,54 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -799,38 +608,24 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kubeflow/common v0.4.0/go.mod h1:X15/dRQQoB77wrqrPwVn4GqG2ubgk8xR24A80i61d/4= -github.com/kubeflow/mpi-operator/v2 v2.0.0-20210920181600-c5c0c3ef99ec/go.mod h1:cTBmZKLlrIXBWQ0A9Ik8h0i4zoGhR7ApHwUfrLDbhQc= -github.com/kubeflow/pytorch-operator v0.6.0/go.mod h1:zHblV+yTwVG4PCgKTU2wPfOmQ6TJdfT87lDfHrP1a1Y= -github.com/kubeflow/tf-operator v0.5.3/go.mod h1:EBtz5LQoKaHUl/5fV5vD1qXVNVNyn3TrFaH6eVoQ8SY= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 h1:O664tckOIC4smyHDDJPXAh/YBYYc0Y1O8S5wmZDm3d8= github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -841,20 +636,12 @@ github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= @@ -878,49 +665,35 @@ github.com/mouuff/go-rocket-update v1.5.1 h1:qGgUu/MP+aVQ63laEguRNimmNTPKs29xz0l github.com/mouuff/go-rocket-update v1.5.1/go.mod h1:CnOyUYCxAJyC1g1mebSGC7gJysLTlX+RpxKgD1B0zLs= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -947,27 +720,14 @@ github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mo github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0= github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -975,83 +735,59 @@ github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= -github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -1064,25 +800,19 @@ github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= @@ -1094,23 +824,18 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= -github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1118,24 +843,24 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= @@ -1156,7 +881,6 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= @@ -1165,70 +889,41 @@ github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRz go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f h1:OeJjE6G4dgCY4PIXvIRQbE8+RX+uXZyGhUy/ksMGJoc= -golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1239,8 +934,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220428152302-39d4317da171 h1:TfdoLivD44QwvssI9Sv1xwa5DcL5XQr4au4sZ2F2NV4= -golang.org/x/exp v0.0.0-20220428152302-39d4317da171/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1254,7 +949,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1266,22 +960,15 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1310,7 +997,6 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1319,22 +1005,14 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1343,19 +1021,13 @@ golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1367,21 +1039,13 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1407,7 +1071,6 @@ golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1433,7 +1096,6 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1445,14 +1107,12 @@ golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1461,34 +1121,19 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1497,23 +1142,21 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1524,18 +1167,12 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1543,7 +1180,6 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1559,16 +1195,12 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1576,22 +1208,14 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1608,33 +1232,14 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.38.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.76.0 h1:UkZl25bR1FHNqtK/EKs3vCdpZtUO6gea3YElTwc8pQg= -google.golang.org/api v0.76.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -1649,7 +1254,6 @@ google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1667,6 +1271,7 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1676,66 +1281,27 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200831141814-d751682dd103/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220405205423-9d709892a2bf/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 h1:G1IeWbjrqEq9ChWxEuRPJu6laA67+XgTFHVSAvepr38= -google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= @@ -1748,25 +1314,14 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0 h1:oCjezcn6g6A75TGoKYBPgKmVBLexhYLM6MebdrPApP8= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1780,8 +1335,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1794,23 +1349,17 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/kothar/go-backblaze.v0 v0.0.0-20190520213052-702d4e7eb465/go.mod h1:zJ2QpyDCYo1KvLXlmdnFlQAyF/Qfth0fB8239Qg7BIE= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1821,19 +1370,17 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/gorm v1.22.4/go.mod h1:1aeVC+pe9ZmvKZban/gW4QPra7PRoTEssyc922qCAkk= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1841,127 +1388,64 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= -k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= -k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= -k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= -k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/api v0.19.6/go.mod h1:Plxx44Nh4zVblkJrIgxVPgPre1mvng6tXf1Sj3bs0fU= -k8s.io/api v0.19.9/go.mod h1:RcFj+riKQ1fAITdmtA6InI3LVEeKi+9LuvU7GVMeXJI= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.21.3 h1:cblWILbLO8ar+Fj6xdDGr603HRsf8Wu9E9rngJeprZQ= -k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg= -k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= -k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= -k8s.io/apiextensions-apiserver v0.20.1 h1:ZrXQeslal+6zKM/HjDXLzThlz/vPSxrfK3OqL8txgVQ= -k8s.io/apiextensions-apiserver v0.20.1/go.mod h1:ntnrZV+6a3dB504qwC5PN/Yg9PBiDNt1EVqbW2kORVk= -k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= -k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= -k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.19.6/go.mod h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6Q= -k8s.io/apimachinery v0.19.9/go.mod h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6Q= +k8s.io/api v0.24.1 h1:BjCMRDcyEYz03joa3K1+rbshwh1Ay6oB53+iUx2H8UY= +k8s.io/api v0.24.1/go.mod h1:JhoOvNiLXKTPQ60zh2g0ewpA+bnEYf5q44Flhquh4vQ= +k8s.io/apiextensions-apiserver v0.24.1 h1:5yBh9+ueTq/kfnHQZa0MAo6uNcPrtxPMpNQgorBaKS0= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.21.3 h1:3Ju4nvjCngxxMYby0BimUk+pQHPOQp3eCGChk5kfVII= -k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI= -k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= -k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= -k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= -k8s.io/apiserver v0.19.6/go.mod h1:05XquZxCDzQ27ebk7uV2LrFIK4lm5Yt47XkkUvLAoAM= -k8s.io/apiserver v0.19.9/go.mod h1:g6zpD+kcZFlO73pktPWRvL0tUGqj7/KaOowmRk8EpGg= +k8s.io/apimachinery v0.24.1 h1:ShD4aDxTQKN5zNf8K1RQ2u98ELLdIW7jEnlO9uAMX/I= +k8s.io/apimachinery v0.24.1/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= -k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= -k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= -k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= -k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= -k8s.io/client-go v0.19.6/go.mod h1:gEiS+efRlXYUEQ9Oz4lmNXlxAl5JZ8y2zbTDGhvXXnk= -k8s.io/client-go v0.19.9/go.mod h1:8GArfSmN7MwTidMGcLGM3QTYa7uekI/B6IOrM0s1XPs= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.2/go.mod h1:kH5brqWqp7HDxUFKoEgiI4v8G1xzbe9giaCenUWJzgE= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.21.3 h1:J9nxZTOmvkInRDCzcSNQmPJbDYN/PjlxXT9Mos3HcLg= -k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU= -k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= -k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.19.6/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.19.9/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= -k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= -k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= -k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= -k8s.io/component-base v0.19.6/go.mod h1:8Btsf8J00/fVDa/YFmXjei7gVkcFrlKZXjSeP4SZNJg= -k8s.io/component-base v0.19.9/go.mod h1:x9UmpImvXgVry1s9/hINgLz6iGBYUGvy3Xm7KZh1nnI= +k8s.io/client-go v0.24.1 h1:w1hNdI9PFrzu3OlovVeTnf4oHDt+FJLd9Ndluvnb42E= +k8s.io/client-go v0.24.1/go.mod h1:f1kIDqcEYmwXS/vTbbhopMUbhKp2JhOeVTfxgaCIlF8= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.2/go.mod h1:pzFtCiwe/ASD0iV7ySMu8SYVJjCapNM9bjvk7ptpKh0= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/sample-controller v0.19.9/go.mod h1:pzC7f1rPpf0+o9rg45Ju8GY83nGARzWABmPblej9v/M= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ= -k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY= +k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E= -sigs.k8s.io/controller-runtime v0.7.2/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= -sigs.k8s.io/controller-runtime v0.8.2/go.mod h1:U/l+DUopBc1ecfRZ5aviA9JDmGFQKvLf5YkZNx2e0sU= -sigs.k8s.io/controller-tools v0.3.0/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -volcano.sh/apis v1.2.0-k8s1.19.6/go.mod h1:UaeJ/s5Hyd+ZhFLc+Kw9YlgM8gRZ/5OzXqHa0yKOoXY= diff --git a/flytectl/main.go b/flytectl/main.go index ba6248d121..b410bcd0b6 100644 --- a/flytectl/main.go +++ b/flytectl/main.go @@ -4,8 +4,8 @@ import ( "context" "os" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flytectl/cmd" - "github.com/flyteorg/flytestdlib/logger" ) func main() { diff --git a/flytectl/pkg/adminutils/config.go b/flytectl/pkg/adminutils/config.go index 71f0a3f476..04bb5d81e6 100644 --- a/flytectl/pkg/adminutils/config.go +++ b/flytectl/pkg/adminutils/config.go @@ -1,6 +1,6 @@ package adminutils -import "github.com/flyteorg/flytestdlib/config" +import "github.com/flyteorg/flyte/flytestdlib/config" //go:generate pflags Config --default-var DefaultConfig --bind-default-var diff --git a/flytectl/pkg/ext/attribute_match_deleter_test.go b/flytectl/pkg/ext/attribute_match_deleter_test.go index c0105f99ce..885eff0585 100644 --- a/flytectl/pkg/ext/attribute_match_deleter_test.go +++ b/flytectl/pkg/ext/attribute_match_deleter_test.go @@ -5,8 +5,8 @@ import ( "fmt" "testing" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/pkg/ext/attribute_match_fetcher.go b/flytectl/pkg/ext/attribute_match_fetcher.go index 5106a170a1..eca2ce8e15 100644 --- a/flytectl/pkg/ext/attribute_match_fetcher.go +++ b/flytectl/pkg/ext/attribute_match_fetcher.go @@ -6,7 +6,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) func (a *AdminFetcherExtClient) FetchWorkflowAttributes(ctx context.Context, project, domain, name string, diff --git a/flytectl/pkg/ext/attribute_match_fetcher_test.go b/flytectl/pkg/ext/attribute_match_fetcher_test.go index 663e6e620b..b9ecff16d6 100644 --- a/flytectl/pkg/ext/attribute_match_fetcher_test.go +++ b/flytectl/pkg/ext/attribute_match_fetcher_test.go @@ -5,8 +5,8 @@ import ( "fmt" "testing" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/pkg/ext/attribute_match_updater.go b/flytectl/pkg/ext/attribute_match_updater.go index 44d00c394c..9153b8b35f 100644 --- a/flytectl/pkg/ext/attribute_match_updater.go +++ b/flytectl/pkg/ext/attribute_match_updater.go @@ -3,7 +3,7 @@ package ext import ( "context" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) func (a *AdminUpdaterExtClient) UpdateWorkflowAttributes(ctx context.Context, project, domain, name string, matchingAttr *admin.MatchingAttributes) error { diff --git a/flytectl/pkg/ext/attribute_match_updater_test.go b/flytectl/pkg/ext/attribute_match_updater_test.go index 0c331c9ef5..1fab0f6795 100644 --- a/flytectl/pkg/ext/attribute_match_updater_test.go +++ b/flytectl/pkg/ext/attribute_match_updater_test.go @@ -5,8 +5,8 @@ import ( "fmt" "testing" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/pkg/ext/attribute_matcher_deleter.go b/flytectl/pkg/ext/attribute_matcher_deleter.go index ef8a5730fb..e53490eaad 100644 --- a/flytectl/pkg/ext/attribute_matcher_deleter.go +++ b/flytectl/pkg/ext/attribute_matcher_deleter.go @@ -3,7 +3,7 @@ package ext import ( "context" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) func (a *AdminDeleterExtClient) DeleteWorkflowAttributes(ctx context.Context, project, domain, name string, rsType admin.MatchableResource) error { diff --git a/flytectl/pkg/ext/deleter.go b/flytectl/pkg/ext/deleter.go index db5d97a748..6b848cb278 100644 --- a/flytectl/pkg/ext/deleter.go +++ b/flytectl/pkg/ext/deleter.go @@ -3,8 +3,8 @@ package ext import ( "context" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" ) //go:generate mockery -all -case=underscore diff --git a/flytectl/pkg/ext/deleter_test.go b/flytectl/pkg/ext/deleter_test.go index 17666b021d..7a307577bb 100644 --- a/flytectl/pkg/ext/deleter_test.go +++ b/flytectl/pkg/ext/deleter_test.go @@ -3,7 +3,7 @@ package ext import ( "testing" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/pkg/ext/execution_fetcher.go b/flytectl/pkg/ext/execution_fetcher.go index 24251b39f6..41ebea9b16 100644 --- a/flytectl/pkg/ext/execution_fetcher.go +++ b/flytectl/pkg/ext/execution_fetcher.go @@ -3,9 +3,9 @@ package ext import ( "context" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" ) func (a *AdminFetcherExtClient) FetchExecution(ctx context.Context, name, project, domain string) (*admin.Execution, error) { diff --git a/flytectl/pkg/ext/execution_fetcher_test.go b/flytectl/pkg/ext/execution_fetcher_test.go index a415660f5c..304f929880 100644 --- a/flytectl/pkg/ext/execution_fetcher_test.go +++ b/flytectl/pkg/ext/execution_fetcher_test.go @@ -5,9 +5,9 @@ import ( "fmt" "testing" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/pkg/ext/fetcher.go b/flytectl/pkg/ext/fetcher.go index 790eebde0e..2df2f2799c 100644 --- a/flytectl/pkg/ext/fetcher.go +++ b/flytectl/pkg/ext/fetcher.go @@ -5,8 +5,8 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" ) //go:generate mockery -all -case=underscore diff --git a/flytectl/pkg/ext/fetcher_test.go b/flytectl/pkg/ext/fetcher_test.go index f0ddffebd4..2654f5b538 100644 --- a/flytectl/pkg/ext/fetcher_test.go +++ b/flytectl/pkg/ext/fetcher_test.go @@ -3,7 +3,7 @@ package ext import ( "testing" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/pkg/ext/launch_plan_fetcher.go b/flytectl/pkg/ext/launch_plan_fetcher.go index ad24b3abb5..76ee524993 100644 --- a/flytectl/pkg/ext/launch_plan_fetcher.go +++ b/flytectl/pkg/ext/launch_plan_fetcher.go @@ -6,8 +6,8 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" ) // FetchAllVerOfLP fetches all the versions for give launch plan name diff --git a/flytectl/pkg/ext/launch_plan_fetcher_test.go b/flytectl/pkg/ext/launch_plan_fetcher_test.go index 39d0121c93..c2cf3140a4 100644 --- a/flytectl/pkg/ext/launch_plan_fetcher_test.go +++ b/flytectl/pkg/ext/launch_plan_fetcher_test.go @@ -7,9 +7,9 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go b/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go index 414cd17f54..c165501cd5 100644 --- a/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_deleter_ext_interface.go @@ -5,11 +5,11 @@ package mocks import ( context "context" - admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + admin "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" mock "github.com/stretchr/testify/mock" - service "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + service "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" ) // AdminDeleterExtInterface is an autogenerated mock type for the AdminDeleterExtInterface type diff --git a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go index 7d8e1ee284..b2e9814fb5 100644 --- a/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_fetcher_ext_interface.go @@ -5,13 +5,13 @@ package mocks import ( context "context" - admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + admin "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" filters "github.com/flyteorg/flytectl/pkg/filters" mock "github.com/stretchr/testify/mock" - service "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + service "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" ) // AdminFetcherExtInterface is an autogenerated mock type for the AdminFetcherExtInterface type diff --git a/flytectl/pkg/ext/mocks/admin_service_fetcher_ext_interface.go b/flytectl/pkg/ext/mocks/admin_service_fetcher_ext_interface.go index df851c5d29..74b08a115a 100644 --- a/flytectl/pkg/ext/mocks/admin_service_fetcher_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_service_fetcher_ext_interface.go @@ -5,11 +5,11 @@ package mocks import ( context "context" - admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + admin "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" mock "github.com/stretchr/testify/mock" - service "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + service "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" ) // AdminServiceFetcherExtInterface is an autogenerated mock type for the AdminServiceFetcherExtInterface type diff --git a/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go b/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go index a59d8ca748..c1d9bc7e34 100644 --- a/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go +++ b/flytectl/pkg/ext/mocks/admin_updater_ext_interface.go @@ -5,11 +5,11 @@ package mocks import ( context "context" - admin "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + admin "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" mock "github.com/stretchr/testify/mock" - service "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + service "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" ) // AdminUpdaterExtInterface is an autogenerated mock type for the AdminUpdaterExtInterface type diff --git a/flytectl/pkg/ext/project_fetcher.go b/flytectl/pkg/ext/project_fetcher.go index 3834952877..2bac88296c 100644 --- a/flytectl/pkg/ext/project_fetcher.go +++ b/flytectl/pkg/ext/project_fetcher.go @@ -6,7 +6,7 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" ) func (a *AdminFetcherExtClient) ListProjects(ctx context.Context, filter filters.Filters) (*admin.Projects, error) { diff --git a/flytectl/pkg/ext/project_fetcher_test.go b/flytectl/pkg/ext/project_fetcher_test.go index 4b9c505485..d89d153aaa 100644 --- a/flytectl/pkg/ext/project_fetcher_test.go +++ b/flytectl/pkg/ext/project_fetcher_test.go @@ -3,8 +3,8 @@ package ext import ( "testing" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) diff --git a/flytectl/pkg/ext/task_fetcher.go b/flytectl/pkg/ext/task_fetcher.go index 2c3366a5c0..3240c46214 100644 --- a/flytectl/pkg/ext/task_fetcher.go +++ b/flytectl/pkg/ext/task_fetcher.go @@ -6,8 +6,8 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" ) func (a *AdminFetcherExtClient) FetchAllVerOfTask(ctx context.Context, name, project, domain string, filter filters.Filters) ([]*admin.Task, error) { diff --git a/flytectl/pkg/ext/task_fetcher_test.go b/flytectl/pkg/ext/task_fetcher_test.go index 0bfc9ef8dd..a1f605272a 100644 --- a/flytectl/pkg/ext/task_fetcher_test.go +++ b/flytectl/pkg/ext/task_fetcher_test.go @@ -7,9 +7,9 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/pkg/ext/updater.go b/flytectl/pkg/ext/updater.go index a87afd4ca0..5121057d5b 100644 --- a/flytectl/pkg/ext/updater.go +++ b/flytectl/pkg/ext/updater.go @@ -3,8 +3,8 @@ package ext import ( "context" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/service" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" ) //go:generate mockery -all -case=underscore diff --git a/flytectl/pkg/ext/updater_test.go b/flytectl/pkg/ext/updater_test.go index 6e692c44cf..cdb21cf603 100644 --- a/flytectl/pkg/ext/updater_test.go +++ b/flytectl/pkg/ext/updater_test.go @@ -3,7 +3,7 @@ package ext import ( "testing" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/pkg/ext/workflow_fetcher.go b/flytectl/pkg/ext/workflow_fetcher.go index 98438e06f8..7b0bf9d82c 100644 --- a/flytectl/pkg/ext/workflow_fetcher.go +++ b/flytectl/pkg/ext/workflow_fetcher.go @@ -6,8 +6,8 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" ) // FetchAllVerOfWorkflow fetches all the versions for give workflow name diff --git a/flytectl/pkg/ext/workflow_fetcher_test.go b/flytectl/pkg/ext/workflow_fetcher_test.go index da027566e2..b035e71a99 100644 --- a/flytectl/pkg/ext/workflow_fetcher_test.go +++ b/flytectl/pkg/ext/workflow_fetcher_test.go @@ -7,9 +7,9 @@ import ( "github.com/flyteorg/flytectl/pkg/filters" - "github.com/flyteorg/flyteidl/clients/go/admin/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" diff --git a/flytectl/pkg/filters/util.go b/flytectl/pkg/filters/util.go index b8584a7a57..a19481e32d 100644 --- a/flytectl/pkg/filters/util.go +++ b/flytectl/pkg/filters/util.go @@ -3,8 +3,8 @@ package filters import ( "strconv" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" ) func BuildResourceListRequestWithName(c Filters, project, domain, name string) (*admin.ResourceListRequest, error) { diff --git a/flytectl/pkg/filters/util_test.go b/flytectl/pkg/filters/util_test.go index 98cb98985c..b1289455a4 100644 --- a/flytectl/pkg/filters/util_test.go +++ b/flytectl/pkg/filters/util_test.go @@ -3,8 +3,8 @@ package filters import ( "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/stretchr/testify/assert" ) diff --git a/flytectl/pkg/github/githubutil.go b/flytectl/pkg/github/githubutil.go index f76d7f7580..2d72b67af7 100644 --- a/flytectl/pkg/github/githubutil.go +++ b/flytectl/pkg/github/githubutil.go @@ -9,10 +9,10 @@ import ( "runtime" "strings" + "github.com/flyteorg/flyte/flytestdlib/logger" + stdlibversion "github.com/flyteorg/flyte/flytestdlib/version" "github.com/flyteorg/flytectl/pkg/platformutil" "github.com/flyteorg/flytectl/pkg/util" - "github.com/flyteorg/flytestdlib/logger" - stdlibversion "github.com/flyteorg/flytestdlib/version" "github.com/google/go-github/v42/github" "github.com/mouuff/go-rocket-update/pkg/provider" diff --git a/flytectl/pkg/github/githubutil_test.go b/flytectl/pkg/github/githubutil_test.go index ec303bd03e..41247ac9e3 100644 --- a/flytectl/pkg/github/githubutil_test.go +++ b/flytectl/pkg/github/githubutil_test.go @@ -6,9 +6,9 @@ import ( "strings" "testing" + stdlibversion "github.com/flyteorg/flyte/flytestdlib/version" "github.com/flyteorg/flytectl/pkg/github/mocks" "github.com/flyteorg/flytectl/pkg/platformutil" - stdlibversion "github.com/flyteorg/flytestdlib/version" "github.com/google/go-github/v42/github" "github.com/stretchr/testify/assert" diff --git a/flytectl/pkg/k8s/k8s_test.go b/flytectl/pkg/k8s/k8s_test.go index 0cf3db31bb..84dc16923c 100644 --- a/flytectl/pkg/k8s/k8s_test.go +++ b/flytectl/pkg/k8s/k8s_test.go @@ -33,7 +33,7 @@ users: - name: foo-user user: exec: - apiVersion: client.authentication.k8s.io/v1alpha1 + apiVersion: client.authentication.k8s.io/v1beta1 args: - arg-1 - arg-2 diff --git a/flytectl/pkg/printer/printer.go b/flytectl/pkg/printer/printer.go index f1b23d92a8..e3b406b927 100644 --- a/flytectl/pkg/printer/printer.go +++ b/flytectl/pkg/printer/printer.go @@ -9,10 +9,10 @@ import ( "sort" "strings" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flytestdlib/errors" "github.com/flyteorg/flytectl/pkg/visualize" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flytestdlib/errors" "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" diff --git a/flytectl/pkg/printer/printer_test.go b/flytectl/pkg/printer/printer_test.go index 6d5441b9af..06d4c2c31d 100644 --- a/flytectl/pkg/printer/printer_test.go +++ b/flytectl/pkg/printer/printer_test.go @@ -7,8 +7,8 @@ import ( "testing" "time" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/golang/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index 6fb649ab7b..c8e6b7a56b 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -13,6 +13,7 @@ import ( "github.com/docker/docker/api/types/mount" "github.com/docker/go-connections/nat" "github.com/enescakir/emoji" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flytectl/clierrors" dockerCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/docker" sandboxCmdConfig "github.com/flyteorg/flytectl/cmd/config/subcommand/sandbox" @@ -21,7 +22,6 @@ import ( "github.com/flyteorg/flytectl/pkg/github" "github.com/flyteorg/flytectl/pkg/k8s" "github.com/flyteorg/flytectl/pkg/util" - "github.com/flyteorg/flytestdlib/logger" "github.com/kataras/tablewriter" corev1api "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/flytectl/pkg/visualize/graphviz.go b/flytectl/pkg/visualize/graphviz.go index 08aa188716..d088a2515b 100644 --- a/flytectl/pkg/visualize/graphviz.go +++ b/flytectl/pkg/visualize/graphviz.go @@ -4,10 +4,10 @@ import ( "fmt" "strings" - "github.com/flyteorg/flyteidl/clients/go/coreutils" + "github.com/flyteorg/flyte/flyteidl/clients/go/coreutils" graphviz "github.com/awalterschulze/gographviz" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" ) const ( diff --git a/flytectl/pkg/visualize/graphviz_test.go b/flytectl/pkg/visualize/graphviz_test.go index 56b8621e2f..710ce01f1d 100644 --- a/flytectl/pkg/visualize/graphviz_test.go +++ b/flytectl/pkg/visualize/graphviz_test.go @@ -6,8 +6,8 @@ import ( "io/ioutil" "testing" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytectl/pkg/visualize/mocks" - "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" graphviz "github.com/awalterschulze/gographviz" "github.com/golang/protobuf/jsonpb" From 664a604de50ef1907eeff428eb6abb72157f8760 Mon Sep 17 00:00:00 2001 From: Honnix Date: Thu, 26 Oct 2023 22:32:19 +0200 Subject: [PATCH 328/645] Fix self-upgrade (#437) Signed-off-by: Hongxin Liang --- flytectl/.goreleaser.yml | 6 +++--- flytectl/Makefile | 2 +- flytectl/docs/source/index.rst | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flytectl/.goreleaser.yml b/flytectl/.goreleaser.yml index 732586b758..018b9d48cb 100644 --- a/flytectl/.goreleaser.yml +++ b/flytectl/.goreleaser.yml @@ -13,7 +13,7 @@ builds: - arm64 - amd64 ldflags: - - -s -w -X github.com/flyteorg/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flytestdlib/version.BuildTime={{.Date}} + - -s -w -X github.com/flyteorg/flyte/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flyte/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flyte/flytestdlib/version.BuildTime={{.Date}} - env: - CGO_ENABLED=0 main: ./main.go @@ -25,7 +25,7 @@ builds: - arm64 - amd64 ldflags: - - -s -w -X github.com/flyteorg/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flytestdlib/version.BuildTime={{.Date}} + - -s -w -X github.com/flyteorg/flyte/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flyte/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flyte/flytestdlib/version.BuildTime={{.Date}} - env: - CGO_ENABLED=0 main: ./main.go @@ -34,7 +34,7 @@ builds: goos: - windows ldflags: - - -s -w -X github.com/flyteorg/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flytestdlib/version.BuildTime={{.Date}} + - -s -w -X github.com/flyteorg/flyte/flytestdlib/version.Version={{.Version}} -X github.com/flyteorg/flyte/flytestdlib/version.Build={{.ShortCommit}} -X github.com/flyteorg/flyte/flytestdlib/version.BuildTime={{.Date}} archives: - name_template: |- {{ .ProjectName }}_ diff --git a/flytectl/Makefile b/flytectl/Makefile index d515ffa462..e190089133 100644 --- a/flytectl/Makefile +++ b/flytectl/Makefile @@ -5,7 +5,7 @@ include boilerplate/flyte/precommit/Makefile GIT_VERSION := $(shell git describe --always --tags) GIT_HASH := $(shell git rev-parse --short HEAD) TIMESTAMP := $(shell date '+%Y-%m-%d') -PACKAGE ?=github.com/flyteorg/flytestdlib +PACKAGE ?=github.com/flyteorg/flyte/flytestdlib LD_FLAGS="-s -w -X $(PACKAGE)/version.Version=$(GIT_VERSION) -X $(PACKAGE)/version.Build=$(GIT_HASH) -X $(PACKAGE)/version.BuildTime=$(TIMESTAMP)" diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 3a10b2437a..66dc363f8d 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -95,7 +95,7 @@ The full list of available configurable options can be found by running ``flytec .. tabbed:: Others - For other supported storage backends like Oracle, Azure, etc., refer to the configuration structure `here `__. + For other supported storage backends like Oracle, Azure, etc., refer to the configuration structure `here `__. Place the config file in ``$HOME/.flyte`` directory with the name config.yaml. This file is typically searched in: From 2e49f752fb1497729274bf72c5b2c1a699be4731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Murat=20Can=20=C3=9Cste?= Date: Wed, 1 Nov 2023 02:07:45 +0100 Subject: [PATCH 329/645] Fix project status change on update for archived projects (#438) Before, updating some field (i.e. `Description`) of an `Archived` project causes the project state to change to `Active`. This is caused by a bug in the `updateProjectsFunc` function used for the `update` command. During project updates, `edited`, a default project created based on the given configs/flags, comes with `admin.Project_ACTIVE` state by default if both `activate` and `archive` flags have not been set. Then a `copy` of the target project will be updated based on `edited` and then used for showing the diff. In the current implementation, the state of the `copy` is set to be the same as `edited` projects state, which is `Project_ACTIVE` if no flags are set. Also, after showing the diff, the `edited` is used for updating the project. Since it comes with `Project_ACTIVE` state by default, the target project will be updated to have `Project_ACTIVE` if both `activate` and `archive` flags are unset, regardless of the projects previous state. On this PR, we make sure we set the correct state to both `copy` and `edited` by checking if both `activate` and `archive` flags are set/unset. If one of the flags are set, we update target project state (`copy`) based on the `edited` state since it will have the desired state. If both flags are unset, we set the `edited` state to be the same as target (`copy`) state. This way, updating `archived` projects will not change their state. Signed-off-by: mcanueste --- flytectl/cmd/update/project.go | 34 +++++++++++++++++++++++++---- flytectl/cmd/update/project_test.go | 29 +++++++++++++++++++----- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index b9c2f17e90..215f2393d8 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -6,6 +6,7 @@ import ( "os" "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" @@ -85,7 +86,9 @@ Usage ) func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - edits, err := project.DefaultProjectConfig.GetProjectSpec(config.GetConfig()) + projectConfig := project.DefaultProjectConfig + + edits, err := projectConfig.GetProjectSpec(config.GetConfig()) if err != nil { return err } @@ -103,7 +106,7 @@ func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comma // have a complete set of project's fields - it will only contain fields that // the update command allows updating. (For example, it won't have Domains field // initialized.) - currentProjectWithEdits := copyProjectWithEdits(currentProject, edits) + currentProjectWithEdits := copyProjectWithEdits(currentProject, edits, projectConfig) patch, err := DiffAsYaml(diffPathBefore, diffPathAfter, currentProject, currentProjectWithEdits) if err != nil { panic(err) @@ -136,10 +139,9 @@ func updateProjectsFunc(ctx context.Context, args []string, cmdCtx cmdCore.Comma // Makes a shallow copy of target and applies certain properties from edited to it. // The properties applied are only the ones supported by update command: state, name, // description, labels, etc. -func copyProjectWithEdits(target *admin.Project, edited *admin.Project) *admin.Project { +func copyProjectWithEdits(target *admin.Project, edited *admin.Project, projectConfig *project.ConfigProject) *admin.Project { copy := *target - copy.State = edited.State if edited.Name != "" { copy.Name = edited.Name } @@ -150,5 +152,29 @@ func copyProjectWithEdits(target *admin.Project, edited *admin.Project) *admin.P copy.Labels = edited.Labels } + // `edited` comes with `admin.Project_ACTIVE` state by default + // if both `activate` and `archive` flags have not been set. + // + // This will overwrite state of `copy` if we directly set it + // without checking for flags, which will show up on the diff. + // + // Also, after showing the diff, the `edited` is used for updating + // the project, which comes with `Project_ACTIVE` by default + // unless overwritten. Therefore, on the `else` block, + // we overwrite the `edited` with the state of `copy` + // if both `archive` and `activate` flags are unset. + // + // This is a bit hacky IMO. Proper solution would be to + // refactor `project.ConfigProject` and this file in order to + // separate the logic of setting `ConfigProject` struct fields + // from creation of a 'default' project based on those flags. + // Having a proper order of precedence between global config, + // YAML file input, and the flags for `ConfigProject` would also + // be good. + if projectConfig.Archive || projectConfig.Activate { + copy.State = edited.State + } else { + edited.State = copy.State + } return © } diff --git a/flytectl/cmd/update/project_test.go b/flytectl/cmd/update/project_test.go index 2f3fd11aed..1ef2c7b267 100644 --- a/flytectl/cmd/update/project_test.go +++ b/flytectl/cmd/update/project_test.go @@ -5,14 +5,13 @@ import ( "testing" "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + + "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/project" "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flytectl/pkg/ext" - - "github.com/flyteorg/flytectl/cmd/config" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" ) func TestProjectCanBeActivated(t *testing.T) { @@ -184,6 +183,26 @@ func TestProjectUpdateRequiresProjectId(t *testing.T) { }) } +func TestProjectUpdateDoesNotActivateArchivedProject(t *testing.T) { + testProjectUpdate( + /* setup */ func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project) { + project.State = admin.Project_ARCHIVED + config.Activate = false + config.Archive = false + config.Description = testutils.RandomName(12) + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateProject", s.Ctx, + mock.MatchedBy( + func(r *admin.Project) bool { + return r.State == admin.Project_ARCHIVED + })) + }) +} + func testProjectUpdate( setup func(s *testutils.TestStruct, config *project.ConfigProject, project *admin.Project), asserter func(s *testutils.TestStruct, err error), From 07f158df6598ef63106f1f0fd17aa9b75311afd7 Mon Sep 17 00:00:00 2001 From: Jeev B Date: Wed, 1 Nov 2023 12:49:48 -0700 Subject: [PATCH 330/645] Misc cleanups to aesthetics (#441) * Misc cleanups to aesthetics Signed-off-by: Jeev B * make generate Signed-off-by: Jeev B * Fix getting started test Signed-off-by: Jeev B * Fix tests Signed-off-by: Jeev B * Free up space in github runner for getting started test Signed-off-by: Jeev B * Check for pod ready condition instead of just phase Signed-off-by: Jeev B * Fix test Signed-off-by: Jeev B * Add a short sleep for sandbox to be ready to serve requests Signed-off-by: Jeev B --------- Signed-off-by: Jeev B --- flytectl/.github/workflows/checks.yml | 9 ++- flytectl/cmd/configuration/configuration.go | 2 +- flytectl/go.mod | 5 +- flytectl/go.sum | 4 ++ flytectl/pkg/docker/docker_util.go | 63 ++++++++++++++------- flytectl/pkg/docker/docker_util_test.go | 49 ++++++++++++---- flytectl/pkg/k8s/k8s.go | 10 ++-- flytectl/pkg/k8s/mocks/context_ops.go | 14 ++--- flytectl/pkg/sandbox/start.go | 41 ++++++++------ flytectl/pkg/sandbox/start_test.go | 62 ++++++++++++-------- 10 files changed, 171 insertions(+), 88 deletions(-) diff --git a/flytectl/.github/workflows/checks.yml b/flytectl/.github/workflows/checks.yml index d7d36c4b18..2c036ba3a4 100644 --- a/flytectl/.github/workflows/checks.yml +++ b/flytectl/.github/workflows/checks.yml @@ -63,6 +63,7 @@ jobs: name: Test Getting started runs-on: ubuntu-latest steps: + - uses: insightsengineering/disk-space-reclaimer@v1 - name: Checkout uses: actions/checkout@v2 - uses: actions/cache@v2 @@ -78,7 +79,13 @@ jobs: - name: Build Flytectl binary run: make compile - name: Create a sandbox cluster - run: bin/flytectl sandbox start + run: | + bin/flytectl demo start + # Sleep is necessary here since `flyte-proxy` might not be ready + # to serve requests when the above command exits successfully. + # Fixed in: https://github.com/flyteorg/flyte/pull/4348 + # TODO (jeev): Remove this when ^ is released. + sleep 5 - name: Setup flytectl config run: bin/flytectl config init - name: Register cookbook diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index 7f06f92094..010416e36d 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -87,7 +87,7 @@ func initFlytectlConfig(reader io.Reader) error { } templateValues := configutil.ConfigTemplateSpec{ - Host: "dns:///localhost:30081", + Host: "dns:///localhost:30080", Insecure: true, } templateStr := configutil.GetTemplate() diff --git a/flytectl/go.mod b/flytectl/go.mod index 0344faeca5..4beaf4d5a6 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -3,6 +3,7 @@ module github.com/flyteorg/flytectl go 1.19 require ( + github.com/apoorvam/goterminal v0.0.0-20180523175556-614d345c47e5 github.com/avast/retry-go v3.0.0+incompatible github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/disiqueira/gotree v1.0.0 @@ -22,6 +23,7 @@ require ( github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23 github.com/landoop/tableprinter v0.0.0-20180806200924-8bd8c2576d27 github.com/mitchellh/mapstructure v1.5.0 + github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 github.com/mouuff/go-rocket-update v1.5.1 github.com/opencontainers/image-spec v1.0.2 github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 @@ -41,6 +43,7 @@ require ( k8s.io/api v0.24.1 k8s.io/apimachinery v0.24.1 k8s.io/client-go v0.24.1 + k8s.io/kubernetes v1.13.0 sigs.k8s.io/yaml v1.3.0 ) @@ -54,6 +57,7 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/azcore v0.23.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.27 // indirect github.com/Azure/go-autorest/autorest/adal v0.9.18 // indirect @@ -113,7 +117,6 @@ require ( github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/morikuni/aec v1.0.0 // indirect diff --git a/flytectl/go.sum b/flytectl/go.sum index 41bdd143c0..00892a2001 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -123,6 +123,8 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apoorvam/goterminal v0.0.0-20180523175556-614d345c47e5 h1:VYqcjykqpcq262cDxBAkAelSdg6HETkxgwzQRTS40Aw= +github.com/apoorvam/goterminal v0.0.0-20180523175556-614d345c47e5/go.mod h1:E7x8aDc3AQzDKjEoIZCt+XYheHk2OkP+p2UgeNjecH8= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= @@ -282,6 +284,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKY github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= @@ -1426,6 +1429,7 @@ k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAG k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= +k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/flytectl/pkg/docker/docker_util.go b/flytectl/pkg/docker/docker_util.go index 77475f8667..e9315cab1e 100644 --- a/flytectl/pkg/docker/docker_util.go +++ b/flytectl/pkg/docker/docker_util.go @@ -17,12 +17,14 @@ import ( "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/volume" + "github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/stdcopy" "github.com/docker/go-connections/nat" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config/subcommand/docker" cmdUtil "github.com/flyteorg/flytectl/pkg/commandutils" f "github.com/flyteorg/flytectl/pkg/filesystemutils" + "github.com/moby/term" ) var ( @@ -152,34 +154,51 @@ func PullDockerImage(ctx context.Context, cli Docker, image string, pullPolicy I PrintPullImage(image, imagePullOptions) return nil } - fmt.Printf("%v pulling docker image for release %s\n", emoji.Whale, image) - if pullPolicy == ImagePullPolicyAlways || pullPolicy == ImagePullPolicyIfNotPresent { - if pullPolicy == ImagePullPolicyIfNotPresent { - imageSummary, err := cli.ImageList(ctx, types.ImageListOptions{}) - if err != nil { - return err - } - for _, img := range imageSummary { - for _, tags := range img.RepoTags { - if image == tags { - return nil - } - } - } - } - r, err := cli.ImagePull(ctx, image, types.ImagePullOptions{ - RegistryAuth: imagePullOptions.RegistryAuth, - Platform: imagePullOptions.Platform, - }) + var needsPull bool + if pullPolicy == ImagePullPolicyAlways { + needsPull = true + } else { + imageSummary, err := cli.ImageList(ctx, types.ImageListOptions{}) if err != nil { return err } + found := false + for _, img := range imageSummary { + for _, tags := range img.RepoTags { + if image == tags { + found = true + break + } + } + if found { + break + } + } + needsPull = !found + } - _, err = io.Copy(os.Stdout, r) + // Image already exists, nothing to do. + if !needsPull { + return nil + } + + // Image needs to be pulled but pull policy prevents it + if pullPolicy == ImagePullPolicyNever { + return fmt.Errorf("Image does not exist, but image pull policy prevents pulling it: %s", image) + } + + fmt.Printf("%v Pulling image %s\n", emoji.Whale, image) + r, err := cli.ImagePull(ctx, image, types.ImagePullOptions{ + RegistryAuth: imagePullOptions.RegistryAuth, + Platform: imagePullOptions.Platform, + }) + if err != nil { return err } - return nil + defer r.Close() + termFd, isTerm := term.GetFdInfo(os.Stderr) + return jsonmessage.DisplayJSONMessagesStream(r, os.Stderr, termFd, isTerm, nil) } // PrintPullImage helper function to print the sandbox pull image command @@ -237,7 +256,7 @@ func StartContainer(ctx context.Context, cli Docker, volumes []mount.Mount, expo PrintCreateContainer(volumes, portBindings, name, image, Environment) return "", nil } - fmt.Printf("%v booting Flyte-sandbox container\n", emoji.FactoryWorker) + fmt.Printf("%v Starting container... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) resp, err := cli.ContainerCreate(ctx, &container.Config{ Env: Environment, Image: image, diff --git a/flytectl/pkg/docker/docker_util_test.go b/flytectl/pkg/docker/docker_util_test.go index 32ad1cda12..0de840bb7c 100644 --- a/flytectl/pkg/docker/docker_util_test.go +++ b/flytectl/pkg/docker/docker_util_test.go @@ -5,6 +5,7 @@ import ( "bufio" "context" "fmt" + "io" "os" "path/filepath" "strings" @@ -44,6 +45,10 @@ func setupSandbox() { containers = append(containers, container1) } +func dummyReader() io.ReadCloser { + return io.NopCloser(strings.NewReader("")) +} + func TestGetSandbox(t *testing.T) { setupSandbox() t.Run("Successfully get sandbox container", func(t *testing.T) { @@ -109,44 +114,68 @@ func TestRemoveSandboxWithNoReply(t *testing.T) { } func TestPullDockerImage(t *testing.T) { - t.Run("Successfully pull image Always", func(t *testing.T) { - setupSandbox() + t.Run("Successful pull existing image with ImagePullPolicyAlways", func(t *testing.T) { mockDocker := &mocks.Docker{} ctx := context.Background() // Verify the attributes - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) + mockDocker.OnImageListMatch(ctx, types.ImageListOptions{}).Return([]types.ImageSummary{{RepoTags: []string{"nginx:latest"}}}, nil) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyAlways, ImagePullOptions{}, false) + assert.Nil(t, err) + }) + + t.Run("Successful pull non-existent image with ImagePullPolicyAlways", func(t *testing.T) { + mockDocker := &mocks.Docker{} + ctx := context.Background() + // Verify the attributes + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) + mockDocker.OnImageListMatch(ctx, types.ImageListOptions{}).Return([]types.ImageSummary{}, nil) err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyAlways, ImagePullOptions{}, false) assert.Nil(t, err) }) t.Run("Error in pull image", func(t *testing.T) { - setupSandbox() mockDocker := &mocks.Docker{} ctx := context.Background() // Verify the attributes - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("error")) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), fmt.Errorf("error")) err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyAlways, ImagePullOptions{}, false) assert.NotNil(t, err) }) - t.Run("Successfully pull image IfNotPresent", func(t *testing.T) { - setupSandbox() + t.Run("Success pull non-existent image with ImagePullPolicyIfNotPresent", func(t *testing.T) { mockDocker := &mocks.Docker{} ctx := context.Background() // Verify the attributes - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnImageListMatch(ctx, types.ImageListOptions{}).Return([]types.ImageSummary{}, nil) err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyIfNotPresent, ImagePullOptions{}, false) assert.Nil(t, err) }) - t.Run("Successfully pull image Never", func(t *testing.T) { - setupSandbox() + t.Run("Success skip existing image with ImagePullPolicyIfNotPresent", func(t *testing.T) { + mockDocker := &mocks.Docker{} + ctx := context.Background() + mockDocker.OnImageListMatch(ctx, types.ImageListOptions{}).Return([]types.ImageSummary{{RepoTags: []string{"nginx:latest"}}}, nil) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyIfNotPresent, ImagePullOptions{}, false) + assert.Nil(t, err) + }) + + t.Run("Success skip existing image with ImagePullPolicyNever", func(t *testing.T) { mockDocker := &mocks.Docker{} ctx := context.Background() + mockDocker.OnImageListMatch(ctx, types.ImageListOptions{}).Return([]types.ImageSummary{{RepoTags: []string{"nginx:latest"}}}, nil) err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyNever, ImagePullOptions{}, false) assert.Nil(t, err) }) + + t.Run("Error non-existent image with ImagePullPolicyNever", func(t *testing.T) { + mockDocker := &mocks.Docker{} + ctx := context.Background() + mockDocker.OnImageListMatch(ctx, types.ImageListOptions{}).Return([]types.ImageSummary{}, nil) + err := PullDockerImage(ctx, mockDocker, "nginx:latest", ImagePullPolicyNever, ImagePullOptions{}, false) + assert.ErrorContains(t, err, "Image does not exist, but image pull policy prevents pulling it") + }) } func TestStartContainer(t *testing.T) { diff --git a/flytectl/pkg/k8s/k8s.go b/flytectl/pkg/k8s/k8s.go index 705c6887e6..f185e53d2e 100644 --- a/flytectl/pkg/k8s/k8s.go +++ b/flytectl/pkg/k8s/k8s.go @@ -4,6 +4,7 @@ import ( "fmt" "os" + "github.com/enescakir/emoji" "github.com/pkg/errors" "k8s.io/client-go/kubernetes" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" @@ -18,7 +19,7 @@ type K8s interface { //go:generate mockery -name=ContextOps -case=underscore type ContextOps interface { CheckConfig() error - CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName, targetCtxName string) error + CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName, targetCtxName, targetNamespace string) error RemoveContext(ctxName string) error } @@ -64,7 +65,7 @@ func (k *ContextManager) CheckConfig() error { } // CopyContext copies context srcCtxName part of srcConfigAccess to targetCtxName part of targetConfigAccess. -func (k *ContextManager) CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName, targetCtxName string) error { +func (k *ContextManager) CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName, targetCtxName, targetNamespace string) error { err := k.CheckConfig() if err != nil { return err @@ -86,7 +87,7 @@ func (k *ContextManager) CopyContext(srcConfigAccess clientcmd.ConfigAccess, src _, exists = toStartingConfig.Contexts[targetCtxName] if exists { - fmt.Printf("context %v already exist. Overwriting it\n", targetCtxName) + fmt.Printf("%v Context %q already exists. Overwriting it!\n", emoji.FactoryWorker, targetCtxName) } else { toStartingConfig.Contexts[targetCtxName] = clientcmdapi.NewContext() } @@ -97,12 +98,13 @@ func (k *ContextManager) CopyContext(srcConfigAccess clientcmd.ConfigAccess, src toStartingConfig.AuthInfos[targetCtxName].LocationOfOrigin = k.configAccess.GetDefaultFilename() toStartingConfig.Contexts[targetCtxName].Cluster = targetCtxName toStartingConfig.Contexts[targetCtxName].AuthInfo = targetCtxName + toStartingConfig.Contexts[targetCtxName].Namespace = targetNamespace toStartingConfig.CurrentContext = targetCtxName if err := clientcmd.ModifyConfig(k.configAccess, *toStartingConfig, true); err != nil { return err } - fmt.Printf("context modified for %q and switched over to it.\n", targetCtxName) + fmt.Printf("%v Activated context %q!\n", emoji.FactoryWorker, targetCtxName) return nil } diff --git a/flytectl/pkg/k8s/mocks/context_ops.go b/flytectl/pkg/k8s/mocks/context_ops.go index 6229f02b45..74bd6c7587 100644 --- a/flytectl/pkg/k8s/mocks/context_ops.go +++ b/flytectl/pkg/k8s/mocks/context_ops.go @@ -53,8 +53,8 @@ func (_m ContextOps_CopyContext) Return(_a0 error) *ContextOps_CopyContext { return &ContextOps_CopyContext{Call: _m.Call.Return(_a0)} } -func (_m *ContextOps) OnCopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName string, targetCtxName string) *ContextOps_CopyContext { - c_call := _m.On("CopyContext", srcConfigAccess, srcCtxName, targetCtxName) +func (_m *ContextOps) OnCopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName string, targetCtxName string, targetNamespace string) *ContextOps_CopyContext { + c_call := _m.On("CopyContext", srcConfigAccess, srcCtxName, targetCtxName, targetNamespace) return &ContextOps_CopyContext{Call: c_call} } @@ -63,13 +63,13 @@ func (_m *ContextOps) OnCopyContextMatch(matchers ...interface{}) *ContextOps_Co return &ContextOps_CopyContext{Call: c_call} } -// CopyContext provides a mock function with given fields: srcConfigAccess, srcCtxName, targetCtxName -func (_m *ContextOps) CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName string, targetCtxName string) error { - ret := _m.Called(srcConfigAccess, srcCtxName, targetCtxName) +// CopyContext provides a mock function with given fields: srcConfigAccess, srcCtxName, targetCtxName, targetNamespace +func (_m *ContextOps) CopyContext(srcConfigAccess clientcmd.ConfigAccess, srcCtxName string, targetCtxName string, targetNamespace string) error { + ret := _m.Called(srcConfigAccess, srcCtxName, targetCtxName, targetNamespace) var r0 error - if rf, ok := ret.Get(0).(func(clientcmd.ConfigAccess, string, string) error); ok { - r0 = rf(srcConfigAccess, srcCtxName, targetCtxName) + if rf, ok := ret.Get(0).(func(clientcmd.ConfigAccess, string, string, string) error); ok { + r0 = rf(srcConfigAccess, srcCtxName, targetCtxName, targetNamespace) } else { r0 = ret.Error(0) } diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index c8e6b7a56b..9c9c73fb06 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -9,6 +9,7 @@ import ( "path/filepath" "time" + "github.com/apoorvam/goterminal" "github.com/avast/retry-go" "github.com/docker/docker/api/types/mount" "github.com/docker/go-connections/nat" @@ -27,6 +28,7 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/clientcmd" + "k8s.io/kubernetes/pkg/api/v1/pod" ) const ( @@ -62,13 +64,6 @@ func isNodeTainted(ctx context.Context, client corev1.CoreV1Interface) (bool, er return false, nil } -func isPodReady(v corev1api.Pod) bool { - if (v.Status.Phase == corev1api.PodRunning) || (v.Status.Phase == corev1api.PodSucceeded) { - return true - } - return false -} - func getFlyteDeployment(ctx context.Context, client corev1.CoreV1Interface) (*corev1api.PodList, error) { pods, err := client.Pods(flyteNamespace).List(ctx, v1.ListOptions{}) if err != nil { @@ -78,11 +73,14 @@ func getFlyteDeployment(ctx context.Context, client corev1.CoreV1Interface) (*co } func WatchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface) error { - var data = os.Stdout - table := tablewriter.NewWriter(data) + writer := goterminal.New(os.Stdout) + defer writer.Reset() + + table := tablewriter.NewWriter(writer) table.SetHeader([]string{"Service", "Status", "Namespace"}) table.SetRowLine(true) + done := false for { isTaint, err := isNodeTainted(ctx, appsClient) if err != nil { @@ -100,15 +98,15 @@ func WatchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface table.SetAutoWrapText(false) table.SetAutoFormatHeaders(true) - // Clear os.Stdout - _, _ = data.WriteString("\x1b[3;J\x1b[H\x1b[2J") - var total, ready int total = len(pods.Items) ready = 0 if total != 0 { for _, v := range pods.Items { - if isPodReady(v) { + // TODO (jeev): We should really be using + // `IsContainersReadyConditionTrue`, but that is not available until + // version v1.22.11. We are on v1.13.0 for some reason. + if pod.IsPodReadyConditionTrue(v.Status) { ready++ } if len(v.Status.Conditions) > 0 { @@ -117,14 +115,21 @@ func WatchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface } table.Render() if total == ready { - break + done = true } } else { table.Append([]string{"k8s: This might take a little bit", "Bootstrapping", ""}) table.Render() } - time.Sleep(40 * time.Second) + writer.Clear() + writer.Print() + + if done { + break + } + + time.Sleep(5 * time.Second) } return nil @@ -150,11 +155,11 @@ func UpdateLocalKubeContext(k8sCtxMgr k8s.ContextOps, dockerCtx string, contextN GlobalFile: kubeConfigPath, LoadingRules: clientcmd.NewDefaultClientConfigLoadingRules(), } - return k8sCtxMgr.CopyContext(srcConfigAccess, dockerCtx, contextName) + return k8sCtxMgr.CopyContext(srcConfigAccess, dockerCtx, contextName, flyteNamespace) } func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService, reader io.Reader, sandboxConfig *sandboxCmdConfig.Config, defaultImageName string, defaultImagePrefix string, exposedPorts map[nat.Port]struct{}, portBindings map[nat.Port][]nat.PortBinding, consolePort int) (*bufio.Scanner, error) { - fmt.Printf("%v Bootstrapping a brand new flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) + fmt.Printf("%v Bootstrapping a brand new Flyte cluster... %v %v\n", emoji.FactoryWorker, emoji.Hammer, emoji.Wrench) if sandboxConfig.DryRun { docker.PrintRemoveContainer(docker.FlyteSandboxClusterName) } else { @@ -291,10 +296,10 @@ func StartCluster(ctx context.Context, args []string, sandboxConfig *sandboxCmdC } // Live-ness check + fmt.Printf("%v Waiting for cluster to come up... %v\n", emoji.HourglassNotDone, emoji.HourglassNotDone) err = retry.Do( func() error { // Have to get a new client every time because you run into x509 errors if not - fmt.Println("Waiting for cluster to come up...") k8sClient, err = k8s.GetK8sClient(docker.Kubeconfig, K8sEndpoint) if err != nil { logger.Debugf(ctx, "Error getting K8s client in liveness check %s", err) diff --git a/flytectl/pkg/sandbox/start_test.go b/flytectl/pkg/sandbox/start_test.go index a99f5b91f5..1bfec25e26 100644 --- a/flytectl/pkg/sandbox/start_test.go +++ b/flytectl/pkg/sandbox/start_test.go @@ -3,6 +3,7 @@ package sandbox import ( "context" "fmt" + "io" "io/ioutil" "os" "strings" @@ -69,8 +70,17 @@ var fakeNode = &corev1.Node{ var fakePod = corev1.Pod{ Status: corev1.PodStatus{ - Phase: corev1.PodRunning, - Conditions: []corev1.PodCondition{}, + Phase: corev1.PodRunning, + Conditions: []corev1.PodCondition{ + { + Type: corev1.PodReady, + Status: corev1.ConditionTrue, + }, + { + Type: corev1.ContainersReady, + Status: corev1.ConditionTrue, + }, + }, }, } @@ -97,6 +107,10 @@ func sandboxSetup() { mockDocker.OnContainerWaitMatch(ctx, mock.Anything, container.WaitConditionNotRunning).Return(bodyStatus, errCh) } +func dummyReader() io.ReadCloser { + return io.NopCloser(strings.NewReader("")) +} + func TestStartFunc(t *testing.T) { defaultImagePrefix := "dind" exposedPorts, portBindings, _ := docker.GetSandboxPorts() @@ -117,7 +131,7 @@ func TestStartFunc(t *testing.T) { t.Run("Successfully run demo cluster", func(t *testing.T) { sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, @@ -127,7 +141,7 @@ func TestStartFunc(t *testing.T) { }).Return(nil, nil) mockDocker.OnVolumeList(ctx, filters.NewArgs(filters.KeyValuePair{Key: mock.Anything, Value: mock.Anything})).Return(volume.VolumeListOKBody{Volumes: []*types.Volume{}}, nil) mockDocker.OnVolumeCreate(ctx, volume.VolumeCreateBody{Name: mock.Anything}).Return(types.Volume{}, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + _, err := startSandbox(ctx, mockDocker, githubMock, dummyReader(), config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.Nil(t, err) }) t.Run("Successfully exit when demo cluster exist", func(t *testing.T) { @@ -140,7 +154,7 @@ func TestStartFunc(t *testing.T) { }, }, }, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, @@ -158,14 +172,14 @@ func TestStartFunc(t *testing.T) { sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, }).Return(nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + _, err := startSandbox(ctx, mockDocker, githubMock, dummyReader(), config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.Nil(t, err) }) t.Run("Successfully run demo cluster with abs path of source code", func(t *testing.T) { @@ -174,21 +188,21 @@ func TestStartFunc(t *testing.T) { sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, Timestamps: true, Follow: true, }).Return(nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + _, err := startSandbox(ctx, mockDocker, githubMock, dummyReader(), config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.Nil(t, err) }) t.Run("Successfully run demo cluster with specific version", func(t *testing.T) { sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, ShowStdout: true, @@ -202,7 +216,7 @@ func TestStartFunc(t *testing.T) { }, nil, nil) githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + _, err := startSandbox(ctx, mockDocker, githubMock, dummyReader(), config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.Nil(t, err) }) t.Run("Failed run demo cluster with wrong version", func(t *testing.T) { @@ -210,14 +224,14 @@ func TestStartFunc(t *testing.T) { mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) sandboxCmdConfig.DefaultConfig.Image = "" githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("non-existent-tag")) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + _, err := startSandbox(ctx, mockDocker, githubMock, dummyReader(), sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.NotNil(t, err) assert.Equal(t, "non-existent-tag", err.Error()) }) t.Run("Error in pulling image", func(t *testing.T) { sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, fmt.Errorf("failed to pull")) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), fmt.Errorf("failed to pull")) sandboxCmdConfig.DefaultConfig.Image = "" tag := "v0.15.0" githubMock.OnGetReleaseByTagMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&github.RepositoryRelease{ @@ -225,7 +239,7 @@ func TestStartFunc(t *testing.T) { }, nil, nil) githubMock.OnGetCommitSHA1Match(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("dummySha", nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + _, err := startSandbox(ctx, mockDocker, githubMock, dummyReader(), sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.NotNil(t, err) assert.Equal(t, "failed to pull", err.Error()) }) @@ -239,7 +253,7 @@ func TestStartFunc(t *testing.T) { }, }, }, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnContainerRemove(ctx, mock.Anything, types.ContainerRemoveOptions{Force: true}).Return(fmt.Errorf("failed to remove container")) _, err := startSandbox(ctx, mockDocker, githubMock, strings.NewReader("y"), sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.NotNil(t, err) @@ -248,16 +262,16 @@ func TestStartFunc(t *testing.T) { t.Run("Error in start container", func(t *testing.T) { sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(fmt.Errorf("failed to run container")) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + _, err := startSandbox(ctx, mockDocker, githubMock, dummyReader(), sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.NotNil(t, err) assert.Equal(t, "failed to run container", err.Error()) }) t.Run("Error in reading logs", func(t *testing.T) { sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, @@ -265,14 +279,14 @@ func TestStartFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(nil, fmt.Errorf("failed to get container logs")) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + _, err := startSandbox(ctx, mockDocker, githubMock, dummyReader(), sandboxCmdConfig.DefaultConfig, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.NotNil(t, err) assert.Equal(t, "failed to get container logs", err.Error()) }) t.Run("Error in list container", func(t *testing.T) { sandboxSetup() mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, @@ -280,7 +294,7 @@ func TestStartFunc(t *testing.T) { Timestamps: true, Follow: true, }).Return(nil, nil) - _, err := startSandbox(ctx, mockDocker, githubMock, os.Stdin, config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) + _, err := startSandbox(ctx, mockDocker, githubMock, dummyReader(), config, sandboxImageName, defaultImagePrefix, exposedPorts, portBindings, util.SandBoxConsolePort) assert.NotNil(t, err) assert.Equal(t, "failed to list containers", err.Error()) }) @@ -300,7 +314,7 @@ func TestStartFunc(t *testing.T) { } sandboxSetup() mockDocker.OnContainerList(ctx, types.ContainerListOptions{All: true}).Return([]types.Container{}, nil) - mockDocker.OnImagePullMatch(mock.Anything, mock.Anything, mock.Anything).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(mock.Anything, mock.Anything, mock.Anything).Return(dummyReader(), nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) stringReader := strings.NewReader(docker.SuccessMessage) reader := ioutil.NopCloser(stringReader) @@ -317,7 +331,7 @@ func TestStartFunc(t *testing.T) { k8s.ContextMgr = mockK8sContextMgr ghutil.Client = githubMock mockK8sContextMgr.OnCheckConfig().Return(nil) - mockK8sContextMgr.OnCopyContextMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) + mockK8sContextMgr.OnCopyContextMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) err = StartSandboxCluster(context.Background(), []string{}, config) assert.Nil(t, err) }) @@ -327,7 +341,7 @@ func TestStartFunc(t *testing.T) { sandboxSetup() docker.Client = mockDocker mockDocker.OnContainerListMatch(mock.Anything, mock.Anything).Return([]types.Container{}, fmt.Errorf("failed to list containers")) - mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(os.Stdin, nil) + mockDocker.OnImagePullMatch(ctx, mock.Anything, types.ImagePullOptions{}).Return(dummyReader(), nil) mockDocker.OnContainerStart(ctx, "Hello", types.ContainerStartOptions{}).Return(nil) mockDocker.OnContainerLogsMatch(ctx, mock.Anything, types.ContainerLogsOptions{ ShowStderr: true, From 955392349019719dc72c85e8ba0e63779fd7291a Mon Sep 17 00:00:00 2001 From: Jeev B Date: Wed, 1 Nov 2023 13:15:21 -0700 Subject: [PATCH 331/645] Increase sleep seconds when waiting for sandbox (#442) Signed-off-by: Jeev B --- flytectl/.github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/.github/workflows/checks.yml b/flytectl/.github/workflows/checks.yml index 2c036ba3a4..211a7aab5b 100644 --- a/flytectl/.github/workflows/checks.yml +++ b/flytectl/.github/workflows/checks.yml @@ -85,7 +85,7 @@ jobs: # to serve requests when the above command exits successfully. # Fixed in: https://github.com/flyteorg/flyte/pull/4348 # TODO (jeev): Remove this when ^ is released. - sleep 5 + sleep 10 - name: Setup flytectl config run: bin/flytectl config init - name: Register cookbook From 936a24ac69eae542d353c3d5e7b11e4021f4a0dd Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Wed, 1 Nov 2023 16:46:42 -0700 Subject: [PATCH 332/645] #minor Updated Sandbox config, with automated data configuration (#440) * Updated Sandbox config, with automated data configuration Signed-off-by: Ketan Umare * updated password Signed-off-by: Ketan Umare * updated Signed-off-by: Ketan Umare * Fix tests Signed-off-by: Eduardo Apolinario * Add unit-test Signed-off-by: Eduardo Apolinario --------- Signed-off-by: Ketan Umare Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- flytectl/pkg/configutil/configutil.go | 29 +++++++++++---- flytectl/pkg/configutil/configutil_test.go | 41 +++++++++++++++++----- flytectl/pkg/sandbox/start.go | 6 +++- 3 files changed, 60 insertions(+), 16 deletions(-) diff --git a/flytectl/pkg/configutil/configutil.go b/flytectl/pkg/configutil/configutil.go index 5dcde9bd69..3727b09084 100644 --- a/flytectl/pkg/configutil/configutil.go +++ b/flytectl/pkg/configutil/configutil.go @@ -11,21 +11,36 @@ const ( AdminConfigTemplate = `admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: {{.Host}} - authType: Pkce insecure: {{.Insecure}} {{- if .Console}} console: endpoint: {{.Console}} {{- end}} -logger: - show-source: true - level: 0` +{{- if .DataConfig}} +# This is not a needed configuration, only useful if you want to explore the data in sandbox. For non sandbox, please +# do not use this configuration, instead prefer to use aws, gcs, azure sessions. Flytekit, should use fsspec to +# auto select the right backend to pull data as long as the sessions are configured. For Sandbox, this is special, as +# minio is s3 compatible and we ship with minio in sandbox. +storage: + connection: + endpoint: {{.DataConfig.Endpoint}} + access-key: {{.DataConfig.AccessKey}} + secret-key: {{.DataConfig.SecretKey}} +{{- end}} +` ) +type DataConfig struct { + Endpoint string + AccessKey string + SecretKey string +} + type ConfigTemplateSpec struct { - Host string - Insecure bool - Console string + Host string + Insecure bool + Console string + DataConfig *DataConfig } var ( diff --git a/flytectl/pkg/configutil/configutil_test.go b/flytectl/pkg/configutil/configutil_test.go index 6a689366e0..a8f8bf4d96 100644 --- a/flytectl/pkg/configutil/configutil_test.go +++ b/flytectl/pkg/configutil/configutil_test.go @@ -25,11 +25,8 @@ func TestSetupConfig(t *testing.T) { expected := `admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: dns:///localhost:30081 - authType: Pkce insecure: true -logger: - show-source: true - level: 0` +` assert.Equal(t, expected, string(configBytes)) file, err = os.Create(file.Name()) @@ -46,13 +43,41 @@ logger: expected = `admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com endpoint: dns:///admin.example.com - authType: Pkce insecure: true console: endpoint: https://console.example.com -logger: - show-source: true - level: 0` +` + assert.Equal(t, expected, string(configBytes)) + + file, err = os.Create(file.Name()) + require.NoError(t, err) + templateValue = ConfigTemplateSpec{ + Host: "dns:///admin.example.com", + Insecure: true, + DataConfig: &DataConfig{ + Endpoint: "http://localhost:9000", + AccessKey: "my-access-key", + SecretKey: "my-secret-key", + }, + } + err = SetupConfig(file.Name(), AdminConfigTemplate, templateValue) + assert.NoError(t, err) + configBytes, err = ioutil.ReadAll(file) + assert.NoError(t, err) + expected = `admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:///admin.example.com + insecure: true +# This is not a needed configuration, only useful if you want to explore the data in sandbox. For non sandbox, please +# do not use this configuration, instead prefer to use aws, gcs, azure sessions. Flytekit, should use fsspec to +# auto select the right backend to pull data as long as the sessions are configured. For Sandbox, this is special, as +# minio is s3 compatible and we ship with minio in sandbox. +storage: + connection: + endpoint: http://localhost:9000 + access-key: my-access-key + secret-key: my-secret-key +` assert.Equal(t, expected, string(configBytes)) // Cleanup diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index 9c9c73fb06..ee7b8bc275 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -177,7 +177,11 @@ func startSandbox(ctx context.Context, cli docker.Docker, g github.GHRepoService templateValues := configutil.ConfigTemplateSpec{ Host: "localhost:30080", Insecure: true, - Console: fmt.Sprintf("http://localhost:%d", consolePort), + DataConfig: &configutil.DataConfig{ + Endpoint: "http://localhost:30002", + AccessKey: "minio", + SecretKey: "miniostorage", + }, } if err := configutil.SetupConfig(configutil.FlytectlConfig, configutil.GetTemplate(), templateValues); err != nil { return nil, err From c96ee7f18b8306a5cd8d625df6bacae0274f9cfc Mon Sep 17 00:00:00 2001 From: SophieTech88 <141538510+SophieTech88@users.noreply.github.com> Date: Sat, 11 Nov 2023 14:17:17 -0600 Subject: [PATCH 333/645] Update --force in doc (#443) --- flytectl/docs/source/gen/flytectl_update_launchplan.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index a3292dc8a0..7fafd67129 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -35,6 +35,7 @@ Options --activate activate launchplan. --archive disable the launch plan schedule (if it has an active schedule associated with it). --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for launchplan --version string version of the launchplan to be fetched. @@ -52,7 +53,7 @@ Options inherited from parent commands --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") From 23228584aaf7f80cc889cd08a1ab7aeb6c1e2ed5 Mon Sep 17 00:00:00 2001 From: Ruslan Gainanov Date: Tue, 21 Nov 2023 09:45:54 +0300 Subject: [PATCH 334/645] Include default MinIO credentials (#410) #3458 Include default MinIO credentials in sandbox console readout Signed-off-by: Ruslan Gainanov --- flytectl/pkg/util/util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/pkg/util/util.go b/flytectl/pkg/util/util.go index 146ba6ec50..1eaa28ea4a 100644 --- a/flytectl/pkg/util/util.go +++ b/flytectl/pkg/util/util.go @@ -93,7 +93,7 @@ func PrintDemoStartMessage(flyteConsolePort int, kubeconfigLocation string, dryR fmt.Printf(" export KUBECONFIG=%v \n", kubeconfig) } fmt.Printf("%s Flyte sandbox ships with a Docker registry. Tag and push custom workflow images to localhost:30000\n", emoji.Whale) - fmt.Printf("%s The Minio API is hosted on localhost:30002. Use http://localhost:30080/minio/login for Minio console\n", emoji.OpenFileFolder) + fmt.Printf("%s The Minio API is hosted on localhost:30002. Use http://localhost:30080/minio/login for Minio console, default credentials - username: minio, password: miniostorage\n", emoji.OpenFileFolder) } // PrintSandboxStartMessage will print sandbox start success message From ca54f09eaadbb7989076ff1f312a93579d16a669 Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Wed, 6 Dec 2023 18:15:32 -0800 Subject: [PATCH 335/645] Update help string for 'update task-meta' and 'update launchplan-meta' (#445) --- flytectl/cmd/update/launch_plan_meta.go | 6 +++--- flytectl/cmd/update/task_meta.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flytectl/cmd/update/launch_plan_meta.go b/flytectl/cmd/update/launch_plan_meta.go index 2170ba22f1..b0567dc49d 100644 --- a/flytectl/cmd/update/launch_plan_meta.go +++ b/flytectl/cmd/update/launch_plan_meta.go @@ -16,17 +16,17 @@ const ( Update the description on the launch plan: :: - flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --description "Mergesort example" + flytectl update launchplan-meta -p flytesnacks -d development core.advanced.merge_sort.merge_sort --description "Mergesort example" Archiving launch plan named entity is not supported and would throw an error: :: - flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --archive + flytectl update launchplan-meta -p flytesnacks -d development core.advanced.merge_sort.merge_sort --archive Activating launch plan named entity would be a noop: :: - flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --activate + flytectl update launchplan-meta -p flytesnacks -d development core.advanced.merge_sort.merge_sort --activate Usage ` diff --git a/flytectl/cmd/update/task_meta.go b/flytectl/cmd/update/task_meta.go index cb9e3e927a..302ceb801f 100644 --- a/flytectl/cmd/update/task_meta.go +++ b/flytectl/cmd/update/task_meta.go @@ -16,17 +16,17 @@ const ( Update the description on the task: :: - flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --description "Merge sort example" + flytectl update task-meta -d development -p flytesnacks core.control_flow.merge_sort.merge --description "Merge sort example" Archiving task named entity is not supported and would throw an error: :: - flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --archive + flytectl update task-meta -d development -p flytesnacks core.control_flow.merge_sort.merge --archive Activating task named entity would be a noop since archiving is not possible: :: - flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --activate + flytectl update task-meta -d development -p flytesnacks core.control_flow.merge_sort.merge --activate Usage ` From f727ff6440fb9873c42863a7220cd457469b43cf Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Tue, 12 Dec 2023 14:03:13 -0500 Subject: [PATCH 336/645] add monodocs build to ci in flytectl (#446) * add monodocs build to ci in flytectl Signed-off-by: Niels Bantilan * update name Signed-off-by: Niels Bantilan --------- Signed-off-by: Niels Bantilan --- flytectl/.github/workflows/monodocs_build.yml | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 flytectl/.github/workflows/monodocs_build.yml diff --git a/flytectl/.github/workflows/monodocs_build.yml b/flytectl/.github/workflows/monodocs_build.yml new file mode 100644 index 0000000000..14818500b7 --- /dev/null +++ b/flytectl/.github/workflows/monodocs_build.yml @@ -0,0 +1,52 @@ +name: Monodocs Build + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + docs: + name: Monodocs Build + runs-on: ubuntu-latest + steps: + - name: Fetch flytectl code + uses: actions/checkout@v4 + with: + path: "${{ github.workspace }}/flytectl" + - name: Fetch flyte code + uses: actions/checkout@v4 + with: + repository: flyteorg/flyte + path: "${{ github.workspace }}/flyte" + - uses: conda-incubator/setup-miniconda@v3 + with: + auto-update-conda: true + python-version: 3.9 + - shell: bash -el {0} + working-directory: ${{ github.workspace }}/flyte + run: | + conda install -c conda-forge conda-lock + conda-lock install -n monodocs-env monodocs-environment.lock.yaml + - shell: bash -el {0} + run: | + conda activate monodocs-env + conda info + conda list + conda config --show-sources + conda config --show + printenv | sort + - name: Build the documentation + working-directory: ${{ github.workspace }}/flyte + shell: bash -el {0} + env: + FLYTECTL_LOCAL_PATH: ${{ github.workspace }}/flytectl + run: | + conda activate monodocs-env + make docs From 8913631e76502dc983a9d7a27400017f3aaebf79 Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Thu, 14 Dec 2023 13:06:57 -0500 Subject: [PATCH 337/645] Monodocs dev build (#448) * update monodocs build ci with dev build, increase verbosity Signed-off-by: Niels Bantilan * remove env var Signed-off-by: Niels Bantilan --------- Signed-off-by: Niels Bantilan --- flytectl/.github/workflows/monodocs_build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flytectl/.github/workflows/monodocs_build.yml b/flytectl/.github/workflows/monodocs_build.yml index 14818500b7..c0befb62d7 100644 --- a/flytectl/.github/workflows/monodocs_build.yml +++ b/flytectl/.github/workflows/monodocs_build.yml @@ -46,7 +46,7 @@ jobs: working-directory: ${{ github.workspace }}/flyte shell: bash -el {0} env: - FLYTECTL_LOCAL_PATH: ${{ github.workspace }}/flytectl + FLYTECTL_LOCAL_PATH: ${{ github.workspace }}/flytectl run: | conda activate monodocs-env - make docs + make -C docs clean html SPHINXOPTS="-W -vvv" From e38e7a0a69cefa2f3cf9ab71e81ba94e5cc872e3 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Fri, 15 Dec 2023 15:32:32 -0800 Subject: [PATCH 338/645] fix: doc-requirements.txt to reduce vulnerabilities (#416) The following vulnerabilities are fixed by pinning transitive dependencies: - https://snyk.io/vuln/SNYK-PYTHON-CERTIFI-5805047 Co-authored-by: snyk-bot --- flytectl/doc-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index 65b0f20ea3..bb24f24d0d 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -13,7 +13,7 @@ beautifulsoup4==4.10.0 # furo # sphinx-code-include # sphinx-material -certifi==2021.10.8 +certifi==2023.7.22 # via requests charset-normalizer==2.0.10 # via requests From a9a45b3576852a640a53438491a31235236d0336 Mon Sep 17 00:00:00 2001 From: Soundarya Alagesan Date: Tue, 26 Dec 2023 20:19:20 +0530 Subject: [PATCH 339/645] Feature: update launchplan --archive to --deactivate (#449) * Rename --archive to --deactivate in update launchplan Signed-off-by: asoundarya96 * Rename --archive to --deactivate in update launchplan Signed-off-by: asoundarya96 * Keep --archive as deprecated flag Signed-off-by: asoundarya96 * make generate Signed-off-by: Eduardo Apolinario --------- Signed-off-by: asoundarya96 Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- flytectl/clierrors/errors.go | 3 ++- .../subcommand/launchplan/updateconfig.go | 11 +++++---- .../launchplan/updateconfig_flags.go | 3 ++- .../launchplan/updateconfig_flags_test.go | 22 +++++++++++++---- flytectl/cmd/update/launch_plan.go | 23 ++++++++++++++---- flytectl/cmd/update/launch_plan_test.go | 24 ++++++++++++++++--- .../source/gen/flytectl_update_launchplan.rst | 9 +++---- 7 files changed, 72 insertions(+), 23 deletions(-) mode change 100755 => 100644 flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go diff --git a/flytectl/clierrors/errors.go b/flytectl/clierrors/errors.go index 05ab96cb00..48fecd3f2f 100644 --- a/flytectl/clierrors/errors.go +++ b/flytectl/clierrors/errors.go @@ -1,7 +1,8 @@ package clierrors var ( - ErrInvalidStateUpdate = "invalid state passed. Specify either activate or archive\n" + ErrInvalidStateUpdate = "invalid state passed. Specify either activate or archive\n" + ErrInvalidBothStateUpdate = "invalid state passed. Specify either activate or deactivate\n" ErrProjectNotPassed = "project id wasn't passed\n" // #nosec ErrProjectIDBothPassed = "both project and id are passed\n" diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig.go index 36e353c2e1..5d3b113dac 100644 --- a/flytectl/cmd/config/subcommand/launchplan/updateconfig.go +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig.go @@ -7,9 +7,10 @@ var ( // Config type UpdateConfig struct { - Archive bool `json:"archive" pflag:",disable the launch plan schedule (if it has an active schedule associated with it)."` - Activate bool `json:"activate" pflag:",activate launchplan."` - DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` - Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` - Version string `json:"version" pflag:",version of the launchplan to be fetched."` + Activate bool `json:"activate" pflag:",activate launchplan."` + Archive bool `json:"archive" pflag:",(Deprecated) disable the launch plan schedule (if it has an active schedule associated with it)."` + Deactivate bool `json:"deactivate" pflag:",disable the launch plan schedule (if it has an active schedule associated with it)."` + DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` + Force bool `json:"force" pflag:",do not ask for an acknowledgement during updates."` + Version string `json:"version" pflag:",version of the launchplan to be fetched."` } diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go old mode 100755 new mode 100644 index 4a9cad23ba..b71224e72b --- a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags.go @@ -50,8 +50,9 @@ func (UpdateConfig) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg UpdateConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("UpdateConfig", pflag.ExitOnError) - cmdFlags.BoolVar(&UConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), UConfig.Archive, "disable the launch plan schedule (if it has an active schedule associated with it).") cmdFlags.BoolVar(&UConfig.Activate, fmt.Sprintf("%v%v", prefix, "activate"), UConfig.Activate, "activate launchplan.") + cmdFlags.BoolVar(&UConfig.Archive, fmt.Sprintf("%v%v", prefix, "archive"), UConfig.Archive, "(Deprecated) disable the launch plan schedule (if it has an active schedule associated with it).") + cmdFlags.BoolVar(&UConfig.Deactivate, fmt.Sprintf("%v%v", prefix, "deactivate"), UConfig.Deactivate, "disable the launch plan schedule (if it has an active schedule associated with it).") cmdFlags.BoolVar(&UConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), UConfig.DryRun, "execute command without making any modifications.") cmdFlags.BoolVar(&UConfig.Force, fmt.Sprintf("%v%v", prefix, "force"), UConfig.Force, "do not ask for an acknowledgement during updates.") cmdFlags.StringVar(&UConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), UConfig.Version, "version of the launchplan to be fetched.") diff --git a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go index e9acca7bbe..fc58e7ac8f 100755 --- a/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go +++ b/flytectl/cmd/config/subcommand/launchplan/updateconfig_flags_test.go @@ -99,6 +99,20 @@ func TestUpdateConfig_SetFlags(t *testing.T) { cmdFlags := actual.GetPFlagSet("") assert.True(t, cmdFlags.HasFlags()) + t.Run("Test_activate", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("activate", testValue) + if vBool, err := cmdFlags.GetBool("activate"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Activate) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_archive", func(t *testing.T) { t.Run("Override", func(t *testing.T) { @@ -113,14 +127,14 @@ func TestUpdateConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_activate", func(t *testing.T) { + t.Run("Test_deactivate", func(t *testing.T) { t.Run("Override", func(t *testing.T) { testValue := "1" - cmdFlags.Set("activate", testValue) - if vBool, err := cmdFlags.GetBool("activate"); err == nil { - testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Activate) + cmdFlags.Set("deactivate", testValue) + if vBool, err := cmdFlags.GetBool("deactivate"); err == nil { + testDecodeJson_UpdateConfig(t, fmt.Sprintf("%v", vBool), &actual.Deactivate) } else { assert.FailNow(t, err.Error()) diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go index 28b7c6270b..b20ad48040 100644 --- a/flytectl/cmd/update/launch_plan.go +++ b/flytectl/cmd/update/launch_plan.go @@ -7,6 +7,7 @@ import ( "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flytectl/clierrors" "github.com/flyteorg/flytectl/cmd/config" "github.com/flyteorg/flytectl/cmd/config/subcommand/launchplan" @@ -22,10 +23,10 @@ Activates a ` + "`launch plan `__" + ` a launch plan which deschedules any scheduled job associated with it: +Deactivates a ` + "`launch plan `__" + ` which deschedules any scheduled job associated with it: :: - flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --archive + flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --deactivate Usage ` @@ -45,14 +46,22 @@ func updateLPFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandCont activate := launchplan.UConfig.Activate archive := launchplan.UConfig.Archive - if activate == archive && archive { - return fmt.Errorf(clierrors.ErrInvalidStateUpdate) + + var deactivate bool + if archive { + deprecatedCommandWarning(ctx, "archive", "deactivate") + deactivate = true + } else { + deactivate = launchplan.UConfig.Deactivate + } + if activate == deactivate && deactivate { + return fmt.Errorf(clierrors.ErrInvalidBothStateUpdate) } var newState admin.LaunchPlanState if activate { newState = admin.LaunchPlanState_ACTIVE - } else if archive { + } else if deactivate { newState = admin.LaunchPlanState_INACTIVE } @@ -106,3 +115,7 @@ func updateLPFunc(ctx context.Context, args []string, cmdCtx cmdCore.CommandCont return nil } + +func deprecatedCommandWarning(ctx context.Context, oldCommand string, newCommand string) { + logger.Warningf(ctx, "--%v is deprecated, Please use --%v", oldCommand, newCommand) +} diff --git a/flytectl/cmd/update/launch_plan_test.go b/flytectl/cmd/update/launch_plan_test.go index f9c3d7dc8a..4bc92ef095 100644 --- a/flytectl/cmd/update/launch_plan_test.go +++ b/flytectl/cmd/update/launch_plan_test.go @@ -53,14 +53,32 @@ func TestLaunchPlanCanBeArchived(t *testing.T) { }) } -func TestLaunchPlanCannotBeActivatedAndArchivedAtTheSameTime(t *testing.T) { +func TestLaunchPlanCanBeDeactivated(t *testing.T) { + testLaunchPlanUpdate( + /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { + launchplan.Closure.State = admin.LaunchPlanState_ACTIVE + config.Deactivate = true + config.Force = true + }, + /* assert */ func(s *testutils.TestStruct, err error) { + assert.Nil(t, err) + s.MockAdminClient.AssertCalled( + t, "UpdateLaunchPlan", s.Ctx, + mock.MatchedBy( + func(r *admin.LaunchPlanUpdateRequest) bool { + return r.State == admin.LaunchPlanState_INACTIVE + })) + }) +} + +func TestLaunchPlanCannotBeActivatedAndDeactivatedAtTheSameTime(t *testing.T) { testLaunchPlanUpdate( /* setup */ func(s *testutils.TestStruct, config *launchplan.UpdateConfig, launchplan *admin.LaunchPlan) { config.Activate = true - config.Archive = true + config.Deactivate = true }, /* assert */ func(s *testutils.TestStruct, err error) { - assert.ErrorContains(t, err, "Specify either activate or archive") + assert.ErrorContains(t, err, "Specify either activate or deactivate") s.MockAdminClient.AssertNotCalled(t, "UpdateLaunchPlan", mock.Anything, mock.Anything) }) } diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 7fafd67129..b6de8566a5 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -15,10 +15,10 @@ Activates a `launch plan `__ a launch plan which deschedules any scheduled job associated with it: +Deactivates a `launch plan `__ which deschedules any scheduled job associated with it: :: - flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --archive + flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --deactivate Usage @@ -33,7 +33,7 @@ Options :: --activate activate launchplan. - --archive disable the launch plan schedule (if it has an active schedule associated with it). + --deactivate disable the launch plan schedule (if it has an active schedule associated with it). --dryRun execute command without making any modifications. --force do not ask for an acknowledgement during updates. -h, --help help for launchplan @@ -53,11 +53,12 @@ Options inherited from parent commands --admin.clientSecretEnvVar string Environment variable containing the client secret --admin.clientSecretLocation string File containing the client secret (default "/etc/secrets/client_secret") --admin.command strings Command for external authentication token generation - --admin.defaultServiceConfig string + --admin.defaultServiceConfig string --admin.deviceFlowConfig.pollInterval string amount of time the device flow would poll the token endpoint if auth server doesn't return a polling interval. Okta and google IDP do return an interval' (default "5s") --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") From 9322c069d7d04bfc359607e6390f80f7d80108f5 Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Mon, 8 Jan 2024 16:31:52 -0500 Subject: [PATCH 340/645] add monodocs redirect banner (#452) Signed-off-by: Niels Bantilan --- flytectl/docs/source/conf.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 9d28a8f1d3..d9f9045f68 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -93,15 +93,24 @@ html_logo = "flyte_circle_gradient_1_4x4.png" html_favicon = "flyte_circle_gradient_1_4x4.png" +announcement = """ +📢 This is the old documentation for Flyte. +Please visit the new documentation here. +""" + html_theme_options = { "light_css_variables": { "color-brand-primary": "#4300c9", "color-brand-content": "#4300c9", + "color-announcement-background": "#FEE7B8", + "color-announcement-text": "#535353", }, "dark_css_variables": { "color-brand-primary": "#9D68E4", "color-brand-content": "#9D68E4", + "color-announcement-background": "#493100", }, + "announcement": announcement, } html_context = { From 06765aabccbe6ab7c4c5f7dfdef1677c8b783896 Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Thu, 11 Jan 2024 12:03:56 -0500 Subject: [PATCH 341/645] add flytectl docs redirects to monodocs (#454) Signed-off-by: Niels Bantilan --- flytectl/doc-requirements.in | 1 + flytectl/doc-requirements.txt | 70 ++++++++++--------- flytectl/docs/source/conf.py | 10 +++ flytectl/docs/source/gen/flytectl.rst | 1 + flytectl/docs/source/gen/flytectl_compile.rst | 1 + .../docs/source/gen/flytectl_completion.rst | 1 + flytectl/docs/source/gen/flytectl_config.rst | 2 + .../source/gen/flytectl_config_discover.rst | 1 + .../docs/source/gen/flytectl_config_docs.rst | 5 +- .../docs/source/gen/flytectl_config_init.rst | 2 + .../source/gen/flytectl_config_validate.rst | 1 + flytectl/docs/source/gen/flytectl_create.rst | 1 + .../source/gen/flytectl_create_execution.rst | 34 +++++++-- .../source/gen/flytectl_create_project.rst | 2 + flytectl/docs/source/gen/flytectl_delete.rst | 1 + ...ectl_delete_cluster-resource-attribute.rst | 1 + ...lytectl_delete_execution-cluster-label.rst | 1 + ...tectl_delete_execution-queue-attribute.rst | 1 + .../source/gen/flytectl_delete_execution.rst | 1 + .../gen/flytectl_delete_plugin-override.rst | 1 + ...lytectl_delete_task-resource-attribute.rst | 1 + ...tectl_delete_workflow-execution-config.rst | 1 + flytectl/docs/source/gen/flytectl_demo.rst | 1 + .../docs/source/gen/flytectl_demo_exec.rst | 1 + .../docs/source/gen/flytectl_demo_reload.rst | 3 + .../docs/source/gen/flytectl_demo_start.rst | 3 + .../docs/source/gen/flytectl_demo_status.rst | 1 + .../source/gen/flytectl_demo_teardown.rst | 1 + flytectl/docs/source/gen/flytectl_get.rst | 1 + ...lytectl_get_cluster-resource-attribute.rst | 1 + .../flytectl_get_execution-cluster-label.rst | 1 + ...flytectl_get_execution-queue-attribute.rst | 1 + .../source/gen/flytectl_get_execution.rst | 1 + .../source/gen/flytectl_get_launchplan.rst | 1 + .../gen/flytectl_get_plugin-override.rst | 1 + .../docs/source/gen/flytectl_get_project.rst | 1 + .../flytectl_get_task-resource-attribute.rst | 1 + .../docs/source/gen/flytectl_get_task.rst | 1 + ...flytectl_get_workflow-execution-config.rst | 1 + .../docs/source/gen/flytectl_get_workflow.rst | 1 + .../docs/source/gen/flytectl_register.rst | 1 + .../source/gen/flytectl_register_examples.rst | 1 + .../source/gen/flytectl_register_files.rst | 1 + flytectl/docs/source/gen/flytectl_sandbox.rst | 1 + .../docs/source/gen/flytectl_sandbox_exec.rst | 1 + .../source/gen/flytectl_sandbox_start.rst | 3 + .../source/gen/flytectl_sandbox_status.rst | 1 + .../source/gen/flytectl_sandbox_teardown.rst | 1 + flytectl/docs/source/gen/flytectl_update.rst | 8 +-- ...ectl_update_cluster-resource-attribute.rst | 2 + ...lytectl_update_execution-cluster-label.rst | 2 + ...tectl_update_execution-queue-attribute.rst | 2 + .../source/gen/flytectl_update_execution.rst | 2 + .../gen/flytectl_update_launchplan-meta.rst | 8 ++- .../source/gen/flytectl_update_launchplan.rst | 1 + .../gen/flytectl_update_plugin-override.rst | 2 + .../source/gen/flytectl_update_project.rst | 8 ++- .../source/gen/flytectl_update_task-meta.rst | 8 ++- ...lytectl_update_task-resource-attribute.rst | 2 + ...tectl_update_workflow-execution-config.rst | 2 + .../gen/flytectl_update_workflow-meta.rst | 2 + flytectl/docs/source/gen/flytectl_upgrade.rst | 1 + flytectl/docs/source/gen/flytectl_version.rst | 1 + 63 files changed, 167 insertions(+), 56 deletions(-) diff --git a/flytectl/doc-requirements.in b/flytectl/doc-requirements.in index 0bdd65dd01..38b976f528 100644 --- a/flytectl/doc-requirements.in +++ b/flytectl/doc-requirements.in @@ -7,3 +7,4 @@ sphinx-copybutton sphinx_fontawesome sphinxcontrib-youtube sphinx-panels +sphinx-reredirects diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index bb24f24d0d..bc5dfeb5df 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -1,21 +1,21 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: # # pip-compile doc-requirements.in # -alabaster==0.7.12 +alabaster==0.7.16 # via sphinx -babel==2.9.1 +babel==2.14.0 # via sphinx -beautifulsoup4==4.10.0 +beautifulsoup4==4.12.2 # via # furo # sphinx-code-include # sphinx-material -certifi==2023.7.22 +certifi==2023.11.17 # via requests -charset-normalizer==2.0.10 +charset-normalizer==3.3.2 # via requests css-html-js-minify==2.5.5 # via sphinx-material @@ -25,64 +25,69 @@ docutils==0.17.1 # sphinx-panels furo @ git+https://github.com/flyteorg/furo@main # via -r doc-requirements.in -idna==3.3 +idna==3.6 # via requests -imagesize==1.3.0 +imagesize==1.4.1 # via sphinx -jinja2==3.0.3 +jinja2==3.1.3 # via sphinx -lxml==4.9.1 +lxml==5.1.0 # via sphinx-material -markupsafe==2.0.1 +markupsafe==2.1.3 # via jinja2 -packaging==21.3 +packaging==23.2 # via sphinx -pygments==2.11.2 +pygments==2.17.2 # via + # furo # sphinx # sphinx-prompt -pyparsing==3.0.6 - # via packaging -python-slugify[unidecode]==5.0.2 +python-slugify[unidecode]==8.0.1 # via sphinx-material -pytz==2021.3 - # via babel -requests==2.27.1 - # via sphinx +requests==2.31.0 + # via + # sphinx + # sphinxcontrib-youtube six==1.16.0 # via sphinx-code-include snowballstemmer==2.2.0 # via sphinx -soupsieve==2.3.1 +soupsieve==2.5 # via beautifulsoup4 -sphinx==4.3.2 +sphinx==4.5.0 # via # -r doc-requirements.in # furo + # sphinx-basic-ng # sphinx-code-include # sphinx-copybutton # sphinx-fontawesome # sphinx-material # sphinx-panels # sphinx-prompt - # sphinxcontrib-yt + # sphinx-reredirects + # sphinxcontrib-youtube +sphinx-basic-ng==1.0.0b2 + # via furo sphinx-code-include==1.1.1 # via -r doc-requirements.in -sphinx-copybutton==0.4.0 +sphinx-copybutton==0.5.2 # via -r doc-requirements.in sphinx-fontawesome==0.0.6 # via -r doc-requirements.in -sphinx-material==0.0.35 +sphinx-material==0.0.36 # via -r doc-requirements.in sphinx-panels==0.6.0 # via -r doc-requirements.in sphinx-prompt==1.5.0 # via -r doc-requirements.in -sphinxcontrib-applehelp==1.0.2 +sphinx-reredirects==0.1.3 + # via -r doc-requirements.in +sphinxcontrib-applehelp==1.0.4 # via sphinx sphinxcontrib-devhelp==1.0.2 # via sphinx -sphinxcontrib-htmlhelp==2.0.0 +sphinxcontrib-htmlhelp==2.0.1 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx @@ -90,14 +95,11 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -sphinxcontrib-youtube==1.2.0 +sphinxcontrib-youtube==1.3.0 # via -r doc-requirements.in text-unidecode==1.3 # via python-slugify -unidecode==1.3.2 +unidecode==1.3.8 # via python-slugify -urllib3==1.26.7 +urllib3==2.1.0 # via requests - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index d9f9045f68..905b3067eb 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -44,6 +44,7 @@ "sphinx_copybutton", "sphinx_fontawesome", "sphinxcontrib.youtube", + "sphinx_reredirects", "sphinx_panels", ] @@ -201,3 +202,12 @@ "flyteidl": ("https://docs.flyte.org/projects/flyteidl/en/latest", None), "flyte": ("https://docs.flyte.org/en/latest", None), } + +if int(os.environ.get("ENABLE_SPHINX_REDIRECTS", 0)): + # Redirects to the new docs site + redirects = { + "verbs.html": "https://docs.flyte.org/en/latest/flytectl/verbs.html", + "nouns.html": "https://docs.flyte.org/en/latest/flytectl/nouns.html", + "gen/*": "https://docs.flyte.org/en/latest/flytectl/$source.html", + "contribute.html": "https://docs.flyte.org/en/latest/flytectl/contribute.html", + } diff --git a/flytectl/docs/source/gen/flytectl.rst b/flytectl/docs/source/gen/flytectl.rst index c30c126970..9109b234bd 100644 --- a/flytectl/docs/source/gen/flytectl.rst +++ b/flytectl/docs/source/gen/flytectl.rst @@ -30,6 +30,7 @@ Options --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_compile.rst b/flytectl/docs/source/gen/flytectl_compile.rst index 0e1785242f..6ce685df5b 100644 --- a/flytectl/docs/source/gen/flytectl_compile.rst +++ b/flytectl/docs/source/gen/flytectl_compile.rst @@ -56,6 +56,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_completion.rst b/flytectl/docs/source/gen/flytectl_completion.rst index aedf9442c5..5671d3453b 100644 --- a/flytectl/docs/source/gen/flytectl_completion.rst +++ b/flytectl/docs/source/gen/flytectl_completion.rst @@ -103,6 +103,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_config.rst b/flytectl/docs/source/gen/flytectl_config.rst index 60e755e686..be0ef53651 100644 --- a/flytectl/docs/source/gen/flytectl_config.rst +++ b/flytectl/docs/source/gen/flytectl_config.rst @@ -18,6 +18,7 @@ Options --file stringArray Passes the config file to load. If empty, it'll first search for the config file path then, if found, will load config from there. + --force Force to overwrite the default config file without confirmation -h, --help help for config Options inherited from parent commands @@ -39,6 +40,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_config_discover.rst b/flytectl/docs/source/gen/flytectl_config_discover.rst index 092093e469..6727e00da8 100644 --- a/flytectl/docs/source/gen/flytectl_config_discover.rst +++ b/flytectl/docs/source/gen/flytectl_config_discover.rst @@ -41,6 +41,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_config_docs.rst b/flytectl/docs/source/gen/flytectl_config_docs.rst index b6c9cb869e..06d0969e83 100644 --- a/flytectl/docs/source/gen/flytectl_config_docs.rst +++ b/flytectl/docs/source/gen/flytectl_config_docs.rst @@ -3,13 +3,13 @@ flytectl config docs -------------------- -Generate configuration documetation in rst format +Generate configuration documentation in rst format Synopsis ~~~~~~~~ -Generate configuration documetation in rst format +Generate configuration documentation in rst format :: @@ -41,6 +41,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_config_init.rst b/flytectl/docs/source/gen/flytectl_config_init.rst index 07cd65bd1c..ea2a964d67 100644 --- a/flytectl/docs/source/gen/flytectl_config_init.rst +++ b/flytectl/docs/source/gen/flytectl_config_init.rst @@ -53,6 +53,7 @@ Options :: --console string Endpoint of console, if different than flyte admin + --force Force to overwrite the default config file without confirmation -h, --help help for init --host string Endpoint of flyte admin --insecure Enable insecure mode @@ -76,6 +77,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_config_validate.rst b/flytectl/docs/source/gen/flytectl_config_validate.rst index 9d9491da9b..41a5511b11 100644 --- a/flytectl/docs/source/gen/flytectl_config_validate.rst +++ b/flytectl/docs/source/gen/flytectl_config_validate.rst @@ -43,6 +43,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_create.rst b/flytectl/docs/source/gen/flytectl_create.rst index 7a28ca97aa..8827dc20e9 100644 --- a/flytectl/docs/source/gen/flytectl_create.rst +++ b/flytectl/docs/source/gen/flytectl_create.rst @@ -42,6 +42,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_create_execution.rst b/flytectl/docs/source/gen/flytectl_create_execution.rst index 4fdbf89b93..a51529dcbd 100644 --- a/flytectl/docs/source/gen/flytectl_create_execution.rst +++ b/flytectl/docs/source/gen/flytectl_create_execution.rst @@ -56,20 +56,39 @@ The generated spec file can be modified to change the input values, as shown bel task: core.control_flow.merge_sort.merge version: "v2" -3. Run the execution by passing the generated YAML file. +3. [Optional] Update the envs for the execution, if needed. +The generated spec file can be modified to change the envs values, as shown below: + +.. code-block:: yaml + + iamRoleARN: "" + inputs: + sorted_list1: + - 0 + sorted_list2: + - 0 + envs: + foo: bar + kubeServiceAcct: "" + targetDomain: "" + targetProject: "" + task: core.control_flow.merge_sort.merge + version: "v2" + +4. Run the execution by passing the generated YAML file. The file can then be passed through the command line. It is worth noting that the source's and target's project and domain can be different. :: flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d staging --targetProject flytesnacks -4. To relaunch an execution, pass the current execution ID as follows: +5. To relaunch an execution, pass the current execution ID as follows: :: flytectl create execution --relaunch ffb31066a0f8b4d52b77 -p flytesnacks -d development -5. To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: +6. To recover an execution, i.e., recreate it from the last known failure point for previously-run workflow execution, run: :: @@ -77,7 +96,7 @@ It is worth noting that the source's and target's project and domain can be diff See :ref:`ref_flyteidl.admin.ExecutionRecoverRequest` for more details. -6. You can create executions idempotently by naming them. This is also a way to *name* an execution for discovery. Note, +7. You can create executions idempotently by naming them. This is also a way to *name* an execution for discovery. Note, an execution id has to be unique within a project domain. So if the *name* matches an existing execution an already exists exceptioj will be raised. @@ -85,7 +104,7 @@ will be raised. flytectl create execution --recover ffb31066a0f8b4d52b77 -p flytesnacks -d development custom_name -7. Generic/Struct/Dataclass/JSON types are supported for execution in a similar manner. +8. Generic/Struct/Dataclass/JSON types are supported for execution in a similar manner. The following is an example of how generic data can be specified while creating the execution. :: @@ -105,7 +124,7 @@ The generated file would look similar to this. Here, empty values have been dump task: core.type_system.custom_objects.add version: v3 -8. Modified file with struct data populated for 'x' and 'y' parameters for the task "core.type_system.custom_objects.add": +9. Modified file with struct data populated for 'x' and 'y' parameters for the task "core.type_system.custom_objects.add": :: @@ -129,7 +148,7 @@ The generated file would look similar to this. Here, empty values have been dump task: core.type_system.custom_objects.add version: v3 -9. If you have configured a plugin that implements github.com/flyteorg/flyteadmin/pkg/workflowengine/interfaces/WorkflowExecutor +10. If you have configured a plugin that implements github.com/flyteorg/flyteadmin/pkg/workflowengine/interfaces/WorkflowExecutor that supports cluster pools, then when creating a new execution, you can assign it to a specific cluster pool: :: @@ -180,6 +199,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_create_project.rst b/flytectl/docs/source/gen/flytectl_create_project.rst index a8e6b370aa..16dedc8af4 100644 --- a/flytectl/docs/source/gen/flytectl_create_project.rst +++ b/flytectl/docs/source/gen/flytectl_create_project.rst @@ -54,6 +54,7 @@ Options --description string description for the project specified as argument. --dryRun execute command without making any modifications. --file string file for the project definition. + --force Skips asking for an acknowledgement during an update operation. Only used in update -h, --help help for project --id string id for the project specified as argument. --labels stringToString labels for the project specified as argument. (default []) @@ -78,6 +79,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_delete.rst b/flytectl/docs/source/gen/flytectl_delete.rst index d338a8618b..485404ade9 100644 --- a/flytectl/docs/source/gen/flytectl_delete.rst +++ b/flytectl/docs/source/gen/flytectl_delete.rst @@ -42,6 +42,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst index a8ae5e39ac..5264b9046e 100644 --- a/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_cluster-resource-attribute.rst @@ -77,6 +77,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst index 92ac7a3b5b..3314aba82e 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-cluster-label.rst @@ -74,6 +74,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst index 74c8504ed8..57bd1c6d04 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution-queue-attribute.rst @@ -78,6 +78,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_delete_execution.rst b/flytectl/docs/source/gen/flytectl_delete_execution.rst index 71577b850b..c336e66abf 100644 --- a/flytectl/docs/source/gen/flytectl_delete_execution.rst +++ b/flytectl/docs/source/gen/flytectl_delete_execution.rst @@ -85,6 +85,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst index e2e2d6f426..58e26d4457 100644 --- a/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_delete_plugin-override.rst @@ -79,6 +79,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst index 8e3c540585..f523a7717e 100644 --- a/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_delete_task-resource-attribute.rst @@ -79,6 +79,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst index 6376d8d73c..389dad93be 100644 --- a/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_delete_workflow-execution-config.rst @@ -77,6 +77,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_demo.rst b/flytectl/docs/source/gen/flytectl_demo.rst index 904d048264..2176c7b95d 100644 --- a/flytectl/docs/source/gen/flytectl_demo.rst +++ b/flytectl/docs/source/gen/flytectl_demo.rst @@ -60,6 +60,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_demo_exec.rst b/flytectl/docs/source/gen/flytectl_demo_exec.rst index 6b360fbe38..8a0c9c4861 100644 --- a/flytectl/docs/source/gen/flytectl_demo_exec.rst +++ b/flytectl/docs/source/gen/flytectl_demo_exec.rst @@ -49,6 +49,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_demo_reload.rst b/flytectl/docs/source/gen/flytectl_demo_reload.rst index 09bd874661..9fccacec1c 100644 --- a/flytectl/docs/source/gen/flytectl_demo_reload.rst +++ b/flytectl/docs/source/gen/flytectl_demo_reload.rst @@ -30,8 +30,10 @@ Options :: --dev Optional. Only start minio and postgres in the sandbox. + --disable-agent Optional. Disable the agent service. --dryRun Optional. Only print the docker commands to bring up flyte sandbox/demo container.This will still call github api's to get the latest flyte release to use' --env strings Optional. Provide Env variable in key=value format which can be passed to sandbox container. + --force Optional. Forcefully delete existing sandbox cluster if it exists. -h, --help help for reload --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. --imagePullOptions.platform string Forces a specific platform's image to be pulled.' @@ -60,6 +62,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_demo_start.rst b/flytectl/docs/source/gen/flytectl_demo_start.rst index ef1ae5ad90..89ed10f585 100644 --- a/flytectl/docs/source/gen/flytectl_demo_start.rst +++ b/flytectl/docs/source/gen/flytectl_demo_start.rst @@ -91,8 +91,10 @@ Options :: --dev Optional. Only start minio and postgres in the sandbox. + --disable-agent Optional. Disable the agent service. --dryRun Optional. Only print the docker commands to bring up flyte sandbox/demo container.This will still call github api's to get the latest flyte release to use' --env strings Optional. Provide Env variable in key=value format which can be passed to sandbox container. + --force Optional. Forcefully delete existing sandbox cluster if it exists. -h, --help help for start --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. --imagePullOptions.platform string Forces a specific platform's image to be pulled.' @@ -121,6 +123,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_demo_status.rst b/flytectl/docs/source/gen/flytectl_demo_status.rst index 296de34f75..3d21334326 100644 --- a/flytectl/docs/source/gen/flytectl_demo_status.rst +++ b/flytectl/docs/source/gen/flytectl_demo_status.rst @@ -49,6 +49,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_demo_teardown.rst b/flytectl/docs/source/gen/flytectl_demo_teardown.rst index 544f9179bc..42d9c22630 100644 --- a/flytectl/docs/source/gen/flytectl_demo_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_demo_teardown.rst @@ -50,6 +50,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get.rst b/flytectl/docs/source/gen/flytectl_get.rst index 1710535505..f48ddf3ef8 100644 --- a/flytectl/docs/source/gen/flytectl_get.rst +++ b/flytectl/docs/source/gen/flytectl_get.rst @@ -42,6 +42,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst index e047a87002..b242491a88 100644 --- a/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_cluster-resource-attribute.rst @@ -85,6 +85,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst index ed79e39e96..9147ff0736 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-cluster-label.rst @@ -84,6 +84,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst index 3be1a9b9a7..71929da6ae 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution-queue-attribute.rst @@ -87,6 +87,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index e460dbecde..38543aad68 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -117,6 +117,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_launchplan.rst b/flytectl/docs/source/gen/flytectl_get_launchplan.rst index 12df2747f5..e340b86636 100644 --- a/flytectl/docs/source/gen/flytectl_get_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_get_launchplan.rst @@ -152,6 +152,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst index 21d69b8bc6..bf9437513c 100644 --- a/flytectl/docs/source/gen/flytectl_get_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_get_plugin-override.rst @@ -106,6 +106,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_project.rst b/flytectl/docs/source/gen/flytectl_get_project.rst index b3136ffe85..07d25570a2 100644 --- a/flytectl/docs/source/gen/flytectl_get_project.rst +++ b/flytectl/docs/source/gen/flytectl_get_project.rst @@ -89,6 +89,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst index 095c0c5983..2b2f369afe 100644 --- a/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_get_task-resource-attribute.rst @@ -89,6 +89,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_task.rst b/flytectl/docs/source/gen/flytectl_get_task.rst index 8f54e8f280..383645221e 100644 --- a/flytectl/docs/source/gen/flytectl_get_task.rst +++ b/flytectl/docs/source/gen/flytectl_get_task.rst @@ -133,6 +133,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst index 9850f7bf6f..8c332c3ada 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow-execution-config.rst @@ -146,6 +146,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_get_workflow.rst b/flytectl/docs/source/gen/flytectl_get_workflow.rst index 7584c765c4..f446fdeb9f 100644 --- a/flytectl/docs/source/gen/flytectl_get_workflow.rst +++ b/flytectl/docs/source/gen/flytectl_get_workflow.rst @@ -117,6 +117,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_register.rst b/flytectl/docs/source/gen/flytectl_register.rst index 234c1210da..745dffa9b6 100644 --- a/flytectl/docs/source/gen/flytectl_register.rst +++ b/flytectl/docs/source/gen/flytectl_register.rst @@ -42,6 +42,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_register_examples.rst b/flytectl/docs/source/gen/flytectl_register_examples.rst index 438b6feff4..9c681548d1 100644 --- a/flytectl/docs/source/gen/flytectl_register_examples.rst +++ b/flytectl/docs/source/gen/flytectl_register_examples.rst @@ -68,6 +68,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_register_files.rst b/flytectl/docs/source/gen/flytectl_register_files.rst index 633984e3ba..512b1166b6 100644 --- a/flytectl/docs/source/gen/flytectl_register_files.rst +++ b/flytectl/docs/source/gen/flytectl_register_files.rst @@ -145,6 +145,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_sandbox.rst b/flytectl/docs/source/gen/flytectl_sandbox.rst index 87f1cda5ee..8cc08fc448 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox.rst @@ -66,6 +66,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst index 1bfbb38742..f1f3c44600 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_exec.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_exec.rst @@ -49,6 +49,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_sandbox_start.rst b/flytectl/docs/source/gen/flytectl_sandbox_start.rst index 13d0af086a..048b92b24e 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_start.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_start.rst @@ -86,8 +86,10 @@ Options :: --dev Optional. Only start minio and postgres in the sandbox. + --disable-agent Optional. Disable the agent service. --dryRun Optional. Only print the docker commands to bring up flyte sandbox/demo container.This will still call github api's to get the latest flyte release to use' --env strings Optional. Provide Env variable in key=value format which can be passed to sandbox container. + --force Optional. Forcefully delete existing sandbox cluster if it exists. -h, --help help for start --image string Optional. Provide a fully qualified path to a Flyte compliant docker image. --imagePullOptions.platform string Forces a specific platform's image to be pulled.' @@ -116,6 +118,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_sandbox_status.rst b/flytectl/docs/source/gen/flytectl_sandbox_status.rst index 0eb7f19c07..abce271578 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_status.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_status.rst @@ -49,6 +49,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst index 7a52bc5dff..c57c64b61a 100644 --- a/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst +++ b/flytectl/docs/source/gen/flytectl_sandbox_teardown.rst @@ -49,6 +49,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 0dfd304ab4..27949e6145 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -10,12 +10,11 @@ Synopsis -Currently, this command only provides subcommands to update project. -Take input project that needs to be archived or unarchived. Name of the project to be updated is a mandatory field. -Update Flyte resources; if a project: +Provides subcommands to update Flyte resources, such as tasks, workflows, launch plans, executions, and projects. +Update Flyte resource; e.g., to activate a project: :: - flytectl update project -p flytesnacks --activateProject + flytectl update project -p flytesnacks --activate Options @@ -44,6 +43,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst index 21f631bb28..55ea963f65 100644 --- a/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_cluster-resource-attribute.rst @@ -63,6 +63,7 @@ Options --attrFile string attribute file name to be used for updating attribute for the resource type. --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for cluster-resource-attribute Options inherited from parent commands @@ -84,6 +85,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst index 67cfd6f911..0117986578 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-cluster-label.rst @@ -56,6 +56,7 @@ Options --attrFile string attribute file name to be used for updating attribute for the resource type. --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for execution-cluster-label Options inherited from parent commands @@ -77,6 +78,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst index 5b6f11e623..5b3f080c03 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution-queue-attribute.rst @@ -67,6 +67,7 @@ Options --attrFile string attribute file name to be used for updating attribute for the resource type. --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for execution-queue-attribute Options inherited from parent commands @@ -88,6 +89,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_execution.rst b/flytectl/docs/source/gen/flytectl_update_execution.rst index 3dd6920c9d..373b625c9a 100644 --- a/flytectl/docs/source/gen/flytectl_update_execution.rst +++ b/flytectl/docs/source/gen/flytectl_update_execution.rst @@ -36,6 +36,7 @@ Options --activate activate execution. --archive archive execution. --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for execution Options inherited from parent commands @@ -57,6 +58,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst index a6fc2310c6..8e28b948c3 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan-meta.rst @@ -13,17 +13,17 @@ Synopsis Update the description on the launch plan: :: - flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --description "Mergesort example" + flytectl update launchplan-meta -p flytesnacks -d development core.advanced.merge_sort.merge_sort --description "Mergesort example" Archiving launch plan named entity is not supported and would throw an error: :: - flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --archive + flytectl update launchplan-meta -p flytesnacks -d development core.advanced.merge_sort.merge_sort --archive Activating launch plan named entity would be a noop: :: - flytectl update launchplan -p flytesnacks -d development core.advanced.merge_sort.merge_sort --activate + flytectl update launchplan-meta -p flytesnacks -d development core.advanced.merge_sort.merge_sort --activate Usage @@ -41,6 +41,7 @@ Options --archive archive named entity. --description string description of the named entity. --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for launchplan-meta Options inherited from parent commands @@ -62,6 +63,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index b6de8566a5..203e060a4e 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -33,6 +33,7 @@ Options :: --activate activate launchplan. + --archive (Deprecated) disable the launch plan schedule (if it has an active schedule associated with it). --deactivate disable the launch plan schedule (if it has an active schedule associated with it). --dryRun execute command without making any modifications. --force do not ask for an acknowledgement during updates. diff --git a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst index ebfb2fb165..95f744f85e 100644 --- a/flytectl/docs/source/gen/flytectl_update_plugin-override.rst +++ b/flytectl/docs/source/gen/flytectl_update_plugin-override.rst @@ -69,6 +69,7 @@ Options --attrFile string attribute file name to be used for updating attribute for the resource type. --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for plugin-override Options inherited from parent commands @@ -90,6 +91,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index 051de3238b..c4eeb48abe 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -26,7 +26,7 @@ Incorrect usage when passing both archive and activate: :: - flytectl update project -p flytesnacks --archiveProject --activate + flytectl update project -p flytesnacks --archive --activate Incorrect usage when passing unknown-project: @@ -38,7 +38,7 @@ project ID is required flag :: - flytectl update project unknown-project --archiveProject + flytectl update project unknown-project --archive Update projects.(project/projects can be used interchangeably in these commands) @@ -49,7 +49,7 @@ Update projects.(project/projects can be used interchangeably in these commands) Update a project by definition file. Note: The name shouldn't contain any whitespace characters. :: - flytectl update project --file project.yaml + flytectl update project --file project.yaml .. code-block:: yaml @@ -93,6 +93,7 @@ Options --description string description for the project specified as argument. --dryRun execute command without making any modifications. --file string file for the project definition. + --force Skips asking for an acknowledgement during an update operation. Only used in update -h, --help help for project --id string id for the project specified as argument. --labels stringToString labels for the project specified as argument. (default []) @@ -117,6 +118,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_task-meta.rst b/flytectl/docs/source/gen/flytectl_update_task-meta.rst index 6470e908fd..61312af748 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-meta.rst @@ -13,17 +13,17 @@ Synopsis Update the description on the task: :: - flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --description "Merge sort example" + flytectl update task-meta -d development -p flytesnacks core.control_flow.merge_sort.merge --description "Merge sort example" Archiving task named entity is not supported and would throw an error: :: - flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --archive + flytectl update task-meta -d development -p flytesnacks core.control_flow.merge_sort.merge --archive Activating task named entity would be a noop since archiving is not possible: :: - flytectl update task -d development -p flytesnacks core.control_flow.merge_sort.merge --activate + flytectl update task-meta -d development -p flytesnacks core.control_flow.merge_sort.merge --activate Usage @@ -41,6 +41,7 @@ Options --archive archive named entity. --description string description of the named entity. --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for task-meta Options inherited from parent commands @@ -62,6 +63,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst index 91512cacd4..0ef4798aab 100644 --- a/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst +++ b/flytectl/docs/source/gen/flytectl_update_task-resource-attribute.rst @@ -69,6 +69,7 @@ Options --attrFile string attribute file name to be used for updating attribute for the resource type. --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for task-resource-attribute Options inherited from parent commands @@ -90,6 +91,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst index 9d8bc3188a..b025df8a57 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-execution-config.rst @@ -65,6 +65,7 @@ Options --attrFile string attribute file name to be used for updating attribute for the resource type. --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for workflow-execution-config Options inherited from parent commands @@ -86,6 +87,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst index 6765578ab8..aadccfabd2 100644 --- a/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst +++ b/flytectl/docs/source/gen/flytectl_update_workflow-meta.rst @@ -41,6 +41,7 @@ Options --archive archive named entity. --description string description of the named entity. --dryRun execute command without making any modifications. + --force do not ask for an acknowledgement during updates. -h, --help help for workflow-meta Options inherited from parent commands @@ -62,6 +63,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_upgrade.rst b/flytectl/docs/source/gen/flytectl_upgrade.rst index b44645a51d..a0bcedda9d 100644 --- a/flytectl/docs/source/gen/flytectl_upgrade.rst +++ b/flytectl/docs/source/gen/flytectl_upgrade.rst @@ -57,6 +57,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") diff --git a/flytectl/docs/source/gen/flytectl_version.rst b/flytectl/docs/source/gen/flytectl_version.rst index ce0ea2e057..220a375741 100644 --- a/flytectl/docs/source/gen/flytectl_version.rst +++ b/flytectl/docs/source/gen/flytectl_version.rst @@ -46,6 +46,7 @@ Options inherited from parent commands --admin.deviceFlowConfig.refreshTime string grace period from the token expiry after which it would refresh the token. (default "5m0s") --admin.deviceFlowConfig.timeout string amount of time the device flow should complete or else it will be cancelled. (default "10m0s") --admin.endpoint string For admin types, specify where the uri of the service is located. + --admin.httpProxyURL string OPTIONAL: HTTP Proxy to be used for OAuth requests. --admin.insecure Use insecure connection. --admin.insecureSkipVerify InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. Caution : shouldn't be use for production usecases' --admin.maxBackoffDelay string Max delay for grpc backoff (default "8s") From d30de343a83a3e414b0b952a50982c7d0652145c Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Thu, 11 Jan 2024 12:39:16 -0500 Subject: [PATCH 342/645] add monodocs index page in flytectl (#453) Signed-off-by: Niels Bantilan --- flytectl/docs/source/conf.py | 8 ++- flytectl/docs/source/docs_index.rst | 12 ++++ flytectl/docs/source/index.rst | 5 ++ flytectl/docs/source/overview.rst | 105 ++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 flytectl/docs/source/docs_index.rst create mode 100644 flytectl/docs/source/overview.rst diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index 905b3067eb..eb5edae7e5 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -78,7 +78,13 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path . -exclude_patterns = [u"_build", "Thumbs.db", ".DS_Store"] +exclude_patterns = [ + u"_build", + "Thumbs.db", + ".DS_Store", + "docs_index.rst", + "overview.rst", +] # The name of the Pygments (syntax highlighting) style to use. pygments_style = "tango" diff --git a/flytectl/docs/source/docs_index.rst b/flytectl/docs/source/docs_index.rst new file mode 100644 index 0000000000..f57f41f530 --- /dev/null +++ b/flytectl/docs/source/docs_index.rst @@ -0,0 +1,12 @@ +********************** +FlyteCTL API Reference +********************** + +.. toctree:: + :maxdepth: 2 + + Overview + CLI Entrypoint + verbs + nouns + contribute diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 66dc363f8d..0445ec929c 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -1,3 +1,8 @@ +.. DO NOT EDIT THIS FILE! + This file is the index for the old flytekit documentation. The index for the monodocs is now + at `docs_index.rst`. Please edit that file if you want to add new entries to the flytekit api + documentation. + .. flytectl doc #################################################### diff --git a/flytectl/docs/source/overview.rst b/flytectl/docs/source/overview.rst new file mode 100644 index 0000000000..fb533372fd --- /dev/null +++ b/flytectl/docs/source/overview.rst @@ -0,0 +1,105 @@ +#################################################### +Flytectl: The Official Flyte Command-line Interface +#################################################### + +Overview +========= +This video will take you on a tour of Flytectl - how to install and configure it, as well as how to use the Verbs and Nouns sections on the left hand side menu. Detailed information can be found in the sections below the video. + +.. youtube:: cV8ezYnBANE + + +Installation +============ + +Flytectl is a Golang binary that can be installed on any platform supported by Golang. + +.. tabbed:: OSX + + .. prompt:: bash $ + + brew install flyteorg/homebrew-tap/flytectl + + *Upgrade* existing installation using the following command: + + .. prompt:: bash $ + + flytectl upgrade + +.. tabbed:: Other Operating systems + + .. prompt:: bash $ + + curl -sL https://ctl.flyte.org/install | bash + + *Upgrade* existing installation using the following command: + + .. prompt:: bash $ + + flytectl upgrade + +**Test** if Flytectl is installed correctly (your Flytectl version should be > 0.2.0) using the following command: + +.. prompt:: bash $ + + flytectl version + +Configuration +============= + +Flytectl allows you to communicate with FlyteAdmin using a YAML file or by passing every configuration value +on the command-line. The following configuration can be used for the setup: + +Basic Configuration +-------------------- + +The full list of available configurable options can be found by running ``flytectl --help``, or `here `__. + +.. NOTE:: + + Currently, the Project ``-p``, Domain ``-d``, and Output ``-o`` flags cannot be used in the config file. + +.. tabbed:: Local Flyte Sandbox + + Automatically configured for you by ``flytectl sandbox`` command. + + .. code-block:: yaml + + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:///localhost:30081 + insecure: true # Set to false to enable TLS/SSL connection (not recommended except on local sandbox deployment). + authType: Pkce # authType: Pkce # if using authentication or just drop this. + +.. tabbed:: AWS Configuration + + .. code-block:: yaml + + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:/// + authType: Pkce # authType: Pkce # if using authentication or just drop this. + insecure: true # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + +.. tabbed:: GCS Configuration + + .. code-block:: yaml + + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:/// + authType: Pkce # authType: Pkce # if using authentication or just drop this. + insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + +.. tabbed:: Others + + For other supported storage backends like Oracle, Azure, etc., refer to the configuration structure `here `__. + + Place the config file in ``$HOME/.flyte`` directory with the name config.yaml. + This file is typically searched in: + + * ``$HOME/.flyte`` + * currDir from where you run flytectl + * ``/etc/flyte/config`` + + You can also pass the file name in the command line using ``--config ``. From f5473de479ee105e3e34791a12e4a5976bcb8493 Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Thu, 11 Jan 2024 13:06:33 -0500 Subject: [PATCH 343/645] fix dependencies (#455) Signed-off-by: Niels Bantilan --- flytectl/doc-requirements.txt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/flytectl/doc-requirements.txt b/flytectl/doc-requirements.txt index bc5dfeb5df..dd99b08872 100644 --- a/flytectl/doc-requirements.txt +++ b/flytectl/doc-requirements.txt @@ -1,10 +1,10 @@ # -# This file is autogenerated by pip-compile with Python 3.10 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile doc-requirements.in # -alabaster==0.7.16 +alabaster==0.7.13 # via sphinx babel==2.14.0 # via sphinx @@ -29,6 +29,8 @@ idna==3.6 # via requests imagesize==1.4.1 # via sphinx +importlib-metadata==7.0.1 + # via sphinx jinja2==3.1.3 # via sphinx lxml==5.1.0 @@ -44,6 +46,8 @@ pygments==2.17.2 # sphinx-prompt python-slugify[unidecode]==8.0.1 # via sphinx-material +pytz==2023.3.post1 + # via babel requests==2.31.0 # via # sphinx @@ -103,3 +107,5 @@ unidecode==1.3.8 # via python-slugify urllib3==2.1.0 # via requests +zipp==3.17.0 + # via importlib-metadata From dda6460af737bf3295ea1b94c452ddb4f6859507 Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Wed, 17 Jan 2024 17:06:15 -0800 Subject: [PATCH 344/645] Hydrate failure node (#456) Signed-off-by: Kevin Su --- flytectl/cmd/register/files_test.go | 25 ++++++++++++++++++ flytectl/cmd/register/register.go | 4 +-- flytectl/cmd/register/register_util.go | 10 +++++++ .../cmd/register/testdata/failure-node.tgz | Bin 0 -> 1671 bytes 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 flytectl/cmd/register/testdata/failure-node.tgz diff --git a/flytectl/cmd/register/files_test.go b/flytectl/cmd/register/files_test.go index 0eec77014b..129d4f49c1 100644 --- a/flytectl/cmd/register/files_test.go +++ b/flytectl/cmd/register/files_test.go @@ -60,6 +60,31 @@ func TestRegisterFromFiles(t *testing.T) { err = registerFromFilesFunc(s.Ctx, args, s.CmdCtx) assert.Nil(t, err) }) + t.Run("Register a workflow with a failure node", func(t *testing.T) { + s := setup() + testScope := promutils.NewTestScope() + labeled.SetMetricKeys(contextutils.AppNameKey, contextutils.ProjectKey, contextutils.DomainKey) + registerFilesSetup() + rconfig.DefaultFilesConfig.Archive = true + rconfig.DefaultFilesConfig.OutputLocationPrefix = s3Output + rconfig.DefaultFilesConfig.DeprecatedSourceUploadPath = s3Output + mockStorage, err := storage.NewDataStore(&storage.Config{ + Type: storage.TypeMemory, + }, testScope.NewSubScope("flytectl")) + assert.Nil(t, err) + Client = mockStorage + + args := []string{"testdata/failure-node.tgz"} + s.MockAdminClient.OnCreateTaskMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateWorkflowMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnCreateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + s.MockAdminClient.OnUpdateLaunchPlanMatch(mock.Anything, mock.Anything).Return(nil, nil) + mockDataProxy := s.MockClient.DataProxyClient().(*mocks.DataProxyServiceClient) + mockDataProxy.OnCreateUploadLocationMatch(s.Ctx, mock.Anything).Return(&service.CreateUploadLocationResponse{}, nil) + + err = registerFromFilesFunc(s.Ctx, args, s.CmdCtx) + assert.Nil(t, err) + }) t.Run("Failed fast registration while uploading the codebase", func(t *testing.T) { s := setup() registerFilesSetup() diff --git a/flytectl/cmd/register/register.go b/flytectl/cmd/register/register.go index a04c99bd19..7caa1e9bbd 100644 --- a/flytectl/cmd/register/register.go +++ b/flytectl/cmd/register/register.go @@ -10,7 +10,7 @@ import ( // Long descriptions are whitespace sensitive when generating docs using sphinx. const ( registerCmdShort = "Registers tasks, workflows, and launch plans from a list of generated serialized files." - registercmdLong = ` + registerCmdLong = ` Take input files as serialized versions of the tasks/workflows/launchplans and register them with FlyteAdmin. Currently, these input files are protobuf files generated as output from Flytekit serialize. Project and Domain are mandatory fields to be passed for registration and an optional version which defaults to v1. @@ -23,7 +23,7 @@ func RemoteRegisterCommand() *cobra.Command { registerCmd := &cobra.Command{ Use: "register", Short: registerCmdShort, - Long: registercmdLong, + Long: registerCmdLong, } registerResourcesFuncs := map[string]cmdcore.CommandEntry{ "files": {CmdFunc: registerFromFilesFunc, Aliases: []string{"file"}, PFlagProvider: rconfig.DefaultFilesConfig, diff --git a/flytectl/cmd/register/register_util.go b/flytectl/cmd/register/register_util.go index e4dd4355ad..5234e86697 100644 --- a/flytectl/cmd/register/register_util.go +++ b/flytectl/cmd/register/register_util.go @@ -491,6 +491,11 @@ func hydrateSpec(message proto.Message, uploadLocation storage.DataReference, co return err } } + if workflowSpec.Template.GetFailureNode() != nil { + if err := hydrateNode(workflowSpec.Template.GetFailureNode(), config.Version, config.Force); err != nil { + return err + } + } hydrateIdentifier(workflowSpec.Template.Id, config.Version, config.Force) for _, subWorkflow := range workflowSpec.SubWorkflows { for _, Noderef := range subWorkflow.Nodes { @@ -498,6 +503,11 @@ func hydrateSpec(message proto.Message, uploadLocation storage.DataReference, co return err } } + if subWorkflow.GetFailureNode() != nil { + if err := hydrateNode(subWorkflow.GetFailureNode(), config.Version, config.Force); err != nil { + return err + } + } hydrateIdentifier(subWorkflow.Id, config.Version, config.Force) } case *admin.TaskSpec: diff --git a/flytectl/cmd/register/testdata/failure-node.tgz b/flytectl/cmd/register/testdata/failure-node.tgz new file mode 100644 index 0000000000000000000000000000000000000000..7ac63e86fe471e5f3407ec113b20d18325b6746f GIT binary patch literal 1671 zcmV;226*`&iwFp_WvFEW|8;I@Z*DDNX>w+4Z+9(lVPk7yXJsyQXL9!-vcA|?#I*uq=JZEE?9FhZaX8!M-IYSv6#>SV=y~C%%tBF9FijlsZ z^_LKCzTNKar-V_a6c3dYtlJ5_K;B--rZKm;7dH097t|q^#Z9+dHe6y+v&@kKw(z!* z!aaJO+Bxp;j&1e(Ivecs)U+%{Y-ZbLum4lWREk!b{eM^NH~b0ZWU+dE@!r1y<3Ei5 zL*u_w<`%I`82>Y1gjDLyqfqGL(A#S_g;Dn!&2Atneyb*oY9PE&RH{wcOGHqiMtkc$ z`@e0PXN~`q*nDvOXVfHIDUvk%e@4fD^kxa^YOeHo;#Q!owvWP{mam6iXBTsAL(OUT zs6mOrw=AP3_Nn`5o7r{3YIfZ=YD~Ur`HneW>7Tc*l-AHkNJC4$wZvdo&U2j0O+xtbSxCxzE!VR`6TbmWOVaC*)y zU9awl>TbK$@a46=a0h=P3%}j>Z15hkyu9ZAJ161WvV3pfSEsv9OCwn$(P=gJMS#mE z55TCl0%7!@WyR};txC1!hhD=MfqeRPuiFeOy;oB?JvFcEc(u1n-)q&nO@Z;*FB@Nt z3ie(HzCQTkONzFH^J@hdG=cws{}!A7%8m{GeBLqrRp$E@m~VcVFCS9iJm5dzzfAL=X<7vMFBAO7Ch^}vyTiME0yCaf#?#xc)bLCdIsbBukK zge8?tc{KnG(Eqpk&qwv2g8rwX|IS$bcNt9oWkdgYoc{Ca>p!adSb)Km`#5+Cx-)aR=R0)tA>0`leT}uY;f!AfzfUSLA6eUuaQ5 z$QPQge4)XH0`o|~f53m2lK*V#x-Rfv7WmJanE%}ro?q#Q%{-*Fdy(A@ZY89KZlh$1OCeb|JjrHuhZQ+xOfIo z-29(yIm7dRmMjkZmj?g+RY3REe5n}M3bg#q96mFNyYzFE7^I=0HDl`vzIj|;#Vh^N zjGlMJVUHX0K0PzjIOA}OfC_JjL7pPE|591m-#iFr~ z;Zbt%o?gln=s)QH82xu#w+#B91^sv8^`B2!{}~y{|Ft*+{ZB>z@2iCb;{QWJNKo)S zboW^4ZliY*VHI6PSMYN5m?2FF{D08@xz&GH4%21kfc|Ge|J}*?zjXTRf2eKIk^Emu zK>t(G|NjaJl6&cFz5nkb?|&67N070u5CwmHeBJBl8bVlYH~j5RH$2#Upd|v8D4@VT zSU`a%4k)m>2`Fd~`N?$TXP)>E)_={6|D19BM>&J#-`U{5avc9nfBhF5`Tnm%90&L> z75@t=i=|1fUB_y03tluXutmcsX6Y-@D=H?03kN&o*$68~Wk z16a@)0O&vH{}}yuDg6FJHuRsy>Hm!UfB63Iy!ihtk^j%Y{|Emc^nWq*pR+On{m+E{ zvqbBEFSH6IR{w1_y#CjQ@4uy_|9|Jux)k>Z$y$Mw>{&$t;H$BVtN$?nKQsLwJO9re zZiD=1LjQSE{pZuue?~_2AN>Dx^nYFY|4GIFr*onL!~;P8!T-O6{=Y@#s0;v*1^qWC z$NzZ>>pv)WM(6+G_g~V{|2IkI|2fS6C!YWRu|NNR3$4BbL(!U*ky~s&*3JP`n~Da( z8Zh8L;J>N!pWK1~P$u}#isQc-<$nPGrNe*m`5!z{{s)hb_k0WS9xyO4FfcGMFfcGM RFfg#0*#9H`En)zm006%ic47bk literal 0 HcmV?d00001 From 71e61f18c6c7cafa316beb9bb6345e2e5541bd47 Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Mon, 22 Jan 2024 13:42:30 -0800 Subject: [PATCH 345/645] Remove dependency on unsupported `k8s.io/kubernetes` library (#457) --- flytectl/go.mod | 1 - flytectl/go.sum | 2 -- flytectl/pkg/sandbox/start.go | 12 ++++++------ 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/flytectl/go.mod b/flytectl/go.mod index 4beaf4d5a6..700445c958 100644 --- a/flytectl/go.mod +++ b/flytectl/go.mod @@ -43,7 +43,6 @@ require ( k8s.io/api v0.24.1 k8s.io/apimachinery v0.24.1 k8s.io/client-go v0.24.1 - k8s.io/kubernetes v1.13.0 sigs.k8s.io/yaml v1.3.0 ) diff --git a/flytectl/go.sum b/flytectl/go.sum index 00892a2001..88b64583da 100644 --- a/flytectl/go.sum +++ b/flytectl/go.sum @@ -1429,8 +1429,6 @@ k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAG k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/flytectl/pkg/sandbox/start.go b/flytectl/pkg/sandbox/start.go index ee7b8bc275..7ba775f702 100644 --- a/flytectl/pkg/sandbox/start.go +++ b/flytectl/pkg/sandbox/start.go @@ -28,7 +28,6 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/clientcmd" - "k8s.io/kubernetes/pkg/api/v1/pod" ) const ( @@ -103,12 +102,13 @@ func WatchFlyteDeployment(ctx context.Context, appsClient corev1.CoreV1Interface ready = 0 if total != 0 { for _, v := range pods.Items { - // TODO (jeev): We should really be using - // `IsContainersReadyConditionTrue`, but that is not available until - // version v1.22.11. We are on v1.13.0 for some reason. - if pod.IsPodReadyConditionTrue(v.Status) { - ready++ + for _, condition := range v.Status.Conditions { + if string(condition.Type) == string(corev1api.PodReady) && condition.Status == corev1api.ConditionTrue { + ready++ + break + } } + if len(v.Status.Conditions) > 0 { table.Append([]string{v.GetName(), string(v.Status.Phase), v.GetNamespace()}) } From 9feeb8e8a8a01f9c1b9bcb845a8a1e452e31b03a Mon Sep 17 00:00:00 2001 From: Peeter Piegaze <1153481+ppiegaze@users.noreply.github.com> Date: Wed, 31 Jan 2024 17:24:44 +0100 Subject: [PATCH 346/645] Update docs for `flytectl update project` (#458) * project-archive-with-yaml Signed-off-by: Peeter Piegaze <1153481+ppiegaze@users.noreply.github.com> * fix syntax Signed-off-by: Peeter Piegaze <1153481+ppiegaze@users.noreply.github.com> * fix list Signed-off-by: Peeter Piegaze <1153481+ppiegaze@users.noreply.github.com> * update generated Signed-off-by: Peeter Piegaze <1153481+ppiegaze@users.noreply.github.com> --------- Signed-off-by: Peeter Piegaze <1153481+ppiegaze@users.noreply.github.com> --- flytectl/cmd/update/project.go | 79 +++++++++++-------- flytectl/docs/source/gen/flytectl_update.rst | 2 +- .../source/gen/flytectl_update_project.rst | 79 +++++++++++-------- 3 files changed, 91 insertions(+), 69 deletions(-) diff --git a/flytectl/cmd/update/project.go b/flytectl/cmd/update/project.go index 215f2393d8..bf883af450 100644 --- a/flytectl/cmd/update/project.go +++ b/flytectl/cmd/update/project.go @@ -15,71 +15,82 @@ import ( ) const ( - projectShort = "Update project resources" + projectShort = "Update the characteristics of a project" projectLong = ` -Update the project according to the flags passed. Allows you to archive or activate a project. -Activate project flytesnacks: -:: - - flytectl update project -p flytesnacks --activate +Allows you to update the characteristics of a project, including its name, labels and description. +Also allows you to archive or activate (unarchive) a project. -Archive project flytesnacks: +To archive a project, specify its ID with the *p* flag and add the *archive* flag: :: - flytectl update project -p flytesnacks --archive + flytectl update project -p my-project-id --archive -Incorrect usage when passing both archive and activate: +To activate (unarchive) an archived project, specify its ID with the *p* flag and add the *activate* flag: :: - flytectl update project -p flytesnacks --archive --activate + flytectl update project -p my-project-id --activate -Incorrect usage when passing unknown-project: +To update the characteristics of a project using flags, specify the project ID with the *p* flag and the flags corresponding to the characteristics you want to update: :: - flytectl update project unknown-project --archive + flytectl update project -p my-project-id --description "A wonderful project" --labels app=my-app -project ID is required flag +To update the characteristics of a project using a *yaml* file, define the file with the project ID desired updates: + +.. code-block:: yaml + + id: "my-project-id" + name: "my-project-name" + labels: + values: + app: my-app + description: "A wonderful project" -:: - flytectl update project unknown-project --archive +(Note: The name parameter must not contain whitespace) -Update projects.(project/projects can be used interchangeably in these commands) +Then, pass it in using the *file* flag: :: - flytectl update project -p flytesnacks --description "flytesnacks description" --labels app=flyte + flytectl update project --file project.yaml -Update a project by definition file. Note: The name shouldn't contain any whitespace characters. -:: +To archive or activate (unarchive) a project using a *yaml* file: + +* Add a state field, with a value of *0* for activated (unarchived) or *1* for archived, at the top level of the the *yaml* file. - flytectl update project --file project.yaml +* Add the *archive* flag to the command. + +For example, to archive a project: .. code-block:: yaml - id: "project-unique-id" - name: "Name" - labels: - values: - app: flyte - description: "Some description for the project" + # update.yaml + id: "my-project-id" + state: 1 -Update a project state by definition file. Note: The name shouldn't contain any whitespace characters. :: - flytectl update project --file project.yaml --archive + $ uctl update project --file update.yaml --archive + +And to activate (unarchive) the same project: .. code-block:: yaml - id: "project-unique-id" - name: "Name" - labels: - values: - app: flyte - description: "Some description for the project" + # update.yaml + id: "my-project-id" + state: 0 + +:: + + $ uctl update project --file update.yaml --archive + +Note that when using a *yaml* file, the *activate* flag is not used. +Instead, the *archive* flag is used for *both* archiving and activating (unarchiving) with the difference being in the *state* field of the *yaml* file. +Furthermore, the *state* field only takes effect if the *archive* flag is present in the command. Usage ` diff --git a/flytectl/docs/source/gen/flytectl_update.rst b/flytectl/docs/source/gen/flytectl_update.rst index 27949e6145..ffc18b7101 100644 --- a/flytectl/docs/source/gen/flytectl_update.rst +++ b/flytectl/docs/source/gen/flytectl_update.rst @@ -104,7 +104,7 @@ SEE ALSO * :doc:`flytectl_update_launchplan` - Updates launch plan status * :doc:`flytectl_update_launchplan-meta` - Updates the launch plan metadata * :doc:`flytectl_update_plugin-override` - Update matchable resources of plugin overrides -* :doc:`flytectl_update_project` - Update project resources +* :doc:`flytectl_update_project` - Update the characteristics of a project * :doc:`flytectl_update_task-meta` - Update task metadata * :doc:`flytectl_update_task-resource-attribute` - Update matchable resources of task attributes * :doc:`flytectl_update_workflow-execution-config` - Updates matchable resources of workflow execution config diff --git a/flytectl/docs/source/gen/flytectl_update_project.rst b/flytectl/docs/source/gen/flytectl_update_project.rst index c4eeb48abe..5d27380478 100644 --- a/flytectl/docs/source/gen/flytectl_update_project.rst +++ b/flytectl/docs/source/gen/flytectl_update_project.rst @@ -3,76 +3,87 @@ flytectl update project ----------------------- -Update project resources +Update the characteristics of a project Synopsis ~~~~~~~~ -Update the project according to the flags passed. Allows you to archive or activate a project. -Activate project flytesnacks: -:: - - flytectl update project -p flytesnacks --activate +Allows you to update the characteristics of a project, including its name, labels and description. +Also allows you to archive or activate (unarchive) a project. -Archive project flytesnacks: +To archive a project, specify its ID with the *p* flag and add the *archive* flag: :: - flytectl update project -p flytesnacks --archive + flytectl update project -p my-project-id --archive -Incorrect usage when passing both archive and activate: +To activate (unarchive) an archived project, specify its ID with the *p* flag and add the *activate* flag: :: - flytectl update project -p flytesnacks --archive --activate + flytectl update project -p my-project-id --activate -Incorrect usage when passing unknown-project: +To update the characteristics of a project using flags, specify the project ID with the *p* flag and the flags corresponding to the characteristics you want to update: :: - flytectl update project unknown-project --archive + flytectl update project -p my-project-id --description "A wonderful project" --labels app=my-app -project ID is required flag +To update the characteristics of a project using a *yaml* file, define the file with the project ID desired updates: + +.. code-block:: yaml + + id: "my-project-id" + name: "my-project-name" + labels: + values: + app: my-app + description: "A wonderful project" -:: - flytectl update project unknown-project --archive +(Note: The name parameter must not contain whitespace) -Update projects.(project/projects can be used interchangeably in these commands) +Then, pass it in using the *file* flag: :: - flytectl update project -p flytesnacks --description "flytesnacks description" --labels app=flyte + flytectl update project --file project.yaml -Update a project by definition file. Note: The name shouldn't contain any whitespace characters. -:: +To archive or activate (unarchive) a project using a *yaml* file: + +* Add a state field, with a value of *0* for activated (unarchived) or *1* for archived, at the top level of the the *yaml* file. - flytectl update project --file project.yaml +* Add the *archive* flag to the command. + +For example, to archive a project: .. code-block:: yaml - id: "project-unique-id" - name: "Name" - labels: - values: - app: flyte - description: "Some description for the project" + # update.yaml + id: "my-project-id" + state: 1 -Update a project state by definition file. Note: The name shouldn't contain any whitespace characters. :: - flytectl update project --file project.yaml --archive + $ uctl update project --file update.yaml --archive + +And to activate (unarchive) the same project: .. code-block:: yaml - id: "project-unique-id" - name: "Name" - labels: - values: - app: flyte - description: "Some description for the project" + # update.yaml + id: "my-project-id" + state: 0 + +:: + + $ uctl update project --file update.yaml --archive + +Note that when using a *yaml* file, the *activate* flag is not used. +Instead, the *archive* flag is used for *both* archiving and activating (unarchiving) with the difference being in the *state* field of the *yaml* file. +Furthermore, the *state* field only takes effect if the *archive* flag is present in the command. Usage From b725a65b645c94da81856a37b5b14d78f3492630 Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Mon, 5 Feb 2024 17:05:22 -0500 Subject: [PATCH 347/645] install latest flyteidl with monodocs build (#459) Signed-off-by: Niels Bantilan --- flytectl/.github/workflows/monodocs_build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flytectl/.github/workflows/monodocs_build.yml b/flytectl/.github/workflows/monodocs_build.yml index c0befb62d7..a2610915fb 100644 --- a/flytectl/.github/workflows/monodocs_build.yml +++ b/flytectl/.github/workflows/monodocs_build.yml @@ -35,8 +35,10 @@ jobs: conda install -c conda-forge conda-lock conda-lock install -n monodocs-env monodocs-environment.lock.yaml - shell: bash -el {0} + working-directory: ${{ github.workspace }}/flyte run: | conda activate monodocs-env + pip install ./flyteidl conda info conda list conda config --show-sources From cff5a3d9bb2e81c9b5bbfb811304fbb7b72fba71 Mon Sep 17 00:00:00 2001 From: Guy Rapaport Date: Sat, 10 Feb 2024 06:09:23 +0200 Subject: [PATCH 348/645] Update typo nodID -> nodeID in execution.go, flytectl_get_execution.rst (#450) Signed-off-by: Guy Rapaport --- flytectl/cmd/get/execution.go | 2 +- flytectl/docs/source/gen/flytectl_get_execution.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flytectl/cmd/get/execution.go b/flytectl/cmd/get/execution.go index 55f9d26b77..abb89631f2 100644 --- a/flytectl/cmd/get/execution.go +++ b/flytectl/cmd/get/execution.go @@ -82,7 +82,7 @@ Task execution view is available in YAML/JSON format too. The following example :: - flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 -o yaml + flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodeID n0 -o yaml Usage ` diff --git a/flytectl/docs/source/gen/flytectl_get_execution.rst b/flytectl/docs/source/gen/flytectl_get_execution.rst index 38543aad68..56ed2a6a70 100644 --- a/flytectl/docs/source/gen/flytectl_get_execution.rst +++ b/flytectl/docs/source/gen/flytectl_get_execution.rst @@ -75,7 +75,7 @@ Task execution view is available in YAML/JSON format too. The following example :: - flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodID n0 -o yaml + flytectl get execution -p flytesnacks -d development oeh94k9r2r --nodeID n0 -o yaml Usage From 8362431a1e41c837fef7a113c549d6a255b26509 Mon Sep 17 00:00:00 2001 From: Jeongwon Song <46633758+jsong336@users.noreply.github.com> Date: Mon, 19 Feb 2024 23:55:27 -0500 Subject: [PATCH 349/645] Fix: Check for git authentication when GITHUB_TOKEN exists (#463) Signed-off-by: Jeongwon Song --- flytectl/pkg/github/githubutil.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/flytectl/pkg/github/githubutil.go b/flytectl/pkg/github/githubutil.go index 2d72b67af7..680085370b 100644 --- a/flytectl/pkg/github/githubutil.go +++ b/flytectl/pkg/github/githubutil.go @@ -231,7 +231,12 @@ func GetGHRepoService() GHRepoService { gh = github.NewClient(oauth2.NewClient(context.Background(), oauth2.StaticTokenSource( &oauth2.Token{AccessToken: os.Getenv("GITHUB_TOKEN")}, ))) - } else { + if _, err := ListReleases(flyte, gh.Repositories); err != nil { + logger.Warnf(context.Background(), "Found GITHUB_TOKEN but failed to fetch releases. Using empty http.Client: %s.", err) + gh = nil + } + } + if gh == nil { gh = github.NewClient(&http.Client{}) } return gh.Repositories From 007a4b1f6d03cf104bcbab712c96e591e0d2a084 Mon Sep 17 00:00:00 2001 From: Nikki Everett Date: Mon, 4 Mar 2024 09:21:10 -0600 Subject: [PATCH 350/645] update links for monodocs (#465) Signed-off-by: nikki everett --- flytectl/.goreleaser.yml | 2 +- flytectl/README.md | 2 +- flytectl/cmd/update/launch_plan.go | 4 ++-- flytectl/docs/source/conf.py | 2 +- flytectl/docs/source/gen/flytectl_update_launchplan.rst | 4 ++-- flytectl/docs/source/overview.rst | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/flytectl/.goreleaser.yml b/flytectl/.goreleaser.yml index 018b9d48cb..15c88a7c5a 100644 --- a/flytectl/.goreleaser.yml +++ b/flytectl/.goreleaser.yml @@ -79,7 +79,7 @@ brews: # Your app's homepage. # Default is empty. - homepage: "https://docs.flyte.org/projects/flytectl" + homepage: "https://docs.flyte.org/en/latest/flytectl/docs_index.html" # Your app's description. # Default is empty. diff --git a/flytectl/README.md b/flytectl/README.md index b7676ec842..5a6e5fc26e 100644 --- a/flytectl/README.md +++ b/flytectl/README.md @@ -11,7 +11,7 @@

Documentation · - Contribution Guide + Contribution Guide

diff --git a/flytectl/cmd/update/launch_plan.go b/flytectl/cmd/update/launch_plan.go index b20ad48040..6d1e7661e2 100644 --- a/flytectl/cmd/update/launch_plan.go +++ b/flytectl/cmd/update/launch_plan.go @@ -18,12 +18,12 @@ import ( const ( updateLPShort = "Updates launch plan status" updateLPLong = ` -Activates a ` + "`launch plan `__" + ` which activates the scheduled job associated with it: +Activates a ` + "`launch plan `__" + ` which activates the scheduled job associated with it: :: flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --activate -Deactivates a ` + "`launch plan `__" + ` which deschedules any scheduled job associated with it: +Deactivates a ` + "`launch plan `__" + ` which deschedules any scheduled job associated with it: :: flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --deactivate diff --git a/flytectl/docs/source/conf.py b/flytectl/docs/source/conf.py index eb5edae7e5..2f473ff5b5 100644 --- a/flytectl/docs/source/conf.py +++ b/flytectl/docs/source/conf.py @@ -205,7 +205,7 @@ # -- Options for intersphinx ------------------------------------------------- # intersphinx configuration intersphinx_mapping = { - "flyteidl": ("https://docs.flyte.org/projects/flyteidl/en/latest", None), + "flyteidl": ("https://docs.flyte.org/en/latest/reference_flyteidl.html", None), "flyte": ("https://docs.flyte.org/en/latest", None), } diff --git a/flytectl/docs/source/gen/flytectl_update_launchplan.rst b/flytectl/docs/source/gen/flytectl_update_launchplan.rst index 203e060a4e..bb9992861d 100644 --- a/flytectl/docs/source/gen/flytectl_update_launchplan.rst +++ b/flytectl/docs/source/gen/flytectl_update_launchplan.rst @@ -10,12 +10,12 @@ Synopsis -Activates a `launch plan `__ which activates the scheduled job associated with it: +Activates a `launch plan `__ which activates the scheduled job associated with it: :: flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --activate -Deactivates a `launch plan `__ which deschedules any scheduled job associated with it: +Deactivates a `launch plan `__ which deschedules any scheduled job associated with it: :: flytectl update launchplan -p flytesnacks -d development core.control_flow.merge_sort.merge_sort --version v1 --deactivate diff --git a/flytectl/docs/source/overview.rst b/flytectl/docs/source/overview.rst index fb533372fd..08bb11a01c 100644 --- a/flytectl/docs/source/overview.rst +++ b/flytectl/docs/source/overview.rst @@ -53,7 +53,7 @@ on the command-line. The following configuration can be used for the setup: Basic Configuration -------------------- -The full list of available configurable options can be found by running ``flytectl --help``, or `here `__. +The full list of available configurable options can be found by running ``flytectl --help``, or `here `__. .. NOTE:: From d68047a1bff9383cb2f53a6f39848ec662354c03 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Mon, 25 Mar 2024 17:50:45 -0700 Subject: [PATCH 351/645] Fix numbering in code examples (#5104) Signed-off-by: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> --- docs/community/contribute.rst | 74 ++++++++++++++++------------------- 1 file changed, 33 insertions(+), 41 deletions(-) diff --git a/docs/community/contribute.rst b/docs/community/contribute.rst index c757301135..bb10031a9d 100644 --- a/docs/community/contribute.rst +++ b/docs/community/contribute.rst @@ -342,13 +342,13 @@ How to setup dev environment for flyteidl, flyteadmin, flyteplugins, flytepropel .. code:: shell - # Step1: Install the latest version of flytectl + # Step 1: Install the latest version of flytectl curl -sL https://ctl.flyte.org/install | bash # flyteorg/flytectl info checking GitHub for latest tag # flyteorg/flytectl info found version: 0.6.39 for v0.6.39/Linux/x86_64 # flyteorg/flytectl info installed ./bin/flytectl - # Step2: Export flytectl path based on the previous log "flyteorg/flytectl info installed ./bin/flytectl" + # Step 2: Export flytectl path based on the previous log "flyteorg/flytectl info installed ./bin/flytectl" export PATH=$PATH:/home/ubuntu/bin # replace with your path **2. Build a k3s cluster that runs minio and postgres Pods.** @@ -360,7 +360,7 @@ How to setup dev environment for flyteidl, flyteadmin, flyteplugins, flytepropel .. code:: shell - # Step1: Start k3s cluster, create Pods for postgres and minio. Note: We cannot access Flyte UI yet! but we can access the minio console now. + # Step 1: Start k3s cluster, create Pods for postgres and minio. Note: We cannot access Flyte UI yet! but we can access the minio console now. flytectl demo start --dev # 👨‍💻 Flyte is ready! Flyte UI is available at http://localhost:30080/console 🚀 🚀 🎉 # ❇️ Run the following command to export demo environment variables for accessing flytectl @@ -368,10 +368,10 @@ How to setup dev environment for flyteidl, flyteadmin, flyteplugins, flytepropel # 🐋 Flyte sandbox ships with a Docker registry. Tag and push custom workflow images to localhost:30000 # 📂 The Minio API is hosted on localhost:30002. Use http://localhost:30080/minio/login for Minio console - # Step2: Export FLYTECTL_CONFIG as the previous log indicated. + # Step 2: Export FLYTECTL_CONFIG as the previous log indicated. FLYTECTL_CONFIG=/home/ubuntu/.flyte/config-sandbox.yaml - # Step3: The kubeconfig will be automatically copied to the user's main kubeconfig (default is `/.kube/config`) with "flyte-sandbox" as the context name. + # Step 3: The kubeconfig will be automatically copied to the user's main kubeconfig (default is `/.kube/config`) with "flyte-sandbox" as the context name. # Check that we can access the K3s cluster. Verify that postgres and minio are running. kubectl get pod -n flyte # NAME READY STATUS RESTARTS AGE @@ -389,26 +389,18 @@ that integrates all Flyte components into a single binary. .. code:: shell - # Step1: Clone flyte repo + # Step 1: Clone flyte repo git clone https://github.com/flyteorg/flyte.git cd flyte - # Step2: Build a single binary that bundles all the Flyte components. + # Step 2: Build a single binary that bundles all the Flyte components. # The version of each component/library used to build the single binary are defined in `go.mod`. sudo apt-get -y install jq # You may need to install jq make clean # (Optional) Run this only if you want to run the newest version of flyteconsole go mod tidy make compile - # Step3: Edit the config file: ./flyte-single-binary-local.yaml. - # Replace occurrences of $HOME with the actual path of your home directory. - sedi=(-i) - case "$(uname)" in - Darwin*) sedi=(-i "") - esac - sed "${sedi[@]}" -e "s|\$HOME|${HOME}|g" flyte-single-binary-local.yaml - - # Step 4: Prepare a namespace template for the cluster resource controller. + # Step 3: Prepare a namespace template for the cluster resource controller. # The configuration file "flyte-single-binary-local.yaml" has an entry named cluster_resources.templatePath. # This entry needs to direct to a directory containing the templates for the cluster resource controller to use. # We will now create a simple template that allows the automatic creation of required namespaces for projects. @@ -420,7 +412,7 @@ that integrates all Flyte components into a single binary. metadata: name: '{{ namespace }}'" > $HOME/.flyte/sandbox/cluster-resource-templates/namespace.yaml - # Step5: Running the single binary. + # Step 4: Running the single binary. # The POD_NAMESPACE environment variable is necessary for the webhook to function correctly. # You may encounter an error due to `ERROR: duplicate key value violates unique constraint`. Running the command again will solve the problem. POD_NAMESPACE=flyte ./flyte start --config flyte-single-binary-local.yaml @@ -439,7 +431,7 @@ The following instructions provide guidance on how to build single binary with y .. code:: shell - # Step1: Install Go. Flyte uses Go 1.19, so make sure to switch to Go 1.19. + # Step 1: Install Go. Flyte uses Go 1.19, so make sure to switch to Go 1.19. export PATH=$PATH:$(go env GOPATH)/bin go install golang.org/dl/go1.19@latest go1.19 download @@ -451,10 +443,10 @@ The following instructions provide guidance on how to build single binary with y go install golang.org/x/tools/cmd/goimports@latest export PATH=$(go env GOPATH)/bin:$PATH - # Step2: Go to the {flyteadmin} repository, modify the source code accordingly. + # Step 2: Go to the {flyteadmin} repository, modify the source code accordingly. cd flyte/flyteadmin - # Step3: Now, you can build the single binary. Go back to Flyte directory. + # Step 3: Now, you can build the single binary. Go back to Flyte directory. go mod tidy make compile POD_NAMESPACE=flyte ./flyte start --config flyte-single-binary-local.yaml @@ -464,10 +456,10 @@ The following instructions provide guidance on how to build single binary with y .. code:: shell - # Step1: Install flytekit + # Step 1: Install flytekit pip install flytekit && export PATH=$PATH:/home/ubuntu/.local/bin - # Step2: Run a hello world example + # Step 2: Run a hello world example pyflyte run --remote https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/hello_world.py hello_world_wf # Go to http://localhost:30080/console/projects/flytesnacks/domains/development/executions/fd63f88a55fed4bba846 to see execution in the console. # You can go to the [flytesnacks repository](https://github.com/flyteorg/flytesnacks) to see more useful examples. @@ -496,16 +488,16 @@ If not, we can start backends with a single command. .. code:: shell - # Step1: Install the latest version of flytectl, a portable and lightweight command-line interface to work with Flyte. + # Step 1: Install the latest version of flytectl, a portable and lightweight command-line interface to work with Flyte. curl -sL https://ctl.flyte.org/install | bash # flyteorg/flytectl info checking GitHub for latest tag # flyteorg/flytectl info found version: 0.6.39 for v0.6.39/Linux/x86_64 # flyteorg/flytectl info installed ./bin/flytectl - # Step2: Export flytectl path based on the previous log "flyteorg/flytectl info installed ./bin/flytectl" + # Step 2: Export flytectl path based on the previous log "flyteorg/flytectl info installed ./bin/flytectl" export PATH=$PATH:/home/ubuntu/bin # replace with your path - # Step3: Starts the Flyte demo cluster. This will setup a k3s cluster running minio, postgres Pods, and all Flyte components: flyteadmin, flyteplugins, flytepropeller, etc. + # Step 3: Starts the Flyte demo cluster. This will setup a k3s cluster running minio, postgres Pods, and all Flyte components: flyteadmin, flyteplugins, flytepropeller, etc. # See https://docs.flyte.org/en/latest/flytectl/gen/flytectl_demo_start.html for more details. flytectl demo start # 👨‍💻 Flyte is ready! Flyte UI is available at http://localhost:30080/console 🚀 🚀 🎉 @@ -519,7 +511,7 @@ If not, we can start backends with a single command. .. code:: shell - # Step1: Build a virtual environment for developing Flytekit. This will allow your local changes to take effect when the same Python interpreter runs `import flytekit`. + # Step 1: Build a virtual environment for developing Flytekit. This will allow your local changes to take effect when the same Python interpreter runs `import flytekit`. git clone https://github.com/flyteorg/flytekit.git # replace with your own repo cd flytekit virtualenv ~/.virtualenvs/flytekit @@ -545,11 +537,11 @@ If not, we can start backends with a single command. pip install -e . # Now you can use all plugins, but the performance is slow. - # Step2: Modify the source code for flytekit, then run unit tests and lint. + # Step 2: Modify the source code for flytekit, then run unit tests and lint. make lint make test - # Step3: Run a hello world sample to test locally + # Step 3: Run a hello world sample to test locally pyflyte run https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/hello_world.py hello_world_wf # Running hello_world_wf() hello world @@ -579,19 +571,19 @@ the Flyte cluster, and finally submit the workflow. .. code:: shell - # Step1: Ensure you have pushed your changes to the remote repo + # Step 1: Ensure you have pushed your changes to the remote repo # In the flytekit folder git add . && git commit -s -m "develop" && git push - # Step2: Build the image + # Step 2: Build the image # In the flytekit folder export FLYTE_INTERNAL_IMAGE="localhost:30000/flytekit:demo" # replace with your own image name and tag docker build --no-cache -t "${FLYTE_INTERNAL_IMAGE}" -f ./Dockerfile . - # Step3: Push the image to the Flyte cluster + # Step 3: Push the image to the Flyte cluster docker push ${FLYTE_INTERNAL_IMAGE} - # Step4: Submit a hello world workflow to the Flyte cluster + # Step 4: Submit a hello world workflow to the Flyte cluster cd flytesnacks pyflyte run --image ${FLYTE_INTERNAL_IMAGE} --remote https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/hello_world.py hello_world_wf # Go to http://localhost:30080/console/projects/flytesnacks/domains/development/executions/f5c17e1b5640c4336bf8 to see execution in the console. @@ -612,35 +604,35 @@ Depending on your needs, refer to one of the following guides to setup up the Fl .. code:: shell - # Step1: Clone the repo and navigate to the Flyteconsole folder + # Step 1: Clone the repo and navigate to the Flyteconsole folder git clone https://github.com/flyteorg/flyteconsole.git cd flyteconsole - # Step2: Install Node.js 18. Refer to https://github.com/nodesource/distributions/blob/master/README.md#using-ubuntu-2. + # Step 2: Install Node.js 18. Refer to https://github.com/nodesource/distributions/blob/master/README.md#using-ubuntu-2. curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&\ sudo apt-get install -y nodejs - # Step3: Install yarn. Refer to https://classic.yarnpkg.com/lang/en/docs/install/#debian-stable. + # Step 3: Install yarn. Refer to https://classic.yarnpkg.com/lang/en/docs/install/#debian-stable. curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list sudo apt update && sudo apt install yarn - # Step4: Add environment variables + # Step 4: Add environment variables export BASE_URL=/console export ADMIN_API_URL=http://localhost:30080 export DISABLE_AUTH=1 export ADMIN_API_USE_SSL="http" - # Step5: Generate SSL certificate + # Step 5: Generate SSL certificate # Note, since we will use HTTP, SSL is not required. However, missing an SSL certificate will cause an error when starting Flyteconsole. make generate_ssl - # Step6: Install node packages + # Step 6: Install node packages yarn install yarn build:types # It is fine if seeing error `Property 'at' does not exist on type 'string[]'` yarn run build:prod - # Step7: Start flyteconsole + # Step 7: Start flyteconsole yarn start **3. Install the Chrome plugin:** `Moesif Origin & CORS Changer `__. @@ -693,11 +685,11 @@ FlyteAdmin and datacatalog use postgres to store persistent records, and you can .. code:: shell - # Step1: Install the PostgreSQL client. + # Step 1: Install the PostgreSQL client. sudo apt-get update sudo apt-get install postgresql-client - # Step2: Connect to the PostgreSQL server. The password is "postgres". + # Step 2: Connect to the PostgreSQL server. The password is "postgres". psql -h localhost -p 30001 -U postgres -d flyte From cf7c638497224aa60912967df529182b4c41b5d5 Mon Sep 17 00:00:00 2001 From: pbrogan12 Date: Tue, 26 Mar 2024 08:08:21 -0400 Subject: [PATCH 352/645] fix rendering of flyte-core and flyteagent charts (#5048) * fix rendering of flyte-core and flyteagent charts Signed-off-by: Patrick Brogan * update to kubeflow spark-operator repo fixes #5055 Signed-off-by: Patrick Brogan --------- Signed-off-by: Patrick Brogan --- charts/flyte-core/templates/_helpers.tpl | 22 ---------------------- charts/flyteagent/templates/_helpers.tpl | 2 +- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/charts/flyte-core/templates/_helpers.tpl b/charts/flyte-core/templates/_helpers.tpl index 98a42655e3..b4361a1e47 100755 --- a/charts/flyte-core/templates/_helpers.tpl +++ b/charts/flyte-core/templates/_helpers.tpl @@ -102,28 +102,6 @@ app.kubernetes.io/managed-by: {{ .Release.Service }} {{- end }} {{- end -}} -{{- define "flyteagent.name" -}} -flyteagent -{{- end -}} - -{{- define "flyteagent.selectorLabels" -}} -app.kubernetes.io/name: {{ template "flyteagent.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} - -{{- define "flyteagent.labels" -}} -{{ include "flyteagent.selectorLabels" . }} -helm.sh/chart: {{ include "flyte.chart" . }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{- define "flyteagent.podLabels" -}} -{{ include "flyteagent.labels" . }} -{{- with .Values.flyteagent.podLabels }} -{{ toYaml . }} -{{- end }} -{{- end -}} - {{- define "flytepropeller.name" -}} flytepropeller {{- end -}} diff --git a/charts/flyteagent/templates/_helpers.tpl b/charts/flyteagent/templates/_helpers.tpl index 40411a61b9..c8ed80055b 100755 --- a/charts/flyteagent/templates/_helpers.tpl +++ b/charts/flyteagent/templates/_helpers.tpl @@ -31,7 +31,7 @@ app.kubernetes.io/managed-by: {{ .Release.Service }} {{- define "flyteagent.podLabels" -}} {{ include "flyteagent.labels" . }} {{- with .Values.podLabels }} -{{- toYaml . }} +{{ toYaml . }} {{- end }} {{- end -}} From 46d1bd803a115ba797a4dddf9e8a76de6b98387a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 12:29:00 -0700 Subject: [PATCH 353/645] Bump golang.org/x/net in /docker/sandbox-bundled/bootstrap (#3390) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.3.1-0.20221206200815-1e63c2f08a10 to 0.7.0. - [Release notes](https://github.com/golang/net/releases) - [Commits](https://github.com/golang/net/commits/v0.7.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: Eduardo Apolinario Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eduardo Apolinario --- docker/sandbox-bundled/bootstrap/go.mod | 6 +++--- docker/sandbox-bundled/bootstrap/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docker/sandbox-bundled/bootstrap/go.mod b/docker/sandbox-bundled/bootstrap/go.mod index 7f7f3a6beb..e951f9fe6b 100644 --- a/docker/sandbox-bundled/bootstrap/go.mod +++ b/docker/sandbox-bundled/bootstrap/go.mod @@ -38,9 +38,9 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/xlab/treeprint v1.1.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10 // indirect - golang.org/x/sys v0.3.0 // indirect - golang.org/x/text v0.5.0 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/docker/sandbox-bundled/bootstrap/go.sum b/docker/sandbox-bundled/bootstrap/go.sum index 91cb46085c..c807128b2e 100644 --- a/docker/sandbox-bundled/bootstrap/go.sum +++ b/docker/sandbox-bundled/bootstrap/go.sum @@ -131,8 +131,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10 h1:Frnccbp+ok2GkUS2tC84yAq/U9Vg+0sIO7aRL3T4Xnc= -golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -144,12 +144,12 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= From b35246b87996c0829edff850a480fb5a698883df Mon Sep 17 00:00:00 2001 From: Troy Chiu <114708546+troychiu@users.noreply.github.com> Date: Tue, 26 Mar 2024 12:32:50 -0700 Subject: [PATCH 354/645] Update repeated value filters with ValueNotIn support (#5110) Signed-off-by: troychiu --- docs/concepts/admin.rst | 7 ++--- flyteadmin/pkg/common/filters.go | 26 +++++++++++++++--- flyteadmin/pkg/common/filters_test.go | 39 ++++++++++++++------------- 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/docs/concepts/admin.rst b/docs/concepts/admin.rst index f33ef51364..e0bc488830 100644 --- a/docs/concepts/admin.rst +++ b/docs/concepts/admin.rst @@ -260,14 +260,15 @@ The fully supported set of filter functions are - contains - gt (greater than) -- gte (greter than or equal to) +- gte (greater than or equal to) - lt (less than) - lte (less than or equal to) - eq (equal) - ne (not equal) -- value_in (for repeated sets of values) +- value_in (value in repeated sets of values) +- value_not_in (value not in repeated sets of values) -"value_in" is a special case where multiple values are passed to the filter expression. For example:: +"value_in" and "value_not_in" are special cases where multiple values are passed to the filter expression. For example:: value_in(phase, RUNNING;SUCCEEDED;FAILED) diff --git a/flyteadmin/pkg/common/filters.go b/flyteadmin/pkg/common/filters.go index 081d8ea95b..a5974fb286 100644 --- a/flyteadmin/pkg/common/filters.go +++ b/flyteadmin/pkg/common/filters.go @@ -29,6 +29,7 @@ const ( Equal NotEqual ValueIn + ValueNotIn ) // String formats for various filter expression queries @@ -43,6 +44,7 @@ const ( equalQuery = "%s = ?" notEqualQuery = "%s <> ?" valueInQuery = "%s in (?)" + valueNotInQuery = "%s not in (?)" ) // Set of available filters which exclusively accept a single argument value. @@ -58,7 +60,8 @@ var singleValueFilters = map[FilterExpression]bool{ // Set of available filters which exclusively accept repeated argument values. var repeatedValueFilters = map[FilterExpression]bool{ - ValueIn: true, + ValueIn: true, + ValueNotIn: true, } const EqualExpression = "eq" @@ -72,6 +75,19 @@ var filterNameMappings = map[string]FilterExpression{ EqualExpression: Equal, "ne": NotEqual, "value_in": ValueIn, + "value_not_in": ValueNotIn, +} + +var filterQueryMappings = map[FilterExpression]string{ + Contains: containsQuery, + GreaterThan: greaterThanQuery, + GreaterThanOrEqual: greaterThanOrEqualQuery, + LessThan: lessThanQuery, + LessThanOrEqual: lessThanOrEqualQuery, + Equal: equalQuery, + NotEqual: notEqualQuery, + ValueIn: valueInQuery, + ValueNotIn: valueNotInQuery, } var executionIdentifierFields = map[string]bool{ @@ -108,6 +124,8 @@ func getFilterExpressionName(expression FilterExpression) string { return "not equal" case ValueIn: return "value in" + case ValueNotIn: + return "value not in" default: return "" } @@ -166,9 +184,9 @@ func (f *inlineFilterImpl) GetField() string { func (f *inlineFilterImpl) getGormQueryExpr(formattedField string) (GormQueryExpr, error) { - // ValueIn is special because it uses repeating values. - if f.function == ValueIn { - queryStr := fmt.Sprintf(valueInQuery, formattedField) + // Filters that use repeated values + if _, ok := repeatedValueFilters[f.function]; ok { + queryStr := fmt.Sprintf(filterQueryMappings[f.function], formattedField) return GormQueryExpr{ Query: queryStr, Args: f.repeatedValue, diff --git a/flyteadmin/pkg/common/filters_test.go b/flyteadmin/pkg/common/filters_test.go index e49084557f..87ba5ac2ac 100644 --- a/flyteadmin/pkg/common/filters_test.go +++ b/flyteadmin/pkg/common/filters_test.go @@ -1,6 +1,7 @@ package common import ( + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -83,6 +84,14 @@ func TestNewRepeatedValueFilter(t *testing.T) { assert.Equal(t, "projects.project in (?)", expression.Query) assert.Equal(t, vals, expression.Args) + filter, err = NewRepeatedValueFilter(Workflow, ValueNotIn, "project", vals) + assert.NoError(t, err) + + expression, err = filter.GetGormJoinTableQueryExpr("projects") + assert.NoError(t, err) + assert.Equal(t, "projects.project not in (?)", expression.Query) + assert.Equal(t, vals, expression.Args) + _, err = NewRepeatedValueFilter(Workflow, Equal, "domain", []string{"production", "qa"}) assert.EqualError(t, err, "invalid repeated value filter expression: equal") } @@ -96,16 +105,6 @@ func TestGetGormJoinTableQueryExpr(t *testing.T) { assert.Equal(t, "workflows.domain = ?", gormQueryExpr.Query) } -var expectedQueriesForFilters = map[FilterExpression]string{ - Contains: "field LIKE ?", - GreaterThan: "field > ?", - GreaterThanOrEqual: "field >= ?", - LessThan: "field < ?", - LessThanOrEqual: "field <= ?", - Equal: "field = ?", - NotEqual: "field <> ?", -} - var expectedArgsForFilters = map[FilterExpression]string{ Contains: "%value%", GreaterThan: "value", @@ -117,12 +116,13 @@ var expectedArgsForFilters = map[FilterExpression]string{ } func TestQueryExpressions(t *testing.T) { - for expression, expectedQuery := range expectedQueriesForFilters { + for expression := range singleValueFilters { filter, err := NewSingleValueFilter(Workflow, expression, "field", "value") assert.NoError(t, err) gormQueryExpr, err := filter.GetGormQueryExpr() assert.NoError(t, err) + expectedQuery := fmt.Sprintf(filterQueryMappings[expression], "field") assert.Equal(t, expectedQuery, gormQueryExpr.Query) expectedArg, ok := expectedArgsForFilters[expression] @@ -130,14 +130,17 @@ func TestQueryExpressions(t *testing.T) { assert.Equal(t, expectedArg, gormQueryExpr.Args) } - // Also test the one repeated value filter - filter, err := NewRepeatedValueFilter(Workflow, ValueIn, "field", []string{"value"}) - assert.NoError(t, err) + // Also test the repeated value filters + for expression := range repeatedValueFilters { + filter, err := NewRepeatedValueFilter(Workflow, expression, "field", []string{"value"}) + assert.NoError(t, err) - gormQueryExpr, err := filter.GetGormQueryExpr() - assert.NoError(t, err) - assert.Equal(t, "field in (?)", gormQueryExpr.Query) - assert.EqualValues(t, []string{"value"}, gormQueryExpr.Args) + gormQueryExpr, err := filter.GetGormQueryExpr() + assert.NoError(t, err) + expectedQuery := fmt.Sprintf(filterQueryMappings[expression], "field") + assert.Equal(t, expectedQuery, gormQueryExpr.Query) + assert.EqualValues(t, []string{"value"}, gormQueryExpr.Args) + } } func TestMapFilter(t *testing.T) { From 998c9ce1377e24e10131c06673ceff5af09fe58e Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Tue, 26 Mar 2024 12:58:21 -0700 Subject: [PATCH 355/645] Update container builds from go 1.21.5 to latest (#5097) - go 1.21.5 was released on 12-5-2023 and go 1.21.8 was released on 3-5-2024. During that time a number of high and critical vulns have been addressed - This PR changes the build process to float with the latest go release to automatically pick up remediated vulnerabilities rather than pin to a specific go release - Ideally there would be a renovate or dependabot process that automatically puts up PRs to this repo to update the pinning, which is safer from a build / test perspective. Without that process in place, it's probably better to float with the latest patch release of go 1.21 Signed-off-by: ddl-ebrown --- Dockerfile | 2 +- Dockerfile.datacatalog | 4 ++-- Dockerfile.flyteadmin | 4 ++-- Dockerfile.flytecopilot | 4 ++-- Dockerfile.flytepropeller | 4 ++-- Dockerfile.flytescheduler | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6ce448399b..c48d292535 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ ARG FLYTECONSOLE_VERSION=latest FROM ghcr.io/flyteorg/flyteconsole:${FLYTECONSOLE_VERSION} AS flyteconsole -FROM --platform=${BUILDPLATFORM} golang:1.21.5-bookworm AS flytebuilder +FROM --platform=${BUILDPLATFORM} golang:1.21-bookworm AS flytebuilder ARG TARGETARCH ENV GOARCH "${TARGETARCH}" diff --git a/Dockerfile.datacatalog b/Dockerfile.datacatalog index 065eb28722..641b1b9fd6 100644 --- a/Dockerfile.datacatalog +++ b/Dockerfile.datacatalog @@ -1,9 +1,9 @@ # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. # ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# +# # TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst -FROM --platform=${BUILDPLATFORM} golang:1.21.5-alpine3.18 as builder +FROM --platform=${BUILDPLATFORM} golang:1.21-alpine3.18 as builder ARG TARGETARCH ENV GOARCH "${TARGETARCH}" diff --git a/Dockerfile.flyteadmin b/Dockerfile.flyteadmin index 993949b221..6b6225ec6f 100644 --- a/Dockerfile.flyteadmin +++ b/Dockerfile.flyteadmin @@ -1,9 +1,9 @@ # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. # ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: -# +# # TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst -FROM --platform=${BUILDPLATFORM} golang:1.21.5-alpine3.18 as builder +FROM --platform=${BUILDPLATFORM} golang:1.21-alpine3.18 as builder ARG TARGETARCH ENV GOARCH "${TARGETARCH}" diff --git a/Dockerfile.flytecopilot b/Dockerfile.flytecopilot index 247a04e969..e19df0743d 100644 --- a/Dockerfile.flytecopilot +++ b/Dockerfile.flytecopilot @@ -1,9 +1,9 @@ # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. # ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: -# +# # TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst -FROM --platform=${BUILDPLATFORM} golang:1.21.5-alpine3.18 as builder +FROM --platform=${BUILDPLATFORM} golang:1.21-alpine3.18 as builder ARG TARGETARCH ENV GOARCH "${TARGETARCH}" diff --git a/Dockerfile.flytepropeller b/Dockerfile.flytepropeller index 8da39815be..8cbdd40f14 100644 --- a/Dockerfile.flytepropeller +++ b/Dockerfile.flytepropeller @@ -1,9 +1,9 @@ # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. # ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: -# +# # TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst -FROM --platform=${BUILDPLATFORM} golang:1.21.5-alpine3.18 as builder +FROM --platform=${BUILDPLATFORM} golang:1.21-alpine3.18 as builder ARG TARGETARCH ENV GOARCH "${TARGETARCH}" diff --git a/Dockerfile.flytescheduler b/Dockerfile.flytescheduler index 2956d93959..fa7f1906a3 100644 --- a/Dockerfile.flytescheduler +++ b/Dockerfile.flytescheduler @@ -1,9 +1,9 @@ # WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. # ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: -# +# # TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst -FROM --platform=${BUILDPLATFORM} golang:1.21.5-alpine3.18 as builder +FROM --platform=${BUILDPLATFORM} golang:1.21-alpine3.18 as builder ARG TARGETARCH ENV GOARCH "${TARGETARCH}" From c21ded67def2428dbe6be3eff0e213fd0147c54b Mon Sep 17 00:00:00 2001 From: Katrina Rogan Date: Tue, 26 Mar 2024 13:38:39 -0700 Subject: [PATCH 356/645] Add optional org param to ProjectGetRequest (#5118) Signed-off-by: Katrina Rogan --- flyteidl/clients/go/assets/admin.swagger.json | 7 ++++ .../gen/pb-es/flyteidl/admin/project_pb.ts | 8 ++++ .../gen/pb-go/flyteidl/admin/project.pb.go | 38 ++++++++++++------- .../gateway/flyteidl/service/admin.pb.gw.go | 18 +++++++++ .../flyteidl/service/admin.swagger.json | 7 ++++ flyteidl/gen/pb-js/flyteidl.d.ts | 6 +++ flyteidl/gen/pb-js/flyteidl.js | 17 +++++++++ .../pb_python/flyteidl/admin/project_pb2.py | 4 +- .../pb_python/flyteidl/admin/project_pb2.pyi | 6 ++- flyteidl/gen/pb_rust/flyteidl.admin.rs | 3 ++ flyteidl/protos/flyteidl/admin/project.proto | 5 ++- 11 files changed, 100 insertions(+), 19 deletions(-) diff --git a/flyteidl/clients/go/assets/admin.swagger.json b/flyteidl/clients/go/assets/admin.swagger.json index dcbfa5ce37..bcaf46928b 100644 --- a/flyteidl/clients/go/assets/admin.swagger.json +++ b/flyteidl/clients/go/assets/admin.swagger.json @@ -2745,6 +2745,13 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "org", + "description": "Optional, org key applied to the resource.", + "in": "query", + "required": false, + "type": "string" } ], "tags": [ diff --git a/flyteidl/gen/pb-es/flyteidl/admin/project_pb.ts b/flyteidl/gen/pb-es/flyteidl/admin/project_pb.ts index 8bd364d5a1..17e8db3fab 100644 --- a/flyteidl/gen/pb-es/flyteidl/admin/project_pb.ts +++ b/flyteidl/gen/pb-es/flyteidl/admin/project_pb.ts @@ -424,6 +424,13 @@ export class ProjectGetRequest extends Message { */ id = ""; + /** + * Optional, org key applied to the resource. + * + * @generated from field: string org = 2; + */ + org = ""; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -433,6 +440,7 @@ export class ProjectGetRequest extends Message { static readonly typeName = "flyteidl.admin.ProjectGetRequest"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "org", kind: "scalar", T: 9 /* ScalarType.STRING */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): ProjectGetRequest { diff --git a/flyteidl/gen/pb-go/flyteidl/admin/project.pb.go b/flyteidl/gen/pb-go/flyteidl/admin/project.pb.go index 46b1b86639..9a09a4a790 100644 --- a/flyteidl/gen/pb-go/flyteidl/admin/project.pb.go +++ b/flyteidl/gen/pb-go/flyteidl/admin/project.pb.go @@ -520,6 +520,8 @@ type ProjectGetRequest struct { // Indicates a unique project. // +required Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Optional, org key applied to the resource. + Org string `protobuf:"bytes,2,opt,name=org,proto3" json:"org,omitempty"` } func (x *ProjectGetRequest) Reset() { @@ -561,6 +563,13 @@ func (x *ProjectGetRequest) GetId() string { return "" } +func (x *ProjectGetRequest) GetOrg() string { + if x != nil { + return x.Org + } + return "" +} + var File_flyteidl_admin_project_proto protoreflect.FileDescriptor var file_flyteidl_admin_project_proto_rawDesc = []byte{ @@ -615,21 +624,22 @@ var file_flyteidl_admin_project_proto_rawDesc = []byte{ 0x17, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x23, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x22, 0x35, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x42, 0xb8, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x66, - 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x42, 0x0c, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3b, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x6f, - 0x72, 0x67, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, - 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x6c, 0x79, 0x74, - 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0xa2, 0x02, 0x03, 0x46, 0x41, 0x58, - 0xaa, 0x02, 0x0e, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 0xca, 0x02, 0x0e, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x41, 0x64, 0x6d, - 0x69, 0x6e, 0xe2, 0x02, 0x1a, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x41, 0x64, - 0x6d, 0x69, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x0f, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x3a, 0x3a, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x72, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6f, 0x72, 0x67, 0x42, 0xb8, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, + 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x42, + 0x0c, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x79, 0x74, + 0x65, 0x6f, 0x72, 0x67, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0xa2, 0x02, 0x03, 0x46, + 0x41, 0x58, 0xaa, 0x02, 0x0e, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x41, 0x64, + 0x6d, 0x69, 0x6e, 0xca, 0x02, 0x0e, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x41, + 0x64, 0x6d, 0x69, 0x6e, 0xe2, 0x02, 0x1a, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x0f, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x3a, 0x3a, 0x41, 0x64, + 0x6d, 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.pb.gw.go b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.pb.gw.go index d6e056d029..7e10d95ed7 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.pb.gw.go +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.pb.gw.go @@ -3184,6 +3184,10 @@ func local_request_AdminService_UpdateProject_0(ctx context.Context, marshaler r } +var ( + filter_AdminService_GetProject_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} +) + func request_AdminService_GetProject_0(ctx context.Context, marshaler runtime.Marshaler, client extService.AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq extAdmin.ProjectGetRequest var metadata runtime.ServerMetadata @@ -3205,6 +3209,13 @@ func request_AdminService_GetProject_0(ctx context.Context, marshaler runtime.Ma return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AdminService_GetProject_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetProject(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -3231,6 +3242,13 @@ func local_request_AdminService_GetProject_0(ctx context.Context, marshaler runt return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AdminService_GetProject_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetProject(ctx, &protoReq) return msg, metadata, err diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json index dcbfa5ce37..bcaf46928b 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json @@ -2745,6 +2745,13 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "org", + "description": "Optional, org key applied to the resource.", + "in": "query", + "required": false, + "type": "string" } ], "tags": [ diff --git a/flyteidl/gen/pb-js/flyteidl.d.ts b/flyteidl/gen/pb-js/flyteidl.d.ts index a09e5aa7b9..60556e3b43 100644 --- a/flyteidl/gen/pb-js/flyteidl.d.ts +++ b/flyteidl/gen/pb-js/flyteidl.d.ts @@ -17823,6 +17823,9 @@ export namespace flyteidl { /** ProjectGetRequest id */ id?: (string|null); + + /** ProjectGetRequest org */ + org?: (string|null); } /** Represents a ProjectGetRequest. */ @@ -17837,6 +17840,9 @@ export namespace flyteidl { /** ProjectGetRequest id. */ public id: string; + /** ProjectGetRequest org. */ + public org: string; + /** * Creates a new ProjectGetRequest instance using the specified properties. * @param [properties] Properties to set diff --git a/flyteidl/gen/pb-js/flyteidl.js b/flyteidl/gen/pb-js/flyteidl.js index 41484ba0ef..4ec39993c5 100644 --- a/flyteidl/gen/pb-js/flyteidl.js +++ b/flyteidl/gen/pb-js/flyteidl.js @@ -43038,6 +43038,7 @@ * @memberof flyteidl.admin * @interface IProjectGetRequest * @property {string|null} [id] ProjectGetRequest id + * @property {string|null} [org] ProjectGetRequest org */ /** @@ -43063,6 +43064,14 @@ */ ProjectGetRequest.prototype.id = ""; + /** + * ProjectGetRequest org. + * @member {string} org + * @memberof flyteidl.admin.ProjectGetRequest + * @instance + */ + ProjectGetRequest.prototype.org = ""; + /** * Creates a new ProjectGetRequest instance using the specified properties. * @function create @@ -43089,6 +43098,8 @@ writer = $Writer.create(); if (message.id != null && message.hasOwnProperty("id")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.id); + if (message.org != null && message.hasOwnProperty("org")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.org); return writer; }; @@ -43113,6 +43124,9 @@ case 1: message.id = reader.string(); break; + case 2: + message.org = reader.string(); + break; default: reader.skipType(tag & 7); break; @@ -43135,6 +43149,9 @@ if (message.id != null && message.hasOwnProperty("id")) if (!$util.isString(message.id)) return "id: string expected"; + if (message.org != null && message.hasOwnProperty("org")) + if (!$util.isString(message.org)) + return "org: string expected"; return null; }; diff --git a/flyteidl/gen/pb_python/flyteidl/admin/project_pb2.py b/flyteidl/gen/pb_python/flyteidl/admin/project_pb2.py index 38d97f2ebe..501a2d72aa 100644 --- a/flyteidl/gen/pb_python/flyteidl/admin/project_pb2.py +++ b/flyteidl/gen/pb_python/flyteidl/admin/project_pb2.py @@ -14,7 +14,7 @@ from flyteidl.admin import common_pb2 as flyteidl_dot_admin_dot_common__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lyteidl/admin/project.proto\x12\x0e\x66lyteidl.admin\x1a\x1b\x66lyteidl/admin/common.proto\",\n\x06\x44omain\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\"\xbf\x02\n\x07Project\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12\x30\n\x07\x64omains\x18\x03 \x03(\x0b\x32\x16.flyteidl.admin.DomainR\x07\x64omains\x12 \n\x0b\x64\x65scription\x18\x04 \x01(\tR\x0b\x64\x65scription\x12.\n\x06labels\x18\x05 \x01(\x0b\x32\x16.flyteidl.admin.LabelsR\x06labels\x12:\n\x05state\x18\x06 \x01(\x0e\x32$.flyteidl.admin.Project.ProjectStateR\x05state\x12\x10\n\x03org\x18\x07 \x01(\tR\x03org\">\n\x0cProjectState\x12\n\n\x06\x41\x43TIVE\x10\x00\x12\x0c\n\x08\x41RCHIVED\x10\x01\x12\x14\n\x10SYSTEM_GENERATED\x10\x02\"U\n\x08Projects\x12\x33\n\x08projects\x18\x01 \x03(\x0b\x32\x17.flyteidl.admin.ProjectR\x08projects\x12\x14\n\x05token\x18\x02 \x01(\tR\x05token\"\x9b\x01\n\x12ProjectListRequest\x12\x14\n\x05limit\x18\x01 \x01(\rR\x05limit\x12\x14\n\x05token\x18\x02 \x01(\tR\x05token\x12\x18\n\x07\x66ilters\x18\x03 \x01(\tR\x07\x66ilters\x12-\n\x07sort_by\x18\x04 \x01(\x0b\x32\x14.flyteidl.admin.SortR\x06sortBy\x12\x10\n\x03org\x18\x05 \x01(\tR\x03org\"K\n\x16ProjectRegisterRequest\x12\x31\n\x07project\x18\x01 \x01(\x0b\x32\x17.flyteidl.admin.ProjectR\x07project\"\x19\n\x17ProjectRegisterResponse\"\x17\n\x15ProjectUpdateResponse\"#\n\x11ProjectGetRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02idB\xb8\x01\n\x12\x63om.flyteidl.adminB\x0cProjectProtoP\x01Z;github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin\xa2\x02\x03\x46\x41X\xaa\x02\x0e\x46lyteidl.Admin\xca\x02\x0e\x46lyteidl\\Admin\xe2\x02\x1a\x46lyteidl\\Admin\\GPBMetadata\xea\x02\x0f\x46lyteidl::Adminb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lyteidl/admin/project.proto\x12\x0e\x66lyteidl.admin\x1a\x1b\x66lyteidl/admin/common.proto\",\n\x06\x44omain\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\"\xbf\x02\n\x07Project\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12\x30\n\x07\x64omains\x18\x03 \x03(\x0b\x32\x16.flyteidl.admin.DomainR\x07\x64omains\x12 \n\x0b\x64\x65scription\x18\x04 \x01(\tR\x0b\x64\x65scription\x12.\n\x06labels\x18\x05 \x01(\x0b\x32\x16.flyteidl.admin.LabelsR\x06labels\x12:\n\x05state\x18\x06 \x01(\x0e\x32$.flyteidl.admin.Project.ProjectStateR\x05state\x12\x10\n\x03org\x18\x07 \x01(\tR\x03org\">\n\x0cProjectState\x12\n\n\x06\x41\x43TIVE\x10\x00\x12\x0c\n\x08\x41RCHIVED\x10\x01\x12\x14\n\x10SYSTEM_GENERATED\x10\x02\"U\n\x08Projects\x12\x33\n\x08projects\x18\x01 \x03(\x0b\x32\x17.flyteidl.admin.ProjectR\x08projects\x12\x14\n\x05token\x18\x02 \x01(\tR\x05token\"\x9b\x01\n\x12ProjectListRequest\x12\x14\n\x05limit\x18\x01 \x01(\rR\x05limit\x12\x14\n\x05token\x18\x02 \x01(\tR\x05token\x12\x18\n\x07\x66ilters\x18\x03 \x01(\tR\x07\x66ilters\x12-\n\x07sort_by\x18\x04 \x01(\x0b\x32\x14.flyteidl.admin.SortR\x06sortBy\x12\x10\n\x03org\x18\x05 \x01(\tR\x03org\"K\n\x16ProjectRegisterRequest\x12\x31\n\x07project\x18\x01 \x01(\x0b\x32\x17.flyteidl.admin.ProjectR\x07project\"\x19\n\x17ProjectRegisterResponse\"\x17\n\x15ProjectUpdateResponse\"5\n\x11ProjectGetRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x10\n\x03org\x18\x02 \x01(\tR\x03orgB\xb8\x01\n\x12\x63om.flyteidl.adminB\x0cProjectProtoP\x01Z;github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin\xa2\x02\x03\x46\x41X\xaa\x02\x0e\x46lyteidl.Admin\xca\x02\x0e\x46lyteidl\\Admin\xe2\x02\x1a\x46lyteidl\\Admin\\GPBMetadata\xea\x02\x0f\x46lyteidl::Adminb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -40,5 +40,5 @@ _globals['_PROJECTUPDATERESPONSE']._serialized_start=794 _globals['_PROJECTUPDATERESPONSE']._serialized_end=817 _globals['_PROJECTGETREQUEST']._serialized_start=819 - _globals['_PROJECTGETREQUEST']._serialized_end=854 + _globals['_PROJECTGETREQUEST']._serialized_end=872 # @@protoc_insertion_point(module_scope) diff --git a/flyteidl/gen/pb_python/flyteidl/admin/project_pb2.pyi b/flyteidl/gen/pb_python/flyteidl/admin/project_pb2.pyi index ddb3f617ff..8b24c39701 100644 --- a/flyteidl/gen/pb_python/flyteidl/admin/project_pb2.pyi +++ b/flyteidl/gen/pb_python/flyteidl/admin/project_pb2.pyi @@ -78,7 +78,9 @@ class ProjectUpdateResponse(_message.Message): def __init__(self) -> None: ... class ProjectGetRequest(_message.Message): - __slots__ = ["id"] + __slots__ = ["id", "org"] ID_FIELD_NUMBER: _ClassVar[int] + ORG_FIELD_NUMBER: _ClassVar[int] id: str - def __init__(self, id: _Optional[str] = ...) -> None: ... + org: str + def __init__(self, id: _Optional[str] = ..., org: _Optional[str] = ...) -> None: ... diff --git a/flyteidl/gen/pb_rust/flyteidl.admin.rs b/flyteidl/gen/pb_rust/flyteidl.admin.rs index ea1a14ce25..3995c67bb0 100644 --- a/flyteidl/gen/pb_rust/flyteidl.admin.rs +++ b/flyteidl/gen/pb_rust/flyteidl.admin.rs @@ -2581,6 +2581,9 @@ pub struct ProjectGetRequest { /// +required #[prost(string, tag="1")] pub id: ::prost::alloc::string::String, + /// Optional, org key applied to the resource. + #[prost(string, tag="2")] + pub org: ::prost::alloc::string::String, } /// Defines a set of custom matching attributes at the project level. /// For more info on matchable attributes, see :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` diff --git a/flyteidl/protos/flyteidl/admin/project.proto b/flyteidl/protos/flyteidl/admin/project.proto index 319f0e124b..a06d3b58bc 100644 --- a/flyteidl/protos/flyteidl/admin/project.proto +++ b/flyteidl/protos/flyteidl/admin/project.proto @@ -104,4 +104,7 @@ message ProjectGetRequest { // Indicates a unique project. // +required string id = 1; -} \ No newline at end of file + + // Optional, org key applied to the resource. + string org = 2; +} From 2842e5dc84dc0b4fd1eaaa9bb4fbd23e1d39f6ce Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Tue, 26 Mar 2024 15:35:51 -0700 Subject: [PATCH 357/645] Stop building docs (#5120) Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- flyteidl/.readthedocs.yml | 21 ------- flyteidl/Makefile | 4 -- flyteidl/doc-requirements.in | 10 --- flyteidl/doc-requirements.txt | 114 ---------------------------------- 4 files changed, 149 deletions(-) delete mode 100644 flyteidl/.readthedocs.yml delete mode 100644 flyteidl/doc-requirements.in delete mode 100644 flyteidl/doc-requirements.txt diff --git a/flyteidl/.readthedocs.yml b/flyteidl/.readthedocs.yml deleted file mode 100644 index 40f82afa00..0000000000 --- a/flyteidl/.readthedocs.yml +++ /dev/null @@ -1,21 +0,0 @@ -# .readthedocs.yml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required -version: 2 - -# Build operating system -build: - os: ubuntu-22.04 - tools: - python: "3.8" - -# Build documentation in the docs/ directory with Sphinx -sphinx: - configuration: conf.py - -# Optionally set the version of Python and requirements required to build your docs -python: - install: - - requirements: doc-requirements.txt diff --git a/flyteidl/Makefile b/flyteidl/Makefile index 705679dfc9..d93d9cba27 100644 --- a/flyteidl/Makefile +++ b/flyteidl/Makefile @@ -34,10 +34,6 @@ build_python: install-piptools: pip install -U pip-tools -.PHONY: doc-requirements.txt -doc-requirements.txt: doc-requirements.in install-piptools - $(call PIP_COMPILE,doc-requirements.in) - PLACEHOLDER_NPM := \"version\": \"0.0.0-develop\" .PHONY: update_npmversion diff --git a/flyteidl/doc-requirements.in b/flyteidl/doc-requirements.in deleted file mode 100644 index 3f48edd16d..0000000000 --- a/flyteidl/doc-requirements.in +++ /dev/null @@ -1,10 +0,0 @@ -git+https://github.com/flyteorg/furo.git@main -recommonmark -sphinx -sphinx-prompt -sphinx-material -sphinx-code-include -sphinx-copybutton -sphinx_markdown_tables -sphinx_fontawesome -sphinx-panels diff --git a/flyteidl/doc-requirements.txt b/flyteidl/doc-requirements.txt deleted file mode 100644 index 6adef8b8ad..0000000000 --- a/flyteidl/doc-requirements.txt +++ /dev/null @@ -1,114 +0,0 @@ -# -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: -# -# pip-compile doc-requirements.in -# -alabaster==0.7.12 - # via sphinx -babel==2.9.1 - # via sphinx -beautifulsoup4==4.10.0 - # via - # furo - # sphinx-code-include - # sphinx-material -certifi==2021.10.8 - # via requests -charset-normalizer==2.0.10 - # via requests -commonmark==0.9.1 - # via recommonmark -css-html-js-minify==2.5.5 - # via sphinx-material -docutils==0.17.1 - # via - # recommonmark - # sphinx - # sphinx-panels -furo @ git+https://github.com/flyteorg/furo.git@main - # via -r doc-requirements.in -idna==3.3 - # via requests -imagesize==1.3.0 - # via sphinx -importlib-metadata==4.10.0 - # via markdown -jinja2==3.0.3 - # via sphinx -lxml==4.7.1 - # via sphinx-material -markdown==3.3.6 - # via sphinx-markdown-tables -markupsafe==2.0.1 - # via jinja2 -packaging==21.3 - # via sphinx -pygments==2.11.2 - # via - # sphinx - # sphinx-prompt -pyparsing==3.0.6 - # via packaging -python-slugify[unidecode]==5.0.2 - # via sphinx-material -pytz==2021.3 - # via babel -recommonmark==0.7.1 - # via -r doc-requirements.in -requests==2.27.1 - # via sphinx -six==1.16.0 - # via sphinx-code-include -snowballstemmer==2.2.0 - # via sphinx -soupsieve==2.3.1 - # via beautifulsoup4 -sphinx==4.3.2 - # via - # -r doc-requirements.in - # furo - # recommonmark - # sphinx-code-include - # sphinx-copybutton - # sphinx-fontawesome - # sphinx-material - # sphinx-panels - # sphinx-prompt -sphinx-code-include==1.1.1 - # via -r doc-requirements.in -sphinx-copybutton==0.4.0 - # via -r doc-requirements.in -sphinx-fontawesome==0.0.6 - # via -r doc-requirements.in -sphinx-markdown-tables==0.0.15 - # via -r doc-requirements.in -sphinx-material==0.0.35 - # via -r doc-requirements.in -sphinx-panels==0.6.0 - # via -r doc-requirements.in -sphinx-prompt==1.5.0 - # via -r doc-requirements.in -sphinxcontrib-applehelp==1.0.2 - # via sphinx -sphinxcontrib-devhelp==1.0.2 - # via sphinx -sphinxcontrib-htmlhelp==2.0.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==1.0.3 - # via sphinx -sphinxcontrib-serializinghtml==1.1.5 - # via sphinx -text-unidecode==1.3 - # via python-slugify -unidecode==1.3.2 - # via python-slugify -urllib3==1.26.8 - # via requests -zipp==3.7.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# setuptools From 9bdf597747497c060e93b302c64d97af35b9bdb8 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Tue, 26 Mar 2024 16:30:17 -0700 Subject: [PATCH 358/645] Bump google.golang.org/grpc and otelgrpc (#5121) Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- datacatalog/go.mod | 63 ++++++++++--------- datacatalog/go.sum | 135 +++++++++++++++++++++------------------- flyteadmin/go.mod | 49 +++++++-------- flyteadmin/go.sum | 106 ++++++++++++++++---------------- flytecopilot/go.mod | 60 +++++++++--------- flytecopilot/go.sum | 133 ++++++++++++++++++++++----------------- flyteidl/go.mod | 62 ++++++++++--------- flyteidl/go.sum | 139 +++++++++++++++++++++++------------------ flyteplugins/go.mod | 60 +++++++++--------- flyteplugins/go.sum | 132 ++++++++++++++++++++++----------------- flytepropeller/go.mod | 62 ++++++++++--------- flytepropeller/go.sum | 140 +++++++++++++++++++++++------------------- go.mod | 49 +++++++-------- go.sum | 106 ++++++++++++++++---------------- 14 files changed, 703 insertions(+), 593 deletions(-) diff --git a/datacatalog/go.mod b/datacatalog/go.mod index 7c04fd7832..7130ad924c 100644 --- a/datacatalog/go.mod +++ b/datacatalog/go.mod @@ -7,16 +7,16 @@ require ( github.com/flyteorg/flyte/flyteidl v0.0.0-00010101000000-000000000000 github.com/flyteorg/flyte/flytestdlib v0.0.0-00010101000000-000000000000 github.com/gofrs/uuid v4.2.0+incompatible - github.com/golang/glog v1.1.0 + github.com/golang/glog v1.2.0 github.com/golang/protobuf v1.5.3 github.com/jackc/pgconn v1.14.1 github.com/mitchellh/mapstructure v1.5.0 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 - go.opentelemetry.io/otel v1.19.0 - google.golang.org/grpc v1.56.1 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 + go.opentelemetry.io/otel v1.21.0 + google.golang.org/grpc v1.62.1 gorm.io/driver/postgres v1.5.3 gorm.io/driver/sqlite v1.5.4 gorm.io/gorm v1.25.4 @@ -24,11 +24,11 @@ require ( ) require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.19.1 // indirect + cloud.google.com/go v0.112.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.13.0 // indirect - cloud.google.com/go/storage v1.28.1 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/storage v1.36.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect @@ -43,11 +43,12 @@ require ( github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/flyteorg/stow v0.3.10 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-gormigrate/gormigrate/v2 v2.1.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -56,11 +57,12 @@ require ( github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -103,26 +105,27 @@ require ( github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect - golang.org/x/crypto v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.114.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/protobuf v1.30.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/api v0.155.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/datacatalog/go.sum b/datacatalog/go.sum index b1642f638f..ea11d19064 100644 --- a/datacatalog/go.sum +++ b/datacatalog/go.sum @@ -17,24 +17,22 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -45,8 +43,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= @@ -84,8 +82,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= @@ -107,12 +105,14 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -126,8 +126,8 @@ github.com/go-gormigrate/gormigrate/v2 v2.1.1 h1:eGS0WTFRV30r103lU8JNXY27KbviRnq github.com/go-gormigrate/gormigrate/v2 v2.1.1/go.mod h1:L7nJ620PFDKei9QOhJzqA8kRCk+E3UbV2f5gv+1ndLc= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -150,8 +150,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -179,6 +179,7 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -196,8 +197,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -220,15 +221,17 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -429,20 +432,22 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 h1:xFSRQBbXF6VvYRf2lqMJXxoB72XI1K/azav8TekHHSw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -466,8 +471,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -540,8 +545,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -551,8 +556,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -564,6 +569,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -614,14 +621,14 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -630,14 +637,15 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -721,16 +729,17 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -767,12 +776,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230526161137-0005af68ea54 h1:VW/GdnI343CnUKGap8QyxQ204yai8uUsGzGmyOFfwH8= -google.golang.org/genproto/googleapis/api v0.0.0-20230526161137-0005af68ea54/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526161137-0005af68ea54 h1:wQvmPUaH4JVFCzNAL9ShNjezVoq3OhlinNMLYSAN9Vg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526161137-0005af68ea54/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -789,8 +798,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -803,8 +812,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index 58ebd90a84..c2844c6cac 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -4,7 +4,7 @@ go 1.21 require ( cloud.google.com/go/iam v1.1.5 - cloud.google.com/go/storage v1.30.1 + cloud.google.com/go/storage v1.36.0 github.com/NYTimes/gizmo v1.3.6 github.com/Selvatico/go-mocket v1.0.7 github.com/aws/aws-sdk-go v1.44.2 @@ -21,9 +21,9 @@ require ( github.com/ghodss/yaml v1.0.0 github.com/go-gormigrate/gormigrate/v2 v2.1.1 github.com/golang-jwt/jwt/v4 v4.5.0 - github.com/golang/glog v1.1.2 + github.com/golang/glog v1.2.0 github.com/golang/protobuf v1.5.3 - github.com/google/uuid v1.4.0 + github.com/google/uuid v1.6.0 github.com/googleapis/gax-go/v2 v2.12.0 github.com/gorilla/handlers v1.5.1 github.com/gorilla/securecookie v1.1.1 @@ -46,13 +46,13 @@ require ( github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 - go.opentelemetry.io/otel v1.19.0 - golang.org/x/oauth2 v0.15.0 - golang.org/x/time v0.3.0 - google.golang.org/api v0.149.0 - google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 - google.golang.org/grpc v1.60.1 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 + go.opentelemetry.io/otel v1.21.0 + golang.org/x/oauth2 v0.16.0 + golang.org/x/time v0.5.0 + google.golang.org/api v0.155.0 + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 + google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.32.0 gorm.io/driver/mysql v1.4.4 gorm.io/driver/postgres v1.5.3 @@ -72,10 +72,10 @@ require ( ) require ( - cloud.google.com/go v0.111.0 // indirect + cloud.google.com/go v0.112.0 // indirect cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/pubsub v1.33.0 // indirect + cloud.google.com/go/pubsub v1.34.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect @@ -93,10 +93,10 @@ require ( github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-jose/go-jose/v3 v3.0.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -167,22 +167,23 @@ require ( github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect - golang.org/x/crypto v0.16.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index fa9c065e82..0693371e59 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -20,8 +20,8 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -43,16 +43,16 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.34.0 h1:ZtPbfwfi5rLaPeSvDC29fFoE20/tQvGrUS6kVJZJvkU= +cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= contrib.go.opencensus.io/exporter/stackdriver v0.13.1/go.mod h1:z2tyTZtPmQ2HvWH4cOmVDgtY+1lomfKdbLnkJvZdc8c= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= @@ -149,8 +149,8 @@ github.com/cloudevents/sdk-go/v2 v2.8.0/go.mod h1:GpCBmUj7DIRiDhVvsK5d6WCbgTWs8D github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= github.com/cockroachdb/cockroach-go v0.0.0-20190925194419-606b3d062051/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= @@ -222,8 +222,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= @@ -235,8 +235,8 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -271,8 +271,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -616,8 +616,8 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/gddo v0.0.0-20180828051604-96d2a289f41e/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= github.com/golang/gddo v0.0.0-20190904175337-72a348e765d2/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -702,8 +702,8 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -1322,25 +1322,27 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib v0.18.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 h1:xFSRQBbXF6VvYRf2lqMJXxoB72XI1K/azav8TekHHSw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.18.0/go.mod h1:iK1G0FgHurSJ/aYLg5LpnPI0pqdanM73S3dhyDp0Lk4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= go.opentelemetry.io/otel v0.18.0/go.mod h1:PT5zQj4lTsR1YeARt8YNKcFb88/c2IKoSABK9mX0r78= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y= go.opentelemetry.io/otel/metric v0.18.0/go.mod h1:kEH2QtzAyBy3xDVQfGZKIcok4ZZFvd5xyKPfPcuK6pE= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/oteltest v0.18.0/go.mod h1:NyierCU3/G8DLTva7KRzGii2fdxdR89zXKH1bNWY7Bo= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/trace v0.18.0/go.mod h1:FzdUu3BPwZSZebfQ1vl5/tAa8LyMLXSJN57AXIt/iDk= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1403,8 +1405,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1508,8 +1510,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1520,8 +1522,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1535,8 +1537,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180831094639-fa5fdf94c789/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1624,14 +1626,14 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1648,8 +1650,8 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1791,8 +1793,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1845,12 +1847,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1874,8 +1876,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/grpc/examples v0.0.0-20210304020650-930c79186c99/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/flytecopilot/go.mod b/flytecopilot/go.mod index de6c77795c..1e6061951a 100644 --- a/flytecopilot/go.mod +++ b/flytecopilot/go.mod @@ -21,11 +21,11 @@ require ( ) require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.19.1 // indirect + cloud.google.com/go v0.112.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.13.0 // indirect - cloud.google.com/go/storage v1.28.1 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/storage v1.36.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect @@ -39,8 +39,9 @@ require ( github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/flyteorg/stow v0.3.10 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -49,11 +50,12 @@ require ( github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/imdario/mergo v0.3.11 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -86,28 +88,30 @@ require ( github.com/spf13/viper v1.11.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect - golang.org/x/crypto v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.114.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect - google.golang.org/grpc v1.56.1 // indirect - google.golang.org/protobuf v1.30.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/api v0.155.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/grpc v1.62.1 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/flytecopilot/go.sum b/flytecopilot/go.sum index 061cd63e87..5c468eaf12 100644 --- a/flytecopilot/go.sum +++ b/flytecopilot/go.sum @@ -17,24 +17,22 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -45,8 +43,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= @@ -82,6 +80,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -99,10 +99,14 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -115,8 +119,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -163,6 +167,7 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -180,8 +185,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -204,15 +209,17 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -338,6 +345,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -346,18 +354,22 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= @@ -368,9 +380,10 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -406,6 +419,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -439,8 +453,9 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -450,8 +465,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -462,6 +477,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -502,13 +520,15 @@ golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -516,13 +536,14 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -572,6 +593,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -601,16 +623,17 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -647,12 +670,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -669,8 +692,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -683,8 +706,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/flyteidl/go.mod b/flyteidl/go.mod index d8669b9eb2..2377cd1b05 100644 --- a/flyteidl/go.mod +++ b/flyteidl/go.mod @@ -7,11 +7,9 @@ toolchain go1.21.3 require ( github.com/flyteorg/flyte/flytestdlib v0.0.0-00010101000000-000000000000 github.com/go-test/deep v1.0.7 - github.com/golang/glog v1.1.0 github.com/golang/protobuf v1.5.3 github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 - github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 github.com/jinzhu/copier v0.3.5 github.com/mitchellh/mapstructure v1.5.0 @@ -19,21 +17,20 @@ require ( github.com/pkg/errors v0.9.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 - golang.org/x/net v0.15.0 - golang.org/x/oauth2 v0.8.0 - google.golang.org/api v0.114.0 - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 - google.golang.org/grpc v1.56.1 - google.golang.org/protobuf v1.30.0 + golang.org/x/net v0.20.0 + golang.org/x/oauth2 v0.16.0 + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 + google.golang.org/grpc v1.62.1 + google.golang.org/protobuf v1.32.0 k8s.io/apimachinery v0.28.2 ) require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.19.1 // indirect + cloud.google.com/go v0.112.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.13.0 // indirect - cloud.google.com/go/storage v1.28.1 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/storage v1.36.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect @@ -48,9 +45,10 @@ require ( github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/flyteorg/stow v0.3.10 // indirect github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -59,11 +57,12 @@ require ( github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -86,22 +85,25 @@ require ( github.com/spf13/cobra v1.7.0 // indirect github.com/stretchr/objx v0.5.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect - golang.org/x/crypto v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/api v0.155.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/flyteidl/go.sum b/flyteidl/go.sum index f1911aadfe..17f30f40c8 100644 --- a/flyteidl/go.sum +++ b/flyteidl/go.sum @@ -13,24 +13,22 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -40,8 +38,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= @@ -83,6 +81,8 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -101,10 +101,14 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -116,8 +120,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -139,8 +143,8 @@ github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJ github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -185,8 +189,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -205,20 +209,21 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= @@ -333,6 +338,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -340,18 +346,22 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -365,8 +375,9 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -399,6 +410,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -427,18 +439,20 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -448,6 +462,9 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -485,12 +502,14 @@ golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -498,13 +517,14 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -548,6 +568,7 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -574,16 +595,16 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -615,12 +636,12 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -638,8 +659,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -653,8 +674,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/flyteplugins/go.mod b/flyteplugins/go.mod index be1331697b..d63a84a673 100644 --- a/flyteplugins/go.mod +++ b/flyteplugins/go.mod @@ -26,11 +26,11 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e - golang.org/x/net v0.17.0 - golang.org/x/oauth2 v0.8.0 - google.golang.org/api v0.114.0 - google.golang.org/grpc v1.56.1 - google.golang.org/protobuf v1.30.0 + golang.org/x/net v0.20.0 + golang.org/x/oauth2 v0.16.0 + google.golang.org/api v0.155.0 + google.golang.org/grpc v1.62.1 + google.golang.org/protobuf v1.32.0 gotest.tools v2.2.0+incompatible k8s.io/api v0.28.2 k8s.io/apimachinery v0.28.2 @@ -40,11 +40,11 @@ require ( ) require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.19.1 // indirect + cloud.google.com/go v0.112.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.13.0 // indirect - cloud.google.com/go/storage v1.28.1 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/storage v1.36.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect @@ -64,10 +64,11 @@ require ( github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/flyteorg/stow v0.3.10 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -76,11 +77,12 @@ require ( github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -112,22 +114,24 @@ require ( github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/flyteplugins/go.sum b/flyteplugins/go.sum index 662b36b87e..98f87376f7 100644 --- a/flyteplugins/go.sum +++ b/flyteplugins/go.sum @@ -17,24 +17,22 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -45,8 +43,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= @@ -111,6 +109,8 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -132,12 +132,16 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -149,8 +153,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -217,8 +221,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -241,15 +245,17 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= @@ -386,6 +392,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -394,18 +401,22 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= @@ -417,9 +428,10 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -455,6 +467,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -491,8 +504,9 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -503,8 +517,8 @@ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -515,6 +529,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -556,14 +573,16 @@ golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -572,13 +591,14 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -628,6 +648,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -657,16 +678,17 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -705,12 +727,12 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -731,8 +753,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -746,8 +768,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/flytepropeller/go.mod b/flytepropeller/go.mod index f541398b58..af2880c259 100644 --- a/flytepropeller/go.mod +++ b/flytepropeller/go.mod @@ -13,7 +13,7 @@ require ( github.com/go-redis/redis v6.15.7+incompatible github.com/go-test/deep v1.0.7 github.com/golang/protobuf v1.5.3 - github.com/google/uuid v1.3.1 + github.com/google/uuid v1.6.0 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/imdario/mergo v0.3.13 @@ -25,14 +25,14 @@ require ( github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 - go.opentelemetry.io/otel v1.19.0 - go.opentelemetry.io/otel/trace v1.19.0 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 + go.opentelemetry.io/otel v1.21.0 + go.opentelemetry.io/otel/trace v1.21.0 golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 - golang.org/x/sync v0.2.0 - golang.org/x/time v0.3.0 - google.golang.org/grpc v1.56.1 - google.golang.org/protobuf v1.30.0 + golang.org/x/sync v0.6.0 + golang.org/x/time v0.5.0 + google.golang.org/grpc v1.62.1 + google.golang.org/protobuf v1.32.0 k8s.io/api v0.28.3 k8s.io/apiextensions-apiserver v0.28.0 k8s.io/apimachinery v0.28.3 @@ -43,11 +43,11 @@ require ( ) require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.19.1 // indirect + cloud.google.com/go v0.112.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.13.0 // indirect - cloud.google.com/go/storage v1.29.0 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/storage v1.36.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect @@ -72,9 +72,10 @@ require ( github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/flyteorg/stow v0.3.10 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -83,10 +84,11 @@ require ( github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -120,23 +122,23 @@ require ( github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/api v0.114.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + google.golang.org/api v0.155.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/flytepropeller/go.sum b/flytepropeller/go.sum index b929dc11b5..04a26cfbf9 100644 --- a/flytepropeller/go.sum +++ b/flytepropeller/go.sum @@ -17,24 +17,22 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -45,8 +43,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= @@ -113,8 +111,8 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -136,14 +134,16 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -158,8 +158,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -229,8 +229,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -253,15 +253,17 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= @@ -413,6 +415,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -421,20 +424,22 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 h1:xFSRQBbXF6VvYRf2lqMJXxoB72XI1K/azav8TekHHSw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= @@ -451,9 +456,10 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -489,6 +495,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -523,8 +530,9 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -535,8 +543,8 @@ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -547,8 +555,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -591,15 +600,17 @@ golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -608,13 +619,14 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -664,6 +676,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -693,16 +706,17 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -742,12 +756,12 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -768,8 +782,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -783,8 +797,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/go.mod b/go.mod index 37e95136ea..998cd19de7 100644 --- a/go.mod +++ b/go.mod @@ -7,22 +7,22 @@ require ( github.com/flyteorg/flyte/flyteadmin v0.0.0-00010101000000-000000000000 github.com/flyteorg/flyte/flytepropeller v0.0.0-00010101000000-000000000000 github.com/flyteorg/flyte/flytestdlib v0.0.0-00010101000000-000000000000 - github.com/golang/glog v1.1.2 + github.com/golang/glog v1.2.0 github.com/prometheus/client_golang v1.16.0 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - golang.org/x/sync v0.4.0 + golang.org/x/sync v0.6.0 gorm.io/driver/postgres v1.5.3 sigs.k8s.io/controller-runtime v0.16.3 ) require ( - cloud.google.com/go v0.111.0 // indirect + cloud.google.com/go v0.112.0 // indirect cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.5 // indirect - cloud.google.com/go/pubsub v1.33.0 // indirect - cloud.google.com/go/storage v1.30.1 // indirect + cloud.google.com/go/pubsub v1.34.0 // indirect + cloud.google.com/go/storage v1.36.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect @@ -63,7 +63,7 @@ require ( github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/flyteorg/flyte/flyteidl v0.0.0-00010101000000-000000000000 // indirect github.com/flyteorg/flyte/flyteplugins v0.0.0-00010101000000-000000000000 // indirect github.com/flyteorg/stow v0.3.10 // indirect @@ -71,7 +71,7 @@ require ( github.com/ghodss/yaml v1.0.0 // indirect github.com/go-gormigrate/gormigrate/v2 v2.1.1 // indirect github.com/go-jose/go-jose/v3 v3.0.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -90,7 +90,7 @@ require ( github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect @@ -170,31 +170,32 @@ require ( github.com/stretchr/testify v1.8.4 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.25.0 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/oauth2 v0.15.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.13.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/api v0.149.0 // indirect + google.golang.org/api v0.155.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/grpc v1.60.1 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/grpc v1.62.1 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect diff --git a/go.sum b/go.sum index 8048229f18..294ed0f37d 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,8 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -43,16 +43,16 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.34.0 h1:ZtPbfwfi5rLaPeSvDC29fFoE20/tQvGrUS6kVJZJvkU= +cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= contrib.go.opencensus.io/exporter/stackdriver v0.13.1/go.mod h1:z2tyTZtPmQ2HvWH4cOmVDgtY+1lomfKdbLnkJvZdc8c= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= @@ -171,8 +171,8 @@ github.com/cloudevents/sdk-go/v2 v2.14.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUE github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= github.com/cockroachdb/cockroach-go v0.0.0-20190925194419-606b3d062051/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= @@ -246,8 +246,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= @@ -259,8 +259,8 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -295,8 +295,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -643,8 +643,8 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/gddo v0.0.0-20180828051604-96d2a289f41e/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= github.com/golang/gddo v0.0.0-20190904175337-72a348e765d2/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -729,8 +729,8 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -1357,25 +1357,27 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib v0.18.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 h1:xFSRQBbXF6VvYRf2lqMJXxoB72XI1K/azav8TekHHSw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.18.0/go.mod h1:iK1G0FgHurSJ/aYLg5LpnPI0pqdanM73S3dhyDp0Lk4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= go.opentelemetry.io/otel v0.18.0/go.mod h1:PT5zQj4lTsR1YeARt8YNKcFb88/c2IKoSABK9mX0r78= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y= go.opentelemetry.io/otel/metric v0.18.0/go.mod h1:kEH2QtzAyBy3xDVQfGZKIcok4ZZFvd5xyKPfPcuK6pE= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/oteltest v0.18.0/go.mod h1:NyierCU3/G8DLTva7KRzGii2fdxdR89zXKH1bNWY7Bo= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/trace v0.18.0/go.mod h1:FzdUu3BPwZSZebfQ1vl5/tAa8LyMLXSJN57AXIt/iDk= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1438,8 +1440,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1543,8 +1545,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1555,8 +1557,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1570,8 +1572,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180831094639-fa5fdf94c789/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1659,14 +1661,14 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1683,8 +1685,8 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1826,8 +1828,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1880,12 +1882,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1909,8 +1911,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/grpc/examples v0.0.0-20210304020650-930c79186c99/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= From 78a690f43f39eeadbc1482259d7dc2ca66b814b1 Mon Sep 17 00:00:00 2001 From: Nikki Everett Date: Tue, 26 Mar 2024 18:32:37 -0500 Subject: [PATCH 359/645] fix broken link (#5122) Signed-off-by: nikki everett --- docs/user_guide/data_types_and_io/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user_guide/data_types_and_io/index.md b/docs/user_guide/data_types_and_io/index.md index f419c99bd3..f55aec69b4 100644 --- a/docs/user_guide/data_types_and_io/index.md +++ b/docs/user_guide/data_types_and_io/index.md @@ -133,7 +133,7 @@ Here's a breakdown of these mappings: - Any - Custom transformers - The ``FlytePickle`` transformer is the default option, but you can also define custom transformers. - **For instructions on building custom type transformers, please refer to :ref:`this section `**. + For instructions on building custom type transformers, please refer to :ref:`this section `. ``` ```{toctree} From ec0bc4c928b77fdb99bf665ef44bf02eeb2eb1a0 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Tue, 26 Mar 2024 18:05:04 -0700 Subject: [PATCH 360/645] Bump version of otel and grpc in flytestdlib (#5123) Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- flytestdlib/go.mod | 60 +++++++++++---------- flytestdlib/go.sum | 127 +++++++++++++++++++++++++-------------------- 2 files changed, 102 insertions(+), 85 deletions(-) diff --git a/flytestdlib/go.mod b/flytestdlib/go.mod index d275261dc8..ccf6f82b98 100644 --- a/flytestdlib/go.mod +++ b/flytestdlib/go.mod @@ -27,15 +27,15 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.11.0 github.com/stretchr/testify v1.8.4 - go.opentelemetry.io/otel v1.19.0 + go.opentelemetry.io/otel v1.21.0 go.opentelemetry.io/otel/exporters/jaeger v1.17.0 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 - go.opentelemetry.io/otel/sdk v1.19.0 - go.opentelemetry.io/otel/trace v1.19.0 - golang.org/x/time v0.3.0 + go.opentelemetry.io/otel/sdk v1.21.0 + go.opentelemetry.io/otel/trace v1.21.0 + golang.org/x/time v0.5.0 golang.org/x/tools v0.9.3 - google.golang.org/grpc v1.56.1 - google.golang.org/protobuf v1.30.0 + google.golang.org/grpc v1.62.1 + google.golang.org/protobuf v1.32.0 gorm.io/driver/postgres v1.5.3 gorm.io/driver/sqlite v1.5.4 gorm.io/gorm v1.25.4 @@ -47,11 +47,11 @@ require ( ) require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.19.1 // indirect + cloud.google.com/go v0.112.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.13.0 // indirect - cloud.google.com/go/storage v1.28.1 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/storage v1.36.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect @@ -64,7 +64,8 @@ require ( github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -73,11 +74,12 @@ require ( github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect @@ -114,21 +116,23 @@ require ( github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - golang.org/x/crypto v0.13.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.114.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/api v0.155.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/flytestdlib/go.sum b/flytestdlib/go.sum index ee195ca9fc..53e056f100 100644 --- a/flytestdlib/go.sum +++ b/flytestdlib/go.sum @@ -17,24 +17,22 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -45,8 +43,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= @@ -84,6 +82,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= @@ -105,6 +105,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= @@ -115,6 +117,8 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -128,8 +132,8 @@ github.com/go-gormigrate/gormigrate/v2 v2.1.1 h1:eGS0WTFRV30r103lU8JNXY27KbviRnq github.com/go-gormigrate/gormigrate/v2 v2.1.1/go.mod h1:L7nJ620PFDKei9QOhJzqA8kRCk+E3UbV2f5gv+1ndLc= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -177,6 +181,7 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -194,8 +199,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -218,15 +223,17 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -427,18 +434,22 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -462,8 +473,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -538,8 +549,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -549,8 +560,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -562,8 +573,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -613,14 +624,14 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -629,14 +640,15 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -720,16 +732,17 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -766,12 +779,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -788,8 +801,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -802,8 +815,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From a5e273381396bfe5632150346378e5aae58ec923 Mon Sep 17 00:00:00 2001 From: Austin Liu Date: Wed, 27 Mar 2024 15:31:42 +0800 Subject: [PATCH 361/645] [flyteadmin] Show diff structure when re-registration two different task with same ids (#4924) * add json diff module Signed-off-by: Austin Liu * add CreateTaskFailureReason Signed-off-by: Austin Liu * update task proto buff gen code Signed-off-by: Austin Liu * add task diff DifferentStructureError msg Signed-off-by: Austin Liu * prettify json error message & rollback idl change Signed-off-by: Austin Liu * refactor to compiledWorkflow Signed-off-by: Austin Liu * clean up Signed-off-by: Austin Liu * add create task errors test Signed-off-by: Austin Liu format Signed-off-by: Austin Liu * cleanup error & test Signed-off-by: Austin Liu * rollback proto change Signed-off-by: Austin Liu rollback proto change Signed-off-by: Austin Liu * add launchplan Signed-off-by: Austin Liu * cleanup Signed-off-by: Austin Liu * test: add no diff case Signed-off-by: Austin Liu --------- Signed-off-by: Austin Liu --- flyteadmin/go.mod | 5 + flyteadmin/go.sum | 11 + flyteadmin/pkg/errors/errors.go | 65 ++++- flyteadmin/pkg/errors/errors_test.go | 235 ++++++++++++++++-- .../pkg/manager/impl/launch_plan_manager.go | 13 +- flyteadmin/pkg/manager/impl/task_manager.go | 15 +- .../pkg/manager/impl/workflow_manager.go | 7 +- .../pkg/manager/impl/workflow_manager_test.go | 4 +- go.mod | 7 +- go.sum | 15 +- 10 files changed, 338 insertions(+), 39 deletions(-) diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index c2844c6cac..18f7b2eaf9 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -46,6 +46,7 @@ require ( github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 + github.com/wI2L/jsondiff v0.5.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 go.opentelemetry.io/otel v1.21.0 golang.org/x/oauth2 v0.16.0 @@ -166,6 +167,10 @@ require ( github.com/spf13/viper v1.11.0 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect + github.com/tidwall/gjson v1.17.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/sjson v1.2.5 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index 0693371e59..6e6479957a 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -1265,13 +1265,22 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= github.com/tidwall/gjson v1.7.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= +github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y= github.com/tidwall/sjson v1.1.5/go.mod h1:VuJzsZnTowhSxWdOgsAnb886i4AjEyTkk7tNtsL7EYE= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= @@ -1288,6 +1297,8 @@ github.com/unrolled/secure v0.0.0-20181005190816-ff9db2ff917f/go.mod h1:mnPT77IA github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/wI2L/jsondiff v0.5.0 h1:RRMTi/mH+R2aXcPe1VYyvGINJqQfC3R+KSEakuU1Ikw= +github.com/wI2L/jsondiff v0.5.0/go.mod h1:qqG6hnK0Lsrz2BpIVCxWiK9ItsBCpIZQiv0izJjOZ9s= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= diff --git a/flyteadmin/pkg/errors/errors.go b/flyteadmin/pkg/errors/errors.go index e269715a91..366e2a3f42 100644 --- a/flyteadmin/pkg/errors/errors.go +++ b/flyteadmin/pkg/errors/errors.go @@ -7,10 +7,12 @@ import ( "strings" "github.com/golang/protobuf/proto" + "github.com/wI2L/jsondiff" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flyte/flytestdlib/logger" ) @@ -109,8 +111,47 @@ func NewIncompatibleClusterError(ctx context.Context, errorMsg, curCluster strin return statusErr } -func NewWorkflowExistsDifferentStructureError(ctx context.Context, request *admin.WorkflowCreateRequest) FlyteAdminError { - errorMsg := "workflow with different structure already exists" +func compareJsons(jsonArray1 jsondiff.Patch, jsonArray2 jsondiff.Patch) []string { + results := []string{} + map1 := make(map[string]jsondiff.Operation) + for _, obj := range jsonArray1 { + map1[obj.Path] = obj + } + + for _, obj := range jsonArray2 { + if val, ok := map1[obj.Path]; ok { + result := fmt.Sprintf("\t\t- %v: %v -> %v", obj.Path, obj.Value, val.Value) + results = append(results, result) + } + } + return results +} + +func NewTaskExistsDifferentStructureError(ctx context.Context, request *admin.TaskCreateRequest, oldSpec *core.CompiledTask, newSpec *core.CompiledTask) FlyteAdminError { + errorMsg := "task with different structure already exists:\n" + diff, _ := jsondiff.Compare(oldSpec, newSpec) + rdiff, _ := jsondiff.Compare(newSpec, oldSpec) + rs := compareJsons(diff, rdiff) + + errorMsg += strings.Join(rs, "\n") + + return NewFlyteAdminErrorf(codes.InvalidArgument, errorMsg) + +} + +func NewTaskExistsIdenticalStructureError(ctx context.Context, request *admin.TaskCreateRequest) FlyteAdminError { + errorMsg := "task with identical structure already exists" + return NewFlyteAdminErrorf(codes.AlreadyExists, errorMsg) +} + +func NewWorkflowExistsDifferentStructureError(ctx context.Context, request *admin.WorkflowCreateRequest, oldSpec *core.CompiledWorkflowClosure, newSpec *core.CompiledWorkflowClosure) FlyteAdminError { + errorMsg := "workflow with different structure already exists:\n" + diff, _ := jsondiff.Compare(oldSpec, newSpec) + rdiff, _ := jsondiff.Compare(newSpec, oldSpec) + rs := compareJsons(diff, rdiff) + + errorMsg += strings.Join(rs, "\n") + statusErr, transformationErr := NewFlyteAdminError(codes.InvalidArgument, errorMsg).WithDetails(&admin.CreateWorkflowFailureReason{ Reason: &admin.CreateWorkflowFailureReason_ExistsDifferentStructure{ ExistsDifferentStructure: &admin.WorkflowErrorExistsDifferentStructure{ @@ -119,7 +160,7 @@ func NewWorkflowExistsDifferentStructureError(ctx context.Context, request *admi }, }) if transformationErr != nil { - logger.Panicf(ctx, "Failed to wrap grpc status in type 'Error': %v", transformationErr) + logger.Errorf(ctx, "Failed to wrap grpc status in type 'Error': %v", transformationErr) return NewFlyteAdminErrorf(codes.InvalidArgument, errorMsg) } return statusErr @@ -135,12 +176,28 @@ func NewWorkflowExistsIdenticalStructureError(ctx context.Context, request *admi }, }) if transformationErr != nil { - logger.Panicf(ctx, "Failed to wrap grpc status in type 'Error': %v", transformationErr) + logger.Errorf(ctx, "Failed to wrap grpc status in type 'Error': %v", transformationErr) return NewFlyteAdminErrorf(codes.AlreadyExists, errorMsg) } return statusErr } +func NewLaunchPlanExistsDifferentStructureError(ctx context.Context, request *admin.LaunchPlanCreateRequest, oldSpec *admin.LaunchPlanSpec, newSpec *admin.LaunchPlanSpec) FlyteAdminError { + errorMsg := "launch plan with different structure already exists:\n" + diff, _ := jsondiff.Compare(oldSpec, newSpec) + rdiff, _ := jsondiff.Compare(newSpec, oldSpec) + rs := compareJsons(diff, rdiff) + + errorMsg += strings.Join(rs, "\n") + + return NewFlyteAdminErrorf(codes.InvalidArgument, errorMsg) +} + +func NewLaunchPlanExistsIdenticalStructureError(ctx context.Context, request *admin.LaunchPlanCreateRequest) FlyteAdminError { + errorMsg := "launch plan with identical structure already exists" + return NewFlyteAdminErrorf(codes.AlreadyExists, errorMsg) +} + func IsDoesNotExistError(err error) bool { adminError, ok := err.(FlyteAdminError) return ok && adminError.Code() == codes.NotFound diff --git a/flyteadmin/pkg/errors/errors_test.go b/flyteadmin/pkg/errors/errors_test.go index cb6a2a0ae0..6c97d9e911 100644 --- a/flyteadmin/pkg/errors/errors_test.go +++ b/flyteadmin/pkg/errors/errors_test.go @@ -3,9 +3,11 @@ package errors import ( "context" "errors" + "strings" "testing" "github.com/stretchr/testify/assert" + "github.com/wI2L/jsondiff" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -13,6 +15,14 @@ import ( "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" ) +var identifier = core.Identifier{ + ResourceType: core.ResourceType_TASK, + Project: "testProj", + Domain: "domain", + Name: "name", + Version: "ver", +} + func TestGrpcStatusError(t *testing.T) { msg := "some error" @@ -46,22 +56,168 @@ func TestNewIncompatibleClusterError(t *testing.T) { assert.True(t, ok) } +func TestJsonDifferHasDiffError(t *testing.T) { + oldSpec := map[string]int{ + "one": 1, + "two": 2, + "three": 3, + "four": 4, + "five": 5, + } + newSpec := map[string]int{ + "five": 5, + "four": 0, + "three": 3, + "two": 2, + "one": 1, + } + diff, _ := jsondiff.Compare(oldSpec, newSpec) + rdiff, _ := jsondiff.Compare(newSpec, oldSpec) + rs := compareJsons(diff, rdiff) + assert.Equal(t, "\t\t- /four: 4 -> 0", strings.Join(rs, "\n")) +} + +func TestJsonDifferNoDiffError(t *testing.T) { + oldSpec := map[string]int{ + "one": 1, + "two": 2, + "three": 3, + "four": 4, + "five": 5, + } + newSpec := map[string]int{ + "five": 5, + "four": 4, + "three": 3, + "two": 2, + "one": 1, + } + diff, _ := jsondiff.Compare(oldSpec, newSpec) + rdiff, _ := jsondiff.Compare(newSpec, oldSpec) + rs := compareJsons(diff, rdiff) + assert.Equal(t, "", strings.Join(rs, "\n")) +} + +func TestNewTaskExistsDifferentStructureError(t *testing.T) { + req := &admin.TaskCreateRequest{ + Id: &identifier, + } + + oldTask := &core.CompiledTask{ + Template: &core.TaskTemplate{ + Target: &core.TaskTemplate_Container{ + Container: &core.Container{ + Resources: &core.Resources{ + Requests: []*core.Resources_ResourceEntry{ + { + Name: core.Resources_CPU, + Value: "150m", + }, + }, + }, + }, + }, + Id: &identifier, + }, + } + + newTask := &core.CompiledTask{ + Template: &core.TaskTemplate{ + Target: &core.TaskTemplate_Container{ + Container: &core.Container{ + Resources: &core.Resources{ + Requests: []*core.Resources_ResourceEntry{ + { + Name: core.Resources_CPU, + Value: "250m", + }, + }, + }, + }, + }, + Id: &identifier, + }, + } + + statusErr := NewTaskExistsDifferentStructureError(context.Background(), req, oldTask, newTask) + assert.NotNil(t, statusErr) + s, ok := status.FromError(statusErr) + assert.True(t, ok) + assert.Equal(t, codes.InvalidArgument, s.Code()) + assert.Equal(t, "task with different structure already exists:\n\t\t- /template/Target/Container/resources/requests/0/value: 150m -> 250m", s.Message()) +} + +func TestNewTaskExistsIdenticalStructureError(t *testing.T) { + req := &admin.TaskCreateRequest{ + Id: &identifier, + } + statusErr := NewTaskExistsIdenticalStructureError(context.Background(), req) + assert.NotNil(t, statusErr) + s, ok := status.FromError(statusErr) + assert.True(t, ok) + assert.Equal(t, codes.AlreadyExists, s.Code()) + assert.Equal(t, "task with identical structure already exists", s.Message()) +} + func TestNewWorkflowExistsDifferentStructureError(t *testing.T) { - wf := &admin.WorkflowCreateRequest{ - Id: &core.Identifier{ - ResourceType: core.ResourceType_WORKFLOW, - Project: "testProj", - Domain: "domain", - Name: "name", - Version: "ver", + req := &admin.WorkflowCreateRequest{ + Id: &identifier, + } + + oldWorkflow := &core.CompiledWorkflowClosure{ + Primary: &core.CompiledWorkflow{ + Connections: &core.ConnectionSet{ + Upstream: map[string]*core.ConnectionSet_IdList{ + "foo": &core.ConnectionSet_IdList{ + Ids: []string{"start-node"}, + }, + "end-node": &core.ConnectionSet_IdList{ + Ids: []string{"foo"}, + }, + }, + }, + Template: &core.WorkflowTemplate{ + Nodes: []*core.Node{ + &core.Node{ + Id: "foo", + Target: &core.Node_TaskNode{}, + }, + }, + Id: &identifier, + }, + }, + } + + newWorkflow := &core.CompiledWorkflowClosure{ + Primary: &core.CompiledWorkflow{ + Connections: &core.ConnectionSet{ + Upstream: map[string]*core.ConnectionSet_IdList{ + "bar": &core.ConnectionSet_IdList{ + Ids: []string{"start-node"}, + }, + "end-node": &core.ConnectionSet_IdList{ + Ids: []string{"bar"}, + }, + }, + }, + Template: &core.WorkflowTemplate{ + Nodes: []*core.Node{ + &core.Node{ + Id: "bar", + Target: &core.Node_TaskNode{}, + }, + }, + Id: &identifier, + }, }, } - statusErr := NewWorkflowExistsDifferentStructureError(context.Background(), wf) + + statusErr := NewWorkflowExistsDifferentStructureError(context.Background(), req, oldWorkflow, newWorkflow) assert.NotNil(t, statusErr) s, ok := status.FromError(statusErr) assert.True(t, ok) assert.Equal(t, codes.InvalidArgument, s.Code()) - assert.Equal(t, "workflow with different structure already exists", s.Message()) + assert.Equal(t, "workflow with different structure already exists:\n\t\t- /primary/connections/upstream/bar: -> map[ids:[start-node]]\n\t\t- /primary/connections/upstream/end-node/ids/0: foo -> bar\n\t\t- /primary/connections/upstream/foo: map[ids:[start-node]] -> \n\t\t- /primary/template/nodes/0/id: foo -> bar", s.Message()) details, ok := s.Details()[0].(*admin.CreateWorkflowFailureReason) assert.True(t, ok) @@ -70,16 +226,10 @@ func TestNewWorkflowExistsDifferentStructureError(t *testing.T) { } func TestNewWorkflowExistsIdenticalStructureError(t *testing.T) { - wf := &admin.WorkflowCreateRequest{ - Id: &core.Identifier{ - ResourceType: core.ResourceType_WORKFLOW, - Project: "testProj", - Domain: "domain", - Name: "name", - Version: "ver", - }, + req := &admin.WorkflowCreateRequest{ + Id: &identifier, } - statusErr := NewWorkflowExistsIdenticalStructureError(context.Background(), wf) + statusErr := NewWorkflowExistsIdenticalStructureError(context.Background(), req) assert.NotNil(t, statusErr) s, ok := status.FromError(statusErr) assert.True(t, ok) @@ -92,6 +242,55 @@ func TestNewWorkflowExistsIdenticalStructureError(t *testing.T) { assert.True(t, ok) } +func TestNewLaunchPlanExistsDifferentStructureError(t *testing.T) { + req := &admin.LaunchPlanCreateRequest{ + Id: &identifier, + } + + oldLaunchPlan := &admin.LaunchPlan{ + Spec: &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Project: "testProj", + Domain: "domain", + Name: "lp_name", + Version: "ver1", + }, + }, + Id: &identifier, + } + + newLaunchPlan := &admin.LaunchPlan{ + Spec: &admin.LaunchPlanSpec{ + WorkflowId: &core.Identifier{ + Project: "testProj", + Domain: "domain", + Name: "lp_name", + Version: "ver2", + }, + }, + Id: &identifier, + } + + statusErr := NewLaunchPlanExistsDifferentStructureError(context.Background(), req, oldLaunchPlan.Spec, newLaunchPlan.Spec) + assert.NotNil(t, statusErr) + s, ok := status.FromError(statusErr) + assert.True(t, ok) + assert.Equal(t, codes.InvalidArgument, s.Code()) + assert.Equal(t, "launch plan with different structure already exists:\n\t\t- /workflow_id/version: ver1 -> ver2", s.Message()) +} + +func TestNewLaunchPlanExistsIdenticalStructureError(t *testing.T) { + req := &admin.LaunchPlanCreateRequest{ + Id: &identifier, + } + statusErr := NewLaunchPlanExistsIdenticalStructureError(context.Background(), req) + assert.NotNil(t, statusErr) + s, ok := status.FromError(statusErr) + assert.True(t, ok) + assert.Equal(t, codes.AlreadyExists, s.Code()) + assert.Equal(t, "launch plan with identical structure already exists", s.Message()) +} + func TestIsDoesNotExistError(t *testing.T) { assert.True(t, IsDoesNotExistError(NewFlyteAdminError(codes.NotFound, "foo"))) } diff --git a/flyteadmin/pkg/manager/impl/launch_plan_manager.go b/flyteadmin/pkg/manager/impl/launch_plan_manager.go index 093b4d7cce..57936313e5 100644 --- a/flyteadmin/pkg/manager/impl/launch_plan_manager.go +++ b/flyteadmin/pkg/manager/impl/launch_plan_manager.go @@ -88,12 +88,15 @@ func (m *LaunchPlanManager) CreateLaunchPlan( existingLaunchPlanModel, err := util.GetLaunchPlanModel(ctx, m.db, *request.Id) if err == nil { if bytes.Equal(existingLaunchPlanModel.Digest, launchPlanDigest) { - return nil, errors.NewFlyteAdminErrorf(codes.AlreadyExists, - "identical launch plan already exists with id %s", request.Id) + return nil, errors.NewLaunchPlanExistsIdenticalStructureError(ctx, &request) } - - return nil, errors.NewFlyteAdminErrorf(codes.InvalidArgument, - "launch plan with different structure already exists with id %v", request.Id) + existingLaunchPlan, transformerErr := transformers.FromLaunchPlanModel(existingLaunchPlanModel) + if transformerErr != nil { + logger.Errorf(ctx, "failed to transform launch plan from launch plan model") + return nil, transformerErr + } + // A launch plan exists with different structure + return nil, errors.NewLaunchPlanExistsDifferentStructureError(ctx, &request, existingLaunchPlan.Spec, launchPlan.Spec) } launchPlanModel, err := diff --git a/flyteadmin/pkg/manager/impl/task_manager.go b/flyteadmin/pkg/manager/impl/task_manager.go index d42639c31e..f3eced5d81 100644 --- a/flyteadmin/pkg/manager/impl/task_manager.go +++ b/flyteadmin/pkg/manager/impl/task_manager.go @@ -89,14 +89,17 @@ func (t *TaskManager) CreateTask( return nil, err } // See if a task exists and confirm whether it's an identical task or one that with a separate definition. - existingTask, err := util.GetTaskModel(ctx, t.db, request.Spec.Template.Id) + existingTaskModel, err := util.GetTaskModel(ctx, t.db, request.Spec.Template.Id) if err == nil { - if bytes.Equal(taskDigest, existingTask.Digest) { - return nil, errors.NewFlyteAdminErrorf(codes.AlreadyExists, - "identical task already exists with id %s", request.Id) + if bytes.Equal(taskDigest, existingTaskModel.Digest) { + return nil, errors.NewTaskExistsIdenticalStructureError(ctx, &request) } - return nil, errors.NewFlyteAdminErrorf(codes.InvalidArgument, - "task with different structure already exists with id %v", request.Id) + existingTask, transformerErr := transformers.FromTaskModel(*existingTaskModel) + if transformerErr != nil { + logger.Errorf(ctx, "failed to transform task from task model") + return nil, transformerErr + } + return nil, errors.NewTaskExistsDifferentStructureError(ctx, &request, existingTask.Closure.GetCompiledTask(), compiledTask) } taskModel, err := transformers.CreateTaskModel(finalizedRequest, admin.TaskClosure{ CompiledTask: compiledTask, diff --git a/flyteadmin/pkg/manager/impl/workflow_manager.go b/flyteadmin/pkg/manager/impl/workflow_manager.go index 4b755a4707..e4cc5cc120 100644 --- a/flyteadmin/pkg/manager/impl/workflow_manager.go +++ b/flyteadmin/pkg/manager/impl/workflow_manager.go @@ -168,8 +168,13 @@ func (w *WorkflowManager) CreateWorkflow( if bytes.Equal(workflowDigest, existingWorkflowModel.Digest) { return nil, errors.NewWorkflowExistsIdenticalStructureError(ctx, &request) } + existingWorkflow, transformerErr := transformers.FromWorkflowModel(existingWorkflowModel) + if transformerErr != nil { + logger.Errorf(ctx, "failed to transform workflow from workflow model") + return nil, transformerErr + } // A workflow exists with different structure - return nil, errors.NewWorkflowExistsDifferentStructureError(ctx, &request) + return nil, errors.NewWorkflowExistsDifferentStructureError(ctx, &request, existingWorkflow.Closure.GetCompiledWorkflow(), workflowClosure.GetCompiledWorkflow()) } else if flyteAdminError, ok := err.(errors.FlyteAdminError); !ok || flyteAdminError.Code() != codes.NotFound { logger.Debugf(ctx, "Failed to get workflow for comparison in CreateWorkflow with ID [%+v] with err %v", request.Id, err) diff --git a/flyteadmin/pkg/manager/impl/workflow_manager_test.go b/flyteadmin/pkg/manager/impl/workflow_manager_test.go index b5565f8cda..3c286a2430 100644 --- a/flyteadmin/pkg/manager/impl/workflow_manager_test.go +++ b/flyteadmin/pkg/manager/impl/workflow_manager_test.go @@ -187,7 +187,7 @@ func TestCreateWorkflow_ExistingWorkflow(t *testing.T) { getMockWorkflowConfigProvider(), getMockWorkflowCompiler(), mockStorageClient, storagePrefix, mockScope.NewTestScope()) request := testutils.GetWorkflowRequest() response, err := workflowManager.CreateWorkflow(context.Background(), request) - assert.EqualError(t, err, "workflow with different structure already exists") + assert.EqualError(t, err, "workflow with different structure already exists:\n\t\t- /primary/template/id: -> map[domain:domain name:name project:project resource_type:2 version:version]\n\t\t- /primary/template/interface/inputs: -> map[variables:map[foo:map[type:map[Type:map[Simple:3]]]]]\n\t\t- /primary/template/interface/outputs: -> map[variables:map[bar:map[type:map[Type:map[Simple:3]]]]]\n\t\t- /primary/template/nodes: -> [map[Target: id:node 1] map[Target: id:node 2]]") assert.Nil(t, response) } @@ -205,7 +205,7 @@ func TestCreateWorkflow_ExistingWorkflow_Different(t *testing.T) { request := testutils.GetWorkflowRequest() response, err := workflowManager.CreateWorkflow(context.Background(), request) - assert.EqualError(t, err, "workflow with different structure already exists") + assert.EqualError(t, err, "workflow with different structure already exists:\n\t\t- /primary/template/id: -> map[domain:domain name:name project:project resource_type:2 version:version]\n\t\t- /primary/template/interface/inputs: -> map[variables:map[foo:map[type:map[Type:map[Simple:3]]]]]\n\t\t- /primary/template/interface/outputs: -> map[variables:map[bar:map[type:map[Type:map[Simple:3]]]]]\n\t\t- /primary/template/nodes: -> [map[Target: id:node 1] map[Target: id:node 2]]") flyteErr := err.(flyteErrors.FlyteAdminError) assert.Equal(t, codes.InvalidArgument, flyteErr.Code()) assert.Nil(t, response) diff --git a/go.mod b/go.mod index 998cd19de7..5f00818fca 100644 --- a/go.mod +++ b/go.mod @@ -61,7 +61,7 @@ require ( github.com/eapache/queue v1.1.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/fatih/color v1.13.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/flyteorg/flyte/flyteidl v0.0.0-00010101000000-000000000000 // indirect @@ -169,6 +169,11 @@ require ( github.com/stretchr/objx v0.5.0 // indirect github.com/stretchr/testify v1.8.4 // indirect github.com/subosito/gotenv v1.2.0 // indirect + github.com/tidwall/gjson v1.17.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/sjson v1.2.5 // indirect + github.com/wI2L/jsondiff v0.5.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect diff --git a/go.sum b/go.sum index 294ed0f37d..df8f6fa506 100644 --- a/go.sum +++ b/go.sum @@ -250,8 +250,8 @@ github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= @@ -1300,13 +1300,22 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= github.com/tidwall/gjson v1.7.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= +github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y= github.com/tidwall/sjson v1.1.5/go.mod h1:VuJzsZnTowhSxWdOgsAnb886i4AjEyTkk7tNtsL7EYE= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= @@ -1323,6 +1332,8 @@ github.com/unrolled/secure v0.0.0-20181005190816-ff9db2ff917f/go.mod h1:mnPT77IA github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/wI2L/jsondiff v0.5.0 h1:RRMTi/mH+R2aXcPe1VYyvGINJqQfC3R+KSEakuU1Ikw= +github.com/wI2L/jsondiff v0.5.0/go.mod h1:qqG6hnK0Lsrz2BpIVCxWiK9ItsBCpIZQiv0izJjOZ9s= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= From 361e1efa5cc77545163db6573f881b7929f4874a Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Wed, 27 Mar 2024 05:04:08 -0700 Subject: [PATCH 362/645] Flyte-core flyteadmin / datacatalog expose ports (#5013) - Flyteadmin setting for the grpc port is nested and grpcPort should not be used. Address incorrect config / documentation - Both flyteadmin and datacatalog have configurable ports to use for HTTP and GRPC, but the k8s spec for the containers doesn't expose matching ports. Fix that! Signed-off-by: ddl-ebrown --- charts/flyte-core/README.md | 2 +- .../templates/admin/deployment.yaml | 4 +- .../templates/datacatalog/deployment.yaml | 4 +- charts/flyte-core/values-eks.yaml | 5 +- charts/flyte-core/values-gcp.yaml | 3 +- ...loak-idp-flyteclients-without-browser.yaml | 11 +- charts/flyte-core/values.yaml | 3 +- charts/flyte/README.md | 6 +- charts/flyte/values.yaml | 3 +- .../flyte_aws_scheduler_helm_generated.yaml | 7 +- .../flyte_helm_controlplane_generated.yaml | 9 +- deployment/eks/flyte_helm_generated.yaml | 9 +- .../flyte_helm_controlplane_generated.yaml | 9 +- deployment/gcp/flyte_helm_generated.yaml | 9 +- deployment/sandbox/flyte_helm_generated.yaml | 9 +- deployment/test/flyte_generated.yaml | 3 +- .../manifests/complete-agent.yaml | 4 +- .../sandbox-bundled/manifests/complete.yaml | 4 +- docker/sandbox-bundled/manifests/dev.yaml | 4 +- docs/deployment/configuration/auth_setup.rst | 231 +++++++++--------- flyteadmin/flyteadmin_config.yaml | 3 +- .../script/integration/k8s/integration.yaml | 3 +- 22 files changed, 180 insertions(+), 165 deletions(-) diff --git a/charts/flyte-core/README.md b/charts/flyte-core/README.md index 33901da7be..fe129d4e77 100644 --- a/charts/flyte-core/README.md +++ b/charts/flyte-core/README.md @@ -87,7 +87,7 @@ helm install gateway bitnami/contour -n flyte | common.ingress.tls | object | `{"enabled":false}` | - Ingress hostname host: | | common.ingress.webpackHMR | bool | `false` | - Enable or disable HMR route to flyteconsole. This is useful only for frontend development. | | configmap.admin | object | `{"admin":{"clientId":"{{ .Values.secrets.adminOauthClientCredentials.clientId }}","clientSecretLocation":"/etc/secrets/client_secret","endpoint":"flyteadmin:81","insecure":true},"event":{"capacity":1000,"rate":500,"type":"admin"}}` | Admin Client configuration [structure](https://pkg.go.dev/github.com/flyteorg/flytepropeller/pkg/controller/nodes/subworkflow/launchplan#AdminConfig) | -| configmap.adminServer | object | `{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpcPort":8089,"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}}` | FlyteAdmin server configuration | +| configmap.adminServer | object | `{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}}` | FlyteAdmin server configuration | | configmap.adminServer.auth | object | `{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}}` | Authentication configuration | | configmap.adminServer.server.security.secure | bool | `false` | Controls whether to serve requests over SSL/TLS. | | configmap.adminServer.server.security.useAuth | bool | `false` | Controls whether to enforce authentication. Follow the guide in https://docs.flyte.org/ on how to setup authentication. | diff --git a/charts/flyte-core/templates/admin/deployment.yaml b/charts/flyte-core/templates/admin/deployment.yaml index dc61d29c28..23ea9966df 100755 --- a/charts/flyte-core/templates/admin/deployment.yaml +++ b/charts/flyte-core/templates/admin/deployment.yaml @@ -151,8 +151,8 @@ spec: imagePullPolicy: "{{ .Values.flyteadmin.image.pullPolicy }}" name: flyteadmin ports: - - containerPort: 8088 - - containerPort: 8089 + - containerPort: {{ .Values.configmap.adminServer.server.httpPort }} + - containerPort: {{ .Values.configmap.adminServer.server.grpc.port }} - containerPort: {{ .Values.configmap.adminServer.flyteadmin.profilerPort }} readinessProbe: exec: diff --git a/charts/flyte-core/templates/datacatalog/deployment.yaml b/charts/flyte-core/templates/datacatalog/deployment.yaml index 94e096466d..c58452f4ce 100644 --- a/charts/flyte-core/templates/datacatalog/deployment.yaml +++ b/charts/flyte-core/templates/datacatalog/deployment.yaml @@ -66,8 +66,8 @@ spec: imagePullPolicy: "{{ .Values.datacatalog.image.pullPolicy }}" name: datacatalog ports: - - containerPort: 8088 - - containerPort: 8089 + - containerPort: {{ .Values.configmap.datacatalogServer.application.httpPort }} + - containerPort: {{ .Values.configmap.datacatalogServer.application.grpcPort }} - containerPort: {{ index .Values.configmap.datacatalogServer.datacatalog "profiler-port" }} securityContext: allowPrivilegeEscalation: false diff --git a/charts/flyte-core/values-eks.yaml b/charts/flyte-core/values-eks.yaml index 1dbaded1c7..3b7cbac830 100644 --- a/charts/flyte-core/values-eks.yaml +++ b/charts/flyte-core/values-eks.yaml @@ -147,7 +147,7 @@ common: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/tags: service_instance=production alb.ingress.kubernetes.io/scheme: internet-facing - alb.ingress.kubernetes.io/target-type: ip + alb.ingress.kubernetes.io/target-type: ip # -- This is the certificate arn of the cert imported in AWS certificate manager. alb.ingress.kubernetes.io/certificate-arn: "{{ .Values.userSettings.certificateArn }}" alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' @@ -216,7 +216,8 @@ configmap: adminServer: server: httpPort: 8088 - grpcPort: 8089 + grpc: + port: 8089 security: secure: false useAuth: false diff --git a/charts/flyte-core/values-gcp.yaml b/charts/flyte-core/values-gcp.yaml index 181772c0c6..4c91115c8d 100644 --- a/charts/flyte-core/values-gcp.yaml +++ b/charts/flyte-core/values-gcp.yaml @@ -232,7 +232,8 @@ configmap: adminServer: server: httpPort: 8088 - grpcPort: 8089 + grpc: + port: 8089 security: secure: false useAuth: false diff --git a/charts/flyte-core/values-keycloak-idp-flyteclients-without-browser.yaml b/charts/flyte-core/values-keycloak-idp-flyteclients-without-browser.yaml index edfd9478bc..5b12b7b3f9 100644 --- a/charts/flyte-core/values-keycloak-idp-flyteclients-without-browser.yaml +++ b/charts/flyte-core/values-keycloak-idp-flyteclients-without-browser.yaml @@ -81,7 +81,7 @@ flyteadmin: - configMap: name: sslcerts # name of the ca-certificates.crt configmap in the cluster name: sslcerts - additionalVolumeMounts: + additionalVolumeMounts: - mountPath: /etc/ssl/certs/ # where to mount the above certificate name: sslcerts # -- Appends extra command line arguments to the serve command @@ -459,11 +459,11 @@ configmap: console: BASE_URL: /console CONFIG_DIR: /etc/flyte/config - + logger: show-source: true level: 6 - + # -- Domains configuration for Flyte projects. This enables the specified number of domains across all projects in Flyte. domain: domains: @@ -485,7 +485,8 @@ configmap: # Refer to the [server config](https://pkg.go.dev/github.com/lyft/flyteadmin@v0.3.37/pkg/config#ServerConfig). server: httpPort: 8088 - grpcPort: 8089 + grpc: + port: 8089 security: # -- Controls whether to serve requests over SSL/TLS. secure: false @@ -552,7 +553,7 @@ configmap: - profile - openid - offline_access - clientId: + clientId: # -- Datacatalog server config datacatalogServer: diff --git a/charts/flyte-core/values.yaml b/charts/flyte-core/values.yaml index b8d4431e78..f14c6dea2b 100755 --- a/charts/flyte-core/values.yaml +++ b/charts/flyte-core/values.yaml @@ -626,7 +626,8 @@ configmap: # Refer to the [server config](https://pkg.go.dev/github.com/lyft/flyteadmin@v0.3.37/pkg/config#ServerConfig). server: httpPort: 8088 - grpcPort: 8089 + grpc: + port: 8089 security: # -- Controls whether to serve requests over SSL/TLS. secure: false diff --git a/charts/flyte/README.md b/charts/flyte/README.md index 4accdb711c..76242c341b 100644 --- a/charts/flyte/README.md +++ b/charts/flyte/README.md @@ -71,7 +71,7 @@ helm upgrade -f values-sandbox.yaml flyte . | contour.tolerations | list | `[]` | tolerations for Contour deployment | | daskoperator | object | `{"enabled":false}` | Optional: Dask Plugin using the Dask Operator | | daskoperator.enabled | bool | `false` | - enable or disable the dask operator deployment installation | -| flyte | object | `{"cluster_resource_manager":{"config":{"cluster_resources":{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}},"enabled":true,"service_account_name":"flyteadmin","templates":[{"key":"aa_namespace","value":"apiVersion: v1\nkind: Namespace\nmetadata:\n name: {{ namespace }}\nspec:\n finalizers:\n - kubernetes\n"},{"key":"ab_project_resource_quota","value":"apiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: project-quota\n namespace: {{ namespace }}\nspec:\n hard:\n limits.cpu: {{ projectQuotaCpu }}\n limits.memory: {{ projectQuotaMemory }}\n"}]},"common":{"databaseSecret":{"name":"","secretManifest":{}},"flyteNamespaceTemplate":{"enabled":false},"ingress":{"albSSLRedirect":false,"annotations":{"nginx.ingress.kubernetes.io/app-root":"/console"},"enabled":true,"host":"","separateGrpcIngress":false,"separateGrpcIngressAnnotations":{"nginx.ingress.kubernetes.io/backend-protocol":"GRPC"},"tls":{"enabled":false},"webpackHMR":true}},"configmap":{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpcPort":8089,"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}},"datacatalog":{"affinity":{},"configPath":"/etc/datacatalog/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/datacatalog","tag":"v1.11.0-b0"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"NodePort"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"db":{"admin":{"database":{"dbname":"flyteadmin","host":"postgres","port":5432,"username":"postgres"}},"datacatalog":{"database":{"dbname":"datacatalog","host":"postgres","port":5432,"username":"postgres"}}},"deployRedoc":true,"flyteadmin":{"additionalVolumeMounts":[],"additionalVolumes":[],"affinity":{},"configPath":"/etc/flyte/config/*.yaml","env":[],"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteadmin","tag":"v1.11.0-b0"},"initialProjects":["flytesnacks","flytetester","flyteexamples"],"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"loadBalancerSourceRanges":[],"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flyteconsole":{"affinity":{},"ga":{"enabled":true,"tracking_id":"G-0QW4DJWJ20"},"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteconsole","tag":"v1.10.3"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","memory":"275Mi"},"requests":{"cpu":"10m","memory":"250Mi"}},"service":{"annotations":{},"type":"ClusterIP"},"tolerations":[]},"flytepropeller":{"affinity":{},"cacheSizeMbs":0,"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytepropeller","tag":"v1.11.0-b0"},"manager":false,"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"200m","ephemeral-storage":"100Mi","memory":"200Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flytescheduler":{"affinity":{},"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytescheduler","tag":"v1.11.0-b0"},"nodeSelector":{},"podAnnotations":{},"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"storage":{"bucketName":"my-s3-bucket","custom":{},"gcs":null,"s3":{"region":"us-east-1"},"type":"sandbox"},"webhook":{"enabled":true,"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]}},"workflow_notifications":{"config":{},"enabled":false},"workflow_scheduler":{"enabled":true,"type":"native"}}` | ------------------------------------------------------------------- Core System settings This section consists of Core components of Flyte and their deployment settings. This includes FlyteAdmin service, Datacatalog, FlytePropeller and Flyteconsole | +| flyte | object | `{"cluster_resource_manager":{"config":{"cluster_resources":{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}},"enabled":true,"service_account_name":"flyteadmin","templates":[{"key":"aa_namespace","value":"apiVersion: v1\nkind: Namespace\nmetadata:\n name: {{ namespace }}\nspec:\n finalizers:\n - kubernetes\n"},{"key":"ab_project_resource_quota","value":"apiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: project-quota\n namespace: {{ namespace }}\nspec:\n hard:\n limits.cpu: {{ projectQuotaCpu }}\n limits.memory: {{ projectQuotaMemory }}\n"}]},"common":{"databaseSecret":{"name":"","secretManifest":{}},"flyteNamespaceTemplate":{"enabled":false},"ingress":{"albSSLRedirect":false,"annotations":{"nginx.ingress.kubernetes.io/app-root":"/console"},"enabled":true,"host":"","separateGrpcIngress":false,"separateGrpcIngressAnnotations":{"nginx.ingress.kubernetes.io/backend-protocol":"GRPC"},"tls":{"enabled":false},"webpackHMR":true}},"configmap":{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}},"datacatalog":{"affinity":{},"configPath":"/etc/datacatalog/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/datacatalog","tag":"v1.11.0-b0"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"NodePort"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"db":{"admin":{"database":{"dbname":"flyteadmin","host":"postgres","port":5432,"username":"postgres"}},"datacatalog":{"database":{"dbname":"datacatalog","host":"postgres","port":5432,"username":"postgres"}}},"deployRedoc":true,"flyteadmin":{"additionalVolumeMounts":[],"additionalVolumes":[],"affinity":{},"configPath":"/etc/flyte/config/*.yaml","env":[],"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteadmin","tag":"v1.11.0-b0"},"initialProjects":["flytesnacks","flytetester","flyteexamples"],"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"loadBalancerSourceRanges":[],"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flyteconsole":{"affinity":{},"ga":{"enabled":true,"tracking_id":"G-0QW4DJWJ20"},"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteconsole","tag":"v1.10.3"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","memory":"275Mi"},"requests":{"cpu":"10m","memory":"250Mi"}},"service":{"annotations":{},"type":"ClusterIP"},"tolerations":[]},"flytepropeller":{"affinity":{},"cacheSizeMbs":0,"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytepropeller","tag":"v1.11.0-b0"},"manager":false,"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"200m","ephemeral-storage":"100Mi","memory":"200Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flytescheduler":{"affinity":{},"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytescheduler","tag":"v1.11.0-b0"},"nodeSelector":{},"podAnnotations":{},"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"storage":{"bucketName":"my-s3-bucket","custom":{},"gcs":null,"s3":{"region":"us-east-1"},"type":"sandbox"},"webhook":{"enabled":true,"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]}},"workflow_notifications":{"config":{},"enabled":false},"workflow_scheduler":{"enabled":true,"type":"native"}}` | ------------------------------------------------------------------- Core System settings This section consists of Core components of Flyte and their deployment settings. This includes FlyteAdmin service, Datacatalog, FlytePropeller and Flyteconsole | | flyte.cluster_resource_manager | object | `{"config":{"cluster_resources":{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}},"enabled":true,"service_account_name":"flyteadmin","templates":[{"key":"aa_namespace","value":"apiVersion: v1\nkind: Namespace\nmetadata:\n name: {{ namespace }}\nspec:\n finalizers:\n - kubernetes\n"},{"key":"ab_project_resource_quota","value":"apiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: project-quota\n namespace: {{ namespace }}\nspec:\n hard:\n limits.cpu: {{ projectQuotaCpu }}\n limits.memory: {{ projectQuotaMemory }}\n"}]}` | Configuration for the Cluster resource manager component. This is an optional component, that enables automatic cluster configuration. This is useful to set default quotas, manage namespaces etc that map to a project/domain | | flyte.cluster_resource_manager.config.cluster_resources | object | `{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}` | ClusterResource parameters Refer to the [structure](https://pkg.go.dev/github.com/lyft/flyteadmin@v0.3.37/pkg/runtime/interfaces#ClusterResourceConfig) to customize. | | flyte.cluster_resource_manager.config.cluster_resources.standaloneDeployment | bool | `false` | Starts the cluster resource manager in standalone mode with requisite auth credentials to call flyteadmin service endpoints | @@ -91,8 +91,8 @@ helm upgrade -f values-sandbox.yaml flyte . | flyte.common.ingress.separateGrpcIngressAnnotations | object | `{"nginx.ingress.kubernetes.io/backend-protocol":"GRPC"}` | - Extra Ingress annotations applied only to the GRPC ingress. Only makes sense if `separateGrpcIngress` is enabled. | | flyte.common.ingress.tls | object | `{"enabled":false}` | - TLS Settings | | flyte.common.ingress.webpackHMR | bool | `true` | - Enable or disable HMR route to flyteconsole. This is useful only for frontend development. | -| flyte.configmap | object | `{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpcPort":8089,"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}}` | ----------------------------------------------------------------- CONFIGMAPS SETTINGS | -| flyte.configmap.adminServer | object | `{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpcPort":8089,"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}}` | FlyteAdmin server configuration | +| flyte.configmap | object | `{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}}` | ----------------------------------------------------------------- CONFIGMAPS SETTINGS | +| flyte.configmap.adminServer | object | `{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}}` | FlyteAdmin server configuration | | flyte.configmap.adminServer.auth | object | `{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}}` | Authentication configuration | | flyte.configmap.adminServer.server.security.secure | bool | `false` | Controls whether to serve requests over SSL/TLS. | | flyte.configmap.adminServer.server.security.useAuth | bool | `false` | Controls whether to enforce authentication. Follow the guide in https://docs.flyte.org/ on how to setup authentication. | diff --git a/charts/flyte/values.yaml b/charts/flyte/values.yaml index 71069a7318..e04ac71533 100755 --- a/charts/flyte/values.yaml +++ b/charts/flyte/values.yaml @@ -377,7 +377,8 @@ flyte: # Refer to the [server config](https://pkg.go.dev/github.com/lyft/flyteadmin@v0.3.37/pkg/config#ServerConfig). server: httpPort: 8088 - grpcPort: 8089 + grpc: + port: 8089 security: # -- Controls whether to serve requests over SSL/TLS. secure: false diff --git a/deployment/eks/flyte_aws_scheduler_helm_generated.yaml b/deployment/eks/flyte_aws_scheduler_helm_generated.yaml index 3ae88a9b8f..c48ab6ce97 100644 --- a/deployment/eks/flyte_aws_scheduler_helm_generated.yaml +++ b/deployment/eks/flyte_aws_scheduler_helm_generated.yaml @@ -162,7 +162,8 @@ data: testing: host: http://flyteadmin server: - grpcPort: 8089 + grpc: + port: 8089 httpPort: 8088 security: allowCors: true @@ -848,7 +849,7 @@ spec: template: metadata: annotations: - configChecksum: "2b5c85969f2bd85bb51a084f9fd72c20c3aca94be99e53cb4c4e9f78e77ebc5" + configChecksum: "d50d9b515795be1f4937c58f37335ec9bd505ba4c51f96caf8491fa323abb56" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -1209,7 +1210,7 @@ spec: imagePullPolicy: "IfNotPresent" name: datacatalog ports: - - containerPort: 8088 + - containerPort: 8080 - containerPort: 8089 - containerPort: 10254 securityContext: diff --git a/deployment/eks/flyte_helm_controlplane_generated.yaml b/deployment/eks/flyte_helm_controlplane_generated.yaml index 1ae984cf69..db1d33ab70 100644 --- a/deployment/eks/flyte_helm_controlplane_generated.yaml +++ b/deployment/eks/flyte_helm_controlplane_generated.yaml @@ -143,7 +143,8 @@ data: testing: host: http://flyteadmin server: - grpcPort: 8089 + grpc: + port: 8089 httpPort: 8088 security: allowCors: true @@ -553,7 +554,7 @@ spec: template: metadata: annotations: - configChecksum: "053b20ebc40227f6ed8ddc61f5997ee7997c604158f773779f20ec61af11a2f" + configChecksum: "b6087931f4457971d5fcd17d64491188322ffc2f86e31f943b142c76edb9e67" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -914,7 +915,7 @@ spec: imagePullPolicy: "IfNotPresent" name: datacatalog ports: - - containerPort: 8088 + - containerPort: 8080 - containerPort: 8089 - containerPort: 10254 securityContext: @@ -973,7 +974,7 @@ spec: template: metadata: annotations: - configChecksum: "053b20ebc40227f6ed8ddc61f5997ee7997c604158f773779f20ec61af11a2f" + configChecksum: "b6087931f4457971d5fcd17d64491188322ffc2f86e31f943b142c76edb9e67" labels: app.kubernetes.io/name: flytescheduler app.kubernetes.io/instance: flyte diff --git a/deployment/eks/flyte_helm_generated.yaml b/deployment/eks/flyte_helm_generated.yaml index 1d4c79874f..2f485a3cc0 100644 --- a/deployment/eks/flyte_helm_generated.yaml +++ b/deployment/eks/flyte_helm_generated.yaml @@ -174,7 +174,8 @@ data: testing: host: http://flyteadmin server: - grpcPort: 8089 + grpc: + port: 8089 httpPort: 8088 security: allowCors: true @@ -879,7 +880,7 @@ spec: template: metadata: annotations: - configChecksum: "053b20ebc40227f6ed8ddc61f5997ee7997c604158f773779f20ec61af11a2f" + configChecksum: "b6087931f4457971d5fcd17d64491188322ffc2f86e31f943b142c76edb9e67" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -1240,7 +1241,7 @@ spec: imagePullPolicy: "IfNotPresent" name: datacatalog ports: - - containerPort: 8088 + - containerPort: 8080 - containerPort: 8089 - containerPort: 10254 securityContext: @@ -1299,7 +1300,7 @@ spec: template: metadata: annotations: - configChecksum: "053b20ebc40227f6ed8ddc61f5997ee7997c604158f773779f20ec61af11a2f" + configChecksum: "b6087931f4457971d5fcd17d64491188322ffc2f86e31f943b142c76edb9e67" labels: app.kubernetes.io/name: flytescheduler app.kubernetes.io/instance: flyte diff --git a/deployment/gcp/flyte_helm_controlplane_generated.yaml b/deployment/gcp/flyte_helm_controlplane_generated.yaml index 0f1ebf1381..9f885c6a43 100644 --- a/deployment/gcp/flyte_helm_controlplane_generated.yaml +++ b/deployment/gcp/flyte_helm_controlplane_generated.yaml @@ -143,7 +143,8 @@ data: testing: host: http://flyteadmin server: - grpcPort: 8089 + grpc: + port: 8089 httpPort: 8088 security: allowCors: true @@ -568,7 +569,7 @@ spec: template: metadata: annotations: - configChecksum: "2e169a911a8234dd42d06ca0887279093f4ed36033d0543749ce126b26b50f3" + configChecksum: "b35a14d8bfd46ac863acf50bc4f338954b2f1315b66dc1fc17123885cc4dc37" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -929,7 +930,7 @@ spec: imagePullPolicy: "IfNotPresent" name: datacatalog ports: - - containerPort: 8088 + - containerPort: 8080 - containerPort: 8089 - containerPort: 10254 securityContext: @@ -988,7 +989,7 @@ spec: template: metadata: annotations: - configChecksum: "2e169a911a8234dd42d06ca0887279093f4ed36033d0543749ce126b26b50f3" + configChecksum: "b35a14d8bfd46ac863acf50bc4f338954b2f1315b66dc1fc17123885cc4dc37" labels: app.kubernetes.io/name: flytescheduler app.kubernetes.io/instance: flyte diff --git a/deployment/gcp/flyte_helm_generated.yaml b/deployment/gcp/flyte_helm_generated.yaml index ac527c47a7..5ffa7ff90d 100644 --- a/deployment/gcp/flyte_helm_generated.yaml +++ b/deployment/gcp/flyte_helm_generated.yaml @@ -174,7 +174,8 @@ data: testing: host: http://flyteadmin server: - grpcPort: 8089 + grpc: + port: 8089 httpPort: 8088 security: allowCors: true @@ -902,7 +903,7 @@ spec: template: metadata: annotations: - configChecksum: "2e169a911a8234dd42d06ca0887279093f4ed36033d0543749ce126b26b50f3" + configChecksum: "b35a14d8bfd46ac863acf50bc4f338954b2f1315b66dc1fc17123885cc4dc37" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -1263,7 +1264,7 @@ spec: imagePullPolicy: "IfNotPresent" name: datacatalog ports: - - containerPort: 8088 + - containerPort: 8080 - containerPort: 8089 - containerPort: 10254 securityContext: @@ -1322,7 +1323,7 @@ spec: template: metadata: annotations: - configChecksum: "2e169a911a8234dd42d06ca0887279093f4ed36033d0543749ce126b26b50f3" + configChecksum: "b35a14d8bfd46ac863acf50bc4f338954b2f1315b66dc1fc17123885cc4dc37" labels: app.kubernetes.io/name: flytescheduler app.kubernetes.io/instance: flyte diff --git a/deployment/sandbox/flyte_helm_generated.yaml b/deployment/sandbox/flyte_helm_generated.yaml index 80d9450477..3d68b4afa0 100644 --- a/deployment/sandbox/flyte_helm_generated.yaml +++ b/deployment/sandbox/flyte_helm_generated.yaml @@ -294,7 +294,8 @@ data: testing: host: http://flyteadmin server: - grpcPort: 8089 + grpc: + port: 8089 httpPort: 8088 security: allowCors: true @@ -6686,7 +6687,7 @@ spec: template: metadata: annotations: - configChecksum: "8702cc3d688d44938e6974b267f70fb01ce7fec4780de86b8f2e65f9446c711" + configChecksum: "88625d852360c42642190e21751f32f7dd9501ce3d479fa68b86478995ff689" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -7028,7 +7029,7 @@ spec: imagePullPolicy: "IfNotPresent" name: datacatalog ports: - - containerPort: 8088 + - containerPort: 8080 - containerPort: 8089 - containerPort: 10254 securityContext: @@ -7077,7 +7078,7 @@ spec: template: metadata: annotations: - configChecksum: "8702cc3d688d44938e6974b267f70fb01ce7fec4780de86b8f2e65f9446c711" + configChecksum: "88625d852360c42642190e21751f32f7dd9501ce3d479fa68b86478995ff689" labels: app.kubernetes.io/name: flytescheduler app.kubernetes.io/instance: flyte diff --git a/deployment/test/flyte_generated.yaml b/deployment/test/flyte_generated.yaml index ea1954bee0..80a3227e71 100644 --- a/deployment/test/flyte_generated.yaml +++ b/deployment/test/flyte_generated.yaml @@ -293,7 +293,8 @@ data: server.yaml: | server: httpPort: 8088 - grpcPort: 8089 + grpc: + port: 8089 security: # Controls whether to serve requests over SSL/TLS. secure: false diff --git a/docker/sandbox-bundled/manifests/complete-agent.yaml b/docker/sandbox-bundled/manifests/complete-agent.yaml index 3d40c5a8f8..18a0840a73 100644 --- a/docker/sandbox-bundled/manifests/complete-agent.yaml +++ b/docker/sandbox-bundled/manifests/complete-agent.yaml @@ -816,7 +816,7 @@ type: Opaque --- apiVersion: v1 data: - haSharedSecret: QWVsREJpZnlIR2N1UXJSMg== + haSharedSecret: bkdUMzhmMjNBYmN0RDlIRg== proxyPassword: "" proxyUsername: "" kind: Secret @@ -1412,7 +1412,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: 6eadd3a29b61a78cf3a7712f3370a10fc0ec1a61c40753a48c7fa8bea69a6ec6 + checksum/secret: c99a8645b27f263998822ca7fcbfc861f9011d267550c2c1b683193928d21a5a labels: app: docker-registry release: flyte-sandbox diff --git a/docker/sandbox-bundled/manifests/complete.yaml b/docker/sandbox-bundled/manifests/complete.yaml index 69739d52d7..9080fd4e6a 100644 --- a/docker/sandbox-bundled/manifests/complete.yaml +++ b/docker/sandbox-bundled/manifests/complete.yaml @@ -796,7 +796,7 @@ type: Opaque --- apiVersion: v1 data: - haSharedSecret: NmtkWjAwUWhadWlzb0xNcA== + haSharedSecret: Yk10amxRNGE2a2cxQkNudw== proxyPassword: "" proxyUsername: "" kind: Secret @@ -1360,7 +1360,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: 98727a2bd78c4e88ef413663ebff406f78c8fdbda001f7ba7b6b784934cd4d4a + checksum/secret: 78a0277052e7c7d0a17e1d0dcddb270ba05856222a35324fa54aec8f8a9d0f4e labels: app: docker-registry release: flyte-sandbox diff --git a/docker/sandbox-bundled/manifests/dev.yaml b/docker/sandbox-bundled/manifests/dev.yaml index fd77ad44e0..9235c733dc 100644 --- a/docker/sandbox-bundled/manifests/dev.yaml +++ b/docker/sandbox-bundled/manifests/dev.yaml @@ -499,7 +499,7 @@ metadata: --- apiVersion: v1 data: - haSharedSecret: WG01UkdoN2dNTzBMRjJDVA== + haSharedSecret: QkZrajZUUmFvMWRtYUtOeA== proxyPassword: "" proxyUsername: "" kind: Secret @@ -934,7 +934,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: 5400c48803b4ae9d08115e0f52f00245498c0b06d11d318a36590b01f91e2753 + checksum/secret: 18ef21d160b64cc1bc13e82bdbf675a7592da97786d648686aa4ea1f15b7cafb labels: app: docker-registry release: flyte-sandbox diff --git a/docs/deployment/configuration/auth_setup.rst b/docs/deployment/configuration/auth_setup.rst index 2887e830ed..1131c30e98 100644 --- a/docs/deployment/configuration/auth_setup.rst +++ b/docs/deployment/configuration/auth_setup.rst @@ -26,9 +26,9 @@ Using an implementation of the `Open ID Connect (OIDC) specification `__, the authorization server's role is to issue *access tokens to the client after successfully authenticating the resource owner and obtaining authorization*. In this context, the *resource owner* is the end user of Flyte; and the *client* is the tool or component that intends to interact with ``flyteadmin`` : ``flytepropeller``, ``flyteconsole`` or any of the CLI tools. There are two supported options to use an authorization server in Flyte: - - * **Internal authorization server**: It comes pre-installed with Flyte and it is a suitable choice for quick start and testing purposes. - * **External (custom) authorization server**: This a service provided by one of the supported IdPs and is the recommended option if your organization needs to retain control over scope definitions and grants, token expiration policies and other advanced security controls. + + * **Internal authorization server**: It comes pre-installed with Flyte and it is a suitable choice for quick start and testing purposes. + * **External (custom) authorization server**: This a service provided by one of the supported IdPs and is the recommended option if your organization needs to retain control over scope definitions and grants, token expiration policies and other advanced security controls. .. note:: @@ -64,7 +64,7 @@ Flyte supports OAuth2 and OpenId Connect to secure the various connections: * :ref:`OpenID Connect `: used to secure user's authentication to ``flyteadmin`` through the UI. * :ref:`OAuth2 `: used to secure connections from clients (i.e. ``pyflyte``, ``flytectl`` and - ``flytepropeller``) to the ``flyteadmin`` service. + ``flytepropeller``) to the ``flyteadmin`` service. Support for these protocols varies per IdP. Checkout the following table to understand the available support level for your IdP: @@ -82,46 +82,46 @@ Identity Management layer : OIDC =================================== In this section, you can find canonical examples of how to set up OIDC on some of the supported IdPs; enabling users to authenticate in the -browser. +browser. .. tabs:: .. group-tab:: Google - + - Create an OAuth2 Client Credential following the `official documentation `__ and take note of the ``client_id`` and ``client_secret`` - - In the **Authorized redirect URIs** field, add ``http://localhost:30081/callback`` for **sandbox** deployments, or ``https:///callback`` for other methods of deployment. - - + - In the **Authorized redirect URIs** field, add ``http://localhost:30081/callback`` for **sandbox** deployments, or ``https:///callback`` for other methods of deployment. + + .. group-tab:: Okta - - + + 1. If you don't already have an Okta account, sign up for one `here `__. 2. Create an app integration, with `OIDC - OpenID Connect` as the sign-on method and `Web Application` as the app type. - 3. Add sign-in redirect URIs: - - - ``http://localhost:30081/callback`` for sandbox or ``https:///callback`` for other Flyte deployment types. - + 3. Add sign-in redirect URIs: + + - ``http://localhost:30081/callback`` for sandbox or ``https:///callback`` for other Flyte deployment types. + 4. *Optional* - Add logout redirect URIs: - - - ``http://localhost:30081/logout`` for sandbox, ``https:///callback`` for other Flyte deployment types). - + + - ``http://localhost:30081/logout`` for sandbox, ``https:///callback`` for other Flyte deployment types). + 5. Take note of the Client ID and Client Secret - + .. group-tab:: Keycloak - + 1. If you don't have a Keycloak installation, you can use `this `__ which provides a quick way to deploy Keycloak cluster on AWS. 2. Create a realm using the `admin console `__ 3. Create an OIDC client with client secret and note them down. Use the following `instructions `__ 4. Add Login redirect URIs: - + - ``http://localhost:30081/callback`` for sandbox or ``https:///callback`` for other Flyte deployment types. - + .. group-tab:: Microsoft Entra ID (Azure AD) - + 1. From the Azure homepage go to **Azure Active Directory** 2. From the **Ovierview** page, take note of the **Tenant ID** 3. Go to **App registrations** @@ -129,20 +129,20 @@ browser. 5. Give it a descriptive name 6. For the **Supported account types** select the option that matches your organization's security policy 7. In the **Redirect URI** section select: - + - **Web** platform - Add ``http://localhost:30081/callback`` for sandbox or ``https:///callback`` for other Flyte deployment types - + 9. Click on **Register** 10. Once created, click on the registered app and go to the **Certificates and secrets** section 11. Go to **Client secrets** and create a **New client secret** 12. Enter a description and an expiration policy 13. Take note of the secret **Value** as it will be used in the Helm chart - + For further reference, check out the official `Azure AD Docs `__ on how to configure the IdP for OpenIDConnect. - + .. note:: - + Make sure the app is registered without `additional claims `__. The OpenIDConnect authentication will not work otherwise, please refer to this `GitHub Issue `__ and `Azure AD Docs `__ for more information. @@ -158,13 +158,13 @@ Apply OIDC Configuration 1. Generate a random password to be used internally by ``flytepropeller`` 2. Use the following command to generate a bcrypt hash for that password: - + .. prompt:: bash $ pip install bcrypt && python -c 'import bcrypt; import base64; print(base64.b64encode(bcrypt.hashpw("".encode("utf-8"), bcrypt.gensalt(6))))' 3. Go to your values file and locate the ``auth`` section and replace values accordingly: - + .. code-block:: yaml auth: @@ -191,13 +191,13 @@ Apply OIDC Configuration 5. Upgrade your Helm release with the new values: .. prompt:: bash $ - - helm upgrade flyteorg/flyte-binary -n --values .yaml + + helm upgrade flyteorg/flyte-binary -n --values .yaml Where: - + * ```` is the name of your Helm release, typically ``flyte-backend``. You can find it using ``helm ls -n `` - + 6. Verify that your Flyte deployment now requires successful login to your IdP to access the UI (``https:///console``) @@ -208,18 +208,18 @@ Apply OIDC Configuration admin: ... authType: Pkce #change from the default `clientCred` to enable client auth without using shared secrets - ... + ... .. group-tab:: flyte-core 1. Generate a random password to be used internally by flytepropeller 2. Use the following command to generate a bcrypt hash for that password: - + .. prompt:: bash $ - + pip install bcrypt && python -c 'import bcrypt; import base64; print(base64.b64encode(bcrypt.hashpw("".encode("utf-8"), bcrypt.gensalt(6))))' - + Take note of the output (only the contents inside `''`) 3. Store the ``client_secret`` provided by your IdP in a Kubernetes secret as follows: @@ -252,7 +252,8 @@ Apply OIDC Configuration adminServer: server: httpPort: 8088 - grpcPort: 8089 + grpc: + port: 8089 security: secure: false useAuth: true @@ -277,7 +278,7 @@ Apply OIDC Configuration id: flyte-cli redirect_uris: - http://localhost:53593/callback - - http://localhost:12345/callback + - http://localhost:12345/callback grant_types: - refresh_token - authorization_code @@ -308,7 +309,7 @@ Apply OIDC Configuration flytepropeller: id: flytepropeller # Use the bcrypt hash generated for your random password - client_secret: "" + client_secret: "" redirect_uris: - http://localhost:3846/callback grant_types: @@ -321,7 +322,7 @@ Apply OIDC Configuration - offline - access_token public: false - + authorizedUris: # Use the public URL of flyteadmin (a DNS record pointing to your Ingress resource) - https:// @@ -340,21 +341,21 @@ Apply OIDC Configuration - openid 7. Additionally, outside the ``configmap`` section, add the following block and replace the necessary information: - + .. code-block:: yaml - + secrets: adminOauthClientCredentials: # -- If enabled is true, helm will create and manage `flyte-secret-auth` and populate it with `clientSecret`. # If enabled is false, it's up to the user to create `flyte-secret-auth` enabled: true - # Use the non-encoded version of the random password - clientSecret: "" + # Use the non-encoded version of the random password + clientSecret: "" clientId: flytepropeller .. note:: - For `multi-cluster deployments `__, + For `multi-cluster deployments `__, you must add this Secret definition block to the `values-dataplane.yaml` file. If you are not running `flytepropeller` in the control plane cluster, you do not need to create this secret there. @@ -366,7 +367,7 @@ Apply OIDC Configuration helm upgrade flyteorg/flyte-binary -n --values .yaml - 10. Verify that the `flytepropeller`, `flytescheduler` and `flyteadmin` Pods are restarted and running: + 10. Verify that the `flytepropeller`, `flytescheduler` and `flyteadmin` Pods are restarted and running: .. prompt:: bash $ @@ -379,7 +380,7 @@ Apply OIDC Configuration admin: ... authType: Pkce #change from the default `clientCred` to enable client auth without using shared secrets - ... + ... .. note:: @@ -393,7 +394,7 @@ Custom Authorization Server *************************** -As mentioned previously, Flyte ships with an internal authorization server; hence setting up an external Authorization Server is optional and dependent on your organization's security requirements. +As mentioned previously, Flyte ships with an internal authorization server; hence setting up an external Authorization Server is optional and dependent on your organization's security requirements. In this section, you will find instructions on how to setup an OAuth2 Authorization Server in the different IdPs supported by Flyte: @@ -407,25 +408,25 @@ In this section, you will find instructions on how to setup an OAuth2 Authorizat .. tabs:: .. group-tab:: Okta - + Okta's custom authorization servers are available through an add-on license. The free developer accounts do include access, which you can use to test before rolling out the configuration more broadly. - + 1. From the left-hand menu, go to **Security** > **API** - 2. Click on **Add Authorization Server**. + 2. Click on **Add Authorization Server**. 3. Assign an informative name and set the audience to the public URL of FlyteAdmin (e.g. https://example.foobar.com). - + .. note:: - + The audience must exactly match one of the URIs in the ``authorizedUris`` section above - - 4. Note down the **Issuer URI**; this will be used for all the ``baseUrl`` settings in the Flyte config. - 5. Go to **Scopes** and click **Add Scope**. - 6. Set the name to ``all`` (required) and check ``Required`` under the **User consent** option. - 7. Uncheck the **Block services from requesting this scope** option and save your changes. + + 4. Note down the **Issuer URI**; this will be used for all the ``baseUrl`` settings in the Flyte config. + 5. Go to **Scopes** and click **Add Scope**. + 6. Set the name to ``all`` (required) and check ``Required`` under the **User consent** option. + 7. Uncheck the **Block services from requesting this scope** option and save your changes. 8. Add another scope, named ``offline``. Check both the **Required** and **Include in public metadata** options. - 9. Uncheck the **Block services from requesting this scope** option. - 10. Click **Save**. - 11. Go to **Access Policies**, click **Add New Access Policy**. Enter a name and description and enable **Assign to** - ``All clients``. + 9. Uncheck the **Block services from requesting this scope** option. + 10. Click **Save**. + 11. Go to **Access Policies**, click **Add New Access Policy**. Enter a name and description and enable **Assign to** - ``All clients``. 12. Add a rule to the policy with the default settings (you can fine-tune these later). 13. Navigate back to the **Applications** section. 14. Create an integration for ``flytectl``; it should be created with the **OIDC - OpenID Connect** sign-on method, and the **Native Application** type. @@ -437,12 +438,12 @@ In this section, you will find instructions on how to setup an OAuth2 Authorizat 20. This app does not need a specific redirect URI; nor does it need to be assigned to any users. 21. Note down the **Client ID** and **Client secret**; you will need these later. 22. Take note of the **Issuer URI** for your Authorization Server. It will be used as the baseURL parameter in the Helm chart - + You should have three integrations total - one for the web interface (``flyteconsole``), one for ``flytectl``, and one for ``flytepropeller``. - + .. group-tab:: Keycloak - - + + 1. If you don't have a Keycloak installation, you can use `this `__ which provides quick way to deploy Keycloak cluster on AWS. 2. Create a realm in keycloak installation using its `admin console `__ 3. Under `Client Scopes`, click `Add Create` inside the admin console. @@ -452,7 +453,7 @@ In this section, you will find instructions on how to setup an OAuth2 Authorizat 7. Take note of the client ID and client Secrets provided. .. group-tab:: Azure AD - + 1. Navigate to tab **Overview**, obtain ```` and ```` 2. Navigate to tab **Authentication**, click ``+Add a platform`` 3. Add **Web** for flyteconsole and flytepropeller, **Mobile and desktop applications** for flytectl. @@ -473,10 +474,10 @@ Follow the steps in this section to configure `flyteadmin` to use an external au .. tabs:: .. group-tab:: flyte-binary - + 1. Go to the values YAML file you used to install Flyte using a Helm chart 2. Find the ``auth`` section and follow the inline comments to insert your configuration: - + .. code-block:: yaml auth: @@ -485,7 +486,7 @@ Follow the steps in this section to configure `flyteadmin` to use an external au # baseUrl: https:///auth/realms/ # Uncomment for Keycloak and update with your installation host and realm name # baseUrl: https://login.microsoftonline.com//oauth2/v2.0/authorize # Uncomment for Azure AD # For Okta, use the Issuer URI of the custom auth server: - baseUrl: https://dev-.okta.com/oauth2/ + baseUrl: https://dev-.okta.com/oauth2/ # Use the client ID and secret generated by your IdP for the first OIDC registration in the "Identity Management layer : OIDC" section of this guide clientId: clientSecret: @@ -498,11 +499,11 @@ Follow the steps in this section to configure `flyteadmin` to use an external au clientSecretHash: <-flytepropeller-secret-bcrypt-hash> authorizedUris: # Use here the exact same value used for 'audience' when the Authorization server was configured - - https:// - - + - https:// + + 3. Find the ``inline`` section of the values file and add the following content, replacing where needed: - + .. code-block:: yaml inline: @@ -513,8 +514,8 @@ Follow the steps in this section to configure `flyteadmin` to use an external au # baseUrl: https:///auth/realms/ # Uncomment for Keycloak and update with your installation host and realm name # baseUrl: https://login.microsoftonline.com//oauth2/v2.0/authorize # Uncomment for Azure AD # For Okta, use the Issuer URI of the custom auth server: - baseUrl: https://dev-.okta.com/oauth2/ - metadataUrl: .well-known/oauth-authorization-server + baseUrl: https://dev-.okta.com/oauth2/ + metadataUrl: .well-known/oauth-authorization-server thirdPartyConfig: flyteClient: # Use the clientID generated by your IdP for the `flytectl` app registration @@ -527,16 +528,16 @@ Follow the steps in this section to configure `flyteadmin` to use an external au openId: # baseUrl: https:///auth/realms/ # Uncomment for Keycloak and update with your installation host and realm name # baseUrl: https://login.microsoftonline.com//oauth2/v2.0/authorize # Uncomment for Azure AD - # For Okta, use the Issuer URI of the custom auth server: + # For Okta, use the Issuer URI of the custom auth server: baseUrl: https://dev-.okta.com/oauth2/ - scopes: - - profile - - openid - # - offline_access # Uncomment if your IdP supports issuing refresh tokens (optional) - # Use the client ID and secret generated by your IdP for the first OIDC registration in the "Identity Management layer : OIDC" section of this guide + scopes: + - profile + - openid + # - offline_access # Uncomment if your IdP supports issuing refresh tokens (optional) + # Use the client ID and secret generated by your IdP for the first OIDC registration in the "Identity Management layer : OIDC" section of this guide clientId: - - + + 4. Save your changes 5. Upgrade your Helm release with the new configuration: @@ -544,18 +545,18 @@ Follow the steps in this section to configure `flyteadmin` to use an external au helm upgrade flyteorg/flyte-core -n --values .yaml - + .. group-tab:: flyte-core - + 1. Find the ``auth`` section in your Helm values file, and replace the necessary data: - .. note:: + .. note:: If you were previously using the internal auth server, make sure to delete all the ``selfAuthServer`` section from your values file .. code-block:: yaml - + configmap: auth: appAuth: @@ -566,9 +567,9 @@ Follow the steps in this section to configure `flyteadmin` to use an external au externalAuthServer: # baseUrl: https:///auth/realms/ # Uncomment for Keycloak and update with your installation host and realm name # baseUrl: https://login.microsoftonline.com//oauth2/v2.0/authorize # Uncomment for Azure AD - # For Okta, use the Issuer URI of the custom auth server: + # For Okta, use the Issuer URI of the custom auth server: baseUrl: https://dev-.okta.com/oauth2/ - + metadataUrl: .well-known/openid-configuration thirdPartyConfig: @@ -586,15 +587,15 @@ Follow the steps in this section to configure `flyteadmin` to use an external au openId: # baseUrl: https:///auth/realms/ # Uncomment for Keycloak and update with your installation host and realm name # baseUrl: https://login.microsoftonline.com//oauth2/v2.0/authorize # Uncomment for Azure AD - # For Okta, use the Issuer URI of the custom auth server: + # For Okta, use the Issuer URI of the custom auth server: baseUrl: https://dev-.okta.com/oauth2/ scopes: - profile - openid # - offline_access # Uncomment if OIdC supports issuing refresh tokens. clientId: - - + + secrets: adminOauthClientCredentials: enabled: true # see the section "Disable Helm secret management" if you require to do so @@ -602,7 +603,7 @@ Follow the steps in this section to configure `flyteadmin` to use an external au clientSecret: # Replace with the client_id provided by provided by your IdP for flytepropeller. clientId: - + 2. Save your changes 3. Upgrade your Helm release with the new configuration: @@ -675,7 +676,7 @@ Alternatively, you can instruct Helm not to create and manage the secret for ``f adminOauthClientCredentials: enabled: false #set to false # Replace with the client_id provided by provided by your IdP for flytepropeller. - clientId: + clientId: 2. Create a secret declaratively: @@ -701,75 +702,75 @@ If your organization does any automated registration, then you'll need to authen .. tabs:: .. group-tab:: flytectl - + Flytectl's `config.yaml `_ can be configured to use either PKCE (`Proof key for code exchange `_) or Client Credentials (`Client Credentials `_) flows. - + 1. Update ``config.yaml`` as follows: - + .. code-block:: yaml - + admin: # Update with the Flyte's ingress endpoint (e.g. flyteIngressIP for sandbox or example.foobar.com) # You must keep the 3 forward-slashes after dns: endpoint: dns:/// - + # Update auth type to `Pkce` or `ClientSecret` authType: Pkce - + # Set to the clientId (will be used for both Pkce and ClientSecret flows) # Leave empty to use the value discovered through flyteAdmin's Auth discovery endpoint. clientId: - + # Set to the location where the client secret is mounted. # Only needed/used for `ClientSecret` flow. clientSecretLocation: - + # If required, set the scopes needed here. Otherwise, flytectl will discover scopes required for OpenID # Connect through flyteAdmin's Auth discovery endpoint. # scopes: [ "scope1", "scope2" ] - + To read further about the available config options, please `visit here `_ - + .. group-tab:: Flytekit / pyflyte - + Flytekit configuration variables are automatically designed to look up values from relevant environment variables. .. important:: However, to aid with continuous integration use-cases, Flytekit configuration can also reference other environment variables. - + For instance, if your CI system is not capable of setting custom environment variables like ``FLYTE_CREDENTIALS_CLIENT_SECRET`` but does set the necessary settings under a different variable, you may use ``export FLYTE_CREDENTIALS_CLIENT_SECRET_FROM_ENV_VAR=OTHER_ENV_VARIABLE`` to redirect the lookup. A ``FLYTE_CREDENTIALS_CLIENT_SECRET_FROM_FILE`` redirect is available as well, where the value should be the full path to the file containing the value for the configuration setting, in this case, the client secret. We found this redirect behavior necessary when setting up registration within our own CI pipelines. - + The following is a listing of the Flytekit configuration values we set in CI, along with a brief explanation. - + .. code-block:: bash - + # When using OAuth2 service auth, this is the username and password. export FLYTE_CREDENTIALS_CLIENT_ID= export FLYTE_CREDENTIALS_CLIENT_SECRET= - + # This tells the SDK to use basic authentication. If not set, Flytekit will assume you want to use the # standard OAuth based three-legged flow. export FLYTE_CREDENTIALS_AUTH_MODE=basic - + # This value should be set to conform to this # `header config `_ # on the Admin side. export FLYTE_CREDENTIALS_AUTHORIZATION_METADATA_KEY=
- + # When using basic authentication, you'll need to specify a scope to the IDP (instead of ``openid``, which is # only for OAuth). Set that here. export FLYTE_CREDENTIALS_OAUTH_SCOPES= - + # Set this to force Flytekit to use authentication, even if not required by Admin. This is useful as you're # rolling out the requirement. export FLYTE_PLATFORM_AUTH=True diff --git a/flyteadmin/flyteadmin_config.yaml b/flyteadmin/flyteadmin_config.yaml index 443814572b..693e290b2a 100644 --- a/flyteadmin/flyteadmin_config.yaml +++ b/flyteadmin/flyteadmin_config.yaml @@ -4,7 +4,8 @@ # https://github.com/lyft/flyte/blob/b47565c9998cde32b0b5f995981e3f3c990fa7cd/artifacts/flyteadmin.yaml#L72 server: httpPort: 8088 - grpcPort: 8089 + grpc: + port: 8089 grpcServerReflection: true kube-config: /Users/ytong/.flyte/sandbox/kubeconfig security: diff --git a/flyteadmin/script/integration/k8s/integration.yaml b/flyteadmin/script/integration/k8s/integration.yaml index 5e57935316..20480b7fdd 100644 --- a/flyteadmin/script/integration/k8s/integration.yaml +++ b/flyteadmin/script/integration/k8s/integration.yaml @@ -245,7 +245,8 @@ data: development.integration: |- server: httpPort: 8088 - grpcPort: 8089 + grpc: + port: 8089 kube-config: "$HOME/.kube/config" grpcServerReflection: true security: From 7c57d51c0b221c5e54c31afc16160f38b7dfcddf Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Wed, 27 Mar 2024 05:05:27 -0700 Subject: [PATCH 363/645] Add flyte-core missing webhook priorityClassName (#4987) - All the other pods can have their priorityClassName set except for the webhook Signed-off-by: ddl-ebrown --- charts/flyte-core/README.md | 1 + charts/flyte-core/templates/propeller/webhook.yaml | 3 +++ charts/flyte-core/values.yaml | 2 ++ 3 files changed, 6 insertions(+) diff --git a/charts/flyte-core/README.md b/charts/flyte-core/README.md index fe129d4e77..27086c0505 100644 --- a/charts/flyte-core/README.md +++ b/charts/flyte-core/README.md @@ -290,6 +290,7 @@ helm install gateway bitnami/contour -n flyte | storage.s3.secretKey | string | `""` | AWS IAM user secret access key to use for S3 bucket auth, only used if authType is set to accesskey | | storage.type | string | `"sandbox"` | Sets the storage type. Supported values are sandbox, s3, gcs and custom. | | webhook.enabled | bool | `true` | enable or disable secrets webhook | +| webhook.priorityClassName | string | `""` | Sets priorityClassName for webhook pod | | webhook.resources.requests.cpu | string | `"200m"` | | | webhook.resources.requests.ephemeral-storage | string | `"500Mi"` | | | webhook.resources.requests.memory | string | `"500Mi"` | | diff --git a/charts/flyte-core/templates/propeller/webhook.yaml b/charts/flyte-core/templates/propeller/webhook.yaml index e34241d905..90241a69f8 100644 --- a/charts/flyte-core/templates/propeller/webhook.yaml +++ b/charts/flyte-core/templates/propeller/webhook.yaml @@ -39,6 +39,9 @@ spec: securityContext: {{ tpl (toYaml .) $ | nindent 8 }} {{- end }} serviceAccountName: {{ template "flyte-pod-webhook.name" . }} + {{- if .Values.webhook.priorityClassName }} + priorityClassName: {{ .Values.webhook.priorityClassName }} + {{- end }} {{- if .Values.webhook.enabled }} initContainers: - name: generate-secrets diff --git a/charts/flyte-core/values.yaml b/charts/flyte-core/values.yaml index f14c6dea2b..944bc84735 100755 --- a/charts/flyte-core/values.yaml +++ b/charts/flyte-core/values.yaml @@ -444,6 +444,8 @@ secrets: webhook: # -- enable or disable secrets webhook enabled: true + # -- Sets priorityClassName for webhook pod + priorityClassName: "" # -- Configuration for service accounts for the webhook serviceAccount: # -- Should a service account be created for the webhook From ed715d6894ec6f91716a4e97558afad276832a65 Mon Sep 17 00:00:00 2001 From: ssen85 Date: Wed, 27 Mar 2024 19:44:22 +0100 Subject: [PATCH 364/645] Update environment_setup.md (#4963) The worflow names in the section 'Visualizing workflows' are configured incorrectly. The corrections have been made. Signed-off-by: ssen85 --- docs/user_guide/environment_setup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/user_guide/environment_setup.md b/docs/user_guide/environment_setup.md index 1fc41e749b..f23d32219c 100644 --- a/docs/user_guide/environment_setup.md +++ b/docs/user_guide/environment_setup.md @@ -141,7 +141,7 @@ flytectl get workflows \ --domain development \ --version \ -o doturl \ - basics.workflow.simple_wf + workflow.simple_wf ``` To view workflow as a `strict digraph` on the command line: @@ -152,7 +152,7 @@ flytectl get workflows \ --domain development \ --version \ -o dot \ - basics.workflow.simple_wf + workflow.simple_wf ``` Replace `` with the version obtained from the console UI, From 5de1a0272605899542bf193fe875c8805fd0e500 Mon Sep 17 00:00:00 2001 From: Chi-Sheng Liu Date: Thu, 28 Mar 2024 03:24:10 +0800 Subject: [PATCH 365/645] docs: Open external links in new tab (#4966) Resolves: flyteorg/flyte#4909 Signed-off-by: Chi-Sheng Liu --- docs/conf.py | 1 + monodocs-environment.lock.yaml | 22 ++++++++++++++++++++++ monodocs-environment.yaml | 1 + 3 files changed, 24 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index eca3047f25..171ee13e6d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -75,6 +75,7 @@ # custom extensions "auto_examples", "import_projects", + "sphinx_new_tab_link" ] source_suffix = { diff --git a/monodocs-environment.lock.yaml b/monodocs-environment.lock.yaml index d6e0f711de..09dfed5fc3 100644 --- a/monodocs-environment.lock.yaml +++ b/monodocs-environment.lock.yaml @@ -18088,6 +18088,28 @@ package: sha256: 2bd0c30779653e4dd120300cbd9ca412c480738cc2241f6dea477a883f299e04 category: main optional: false +- name: sphinx-new-tab-link + version: 0.2.3 + manager: pip + platform: linux-64 + dependencies: + sphinx: '*' + url: https://files.pythonhosted.org/packages/23/b4/8269282568ac9e26dbefdbdb642e89b8f2b211ef9f5f00f50a466c05f0b6/sphinx_new_tab_link-0.2.3-py3-none-any.whl + hash: + sha256: 2321b633170d8e33acae8afb96b3d7d9a8b3f081271987ae12a53151e2a0ab56 + category: main + optional: false +- name: sphinx-new-tab-link + version: 0.2.3 + manager: pip + platform: osx-arm64 + dependencies: + sphinx: '*' + url: https://files.pythonhosted.org/packages/23/b4/8269282568ac9e26dbefdbdb642e89b8f2b211ef9f5f00f50a466c05f0b6/sphinx_new_tab_link-0.2.3-py3-none-any.whl + hash: + sha256: 2321b633170d8e33acae8afb96b3d7d9a8b3f081271987ae12a53151e2a0ab56 + category: main + optional: false - name: sphinxcontrib-video version: 0.2.0 manager: pip diff --git a/monodocs-environment.yaml b/monodocs-environment.yaml index 82ce9868f1..988086cd0f 100644 --- a/monodocs-environment.yaml +++ b/monodocs-environment.yaml @@ -76,6 +76,7 @@ dependencies: - ray==2.6.3 - duckdb - aioboto3>=12.3.0 # aws sagemaker inference + - sphinx-new-tab-link platforms: - linux-64 From c81133bfc79e8eb2efb729a5f6e3f972195967e4 Mon Sep 17 00:00:00 2001 From: WenChih Lo Date: Thu, 28 Mar 2024 05:06:58 +0800 Subject: [PATCH 366/645] Fix separateGrpcIngress flag not working in flyte-binary helm chart (#4946) * [BUG] separateGrpcIngress flag not working in flyte-binary helm chart Signed-off-by: Ryan Lo * make helm Signed-off-by: Ryan Lo * revise Signed-off-by: Ryan Lo * separate service Signed-off-by: Ryan Lo * make helm Signed-off-by: Ryan Lo * update README.md Signed-off-by: Ryan Lo * move paths in values.yaml to _helpers.tpl Signed-off-by: Ryan Lo * remove anno Signed-off-by: Ryan Lo * fix doc Signed-off-by: Ryan Lo * set ingress.separateGrpcIngress true by default Signed-off-by: Ryan Lo --------- Signed-off-by: Ryan Lo Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- charts/flyte-binary/README.md | 1 + charts/flyte-binary/templates/_helpers.tpl | 18 +++ .../flyte-binary/templates/ingress/grpc.yaml | 103 +++--------------- .../flyte-binary/templates/ingress/http.yaml | 19 ++++ .../flyte-binary/templates/service/grpc.yaml | 2 + .../flyte-binary/templates/service/http.yaml | 10 ++ charts/flyte-binary/values.yaml | 2 + 7 files changed, 70 insertions(+), 85 deletions(-) diff --git a/charts/flyte-binary/README.md b/charts/flyte-binary/README.md index 99aa1c40b1..d7d50e092e 100644 --- a/charts/flyte-binary/README.md +++ b/charts/flyte-binary/README.md @@ -138,6 +138,7 @@ Chart for basic single Flyte executable deployment | ingress.httpTls | list | `[]` | | | ingress.ingressClassName | string | `""` | | | ingress.labels | object | `{}` | | +| ingress.separateGrpcIngress | bool | `true` | | | ingress.tls | list | `[]` | | | nameOverride | string | `""` | | | rbac.annotations | object | `{}` | | diff --git a/charts/flyte-binary/templates/_helpers.tpl b/charts/flyte-binary/templates/_helpers.tpl index 92e8fa4636..85184a45db 100644 --- a/charts/flyte-binary/templates/_helpers.tpl +++ b/charts/flyte-binary/templates/_helpers.tpl @@ -176,6 +176,24 @@ Get the Flyte service GRPC port. {{- default 8089 .Values.service.ports.grpc -}} {{- end -}} +{{/* +Get the Flyte service GRPC paths. +*/}} +{{- define "flyte-binary.ingress.grpcPaths" -}} +- /flyteidl.service.AdminService +- /flyteidl.service.AdminService/* +- /flyteidl.service.AuthMetadataService +- /flyteidl.service.AuthMetadataService/ +- /flyteidl.service.DataProxyService +- /flyteidl.service.DataProxyService/* +- /flyteidl.service.IdentityService +- /flyteidl.service.IdentityService/* +- /flyteidl.service.SignalService +- /flyteidl.service.SignalService/* +- /grpc.health.v1.Health +- /grpc.health.v1.Health/* +{{- end -}} + {{/* Get the Flyte agent service GRPC port. */}} diff --git a/charts/flyte-binary/templates/ingress/grpc.yaml b/charts/flyte-binary/templates/ingress/grpc.yaml index 427600336b..bd43185e50 100644 --- a/charts/flyte-binary/templates/ingress/grpc.yaml +++ b/charts/flyte-binary/templates/ingress/grpc.yaml @@ -1,4 +1,5 @@ -{{- if .Values.ingress.create }} +{{- if and .Values.ingress.create .Values.ingress.separateGrpcIngress }} +{{- $paths := (include "flyte-binary.ingress.grpcPaths" .) | fromYamlArray }} apiVersion: networking.k8s.io/v1 kind: Ingress metadata: @@ -38,90 +39,22 @@ spec: {{- if .Values.ingress.grpcExtraPaths.prepend }} {{- tpl ( .Values.ingress.grpcExtraPaths.prepend | toYaml ) . | nindent 6 }} {{- end }} - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /flyteidl.service.AdminService - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /flyteidl.service.AdminService/* - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /flyteidl.service.DataProxyService - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /flyteidl.service.DataProxyService/* - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /flyteidl.service.AuthMetadataService - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /flyteidl.service.AuthMetadataService/* - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /flyteidl.service.IdentityService - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /flyteidl.service.IdentityService/* - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /grpc.health.v1.Health - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /grpc.health.v1.Health/* - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /flyteidl.service.SignalService - pathType: ImplementationSpecific - - backend: - service: - name: {{ include "flyte-binary.service.grpc.name" . }} - port: - number: {{ include "flyte-binary.service.grpc.port" . }} - path: /flyteidl.service.SignalService/* - pathType: ImplementationSpecific + {{- range $path := $paths }} + - path: {{ $path }} + {{- if semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion }} + pathType: ImplementationSpecific + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ include "flyte-binary.service.grpc.name" $ }} + port: + number: {{ include "flyte-binary.service.grpc.port" $ }} + {{- else }} + serviceName: {{ include "flyte-binary.service.grpc.name" $ }} + servicePort: {{ include "flyte-binary.service.grpc.port" $ }} + {{- end }} + {{- end }} {{- if .Values.ingress.grpcExtraPaths.append }} {{- tpl ( .Values.ingress.grpcExtraPaths.append | toYaml ) . | nindent 6 }} {{- end }} diff --git a/charts/flyte-binary/templates/ingress/http.yaml b/charts/flyte-binary/templates/ingress/http.yaml index 5c2a7ad1c7..cdce87047b 100644 --- a/charts/flyte-binary/templates/ingress/http.yaml +++ b/charts/flyte-binary/templates/ingress/http.yaml @@ -171,6 +171,25 @@ spec: number: {{ include "flyte-binary.service.http.port" . }} path: /oauth2/* pathType: ImplementationSpecific + {{- if not .Values.ingress.separateGrpcIngress }} + {{- $paths := (include "flyte-binary.ingress.grpcPaths" .) | fromYamlArray }} + {{- range $path := $paths }} + - path: {{ $path }} + {{- if semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion }} + pathType: ImplementationSpecific + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ include "flyte-binary.service.http.name" $ }} + port: + number: {{ include "flyte-binary.service.grpc.port" $ }} + {{- else }} + serviceName: {{ include "flyte-binary.service.http.name" $ }} + servicePort: {{ include "flyte-binary.service.grpc.port" $ }} + {{- end }} + {{- end }} + {{- end }} {{- if .Values.ingress.httpExtraPaths.append }} {{- tpl ( .Values.ingress.httpExtraPaths.append | toYaml ) . | nindent 6 }} {{- end }} diff --git a/charts/flyte-binary/templates/service/grpc.yaml b/charts/flyte-binary/templates/service/grpc.yaml index eb8d3d0063..1feafa1c5c 100644 --- a/charts/flyte-binary/templates/service/grpc.yaml +++ b/charts/flyte-binary/templates/service/grpc.yaml @@ -1,3 +1,4 @@ +{{- if .Values.ingress.separateGrpcIngress }} apiVersion: v1 kind: Service metadata: @@ -47,3 +48,4 @@ spec: nodePort: null {{- end }} selector: {{- include "flyte-binary.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/charts/flyte-binary/templates/service/http.yaml b/charts/flyte-binary/templates/service/http.yaml index 189ea1e040..3b47e72340 100644 --- a/charts/flyte-binary/templates/service/http.yaml +++ b/charts/flyte-binary/templates/service/http.yaml @@ -46,6 +46,16 @@ spec: {{- else if eq .Values.service.type "ClusterIP" }} nodePort: null {{- end }} + {{- if not .Values.ingress.separateGrpcIngress }} + - name: grpc + port: {{ include "flyte-binary.service.grpc.port" . }} + targetPort: grpc + {{- if and (or (eq .Values.service.type "NodePort") (eq .Values.service.type "LoadBalancer")) (not (empty .Values.service.nodePorts.grpc)) }} + nodePort: {{ .Values.service.nodePorts.grpc }} + {{- else if eq .Values.service.type "ClusterIP" }} + nodePort: null + {{- end }} + {{- end }} {{- if .Values.service.extraPorts }} {{- tpl ( .Values.service.extraPorts | toYaml ) . | nindent 4 }} {{- end }} diff --git a/charts/flyte-binary/values.yaml b/charts/flyte-binary/values.yaml index f3f8e79528..2211e14f85 100644 --- a/charts/flyte-binary/values.yaml +++ b/charts/flyte-binary/values.yaml @@ -329,6 +329,8 @@ ingress: labels: {} # host Hostname to bind to ingress resources host: "" + # separateGrpcIngress Create a separate ingress resource for GRPC if true. Required for certain ingress controllers like nginx. + separateGrpcIngress: true # commonAnnotations Add common annotations to all ingress resources commonAnnotations: {} # httpAnnotations Add annotations to http ingress resource From 686ec8a287c31248a16228df985457044d2e6571 Mon Sep 17 00:00:00 2001 From: Chi-Sheng Liu Date: Thu, 28 Mar 2024 23:25:17 +0800 Subject: [PATCH 367/645] docs(contribute): Change go mod tidy to make go-tidy (#5131) --- docs/community/contribute.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/community/contribute.rst b/docs/community/contribute.rst index bb10031a9d..698762d691 100644 --- a/docs/community/contribute.rst +++ b/docs/community/contribute.rst @@ -397,7 +397,7 @@ that integrates all Flyte components into a single binary. # The version of each component/library used to build the single binary are defined in `go.mod`. sudo apt-get -y install jq # You may need to install jq make clean # (Optional) Run this only if you want to run the newest version of flyteconsole - go mod tidy + make go-tidy make compile # Step 3: Prepare a namespace template for the cluster resource controller. @@ -447,7 +447,7 @@ The following instructions provide guidance on how to build single binary with y cd flyte/flyteadmin # Step 3: Now, you can build the single binary. Go back to Flyte directory. - go mod tidy + make go-tidy make compile POD_NAMESPACE=flyte ./flyte start --config flyte-single-binary-local.yaml From 44c55f63df5b543d53328c81901457a24cb58cef Mon Sep 17 00:00:00 2001 From: Troy Chiu <114708546+troychiu@users.noreply.github.com> Date: Thu, 28 Mar 2024 11:10:23 -0700 Subject: [PATCH 368/645] Update admin endpoint to use port 30080 in config.yaml (#467) Signed-off-by: troychiu --- flytectl/config.yaml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/flytectl/config.yaml b/flytectl/config.yaml index c26a2e5aef..af21453aeb 100644 --- a/flytectl/config.yaml +++ b/flytectl/config.yaml @@ -1,6 +1,6 @@ admin: # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///localhost:30081 + endpoint: dns:///localhost:30080 insecure: true authType: Pkce console: @@ -8,14 +8,3 @@ console: logger: show-source: true level: 0 -storage: - connection: - access-key: minio - auth-type: accesskey - disable-ssl: true - endpoint: http://localhost:30084 - region: us-east-1 - secret-key: miniostorage - type: minio - container: "my-s3-bucket" - enable-multicontainer: true From 920fd6763a0ca9b399114071dea657ad25e37020 Mon Sep 17 00:00:00 2001 From: Troy Chiu <114708546+troychiu@users.noreply.github.com> Date: Thu, 28 Mar 2024 13:12:31 -0700 Subject: [PATCH 369/645] Fix execution phase (#5127) * Update phase field to use closure's phase Signed-off-by: troychiu * Update execution phase in testCreateExecutionModel Signed-off-by: troychiu * Remove unnecessary phase setting in execution model creation Signed-off-by: troychiu * fix test Signed-off-by: troychiu * Remove undefined phase when creating execution model Signed-off-by: troychiu --------- Signed-off-by: troychiu --- flyteadmin/pkg/manager/impl/execution_manager.go | 2 -- .../pkg/repositories/transformers/execution.go | 7 +------ .../repositories/transformers/execution_test.go | 16 ++++++---------- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/flyteadmin/pkg/manager/impl/execution_manager.go b/flyteadmin/pkg/manager/impl/execution_manager.go index e3fd87ba71..fb2e0d377c 100644 --- a/flyteadmin/pkg/manager/impl/execution_manager.go +++ b/flyteadmin/pkg/manager/impl/execution_manager.go @@ -617,7 +617,6 @@ func (m *ExecutionManager) launchSingleTaskExecution( TaskID: taskModel.ID, WorkflowID: workflowModel.ID, // The execution is not considered running until the propeller sends a specific event saying so. - Phase: core.WorkflowExecution_UNDEFINED, CreatedAt: m._clock.Now(), Notifications: notificationsSettings, WorkflowIdentifier: workflow.Id, @@ -1006,7 +1005,6 @@ func (m *ExecutionManager) launchExecutionAndPrepareModel( LaunchPlanID: launchPlanModel.ID, WorkflowID: launchPlanModel.WorkflowID, // The execution is not considered running until the propeller sends a specific event saying so. - Phase: core.WorkflowExecution_UNDEFINED, CreatedAt: m._clock.Now(), Notifications: notificationsSettings, WorkflowIdentifier: workflow.Id, diff --git a/flyteadmin/pkg/repositories/transformers/execution.go b/flyteadmin/pkg/repositories/transformers/execution.go index 368cd8e4bd..3b8c556abd 100644 --- a/flyteadmin/pkg/repositories/transformers/execution.go +++ b/flyteadmin/pkg/repositories/transformers/execution.go @@ -34,7 +34,6 @@ type CreateExecutionModelInput struct { LaunchPlanID uint WorkflowID uint TaskID uint - Phase core.WorkflowExecution_Phase CreatedAt time.Time Notifications []*admin.Notification WorkflowIdentifier *core.Identifier @@ -76,7 +75,6 @@ func CreateExecutionModel(input CreateExecutionModelInput) (*models.Execution, e } createdAt := timestamppb.New(input.CreatedAt) closure := admin.ExecutionClosure{ - Phase: input.Phase, CreatedAt: createdAt, UpdatedAt: createdAt, Notifications: input.Notifications, @@ -87,9 +85,6 @@ func CreateExecutionModel(input CreateExecutionModelInput) (*models.Execution, e OccurredAt: createdAt, }, } - if input.Phase == core.WorkflowExecution_RUNNING { - closure.StartedAt = createdAt - } if input.Error != nil { closure.Phase = core.WorkflowExecution_FAILED execErr := &core.ExecutionError{ @@ -128,7 +123,7 @@ func CreateExecutionModel(input CreateExecutionModelInput) (*models.Execution, e Name: input.WorkflowExecutionID.Name, }, Spec: spec, - Phase: input.Phase.String(), + Phase: closure.Phase.String(), Closure: closureBytes, WorkflowID: input.WorkflowID, ExecutionCreatedAt: &input.CreatedAt, diff --git a/flyteadmin/pkg/repositories/transformers/execution_test.go b/flyteadmin/pkg/repositories/transformers/execution_test.go index f3d0b41a5e..e9d12807f5 100644 --- a/flyteadmin/pkg/repositories/transformers/execution_test.go +++ b/flyteadmin/pkg/repositories/transformers/execution_test.go @@ -71,7 +71,7 @@ func TestCreateExecutionModel(t *testing.T) { }, } namespace := "ns" - t.Run("running", func(t *testing.T) { + t.Run("successful execution", func(t *testing.T) { execution, err := CreateExecutionModel(CreateExecutionModelInput{ WorkflowExecutionID: core.WorkflowExecutionIdentifier{ Project: "project", @@ -81,7 +81,6 @@ func TestCreateExecutionModel(t *testing.T) { RequestSpec: execRequest.Spec, LaunchPlanID: lpID, WorkflowID: wfID, - Phase: core.WorkflowExecution_RUNNING, CreatedAt: createdAt, WorkflowIdentifier: workflowIdentifier, ParentNodeExecutionID: nodeID, @@ -103,6 +102,7 @@ func TestCreateExecutionModel(t *testing.T) { assert.Equal(t, nodeID, execution.ParentNodeExecutionID) assert.Equal(t, sourceID, execution.SourceExecutionID) assert.Equal(t, "launch_plan", execution.LaunchEntity) + assert.Equal(t, execution.Phase, core.WorkflowExecution_UNDEFINED.String()) expectedSpec := execRequest.Spec expectedSpec.Metadata.Principal = principal expectedSpec.Metadata.SystemMetadata = &admin.SystemMetadata{ @@ -116,9 +116,8 @@ func TestCreateExecutionModel(t *testing.T) { expectedCreatedAt, _ := ptypes.TimestampProto(createdAt) expectedClosure, _ := proto.Marshal(&admin.ExecutionClosure{ - Phase: core.WorkflowExecution_RUNNING, + Phase: core.WorkflowExecution_UNDEFINED, CreatedAt: expectedCreatedAt, - StartedAt: expectedCreatedAt, UpdatedAt: expectedCreatedAt, WorkflowId: workflowIdentifier, StateChangeDetails: &admin.ExecutionStateChangeDetails{ @@ -140,7 +139,6 @@ func TestCreateExecutionModel(t *testing.T) { RequestSpec: execRequest.Spec, LaunchPlanID: lpID, WorkflowID: wfID, - Phase: core.WorkflowExecution_RUNNING, CreatedAt: createdAt, WorkflowIdentifier: workflowIdentifier, ParentNodeExecutionID: nodeID, @@ -163,6 +161,7 @@ func TestCreateExecutionModel(t *testing.T) { assert.Equal(t, nodeID, execution.ParentNodeExecutionID) assert.Equal(t, sourceID, execution.SourceExecutionID) assert.Equal(t, "launch_plan", execution.LaunchEntity) + assert.Equal(t, core.WorkflowExecution_FAILED.String(), execution.Phase) expectedSpec := execRequest.Spec expectedSpec.Metadata.Principal = principal expectedSpec.Metadata.SystemMetadata = &admin.SystemMetadata{ @@ -185,7 +184,6 @@ func TestCreateExecutionModel(t *testing.T) { }, }, CreatedAt: expectedCreatedAt, - StartedAt: expectedCreatedAt, UpdatedAt: expectedCreatedAt, WorkflowId: workflowIdentifier, StateChangeDetails: &admin.ExecutionStateChangeDetails{ @@ -207,7 +205,6 @@ func TestCreateExecutionModel(t *testing.T) { RequestSpec: execRequest.Spec, LaunchPlanID: lpID, WorkflowID: wfID, - Phase: core.WorkflowExecution_RUNNING, CreatedAt: createdAt, WorkflowIdentifier: workflowIdentifier, ParentNodeExecutionID: nodeID, @@ -230,6 +227,7 @@ func TestCreateExecutionModel(t *testing.T) { assert.Equal(t, nodeID, execution.ParentNodeExecutionID) assert.Equal(t, sourceID, execution.SourceExecutionID) assert.Equal(t, "launch_plan", execution.LaunchEntity) + assert.Equal(t, core.WorkflowExecution_FAILED.String(), execution.Phase) expectedSpec := execRequest.Spec expectedSpec.Metadata.Principal = principal expectedSpec.Metadata.SystemMetadata = &admin.SystemMetadata{ @@ -252,7 +250,6 @@ func TestCreateExecutionModel(t *testing.T) { }, }, CreatedAt: expectedCreatedAt, - StartedAt: expectedCreatedAt, UpdatedAt: expectedCreatedAt, WorkflowId: workflowIdentifier, StateChangeDetails: &admin.ExecutionStateChangeDetails{ @@ -274,7 +271,6 @@ func TestCreateExecutionModel(t *testing.T) { RequestSpec: execRequest.Spec, LaunchPlanID: lpID, WorkflowID: wfID, - Phase: core.WorkflowExecution_RUNNING, CreatedAt: createdAt, WorkflowIdentifier: workflowIdentifier, ParentNodeExecutionID: nodeID, @@ -297,6 +293,7 @@ func TestCreateExecutionModel(t *testing.T) { assert.Equal(t, nodeID, execution.ParentNodeExecutionID) assert.Equal(t, sourceID, execution.SourceExecutionID) assert.Equal(t, "launch_plan", execution.LaunchEntity) + assert.Equal(t, core.WorkflowExecution_FAILED.String(), execution.Phase) expectedSpec := execRequest.Spec expectedSpec.Metadata.Principal = principal expectedSpec.Metadata.SystemMetadata = &admin.SystemMetadata{ @@ -319,7 +316,6 @@ func TestCreateExecutionModel(t *testing.T) { }, }, CreatedAt: expectedCreatedAt, - StartedAt: expectedCreatedAt, UpdatedAt: expectedCreatedAt, WorkflowId: workflowIdentifier, StateChangeDetails: &admin.ExecutionStateChangeDetails{ From d4929cf0b753451b24873a411cfae62d36fd81d0 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Thu, 28 Mar 2024 13:33:44 -0700 Subject: [PATCH 370/645] Add trailing slash to compile make target (#4648) Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6eab674b17..9888303818 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ cmd/single/dist: .PHONY: compile compile: cmd/single/dist go build -tags console -v -o flyte -ldflags=$(LD_FLAGS) ./cmd/ - mv ./flyte ${GOPATH}/bin || echo "Skipped copying 'flyte' to ${GOPATH}/bin" + mv ./flyte ${GOPATH}/bin/ || echo "Skipped copying 'flyte' to ${GOPATH}/bin" .PHONY: linux_compile linux_compile: cmd/single/dist From c61d976c6f1d934d38afc3097a64f45f36b7c7ad Mon Sep 17 00:00:00 2001 From: Daniel Sola <40698988+dansola@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:17:36 -0700 Subject: [PATCH 371/645] Change retry error from RuntimeError to FlyteRecoverableException (#5128) * Change retry error from RuntimeError to FlyteRecoverableException Signed-off-by: Daniel Sola * add fault-tolerance header Signed-off-by: Daniel Sola * add blank line Signed-off-by: Daniel Sola --------- Signed-off-by: Daniel Sola Co-authored-by: Daniel Sola --- docs/concepts/tasks.rst | 2 ++ docs/flyte_fundamentals/optimizing_tasks.md | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/concepts/tasks.rst b/docs/concepts/tasks.rst index 94807d3632..8e5cc7aaec 100644 --- a/docs/concepts/tasks.rst +++ b/docs/concepts/tasks.rst @@ -71,6 +71,8 @@ types in the system. Flyte has a set of defined, battle-tested task types. It al Inherent Features ----------------- +.. _fault-tolerance: + Fault tolerance ^^^^^^^^^^^^^^^ diff --git a/docs/flyte_fundamentals/optimizing_tasks.md b/docs/flyte_fundamentals/optimizing_tasks.md index 9f3124e270..00b3c693f1 100644 --- a/docs/flyte_fundamentals/optimizing_tasks.md +++ b/docs/flyte_fundamentals/optimizing_tasks.md @@ -66,12 +66,13 @@ import random @task(retries=3) def compute_mean(data: List[float]) -> float: if random() < 0.05: - raise RuntimeError("Something bad happened 🔥") + raise FlyteRecoverableException("Something bad happened 🔥") return sum(data) / len(data) ``` ```{note} -Retries only take effect when running a task on a Flyte cluster. +Retries only take effect when running a task on a Flyte cluster. +See {ref}`Fault Tolerance ` for details on the types of errors that will be retried. ``` ## Timeouts From 8bb5b8c276646e74877cab7ba6f5e0798264ad34 Mon Sep 17 00:00:00 2001 From: ByronHsu Date: Thu, 28 Mar 2024 22:32:50 -0700 Subject: [PATCH 372/645] Adapt ray flyteplugin to Kuberay 1.1.0 (#5067) * keep only v1 and support both base64 and yaml Signed-off-by: Pin-Lun Hsu * spelling Signed-off-by: Pin-Lun Hsu * revert Signed-off-by: Pin-Lun Hsu * lint flyteplugin Signed-off-by: Pin-Lun Hsu * update comment Signed-off-by: Pin-Lun Hsu * address comments Signed-off-by: Pin-Lun Hsu * tidy admin Signed-off-by: Pin-Lun Hsu * kevin comment Signed-off-by: Pin-Lun Hsu * maybe the test is flaky Signed-off-by: Pin-Lun Hsu --------- Signed-off-by: Pin-Lun Hsu Co-authored-by: Pin-Lun Hsu --- flyte-single-binary-local.yaml | 4 +- flyteadmin/go.mod | 8 +- flyteadmin/go.sum | 10 +- flyteidl/gen/pb-es/flyteidl/plugins/ray_pb.ts | 12 +- flyteidl/gen/pb-go/flyteidl/plugins/ray.pb.go | 154 +++++---- .../gen/pb_python/flyteidl/plugins/ray_pb2.py | 26 +- .../pb_python/flyteidl/plugins/ray_pb2.pyi | 6 +- flyteidl/gen/pb_rust/flyteidl.plugins.rs | 5 + flyteidl/protos/flyteidl/plugins/ray.proto | 5 +- flyteplugins/go.mod | 17 +- flyteplugins/go.sum | 25 +- .../go/tasks/plugins/k8s/ray/config.go | 2 - flyteplugins/go/tasks/plugins/k8s/ray/ray.go | 322 ++++-------------- .../go/tasks/plugins/k8s/ray/ray_test.go | 121 ++----- flytepropeller/go.mod | 13 +- flytepropeller/go.sum | 36 +- go.mod | 13 +- go.sum | 20 +- 18 files changed, 297 insertions(+), 502 deletions(-) diff --git a/flyte-single-binary-local.yaml b/flyte-single-binary-local.yaml index bd8964da35..0597009854 100644 --- a/flyte-single-binary-local.yaml +++ b/flyte-single-binary-local.yaml @@ -91,5 +91,5 @@ task_resources: cpu: 500m memory: 500Mi limits: - cpu: 800m - memory: 800Mi + cpu: 4 + memory: 4Gi diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index 18f7b2eaf9..f11ff78e91 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -60,9 +60,9 @@ require ( gorm.io/driver/sqlite v1.5.4 gorm.io/gorm v1.25.4 gorm.io/plugin/opentelemetry v0.1.4 - k8s.io/api v0.28.3 - k8s.io/apimachinery v0.28.3 - k8s.io/client-go v0.28.3 + k8s.io/api v0.28.4 + k8s.io/apimachinery v0.28.4 + k8s.io/client-go v0.28.4 sigs.k8s.io/controller-runtime v0.16.3 ) @@ -198,7 +198,7 @@ require ( gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.28.0 // indirect + k8s.io/apiextensions-apiserver v0.28.4 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index 6e6479957a..c79dbf363f 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -1024,8 +1024,8 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1991,14 +1991,14 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= -k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= +k8s.io/apiextensions-apiserver v0.28.4 h1:AZpKY/7wQ8n+ZYDtNHbAJBb+N4AXXJvyZx6ww6yAJvU= +k8s.io/apiextensions-apiserver v0.28.4/go.mod h1:pgQIZ1U8eJSMQcENew/0ShUTlePcSGFq6dxSxf2mwPM= k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= -k8s.io/component-base v0.28.1 h1:LA4AujMlK2mr0tZbQDZkjWbdhTV5bRyEyAFe0TJxlWg= -k8s.io/component-base v0.28.1/go.mod h1:jI11OyhbX21Qtbav7JkhehyBsIRfnO8oEgoAR12ArIU= +k8s.io/component-base v0.28.4 h1:c/iQLWPdUgI90O+T9TeECg8o7N3YJTiuz2sKxILYcYo= +k8s.io/component-base v0.28.4/go.mod h1:m9hR0uvqXDybiGL2nf/3Lf0MerAfQXzkfWhUY58JUbU= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f h1:eeEUOoGYWhOz7EyXqhlR2zHKNw2mNJ9vzJmub6YN6kk= diff --git a/flyteidl/gen/pb-es/flyteidl/plugins/ray_pb.ts b/flyteidl/gen/pb-es/flyteidl/plugins/ray_pb.ts index 289b24404c..10877bcb42 100644 --- a/flyteidl/gen/pb-es/flyteidl/plugins/ray_pb.ts +++ b/flyteidl/gen/pb-es/flyteidl/plugins/ray_pb.ts @@ -23,7 +23,8 @@ export class RayJob extends Message { * runtime_env is base64 encoded. * Ray runtime environments: https://docs.ray.io/en/latest/ray-core/handling-dependencies.html#runtime-environments * - * @generated from field: string runtime_env = 2; + * @generated from field: string runtime_env = 2 [deprecated = true]; + * @deprecated */ runtimeEnv = ""; @@ -41,6 +42,14 @@ export class RayJob extends Message { */ ttlSecondsAfterFinished = 0; + /** + * RuntimeEnvYAML represents the runtime environment configuration + * provided as a multi-line YAML string. + * + * @generated from field: string runtime_env_yaml = 5; + */ + runtimeEnvYaml = ""; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -53,6 +62,7 @@ export class RayJob extends Message { { no: 2, name: "runtime_env", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 3, name: "shutdown_after_job_finishes", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, { no: 4, name: "ttl_seconds_after_finished", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, + { no: 5, name: "runtime_env_yaml", kind: "scalar", T: 9 /* ScalarType.STRING */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): RayJob { diff --git a/flyteidl/gen/pb-go/flyteidl/plugins/ray.pb.go b/flyteidl/gen/pb-go/flyteidl/plugins/ray.pb.go index 8e4483fabc..d0f072db51 100644 --- a/flyteidl/gen/pb-go/flyteidl/plugins/ray.pb.go +++ b/flyteidl/gen/pb-go/flyteidl/plugins/ray.pb.go @@ -30,11 +30,16 @@ type RayJob struct { RayCluster *RayCluster `protobuf:"bytes,1,opt,name=ray_cluster,json=rayCluster,proto3" json:"ray_cluster,omitempty"` // runtime_env is base64 encoded. // Ray runtime environments: https://docs.ray.io/en/latest/ray-core/handling-dependencies.html#runtime-environments + // + // Deprecated: Marked as deprecated in flyteidl/plugins/ray.proto. RuntimeEnv string `protobuf:"bytes,2,opt,name=runtime_env,json=runtimeEnv,proto3" json:"runtime_env,omitempty"` // shutdown_after_job_finishes specifies whether the RayCluster should be deleted after the RayJob finishes. ShutdownAfterJobFinishes bool `protobuf:"varint,3,opt,name=shutdown_after_job_finishes,json=shutdownAfterJobFinishes,proto3" json:"shutdown_after_job_finishes,omitempty"` // ttl_seconds_after_finished specifies the number of seconds after which the RayCluster will be deleted after the RayJob finishes. TtlSecondsAfterFinished int32 `protobuf:"varint,4,opt,name=ttl_seconds_after_finished,json=ttlSecondsAfterFinished,proto3" json:"ttl_seconds_after_finished,omitempty"` + // RuntimeEnvYAML represents the runtime environment configuration + // provided as a multi-line YAML string. + RuntimeEnvYaml string `protobuf:"bytes,5,opt,name=runtime_env_yaml,json=runtimeEnvYaml,proto3" json:"runtime_env_yaml,omitempty"` } func (x *RayJob) Reset() { @@ -76,6 +81,7 @@ func (x *RayJob) GetRayCluster() *RayCluster { return nil } +// Deprecated: Marked as deprecated in flyteidl/plugins/ray.proto. func (x *RayJob) GetRuntimeEnv() string { if x != nil { return x.RuntimeEnv @@ -97,6 +103,13 @@ func (x *RayJob) GetTtlSecondsAfterFinished() int32 { return 0 } +func (x *RayJob) GetRuntimeEnvYaml() string { + if x != nil { + return x.RuntimeEnvYaml + } + return "" +} + // Define Ray cluster defines the desired state of RayCluster type RayCluster struct { state protoimpl.MessageState @@ -305,79 +318,82 @@ var File_flyteidl_plugins_ray_proto protoreflect.FileDescriptor var file_flyteidl_plugins_ray_proto_rawDesc = []byte{ 0x0a, 0x1a, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x6c, - 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0xe4, - 0x01, 0x0a, 0x06, 0x52, 0x61, 0x79, 0x4a, 0x6f, 0x62, 0x12, 0x3d, 0x0a, 0x0b, 0x72, 0x61, 0x79, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0x92, + 0x02, 0x0a, 0x06, 0x52, 0x61, 0x79, 0x4a, 0x6f, 0x62, 0x12, 0x3d, 0x0a, 0x0b, 0x72, 0x61, 0x79, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x52, 0x61, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x72, 0x61, - 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x76, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x76, 0x12, 0x3d, 0x0a, 0x1b, 0x73, 0x68, 0x75, - 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, - 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, - 0x73, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x66, 0x74, 0x65, 0x72, 0x4a, 0x6f, 0x62, - 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x1a, 0x74, 0x74, 0x6c, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x74, 0x74, - 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x41, 0x66, 0x74, 0x65, 0x72, 0x46, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x22, 0xd3, 0x01, 0x0a, 0x0a, 0x52, 0x61, 0x79, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, - 0x2e, 0x48, 0x65, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, - 0x68, 0x65, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4d, 0x0a, - 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, - 0x69, 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0f, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2d, 0x0a, 0x12, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0xb1, 0x01, 0x0a, 0x0d, - 0x48, 0x65, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x5d, 0x0a, - 0x10, 0x72, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, - 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x61, - 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x41, 0x0a, 0x13, + 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x76, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, + 0x01, 0x52, 0x0a, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x76, 0x12, 0x3d, 0x0a, + 0x1b, 0x73, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, + 0x6a, 0x6f, 0x62, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x18, 0x73, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x66, 0x74, 0x65, + 0x72, 0x4a, 0x6f, 0x62, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x1a, + 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x17, 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x41, 0x66, 0x74, 0x65, + 0x72, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x76, 0x59, + 0x61, 0x6d, 0x6c, 0x22, 0xd3, 0x01, 0x0a, 0x0a, 0x52, 0x61, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x68, 0x65, + 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4d, 0x0a, 0x11, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, + 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x75, + 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0xb1, 0x01, 0x0a, 0x0d, 0x48, 0x65, + 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x5d, 0x0a, 0x10, 0x72, + 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, + 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x61, 0x79, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x61, + 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x02, + 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x21, 0x0a, 0x0c, + 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x72, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x66, + 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xb6, 0x02, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x72, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, - 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, - 0x63, 0x2e, 0x52, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0xc0, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, - 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x73, 0x42, 0x08, 0x52, 0x61, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x6f, - 0x72, 0x67, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, - 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x6c, 0x79, 0x74, - 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0xa2, 0x02, 0x03, 0x46, - 0x50, 0x58, 0xaa, 0x02, 0x10, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x50, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0xca, 0x02, 0x10, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, - 0x5c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0xe2, 0x02, 0x1c, 0x46, 0x6c, 0x79, 0x74, 0x65, - 0x69, 0x64, 0x6c, 0x5c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, - 0x64, 0x6c, 0x3a, 0x3a, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0xc0, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x66, + 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x42, + 0x08, 0x52, 0x61, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x6f, 0x72, 0x67, + 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, + 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0xa2, 0x02, 0x03, 0x46, 0x50, 0x58, + 0xaa, 0x02, 0x10, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x73, 0xca, 0x02, 0x10, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0xe2, 0x02, 0x1c, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, + 0x6c, 0x5c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, + 0x3a, 0x3a, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/flyteidl/gen/pb_python/flyteidl/plugins/ray_pb2.py b/flyteidl/gen/pb_python/flyteidl/plugins/ray_pb2.py index 1c5de3b666..af809dcfcd 100644 --- a/flyteidl/gen/pb_python/flyteidl/plugins/ray_pb2.py +++ b/flyteidl/gen/pb_python/flyteidl/plugins/ray_pb2.py @@ -13,7 +13,7 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x66lyteidl/plugins/ray.proto\x12\x10\x66lyteidl.plugins\"\xe4\x01\n\x06RayJob\x12=\n\x0bray_cluster\x18\x01 \x01(\x0b\x32\x1c.flyteidl.plugins.RayClusterR\nrayCluster\x12\x1f\n\x0bruntime_env\x18\x02 \x01(\tR\nruntimeEnv\x12=\n\x1bshutdown_after_job_finishes\x18\x03 \x01(\x08R\x18shutdownAfterJobFinishes\x12;\n\x1attl_seconds_after_finished\x18\x04 \x01(\x05R\x17ttlSecondsAfterFinished\"\xd3\x01\n\nRayCluster\x12G\n\x0fhead_group_spec\x18\x01 \x01(\x0b\x32\x1f.flyteidl.plugins.HeadGroupSpecR\rheadGroupSpec\x12M\n\x11worker_group_spec\x18\x02 \x03(\x0b\x32!.flyteidl.plugins.WorkerGroupSpecR\x0fworkerGroupSpec\x12-\n\x12\x65nable_autoscaling\x18\x03 \x01(\x08R\x11\x65nableAutoscaling\"\xb1\x01\n\rHeadGroupSpec\x12]\n\x10ray_start_params\x18\x01 \x03(\x0b\x32\x33.flyteidl.plugins.HeadGroupSpec.RayStartParamsEntryR\x0erayStartParams\x1a\x41\n\x13RayStartParamsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"\xb6\x02\n\x0fWorkerGroupSpec\x12\x1d\n\ngroup_name\x18\x01 \x01(\tR\tgroupName\x12\x1a\n\x08replicas\x18\x02 \x01(\x05R\x08replicas\x12!\n\x0cmin_replicas\x18\x03 \x01(\x05R\x0bminReplicas\x12!\n\x0cmax_replicas\x18\x04 \x01(\x05R\x0bmaxReplicas\x12_\n\x10ray_start_params\x18\x05 \x03(\x0b\x32\x35.flyteidl.plugins.WorkerGroupSpec.RayStartParamsEntryR\x0erayStartParams\x1a\x41\n\x13RayStartParamsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\xc0\x01\n\x14\x63om.flyteidl.pluginsB\x08RayProtoP\x01Z=github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/plugins\xa2\x02\x03\x46PX\xaa\x02\x10\x46lyteidl.Plugins\xca\x02\x10\x46lyteidl\\Plugins\xe2\x02\x1c\x46lyteidl\\Plugins\\GPBMetadata\xea\x02\x11\x46lyteidl::Pluginsb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x66lyteidl/plugins/ray.proto\x12\x10\x66lyteidl.plugins\"\x92\x02\n\x06RayJob\x12=\n\x0bray_cluster\x18\x01 \x01(\x0b\x32\x1c.flyteidl.plugins.RayClusterR\nrayCluster\x12#\n\x0bruntime_env\x18\x02 \x01(\tB\x02\x18\x01R\nruntimeEnv\x12=\n\x1bshutdown_after_job_finishes\x18\x03 \x01(\x08R\x18shutdownAfterJobFinishes\x12;\n\x1attl_seconds_after_finished\x18\x04 \x01(\x05R\x17ttlSecondsAfterFinished\x12(\n\x10runtime_env_yaml\x18\x05 \x01(\tR\x0eruntimeEnvYaml\"\xd3\x01\n\nRayCluster\x12G\n\x0fhead_group_spec\x18\x01 \x01(\x0b\x32\x1f.flyteidl.plugins.HeadGroupSpecR\rheadGroupSpec\x12M\n\x11worker_group_spec\x18\x02 \x03(\x0b\x32!.flyteidl.plugins.WorkerGroupSpecR\x0fworkerGroupSpec\x12-\n\x12\x65nable_autoscaling\x18\x03 \x01(\x08R\x11\x65nableAutoscaling\"\xb1\x01\n\rHeadGroupSpec\x12]\n\x10ray_start_params\x18\x01 \x03(\x0b\x32\x33.flyteidl.plugins.HeadGroupSpec.RayStartParamsEntryR\x0erayStartParams\x1a\x41\n\x13RayStartParamsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"\xb6\x02\n\x0fWorkerGroupSpec\x12\x1d\n\ngroup_name\x18\x01 \x01(\tR\tgroupName\x12\x1a\n\x08replicas\x18\x02 \x01(\x05R\x08replicas\x12!\n\x0cmin_replicas\x18\x03 \x01(\x05R\x0bminReplicas\x12!\n\x0cmax_replicas\x18\x04 \x01(\x05R\x0bmaxReplicas\x12_\n\x10ray_start_params\x18\x05 \x03(\x0b\x32\x35.flyteidl.plugins.WorkerGroupSpec.RayStartParamsEntryR\x0erayStartParams\x1a\x41\n\x13RayStartParamsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\xc0\x01\n\x14\x63om.flyteidl.pluginsB\x08RayProtoP\x01Z=github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/plugins\xa2\x02\x03\x46PX\xaa\x02\x10\x46lyteidl.Plugins\xca\x02\x10\x46lyteidl\\Plugins\xe2\x02\x1c\x46lyteidl\\Plugins\\GPBMetadata\xea\x02\x11\x46lyteidl::Pluginsb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -22,20 +22,22 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\024com.flyteidl.pluginsB\010RayProtoP\001Z=github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/plugins\242\002\003FPX\252\002\020Flyteidl.Plugins\312\002\020Flyteidl\\Plugins\342\002\034Flyteidl\\Plugins\\GPBMetadata\352\002\021Flyteidl::Plugins' + _RAYJOB.fields_by_name['runtime_env']._options = None + _RAYJOB.fields_by_name['runtime_env']._serialized_options = b'\030\001' _HEADGROUPSPEC_RAYSTARTPARAMSENTRY._options = None _HEADGROUPSPEC_RAYSTARTPARAMSENTRY._serialized_options = b'8\001' _WORKERGROUPSPEC_RAYSTARTPARAMSENTRY._options = None _WORKERGROUPSPEC_RAYSTARTPARAMSENTRY._serialized_options = b'8\001' _globals['_RAYJOB']._serialized_start=49 - _globals['_RAYJOB']._serialized_end=277 - _globals['_RAYCLUSTER']._serialized_start=280 - _globals['_RAYCLUSTER']._serialized_end=491 - _globals['_HEADGROUPSPEC']._serialized_start=494 - _globals['_HEADGROUPSPEC']._serialized_end=671 - _globals['_HEADGROUPSPEC_RAYSTARTPARAMSENTRY']._serialized_start=606 - _globals['_HEADGROUPSPEC_RAYSTARTPARAMSENTRY']._serialized_end=671 - _globals['_WORKERGROUPSPEC']._serialized_start=674 - _globals['_WORKERGROUPSPEC']._serialized_end=984 - _globals['_WORKERGROUPSPEC_RAYSTARTPARAMSENTRY']._serialized_start=606 - _globals['_WORKERGROUPSPEC_RAYSTARTPARAMSENTRY']._serialized_end=671 + _globals['_RAYJOB']._serialized_end=323 + _globals['_RAYCLUSTER']._serialized_start=326 + _globals['_RAYCLUSTER']._serialized_end=537 + _globals['_HEADGROUPSPEC']._serialized_start=540 + _globals['_HEADGROUPSPEC']._serialized_end=717 + _globals['_HEADGROUPSPEC_RAYSTARTPARAMSENTRY']._serialized_start=652 + _globals['_HEADGROUPSPEC_RAYSTARTPARAMSENTRY']._serialized_end=717 + _globals['_WORKERGROUPSPEC']._serialized_start=720 + _globals['_WORKERGROUPSPEC']._serialized_end=1030 + _globals['_WORKERGROUPSPEC_RAYSTARTPARAMSENTRY']._serialized_start=652 + _globals['_WORKERGROUPSPEC_RAYSTARTPARAMSENTRY']._serialized_end=717 # @@protoc_insertion_point(module_scope) diff --git a/flyteidl/gen/pb_python/flyteidl/plugins/ray_pb2.pyi b/flyteidl/gen/pb_python/flyteidl/plugins/ray_pb2.pyi index 15c78912bd..81d7382063 100644 --- a/flyteidl/gen/pb_python/flyteidl/plugins/ray_pb2.pyi +++ b/flyteidl/gen/pb_python/flyteidl/plugins/ray_pb2.pyi @@ -6,16 +6,18 @@ from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Map DESCRIPTOR: _descriptor.FileDescriptor class RayJob(_message.Message): - __slots__ = ["ray_cluster", "runtime_env", "shutdown_after_job_finishes", "ttl_seconds_after_finished"] + __slots__ = ["ray_cluster", "runtime_env", "shutdown_after_job_finishes", "ttl_seconds_after_finished", "runtime_env_yaml"] RAY_CLUSTER_FIELD_NUMBER: _ClassVar[int] RUNTIME_ENV_FIELD_NUMBER: _ClassVar[int] SHUTDOWN_AFTER_JOB_FINISHES_FIELD_NUMBER: _ClassVar[int] TTL_SECONDS_AFTER_FINISHED_FIELD_NUMBER: _ClassVar[int] + RUNTIME_ENV_YAML_FIELD_NUMBER: _ClassVar[int] ray_cluster: RayCluster runtime_env: str shutdown_after_job_finishes: bool ttl_seconds_after_finished: int - def __init__(self, ray_cluster: _Optional[_Union[RayCluster, _Mapping]] = ..., runtime_env: _Optional[str] = ..., shutdown_after_job_finishes: bool = ..., ttl_seconds_after_finished: _Optional[int] = ...) -> None: ... + runtime_env_yaml: str + def __init__(self, ray_cluster: _Optional[_Union[RayCluster, _Mapping]] = ..., runtime_env: _Optional[str] = ..., shutdown_after_job_finishes: bool = ..., ttl_seconds_after_finished: _Optional[int] = ..., runtime_env_yaml: _Optional[str] = ...) -> None: ... class RayCluster(_message.Message): __slots__ = ["head_group_spec", "worker_group_spec", "enable_autoscaling"] diff --git a/flyteidl/gen/pb_rust/flyteidl.plugins.rs b/flyteidl/gen/pb_rust/flyteidl.plugins.rs index bfed40f1a8..0903d1c71a 100644 --- a/flyteidl/gen/pb_rust/flyteidl.plugins.rs +++ b/flyteidl/gen/pb_rust/flyteidl.plugins.rs @@ -173,6 +173,7 @@ pub struct RayJob { pub ray_cluster: ::core::option::Option, /// runtime_env is base64 encoded. /// Ray runtime environments: + #[deprecated] #[prost(string, tag="2")] pub runtime_env: ::prost::alloc::string::String, /// shutdown_after_job_finishes specifies whether the RayCluster should be deleted after the RayJob finishes. @@ -181,6 +182,10 @@ pub struct RayJob { /// ttl_seconds_after_finished specifies the number of seconds after which the RayCluster will be deleted after the RayJob finishes. #[prost(int32, tag="4")] pub ttl_seconds_after_finished: i32, + /// RuntimeEnvYAML represents the runtime environment configuration + /// provided as a multi-line YAML string. + #[prost(string, tag="5")] + pub runtime_env_yaml: ::prost::alloc::string::String, } /// Define Ray cluster defines the desired state of RayCluster #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/flyteidl/protos/flyteidl/plugins/ray.proto b/flyteidl/protos/flyteidl/plugins/ray.proto index 1afcee8d93..c20c6360e7 100644 --- a/flyteidl/protos/flyteidl/plugins/ray.proto +++ b/flyteidl/protos/flyteidl/plugins/ray.proto @@ -10,11 +10,14 @@ message RayJob { RayCluster ray_cluster = 1; // runtime_env is base64 encoded. // Ray runtime environments: https://docs.ray.io/en/latest/ray-core/handling-dependencies.html#runtime-environments - string runtime_env = 2; + string runtime_env = 2 [deprecated = true]; // shutdown_after_job_finishes specifies whether the RayCluster should be deleted after the RayJob finishes. bool shutdown_after_job_finishes = 3; // ttl_seconds_after_finished specifies the number of seconds after which the RayCluster will be deleted after the RayJob finishes. int32 ttl_seconds_after_finished = 4; + // RuntimeEnvYAML represents the runtime environment configuration + // provided as a multi-line YAML string. + string runtime_env_yaml = 5; } // Define Ray cluster defines the desired state of RayCluster diff --git a/flyteplugins/go.mod b/flyteplugins/go.mod index d63a84a673..aaea909afe 100644 --- a/flyteplugins/go.mod +++ b/flyteplugins/go.mod @@ -22,7 +22,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.16.0 - github.com/ray-project/kuberay/ray-operator v1.0.0 + github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e @@ -31,12 +31,13 @@ require ( google.golang.org/api v0.155.0 google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.32.0 + gopkg.in/yaml.v2 v2.4.0 gotest.tools v2.2.0+incompatible - k8s.io/api v0.28.2 - k8s.io/apimachinery v0.28.2 - k8s.io/client-go v0.28.1 + k8s.io/api v0.28.4 + k8s.io/apimachinery v0.28.4 + k8s.io/client-go v0.28.4 k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 - sigs.k8s.io/controller-runtime v0.12.1 + sigs.k8s.io/controller-runtime v0.16.3 ) require ( @@ -60,7 +61,7 @@ require ( github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect @@ -128,14 +129,16 @@ require ( golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/apiextensions-apiserver v0.28.4 // indirect + k8s.io/component-base v0.28.4 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/flyteplugins/go.sum b/flyteplugins/go.sum index 98f87376f7..52dca0b0cc 100644 --- a/flyteplugins/go.sum +++ b/flyteplugins/go.sum @@ -122,8 +122,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -323,7 +323,6 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= @@ -349,8 +348,8 @@ github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdO github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/ray-project/kuberay/ray-operator v1.0.0 h1:i69nvbV7az2FG41VHQgxrmhD+SUl8ca+ek4RPbSE2Q0= -github.com/ray-project/kuberay/ray-operator v1.0.0/go.mod h1:7C7ebIkxtkmOX8w1iiLrKM1j4hkZs/Guzm3WdePk/yg= +github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1 h1:skD8MXnQMO3QGUeTKt09VOXvuch/gJh8+6q3OLm0kAQ= +github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1/go.mod h1:ZqyKKvMP5nKDldQoKmur+Wcx7wVlV9Q98phFqHzr+KY= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= @@ -418,6 +417,8 @@ go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6 go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= @@ -468,8 +469,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -799,16 +798,16 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= -k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= +k8s.io/apiextensions-apiserver v0.28.4 h1:AZpKY/7wQ8n+ZYDtNHbAJBb+N4AXXJvyZx6ww6yAJvU= +k8s.io/apiextensions-apiserver v0.28.4/go.mod h1:pgQIZ1U8eJSMQcENew/0ShUTlePcSGFq6dxSxf2mwPM= k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= -k8s.io/code-generator v0.24.1 h1:zS+dvmUNaOcvsQ4faV9hXNjsKG9/pQaLnts1Wma4RM8= -k8s.io/code-generator v0.24.1/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.28.1 h1:LA4AujMlK2mr0tZbQDZkjWbdhTV5bRyEyAFe0TJxlWg= -k8s.io/component-base v0.28.1/go.mod h1:jI11OyhbX21Qtbav7JkhehyBsIRfnO8oEgoAR12ArIU= +k8s.io/code-generator v0.28.4 h1:tcOSNIZQvuAvXhOwpbuJkKbAABJQeyCcQBCN/3uI18c= +k8s.io/code-generator v0.28.4/go.mod h1:OQAfl6bZikQ/tK6faJ18Vyzo54rUII2NmjurHyiN1g4= +k8s.io/component-base v0.28.4 h1:c/iQLWPdUgI90O+T9TeECg8o7N3YJTiuz2sKxILYcYo= +k8s.io/component-base v0.28.4/go.mod h1:m9hR0uvqXDybiGL2nf/3Lf0MerAfQXzkfWhUY58JUbU= k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f h1:eeEUOoGYWhOz7EyXqhlR2zHKNw2mNJ9vzJmub6YN6kk= diff --git a/flyteplugins/go/tasks/plugins/k8s/ray/config.go b/flyteplugins/go/tasks/plugins/k8s/ray/config.go index 045f8a09a1..9a05f98f25 100644 --- a/flyteplugins/go/tasks/plugins/k8s/ray/config.go +++ b/flyteplugins/go/tasks/plugins/k8s/ray/config.go @@ -22,7 +22,6 @@ var ( IncludeDashboard: true, DashboardHost: "0.0.0.0", EnableUsageStats: false, - KubeRayCrdVersion: "v1alpha1", ServiceAccount: "default", Defaults: DefaultConfig{ HeadNode: NodeConfig{ @@ -87,7 +86,6 @@ type Config struct { DashboardURLTemplate *tasklog.TemplateLogPlugin `json:"dashboardURLTemplate" pflag:"-,Template for URL of Ray dashboard running on a head node."` Defaults DefaultConfig `json:"defaults" pflag:"-,Default configuration for ray jobs"` EnableUsageStats bool `json:"enableUsageStats" pflag:",Enable usage stats for ray jobs. These stats are submitted to usage-stats.ray.io per https://docs.ray.io/en/latest/cluster/usage-stats.html"` - KubeRayCrdVersion string `json:"kubeRayCrdVersion" pflag:",Version of the Ray CRD to use when creating RayClusters or RayJobs."` ServiceAccount string `json:"serviceAccount" pflag:",The k8s service account to run as"` } diff --git a/flyteplugins/go/tasks/plugins/k8s/ray/ray.go b/flyteplugins/go/tasks/plugins/k8s/ray/ray.go index bc34753425..869b9abd9e 100644 --- a/flyteplugins/go/tasks/plugins/k8s/ray/ray.go +++ b/flyteplugins/go/tasks/plugins/k8s/ray/ray.go @@ -2,6 +2,8 @@ package ray import ( "context" + "encoding/base64" + "encoding/json" "fmt" "regexp" "strconv" @@ -9,7 +11,7 @@ import ( "time" rayv1 "github.com/ray-project/kuberay/ray-operator/apis/ray/v1" - rayv1alpha1 "github.com/ray-project/kuberay/ray-operator/apis/ray/v1alpha1" + "gopkg.in/yaml.v2" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/scheme" @@ -54,7 +56,7 @@ func (rayJobResourceHandler) GetProperties() k8s.PluginProperties { return k8s.PluginProperties{} } -// BuildResource Creates a new ray job resource for v1 or v1alpha1. +// BuildResource Creates a new ray job resource func (rayJobResourceHandler) BuildResource(ctx context.Context, taskCtx pluginsCore.TaskExecutionContext) (client.Object, error) { taskTemplate, err := taskCtx.TaskReader().Read(ctx) if err != nil { @@ -90,7 +92,7 @@ func (rayJobResourceHandler) BuildResource(ctx context.Context, taskCtx pluginsC } cfg := GetConfig() - headReplicas := int32(1) + headNodeRayStartParams := make(map[string]string) if rayJob.RayCluster.HeadGroupSpec != nil && rayJob.RayCluster.HeadGroupSpec.RayStartParams != nil { headNodeRayStartParams = rayJob.RayCluster.HeadGroupSpec.RayStartParams @@ -118,112 +120,12 @@ func (rayJobResourceHandler) BuildResource(ctx context.Context, taskCtx pluginsC headPodSpec := podSpec.DeepCopy() - if cfg.KubeRayCrdVersion == "v1" { - return constructV1Job(taskCtx, rayJob, objectMeta, *podSpec, headPodSpec, headReplicas, headNodeRayStartParams, primaryContainerIdx, *primaryContainer), nil - } - - return constructV1Alpha1Job(taskCtx, rayJob, objectMeta, *podSpec, headPodSpec, headReplicas, headNodeRayStartParams, primaryContainerIdx, *primaryContainer), nil + rayjob, err := constructRayJob(taskCtx, rayJob, objectMeta, *podSpec, headPodSpec, headNodeRayStartParams, primaryContainerIdx, *primaryContainer) + return rayjob, err } -func constructV1Alpha1Job(taskCtx pluginsCore.TaskExecutionContext, rayJob plugins.RayJob, objectMeta *metav1.ObjectMeta, podSpec v1.PodSpec, headPodSpec *v1.PodSpec, headReplicas int32, headNodeRayStartParams map[string]string, primaryContainerIdx int, primaryContainer v1.Container) *rayv1alpha1.RayJob { - enableIngress := true - cfg := GetConfig() - rayClusterSpec := rayv1alpha1.RayClusterSpec{ - HeadGroupSpec: rayv1alpha1.HeadGroupSpec{ - Template: buildHeadPodTemplate( - &headPodSpec.Containers[primaryContainerIdx], - headPodSpec, - objectMeta, - taskCtx, - ), - ServiceType: v1.ServiceType(cfg.ServiceType), - Replicas: &headReplicas, - EnableIngress: &enableIngress, - RayStartParams: headNodeRayStartParams, - }, - WorkerGroupSpecs: []rayv1alpha1.WorkerGroupSpec{}, - EnableInTreeAutoscaling: &rayJob.RayCluster.EnableAutoscaling, - } - - for _, spec := range rayJob.RayCluster.WorkerGroupSpec { - workerPodSpec := podSpec.DeepCopy() - workerPodTemplate := buildWorkerPodTemplate( - &workerPodSpec.Containers[primaryContainerIdx], - workerPodSpec, - objectMeta, - taskCtx, - ) - - workerNodeRayStartParams := make(map[string]string) - if spec.RayStartParams != nil { - workerNodeRayStartParams = spec.RayStartParams - } else if workerNode := cfg.Defaults.WorkerNode; len(workerNode.StartParameters) > 0 { - workerNodeRayStartParams = workerNode.StartParameters - } - - if _, exist := workerNodeRayStartParams[NodeIPAddress]; !exist { - workerNodeRayStartParams[NodeIPAddress] = cfg.Defaults.WorkerNode.IPAddress - } - - if _, exists := workerNodeRayStartParams[DisableUsageStatsStartParameter]; !exists && !cfg.EnableUsageStats { - workerNodeRayStartParams[DisableUsageStatsStartParameter] = DisableUsageStatsStartParameterVal - } - - minReplicas := spec.MinReplicas - if minReplicas > spec.Replicas { - minReplicas = spec.Replicas - } - maxReplicas := spec.MaxReplicas - if maxReplicas < spec.Replicas { - maxReplicas = spec.Replicas - } - - workerNodeSpec := rayv1alpha1.WorkerGroupSpec{ - GroupName: spec.GroupName, - MinReplicas: &minReplicas, - MaxReplicas: &maxReplicas, - Replicas: &spec.Replicas, - RayStartParams: workerNodeRayStartParams, - Template: workerPodTemplate, - } - - rayClusterSpec.WorkerGroupSpecs = append(rayClusterSpec.WorkerGroupSpecs, workerNodeSpec) - } - - serviceAccountName := flytek8s.GetServiceAccountNameFromTaskExecutionMetadata(taskCtx.TaskExecutionMetadata()) - - rayClusterSpec.HeadGroupSpec.Template.Spec.ServiceAccountName = serviceAccountName - for index := range rayClusterSpec.WorkerGroupSpecs { - rayClusterSpec.WorkerGroupSpecs[index].Template.Spec.ServiceAccountName = serviceAccountName - } - - shutdownAfterJobFinishes := cfg.ShutdownAfterJobFinishes - ttlSecondsAfterFinished := &cfg.TTLSecondsAfterFinished - if rayJob.ShutdownAfterJobFinishes { - shutdownAfterJobFinishes = true - ttlSecondsAfterFinished = &rayJob.TtlSecondsAfterFinished - } - - jobSpec := rayv1alpha1.RayJobSpec{ - RayClusterSpec: &rayClusterSpec, - Entrypoint: strings.Join(primaryContainer.Args, " "), - ShutdownAfterJobFinishes: shutdownAfterJobFinishes, - TTLSecondsAfterFinished: ttlSecondsAfterFinished, - RuntimeEnv: rayJob.RuntimeEnv, - } - - return &rayv1alpha1.RayJob{ - TypeMeta: metav1.TypeMeta{ - Kind: KindRayJob, - APIVersion: rayv1alpha1.SchemeGroupVersion.String(), - }, - Spec: jobSpec, - ObjectMeta: *objectMeta, - } -} - -func constructV1Job(taskCtx pluginsCore.TaskExecutionContext, rayJob plugins.RayJob, objectMeta *metav1.ObjectMeta, podSpec v1.PodSpec, headPodSpec *v1.PodSpec, headReplicas int32, headNodeRayStartParams map[string]string, primaryContainerIdx int, primaryContainer v1.Container) *rayv1.RayJob { +func constructRayJob(taskCtx pluginsCore.TaskExecutionContext, rayJob plugins.RayJob, objectMeta *metav1.ObjectMeta, podSpec v1.PodSpec, headPodSpec *v1.PodSpec, headNodeRayStartParams map[string]string, primaryContainerIdx int, primaryContainer v1.Container) (*rayv1.RayJob, error) { enableIngress := true cfg := GetConfig() rayClusterSpec := rayv1.RayClusterSpec{ @@ -235,7 +137,6 @@ func constructV1Job(taskCtx pluginsCore.TaskExecutionContext, rayJob plugins.Ray taskCtx, ), ServiceType: v1.ServiceType(cfg.ServiceType), - Replicas: &headReplicas, EnableIngress: &enableIngress, RayStartParams: headNodeRayStartParams, }, @@ -304,23 +205,58 @@ func constructV1Job(taskCtx pluginsCore.TaskExecutionContext, rayJob plugins.Ray submitterPodTemplate := buildSubmitterPodTemplate(headPodSpec, objectMeta, taskCtx) + // TODO: This is for backward compatibility. Remove this block once runtime_env is removed from ray proto. + var err error + var runtimeEnvYaml string + runtimeEnvYaml = rayJob.RuntimeEnvYaml + // If runtime_env exists but runtime_env_yaml does not, convert runtime_env to runtime_env_yaml + if rayJob.RuntimeEnv != "" && rayJob.RuntimeEnvYaml == "" { + runtimeEnvYaml, err = convertBase64RuntimeEnvToYaml(rayJob.RuntimeEnv) + if err != nil { + return nil, err + } + } + jobSpec := rayv1.RayJobSpec{ RayClusterSpec: &rayClusterSpec, Entrypoint: strings.Join(primaryContainer.Args, " "), ShutdownAfterJobFinishes: shutdownAfterJobFinishes, - TTLSecondsAfterFinished: ttlSecondsAfterFinished, - RuntimeEnv: rayJob.RuntimeEnv, + TTLSecondsAfterFinished: *ttlSecondsAfterFinished, + RuntimeEnvYAML: runtimeEnvYaml, SubmitterPodTemplate: &submitterPodTemplate, } return &rayv1.RayJob{ TypeMeta: metav1.TypeMeta{ Kind: KindRayJob, - APIVersion: rayv1alpha1.SchemeGroupVersion.String(), + APIVersion: rayv1.SchemeGroupVersion.String(), }, Spec: jobSpec, ObjectMeta: *objectMeta, + }, nil +} + +func convertBase64RuntimeEnvToYaml(s string) (string, error) { + // Decode from base64 + data, err := base64.StdEncoding.DecodeString(s) + if err != nil { + return "", err + } + + // Unmarshal JSON + var obj map[string]interface{} + err = json.Unmarshal(data, &obj) + if err != nil { + return "", err + } + + // Convert to YAML + y, err := yaml.Marshal(&obj) + if err != nil { + return "", err } + + return string(y), nil } func injectLogsSidecar(primaryContainer *v1.Container, podSpec *v1.PodSpec) { @@ -563,71 +499,15 @@ func buildWorkerPodTemplate(primaryContainer *v1.Container, podSpec *v1.PodSpec, } func (rayJobResourceHandler) BuildIdentityResource(ctx context.Context, taskCtx pluginsCore.TaskExecutionMetadata) (client.Object, error) { - return &rayv1alpha1.RayJob{ + return &rayv1.RayJob{ TypeMeta: metav1.TypeMeta{ Kind: KindRayJob, - APIVersion: rayv1alpha1.SchemeGroupVersion.String(), + APIVersion: rayv1.SchemeGroupVersion.String(), }, }, nil } -func getEventInfoForRayJob(logConfig logs.LogConfig, pluginContext k8s.PluginContext, rayJob *rayv1alpha1.RayJob) (*pluginsCore.TaskInfo, error) { - logPlugin, err := logs.InitializeLogPlugins(&logConfig) - if err != nil { - return nil, fmt.Errorf("failed to initialize log plugins. Error: %w", err) - } - - var taskLogs []*core.TaskLog - - taskExecID := pluginContext.TaskExecutionMetadata().GetTaskExecutionID() - input := tasklog.Input{ - Namespace: rayJob.Namespace, - TaskExecutionID: taskExecID, - ExtraTemplateVars: []tasklog.TemplateVar{}, - } - if rayJob.Status.JobId != "" { - input.ExtraTemplateVars = append( - input.ExtraTemplateVars, - tasklog.TemplateVar{ - Regex: logTemplateRegexes.RayJobID, - Value: rayJob.Status.JobId, - }, - ) - } - if rayJob.Status.RayClusterName != "" { - input.ExtraTemplateVars = append( - input.ExtraTemplateVars, - tasklog.TemplateVar{ - Regex: logTemplateRegexes.RayClusterName, - Value: rayJob.Status.RayClusterName, - }, - ) - } - - // TODO: Retrieve the name of head pod from rayJob.status, and add it to task logs - // RayJob CRD does not include the name of the worker or head pod for now - logOutput, err := logPlugin.GetTaskLogs(input) - if err != nil { - return nil, fmt.Errorf("failed to generate task logs. Error: %w", err) - } - taskLogs = append(taskLogs, logOutput.TaskLogs...) - - // Handling for Ray Dashboard - dashboardURLTemplate := GetConfig().DashboardURLTemplate - if dashboardURLTemplate != nil && - rayJob.Status.DashboardURL != "" && - rayJob.Status.JobStatus == rayv1alpha1.JobStatusRunning { - dashboardURLOutput, err := dashboardURLTemplate.GetTaskLogs(input) - if err != nil { - return nil, fmt.Errorf("failed to generate Ray dashboard link. Error: %w", err) - } - taskLogs = append(taskLogs, dashboardURLOutput.TaskLogs...) - } - - return &pluginsCore.TaskInfo{Logs: taskLogs}, nil -} - -func getEventInfoForRayJobV1(logConfig logs.LogConfig, pluginContext k8s.PluginContext, rayJob *rayv1.RayJob) (*pluginsCore.TaskInfo, error) { +func getEventInfoForRayJob(logConfig logs.LogConfig, pluginContext k8s.PluginContext, rayJob *rayv1.RayJob) (*pluginsCore.TaskInfo, error) { logPlugin, err := logs.InitializeLogPlugins(&logConfig) if err != nil { return nil, fmt.Errorf("failed to initialize log plugins. Error: %w", err) @@ -684,69 +564,7 @@ func getEventInfoForRayJobV1(logConfig logs.LogConfig, pluginContext k8s.PluginC } func (plugin rayJobResourceHandler) GetTaskPhase(ctx context.Context, pluginContext k8s.PluginContext, resource client.Object) (pluginsCore.PhaseInfo, error) { - crdVersion := GetConfig().KubeRayCrdVersion - if crdVersion == "v1" { - return plugin.GetTaskPhaseV1(ctx, pluginContext, resource) - } - - return plugin.GetTaskPhaseV1Alpha1(ctx, pluginContext, resource) -} - -func (plugin rayJobResourceHandler) GetTaskPhaseV1(ctx context.Context, pluginContext k8s.PluginContext, resource client.Object) (pluginsCore.PhaseInfo, error) { rayJob := resource.(*rayv1.RayJob) - info, err := getEventInfoForRayJobV1(GetConfig().Logs, pluginContext, rayJob) - if err != nil { - return pluginsCore.PhaseInfoUndefined, err - } - - if len(rayJob.Status.JobDeploymentStatus) == 0 { - return pluginsCore.PhaseInfoQueued(time.Now(), pluginsCore.DefaultPhaseVersion, "Scheduling"), nil - } - - // KubeRay creates a Ray cluster first, and then submits a Ray job to the cluster - switch rayJob.Status.JobDeploymentStatus { - case rayv1.JobDeploymentStatusInitializing: - return pluginsCore.PhaseInfoInitializing(rayJob.CreationTimestamp.Time, pluginsCore.DefaultPhaseVersion, "cluster is creating", info), nil - case rayv1.JobDeploymentStatusFailedToGetOrCreateRayCluster: - reason := fmt.Sprintf("Failed to create Ray cluster %s with error: %s", rayJob.Name, rayJob.Status.Message) - return pluginsCore.PhaseInfoFailure(flyteerr.TaskFailedWithError, reason, info), nil - case rayv1.JobDeploymentStatusFailedJobDeploy: - reason := fmt.Sprintf("Failed to submit Ray job %s with error: %s", rayJob.Name, rayJob.Status.Message) - return pluginsCore.PhaseInfoFailure(flyteerr.TaskFailedWithError, reason, info), nil - // JobDeploymentStatusSuspended is used when the suspend flag is set in rayJob. The suspend flag allows the temporary suspension of a Job's execution, which can be resumed later. - // Certain versions of KubeRay use a K8s job to submit a Ray job to the Ray cluster. JobDeploymentStatusWaitForK8sJob indicates that the K8s job is under creation. - case rayv1.JobDeploymentStatusWaitForDashboard, rayv1.JobDeploymentStatusFailedToGetJobStatus, rayv1.JobDeploymentStatusWaitForDashboardReady, rayv1.JobDeploymentStatusWaitForK8sJob, rayv1.JobDeploymentStatusSuspended: - return pluginsCore.PhaseInfoRunning(pluginsCore.DefaultPhaseVersion, info), nil - case rayv1.JobDeploymentStatusRunning, rayv1.JobDeploymentStatusComplete: - switch rayJob.Status.JobStatus { - case rayv1.JobStatusFailed: - reason := fmt.Sprintf("Failed to run Ray job %s with error: %s", rayJob.Name, rayJob.Status.Message) - return pluginsCore.PhaseInfoFailure(flyteerr.TaskFailedWithError, reason, info), nil - case rayv1.JobStatusSucceeded: - return pluginsCore.PhaseInfoSuccess(info), nil - // JobStatusStopped can occur when the suspend flag is set in rayJob. - case rayv1.JobStatusPending, rayv1.JobStatusStopped: - return pluginsCore.PhaseInfoRunning(pluginsCore.DefaultPhaseVersion, info), nil - case rayv1.JobStatusRunning: - phaseInfo := pluginsCore.PhaseInfoRunning(pluginsCore.DefaultPhaseVersion, info) - if len(info.Logs) > 0 { - phaseInfo = phaseInfo.WithVersion(pluginsCore.DefaultPhaseVersion + 1) - } - return phaseInfo, nil - default: - // We already handle all known job status, so this should never happen unless a future version of ray - // introduced a new job status. - return pluginsCore.PhaseInfoUndefined, fmt.Errorf("unknown job status: %s", rayJob.Status.JobStatus) - } - default: - // We already handle all known deployment status, so this should never happen unless a future version of ray - // introduced a new job status. - return pluginsCore.PhaseInfoUndefined, fmt.Errorf("unknown job deployment status: %s", rayJob.Status.JobDeploymentStatus) - } -} - -func (plugin rayJobResourceHandler) GetTaskPhaseV1Alpha1(ctx context.Context, pluginContext k8s.PluginContext, resource client.Object) (pluginsCore.PhaseInfo, error) { - rayJob := resource.(*rayv1alpha1.RayJob) info, err := getEventInfoForRayJob(GetConfig().Logs, pluginContext, rayJob) if err != nil { return pluginsCore.PhaseInfoUndefined, err @@ -758,39 +576,15 @@ func (plugin rayJobResourceHandler) GetTaskPhaseV1Alpha1(ctx context.Context, pl // KubeRay creates a Ray cluster first, and then submits a Ray job to the cluster switch rayJob.Status.JobDeploymentStatus { - case rayv1alpha1.JobDeploymentStatusInitializing: + case rayv1.JobDeploymentStatusInitializing: return pluginsCore.PhaseInfoInitializing(rayJob.CreationTimestamp.Time, pluginsCore.DefaultPhaseVersion, "cluster is creating", info), nil - case rayv1alpha1.JobDeploymentStatusFailedToGetOrCreateRayCluster: - reason := fmt.Sprintf("Failed to create Ray cluster %s with error: %s", rayJob.Name, rayJob.Status.Message) - return pluginsCore.PhaseInfoFailure(flyteerr.TaskFailedWithError, reason, info), nil - case rayv1alpha1.JobDeploymentStatusFailedJobDeploy: - reason := fmt.Sprintf("Failed to submit Ray job %s with error: %s", rayJob.Name, rayJob.Status.Message) - return pluginsCore.PhaseInfoFailure(flyteerr.TaskFailedWithError, reason, info), nil - // JobDeploymentStatusSuspended is used when the suspend flag is set in rayJob. The suspend flag allows the temporary suspension of a Job's execution, which can be resumed later. - // Certain versions of KubeRay use a K8s job to submit a Ray job to the Ray cluster. JobDeploymentStatusWaitForK8sJob indicates that the K8s job is under creation. - case rayv1alpha1.JobDeploymentStatusWaitForDashboard, rayv1alpha1.JobDeploymentStatusFailedToGetJobStatus, rayv1alpha1.JobDeploymentStatusWaitForDashboardReady, rayv1alpha1.JobDeploymentStatusWaitForK8sJob, rayv1alpha1.JobDeploymentStatusSuspended: + case rayv1.JobDeploymentStatusRunning: return pluginsCore.PhaseInfoRunning(pluginsCore.DefaultPhaseVersion, info), nil - case rayv1alpha1.JobDeploymentStatusRunning, rayv1alpha1.JobDeploymentStatusComplete: - switch rayJob.Status.JobStatus { - case rayv1alpha1.JobStatusFailed: - reason := fmt.Sprintf("Failed to run Ray job %s with error: %s", rayJob.Name, rayJob.Status.Message) - return pluginsCore.PhaseInfoFailure(flyteerr.TaskFailedWithError, reason, info), nil - case rayv1alpha1.JobStatusSucceeded: - return pluginsCore.PhaseInfoSuccess(info), nil - // JobStatusStopped can occur when the suspend flag is set in rayJob. - case rayv1alpha1.JobStatusPending, rayv1alpha1.JobStatusStopped: - return pluginsCore.PhaseInfoRunning(pluginsCore.DefaultPhaseVersion, info), nil - case rayv1alpha1.JobStatusRunning: - phaseInfo := pluginsCore.PhaseInfoRunning(pluginsCore.DefaultPhaseVersion, info) - if len(info.Logs) > 0 { - phaseInfo = phaseInfo.WithVersion(pluginsCore.DefaultPhaseVersion + 1) - } - return phaseInfo, nil - default: - // We already handle all known job status, so this should never happen unless a future version of ray - // introduced a new job status. - return pluginsCore.PhaseInfoUndefined, fmt.Errorf("unknown job status: %s", rayJob.Status.JobStatus) - } + case rayv1.JobDeploymentStatusComplete: + return pluginsCore.PhaseInfoSuccess(info), nil + case rayv1.JobDeploymentStatusFailed: + failInfo := fmt.Sprintf("Failed to run Ray job %s with error: [%s] %s", rayJob.Name, rayJob.Status.Reason, rayJob.Status.Message) + return pluginsCore.PhaseInfoFailure(flyteerr.TaskFailedWithError, failInfo, info), nil default: // We already handle all known deployment status, so this should never happen unless a future version of ray // introduced a new job status. @@ -799,7 +593,7 @@ func (plugin rayJobResourceHandler) GetTaskPhaseV1Alpha1(ctx context.Context, pl } func init() { - if err := rayv1alpha1.AddToScheme(scheme.Scheme); err != nil { + if err := rayv1.AddToScheme(scheme.Scheme); err != nil { panic(err) } @@ -807,7 +601,7 @@ func init() { k8s.PluginEntry{ ID: rayTaskType, RegisteredTaskTypes: []pluginsCore.TaskType{rayTaskType}, - ResourceToWatch: &rayv1alpha1.RayJob{}, + ResourceToWatch: &rayv1.RayJob{}, Plugin: rayJobResourceHandler{}, IsDefault: false, CustomKubeClient: func(ctx context.Context) (pluginsCore.KubeClient, error) { diff --git a/flyteplugins/go/tasks/plugins/k8s/ray/ray_test.go b/flyteplugins/go/tasks/plugins/k8s/ray/ray_test.go index 69f65c19ef..cb69e883c2 100644 --- a/flyteplugins/go/tasks/plugins/k8s/ray/ray_test.go +++ b/flyteplugins/go/tasks/plugins/k8s/ray/ray_test.go @@ -7,7 +7,6 @@ import ( structpb "github.com/golang/protobuf/ptypes/struct" rayv1 "github.com/ray-project/kuberay/ray-operator/apis/ray/v1" - rayv1alpha1 "github.com/ray-project/kuberay/ray-operator/apis/ray/v1alpha1" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" corev1 "k8s.io/api/core/v1" @@ -180,15 +179,13 @@ func TestBuildResourceRay(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, RayResource) - ray, ok := RayResource.(*rayv1alpha1.RayJob) + ray, ok := RayResource.(*rayv1.RayJob) assert.True(t, ok) assert.Equal(t, *ray.Spec.RayClusterSpec.EnableInTreeAutoscaling, true) assert.Equal(t, ray.Spec.ShutdownAfterJobFinishes, true) - assert.Equal(t, *ray.Spec.TTLSecondsAfterFinished, int32(120)) + assert.Equal(t, ray.Spec.TTLSecondsAfterFinished, int32(120)) - headReplica := int32(1) - assert.Equal(t, *ray.Spec.RayClusterSpec.HeadGroupSpec.Replicas, headReplica) assert.Equal(t, ray.Spec.RayClusterSpec.HeadGroupSpec.Template.Spec.ServiceAccountName, serviceAccount) assert.Equal(t, ray.Spec.RayClusterSpec.HeadGroupSpec.RayStartParams, map[string]string{ @@ -247,7 +244,7 @@ func TestBuildResourceRayContainerImage(t *testing.T) { r, err := rayJobResourceHandler.BuildResource(context.TODO(), taskContext) assert.Nil(t, err) assert.NotNil(t, r) - rayJob, ok := r.(*rayv1alpha1.RayJob) + rayJob, ok := r.(*rayv1.RayJob) assert.True(t, ok) var expectedContainerImage string @@ -378,7 +375,7 @@ func TestBuildResourceRayExtendedResources(t *testing.T) { r, err := rayJobResourceHandler.BuildResource(context.TODO(), taskContext) assert.Nil(t, err) assert.NotNil(t, r) - rayJob, ok := r.(*rayv1alpha1.RayJob) + rayJob, ok := r.(*rayv1.RayJob) assert.True(t, ok) // Head node @@ -436,15 +433,13 @@ func TestDefaultStartParameters(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, RayResource) - ray, ok := RayResource.(*rayv1alpha1.RayJob) + ray, ok := RayResource.(*rayv1.RayJob) assert.True(t, ok) assert.Equal(t, *ray.Spec.RayClusterSpec.EnableInTreeAutoscaling, true) assert.Equal(t, ray.Spec.ShutdownAfterJobFinishes, true) - assert.Equal(t, *ray.Spec.TTLSecondsAfterFinished, int32(120)) + assert.Equal(t, ray.Spec.TTLSecondsAfterFinished, int32(120)) - headReplica := int32(1) - assert.Equal(t, *ray.Spec.RayClusterSpec.HeadGroupSpec.Replicas, headReplica) assert.Equal(t, ray.Spec.RayClusterSpec.HeadGroupSpec.Template.Spec.ServiceAccountName, serviceAccount) assert.Equal(t, ray.Spec.RayClusterSpec.HeadGroupSpec.RayStartParams, map[string]string{ @@ -645,7 +640,7 @@ func TestInjectLogsSidecar(t *testing.T) { r, err := rayJobResourceHandler.BuildResource(context.TODO(), taskContext) assert.Nil(t, err) assert.NotNil(t, r) - rayJob, ok := r.(*rayv1alpha1.RayJob) + rayJob, ok := r.(*rayv1.RayJob) assert.True(t, ok) headPodSpec := rayJob.Spec.RayClusterSpec.HeadGroupSpec.Template.Spec @@ -727,78 +722,24 @@ func TestGetTaskPhase(t *testing.T) { pluginCtx := newPluginContext() testCases := []struct { - rayJobPhase rayv1alpha1.JobStatus - rayClusterPhase rayv1alpha1.JobDeploymentStatus + rayJobPhase rayv1.JobDeploymentStatus expectedCorePhase pluginsCore.Phase expectedError bool }{ - {"", rayv1alpha1.JobDeploymentStatusInitializing, pluginsCore.PhaseInitializing, false}, - {rayv1alpha1.JobStatusPending, rayv1alpha1.JobDeploymentStatusFailedToGetOrCreateRayCluster, pluginsCore.PhasePermanentFailure, false}, - {rayv1alpha1.JobStatusPending, rayv1alpha1.JobDeploymentStatusWaitForDashboard, pluginsCore.PhaseRunning, false}, - {rayv1alpha1.JobStatusPending, rayv1alpha1.JobDeploymentStatusWaitForDashboardReady, pluginsCore.PhaseRunning, false}, - {rayv1alpha1.JobStatusPending, rayv1alpha1.JobDeploymentStatusWaitForK8sJob, pluginsCore.PhaseRunning, false}, - {rayv1alpha1.JobStatusPending, rayv1alpha1.JobDeploymentStatusFailedJobDeploy, pluginsCore.PhasePermanentFailure, false}, - {rayv1alpha1.JobStatusPending, rayv1alpha1.JobDeploymentStatusRunning, pluginsCore.PhaseRunning, false}, - {rayv1alpha1.JobStatusPending, rayv1alpha1.JobDeploymentStatusFailedToGetJobStatus, pluginsCore.PhaseRunning, false}, - {rayv1alpha1.JobStatusRunning, rayv1alpha1.JobDeploymentStatusRunning, pluginsCore.PhaseRunning, false}, - {rayv1alpha1.JobStatusFailed, rayv1alpha1.JobDeploymentStatusRunning, pluginsCore.PhasePermanentFailure, false}, - {rayv1alpha1.JobStatusSucceeded, rayv1alpha1.JobDeploymentStatusRunning, pluginsCore.PhaseSuccess, false}, - {rayv1alpha1.JobStatusSucceeded, rayv1alpha1.JobDeploymentStatusComplete, pluginsCore.PhaseSuccess, false}, - {rayv1alpha1.JobStatusStopped, rayv1alpha1.JobDeploymentStatusSuspended, pluginsCore.PhaseRunning, false}, - } - - for _, tc := range testCases { - t.Run("TestGetTaskPhase_"+string(tc.rayJobPhase), func(t *testing.T) { - rayObject := &rayv1alpha1.RayJob{} - rayObject.Status.JobStatus = tc.rayJobPhase - rayObject.Status.JobDeploymentStatus = tc.rayClusterPhase - startTime := metav1.NewTime(time.Now()) - rayObject.Status.StartTime = &startTime - phaseInfo, err := rayJobResourceHandler.GetTaskPhase(ctx, pluginCtx, rayObject) - if tc.expectedError { - assert.Error(t, err) - } else { - assert.Nil(t, err) - } - assert.Equal(t, tc.expectedCorePhase.String(), phaseInfo.Phase().String()) - }) - } -} - -func TestGetTaskPhase_V1(t *testing.T) { - ctx := context.Background() - rayJobResourceHandler := rayJobResourceHandler{} - pluginCtx := newPluginContext() - - testCases := []struct { - rayJobPhase rayv1.JobStatus - rayClusterPhase rayv1.JobDeploymentStatus - expectedCorePhase pluginsCore.Phase - expectedError bool - }{ - {"", rayv1.JobDeploymentStatusInitializing, pluginsCore.PhaseInitializing, false}, - {rayv1.JobStatusPending, rayv1.JobDeploymentStatusFailedToGetOrCreateRayCluster, pluginsCore.PhasePermanentFailure, false}, - {rayv1.JobStatusPending, rayv1.JobDeploymentStatusWaitForDashboard, pluginsCore.PhaseRunning, false}, - {rayv1.JobStatusPending, rayv1.JobDeploymentStatusWaitForDashboardReady, pluginsCore.PhaseRunning, false}, - {rayv1.JobStatusPending, rayv1.JobDeploymentStatusWaitForK8sJob, pluginsCore.PhaseRunning, false}, - {rayv1.JobStatusPending, rayv1.JobDeploymentStatusFailedJobDeploy, pluginsCore.PhasePermanentFailure, false}, - {rayv1.JobStatusPending, rayv1.JobDeploymentStatusRunning, pluginsCore.PhaseRunning, false}, - {rayv1.JobStatusPending, rayv1.JobDeploymentStatusFailedToGetJobStatus, pluginsCore.PhaseRunning, false}, - {rayv1.JobStatusRunning, rayv1.JobDeploymentStatusRunning, pluginsCore.PhaseRunning, false}, - {rayv1.JobStatusFailed, rayv1.JobDeploymentStatusRunning, pluginsCore.PhasePermanentFailure, false}, - {rayv1.JobStatusSucceeded, rayv1.JobDeploymentStatusRunning, pluginsCore.PhaseSuccess, false}, - {rayv1.JobStatusSucceeded, rayv1.JobDeploymentStatusComplete, pluginsCore.PhaseSuccess, false}, - {rayv1.JobStatusStopped, rayv1.JobDeploymentStatusSuspended, pluginsCore.PhaseRunning, false}, + {rayv1.JobDeploymentStatusInitializing, pluginsCore.PhaseInitializing, false}, + {rayv1.JobDeploymentStatusRunning, pluginsCore.PhaseRunning, false}, + {rayv1.JobDeploymentStatusComplete, pluginsCore.PhaseSuccess, false}, + {rayv1.JobDeploymentStatusFailed, pluginsCore.PhasePermanentFailure, false}, + {rayv1.JobDeploymentStatusSuspended, pluginsCore.PhaseUndefined, true}, } for _, tc := range testCases { t.Run("TestGetTaskPhase_"+string(tc.rayJobPhase), func(t *testing.T) { rayObject := &rayv1.RayJob{} - rayObject.Status.JobStatus = tc.rayJobPhase - rayObject.Status.JobDeploymentStatus = tc.rayClusterPhase + rayObject.Status.JobDeploymentStatus = tc.rayJobPhase startTime := metav1.NewTime(time.Now()) rayObject.Status.StartTime = &startTime - phaseInfo, err := rayJobResourceHandler.GetTaskPhaseV1(ctx, pluginCtx, rayObject) + phaseInfo, err := rayJobResourceHandler.GetTaskPhase(ctx, pluginCtx, rayObject) if tc.expectedError { assert.Error(t, err) } else { @@ -813,13 +754,13 @@ func TestGetEventInfo_LogTemplates(t *testing.T) { pluginCtx := newPluginContext() testCases := []struct { name string - rayJob rayv1alpha1.RayJob + rayJob rayv1.RayJob logPlugin tasklog.TemplateLogPlugin expectedTaskLogs []*core.TaskLog }{ { name: "namespace", - rayJob: rayv1alpha1.RayJob{ + rayJob: rayv1.RayJob{ ObjectMeta: metav1.ObjectMeta{ Namespace: "test-namespace", }, @@ -837,7 +778,7 @@ func TestGetEventInfo_LogTemplates(t *testing.T) { }, { name: "task execution ID", - rayJob: rayv1alpha1.RayJob{}, + rayJob: rayv1.RayJob{}, logPlugin: tasklog.TemplateLogPlugin{ DisplayName: "taskExecID", TemplateURIs: []tasklog.TemplateURI{ @@ -853,11 +794,11 @@ func TestGetEventInfo_LogTemplates(t *testing.T) { }, { name: "ray cluster name", - rayJob: rayv1alpha1.RayJob{ + rayJob: rayv1.RayJob{ ObjectMeta: metav1.ObjectMeta{ Namespace: "test-namespace", }, - Status: rayv1alpha1.RayJobStatus{ + Status: rayv1.RayJobStatus{ RayClusterName: "ray-cluster", }, }, @@ -874,11 +815,11 @@ func TestGetEventInfo_LogTemplates(t *testing.T) { }, { name: "ray job ID", - rayJob: rayv1alpha1.RayJob{ + rayJob: rayv1.RayJob{ ObjectMeta: metav1.ObjectMeta{ Namespace: "test-namespace", }, - Status: rayv1alpha1.RayJobStatus{ + Status: rayv1.RayJobStatus{ JobId: "ray-job-1", }, }, @@ -996,7 +937,7 @@ func TestGetEventInfo_LogTemplates_V1(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - ti, err := getEventInfoForRayJobV1( + ti, err := getEventInfoForRayJob( logs.LogConfig{Templates: []tasklog.TemplateLogPlugin{tc.logPlugin}}, pluginCtx, &tc.rayJob, @@ -1011,16 +952,16 @@ func TestGetEventInfo_DashboardURL(t *testing.T) { pluginCtx := newPluginContext() testCases := []struct { name string - rayJob rayv1alpha1.RayJob + rayJob rayv1.RayJob dashboardURLTemplate tasklog.TemplateLogPlugin expectedTaskLogs []*core.TaskLog }{ { name: "dashboard URL displayed", - rayJob: rayv1alpha1.RayJob{ - Status: rayv1alpha1.RayJobStatus{ + rayJob: rayv1.RayJob{ + Status: rayv1.RayJobStatus{ DashboardURL: "exists", - JobStatus: rayv1alpha1.JobStatusRunning, + JobStatus: rayv1.JobStatusRunning, }, }, dashboardURLTemplate: tasklog.TemplateLogPlugin{ @@ -1036,9 +977,9 @@ func TestGetEventInfo_DashboardURL(t *testing.T) { }, { name: "dashboard URL is not displayed", - rayJob: rayv1alpha1.RayJob{ - Status: rayv1alpha1.RayJobStatus{ - JobStatus: rayv1alpha1.JobStatusPending, + rayJob: rayv1.RayJob{ + Status: rayv1.RayJobStatus{ + JobStatus: rayv1.JobStatusPending, }, }, dashboardURLTemplate: tasklog.TemplateLogPlugin{ @@ -1104,7 +1045,7 @@ func TestGetEventInfo_DashboardURL_V1(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { assert.NoError(t, SetConfig(&Config{DashboardURLTemplate: &tc.dashboardURLTemplate})) - ti, err := getEventInfoForRayJobV1(logs.LogConfig{}, pluginCtx, &tc.rayJob) + ti, err := getEventInfoForRayJob(logs.LogConfig{}, pluginCtx, &tc.rayJob) assert.NoError(t, err) assert.Equal(t, tc.expectedTaskLogs, ti.Logs) }) diff --git a/flytepropeller/go.mod b/flytepropeller/go.mod index af2880c259..71c986cc38 100644 --- a/flytepropeller/go.mod +++ b/flytepropeller/go.mod @@ -33,10 +33,10 @@ require ( golang.org/x/time v0.5.0 google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.32.0 - k8s.io/api v0.28.3 - k8s.io/apiextensions-apiserver v0.28.0 - k8s.io/apimachinery v0.28.3 - k8s.io/client-go v0.28.3 + k8s.io/api v0.28.4 + k8s.io/apiextensions-apiserver v0.28.4 + k8s.io/apimachinery v0.28.4 + k8s.io/client-go v0.28.4 k8s.io/klog v1.0.0 k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 sigs.k8s.io/controller-runtime v0.16.3 @@ -107,6 +107,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/ncw/swift v1.0.53 // indirect + github.com/onsi/ginkgo v1.16.5 // indirect github.com/pelletier/go-toml v1.9.4 // indirect github.com/pelletier/go-toml/v2 v2.0.0-beta.8 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect @@ -114,7 +115,7 @@ require ( github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect - github.com/ray-project/kuberay/ray-operator v1.0.0 // indirect + github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1 // indirect github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -143,7 +144,7 @@ require ( gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/component-base v0.28.1 // indirect + k8s.io/component-base v0.28.4 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/flytepropeller/go.sum b/flytepropeller/go.sum index 04a26cfbf9..e6c607042d 100644 --- a/flytepropeller/go.sum +++ b/flytepropeller/go.sum @@ -146,6 +146,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -173,6 +175,7 @@ github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+ github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U= github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= @@ -278,6 +281,7 @@ github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+l github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= @@ -340,12 +344,17 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -370,8 +379,8 @@ github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdO github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/ray-project/kuberay/ray-operator v1.0.0 h1:i69nvbV7az2FG41VHQgxrmhD+SUl8ca+ek4RPbSE2Q0= -github.com/ray-project/kuberay/ray-operator v1.0.0/go.mod h1:7C7ebIkxtkmOX8w1iiLrKM1j4hkZs/Guzm3WdePk/yg= +github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1 h1:skD8MXnQMO3QGUeTKt09VOXvuch/gJh8+6q3OLm0kAQ= +github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1/go.mod h1:ZqyKKvMP5nKDldQoKmur+Wcx7wVlV9Q98phFqHzr+KY= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= @@ -498,6 +507,7 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -518,6 +528,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -559,6 +570,7 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -568,7 +580,10 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -590,6 +605,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -672,6 +688,7 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -804,6 +821,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= @@ -812,7 +830,9 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -830,16 +850,16 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= -k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= +k8s.io/apiextensions-apiserver v0.28.4 h1:AZpKY/7wQ8n+ZYDtNHbAJBb+N4AXXJvyZx6ww6yAJvU= +k8s.io/apiextensions-apiserver v0.28.4/go.mod h1:pgQIZ1U8eJSMQcENew/0ShUTlePcSGFq6dxSxf2mwPM= k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= -k8s.io/code-generator v0.28.0 h1:msdkRVJNVFgdiIJ8REl/d3cZsMB9HByFcWMmn13NyuE= -k8s.io/code-generator v0.28.0/go.mod h1:ueeSJZJ61NHBa0ccWLey6mwawum25vX61nRZ6WOzN9A= -k8s.io/component-base v0.28.1 h1:LA4AujMlK2mr0tZbQDZkjWbdhTV5bRyEyAFe0TJxlWg= -k8s.io/component-base v0.28.1/go.mod h1:jI11OyhbX21Qtbav7JkhehyBsIRfnO8oEgoAR12ArIU= +k8s.io/code-generator v0.28.4 h1:tcOSNIZQvuAvXhOwpbuJkKbAABJQeyCcQBCN/3uI18c= +k8s.io/code-generator v0.28.4/go.mod h1:OQAfl6bZikQ/tK6faJ18Vyzo54rUII2NmjurHyiN1g4= +k8s.io/component-base v0.28.4 h1:c/iQLWPdUgI90O+T9TeECg8o7N3YJTiuz2sKxILYcYo= +k8s.io/component-base v0.28.4/go.mod h1:m9hR0uvqXDybiGL2nf/3Lf0MerAfQXzkfWhUY58JUbU= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= diff --git a/go.mod b/go.mod index 5f00818fca..e6344078cf 100644 --- a/go.mod +++ b/go.mod @@ -141,6 +141,7 @@ require ( github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/ncw/swift v1.0.53 // indirect + github.com/nxadm/tail v1.4.11 // indirect github.com/ory/fosite v0.42.2 // indirect github.com/ory/go-acc v0.2.6 // indirect github.com/ory/go-convenience v0.1.0 // indirect @@ -156,7 +157,7 @@ require ( github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect - github.com/ray-project/kuberay/ray-operator v1.0.0 // indirect + github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect github.com/robfig/cron/v3 v3.0.0 // indirect github.com/sendgrid/rest v2.6.8+incompatible // indirect @@ -214,11 +215,11 @@ require ( gorm.io/driver/sqlite v1.5.4 // indirect gorm.io/gorm v1.25.5 // indirect gorm.io/plugin/opentelemetry v0.1.4 // indirect - k8s.io/api v0.28.3 // indirect - k8s.io/apiextensions-apiserver v0.28.0 // indirect - k8s.io/apimachinery v0.28.3 // indirect - k8s.io/client-go v0.28.3 // indirect - k8s.io/component-base v0.28.1 // indirect + k8s.io/api v0.28.4 // indirect + k8s.io/apiextensions-apiserver v0.28.4 // indirect + k8s.io/apimachinery v0.28.4 // indirect + k8s.io/client-go v0.28.4 // indirect + k8s.io/component-base v0.28.4 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f // indirect k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect diff --git a/go.sum b/go.sum index df8f6fa506..e6d38e8b6c 100644 --- a/go.sum +++ b/go.sum @@ -1045,8 +1045,8 @@ github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oleiade/reflections v1.0.0/go.mod h1:RbATFBbKYkVdqmSFtx13Bb/tVhR0lgOBXunWTZKeL4w= github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM= @@ -1167,8 +1167,8 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/ray-project/kuberay/ray-operator v1.0.0 h1:i69nvbV7az2FG41VHQgxrmhD+SUl8ca+ek4RPbSE2Q0= -github.com/ray-project/kuberay/ray-operator v1.0.0/go.mod h1:7C7ebIkxtkmOX8w1iiLrKM1j4hkZs/Guzm3WdePk/yg= +github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1 h1:skD8MXnQMO3QGUeTKt09VOXvuch/gJh8+6q3OLm0kAQ= +github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1/go.mod h1:ZqyKKvMP5nKDldQoKmur+Wcx7wVlV9Q98phFqHzr+KY= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= @@ -2026,16 +2026,16 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= -k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= +k8s.io/apiextensions-apiserver v0.28.4 h1:AZpKY/7wQ8n+ZYDtNHbAJBb+N4AXXJvyZx6ww6yAJvU= +k8s.io/apiextensions-apiserver v0.28.4/go.mod h1:pgQIZ1U8eJSMQcENew/0ShUTlePcSGFq6dxSxf2mwPM= k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= -k8s.io/code-generator v0.28.0 h1:msdkRVJNVFgdiIJ8REl/d3cZsMB9HByFcWMmn13NyuE= -k8s.io/code-generator v0.28.0/go.mod h1:ueeSJZJ61NHBa0ccWLey6mwawum25vX61nRZ6WOzN9A= -k8s.io/component-base v0.28.1 h1:LA4AujMlK2mr0tZbQDZkjWbdhTV5bRyEyAFe0TJxlWg= -k8s.io/component-base v0.28.1/go.mod h1:jI11OyhbX21Qtbav7JkhehyBsIRfnO8oEgoAR12ArIU= +k8s.io/code-generator v0.28.4 h1:tcOSNIZQvuAvXhOwpbuJkKbAABJQeyCcQBCN/3uI18c= +k8s.io/code-generator v0.28.4/go.mod h1:OQAfl6bZikQ/tK6faJ18Vyzo54rUII2NmjurHyiN1g4= +k8s.io/component-base v0.28.4 h1:c/iQLWPdUgI90O+T9TeECg8o7N3YJTiuz2sKxILYcYo= +k8s.io/component-base v0.28.4/go.mod h1:m9hR0uvqXDybiGL2nf/3Lf0MerAfQXzkfWhUY58JUbU= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f h1:eeEUOoGYWhOz7EyXqhlR2zHKNw2mNJ9vzJmub6YN6kk= From 61b0b277b97e1e5ab5c82aefc0190626a2ea0907 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Fri, 29 Mar 2024 11:23:03 -0700 Subject: [PATCH 373/645] Boilerplate simplification (#5134) * Bring in copy of boilerplate and apply to datacatalog Signed-off-by: Eduardo Apolinario * Add boilerplate to datacatalog dockerfile and remove cruft from makefile Signed-off-by: Eduardo Apolinario * Add $REPO_ROOT to flyteadmin Signed-off-by: Eduardo Apolinario * Remove boilerplate from flyteadmin Signed-off-by: Eduardo Apolinario * Remove boilerplate from flytecopilot Signed-off-by: Eduardo Apolinario * Remove boilerplate from flyteplugins * Remove boilerplate from flytepropeller Signed-off-by: Eduardo Apolinario * Remove boilerplate from flytestdlib Signed-off-by: Eduardo Apolinario * Remove boilerplate from flyteidl Signed-off-by: Eduardo Apolinario * Copy boilerplate in Dockerfile.flytescheduler Signed-off-by: Eduardo Apolinario --------- Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- Dockerfile.datacatalog | 1 + Dockerfile.flyteadmin | 1 + Dockerfile.flytecopilot | 1 + Dockerfile.flytepropeller | 1 + Dockerfile.flytescheduler | 1 + .../flyte/docker_build/Makefile | 0 .../flyte/docker_build/Readme.rst | 0 .../flyte/docker_build/docker_build.sh | 0 .../flyte/flyte_golang_compile/Readme.rst | 0 .../flyte_golang_compile.Template | 0 .../flyte/flyte_golang_compile/update.sh | 0 .../flyte/github_workflows/Readme.rst | 0 .../boilerplate_automation.yml | 0 .../flyte/github_workflows/master.yml | 0 .../flyte/github_workflows/pull_request.yml | 0 .../flyte/github_workflows/stale.yml | 0 .../flyte/github_workflows/update.sh | 0 .../golang_dockerfile/Dockerfile.GoTemplate | 0 .../flyte/golang_dockerfile/Readme.rst | 0 .../flyte/golang_dockerfile/update.sh | 0 .../flyte/golang_support_tools/go.mod | 0 .../flyte/golang_support_tools/go.sum | 0 .../flyte/golang_support_tools/tools.go | 0 .../flyte/golang_test_targets/Makefile | 10 +- .../golang_test_targets/download_tooling.sh | 24 +- .../flyte/golangci_file/.golangci.yml | 0 .../flyte/golangci_file/Readme.rst | 0 .../flyte/golangci_file/update.sh | 0 .../flyte/precommit/Makefile | 0 .../flyte/precommit/hooks/pre-push | 0 .../flyte/precommit/hooks/prepare-commit-msg | 0 .../flyte/precommit/update.sh | 0 .../flyte/pull_request_template/Readme.rst | 0 .../pull_request_template.md | 0 .../flyte/pull_request_template/update.sh | 0 boilerplate/update.cfg | 3 - datacatalog/Makefile | 18 +- .../flyte/code_of_conduct/CODE_OF_CONDUCT.md | 2 - .../flyte/code_of_conduct/README.rst | 2 - .../flyte/code_of_conduct/update.sh | 12 - .../boilerplate/flyte/end2end/Makefile | 14 - .../boilerplate/flyte/end2end/end2end.sh | 12 - .../flyte/end2end/functional-test-config.yaml | 5 - .../boilerplate/flyte/end2end/run-tests.py | 285 ---- .../flyte/golang_test_targets/Makefile | 57 - .../flyte/golang_test_targets/Readme.rst | 31 - .../golang_test_targets/download_tooling.sh | 38 - .../flyte/golang_test_targets/go-gen.sh | 22 - .../flyte/golang_test_targets/goimports | 9 - datacatalog/boilerplate/update.cfg | 6 - datacatalog/boilerplate/update.sh | 73 - flyteadmin/Makefile | 13 +- .../flyte/code_of_conduct/CODE_OF_CONDUCT.md | 2 - .../flyte/code_of_conduct/README.rst | 2 - .../flyte/code_of_conduct/update.sh | 12 - .../boilerplate/flyte/docker_build/Makefile | 12 - .../boilerplate/flyte/docker_build/Readme.rst | 23 - .../flyte/docker_build/docker_build.sh | 67 - flyteadmin/boilerplate/flyte/end2end/Makefile | 14 - .../boilerplate/flyte/end2end/end2end.sh | 12 - .../flyte/end2end/functional-test-config.yaml | 5 - .../boilerplate/flyte/end2end/run-tests.py | 285 ---- .../flyte/flyte_golang_compile/Readme.rst | 16 - .../flyte_golang_compile.Template | 26 - .../flyte/flyte_golang_compile/update.sh | 13 - .../flyte/github_workflows/Readme.rst | 22 - .../flyte/github_workflows/master.yml | 31 - .../flyte/github_workflows/pull_request.yml | 19 - .../flyte/github_workflows/update.sh | 16 - .../golang_dockerfile/Dockerfile.GoTemplate | 32 - .../flyte/golang_dockerfile/Readme.rst | 16 - .../flyte/golang_dockerfile/update.sh | 13 - .../flyte/golang_support_tools/go.mod | 247 ---- .../flyte/golang_support_tools/go.sum | 1225 ----------------- .../flyte/golang_support_tools/tools.go | 13 - .../flyte/golang_test_targets/Makefile | 57 - .../flyte/golang_test_targets/Readme.rst | 31 - .../golang_test_targets/download_tooling.sh | 38 - .../flyte/golang_test_targets/go-gen.sh | 22 - .../flyte/golang_test_targets/goimports | 9 - .../flyte/golangci_file/.golangci.yml | 40 - .../flyte/golangci_file/Readme.rst | 8 - .../boilerplate/flyte/golangci_file/update.sh | 14 - .../flyte/pull_request_template/Readme.rst | 8 - .../pull_request_template.md | 35 - .../flyte/pull_request_template/update.sh | 12 - flyteadmin/boilerplate/update.cfg | 6 - flyteadmin/boilerplate/update.sh | 73 - flytecopilot/Makefile | 9 +- .../flyte/code_of_conduct/CODE_OF_CONDUCT.md | 2 - .../flyte/code_of_conduct/README.rst | 2 - .../flyte/code_of_conduct/update.sh | 12 - .../boilerplate/flyte/docker_build/Makefile | 12 - .../boilerplate/flyte/docker_build/Readme.rst | 23 - .../flyte/docker_build/docker_build.sh | 67 - .../boilerplate/flyte/end2end/Makefile | 14 - .../boilerplate/flyte/end2end/end2end.sh | 12 - .../flyte/end2end/functional-test-config.yaml | 5 - .../boilerplate/flyte/end2end/run-tests.py | 285 ---- .../flyte/flyte_golang_compile/Readme.rst | 16 - .../flyte_golang_compile.Template | 26 - .../flyte/flyte_golang_compile/update.sh | 13 - .../flyte/github_workflows/Readme.rst | 22 - .../boilerplate_automation.yml | 36 - .../flyte/github_workflows/master.yml | 31 - .../flyte/github_workflows/pull_request.yml | 19 - .../flyte/github_workflows/stale.yml | 61 - .../flyte/github_workflows/update.sh | 17 - .../golang_dockerfile/Dockerfile.GoTemplate | 38 - .../flyte/golang_dockerfile/Readme.rst | 16 - .../flyte/golang_dockerfile/update.sh | 13 - .../flyte/golang_support_tools/go.mod | 247 ---- .../flyte/golang_support_tools/go.sum | 1225 ----------------- .../flyte/golang_support_tools/tools.go | 13 - .../flyte/golang_test_targets/Makefile | 57 - .../flyte/golang_test_targets/Readme.rst | 31 - .../golang_test_targets/download_tooling.sh | 38 - .../flyte/golang_test_targets/go-gen.sh | 22 - .../flyte/golang_test_targets/goimports | 9 - .../flyte/golangci_file/.golangci.yml | 40 - .../flyte/golangci_file/Readme.rst | 8 - .../boilerplate/flyte/golangci_file/update.sh | 14 - .../boilerplate/flyte/precommit/Makefile | 9 - .../flyte/precommit/hooks/pre-push | 41 - .../flyte/precommit/hooks/prepare-commit-msg | 16 - .../boilerplate/flyte/precommit/update.sh | 60 - .../flyte/pull_request_template/Readme.rst | 8 - .../pull_request_template.md | 35 - .../flyte/pull_request_template/update.sh | 12 - flytecopilot/boilerplate/update.cfg | 6 - flytecopilot/boilerplate/update.sh | 73 - flyteidl/Makefile | 9 +- .../flyte/code_of_conduct/CODE_OF_CONDUCT.md | 2 - .../flyte/code_of_conduct/README.rst | 2 - .../flyte/code_of_conduct/update.sh | 12 - .../flyte/golang_support_tools/go.mod | 203 --- .../flyte/golang_support_tools/go.sum | 1025 -------------- .../flyte/golang_support_tools/tools.go | 13 - .../flyte/golang_test_targets/Makefile | 57 - .../flyte/golang_test_targets/Readme.rst | 31 - .../golang_test_targets/download_tooling.sh | 41 - .../flyte/golang_test_targets/go-gen.sh | 22 - .../flyte/golang_test_targets/goimports | 9 - .../flyte/golangci_file/.golangci.yml | 30 - .../flyte/golangci_file/Readme.rst | 8 - .../boilerplate/flyte/golangci_file/update.sh | 14 - .../flyte/pull_request_template/Readme.rst | 8 - .../pull_request_template.md | 35 - .../flyte/pull_request_template/update.sh | 12 - .../boilerplate/flyte/welcome_bot/Readme.rst | 8 - .../boilerplate/flyte/welcome_bot/config.yml | 16 - .../boilerplate/flyte/welcome_bot/update.sh | 15 - flyteidl/boilerplate/update.cfg | 4 - flyteidl/boilerplate/update.sh | 73 - flyteidl/clients/go/admin/auth_interceptor.go | 9 +- flyteidl/clients/go/admin/cert_loader.go | 3 +- .../deviceflow/token_orchestrator_test.go | 6 +- flyteidl/clients/go/admin/integration_test.go | 5 +- .../admin/pkce/handle_app_call_back_test.go | 4 +- .../base_token_orchestrator.go | 3 +- .../go/coreutils/extract_literal_test.go | 4 +- flyteidl/clients/go/coreutils/literals.go | 6 +- .../clients/go/coreutils/literals_test.go | 7 +- flyteplugins/Makefile | 9 +- .../flyte/code_of_conduct/CODE_OF_CONDUCT.md | 2 - .../flyte/code_of_conduct/README.rst | 2 - .../flyte/code_of_conduct/update.sh | 12 - .../boilerplate/flyte/docker_build/Makefile | 12 - .../boilerplate/flyte/docker_build/Readme.rst | 23 - .../flyte/docker_build/docker_build.sh | 67 - .../flyte/golang_support_tools/go.mod | 247 ---- .../flyte/golang_support_tools/go.sum | 1225 ----------------- .../flyte/golang_support_tools/tools.go | 13 - .../flyte/golang_test_targets/Makefile | 57 - .../flyte/golang_test_targets/Readme.rst | 31 - .../golang_test_targets/download_tooling.sh | 38 - .../flyte/golang_test_targets/go-gen.sh | 22 - .../flyte/golang_test_targets/goimports | 9 - .../flyte/golangci_file/.golangci.yml | 40 - .../flyte/golangci_file/Readme.rst | 8 - .../boilerplate/flyte/golangci_file/update.sh | 14 - .../flyte/pull_request_template/Readme.rst | 8 - .../pull_request_template.md | 35 - .../flyte/pull_request_template/update.sh | 12 - flyteplugins/boilerplate/update.cfg | 6 - flyteplugins/boilerplate/update.sh | 73 - .../core/mocks/task_overrides.go | 58 +- .../go/tasks/plugins/k8s/ray/config_flags.go | 2 + .../plugins/k8s/ray/config_flags_test.go | 28 + flytepropeller/Makefile | 11 +- .../flyte/code_of_conduct/CODE_OF_CONDUCT.md | 2 - .../flyte/code_of_conduct/README.rst | 2 - .../flyte/code_of_conduct/update.sh | 12 - .../boilerplate/flyte/docker_build/Makefile | 12 - .../boilerplate/flyte/docker_build/Readme.rst | 23 - .../flyte/docker_build/docker_build.sh | 67 - .../boilerplate/flyte/end2end/Makefile | 14 - .../boilerplate/flyte/end2end/end2end.sh | 12 - .../flyte/end2end/functional-test-config.yaml | 5 - .../boilerplate/flyte/end2end/run-tests.py | 285 ---- .../flyte/golang_support_tools/go.mod | 247 ---- .../flyte/golang_support_tools/go.sum | 1225 ----------------- .../flyte/golang_support_tools/tools.go | 13 - .../flyte/golang_test_targets/Makefile | 57 - .../flyte/golang_test_targets/Readme.rst | 31 - .../golang_test_targets/download_tooling.sh | 38 - .../flyte/golang_test_targets/go-gen.sh | 22 - .../flyte/golang_test_targets/goimports | 9 - .../flyte/golangci_file/.golangci.yml | 40 - .../flyte/golangci_file/Readme.rst | 8 - .../boilerplate/flyte/golangci_file/update.sh | 14 - .../flyte/pull_request_template/Readme.rst | 8 - .../pull_request_template.md | 35 - .../flyte/pull_request_template/update.sh | 12 - flytepropeller/boilerplate/update.cfg | 7 - flytepropeller/boilerplate/update.sh | 73 - .../pkg/controller/nodes/array/handler.go | 2 +- flytestdlib/Makefile | 7 +- flytestdlib/boilerplate/flyte/Readme.rst | 8 - .../flyte/code_of_conduct/CODE_OF_CONDUCT.md | 2 - .../flyte/code_of_conduct/README.rst | 2 - .../flyte/code_of_conduct/update.sh | 12 - flytestdlib/boilerplate/flyte/config.yml | 15 - .../flyte/golang_support_tools/go.mod | 247 ---- .../flyte/golang_support_tools/go.sum | 1225 ----------------- .../flyte/golang_support_tools/tools.go | 13 - .../flyte/golang_test_targets/Makefile | 57 - .../flyte/golang_test_targets/Readme.rst | 31 - .../golang_test_targets/download_tooling.sh | 38 - .../flyte/golang_test_targets/go-gen.sh | 22 - .../flyte/golang_test_targets/goimports | 9 - .../flyte/golangci_file/.golangci.yml | 40 - .../flyte/golangci_file/Readme.rst | 8 - .../boilerplate/flyte/golangci_file/update.sh | 14 - .../flyte/pull_request_template/Readme.rst | 8 - .../pull_request_template.md | 35 - .../flyte/pull_request_template/update.sh | 12 - flytestdlib/boilerplate/flyte/update.sh | 14 - flytestdlib/boilerplate/update.cfg | 5 - flytestdlib/boilerplate/update.sh | 73 - flytestdlib/cache/mocks/AutoRefresh.go | 32 +- flytestdlib/cache/mocks/Item.go | 32 + flytestdlib/cache/mocks/ItemWrapper.go | 16 +- flytestdlib/fastcheck/mocks/filter.go | 16 +- flytestdlib/otelutils/factory_test.go | 3 +- flytestdlib/random/mocks/comparable.go | 8 +- .../random/mocks/weighted_random_list.go | 32 +- .../storage/mocks/composed_protobuf_store.go | 72 +- flytestdlib/storage/mocks/raw_store.go | 56 +- .../storage/mocks/reference_constructor.go | 8 +- flytestdlib/utils/mocks/auto_refresh_cache.go | 16 +- flytestdlib/utils/mocks/cache_item.go | 8 +- flytestdlib/utils/mocks/rate_limiter.go | 8 +- flytestdlib/utils/mocks/sequencer.go | 16 +- 254 files changed, 302 insertions(+), 13785 deletions(-) rename {datacatalog/boilerplate => boilerplate}/flyte/docker_build/Makefile (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/docker_build/Readme.rst (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/docker_build/docker_build.sh (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/flyte_golang_compile/Readme.rst (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/flyte_golang_compile/flyte_golang_compile.Template (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/flyte_golang_compile/update.sh (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/github_workflows/Readme.rst (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/github_workflows/boilerplate_automation.yml (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/github_workflows/master.yml (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/github_workflows/pull_request.yml (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/github_workflows/stale.yml (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/github_workflows/update.sh (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/golang_dockerfile/Dockerfile.GoTemplate (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/golang_dockerfile/Readme.rst (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/golang_dockerfile/update.sh (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/golang_support_tools/go.mod (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/golang_support_tools/go.sum (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/golang_support_tools/tools.go (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/golangci_file/.golangci.yml (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/golangci_file/Readme.rst (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/golangci_file/update.sh (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/precommit/Makefile (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/precommit/hooks/pre-push (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/precommit/hooks/prepare-commit-msg (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/precommit/update.sh (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/pull_request_template/Readme.rst (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/pull_request_template/pull_request_template.md (100%) rename {datacatalog/boilerplate => boilerplate}/flyte/pull_request_template/update.sh (100%) delete mode 100644 boilerplate/update.cfg delete mode 100644 datacatalog/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md delete mode 100644 datacatalog/boilerplate/flyte/code_of_conduct/README.rst delete mode 100755 datacatalog/boilerplate/flyte/code_of_conduct/update.sh delete mode 100644 datacatalog/boilerplate/flyte/end2end/Makefile delete mode 100755 datacatalog/boilerplate/flyte/end2end/end2end.sh delete mode 100644 datacatalog/boilerplate/flyte/end2end/functional-test-config.yaml delete mode 100644 datacatalog/boilerplate/flyte/end2end/run-tests.py delete mode 100644 datacatalog/boilerplate/flyte/golang_test_targets/Makefile delete mode 100644 datacatalog/boilerplate/flyte/golang_test_targets/Readme.rst delete mode 100755 datacatalog/boilerplate/flyte/golang_test_targets/download_tooling.sh delete mode 100755 datacatalog/boilerplate/flyte/golang_test_targets/go-gen.sh delete mode 100755 datacatalog/boilerplate/flyte/golang_test_targets/goimports delete mode 100644 datacatalog/boilerplate/update.cfg delete mode 100755 datacatalog/boilerplate/update.sh delete mode 100644 flyteadmin/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md delete mode 100644 flyteadmin/boilerplate/flyte/code_of_conduct/README.rst delete mode 100755 flyteadmin/boilerplate/flyte/code_of_conduct/update.sh delete mode 100644 flyteadmin/boilerplate/flyte/docker_build/Makefile delete mode 100644 flyteadmin/boilerplate/flyte/docker_build/Readme.rst delete mode 100755 flyteadmin/boilerplate/flyte/docker_build/docker_build.sh delete mode 100644 flyteadmin/boilerplate/flyte/end2end/Makefile delete mode 100755 flyteadmin/boilerplate/flyte/end2end/end2end.sh delete mode 100644 flyteadmin/boilerplate/flyte/end2end/functional-test-config.yaml delete mode 100644 flyteadmin/boilerplate/flyte/end2end/run-tests.py delete mode 100644 flyteadmin/boilerplate/flyte/flyte_golang_compile/Readme.rst delete mode 100644 flyteadmin/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template delete mode 100755 flyteadmin/boilerplate/flyte/flyte_golang_compile/update.sh delete mode 100644 flyteadmin/boilerplate/flyte/github_workflows/Readme.rst delete mode 100644 flyteadmin/boilerplate/flyte/github_workflows/master.yml delete mode 100644 flyteadmin/boilerplate/flyte/github_workflows/pull_request.yml delete mode 100755 flyteadmin/boilerplate/flyte/github_workflows/update.sh delete mode 100644 flyteadmin/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate delete mode 100644 flyteadmin/boilerplate/flyte/golang_dockerfile/Readme.rst delete mode 100755 flyteadmin/boilerplate/flyte/golang_dockerfile/update.sh delete mode 100644 flyteadmin/boilerplate/flyte/golang_support_tools/go.mod delete mode 100644 flyteadmin/boilerplate/flyte/golang_support_tools/go.sum delete mode 100644 flyteadmin/boilerplate/flyte/golang_support_tools/tools.go delete mode 100644 flyteadmin/boilerplate/flyte/golang_test_targets/Makefile delete mode 100644 flyteadmin/boilerplate/flyte/golang_test_targets/Readme.rst delete mode 100755 flyteadmin/boilerplate/flyte/golang_test_targets/download_tooling.sh delete mode 100755 flyteadmin/boilerplate/flyte/golang_test_targets/go-gen.sh delete mode 100755 flyteadmin/boilerplate/flyte/golang_test_targets/goimports delete mode 100644 flyteadmin/boilerplate/flyte/golangci_file/.golangci.yml delete mode 100644 flyteadmin/boilerplate/flyte/golangci_file/Readme.rst delete mode 100755 flyteadmin/boilerplate/flyte/golangci_file/update.sh delete mode 100644 flyteadmin/boilerplate/flyte/pull_request_template/Readme.rst delete mode 100644 flyteadmin/boilerplate/flyte/pull_request_template/pull_request_template.md delete mode 100755 flyteadmin/boilerplate/flyte/pull_request_template/update.sh delete mode 100644 flyteadmin/boilerplate/update.cfg delete mode 100755 flyteadmin/boilerplate/update.sh delete mode 100644 flytecopilot/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md delete mode 100644 flytecopilot/boilerplate/flyte/code_of_conduct/README.rst delete mode 100755 flytecopilot/boilerplate/flyte/code_of_conduct/update.sh delete mode 100644 flytecopilot/boilerplate/flyte/docker_build/Makefile delete mode 100644 flytecopilot/boilerplate/flyte/docker_build/Readme.rst delete mode 100755 flytecopilot/boilerplate/flyte/docker_build/docker_build.sh delete mode 100644 flytecopilot/boilerplate/flyte/end2end/Makefile delete mode 100755 flytecopilot/boilerplate/flyte/end2end/end2end.sh delete mode 100644 flytecopilot/boilerplate/flyte/end2end/functional-test-config.yaml delete mode 100644 flytecopilot/boilerplate/flyte/end2end/run-tests.py delete mode 100644 flytecopilot/boilerplate/flyte/flyte_golang_compile/Readme.rst delete mode 100644 flytecopilot/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template delete mode 100755 flytecopilot/boilerplate/flyte/flyte_golang_compile/update.sh delete mode 100644 flytecopilot/boilerplate/flyte/github_workflows/Readme.rst delete mode 100644 flytecopilot/boilerplate/flyte/github_workflows/boilerplate_automation.yml delete mode 100644 flytecopilot/boilerplate/flyte/github_workflows/master.yml delete mode 100644 flytecopilot/boilerplate/flyte/github_workflows/pull_request.yml delete mode 100644 flytecopilot/boilerplate/flyte/github_workflows/stale.yml delete mode 100755 flytecopilot/boilerplate/flyte/github_workflows/update.sh delete mode 100644 flytecopilot/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate delete mode 100644 flytecopilot/boilerplate/flyte/golang_dockerfile/Readme.rst delete mode 100755 flytecopilot/boilerplate/flyte/golang_dockerfile/update.sh delete mode 100644 flytecopilot/boilerplate/flyte/golang_support_tools/go.mod delete mode 100644 flytecopilot/boilerplate/flyte/golang_support_tools/go.sum delete mode 100644 flytecopilot/boilerplate/flyte/golang_support_tools/tools.go delete mode 100644 flytecopilot/boilerplate/flyte/golang_test_targets/Makefile delete mode 100644 flytecopilot/boilerplate/flyte/golang_test_targets/Readme.rst delete mode 100755 flytecopilot/boilerplate/flyte/golang_test_targets/download_tooling.sh delete mode 100755 flytecopilot/boilerplate/flyte/golang_test_targets/go-gen.sh delete mode 100755 flytecopilot/boilerplate/flyte/golang_test_targets/goimports delete mode 100644 flytecopilot/boilerplate/flyte/golangci_file/.golangci.yml delete mode 100644 flytecopilot/boilerplate/flyte/golangci_file/Readme.rst delete mode 100755 flytecopilot/boilerplate/flyte/golangci_file/update.sh delete mode 100644 flytecopilot/boilerplate/flyte/precommit/Makefile delete mode 100755 flytecopilot/boilerplate/flyte/precommit/hooks/pre-push delete mode 100755 flytecopilot/boilerplate/flyte/precommit/hooks/prepare-commit-msg delete mode 100755 flytecopilot/boilerplate/flyte/precommit/update.sh delete mode 100644 flytecopilot/boilerplate/flyte/pull_request_template/Readme.rst delete mode 100644 flytecopilot/boilerplate/flyte/pull_request_template/pull_request_template.md delete mode 100755 flytecopilot/boilerplate/flyte/pull_request_template/update.sh delete mode 100755 flytecopilot/boilerplate/update.cfg delete mode 100755 flytecopilot/boilerplate/update.sh delete mode 100644 flyteidl/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md delete mode 100644 flyteidl/boilerplate/flyte/code_of_conduct/README.rst delete mode 100755 flyteidl/boilerplate/flyte/code_of_conduct/update.sh delete mode 100644 flyteidl/boilerplate/flyte/golang_support_tools/go.mod delete mode 100644 flyteidl/boilerplate/flyte/golang_support_tools/go.sum delete mode 100644 flyteidl/boilerplate/flyte/golang_support_tools/tools.go delete mode 100644 flyteidl/boilerplate/flyte/golang_test_targets/Makefile delete mode 100644 flyteidl/boilerplate/flyte/golang_test_targets/Readme.rst delete mode 100755 flyteidl/boilerplate/flyte/golang_test_targets/download_tooling.sh delete mode 100755 flyteidl/boilerplate/flyte/golang_test_targets/go-gen.sh delete mode 100755 flyteidl/boilerplate/flyte/golang_test_targets/goimports delete mode 100644 flyteidl/boilerplate/flyte/golangci_file/.golangci.yml delete mode 100644 flyteidl/boilerplate/flyte/golangci_file/Readme.rst delete mode 100755 flyteidl/boilerplate/flyte/golangci_file/update.sh delete mode 100644 flyteidl/boilerplate/flyte/pull_request_template/Readme.rst delete mode 100644 flyteidl/boilerplate/flyte/pull_request_template/pull_request_template.md delete mode 100755 flyteidl/boilerplate/flyte/pull_request_template/update.sh delete mode 100644 flyteidl/boilerplate/flyte/welcome_bot/Readme.rst delete mode 100644 flyteidl/boilerplate/flyte/welcome_bot/config.yml delete mode 100755 flyteidl/boilerplate/flyte/welcome_bot/update.sh delete mode 100644 flyteidl/boilerplate/update.cfg delete mode 100755 flyteidl/boilerplate/update.sh delete mode 100644 flyteplugins/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md delete mode 100644 flyteplugins/boilerplate/flyte/code_of_conduct/README.rst delete mode 100755 flyteplugins/boilerplate/flyte/code_of_conduct/update.sh delete mode 100644 flyteplugins/boilerplate/flyte/docker_build/Makefile delete mode 100644 flyteplugins/boilerplate/flyte/docker_build/Readme.rst delete mode 100755 flyteplugins/boilerplate/flyte/docker_build/docker_build.sh delete mode 100644 flyteplugins/boilerplate/flyte/golang_support_tools/go.mod delete mode 100644 flyteplugins/boilerplate/flyte/golang_support_tools/go.sum delete mode 100644 flyteplugins/boilerplate/flyte/golang_support_tools/tools.go delete mode 100644 flyteplugins/boilerplate/flyte/golang_test_targets/Makefile delete mode 100644 flyteplugins/boilerplate/flyte/golang_test_targets/Readme.rst delete mode 100755 flyteplugins/boilerplate/flyte/golang_test_targets/download_tooling.sh delete mode 100755 flyteplugins/boilerplate/flyte/golang_test_targets/go-gen.sh delete mode 100755 flyteplugins/boilerplate/flyte/golang_test_targets/goimports delete mode 100644 flyteplugins/boilerplate/flyte/golangci_file/.golangci.yml delete mode 100644 flyteplugins/boilerplate/flyte/golangci_file/Readme.rst delete mode 100755 flyteplugins/boilerplate/flyte/golangci_file/update.sh delete mode 100644 flyteplugins/boilerplate/flyte/pull_request_template/Readme.rst delete mode 100644 flyteplugins/boilerplate/flyte/pull_request_template/pull_request_template.md delete mode 100755 flyteplugins/boilerplate/flyte/pull_request_template/update.sh delete mode 100755 flyteplugins/boilerplate/update.cfg delete mode 100755 flyteplugins/boilerplate/update.sh delete mode 100644 flytepropeller/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md delete mode 100644 flytepropeller/boilerplate/flyte/code_of_conduct/README.rst delete mode 100755 flytepropeller/boilerplate/flyte/code_of_conduct/update.sh delete mode 100644 flytepropeller/boilerplate/flyte/docker_build/Makefile delete mode 100644 flytepropeller/boilerplate/flyte/docker_build/Readme.rst delete mode 100755 flytepropeller/boilerplate/flyte/docker_build/docker_build.sh delete mode 100644 flytepropeller/boilerplate/flyte/end2end/Makefile delete mode 100755 flytepropeller/boilerplate/flyte/end2end/end2end.sh delete mode 100644 flytepropeller/boilerplate/flyte/end2end/functional-test-config.yaml delete mode 100644 flytepropeller/boilerplate/flyte/end2end/run-tests.py delete mode 100644 flytepropeller/boilerplate/flyte/golang_support_tools/go.mod delete mode 100644 flytepropeller/boilerplate/flyte/golang_support_tools/go.sum delete mode 100644 flytepropeller/boilerplate/flyte/golang_support_tools/tools.go delete mode 100644 flytepropeller/boilerplate/flyte/golang_test_targets/Makefile delete mode 100644 flytepropeller/boilerplate/flyte/golang_test_targets/Readme.rst delete mode 100755 flytepropeller/boilerplate/flyte/golang_test_targets/download_tooling.sh delete mode 100755 flytepropeller/boilerplate/flyte/golang_test_targets/go-gen.sh delete mode 100755 flytepropeller/boilerplate/flyte/golang_test_targets/goimports delete mode 100644 flytepropeller/boilerplate/flyte/golangci_file/.golangci.yml delete mode 100644 flytepropeller/boilerplate/flyte/golangci_file/Readme.rst delete mode 100755 flytepropeller/boilerplate/flyte/golangci_file/update.sh delete mode 100644 flytepropeller/boilerplate/flyte/pull_request_template/Readme.rst delete mode 100644 flytepropeller/boilerplate/flyte/pull_request_template/pull_request_template.md delete mode 100755 flytepropeller/boilerplate/flyte/pull_request_template/update.sh delete mode 100644 flytepropeller/boilerplate/update.cfg delete mode 100755 flytepropeller/boilerplate/update.sh delete mode 100644 flytestdlib/boilerplate/flyte/Readme.rst delete mode 100644 flytestdlib/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md delete mode 100644 flytestdlib/boilerplate/flyte/code_of_conduct/README.rst delete mode 100755 flytestdlib/boilerplate/flyte/code_of_conduct/update.sh delete mode 100644 flytestdlib/boilerplate/flyte/config.yml delete mode 100644 flytestdlib/boilerplate/flyte/golang_support_tools/go.mod delete mode 100644 flytestdlib/boilerplate/flyte/golang_support_tools/go.sum delete mode 100644 flytestdlib/boilerplate/flyte/golang_support_tools/tools.go delete mode 100644 flytestdlib/boilerplate/flyte/golang_test_targets/Makefile delete mode 100644 flytestdlib/boilerplate/flyte/golang_test_targets/Readme.rst delete mode 100755 flytestdlib/boilerplate/flyte/golang_test_targets/download_tooling.sh delete mode 100755 flytestdlib/boilerplate/flyte/golang_test_targets/go-gen.sh delete mode 100755 flytestdlib/boilerplate/flyte/golang_test_targets/goimports delete mode 100644 flytestdlib/boilerplate/flyte/golangci_file/.golangci.yml delete mode 100644 flytestdlib/boilerplate/flyte/golangci_file/Readme.rst delete mode 100755 flytestdlib/boilerplate/flyte/golangci_file/update.sh delete mode 100644 flytestdlib/boilerplate/flyte/pull_request_template/Readme.rst delete mode 100644 flytestdlib/boilerplate/flyte/pull_request_template/pull_request_template.md delete mode 100755 flytestdlib/boilerplate/flyte/pull_request_template/update.sh delete mode 100755 flytestdlib/boilerplate/flyte/update.sh delete mode 100644 flytestdlib/boilerplate/update.cfg delete mode 100755 flytestdlib/boilerplate/update.sh diff --git a/Dockerfile.datacatalog b/Dockerfile.datacatalog index 641b1b9fd6..16ef312c15 100644 --- a/Dockerfile.datacatalog +++ b/Dockerfile.datacatalog @@ -23,6 +23,7 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \ WORKDIR /go/src/github.com/flyteorg/datacatalog +COPY boilerplate ../boilerplate COPY datacatalog . COPY flyteadmin ../flyteadmin COPY flytecopilot ../flytecopilot diff --git a/Dockerfile.flyteadmin b/Dockerfile.flyteadmin index 6b6225ec6f..bf92438380 100644 --- a/Dockerfile.flyteadmin +++ b/Dockerfile.flyteadmin @@ -23,6 +23,7 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \ WORKDIR /go/src/github.com/flyteorg/flyteadmin +COPY boilerplate ../boilerplate COPY datacatalog ../datacatalog COPY flyteadmin . COPY flytecopilot ../flytecopilot diff --git a/Dockerfile.flytecopilot b/Dockerfile.flytecopilot index e19df0743d..f696ebd616 100644 --- a/Dockerfile.flytecopilot +++ b/Dockerfile.flytecopilot @@ -13,6 +13,7 @@ RUN apk add git openssh-client make curl WORKDIR /go/src/github.com/flyteorg/flytecopilot +COPY boilerplate ../boilerplate COPY datacatalog ../datacatalog COPY flyteadmin ../flyteadmin COPY flytecopilot . diff --git a/Dockerfile.flytepropeller b/Dockerfile.flytepropeller index 8cbdd40f14..fa226c1d85 100644 --- a/Dockerfile.flytepropeller +++ b/Dockerfile.flytepropeller @@ -13,6 +13,7 @@ RUN apk add git openssh-client make curl WORKDIR /go/src/github.com/flyteorg/flytepropeller +COPY boilerplate ../boilerplate COPY datacatalog ../datacatalog COPY flyteadmin ../flyteadmin COPY flytecopilot ../flytecopilot diff --git a/Dockerfile.flytescheduler b/Dockerfile.flytescheduler index fa7f1906a3..71421fd221 100644 --- a/Dockerfile.flytescheduler +++ b/Dockerfile.flytescheduler @@ -16,6 +16,7 @@ RUN mkdir /artifacts WORKDIR /go/src/github.com/flyteorg/flyteadmin +COPY boilerplate ../boilerplate COPY datacatalog ../datacatalog COPY flyteadmin . COPY flytecopilot ../flytecopilot diff --git a/datacatalog/boilerplate/flyte/docker_build/Makefile b/boilerplate/flyte/docker_build/Makefile similarity index 100% rename from datacatalog/boilerplate/flyte/docker_build/Makefile rename to boilerplate/flyte/docker_build/Makefile diff --git a/datacatalog/boilerplate/flyte/docker_build/Readme.rst b/boilerplate/flyte/docker_build/Readme.rst similarity index 100% rename from datacatalog/boilerplate/flyte/docker_build/Readme.rst rename to boilerplate/flyte/docker_build/Readme.rst diff --git a/datacatalog/boilerplate/flyte/docker_build/docker_build.sh b/boilerplate/flyte/docker_build/docker_build.sh similarity index 100% rename from datacatalog/boilerplate/flyte/docker_build/docker_build.sh rename to boilerplate/flyte/docker_build/docker_build.sh diff --git a/datacatalog/boilerplate/flyte/flyte_golang_compile/Readme.rst b/boilerplate/flyte/flyte_golang_compile/Readme.rst similarity index 100% rename from datacatalog/boilerplate/flyte/flyte_golang_compile/Readme.rst rename to boilerplate/flyte/flyte_golang_compile/Readme.rst diff --git a/datacatalog/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template b/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template similarity index 100% rename from datacatalog/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template rename to boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template diff --git a/datacatalog/boilerplate/flyte/flyte_golang_compile/update.sh b/boilerplate/flyte/flyte_golang_compile/update.sh similarity index 100% rename from datacatalog/boilerplate/flyte/flyte_golang_compile/update.sh rename to boilerplate/flyte/flyte_golang_compile/update.sh diff --git a/datacatalog/boilerplate/flyte/github_workflows/Readme.rst b/boilerplate/flyte/github_workflows/Readme.rst similarity index 100% rename from datacatalog/boilerplate/flyte/github_workflows/Readme.rst rename to boilerplate/flyte/github_workflows/Readme.rst diff --git a/datacatalog/boilerplate/flyte/github_workflows/boilerplate_automation.yml b/boilerplate/flyte/github_workflows/boilerplate_automation.yml similarity index 100% rename from datacatalog/boilerplate/flyte/github_workflows/boilerplate_automation.yml rename to boilerplate/flyte/github_workflows/boilerplate_automation.yml diff --git a/datacatalog/boilerplate/flyte/github_workflows/master.yml b/boilerplate/flyte/github_workflows/master.yml similarity index 100% rename from datacatalog/boilerplate/flyte/github_workflows/master.yml rename to boilerplate/flyte/github_workflows/master.yml diff --git a/datacatalog/boilerplate/flyte/github_workflows/pull_request.yml b/boilerplate/flyte/github_workflows/pull_request.yml similarity index 100% rename from datacatalog/boilerplate/flyte/github_workflows/pull_request.yml rename to boilerplate/flyte/github_workflows/pull_request.yml diff --git a/datacatalog/boilerplate/flyte/github_workflows/stale.yml b/boilerplate/flyte/github_workflows/stale.yml similarity index 100% rename from datacatalog/boilerplate/flyte/github_workflows/stale.yml rename to boilerplate/flyte/github_workflows/stale.yml diff --git a/datacatalog/boilerplate/flyte/github_workflows/update.sh b/boilerplate/flyte/github_workflows/update.sh similarity index 100% rename from datacatalog/boilerplate/flyte/github_workflows/update.sh rename to boilerplate/flyte/github_workflows/update.sh diff --git a/datacatalog/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate b/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate similarity index 100% rename from datacatalog/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate rename to boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate diff --git a/datacatalog/boilerplate/flyte/golang_dockerfile/Readme.rst b/boilerplate/flyte/golang_dockerfile/Readme.rst similarity index 100% rename from datacatalog/boilerplate/flyte/golang_dockerfile/Readme.rst rename to boilerplate/flyte/golang_dockerfile/Readme.rst diff --git a/datacatalog/boilerplate/flyte/golang_dockerfile/update.sh b/boilerplate/flyte/golang_dockerfile/update.sh similarity index 100% rename from datacatalog/boilerplate/flyte/golang_dockerfile/update.sh rename to boilerplate/flyte/golang_dockerfile/update.sh diff --git a/datacatalog/boilerplate/flyte/golang_support_tools/go.mod b/boilerplate/flyte/golang_support_tools/go.mod similarity index 100% rename from datacatalog/boilerplate/flyte/golang_support_tools/go.mod rename to boilerplate/flyte/golang_support_tools/go.mod diff --git a/datacatalog/boilerplate/flyte/golang_support_tools/go.sum b/boilerplate/flyte/golang_support_tools/go.sum similarity index 100% rename from datacatalog/boilerplate/flyte/golang_support_tools/go.sum rename to boilerplate/flyte/golang_support_tools/go.sum diff --git a/datacatalog/boilerplate/flyte/golang_support_tools/tools.go b/boilerplate/flyte/golang_support_tools/tools.go similarity index 100% rename from datacatalog/boilerplate/flyte/golang_support_tools/tools.go rename to boilerplate/flyte/golang_support_tools/tools.go diff --git a/boilerplate/flyte/golang_test_targets/Makefile b/boilerplate/flyte/golang_test_targets/Makefile index 280e1e55e4..3f743e8625 100644 --- a/boilerplate/flyte/golang_test_targets/Makefile +++ b/boilerplate/flyte/golang_test_targets/Makefile @@ -6,11 +6,11 @@ .PHONY: download_tooling download_tooling: #download dependencies (including test deps) for the package - @boilerplate/flyte/golang_test_targets/download_tooling.sh + @../boilerplate/flyte/golang_test_targets/download_tooling.sh .PHONY: generate generate: download_tooling #generate go code - @boilerplate/flyte/golang_test_targets/go-gen.sh + @../boilerplate/flyte/golang_test_targets/go-gen.sh .PHONY: lint lint: download_tooling #lints the package for common code smells @@ -50,8 +50,12 @@ test_unit_cover: test_unit_visual: go test ./... -coverprofile /tmp/cover.out -covermode=count go tool cover -html=/tmp/cover.out - + .PHONY: test_unit_codecov test_unit_codecov: go test ./... -race -coverprofile=coverage.txt -covermode=atomic curl -s https://codecov.io/bash > codecov_bash.sh && bash codecov_bash.sh + +.PHONY: go-tidy +go-tidy: + go mod tidy diff --git a/boilerplate/flyte/golang_test_targets/download_tooling.sh b/boilerplate/flyte/golang_test_targets/download_tooling.sh index 9cd49959f4..1d6ba1c675 100755 --- a/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ b/boilerplate/flyte/golang_test_targets/download_tooling.sh @@ -16,23 +16,25 @@ set -e # List of tools to go get # In the format of ":" or ":" if no cli tools=( - "github.com/EngHabu/mockery/cmd/mockery" - "github.com/flyteorg/flytestdlib/cli/pflags@latest" - "github.com/golangci/golangci-lint/cmd/golangci-lint" - "github.com/daixiang0/gci" - "github.com/alvaroloes/enumer" - "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" + "github.com/EngHabu/mockery/cmd/mockery" + "github.com/golangci/golangci-lint/cmd/golangci-lint" + "github.com/daixiang0/gci" + "github.com/alvaroloes/enumer" + "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" ) +# This ensures pflags are up to date. +make -C $REPO_ROOT/flytestdlib compile +cp $REPO_ROOT/flytestdlib/bin/pflags $(go env GOPATH)/bin + tmp_dir=$(mktemp -d -t gotooling-XXX) echo "Using temp directory ${tmp_dir}" -cp -R boilerplate/flyte/golang_support_tools/* $tmp_dir +cp -R ../boilerplate/flyte/golang_support_tools/* $tmp_dir pushd "$tmp_dir" -for tool in "${tools[@]}" -do - echo "Installing ${tool}" - GO111MODULE=on go install $tool +for tool in "${tools[@]}"; do + echo "Installing ${tool}" + GO111MODULE=on go install $tool done popd diff --git a/datacatalog/boilerplate/flyte/golangci_file/.golangci.yml b/boilerplate/flyte/golangci_file/.golangci.yml similarity index 100% rename from datacatalog/boilerplate/flyte/golangci_file/.golangci.yml rename to boilerplate/flyte/golangci_file/.golangci.yml diff --git a/datacatalog/boilerplate/flyte/golangci_file/Readme.rst b/boilerplate/flyte/golangci_file/Readme.rst similarity index 100% rename from datacatalog/boilerplate/flyte/golangci_file/Readme.rst rename to boilerplate/flyte/golangci_file/Readme.rst diff --git a/datacatalog/boilerplate/flyte/golangci_file/update.sh b/boilerplate/flyte/golangci_file/update.sh similarity index 100% rename from datacatalog/boilerplate/flyte/golangci_file/update.sh rename to boilerplate/flyte/golangci_file/update.sh diff --git a/datacatalog/boilerplate/flyte/precommit/Makefile b/boilerplate/flyte/precommit/Makefile similarity index 100% rename from datacatalog/boilerplate/flyte/precommit/Makefile rename to boilerplate/flyte/precommit/Makefile diff --git a/datacatalog/boilerplate/flyte/precommit/hooks/pre-push b/boilerplate/flyte/precommit/hooks/pre-push similarity index 100% rename from datacatalog/boilerplate/flyte/precommit/hooks/pre-push rename to boilerplate/flyte/precommit/hooks/pre-push diff --git a/datacatalog/boilerplate/flyte/precommit/hooks/prepare-commit-msg b/boilerplate/flyte/precommit/hooks/prepare-commit-msg similarity index 100% rename from datacatalog/boilerplate/flyte/precommit/hooks/prepare-commit-msg rename to boilerplate/flyte/precommit/hooks/prepare-commit-msg diff --git a/datacatalog/boilerplate/flyte/precommit/update.sh b/boilerplate/flyte/precommit/update.sh similarity index 100% rename from datacatalog/boilerplate/flyte/precommit/update.sh rename to boilerplate/flyte/precommit/update.sh diff --git a/datacatalog/boilerplate/flyte/pull_request_template/Readme.rst b/boilerplate/flyte/pull_request_template/Readme.rst similarity index 100% rename from datacatalog/boilerplate/flyte/pull_request_template/Readme.rst rename to boilerplate/flyte/pull_request_template/Readme.rst diff --git a/datacatalog/boilerplate/flyte/pull_request_template/pull_request_template.md b/boilerplate/flyte/pull_request_template/pull_request_template.md similarity index 100% rename from datacatalog/boilerplate/flyte/pull_request_template/pull_request_template.md rename to boilerplate/flyte/pull_request_template/pull_request_template.md diff --git a/datacatalog/boilerplate/flyte/pull_request_template/update.sh b/boilerplate/flyte/pull_request_template/update.sh similarity index 100% rename from datacatalog/boilerplate/flyte/pull_request_template/update.sh rename to boilerplate/flyte/pull_request_template/update.sh diff --git a/boilerplate/update.cfg b/boilerplate/update.cfg deleted file mode 100644 index 5ba796f048..0000000000 --- a/boilerplate/update.cfg +++ /dev/null @@ -1,3 +0,0 @@ -flyte/end2end -flyte/code_of_conduct -flyte/golang_test_targets diff --git a/datacatalog/Makefile b/datacatalog/Makefile index 15a9a29341..e4e9b72c42 100644 --- a/datacatalog/Makefile +++ b/datacatalog/Makefile @@ -1,11 +1,7 @@ export REPOSITORY=datacatalog -include boilerplate/flyte/docker_build/Makefile -include boilerplate/flyte/golang_test_targets/Makefile - -.PHONY: update_boilerplate -update_boilerplate: - @curl https://raw.githubusercontent.com/flyteorg/boilerplate/master/boilerplate/update.sh -o boilerplate/update.sh - @boilerplate/update.sh +export REPO_ROOT=.. +include ../boilerplate/flyte/docker_build/Makefile +include ../boilerplate/flyte/golang_test_targets/Makefile .PHONY: compile compile: @@ -17,11 +13,3 @@ linux_compile: export CGO_ENABLED ?= 0 linux_compile: export GOOS ?= linux linux_compile: go build -o /artifacts/datacatalog ./cmd/ - -.PHONY: generate -generate: - @go generate ./... - -.PHONY: go-tidy -go-tidy: - go mod tidy diff --git a/datacatalog/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md b/datacatalog/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md deleted file mode 100644 index e12139d691..0000000000 --- a/datacatalog/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,2 +0,0 @@ -This project is governed by LF AI Foundation's [code of conduct](https://lfprojects.org/policies/code-of-conduct/). -All contributors and participants agree to abide by its terms. diff --git a/datacatalog/boilerplate/flyte/code_of_conduct/README.rst b/datacatalog/boilerplate/flyte/code_of_conduct/README.rst deleted file mode 100644 index 0c9f2f1ec5..0000000000 --- a/datacatalog/boilerplate/flyte/code_of_conduct/README.rst +++ /dev/null @@ -1,2 +0,0 @@ -CODE OF CONDUCT -~~~~~~~~~~~~~~~ diff --git a/datacatalog/boilerplate/flyte/code_of_conduct/update.sh b/datacatalog/boilerplate/flyte/code_of_conduct/update.sh deleted file mode 100755 index 42f6158460..0000000000 --- a/datacatalog/boilerplate/flyte/code_of_conduct/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/CODE_OF_CONDUCT.md ${DIR}/../../../CODE_OF_CONDUCT.md diff --git a/datacatalog/boilerplate/flyte/end2end/Makefile b/datacatalog/boilerplate/flyte/end2end/Makefile deleted file mode 100644 index 98ee63ae7a..0000000000 --- a/datacatalog/boilerplate/flyte/end2end/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -.PHONY: end2end_execute -end2end_execute: export FLYTESNACKS_PRIORITIES ?= P0 -end2end_execute: export FLYTESNACKS_VERSION ?= $(shell curl --silent "https://api.github.com/repos/flyteorg/flytesnacks/releases/latest" | jq -r .tag_name) -end2end_execute: - ./boilerplate/flyte/end2end/end2end.sh ./boilerplate/flyte/end2end/functional-test-config.yaml --return_non_zero_on_failure - -.PHONY: k8s_integration_execute -k8s_integration_execute: - echo "pass" diff --git a/datacatalog/boilerplate/flyte/end2end/end2end.sh b/datacatalog/boilerplate/flyte/end2end/end2end.sh deleted file mode 100755 index 5dd825c1a0..0000000000 --- a/datacatalog/boilerplate/flyte/end2end/end2end.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst -set -eu - -CONFIG_FILE=$1; shift -EXTRA_FLAGS=( "$@" ) - -python ./boilerplate/flyte/end2end/run-tests.py $FLYTESNACKS_VERSION $FLYTESNACKS_PRIORITIES $CONFIG_FILE ${EXTRA_FLAGS[@]} diff --git a/datacatalog/boilerplate/flyte/end2end/functional-test-config.yaml b/datacatalog/boilerplate/flyte/end2end/functional-test-config.yaml deleted file mode 100644 index 13fc445675..0000000000 --- a/datacatalog/boilerplate/flyte/end2end/functional-test-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///localhost:30080 - authType: Pkce - insecure: true diff --git a/datacatalog/boilerplate/flyte/end2end/run-tests.py b/datacatalog/boilerplate/flyte/end2end/run-tests.py deleted file mode 100644 index 5365da006e..0000000000 --- a/datacatalog/boilerplate/flyte/end2end/run-tests.py +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/env python3 - -import datetime -import json -import sys -import time -import traceback -from typing import Dict, List, Mapping, Tuple - -import click -import requests -from flytekit.configuration import Config -from flytekit.models.core.execution import WorkflowExecutionPhase -from flytekit.remote import FlyteRemote -from flytekit.remote.executions import FlyteWorkflowExecution - -WAIT_TIME = 10 -MAX_ATTEMPTS = 200 - -# This dictionary maps the names found in the flytesnacks manifest to a list of workflow names and -# inputs. This is so we can progressively cover all priorities in the original flytesnacks manifest, -# starting with "core". -FLYTESNACKS_WORKFLOW_GROUPS: Mapping[str, List[Tuple[str, dict]]] = { - "lite": [ - ("basics.hello_world.hello_world_wf", {}), - ], - "core": [ - # ("development_lifecycle.decks.image_renderer_wf", {}), - # The chain_workflows example in flytesnacks expects to be running in a sandbox. - ("advanced_composition.chain_entities.chain_workflows_wf", {}), - ("advanced_composition.dynamics.wf", {"s1": "Pear", "s2": "Earth"}), - ("advanced_composition.map_task.my_map_workflow", {"a": [1, 2, 3, 4, 5]}), - # Workflows that use nested executions cannot be launched via flyteremote. - # This issue is being tracked in https://github.com/flyteorg/flyte/issues/1482. - # ("control_flow.run_conditions.multiplier", {"my_input": 0.5}), - # ("control_flow.run_conditions.multiplier_2", {"my_input": 10}), - # ("control_flow.run_conditions.multiplier_3", {"my_input": 5}), - # ("control_flow.run_conditions.basic_boolean_wf", {"seed": 5}), - # ("control_flow.run_conditions.bool_input_wf", {"b": True}), - # ("control_flow.run_conditions.nested_conditions", {"my_input": 0.4}), - # ("control_flow.run_conditions.consume_outputs", {"my_input": 0.4, "seed": 7}), - # ("control_flow.run_merge_sort.merge_sort", {"numbers": [5, 4, 3, 2, 1], "count": 5}), - ("advanced_composition.subworkflows.parent_workflow", {"my_input1": "hello"}), - ("advanced_composition.subworkflows.nested_parent_wf", {"a": 3}), - ("basics.workflow.simple_wf", {"x": [1, 2, 3], "y": [1, 2, 3]}), - # TODO: enable new files and folders workflows - # ("basics.files.rotate_one_workflow", {"in_image": "https://upload.wikimedia.org/wikipedia/commons/d/d2/Julia_set_%28C_%3D_0.285%2C_0.01%29.jpg"}), - # ("basics.folders.download_and_rotate", {}), - ("basics.hello_world.hello_world_wf", {}), - ("basics.named_outputs.simple_wf_with_named_outputs", {}), - # # Getting a 403 for the wikipedia image - # # ("basics.reference_task.wf", {}), - ("data_types_and_io.custom_objects.wf", {"x": 10, "y": 20}), - # Enums are not supported in flyteremote - # ("type_system.enums.enum_wf", {"c": "red"}), - ("data_types_and_io.schema.df_wf", {"a": 42}), - ("data_types_and_io.typed_schema.wf", {}), - # ("my.imperative.workflow.example", {"in1": "hello", "in2": "foo"}), - ], - "integrations-k8s-spark": [ - ("k8s_spark_plugin.pyspark_pi.my_spark", {"triggered_date": datetime.datetime.now()}), - ], - "integrations-kfpytorch": [ - ("kfpytorch_plugin.pytorch_mnist.pytorch_training_wf", {}), - ], - "integrations-kftensorflow": [ - ("kftensorflow_plugin.tf_mnist.mnist_tensorflow_workflow", {}), - ], - # "integrations-pod": [ - # ("pod.pod.pod_workflow", {}), - # ], - "integrations-pandera_examples": [ - ("pandera_plugin.basic_schema_example.process_data", {}), - # TODO: investigate type mismatch float -> numpy.float64 - # ("pandera_plugin.validating_and_testing_ml_pipelines.pipeline", {"data_random_state": 42, "model_random_state": 99}), - ], - "integrations-modin_examples": [ - ("modin_plugin.knn_classifier.pipeline", {}), - ], - "integrations-papermilltasks": [ - ("papermill_plugin.simple.nb_to_python_wf", {"f": 3.1415926535}), - ], - "integrations-greatexpectations": [ - ("greatexpectations_plugin.task_example.simple_wf", {}), - ("greatexpectations_plugin.task_example.file_wf", {}), - ("greatexpectations_plugin.task_example.schema_wf", {}), - ("greatexpectations_plugin.task_example.runtime_wf", {}), - ], -} - - -def execute_workflow(remote, version, workflow_name, inputs): - print(f"Fetching workflow={workflow_name} and version={version}") - wf = remote.fetch_workflow(name=workflow_name, version=version) - return remote.execute(wf, inputs=inputs, wait=False) - - -def executions_finished(executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]) -> bool: - for executions in executions_by_wfgroup.values(): - if not all([execution.is_done for execution in executions]): - return False - return True - - -def sync_executions(remote: FlyteRemote, executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]): - try: - for executions in executions_by_wfgroup.values(): - for execution in executions: - print(f"About to sync execution_id={execution.id.name}") - remote.sync(execution) - except Exception: - print(traceback.format_exc()) - print("GOT TO THE EXCEPT") - print("COUNT THIS!") - - -def report_executions(executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]): - for executions in executions_by_wfgroup.values(): - for execution in executions: - print(execution) - - -def schedule_workflow_groups( - tag: str, - workflow_groups: List[str], - remote: FlyteRemote, - terminate_workflow_on_failure: bool, -) -> Dict[str, bool]: - """ - Schedule workflows executions for all workflow groups and return True if all executions succeed, otherwise - return False. - """ - executions_by_wfgroup = {} - # Schedule executions for each workflow group, - for wf_group in workflow_groups: - workflows = FLYTESNACKS_WORKFLOW_GROUPS.get(wf_group, []) - executions_by_wfgroup[wf_group] = [ - execute_workflow(remote, tag, workflow[0], workflow[1]) for workflow in workflows - ] - - # Wait for all executions to finish - attempt = 0 - while attempt == 0 or (not executions_finished(executions_by_wfgroup) and attempt < MAX_ATTEMPTS): - attempt += 1 - print(f"Not all executions finished yet. Sleeping for some time, will check again in {WAIT_TIME}s") - time.sleep(WAIT_TIME) - sync_executions(remote, executions_by_wfgroup) - - report_executions(executions_by_wfgroup) - - results = {} - for wf_group, executions in executions_by_wfgroup.items(): - non_succeeded_executions = [] - for execution in executions: - if execution.closure.phase != WorkflowExecutionPhase.SUCCEEDED: - non_succeeded_executions.append(execution) - # Report failing cases - if len(non_succeeded_executions) != 0: - print(f"Failed executions for {wf_group}:") - for execution in non_succeeded_executions: - print(f" workflow={execution.spec.launch_plan.name}, execution_id={execution.id.name}") - if terminate_workflow_on_failure: - remote.terminate(execution, "aborting execution scheduled in functional test") - # A workflow group succeeds iff all of its executions succeed - results[wf_group] = len(non_succeeded_executions) == 0 - return results - - -def valid(workflow_group): - """ - Return True if a workflow group is contained in FLYTESNACKS_WORKFLOW_GROUPS, - False otherwise. - """ - return workflow_group in FLYTESNACKS_WORKFLOW_GROUPS.keys() - - -def run( - flytesnacks_release_tag: str, - priorities: List[str], - config_file_path, - terminate_workflow_on_failure: bool, -) -> List[Dict[str, str]]: - remote = FlyteRemote( - Config.auto(config_file=config_file_path), - default_project="flytesnacks", - default_domain="development", - ) - - # For a given release tag and priority, this function filters the workflow groups from the flytesnacks - # manifest file. For example, for the release tag "v0.2.224" and the priority "P0" it returns [ "core" ]. - manifest_url = ( - "https://raw.githubusercontent.com/flyteorg/flytesnacks/" f"{flytesnacks_release_tag}/flyte_tests_manifest.json" - ) - r = requests.get(manifest_url) - parsed_manifest = r.json() - workflow_groups = [] - workflow_groups = ( - ["lite"] - if "lite" in priorities - else [group["name"] for group in parsed_manifest if group["priority"] in priorities] - ) - - results = [] - valid_workgroups = [] - for workflow_group in workflow_groups: - if not valid(workflow_group): - results.append( - { - "label": workflow_group, - "status": "coming soon", - "color": "grey", - } - ) - continue - valid_workgroups.append(workflow_group) - - results_by_wfgroup = schedule_workflow_groups( - flytesnacks_release_tag, valid_workgroups, remote, terminate_workflow_on_failure - ) - - for workflow_group, succeeded in results_by_wfgroup.items(): - if succeeded: - background_color = "green" - status = "passing" - else: - background_color = "red" - status = "failing" - - # Workflow groups can be only in one of three states: - # 1. passing: this indicates all the workflow executions for that workflow group - # executed successfully - # 2. failing: this state indicates that at least one execution failed in that - # workflow group - # 3. coming soon: this state is used to indicate that the workflow group was not - # implemented yet. - # - # Each state has a corresponding status and color to be used in the badge for that - # workflow group. - result = { - "label": workflow_group, - "status": status, - "color": background_color, - } - results.append(result) - return results - - -@click.command() -@click.option( - "--return_non_zero_on_failure", - default=False, - is_flag=True, - help="Return a non-zero exit status if any workflow fails", -) -@click.option( - "--terminate_workflow_on_failure", - default=False, - is_flag=True, - help="Abort failing workflows upon exit", -) -@click.argument("flytesnacks_release_tag") -@click.argument("priorities") -@click.argument("config_file") -def cli( - flytesnacks_release_tag, - priorities, - config_file, - return_non_zero_on_failure, - terminate_workflow_on_failure, -): - print(f"return_non_zero_on_failure={return_non_zero_on_failure}") - results = run(flytesnacks_release_tag, priorities, config_file, terminate_workflow_on_failure) - - # Write a json object in its own line describing the result of this run to stdout - print(f"Result of run:\n{json.dumps(results)}") - - # Return a non-zero exit code if core fails - if return_non_zero_on_failure: - for result in results: - if result["status"] not in ("passing", "coming soon"): - sys.exit(1) - - -if __name__ == "__main__": - cli() diff --git a/datacatalog/boilerplate/flyte/golang_test_targets/Makefile b/datacatalog/boilerplate/flyte/golang_test_targets/Makefile deleted file mode 100644 index be72275f5a..0000000000 --- a/datacatalog/boilerplate/flyte/golang_test_targets/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - - -.PHONY: download_tooling -download_tooling: #download dependencies (including test deps) for the package - @boilerplate/flyte/golang_test_targets/download_tooling.sh - -.PHONY: generate -generate: download_tooling #generate go code - @boilerplate/flyte/golang_test_targets/go-gen.sh - -.PHONY: lint -lint: download_tooling #lints the package for common code smells - GL_DEBUG=linters_output,env golangci-lint run --fix --deadline=5m --exclude deprecated -v - -# If code is failing goimports linter, this will fix. -# skips 'vendor' -.PHONY: goimports -goimports: - @boilerplate/flyte/golang_test_targets/goimports - -.PHONY: mod_download -mod_download: #download dependencies (including test deps) for the package - go mod download - -.PHONY: install -install: download_tooling mod_download - -.PHONY: show -show: - go list -m all - -.PHONY: test_unit -test_unit: - go test -cover ./... -race - -.PHONY: test_benchmark -test_benchmark: - go test -bench . ./... - -.PHONY: test_unit_cover -test_unit_cover: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -func /tmp/cover.out - -.PHONY: test_unit_visual -test_unit_visual: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -html=/tmp/cover.out - -.PHONY: test_unit_codecov -test_unit_codecov: - go test ./... -race -coverprofile=coverage.txt -covermode=atomic - curl -s https://codecov.io/bash > codecov_bash.sh && bash codecov_bash.sh diff --git a/datacatalog/boilerplate/flyte/golang_test_targets/Readme.rst b/datacatalog/boilerplate/flyte/golang_test_targets/Readme.rst deleted file mode 100644 index f9d890fdd7..0000000000 --- a/datacatalog/boilerplate/flyte/golang_test_targets/Readme.rst +++ /dev/null @@ -1,31 +0,0 @@ -Golang Test Targets -~~~~~~~~~~~~~~~~~~~ - -Provides an ``install`` make target that uses ``go mod`` to install golang dependencies. - -Provides a ``lint`` make target that uses golangci to lint your code. - -Provides a ``test_unit`` target for unit tests. - -Provides a ``test_unit_cover`` target for analysing coverage of unit tests, which will output the coverage of each function and total statement coverage. - -Provides a ``test_unit_visual`` target for visualizing coverage of unit tests through an interactive html code heat map. - -Provides a ``test_benchmark`` target for benchmark tests. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. - -Make sure you're using ``go mod`` for dependency management. - -Provide a ``.golangci`` configuration (the lint target requires it). - -Add ``include boilerplate/flyte/golang_test_targets/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/golang_test_targets/Makefile - -(this ensures the extra make targets get included in your main Makefile) diff --git a/datacatalog/boilerplate/flyte/golang_test_targets/download_tooling.sh b/datacatalog/boilerplate/flyte/golang_test_targets/download_tooling.sh deleted file mode 100755 index 9cd49959f4..0000000000 --- a/datacatalog/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Everything in this file needs to be installed outside of current module -# The reason we cannot turn off module entirely and install is that we need the replace statement in go.mod -# because we are installing a mockery fork. Turning it off would result installing the original not the fork. -# We also want to version all the other tools. We also want to be able to run go mod tidy without removing the version -# pins. To facilitate this, we're maintaining two sets of go.mod/sum files - the second one only for tooling. This is -# the same approach that go 1.14 will take as well. -# See: -# https://github.com/flyteorg/flyte/issues/129 -# https://github.com/golang/go/issues/30515 for some background context -# https://github.com/go-modules-by-example/index/blob/5ec250b4b78114a55001bd7c9cb88f6e07270ea5/010_tools/README.md - -set -e - -# List of tools to go get -# In the format of ":" or ":" if no cli -tools=( - "github.com/EngHabu/mockery/cmd/mockery" - "github.com/flyteorg/flytestdlib/cli/pflags@latest" - "github.com/golangci/golangci-lint/cmd/golangci-lint" - "github.com/daixiang0/gci" - "github.com/alvaroloes/enumer" - "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" -) - -tmp_dir=$(mktemp -d -t gotooling-XXX) -echo "Using temp directory ${tmp_dir}" -cp -R boilerplate/flyte/golang_support_tools/* $tmp_dir -pushd "$tmp_dir" - -for tool in "${tools[@]}" -do - echo "Installing ${tool}" - GO111MODULE=on go install $tool -done - -popd diff --git a/datacatalog/boilerplate/flyte/golang_test_targets/go-gen.sh b/datacatalog/boilerplate/flyte/golang_test_targets/go-gen.sh deleted file mode 100755 index 5ac17fa40a..0000000000 --- a/datacatalog/boilerplate/flyte/golang_test_targets/go-gen.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -echo "Running go generate" -go generate ./... - -# This section is used by GitHub workflow to ensure that the generation step was run -if [ -n "$DELTA_CHECK" ]; then - DIRTY=$(git status --porcelain) - if [ -n "$DIRTY" ]; then - echo "FAILED: Go code updated without committing generated code." - echo "Ensure make generate has run and all changes are committed." - DIFF=$(git diff) - echo "diff detected: $DIFF" - DIFF=$(git diff --name-only) - echo "files different: $DIFF" - exit 1 - else - echo "SUCCESS: Generated code is up to date." - fi -fi diff --git a/datacatalog/boilerplate/flyte/golang_test_targets/goimports b/datacatalog/boilerplate/flyte/golang_test_targets/goimports deleted file mode 100755 index 40f50d106e..0000000000 --- a/datacatalog/boilerplate/flyte/golang_test_targets/goimports +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*" -not -path "./boilerplate/*") -gci write -s standard -s default -s "prefix(github.com/flyteorg)" --custom-order --skip-generated . diff --git a/datacatalog/boilerplate/update.cfg b/datacatalog/boilerplate/update.cfg deleted file mode 100644 index 9d3bd30565..0000000000 --- a/datacatalog/boilerplate/update.cfg +++ /dev/null @@ -1,6 +0,0 @@ -flyte/docker_build -flyte/golang_test_targets -flyte/golangci_file -flyte/golang_support_tools -flyte/pull_request_template -flyte/ diff --git a/datacatalog/boilerplate/update.sh b/datacatalog/boilerplate/update.sh deleted file mode 100755 index 73de4dc91c..0000000000 --- a/datacatalog/boilerplate/update.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -OUT="$(mktemp -d)" -trap 'rm -fr $OUT' EXIT - -git clone https://github.com/flyteorg/boilerplate.git "${OUT}" - -echo "Updating the update.sh script." -cp "${OUT}/boilerplate/update.sh" "${DIR}/update.sh" - -CONFIG_FILE="${DIR}/update.cfg" -README="https://github.com/flyteorg/boilerplate/blob/master/Readme.rst" - -if [ ! -f "$CONFIG_FILE" ]; then - echo "$CONFIG_FILE not found." - echo "This file is required in order to select which features to include." - echo "See $README for more details." - exit 1 -fi - -if [ -z "$REPOSITORY" ]; then - echo "$REPOSITORY is required to run this script" - echo "See $README for more details." - exit 1 -fi - -while read -r directory junk; do - # Skip comment lines (which can have leading whitespace) - if [[ "$directory" == '#'* ]]; then - continue - fi - # Skip blank or whitespace-only lines - if [[ "$directory" == "" ]]; then - continue - fi - # Lines like - # valid/path other_junk - # are not acceptable, unless `other_junk` is a comment - if [[ "$junk" != "" ]] && [[ "$junk" != '#'* ]]; then - echo "Invalid config! Only one directory is allowed per line. Found '$junk'" - exit 1 - fi - - dir_path="${OUT}/boilerplate/${directory}" - # Make sure the directory exists - if ! [[ -d "$dir_path" ]]; then - echo "Invalid boilerplate directory: '$directory'" - exit 1 - fi - - echo "***********************************************************************************" - echo "$directory is configured in update.cfg." - echo "-----------------------------------------------------------------------------------" - echo "syncing files from source." - rm -rf "${DIR:?}/${directory}" - mkdir -p "$(dirname "${DIR}"/"${directory}")" - cp -r "$dir_path" "${DIR}/${directory}" - if [ -f "${DIR}/${directory}/update.sh" ]; then - echo "executing ${DIR}/${directory}/update.sh" - "${DIR}/${directory}/update.sh" - fi - echo "***********************************************************************************" - echo "" -done < "$CONFIG_FILE" diff --git a/flyteadmin/Makefile b/flyteadmin/Makefile index 8c500ace5f..fad51a2edf 100644 --- a/flyteadmin/Makefile +++ b/flyteadmin/Makefile @@ -1,8 +1,9 @@ export REPOSITORY=flyteadmin export FLYTE_SCHEDULER_REPOSITORY=flytescheduler -include boilerplate/flyte/docker_build/Makefile -include boilerplate/flyte/golang_test_targets/Makefile -include boilerplate/flyte/end2end/Makefile +export REPO_ROOT=.. +include ../boilerplate/flyte/docker_build/Makefile +include ../boilerplate/flyte/golang_test_targets/Makefile +include ../boilerplate/flyte/end2end/Makefile GIT_VERSION := $(shell git describe --always --tags) GIT_HASH := $(shell git rev-parse --short HEAD) @@ -67,7 +68,6 @@ linux_compile_scheduler: export GOOS ?= linux linux_compile_scheduler: go build -o /artifacts/flytescheduler -ldflags=$(LD_FLAGS) ./cmd/scheduler/ - .PHONY: server server: go run cmd/main.go serve --server.kube-config ~/.kube/config --config flyteadmin_config.yaml @@ -76,7 +76,6 @@ server: scheduler: go run scheduler/main.go run --server.kube-config ~/.kube/config --config flyteadmin_config.yaml - .PHONY: migrate migrate: go run cmd/main.go migrate run --server.kube-config ~/.kube/config --config flyteadmin_config.yaml @@ -86,7 +85,3 @@ seed_projects: go run cmd/main.go migrate seed-projects project admintests flytekit --server.kube-config ~/.kube/config --config flyteadmin_config.yaml all: compile - -.PHONY: go-tidy -go-tidy: - go mod tidy diff --git a/flyteadmin/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md b/flyteadmin/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md deleted file mode 100644 index e12139d691..0000000000 --- a/flyteadmin/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,2 +0,0 @@ -This project is governed by LF AI Foundation's [code of conduct](https://lfprojects.org/policies/code-of-conduct/). -All contributors and participants agree to abide by its terms. diff --git a/flyteadmin/boilerplate/flyte/code_of_conduct/README.rst b/flyteadmin/boilerplate/flyte/code_of_conduct/README.rst deleted file mode 100644 index 0c9f2f1ec5..0000000000 --- a/flyteadmin/boilerplate/flyte/code_of_conduct/README.rst +++ /dev/null @@ -1,2 +0,0 @@ -CODE OF CONDUCT -~~~~~~~~~~~~~~~ diff --git a/flyteadmin/boilerplate/flyte/code_of_conduct/update.sh b/flyteadmin/boilerplate/flyte/code_of_conduct/update.sh deleted file mode 100755 index 42f6158460..0000000000 --- a/flyteadmin/boilerplate/flyte/code_of_conduct/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/CODE_OF_CONDUCT.md ${DIR}/../../../CODE_OF_CONDUCT.md diff --git a/flyteadmin/boilerplate/flyte/docker_build/Makefile b/flyteadmin/boilerplate/flyte/docker_build/Makefile deleted file mode 100644 index e2b2b8a18d..0000000000 --- a/flyteadmin/boilerplate/flyte/docker_build/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -.PHONY: docker_build -docker_build: - IMAGE_NAME=$$REPOSITORY ./boilerplate/flyte/docker_build/docker_build.sh - -.PHONY: dockerhub_push -dockerhub_push: - IMAGE_NAME=flyteorg/$$REPOSITORY REGISTRY=docker.io ./boilerplate/flyte/docker_build/docker_build.sh diff --git a/flyteadmin/boilerplate/flyte/docker_build/Readme.rst b/flyteadmin/boilerplate/flyte/docker_build/Readme.rst deleted file mode 100644 index 7790b8fbfd..0000000000 --- a/flyteadmin/boilerplate/flyte/docker_build/Readme.rst +++ /dev/null @@ -1,23 +0,0 @@ -Docker Build and Push -~~~~~~~~~~~~~~~~~~~~~ - -Provides a ``make docker_build`` target that builds your image locally. - -Provides a ``make dockerhub_push`` target that pushes your final image to Dockerhub. - -The Dockerhub image will tagged ``:`` - -If git head has a git tag, the Dockerhub image will also be tagged ``:``. - -**To Enable:** - -Add ``flyteorg/docker_build`` to your ``boilerplate/update.cfg`` file. - -Add ``include boilerplate/flyte/docker_build/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/docker_build/Makefile - -(this ensures the extra Make targets get included in your main Makefile) diff --git a/flyteadmin/boilerplate/flyte/docker_build/docker_build.sh b/flyteadmin/boilerplate/flyte/docker_build/docker_build.sh deleted file mode 100755 index 817189aee1..0000000000 --- a/flyteadmin/boilerplate/flyte/docker_build/docker_build.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -echo "" -echo "------------------------------------" -echo " DOCKER BUILD" -echo "------------------------------------" -echo "" - -if [ -n "$REGISTRY" ]; then - # Do not push if there are unstaged git changes - CHANGED=$(git status --porcelain) - if [ -n "$CHANGED" ]; then - echo "Please commit git changes before pushing to a registry" - exit 1 - fi -fi - - -GIT_SHA=$(git rev-parse HEAD) - -IMAGE_TAG_SUFFIX="" -# for intermediate build phases, append -$BUILD_PHASE to all image tags -if [ -n "$BUILD_PHASE" ]; then - IMAGE_TAG_SUFFIX="-${BUILD_PHASE}" -fi - -IMAGE_TAG_WITH_SHA="${IMAGE_NAME}:${GIT_SHA}${IMAGE_TAG_SUFFIX}" - -RELEASE_SEMVER=$(git describe --tags --exact-match "$GIT_SHA" 2>/dev/null) || true -if [ -n "$RELEASE_SEMVER" ]; then - IMAGE_TAG_WITH_SEMVER="${IMAGE_NAME}:${RELEASE_SEMVER}${IMAGE_TAG_SUFFIX}" -fi - -# build the image -# passing no build phase will build the final image -docker build -t "$IMAGE_TAG_WITH_SHA" --target=${BUILD_PHASE} . -echo "${IMAGE_TAG_WITH_SHA} built locally." - -# if REGISTRY specified, push the images to the remote registry -if [ -n "$REGISTRY" ]; then - - if [ -n "${DOCKER_REGISTRY_PASSWORD}" ]; then - docker login --username="$DOCKER_REGISTRY_USERNAME" --password="$DOCKER_REGISTRY_PASSWORD" - fi - - docker tag "$IMAGE_TAG_WITH_SHA" "${REGISTRY}/${IMAGE_TAG_WITH_SHA}" - - docker push "${REGISTRY}/${IMAGE_TAG_WITH_SHA}" - echo "${REGISTRY}/${IMAGE_TAG_WITH_SHA} pushed to remote." - - # If the current commit has a semver tag, also push the images with the semver tag - if [ -n "$RELEASE_SEMVER" ]; then - - docker tag "$IMAGE_TAG_WITH_SHA" "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER}" - - docker push "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER}" - echo "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER} pushed to remote." - - fi -fi diff --git a/flyteadmin/boilerplate/flyte/end2end/Makefile b/flyteadmin/boilerplate/flyte/end2end/Makefile deleted file mode 100644 index 98ee63ae7a..0000000000 --- a/flyteadmin/boilerplate/flyte/end2end/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -.PHONY: end2end_execute -end2end_execute: export FLYTESNACKS_PRIORITIES ?= P0 -end2end_execute: export FLYTESNACKS_VERSION ?= $(shell curl --silent "https://api.github.com/repos/flyteorg/flytesnacks/releases/latest" | jq -r .tag_name) -end2end_execute: - ./boilerplate/flyte/end2end/end2end.sh ./boilerplate/flyte/end2end/functional-test-config.yaml --return_non_zero_on_failure - -.PHONY: k8s_integration_execute -k8s_integration_execute: - echo "pass" diff --git a/flyteadmin/boilerplate/flyte/end2end/end2end.sh b/flyteadmin/boilerplate/flyte/end2end/end2end.sh deleted file mode 100755 index 5dd825c1a0..0000000000 --- a/flyteadmin/boilerplate/flyte/end2end/end2end.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst -set -eu - -CONFIG_FILE=$1; shift -EXTRA_FLAGS=( "$@" ) - -python ./boilerplate/flyte/end2end/run-tests.py $FLYTESNACKS_VERSION $FLYTESNACKS_PRIORITIES $CONFIG_FILE ${EXTRA_FLAGS[@]} diff --git a/flyteadmin/boilerplate/flyte/end2end/functional-test-config.yaml b/flyteadmin/boilerplate/flyte/end2end/functional-test-config.yaml deleted file mode 100644 index 13fc445675..0000000000 --- a/flyteadmin/boilerplate/flyte/end2end/functional-test-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///localhost:30080 - authType: Pkce - insecure: true diff --git a/flyteadmin/boilerplate/flyte/end2end/run-tests.py b/flyteadmin/boilerplate/flyte/end2end/run-tests.py deleted file mode 100644 index 5365da006e..0000000000 --- a/flyteadmin/boilerplate/flyte/end2end/run-tests.py +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/env python3 - -import datetime -import json -import sys -import time -import traceback -from typing import Dict, List, Mapping, Tuple - -import click -import requests -from flytekit.configuration import Config -from flytekit.models.core.execution import WorkflowExecutionPhase -from flytekit.remote import FlyteRemote -from flytekit.remote.executions import FlyteWorkflowExecution - -WAIT_TIME = 10 -MAX_ATTEMPTS = 200 - -# This dictionary maps the names found in the flytesnacks manifest to a list of workflow names and -# inputs. This is so we can progressively cover all priorities in the original flytesnacks manifest, -# starting with "core". -FLYTESNACKS_WORKFLOW_GROUPS: Mapping[str, List[Tuple[str, dict]]] = { - "lite": [ - ("basics.hello_world.hello_world_wf", {}), - ], - "core": [ - # ("development_lifecycle.decks.image_renderer_wf", {}), - # The chain_workflows example in flytesnacks expects to be running in a sandbox. - ("advanced_composition.chain_entities.chain_workflows_wf", {}), - ("advanced_composition.dynamics.wf", {"s1": "Pear", "s2": "Earth"}), - ("advanced_composition.map_task.my_map_workflow", {"a": [1, 2, 3, 4, 5]}), - # Workflows that use nested executions cannot be launched via flyteremote. - # This issue is being tracked in https://github.com/flyteorg/flyte/issues/1482. - # ("control_flow.run_conditions.multiplier", {"my_input": 0.5}), - # ("control_flow.run_conditions.multiplier_2", {"my_input": 10}), - # ("control_flow.run_conditions.multiplier_3", {"my_input": 5}), - # ("control_flow.run_conditions.basic_boolean_wf", {"seed": 5}), - # ("control_flow.run_conditions.bool_input_wf", {"b": True}), - # ("control_flow.run_conditions.nested_conditions", {"my_input": 0.4}), - # ("control_flow.run_conditions.consume_outputs", {"my_input": 0.4, "seed": 7}), - # ("control_flow.run_merge_sort.merge_sort", {"numbers": [5, 4, 3, 2, 1], "count": 5}), - ("advanced_composition.subworkflows.parent_workflow", {"my_input1": "hello"}), - ("advanced_composition.subworkflows.nested_parent_wf", {"a": 3}), - ("basics.workflow.simple_wf", {"x": [1, 2, 3], "y": [1, 2, 3]}), - # TODO: enable new files and folders workflows - # ("basics.files.rotate_one_workflow", {"in_image": "https://upload.wikimedia.org/wikipedia/commons/d/d2/Julia_set_%28C_%3D_0.285%2C_0.01%29.jpg"}), - # ("basics.folders.download_and_rotate", {}), - ("basics.hello_world.hello_world_wf", {}), - ("basics.named_outputs.simple_wf_with_named_outputs", {}), - # # Getting a 403 for the wikipedia image - # # ("basics.reference_task.wf", {}), - ("data_types_and_io.custom_objects.wf", {"x": 10, "y": 20}), - # Enums are not supported in flyteremote - # ("type_system.enums.enum_wf", {"c": "red"}), - ("data_types_and_io.schema.df_wf", {"a": 42}), - ("data_types_and_io.typed_schema.wf", {}), - # ("my.imperative.workflow.example", {"in1": "hello", "in2": "foo"}), - ], - "integrations-k8s-spark": [ - ("k8s_spark_plugin.pyspark_pi.my_spark", {"triggered_date": datetime.datetime.now()}), - ], - "integrations-kfpytorch": [ - ("kfpytorch_plugin.pytorch_mnist.pytorch_training_wf", {}), - ], - "integrations-kftensorflow": [ - ("kftensorflow_plugin.tf_mnist.mnist_tensorflow_workflow", {}), - ], - # "integrations-pod": [ - # ("pod.pod.pod_workflow", {}), - # ], - "integrations-pandera_examples": [ - ("pandera_plugin.basic_schema_example.process_data", {}), - # TODO: investigate type mismatch float -> numpy.float64 - # ("pandera_plugin.validating_and_testing_ml_pipelines.pipeline", {"data_random_state": 42, "model_random_state": 99}), - ], - "integrations-modin_examples": [ - ("modin_plugin.knn_classifier.pipeline", {}), - ], - "integrations-papermilltasks": [ - ("papermill_plugin.simple.nb_to_python_wf", {"f": 3.1415926535}), - ], - "integrations-greatexpectations": [ - ("greatexpectations_plugin.task_example.simple_wf", {}), - ("greatexpectations_plugin.task_example.file_wf", {}), - ("greatexpectations_plugin.task_example.schema_wf", {}), - ("greatexpectations_plugin.task_example.runtime_wf", {}), - ], -} - - -def execute_workflow(remote, version, workflow_name, inputs): - print(f"Fetching workflow={workflow_name} and version={version}") - wf = remote.fetch_workflow(name=workflow_name, version=version) - return remote.execute(wf, inputs=inputs, wait=False) - - -def executions_finished(executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]) -> bool: - for executions in executions_by_wfgroup.values(): - if not all([execution.is_done for execution in executions]): - return False - return True - - -def sync_executions(remote: FlyteRemote, executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]): - try: - for executions in executions_by_wfgroup.values(): - for execution in executions: - print(f"About to sync execution_id={execution.id.name}") - remote.sync(execution) - except Exception: - print(traceback.format_exc()) - print("GOT TO THE EXCEPT") - print("COUNT THIS!") - - -def report_executions(executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]): - for executions in executions_by_wfgroup.values(): - for execution in executions: - print(execution) - - -def schedule_workflow_groups( - tag: str, - workflow_groups: List[str], - remote: FlyteRemote, - terminate_workflow_on_failure: bool, -) -> Dict[str, bool]: - """ - Schedule workflows executions for all workflow groups and return True if all executions succeed, otherwise - return False. - """ - executions_by_wfgroup = {} - # Schedule executions for each workflow group, - for wf_group in workflow_groups: - workflows = FLYTESNACKS_WORKFLOW_GROUPS.get(wf_group, []) - executions_by_wfgroup[wf_group] = [ - execute_workflow(remote, tag, workflow[0], workflow[1]) for workflow in workflows - ] - - # Wait for all executions to finish - attempt = 0 - while attempt == 0 or (not executions_finished(executions_by_wfgroup) and attempt < MAX_ATTEMPTS): - attempt += 1 - print(f"Not all executions finished yet. Sleeping for some time, will check again in {WAIT_TIME}s") - time.sleep(WAIT_TIME) - sync_executions(remote, executions_by_wfgroup) - - report_executions(executions_by_wfgroup) - - results = {} - for wf_group, executions in executions_by_wfgroup.items(): - non_succeeded_executions = [] - for execution in executions: - if execution.closure.phase != WorkflowExecutionPhase.SUCCEEDED: - non_succeeded_executions.append(execution) - # Report failing cases - if len(non_succeeded_executions) != 0: - print(f"Failed executions for {wf_group}:") - for execution in non_succeeded_executions: - print(f" workflow={execution.spec.launch_plan.name}, execution_id={execution.id.name}") - if terminate_workflow_on_failure: - remote.terminate(execution, "aborting execution scheduled in functional test") - # A workflow group succeeds iff all of its executions succeed - results[wf_group] = len(non_succeeded_executions) == 0 - return results - - -def valid(workflow_group): - """ - Return True if a workflow group is contained in FLYTESNACKS_WORKFLOW_GROUPS, - False otherwise. - """ - return workflow_group in FLYTESNACKS_WORKFLOW_GROUPS.keys() - - -def run( - flytesnacks_release_tag: str, - priorities: List[str], - config_file_path, - terminate_workflow_on_failure: bool, -) -> List[Dict[str, str]]: - remote = FlyteRemote( - Config.auto(config_file=config_file_path), - default_project="flytesnacks", - default_domain="development", - ) - - # For a given release tag and priority, this function filters the workflow groups from the flytesnacks - # manifest file. For example, for the release tag "v0.2.224" and the priority "P0" it returns [ "core" ]. - manifest_url = ( - "https://raw.githubusercontent.com/flyteorg/flytesnacks/" f"{flytesnacks_release_tag}/flyte_tests_manifest.json" - ) - r = requests.get(manifest_url) - parsed_manifest = r.json() - workflow_groups = [] - workflow_groups = ( - ["lite"] - if "lite" in priorities - else [group["name"] for group in parsed_manifest if group["priority"] in priorities] - ) - - results = [] - valid_workgroups = [] - for workflow_group in workflow_groups: - if not valid(workflow_group): - results.append( - { - "label": workflow_group, - "status": "coming soon", - "color": "grey", - } - ) - continue - valid_workgroups.append(workflow_group) - - results_by_wfgroup = schedule_workflow_groups( - flytesnacks_release_tag, valid_workgroups, remote, terminate_workflow_on_failure - ) - - for workflow_group, succeeded in results_by_wfgroup.items(): - if succeeded: - background_color = "green" - status = "passing" - else: - background_color = "red" - status = "failing" - - # Workflow groups can be only in one of three states: - # 1. passing: this indicates all the workflow executions for that workflow group - # executed successfully - # 2. failing: this state indicates that at least one execution failed in that - # workflow group - # 3. coming soon: this state is used to indicate that the workflow group was not - # implemented yet. - # - # Each state has a corresponding status and color to be used in the badge for that - # workflow group. - result = { - "label": workflow_group, - "status": status, - "color": background_color, - } - results.append(result) - return results - - -@click.command() -@click.option( - "--return_non_zero_on_failure", - default=False, - is_flag=True, - help="Return a non-zero exit status if any workflow fails", -) -@click.option( - "--terminate_workflow_on_failure", - default=False, - is_flag=True, - help="Abort failing workflows upon exit", -) -@click.argument("flytesnacks_release_tag") -@click.argument("priorities") -@click.argument("config_file") -def cli( - flytesnacks_release_tag, - priorities, - config_file, - return_non_zero_on_failure, - terminate_workflow_on_failure, -): - print(f"return_non_zero_on_failure={return_non_zero_on_failure}") - results = run(flytesnacks_release_tag, priorities, config_file, terminate_workflow_on_failure) - - # Write a json object in its own line describing the result of this run to stdout - print(f"Result of run:\n{json.dumps(results)}") - - # Return a non-zero exit code if core fails - if return_non_zero_on_failure: - for result in results: - if result["status"] not in ("passing", "coming soon"): - sys.exit(1) - - -if __name__ == "__main__": - cli() diff --git a/flyteadmin/boilerplate/flyte/flyte_golang_compile/Readme.rst b/flyteadmin/boilerplate/flyte/flyte_golang_compile/Readme.rst deleted file mode 100644 index e6b56dd16e..0000000000 --- a/flyteadmin/boilerplate/flyte/flyte_golang_compile/Readme.rst +++ /dev/null @@ -1,16 +0,0 @@ -Flyte Golang Compile -~~~~~~~~~~~~~~~~~~~~ - -Common compile script for Flyte golang services. - -**To Enable:** - -Add ``flyteorg/flyte_golang_compile`` to your ``boilerplate/update.cfg`` file. - -Add the following to your Makefile - -:: - - .PHONY: compile_linux - compile_linux: - PACKAGES={{ *your packages }} OUTPUT={{ /path/to/output }} ./boilerplate/flyte/flyte_golang_compile.sh diff --git a/flyteadmin/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template b/flyteadmin/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template deleted file mode 100644 index f587e971be..0000000000 --- a/flyteadmin/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template +++ /dev/null @@ -1,26 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -if [ -z "$PACKAGES" ]; then - echo "PACKAGES environment VAR not set" - exit 1 -fi - -if [ -z "$OUTPUT" ]; then - echo "OUTPUT environment VAR not set" - exit 1 -fi - -# get the GIT_SHA and RELEASE_SEMVER - -GIT_SHA=$(git rev-parse HEAD) -RELEASE_SEMVER=$(git describe --tags --exact-match $GIT_SHA 2>/dev/null) - -CURRENT_PKG=github.com/flyteorg/{{ REPOSITORY }} -VERSION_PKG="${CURRENT_PKG}/vendor/github.com/flyteorg/flytestdlib" - -LDFLAGS="-X ${VERSION_PKG}/version.Build=${GIT_SHA} -X ${VERSION_PKG}/version.Version=${RELEASE_SEMVER}" - -GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "$LDFLAGS" -o "$OUTPUT" "$PACKAGES" diff --git a/flyteadmin/boilerplate/flyte/flyte_golang_compile/update.sh b/flyteadmin/boilerplate/flyte/flyte_golang_compile/update.sh deleted file mode 100755 index b1e6101c2b..0000000000 --- a/flyteadmin/boilerplate/flyte/flyte_golang_compile/update.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -echo " - generating ${DIR}/flyte_golang_compile.sh" -sed -e "s/{{REPOSITORY}}/${REPOSITORY}/g" ${DIR}/flyte_golang_compile.Template > ${DIR}/flyte_golang_compile.sh diff --git a/flyteadmin/boilerplate/flyte/github_workflows/Readme.rst b/flyteadmin/boilerplate/flyte/github_workflows/Readme.rst deleted file mode 100644 index f236923514..0000000000 --- a/flyteadmin/boilerplate/flyte/github_workflows/Readme.rst +++ /dev/null @@ -1,22 +0,0 @@ -Golang Github Actions -~~~~~~~~~~~~~~~~~ - -Provides a two github actions workflows. - -**To Enable:** - -Add ``flyteorg/github_workflows`` to your ``boilerplate/update.cfg`` file. - -Add a github secret ``package_name`` with the name to use for publishing (e.g. ``flytepropeller``). Typically, this will be the same name as the repository. - -*Note*: If you are working on a fork, include that prefix in your package name (``myfork/flytepropeller``). - -The actions will push to 2 repos: - - 1. ``docker.pkg.github.com/flyteorg//`` - 2. ``docker.pkg.github.com/flyteorg//-stages`` : this repo is used to cache build stages to speed up iterative builds after. - -There are two workflows that get deployed: - - 1. A workflow that runs on Pull Requests to build and push images to github registry tagged with the commit sha. - 2. A workflow that runs on master merges that bump the patch version of release tag, builds and pushes images to github registry tagged with the version, commit sha as well as "latest" diff --git a/flyteadmin/boilerplate/flyte/github_workflows/master.yml b/flyteadmin/boilerplate/flyte/github_workflows/master.yml deleted file mode 100644 index dade522918..0000000000 --- a/flyteadmin/boilerplate/flyte/github_workflows/master.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Master - -on: - push: - branches: - - master - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - with: - fetch-depth: '0' - - name: Bump version and push tag - id: bump-version - uses: anothrNick/github-tag-action@1.36.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - WITH_V: true - DEFAULT_BUMP: patch - - name: Push Docker Image to Github Registry - uses: whoan/docker-build-with-cache-action@v5 - with: - username: "${{ github.actor }}" - password: "${{ secrets.GITHUB_TOKEN }}" - image_name: ${{ secrets.package_name }} - image_tag: latest,${{ github.sha }},${{ steps.bump-version.outputs.tag }} - push_git_tag: true - registry: docker.pkg.github.com - build_extra_args: "--compress=true" diff --git a/flyteadmin/boilerplate/flyte/github_workflows/pull_request.yml b/flyteadmin/boilerplate/flyte/github_workflows/pull_request.yml deleted file mode 100644 index 932400bc4f..0000000000 --- a/flyteadmin/boilerplate/flyte/github_workflows/pull_request.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Pull Request - -on: - pull_request - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - name: Push Docker Image to Github Registry - uses: whoan/docker-build-with-cache-action@v5 - with: - username: "${{ github.actor }}" - password: "${{ secrets.GITHUB_TOKEN }}" - image_name: ${{ secrets.package_name }} - image_tag: ${{ github.sha }} - push_git_tag: true - registry: docker.pkg.github.com diff --git a/flyteadmin/boilerplate/flyte/github_workflows/update.sh b/flyteadmin/boilerplate/flyte/github_workflows/update.sh deleted file mode 100755 index d5a74a4fc0..0000000000 --- a/flyteadmin/boilerplate/flyte/github_workflows/update.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -mkdir -p ${DIR}/../../../.github/workflows - -echo " - generating github action workflows in root directory." -sed -e "s/{{REPOSITORY}}/${REPOSITORY}/g" ${DIR}/master.yml > ${DIR}/../../../.github/workflows/master.yml -sed -e "s/{{REPOSITORY}}/${REPOSITORY}/g" ${DIR}/pull_request.yml > ${DIR}/../../../.github/workflows/pull_request.yml diff --git a/flyteadmin/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate b/flyteadmin/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate deleted file mode 100644 index 0334cae08d..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate +++ /dev/null @@ -1,32 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -FROM golang:1.13.3-alpine3.10 as builder -RUN apk add git openssh-client make curl - -# COPY only the go mod files for efficient caching -COPY go.mod go.sum /go/src/github.com/flyteorg/{{REPOSITORY}}/ -WORKDIR /go/src/github.com/flyteorg/{{REPOSITORY}} - -# Pull dependencies -RUN go mod download - -# COPY the rest of the source code -COPY . /go/src/github.com/flyteorg/{{REPOSITORY}}/ - -# This 'linux_compile' target should compile binaries to the /artifacts directory -# The main entrypoint should be compiled to /artifacts/{{REPOSITORY}} -RUN make linux_compile - -# update the PATH to include the /artifacts directory -ENV PATH="/artifacts:${PATH}" - -# This will eventually move to centurylink/ca-certs:latest for minimum possible image size -FROM alpine:3.13.7 -COPY --from=builder /artifacts /bin - -RUN apk --update add ca-certificates - -CMD ["{{REPOSITORY}}"] diff --git a/flyteadmin/boilerplate/flyte/golang_dockerfile/Readme.rst b/flyteadmin/boilerplate/flyte/golang_dockerfile/Readme.rst deleted file mode 100644 index dba3b34f60..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_dockerfile/Readme.rst +++ /dev/null @@ -1,16 +0,0 @@ -Golang Dockerfile -~~~~~~~~~~~~~~~~~ - -Provides a Dockerfile that produces a small image. - -**To Enable:** - -Add ``flyteorg/golang_dockerfile`` to your ``boilerplate/update.cfg`` file. - -Create and configure a ``make linux_compile`` target that compiles your go binaries to the ``/artifacts`` directory :: - - .PHONY: linux_compile - linux_compile: - RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o /artifacts {{ packages }} - -All binaries compiled to ``/artifacts`` will be available at ``/bin`` in your final image. diff --git a/flyteadmin/boilerplate/flyte/golang_dockerfile/update.sh b/flyteadmin/boilerplate/flyte/golang_dockerfile/update.sh deleted file mode 100755 index 5439bada4f..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_dockerfile/update.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -echo " - generating Dockerfile in root directory." -sed -e "s/{{REPOSITORY}}/${REPOSITORY}/g" ${DIR}/Dockerfile.GoTemplate > ${DIR}/../../../Dockerfile diff --git a/flyteadmin/boilerplate/flyte/golang_support_tools/go.mod b/flyteadmin/boilerplate/flyte/golang_support_tools/go.mod deleted file mode 100644 index 2cfeb8aa3a..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_support_tools/go.mod +++ /dev/null @@ -1,247 +0,0 @@ -module github.com/flyteorg/boilerplate - -go 1.19 - -require ( - github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf - github.com/alvaroloes/enumer v1.1.2 - github.com/flyteorg/flytestdlib v0.4.16 - github.com/golangci/golangci-lint v1.53.3 - github.com/pseudomuto/protoc-gen-doc v1.4.1 -) - -require ( - 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect - 4d63.com/gochecknoglobals v0.2.1 // indirect - cloud.google.com/go v0.110.2 // indirect - cloud.google.com/go/compute v1.19.3 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect - cloud.google.com/go/storage v1.29.0 // indirect - github.com/4meepo/tagalign v1.2.2 // indirect - github.com/Abirdcfly/dupword v0.0.11 // indirect - github.com/Antonboom/errname v0.1.10 // indirect - github.com/Antonboom/nilnil v0.1.5 // indirect - github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.17 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.0 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect - github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.15.0+incompatible // indirect - github.com/OpenPeeDeeP/depguard/v2 v2.1.0 // indirect - github.com/alexkohler/nakedret/v2 v2.0.2 // indirect - github.com/alexkohler/prealloc v1.0.0 // indirect - github.com/alingse/asasalint v0.0.11 // indirect - github.com/aokoli/goutils v1.0.1 // indirect - github.com/ashanbrown/forbidigo v1.5.3 // indirect - github.com/ashanbrown/makezero v1.1.1 // indirect - github.com/aws/aws-sdk-go v1.37.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bkielbasa/cyclop v1.2.1 // indirect - github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bombsimon/wsl/v3 v3.4.0 // indirect - github.com/breml/bidichk v0.2.4 // indirect - github.com/breml/errchkjson v0.3.1 // indirect - github.com/butuzov/ireturn v0.2.0 // indirect - github.com/butuzov/mirror v1.1.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/charithe/durationcheck v0.0.10 // indirect - github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 // indirect - github.com/coocood/freecache v1.1.1 // indirect - github.com/curioswitch/go-reassign v0.2.0 // indirect - github.com/daixiang0/gci v0.10.1 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/denis-tingaikin/go-header v0.4.3 // indirect - github.com/envoyproxy/protoc-gen-validate v0.10.0 // indirect - github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 // indirect - github.com/esimonov/ifshort v1.0.4 // indirect - github.com/ettle/strcase v0.1.1 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/fatih/structtag v1.2.0 // indirect - github.com/firefart/nonamedreturns v1.0.4 // indirect - github.com/flyteorg/stow v0.3.1 // indirect - github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-critic/go-critic v0.8.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-toolsmith/astcast v1.1.0 // indirect - github.com/go-toolsmith/astcopy v1.1.0 // indirect - github.com/go-toolsmith/astequal v1.1.0 // indirect - github.com/go-toolsmith/astfmt v1.1.0 // indirect - github.com/go-toolsmith/astp v1.1.0 // indirect - github.com/go-toolsmith/strparse v1.1.0 // indirect - github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gofrs/uuid v4.2.0+incompatible // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect - github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect - github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect - github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 // indirect - github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect - github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect - github.com/golangci/misspell v0.4.0 // indirect - github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect - github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect - github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 // indirect - github.com/gostaticanalysis/analysisutil v0.7.1 // indirect - github.com/gostaticanalysis/comment v1.4.2 // indirect - github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect - github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/huandu/xstrings v1.0.0 // indirect - github.com/imdario/mergo v0.3.5 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jgautheron/goconst v1.5.1 // indirect - github.com/jingyugao/rowserrcheck v1.1.1 // indirect - github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/julz/importas v0.1.0 // indirect - github.com/kisielk/errcheck v1.6.3 // indirect - github.com/kisielk/gotool v1.0.0 // indirect - github.com/kkHAIKE/contextcheck v1.1.4 // indirect - github.com/kulti/thelper v0.6.3 // indirect - github.com/kunwardeep/paralleltest v1.0.7 // indirect - github.com/kyoh86/exportloopref v0.1.11 // indirect - github.com/ldez/gomoddirectives v0.2.3 // indirect - github.com/ldez/tagliatelle v0.5.0 // indirect - github.com/leonklingele/grouper v1.1.1 // indirect - github.com/lufeee/execinquery v1.2.1 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/maratori/testableexamples v1.0.0 // indirect - github.com/maratori/testpackage v1.1.1 // indirect - github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mbilski/exhaustivestruct v1.2.0 // indirect - github.com/mgechev/revive v1.3.2 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moricho/tparallel v0.3.1 // indirect - github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect - github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect - github.com/ncw/swift v1.0.53 // indirect - github.com/nishanths/exhaustive v0.11.0 // indirect - github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.12.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polyfloyd/go-errorlint v1.4.2 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/pseudomuto/protokit v0.2.0 // indirect - github.com/quasilyte/go-ruleguard v0.3.19 // indirect - github.com/quasilyte/gogrep v0.5.0 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect - github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/ryancurrah/gomodguard v1.3.0 // indirect - github.com/ryanrolds/sqlclosecheck v0.4.0 // indirect - github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect - github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.23.0 // indirect - github.com/securego/gosec/v2 v2.16.0 // indirect - github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/sivchari/containedctx v1.0.3 // indirect - github.com/sivchari/nosnakecase v1.7.0 // indirect - github.com/sivchari/tenv v1.7.1 // indirect - github.com/sonatard/noctx v0.0.2 // indirect - github.com/sourcegraph/go-diff v0.7.0 // indirect - github.com/spf13/afero v1.8.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/stretchr/testify v1.8.4 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect - github.com/tdakkota/asciicheck v0.2.0 // indirect - github.com/tetafro/godot v1.4.11 // indirect - github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect - github.com/timonwong/loggercheck v0.9.4 // indirect - github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect - github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/ultraware/funlen v0.0.3 // indirect - github.com/ultraware/whitespace v0.0.5 // indirect - github.com/uudashr/gocognit v1.0.6 // indirect - github.com/xen0n/gosmopolitan v1.2.1 // indirect - github.com/yagipy/maintidx v1.0.0 // indirect - github.com/yeya24/promlinter v0.2.0 // indirect - github.com/ykadowak/zerologlint v0.1.2 // indirect - gitlab.com/bosi/decorder v0.2.3 // indirect - go.opencensus.io v0.24.0 // indirect - go.tmz.dev/musttag v0.7.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect - golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.12.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect - golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect - golang.org/x/tools v0.11.1 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.55.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - honnef.co/go/tools v0.4.3 // indirect - k8s.io/apimachinery v0.20.2 // indirect - k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 // indirect - k8s.io/klog/v2 v2.5.0 // indirect - mvdan.cc/gofumpt v0.5.0 // indirect - mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect - mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect - mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d // indirect -) - -replace github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 diff --git a/flyteadmin/boilerplate/flyte/golang_support_tools/go.sum b/flyteadmin/boilerplate/flyte/golang_support_tools/go.sum deleted file mode 100644 index 4cc434803e..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_support_tools/go.sum +++ /dev/null @@ -1,1225 +0,0 @@ -4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA= -4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= -4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= -4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.3 h1:DcTwsFgGev/wV5+q8o2fzgcHOaac+DKGC91ZlvpsQds= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/4meepo/tagalign v1.2.2 h1:kQeUTkFTaBRtd/7jm8OKJl9iHk0gAO+TDFPHGSna0aw= -github.com/4meepo/tagalign v1.2.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= -github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= -github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= -github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9Bls= -github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= -github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= -github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= -github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= -github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf h1:M7A2Tn3R8rVgsoJHHKkmkpiNOItys4GxJj6JytRjdDg= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf/go.mod h1:Kya4Y46gyq/3TEyAzeNe5UkCk+W9apy5KbuX+5KnZ6M= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= -github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= -github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= -github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= -github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/ashanbrown/forbidigo v1.5.3 h1:jfg+fkm/snMx+V9FBwsl1d340BV/99kZGv5jN9hBoXk= -github.com/ashanbrown/forbidigo v1.5.3/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= -github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= -github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= -github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= -github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= -github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= -github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= -github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= -github.com/breml/bidichk v0.2.4/go.mod h1:7Zk0kRFt1LIZxtQdl9W9JwGAcLTTkOs+tN7wuEYGJ3s= -github.com/breml/errchkjson v0.3.1 h1:hlIeXuspTyt8Y/UmP5qy1JocGNR00KQHgfaNtRAjoxQ= -github.com/breml/errchkjson v0.3.1/go.mod h1:XroxrzKjdiutFyW3nWhw34VGg7kiMsDQox73yWCGI2U= -github.com/butuzov/ireturn v0.2.0 h1:kCHi+YzC150GE98WFuZQu9yrTn6GEydO2AuPLbTgnO4= -github.com/butuzov/ireturn v0.2.0/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= -github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= -github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= -github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= -github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= -github.com/daixiang0/gci v0.10.1 h1:eheNA3ljF6SxnPD/vE4lCBusVHmV3Rs3dkKvFrJ7MR0= -github.com/daixiang0/gci v0.10.1/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= -github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= -github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= -github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= -github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= -github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= -github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= -github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= -github.com/flyteorg/stow v0.3.1 h1:cBMbWl03Gsy5KoA5mutUYTuYpqtT7Pb8+ANGCLnmFEs= -github.com/flyteorg/stow v0.3.1/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= -github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-critic/go-critic v0.8.1 h1:16omCF1gN3gTzt4j4J6fKI/HnRojhEp+Eks6EuKw3vw= -github.com/go-critic/go-critic v0.8.1/go.mod h1:kpzXl09SIJX1cr9TB/g/sAG+eFEl7ZS9f9cqvZtyNl0= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= -github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= -github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= -github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= -github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= -github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= -github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= -github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= -github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= -github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= -github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= -github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= -github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= -github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= -github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe h1:6RGUuS7EGotKx6J5HIP8ZtyMdiDscjMLfRBSPuzVVeo= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= -github.com/golangci/golangci-lint v1.53.3 h1:CUcRafczT4t1F+mvdkUm6KuOpxUZTl0yWN/rSU6sSMo= -github.com/golangci/golangci-lint v1.53.3/go.mod h1:W4Gg3ONq6p3Jl+0s/h9Gr0j7yEgHJWWZO2bHl2tBUXM= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0= -github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= -github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= -github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= -github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= -github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= -github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.7 h1:2uCk94js0+nVNQoHZNLBkAR1DQJrVzw6T0RMzJn55dQ= -github.com/kunwardeep/paralleltest v1.0.7/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= -github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= -github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= -github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= -github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= -github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= -github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= -github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= -github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= -github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= -github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= -github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= -github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= -github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/nishanths/exhaustive v0.11.0 h1:T3I8nUGhl/Cwu5Z2hfc92l0e04D2GEW6e0l8pzda2l0= -github.com/nishanths/exhaustive v0.11.0/go.mod h1:RqwDsZ1xY0dNdqHho2z6X+bgzizwbLYOWnZbbl2wLB4= -github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.12.1 h1:vwOqb5Nu05OikTXqhvLdHCGcx5uthIYIl0t79UVrERQ= -github.com/nunnatsa/ginkgolinter v0.12.1/go.mod h1:AK8Ab1PypVrcGUusuKD8RDcl2KgsIwvNaaxAlyHSzso= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.4.2 h1:CU+O4181IxFDdPH6t/HT7IiDj1I7zxNi1RIUxYwn8d0= -github.com/polyfloyd/go-errorlint v1.4.2/go.mod h1:k6fU/+fQe38ednoZS51T7gSIGQW1y94d6TkSr35OzH8= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= -github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= -github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= -github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= -github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= -github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= -github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= -github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= -github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1jbEOPrEhDzGYq0= -github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= -github.com/securego/gosec/v2 v2.16.0 h1:Pi0JKoasQQ3NnoRao/ww/N/XdynIB9NRYYZT5CyOs5U= -github.com/securego/gosec/v2 v2.16.0/go.mod h1:xvLcVZqUfo4aAQu56TNv7/Ltz6emAOQAEsrZrt7uGlI= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= -github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= -github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= -github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= -github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= -github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= -github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= -github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= -github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= -github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= -github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= -github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= -github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= -github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= -github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= -github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= -github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= -github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= -github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= -github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= -github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= -github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/ykadowak/zerologlint v0.1.2 h1:Um4P5RMmelfjQqQJKtE8ZW+dLZrXrENeIzWWKw800U4= -github.com/ykadowak/zerologlint v0.1.2/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= -gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go-simpler.org/assert v0.5.0 h1:+5L/lajuQtzmbtEfh69sr5cRf2/xZzyJhFjoOz/PPqs= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.tmz.dev/musttag v0.7.0 h1:QfytzjTWGXZmChoX0L++7uQN+yRCPfyFm+whsM+lfGc= -go.tmz.dev/musttag v0.7.0/go.mod h1:oTFPvgOkJmp5kYL02S8+jrH0eLrBIl57rzWeA26zDEM= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.11.1 h1:ojD5zOW8+7dOGzdnNgersm8aPfcDjhMp12UfG93NIMc= -golang.org/x/tools v0.11.1/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= -honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= -k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= -k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= -k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 h1:d+LBRNY3c/KGp7lDblRlUJkayx4Vla7WUTIazoGMdYo= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= -k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= -mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/flyteadmin/boilerplate/flyte/golang_support_tools/tools.go b/flyteadmin/boilerplate/flyte/golang_support_tools/tools.go deleted file mode 100644 index 6c3da04107..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_support_tools/tools.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build tools -// +build tools - -package tools - -import ( - _ "github.com/EngHabu/mockery/cmd/mockery" - _ "github.com/alvaroloes/enumer" - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" - _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" - - _ "github.com/flyteorg/flyte/flytestdlib/cli/pflags" -) diff --git a/flyteadmin/boilerplate/flyte/golang_test_targets/Makefile b/flyteadmin/boilerplate/flyte/golang_test_targets/Makefile deleted file mode 100644 index be72275f5a..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_test_targets/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - - -.PHONY: download_tooling -download_tooling: #download dependencies (including test deps) for the package - @boilerplate/flyte/golang_test_targets/download_tooling.sh - -.PHONY: generate -generate: download_tooling #generate go code - @boilerplate/flyte/golang_test_targets/go-gen.sh - -.PHONY: lint -lint: download_tooling #lints the package for common code smells - GL_DEBUG=linters_output,env golangci-lint run --fix --deadline=5m --exclude deprecated -v - -# If code is failing goimports linter, this will fix. -# skips 'vendor' -.PHONY: goimports -goimports: - @boilerplate/flyte/golang_test_targets/goimports - -.PHONY: mod_download -mod_download: #download dependencies (including test deps) for the package - go mod download - -.PHONY: install -install: download_tooling mod_download - -.PHONY: show -show: - go list -m all - -.PHONY: test_unit -test_unit: - go test -cover ./... -race - -.PHONY: test_benchmark -test_benchmark: - go test -bench . ./... - -.PHONY: test_unit_cover -test_unit_cover: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -func /tmp/cover.out - -.PHONY: test_unit_visual -test_unit_visual: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -html=/tmp/cover.out - -.PHONY: test_unit_codecov -test_unit_codecov: - go test ./... -race -coverprofile=coverage.txt -covermode=atomic - curl -s https://codecov.io/bash > codecov_bash.sh && bash codecov_bash.sh diff --git a/flyteadmin/boilerplate/flyte/golang_test_targets/Readme.rst b/flyteadmin/boilerplate/flyte/golang_test_targets/Readme.rst deleted file mode 100644 index f9d890fdd7..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_test_targets/Readme.rst +++ /dev/null @@ -1,31 +0,0 @@ -Golang Test Targets -~~~~~~~~~~~~~~~~~~~ - -Provides an ``install`` make target that uses ``go mod`` to install golang dependencies. - -Provides a ``lint`` make target that uses golangci to lint your code. - -Provides a ``test_unit`` target for unit tests. - -Provides a ``test_unit_cover`` target for analysing coverage of unit tests, which will output the coverage of each function and total statement coverage. - -Provides a ``test_unit_visual`` target for visualizing coverage of unit tests through an interactive html code heat map. - -Provides a ``test_benchmark`` target for benchmark tests. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. - -Make sure you're using ``go mod`` for dependency management. - -Provide a ``.golangci`` configuration (the lint target requires it). - -Add ``include boilerplate/flyte/golang_test_targets/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/golang_test_targets/Makefile - -(this ensures the extra make targets get included in your main Makefile) diff --git a/flyteadmin/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flyteadmin/boilerplate/flyte/golang_test_targets/download_tooling.sh deleted file mode 100755 index 9cd49959f4..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Everything in this file needs to be installed outside of current module -# The reason we cannot turn off module entirely and install is that we need the replace statement in go.mod -# because we are installing a mockery fork. Turning it off would result installing the original not the fork. -# We also want to version all the other tools. We also want to be able to run go mod tidy without removing the version -# pins. To facilitate this, we're maintaining two sets of go.mod/sum files - the second one only for tooling. This is -# the same approach that go 1.14 will take as well. -# See: -# https://github.com/flyteorg/flyte/issues/129 -# https://github.com/golang/go/issues/30515 for some background context -# https://github.com/go-modules-by-example/index/blob/5ec250b4b78114a55001bd7c9cb88f6e07270ea5/010_tools/README.md - -set -e - -# List of tools to go get -# In the format of ":" or ":" if no cli -tools=( - "github.com/EngHabu/mockery/cmd/mockery" - "github.com/flyteorg/flytestdlib/cli/pflags@latest" - "github.com/golangci/golangci-lint/cmd/golangci-lint" - "github.com/daixiang0/gci" - "github.com/alvaroloes/enumer" - "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" -) - -tmp_dir=$(mktemp -d -t gotooling-XXX) -echo "Using temp directory ${tmp_dir}" -cp -R boilerplate/flyte/golang_support_tools/* $tmp_dir -pushd "$tmp_dir" - -for tool in "${tools[@]}" -do - echo "Installing ${tool}" - GO111MODULE=on go install $tool -done - -popd diff --git a/flyteadmin/boilerplate/flyte/golang_test_targets/go-gen.sh b/flyteadmin/boilerplate/flyte/golang_test_targets/go-gen.sh deleted file mode 100755 index 5ac17fa40a..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_test_targets/go-gen.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -echo "Running go generate" -go generate ./... - -# This section is used by GitHub workflow to ensure that the generation step was run -if [ -n "$DELTA_CHECK" ]; then - DIRTY=$(git status --porcelain) - if [ -n "$DIRTY" ]; then - echo "FAILED: Go code updated without committing generated code." - echo "Ensure make generate has run and all changes are committed." - DIFF=$(git diff) - echo "diff detected: $DIFF" - DIFF=$(git diff --name-only) - echo "files different: $DIFF" - exit 1 - else - echo "SUCCESS: Generated code is up to date." - fi -fi diff --git a/flyteadmin/boilerplate/flyte/golang_test_targets/goimports b/flyteadmin/boilerplate/flyte/golang_test_targets/goimports deleted file mode 100755 index 40f50d106e..0000000000 --- a/flyteadmin/boilerplate/flyte/golang_test_targets/goimports +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*" -not -path "./boilerplate/*") -gci write -s standard -s default -s "prefix(github.com/flyteorg)" --custom-order --skip-generated . diff --git a/flyteadmin/boilerplate/flyte/golangci_file/.golangci.yml b/flyteadmin/boilerplate/flyte/golangci_file/.golangci.yml deleted file mode 100644 index 7f4dbc80e8..0000000000 --- a/flyteadmin/boilerplate/flyte/golangci_file/.golangci.yml +++ /dev/null @@ -1,40 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -run: - skip-dirs: - - pkg/client - -linters: - disable-all: true - enable: - - deadcode - - errcheck - - gas - - gci - - goconst - - goimports - - golint - - gosimple - - govet - - ineffassign - - misspell - - nakedret - - staticcheck - - structcheck - - typecheck - - unconvert - - unparam - - unused - - varcheck - -linters-settings: - gci: - custom-order: true - sections: - - standard - - default - - prefix(github.com/flyteorg) - skip-generated: true diff --git a/flyteadmin/boilerplate/flyte/golangci_file/Readme.rst b/flyteadmin/boilerplate/flyte/golangci_file/Readme.rst deleted file mode 100644 index e4cbd18b96..0000000000 --- a/flyteadmin/boilerplate/flyte/golangci_file/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -GolangCI File -~~~~~~~~~~~~~ - -Provides a ``.golangci`` file with the linters we've agreed upon. - -**To Enable:** - -Add ``flyteorg/golangci_file`` to your ``boilerplate/update.cfg`` file. diff --git a/flyteadmin/boilerplate/flyte/golangci_file/update.sh b/flyteadmin/boilerplate/flyte/golangci_file/update.sh deleted file mode 100755 index ab2f85c680..0000000000 --- a/flyteadmin/boilerplate/flyte/golangci_file/update.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -# Clone the .golangci file -echo " - copying ${DIR}/.golangci to the root directory." -cp ${DIR}/.golangci.yml ${DIR}/../../../.golangci.yml diff --git a/flyteadmin/boilerplate/flyte/pull_request_template/Readme.rst b/flyteadmin/boilerplate/flyte/pull_request_template/Readme.rst deleted file mode 100644 index ee54437252..0000000000 --- a/flyteadmin/boilerplate/flyte/pull_request_template/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -Pull Request Template -~~~~~~~~~~~~~~~~~~~~~ - -Provides a Pull Request template. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. diff --git a/flyteadmin/boilerplate/flyte/pull_request_template/pull_request_template.md b/flyteadmin/boilerplate/flyte/pull_request_template/pull_request_template.md deleted file mode 100644 index 9cdab99b46..0000000000 --- a/flyteadmin/boilerplate/flyte/pull_request_template/pull_request_template.md +++ /dev/null @@ -1,35 +0,0 @@ -## _Read then delete this section_ - -_- Make sure to use a concise title for the pull-request._ - -_- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version -will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump)_ - -# TL;DR -_Please replace this text with a description of what this PR accomplishes._ - -## Type - - [ ] Bug Fix - - [ ] Feature - - [ ] Plugin - -## Are all requirements met? - - - [ ] Code completed - - [ ] Smoke tested - - [ ] Unit tests added - - [ ] Code documentation added - - [ ] Any pending items have an associated Issue - -## Complete description - _How did you fix the bug, make the feature etc. Link to any design docs etc_ - -## Tracking Issue -_Remove the '*fixes*' keyword if there will be multiple PRs to fix the linked issue_ - -fixes https://github.com/flyteorg/flyte/issues/ - -## Follow-up issue -_NA_ -OR -_https://github.com/flyteorg/flyte/issues/_ diff --git a/flyteadmin/boilerplate/flyte/pull_request_template/update.sh b/flyteadmin/boilerplate/flyte/pull_request_template/update.sh deleted file mode 100755 index 051e9dbce0..0000000000 --- a/flyteadmin/boilerplate/flyte/pull_request_template/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/pull_request_template.md ${DIR}/../../../pull_request_template.md diff --git a/flyteadmin/boilerplate/update.cfg b/flyteadmin/boilerplate/update.cfg deleted file mode 100644 index 4ed6a8b1e2..0000000000 --- a/flyteadmin/boilerplate/update.cfg +++ /dev/null @@ -1,6 +0,0 @@ -flyte/docker_build -flyte/golang_test_targets -flyte/golang_support_tools -flyte/pull_request_template -flyte/end2end -flyte/code_of_conduct diff --git a/flyteadmin/boilerplate/update.sh b/flyteadmin/boilerplate/update.sh deleted file mode 100755 index 73de4dc91c..0000000000 --- a/flyteadmin/boilerplate/update.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -OUT="$(mktemp -d)" -trap 'rm -fr $OUT' EXIT - -git clone https://github.com/flyteorg/boilerplate.git "${OUT}" - -echo "Updating the update.sh script." -cp "${OUT}/boilerplate/update.sh" "${DIR}/update.sh" - -CONFIG_FILE="${DIR}/update.cfg" -README="https://github.com/flyteorg/boilerplate/blob/master/Readme.rst" - -if [ ! -f "$CONFIG_FILE" ]; then - echo "$CONFIG_FILE not found." - echo "This file is required in order to select which features to include." - echo "See $README for more details." - exit 1 -fi - -if [ -z "$REPOSITORY" ]; then - echo "$REPOSITORY is required to run this script" - echo "See $README for more details." - exit 1 -fi - -while read -r directory junk; do - # Skip comment lines (which can have leading whitespace) - if [[ "$directory" == '#'* ]]; then - continue - fi - # Skip blank or whitespace-only lines - if [[ "$directory" == "" ]]; then - continue - fi - # Lines like - # valid/path other_junk - # are not acceptable, unless `other_junk` is a comment - if [[ "$junk" != "" ]] && [[ "$junk" != '#'* ]]; then - echo "Invalid config! Only one directory is allowed per line. Found '$junk'" - exit 1 - fi - - dir_path="${OUT}/boilerplate/${directory}" - # Make sure the directory exists - if ! [[ -d "$dir_path" ]]; then - echo "Invalid boilerplate directory: '$directory'" - exit 1 - fi - - echo "***********************************************************************************" - echo "$directory is configured in update.cfg." - echo "-----------------------------------------------------------------------------------" - echo "syncing files from source." - rm -rf "${DIR:?}/${directory}" - mkdir -p "$(dirname "${DIR}"/"${directory}")" - cp -r "$dir_path" "${DIR}/${directory}" - if [ -f "${DIR}/${directory}/update.sh" ]; then - echo "executing ${DIR}/${directory}/update.sh" - "${DIR}/${directory}/update.sh" - fi - echo "***********************************************************************************" - echo "" -done < "$CONFIG_FILE" diff --git a/flytecopilot/Makefile b/flytecopilot/Makefile index 03b285c6f2..8a21a884ff 100755 --- a/flytecopilot/Makefile +++ b/flytecopilot/Makefile @@ -1,6 +1,7 @@ export REPOSITORY=flytecopilot -include boilerplate/flyte/docker_build/Makefile -include boilerplate/flyte/golang_test_targets/Makefile +export REPO_ROOT=.. +include ../boilerplate/flyte/docker_build/Makefile +include ../boilerplate/flyte/golang_test_targets/Makefile .PHONY: update_boilerplate update_boilerplate: @@ -24,7 +25,3 @@ compile: cross_compile: @mkdir -p ./artifacts/cross GOOS=linux GOARCH=amd64 go build -o ./artifacts/flyte-copilot . - -.PHONY: go-tidy -go-tidy: - go mod tidy diff --git a/flytecopilot/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md b/flytecopilot/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md deleted file mode 100644 index e12139d691..0000000000 --- a/flytecopilot/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,2 +0,0 @@ -This project is governed by LF AI Foundation's [code of conduct](https://lfprojects.org/policies/code-of-conduct/). -All contributors and participants agree to abide by its terms. diff --git a/flytecopilot/boilerplate/flyte/code_of_conduct/README.rst b/flytecopilot/boilerplate/flyte/code_of_conduct/README.rst deleted file mode 100644 index 0c9f2f1ec5..0000000000 --- a/flytecopilot/boilerplate/flyte/code_of_conduct/README.rst +++ /dev/null @@ -1,2 +0,0 @@ -CODE OF CONDUCT -~~~~~~~~~~~~~~~ diff --git a/flytecopilot/boilerplate/flyte/code_of_conduct/update.sh b/flytecopilot/boilerplate/flyte/code_of_conduct/update.sh deleted file mode 100755 index 42f6158460..0000000000 --- a/flytecopilot/boilerplate/flyte/code_of_conduct/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/CODE_OF_CONDUCT.md ${DIR}/../../../CODE_OF_CONDUCT.md diff --git a/flytecopilot/boilerplate/flyte/docker_build/Makefile b/flytecopilot/boilerplate/flyte/docker_build/Makefile deleted file mode 100644 index e2b2b8a18d..0000000000 --- a/flytecopilot/boilerplate/flyte/docker_build/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -.PHONY: docker_build -docker_build: - IMAGE_NAME=$$REPOSITORY ./boilerplate/flyte/docker_build/docker_build.sh - -.PHONY: dockerhub_push -dockerhub_push: - IMAGE_NAME=flyteorg/$$REPOSITORY REGISTRY=docker.io ./boilerplate/flyte/docker_build/docker_build.sh diff --git a/flytecopilot/boilerplate/flyte/docker_build/Readme.rst b/flytecopilot/boilerplate/flyte/docker_build/Readme.rst deleted file mode 100644 index 7790b8fbfd..0000000000 --- a/flytecopilot/boilerplate/flyte/docker_build/Readme.rst +++ /dev/null @@ -1,23 +0,0 @@ -Docker Build and Push -~~~~~~~~~~~~~~~~~~~~~ - -Provides a ``make docker_build`` target that builds your image locally. - -Provides a ``make dockerhub_push`` target that pushes your final image to Dockerhub. - -The Dockerhub image will tagged ``:`` - -If git head has a git tag, the Dockerhub image will also be tagged ``:``. - -**To Enable:** - -Add ``flyteorg/docker_build`` to your ``boilerplate/update.cfg`` file. - -Add ``include boilerplate/flyte/docker_build/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/docker_build/Makefile - -(this ensures the extra Make targets get included in your main Makefile) diff --git a/flytecopilot/boilerplate/flyte/docker_build/docker_build.sh b/flytecopilot/boilerplate/flyte/docker_build/docker_build.sh deleted file mode 100755 index 817189aee1..0000000000 --- a/flytecopilot/boilerplate/flyte/docker_build/docker_build.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -echo "" -echo "------------------------------------" -echo " DOCKER BUILD" -echo "------------------------------------" -echo "" - -if [ -n "$REGISTRY" ]; then - # Do not push if there are unstaged git changes - CHANGED=$(git status --porcelain) - if [ -n "$CHANGED" ]; then - echo "Please commit git changes before pushing to a registry" - exit 1 - fi -fi - - -GIT_SHA=$(git rev-parse HEAD) - -IMAGE_TAG_SUFFIX="" -# for intermediate build phases, append -$BUILD_PHASE to all image tags -if [ -n "$BUILD_PHASE" ]; then - IMAGE_TAG_SUFFIX="-${BUILD_PHASE}" -fi - -IMAGE_TAG_WITH_SHA="${IMAGE_NAME}:${GIT_SHA}${IMAGE_TAG_SUFFIX}" - -RELEASE_SEMVER=$(git describe --tags --exact-match "$GIT_SHA" 2>/dev/null) || true -if [ -n "$RELEASE_SEMVER" ]; then - IMAGE_TAG_WITH_SEMVER="${IMAGE_NAME}:${RELEASE_SEMVER}${IMAGE_TAG_SUFFIX}" -fi - -# build the image -# passing no build phase will build the final image -docker build -t "$IMAGE_TAG_WITH_SHA" --target=${BUILD_PHASE} . -echo "${IMAGE_TAG_WITH_SHA} built locally." - -# if REGISTRY specified, push the images to the remote registry -if [ -n "$REGISTRY" ]; then - - if [ -n "${DOCKER_REGISTRY_PASSWORD}" ]; then - docker login --username="$DOCKER_REGISTRY_USERNAME" --password="$DOCKER_REGISTRY_PASSWORD" - fi - - docker tag "$IMAGE_TAG_WITH_SHA" "${REGISTRY}/${IMAGE_TAG_WITH_SHA}" - - docker push "${REGISTRY}/${IMAGE_TAG_WITH_SHA}" - echo "${REGISTRY}/${IMAGE_TAG_WITH_SHA} pushed to remote." - - # If the current commit has a semver tag, also push the images with the semver tag - if [ -n "$RELEASE_SEMVER" ]; then - - docker tag "$IMAGE_TAG_WITH_SHA" "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER}" - - docker push "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER}" - echo "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER} pushed to remote." - - fi -fi diff --git a/flytecopilot/boilerplate/flyte/end2end/Makefile b/flytecopilot/boilerplate/flyte/end2end/Makefile deleted file mode 100644 index 98ee63ae7a..0000000000 --- a/flytecopilot/boilerplate/flyte/end2end/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -.PHONY: end2end_execute -end2end_execute: export FLYTESNACKS_PRIORITIES ?= P0 -end2end_execute: export FLYTESNACKS_VERSION ?= $(shell curl --silent "https://api.github.com/repos/flyteorg/flytesnacks/releases/latest" | jq -r .tag_name) -end2end_execute: - ./boilerplate/flyte/end2end/end2end.sh ./boilerplate/flyte/end2end/functional-test-config.yaml --return_non_zero_on_failure - -.PHONY: k8s_integration_execute -k8s_integration_execute: - echo "pass" diff --git a/flytecopilot/boilerplate/flyte/end2end/end2end.sh b/flytecopilot/boilerplate/flyte/end2end/end2end.sh deleted file mode 100755 index 5dd825c1a0..0000000000 --- a/flytecopilot/boilerplate/flyte/end2end/end2end.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst -set -eu - -CONFIG_FILE=$1; shift -EXTRA_FLAGS=( "$@" ) - -python ./boilerplate/flyte/end2end/run-tests.py $FLYTESNACKS_VERSION $FLYTESNACKS_PRIORITIES $CONFIG_FILE ${EXTRA_FLAGS[@]} diff --git a/flytecopilot/boilerplate/flyte/end2end/functional-test-config.yaml b/flytecopilot/boilerplate/flyte/end2end/functional-test-config.yaml deleted file mode 100644 index 13fc445675..0000000000 --- a/flytecopilot/boilerplate/flyte/end2end/functional-test-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///localhost:30080 - authType: Pkce - insecure: true diff --git a/flytecopilot/boilerplate/flyte/end2end/run-tests.py b/flytecopilot/boilerplate/flyte/end2end/run-tests.py deleted file mode 100644 index 5365da006e..0000000000 --- a/flytecopilot/boilerplate/flyte/end2end/run-tests.py +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/env python3 - -import datetime -import json -import sys -import time -import traceback -from typing import Dict, List, Mapping, Tuple - -import click -import requests -from flytekit.configuration import Config -from flytekit.models.core.execution import WorkflowExecutionPhase -from flytekit.remote import FlyteRemote -from flytekit.remote.executions import FlyteWorkflowExecution - -WAIT_TIME = 10 -MAX_ATTEMPTS = 200 - -# This dictionary maps the names found in the flytesnacks manifest to a list of workflow names and -# inputs. This is so we can progressively cover all priorities in the original flytesnacks manifest, -# starting with "core". -FLYTESNACKS_WORKFLOW_GROUPS: Mapping[str, List[Tuple[str, dict]]] = { - "lite": [ - ("basics.hello_world.hello_world_wf", {}), - ], - "core": [ - # ("development_lifecycle.decks.image_renderer_wf", {}), - # The chain_workflows example in flytesnacks expects to be running in a sandbox. - ("advanced_composition.chain_entities.chain_workflows_wf", {}), - ("advanced_composition.dynamics.wf", {"s1": "Pear", "s2": "Earth"}), - ("advanced_composition.map_task.my_map_workflow", {"a": [1, 2, 3, 4, 5]}), - # Workflows that use nested executions cannot be launched via flyteremote. - # This issue is being tracked in https://github.com/flyteorg/flyte/issues/1482. - # ("control_flow.run_conditions.multiplier", {"my_input": 0.5}), - # ("control_flow.run_conditions.multiplier_2", {"my_input": 10}), - # ("control_flow.run_conditions.multiplier_3", {"my_input": 5}), - # ("control_flow.run_conditions.basic_boolean_wf", {"seed": 5}), - # ("control_flow.run_conditions.bool_input_wf", {"b": True}), - # ("control_flow.run_conditions.nested_conditions", {"my_input": 0.4}), - # ("control_flow.run_conditions.consume_outputs", {"my_input": 0.4, "seed": 7}), - # ("control_flow.run_merge_sort.merge_sort", {"numbers": [5, 4, 3, 2, 1], "count": 5}), - ("advanced_composition.subworkflows.parent_workflow", {"my_input1": "hello"}), - ("advanced_composition.subworkflows.nested_parent_wf", {"a": 3}), - ("basics.workflow.simple_wf", {"x": [1, 2, 3], "y": [1, 2, 3]}), - # TODO: enable new files and folders workflows - # ("basics.files.rotate_one_workflow", {"in_image": "https://upload.wikimedia.org/wikipedia/commons/d/d2/Julia_set_%28C_%3D_0.285%2C_0.01%29.jpg"}), - # ("basics.folders.download_and_rotate", {}), - ("basics.hello_world.hello_world_wf", {}), - ("basics.named_outputs.simple_wf_with_named_outputs", {}), - # # Getting a 403 for the wikipedia image - # # ("basics.reference_task.wf", {}), - ("data_types_and_io.custom_objects.wf", {"x": 10, "y": 20}), - # Enums are not supported in flyteremote - # ("type_system.enums.enum_wf", {"c": "red"}), - ("data_types_and_io.schema.df_wf", {"a": 42}), - ("data_types_and_io.typed_schema.wf", {}), - # ("my.imperative.workflow.example", {"in1": "hello", "in2": "foo"}), - ], - "integrations-k8s-spark": [ - ("k8s_spark_plugin.pyspark_pi.my_spark", {"triggered_date": datetime.datetime.now()}), - ], - "integrations-kfpytorch": [ - ("kfpytorch_plugin.pytorch_mnist.pytorch_training_wf", {}), - ], - "integrations-kftensorflow": [ - ("kftensorflow_plugin.tf_mnist.mnist_tensorflow_workflow", {}), - ], - # "integrations-pod": [ - # ("pod.pod.pod_workflow", {}), - # ], - "integrations-pandera_examples": [ - ("pandera_plugin.basic_schema_example.process_data", {}), - # TODO: investigate type mismatch float -> numpy.float64 - # ("pandera_plugin.validating_and_testing_ml_pipelines.pipeline", {"data_random_state": 42, "model_random_state": 99}), - ], - "integrations-modin_examples": [ - ("modin_plugin.knn_classifier.pipeline", {}), - ], - "integrations-papermilltasks": [ - ("papermill_plugin.simple.nb_to_python_wf", {"f": 3.1415926535}), - ], - "integrations-greatexpectations": [ - ("greatexpectations_plugin.task_example.simple_wf", {}), - ("greatexpectations_plugin.task_example.file_wf", {}), - ("greatexpectations_plugin.task_example.schema_wf", {}), - ("greatexpectations_plugin.task_example.runtime_wf", {}), - ], -} - - -def execute_workflow(remote, version, workflow_name, inputs): - print(f"Fetching workflow={workflow_name} and version={version}") - wf = remote.fetch_workflow(name=workflow_name, version=version) - return remote.execute(wf, inputs=inputs, wait=False) - - -def executions_finished(executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]) -> bool: - for executions in executions_by_wfgroup.values(): - if not all([execution.is_done for execution in executions]): - return False - return True - - -def sync_executions(remote: FlyteRemote, executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]): - try: - for executions in executions_by_wfgroup.values(): - for execution in executions: - print(f"About to sync execution_id={execution.id.name}") - remote.sync(execution) - except Exception: - print(traceback.format_exc()) - print("GOT TO THE EXCEPT") - print("COUNT THIS!") - - -def report_executions(executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]): - for executions in executions_by_wfgroup.values(): - for execution in executions: - print(execution) - - -def schedule_workflow_groups( - tag: str, - workflow_groups: List[str], - remote: FlyteRemote, - terminate_workflow_on_failure: bool, -) -> Dict[str, bool]: - """ - Schedule workflows executions for all workflow groups and return True if all executions succeed, otherwise - return False. - """ - executions_by_wfgroup = {} - # Schedule executions for each workflow group, - for wf_group in workflow_groups: - workflows = FLYTESNACKS_WORKFLOW_GROUPS.get(wf_group, []) - executions_by_wfgroup[wf_group] = [ - execute_workflow(remote, tag, workflow[0], workflow[1]) for workflow in workflows - ] - - # Wait for all executions to finish - attempt = 0 - while attempt == 0 or (not executions_finished(executions_by_wfgroup) and attempt < MAX_ATTEMPTS): - attempt += 1 - print(f"Not all executions finished yet. Sleeping for some time, will check again in {WAIT_TIME}s") - time.sleep(WAIT_TIME) - sync_executions(remote, executions_by_wfgroup) - - report_executions(executions_by_wfgroup) - - results = {} - for wf_group, executions in executions_by_wfgroup.items(): - non_succeeded_executions = [] - for execution in executions: - if execution.closure.phase != WorkflowExecutionPhase.SUCCEEDED: - non_succeeded_executions.append(execution) - # Report failing cases - if len(non_succeeded_executions) != 0: - print(f"Failed executions for {wf_group}:") - for execution in non_succeeded_executions: - print(f" workflow={execution.spec.launch_plan.name}, execution_id={execution.id.name}") - if terminate_workflow_on_failure: - remote.terminate(execution, "aborting execution scheduled in functional test") - # A workflow group succeeds iff all of its executions succeed - results[wf_group] = len(non_succeeded_executions) == 0 - return results - - -def valid(workflow_group): - """ - Return True if a workflow group is contained in FLYTESNACKS_WORKFLOW_GROUPS, - False otherwise. - """ - return workflow_group in FLYTESNACKS_WORKFLOW_GROUPS.keys() - - -def run( - flytesnacks_release_tag: str, - priorities: List[str], - config_file_path, - terminate_workflow_on_failure: bool, -) -> List[Dict[str, str]]: - remote = FlyteRemote( - Config.auto(config_file=config_file_path), - default_project="flytesnacks", - default_domain="development", - ) - - # For a given release tag and priority, this function filters the workflow groups from the flytesnacks - # manifest file. For example, for the release tag "v0.2.224" and the priority "P0" it returns [ "core" ]. - manifest_url = ( - "https://raw.githubusercontent.com/flyteorg/flytesnacks/" f"{flytesnacks_release_tag}/flyte_tests_manifest.json" - ) - r = requests.get(manifest_url) - parsed_manifest = r.json() - workflow_groups = [] - workflow_groups = ( - ["lite"] - if "lite" in priorities - else [group["name"] for group in parsed_manifest if group["priority"] in priorities] - ) - - results = [] - valid_workgroups = [] - for workflow_group in workflow_groups: - if not valid(workflow_group): - results.append( - { - "label": workflow_group, - "status": "coming soon", - "color": "grey", - } - ) - continue - valid_workgroups.append(workflow_group) - - results_by_wfgroup = schedule_workflow_groups( - flytesnacks_release_tag, valid_workgroups, remote, terminate_workflow_on_failure - ) - - for workflow_group, succeeded in results_by_wfgroup.items(): - if succeeded: - background_color = "green" - status = "passing" - else: - background_color = "red" - status = "failing" - - # Workflow groups can be only in one of three states: - # 1. passing: this indicates all the workflow executions for that workflow group - # executed successfully - # 2. failing: this state indicates that at least one execution failed in that - # workflow group - # 3. coming soon: this state is used to indicate that the workflow group was not - # implemented yet. - # - # Each state has a corresponding status and color to be used in the badge for that - # workflow group. - result = { - "label": workflow_group, - "status": status, - "color": background_color, - } - results.append(result) - return results - - -@click.command() -@click.option( - "--return_non_zero_on_failure", - default=False, - is_flag=True, - help="Return a non-zero exit status if any workflow fails", -) -@click.option( - "--terminate_workflow_on_failure", - default=False, - is_flag=True, - help="Abort failing workflows upon exit", -) -@click.argument("flytesnacks_release_tag") -@click.argument("priorities") -@click.argument("config_file") -def cli( - flytesnacks_release_tag, - priorities, - config_file, - return_non_zero_on_failure, - terminate_workflow_on_failure, -): - print(f"return_non_zero_on_failure={return_non_zero_on_failure}") - results = run(flytesnacks_release_tag, priorities, config_file, terminate_workflow_on_failure) - - # Write a json object in its own line describing the result of this run to stdout - print(f"Result of run:\n{json.dumps(results)}") - - # Return a non-zero exit code if core fails - if return_non_zero_on_failure: - for result in results: - if result["status"] not in ("passing", "coming soon"): - sys.exit(1) - - -if __name__ == "__main__": - cli() diff --git a/flytecopilot/boilerplate/flyte/flyte_golang_compile/Readme.rst b/flytecopilot/boilerplate/flyte/flyte_golang_compile/Readme.rst deleted file mode 100644 index e6b56dd16e..0000000000 --- a/flytecopilot/boilerplate/flyte/flyte_golang_compile/Readme.rst +++ /dev/null @@ -1,16 +0,0 @@ -Flyte Golang Compile -~~~~~~~~~~~~~~~~~~~~ - -Common compile script for Flyte golang services. - -**To Enable:** - -Add ``flyteorg/flyte_golang_compile`` to your ``boilerplate/update.cfg`` file. - -Add the following to your Makefile - -:: - - .PHONY: compile_linux - compile_linux: - PACKAGES={{ *your packages }} OUTPUT={{ /path/to/output }} ./boilerplate/flyte/flyte_golang_compile.sh diff --git a/flytecopilot/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template b/flytecopilot/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template deleted file mode 100644 index f587e971be..0000000000 --- a/flytecopilot/boilerplate/flyte/flyte_golang_compile/flyte_golang_compile.Template +++ /dev/null @@ -1,26 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -if [ -z "$PACKAGES" ]; then - echo "PACKAGES environment VAR not set" - exit 1 -fi - -if [ -z "$OUTPUT" ]; then - echo "OUTPUT environment VAR not set" - exit 1 -fi - -# get the GIT_SHA and RELEASE_SEMVER - -GIT_SHA=$(git rev-parse HEAD) -RELEASE_SEMVER=$(git describe --tags --exact-match $GIT_SHA 2>/dev/null) - -CURRENT_PKG=github.com/flyteorg/{{ REPOSITORY }} -VERSION_PKG="${CURRENT_PKG}/vendor/github.com/flyteorg/flytestdlib" - -LDFLAGS="-X ${VERSION_PKG}/version.Build=${GIT_SHA} -X ${VERSION_PKG}/version.Version=${RELEASE_SEMVER}" - -GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "$LDFLAGS" -o "$OUTPUT" "$PACKAGES" diff --git a/flytecopilot/boilerplate/flyte/flyte_golang_compile/update.sh b/flytecopilot/boilerplate/flyte/flyte_golang_compile/update.sh deleted file mode 100755 index b1e6101c2b..0000000000 --- a/flytecopilot/boilerplate/flyte/flyte_golang_compile/update.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -echo " - generating ${DIR}/flyte_golang_compile.sh" -sed -e "s/{{REPOSITORY}}/${REPOSITORY}/g" ${DIR}/flyte_golang_compile.Template > ${DIR}/flyte_golang_compile.sh diff --git a/flytecopilot/boilerplate/flyte/github_workflows/Readme.rst b/flytecopilot/boilerplate/flyte/github_workflows/Readme.rst deleted file mode 100644 index f236923514..0000000000 --- a/flytecopilot/boilerplate/flyte/github_workflows/Readme.rst +++ /dev/null @@ -1,22 +0,0 @@ -Golang Github Actions -~~~~~~~~~~~~~~~~~ - -Provides a two github actions workflows. - -**To Enable:** - -Add ``flyteorg/github_workflows`` to your ``boilerplate/update.cfg`` file. - -Add a github secret ``package_name`` with the name to use for publishing (e.g. ``flytepropeller``). Typically, this will be the same name as the repository. - -*Note*: If you are working on a fork, include that prefix in your package name (``myfork/flytepropeller``). - -The actions will push to 2 repos: - - 1. ``docker.pkg.github.com/flyteorg//`` - 2. ``docker.pkg.github.com/flyteorg//-stages`` : this repo is used to cache build stages to speed up iterative builds after. - -There are two workflows that get deployed: - - 1. A workflow that runs on Pull Requests to build and push images to github registry tagged with the commit sha. - 2. A workflow that runs on master merges that bump the patch version of release tag, builds and pushes images to github registry tagged with the version, commit sha as well as "latest" diff --git a/flytecopilot/boilerplate/flyte/github_workflows/boilerplate_automation.yml b/flytecopilot/boilerplate/flyte/github_workflows/boilerplate_automation.yml deleted file mode 100644 index 9bda305d4f..0000000000 --- a/flytecopilot/boilerplate/flyte/github_workflows/boilerplate_automation.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Update Boilerplate Automation -on: - workflow_dispatch: -jobs: - update-boilerplate: - name: Update Boilerplate - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: "0" - - name: Update Boilerplate - run: | - make update_boilerplate - - name: Create Pull Request - id: cpr - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.FLYTE_BOT_PAT }} - commit-message: Update Boilerplate - committer: Flyte-Bot - author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> - signoff: true - branch: flyte-bot-update-boilerplate - delete-branch: true - title: 'Update Boilerplate' - body: | - Update Boilerplate - - Auto-generated by [flyte-bot] - labels: | - boilerplate - team-reviewers: | - owners - maintainers - draft: false - diff --git a/flytecopilot/boilerplate/flyte/github_workflows/master.yml b/flytecopilot/boilerplate/flyte/github_workflows/master.yml deleted file mode 100644 index a8eab5af0e..0000000000 --- a/flytecopilot/boilerplate/flyte/github_workflows/master.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Master - -on: - push: - branches: - - master - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - with: - fetch-depth: '0' - - name: Bump version and push tag - id: bump-version - uses: anothrNick/github-tag-action@1.17.2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - WITH_V: true - DEFAULT_BUMP: patch - - name: Push Docker Image to Github Registry - uses: whoan/docker-build-with-cache-action@v5 - with: - username: "${{ github.actor }}" - password: "${{ secrets.GITHUB_TOKEN }}" - image_name: ${{ secrets.package_name }} - image_tag: latest,${{ github.sha }},${{ steps.bump-version.outputs.tag }} - push_git_tag: true - registry: docker.pkg.github.com - build_extra_args: "--compress=true" diff --git a/flytecopilot/boilerplate/flyte/github_workflows/pull_request.yml b/flytecopilot/boilerplate/flyte/github_workflows/pull_request.yml deleted file mode 100644 index 932400bc4f..0000000000 --- a/flytecopilot/boilerplate/flyte/github_workflows/pull_request.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Pull Request - -on: - pull_request - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - name: Push Docker Image to Github Registry - uses: whoan/docker-build-with-cache-action@v5 - with: - username: "${{ github.actor }}" - password: "${{ secrets.GITHUB_TOKEN }}" - image_name: ${{ secrets.package_name }} - image_tag: ${{ github.sha }} - push_git_tag: true - registry: docker.pkg.github.com diff --git a/flytecopilot/boilerplate/flyte/github_workflows/stale.yml b/flytecopilot/boilerplate/flyte/github_workflows/stale.yml deleted file mode 100644 index 385321acb9..0000000000 --- a/flytecopilot/boilerplate/flyte/github_workflows/stale.yml +++ /dev/null @@ -1,61 +0,0 @@ -# Configuration for probot-stale - https://github.com/probot/stale - -# Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 120 - -# Number of days of inactivity before an Issue or Pull Request with the stale label is closed. -# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. -daysUntilClose: 7 - -# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) -onlyLabels: [] - -# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable -exemptLabels: - - pinned - - security - - "[Status] Maybe Later" - -# Set to true to ignore issues in a project (defaults to false) -exemptProjects: false - -# Set to true to ignore issues in a milestone (defaults to false) -exemptMilestones: false - -# Set to true to ignore issues with an assignee (defaults to false) -exemptAssignees: false - -# Label to use when marking as stale -staleLabel: wontfix - -# Comment to post when marking as stale. Set to `false` to disable -markComment: > - This issue/pullrequest has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. - -# Comment to post when removing the stale label. -# unmarkComment: > -# Your comment here. - -# Comment to post when closing a stale Issue or Pull Request. -# closeComment: > -# Your comment here. - -# Limit the number of actions per hour, from 1-30. Default is 30 -limitPerRun: 30 - -# Limit to only `issues` or `pulls` -only: pulls - -# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': -# pulls: -# daysUntilStale: 30 -# markComment: > -# This pull request has been automatically marked as stale because it has not had -# recent activity. It will be closed if no further activity occurs. Thank you -# for your contributions. - -# issues: -# exemptLabels: -# - confirmed \ No newline at end of file diff --git a/flytecopilot/boilerplate/flyte/github_workflows/update.sh b/flytecopilot/boilerplate/flyte/github_workflows/update.sh deleted file mode 100755 index 15c3cb18e2..0000000000 --- a/flytecopilot/boilerplate/flyte/github_workflows/update.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -mkdir -p ${DIR}/../../../.github/workflows - -echo " - generating github action workflows in root directory." -sed -e "s/{{REPOSITORY}}/${REPOSITORY}/g" ${DIR}/master.yml > ${DIR}/../../../.github/workflows/master.yml -sed -e "s/{{REPOSITORY}}/${REPOSITORY}/g" ${DIR}/pull_request.yml > ${DIR}/../../../.github/workflows/pull_request.yml -cp ${DIR}/stale.yml ${DIR}/../../../.github/stale.yml diff --git a/flytecopilot/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate b/flytecopilot/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate deleted file mode 100644 index a51f8e1b14..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_dockerfile/Dockerfile.GoTemplate +++ /dev/null @@ -1,38 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -FROM golang:1.17.1-alpine3.14 as builder -RUN apk add git openssh-client make curl - -# COPY only the go mod files for efficient caching -COPY go.mod go.sum /go/src/github.com/flyteorg/{{REPOSITORY}}/ -WORKDIR /go/src/github.com/flyteorg/{{REPOSITORY}} - -# Pull dependencies -RUN go mod download - -# COPY the rest of the source code -COPY . /go/src/github.com/flyteorg/{{REPOSITORY}}/ - -# This 'linux_compile' target should compile binaries to the /artifacts directory -# The main entrypoint should be compiled to /artifacts/{{REPOSITORY}} -RUN make linux_compile - -# install grpc-health-probe -RUN curl --silent --fail --show-error --location --output /artifacts/grpc_health_probe "https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/v0.4.5/grpc_health_probe-linux-amd64" && \ - chmod +x /artifacts/grpc_health_probe && \ - echo '8699c46352d752d8f533cae72728b0e65663f399fc28fb9cd854b14ad5f85f44 /artifacts/grpc_health_probe' > .grpc_checksum && \ - sha256sum -c .grpc_checksum - -# update the PATH to include the /artifacts directory -ENV PATH="/artifacts:${PATH}" - -# This will eventually move to centurylink/ca-certs:latest for minimum possible image size -FROM alpine:3.14 -COPY --from=builder /artifacts /bin - -RUN apk --update add ca-certificates - -CMD ["{{REPOSITORY}}"] diff --git a/flytecopilot/boilerplate/flyte/golang_dockerfile/Readme.rst b/flytecopilot/boilerplate/flyte/golang_dockerfile/Readme.rst deleted file mode 100644 index dba3b34f60..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_dockerfile/Readme.rst +++ /dev/null @@ -1,16 +0,0 @@ -Golang Dockerfile -~~~~~~~~~~~~~~~~~ - -Provides a Dockerfile that produces a small image. - -**To Enable:** - -Add ``flyteorg/golang_dockerfile`` to your ``boilerplate/update.cfg`` file. - -Create and configure a ``make linux_compile`` target that compiles your go binaries to the ``/artifacts`` directory :: - - .PHONY: linux_compile - linux_compile: - RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o /artifacts {{ packages }} - -All binaries compiled to ``/artifacts`` will be available at ``/bin`` in your final image. diff --git a/flytecopilot/boilerplate/flyte/golang_dockerfile/update.sh b/flytecopilot/boilerplate/flyte/golang_dockerfile/update.sh deleted file mode 100755 index 5439bada4f..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_dockerfile/update.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -echo " - generating Dockerfile in root directory." -sed -e "s/{{REPOSITORY}}/${REPOSITORY}/g" ${DIR}/Dockerfile.GoTemplate > ${DIR}/../../../Dockerfile diff --git a/flytecopilot/boilerplate/flyte/golang_support_tools/go.mod b/flytecopilot/boilerplate/flyte/golang_support_tools/go.mod deleted file mode 100644 index 2cfeb8aa3a..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_support_tools/go.mod +++ /dev/null @@ -1,247 +0,0 @@ -module github.com/flyteorg/boilerplate - -go 1.19 - -require ( - github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf - github.com/alvaroloes/enumer v1.1.2 - github.com/flyteorg/flytestdlib v0.4.16 - github.com/golangci/golangci-lint v1.53.3 - github.com/pseudomuto/protoc-gen-doc v1.4.1 -) - -require ( - 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect - 4d63.com/gochecknoglobals v0.2.1 // indirect - cloud.google.com/go v0.110.2 // indirect - cloud.google.com/go/compute v1.19.3 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect - cloud.google.com/go/storage v1.29.0 // indirect - github.com/4meepo/tagalign v1.2.2 // indirect - github.com/Abirdcfly/dupword v0.0.11 // indirect - github.com/Antonboom/errname v0.1.10 // indirect - github.com/Antonboom/nilnil v0.1.5 // indirect - github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.17 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.0 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect - github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.15.0+incompatible // indirect - github.com/OpenPeeDeeP/depguard/v2 v2.1.0 // indirect - github.com/alexkohler/nakedret/v2 v2.0.2 // indirect - github.com/alexkohler/prealloc v1.0.0 // indirect - github.com/alingse/asasalint v0.0.11 // indirect - github.com/aokoli/goutils v1.0.1 // indirect - github.com/ashanbrown/forbidigo v1.5.3 // indirect - github.com/ashanbrown/makezero v1.1.1 // indirect - github.com/aws/aws-sdk-go v1.37.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bkielbasa/cyclop v1.2.1 // indirect - github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bombsimon/wsl/v3 v3.4.0 // indirect - github.com/breml/bidichk v0.2.4 // indirect - github.com/breml/errchkjson v0.3.1 // indirect - github.com/butuzov/ireturn v0.2.0 // indirect - github.com/butuzov/mirror v1.1.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/charithe/durationcheck v0.0.10 // indirect - github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 // indirect - github.com/coocood/freecache v1.1.1 // indirect - github.com/curioswitch/go-reassign v0.2.0 // indirect - github.com/daixiang0/gci v0.10.1 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/denis-tingaikin/go-header v0.4.3 // indirect - github.com/envoyproxy/protoc-gen-validate v0.10.0 // indirect - github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 // indirect - github.com/esimonov/ifshort v1.0.4 // indirect - github.com/ettle/strcase v0.1.1 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/fatih/structtag v1.2.0 // indirect - github.com/firefart/nonamedreturns v1.0.4 // indirect - github.com/flyteorg/stow v0.3.1 // indirect - github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-critic/go-critic v0.8.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-toolsmith/astcast v1.1.0 // indirect - github.com/go-toolsmith/astcopy v1.1.0 // indirect - github.com/go-toolsmith/astequal v1.1.0 // indirect - github.com/go-toolsmith/astfmt v1.1.0 // indirect - github.com/go-toolsmith/astp v1.1.0 // indirect - github.com/go-toolsmith/strparse v1.1.0 // indirect - github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gofrs/uuid v4.2.0+incompatible // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect - github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect - github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect - github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 // indirect - github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect - github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect - github.com/golangci/misspell v0.4.0 // indirect - github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect - github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect - github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 // indirect - github.com/gostaticanalysis/analysisutil v0.7.1 // indirect - github.com/gostaticanalysis/comment v1.4.2 // indirect - github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect - github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/huandu/xstrings v1.0.0 // indirect - github.com/imdario/mergo v0.3.5 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jgautheron/goconst v1.5.1 // indirect - github.com/jingyugao/rowserrcheck v1.1.1 // indirect - github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/julz/importas v0.1.0 // indirect - github.com/kisielk/errcheck v1.6.3 // indirect - github.com/kisielk/gotool v1.0.0 // indirect - github.com/kkHAIKE/contextcheck v1.1.4 // indirect - github.com/kulti/thelper v0.6.3 // indirect - github.com/kunwardeep/paralleltest v1.0.7 // indirect - github.com/kyoh86/exportloopref v0.1.11 // indirect - github.com/ldez/gomoddirectives v0.2.3 // indirect - github.com/ldez/tagliatelle v0.5.0 // indirect - github.com/leonklingele/grouper v1.1.1 // indirect - github.com/lufeee/execinquery v1.2.1 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/maratori/testableexamples v1.0.0 // indirect - github.com/maratori/testpackage v1.1.1 // indirect - github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mbilski/exhaustivestruct v1.2.0 // indirect - github.com/mgechev/revive v1.3.2 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moricho/tparallel v0.3.1 // indirect - github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect - github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect - github.com/ncw/swift v1.0.53 // indirect - github.com/nishanths/exhaustive v0.11.0 // indirect - github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.12.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polyfloyd/go-errorlint v1.4.2 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/pseudomuto/protokit v0.2.0 // indirect - github.com/quasilyte/go-ruleguard v0.3.19 // indirect - github.com/quasilyte/gogrep v0.5.0 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect - github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/ryancurrah/gomodguard v1.3.0 // indirect - github.com/ryanrolds/sqlclosecheck v0.4.0 // indirect - github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect - github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.23.0 // indirect - github.com/securego/gosec/v2 v2.16.0 // indirect - github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/sivchari/containedctx v1.0.3 // indirect - github.com/sivchari/nosnakecase v1.7.0 // indirect - github.com/sivchari/tenv v1.7.1 // indirect - github.com/sonatard/noctx v0.0.2 // indirect - github.com/sourcegraph/go-diff v0.7.0 // indirect - github.com/spf13/afero v1.8.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/stretchr/testify v1.8.4 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect - github.com/tdakkota/asciicheck v0.2.0 // indirect - github.com/tetafro/godot v1.4.11 // indirect - github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect - github.com/timonwong/loggercheck v0.9.4 // indirect - github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect - github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/ultraware/funlen v0.0.3 // indirect - github.com/ultraware/whitespace v0.0.5 // indirect - github.com/uudashr/gocognit v1.0.6 // indirect - github.com/xen0n/gosmopolitan v1.2.1 // indirect - github.com/yagipy/maintidx v1.0.0 // indirect - github.com/yeya24/promlinter v0.2.0 // indirect - github.com/ykadowak/zerologlint v0.1.2 // indirect - gitlab.com/bosi/decorder v0.2.3 // indirect - go.opencensus.io v0.24.0 // indirect - go.tmz.dev/musttag v0.7.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect - golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.12.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect - golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect - golang.org/x/tools v0.11.1 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.55.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - honnef.co/go/tools v0.4.3 // indirect - k8s.io/apimachinery v0.20.2 // indirect - k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 // indirect - k8s.io/klog/v2 v2.5.0 // indirect - mvdan.cc/gofumpt v0.5.0 // indirect - mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect - mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect - mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d // indirect -) - -replace github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 diff --git a/flytecopilot/boilerplate/flyte/golang_support_tools/go.sum b/flytecopilot/boilerplate/flyte/golang_support_tools/go.sum deleted file mode 100644 index 4cc434803e..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_support_tools/go.sum +++ /dev/null @@ -1,1225 +0,0 @@ -4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA= -4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= -4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= -4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.3 h1:DcTwsFgGev/wV5+q8o2fzgcHOaac+DKGC91ZlvpsQds= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/4meepo/tagalign v1.2.2 h1:kQeUTkFTaBRtd/7jm8OKJl9iHk0gAO+TDFPHGSna0aw= -github.com/4meepo/tagalign v1.2.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= -github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= -github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= -github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9Bls= -github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= -github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= -github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= -github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= -github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf h1:M7A2Tn3R8rVgsoJHHKkmkpiNOItys4GxJj6JytRjdDg= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf/go.mod h1:Kya4Y46gyq/3TEyAzeNe5UkCk+W9apy5KbuX+5KnZ6M= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= -github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= -github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= -github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= -github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/ashanbrown/forbidigo v1.5.3 h1:jfg+fkm/snMx+V9FBwsl1d340BV/99kZGv5jN9hBoXk= -github.com/ashanbrown/forbidigo v1.5.3/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= -github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= -github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= -github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= -github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= -github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= -github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= -github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= -github.com/breml/bidichk v0.2.4/go.mod h1:7Zk0kRFt1LIZxtQdl9W9JwGAcLTTkOs+tN7wuEYGJ3s= -github.com/breml/errchkjson v0.3.1 h1:hlIeXuspTyt8Y/UmP5qy1JocGNR00KQHgfaNtRAjoxQ= -github.com/breml/errchkjson v0.3.1/go.mod h1:XroxrzKjdiutFyW3nWhw34VGg7kiMsDQox73yWCGI2U= -github.com/butuzov/ireturn v0.2.0 h1:kCHi+YzC150GE98WFuZQu9yrTn6GEydO2AuPLbTgnO4= -github.com/butuzov/ireturn v0.2.0/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= -github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= -github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= -github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= -github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= -github.com/daixiang0/gci v0.10.1 h1:eheNA3ljF6SxnPD/vE4lCBusVHmV3Rs3dkKvFrJ7MR0= -github.com/daixiang0/gci v0.10.1/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= -github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= -github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= -github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= -github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= -github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= -github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= -github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= -github.com/flyteorg/stow v0.3.1 h1:cBMbWl03Gsy5KoA5mutUYTuYpqtT7Pb8+ANGCLnmFEs= -github.com/flyteorg/stow v0.3.1/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= -github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-critic/go-critic v0.8.1 h1:16omCF1gN3gTzt4j4J6fKI/HnRojhEp+Eks6EuKw3vw= -github.com/go-critic/go-critic v0.8.1/go.mod h1:kpzXl09SIJX1cr9TB/g/sAG+eFEl7ZS9f9cqvZtyNl0= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= -github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= -github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= -github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= -github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= -github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= -github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= -github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= -github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= -github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= -github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= -github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= -github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= -github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= -github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe h1:6RGUuS7EGotKx6J5HIP8ZtyMdiDscjMLfRBSPuzVVeo= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= -github.com/golangci/golangci-lint v1.53.3 h1:CUcRafczT4t1F+mvdkUm6KuOpxUZTl0yWN/rSU6sSMo= -github.com/golangci/golangci-lint v1.53.3/go.mod h1:W4Gg3ONq6p3Jl+0s/h9Gr0j7yEgHJWWZO2bHl2tBUXM= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0= -github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= -github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= -github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= -github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= -github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= -github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.7 h1:2uCk94js0+nVNQoHZNLBkAR1DQJrVzw6T0RMzJn55dQ= -github.com/kunwardeep/paralleltest v1.0.7/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= -github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= -github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= -github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= -github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= -github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= -github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= -github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= -github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= -github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= -github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= -github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= -github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= -github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/nishanths/exhaustive v0.11.0 h1:T3I8nUGhl/Cwu5Z2hfc92l0e04D2GEW6e0l8pzda2l0= -github.com/nishanths/exhaustive v0.11.0/go.mod h1:RqwDsZ1xY0dNdqHho2z6X+bgzizwbLYOWnZbbl2wLB4= -github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.12.1 h1:vwOqb5Nu05OikTXqhvLdHCGcx5uthIYIl0t79UVrERQ= -github.com/nunnatsa/ginkgolinter v0.12.1/go.mod h1:AK8Ab1PypVrcGUusuKD8RDcl2KgsIwvNaaxAlyHSzso= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.4.2 h1:CU+O4181IxFDdPH6t/HT7IiDj1I7zxNi1RIUxYwn8d0= -github.com/polyfloyd/go-errorlint v1.4.2/go.mod h1:k6fU/+fQe38ednoZS51T7gSIGQW1y94d6TkSr35OzH8= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= -github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= -github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= -github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= -github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= -github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= -github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= -github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= -github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1jbEOPrEhDzGYq0= -github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= -github.com/securego/gosec/v2 v2.16.0 h1:Pi0JKoasQQ3NnoRao/ww/N/XdynIB9NRYYZT5CyOs5U= -github.com/securego/gosec/v2 v2.16.0/go.mod h1:xvLcVZqUfo4aAQu56TNv7/Ltz6emAOQAEsrZrt7uGlI= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= -github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= -github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= -github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= -github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= -github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= -github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= -github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= -github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= -github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= -github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= -github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= -github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= -github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= -github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= -github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= -github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= -github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= -github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= -github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= -github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= -github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/ykadowak/zerologlint v0.1.2 h1:Um4P5RMmelfjQqQJKtE8ZW+dLZrXrENeIzWWKw800U4= -github.com/ykadowak/zerologlint v0.1.2/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= -gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go-simpler.org/assert v0.5.0 h1:+5L/lajuQtzmbtEfh69sr5cRf2/xZzyJhFjoOz/PPqs= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.tmz.dev/musttag v0.7.0 h1:QfytzjTWGXZmChoX0L++7uQN+yRCPfyFm+whsM+lfGc= -go.tmz.dev/musttag v0.7.0/go.mod h1:oTFPvgOkJmp5kYL02S8+jrH0eLrBIl57rzWeA26zDEM= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.11.1 h1:ojD5zOW8+7dOGzdnNgersm8aPfcDjhMp12UfG93NIMc= -golang.org/x/tools v0.11.1/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= -honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= -k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= -k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= -k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 h1:d+LBRNY3c/KGp7lDblRlUJkayx4Vla7WUTIazoGMdYo= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= -k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= -mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/flytecopilot/boilerplate/flyte/golang_support_tools/tools.go b/flytecopilot/boilerplate/flyte/golang_support_tools/tools.go deleted file mode 100644 index b774304ebf..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_support_tools/tools.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build tools -// +build tools - -package tools - -import ( - _ "github.com/EngHabu/mockery/cmd/mockery" - _ "github.com/alvaroloes/enumer" - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" - _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" - - _ "github.com/flyteorg/flytestdlib/cli/pflags" -) diff --git a/flytecopilot/boilerplate/flyte/golang_test_targets/Makefile b/flytecopilot/boilerplate/flyte/golang_test_targets/Makefile deleted file mode 100644 index be72275f5a..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_test_targets/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - - -.PHONY: download_tooling -download_tooling: #download dependencies (including test deps) for the package - @boilerplate/flyte/golang_test_targets/download_tooling.sh - -.PHONY: generate -generate: download_tooling #generate go code - @boilerplate/flyte/golang_test_targets/go-gen.sh - -.PHONY: lint -lint: download_tooling #lints the package for common code smells - GL_DEBUG=linters_output,env golangci-lint run --fix --deadline=5m --exclude deprecated -v - -# If code is failing goimports linter, this will fix. -# skips 'vendor' -.PHONY: goimports -goimports: - @boilerplate/flyte/golang_test_targets/goimports - -.PHONY: mod_download -mod_download: #download dependencies (including test deps) for the package - go mod download - -.PHONY: install -install: download_tooling mod_download - -.PHONY: show -show: - go list -m all - -.PHONY: test_unit -test_unit: - go test -cover ./... -race - -.PHONY: test_benchmark -test_benchmark: - go test -bench . ./... - -.PHONY: test_unit_cover -test_unit_cover: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -func /tmp/cover.out - -.PHONY: test_unit_visual -test_unit_visual: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -html=/tmp/cover.out - -.PHONY: test_unit_codecov -test_unit_codecov: - go test ./... -race -coverprofile=coverage.txt -covermode=atomic - curl -s https://codecov.io/bash > codecov_bash.sh && bash codecov_bash.sh diff --git a/flytecopilot/boilerplate/flyte/golang_test_targets/Readme.rst b/flytecopilot/boilerplate/flyte/golang_test_targets/Readme.rst deleted file mode 100644 index f9d890fdd7..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_test_targets/Readme.rst +++ /dev/null @@ -1,31 +0,0 @@ -Golang Test Targets -~~~~~~~~~~~~~~~~~~~ - -Provides an ``install`` make target that uses ``go mod`` to install golang dependencies. - -Provides a ``lint`` make target that uses golangci to lint your code. - -Provides a ``test_unit`` target for unit tests. - -Provides a ``test_unit_cover`` target for analysing coverage of unit tests, which will output the coverage of each function and total statement coverage. - -Provides a ``test_unit_visual`` target for visualizing coverage of unit tests through an interactive html code heat map. - -Provides a ``test_benchmark`` target for benchmark tests. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. - -Make sure you're using ``go mod`` for dependency management. - -Provide a ``.golangci`` configuration (the lint target requires it). - -Add ``include boilerplate/flyte/golang_test_targets/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/golang_test_targets/Makefile - -(this ensures the extra make targets get included in your main Makefile) diff --git a/flytecopilot/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flytecopilot/boilerplate/flyte/golang_test_targets/download_tooling.sh deleted file mode 100755 index 9cd49959f4..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Everything in this file needs to be installed outside of current module -# The reason we cannot turn off module entirely and install is that we need the replace statement in go.mod -# because we are installing a mockery fork. Turning it off would result installing the original not the fork. -# We also want to version all the other tools. We also want to be able to run go mod tidy without removing the version -# pins. To facilitate this, we're maintaining two sets of go.mod/sum files - the second one only for tooling. This is -# the same approach that go 1.14 will take as well. -# See: -# https://github.com/flyteorg/flyte/issues/129 -# https://github.com/golang/go/issues/30515 for some background context -# https://github.com/go-modules-by-example/index/blob/5ec250b4b78114a55001bd7c9cb88f6e07270ea5/010_tools/README.md - -set -e - -# List of tools to go get -# In the format of ":" or ":" if no cli -tools=( - "github.com/EngHabu/mockery/cmd/mockery" - "github.com/flyteorg/flytestdlib/cli/pflags@latest" - "github.com/golangci/golangci-lint/cmd/golangci-lint" - "github.com/daixiang0/gci" - "github.com/alvaroloes/enumer" - "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" -) - -tmp_dir=$(mktemp -d -t gotooling-XXX) -echo "Using temp directory ${tmp_dir}" -cp -R boilerplate/flyte/golang_support_tools/* $tmp_dir -pushd "$tmp_dir" - -for tool in "${tools[@]}" -do - echo "Installing ${tool}" - GO111MODULE=on go install $tool -done - -popd diff --git a/flytecopilot/boilerplate/flyte/golang_test_targets/go-gen.sh b/flytecopilot/boilerplate/flyte/golang_test_targets/go-gen.sh deleted file mode 100755 index 5ac17fa40a..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_test_targets/go-gen.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -echo "Running go generate" -go generate ./... - -# This section is used by GitHub workflow to ensure that the generation step was run -if [ -n "$DELTA_CHECK" ]; then - DIRTY=$(git status --porcelain) - if [ -n "$DIRTY" ]; then - echo "FAILED: Go code updated without committing generated code." - echo "Ensure make generate has run and all changes are committed." - DIFF=$(git diff) - echo "diff detected: $DIFF" - DIFF=$(git diff --name-only) - echo "files different: $DIFF" - exit 1 - else - echo "SUCCESS: Generated code is up to date." - fi -fi diff --git a/flytecopilot/boilerplate/flyte/golang_test_targets/goimports b/flytecopilot/boilerplate/flyte/golang_test_targets/goimports deleted file mode 100755 index 40f50d106e..0000000000 --- a/flytecopilot/boilerplate/flyte/golang_test_targets/goimports +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*" -not -path "./boilerplate/*") -gci write -s standard -s default -s "prefix(github.com/flyteorg)" --custom-order --skip-generated . diff --git a/flytecopilot/boilerplate/flyte/golangci_file/.golangci.yml b/flytecopilot/boilerplate/flyte/golangci_file/.golangci.yml deleted file mode 100644 index 7f4dbc80e8..0000000000 --- a/flytecopilot/boilerplate/flyte/golangci_file/.golangci.yml +++ /dev/null @@ -1,40 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -run: - skip-dirs: - - pkg/client - -linters: - disable-all: true - enable: - - deadcode - - errcheck - - gas - - gci - - goconst - - goimports - - golint - - gosimple - - govet - - ineffassign - - misspell - - nakedret - - staticcheck - - structcheck - - typecheck - - unconvert - - unparam - - unused - - varcheck - -linters-settings: - gci: - custom-order: true - sections: - - standard - - default - - prefix(github.com/flyteorg) - skip-generated: true diff --git a/flytecopilot/boilerplate/flyte/golangci_file/Readme.rst b/flytecopilot/boilerplate/flyte/golangci_file/Readme.rst deleted file mode 100644 index e4cbd18b96..0000000000 --- a/flytecopilot/boilerplate/flyte/golangci_file/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -GolangCI File -~~~~~~~~~~~~~ - -Provides a ``.golangci`` file with the linters we've agreed upon. - -**To Enable:** - -Add ``flyteorg/golangci_file`` to your ``boilerplate/update.cfg`` file. diff --git a/flytecopilot/boilerplate/flyte/golangci_file/update.sh b/flytecopilot/boilerplate/flyte/golangci_file/update.sh deleted file mode 100755 index ab2f85c680..0000000000 --- a/flytecopilot/boilerplate/flyte/golangci_file/update.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -# Clone the .golangci file -echo " - copying ${DIR}/.golangci to the root directory." -cp ${DIR}/.golangci.yml ${DIR}/../../../.golangci.yml diff --git a/flytecopilot/boilerplate/flyte/precommit/Makefile b/flytecopilot/boilerplate/flyte/precommit/Makefile deleted file mode 100644 index 3c6f17d6b2..0000000000 --- a/flytecopilot/boilerplate/flyte/precommit/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - - -.PHONY: setup-precommit -setup-precommit: #setup the precommit - @boilerplate/flyte/precommit/update.sh diff --git a/flytecopilot/boilerplate/flyte/precommit/hooks/pre-push b/flytecopilot/boilerplate/flyte/precommit/hooks/pre-push deleted file mode 100755 index f161cfe856..0000000000 --- a/flytecopilot/boilerplate/flyte/precommit/hooks/pre-push +++ /dev/null @@ -1,41 +0,0 @@ -DUMMY_SHA=0000000000000000000000000000000000000000 - -echo "Running pre-push check; to skip this step use 'push --no-verify'" - -while read LOCAL_REF LOCAL_SHA REMOTE_REF REMOTE_SHA -do - if [ "$LOCAL_SHA" = $DUMMY_SHA ] - then - # Branch deleted. Do nothing. - exit 0 - else - if [ "$REMOTE_SHA" = $DUMMY_SHA ] - then - # New branch. Verify the last commit, since this is very likely where the new code is - # (though there is no way to know for sure). In the extremely uncommon case in which someone - # pushes more than 1 new commit to a branch, CI will enforce full checking. - RANGE="$LOCAL_SHA~1..$LOCAL_SHA" - else - # Updating branch. Verify new commits. - RANGE="$REMOTE_SHA..$LOCAL_SHA" - fi - - # Verify DCO signoff. We do this before the format checker, since it has - # some probability of failing spuriously, while this check never should. - # - # In general, we can't assume that the commits are signed off by author - # pushing, so we settle for just checking that there is a signoff at all. - SIGNED_OFF=$(git rev-list --no-merges --grep "^Signed-off-by: " "$RANGE") - NOT_SIGNED_OFF=$(git rev-list --no-merges "$RANGE" | grep -Fxv "$SIGNED_OFF") - if [ -n "$NOT_SIGNED_OFF" ] - then - echo >&2 "ERROR: The following commits do not have DCO signoff:" - while read -r commit; do - echo " $(git log --pretty=oneline --abbrev-commit -n 1 $commit)" - done <<< "$NOT_SIGNED_OFF" - exit 1 - fi - fi -done - -exit 0 diff --git a/flytecopilot/boilerplate/flyte/precommit/hooks/prepare-commit-msg b/flytecopilot/boilerplate/flyte/precommit/hooks/prepare-commit-msg deleted file mode 100755 index 8148d104b8..0000000000 --- a/flytecopilot/boilerplate/flyte/precommit/hooks/prepare-commit-msg +++ /dev/null @@ -1,16 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst -# $ ln -s ../../support/hooks/prepare-commit-msg .git/hooks/prepare-commit-msg - -COMMIT_MESSAGE_FILE="$1" -AUTHOR=$(git var GIT_AUTHOR_IDENT) -SIGNOFF=$(echo $AUTHOR | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') - -# Check for DCO signoff message. If one doesn't exist, append one and then warn -# the user that you did so. -if ! $(grep -qs "^$SIGNOFF" "$COMMIT_MESSAGE_FILE") ; then - echo "\n$SIGNOFF" >> "$COMMIT_MESSAGE_FILE" - echo "Appended the following signoff to the end of the commit message:\n $SIGNOFF\n" -fi diff --git a/flytecopilot/boilerplate/flyte/precommit/update.sh b/flytecopilot/boilerplate/flyte/precommit/update.sh deleted file mode 100755 index 971c8386c1..0000000000 --- a/flytecopilot/boilerplate/flyte/precommit/update.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -# Helper script for Automatically add DCO signoff with commit hooks -# Taken from Envoy https://gitlab.cncf.ci/envoyproxy/envoy -if [ ! "$PWD" == "$(git rev-parse --show-toplevel)" ]; then - cat >&2 <<__EOF__ -ERROR: this script must be run at the root of the envoy source tree -__EOF__ - exit 1 -fi - -# Helper functions that calculate `abspath` and `relpath`. Taken from Mesos -# commit 82b040a60561cf94dec3197ea88ae15e57bcaa97, which also carries the Apache -# V2 license, and has deployed this code successfully for some time. -abspath() { - cd "$(dirname "${1}")" - echo "${PWD}"/"$(basename "${1}")" - cd "${OLDPWD}" -} -relpath() { - local FROM TO UP - FROM="$(abspath "${1%/}")" TO="$(abspath "${2%/}"/)" - while test "${TO}" = "${TO#"${FROM}"/}" \ - -a "${TO}" != "${FROM}"; do - FROM="${FROM%/*}" UP="../${UP}" - done - TO="${UP%/}${TO#${FROM}}" - echo "${TO:-.}" -} - -# Try to find the `.git` directory, even if it's not in Flyte project root (as -# it wouldn't be if, say, this were in a submodule). The "blessed" but fairly -# new way to do this is to use `--git-common-dir`. -DOT_GIT_DIR=$(git rev-parse --git-common-dir) -if test ! -d "${DOT_GIT_DIR}"; then - # If `--git-common-dir` is not available, fall back to older way of doing it. - DOT_GIT_DIR=$(git rev-parse --git-dir) -fi - -mkdir -p ${DOT_GIT_DIR}/hooks - -HOOKS_DIR="${DOT_GIT_DIR}/hooks" -HOOKS_DIR_RELPATH=$(relpath "${HOOKS_DIR}" "${PWD}") - -if [ ! -e "${HOOKS_DIR}/prepare-commit-msg" ]; then - echo "Installing hook 'prepare-commit-msg'" - ln -s "${HOOKS_DIR_RELPATH}/boilerplate/flyte/precommit/hooks/prepare-commit-msg" "${HOOKS_DIR}/prepare-commit-msg" -fi - -if [ ! -e "${HOOKS_DIR}/pre-push" ]; then - echo "Installing hook 'pre-push'" - ln -s "${HOOKS_DIR_RELPATH}/boilerplate/flyte/precommit/hooks/pre-push" "${HOOKS_DIR}/pre-push" -fi diff --git a/flytecopilot/boilerplate/flyte/pull_request_template/Readme.rst b/flytecopilot/boilerplate/flyte/pull_request_template/Readme.rst deleted file mode 100644 index ee54437252..0000000000 --- a/flytecopilot/boilerplate/flyte/pull_request_template/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -Pull Request Template -~~~~~~~~~~~~~~~~~~~~~ - -Provides a Pull Request template. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. diff --git a/flytecopilot/boilerplate/flyte/pull_request_template/pull_request_template.md b/flytecopilot/boilerplate/flyte/pull_request_template/pull_request_template.md deleted file mode 100644 index 9cdab99b46..0000000000 --- a/flytecopilot/boilerplate/flyte/pull_request_template/pull_request_template.md +++ /dev/null @@ -1,35 +0,0 @@ -## _Read then delete this section_ - -_- Make sure to use a concise title for the pull-request._ - -_- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version -will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump)_ - -# TL;DR -_Please replace this text with a description of what this PR accomplishes._ - -## Type - - [ ] Bug Fix - - [ ] Feature - - [ ] Plugin - -## Are all requirements met? - - - [ ] Code completed - - [ ] Smoke tested - - [ ] Unit tests added - - [ ] Code documentation added - - [ ] Any pending items have an associated Issue - -## Complete description - _How did you fix the bug, make the feature etc. Link to any design docs etc_ - -## Tracking Issue -_Remove the '*fixes*' keyword if there will be multiple PRs to fix the linked issue_ - -fixes https://github.com/flyteorg/flyte/issues/ - -## Follow-up issue -_NA_ -OR -_https://github.com/flyteorg/flyte/issues/_ diff --git a/flytecopilot/boilerplate/flyte/pull_request_template/update.sh b/flytecopilot/boilerplate/flyte/pull_request_template/update.sh deleted file mode 100755 index 051e9dbce0..0000000000 --- a/flytecopilot/boilerplate/flyte/pull_request_template/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/pull_request_template.md ${DIR}/../../../pull_request_template.md diff --git a/flytecopilot/boilerplate/update.cfg b/flytecopilot/boilerplate/update.cfg deleted file mode 100755 index 80ec18df8e..0000000000 --- a/flytecopilot/boilerplate/update.cfg +++ /dev/null @@ -1,6 +0,0 @@ -flyte/golang_test_targets -flyte/golangci_file -flyte/golang_support_tools -flyte/pull_request_template -flyte/docker_build -flyte/ diff --git a/flytecopilot/boilerplate/update.sh b/flytecopilot/boilerplate/update.sh deleted file mode 100755 index 73de4dc91c..0000000000 --- a/flytecopilot/boilerplate/update.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -OUT="$(mktemp -d)" -trap 'rm -fr $OUT' EXIT - -git clone https://github.com/flyteorg/boilerplate.git "${OUT}" - -echo "Updating the update.sh script." -cp "${OUT}/boilerplate/update.sh" "${DIR}/update.sh" - -CONFIG_FILE="${DIR}/update.cfg" -README="https://github.com/flyteorg/boilerplate/blob/master/Readme.rst" - -if [ ! -f "$CONFIG_FILE" ]; then - echo "$CONFIG_FILE not found." - echo "This file is required in order to select which features to include." - echo "See $README for more details." - exit 1 -fi - -if [ -z "$REPOSITORY" ]; then - echo "$REPOSITORY is required to run this script" - echo "See $README for more details." - exit 1 -fi - -while read -r directory junk; do - # Skip comment lines (which can have leading whitespace) - if [[ "$directory" == '#'* ]]; then - continue - fi - # Skip blank or whitespace-only lines - if [[ "$directory" == "" ]]; then - continue - fi - # Lines like - # valid/path other_junk - # are not acceptable, unless `other_junk` is a comment - if [[ "$junk" != "" ]] && [[ "$junk" != '#'* ]]; then - echo "Invalid config! Only one directory is allowed per line. Found '$junk'" - exit 1 - fi - - dir_path="${OUT}/boilerplate/${directory}" - # Make sure the directory exists - if ! [[ -d "$dir_path" ]]; then - echo "Invalid boilerplate directory: '$directory'" - exit 1 - fi - - echo "***********************************************************************************" - echo "$directory is configured in update.cfg." - echo "-----------------------------------------------------------------------------------" - echo "syncing files from source." - rm -rf "${DIR:?}/${directory}" - mkdir -p "$(dirname "${DIR}"/"${directory}")" - cp -r "$dir_path" "${DIR}/${directory}" - if [ -f "${DIR}/${directory}/update.sh" ]; then - echo "executing ${DIR}/${directory}/update.sh" - "${DIR}/${directory}/update.sh" - fi - echo "***********************************************************************************" - echo "" -done < "$CONFIG_FILE" diff --git a/flyteidl/Makefile b/flyteidl/Makefile index d93d9cba27..aad8a5c6b5 100644 --- a/flyteidl/Makefile +++ b/flyteidl/Makefile @@ -1,7 +1,6 @@ -#!/bin/bash - export REPOSITORY=flyteidl -include boilerplate/flyte/golang_test_targets/Makefile +export REPO_ROOT=.. +include ../boilerplate/flyte/golang_test_targets/Makefile define PIP_COMPILE pip-compile $(1) --upgrade --verbose @@ -40,7 +39,3 @@ PLACEHOLDER_NPM := \"version\": \"0.0.0-develop\" update_npmversion: grep "$(PLACEHOLDER_NPM)" "package.json" sed -i "s/$(PLACEHOLDER_NPM)/\"version\": \"${VERSION}\"/g" "package.json" - -.PHONY: go-tidy -go-tidy: - go mod tidy diff --git a/flyteidl/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md b/flyteidl/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md deleted file mode 100644 index e12139d691..0000000000 --- a/flyteidl/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,2 +0,0 @@ -This project is governed by LF AI Foundation's [code of conduct](https://lfprojects.org/policies/code-of-conduct/). -All contributors and participants agree to abide by its terms. diff --git a/flyteidl/boilerplate/flyte/code_of_conduct/README.rst b/flyteidl/boilerplate/flyte/code_of_conduct/README.rst deleted file mode 100644 index 0c9f2f1ec5..0000000000 --- a/flyteidl/boilerplate/flyte/code_of_conduct/README.rst +++ /dev/null @@ -1,2 +0,0 @@ -CODE OF CONDUCT -~~~~~~~~~~~~~~~ diff --git a/flyteidl/boilerplate/flyte/code_of_conduct/update.sh b/flyteidl/boilerplate/flyte/code_of_conduct/update.sh deleted file mode 100755 index 42f6158460..0000000000 --- a/flyteidl/boilerplate/flyte/code_of_conduct/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/CODE_OF_CONDUCT.md ${DIR}/../../../CODE_OF_CONDUCT.md diff --git a/flyteidl/boilerplate/flyte/golang_support_tools/go.mod b/flyteidl/boilerplate/flyte/golang_support_tools/go.mod deleted file mode 100644 index 40af6255b4..0000000000 --- a/flyteidl/boilerplate/flyte/golang_support_tools/go.mod +++ /dev/null @@ -1,203 +0,0 @@ -module github.com/flyteorg/boilerplate - -go 1.19 - -require ( - github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf - github.com/alvaroloes/enumer v1.1.2 - github.com/golangci/golangci-lint v1.53.3 - github.com/pseudomuto/protoc-gen-doc v1.4.1 -) - -require ( - 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect - 4d63.com/gochecknoglobals v0.2.1 // indirect - github.com/4meepo/tagalign v1.2.2 // indirect - github.com/Abirdcfly/dupword v0.0.11 // indirect - github.com/Antonboom/errname v0.1.10 // indirect - github.com/Antonboom/nilnil v0.1.5 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect - github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.15.0+incompatible // indirect - github.com/OpenPeeDeeP/depguard/v2 v2.1.0 // indirect - github.com/alexkohler/nakedret/v2 v2.0.2 // indirect - github.com/alexkohler/prealloc v1.0.0 // indirect - github.com/alingse/asasalint v0.0.11 // indirect - github.com/aokoli/goutils v1.0.1 // indirect - github.com/ashanbrown/forbidigo v1.5.3 // indirect - github.com/ashanbrown/makezero v1.1.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bkielbasa/cyclop v1.2.1 // indirect - github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bombsimon/wsl/v3 v3.4.0 // indirect - github.com/breml/bidichk v0.2.4 // indirect - github.com/breml/errchkjson v0.3.1 // indirect - github.com/butuzov/ireturn v0.2.0 // indirect - github.com/butuzov/mirror v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/charithe/durationcheck v0.0.10 // indirect - github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 // indirect - github.com/curioswitch/go-reassign v0.2.0 // indirect - github.com/daixiang0/gci v0.10.1 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/denis-tingaikin/go-header v0.4.3 // indirect - github.com/envoyproxy/protoc-gen-validate v0.10.1 // indirect - github.com/esimonov/ifshort v1.0.4 // indirect - github.com/ettle/strcase v0.1.1 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/fatih/structtag v1.2.0 // indirect - github.com/firefart/nonamedreturns v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/go-critic/go-critic v0.8.1 // indirect - github.com/go-toolsmith/astcast v1.1.0 // indirect - github.com/go-toolsmith/astcopy v1.1.0 // indirect - github.com/go-toolsmith/astequal v1.1.0 // indirect - github.com/go-toolsmith/astfmt v1.1.0 // indirect - github.com/go-toolsmith/astp v1.1.0 // indirect - github.com/go-toolsmith/strparse v1.1.0 // indirect - github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect - github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect - github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect - github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 // indirect - github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect - github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect - github.com/golangci/misspell v0.4.0 // indirect - github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect - github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 // indirect - github.com/gostaticanalysis/analysisutil v0.7.1 // indirect - github.com/gostaticanalysis/comment v1.4.2 // indirect - github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect - github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/huandu/xstrings v1.0.0 // indirect - github.com/imdario/mergo v0.3.5 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jgautheron/goconst v1.5.1 // indirect - github.com/jingyugao/rowserrcheck v1.1.1 // indirect - github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect - github.com/julz/importas v0.1.0 // indirect - github.com/kisielk/errcheck v1.6.3 // indirect - github.com/kisielk/gotool v1.0.0 // indirect - github.com/kkHAIKE/contextcheck v1.1.4 // indirect - github.com/kulti/thelper v0.6.3 // indirect - github.com/kunwardeep/paralleltest v1.0.7 // indirect - github.com/kyoh86/exportloopref v0.1.11 // indirect - github.com/ldez/gomoddirectives v0.2.3 // indirect - github.com/ldez/tagliatelle v0.5.0 // indirect - github.com/leonklingele/grouper v1.1.1 // indirect - github.com/lufeee/execinquery v1.2.1 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/maratori/testableexamples v1.0.0 // indirect - github.com/maratori/testpackage v1.1.1 // indirect - github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mbilski/exhaustivestruct v1.2.0 // indirect - github.com/mgechev/revive v1.3.2 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moricho/tparallel v0.3.1 // indirect - github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect - github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect - github.com/nishanths/exhaustive v0.11.0 // indirect - github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.12.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polyfloyd/go-errorlint v1.4.2 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/pseudomuto/protokit v0.2.0 // indirect - github.com/quasilyte/go-ruleguard v0.3.19 // indirect - github.com/quasilyte/gogrep v0.5.0 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect - github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/ryancurrah/gomodguard v1.3.0 // indirect - github.com/ryanrolds/sqlclosecheck v0.4.0 // indirect - github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect - github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.23.0 // indirect - github.com/securego/gosec/v2 v2.16.0 // indirect - github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/sivchari/containedctx v1.0.3 // indirect - github.com/sivchari/nosnakecase v1.7.0 // indirect - github.com/sivchari/tenv v1.7.1 // indirect - github.com/sonatard/noctx v0.0.2 // indirect - github.com/sourcegraph/go-diff v0.7.0 // indirect - github.com/spf13/afero v1.9.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/stretchr/testify v1.8.4 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect - github.com/tdakkota/asciicheck v0.2.0 // indirect - github.com/tetafro/godot v1.4.11 // indirect - github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect - github.com/timonwong/loggercheck v0.9.4 // indirect - github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect - github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/ultraware/funlen v0.0.3 // indirect - github.com/ultraware/whitespace v0.0.5 // indirect - github.com/uudashr/gocognit v1.0.6 // indirect - github.com/xen0n/gosmopolitan v1.2.1 // indirect - github.com/yagipy/maintidx v1.0.0 // indirect - github.com/yeya24/promlinter v0.2.0 // indirect - github.com/ykadowak/zerologlint v0.1.2 // indirect - gitlab.com/bosi/decorder v0.2.3 // indirect - go.tmz.dev/musttag v0.7.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect - golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect - golang.org/x/tools v0.11.1 // indirect - google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - honnef.co/go/tools v0.4.3 // indirect - mvdan.cc/gofumpt v0.5.0 // indirect - mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect - mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect - mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d // indirect -) - -replace github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 diff --git a/flyteidl/boilerplate/flyte/golang_support_tools/go.sum b/flyteidl/boilerplate/flyte/golang_support_tools/go.sum deleted file mode 100644 index 939c9b701a..0000000000 --- a/flyteidl/boilerplate/flyte/golang_support_tools/go.sum +++ /dev/null @@ -1,1025 +0,0 @@ -4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA= -4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= -4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= -4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/4meepo/tagalign v1.2.2 h1:kQeUTkFTaBRtd/7jm8OKJl9iHk0gAO+TDFPHGSna0aw= -github.com/4meepo/tagalign v1.2.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= -github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= -github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= -github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9Bls= -github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= -github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= -github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf h1:M7A2Tn3R8rVgsoJHHKkmkpiNOItys4GxJj6JytRjdDg= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf/go.mod h1:Kya4Y46gyq/3TEyAzeNe5UkCk+W9apy5KbuX+5KnZ6M= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= -github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= -github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= -github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= -github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= -github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/ashanbrown/forbidigo v1.5.3 h1:jfg+fkm/snMx+V9FBwsl1d340BV/99kZGv5jN9hBoXk= -github.com/ashanbrown/forbidigo v1.5.3/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= -github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= -github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= -github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= -github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= -github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= -github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= -github.com/breml/bidichk v0.2.4/go.mod h1:7Zk0kRFt1LIZxtQdl9W9JwGAcLTTkOs+tN7wuEYGJ3s= -github.com/breml/errchkjson v0.3.1 h1:hlIeXuspTyt8Y/UmP5qy1JocGNR00KQHgfaNtRAjoxQ= -github.com/breml/errchkjson v0.3.1/go.mod h1:XroxrzKjdiutFyW3nWhw34VGg7kiMsDQox73yWCGI2U= -github.com/butuzov/ireturn v0.2.0 h1:kCHi+YzC150GE98WFuZQu9yrTn6GEydO2AuPLbTgnO4= -github.com/butuzov/ireturn v0.2.0/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= -github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= -github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= -github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= -github.com/daixiang0/gci v0.10.1 h1:eheNA3ljF6SxnPD/vE4lCBusVHmV3Rs3dkKvFrJ7MR0= -github.com/daixiang0/gci v0.10.1/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= -github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= -github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= -github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= -github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= -github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/go-critic/go-critic v0.8.1 h1:16omCF1gN3gTzt4j4J6fKI/HnRojhEp+Eks6EuKw3vw= -github.com/go-critic/go-critic v0.8.1/go.mod h1:kpzXl09SIJX1cr9TB/g/sAG+eFEl7ZS9f9cqvZtyNl0= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= -github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= -github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= -github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= -github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= -github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= -github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= -github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= -github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= -github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= -github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= -github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= -github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= -github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= -github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe h1:6RGUuS7EGotKx6J5HIP8ZtyMdiDscjMLfRBSPuzVVeo= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= -github.com/golangci/golangci-lint v1.53.3 h1:CUcRafczT4t1F+mvdkUm6KuOpxUZTl0yWN/rSU6sSMo= -github.com/golangci/golangci-lint v1.53.3/go.mod h1:W4Gg3ONq6p3Jl+0s/h9Gr0j7yEgHJWWZO2bHl2tBUXM= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0= -github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= -github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= -github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= -github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= -github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= -github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.7 h1:2uCk94js0+nVNQoHZNLBkAR1DQJrVzw6T0RMzJn55dQ= -github.com/kunwardeep/paralleltest v1.0.7/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= -github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= -github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= -github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= -github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= -github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= -github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= -github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= -github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= -github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= -github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= -github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= -github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/nishanths/exhaustive v0.11.0 h1:T3I8nUGhl/Cwu5Z2hfc92l0e04D2GEW6e0l8pzda2l0= -github.com/nishanths/exhaustive v0.11.0/go.mod h1:RqwDsZ1xY0dNdqHho2z6X+bgzizwbLYOWnZbbl2wLB4= -github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.12.1 h1:vwOqb5Nu05OikTXqhvLdHCGcx5uthIYIl0t79UVrERQ= -github.com/nunnatsa/ginkgolinter v0.12.1/go.mod h1:AK8Ab1PypVrcGUusuKD8RDcl2KgsIwvNaaxAlyHSzso= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.4.2 h1:CU+O4181IxFDdPH6t/HT7IiDj1I7zxNi1RIUxYwn8d0= -github.com/polyfloyd/go-errorlint v1.4.2/go.mod h1:k6fU/+fQe38ednoZS51T7gSIGQW1y94d6TkSr35OzH8= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= -github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= -github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= -github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= -github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= -github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= -github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= -github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= -github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1jbEOPrEhDzGYq0= -github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= -github.com/securego/gosec/v2 v2.16.0 h1:Pi0JKoasQQ3NnoRao/ww/N/XdynIB9NRYYZT5CyOs5U= -github.com/securego/gosec/v2 v2.16.0/go.mod h1:xvLcVZqUfo4aAQu56TNv7/Ltz6emAOQAEsrZrt7uGlI= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= -github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= -github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= -github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= -github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= -github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= -github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= -github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= -github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= -github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= -github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= -github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= -github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= -github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= -github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= -github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= -github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= -github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= -github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= -github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= -github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= -github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/ykadowak/zerologlint v0.1.2 h1:Um4P5RMmelfjQqQJKtE8ZW+dLZrXrENeIzWWKw800U4= -github.com/ykadowak/zerologlint v0.1.2/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= -gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go-simpler.org/assert v0.5.0 h1:+5L/lajuQtzmbtEfh69sr5cRf2/xZzyJhFjoOz/PPqs= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.tmz.dev/musttag v0.7.0 h1:QfytzjTWGXZmChoX0L++7uQN+yRCPfyFm+whsM+lfGc= -go.tmz.dev/musttag v0.7.0/go.mod h1:oTFPvgOkJmp5kYL02S8+jrH0eLrBIl57rzWeA26zDEM= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.11.1 h1:ojD5zOW8+7dOGzdnNgersm8aPfcDjhMp12UfG93NIMc= -golang.org/x/tools v0.11.1/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= -honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= -mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= -mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/flyteidl/boilerplate/flyte/golang_support_tools/tools.go b/flyteidl/boilerplate/flyte/golang_support_tools/tools.go deleted file mode 100644 index 6c3da04107..0000000000 --- a/flyteidl/boilerplate/flyte/golang_support_tools/tools.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build tools -// +build tools - -package tools - -import ( - _ "github.com/EngHabu/mockery/cmd/mockery" - _ "github.com/alvaroloes/enumer" - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" - _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" - - _ "github.com/flyteorg/flyte/flytestdlib/cli/pflags" -) diff --git a/flyteidl/boilerplate/flyte/golang_test_targets/Makefile b/flyteidl/boilerplate/flyte/golang_test_targets/Makefile deleted file mode 100644 index 71764d8cbf..0000000000 --- a/flyteidl/boilerplate/flyte/golang_test_targets/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - - -.PHONY: download_tooling -download_tooling: #download dependencies (including test deps) for the package - @boilerplate/flyte/golang_test_targets/download_tooling.sh - -.PHONY: generate -generate: download_tooling #generate go code - @boilerplate/flyte/golang_test_targets/go-gen.sh - -.PHONY: lint -lint: download_tooling #lints the package for common code smells - GL_DEBUG=linters_output,env golangci-lint run --fix --deadline=5m --exclude deprecated -v - -# If code is failing goimports linter, this will fix. -# skips 'vendor' -.PHONY: goimports -goimports: - @boilerplate/flyte/golang_test_targets/goimports - -.PHONY: mod_download -mod_download: #download dependencies (including test deps) for the package - go mod download - -.PHONY: install -install: download_tooling mod_download - -.PHONY: show -show: - go list -m all - -.PHONY: test_unit -test_unit: - go test -cover ./... -race - -.PHONY: test_benchmark -test_benchmark: - go test -bench . ./... - -.PHONY: test_unit_cover -test_unit_cover: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -func /tmp/cover.out - -.PHONY: test_unit_visual -test_unit_visual: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -html=/tmp/cover.out - -.PHONY: test_unit_codecov -test_unit_codecov: - go test ./... -race -coverprofile=coverage.txt -covermode=atomic - curl -s https://codecov.io/bash > codecov_bash.sh && bash codecov_bash.sh diff --git a/flyteidl/boilerplate/flyte/golang_test_targets/Readme.rst b/flyteidl/boilerplate/flyte/golang_test_targets/Readme.rst deleted file mode 100644 index f9d890fdd7..0000000000 --- a/flyteidl/boilerplate/flyte/golang_test_targets/Readme.rst +++ /dev/null @@ -1,31 +0,0 @@ -Golang Test Targets -~~~~~~~~~~~~~~~~~~~ - -Provides an ``install`` make target that uses ``go mod`` to install golang dependencies. - -Provides a ``lint`` make target that uses golangci to lint your code. - -Provides a ``test_unit`` target for unit tests. - -Provides a ``test_unit_cover`` target for analysing coverage of unit tests, which will output the coverage of each function and total statement coverage. - -Provides a ``test_unit_visual`` target for visualizing coverage of unit tests through an interactive html code heat map. - -Provides a ``test_benchmark`` target for benchmark tests. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. - -Make sure you're using ``go mod`` for dependency management. - -Provide a ``.golangci`` configuration (the lint target requires it). - -Add ``include boilerplate/flyte/golang_test_targets/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/golang_test_targets/Makefile - -(this ensures the extra make targets get included in your main Makefile) diff --git a/flyteidl/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flyteidl/boilerplate/flyte/golang_test_targets/download_tooling.sh deleted file mode 100755 index b05b353231..0000000000 --- a/flyteidl/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash - -# Everything in this file needs to be installed outside of current module -# The reason we cannot turn off module entirely and install is that we need the replace statement in go.mod -# because we are installing a mockery fork. Turning it off would result installing the original not the fork. -# We also want to version all the other tools. We also want to be able to run go mod tidy without removing the version -# pins. To facilitate this, we're maintaining two sets of go.mod/sum files - the second one only for tooling. This is -# the same approach that go 1.14 will take as well. -# See: -# https://github.com/flyteorg/flyte/issues/129 -# https://github.com/golang/go/issues/30515 for some background context -# https://github.com/go-modules-by-example/index/blob/5ec250b4b78114a55001bd7c9cb88f6e07270ea5/010_tools/README.md - -set -e - -# List of tools to go get -# In the format of ":" or ":" if no cli -tools=( - "github.com/EngHabu/mockery/cmd/mockery" - "github.com/golangci/golangci-lint/cmd/golangci-lint" - "github.com/daixiang0/gci" - "github.com/alvaroloes/enumer" - "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" -) - -tmp_dir=$(mktemp -d -t gotooling-XXX) -echo "Using temp directory ${tmp_dir}" -cp -R boilerplate/flyte/golang_support_tools/* $tmp_dir - -# Compile pflags -make -C ../flytestdlib compile -cp ../flytestdlib/bin/pflags $(go env GOPATH)/bin - -pushd "$tmp_dir" - -for tool in "${tools[@]}"; do - echo "Installing ${tool}" - GO111MODULE=on go install $tool -done - -popd diff --git a/flyteidl/boilerplate/flyte/golang_test_targets/go-gen.sh b/flyteidl/boilerplate/flyte/golang_test_targets/go-gen.sh deleted file mode 100755 index 5ac17fa40a..0000000000 --- a/flyteidl/boilerplate/flyte/golang_test_targets/go-gen.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -echo "Running go generate" -go generate ./... - -# This section is used by GitHub workflow to ensure that the generation step was run -if [ -n "$DELTA_CHECK" ]; then - DIRTY=$(git status --porcelain) - if [ -n "$DIRTY" ]; then - echo "FAILED: Go code updated without committing generated code." - echo "Ensure make generate has run and all changes are committed." - DIFF=$(git diff) - echo "diff detected: $DIFF" - DIFF=$(git diff --name-only) - echo "files different: $DIFF" - exit 1 - else - echo "SUCCESS: Generated code is up to date." - fi -fi diff --git a/flyteidl/boilerplate/flyte/golang_test_targets/goimports b/flyteidl/boilerplate/flyte/golang_test_targets/goimports deleted file mode 100755 index 40f50d106e..0000000000 --- a/flyteidl/boilerplate/flyte/golang_test_targets/goimports +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*" -not -path "./boilerplate/*") -gci write -s standard -s default -s "prefix(github.com/flyteorg)" --custom-order --skip-generated . diff --git a/flyteidl/boilerplate/flyte/golangci_file/.golangci.yml b/flyteidl/boilerplate/flyte/golangci_file/.golangci.yml deleted file mode 100644 index 5d53f35295..0000000000 --- a/flyteidl/boilerplate/flyte/golangci_file/.golangci.yml +++ /dev/null @@ -1,30 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -run: - skip-dirs: - - pkg/client - -linters: - disable-all: true - enable: - - deadcode - - errcheck - - gas - - goconst - - goimports - - golint - - gosimple - - govet - - ineffassign - - misspell - - nakedret - - staticcheck - - structcheck - - typecheck - - unconvert - - unparam - - unused - - varcheck diff --git a/flyteidl/boilerplate/flyte/golangci_file/Readme.rst b/flyteidl/boilerplate/flyte/golangci_file/Readme.rst deleted file mode 100644 index e4cbd18b96..0000000000 --- a/flyteidl/boilerplate/flyte/golangci_file/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -GolangCI File -~~~~~~~~~~~~~ - -Provides a ``.golangci`` file with the linters we've agreed upon. - -**To Enable:** - -Add ``flyteorg/golangci_file`` to your ``boilerplate/update.cfg`` file. diff --git a/flyteidl/boilerplate/flyte/golangci_file/update.sh b/flyteidl/boilerplate/flyte/golangci_file/update.sh deleted file mode 100755 index ab2f85c680..0000000000 --- a/flyteidl/boilerplate/flyte/golangci_file/update.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -# Clone the .golangci file -echo " - copying ${DIR}/.golangci to the root directory." -cp ${DIR}/.golangci.yml ${DIR}/../../../.golangci.yml diff --git a/flyteidl/boilerplate/flyte/pull_request_template/Readme.rst b/flyteidl/boilerplate/flyte/pull_request_template/Readme.rst deleted file mode 100644 index ee54437252..0000000000 --- a/flyteidl/boilerplate/flyte/pull_request_template/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -Pull Request Template -~~~~~~~~~~~~~~~~~~~~~ - -Provides a Pull Request template. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. diff --git a/flyteidl/boilerplate/flyte/pull_request_template/pull_request_template.md b/flyteidl/boilerplate/flyte/pull_request_template/pull_request_template.md deleted file mode 100644 index 9cdab99b46..0000000000 --- a/flyteidl/boilerplate/flyte/pull_request_template/pull_request_template.md +++ /dev/null @@ -1,35 +0,0 @@ -## _Read then delete this section_ - -_- Make sure to use a concise title for the pull-request._ - -_- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version -will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump)_ - -# TL;DR -_Please replace this text with a description of what this PR accomplishes._ - -## Type - - [ ] Bug Fix - - [ ] Feature - - [ ] Plugin - -## Are all requirements met? - - - [ ] Code completed - - [ ] Smoke tested - - [ ] Unit tests added - - [ ] Code documentation added - - [ ] Any pending items have an associated Issue - -## Complete description - _How did you fix the bug, make the feature etc. Link to any design docs etc_ - -## Tracking Issue -_Remove the '*fixes*' keyword if there will be multiple PRs to fix the linked issue_ - -fixes https://github.com/flyteorg/flyte/issues/ - -## Follow-up issue -_NA_ -OR -_https://github.com/flyteorg/flyte/issues/_ diff --git a/flyteidl/boilerplate/flyte/pull_request_template/update.sh b/flyteidl/boilerplate/flyte/pull_request_template/update.sh deleted file mode 100755 index 051e9dbce0..0000000000 --- a/flyteidl/boilerplate/flyte/pull_request_template/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/pull_request_template.md ${DIR}/../../../pull_request_template.md diff --git a/flyteidl/boilerplate/flyte/welcome_bot/Readme.rst b/flyteidl/boilerplate/flyte/welcome_bot/Readme.rst deleted file mode 100644 index ea18781185..0000000000 --- a/flyteidl/boilerplate/flyte/welcome_bot/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -Config File -- Welcome Bot -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Provides a ``config.yml`` file. - -**To Enable:** - -Add ``flyte/config.yml`` to your ``boilerplate/update.cfg`` file. \ No newline at end of file diff --git a/flyteidl/boilerplate/flyte/welcome_bot/config.yml b/flyteidl/boilerplate/flyte/welcome_bot/config.yml deleted file mode 100644 index 73da252e52..0000000000 --- a/flyteidl/boilerplate/flyte/welcome_bot/config.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Comment to be posted on PRs from first-time contributors in your repository -newPRWelcomeComment: | - Thank you for opening this pull request! 🙌 - - These tips will help get your PR across the finish line: - - - Most of the repos have a PR template; if not, fill it out to the best of your knowledge. - - Sign off your commits (Reference: [DCO Guide](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md)). - -# Comment to be posted to on pull requests merged by a first time user -firstPRMergeComment: > - Congrats on merging your first pull request! 🎉 - -# Comment to be posted on first-time issues -newIssueWelcomeComment: > - Thank you for opening your first issue here! 🛠 diff --git a/flyteidl/boilerplate/flyte/welcome_bot/update.sh b/flyteidl/boilerplate/flyte/welcome_bot/update.sh deleted file mode 100755 index 2db64ac3f1..0000000000 --- a/flyteidl/boilerplate/flyte/welcome_bot/update.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -# Clone the config.yml file -echo " - copying ${DIR}/config.yml to the root directory." -cp "${DIR}"/config.yml "${DIR}"/../../../.github/config.yml - diff --git a/flyteidl/boilerplate/update.cfg b/flyteidl/boilerplate/update.cfg deleted file mode 100644 index d163cc3e72..0000000000 --- a/flyteidl/boilerplate/update.cfg +++ /dev/null @@ -1,4 +0,0 @@ -flyte/golang_test_targets -flyte/golang_support_tools -flyte/pull_request_template -flyte/code_of_conduct diff --git a/flyteidl/boilerplate/update.sh b/flyteidl/boilerplate/update.sh deleted file mode 100755 index 73de4dc91c..0000000000 --- a/flyteidl/boilerplate/update.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -OUT="$(mktemp -d)" -trap 'rm -fr $OUT' EXIT - -git clone https://github.com/flyteorg/boilerplate.git "${OUT}" - -echo "Updating the update.sh script." -cp "${OUT}/boilerplate/update.sh" "${DIR}/update.sh" - -CONFIG_FILE="${DIR}/update.cfg" -README="https://github.com/flyteorg/boilerplate/blob/master/Readme.rst" - -if [ ! -f "$CONFIG_FILE" ]; then - echo "$CONFIG_FILE not found." - echo "This file is required in order to select which features to include." - echo "See $README for more details." - exit 1 -fi - -if [ -z "$REPOSITORY" ]; then - echo "$REPOSITORY is required to run this script" - echo "See $README for more details." - exit 1 -fi - -while read -r directory junk; do - # Skip comment lines (which can have leading whitespace) - if [[ "$directory" == '#'* ]]; then - continue - fi - # Skip blank or whitespace-only lines - if [[ "$directory" == "" ]]; then - continue - fi - # Lines like - # valid/path other_junk - # are not acceptable, unless `other_junk` is a comment - if [[ "$junk" != "" ]] && [[ "$junk" != '#'* ]]; then - echo "Invalid config! Only one directory is allowed per line. Found '$junk'" - exit 1 - fi - - dir_path="${OUT}/boilerplate/${directory}" - # Make sure the directory exists - if ! [[ -d "$dir_path" ]]; then - echo "Invalid boilerplate directory: '$directory'" - exit 1 - fi - - echo "***********************************************************************************" - echo "$directory is configured in update.cfg." - echo "-----------------------------------------------------------------------------------" - echo "syncing files from source." - rm -rf "${DIR:?}/${directory}" - mkdir -p "$(dirname "${DIR}"/"${directory}")" - cp -r "$dir_path" "${DIR}/${directory}" - if [ -f "${DIR}/${directory}/update.sh" ]; then - echo "executing ${DIR}/${directory}/update.sh" - "${DIR}/${directory}/update.sh" - fi - echo "***********************************************************************************" - echo "" -done < "$CONFIG_FILE" diff --git a/flyteidl/clients/go/admin/auth_interceptor.go b/flyteidl/clients/go/admin/auth_interceptor.go index 09391df67a..8a0024b319 100644 --- a/flyteidl/clients/go/admin/auth_interceptor.go +++ b/flyteidl/clients/go/admin/auth_interceptor.go @@ -6,15 +6,14 @@ import ( "fmt" "net/http" - "github.com/flyteorg/flyte/flyteidl/clients/go/admin/cache" - "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" - "github.com/flyteorg/flyte/flytestdlib/logger" "golang.org/x/oauth2" - + "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/grpc" + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/cache" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" + "github.com/flyteorg/flyte/flytestdlib/logger" ) const ProxyAuthorizationHeader = "proxy-authorization" diff --git a/flyteidl/clients/go/admin/cert_loader.go b/flyteidl/clients/go/admin/cert_loader.go index 2c17c60ee2..d327779cbb 100644 --- a/flyteidl/clients/go/admin/cert_loader.go +++ b/flyteidl/clients/go/admin/cert_loader.go @@ -1,10 +1,9 @@ package admin import ( + "crypto/x509" "fmt" "io/ioutil" - - "crypto/x509" ) // readCACerts from the passed in file at certLoc and return certpool. diff --git a/flyteidl/clients/go/admin/deviceflow/token_orchestrator_test.go b/flyteidl/clients/go/admin/deviceflow/token_orchestrator_test.go index 3ecbeb746e..d5a22c523a 100644 --- a/flyteidl/clients/go/admin/deviceflow/token_orchestrator_test.go +++ b/flyteidl/clients/go/admin/deviceflow/token_orchestrator_test.go @@ -10,16 +10,14 @@ import ( "testing" "time" - "k8s.io/apimachinery/pkg/util/json" - - "github.com/flyteorg/flyte/flytestdlib/config" - "github.com/stretchr/testify/assert" "golang.org/x/oauth2" + "k8s.io/apimachinery/pkg/util/json" "github.com/flyteorg/flyte/flyteidl/clients/go/admin/cache" "github.com/flyteorg/flyte/flyteidl/clients/go/admin/oauth" "github.com/flyteorg/flyte/flyteidl/clients/go/admin/tokenorchestrator" + "github.com/flyteorg/flyte/flytestdlib/config" ) func TestFetchFromAuthFlow(t *testing.T) { diff --git a/flyteidl/clients/go/admin/integration_test.go b/flyteidl/clients/go/admin/integration_test.go index 3dc31a35e3..46e59d33c3 100644 --- a/flyteidl/clients/go/admin/integration_test.go +++ b/flyteidl/clients/go/admin/integration_test.go @@ -10,13 +10,12 @@ import ( "testing" "time" - "google.golang.org/grpc" - + "github.com/stretchr/testify/assert" "golang.org/x/oauth2/clientcredentials" + "google.golang.org/grpc" "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyte/flytestdlib/config" - "github.com/stretchr/testify/assert" ) func TestLiveAdminClient(t *testing.T) { diff --git a/flyteidl/clients/go/admin/pkce/handle_app_call_back_test.go b/flyteidl/clients/go/admin/pkce/handle_app_call_back_test.go index 30c409002d..e97b06ad5a 100644 --- a/flyteidl/clients/go/admin/pkce/handle_app_call_back_test.go +++ b/flyteidl/clients/go/admin/pkce/handle_app_call_back_test.go @@ -7,11 +7,11 @@ import ( "strings" "testing" - "github.com/flyteorg/flyte/flyteidl/clients/go/admin/oauth" - "github.com/stretchr/testify/assert" testhttp "github.com/stretchr/testify/http" "golang.org/x/oauth2" + + "github.com/flyteorg/flyte/flyteidl/clients/go/admin/oauth" ) var ( diff --git a/flyteidl/clients/go/admin/tokenorchestrator/base_token_orchestrator.go b/flyteidl/clients/go/admin/tokenorchestrator/base_token_orchestrator.go index 6fddeee67e..c4891b13ae 100644 --- a/flyteidl/clients/go/admin/tokenorchestrator/base_token_orchestrator.go +++ b/flyteidl/clients/go/admin/tokenorchestrator/base_token_orchestrator.go @@ -5,12 +5,11 @@ import ( "fmt" "time" - "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" - "golang.org/x/oauth2" "github.com/flyteorg/flyte/flyteidl/clients/go/admin/cache" "github.com/flyteorg/flyte/flyteidl/clients/go/admin/oauth" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" "github.com/flyteorg/flyte/flytestdlib/config" "github.com/flyteorg/flyte/flytestdlib/logger" ) diff --git a/flyteidl/clients/go/coreutils/extract_literal_test.go b/flyteidl/clients/go/coreutils/extract_literal_test.go index 57ac565eb3..2ce8747fd5 100644 --- a/flyteidl/clients/go/coreutils/extract_literal_test.go +++ b/flyteidl/clients/go/coreutils/extract_literal_test.go @@ -7,10 +7,10 @@ import ( "testing" "time" - "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" - structpb "github.com/golang/protobuf/ptypes/struct" "github.com/stretchr/testify/assert" + + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" ) func TestFetchLiteral(t *testing.T) { diff --git a/flyteidl/clients/go/coreutils/literals.go b/flyteidl/clients/go/coreutils/literals.go index a49fd88a95..f3277d0886 100644 --- a/flyteidl/clients/go/coreutils/literals.go +++ b/flyteidl/clients/go/coreutils/literals.go @@ -10,13 +10,13 @@ import ( "strings" "time" - "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flyte/flytestdlib/storage" - "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/ptypes" structpb "github.com/golang/protobuf/ptypes/struct" "github.com/pkg/errors" + + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flytestdlib/storage" ) func MakePrimitive(v interface{}) (*core.Primitive, error) { diff --git a/flyteidl/clients/go/coreutils/literals_test.go b/flyteidl/clients/go/coreutils/literals_test.go index b9c5c27d69..24a0af4865 100644 --- a/flyteidl/clients/go/coreutils/literals_test.go +++ b/flyteidl/clients/go/coreutils/literals_test.go @@ -11,14 +11,13 @@ import ( "time" "github.com/go-test/deep" - - "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" - "github.com/flyteorg/flyte/flytestdlib/storage" - "github.com/golang/protobuf/ptypes" structpb "github.com/golang/protobuf/ptypes/struct" "github.com/pkg/errors" "github.com/stretchr/testify/assert" + + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" + "github.com/flyteorg/flyte/flytestdlib/storage" ) func TestMakePrimitive(t *testing.T) { diff --git a/flyteplugins/Makefile b/flyteplugins/Makefile index 60b9090561..9861909e96 100755 --- a/flyteplugins/Makefile +++ b/flyteplugins/Makefile @@ -1,12 +1,9 @@ export REPOSITORY=flyteplugins -include boilerplate/flyte/docker_build/Makefile -include boilerplate/flyte/golang_test_targets/Makefile +export REPO_ROOT=.. +include ../boilerplate/flyte/docker_build/Makefile +include ../boilerplate/flyte/golang_test_targets/Makefile .PHONY: update_boilerplate update_boilerplate: @curl https://raw.githubusercontent.com/flyteorg/boilerplate/master/boilerplate/update.sh -o boilerplate/update.sh @boilerplate/update.sh - -.PHONY: go-tidy -go-tidy: - go mod tidy diff --git a/flyteplugins/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md b/flyteplugins/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md deleted file mode 100644 index e12139d691..0000000000 --- a/flyteplugins/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,2 +0,0 @@ -This project is governed by LF AI Foundation's [code of conduct](https://lfprojects.org/policies/code-of-conduct/). -All contributors and participants agree to abide by its terms. diff --git a/flyteplugins/boilerplate/flyte/code_of_conduct/README.rst b/flyteplugins/boilerplate/flyte/code_of_conduct/README.rst deleted file mode 100644 index 0c9f2f1ec5..0000000000 --- a/flyteplugins/boilerplate/flyte/code_of_conduct/README.rst +++ /dev/null @@ -1,2 +0,0 @@ -CODE OF CONDUCT -~~~~~~~~~~~~~~~ diff --git a/flyteplugins/boilerplate/flyte/code_of_conduct/update.sh b/flyteplugins/boilerplate/flyte/code_of_conduct/update.sh deleted file mode 100755 index 42f6158460..0000000000 --- a/flyteplugins/boilerplate/flyte/code_of_conduct/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/CODE_OF_CONDUCT.md ${DIR}/../../../CODE_OF_CONDUCT.md diff --git a/flyteplugins/boilerplate/flyte/docker_build/Makefile b/flyteplugins/boilerplate/flyte/docker_build/Makefile deleted file mode 100644 index e2b2b8a18d..0000000000 --- a/flyteplugins/boilerplate/flyte/docker_build/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -.PHONY: docker_build -docker_build: - IMAGE_NAME=$$REPOSITORY ./boilerplate/flyte/docker_build/docker_build.sh - -.PHONY: dockerhub_push -dockerhub_push: - IMAGE_NAME=flyteorg/$$REPOSITORY REGISTRY=docker.io ./boilerplate/flyte/docker_build/docker_build.sh diff --git a/flyteplugins/boilerplate/flyte/docker_build/Readme.rst b/flyteplugins/boilerplate/flyte/docker_build/Readme.rst deleted file mode 100644 index 7790b8fbfd..0000000000 --- a/flyteplugins/boilerplate/flyte/docker_build/Readme.rst +++ /dev/null @@ -1,23 +0,0 @@ -Docker Build and Push -~~~~~~~~~~~~~~~~~~~~~ - -Provides a ``make docker_build`` target that builds your image locally. - -Provides a ``make dockerhub_push`` target that pushes your final image to Dockerhub. - -The Dockerhub image will tagged ``:`` - -If git head has a git tag, the Dockerhub image will also be tagged ``:``. - -**To Enable:** - -Add ``flyteorg/docker_build`` to your ``boilerplate/update.cfg`` file. - -Add ``include boilerplate/flyte/docker_build/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/docker_build/Makefile - -(this ensures the extra Make targets get included in your main Makefile) diff --git a/flyteplugins/boilerplate/flyte/docker_build/docker_build.sh b/flyteplugins/boilerplate/flyte/docker_build/docker_build.sh deleted file mode 100755 index 817189aee1..0000000000 --- a/flyteplugins/boilerplate/flyte/docker_build/docker_build.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -echo "" -echo "------------------------------------" -echo " DOCKER BUILD" -echo "------------------------------------" -echo "" - -if [ -n "$REGISTRY" ]; then - # Do not push if there are unstaged git changes - CHANGED=$(git status --porcelain) - if [ -n "$CHANGED" ]; then - echo "Please commit git changes before pushing to a registry" - exit 1 - fi -fi - - -GIT_SHA=$(git rev-parse HEAD) - -IMAGE_TAG_SUFFIX="" -# for intermediate build phases, append -$BUILD_PHASE to all image tags -if [ -n "$BUILD_PHASE" ]; then - IMAGE_TAG_SUFFIX="-${BUILD_PHASE}" -fi - -IMAGE_TAG_WITH_SHA="${IMAGE_NAME}:${GIT_SHA}${IMAGE_TAG_SUFFIX}" - -RELEASE_SEMVER=$(git describe --tags --exact-match "$GIT_SHA" 2>/dev/null) || true -if [ -n "$RELEASE_SEMVER" ]; then - IMAGE_TAG_WITH_SEMVER="${IMAGE_NAME}:${RELEASE_SEMVER}${IMAGE_TAG_SUFFIX}" -fi - -# build the image -# passing no build phase will build the final image -docker build -t "$IMAGE_TAG_WITH_SHA" --target=${BUILD_PHASE} . -echo "${IMAGE_TAG_WITH_SHA} built locally." - -# if REGISTRY specified, push the images to the remote registry -if [ -n "$REGISTRY" ]; then - - if [ -n "${DOCKER_REGISTRY_PASSWORD}" ]; then - docker login --username="$DOCKER_REGISTRY_USERNAME" --password="$DOCKER_REGISTRY_PASSWORD" - fi - - docker tag "$IMAGE_TAG_WITH_SHA" "${REGISTRY}/${IMAGE_TAG_WITH_SHA}" - - docker push "${REGISTRY}/${IMAGE_TAG_WITH_SHA}" - echo "${REGISTRY}/${IMAGE_TAG_WITH_SHA} pushed to remote." - - # If the current commit has a semver tag, also push the images with the semver tag - if [ -n "$RELEASE_SEMVER" ]; then - - docker tag "$IMAGE_TAG_WITH_SHA" "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER}" - - docker push "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER}" - echo "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER} pushed to remote." - - fi -fi diff --git a/flyteplugins/boilerplate/flyte/golang_support_tools/go.mod b/flyteplugins/boilerplate/flyte/golang_support_tools/go.mod deleted file mode 100644 index 2cfeb8aa3a..0000000000 --- a/flyteplugins/boilerplate/flyte/golang_support_tools/go.mod +++ /dev/null @@ -1,247 +0,0 @@ -module github.com/flyteorg/boilerplate - -go 1.19 - -require ( - github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf - github.com/alvaroloes/enumer v1.1.2 - github.com/flyteorg/flytestdlib v0.4.16 - github.com/golangci/golangci-lint v1.53.3 - github.com/pseudomuto/protoc-gen-doc v1.4.1 -) - -require ( - 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect - 4d63.com/gochecknoglobals v0.2.1 // indirect - cloud.google.com/go v0.110.2 // indirect - cloud.google.com/go/compute v1.19.3 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect - cloud.google.com/go/storage v1.29.0 // indirect - github.com/4meepo/tagalign v1.2.2 // indirect - github.com/Abirdcfly/dupword v0.0.11 // indirect - github.com/Antonboom/errname v0.1.10 // indirect - github.com/Antonboom/nilnil v0.1.5 // indirect - github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.17 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.0 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect - github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.15.0+incompatible // indirect - github.com/OpenPeeDeeP/depguard/v2 v2.1.0 // indirect - github.com/alexkohler/nakedret/v2 v2.0.2 // indirect - github.com/alexkohler/prealloc v1.0.0 // indirect - github.com/alingse/asasalint v0.0.11 // indirect - github.com/aokoli/goutils v1.0.1 // indirect - github.com/ashanbrown/forbidigo v1.5.3 // indirect - github.com/ashanbrown/makezero v1.1.1 // indirect - github.com/aws/aws-sdk-go v1.37.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bkielbasa/cyclop v1.2.1 // indirect - github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bombsimon/wsl/v3 v3.4.0 // indirect - github.com/breml/bidichk v0.2.4 // indirect - github.com/breml/errchkjson v0.3.1 // indirect - github.com/butuzov/ireturn v0.2.0 // indirect - github.com/butuzov/mirror v1.1.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/charithe/durationcheck v0.0.10 // indirect - github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 // indirect - github.com/coocood/freecache v1.1.1 // indirect - github.com/curioswitch/go-reassign v0.2.0 // indirect - github.com/daixiang0/gci v0.10.1 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/denis-tingaikin/go-header v0.4.3 // indirect - github.com/envoyproxy/protoc-gen-validate v0.10.0 // indirect - github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 // indirect - github.com/esimonov/ifshort v1.0.4 // indirect - github.com/ettle/strcase v0.1.1 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/fatih/structtag v1.2.0 // indirect - github.com/firefart/nonamedreturns v1.0.4 // indirect - github.com/flyteorg/stow v0.3.1 // indirect - github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-critic/go-critic v0.8.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-toolsmith/astcast v1.1.0 // indirect - github.com/go-toolsmith/astcopy v1.1.0 // indirect - github.com/go-toolsmith/astequal v1.1.0 // indirect - github.com/go-toolsmith/astfmt v1.1.0 // indirect - github.com/go-toolsmith/astp v1.1.0 // indirect - github.com/go-toolsmith/strparse v1.1.0 // indirect - github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gofrs/uuid v4.2.0+incompatible // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect - github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect - github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect - github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 // indirect - github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect - github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect - github.com/golangci/misspell v0.4.0 // indirect - github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect - github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect - github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 // indirect - github.com/gostaticanalysis/analysisutil v0.7.1 // indirect - github.com/gostaticanalysis/comment v1.4.2 // indirect - github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect - github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/huandu/xstrings v1.0.0 // indirect - github.com/imdario/mergo v0.3.5 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jgautheron/goconst v1.5.1 // indirect - github.com/jingyugao/rowserrcheck v1.1.1 // indirect - github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/julz/importas v0.1.0 // indirect - github.com/kisielk/errcheck v1.6.3 // indirect - github.com/kisielk/gotool v1.0.0 // indirect - github.com/kkHAIKE/contextcheck v1.1.4 // indirect - github.com/kulti/thelper v0.6.3 // indirect - github.com/kunwardeep/paralleltest v1.0.7 // indirect - github.com/kyoh86/exportloopref v0.1.11 // indirect - github.com/ldez/gomoddirectives v0.2.3 // indirect - github.com/ldez/tagliatelle v0.5.0 // indirect - github.com/leonklingele/grouper v1.1.1 // indirect - github.com/lufeee/execinquery v1.2.1 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/maratori/testableexamples v1.0.0 // indirect - github.com/maratori/testpackage v1.1.1 // indirect - github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mbilski/exhaustivestruct v1.2.0 // indirect - github.com/mgechev/revive v1.3.2 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moricho/tparallel v0.3.1 // indirect - github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect - github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect - github.com/ncw/swift v1.0.53 // indirect - github.com/nishanths/exhaustive v0.11.0 // indirect - github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.12.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polyfloyd/go-errorlint v1.4.2 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/pseudomuto/protokit v0.2.0 // indirect - github.com/quasilyte/go-ruleguard v0.3.19 // indirect - github.com/quasilyte/gogrep v0.5.0 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect - github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/ryancurrah/gomodguard v1.3.0 // indirect - github.com/ryanrolds/sqlclosecheck v0.4.0 // indirect - github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect - github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.23.0 // indirect - github.com/securego/gosec/v2 v2.16.0 // indirect - github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/sivchari/containedctx v1.0.3 // indirect - github.com/sivchari/nosnakecase v1.7.0 // indirect - github.com/sivchari/tenv v1.7.1 // indirect - github.com/sonatard/noctx v0.0.2 // indirect - github.com/sourcegraph/go-diff v0.7.0 // indirect - github.com/spf13/afero v1.8.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/stretchr/testify v1.8.4 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect - github.com/tdakkota/asciicheck v0.2.0 // indirect - github.com/tetafro/godot v1.4.11 // indirect - github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect - github.com/timonwong/loggercheck v0.9.4 // indirect - github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect - github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/ultraware/funlen v0.0.3 // indirect - github.com/ultraware/whitespace v0.0.5 // indirect - github.com/uudashr/gocognit v1.0.6 // indirect - github.com/xen0n/gosmopolitan v1.2.1 // indirect - github.com/yagipy/maintidx v1.0.0 // indirect - github.com/yeya24/promlinter v0.2.0 // indirect - github.com/ykadowak/zerologlint v0.1.2 // indirect - gitlab.com/bosi/decorder v0.2.3 // indirect - go.opencensus.io v0.24.0 // indirect - go.tmz.dev/musttag v0.7.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect - golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.12.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect - golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect - golang.org/x/tools v0.11.1 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.55.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - honnef.co/go/tools v0.4.3 // indirect - k8s.io/apimachinery v0.20.2 // indirect - k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 // indirect - k8s.io/klog/v2 v2.5.0 // indirect - mvdan.cc/gofumpt v0.5.0 // indirect - mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect - mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect - mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d // indirect -) - -replace github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 diff --git a/flyteplugins/boilerplate/flyte/golang_support_tools/go.sum b/flyteplugins/boilerplate/flyte/golang_support_tools/go.sum deleted file mode 100644 index 4cc434803e..0000000000 --- a/flyteplugins/boilerplate/flyte/golang_support_tools/go.sum +++ /dev/null @@ -1,1225 +0,0 @@ -4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA= -4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= -4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= -4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.3 h1:DcTwsFgGev/wV5+q8o2fzgcHOaac+DKGC91ZlvpsQds= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/4meepo/tagalign v1.2.2 h1:kQeUTkFTaBRtd/7jm8OKJl9iHk0gAO+TDFPHGSna0aw= -github.com/4meepo/tagalign v1.2.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= -github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= -github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= -github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9Bls= -github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= -github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= -github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= -github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= -github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf h1:M7A2Tn3R8rVgsoJHHKkmkpiNOItys4GxJj6JytRjdDg= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf/go.mod h1:Kya4Y46gyq/3TEyAzeNe5UkCk+W9apy5KbuX+5KnZ6M= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= -github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= -github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= -github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= -github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/ashanbrown/forbidigo v1.5.3 h1:jfg+fkm/snMx+V9FBwsl1d340BV/99kZGv5jN9hBoXk= -github.com/ashanbrown/forbidigo v1.5.3/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= -github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= -github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= -github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= -github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= -github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= -github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= -github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= -github.com/breml/bidichk v0.2.4/go.mod h1:7Zk0kRFt1LIZxtQdl9W9JwGAcLTTkOs+tN7wuEYGJ3s= -github.com/breml/errchkjson v0.3.1 h1:hlIeXuspTyt8Y/UmP5qy1JocGNR00KQHgfaNtRAjoxQ= -github.com/breml/errchkjson v0.3.1/go.mod h1:XroxrzKjdiutFyW3nWhw34VGg7kiMsDQox73yWCGI2U= -github.com/butuzov/ireturn v0.2.0 h1:kCHi+YzC150GE98WFuZQu9yrTn6GEydO2AuPLbTgnO4= -github.com/butuzov/ireturn v0.2.0/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= -github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= -github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= -github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= -github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= -github.com/daixiang0/gci v0.10.1 h1:eheNA3ljF6SxnPD/vE4lCBusVHmV3Rs3dkKvFrJ7MR0= -github.com/daixiang0/gci v0.10.1/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= -github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= -github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= -github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= -github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= -github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= -github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= -github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= -github.com/flyteorg/stow v0.3.1 h1:cBMbWl03Gsy5KoA5mutUYTuYpqtT7Pb8+ANGCLnmFEs= -github.com/flyteorg/stow v0.3.1/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= -github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-critic/go-critic v0.8.1 h1:16omCF1gN3gTzt4j4J6fKI/HnRojhEp+Eks6EuKw3vw= -github.com/go-critic/go-critic v0.8.1/go.mod h1:kpzXl09SIJX1cr9TB/g/sAG+eFEl7ZS9f9cqvZtyNl0= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= -github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= -github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= -github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= -github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= -github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= -github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= -github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= -github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= -github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= -github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= -github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= -github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= -github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= -github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe h1:6RGUuS7EGotKx6J5HIP8ZtyMdiDscjMLfRBSPuzVVeo= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= -github.com/golangci/golangci-lint v1.53.3 h1:CUcRafczT4t1F+mvdkUm6KuOpxUZTl0yWN/rSU6sSMo= -github.com/golangci/golangci-lint v1.53.3/go.mod h1:W4Gg3ONq6p3Jl+0s/h9Gr0j7yEgHJWWZO2bHl2tBUXM= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0= -github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= -github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= -github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= -github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= -github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= -github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.7 h1:2uCk94js0+nVNQoHZNLBkAR1DQJrVzw6T0RMzJn55dQ= -github.com/kunwardeep/paralleltest v1.0.7/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= -github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= -github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= -github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= -github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= -github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= -github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= -github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= -github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= -github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= -github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= -github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= -github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= -github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/nishanths/exhaustive v0.11.0 h1:T3I8nUGhl/Cwu5Z2hfc92l0e04D2GEW6e0l8pzda2l0= -github.com/nishanths/exhaustive v0.11.0/go.mod h1:RqwDsZ1xY0dNdqHho2z6X+bgzizwbLYOWnZbbl2wLB4= -github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.12.1 h1:vwOqb5Nu05OikTXqhvLdHCGcx5uthIYIl0t79UVrERQ= -github.com/nunnatsa/ginkgolinter v0.12.1/go.mod h1:AK8Ab1PypVrcGUusuKD8RDcl2KgsIwvNaaxAlyHSzso= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.4.2 h1:CU+O4181IxFDdPH6t/HT7IiDj1I7zxNi1RIUxYwn8d0= -github.com/polyfloyd/go-errorlint v1.4.2/go.mod h1:k6fU/+fQe38ednoZS51T7gSIGQW1y94d6TkSr35OzH8= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= -github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= -github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= -github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= -github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= -github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= -github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= -github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= -github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1jbEOPrEhDzGYq0= -github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= -github.com/securego/gosec/v2 v2.16.0 h1:Pi0JKoasQQ3NnoRao/ww/N/XdynIB9NRYYZT5CyOs5U= -github.com/securego/gosec/v2 v2.16.0/go.mod h1:xvLcVZqUfo4aAQu56TNv7/Ltz6emAOQAEsrZrt7uGlI= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= -github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= -github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= -github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= -github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= -github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= -github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= -github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= -github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= -github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= -github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= -github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= -github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= -github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= -github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= -github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= -github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= -github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= -github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= -github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= -github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= -github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/ykadowak/zerologlint v0.1.2 h1:Um4P5RMmelfjQqQJKtE8ZW+dLZrXrENeIzWWKw800U4= -github.com/ykadowak/zerologlint v0.1.2/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= -gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go-simpler.org/assert v0.5.0 h1:+5L/lajuQtzmbtEfh69sr5cRf2/xZzyJhFjoOz/PPqs= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.tmz.dev/musttag v0.7.0 h1:QfytzjTWGXZmChoX0L++7uQN+yRCPfyFm+whsM+lfGc= -go.tmz.dev/musttag v0.7.0/go.mod h1:oTFPvgOkJmp5kYL02S8+jrH0eLrBIl57rzWeA26zDEM= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.11.1 h1:ojD5zOW8+7dOGzdnNgersm8aPfcDjhMp12UfG93NIMc= -golang.org/x/tools v0.11.1/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= -honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= -k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= -k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= -k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 h1:d+LBRNY3c/KGp7lDblRlUJkayx4Vla7WUTIazoGMdYo= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= -k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= -mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/flyteplugins/boilerplate/flyte/golang_support_tools/tools.go b/flyteplugins/boilerplate/flyte/golang_support_tools/tools.go deleted file mode 100644 index 6c3da04107..0000000000 --- a/flyteplugins/boilerplate/flyte/golang_support_tools/tools.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build tools -// +build tools - -package tools - -import ( - _ "github.com/EngHabu/mockery/cmd/mockery" - _ "github.com/alvaroloes/enumer" - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" - _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" - - _ "github.com/flyteorg/flyte/flytestdlib/cli/pflags" -) diff --git a/flyteplugins/boilerplate/flyte/golang_test_targets/Makefile b/flyteplugins/boilerplate/flyte/golang_test_targets/Makefile deleted file mode 100644 index be72275f5a..0000000000 --- a/flyteplugins/boilerplate/flyte/golang_test_targets/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - - -.PHONY: download_tooling -download_tooling: #download dependencies (including test deps) for the package - @boilerplate/flyte/golang_test_targets/download_tooling.sh - -.PHONY: generate -generate: download_tooling #generate go code - @boilerplate/flyte/golang_test_targets/go-gen.sh - -.PHONY: lint -lint: download_tooling #lints the package for common code smells - GL_DEBUG=linters_output,env golangci-lint run --fix --deadline=5m --exclude deprecated -v - -# If code is failing goimports linter, this will fix. -# skips 'vendor' -.PHONY: goimports -goimports: - @boilerplate/flyte/golang_test_targets/goimports - -.PHONY: mod_download -mod_download: #download dependencies (including test deps) for the package - go mod download - -.PHONY: install -install: download_tooling mod_download - -.PHONY: show -show: - go list -m all - -.PHONY: test_unit -test_unit: - go test -cover ./... -race - -.PHONY: test_benchmark -test_benchmark: - go test -bench . ./... - -.PHONY: test_unit_cover -test_unit_cover: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -func /tmp/cover.out - -.PHONY: test_unit_visual -test_unit_visual: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -html=/tmp/cover.out - -.PHONY: test_unit_codecov -test_unit_codecov: - go test ./... -race -coverprofile=coverage.txt -covermode=atomic - curl -s https://codecov.io/bash > codecov_bash.sh && bash codecov_bash.sh diff --git a/flyteplugins/boilerplate/flyte/golang_test_targets/Readme.rst b/flyteplugins/boilerplate/flyte/golang_test_targets/Readme.rst deleted file mode 100644 index f9d890fdd7..0000000000 --- a/flyteplugins/boilerplate/flyte/golang_test_targets/Readme.rst +++ /dev/null @@ -1,31 +0,0 @@ -Golang Test Targets -~~~~~~~~~~~~~~~~~~~ - -Provides an ``install`` make target that uses ``go mod`` to install golang dependencies. - -Provides a ``lint`` make target that uses golangci to lint your code. - -Provides a ``test_unit`` target for unit tests. - -Provides a ``test_unit_cover`` target for analysing coverage of unit tests, which will output the coverage of each function and total statement coverage. - -Provides a ``test_unit_visual`` target for visualizing coverage of unit tests through an interactive html code heat map. - -Provides a ``test_benchmark`` target for benchmark tests. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. - -Make sure you're using ``go mod`` for dependency management. - -Provide a ``.golangci`` configuration (the lint target requires it). - -Add ``include boilerplate/flyte/golang_test_targets/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/golang_test_targets/Makefile - -(this ensures the extra make targets get included in your main Makefile) diff --git a/flyteplugins/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flyteplugins/boilerplate/flyte/golang_test_targets/download_tooling.sh deleted file mode 100755 index 9cd49959f4..0000000000 --- a/flyteplugins/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Everything in this file needs to be installed outside of current module -# The reason we cannot turn off module entirely and install is that we need the replace statement in go.mod -# because we are installing a mockery fork. Turning it off would result installing the original not the fork. -# We also want to version all the other tools. We also want to be able to run go mod tidy without removing the version -# pins. To facilitate this, we're maintaining two sets of go.mod/sum files - the second one only for tooling. This is -# the same approach that go 1.14 will take as well. -# See: -# https://github.com/flyteorg/flyte/issues/129 -# https://github.com/golang/go/issues/30515 for some background context -# https://github.com/go-modules-by-example/index/blob/5ec250b4b78114a55001bd7c9cb88f6e07270ea5/010_tools/README.md - -set -e - -# List of tools to go get -# In the format of ":" or ":" if no cli -tools=( - "github.com/EngHabu/mockery/cmd/mockery" - "github.com/flyteorg/flytestdlib/cli/pflags@latest" - "github.com/golangci/golangci-lint/cmd/golangci-lint" - "github.com/daixiang0/gci" - "github.com/alvaroloes/enumer" - "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" -) - -tmp_dir=$(mktemp -d -t gotooling-XXX) -echo "Using temp directory ${tmp_dir}" -cp -R boilerplate/flyte/golang_support_tools/* $tmp_dir -pushd "$tmp_dir" - -for tool in "${tools[@]}" -do - echo "Installing ${tool}" - GO111MODULE=on go install $tool -done - -popd diff --git a/flyteplugins/boilerplate/flyte/golang_test_targets/go-gen.sh b/flyteplugins/boilerplate/flyte/golang_test_targets/go-gen.sh deleted file mode 100755 index 5ac17fa40a..0000000000 --- a/flyteplugins/boilerplate/flyte/golang_test_targets/go-gen.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -echo "Running go generate" -go generate ./... - -# This section is used by GitHub workflow to ensure that the generation step was run -if [ -n "$DELTA_CHECK" ]; then - DIRTY=$(git status --porcelain) - if [ -n "$DIRTY" ]; then - echo "FAILED: Go code updated without committing generated code." - echo "Ensure make generate has run and all changes are committed." - DIFF=$(git diff) - echo "diff detected: $DIFF" - DIFF=$(git diff --name-only) - echo "files different: $DIFF" - exit 1 - else - echo "SUCCESS: Generated code is up to date." - fi -fi diff --git a/flyteplugins/boilerplate/flyte/golang_test_targets/goimports b/flyteplugins/boilerplate/flyte/golang_test_targets/goimports deleted file mode 100755 index 40f50d106e..0000000000 --- a/flyteplugins/boilerplate/flyte/golang_test_targets/goimports +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*" -not -path "./boilerplate/*") -gci write -s standard -s default -s "prefix(github.com/flyteorg)" --custom-order --skip-generated . diff --git a/flyteplugins/boilerplate/flyte/golangci_file/.golangci.yml b/flyteplugins/boilerplate/flyte/golangci_file/.golangci.yml deleted file mode 100644 index 7f4dbc80e8..0000000000 --- a/flyteplugins/boilerplate/flyte/golangci_file/.golangci.yml +++ /dev/null @@ -1,40 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -run: - skip-dirs: - - pkg/client - -linters: - disable-all: true - enable: - - deadcode - - errcheck - - gas - - gci - - goconst - - goimports - - golint - - gosimple - - govet - - ineffassign - - misspell - - nakedret - - staticcheck - - structcheck - - typecheck - - unconvert - - unparam - - unused - - varcheck - -linters-settings: - gci: - custom-order: true - sections: - - standard - - default - - prefix(github.com/flyteorg) - skip-generated: true diff --git a/flyteplugins/boilerplate/flyte/golangci_file/Readme.rst b/flyteplugins/boilerplate/flyte/golangci_file/Readme.rst deleted file mode 100644 index e4cbd18b96..0000000000 --- a/flyteplugins/boilerplate/flyte/golangci_file/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -GolangCI File -~~~~~~~~~~~~~ - -Provides a ``.golangci`` file with the linters we've agreed upon. - -**To Enable:** - -Add ``flyteorg/golangci_file`` to your ``boilerplate/update.cfg`` file. diff --git a/flyteplugins/boilerplate/flyte/golangci_file/update.sh b/flyteplugins/boilerplate/flyte/golangci_file/update.sh deleted file mode 100755 index ab2f85c680..0000000000 --- a/flyteplugins/boilerplate/flyte/golangci_file/update.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -# Clone the .golangci file -echo " - copying ${DIR}/.golangci to the root directory." -cp ${DIR}/.golangci.yml ${DIR}/../../../.golangci.yml diff --git a/flyteplugins/boilerplate/flyte/pull_request_template/Readme.rst b/flyteplugins/boilerplate/flyte/pull_request_template/Readme.rst deleted file mode 100644 index ee54437252..0000000000 --- a/flyteplugins/boilerplate/flyte/pull_request_template/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -Pull Request Template -~~~~~~~~~~~~~~~~~~~~~ - -Provides a Pull Request template. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. diff --git a/flyteplugins/boilerplate/flyte/pull_request_template/pull_request_template.md b/flyteplugins/boilerplate/flyte/pull_request_template/pull_request_template.md deleted file mode 100644 index 9cdab99b46..0000000000 --- a/flyteplugins/boilerplate/flyte/pull_request_template/pull_request_template.md +++ /dev/null @@ -1,35 +0,0 @@ -## _Read then delete this section_ - -_- Make sure to use a concise title for the pull-request._ - -_- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version -will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump)_ - -# TL;DR -_Please replace this text with a description of what this PR accomplishes._ - -## Type - - [ ] Bug Fix - - [ ] Feature - - [ ] Plugin - -## Are all requirements met? - - - [ ] Code completed - - [ ] Smoke tested - - [ ] Unit tests added - - [ ] Code documentation added - - [ ] Any pending items have an associated Issue - -## Complete description - _How did you fix the bug, make the feature etc. Link to any design docs etc_ - -## Tracking Issue -_Remove the '*fixes*' keyword if there will be multiple PRs to fix the linked issue_ - -fixes https://github.com/flyteorg/flyte/issues/ - -## Follow-up issue -_NA_ -OR -_https://github.com/flyteorg/flyte/issues/_ diff --git a/flyteplugins/boilerplate/flyte/pull_request_template/update.sh b/flyteplugins/boilerplate/flyte/pull_request_template/update.sh deleted file mode 100755 index 051e9dbce0..0000000000 --- a/flyteplugins/boilerplate/flyte/pull_request_template/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/pull_request_template.md ${DIR}/../../../pull_request_template.md diff --git a/flyteplugins/boilerplate/update.cfg b/flyteplugins/boilerplate/update.cfg deleted file mode 100755 index 3a632dbe72..0000000000 --- a/flyteplugins/boilerplate/update.cfg +++ /dev/null @@ -1,6 +0,0 @@ -flyte/code_of_conduct -flyte/docker_build -flyte/golang_test_targets -flyte/golang_support_tools -flyte/golangci_file -flyte/pull_request_template diff --git a/flyteplugins/boilerplate/update.sh b/flyteplugins/boilerplate/update.sh deleted file mode 100755 index 73de4dc91c..0000000000 --- a/flyteplugins/boilerplate/update.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -OUT="$(mktemp -d)" -trap 'rm -fr $OUT' EXIT - -git clone https://github.com/flyteorg/boilerplate.git "${OUT}" - -echo "Updating the update.sh script." -cp "${OUT}/boilerplate/update.sh" "${DIR}/update.sh" - -CONFIG_FILE="${DIR}/update.cfg" -README="https://github.com/flyteorg/boilerplate/blob/master/Readme.rst" - -if [ ! -f "$CONFIG_FILE" ]; then - echo "$CONFIG_FILE not found." - echo "This file is required in order to select which features to include." - echo "See $README for more details." - exit 1 -fi - -if [ -z "$REPOSITORY" ]; then - echo "$REPOSITORY is required to run this script" - echo "See $README for more details." - exit 1 -fi - -while read -r directory junk; do - # Skip comment lines (which can have leading whitespace) - if [[ "$directory" == '#'* ]]; then - continue - fi - # Skip blank or whitespace-only lines - if [[ "$directory" == "" ]]; then - continue - fi - # Lines like - # valid/path other_junk - # are not acceptable, unless `other_junk` is a comment - if [[ "$junk" != "" ]] && [[ "$junk" != '#'* ]]; then - echo "Invalid config! Only one directory is allowed per line. Found '$junk'" - exit 1 - fi - - dir_path="${OUT}/boilerplate/${directory}" - # Make sure the directory exists - if ! [[ -d "$dir_path" ]]; then - echo "Invalid boilerplate directory: '$directory'" - exit 1 - fi - - echo "***********************************************************************************" - echo "$directory is configured in update.cfg." - echo "-----------------------------------------------------------------------------------" - echo "syncing files from source." - rm -rf "${DIR:?}/${directory}" - mkdir -p "$(dirname "${DIR}"/"${directory}")" - cp -r "$dir_path" "${DIR}/${directory}" - if [ -f "${DIR}/${directory}/update.sh" ]; then - echo "executing ${DIR}/${directory}/update.sh" - "${DIR}/${directory}/update.sh" - fi - echo "***********************************************************************************" - echo "" -done < "$CONFIG_FILE" diff --git a/flyteplugins/go/tasks/pluginmachinery/core/mocks/task_overrides.go b/flyteplugins/go/tasks/pluginmachinery/core/mocks/task_overrides.go index 57c9f9db2d..ab42b1189f 100644 --- a/flyteplugins/go/tasks/pluginmachinery/core/mocks/task_overrides.go +++ b/flyteplugins/go/tasks/pluginmachinery/core/mocks/task_overrides.go @@ -48,68 +48,66 @@ func (_m *TaskOverrides) GetConfig() *v1.ConfigMap { return r0 } -type TaskOverrides_GetExtendedResources struct { +type TaskOverrides_GetContainerImage struct { *mock.Call } -func (_m TaskOverrides_GetExtendedResources) Return(_a0 *flyteidlcore.ExtendedResources) *TaskOverrides_GetExtendedResources { - return &TaskOverrides_GetExtendedResources{Call: _m.Call.Return(_a0)} +func (_m TaskOverrides_GetContainerImage) Return(_a0 string) *TaskOverrides_GetContainerImage { + return &TaskOverrides_GetContainerImage{Call: _m.Call.Return(_a0)} } -func (_m *TaskOverrides) OnGetExtendedResources() *TaskOverrides_GetExtendedResources { - c_call := _m.On("GetExtendedResources") - return &TaskOverrides_GetExtendedResources{Call: c_call} +func (_m *TaskOverrides) OnGetContainerImage() *TaskOverrides_GetContainerImage { + c_call := _m.On("GetContainerImage") + return &TaskOverrides_GetContainerImage{Call: c_call} } -func (_m *TaskOverrides) OnGetExtendedResourcesMatch(matchers ...interface{}) *TaskOverrides_GetExtendedResources { - c_call := _m.On("GetExtendedResources", matchers...) - return &TaskOverrides_GetExtendedResources{Call: c_call} +func (_m *TaskOverrides) OnGetContainerImageMatch(matchers ...interface{}) *TaskOverrides_GetContainerImage { + c_call := _m.On("GetContainerImage", matchers...) + return &TaskOverrides_GetContainerImage{Call: c_call} } -// GetExtendedResources provides a mock function with given fields: -func (_m *TaskOverrides) GetExtendedResources() *flyteidlcore.ExtendedResources { +// GetContainerImage provides a mock function with given fields: +func (_m *TaskOverrides) GetContainerImage() string { ret := _m.Called() - var r0 *flyteidlcore.ExtendedResources - if rf, ok := ret.Get(0).(func() *flyteidlcore.ExtendedResources); ok { + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*flyteidlcore.ExtendedResources) - } + r0 = ret.Get(0).(string) } return r0 } -type TaskOverrides_GetContainerImage struct { +type TaskOverrides_GetExtendedResources struct { *mock.Call } -func (_m TaskOverrides_GetContainerImage) Return(_a0 string) *TaskOverrides_GetContainerImage { - return &TaskOverrides_GetContainerImage{Call: _m.Call.Return(_a0)} +func (_m TaskOverrides_GetExtendedResources) Return(_a0 *flyteidlcore.ExtendedResources) *TaskOverrides_GetExtendedResources { + return &TaskOverrides_GetExtendedResources{Call: _m.Call.Return(_a0)} } -func (_m *TaskOverrides) OnGetContainerImage() *TaskOverrides_GetContainerImage { - c_call := _m.On("GetContainerImage") - return &TaskOverrides_GetContainerImage{Call: c_call} +func (_m *TaskOverrides) OnGetExtendedResources() *TaskOverrides_GetExtendedResources { + c_call := _m.On("GetExtendedResources") + return &TaskOverrides_GetExtendedResources{Call: c_call} } -func (_m *TaskOverrides) OnGetContainerImageMatch(matchers ...interface{}) *TaskOverrides_GetContainerImage { - c_call := _m.On("GetContainerImage", matchers...) - return &TaskOverrides_GetContainerImage{Call: c_call} +func (_m *TaskOverrides) OnGetExtendedResourcesMatch(matchers ...interface{}) *TaskOverrides_GetExtendedResources { + c_call := _m.On("GetExtendedResources", matchers...) + return &TaskOverrides_GetExtendedResources{Call: c_call} } -// GetContainerImage provides a mock function with given fields: -func (_m *TaskOverrides) GetContainerImage() string { +// GetExtendedResources provides a mock function with given fields: +func (_m *TaskOverrides) GetExtendedResources() *flyteidlcore.ExtendedResources { ret := _m.Called() - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { + var r0 *flyteidlcore.ExtendedResources + if rf, ok := ret.Get(0).(func() *flyteidlcore.ExtendedResources); ok { r0 = rf() } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(string) + r0 = ret.Get(0).(*flyteidlcore.ExtendedResources) } } diff --git a/flyteplugins/go/tasks/plugins/k8s/ray/config_flags.go b/flyteplugins/go/tasks/plugins/k8s/ray/config_flags.go index 8113a26278..8a750ab48b 100755 --- a/flyteplugins/go/tasks/plugins/k8s/ray/config_flags.go +++ b/flyteplugins/go/tasks/plugins/k8s/ray/config_flags.go @@ -59,5 +59,7 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.String(fmt.Sprintf("%v%v", prefix, "remoteClusterConfig.endpoint"), defaultConfig.RemoteClusterConfig.Endpoint, " Remote K8s cluster endpoint") cmdFlags.Bool(fmt.Sprintf("%v%v", prefix, "remoteClusterConfig.enabled"), defaultConfig.RemoteClusterConfig.Enabled, " Boolean flag to enable or disable") cmdFlags.Bool(fmt.Sprintf("%v%v", prefix, "enableUsageStats"), defaultConfig.EnableUsageStats, "Enable usage stats for ray jobs. These stats are submitted to usage-stats.ray.io per https://docs.ray.io/en/latest/cluster/usage-stats.html") + cmdFlags.String(fmt.Sprintf("%v%v", prefix, "kubeRayCrdVersion"), defaultConfig.KubeRayCrdVersion, "Version of the Ray CRD to use when creating RayClusters or RayJobs.") + cmdFlags.String(fmt.Sprintf("%v%v", prefix, "serviceAccount"), defaultConfig.ServiceAccount, "The k8s service account to run as") return cmdFlags } diff --git a/flyteplugins/go/tasks/plugins/k8s/ray/config_flags_test.go b/flyteplugins/go/tasks/plugins/k8s/ray/config_flags_test.go index f05c62c8e1..6938ee398f 100755 --- a/flyteplugins/go/tasks/plugins/k8s/ray/config_flags_test.go +++ b/flyteplugins/go/tasks/plugins/k8s/ray/config_flags_test.go @@ -225,4 +225,32 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_kubeRayCrdVersion", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("kubeRayCrdVersion", testValue) + if vString, err := cmdFlags.GetString("kubeRayCrdVersion"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.KubeRayCrdVersion) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_serviceAccount", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("serviceAccount", testValue) + if vString, err := cmdFlags.GetString("serviceAccount"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.ServiceAccount) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytepropeller/Makefile b/flytepropeller/Makefile index 5b90d0e4b7..351ff9ed03 100644 --- a/flytepropeller/Makefile +++ b/flytepropeller/Makefile @@ -1,7 +1,8 @@ export REPOSITORY=flytepropeller -include boilerplate/flyte/docker_build/Makefile -include boilerplate/flyte/golang_test_targets/Makefile -include boilerplate/flyte/end2end/Makefile +export REPO_ROOT=.. +include ../boilerplate/flyte/docker_build/Makefile +include ../boilerplate/flyte/golang_test_targets/Makefile +include ../boilerplate/flyte/end2end/Makefile .PHONY: update_boilerplate update_boilerplate: @@ -59,7 +60,3 @@ clean: golden: go test ./cmd/kubectl-flyte/cmd -update go test ./pkg/compiler/test -update - -.PHONY: go-tidy -go-tidy: - go mod tidy diff --git a/flytepropeller/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md b/flytepropeller/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md deleted file mode 100644 index e12139d691..0000000000 --- a/flytepropeller/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,2 +0,0 @@ -This project is governed by LF AI Foundation's [code of conduct](https://lfprojects.org/policies/code-of-conduct/). -All contributors and participants agree to abide by its terms. diff --git a/flytepropeller/boilerplate/flyte/code_of_conduct/README.rst b/flytepropeller/boilerplate/flyte/code_of_conduct/README.rst deleted file mode 100644 index 0c9f2f1ec5..0000000000 --- a/flytepropeller/boilerplate/flyte/code_of_conduct/README.rst +++ /dev/null @@ -1,2 +0,0 @@ -CODE OF CONDUCT -~~~~~~~~~~~~~~~ diff --git a/flytepropeller/boilerplate/flyte/code_of_conduct/update.sh b/flytepropeller/boilerplate/flyte/code_of_conduct/update.sh deleted file mode 100755 index 42f6158460..0000000000 --- a/flytepropeller/boilerplate/flyte/code_of_conduct/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/CODE_OF_CONDUCT.md ${DIR}/../../../CODE_OF_CONDUCT.md diff --git a/flytepropeller/boilerplate/flyte/docker_build/Makefile b/flytepropeller/boilerplate/flyte/docker_build/Makefile deleted file mode 100644 index e2b2b8a18d..0000000000 --- a/flytepropeller/boilerplate/flyte/docker_build/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -.PHONY: docker_build -docker_build: - IMAGE_NAME=$$REPOSITORY ./boilerplate/flyte/docker_build/docker_build.sh - -.PHONY: dockerhub_push -dockerhub_push: - IMAGE_NAME=flyteorg/$$REPOSITORY REGISTRY=docker.io ./boilerplate/flyte/docker_build/docker_build.sh diff --git a/flytepropeller/boilerplate/flyte/docker_build/Readme.rst b/flytepropeller/boilerplate/flyte/docker_build/Readme.rst deleted file mode 100644 index 7790b8fbfd..0000000000 --- a/flytepropeller/boilerplate/flyte/docker_build/Readme.rst +++ /dev/null @@ -1,23 +0,0 @@ -Docker Build and Push -~~~~~~~~~~~~~~~~~~~~~ - -Provides a ``make docker_build`` target that builds your image locally. - -Provides a ``make dockerhub_push`` target that pushes your final image to Dockerhub. - -The Dockerhub image will tagged ``:`` - -If git head has a git tag, the Dockerhub image will also be tagged ``:``. - -**To Enable:** - -Add ``flyteorg/docker_build`` to your ``boilerplate/update.cfg`` file. - -Add ``include boilerplate/flyte/docker_build/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/docker_build/Makefile - -(this ensures the extra Make targets get included in your main Makefile) diff --git a/flytepropeller/boilerplate/flyte/docker_build/docker_build.sh b/flytepropeller/boilerplate/flyte/docker_build/docker_build.sh deleted file mode 100755 index 817189aee1..0000000000 --- a/flytepropeller/boilerplate/flyte/docker_build/docker_build.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -echo "" -echo "------------------------------------" -echo " DOCKER BUILD" -echo "------------------------------------" -echo "" - -if [ -n "$REGISTRY" ]; then - # Do not push if there are unstaged git changes - CHANGED=$(git status --porcelain) - if [ -n "$CHANGED" ]; then - echo "Please commit git changes before pushing to a registry" - exit 1 - fi -fi - - -GIT_SHA=$(git rev-parse HEAD) - -IMAGE_TAG_SUFFIX="" -# for intermediate build phases, append -$BUILD_PHASE to all image tags -if [ -n "$BUILD_PHASE" ]; then - IMAGE_TAG_SUFFIX="-${BUILD_PHASE}" -fi - -IMAGE_TAG_WITH_SHA="${IMAGE_NAME}:${GIT_SHA}${IMAGE_TAG_SUFFIX}" - -RELEASE_SEMVER=$(git describe --tags --exact-match "$GIT_SHA" 2>/dev/null) || true -if [ -n "$RELEASE_SEMVER" ]; then - IMAGE_TAG_WITH_SEMVER="${IMAGE_NAME}:${RELEASE_SEMVER}${IMAGE_TAG_SUFFIX}" -fi - -# build the image -# passing no build phase will build the final image -docker build -t "$IMAGE_TAG_WITH_SHA" --target=${BUILD_PHASE} . -echo "${IMAGE_TAG_WITH_SHA} built locally." - -# if REGISTRY specified, push the images to the remote registry -if [ -n "$REGISTRY" ]; then - - if [ -n "${DOCKER_REGISTRY_PASSWORD}" ]; then - docker login --username="$DOCKER_REGISTRY_USERNAME" --password="$DOCKER_REGISTRY_PASSWORD" - fi - - docker tag "$IMAGE_TAG_WITH_SHA" "${REGISTRY}/${IMAGE_TAG_WITH_SHA}" - - docker push "${REGISTRY}/${IMAGE_TAG_WITH_SHA}" - echo "${REGISTRY}/${IMAGE_TAG_WITH_SHA} pushed to remote." - - # If the current commit has a semver tag, also push the images with the semver tag - if [ -n "$RELEASE_SEMVER" ]; then - - docker tag "$IMAGE_TAG_WITH_SHA" "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER}" - - docker push "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER}" - echo "${REGISTRY}/${IMAGE_TAG_WITH_SEMVER} pushed to remote." - - fi -fi diff --git a/flytepropeller/boilerplate/flyte/end2end/Makefile b/flytepropeller/boilerplate/flyte/end2end/Makefile deleted file mode 100644 index 98ee63ae7a..0000000000 --- a/flytepropeller/boilerplate/flyte/end2end/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -.PHONY: end2end_execute -end2end_execute: export FLYTESNACKS_PRIORITIES ?= P0 -end2end_execute: export FLYTESNACKS_VERSION ?= $(shell curl --silent "https://api.github.com/repos/flyteorg/flytesnacks/releases/latest" | jq -r .tag_name) -end2end_execute: - ./boilerplate/flyte/end2end/end2end.sh ./boilerplate/flyte/end2end/functional-test-config.yaml --return_non_zero_on_failure - -.PHONY: k8s_integration_execute -k8s_integration_execute: - echo "pass" diff --git a/flytepropeller/boilerplate/flyte/end2end/end2end.sh b/flytepropeller/boilerplate/flyte/end2end/end2end.sh deleted file mode 100755 index 5dd825c1a0..0000000000 --- a/flytepropeller/boilerplate/flyte/end2end/end2end.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst -set -eu - -CONFIG_FILE=$1; shift -EXTRA_FLAGS=( "$@" ) - -python ./boilerplate/flyte/end2end/run-tests.py $FLYTESNACKS_VERSION $FLYTESNACKS_PRIORITIES $CONFIG_FILE ${EXTRA_FLAGS[@]} diff --git a/flytepropeller/boilerplate/flyte/end2end/functional-test-config.yaml b/flytepropeller/boilerplate/flyte/end2end/functional-test-config.yaml deleted file mode 100644 index 13fc445675..0000000000 --- a/flytepropeller/boilerplate/flyte/end2end/functional-test-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///localhost:30080 - authType: Pkce - insecure: true diff --git a/flytepropeller/boilerplate/flyte/end2end/run-tests.py b/flytepropeller/boilerplate/flyte/end2end/run-tests.py deleted file mode 100644 index 5365da006e..0000000000 --- a/flytepropeller/boilerplate/flyte/end2end/run-tests.py +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/env python3 - -import datetime -import json -import sys -import time -import traceback -from typing import Dict, List, Mapping, Tuple - -import click -import requests -from flytekit.configuration import Config -from flytekit.models.core.execution import WorkflowExecutionPhase -from flytekit.remote import FlyteRemote -from flytekit.remote.executions import FlyteWorkflowExecution - -WAIT_TIME = 10 -MAX_ATTEMPTS = 200 - -# This dictionary maps the names found in the flytesnacks manifest to a list of workflow names and -# inputs. This is so we can progressively cover all priorities in the original flytesnacks manifest, -# starting with "core". -FLYTESNACKS_WORKFLOW_GROUPS: Mapping[str, List[Tuple[str, dict]]] = { - "lite": [ - ("basics.hello_world.hello_world_wf", {}), - ], - "core": [ - # ("development_lifecycle.decks.image_renderer_wf", {}), - # The chain_workflows example in flytesnacks expects to be running in a sandbox. - ("advanced_composition.chain_entities.chain_workflows_wf", {}), - ("advanced_composition.dynamics.wf", {"s1": "Pear", "s2": "Earth"}), - ("advanced_composition.map_task.my_map_workflow", {"a": [1, 2, 3, 4, 5]}), - # Workflows that use nested executions cannot be launched via flyteremote. - # This issue is being tracked in https://github.com/flyteorg/flyte/issues/1482. - # ("control_flow.run_conditions.multiplier", {"my_input": 0.5}), - # ("control_flow.run_conditions.multiplier_2", {"my_input": 10}), - # ("control_flow.run_conditions.multiplier_3", {"my_input": 5}), - # ("control_flow.run_conditions.basic_boolean_wf", {"seed": 5}), - # ("control_flow.run_conditions.bool_input_wf", {"b": True}), - # ("control_flow.run_conditions.nested_conditions", {"my_input": 0.4}), - # ("control_flow.run_conditions.consume_outputs", {"my_input": 0.4, "seed": 7}), - # ("control_flow.run_merge_sort.merge_sort", {"numbers": [5, 4, 3, 2, 1], "count": 5}), - ("advanced_composition.subworkflows.parent_workflow", {"my_input1": "hello"}), - ("advanced_composition.subworkflows.nested_parent_wf", {"a": 3}), - ("basics.workflow.simple_wf", {"x": [1, 2, 3], "y": [1, 2, 3]}), - # TODO: enable new files and folders workflows - # ("basics.files.rotate_one_workflow", {"in_image": "https://upload.wikimedia.org/wikipedia/commons/d/d2/Julia_set_%28C_%3D_0.285%2C_0.01%29.jpg"}), - # ("basics.folders.download_and_rotate", {}), - ("basics.hello_world.hello_world_wf", {}), - ("basics.named_outputs.simple_wf_with_named_outputs", {}), - # # Getting a 403 for the wikipedia image - # # ("basics.reference_task.wf", {}), - ("data_types_and_io.custom_objects.wf", {"x": 10, "y": 20}), - # Enums are not supported in flyteremote - # ("type_system.enums.enum_wf", {"c": "red"}), - ("data_types_and_io.schema.df_wf", {"a": 42}), - ("data_types_and_io.typed_schema.wf", {}), - # ("my.imperative.workflow.example", {"in1": "hello", "in2": "foo"}), - ], - "integrations-k8s-spark": [ - ("k8s_spark_plugin.pyspark_pi.my_spark", {"triggered_date": datetime.datetime.now()}), - ], - "integrations-kfpytorch": [ - ("kfpytorch_plugin.pytorch_mnist.pytorch_training_wf", {}), - ], - "integrations-kftensorflow": [ - ("kftensorflow_plugin.tf_mnist.mnist_tensorflow_workflow", {}), - ], - # "integrations-pod": [ - # ("pod.pod.pod_workflow", {}), - # ], - "integrations-pandera_examples": [ - ("pandera_plugin.basic_schema_example.process_data", {}), - # TODO: investigate type mismatch float -> numpy.float64 - # ("pandera_plugin.validating_and_testing_ml_pipelines.pipeline", {"data_random_state": 42, "model_random_state": 99}), - ], - "integrations-modin_examples": [ - ("modin_plugin.knn_classifier.pipeline", {}), - ], - "integrations-papermilltasks": [ - ("papermill_plugin.simple.nb_to_python_wf", {"f": 3.1415926535}), - ], - "integrations-greatexpectations": [ - ("greatexpectations_plugin.task_example.simple_wf", {}), - ("greatexpectations_plugin.task_example.file_wf", {}), - ("greatexpectations_plugin.task_example.schema_wf", {}), - ("greatexpectations_plugin.task_example.runtime_wf", {}), - ], -} - - -def execute_workflow(remote, version, workflow_name, inputs): - print(f"Fetching workflow={workflow_name} and version={version}") - wf = remote.fetch_workflow(name=workflow_name, version=version) - return remote.execute(wf, inputs=inputs, wait=False) - - -def executions_finished(executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]) -> bool: - for executions in executions_by_wfgroup.values(): - if not all([execution.is_done for execution in executions]): - return False - return True - - -def sync_executions(remote: FlyteRemote, executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]): - try: - for executions in executions_by_wfgroup.values(): - for execution in executions: - print(f"About to sync execution_id={execution.id.name}") - remote.sync(execution) - except Exception: - print(traceback.format_exc()) - print("GOT TO THE EXCEPT") - print("COUNT THIS!") - - -def report_executions(executions_by_wfgroup: Dict[str, List[FlyteWorkflowExecution]]): - for executions in executions_by_wfgroup.values(): - for execution in executions: - print(execution) - - -def schedule_workflow_groups( - tag: str, - workflow_groups: List[str], - remote: FlyteRemote, - terminate_workflow_on_failure: bool, -) -> Dict[str, bool]: - """ - Schedule workflows executions for all workflow groups and return True if all executions succeed, otherwise - return False. - """ - executions_by_wfgroup = {} - # Schedule executions for each workflow group, - for wf_group in workflow_groups: - workflows = FLYTESNACKS_WORKFLOW_GROUPS.get(wf_group, []) - executions_by_wfgroup[wf_group] = [ - execute_workflow(remote, tag, workflow[0], workflow[1]) for workflow in workflows - ] - - # Wait for all executions to finish - attempt = 0 - while attempt == 0 or (not executions_finished(executions_by_wfgroup) and attempt < MAX_ATTEMPTS): - attempt += 1 - print(f"Not all executions finished yet. Sleeping for some time, will check again in {WAIT_TIME}s") - time.sleep(WAIT_TIME) - sync_executions(remote, executions_by_wfgroup) - - report_executions(executions_by_wfgroup) - - results = {} - for wf_group, executions in executions_by_wfgroup.items(): - non_succeeded_executions = [] - for execution in executions: - if execution.closure.phase != WorkflowExecutionPhase.SUCCEEDED: - non_succeeded_executions.append(execution) - # Report failing cases - if len(non_succeeded_executions) != 0: - print(f"Failed executions for {wf_group}:") - for execution in non_succeeded_executions: - print(f" workflow={execution.spec.launch_plan.name}, execution_id={execution.id.name}") - if terminate_workflow_on_failure: - remote.terminate(execution, "aborting execution scheduled in functional test") - # A workflow group succeeds iff all of its executions succeed - results[wf_group] = len(non_succeeded_executions) == 0 - return results - - -def valid(workflow_group): - """ - Return True if a workflow group is contained in FLYTESNACKS_WORKFLOW_GROUPS, - False otherwise. - """ - return workflow_group in FLYTESNACKS_WORKFLOW_GROUPS.keys() - - -def run( - flytesnacks_release_tag: str, - priorities: List[str], - config_file_path, - terminate_workflow_on_failure: bool, -) -> List[Dict[str, str]]: - remote = FlyteRemote( - Config.auto(config_file=config_file_path), - default_project="flytesnacks", - default_domain="development", - ) - - # For a given release tag and priority, this function filters the workflow groups from the flytesnacks - # manifest file. For example, for the release tag "v0.2.224" and the priority "P0" it returns [ "core" ]. - manifest_url = ( - "https://raw.githubusercontent.com/flyteorg/flytesnacks/" f"{flytesnacks_release_tag}/flyte_tests_manifest.json" - ) - r = requests.get(manifest_url) - parsed_manifest = r.json() - workflow_groups = [] - workflow_groups = ( - ["lite"] - if "lite" in priorities - else [group["name"] for group in parsed_manifest if group["priority"] in priorities] - ) - - results = [] - valid_workgroups = [] - for workflow_group in workflow_groups: - if not valid(workflow_group): - results.append( - { - "label": workflow_group, - "status": "coming soon", - "color": "grey", - } - ) - continue - valid_workgroups.append(workflow_group) - - results_by_wfgroup = schedule_workflow_groups( - flytesnacks_release_tag, valid_workgroups, remote, terminate_workflow_on_failure - ) - - for workflow_group, succeeded in results_by_wfgroup.items(): - if succeeded: - background_color = "green" - status = "passing" - else: - background_color = "red" - status = "failing" - - # Workflow groups can be only in one of three states: - # 1. passing: this indicates all the workflow executions for that workflow group - # executed successfully - # 2. failing: this state indicates that at least one execution failed in that - # workflow group - # 3. coming soon: this state is used to indicate that the workflow group was not - # implemented yet. - # - # Each state has a corresponding status and color to be used in the badge for that - # workflow group. - result = { - "label": workflow_group, - "status": status, - "color": background_color, - } - results.append(result) - return results - - -@click.command() -@click.option( - "--return_non_zero_on_failure", - default=False, - is_flag=True, - help="Return a non-zero exit status if any workflow fails", -) -@click.option( - "--terminate_workflow_on_failure", - default=False, - is_flag=True, - help="Abort failing workflows upon exit", -) -@click.argument("flytesnacks_release_tag") -@click.argument("priorities") -@click.argument("config_file") -def cli( - flytesnacks_release_tag, - priorities, - config_file, - return_non_zero_on_failure, - terminate_workflow_on_failure, -): - print(f"return_non_zero_on_failure={return_non_zero_on_failure}") - results = run(flytesnacks_release_tag, priorities, config_file, terminate_workflow_on_failure) - - # Write a json object in its own line describing the result of this run to stdout - print(f"Result of run:\n{json.dumps(results)}") - - # Return a non-zero exit code if core fails - if return_non_zero_on_failure: - for result in results: - if result["status"] not in ("passing", "coming soon"): - sys.exit(1) - - -if __name__ == "__main__": - cli() diff --git a/flytepropeller/boilerplate/flyte/golang_support_tools/go.mod b/flytepropeller/boilerplate/flyte/golang_support_tools/go.mod deleted file mode 100644 index 2cfeb8aa3a..0000000000 --- a/flytepropeller/boilerplate/flyte/golang_support_tools/go.mod +++ /dev/null @@ -1,247 +0,0 @@ -module github.com/flyteorg/boilerplate - -go 1.19 - -require ( - github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf - github.com/alvaroloes/enumer v1.1.2 - github.com/flyteorg/flytestdlib v0.4.16 - github.com/golangci/golangci-lint v1.53.3 - github.com/pseudomuto/protoc-gen-doc v1.4.1 -) - -require ( - 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect - 4d63.com/gochecknoglobals v0.2.1 // indirect - cloud.google.com/go v0.110.2 // indirect - cloud.google.com/go/compute v1.19.3 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect - cloud.google.com/go/storage v1.29.0 // indirect - github.com/4meepo/tagalign v1.2.2 // indirect - github.com/Abirdcfly/dupword v0.0.11 // indirect - github.com/Antonboom/errname v0.1.10 // indirect - github.com/Antonboom/nilnil v0.1.5 // indirect - github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.17 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.0 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect - github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.15.0+incompatible // indirect - github.com/OpenPeeDeeP/depguard/v2 v2.1.0 // indirect - github.com/alexkohler/nakedret/v2 v2.0.2 // indirect - github.com/alexkohler/prealloc v1.0.0 // indirect - github.com/alingse/asasalint v0.0.11 // indirect - github.com/aokoli/goutils v1.0.1 // indirect - github.com/ashanbrown/forbidigo v1.5.3 // indirect - github.com/ashanbrown/makezero v1.1.1 // indirect - github.com/aws/aws-sdk-go v1.37.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bkielbasa/cyclop v1.2.1 // indirect - github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bombsimon/wsl/v3 v3.4.0 // indirect - github.com/breml/bidichk v0.2.4 // indirect - github.com/breml/errchkjson v0.3.1 // indirect - github.com/butuzov/ireturn v0.2.0 // indirect - github.com/butuzov/mirror v1.1.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/charithe/durationcheck v0.0.10 // indirect - github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 // indirect - github.com/coocood/freecache v1.1.1 // indirect - github.com/curioswitch/go-reassign v0.2.0 // indirect - github.com/daixiang0/gci v0.10.1 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/denis-tingaikin/go-header v0.4.3 // indirect - github.com/envoyproxy/protoc-gen-validate v0.10.0 // indirect - github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 // indirect - github.com/esimonov/ifshort v1.0.4 // indirect - github.com/ettle/strcase v0.1.1 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/fatih/structtag v1.2.0 // indirect - github.com/firefart/nonamedreturns v1.0.4 // indirect - github.com/flyteorg/stow v0.3.1 // indirect - github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-critic/go-critic v0.8.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-toolsmith/astcast v1.1.0 // indirect - github.com/go-toolsmith/astcopy v1.1.0 // indirect - github.com/go-toolsmith/astequal v1.1.0 // indirect - github.com/go-toolsmith/astfmt v1.1.0 // indirect - github.com/go-toolsmith/astp v1.1.0 // indirect - github.com/go-toolsmith/strparse v1.1.0 // indirect - github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gofrs/uuid v4.2.0+incompatible // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect - github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect - github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect - github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 // indirect - github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect - github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect - github.com/golangci/misspell v0.4.0 // indirect - github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect - github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect - github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 // indirect - github.com/gostaticanalysis/analysisutil v0.7.1 // indirect - github.com/gostaticanalysis/comment v1.4.2 // indirect - github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect - github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/huandu/xstrings v1.0.0 // indirect - github.com/imdario/mergo v0.3.5 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jgautheron/goconst v1.5.1 // indirect - github.com/jingyugao/rowserrcheck v1.1.1 // indirect - github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/julz/importas v0.1.0 // indirect - github.com/kisielk/errcheck v1.6.3 // indirect - github.com/kisielk/gotool v1.0.0 // indirect - github.com/kkHAIKE/contextcheck v1.1.4 // indirect - github.com/kulti/thelper v0.6.3 // indirect - github.com/kunwardeep/paralleltest v1.0.7 // indirect - github.com/kyoh86/exportloopref v0.1.11 // indirect - github.com/ldez/gomoddirectives v0.2.3 // indirect - github.com/ldez/tagliatelle v0.5.0 // indirect - github.com/leonklingele/grouper v1.1.1 // indirect - github.com/lufeee/execinquery v1.2.1 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/maratori/testableexamples v1.0.0 // indirect - github.com/maratori/testpackage v1.1.1 // indirect - github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mbilski/exhaustivestruct v1.2.0 // indirect - github.com/mgechev/revive v1.3.2 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moricho/tparallel v0.3.1 // indirect - github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect - github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect - github.com/ncw/swift v1.0.53 // indirect - github.com/nishanths/exhaustive v0.11.0 // indirect - github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.12.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polyfloyd/go-errorlint v1.4.2 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/pseudomuto/protokit v0.2.0 // indirect - github.com/quasilyte/go-ruleguard v0.3.19 // indirect - github.com/quasilyte/gogrep v0.5.0 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect - github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/ryancurrah/gomodguard v1.3.0 // indirect - github.com/ryanrolds/sqlclosecheck v0.4.0 // indirect - github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect - github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.23.0 // indirect - github.com/securego/gosec/v2 v2.16.0 // indirect - github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/sivchari/containedctx v1.0.3 // indirect - github.com/sivchari/nosnakecase v1.7.0 // indirect - github.com/sivchari/tenv v1.7.1 // indirect - github.com/sonatard/noctx v0.0.2 // indirect - github.com/sourcegraph/go-diff v0.7.0 // indirect - github.com/spf13/afero v1.8.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/stretchr/testify v1.8.4 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect - github.com/tdakkota/asciicheck v0.2.0 // indirect - github.com/tetafro/godot v1.4.11 // indirect - github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect - github.com/timonwong/loggercheck v0.9.4 // indirect - github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect - github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/ultraware/funlen v0.0.3 // indirect - github.com/ultraware/whitespace v0.0.5 // indirect - github.com/uudashr/gocognit v1.0.6 // indirect - github.com/xen0n/gosmopolitan v1.2.1 // indirect - github.com/yagipy/maintidx v1.0.0 // indirect - github.com/yeya24/promlinter v0.2.0 // indirect - github.com/ykadowak/zerologlint v0.1.2 // indirect - gitlab.com/bosi/decorder v0.2.3 // indirect - go.opencensus.io v0.24.0 // indirect - go.tmz.dev/musttag v0.7.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect - golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.12.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect - golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect - golang.org/x/tools v0.11.1 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.55.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - honnef.co/go/tools v0.4.3 // indirect - k8s.io/apimachinery v0.20.2 // indirect - k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 // indirect - k8s.io/klog/v2 v2.5.0 // indirect - mvdan.cc/gofumpt v0.5.0 // indirect - mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect - mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect - mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d // indirect -) - -replace github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 diff --git a/flytepropeller/boilerplate/flyte/golang_support_tools/go.sum b/flytepropeller/boilerplate/flyte/golang_support_tools/go.sum deleted file mode 100644 index 4cc434803e..0000000000 --- a/flytepropeller/boilerplate/flyte/golang_support_tools/go.sum +++ /dev/null @@ -1,1225 +0,0 @@ -4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA= -4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= -4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= -4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.3 h1:DcTwsFgGev/wV5+q8o2fzgcHOaac+DKGC91ZlvpsQds= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/4meepo/tagalign v1.2.2 h1:kQeUTkFTaBRtd/7jm8OKJl9iHk0gAO+TDFPHGSna0aw= -github.com/4meepo/tagalign v1.2.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= -github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= -github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= -github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9Bls= -github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= -github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= -github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= -github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= -github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf h1:M7A2Tn3R8rVgsoJHHKkmkpiNOItys4GxJj6JytRjdDg= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf/go.mod h1:Kya4Y46gyq/3TEyAzeNe5UkCk+W9apy5KbuX+5KnZ6M= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= -github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= -github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= -github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= -github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/ashanbrown/forbidigo v1.5.3 h1:jfg+fkm/snMx+V9FBwsl1d340BV/99kZGv5jN9hBoXk= -github.com/ashanbrown/forbidigo v1.5.3/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= -github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= -github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= -github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= -github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= -github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= -github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= -github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= -github.com/breml/bidichk v0.2.4/go.mod h1:7Zk0kRFt1LIZxtQdl9W9JwGAcLTTkOs+tN7wuEYGJ3s= -github.com/breml/errchkjson v0.3.1 h1:hlIeXuspTyt8Y/UmP5qy1JocGNR00KQHgfaNtRAjoxQ= -github.com/breml/errchkjson v0.3.1/go.mod h1:XroxrzKjdiutFyW3nWhw34VGg7kiMsDQox73yWCGI2U= -github.com/butuzov/ireturn v0.2.0 h1:kCHi+YzC150GE98WFuZQu9yrTn6GEydO2AuPLbTgnO4= -github.com/butuzov/ireturn v0.2.0/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= -github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= -github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= -github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= -github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= -github.com/daixiang0/gci v0.10.1 h1:eheNA3ljF6SxnPD/vE4lCBusVHmV3Rs3dkKvFrJ7MR0= -github.com/daixiang0/gci v0.10.1/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= -github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= -github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= -github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= -github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= -github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= -github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= -github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= -github.com/flyteorg/stow v0.3.1 h1:cBMbWl03Gsy5KoA5mutUYTuYpqtT7Pb8+ANGCLnmFEs= -github.com/flyteorg/stow v0.3.1/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= -github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-critic/go-critic v0.8.1 h1:16omCF1gN3gTzt4j4J6fKI/HnRojhEp+Eks6EuKw3vw= -github.com/go-critic/go-critic v0.8.1/go.mod h1:kpzXl09SIJX1cr9TB/g/sAG+eFEl7ZS9f9cqvZtyNl0= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= -github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= -github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= -github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= -github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= -github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= -github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= -github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= -github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= -github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= -github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= -github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= -github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= -github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= -github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe h1:6RGUuS7EGotKx6J5HIP8ZtyMdiDscjMLfRBSPuzVVeo= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= -github.com/golangci/golangci-lint v1.53.3 h1:CUcRafczT4t1F+mvdkUm6KuOpxUZTl0yWN/rSU6sSMo= -github.com/golangci/golangci-lint v1.53.3/go.mod h1:W4Gg3ONq6p3Jl+0s/h9Gr0j7yEgHJWWZO2bHl2tBUXM= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0= -github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= -github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= -github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= -github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= -github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= -github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.7 h1:2uCk94js0+nVNQoHZNLBkAR1DQJrVzw6T0RMzJn55dQ= -github.com/kunwardeep/paralleltest v1.0.7/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= -github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= -github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= -github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= -github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= -github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= -github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= -github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= -github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= -github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= -github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= -github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= -github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= -github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/nishanths/exhaustive v0.11.0 h1:T3I8nUGhl/Cwu5Z2hfc92l0e04D2GEW6e0l8pzda2l0= -github.com/nishanths/exhaustive v0.11.0/go.mod h1:RqwDsZ1xY0dNdqHho2z6X+bgzizwbLYOWnZbbl2wLB4= -github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.12.1 h1:vwOqb5Nu05OikTXqhvLdHCGcx5uthIYIl0t79UVrERQ= -github.com/nunnatsa/ginkgolinter v0.12.1/go.mod h1:AK8Ab1PypVrcGUusuKD8RDcl2KgsIwvNaaxAlyHSzso= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.4.2 h1:CU+O4181IxFDdPH6t/HT7IiDj1I7zxNi1RIUxYwn8d0= -github.com/polyfloyd/go-errorlint v1.4.2/go.mod h1:k6fU/+fQe38ednoZS51T7gSIGQW1y94d6TkSr35OzH8= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= -github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= -github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= -github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= -github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= -github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= -github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= -github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= -github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1jbEOPrEhDzGYq0= -github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= -github.com/securego/gosec/v2 v2.16.0 h1:Pi0JKoasQQ3NnoRao/ww/N/XdynIB9NRYYZT5CyOs5U= -github.com/securego/gosec/v2 v2.16.0/go.mod h1:xvLcVZqUfo4aAQu56TNv7/Ltz6emAOQAEsrZrt7uGlI= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= -github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= -github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= -github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= -github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= -github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= -github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= -github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= -github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= -github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= -github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= -github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= -github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= -github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= -github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= -github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= -github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= -github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= -github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= -github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= -github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= -github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/ykadowak/zerologlint v0.1.2 h1:Um4P5RMmelfjQqQJKtE8ZW+dLZrXrENeIzWWKw800U4= -github.com/ykadowak/zerologlint v0.1.2/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= -gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go-simpler.org/assert v0.5.0 h1:+5L/lajuQtzmbtEfh69sr5cRf2/xZzyJhFjoOz/PPqs= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.tmz.dev/musttag v0.7.0 h1:QfytzjTWGXZmChoX0L++7uQN+yRCPfyFm+whsM+lfGc= -go.tmz.dev/musttag v0.7.0/go.mod h1:oTFPvgOkJmp5kYL02S8+jrH0eLrBIl57rzWeA26zDEM= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.11.1 h1:ojD5zOW8+7dOGzdnNgersm8aPfcDjhMp12UfG93NIMc= -golang.org/x/tools v0.11.1/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= -honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= -k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= -k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= -k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 h1:d+LBRNY3c/KGp7lDblRlUJkayx4Vla7WUTIazoGMdYo= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= -k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= -mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/flytepropeller/boilerplate/flyte/golang_support_tools/tools.go b/flytepropeller/boilerplate/flyte/golang_support_tools/tools.go deleted file mode 100644 index 6c3da04107..0000000000 --- a/flytepropeller/boilerplate/flyte/golang_support_tools/tools.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build tools -// +build tools - -package tools - -import ( - _ "github.com/EngHabu/mockery/cmd/mockery" - _ "github.com/alvaroloes/enumer" - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" - _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" - - _ "github.com/flyteorg/flyte/flytestdlib/cli/pflags" -) diff --git a/flytepropeller/boilerplate/flyte/golang_test_targets/Makefile b/flytepropeller/boilerplate/flyte/golang_test_targets/Makefile deleted file mode 100644 index be72275f5a..0000000000 --- a/flytepropeller/boilerplate/flyte/golang_test_targets/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - - -.PHONY: download_tooling -download_tooling: #download dependencies (including test deps) for the package - @boilerplate/flyte/golang_test_targets/download_tooling.sh - -.PHONY: generate -generate: download_tooling #generate go code - @boilerplate/flyte/golang_test_targets/go-gen.sh - -.PHONY: lint -lint: download_tooling #lints the package for common code smells - GL_DEBUG=linters_output,env golangci-lint run --fix --deadline=5m --exclude deprecated -v - -# If code is failing goimports linter, this will fix. -# skips 'vendor' -.PHONY: goimports -goimports: - @boilerplate/flyte/golang_test_targets/goimports - -.PHONY: mod_download -mod_download: #download dependencies (including test deps) for the package - go mod download - -.PHONY: install -install: download_tooling mod_download - -.PHONY: show -show: - go list -m all - -.PHONY: test_unit -test_unit: - go test -cover ./... -race - -.PHONY: test_benchmark -test_benchmark: - go test -bench . ./... - -.PHONY: test_unit_cover -test_unit_cover: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -func /tmp/cover.out - -.PHONY: test_unit_visual -test_unit_visual: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -html=/tmp/cover.out - -.PHONY: test_unit_codecov -test_unit_codecov: - go test ./... -race -coverprofile=coverage.txt -covermode=atomic - curl -s https://codecov.io/bash > codecov_bash.sh && bash codecov_bash.sh diff --git a/flytepropeller/boilerplate/flyte/golang_test_targets/Readme.rst b/flytepropeller/boilerplate/flyte/golang_test_targets/Readme.rst deleted file mode 100644 index f9d890fdd7..0000000000 --- a/flytepropeller/boilerplate/flyte/golang_test_targets/Readme.rst +++ /dev/null @@ -1,31 +0,0 @@ -Golang Test Targets -~~~~~~~~~~~~~~~~~~~ - -Provides an ``install`` make target that uses ``go mod`` to install golang dependencies. - -Provides a ``lint`` make target that uses golangci to lint your code. - -Provides a ``test_unit`` target for unit tests. - -Provides a ``test_unit_cover`` target for analysing coverage of unit tests, which will output the coverage of each function and total statement coverage. - -Provides a ``test_unit_visual`` target for visualizing coverage of unit tests through an interactive html code heat map. - -Provides a ``test_benchmark`` target for benchmark tests. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. - -Make sure you're using ``go mod`` for dependency management. - -Provide a ``.golangci`` configuration (the lint target requires it). - -Add ``include boilerplate/flyte/golang_test_targets/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/golang_test_targets/Makefile - -(this ensures the extra make targets get included in your main Makefile) diff --git a/flytepropeller/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flytepropeller/boilerplate/flyte/golang_test_targets/download_tooling.sh deleted file mode 100755 index 9cd49959f4..0000000000 --- a/flytepropeller/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Everything in this file needs to be installed outside of current module -# The reason we cannot turn off module entirely and install is that we need the replace statement in go.mod -# because we are installing a mockery fork. Turning it off would result installing the original not the fork. -# We also want to version all the other tools. We also want to be able to run go mod tidy without removing the version -# pins. To facilitate this, we're maintaining two sets of go.mod/sum files - the second one only for tooling. This is -# the same approach that go 1.14 will take as well. -# See: -# https://github.com/flyteorg/flyte/issues/129 -# https://github.com/golang/go/issues/30515 for some background context -# https://github.com/go-modules-by-example/index/blob/5ec250b4b78114a55001bd7c9cb88f6e07270ea5/010_tools/README.md - -set -e - -# List of tools to go get -# In the format of ":" or ":" if no cli -tools=( - "github.com/EngHabu/mockery/cmd/mockery" - "github.com/flyteorg/flytestdlib/cli/pflags@latest" - "github.com/golangci/golangci-lint/cmd/golangci-lint" - "github.com/daixiang0/gci" - "github.com/alvaroloes/enumer" - "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" -) - -tmp_dir=$(mktemp -d -t gotooling-XXX) -echo "Using temp directory ${tmp_dir}" -cp -R boilerplate/flyte/golang_support_tools/* $tmp_dir -pushd "$tmp_dir" - -for tool in "${tools[@]}" -do - echo "Installing ${tool}" - GO111MODULE=on go install $tool -done - -popd diff --git a/flytepropeller/boilerplate/flyte/golang_test_targets/go-gen.sh b/flytepropeller/boilerplate/flyte/golang_test_targets/go-gen.sh deleted file mode 100755 index 5ac17fa40a..0000000000 --- a/flytepropeller/boilerplate/flyte/golang_test_targets/go-gen.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -echo "Running go generate" -go generate ./... - -# This section is used by GitHub workflow to ensure that the generation step was run -if [ -n "$DELTA_CHECK" ]; then - DIRTY=$(git status --porcelain) - if [ -n "$DIRTY" ]; then - echo "FAILED: Go code updated without committing generated code." - echo "Ensure make generate has run and all changes are committed." - DIFF=$(git diff) - echo "diff detected: $DIFF" - DIFF=$(git diff --name-only) - echo "files different: $DIFF" - exit 1 - else - echo "SUCCESS: Generated code is up to date." - fi -fi diff --git a/flytepropeller/boilerplate/flyte/golang_test_targets/goimports b/flytepropeller/boilerplate/flyte/golang_test_targets/goimports deleted file mode 100755 index 40f50d106e..0000000000 --- a/flytepropeller/boilerplate/flyte/golang_test_targets/goimports +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*" -not -path "./boilerplate/*") -gci write -s standard -s default -s "prefix(github.com/flyteorg)" --custom-order --skip-generated . diff --git a/flytepropeller/boilerplate/flyte/golangci_file/.golangci.yml b/flytepropeller/boilerplate/flyte/golangci_file/.golangci.yml deleted file mode 100644 index 7f4dbc80e8..0000000000 --- a/flytepropeller/boilerplate/flyte/golangci_file/.golangci.yml +++ /dev/null @@ -1,40 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -run: - skip-dirs: - - pkg/client - -linters: - disable-all: true - enable: - - deadcode - - errcheck - - gas - - gci - - goconst - - goimports - - golint - - gosimple - - govet - - ineffassign - - misspell - - nakedret - - staticcheck - - structcheck - - typecheck - - unconvert - - unparam - - unused - - varcheck - -linters-settings: - gci: - custom-order: true - sections: - - standard - - default - - prefix(github.com/flyteorg) - skip-generated: true diff --git a/flytepropeller/boilerplate/flyte/golangci_file/Readme.rst b/flytepropeller/boilerplate/flyte/golangci_file/Readme.rst deleted file mode 100644 index e4cbd18b96..0000000000 --- a/flytepropeller/boilerplate/flyte/golangci_file/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -GolangCI File -~~~~~~~~~~~~~ - -Provides a ``.golangci`` file with the linters we've agreed upon. - -**To Enable:** - -Add ``flyteorg/golangci_file`` to your ``boilerplate/update.cfg`` file. diff --git a/flytepropeller/boilerplate/flyte/golangci_file/update.sh b/flytepropeller/boilerplate/flyte/golangci_file/update.sh deleted file mode 100755 index ab2f85c680..0000000000 --- a/flytepropeller/boilerplate/flyte/golangci_file/update.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -# Clone the .golangci file -echo " - copying ${DIR}/.golangci to the root directory." -cp ${DIR}/.golangci.yml ${DIR}/../../../.golangci.yml diff --git a/flytepropeller/boilerplate/flyte/pull_request_template/Readme.rst b/flytepropeller/boilerplate/flyte/pull_request_template/Readme.rst deleted file mode 100644 index ee54437252..0000000000 --- a/flytepropeller/boilerplate/flyte/pull_request_template/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -Pull Request Template -~~~~~~~~~~~~~~~~~~~~~ - -Provides a Pull Request template. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. diff --git a/flytepropeller/boilerplate/flyte/pull_request_template/pull_request_template.md b/flytepropeller/boilerplate/flyte/pull_request_template/pull_request_template.md deleted file mode 100644 index 9cdab99b46..0000000000 --- a/flytepropeller/boilerplate/flyte/pull_request_template/pull_request_template.md +++ /dev/null @@ -1,35 +0,0 @@ -## _Read then delete this section_ - -_- Make sure to use a concise title for the pull-request._ - -_- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version -will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump)_ - -# TL;DR -_Please replace this text with a description of what this PR accomplishes._ - -## Type - - [ ] Bug Fix - - [ ] Feature - - [ ] Plugin - -## Are all requirements met? - - - [ ] Code completed - - [ ] Smoke tested - - [ ] Unit tests added - - [ ] Code documentation added - - [ ] Any pending items have an associated Issue - -## Complete description - _How did you fix the bug, make the feature etc. Link to any design docs etc_ - -## Tracking Issue -_Remove the '*fixes*' keyword if there will be multiple PRs to fix the linked issue_ - -fixes https://github.com/flyteorg/flyte/issues/ - -## Follow-up issue -_NA_ -OR -_https://github.com/flyteorg/flyte/issues/_ diff --git a/flytepropeller/boilerplate/flyte/pull_request_template/update.sh b/flytepropeller/boilerplate/flyte/pull_request_template/update.sh deleted file mode 100755 index 051e9dbce0..0000000000 --- a/flytepropeller/boilerplate/flyte/pull_request_template/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/pull_request_template.md ${DIR}/../../../pull_request_template.md diff --git a/flytepropeller/boilerplate/update.cfg b/flytepropeller/boilerplate/update.cfg deleted file mode 100644 index d0392c6332..0000000000 --- a/flytepropeller/boilerplate/update.cfg +++ /dev/null @@ -1,7 +0,0 @@ -flyte/docker_build -flyte/golang_test_targets -flyte/golangci_file -flyte/end2end -flyte/golang_support_tools -flyte/pull_request_template -flyte/code_of_conduct diff --git a/flytepropeller/boilerplate/update.sh b/flytepropeller/boilerplate/update.sh deleted file mode 100755 index 73de4dc91c..0000000000 --- a/flytepropeller/boilerplate/update.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -OUT="$(mktemp -d)" -trap 'rm -fr $OUT' EXIT - -git clone https://github.com/flyteorg/boilerplate.git "${OUT}" - -echo "Updating the update.sh script." -cp "${OUT}/boilerplate/update.sh" "${DIR}/update.sh" - -CONFIG_FILE="${DIR}/update.cfg" -README="https://github.com/flyteorg/boilerplate/blob/master/Readme.rst" - -if [ ! -f "$CONFIG_FILE" ]; then - echo "$CONFIG_FILE not found." - echo "This file is required in order to select which features to include." - echo "See $README for more details." - exit 1 -fi - -if [ -z "$REPOSITORY" ]; then - echo "$REPOSITORY is required to run this script" - echo "See $README for more details." - exit 1 -fi - -while read -r directory junk; do - # Skip comment lines (which can have leading whitespace) - if [[ "$directory" == '#'* ]]; then - continue - fi - # Skip blank or whitespace-only lines - if [[ "$directory" == "" ]]; then - continue - fi - # Lines like - # valid/path other_junk - # are not acceptable, unless `other_junk` is a comment - if [[ "$junk" != "" ]] && [[ "$junk" != '#'* ]]; then - echo "Invalid config! Only one directory is allowed per line. Found '$junk'" - exit 1 - fi - - dir_path="${OUT}/boilerplate/${directory}" - # Make sure the directory exists - if ! [[ -d "$dir_path" ]]; then - echo "Invalid boilerplate directory: '$directory'" - exit 1 - fi - - echo "***********************************************************************************" - echo "$directory is configured in update.cfg." - echo "-----------------------------------------------------------------------------------" - echo "syncing files from source." - rm -rf "${DIR:?}/${directory}" - mkdir -p "$(dirname "${DIR}"/"${directory}")" - cp -r "$dir_path" "${DIR}/${directory}" - if [ -f "${DIR}/${directory}/update.sh" ]; then - echo "executing ${DIR}/${directory}/update.sh" - "${DIR}/${directory}/update.sh" - fi - echo "***********************************************************************************" - echo "" -done < "$CONFIG_FILE" diff --git a/flytepropeller/pkg/controller/nodes/array/handler.go b/flytepropeller/pkg/controller/nodes/array/handler.go index 991a28c1c3..9a79b1fffd 100644 --- a/flytepropeller/pkg/controller/nodes/array/handler.go +++ b/flytepropeller/pkg/controller/nodes/array/handler.go @@ -505,7 +505,7 @@ func (a *arrayNodeHandler) Handle(ctx context.Context, nCtx interfaces.NodeExecu } } case v1alpha1.NodeKindWorkflow: - // TODO - to support launchplans we will need to process the output interface variables here + // TODO - to support launchplans we will need to process the output interface variables here fallthrough default: logger.Warnf(ctx, "ArrayNode does not support pre-populating outputLiteral collections for node kind '%s'", arrayNode.GetSubNodeSpec().GetKind()) diff --git a/flytestdlib/Makefile b/flytestdlib/Makefile index b4278d760a..2e862291c7 100644 --- a/flytestdlib/Makefile +++ b/flytestdlib/Makefile @@ -1,5 +1,6 @@ export REPOSITORY=flytestdlib -include boilerplate/flyte/golang_test_targets/Makefile +export REPO_ROOT=.. +include ../boilerplate/flyte/golang_test_targets/Makefile .PHONY: update_boilerplate update_boilerplate: @@ -28,7 +29,3 @@ compile: .PHONY: test_unit_codecov test_unit_codecov: go test ./... -race -coverprofile=coverage.txt -covermode=atomic - -.PHONY: go-tidy -go-tidy: - go mod tidy diff --git a/flytestdlib/boilerplate/flyte/Readme.rst b/flytestdlib/boilerplate/flyte/Readme.rst deleted file mode 100644 index ea18781185..0000000000 --- a/flytestdlib/boilerplate/flyte/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -Config File -- Welcome Bot -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Provides a ``config.yml`` file. - -**To Enable:** - -Add ``flyte/config.yml`` to your ``boilerplate/update.cfg`` file. \ No newline at end of file diff --git a/flytestdlib/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md b/flytestdlib/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md deleted file mode 100644 index e12139d691..0000000000 --- a/flytestdlib/boilerplate/flyte/code_of_conduct/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,2 +0,0 @@ -This project is governed by LF AI Foundation's [code of conduct](https://lfprojects.org/policies/code-of-conduct/). -All contributors and participants agree to abide by its terms. diff --git a/flytestdlib/boilerplate/flyte/code_of_conduct/README.rst b/flytestdlib/boilerplate/flyte/code_of_conduct/README.rst deleted file mode 100644 index 0c9f2f1ec5..0000000000 --- a/flytestdlib/boilerplate/flyte/code_of_conduct/README.rst +++ /dev/null @@ -1,2 +0,0 @@ -CODE OF CONDUCT -~~~~~~~~~~~~~~~ diff --git a/flytestdlib/boilerplate/flyte/code_of_conduct/update.sh b/flytestdlib/boilerplate/flyte/code_of_conduct/update.sh deleted file mode 100755 index 42f6158460..0000000000 --- a/flytestdlib/boilerplate/flyte/code_of_conduct/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/CODE_OF_CONDUCT.md ${DIR}/../../../CODE_OF_CONDUCT.md diff --git a/flytestdlib/boilerplate/flyte/config.yml b/flytestdlib/boilerplate/flyte/config.yml deleted file mode 100644 index f99bcd78f1..0000000000 --- a/flytestdlib/boilerplate/flyte/config.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Comment to be posted on PRs from first-time contributors in your repository -newPRWelcomeComment: > - Thank you for opening this pull request! 🙌 - - These tips will help get your PR across the finish line: - - Most of the repos have a PR template; if not, fill it out to the best of your knowledge. - - Sign off your commits (Reference: [DCO Guide](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md)). - -# Comment to be posted to on pull requests merged by a first time user -firstPRMergeComment: > - Congrats on merging your first pull request! 🎉 - -# Comment to be posted on first-time issues -newIssueWelcomeComment: > - Thank you for opening your first issue here! 🛠 diff --git a/flytestdlib/boilerplate/flyte/golang_support_tools/go.mod b/flytestdlib/boilerplate/flyte/golang_support_tools/go.mod deleted file mode 100644 index 2cfeb8aa3a..0000000000 --- a/flytestdlib/boilerplate/flyte/golang_support_tools/go.mod +++ /dev/null @@ -1,247 +0,0 @@ -module github.com/flyteorg/boilerplate - -go 1.19 - -require ( - github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf - github.com/alvaroloes/enumer v1.1.2 - github.com/flyteorg/flytestdlib v0.4.16 - github.com/golangci/golangci-lint v1.53.3 - github.com/pseudomuto/protoc-gen-doc v1.4.1 -) - -require ( - 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect - 4d63.com/gochecknoglobals v0.2.1 // indirect - cloud.google.com/go v0.110.2 // indirect - cloud.google.com/go/compute v1.19.3 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect - cloud.google.com/go/storage v1.29.0 // indirect - github.com/4meepo/tagalign v1.2.2 // indirect - github.com/Abirdcfly/dupword v0.0.11 // indirect - github.com/Antonboom/errname v0.1.10 // indirect - github.com/Antonboom/nilnil v0.1.5 // indirect - github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.17 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.0 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect - github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.15.0+incompatible // indirect - github.com/OpenPeeDeeP/depguard/v2 v2.1.0 // indirect - github.com/alexkohler/nakedret/v2 v2.0.2 // indirect - github.com/alexkohler/prealloc v1.0.0 // indirect - github.com/alingse/asasalint v0.0.11 // indirect - github.com/aokoli/goutils v1.0.1 // indirect - github.com/ashanbrown/forbidigo v1.5.3 // indirect - github.com/ashanbrown/makezero v1.1.1 // indirect - github.com/aws/aws-sdk-go v1.37.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bkielbasa/cyclop v1.2.1 // indirect - github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bombsimon/wsl/v3 v3.4.0 // indirect - github.com/breml/bidichk v0.2.4 // indirect - github.com/breml/errchkjson v0.3.1 // indirect - github.com/butuzov/ireturn v0.2.0 // indirect - github.com/butuzov/mirror v1.1.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/charithe/durationcheck v0.0.10 // indirect - github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 // indirect - github.com/coocood/freecache v1.1.1 // indirect - github.com/curioswitch/go-reassign v0.2.0 // indirect - github.com/daixiang0/gci v0.10.1 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/denis-tingaikin/go-header v0.4.3 // indirect - github.com/envoyproxy/protoc-gen-validate v0.10.0 // indirect - github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 // indirect - github.com/esimonov/ifshort v1.0.4 // indirect - github.com/ettle/strcase v0.1.1 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/fatih/structtag v1.2.0 // indirect - github.com/firefart/nonamedreturns v1.0.4 // indirect - github.com/flyteorg/stow v0.3.1 // indirect - github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-critic/go-critic v0.8.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-toolsmith/astcast v1.1.0 // indirect - github.com/go-toolsmith/astcopy v1.1.0 // indirect - github.com/go-toolsmith/astequal v1.1.0 // indirect - github.com/go-toolsmith/astfmt v1.1.0 // indirect - github.com/go-toolsmith/astp v1.1.0 // indirect - github.com/go-toolsmith/strparse v1.1.0 // indirect - github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gofrs/uuid v4.2.0+incompatible // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect - github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect - github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect - github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 // indirect - github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect - github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect - github.com/golangci/misspell v0.4.0 // indirect - github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect - github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect - github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 // indirect - github.com/gostaticanalysis/analysisutil v0.7.1 // indirect - github.com/gostaticanalysis/comment v1.4.2 // indirect - github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect - github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/huandu/xstrings v1.0.0 // indirect - github.com/imdario/mergo v0.3.5 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jgautheron/goconst v1.5.1 // indirect - github.com/jingyugao/rowserrcheck v1.1.1 // indirect - github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/julz/importas v0.1.0 // indirect - github.com/kisielk/errcheck v1.6.3 // indirect - github.com/kisielk/gotool v1.0.0 // indirect - github.com/kkHAIKE/contextcheck v1.1.4 // indirect - github.com/kulti/thelper v0.6.3 // indirect - github.com/kunwardeep/paralleltest v1.0.7 // indirect - github.com/kyoh86/exportloopref v0.1.11 // indirect - github.com/ldez/gomoddirectives v0.2.3 // indirect - github.com/ldez/tagliatelle v0.5.0 // indirect - github.com/leonklingele/grouper v1.1.1 // indirect - github.com/lufeee/execinquery v1.2.1 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/maratori/testableexamples v1.0.0 // indirect - github.com/maratori/testpackage v1.1.1 // indirect - github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mbilski/exhaustivestruct v1.2.0 // indirect - github.com/mgechev/revive v1.3.2 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moricho/tparallel v0.3.1 // indirect - github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect - github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect - github.com/ncw/swift v1.0.53 // indirect - github.com/nishanths/exhaustive v0.11.0 // indirect - github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.12.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polyfloyd/go-errorlint v1.4.2 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/pseudomuto/protokit v0.2.0 // indirect - github.com/quasilyte/go-ruleguard v0.3.19 // indirect - github.com/quasilyte/gogrep v0.5.0 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect - github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/ryancurrah/gomodguard v1.3.0 // indirect - github.com/ryanrolds/sqlclosecheck v0.4.0 // indirect - github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect - github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.23.0 // indirect - github.com/securego/gosec/v2 v2.16.0 // indirect - github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/sivchari/containedctx v1.0.3 // indirect - github.com/sivchari/nosnakecase v1.7.0 // indirect - github.com/sivchari/tenv v1.7.1 // indirect - github.com/sonatard/noctx v0.0.2 // indirect - github.com/sourcegraph/go-diff v0.7.0 // indirect - github.com/spf13/afero v1.8.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/stretchr/testify v1.8.4 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect - github.com/tdakkota/asciicheck v0.2.0 // indirect - github.com/tetafro/godot v1.4.11 // indirect - github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect - github.com/timonwong/loggercheck v0.9.4 // indirect - github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect - github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/ultraware/funlen v0.0.3 // indirect - github.com/ultraware/whitespace v0.0.5 // indirect - github.com/uudashr/gocognit v1.0.6 // indirect - github.com/xen0n/gosmopolitan v1.2.1 // indirect - github.com/yagipy/maintidx v1.0.0 // indirect - github.com/yeya24/promlinter v0.2.0 // indirect - github.com/ykadowak/zerologlint v0.1.2 // indirect - gitlab.com/bosi/decorder v0.2.3 // indirect - go.opencensus.io v0.24.0 // indirect - go.tmz.dev/musttag v0.7.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect - golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.12.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect - golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect - golang.org/x/tools v0.11.1 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.55.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - honnef.co/go/tools v0.4.3 // indirect - k8s.io/apimachinery v0.20.2 // indirect - k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 // indirect - k8s.io/klog/v2 v2.5.0 // indirect - mvdan.cc/gofumpt v0.5.0 // indirect - mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect - mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect - mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d // indirect -) - -replace github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 diff --git a/flytestdlib/boilerplate/flyte/golang_support_tools/go.sum b/flytestdlib/boilerplate/flyte/golang_support_tools/go.sum deleted file mode 100644 index 4cc434803e..0000000000 --- a/flytestdlib/boilerplate/flyte/golang_support_tools/go.sum +++ /dev/null @@ -1,1225 +0,0 @@ -4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA= -4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= -4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= -4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.3 h1:DcTwsFgGev/wV5+q8o2fzgcHOaac+DKGC91ZlvpsQds= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/4meepo/tagalign v1.2.2 h1:kQeUTkFTaBRtd/7jm8OKJl9iHk0gAO+TDFPHGSna0aw= -github.com/4meepo/tagalign v1.2.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= -github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= -github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= -github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9Bls= -github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= -github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= -github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= -github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= -github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf h1:M7A2Tn3R8rVgsoJHHKkmkpiNOItys4GxJj6JytRjdDg= -github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf/go.mod h1:Kya4Y46gyq/3TEyAzeNe5UkCk+W9apy5KbuX+5KnZ6M= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= -github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= -github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= -github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= -github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= -github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/ashanbrown/forbidigo v1.5.3 h1:jfg+fkm/snMx+V9FBwsl1d340BV/99kZGv5jN9hBoXk= -github.com/ashanbrown/forbidigo v1.5.3/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= -github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= -github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= -github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= -github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= -github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= -github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= -github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= -github.com/breml/bidichk v0.2.4/go.mod h1:7Zk0kRFt1LIZxtQdl9W9JwGAcLTTkOs+tN7wuEYGJ3s= -github.com/breml/errchkjson v0.3.1 h1:hlIeXuspTyt8Y/UmP5qy1JocGNR00KQHgfaNtRAjoxQ= -github.com/breml/errchkjson v0.3.1/go.mod h1:XroxrzKjdiutFyW3nWhw34VGg7kiMsDQox73yWCGI2U= -github.com/butuzov/ireturn v0.2.0 h1:kCHi+YzC150GE98WFuZQu9yrTn6GEydO2AuPLbTgnO4= -github.com/butuzov/ireturn v0.2.0/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= -github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= -github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= -github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= -github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= -github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= -github.com/daixiang0/gci v0.10.1 h1:eheNA3ljF6SxnPD/vE4lCBusVHmV3Rs3dkKvFrJ7MR0= -github.com/daixiang0/gci v0.10.1/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= -github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= -github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= -github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= -github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= -github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= -github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= -github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= -github.com/flyteorg/stow v0.3.1 h1:cBMbWl03Gsy5KoA5mutUYTuYpqtT7Pb8+ANGCLnmFEs= -github.com/flyteorg/stow v0.3.1/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= -github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-critic/go-critic v0.8.1 h1:16omCF1gN3gTzt4j4J6fKI/HnRojhEp+Eks6EuKw3vw= -github.com/go-critic/go-critic v0.8.1/go.mod h1:kpzXl09SIJX1cr9TB/g/sAG+eFEl7ZS9f9cqvZtyNl0= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= -github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= -github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= -github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= -github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= -github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= -github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= -github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= -github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= -github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= -github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= -github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= -github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= -github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= -github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe h1:6RGUuS7EGotKx6J5HIP8ZtyMdiDscjMLfRBSPuzVVeo= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= -github.com/golangci/golangci-lint v1.53.3 h1:CUcRafczT4t1F+mvdkUm6KuOpxUZTl0yWN/rSU6sSMo= -github.com/golangci/golangci-lint v1.53.3/go.mod h1:W4Gg3ONq6p3Jl+0s/h9Gr0j7yEgHJWWZO2bHl2tBUXM= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0= -github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= -github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= -github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= -github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= -github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= -github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= -github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.7 h1:2uCk94js0+nVNQoHZNLBkAR1DQJrVzw6T0RMzJn55dQ= -github.com/kunwardeep/paralleltest v1.0.7/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= -github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= -github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= -github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= -github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= -github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= -github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= -github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= -github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= -github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= -github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= -github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= -github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= -github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/nishanths/exhaustive v0.11.0 h1:T3I8nUGhl/Cwu5Z2hfc92l0e04D2GEW6e0l8pzda2l0= -github.com/nishanths/exhaustive v0.11.0/go.mod h1:RqwDsZ1xY0dNdqHho2z6X+bgzizwbLYOWnZbbl2wLB4= -github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.12.1 h1:vwOqb5Nu05OikTXqhvLdHCGcx5uthIYIl0t79UVrERQ= -github.com/nunnatsa/ginkgolinter v0.12.1/go.mod h1:AK8Ab1PypVrcGUusuKD8RDcl2KgsIwvNaaxAlyHSzso= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.4.2 h1:CU+O4181IxFDdPH6t/HT7IiDj1I7zxNi1RIUxYwn8d0= -github.com/polyfloyd/go-errorlint v1.4.2/go.mod h1:k6fU/+fQe38ednoZS51T7gSIGQW1y94d6TkSr35OzH8= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= -github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= -github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= -github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= -github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= -github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= -github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= -github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= -github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1jbEOPrEhDzGYq0= -github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= -github.com/securego/gosec/v2 v2.16.0 h1:Pi0JKoasQQ3NnoRao/ww/N/XdynIB9NRYYZT5CyOs5U= -github.com/securego/gosec/v2 v2.16.0/go.mod h1:xvLcVZqUfo4aAQu56TNv7/Ltz6emAOQAEsrZrt7uGlI= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= -github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= -github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= -github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= -github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= -github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= -github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= -github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= -github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= -github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= -github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= -github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= -github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= -github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= -github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= -github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= -github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= -github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= -github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= -github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= -github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= -github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/ykadowak/zerologlint v0.1.2 h1:Um4P5RMmelfjQqQJKtE8ZW+dLZrXrENeIzWWKw800U4= -github.com/ykadowak/zerologlint v0.1.2/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= -gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go-simpler.org/assert v0.5.0 h1:+5L/lajuQtzmbtEfh69sr5cRf2/xZzyJhFjoOz/PPqs= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.tmz.dev/musttag v0.7.0 h1:QfytzjTWGXZmChoX0L++7uQN+yRCPfyFm+whsM+lfGc= -go.tmz.dev/musttag v0.7.0/go.mod h1:oTFPvgOkJmp5kYL02S8+jrH0eLrBIl57rzWeA26zDEM= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4= -golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= -golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.11.1 h1:ojD5zOW8+7dOGzdnNgersm8aPfcDjhMp12UfG93NIMc= -golang.org/x/tools v0.11.1/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= -honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= -k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= -k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= -k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 h1:d+LBRNY3c/KGp7lDblRlUJkayx4Vla7WUTIazoGMdYo= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= -k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= -mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/flytestdlib/boilerplate/flyte/golang_support_tools/tools.go b/flytestdlib/boilerplate/flyte/golang_support_tools/tools.go deleted file mode 100644 index 6c3da04107..0000000000 --- a/flytestdlib/boilerplate/flyte/golang_support_tools/tools.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build tools -// +build tools - -package tools - -import ( - _ "github.com/EngHabu/mockery/cmd/mockery" - _ "github.com/alvaroloes/enumer" - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" - _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" - - _ "github.com/flyteorg/flyte/flytestdlib/cli/pflags" -) diff --git a/flytestdlib/boilerplate/flyte/golang_test_targets/Makefile b/flytestdlib/boilerplate/flyte/golang_test_targets/Makefile deleted file mode 100644 index be72275f5a..0000000000 --- a/flytestdlib/boilerplate/flyte/golang_test_targets/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - - -.PHONY: download_tooling -download_tooling: #download dependencies (including test deps) for the package - @boilerplate/flyte/golang_test_targets/download_tooling.sh - -.PHONY: generate -generate: download_tooling #generate go code - @boilerplate/flyte/golang_test_targets/go-gen.sh - -.PHONY: lint -lint: download_tooling #lints the package for common code smells - GL_DEBUG=linters_output,env golangci-lint run --fix --deadline=5m --exclude deprecated -v - -# If code is failing goimports linter, this will fix. -# skips 'vendor' -.PHONY: goimports -goimports: - @boilerplate/flyte/golang_test_targets/goimports - -.PHONY: mod_download -mod_download: #download dependencies (including test deps) for the package - go mod download - -.PHONY: install -install: download_tooling mod_download - -.PHONY: show -show: - go list -m all - -.PHONY: test_unit -test_unit: - go test -cover ./... -race - -.PHONY: test_benchmark -test_benchmark: - go test -bench . ./... - -.PHONY: test_unit_cover -test_unit_cover: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -func /tmp/cover.out - -.PHONY: test_unit_visual -test_unit_visual: - go test ./... -coverprofile /tmp/cover.out -covermode=count - go tool cover -html=/tmp/cover.out - -.PHONY: test_unit_codecov -test_unit_codecov: - go test ./... -race -coverprofile=coverage.txt -covermode=atomic - curl -s https://codecov.io/bash > codecov_bash.sh && bash codecov_bash.sh diff --git a/flytestdlib/boilerplate/flyte/golang_test_targets/Readme.rst b/flytestdlib/boilerplate/flyte/golang_test_targets/Readme.rst deleted file mode 100644 index f9d890fdd7..0000000000 --- a/flytestdlib/boilerplate/flyte/golang_test_targets/Readme.rst +++ /dev/null @@ -1,31 +0,0 @@ -Golang Test Targets -~~~~~~~~~~~~~~~~~~~ - -Provides an ``install`` make target that uses ``go mod`` to install golang dependencies. - -Provides a ``lint`` make target that uses golangci to lint your code. - -Provides a ``test_unit`` target for unit tests. - -Provides a ``test_unit_cover`` target for analysing coverage of unit tests, which will output the coverage of each function and total statement coverage. - -Provides a ``test_unit_visual`` target for visualizing coverage of unit tests through an interactive html code heat map. - -Provides a ``test_benchmark`` target for benchmark tests. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. - -Make sure you're using ``go mod`` for dependency management. - -Provide a ``.golangci`` configuration (the lint target requires it). - -Add ``include boilerplate/flyte/golang_test_targets/Makefile`` in your main ``Makefile`` _after_ your REPOSITORY environment variable - -:: - - REPOSITORY= - include boilerplate/flyte/golang_test_targets/Makefile - -(this ensures the extra make targets get included in your main Makefile) diff --git a/flytestdlib/boilerplate/flyte/golang_test_targets/download_tooling.sh b/flytestdlib/boilerplate/flyte/golang_test_targets/download_tooling.sh deleted file mode 100755 index 9cd49959f4..0000000000 --- a/flytestdlib/boilerplate/flyte/golang_test_targets/download_tooling.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Everything in this file needs to be installed outside of current module -# The reason we cannot turn off module entirely and install is that we need the replace statement in go.mod -# because we are installing a mockery fork. Turning it off would result installing the original not the fork. -# We also want to version all the other tools. We also want to be able to run go mod tidy without removing the version -# pins. To facilitate this, we're maintaining two sets of go.mod/sum files - the second one only for tooling. This is -# the same approach that go 1.14 will take as well. -# See: -# https://github.com/flyteorg/flyte/issues/129 -# https://github.com/golang/go/issues/30515 for some background context -# https://github.com/go-modules-by-example/index/blob/5ec250b4b78114a55001bd7c9cb88f6e07270ea5/010_tools/README.md - -set -e - -# List of tools to go get -# In the format of ":" or ":" if no cli -tools=( - "github.com/EngHabu/mockery/cmd/mockery" - "github.com/flyteorg/flytestdlib/cli/pflags@latest" - "github.com/golangci/golangci-lint/cmd/golangci-lint" - "github.com/daixiang0/gci" - "github.com/alvaroloes/enumer" - "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" -) - -tmp_dir=$(mktemp -d -t gotooling-XXX) -echo "Using temp directory ${tmp_dir}" -cp -R boilerplate/flyte/golang_support_tools/* $tmp_dir -pushd "$tmp_dir" - -for tool in "${tools[@]}" -do - echo "Installing ${tool}" - GO111MODULE=on go install $tool -done - -popd diff --git a/flytestdlib/boilerplate/flyte/golang_test_targets/go-gen.sh b/flytestdlib/boilerplate/flyte/golang_test_targets/go-gen.sh deleted file mode 100755 index 5ac17fa40a..0000000000 --- a/flytestdlib/boilerplate/flyte/golang_test_targets/go-gen.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -echo "Running go generate" -go generate ./... - -# This section is used by GitHub workflow to ensure that the generation step was run -if [ -n "$DELTA_CHECK" ]; then - DIRTY=$(git status --porcelain) - if [ -n "$DIRTY" ]; then - echo "FAILED: Go code updated without committing generated code." - echo "Ensure make generate has run and all changes are committed." - DIFF=$(git diff) - echo "diff detected: $DIFF" - DIFF=$(git diff --name-only) - echo "files different: $DIFF" - exit 1 - else - echo "SUCCESS: Generated code is up to date." - fi -fi diff --git a/flytestdlib/boilerplate/flyte/golang_test_targets/goimports b/flytestdlib/boilerplate/flyte/golang_test_targets/goimports deleted file mode 100755 index 40f50d106e..0000000000 --- a/flytestdlib/boilerplate/flyte/golang_test_targets/goimports +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -goimports -w $(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./pkg/client/*" -not -path "./boilerplate/*") -gci write -s standard -s default -s "prefix(github.com/flyteorg)" --custom-order --skip-generated . diff --git a/flytestdlib/boilerplate/flyte/golangci_file/.golangci.yml b/flytestdlib/boilerplate/flyte/golangci_file/.golangci.yml deleted file mode 100644 index 7f4dbc80e8..0000000000 --- a/flytestdlib/boilerplate/flyte/golangci_file/.golangci.yml +++ /dev/null @@ -1,40 +0,0 @@ -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -run: - skip-dirs: - - pkg/client - -linters: - disable-all: true - enable: - - deadcode - - errcheck - - gas - - gci - - goconst - - goimports - - golint - - gosimple - - govet - - ineffassign - - misspell - - nakedret - - staticcheck - - structcheck - - typecheck - - unconvert - - unparam - - unused - - varcheck - -linters-settings: - gci: - custom-order: true - sections: - - standard - - default - - prefix(github.com/flyteorg) - skip-generated: true diff --git a/flytestdlib/boilerplate/flyte/golangci_file/Readme.rst b/flytestdlib/boilerplate/flyte/golangci_file/Readme.rst deleted file mode 100644 index e4cbd18b96..0000000000 --- a/flytestdlib/boilerplate/flyte/golangci_file/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -GolangCI File -~~~~~~~~~~~~~ - -Provides a ``.golangci`` file with the linters we've agreed upon. - -**To Enable:** - -Add ``flyteorg/golangci_file`` to your ``boilerplate/update.cfg`` file. diff --git a/flytestdlib/boilerplate/flyte/golangci_file/update.sh b/flytestdlib/boilerplate/flyte/golangci_file/update.sh deleted file mode 100755 index ab2f85c680..0000000000 --- a/flytestdlib/boilerplate/flyte/golangci_file/update.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -# Clone the .golangci file -echo " - copying ${DIR}/.golangci to the root directory." -cp ${DIR}/.golangci.yml ${DIR}/../../../.golangci.yml diff --git a/flytestdlib/boilerplate/flyte/pull_request_template/Readme.rst b/flytestdlib/boilerplate/flyte/pull_request_template/Readme.rst deleted file mode 100644 index ee54437252..0000000000 --- a/flytestdlib/boilerplate/flyte/pull_request_template/Readme.rst +++ /dev/null @@ -1,8 +0,0 @@ -Pull Request Template -~~~~~~~~~~~~~~~~~~~~~ - -Provides a Pull Request template. - -**To Enable:** - -Add ``flyteorg/golang_test_targets`` to your ``boilerplate/update.cfg`` file. diff --git a/flytestdlib/boilerplate/flyte/pull_request_template/pull_request_template.md b/flytestdlib/boilerplate/flyte/pull_request_template/pull_request_template.md deleted file mode 100644 index 9cdab99b46..0000000000 --- a/flytestdlib/boilerplate/flyte/pull_request_template/pull_request_template.md +++ /dev/null @@ -1,35 +0,0 @@ -## _Read then delete this section_ - -_- Make sure to use a concise title for the pull-request._ - -_- Use #patch, #minor or #major in the pull-request title to bump the corresponding version. Otherwise, the patch version -will be bumped. [More details](https://github.com/marketplace/actions/github-tag-bump)_ - -# TL;DR -_Please replace this text with a description of what this PR accomplishes._ - -## Type - - [ ] Bug Fix - - [ ] Feature - - [ ] Plugin - -## Are all requirements met? - - - [ ] Code completed - - [ ] Smoke tested - - [ ] Unit tests added - - [ ] Code documentation added - - [ ] Any pending items have an associated Issue - -## Complete description - _How did you fix the bug, make the feature etc. Link to any design docs etc_ - -## Tracking Issue -_Remove the '*fixes*' keyword if there will be multiple PRs to fix the linked issue_ - -fixes https://github.com/flyteorg/flyte/issues/ - -## Follow-up issue -_NA_ -OR -_https://github.com/flyteorg/flyte/issues/_ diff --git a/flytestdlib/boilerplate/flyte/pull_request_template/update.sh b/flytestdlib/boilerplate/flyte/pull_request_template/update.sh deleted file mode 100755 index 051e9dbce0..0000000000 --- a/flytestdlib/boilerplate/flyte/pull_request_template/update.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -cp ${DIR}/pull_request_template.md ${DIR}/../../../pull_request_template.md diff --git a/flytestdlib/boilerplate/flyte/update.sh b/flytestdlib/boilerplate/flyte/update.sh deleted file mode 100755 index 506c3221b7..0000000000 --- a/flytestdlib/boilerplate/flyte/update.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'LYFT/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/lyft/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -# Clone the config.yml file -echo " - copying ${DIR}/config.yml to the root directory." -cp ${DIR}/config.yml ${DIR}/../../.github/config.yml diff --git a/flytestdlib/boilerplate/update.cfg b/flytestdlib/boilerplate/update.cfg deleted file mode 100644 index 744a2597b4..0000000000 --- a/flytestdlib/boilerplate/update.cfg +++ /dev/null @@ -1,5 +0,0 @@ -flyte/code_of_conduct -flyte/golang_test_targets -flyte/golang_support_tools -flyte/golangci_file -flyte/pull_request_template diff --git a/flytestdlib/boilerplate/update.sh b/flytestdlib/boilerplate/update.sh deleted file mode 100755 index 73de4dc91c..0000000000 --- a/flytestdlib/boilerplate/update.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash - -# WARNING: THIS FILE IS MANAGED IN THE 'BOILERPLATE' REPO AND COPIED TO OTHER REPOSITORIES. -# ONLY EDIT THIS FILE FROM WITHIN THE 'FLYTEORG/BOILERPLATE' REPOSITORY: -# -# TO OPT OUT OF UPDATES, SEE https://github.com/flyteorg/boilerplate/blob/master/Readme.rst - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -OUT="$(mktemp -d)" -trap 'rm -fr $OUT' EXIT - -git clone https://github.com/flyteorg/boilerplate.git "${OUT}" - -echo "Updating the update.sh script." -cp "${OUT}/boilerplate/update.sh" "${DIR}/update.sh" - -CONFIG_FILE="${DIR}/update.cfg" -README="https://github.com/flyteorg/boilerplate/blob/master/Readme.rst" - -if [ ! -f "$CONFIG_FILE" ]; then - echo "$CONFIG_FILE not found." - echo "This file is required in order to select which features to include." - echo "See $README for more details." - exit 1 -fi - -if [ -z "$REPOSITORY" ]; then - echo "$REPOSITORY is required to run this script" - echo "See $README for more details." - exit 1 -fi - -while read -r directory junk; do - # Skip comment lines (which can have leading whitespace) - if [[ "$directory" == '#'* ]]; then - continue - fi - # Skip blank or whitespace-only lines - if [[ "$directory" == "" ]]; then - continue - fi - # Lines like - # valid/path other_junk - # are not acceptable, unless `other_junk` is a comment - if [[ "$junk" != "" ]] && [[ "$junk" != '#'* ]]; then - echo "Invalid config! Only one directory is allowed per line. Found '$junk'" - exit 1 - fi - - dir_path="${OUT}/boilerplate/${directory}" - # Make sure the directory exists - if ! [[ -d "$dir_path" ]]; then - echo "Invalid boilerplate directory: '$directory'" - exit 1 - fi - - echo "***********************************************************************************" - echo "$directory is configured in update.cfg." - echo "-----------------------------------------------------------------------------------" - echo "syncing files from source." - rm -rf "${DIR:?}/${directory}" - mkdir -p "$(dirname "${DIR}"/"${directory}")" - cp -r "$dir_path" "${DIR}/${directory}" - if [ -f "${DIR}/${directory}/update.sh" ]; then - echo "executing ${DIR}/${directory}/update.sh" - "${DIR}/${directory}/update.sh" - fi - echo "***********************************************************************************" - echo "" -done < "$CONFIG_FILE" diff --git a/flytestdlib/cache/mocks/AutoRefresh.go b/flytestdlib/cache/mocks/AutoRefresh.go index df660b44f8..bae8993322 100644 --- a/flytestdlib/cache/mocks/AutoRefresh.go +++ b/flytestdlib/cache/mocks/AutoRefresh.go @@ -24,13 +24,13 @@ func (_m AutoRefresh_DeleteDelayed) Return(_a0 error) *AutoRefresh_DeleteDelayed } func (_m *AutoRefresh) OnDeleteDelayed(id string) *AutoRefresh_DeleteDelayed { - c := _m.On("DeleteDelayed", id) - return &AutoRefresh_DeleteDelayed{Call: c} + c_call := _m.On("DeleteDelayed", id) + return &AutoRefresh_DeleteDelayed{Call: c_call} } func (_m *AutoRefresh) OnDeleteDelayedMatch(matchers ...interface{}) *AutoRefresh_DeleteDelayed { - c := _m.On("DeleteDelayed", matchers...) - return &AutoRefresh_DeleteDelayed{Call: c} + c_call := _m.On("DeleteDelayed", matchers...) + return &AutoRefresh_DeleteDelayed{Call: c_call} } // DeleteDelayed provides a mock function with given fields: id @@ -56,13 +56,13 @@ func (_m AutoRefresh_Get) Return(_a0 cache.Item, _a1 error) *AutoRefresh_Get { } func (_m *AutoRefresh) OnGet(id string) *AutoRefresh_Get { - c := _m.On("Get", id) - return &AutoRefresh_Get{Call: c} + c_call := _m.On("Get", id) + return &AutoRefresh_Get{Call: c_call} } func (_m *AutoRefresh) OnGetMatch(matchers ...interface{}) *AutoRefresh_Get { - c := _m.On("Get", matchers...) - return &AutoRefresh_Get{Call: c} + c_call := _m.On("Get", matchers...) + return &AutoRefresh_Get{Call: c_call} } // Get provides a mock function with given fields: id @@ -97,13 +97,13 @@ func (_m AutoRefresh_GetOrCreate) Return(_a0 cache.Item, _a1 error) *AutoRefresh } func (_m *AutoRefresh) OnGetOrCreate(id string, item cache.Item) *AutoRefresh_GetOrCreate { - c := _m.On("GetOrCreate", id, item) - return &AutoRefresh_GetOrCreate{Call: c} + c_call := _m.On("GetOrCreate", id, item) + return &AutoRefresh_GetOrCreate{Call: c_call} } func (_m *AutoRefresh) OnGetOrCreateMatch(matchers ...interface{}) *AutoRefresh_GetOrCreate { - c := _m.On("GetOrCreate", matchers...) - return &AutoRefresh_GetOrCreate{Call: c} + c_call := _m.On("GetOrCreate", matchers...) + return &AutoRefresh_GetOrCreate{Call: c_call} } // GetOrCreate provides a mock function with given fields: id, item @@ -138,13 +138,13 @@ func (_m AutoRefresh_Start) Return(_a0 error) *AutoRefresh_Start { } func (_m *AutoRefresh) OnStart(ctx context.Context) *AutoRefresh_Start { - c := _m.On("Start", ctx) - return &AutoRefresh_Start{Call: c} + c_call := _m.On("Start", ctx) + return &AutoRefresh_Start{Call: c_call} } func (_m *AutoRefresh) OnStartMatch(matchers ...interface{}) *AutoRefresh_Start { - c := _m.On("Start", matchers...) - return &AutoRefresh_Start{Call: c} + c_call := _m.On("Start", matchers...) + return &AutoRefresh_Start{Call: c_call} } // Start provides a mock function with given fields: ctx diff --git a/flytestdlib/cache/mocks/Item.go b/flytestdlib/cache/mocks/Item.go index 23dd8c5bb7..24dada6b4d 100644 --- a/flytestdlib/cache/mocks/Item.go +++ b/flytestdlib/cache/mocks/Item.go @@ -8,3 +8,35 @@ import mock "github.com/stretchr/testify/mock" type Item struct { mock.Mock } + +type Item_IsTerminal struct { + *mock.Call +} + +func (_m Item_IsTerminal) Return(_a0 bool) *Item_IsTerminal { + return &Item_IsTerminal{Call: _m.Call.Return(_a0)} +} + +func (_m *Item) OnIsTerminal() *Item_IsTerminal { + c_call := _m.On("IsTerminal") + return &Item_IsTerminal{Call: c_call} +} + +func (_m *Item) OnIsTerminalMatch(matchers ...interface{}) *Item_IsTerminal { + c_call := _m.On("IsTerminal", matchers...) + return &Item_IsTerminal{Call: c_call} +} + +// IsTerminal provides a mock function with given fields: +func (_m *Item) IsTerminal() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} diff --git a/flytestdlib/cache/mocks/ItemWrapper.go b/flytestdlib/cache/mocks/ItemWrapper.go index 16c916f1d3..03e4576b53 100644 --- a/flytestdlib/cache/mocks/ItemWrapper.go +++ b/flytestdlib/cache/mocks/ItemWrapper.go @@ -21,13 +21,13 @@ func (_m ItemWrapper_GetID) Return(_a0 string) *ItemWrapper_GetID { } func (_m *ItemWrapper) OnGetID() *ItemWrapper_GetID { - c := _m.On("GetID") - return &ItemWrapper_GetID{Call: c} + c_call := _m.On("GetID") + return &ItemWrapper_GetID{Call: c_call} } func (_m *ItemWrapper) OnGetIDMatch(matchers ...interface{}) *ItemWrapper_GetID { - c := _m.On("GetID", matchers...) - return &ItemWrapper_GetID{Call: c} + c_call := _m.On("GetID", matchers...) + return &ItemWrapper_GetID{Call: c_call} } // GetID provides a mock function with given fields: @@ -53,13 +53,13 @@ func (_m ItemWrapper_GetItem) Return(_a0 cache.Item) *ItemWrapper_GetItem { } func (_m *ItemWrapper) OnGetItem() *ItemWrapper_GetItem { - c := _m.On("GetItem") - return &ItemWrapper_GetItem{Call: c} + c_call := _m.On("GetItem") + return &ItemWrapper_GetItem{Call: c_call} } func (_m *ItemWrapper) OnGetItemMatch(matchers ...interface{}) *ItemWrapper_GetItem { - c := _m.On("GetItem", matchers...) - return &ItemWrapper_GetItem{Call: c} + c_call := _m.On("GetItem", matchers...) + return &ItemWrapper_GetItem{Call: c_call} } // GetItem provides a mock function with given fields: diff --git a/flytestdlib/fastcheck/mocks/filter.go b/flytestdlib/fastcheck/mocks/filter.go index 04b31555a8..e661fdbab7 100644 --- a/flytestdlib/fastcheck/mocks/filter.go +++ b/flytestdlib/fastcheck/mocks/filter.go @@ -22,13 +22,13 @@ func (_m Filter_Add) Return(evicted bool) *Filter_Add { } func (_m *Filter) OnAdd(ctx context.Context, id []byte) *Filter_Add { - c := _m.On("Add", ctx, id) - return &Filter_Add{Call: c} + c_call := _m.On("Add", ctx, id) + return &Filter_Add{Call: c_call} } func (_m *Filter) OnAddMatch(matchers ...interface{}) *Filter_Add { - c := _m.On("Add", matchers...) - return &Filter_Add{Call: c} + c_call := _m.On("Add", matchers...) + return &Filter_Add{Call: c_call} } // Add provides a mock function with given fields: ctx, id @@ -54,13 +54,13 @@ func (_m Filter_Contains) Return(_a0 bool) *Filter_Contains { } func (_m *Filter) OnContains(ctx context.Context, id []byte) *Filter_Contains { - c := _m.On("Contains", ctx, id) - return &Filter_Contains{Call: c} + c_call := _m.On("Contains", ctx, id) + return &Filter_Contains{Call: c_call} } func (_m *Filter) OnContainsMatch(matchers ...interface{}) *Filter_Contains { - c := _m.On("Contains", matchers...) - return &Filter_Contains{Call: c} + c_call := _m.On("Contains", matchers...) + return &Filter_Contains{Call: c_call} } // Contains provides a mock function with given fields: ctx, id diff --git a/flytestdlib/otelutils/factory_test.go b/flytestdlib/otelutils/factory_test.go index da4e184c14..0d1289def0 100644 --- a/flytestdlib/otelutils/factory_test.go +++ b/flytestdlib/otelutils/factory_test.go @@ -23,8 +23,7 @@ func TestRegisterTracerProvider(t *testing.T) { FileConfig: FileConfig{ Filename: "/dev/null", }, - JaegerConfig: JaegerConfig{ - }, + JaegerConfig: JaegerConfig{}, } err = RegisterTracerProvider(serviceName, &fullConfig) assert.Nil(t, err) diff --git a/flytestdlib/random/mocks/comparable.go b/flytestdlib/random/mocks/comparable.go index 10d1aaa506..bf555c98a4 100644 --- a/flytestdlib/random/mocks/comparable.go +++ b/flytestdlib/random/mocks/comparable.go @@ -21,13 +21,13 @@ func (_m Comparable_Compare) Return(_a0 bool) *Comparable_Compare { } func (_m *Comparable) OnCompare(to random.Comparable) *Comparable_Compare { - c := _m.On("Compare", to) - return &Comparable_Compare{Call: c} + c_call := _m.On("Compare", to) + return &Comparable_Compare{Call: c_call} } func (_m *Comparable) OnCompareMatch(matchers ...interface{}) *Comparable_Compare { - c := _m.On("Compare", matchers...) - return &Comparable_Compare{Call: c} + c_call := _m.On("Compare", matchers...) + return &Comparable_Compare{Call: c_call} } // Compare provides a mock function with given fields: to diff --git a/flytestdlib/random/mocks/weighted_random_list.go b/flytestdlib/random/mocks/weighted_random_list.go index f7227b6cc6..c0581a6a19 100644 --- a/flytestdlib/random/mocks/weighted_random_list.go +++ b/flytestdlib/random/mocks/weighted_random_list.go @@ -24,13 +24,13 @@ func (_m WeightedRandomList_Get) Return(_a0 random.Comparable) *WeightedRandomLi } func (_m *WeightedRandomList) OnGet() *WeightedRandomList_Get { - c := _m.On("Get") - return &WeightedRandomList_Get{Call: c} + c_call := _m.On("Get") + return &WeightedRandomList_Get{Call: c_call} } func (_m *WeightedRandomList) OnGetMatch(matchers ...interface{}) *WeightedRandomList_Get { - c := _m.On("Get", matchers...) - return &WeightedRandomList_Get{Call: c} + c_call := _m.On("Get", matchers...) + return &WeightedRandomList_Get{Call: c_call} } // Get provides a mock function with given fields: @@ -58,13 +58,13 @@ func (_m WeightedRandomList_GetWithSeed) Return(_a0 random.Comparable, _a1 error } func (_m *WeightedRandomList) OnGetWithSeed(seed rand.Source) *WeightedRandomList_GetWithSeed { - c := _m.On("GetWithSeed", seed) - return &WeightedRandomList_GetWithSeed{Call: c} + c_call := _m.On("GetWithSeed", seed) + return &WeightedRandomList_GetWithSeed{Call: c_call} } func (_m *WeightedRandomList) OnGetWithSeedMatch(matchers ...interface{}) *WeightedRandomList_GetWithSeed { - c := _m.On("GetWithSeed", matchers...) - return &WeightedRandomList_GetWithSeed{Call: c} + c_call := _m.On("GetWithSeed", matchers...) + return &WeightedRandomList_GetWithSeed{Call: c_call} } // GetWithSeed provides a mock function with given fields: seed @@ -99,13 +99,13 @@ func (_m WeightedRandomList_Len) Return(_a0 int) *WeightedRandomList_Len { } func (_m *WeightedRandomList) OnLen() *WeightedRandomList_Len { - c := _m.On("Len") - return &WeightedRandomList_Len{Call: c} + c_call := _m.On("Len") + return &WeightedRandomList_Len{Call: c_call} } func (_m *WeightedRandomList) OnLenMatch(matchers ...interface{}) *WeightedRandomList_Len { - c := _m.On("Len", matchers...) - return &WeightedRandomList_Len{Call: c} + c_call := _m.On("Len", matchers...) + return &WeightedRandomList_Len{Call: c_call} } // Len provides a mock function with given fields: @@ -131,13 +131,13 @@ func (_m WeightedRandomList_List) Return(_a0 []random.Comparable) *WeightedRando } func (_m *WeightedRandomList) OnList() *WeightedRandomList_List { - c := _m.On("List") - return &WeightedRandomList_List{Call: c} + c_call := _m.On("List") + return &WeightedRandomList_List{Call: c_call} } func (_m *WeightedRandomList) OnListMatch(matchers ...interface{}) *WeightedRandomList_List { - c := _m.On("List", matchers...) - return &WeightedRandomList_List{Call: c} + c_call := _m.On("List", matchers...) + return &WeightedRandomList_List{Call: c_call} } // List provides a mock function with given fields: diff --git a/flytestdlib/storage/mocks/composed_protobuf_store.go b/flytestdlib/storage/mocks/composed_protobuf_store.go index ed77566643..c9064c2ac5 100644 --- a/flytestdlib/storage/mocks/composed_protobuf_store.go +++ b/flytestdlib/storage/mocks/composed_protobuf_store.go @@ -27,13 +27,13 @@ func (_m ComposedProtobufStore_CopyRaw) Return(_a0 error) *ComposedProtobufStore } func (_m *ComposedProtobufStore) OnCopyRaw(ctx context.Context, source storage.DataReference, destination storage.DataReference, opts storage.Options) *ComposedProtobufStore_CopyRaw { - c := _m.On("CopyRaw", ctx, source, destination, opts) - return &ComposedProtobufStore_CopyRaw{Call: c} + c_call := _m.On("CopyRaw", ctx, source, destination, opts) + return &ComposedProtobufStore_CopyRaw{Call: c_call} } func (_m *ComposedProtobufStore) OnCopyRawMatch(matchers ...interface{}) *ComposedProtobufStore_CopyRaw { - c := _m.On("CopyRaw", matchers...) - return &ComposedProtobufStore_CopyRaw{Call: c} + c_call := _m.On("CopyRaw", matchers...) + return &ComposedProtobufStore_CopyRaw{Call: c_call} } // CopyRaw provides a mock function with given fields: ctx, source, destination, opts @@ -59,13 +59,13 @@ func (_m ComposedProtobufStore_CreateSignedURL) Return(_a0 storage.SignedURLResp } func (_m *ComposedProtobufStore) OnCreateSignedURL(ctx context.Context, reference storage.DataReference, properties storage.SignedURLProperties) *ComposedProtobufStore_CreateSignedURL { - c := _m.On("CreateSignedURL", ctx, reference, properties) - return &ComposedProtobufStore_CreateSignedURL{Call: c} + c_call := _m.On("CreateSignedURL", ctx, reference, properties) + return &ComposedProtobufStore_CreateSignedURL{Call: c_call} } func (_m *ComposedProtobufStore) OnCreateSignedURLMatch(matchers ...interface{}) *ComposedProtobufStore_CreateSignedURL { - c := _m.On("CreateSignedURL", matchers...) - return &ComposedProtobufStore_CreateSignedURL{Call: c} + c_call := _m.On("CreateSignedURL", matchers...) + return &ComposedProtobufStore_CreateSignedURL{Call: c_call} } // CreateSignedURL provides a mock function with given fields: ctx, reference, properties @@ -98,13 +98,13 @@ func (_m ComposedProtobufStore_Delete) Return(_a0 error) *ComposedProtobufStore_ } func (_m *ComposedProtobufStore) OnDelete(ctx context.Context, reference storage.DataReference) *ComposedProtobufStore_Delete { - c := _m.On("Delete", ctx, reference) - return &ComposedProtobufStore_Delete{Call: c} + c_call := _m.On("Delete", ctx, reference) + return &ComposedProtobufStore_Delete{Call: c_call} } func (_m *ComposedProtobufStore) OnDeleteMatch(matchers ...interface{}) *ComposedProtobufStore_Delete { - c := _m.On("Delete", matchers...) - return &ComposedProtobufStore_Delete{Call: c} + c_call := _m.On("Delete", matchers...) + return &ComposedProtobufStore_Delete{Call: c_call} } // Delete provides a mock function with given fields: ctx, reference @@ -130,13 +130,13 @@ func (_m ComposedProtobufStore_GetBaseContainerFQN) Return(_a0 storage.DataRefer } func (_m *ComposedProtobufStore) OnGetBaseContainerFQN(ctx context.Context) *ComposedProtobufStore_GetBaseContainerFQN { - c := _m.On("GetBaseContainerFQN", ctx) - return &ComposedProtobufStore_GetBaseContainerFQN{Call: c} + c_call := _m.On("GetBaseContainerFQN", ctx) + return &ComposedProtobufStore_GetBaseContainerFQN{Call: c_call} } func (_m *ComposedProtobufStore) OnGetBaseContainerFQNMatch(matchers ...interface{}) *ComposedProtobufStore_GetBaseContainerFQN { - c := _m.On("GetBaseContainerFQN", matchers...) - return &ComposedProtobufStore_GetBaseContainerFQN{Call: c} + c_call := _m.On("GetBaseContainerFQN", matchers...) + return &ComposedProtobufStore_GetBaseContainerFQN{Call: c_call} } // GetBaseContainerFQN provides a mock function with given fields: ctx @@ -162,13 +162,13 @@ func (_m ComposedProtobufStore_Head) Return(_a0 storage.Metadata, _a1 error) *Co } func (_m *ComposedProtobufStore) OnHead(ctx context.Context, reference storage.DataReference) *ComposedProtobufStore_Head { - c := _m.On("Head", ctx, reference) - return &ComposedProtobufStore_Head{Call: c} + c_call := _m.On("Head", ctx, reference) + return &ComposedProtobufStore_Head{Call: c_call} } func (_m *ComposedProtobufStore) OnHeadMatch(matchers ...interface{}) *ComposedProtobufStore_Head { - c := _m.On("Head", matchers...) - return &ComposedProtobufStore_Head{Call: c} + c_call := _m.On("Head", matchers...) + return &ComposedProtobufStore_Head{Call: c_call} } // Head provides a mock function with given fields: ctx, reference @@ -203,13 +203,13 @@ func (_m ComposedProtobufStore_ReadProtobuf) Return(_a0 error) *ComposedProtobuf } func (_m *ComposedProtobufStore) OnReadProtobuf(ctx context.Context, reference storage.DataReference, msg protoiface.MessageV1) *ComposedProtobufStore_ReadProtobuf { - c := _m.On("ReadProtobuf", ctx, reference, msg) - return &ComposedProtobufStore_ReadProtobuf{Call: c} + c_call := _m.On("ReadProtobuf", ctx, reference, msg) + return &ComposedProtobufStore_ReadProtobuf{Call: c_call} } func (_m *ComposedProtobufStore) OnReadProtobufMatch(matchers ...interface{}) *ComposedProtobufStore_ReadProtobuf { - c := _m.On("ReadProtobuf", matchers...) - return &ComposedProtobufStore_ReadProtobuf{Call: c} + c_call := _m.On("ReadProtobuf", matchers...) + return &ComposedProtobufStore_ReadProtobuf{Call: c_call} } // ReadProtobuf provides a mock function with given fields: ctx, reference, msg @@ -235,13 +235,13 @@ func (_m ComposedProtobufStore_ReadRaw) Return(_a0 io.ReadCloser, _a1 error) *Co } func (_m *ComposedProtobufStore) OnReadRaw(ctx context.Context, reference storage.DataReference) *ComposedProtobufStore_ReadRaw { - c := _m.On("ReadRaw", ctx, reference) - return &ComposedProtobufStore_ReadRaw{Call: c} + c_call := _m.On("ReadRaw", ctx, reference) + return &ComposedProtobufStore_ReadRaw{Call: c_call} } func (_m *ComposedProtobufStore) OnReadRawMatch(matchers ...interface{}) *ComposedProtobufStore_ReadRaw { - c := _m.On("ReadRaw", matchers...) - return &ComposedProtobufStore_ReadRaw{Call: c} + c_call := _m.On("ReadRaw", matchers...) + return &ComposedProtobufStore_ReadRaw{Call: c_call} } // ReadRaw provides a mock function with given fields: ctx, reference @@ -276,13 +276,13 @@ func (_m ComposedProtobufStore_WriteProtobuf) Return(_a0 error) *ComposedProtobu } func (_m *ComposedProtobufStore) OnWriteProtobuf(ctx context.Context, reference storage.DataReference, opts storage.Options, msg protoiface.MessageV1) *ComposedProtobufStore_WriteProtobuf { - c := _m.On("WriteProtobuf", ctx, reference, opts, msg) - return &ComposedProtobufStore_WriteProtobuf{Call: c} + c_call := _m.On("WriteProtobuf", ctx, reference, opts, msg) + return &ComposedProtobufStore_WriteProtobuf{Call: c_call} } func (_m *ComposedProtobufStore) OnWriteProtobufMatch(matchers ...interface{}) *ComposedProtobufStore_WriteProtobuf { - c := _m.On("WriteProtobuf", matchers...) - return &ComposedProtobufStore_WriteProtobuf{Call: c} + c_call := _m.On("WriteProtobuf", matchers...) + return &ComposedProtobufStore_WriteProtobuf{Call: c_call} } // WriteProtobuf provides a mock function with given fields: ctx, reference, opts, msg @@ -308,13 +308,13 @@ func (_m ComposedProtobufStore_WriteRaw) Return(_a0 error) *ComposedProtobufStor } func (_m *ComposedProtobufStore) OnWriteRaw(ctx context.Context, reference storage.DataReference, size int64, opts storage.Options, raw io.Reader) *ComposedProtobufStore_WriteRaw { - c := _m.On("WriteRaw", ctx, reference, size, opts, raw) - return &ComposedProtobufStore_WriteRaw{Call: c} + c_call := _m.On("WriteRaw", ctx, reference, size, opts, raw) + return &ComposedProtobufStore_WriteRaw{Call: c_call} } func (_m *ComposedProtobufStore) OnWriteRawMatch(matchers ...interface{}) *ComposedProtobufStore_WriteRaw { - c := _m.On("WriteRaw", matchers...) - return &ComposedProtobufStore_WriteRaw{Call: c} + c_call := _m.On("WriteRaw", matchers...) + return &ComposedProtobufStore_WriteRaw{Call: c_call} } // WriteRaw provides a mock function with given fields: ctx, reference, size, opts, raw diff --git a/flytestdlib/storage/mocks/raw_store.go b/flytestdlib/storage/mocks/raw_store.go index aa02023f60..06b731765d 100644 --- a/flytestdlib/storage/mocks/raw_store.go +++ b/flytestdlib/storage/mocks/raw_store.go @@ -25,13 +25,13 @@ func (_m RawStore_CopyRaw) Return(_a0 error) *RawStore_CopyRaw { } func (_m *RawStore) OnCopyRaw(ctx context.Context, source storage.DataReference, destination storage.DataReference, opts storage.Options) *RawStore_CopyRaw { - c := _m.On("CopyRaw", ctx, source, destination, opts) - return &RawStore_CopyRaw{Call: c} + c_call := _m.On("CopyRaw", ctx, source, destination, opts) + return &RawStore_CopyRaw{Call: c_call} } func (_m *RawStore) OnCopyRawMatch(matchers ...interface{}) *RawStore_CopyRaw { - c := _m.On("CopyRaw", matchers...) - return &RawStore_CopyRaw{Call: c} + c_call := _m.On("CopyRaw", matchers...) + return &RawStore_CopyRaw{Call: c_call} } // CopyRaw provides a mock function with given fields: ctx, source, destination, opts @@ -57,13 +57,13 @@ func (_m RawStore_CreateSignedURL) Return(_a0 storage.SignedURLResponse, _a1 err } func (_m *RawStore) OnCreateSignedURL(ctx context.Context, reference storage.DataReference, properties storage.SignedURLProperties) *RawStore_CreateSignedURL { - c := _m.On("CreateSignedURL", ctx, reference, properties) - return &RawStore_CreateSignedURL{Call: c} + c_call := _m.On("CreateSignedURL", ctx, reference, properties) + return &RawStore_CreateSignedURL{Call: c_call} } func (_m *RawStore) OnCreateSignedURLMatch(matchers ...interface{}) *RawStore_CreateSignedURL { - c := _m.On("CreateSignedURL", matchers...) - return &RawStore_CreateSignedURL{Call: c} + c_call := _m.On("CreateSignedURL", matchers...) + return &RawStore_CreateSignedURL{Call: c_call} } // CreateSignedURL provides a mock function with given fields: ctx, reference, properties @@ -96,13 +96,13 @@ func (_m RawStore_Delete) Return(_a0 error) *RawStore_Delete { } func (_m *RawStore) OnDelete(ctx context.Context, reference storage.DataReference) *RawStore_Delete { - c := _m.On("Delete", ctx, reference) - return &RawStore_Delete{Call: c} + c_call := _m.On("Delete", ctx, reference) + return &RawStore_Delete{Call: c_call} } func (_m *RawStore) OnDeleteMatch(matchers ...interface{}) *RawStore_Delete { - c := _m.On("Delete", matchers...) - return &RawStore_Delete{Call: c} + c_call := _m.On("Delete", matchers...) + return &RawStore_Delete{Call: c_call} } // Delete provides a mock function with given fields: ctx, reference @@ -128,13 +128,13 @@ func (_m RawStore_GetBaseContainerFQN) Return(_a0 storage.DataReference) *RawSto } func (_m *RawStore) OnGetBaseContainerFQN(ctx context.Context) *RawStore_GetBaseContainerFQN { - c := _m.On("GetBaseContainerFQN", ctx) - return &RawStore_GetBaseContainerFQN{Call: c} + c_call := _m.On("GetBaseContainerFQN", ctx) + return &RawStore_GetBaseContainerFQN{Call: c_call} } func (_m *RawStore) OnGetBaseContainerFQNMatch(matchers ...interface{}) *RawStore_GetBaseContainerFQN { - c := _m.On("GetBaseContainerFQN", matchers...) - return &RawStore_GetBaseContainerFQN{Call: c} + c_call := _m.On("GetBaseContainerFQN", matchers...) + return &RawStore_GetBaseContainerFQN{Call: c_call} } // GetBaseContainerFQN provides a mock function with given fields: ctx @@ -160,13 +160,13 @@ func (_m RawStore_Head) Return(_a0 storage.Metadata, _a1 error) *RawStore_Head { } func (_m *RawStore) OnHead(ctx context.Context, reference storage.DataReference) *RawStore_Head { - c := _m.On("Head", ctx, reference) - return &RawStore_Head{Call: c} + c_call := _m.On("Head", ctx, reference) + return &RawStore_Head{Call: c_call} } func (_m *RawStore) OnHeadMatch(matchers ...interface{}) *RawStore_Head { - c := _m.On("Head", matchers...) - return &RawStore_Head{Call: c} + c_call := _m.On("Head", matchers...) + return &RawStore_Head{Call: c_call} } // Head provides a mock function with given fields: ctx, reference @@ -201,13 +201,13 @@ func (_m RawStore_ReadRaw) Return(_a0 io.ReadCloser, _a1 error) *RawStore_ReadRa } func (_m *RawStore) OnReadRaw(ctx context.Context, reference storage.DataReference) *RawStore_ReadRaw { - c := _m.On("ReadRaw", ctx, reference) - return &RawStore_ReadRaw{Call: c} + c_call := _m.On("ReadRaw", ctx, reference) + return &RawStore_ReadRaw{Call: c_call} } func (_m *RawStore) OnReadRawMatch(matchers ...interface{}) *RawStore_ReadRaw { - c := _m.On("ReadRaw", matchers...) - return &RawStore_ReadRaw{Call: c} + c_call := _m.On("ReadRaw", matchers...) + return &RawStore_ReadRaw{Call: c_call} } // ReadRaw provides a mock function with given fields: ctx, reference @@ -242,13 +242,13 @@ func (_m RawStore_WriteRaw) Return(_a0 error) *RawStore_WriteRaw { } func (_m *RawStore) OnWriteRaw(ctx context.Context, reference storage.DataReference, size int64, opts storage.Options, raw io.Reader) *RawStore_WriteRaw { - c := _m.On("WriteRaw", ctx, reference, size, opts, raw) - return &RawStore_WriteRaw{Call: c} + c_call := _m.On("WriteRaw", ctx, reference, size, opts, raw) + return &RawStore_WriteRaw{Call: c_call} } func (_m *RawStore) OnWriteRawMatch(matchers ...interface{}) *RawStore_WriteRaw { - c := _m.On("WriteRaw", matchers...) - return &RawStore_WriteRaw{Call: c} + c_call := _m.On("WriteRaw", matchers...) + return &RawStore_WriteRaw{Call: c_call} } // WriteRaw provides a mock function with given fields: ctx, reference, size, opts, raw diff --git a/flytestdlib/storage/mocks/reference_constructor.go b/flytestdlib/storage/mocks/reference_constructor.go index 22fbeaf906..85619d505e 100644 --- a/flytestdlib/storage/mocks/reference_constructor.go +++ b/flytestdlib/storage/mocks/reference_constructor.go @@ -23,13 +23,13 @@ func (_m ReferenceConstructor_ConstructReference) Return(_a0 storage.DataReferen } func (_m *ReferenceConstructor) OnConstructReference(ctx context.Context, reference storage.DataReference, nestedKeys ...string) *ReferenceConstructor_ConstructReference { - c := _m.On("ConstructReference", ctx, reference, nestedKeys) - return &ReferenceConstructor_ConstructReference{Call: c} + c_call := _m.On("ConstructReference", ctx, reference, nestedKeys) + return &ReferenceConstructor_ConstructReference{Call: c_call} } func (_m *ReferenceConstructor) OnConstructReferenceMatch(matchers ...interface{}) *ReferenceConstructor_ConstructReference { - c := _m.On("ConstructReference", matchers...) - return &ReferenceConstructor_ConstructReference{Call: c} + c_call := _m.On("ConstructReference", matchers...) + return &ReferenceConstructor_ConstructReference{Call: c_call} } // ConstructReference provides a mock function with given fields: ctx, reference, nestedKeys diff --git a/flytestdlib/utils/mocks/auto_refresh_cache.go b/flytestdlib/utils/mocks/auto_refresh_cache.go index bca17869ff..a71590fb26 100644 --- a/flytestdlib/utils/mocks/auto_refresh_cache.go +++ b/flytestdlib/utils/mocks/auto_refresh_cache.go @@ -23,13 +23,13 @@ func (_m AutoRefreshCache_Get) Return(_a0 utils.CacheItem) *AutoRefreshCache_Get } func (_m *AutoRefreshCache) OnGet(id string) *AutoRefreshCache_Get { - c := _m.On("Get", id) - return &AutoRefreshCache_Get{Call: c} + c_call := _m.On("Get", id) + return &AutoRefreshCache_Get{Call: c_call} } func (_m *AutoRefreshCache) OnGetMatch(matchers ...interface{}) *AutoRefreshCache_Get { - c := _m.On("Get", matchers...) - return &AutoRefreshCache_Get{Call: c} + c_call := _m.On("Get", matchers...) + return &AutoRefreshCache_Get{Call: c_call} } // Get provides a mock function with given fields: id @@ -57,13 +57,13 @@ func (_m AutoRefreshCache_GetOrCreate) Return(_a0 utils.CacheItem, _a1 error) *A } func (_m *AutoRefreshCache) OnGetOrCreate(item utils.CacheItem) *AutoRefreshCache_GetOrCreate { - c := _m.On("GetOrCreate", item) - return &AutoRefreshCache_GetOrCreate{Call: c} + c_call := _m.On("GetOrCreate", item) + return &AutoRefreshCache_GetOrCreate{Call: c_call} } func (_m *AutoRefreshCache) OnGetOrCreateMatch(matchers ...interface{}) *AutoRefreshCache_GetOrCreate { - c := _m.On("GetOrCreate", matchers...) - return &AutoRefreshCache_GetOrCreate{Call: c} + c_call := _m.On("GetOrCreate", matchers...) + return &AutoRefreshCache_GetOrCreate{Call: c_call} } // GetOrCreate provides a mock function with given fields: item diff --git a/flytestdlib/utils/mocks/cache_item.go b/flytestdlib/utils/mocks/cache_item.go index 5f69a24d7b..03b539049f 100644 --- a/flytestdlib/utils/mocks/cache_item.go +++ b/flytestdlib/utils/mocks/cache_item.go @@ -18,13 +18,13 @@ func (_m CacheItem_ID) Return(_a0 string) *CacheItem_ID { } func (_m *CacheItem) OnID() *CacheItem_ID { - c := _m.On("ID") - return &CacheItem_ID{Call: c} + c_call := _m.On("ID") + return &CacheItem_ID{Call: c_call} } func (_m *CacheItem) OnIDMatch(matchers ...interface{}) *CacheItem_ID { - c := _m.On("ID", matchers...) - return &CacheItem_ID{Call: c} + c_call := _m.On("ID", matchers...) + return &CacheItem_ID{Call: c_call} } // ID provides a mock function with given fields: diff --git a/flytestdlib/utils/mocks/rate_limiter.go b/flytestdlib/utils/mocks/rate_limiter.go index 3ca8993c67..a851213306 100644 --- a/flytestdlib/utils/mocks/rate_limiter.go +++ b/flytestdlib/utils/mocks/rate_limiter.go @@ -22,13 +22,13 @@ func (_m RateLimiter_Wait) Return(_a0 error) *RateLimiter_Wait { } func (_m *RateLimiter) OnWait(ctx context.Context) *RateLimiter_Wait { - c := _m.On("Wait", ctx) - return &RateLimiter_Wait{Call: c} + c_call := _m.On("Wait", ctx) + return &RateLimiter_Wait{Call: c_call} } func (_m *RateLimiter) OnWaitMatch(matchers ...interface{}) *RateLimiter_Wait { - c := _m.On("Wait", matchers...) - return &RateLimiter_Wait{Call: c} + c_call := _m.On("Wait", matchers...) + return &RateLimiter_Wait{Call: c_call} } // Wait provides a mock function with given fields: ctx diff --git a/flytestdlib/utils/mocks/sequencer.go b/flytestdlib/utils/mocks/sequencer.go index ac5843698d..4c73099c3c 100644 --- a/flytestdlib/utils/mocks/sequencer.go +++ b/flytestdlib/utils/mocks/sequencer.go @@ -18,13 +18,13 @@ func (_m Sequencer_GetCur) Return(_a0 uint64) *Sequencer_GetCur { } func (_m *Sequencer) OnGetCur() *Sequencer_GetCur { - c := _m.On("GetCur") - return &Sequencer_GetCur{Call: c} + c_call := _m.On("GetCur") + return &Sequencer_GetCur{Call: c_call} } func (_m *Sequencer) OnGetCurMatch(matchers ...interface{}) *Sequencer_GetCur { - c := _m.On("GetCur", matchers...) - return &Sequencer_GetCur{Call: c} + c_call := _m.On("GetCur", matchers...) + return &Sequencer_GetCur{Call: c_call} } // GetCur provides a mock function with given fields: @@ -50,13 +50,13 @@ func (_m Sequencer_GetNext) Return(_a0 uint64) *Sequencer_GetNext { } func (_m *Sequencer) OnGetNext() *Sequencer_GetNext { - c := _m.On("GetNext") - return &Sequencer_GetNext{Call: c} + c_call := _m.On("GetNext") + return &Sequencer_GetNext{Call: c_call} } func (_m *Sequencer) OnGetNextMatch(matchers ...interface{}) *Sequencer_GetNext { - c := _m.On("GetNext", matchers...) - return &Sequencer_GetNext{Call: c} + c_call := _m.On("GetNext", matchers...) + return &Sequencer_GetNext{Call: c_call} } // GetNext provides a mock function with given fields: From 5c3a283e172abf10713c68a2ec8df5a7a6faf809 Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Fri, 29 Mar 2024 11:25:15 -0700 Subject: [PATCH 374/645] Upgrade cloudevents to v2.15.2 (#5142) - Resolves medium CVE-2024-28110 Signed-off-by: ddl-ebrown --- flyteadmin/go.mod | 4 ++-- flyteadmin/go.sum | 11 ++++++----- go.mod | 4 ++-- go.sum | 12 ++++++------ 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index f11ff78e91..7aad6016c0 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -10,7 +10,7 @@ require ( github.com/aws/aws-sdk-go v1.44.2 github.com/benbjohnson/clock v1.3.0 github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.8.0 - github.com/cloudevents/sdk-go/v2 v2.8.0 + github.com/cloudevents/sdk-go/v2 v2.15.2 github.com/coreos/go-oidc/v3 v3.6.0 github.com/evanphx/json-patch v5.6.0+incompatible github.com/flyteorg/flyte/flyteidl v0.0.0-00010101000000-000000000000 @@ -210,7 +210,7 @@ require ( github.com/imdario/mergo v0.3.13 // indirect github.com/prometheus/common v0.44.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.25.0 // indirect + go.uber.org/zap v1.27.0 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index c79dbf363f..6bbec20c27 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -144,8 +144,9 @@ github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.8.0 h1:hRguaVL9rVsO8 github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.8.0/go.mod h1:Ba4CS2d+naAK8tGd6nm5ftGIWuHim+1lryAaIxhuh1k= github.com/cloudevents/sdk-go/protocol/kafka_sarama/v2 v2.8.0 h1:48wFAj3LK/G80FqXgKzyciQF9BU3W+RwucGwWY1Tk0M= github.com/cloudevents/sdk-go/protocol/kafka_sarama/v2 v2.8.0/go.mod h1:m41mqM/Pa9pzPPNrvWwY3M7llCuzciKk5tqH0m6Rz9I= -github.com/cloudevents/sdk-go/v2 v2.8.0 h1:kmRaLbsafZmidZ0rZ6h7WOMqCkRMcVTLV5lxV/HKQ9Y= github.com/cloudevents/sdk-go/v2 v2.8.0/go.mod h1:GpCBmUj7DIRiDhVvsK5d6WCbgTWs8DxAWTRtAwQmIXs= +github.com/cloudevents/sdk-go/v2 v2.15.2 h1:54+I5xQEnI73RBhWHxbI1XJcqOFOVJN85vb41+8mHUc= +github.com/cloudevents/sdk-go/v2 v2.15.2/go.mod h1:lL7kSWAE/V8VI4Wh0jbL2v/jvqsm6tjmaQBSvxcv4uE= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -1359,8 +1360,8 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -1368,8 +1369,8 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= -go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180830192347-182538f80094/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= diff --git a/go.mod b/go.mod index e6344078cf..db7f086612 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.14.0 // indirect github.com/cloudevents/sdk-go/protocol/kafka_sarama/v2 v2.8.0 // indirect - github.com/cloudevents/sdk-go/v2 v2.14.0 // indirect + github.com/cloudevents/sdk-go/v2 v2.15.2 // indirect github.com/coocood/freecache v1.1.1 // indirect github.com/coreos/go-oidc/v3 v3.6.0 // indirect github.com/dask/dask-kubernetes/v2023 v2023.0.0-20230626103304-abd02cd17b26 // indirect @@ -185,7 +185,7 @@ require ( go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.25.0 // indirect + go.uber.org/zap v1.27.0 // indirect golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 // indirect golang.org/x/net v0.20.0 // indirect diff --git a/go.sum b/go.sum index e6d38e8b6c..3ae7c5a88a 100644 --- a/go.sum +++ b/go.sum @@ -166,8 +166,8 @@ github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.14.0/go.mod h1:qDSbb github.com/cloudevents/sdk-go/protocol/kafka_sarama/v2 v2.8.0 h1:48wFAj3LK/G80FqXgKzyciQF9BU3W+RwucGwWY1Tk0M= github.com/cloudevents/sdk-go/protocol/kafka_sarama/v2 v2.8.0/go.mod h1:m41mqM/Pa9pzPPNrvWwY3M7llCuzciKk5tqH0m6Rz9I= github.com/cloudevents/sdk-go/v2 v2.8.0/go.mod h1:GpCBmUj7DIRiDhVvsK5d6WCbgTWs8DxAWTRtAwQmIXs= -github.com/cloudevents/sdk-go/v2 v2.14.0 h1:Nrob4FwVgi5L4tV9lhjzZcjYqFVyJzsA56CwPaPfv6s= -github.com/cloudevents/sdk-go/v2 v2.14.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= +github.com/cloudevents/sdk-go/v2 v2.15.2 h1:54+I5xQEnI73RBhWHxbI1XJcqOFOVJN85vb41+8mHUc= +github.com/cloudevents/sdk-go/v2 v2.15.2/go.mod h1:lL7kSWAE/V8VI4Wh0jbL2v/jvqsm6tjmaQBSvxcv4uE= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -1394,8 +1394,8 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -1403,8 +1403,8 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= -go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180830192347-182538f80094/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= From 42fb08e9e5f3fcde2f6df55b86402d6266280103 Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Fri, 29 Mar 2024 23:57:32 +0530 Subject: [PATCH 375/645] update sagemaker agent setup doc as secrets aren't required anymore (#5138) Signed-off-by: Samhita Alla --- .../deployment/agents/sagemaker_inference.rst | 35 +++---------------- 1 file changed, 5 insertions(+), 30 deletions(-) diff --git a/docs/deployment/agents/sagemaker_inference.rst b/docs/deployment/agents/sagemaker_inference.rst index be9188d873..5ceb248c2d 100644 --- a/docs/deployment/agents/sagemaker_inference.rst +++ b/docs/deployment/agents/sagemaker_inference.rst @@ -67,37 +67,12 @@ Specify agent configuration - boto - sagemaker-endpoint -Add the AWS credentials ------------------------ +AWS credentials +--------------- -1. Install the flyteagent pod using helm: - -.. code-block:: - - helm repo add flyteorg https://flyteorg.github.io/flyte - helm install flyteagent flyteorg/flyteagent --namespace flyte - -2. Get the base64 value of your AWS credentials: - -.. code-block:: - - echo -n "" | base64 - -3. Edit the flyteagent secret: - -.. code-block:: bash - - kubectl edit secret flyteagent -n flyte - -.. code-block:: yaml - :emphasize-lines: 3-5 - - apiVersion: v1 - data: - aws-access-key: - aws-secret-access-key: - aws-session-token: - kind: Secret +When running the code locally, you can set AWS credentials as +`environment variables `__. +When running on a production AWS cluster, the IAM role is used by default. Ensure that it has the `AmazonSageMakerFullAccess` policy attached. Upgrade the Flyte Helm release ------------------------------ From 510aa1d1068f4b175baeb3ea809a1385d29b91af Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Fri, 29 Mar 2024 11:30:17 -0700 Subject: [PATCH 376/645] Upgrade logrus to v1.9.3 everywhere (#5139) - Most flyte binaries are on v1.9.3 but some are still on an older v1.7.0 which contains PRISMA-2023-0056 Run go mod tidy Signed-off-by: ddl-ebrown --- datacatalog/go.mod | 4 ++-- datacatalog/go.sum | 8 ++++---- flyteadmin/go.mod | 2 +- flyteadmin/go.sum | 4 ++-- flytecopilot/go.mod | 4 ++-- flytecopilot/go.sum | 10 +++++----- flyteidl/go.mod | 4 ++-- flyteidl/go.sum | 10 +++++----- flyteplugins/go.mod | 2 +- flyteplugins/go.sum | 4 ++-- flytepropeller/go.mod | 2 +- flytepropeller/go.sum | 4 ++-- flytestdlib/go.mod | 4 ++-- flytestdlib/go.sum | 9 +++++---- go.mod | 2 +- go.sum | 4 ++-- 16 files changed, 39 insertions(+), 38 deletions(-) diff --git a/datacatalog/go.mod b/datacatalog/go.mod index 7130ad924c..b85cc1412c 100644 --- a/datacatalog/go.mod +++ b/datacatalog/go.mod @@ -97,7 +97,7 @@ require ( github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect - github.com/sirupsen/logrus v1.9.2 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -116,7 +116,7 @@ require ( golang.org/x/net v0.20.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect diff --git a/datacatalog/go.sum b/datacatalog/go.sum index ea11d19064..23025a8094 100644 --- a/datacatalog/go.sum +++ b/datacatalog/go.sum @@ -384,8 +384,8 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= -github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= @@ -621,8 +621,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index 7aad6016c0..ee39d86d37 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -182,7 +182,7 @@ require ( golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 // indirect golang.org/x/net v0.20.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index 6bbec20c27..c99dbcd318 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -1638,8 +1638,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/flytecopilot/go.mod b/flytecopilot/go.mod index 1e6061951a..1195c3b79e 100644 --- a/flytecopilot/go.mod +++ b/flytecopilot/go.mod @@ -81,7 +81,7 @@ require ( github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect - github.com/sirupsen/logrus v1.7.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -101,7 +101,7 @@ require ( golang.org/x/net v0.20.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect diff --git a/flytecopilot/go.sum b/flytecopilot/go.sum index 5c468eaf12..62b0e6d1a6 100644 --- a/flytecopilot/go.sum +++ b/flytecopilot/go.sum @@ -309,8 +309,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= @@ -490,7 +490,6 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -521,10 +520,11 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= diff --git a/flyteidl/go.mod b/flyteidl/go.mod index 2377cd1b05..686cb90cbc 100644 --- a/flyteidl/go.mod +++ b/flyteidl/go.mod @@ -81,7 +81,7 @@ require ( github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect - github.com/sirupsen/logrus v1.7.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/cobra v1.7.0 // indirect github.com/stretchr/objx v0.5.0 // indirect go.opencensus.io v0.24.0 // indirect @@ -96,7 +96,7 @@ require ( golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect diff --git a/flyteidl/go.sum b/flyteidl/go.sum index 17f30f40c8..62263b3a0e 100644 --- a/flyteidl/go.sum +++ b/flyteidl/go.sum @@ -311,8 +311,8 @@ github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDN github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= @@ -476,7 +476,6 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -503,9 +502,10 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= diff --git a/flyteplugins/go.mod b/flyteplugins/go.mod index aaea909afe..25ed892912 100644 --- a/flyteplugins/go.mod +++ b/flyteplugins/go.mod @@ -125,7 +125,7 @@ require ( go.opentelemetry.io/otel/trace v1.21.0 // indirect golang.org/x/crypto v0.18.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect diff --git a/flyteplugins/go.sum b/flyteplugins/go.sum index 52dca0b0cc..c6b69e8a03 100644 --- a/flyteplugins/go.sum +++ b/flyteplugins/go.sum @@ -576,8 +576,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= diff --git a/flytepropeller/go.mod b/flytepropeller/go.mod index 71c986cc38..00996de50d 100644 --- a/flytepropeller/go.mod +++ b/flytepropeller/go.mod @@ -131,7 +131,7 @@ require ( golang.org/x/crypto v0.18.0 // indirect golang.org/x/net v0.20.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect diff --git a/flytepropeller/go.sum b/flytepropeller/go.sum index e6c607042d..bddb98334b 100644 --- a/flytepropeller/go.sum +++ b/flytepropeller/go.sum @@ -621,8 +621,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= diff --git a/flytestdlib/go.mod b/flytestdlib/go.mod index ccf6f82b98..f7ff93fafa 100644 --- a/flytestdlib/go.mod +++ b/flytestdlib/go.mod @@ -22,7 +22,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.16.0 - github.com/sirupsen/logrus v1.7.0 + github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.11.0 @@ -125,7 +125,7 @@ require ( golang.org/x/net v0.20.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/api v0.155.0 // indirect diff --git a/flytestdlib/go.sum b/flytestdlib/go.sum index 53e056f100..dbe7fb81d2 100644 --- a/flytestdlib/go.sum +++ b/flytestdlib/go.sum @@ -386,8 +386,8 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= @@ -621,11 +621,12 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/go.mod b/go.mod index db7f086612..6e1a058fc6 100644 --- a/go.mod +++ b/go.mod @@ -190,7 +190,7 @@ require ( golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 // indirect golang.org/x/net v0.20.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect diff --git a/go.sum b/go.sum index 3ae7c5a88a..80148f6f62 100644 --- a/go.sum +++ b/go.sum @@ -1672,8 +1672,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From 921a53629b96138987c0c961fa5b93f4e9464301 Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Fri, 29 Mar 2024 11:31:04 -0700 Subject: [PATCH 377/645] Upgrade go-restful to v3.12.0 everywhere (#5140) - Resolves high vuln PRISMA-2022-0227 related to authentication bypass Signed-off-by: ddl-ebrown --- datacatalog/go.mod | 2 +- datacatalog/go.sum | 4 ++-- flyteadmin/go.mod | 2 +- flyteadmin/go.sum | 4 ++-- flytecopilot/go.mod | 2 +- flytecopilot/go.sum | 4 ++-- flyteidl/go.mod | 2 +- flyteidl/go.sum | 4 ++-- flyteplugins/go.mod | 2 +- flyteplugins/go.sum | 4 ++-- flytepropeller/go.mod | 2 +- flytepropeller/go.sum | 4 ++-- flytestdlib/go.mod | 2 +- flytestdlib/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- 16 files changed, 24 insertions(+), 24 deletions(-) diff --git a/datacatalog/go.mod b/datacatalog/go.mod index b85cc1412c..9702461a0f 100644 --- a/datacatalog/go.mod +++ b/datacatalog/go.mod @@ -40,7 +40,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coocood/freecache v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect diff --git a/datacatalog/go.sum b/datacatalog/go.sum index 23025a8094..6c40957923 100644 --- a/datacatalog/go.sum +++ b/datacatalog/go.sum @@ -97,8 +97,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index ee39d86d37..070c057741 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -91,7 +91,7 @@ require ( github.com/eapache/go-resiliency v1.2.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index c99dbcd318..9691e94d86 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -214,8 +214,8 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elazarl/goproxy v0.0.0-20181003060214-f58a169a71a5/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= diff --git a/flytecopilot/go.mod b/flytecopilot/go.mod index 1195c3b79e..11800390ab 100644 --- a/flytecopilot/go.mod +++ b/flytecopilot/go.mod @@ -36,7 +36,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coocood/freecache v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect diff --git a/flytecopilot/go.sum b/flytecopilot/go.sum index 62b0e6d1a6..3a894c8995 100644 --- a/flytecopilot/go.sum +++ b/flytecopilot/go.sum @@ -91,8 +91,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= diff --git a/flyteidl/go.mod b/flyteidl/go.mod index 686cb90cbc..9aa214c942 100644 --- a/flyteidl/go.mod +++ b/flyteidl/go.mod @@ -42,7 +42,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coocood/freecache v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect diff --git a/flyteidl/go.sum b/flyteidl/go.sum index 62263b3a0e..c91cec6d05 100644 --- a/flyteidl/go.sum +++ b/flyteidl/go.sum @@ -92,8 +92,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= diff --git a/flyteplugins/go.mod b/flyteplugins/go.mod index 25ed892912..82f9a96ca9 100644 --- a/flyteplugins/go.mod +++ b/flyteplugins/go.mod @@ -61,7 +61,7 @@ require ( github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect diff --git a/flyteplugins/go.sum b/flyteplugins/go.sum index c6b69e8a03..ec5b0b6f6d 100644 --- a/flyteplugins/go.sum +++ b/flyteplugins/go.sum @@ -122,8 +122,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= diff --git a/flytepropeller/go.mod b/flytepropeller/go.mod index 00996de50d..1f465797d7 100644 --- a/flytepropeller/go.mod +++ b/flytepropeller/go.mod @@ -69,7 +69,7 @@ require ( github.com/coocood/freecache v1.1.1 // indirect github.com/dask/dask-kubernetes/v2023 v2023.0.0-20230626103304-abd02cd17b26 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect diff --git a/flytepropeller/go.sum b/flytepropeller/go.sum index bddb98334b..e0ff89ceaf 100644 --- a/flytepropeller/go.sum +++ b/flytepropeller/go.sum @@ -124,8 +124,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= diff --git a/flytestdlib/go.mod b/flytestdlib/go.mod index f7ff93fafa..ff6db04e38 100644 --- a/flytestdlib/go.mod +++ b/flytestdlib/go.mod @@ -61,7 +61,7 @@ require ( github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect diff --git a/flytestdlib/go.sum b/flytestdlib/go.sum index dbe7fb81d2..fbf1c37c9b 100644 --- a/flytestdlib/go.sum +++ b/flytestdlib/go.sum @@ -97,8 +97,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= diff --git a/go.mod b/go.mod index 6e1a058fc6..2a525c60fb 100644 --- a/go.mod +++ b/go.mod @@ -59,7 +59,7 @@ require ( github.com/eapache/go-resiliency v1.2.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/fatih/color v1.13.0 // indirect diff --git a/go.sum b/go.sum index 80148f6f62..0fde6fca2c 100644 --- a/go.sum +++ b/go.sum @@ -237,8 +237,8 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elazarl/goproxy v0.0.0-20181003060214-f58a169a71a5/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= From a9847ef569ce1a6f081130f2156baada408ae1d4 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Fri, 29 Mar 2024 13:02:46 -0700 Subject: [PATCH 378/645] Regenerate ray pflags (#5149) Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- .../go/tasks/plugins/k8s/ray/config_flags.go | 1 - .../go/tasks/plugins/k8s/ray/config_flags_test.go | 14 -------------- 2 files changed, 15 deletions(-) diff --git a/flyteplugins/go/tasks/plugins/k8s/ray/config_flags.go b/flyteplugins/go/tasks/plugins/k8s/ray/config_flags.go index 8a750ab48b..5048869eab 100755 --- a/flyteplugins/go/tasks/plugins/k8s/ray/config_flags.go +++ b/flyteplugins/go/tasks/plugins/k8s/ray/config_flags.go @@ -59,7 +59,6 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.String(fmt.Sprintf("%v%v", prefix, "remoteClusterConfig.endpoint"), defaultConfig.RemoteClusterConfig.Endpoint, " Remote K8s cluster endpoint") cmdFlags.Bool(fmt.Sprintf("%v%v", prefix, "remoteClusterConfig.enabled"), defaultConfig.RemoteClusterConfig.Enabled, " Boolean flag to enable or disable") cmdFlags.Bool(fmt.Sprintf("%v%v", prefix, "enableUsageStats"), defaultConfig.EnableUsageStats, "Enable usage stats for ray jobs. These stats are submitted to usage-stats.ray.io per https://docs.ray.io/en/latest/cluster/usage-stats.html") - cmdFlags.String(fmt.Sprintf("%v%v", prefix, "kubeRayCrdVersion"), defaultConfig.KubeRayCrdVersion, "Version of the Ray CRD to use when creating RayClusters or RayJobs.") cmdFlags.String(fmt.Sprintf("%v%v", prefix, "serviceAccount"), defaultConfig.ServiceAccount, "The k8s service account to run as") return cmdFlags } diff --git a/flyteplugins/go/tasks/plugins/k8s/ray/config_flags_test.go b/flyteplugins/go/tasks/plugins/k8s/ray/config_flags_test.go index 6938ee398f..05871adc51 100755 --- a/flyteplugins/go/tasks/plugins/k8s/ray/config_flags_test.go +++ b/flyteplugins/go/tasks/plugins/k8s/ray/config_flags_test.go @@ -225,20 +225,6 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) - t.Run("Test_kubeRayCrdVersion", func(t *testing.T) { - - t.Run("Override", func(t *testing.T) { - testValue := "1" - - cmdFlags.Set("kubeRayCrdVersion", testValue) - if vString, err := cmdFlags.GetString("kubeRayCrdVersion"); err == nil { - testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.KubeRayCrdVersion) - - } else { - assert.FailNow(t, err.Error()) - } - }) - }) t.Run("Test_serviceAccount", func(t *testing.T) { t.Run("Override", func(t *testing.T) { From 9d8cf001db4df46b0767729d406cbf35d3d2aff5 Mon Sep 17 00:00:00 2001 From: Yubo Wang Date: Fri, 29 Mar 2024 14:01:18 -0700 Subject: [PATCH 379/645] Split access token into half and store to avoid "securecookie: the value is too long" error (#4863) * split access token into half and store Signed-off-by: Yubo Wang * lint and fix unit test Signed-off-by: Yubo Wang * fix lint again Signed-off-by: Yubo Wang * keep old name and store new splitted names Signed-off-by: Yubo Wang * update comment Signed-off-by: Yubo Wang * correct spelling... Signed-off-by: Yubo Wang --------- Signed-off-by: Yubo Wang Co-authored-by: Yubo Wang --- flyteadmin/auth/cookie.go | 4 + flyteadmin/auth/cookie_manager.go | 48 ++++++++++-- flyteadmin/auth/cookie_manager_test.go | 102 +++++++++++++++++++++++-- flyteadmin/auth/handlers_test.go | 16 ++-- flyteadmin/go.mod | 1 + flyteadmin/go.sum | 2 + 6 files changed, 154 insertions(+), 19 deletions(-) diff --git a/flyteadmin/auth/cookie.go b/flyteadmin/auth/cookie.go index bf80c1f920..2470220d24 100644 --- a/flyteadmin/auth/cookie.go +++ b/flyteadmin/auth/cookie.go @@ -20,6 +20,10 @@ const ( // #nosec accessTokenCookieName = "flyte_at" // #nosec + accessTokenCookieNameSplitFirst = "flyte_at_1" + // #nosec + accessTokenCookieNameSplitSecond = "flyte_at_2" + // #nosec idTokenCookieName = "flyte_idt" // #nosec refreshTokenCookieName = "flyte_rt" diff --git a/flyteadmin/auth/cookie_manager.go b/flyteadmin/auth/cookie_manager.go index 9bc64b88cf..ce360c9d3a 100644 --- a/flyteadmin/auth/cookie_manager.go +++ b/flyteadmin/auth/cookie_manager.go @@ -52,6 +52,24 @@ func NewCookieManager(ctx context.Context, hashKeyEncoded, blockKeyEncoded strin }, nil } +func (c CookieManager) RetrieveAccessToken(ctx context.Context, request *http.Request) (string, error) { + // If there is an old access token, we will retrieve it + oldAccessToken, err := retrieveSecureCookie(ctx, request, accessTokenCookieName, c.hashKey, c.blockKey) + if err == nil && oldAccessToken != "" { + return oldAccessToken, nil + } + // If there is no old access token, we will retrieve the new split access token + accessTokenFirstHalf, err := retrieveSecureCookie(ctx, request, accessTokenCookieNameSplitFirst, c.hashKey, c.blockKey) + if err != nil { + return "", err + } + accessTokenSecondHalf, err := retrieveSecureCookie(ctx, request, accessTokenCookieNameSplitSecond, c.hashKey, c.blockKey) + if err != nil { + return "", err + } + return accessTokenFirstHalf + accessTokenSecondHalf, nil +} + // TODO: Separate refresh token from access token, remove named returns, and use stdlib errors. // RetrieveTokenValues retrieves id, access and refresh tokens from cookies if they exist. The existence of a refresh token // in a cookie is optional and hence failure to find or read that cookie is tolerated. An error is returned in case of failure @@ -64,7 +82,7 @@ func (c CookieManager) RetrieveTokenValues(ctx context.Context, request *http.Re return "", "", "", err } - accessToken, err = retrieveSecureCookie(ctx, request, accessTokenCookieName, c.hashKey, c.blockKey) + accessToken, err = c.RetrieveAccessToken(ctx, request) if err != nil { return "", "", "", err } @@ -135,20 +153,38 @@ func (c CookieManager) SetAuthCodeCookie(ctx context.Context, writer http.Respon return nil } +func (c CookieManager) StoreAccessToken(ctx context.Context, accessToken string, writer http.ResponseWriter) error { + midpoint := len(accessToken) / 2 + firstHalf := accessToken[:midpoint] + secondHalf := accessToken[midpoint:] + atCookieFirst, err := NewSecureCookie(accessTokenCookieNameSplitFirst, firstHalf, c.hashKey, c.blockKey, c.domain, c.getHTTPSameSitePolicy()) + if err != nil { + logger.Errorf(ctx, "Error generating encrypted accesstoken cookie first half %s", err) + return err + } + http.SetCookie(writer, &atCookieFirst) + atCookieSecond, err := NewSecureCookie(accessTokenCookieNameSplitSecond, secondHalf, c.hashKey, c.blockKey, c.domain, c.getHTTPSameSitePolicy()) + if err != nil { + logger.Errorf(ctx, "Error generating encrypted accesstoken cookie second half %s", err) + return err + } + http.SetCookie(writer, &atCookieSecond) + return nil +} + func (c CookieManager) SetTokenCookies(ctx context.Context, writer http.ResponseWriter, token *oauth2.Token) error { if token == nil { logger.Errorf(ctx, "Attempting to set cookies with nil token") return errors.Errorf(ErrTokenNil, "Attempting to set cookies with nil token") } - atCookie, err := NewSecureCookie(accessTokenCookieName, token.AccessToken, c.hashKey, c.blockKey, c.domain, c.getHTTPSameSitePolicy()) + err := c.StoreAccessToken(ctx, token.AccessToken, writer) + if err != nil { - logger.Errorf(ctx, "Error generating encrypted accesstoken cookie %s", err) + logger.Errorf(ctx, "Error storing access token %s", err) return err } - http.SetCookie(writer, &atCookie) - if idTokenRaw, converted := token.Extra(idTokenExtra).(string); converted { idCookie, err := NewSecureCookie(idTokenCookieName, idTokenRaw, c.hashKey, c.blockKey, c.domain, c.getHTTPSameSitePolicy()) if err != nil { @@ -188,6 +224,8 @@ func (c *CookieManager) getLogoutCookie(name string) *http.Cookie { func (c CookieManager) DeleteCookies(_ context.Context, writer http.ResponseWriter) { http.SetCookie(writer, c.getLogoutCookie(accessTokenCookieName)) + http.SetCookie(writer, c.getLogoutCookie(accessTokenCookieNameSplitFirst)) + http.SetCookie(writer, c.getLogoutCookie(accessTokenCookieNameSplitSecond)) http.SetCookie(writer, c.getLogoutCookie(refreshTokenCookieName)) http.SetCookie(writer, c.getLogoutCookie(idTokenCookieName)) } diff --git a/flyteadmin/auth/cookie_manager_test.go b/flyteadmin/auth/cookie_manager_test.go index 6dd67a0473..09d8468e83 100644 --- a/flyteadmin/auth/cookie_manager_test.go +++ b/flyteadmin/auth/cookie_manager_test.go @@ -10,6 +10,7 @@ import ( "testing" "time" + "github.com/golang-jwt/jwt" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/oauth2" @@ -57,9 +58,10 @@ func TestCookieManager(t *testing.T) { assert.NoError(t, err) fmt.Println(w.Header().Get("Set-Cookie")) c := w.Result().Cookies() - assert.Equal(t, "flyte_at", c[0].Name) - assert.Equal(t, "flyte_idt", c[1].Name) - assert.Equal(t, "flyte_rt", c[2].Name) + assert.Equal(t, "flyte_at_1", c[0].Name) + assert.Equal(t, "flyte_at_2", c[1].Name) + assert.Equal(t, "flyte_idt", c[2].Name) + assert.Equal(t, "flyte_rt", c[3].Name) }) t.Run("set_token_nil", func(t *testing.T) { @@ -70,6 +72,79 @@ func TestCookieManager(t *testing.T) { assert.EqualError(t, err, "[EMPTY_OAUTH_TOKEN] Attempting to set cookies with nil token") }) + t.Run("set_long_token_cookies", func(t *testing.T) { + ctx := context.Background() + // These were generated for unit testing only. + hashKeyEncoded := "wG4pE1ccdw/pHZ2ml8wrD5VJkOtLPmBpWbKHmezWXktGaFbRoAhXidWs8OpbA3y7N8vyZhz1B1E37+tShWC7gA" //nolint:goconst + blockKeyEncoded := "afyABVgGOvWJFxVyOvCWCupoTn6BkNl4SOHmahho16Q" //nolint:goconst + cookieSetting := config.CookieSettings{ + SameSitePolicy: config.SameSiteDefaultMode, + Domain: "default", + } + manager, err := NewCookieManager(ctx, hashKeyEncoded, blockKeyEncoded, cookieSetting) + assert.NoError(t, err) + longString := "asdfkjashdfkljqwpeuqwoieuiposdasdfasdfsdfcuzxcvjzvjlasfuo9qwuoiqwueoqoieulkszcjvhlkshcvlkasdhflkashfqoiwaskldfjhasdfljk" + + "aklsdjflkasdfhlkjasdhfklhfjkasdhfkasdhfjasdfhasldkfjhaskldfhaklsdfhlasjdfhalksjdfhlskdqoiweuqioweuqioweuqoiew" + + "aklsdjfqwoieuioqwerupweiruoqpweurpqweuropqweurpqweurpoqwuetopqweuropqwuerpoqwuerpoqweuropqweurpoqweyitoqpwety" + // These were generated for unit testing only. + tokenData := jwt.MapClaims{ + "iss": "https://login.microsoftonline.com/72f988bf-86f1-41af-91ab-2d7cd011db47/v2.0", + "aio": "AXQAi/8UAAAAvfR1B135YmjOZGtNGTM/fgvUY0ugwwk2NWCjmNglWR9v+b5sI3cCSGXOp1Zw96qUNb1dm0jqBHHYDKQtc4UplZAtFULbitt3x2KYdigeS5tXl0yNIeMiYsA/1Dpd43xg9sXAtLU3+iZetXiDasdfkpsaldg==", + "sub": "subject", + "aud": "audience", + "exp": 1677642301, + "nbf": 1677641001, + "iat": 1677641001, + "jti": "a-unique-identifier", + "user_id": "123456", + "username": "john_doe", + "preferred_username": "john_doe", + "given_name": "John", + "family_name": "Doe", + "email": "john.doe@example.com", + "scope": "read write", + "role": "user", + "is_active": true, + "is_verified": true, + "client_id": "client123", + "custom_field1": longString, + "custom_field2": longString, + "custom_field3": longString, + "custom_field4": longString, + "custom_field5": longString, + "custom_field6": []string{longString, longString}, + "additional_field1": "extra_value1", + "additional_field2": "extra_value2", + } + secretKey := []byte("tJL6Wr2JUsxLyNezPQh1J6zn6wSoDAhgRYSDkaMuEHy75VikiB8wg25WuR96gdMpookdlRvh7SnRvtjQN9b5m4zJCMpSRcJ5DuXl4mcd7Cg3Zp1C5") + rawToken := jwt.NewWithClaims(jwt.SigningMethodHS256, tokenData) + tokenString, err := rawToken.SignedString(secretKey) + if err != nil { + fmt.Println("Error:", err) + return + } + token := &oauth2.Token{ + AccessToken: tokenString, + RefreshToken: "refresh", + } + + token = token.WithExtra(map[string]interface{}{ + "id_token": "id token", + }) + + w := httptest.NewRecorder() + _, err = http.NewRequest("GET", "/api/v1/projects", nil) + assert.NoError(t, err) + err = manager.SetTokenCookies(ctx, w, token) + assert.NoError(t, err) + fmt.Println(w.Header().Get("Set-Cookie")) + c := w.Result().Cookies() + assert.Equal(t, "flyte_at_1", c[0].Name) + assert.Equal(t, "flyte_at_2", c[1].Name) + assert.Equal(t, "flyte_idt", c[2].Name) + assert.Equal(t, "flyte_rt", c[3].Name) + }) + t.Run("set_token_cookies_wrong_key", func(t *testing.T) { wrongKey := base64.RawStdEncoding.EncodeToString(bytes.Repeat([]byte("X"), 75)) wrongManager, err := NewCookieManager(ctx, wrongKey, wrongKey, cookieSetting) @@ -130,16 +205,27 @@ func TestCookieManager(t *testing.T) { manager.DeleteCookies(ctx, w) cookies := w.Result().Cookies() - require.Equal(t, 3, len(cookies)) + require.Equal(t, 5, len(cookies)) + assert.True(t, time.Now().After(cookies[0].Expires)) assert.Equal(t, cookieSetting.Domain, cookies[0].Domain) assert.Equal(t, accessTokenCookieName, cookies[0].Name) + assert.True(t, time.Now().After(cookies[1].Expires)) assert.Equal(t, cookieSetting.Domain, cookies[1].Domain) - assert.Equal(t, refreshTokenCookieName, cookies[1].Name) - assert.True(t, time.Now().After(cookies[1].Expires)) - assert.Equal(t, cookieSetting.Domain, cookies[1].Domain) - assert.Equal(t, idTokenCookieName, cookies[2].Name) + assert.Equal(t, accessTokenCookieNameSplitFirst, cookies[1].Name) + + assert.True(t, time.Now().After(cookies[2].Expires)) + assert.Equal(t, cookieSetting.Domain, cookies[2].Domain) + assert.Equal(t, accessTokenCookieNameSplitSecond, cookies[2].Name) + + assert.True(t, time.Now().After(cookies[3].Expires)) + assert.Equal(t, cookieSetting.Domain, cookies[3].Domain) + assert.Equal(t, refreshTokenCookieName, cookies[3].Name) + + assert.True(t, time.Now().After(cookies[4].Expires)) + assert.Equal(t, cookieSetting.Domain, cookies[4].Domain) + assert.Equal(t, idTokenCookieName, cookies[4].Name) }) t.Run("get_http_same_site_policy", func(t *testing.T) { diff --git a/flyteadmin/auth/handlers_test.go b/flyteadmin/auth/handlers_test.go index 452f797d9f..5428fb9b80 100644 --- a/flyteadmin/auth/handlers_test.go +++ b/flyteadmin/auth/handlers_test.go @@ -305,7 +305,7 @@ func TestGetLogoutHandler(t *testing.T) { GetLogoutEndpointHandler(ctx, &authCtx, r)(w, req) assert.Equal(t, http.StatusOK, w.Code) - require.Len(t, w.Result().Cookies(), 3) + require.Len(t, w.Result().Cookies(), 5) authCtx.AssertExpectations(t) }) @@ -323,7 +323,7 @@ func TestGetLogoutHandler(t *testing.T) { assert.Equal(t, http.StatusTemporaryRedirect, w.Code) authCtx.AssertExpectations(t) - require.Len(t, w.Result().Cookies(), 3) + require.Len(t, w.Result().Cookies(), 5) }) t.Run("with_hook_with_redirect", func(t *testing.T) { @@ -349,7 +349,7 @@ func TestGetLogoutHandler(t *testing.T) { GetLogoutEndpointHandler(ctx, &authCtx, r)(w, req) assert.Equal(t, http.StatusTemporaryRedirect, w.Code) - require.Len(t, w.Result().Cookies(), 3) + require.Len(t, w.Result().Cookies(), 5) authCtx.AssertExpectations(t) hook.AssertExpectations(t) }) @@ -399,15 +399,19 @@ func TestGetHTTPRequestCookieToMetadataHandler(t *testing.T) { req, err := http.NewRequest("GET", "/api/v1/projects", nil) assert.NoError(t, err) - accessTokenCookie, err := NewSecureCookie(accessTokenCookieName, "a.b.c", cookieManager.hashKey, cookieManager.blockKey, "localhost", http.SameSiteDefaultMode) + accessTokenCookie, err := NewSecureCookie(accessTokenCookieNameSplitFirst, "a.b.c", cookieManager.hashKey, cookieManager.blockKey, "localhost", http.SameSiteDefaultMode) assert.NoError(t, err) req.AddCookie(&accessTokenCookie) - idCookie, err := NewSecureCookie(idTokenCookieName, "a.b.c", cookieManager.hashKey, cookieManager.blockKey, "localhost", http.SameSiteDefaultMode) + accessTokenCookieSplit, err := NewSecureCookie(accessTokenCookieNameSplitSecond, ".d.e.f", cookieManager.hashKey, cookieManager.blockKey, "localhost", http.SameSiteDefaultMode) + assert.NoError(t, err) + req.AddCookie(&accessTokenCookieSplit) + + idCookie, err := NewSecureCookie(idTokenCookieName, "a.b.c.d.e.f", cookieManager.hashKey, cookieManager.blockKey, "localhost", http.SameSiteDefaultMode) assert.NoError(t, err) req.AddCookie(&idCookie) - assert.Equal(t, "IDToken a.b.c", handler(ctx, req)["authorization"][0]) + assert.Equal(t, "IDToken a.b.c.d.e.f", handler(ctx, req)["authorization"][0]) } func TestGetHTTPMetadataTaggingHandler(t *testing.T) { diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index 070c057741..39bde3ea23 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -20,6 +20,7 @@ require ( github.com/flyteorg/stow v0.3.10 github.com/ghodss/yaml v1.0.0 github.com/go-gormigrate/gormigrate/v2 v2.1.1 + github.com/golang-jwt/jwt v3.2.2+incompatible github.com/golang-jwt/jwt/v4 v4.5.0 github.com/golang/glog v1.2.0 github.com/golang/protobuf v1.5.3 diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index 9691e94d86..456493c095 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -609,6 +609,8 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= From f5a4ce0deabdddd16ea1c18fb9b44ac0be4f831f Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Fri, 29 Mar 2024 15:01:55 -0700 Subject: [PATCH 380/645] Update Flyte components (#5150) Signed-off-by: Flyte-Bot --- CHANGELOG/CHANGELOG-v1.11.1-b1.md | 45 +++++++++++++++++++ charts/flyte-binary/README.md | 2 +- charts/flyte-binary/values.yaml | 2 +- charts/flyte-core/README.md | 12 ++--- charts/flyte-core/values.yaml | 10 ++--- charts/flyte/README.md | 16 +++---- charts/flyte/values.yaml | 10 ++--- .../flyte_aws_scheduler_helm_generated.yaml | 30 ++++++------- .../flyte_helm_controlplane_generated.yaml | 20 ++++----- .../eks/flyte_helm_dataplane_generated.yaml | 14 +++--- deployment/eks/flyte_helm_generated.yaml | 34 +++++++------- .../flyte_helm_controlplane_generated.yaml | 20 ++++----- .../gcp/flyte_helm_dataplane_generated.yaml | 14 +++--- deployment/gcp/flyte_helm_generated.yaml | 34 +++++++------- .../flyte_sandbox_binary_helm_generated.yaml | 4 +- deployment/sandbox/flyte_helm_generated.yaml | 34 +++++++------- .../manifests/complete-agent.yaml | 8 ++-- .../sandbox-bundled/manifests/complete.yaml | 8 ++-- docker/sandbox-bundled/manifests/dev.yaml | 4 +- docs/conf.py | 2 +- .../generated/flytepropeller_config.rst | 13 ------ 21 files changed, 184 insertions(+), 152 deletions(-) create mode 100644 CHANGELOG/CHANGELOG-v1.11.1-b1.md diff --git a/CHANGELOG/CHANGELOG-v1.11.1-b1.md b/CHANGELOG/CHANGELOG-v1.11.1-b1.md new file mode 100644 index 0000000000..85dcba7b1a --- /dev/null +++ b/CHANGELOG/CHANGELOG-v1.11.1-b1.md @@ -0,0 +1,45 @@ +# Flyte v1.11.1-b1 + +## What's Changed +* sagemaker agent backend setup documentation by @samhita-alla in https://github.com/flyteorg/flyte/pull/5064 +* add first version of gke-starter values file by @cjidboon94 in https://github.com/flyteorg/flyte/pull/5026 +* Fix open ai secret name by @eapolinario in https://github.com/flyteorg/flyte/pull/5098 +* Allow setting a ExecutionClusterLabel when triggering a Launchplan/Workflow/Task by @RRap0so in https://github.com/flyteorg/flyte/pull/4998 +* Improve audience mismatch debugging by @ddl-rliu in https://github.com/flyteorg/flyte/pull/5078 +* docs(sandbox): Add guide for running newest flyteconsole in flyte sandbox by @MortalHappiness in https://github.com/flyteorg/flyte/pull/5100 +* Remove unnecessary step and fix numbering in code examples by @eapolinario in https://github.com/flyteorg/flyte/pull/5104 +* fix rendering of flyte-core and flyteagent charts by @pbrogan12 in https://github.com/flyteorg/flyte/pull/5048 +* Bump golang.org/x/net from 0.3.1-0.20221206200815-1e63c2f08a10 to 0.7.0 in /docker/sandbox-bundled/bootstrap by @dependabot in https://github.com/flyteorg/flyte/pull/3390 +* Update repeated value filters with ValueNotIn support by @troychiu in https://github.com/flyteorg/flyte/pull/5110 +* Update container builds from go 1.21.5 to 1.21.latest by @ddl-ebrown in https://github.com/flyteorg/flyte/pull/5097 +* Add optional org param to ProjectGetRequest by @katrogan in https://github.com/flyteorg/flyte/pull/5118 +* Stop building read-the-docs for flyteidl by @eapolinario in https://github.com/flyteorg/flyte/pull/5120 +* Bump google.golang.org/grpc and otelgrpc by @eapolinario in https://github.com/flyteorg/flyte/pull/5121 +* Fix broken link in "Mapping Python to Flyte types" table by @neverett in https://github.com/flyteorg/flyte/pull/5122 +* Bump version of otel and grpc in flytestdlib by @eapolinario in https://github.com/flyteorg/flyte/pull/5123 +* [flyteadmin] Show diff structure when re-registration two different task with same ids by @austin362667 in https://github.com/flyteorg/flyte/pull/4924 +* Set flyteadmin grpc port correctly in config / Flyte-core flyteadmin / datacatalog expose ports by @ddl-ebrown in https://github.com/flyteorg/flyte/pull/5013 +* Add flyte-core missing priorityClassName to webhook values by @ddl-ebrown in https://github.com/flyteorg/flyte/pull/4987 +* Update environment_setup.md by @ssen85 in https://github.com/flyteorg/flyte/pull/4963 +* [Docs] Open external links in new tab by @MortalHappiness in https://github.com/flyteorg/flyte/pull/4966 +* Fix separateGrpcIngress flag not working in flyte-binary helm chart by @lowc1012 in https://github.com/flyteorg/flyte/pull/4946 +* docs(contribute): Change go mod tidy to make go-tidy by @MortalHappiness in https://github.com/flyteorg/flyte/pull/5131 +* Fix execution phase by @troychiu in https://github.com/flyteorg/flyte/pull/5127 +* Add trailing slash to compile make target by @eapolinario in https://github.com/flyteorg/flyte/pull/4648 +* Change retry error from RuntimeError to FlyteRecoverableException by @dansola in https://github.com/flyteorg/flyte/pull/5128 +* Adapt ray flyteplugin to Kuberay 1.1.0 by @ByronHsu in https://github.com/flyteorg/flyte/pull/5067 +* Boilerplate simplification by @eapolinario in https://github.com/flyteorg/flyte/pull/5134 +* Upgrade cloudevents to v2.15.2 by @ddl-ebrown in https://github.com/flyteorg/flyte/pull/5142 +* update sagemaker agent setup doc as secrets aren't required anymore by @samhita-alla in https://github.com/flyteorg/flyte/pull/5138 +* Upgrade logrus to v1.9.3 everywhere by @ddl-ebrown in https://github.com/flyteorg/flyte/pull/5139 +* Upgrade go-restful to v3.12.0 by @ddl-ebrown in https://github.com/flyteorg/flyte/pull/5140 +* Regenerate ray pflags by @eapolinario in https://github.com/flyteorg/flyte/pull/5149 +* Split access token into half and store to avoid "securecookie: the value is too long" error by @yubofredwang in https://github.com/flyteorg/flyte/pull/4863 + +## New Contributors +* @cjidboon94 made their first contribution in https://github.com/flyteorg/flyte/pull/5026 +* @ddl-rliu made their first contribution in https://github.com/flyteorg/flyte/pull/5078 +* @pbrogan12 made their first contribution in https://github.com/flyteorg/flyte/pull/5048 +* @austin362667 made their first contribution in https://github.com/flyteorg/flyte/pull/4924 +* @ssen85 made their first contribution in https://github.com/flyteorg/flyte/pull/4963 +* @dansola made their first contribution in https://github.com/flyteorg/flyte/pull/5128 diff --git a/charts/flyte-binary/README.md b/charts/flyte-binary/README.md index d7d50e092e..23bb50d224 100644 --- a/charts/flyte-binary/README.md +++ b/charts/flyte-binary/README.md @@ -42,7 +42,7 @@ Chart for basic single Flyte executable deployment | configuration.auth.oidc.clientId | string | `""` | | | configuration.auth.oidc.clientSecret | string | `""` | | | configuration.co-pilot.image.repository | string | `"cr.flyte.org/flyteorg/flytecopilot"` | | -| configuration.co-pilot.image.tag | string | `"v1.11.0-b0"` | | +| configuration.co-pilot.image.tag | string | `"v1.11.1-b1"` | | | configuration.database.dbname | string | `"flyte"` | | | configuration.database.host | string | `"127.0.0.1"` | | | configuration.database.options | string | `"sslmode=disable"` | | diff --git a/charts/flyte-binary/values.yaml b/charts/flyte-binary/values.yaml index 2211e14f85..29415fa1b6 100644 --- a/charts/flyte-binary/values.yaml +++ b/charts/flyte-binary/values.yaml @@ -159,7 +159,7 @@ configuration: # repository CoPilot sidecar image repository repository: cr.flyte.org/flyteorg/flytecopilot # FLYTECOPILOT_IMAGE # tag CoPilot sidecar image tag - tag: v1.11.0-b0 # FLYTECOPILOT_TAG + tag: v1.11.1-b1 # FLYTECOPILOT_TAG # agentService Flyte Agent configuration agentService: defaultAgent: diff --git a/charts/flyte-core/README.md b/charts/flyte-core/README.md index 27086c0505..00fd69f368 100644 --- a/charts/flyte-core/README.md +++ b/charts/flyte-core/README.md @@ -95,8 +95,8 @@ helm install gateway bitnami/contour -n flyte | configmap.clusters.clusterConfigs | list | `[]` | | | configmap.clusters.labelClusterMap | object | `{}` | | | configmap.console | object | `{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"}` | Configuration for Flyte console UI | -| configmap.copilot | object | `{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0","name":"flyte-copilot-","start-timeout":"30s"}}}}` | Copilot configuration | -| configmap.copilot.plugins.k8s.co-pilot | object | `{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0","name":"flyte-copilot-","start-timeout":"30s"}` | Structure documented [here](https://pkg.go.dev/github.com/lyft/flyteplugins@v0.5.28/go/tasks/pluginmachinery/flytek8s/config#FlyteCoPilotConfig) | +| configmap.copilot | object | `{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1","name":"flyte-copilot-","start-timeout":"30s"}}}}` | Copilot configuration | +| configmap.copilot.plugins.k8s.co-pilot | object | `{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1","name":"flyte-copilot-","start-timeout":"30s"}` | Structure documented [here](https://pkg.go.dev/github.com/lyft/flyteplugins@v0.5.28/go/tasks/pluginmachinery/flytek8s/config#FlyteCoPilotConfig) | | configmap.core | object | `{"manager":{"pod-application":"flytepropeller","pod-template-container-name":"flytepropeller","pod-template-name":"flytepropeller-template"},"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}}` | Core propeller configuration | | configmap.core.manager | object | `{"pod-application":"flytepropeller","pod-template-container-name":"flytepropeller","pod-template-name":"flytepropeller-template"}` | follows the structure specified [here](https://pkg.go.dev/github.com/flyteorg/flytepropeller/manager/config#Config). | | configmap.core.propeller | object | `{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"}` | follows the structure specified [here](https://pkg.go.dev/github.com/flyteorg/flytepropeller/pkg/controller/config). | @@ -130,7 +130,7 @@ helm install gateway bitnami/contour -n flyte | datacatalog.extraArgs | object | `{}` | Appends extra command line arguments to the main command | | datacatalog.image.pullPolicy | string | `"IfNotPresent"` | Docker image pull policy | | datacatalog.image.repository | string | `"cr.flyte.org/flyteorg/datacatalog"` | Docker image for Datacatalog deployment | -| datacatalog.image.tag | string | `"v1.11.0-b0"` | Docker image tag | +| datacatalog.image.tag | string | `"v1.11.1-b1"` | Docker image tag | | datacatalog.nodeSelector | object | `{}` | nodeSelector for Datacatalog deployment | | datacatalog.podAnnotations | object | `{}` | Annotations for Datacatalog pods | | datacatalog.podEnv | object | `{}` | Additional Datacatalog container environment variables | @@ -165,7 +165,7 @@ helm install gateway bitnami/contour -n flyte | flyteadmin.extraArgs | object | `{}` | Appends extra command line arguments to the serve command | | flyteadmin.image.pullPolicy | string | `"IfNotPresent"` | | | flyteadmin.image.repository | string | `"cr.flyte.org/flyteorg/flyteadmin"` | Docker image for Flyteadmin deployment | -| flyteadmin.image.tag | string | `"v1.11.0-b0"` | | +| flyteadmin.image.tag | string | `"v1.11.1-b1"` | | | flyteadmin.initialProjects | list | `["flytesnacks","flytetester","flyteexamples"]` | Initial projects to create | | flyteadmin.nodeSelector | object | `{}` | nodeSelector for Flyteadmin deployment | | flyteadmin.podAnnotations | object | `{}` | Annotations for Flyteadmin pods | @@ -226,7 +226,7 @@ helm install gateway bitnami/contour -n flyte | flytepropeller.extraArgs | object | `{}` | Appends extra command line arguments to the main command | | flytepropeller.image.pullPolicy | string | `"IfNotPresent"` | | | flytepropeller.image.repository | string | `"cr.flyte.org/flyteorg/flytepropeller"` | Docker image for Flytepropeller deployment | -| flytepropeller.image.tag | string | `"v1.11.0-b0"` | | +| flytepropeller.image.tag | string | `"v1.11.1-b1"` | | | flytepropeller.manager | bool | `false` | | | flytepropeller.nodeSelector | object | `{}` | nodeSelector for Flytepropeller deployment | | flytepropeller.podAnnotations | object | `{}` | Annotations for Flytepropeller pods | @@ -256,7 +256,7 @@ helm install gateway bitnami/contour -n flyte | flytescheduler.configPath | string | `"/etc/flyte/config/*.yaml"` | Default regex string for searching configuration files | | flytescheduler.image.pullPolicy | string | `"IfNotPresent"` | Docker image pull policy | | flytescheduler.image.repository | string | `"cr.flyte.org/flyteorg/flytescheduler"` | Docker image for Flytescheduler deployment | -| flytescheduler.image.tag | string | `"v1.11.0-b0"` | Docker image tag | +| flytescheduler.image.tag | string | `"v1.11.1-b1"` | Docker image tag | | flytescheduler.nodeSelector | object | `{}` | nodeSelector for Flytescheduler deployment | | flytescheduler.podAnnotations | object | `{}` | Annotations for Flytescheduler pods | | flytescheduler.podEnv | object | `{}` | Additional Flytescheduler container environment variables | diff --git a/charts/flyte-core/values.yaml b/charts/flyte-core/values.yaml index 944bc84735..8b1e4b89d6 100755 --- a/charts/flyte-core/values.yaml +++ b/charts/flyte-core/values.yaml @@ -16,7 +16,7 @@ flyteadmin: image: # -- Docker image for Flyteadmin deployment repository: cr.flyte.org/flyteorg/flyteadmin # FLYTEADMIN_IMAGE - tag: v1.11.0-b0 # FLYTEADMIN_TAG + tag: v1.11.1-b1 # FLYTEADMIN_TAG pullPolicy: IfNotPresent # -- Additional flyteadmin container environment variables # @@ -142,7 +142,7 @@ flytescheduler: # -- Docker image for Flytescheduler deployment repository: cr.flyte.org/flyteorg/flytescheduler # FLYTESCHEDULER_IMAGE # -- Docker image tag - tag: v1.11.0-b0 # FLYTESCHEDULER_TAG + tag: v1.11.1-b1 # FLYTESCHEDULER_TAG # -- Docker image pull policy pullPolicy: IfNotPresent # -- Default resources requests and limits for Flytescheduler deployment @@ -208,7 +208,7 @@ datacatalog: # -- Docker image for Datacatalog deployment repository: cr.flyte.org/flyteorg/datacatalog # DATACATALOG_IMAGE # -- Docker image tag - tag: v1.11.0-b0 # DATACATALOG_TAG + tag: v1.11.1-b1 # DATACATALOG_TAG # -- Docker image pull policy pullPolicy: IfNotPresent # -- Default resources requests and limits for Datacatalog deployment @@ -296,7 +296,7 @@ flytepropeller: image: # -- Docker image for Flytepropeller deployment repository: cr.flyte.org/flyteorg/flytepropeller # FLYTEPROPELLER_IMAGE - tag: v1.11.0-b0 # FLYTEPROPELLER_TAG + tag: v1.11.1-b1 # FLYTEPROPELLER_TAG pullPolicy: IfNotPresent # -- Default resources requests and limits for Flytepropeller deployment resources: @@ -734,7 +734,7 @@ configmap: # -- Structure documented [here](https://pkg.go.dev/github.com/lyft/flyteplugins@v0.5.28/go/tasks/pluginmachinery/flytek8s/config#FlyteCoPilotConfig) co-pilot: name: flyte-copilot- - image: cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0 # FLYTECOPILOT_IMAGE + image: cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1 # FLYTECOPILOT_IMAGE start-timeout: 30s # -- Core propeller configuration diff --git a/charts/flyte/README.md b/charts/flyte/README.md index 76242c341b..c1820f5a3a 100644 --- a/charts/flyte/README.md +++ b/charts/flyte/README.md @@ -71,7 +71,7 @@ helm upgrade -f values-sandbox.yaml flyte . | contour.tolerations | list | `[]` | tolerations for Contour deployment | | daskoperator | object | `{"enabled":false}` | Optional: Dask Plugin using the Dask Operator | | daskoperator.enabled | bool | `false` | - enable or disable the dask operator deployment installation | -| flyte | object | `{"cluster_resource_manager":{"config":{"cluster_resources":{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}},"enabled":true,"service_account_name":"flyteadmin","templates":[{"key":"aa_namespace","value":"apiVersion: v1\nkind: Namespace\nmetadata:\n name: {{ namespace }}\nspec:\n finalizers:\n - kubernetes\n"},{"key":"ab_project_resource_quota","value":"apiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: project-quota\n namespace: {{ namespace }}\nspec:\n hard:\n limits.cpu: {{ projectQuotaCpu }}\n limits.memory: {{ projectQuotaMemory }}\n"}]},"common":{"databaseSecret":{"name":"","secretManifest":{}},"flyteNamespaceTemplate":{"enabled":false},"ingress":{"albSSLRedirect":false,"annotations":{"nginx.ingress.kubernetes.io/app-root":"/console"},"enabled":true,"host":"","separateGrpcIngress":false,"separateGrpcIngressAnnotations":{"nginx.ingress.kubernetes.io/backend-protocol":"GRPC"},"tls":{"enabled":false},"webpackHMR":true}},"configmap":{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}},"datacatalog":{"affinity":{},"configPath":"/etc/datacatalog/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/datacatalog","tag":"v1.11.0-b0"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"NodePort"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"db":{"admin":{"database":{"dbname":"flyteadmin","host":"postgres","port":5432,"username":"postgres"}},"datacatalog":{"database":{"dbname":"datacatalog","host":"postgres","port":5432,"username":"postgres"}}},"deployRedoc":true,"flyteadmin":{"additionalVolumeMounts":[],"additionalVolumes":[],"affinity":{},"configPath":"/etc/flyte/config/*.yaml","env":[],"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteadmin","tag":"v1.11.0-b0"},"initialProjects":["flytesnacks","flytetester","flyteexamples"],"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"loadBalancerSourceRanges":[],"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flyteconsole":{"affinity":{},"ga":{"enabled":true,"tracking_id":"G-0QW4DJWJ20"},"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteconsole","tag":"v1.10.3"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","memory":"275Mi"},"requests":{"cpu":"10m","memory":"250Mi"}},"service":{"annotations":{},"type":"ClusterIP"},"tolerations":[]},"flytepropeller":{"affinity":{},"cacheSizeMbs":0,"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytepropeller","tag":"v1.11.0-b0"},"manager":false,"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"200m","ephemeral-storage":"100Mi","memory":"200Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flytescheduler":{"affinity":{},"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytescheduler","tag":"v1.11.0-b0"},"nodeSelector":{},"podAnnotations":{},"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"storage":{"bucketName":"my-s3-bucket","custom":{},"gcs":null,"s3":{"region":"us-east-1"},"type":"sandbox"},"webhook":{"enabled":true,"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]}},"workflow_notifications":{"config":{},"enabled":false},"workflow_scheduler":{"enabled":true,"type":"native"}}` | ------------------------------------------------------------------- Core System settings This section consists of Core components of Flyte and their deployment settings. This includes FlyteAdmin service, Datacatalog, FlytePropeller and Flyteconsole | +| flyte | object | `{"cluster_resource_manager":{"config":{"cluster_resources":{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}},"enabled":true,"service_account_name":"flyteadmin","templates":[{"key":"aa_namespace","value":"apiVersion: v1\nkind: Namespace\nmetadata:\n name: {{ namespace }}\nspec:\n finalizers:\n - kubernetes\n"},{"key":"ab_project_resource_quota","value":"apiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: project-quota\n namespace: {{ namespace }}\nspec:\n hard:\n limits.cpu: {{ projectQuotaCpu }}\n limits.memory: {{ projectQuotaMemory }}\n"}]},"common":{"databaseSecret":{"name":"","secretManifest":{}},"flyteNamespaceTemplate":{"enabled":false},"ingress":{"albSSLRedirect":false,"annotations":{"nginx.ingress.kubernetes.io/app-root":"/console"},"enabled":true,"host":"","separateGrpcIngress":false,"separateGrpcIngressAnnotations":{"nginx.ingress.kubernetes.io/backend-protocol":"GRPC"},"tls":{"enabled":false},"webpackHMR":true}},"configmap":{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}},"datacatalog":{"affinity":{},"configPath":"/etc/datacatalog/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/datacatalog","tag":"v1.11.1-b1"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"NodePort"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"db":{"admin":{"database":{"dbname":"flyteadmin","host":"postgres","port":5432,"username":"postgres"}},"datacatalog":{"database":{"dbname":"datacatalog","host":"postgres","port":5432,"username":"postgres"}}},"deployRedoc":true,"flyteadmin":{"additionalVolumeMounts":[],"additionalVolumes":[],"affinity":{},"configPath":"/etc/flyte/config/*.yaml","env":[],"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteadmin","tag":"v1.11.1-b1"},"initialProjects":["flytesnacks","flytetester","flyteexamples"],"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"loadBalancerSourceRanges":[],"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flyteconsole":{"affinity":{},"ga":{"enabled":true,"tracking_id":"G-0QW4DJWJ20"},"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteconsole","tag":"v1.10.3"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","memory":"275Mi"},"requests":{"cpu":"10m","memory":"250Mi"}},"service":{"annotations":{},"type":"ClusterIP"},"tolerations":[]},"flytepropeller":{"affinity":{},"cacheSizeMbs":0,"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytepropeller","tag":"v1.11.1-b1"},"manager":false,"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"200m","ephemeral-storage":"100Mi","memory":"200Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flytescheduler":{"affinity":{},"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytescheduler","tag":"v1.11.1-b1"},"nodeSelector":{},"podAnnotations":{},"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"storage":{"bucketName":"my-s3-bucket","custom":{},"gcs":null,"s3":{"region":"us-east-1"},"type":"sandbox"},"webhook":{"enabled":true,"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]}},"workflow_notifications":{"config":{},"enabled":false},"workflow_scheduler":{"enabled":true,"type":"native"}}` | ------------------------------------------------------------------- Core System settings This section consists of Core components of Flyte and their deployment settings. This includes FlyteAdmin service, Datacatalog, FlytePropeller and Flyteconsole | | flyte.cluster_resource_manager | object | `{"config":{"cluster_resources":{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}},"enabled":true,"service_account_name":"flyteadmin","templates":[{"key":"aa_namespace","value":"apiVersion: v1\nkind: Namespace\nmetadata:\n name: {{ namespace }}\nspec:\n finalizers:\n - kubernetes\n"},{"key":"ab_project_resource_quota","value":"apiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: project-quota\n namespace: {{ namespace }}\nspec:\n hard:\n limits.cpu: {{ projectQuotaCpu }}\n limits.memory: {{ projectQuotaMemory }}\n"}]}` | Configuration for the Cluster resource manager component. This is an optional component, that enables automatic cluster configuration. This is useful to set default quotas, manage namespaces etc that map to a project/domain | | flyte.cluster_resource_manager.config.cluster_resources | object | `{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}` | ClusterResource parameters Refer to the [structure](https://pkg.go.dev/github.com/lyft/flyteadmin@v0.3.37/pkg/runtime/interfaces#ClusterResourceConfig) to customize. | | flyte.cluster_resource_manager.config.cluster_resources.standaloneDeployment | bool | `false` | Starts the cluster resource manager in standalone mode with requisite auth credentials to call flyteadmin service endpoints | @@ -91,15 +91,15 @@ helm upgrade -f values-sandbox.yaml flyte . | flyte.common.ingress.separateGrpcIngressAnnotations | object | `{"nginx.ingress.kubernetes.io/backend-protocol":"GRPC"}` | - Extra Ingress annotations applied only to the GRPC ingress. Only makes sense if `separateGrpcIngress` is enabled. | | flyte.common.ingress.tls | object | `{"enabled":false}` | - TLS Settings | | flyte.common.ingress.webpackHMR | bool | `true` | - Enable or disable HMR route to flyteconsole. This is useful only for frontend development. | -| flyte.configmap | object | `{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}}` | ----------------------------------------------------------------- CONFIGMAPS SETTINGS | +| flyte.configmap | object | `{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}}` | ----------------------------------------------------------------- CONFIGMAPS SETTINGS | | flyte.configmap.adminServer | object | `{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}}` | FlyteAdmin server configuration | | flyte.configmap.adminServer.auth | object | `{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}}` | Authentication configuration | | flyte.configmap.adminServer.server.security.secure | bool | `false` | Controls whether to serve requests over SSL/TLS. | | flyte.configmap.adminServer.server.security.useAuth | bool | `false` | Controls whether to enforce authentication. Follow the guide in https://docs.flyte.org/ on how to setup authentication. | | flyte.configmap.catalog | object | `{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}}` | Catalog Client configuration [structure](https://pkg.go.dev/github.com/flyteorg/flytepropeller/pkg/controller/nodes/task/catalog#Config) Additional advanced Catalog configuration [here](https://pkg.go.dev/github.com/lyft/flyteplugins/go/tasks/pluginmachinery/catalog#Config) | | flyte.configmap.console | object | `{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"}` | Configuration for Flyte console UI | -| flyte.configmap.copilot | object | `{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0","name":"flyte-copilot-","start-timeout":"30s"}}}}` | Copilot configuration | -| flyte.configmap.copilot.plugins.k8s.co-pilot | object | `{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0","name":"flyte-copilot-","start-timeout":"30s"}` | Structure documented [here](https://pkg.go.dev/github.com/lyft/flyteplugins@v0.5.28/go/tasks/pluginmachinery/flytek8s/config#FlyteCoPilotConfig) | +| flyte.configmap.copilot | object | `{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1","name":"flyte-copilot-","start-timeout":"30s"}}}}` | Copilot configuration | +| flyte.configmap.copilot.plugins.k8s.co-pilot | object | `{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1","name":"flyte-copilot-","start-timeout":"30s"}` | Structure documented [here](https://pkg.go.dev/github.com/lyft/flyteplugins@v0.5.28/go/tasks/pluginmachinery/flytek8s/config#FlyteCoPilotConfig) | | flyte.configmap.core | object | `{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}}` | Core propeller configuration | | flyte.configmap.core.propeller | object | `{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"}` | follows the structure specified [here](https://pkg.go.dev/github.com/flyteorg/flytepropeller/pkg/controller/config). | | flyte.configmap.datacatalogServer | object | `{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}}` | Datacatalog server config | @@ -120,7 +120,7 @@ helm upgrade -f values-sandbox.yaml flyte . | flyte.datacatalog.configPath | string | `"/etc/datacatalog/config/*.yaml"` | Default regex string for searching configuration files | | flyte.datacatalog.image.pullPolicy | string | `"IfNotPresent"` | Docker image pull policy | | flyte.datacatalog.image.repository | string | `"cr.flyte.org/flyteorg/datacatalog"` | Docker image for Datacatalog deployment | -| flyte.datacatalog.image.tag | string | `"v1.11.0-b0"` | Docker image tag | +| flyte.datacatalog.image.tag | string | `"v1.11.1-b1"` | Docker image tag | | flyte.datacatalog.nodeSelector | object | `{}` | nodeSelector for Datacatalog deployment | | flyte.datacatalog.podAnnotations | object | `{}` | Annotations for Datacatalog pods | | flyte.datacatalog.replicaCount | int | `1` | Replicas count for Datacatalog deployment | @@ -136,7 +136,7 @@ helm upgrade -f values-sandbox.yaml flyte . | flyte.flyteadmin.env | list | `[]` | Additional flyteadmin container environment variables e.g. SendGrid's API key - name: SENDGRID_API_KEY value: "" e.g. secret environment variable (you can combine it with .additionalVolumes): - name: SENDGRID_API_KEY valueFrom: secretKeyRef: name: sendgrid-secret key: api_key | | flyte.flyteadmin.image.pullPolicy | string | `"IfNotPresent"` | Docker image pull policy | | flyte.flyteadmin.image.repository | string | `"cr.flyte.org/flyteorg/flyteadmin"` | Docker image for Flyteadmin deployment | -| flyte.flyteadmin.image.tag | string | `"v1.11.0-b0"` | Docker image tag | +| flyte.flyteadmin.image.tag | string | `"v1.11.1-b1"` | Docker image tag | | flyte.flyteadmin.initialProjects | list | `["flytesnacks","flytetester","flyteexamples"]` | Initial projects to create | | flyte.flyteadmin.nodeSelector | object | `{}` | nodeSelector for Flyteadmin deployment | | flyte.flyteadmin.podAnnotations | object | `{}` | Annotations for Flyteadmin pods | @@ -162,7 +162,7 @@ helm upgrade -f values-sandbox.yaml flyte . | flyte.flytepropeller.configPath | string | `"/etc/flyte/config/*.yaml"` | Default regex string for searching configuration files | | flyte.flytepropeller.image.pullPolicy | string | `"IfNotPresent"` | Docker image pull policy | | flyte.flytepropeller.image.repository | string | `"cr.flyte.org/flyteorg/flytepropeller"` | Docker image for Flytepropeller deployment | -| flyte.flytepropeller.image.tag | string | `"v1.11.0-b0"` | Docker image tag | +| flyte.flytepropeller.image.tag | string | `"v1.11.1-b1"` | Docker image tag | | flyte.flytepropeller.nodeSelector | object | `{}` | nodeSelector for Flytepropeller deployment | | flyte.flytepropeller.podAnnotations | object | `{}` | Annotations for Flytepropeller pods | | flyte.flytepropeller.replicaCount | int | `1` | Replicas count for Flytepropeller deployment | @@ -176,7 +176,7 @@ helm upgrade -f values-sandbox.yaml flyte . | flyte.flytescheduler.configPath | string | `"/etc/flyte/config/*.yaml"` | Default regex string for searching configuration files | | flyte.flytescheduler.image.pullPolicy | string | `"IfNotPresent"` | Docker image pull policy | | flyte.flytescheduler.image.repository | string | `"cr.flyte.org/flyteorg/flytescheduler"` | Docker image for Flytescheduler deployment | -| flyte.flytescheduler.image.tag | string | `"v1.11.0-b0"` | Docker image tag | +| flyte.flytescheduler.image.tag | string | `"v1.11.1-b1"` | Docker image tag | | flyte.flytescheduler.nodeSelector | object | `{}` | nodeSelector for Flytescheduler deployment | | flyte.flytescheduler.podAnnotations | object | `{}` | Annotations for Flytescheduler pods | | flyte.flytescheduler.resources | object | `{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}}` | Default resources requests and limits for Flytescheduler deployment | diff --git a/charts/flyte/values.yaml b/charts/flyte/values.yaml index e04ac71533..71c9d7a9af 100755 --- a/charts/flyte/values.yaml +++ b/charts/flyte/values.yaml @@ -15,7 +15,7 @@ flyte: # -- Docker image for Flyteadmin deployment repository: cr.flyte.org/flyteorg/flyteadmin # FLYTEADMIN_IMAGE # -- Docker image tag - tag: v1.11.0-b0 # FLYTEADMIN_TAG + tag: v1.11.1-b1 # FLYTEADMIN_TAG # -- Docker image pull policy pullPolicy: IfNotPresent # -- Additional flyteadmin container environment variables @@ -83,7 +83,7 @@ flyte: # -- Docker image for Flytescheduler deployment repository: cr.flyte.org/flyteorg/flytescheduler # FLYTESCHEDULER_IMAGE # -- Docker image tag - tag: v1.11.0-b0 # FLYTESCHEDULER_TAG + tag: v1.11.1-b1 # FLYTESCHEDULER_TAG # -- Docker image pull policy pullPolicy: IfNotPresent # -- Default resources requests and limits for Flytescheduler deployment @@ -128,7 +128,7 @@ flyte: # -- Docker image for Datacatalog deployment repository: cr.flyte.org/flyteorg/datacatalog # DATACATALOG_IMAGE # -- Docker image tag - tag: v1.11.0-b0 # DATACATALOG_TAG + tag: v1.11.1-b1 # DATACATALOG_TAG # -- Docker image pull policy pullPolicy: IfNotPresent # -- Default resources requests and limits for Datacatalog deployment @@ -177,7 +177,7 @@ flyte: # -- Docker image for Flytepropeller deployment repository: cr.flyte.org/flyteorg/flytepropeller # FLYTEPROPELLER_IMAGE # -- Docker image tag - tag: v1.11.0-b0 # FLYTEPROPELLER_TAG + tag: v1.11.1-b1 # FLYTEPROPELLER_TAG # -- Docker image pull policy pullPolicy: IfNotPresent # -- Default resources requests and limits for Flytepropeller deployment @@ -471,7 +471,7 @@ flyte: # -- Structure documented [here](https://pkg.go.dev/github.com/lyft/flyteplugins@v0.5.28/go/tasks/pluginmachinery/flytek8s/config#FlyteCoPilotConfig) co-pilot: name: flyte-copilot- - image: cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0 # FLYTECOPILOT_IMAGE + image: cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1 # FLYTECOPILOT_IMAGE start-timeout: 30s # -- Core propeller configuration diff --git a/deployment/eks/flyte_aws_scheduler_helm_generated.yaml b/deployment/eks/flyte_aws_scheduler_helm_generated.yaml index c48ab6ce97..4420424c78 100644 --- a/deployment/eks/flyte_aws_scheduler_helm_generated.yaml +++ b/deployment/eks/flyte_aws_scheduler_helm_generated.yaml @@ -430,7 +430,7 @@ data: plugins: k8s: co-pilot: - image: cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0 + image: cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1 name: flyte-copilot- start-timeout: 30s core.yaml: | @@ -870,7 +870,7 @@ spec: - /etc/flyte/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations securityContext: @@ -891,7 +891,7 @@ spec: - flytesnacks - flytetester - flyteexamples - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: seed-projects securityContext: @@ -909,7 +909,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - sync - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources securityContext: @@ -926,7 +926,7 @@ spec: - mountPath: /etc/secrets/ name: admin-secrets - name: generate-secrets - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: ["/bin/sh", "-c"] args: @@ -953,7 +953,7 @@ spec: - --config - /etc/flyte/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flyteadmin ports: @@ -1058,7 +1058,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources volumeMounts: @@ -1188,7 +1188,7 @@ spec: - /etc/datacatalog/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations volumeMounts: @@ -1206,7 +1206,7 @@ spec: - --config - /etc/datacatalog/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: datacatalog ports: @@ -1269,7 +1269,7 @@ spec: template: metadata: annotations: - configChecksum: "6b3ace0186a0b36f4d87ebd8ef0b7114608b9ad0b63d9c1af3bb84d4d2da857" + configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -1295,7 +1295,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytepropeller ports: @@ -1349,9 +1349,9 @@ spec: labels: app: flyte-pod-webhook app.kubernetes.io/name: flyte-pod-webhook - app.kubernetes.io/version: v1.11.0-b0 + app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "6b3ace0186a0b36f4d87ebd8ef0b7114608b9ad0b63d9c1af3bb84d4d2da857" + configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" spec: securityContext: fsGroup: 65534 @@ -1363,7 +1363,7 @@ spec: serviceAccountName: flyte-pod-webhook initContainers: - name: generate-secrets - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller @@ -1390,7 +1390,7 @@ spec: mountPath: /etc/flyte/config containers: - name: webhook - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller diff --git a/deployment/eks/flyte_helm_controlplane_generated.yaml b/deployment/eks/flyte_helm_controlplane_generated.yaml index db1d33ab70..3c558f9485 100644 --- a/deployment/eks/flyte_helm_controlplane_generated.yaml +++ b/deployment/eks/flyte_helm_controlplane_generated.yaml @@ -575,7 +575,7 @@ spec: - /etc/flyte/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations securityContext: @@ -596,7 +596,7 @@ spec: - flytesnacks - flytetester - flyteexamples - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: seed-projects securityContext: @@ -614,7 +614,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - sync - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources securityContext: @@ -631,7 +631,7 @@ spec: - mountPath: /etc/secrets/ name: admin-secrets - name: generate-secrets - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: ["/bin/sh", "-c"] args: @@ -658,7 +658,7 @@ spec: - --config - /etc/flyte/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flyteadmin ports: @@ -763,7 +763,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources volumeMounts: @@ -893,7 +893,7 @@ spec: - /etc/datacatalog/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations volumeMounts: @@ -911,7 +911,7 @@ spec: - --config - /etc/datacatalog/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: datacatalog ports: @@ -994,7 +994,7 @@ spec: - precheck - --config - /etc/flyte/config/*.yaml - image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytescheduler-check securityContext: @@ -1014,7 +1014,7 @@ spec: - run - --config - /etc/flyte/config/*.yaml - image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytescheduler ports: diff --git a/deployment/eks/flyte_helm_dataplane_generated.yaml b/deployment/eks/flyte_helm_dataplane_generated.yaml index cada767856..7ca99eee27 100644 --- a/deployment/eks/flyte_helm_dataplane_generated.yaml +++ b/deployment/eks/flyte_helm_dataplane_generated.yaml @@ -94,7 +94,7 @@ data: plugins: k8s: co-pilot: - image: cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0 + image: cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1 name: flyte-copilot- start-timeout: 30s core.yaml: | @@ -428,7 +428,7 @@ spec: template: metadata: annotations: - configChecksum: "6b3ace0186a0b36f4d87ebd8ef0b7114608b9ad0b63d9c1af3bb84d4d2da857" + configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -454,7 +454,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytepropeller ports: @@ -508,9 +508,9 @@ spec: labels: app: flyte-pod-webhook app.kubernetes.io/name: flyte-pod-webhook - app.kubernetes.io/version: v1.11.0-b0 + app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "6b3ace0186a0b36f4d87ebd8ef0b7114608b9ad0b63d9c1af3bb84d4d2da857" + configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" spec: securityContext: fsGroup: 65534 @@ -522,7 +522,7 @@ spec: serviceAccountName: flyte-pod-webhook initContainers: - name: generate-secrets - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller @@ -549,7 +549,7 @@ spec: mountPath: /etc/flyte/config containers: - name: webhook - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller diff --git a/deployment/eks/flyte_helm_generated.yaml b/deployment/eks/flyte_helm_generated.yaml index 2f485a3cc0..bbfb0f32bc 100644 --- a/deployment/eks/flyte_helm_generated.yaml +++ b/deployment/eks/flyte_helm_generated.yaml @@ -461,7 +461,7 @@ data: plugins: k8s: co-pilot: - image: cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0 + image: cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1 name: flyte-copilot- start-timeout: 30s core.yaml: | @@ -901,7 +901,7 @@ spec: - /etc/flyte/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations securityContext: @@ -922,7 +922,7 @@ spec: - flytesnacks - flytetester - flyteexamples - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: seed-projects securityContext: @@ -940,7 +940,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - sync - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources securityContext: @@ -957,7 +957,7 @@ spec: - mountPath: /etc/secrets/ name: admin-secrets - name: generate-secrets - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: ["/bin/sh", "-c"] args: @@ -984,7 +984,7 @@ spec: - --config - /etc/flyte/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flyteadmin ports: @@ -1089,7 +1089,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources volumeMounts: @@ -1219,7 +1219,7 @@ spec: - /etc/datacatalog/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations volumeMounts: @@ -1237,7 +1237,7 @@ spec: - --config - /etc/datacatalog/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: datacatalog ports: @@ -1320,7 +1320,7 @@ spec: - precheck - --config - /etc/flyte/config/*.yaml - image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytescheduler-check securityContext: @@ -1340,7 +1340,7 @@ spec: - run - --config - /etc/flyte/config/*.yaml - image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytescheduler ports: @@ -1399,7 +1399,7 @@ spec: template: metadata: annotations: - configChecksum: "6b3ace0186a0b36f4d87ebd8ef0b7114608b9ad0b63d9c1af3bb84d4d2da857" + configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -1425,7 +1425,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytepropeller ports: @@ -1479,9 +1479,9 @@ spec: labels: app: flyte-pod-webhook app.kubernetes.io/name: flyte-pod-webhook - app.kubernetes.io/version: v1.11.0-b0 + app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "6b3ace0186a0b36f4d87ebd8ef0b7114608b9ad0b63d9c1af3bb84d4d2da857" + configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" spec: securityContext: fsGroup: 65534 @@ -1493,7 +1493,7 @@ spec: serviceAccountName: flyte-pod-webhook initContainers: - name: generate-secrets - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller @@ -1520,7 +1520,7 @@ spec: mountPath: /etc/flyte/config containers: - name: webhook - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller diff --git a/deployment/gcp/flyte_helm_controlplane_generated.yaml b/deployment/gcp/flyte_helm_controlplane_generated.yaml index 9f885c6a43..cda8eb8df6 100644 --- a/deployment/gcp/flyte_helm_controlplane_generated.yaml +++ b/deployment/gcp/flyte_helm_controlplane_generated.yaml @@ -590,7 +590,7 @@ spec: - /etc/flyte/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations securityContext: @@ -611,7 +611,7 @@ spec: - flytesnacks - flytetester - flyteexamples - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: seed-projects securityContext: @@ -629,7 +629,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - sync - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources securityContext: @@ -646,7 +646,7 @@ spec: - mountPath: /etc/secrets/ name: admin-secrets - name: generate-secrets - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: ["/bin/sh", "-c"] args: @@ -673,7 +673,7 @@ spec: - --config - /etc/flyte/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flyteadmin ports: @@ -778,7 +778,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources volumeMounts: @@ -908,7 +908,7 @@ spec: - /etc/datacatalog/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations volumeMounts: @@ -926,7 +926,7 @@ spec: - --config - /etc/datacatalog/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: datacatalog ports: @@ -1009,7 +1009,7 @@ spec: - precheck - --config - /etc/flyte/config/*.yaml - image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytescheduler-check securityContext: @@ -1029,7 +1029,7 @@ spec: - run - --config - /etc/flyte/config/*.yaml - image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytescheduler ports: diff --git a/deployment/gcp/flyte_helm_dataplane_generated.yaml b/deployment/gcp/flyte_helm_dataplane_generated.yaml index 86c6f10014..ed40cc352e 100644 --- a/deployment/gcp/flyte_helm_dataplane_generated.yaml +++ b/deployment/gcp/flyte_helm_dataplane_generated.yaml @@ -94,7 +94,7 @@ data: plugins: k8s: co-pilot: - image: cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0 + image: cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1 name: flyte-copilot- start-timeout: 30s core.yaml: | @@ -436,7 +436,7 @@ spec: template: metadata: annotations: - configChecksum: "264352d1a15b63cdaca7bb2eb3a63e415d89e01d75a81be6afba718c241a441" + configChecksum: "8a15e3074047b226537f0c506efa34aa2459b94274bbd3073f597126f81a59a" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -461,7 +461,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytepropeller ports: @@ -515,9 +515,9 @@ spec: labels: app: flyte-pod-webhook app.kubernetes.io/name: flyte-pod-webhook - app.kubernetes.io/version: v1.11.0-b0 + app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "264352d1a15b63cdaca7bb2eb3a63e415d89e01d75a81be6afba718c241a441" + configChecksum: "8a15e3074047b226537f0c506efa34aa2459b94274bbd3073f597126f81a59a" spec: securityContext: fsGroup: 65534 @@ -529,7 +529,7 @@ spec: serviceAccountName: flyte-pod-webhook initContainers: - name: generate-secrets - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller @@ -556,7 +556,7 @@ spec: mountPath: /etc/flyte/config containers: - name: webhook - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller diff --git a/deployment/gcp/flyte_helm_generated.yaml b/deployment/gcp/flyte_helm_generated.yaml index 5ffa7ff90d..fd314eb457 100644 --- a/deployment/gcp/flyte_helm_generated.yaml +++ b/deployment/gcp/flyte_helm_generated.yaml @@ -474,7 +474,7 @@ data: plugins: k8s: co-pilot: - image: cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0 + image: cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1 name: flyte-copilot- start-timeout: 30s core.yaml: | @@ -924,7 +924,7 @@ spec: - /etc/flyte/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations securityContext: @@ -945,7 +945,7 @@ spec: - flytesnacks - flytetester - flyteexamples - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: seed-projects securityContext: @@ -963,7 +963,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - sync - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources securityContext: @@ -980,7 +980,7 @@ spec: - mountPath: /etc/secrets/ name: admin-secrets - name: generate-secrets - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: ["/bin/sh", "-c"] args: @@ -1007,7 +1007,7 @@ spec: - --config - /etc/flyte/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flyteadmin ports: @@ -1112,7 +1112,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources volumeMounts: @@ -1242,7 +1242,7 @@ spec: - /etc/datacatalog/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations volumeMounts: @@ -1260,7 +1260,7 @@ spec: - --config - /etc/datacatalog/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: datacatalog ports: @@ -1343,7 +1343,7 @@ spec: - precheck - --config - /etc/flyte/config/*.yaml - image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytescheduler-check securityContext: @@ -1363,7 +1363,7 @@ spec: - run - --config - /etc/flyte/config/*.yaml - image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytescheduler ports: @@ -1422,7 +1422,7 @@ spec: template: metadata: annotations: - configChecksum: "264352d1a15b63cdaca7bb2eb3a63e415d89e01d75a81be6afba718c241a441" + configChecksum: "8a15e3074047b226537f0c506efa34aa2459b94274bbd3073f597126f81a59a" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -1447,7 +1447,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytepropeller ports: @@ -1501,9 +1501,9 @@ spec: labels: app: flyte-pod-webhook app.kubernetes.io/name: flyte-pod-webhook - app.kubernetes.io/version: v1.11.0-b0 + app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "264352d1a15b63cdaca7bb2eb3a63e415d89e01d75a81be6afba718c241a441" + configChecksum: "8a15e3074047b226537f0c506efa34aa2459b94274bbd3073f597126f81a59a" spec: securityContext: fsGroup: 65534 @@ -1515,7 +1515,7 @@ spec: serviceAccountName: flyte-pod-webhook initContainers: - name: generate-secrets - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller @@ -1542,7 +1542,7 @@ spec: mountPath: /etc/flyte/config containers: - name: webhook - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller diff --git a/deployment/sandbox-binary/flyte_sandbox_binary_helm_generated.yaml b/deployment/sandbox-binary/flyte_sandbox_binary_helm_generated.yaml index 2d93910a5c..854fbc3d34 100644 --- a/deployment/sandbox-binary/flyte_sandbox_binary_helm_generated.yaml +++ b/deployment/sandbox-binary/flyte_sandbox_binary_helm_generated.yaml @@ -116,7 +116,7 @@ data: stackdriver-enabled: false k8s: co-pilot: - image: "cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1" k8s-array: logs: config: @@ -358,7 +358,7 @@ spec: app.kubernetes.io/instance: flyte app.kubernetes.io/component: flyte-binary annotations: - checksum/configuration: 882c31ec18bdac7aa4f1a9057f9e549b1307b60b5d76839dfb6bc526958bee57 + checksum/configuration: 348a832adeb9019bb63536f46d5f69ab47705f6525a0384e82eb09b3f55a4bba checksum/configuration-secret: d5d93f4e67780b21593dc3799f0f6682aab0765e708e4020939975d14d44f929 checksum/cluster-resource-templates: 7dfa59f3d447e9c099b8f8ffad3af466fecbc9cf9f8c97295d9634254a55d4ae spec: diff --git a/deployment/sandbox/flyte_helm_generated.yaml b/deployment/sandbox/flyte_helm_generated.yaml index 3d68b4afa0..e37cea4f37 100644 --- a/deployment/sandbox/flyte_helm_generated.yaml +++ b/deployment/sandbox/flyte_helm_generated.yaml @@ -586,7 +586,7 @@ data: plugins: k8s: co-pilot: - image: cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0 + image: cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1 name: flyte-copilot- start-timeout: 30s core.yaml: | @@ -6708,7 +6708,7 @@ spec: - /etc/flyte/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations securityContext: @@ -6728,7 +6728,7 @@ spec: - flytesnacks - flytetester - flyteexamples - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: seed-projects securityContext: @@ -6745,7 +6745,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - sync - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources securityContext: @@ -6761,7 +6761,7 @@ spec: - mountPath: /etc/secrets/ name: admin-secrets - name: generate-secrets - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: ["/bin/sh", "-c"] args: @@ -6788,7 +6788,7 @@ spec: - --config - /etc/flyte/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flyteadmin ports: @@ -6883,7 +6883,7 @@ spec: - /etc/flyte/config/*.yaml - clusterresource - run - image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flyteadmin:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: sync-cluster-resources volumeMounts: @@ -7008,7 +7008,7 @@ spec: - /etc/datacatalog/config/*.yaml - migrate - run - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: run-migrations volumeMounts: @@ -7025,7 +7025,7 @@ spec: - --config - /etc/datacatalog/config/*.yaml - serve - image: "cr.flyte.org/flyteorg/datacatalog:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/datacatalog:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: datacatalog ports: @@ -7098,7 +7098,7 @@ spec: - precheck - --config - /etc/flyte/config/*.yaml - image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytescheduler-check securityContext: @@ -7117,7 +7117,7 @@ spec: - run - --config - /etc/flyte/config/*.yaml - image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytescheduler:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytescheduler ports: @@ -7173,7 +7173,7 @@ spec: template: metadata: annotations: - configChecksum: "08d1c92032d4eeaac312ca0cf651f72aa1f214a2de469b49b93ecdfb129b8af" + configChecksum: "4fd54a75274d84bbb9a90cc421f7aece12c202911984a436a9ec5fe52e942eb" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -7198,7 +7198,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" name: flytepropeller ports: @@ -7245,9 +7245,9 @@ spec: labels: app: flyte-pod-webhook app.kubernetes.io/name: flyte-pod-webhook - app.kubernetes.io/version: v1.11.0-b0 + app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "08d1c92032d4eeaac312ca0cf651f72aa1f214a2de469b49b93ecdfb129b8af" + configChecksum: "4fd54a75274d84bbb9a90cc421f7aece12c202911984a436a9ec5fe52e942eb" spec: securityContext: fsGroup: 65534 @@ -7259,7 +7259,7 @@ spec: serviceAccountName: flyte-pod-webhook initContainers: - name: generate-secrets - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller @@ -7286,7 +7286,7 @@ spec: mountPath: /etc/flyte/config containers: - name: webhook - image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytepropeller:v1.11.1-b1" imagePullPolicy: "IfNotPresent" command: - flytepropeller diff --git a/docker/sandbox-bundled/manifests/complete-agent.yaml b/docker/sandbox-bundled/manifests/complete-agent.yaml index 18a0840a73..a9b42ba661 100644 --- a/docker/sandbox-bundled/manifests/complete-agent.yaml +++ b/docker/sandbox-bundled/manifests/complete-agent.yaml @@ -468,7 +468,7 @@ data: stackdriver-enabled: false k8s: co-pilot: - image: "cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1" k8s-array: logs: config: @@ -816,7 +816,7 @@ type: Opaque --- apiVersion: v1 data: - haSharedSecret: bkdUMzhmMjNBYmN0RDlIRg== + haSharedSecret: ZjEwSmt1RUY3aDlCdDVsRg== proxyPassword: "" proxyUsername: "" kind: Secret @@ -1246,7 +1246,7 @@ spec: metadata: annotations: checksum/cluster-resource-templates: 6fd9b172465e3089fcc59f738b92b8dc4d8939360c19de8ee65f68b0e7422035 - checksum/configuration: 9ab632fe7ac69bcf63d6965a44986a05e23798beda4a3175d1601e61057a9832 + checksum/configuration: d80bc8f9b3071655dbfa64845f41031a284d038e948d75eebfa93d2976218d45 checksum/configuration-secret: 09216ffaa3d29e14f88b1f30af580d02a2a5e014de4d750b7f275cc07ed4e914 labels: app.kubernetes.io/component: flyte-binary @@ -1412,7 +1412,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: c99a8645b27f263998822ca7fcbfc861f9011d267550c2c1b683193928d21a5a + checksum/secret: d7249c11a963bd048b55d03454927119ba2f4bbf0a6328ded80c2579cf224f1d labels: app: docker-registry release: flyte-sandbox diff --git a/docker/sandbox-bundled/manifests/complete.yaml b/docker/sandbox-bundled/manifests/complete.yaml index 9080fd4e6a..2ad06dca80 100644 --- a/docker/sandbox-bundled/manifests/complete.yaml +++ b/docker/sandbox-bundled/manifests/complete.yaml @@ -457,7 +457,7 @@ data: stackdriver-enabled: false k8s: co-pilot: - image: "cr.flyte.org/flyteorg/flytecopilot:v1.11.0-b0" + image: "cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1" k8s-array: logs: config: @@ -796,7 +796,7 @@ type: Opaque --- apiVersion: v1 data: - haSharedSecret: Yk10amxRNGE2a2cxQkNudw== + haSharedSecret: aWRqOTR0QTVZRE1CaGVRdw== proxyPassword: "" proxyUsername: "" kind: Secret @@ -1194,7 +1194,7 @@ spec: metadata: annotations: checksum/cluster-resource-templates: 6fd9b172465e3089fcc59f738b92b8dc4d8939360c19de8ee65f68b0e7422035 - checksum/configuration: 11cd65708fd872839c6e561e84c30e045567486f06757f4549c69cc22aea5697 + checksum/configuration: 5bc55a7722e898c70792041ae470cd5de63a8614d14ed20c6a50340d2cb7fdd0 checksum/configuration-secret: 09216ffaa3d29e14f88b1f30af580d02a2a5e014de4d750b7f275cc07ed4e914 labels: app.kubernetes.io/component: flyte-binary @@ -1360,7 +1360,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: 78a0277052e7c7d0a17e1d0dcddb270ba05856222a35324fa54aec8f8a9d0f4e + checksum/secret: 863f8bfa183a5195d769b933f0d975109a0d5f407710e22937545b2b118e6917 labels: app: docker-registry release: flyte-sandbox diff --git a/docker/sandbox-bundled/manifests/dev.yaml b/docker/sandbox-bundled/manifests/dev.yaml index 9235c733dc..57001b01f3 100644 --- a/docker/sandbox-bundled/manifests/dev.yaml +++ b/docker/sandbox-bundled/manifests/dev.yaml @@ -499,7 +499,7 @@ metadata: --- apiVersion: v1 data: - haSharedSecret: QkZrajZUUmFvMWRtYUtOeA== + haSharedSecret: Z0xGR25hRVd6TlZoOERxZA== proxyPassword: "" proxyUsername: "" kind: Secret @@ -934,7 +934,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: 18ef21d160b64cc1bc13e82bdbf675a7592da97786d648686aa4ea1f15b7cafb + checksum/secret: 6c870dc393e0c203d57b719e52c73856e98c35788dd05e75b2d00194cb4392f2 labels: app: docker-registry release: flyte-sandbox diff --git a/docs/conf.py b/docs/conf.py index 171ee13e6d..4c22aa068a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -35,7 +35,7 @@ # The short X.Y version version = "" # The full version, including alpha/beta/rc tags -release = "1.11.1-b0" +release = "1.11.1-b1" # -- General configuration --------------------------------------------------- diff --git a/docs/deployment/configuration/generated/flytepropeller_config.rst b/docs/deployment/configuration/generated/flytepropeller_config.rst index 4d26b0578c..b8fbe49f4e 100644 --- a/docs/deployment/configuration/generated/flytepropeller_config.rst +++ b/docs/deployment/configuration/generated/flytepropeller_config.rst @@ -1174,7 +1174,6 @@ ray (`ray.Config`_) disable-usage-stats: "true" enableUsageStats: false includeDashboard: true - kubeRayCrdVersion: v1alpha1 logs: cloudwatch-enabled: false cloudwatch-log-group: "" @@ -3578,18 +3577,6 @@ Enable usage stats for ray jobs. These stats are submitted to usage-stats.ray.io "false" -kubeRayCrdVersion (string) -"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -Version of the Ray CRD to use when creating RayClusters or RayJobs. - -**Default Value**: - -.. code-block:: yaml - - v1alpha1 - - serviceAccount (string) """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" From f5f82305c9b92c8b8c31cbc9678f99affe817944 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 16:30:15 -0700 Subject: [PATCH 381/645] Bump golang.org/x/crypto in /boilerplate/flyte/golang_support_tools (#5148) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.11.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.11.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eduardo Apolinario --- boilerplate/flyte/golang_support_tools/go.mod | 91 +++--- boilerplate/flyte/golang_support_tools/go.sum | 294 +++++++----------- 2 files changed, 151 insertions(+), 234 deletions(-) diff --git a/boilerplate/flyte/golang_support_tools/go.mod b/boilerplate/flyte/golang_support_tools/go.mod index 2cfeb8aa3a..df65dd7662 100644 --- a/boilerplate/flyte/golang_support_tools/go.mod +++ b/boilerplate/flyte/golang_support_tools/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf github.com/alvaroloes/enumer v1.1.2 - github.com/flyteorg/flytestdlib v0.4.16 + github.com/flyteorg/flyte/flytestdlib v1.11.0 github.com/golangci/golangci-lint v1.53.3 github.com/pseudomuto/protoc-gen-doc v1.4.1 ) @@ -13,25 +13,20 @@ require ( require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect 4d63.com/gochecknoglobals v0.2.1 // indirect - cloud.google.com/go v0.110.2 // indirect - cloud.google.com/go/compute v1.19.3 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.19.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect + cloud.google.com/go/iam v0.13.0 // indirect cloud.google.com/go/storage v1.29.0 // indirect github.com/4meepo/tagalign v1.2.2 // indirect github.com/Abirdcfly/dupword v0.0.11 // indirect github.com/Antonboom/errname v0.1.10 // indirect github.com/Antonboom/nilnil v0.1.5 // indirect - github.com/Azure/azure-sdk-for-go v62.3.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.17 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.10 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.0 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect @@ -44,7 +39,7 @@ require ( github.com/aokoli/goutils v1.0.1 // indirect github.com/ashanbrown/forbidigo v1.5.3 // indirect github.com/ashanbrown/makezero v1.1.1 // indirect - github.com/aws/aws-sdk-go v1.37.1 // indirect + github.com/aws/aws-sdk-go v1.44.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bkielbasa/cyclop v1.2.1 // indirect github.com/blizzy78/varnamelen v0.8.0 // indirect @@ -62,20 +57,20 @@ require ( github.com/daixiang0/gci v0.10.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/denis-tingaikin/go-header v0.4.3 // indirect - github.com/envoyproxy/protoc-gen-validate v0.10.0 // indirect + github.com/envoyproxy/protoc-gen-validate v0.10.1 // indirect github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 // indirect github.com/esimonov/ifshort v1.0.4 // indirect github.com/ettle/strcase v0.1.1 // indirect github.com/fatih/color v1.15.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/firefart/nonamedreturns v1.0.4 // indirect - github.com/flyteorg/stow v0.3.1 // indirect - github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/flyteorg/stow v0.3.10 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-critic/go-critic v0.8.1 // indirect github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect github.com/go-toolsmith/astcopy v1.1.0 // indirect github.com/go-toolsmith/astequal v1.1.0 // indirect @@ -86,8 +81,8 @@ require ( github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gofrs/flock v0.8.1 // indirect - github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect @@ -100,22 +95,21 @@ require ( github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect + github.com/googleapis/gax-go/v2 v2.7.1 // indirect github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect github.com/gostaticanalysis/comment v1.4.2 // indirect github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect github.com/huandu/xstrings v1.0.0 // indirect - github.com/imdario/mergo v0.3.5 // indirect + github.com/imdario/mergo v0.3.6 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jgautheron/goconst v1.5.1 // indirect github.com/jingyugao/rowserrcheck v1.1.1 // indirect @@ -127,6 +121,7 @@ require ( github.com/kkHAIKE/contextcheck v1.1.4 // indirect github.com/kulti/thelper v0.6.3 // indirect github.com/kunwardeep/paralleltest v1.0.7 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect github.com/kyoh86/exportloopref v0.1.11 // indirect github.com/ldez/gomoddirectives v0.2.3 // indirect github.com/ldez/tagliatelle v0.5.0 // indirect @@ -139,7 +134,7 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mbilski/exhaustivestruct v1.2.0 // indirect github.com/mgechev/revive v1.3.2 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -156,13 +151,14 @@ require ( github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v1.4.2 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect github.com/pseudomuto/protokit v0.2.0 // indirect github.com/quasilyte/go-ruleguard v0.3.19 // indirect github.com/quasilyte/gogrep v0.5.0 // indirect @@ -181,7 +177,7 @@ require ( github.com/sivchari/tenv v1.7.1 // indirect github.com/sonatard/noctx v0.0.2 // indirect github.com/sourcegraph/go-diff v0.7.0 // indirect - github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -208,36 +204,43 @@ require ( github.com/ykadowak/zerologlint v0.1.2 // indirect gitlab.com/bosi/decorder v0.2.3 // indirect go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect + go.opentelemetry.io/otel/sdk v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect go.tmz.dev/musttag v0.7.0 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.11.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.12.0 // indirect + golang.org/x/net v0.15.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect - golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.11.1 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect + google.golang.org/api v0.114.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.55.0 // indirect + google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + google.golang.org/grpc v1.56.1 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.4.3 // indirect - k8s.io/apimachinery v0.20.2 // indirect - k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 // indirect - k8s.io/klog/v2 v2.5.0 // indirect + k8s.io/apimachinery v0.28.2 // indirect + k8s.io/client-go v0.28.1 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect mvdan.cc/gofumpt v0.5.0 // indirect mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect diff --git a/boilerplate/flyte/golang_support_tools/go.sum b/boilerplate/flyte/golang_support_tools/go.sum index 4cc434803e..a0f0dc574c 100644 --- a/boilerplate/flyte/golang_support_tools/go.sum +++ b/boilerplate/flyte/golang_support_tools/go.sum @@ -21,22 +21,23 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.3 h1:DcTwsFgGev/wV5+q8o2fzgcHOaac+DKGC91ZlvpsQds= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -58,31 +59,17 @@ github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9 github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible h1:Ctfsn9UoA/BB4HMYQlbPPgNXdX0tZ4tmb85+KFb2+RE= -github.com/Azure/azure-sdk-for-go v62.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM= -github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.10 h1:r6fZHMaHD8B6LDCn0o5vyBFHIHrM6Ywwx7mb49lPItI= -github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 h1:LNHhpdK7hzUcx/k1LIcuh5k7k1LGIWLQfCjaneSj7Fc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0 h1:nVocQV40OQne5613EeLayJiRAJuKlBGy+m22qWG+WRg= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -98,13 +85,10 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -118,16 +102,14 @@ github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQ github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= github.com/alvaroloes/enumer v1.1.2 h1:5khqHB33TZy1GWCO/lZwcroBFh7u+0j40T83VUbfAMY= github.com/alvaroloes/enumer v1.1.2/go.mod h1:FxrjvuXoDAx9isTJrv4c+T410zFi0DtXIT0m65DJ+Wo= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/ashanbrown/forbidigo v1.5.3 h1:jfg+fkm/snMx+V9FBwsl1d340BV/99kZGv5jN9hBoXk= github.com/ashanbrown/forbidigo v1.5.3/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/aws/aws-sdk-go v1.37.1 h1:BTHmuN+gzhxkvU9sac2tZvaY0gV9ihbHw+KxZOecYvY= -github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.44.2 h1:5VBk5r06bgxgRKVaUtm1/4NT/rtrnH2E4cnAYv5zgQc= +github.com/aws/aws-sdk-go v1.44.2/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -166,10 +148,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -183,52 +161,39 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/flyteorg/flytestdlib v0.4.16 h1:r4dCPUOqoE9xCAhOw9KDB7O6cBoCxyEtepIWYcj93H0= -github.com/flyteorg/flytestdlib v0.4.16/go.mod h1:WA5Y4hrcgD0ybGOKJVOQ4sP8q7NLRV+S5SWOlH0axgM= +github.com/flyteorg/flyte/flytestdlib v1.11.0 h1:I/pHpq02/FSpB0irbfLhss2AJZX7dPCFll98AHqF0Rk= +github.com/flyteorg/flyte/flytestdlib v1.11.0/go.mod h1:5cm+LxTc0N0R0TQwv8uG6uCu8MoOMwMsU/YbFP0akPA= github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= -github.com/flyteorg/stow v0.3.1 h1:cBMbWl03Gsy5KoA5mutUYTuYpqtT7Pb8+ANGCLnmFEs= -github.com/flyteorg/stow v0.3.1/go.mod h1:HBld7ud0i4khMHwJjkO8v+NSP7ddKa/ruhf4I8fliaA= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= +github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-critic/go-critic v0.8.1 h1:16omCF1gN3gTzt4j4J6fKI/HnRojhEp+Eks6EuKw3vw= @@ -242,18 +207,12 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= @@ -279,12 +238,11 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -354,7 +312,6 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -370,26 +327,21 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= @@ -401,10 +353,9 @@ github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3 github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -416,14 +367,13 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= @@ -447,7 +397,6 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= @@ -460,17 +409,16 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= github.com/kunwardeep/paralleltest v1.0.7 h1:2uCk94js0+nVNQoHZNLBkAR1DQJrVzw6T0RMzJn55dQ= github.com/kunwardeep/paralleltest v1.0.7/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= @@ -483,8 +431,6 @@ github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCE github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= @@ -500,32 +446,28 @@ github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPn github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= @@ -540,13 +482,7 @@ github.com/nunnatsa/ginkgolinter v0.12.1 h1:vwOqb5Nu05OikTXqhvLdHCGcx5uthIYIl0t7 github.com/nunnatsa/ginkgolinter v0.12.1/go.mod h1:AK8Ab1PypVrcGUusuKD8RDcl2KgsIwvNaaxAlyHSzso= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= @@ -560,7 +496,8 @@ github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3v github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -575,24 +512,28 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= @@ -603,9 +544,8 @@ github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= @@ -640,16 +580,14 @@ github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCp github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= @@ -660,7 +598,6 @@ github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -670,7 +607,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -730,7 +666,18 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.tmz.dev/musttag v0.7.0 h1:QfytzjTWGXZmChoX0L++7uQN+yRCPfyFm+whsM+lfGc= go.tmz.dev/musttag v0.7.0/go.mod h1:oTFPvgOkJmp5kYL02S8+jrH0eLrBIl57rzWeA26zDEM= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= @@ -745,17 +692,14 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -806,7 +750,6 @@ golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -819,7 +762,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -834,7 +776,6 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -843,17 +784,15 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -884,7 +823,6 @@ golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -893,11 +831,9 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -918,7 +854,6 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -931,21 +866,23 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -960,20 +897,17 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -985,7 +919,6 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1072,8 +1005,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1106,7 +1039,6 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1120,12 +1052,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1139,14 +1071,11 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1166,16 +1095,11 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1183,7 +1107,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1195,19 +1118,14 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= -k8s.io/api v0.0.0-20210217171935-8e2decd92398/go.mod h1:60tmSUpHxGPFerNHbo/ayI2lKxvtrhbxFyXuEIWJd78= -k8s.io/apimachinery v0.0.0-20210217011835-527a61b4dffe/go.mod h1:Z7ps/g0rjlTeMstYrMOUttJfT2Gg34DEaG/f2PYLCWY= -k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847 h1:d+LBRNY3c/KGp7lDblRlUJkayx4Vla7WUTIazoGMdYo= -k8s.io/client-go v0.0.0-20210217172142-7279fc64d847/go.mod h1:q0EaghmVye2uui19vxSZ2NG6ssgUWgjudO6vrwXneSI= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= -k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= +k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= +k8s.io/client-go v0.28.1 h1:pRhMzB8HyLfVwpngWKE8hDcXRqifh1ga2Z/PU9SXVK8= +k8s.io/client-go v0.28.1/go.mod h1:pEZA3FqOsVkCc07pFVzK076R+P/eXqsgx5zuuRWukNE= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= +k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= @@ -1219,7 +1137,3 @@ mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RF rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From b1cab3a8664242a1379336bffe0176a0fc4d71a4 Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Sun, 31 Mar 2024 10:52:20 -0400 Subject: [PATCH 382/645] use javascript to open new tab for external links (#5159) Signed-off-by: cosmicBboy --- Makefile | 4 +- docs/_static/custom.js | 11 + docs/conf.py | 2 +- monodocs-environment.lock.yaml | 12108 ++++++++++++++++++++++++++++--- monodocs-environment.yaml | 1 - 5 files changed, 10968 insertions(+), 1158 deletions(-) create mode 100644 docs/_static/custom.js diff --git a/Makefile b/Makefile index 9888303818..9d441c06f1 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,9 @@ install-conda-lock: .PHONY: conda-lock conda-lock: install-conda-lock - conda-lock -f monodocs-environment.yaml --without-cuda --lockfile monodocs-environment.lock.yaml + conda-lock -f monodocs-environment.yaml --without-cuda \ + --lockfile monodocs-environment.lock.yaml \ + --platform=osx-64 --platform=osx-arm64 --platform=linux-64 .PHONY: stats stats: diff --git a/docs/_static/custom.js b/docs/_static/custom.js new file mode 100644 index 0000000000..388fda4e22 --- /dev/null +++ b/docs/_static/custom.js @@ -0,0 +1,11 @@ +// Add event listener for DOMContentLoaded event +window.addEventListener("DOMContentLoaded", function() { + // Select all elements with class "external" + var externalLinks = document.querySelectorAll("a.external"); + + // Loop through each element with class "external" + externalLinks.forEach(function(link) { + // Set the target attribute to "_blank" + link.setAttribute("target", "_blank"); + }); +}); diff --git a/docs/conf.py b/docs/conf.py index 4c22aa068a..00382fa77a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -75,7 +75,6 @@ # custom extensions "auto_examples", "import_projects", - "sphinx_new_tab_link" ] source_suffix = { @@ -188,6 +187,7 @@ # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] html_css_files = ["custom.css", "flyte.css", "algolia.css"] +html_js_files = ["custom.js"] # Custom sidebar templates, must be a dictionary that maps document names # to template names. diff --git a/monodocs-environment.lock.yaml b/monodocs-environment.lock.yaml index 09dfed5fc3..65f4bc61aa 100644 --- a/monodocs-environment.lock.yaml +++ b/monodocs-environment.lock.yaml @@ -13,13 +13,15 @@ version: 1 metadata: content_hash: - linux-64: 32d4de5273d85a0237eda3bf606d0faaff506dac029d80b303bdf7ed5245ad2a + linux-64: c4ea2742c1d9704007aa9e822229cb0555a2f0da58b375bb5a1bdb05c82a5542 osx-arm64: e58daa2c17c4401600ecf9a4e1039741eb1d186d902acfad0e7f254968ee3732 + osx-64: 99fdb22e3d6a1054e7f3e655d0550e0b9dff6adc206fb5b5c5219d371468faf8 channels: - url: conda-forge used_env_vars: [] platforms: - linux-64 + - osx-64 - osx-arm64 sources: - monodocs-environment.yaml @@ -60,6 +62,18 @@ package: sha256: 6c84575fe0c3a860c7b6a52cb36dc548c838503c8da0f950a63a64c29b443937 category: main optional: false +- name: absl-py + version: 2.1.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/absl-py-2.1.0-pyhd8ed1ab_0.conda + hash: + md5: 035d1d58677c13ec93122d9eb6b8803b + sha256: 6c84575fe0c3a860c7b6a52cb36dc548c838503c8da0f950a63a64c29b443937 + category: main + optional: false - name: absl-py version: 2.1.0 manager: conda @@ -91,13 +105,29 @@ package: - name: adal version: 1.2.7 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - cryptography: '>=1.1.0' - pyjwt: '>=1.0.0' python: '>=3.6' + requests: '>=2.0.0' + pyjwt: '>=1.0.0' + cryptography: '>=1.1.0' python-dateutil: '>=2.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/adal-1.2.7-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 1a0f134d22bad81e93f1e130b35afb35 + sha256: 3631c3713355d8fa81a77489dbc803b5004ea3be7e02b4ac9c16391f67dc57d5 + category: main + optional: false +- name: adal + version: 1.2.7 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.6' requests: '>=2.0.0' + pyjwt: '>=1.0.0' + cryptography: '>=1.1.0' + python-dateutil: '>=2.1.0' url: https://conda.anaconda.org/conda-forge/noarch/adal-1.2.7-pyhd8ed1ab_0.tar.bz2 hash: md5: 1a0f134d22bad81e93f1e130b35afb35 @@ -125,15 +155,33 @@ package: - name: adlfs version: 2024.2.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + azure-identity: '' + python: '>=3.8' + azure-datalake-store: '>=0.0.46,<0.1' aiohttp: '>=3.7.0' + fsspec: '>=2023.12.0' + azure-storage-blob: '>=12.12.0' azure-core: '>=1.23.1,<2.0.0' - azure-datalake-store: '>=0.0.46,<0.1' + url: https://conda.anaconda.org/conda-forge/noarch/adlfs-2024.2.0-pyhd8ed1ab_1.conda + hash: + md5: 4dfa76ae23a7c27f4ccaf64945b71871 + sha256: b9ae4843b862ee69a1bfdcbb4604db817dd4f220d598fcbe64987c700b4e4cf4 + category: main + optional: false +- name: adlfs + version: 2024.2.0 + manager: conda + platform: osx-arm64 + dependencies: azure-identity: '' - azure-storage-blob: '>=12.12.0' - fsspec: '>=2023.12.0' python: '>=3.8' + azure-datalake-store: '>=0.0.46,<0.1' + aiohttp: '>=3.7.0' + fsspec: '>=2023.12.0' + azure-storage-blob: '>=12.12.0' + azure-core: '>=1.23.1,<2.0.0' url: https://conda.anaconda.org/conda-forge/noarch/adlfs-2024.2.0-pyhd8ed1ab_1.conda hash: md5: 4dfa76ae23a7c27f4ccaf64945b71871 @@ -159,13 +207,29 @@ package: - name: aiobotocore version: 2.12.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - aiohttp: '>=3.7.4.post0,<4.0.0' + python: '>=3.8' + wrapt: '>=1.10.10,<2.0.0' aioitertools: '>=0.5.1,<1.0.0' + aiohttp: '>=3.7.4.post0,<4.0.0' botocore: '>=1.34.41,<1.34.52' + url: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-2.12.1-pyhd8ed1ab_0.conda + hash: + md5: 045560daef58c75a759c2638fbdb5c6a + sha256: e7d43681c7c2957b535aac2b3ad90013bcb39ed5514cea3cec52302f624d457a + category: main + optional: false +- name: aiobotocore + version: 2.12.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' wrapt: '>=1.10.10,<2.0.0' + aioitertools: '>=0.5.1,<1.0.0' + aiohttp: '>=3.7.4.post0,<4.0.0' + botocore: '>=1.34.41,<1.34.52' url: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-2.12.1-pyhd8ed1ab_0.conda hash: md5: 045560daef58c75a759c2638fbdb5c6a @@ -192,6 +256,25 @@ package: sha256: 0fcc6c976dc7dd7592cfd584cacbc121190513ddeff9d7ab386ef67146808c0c category: main optional: false +- name: aiohttp + version: 3.9.3 + manager: conda + platform: osx-64 + dependencies: + aiosignal: '>=1.1.2' + async-timeout: '>=4.0,<5.0' + attrs: '>=17.3.0' + frozenlist: '>=1.1.1' + multidict: '>=4.5,<7.0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + yarl: '>=1.0,<2.0' + url: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.9.3-py39ha09f3b3_1.conda + hash: + md5: 9898a8146b20e891e62171f2aabd7893 + sha256: fbc33a785294fb4f90cf6b97b880bbe2d5331976863279e5f6869c759bf88219 + category: main + optional: false - name: aiohttp version: 3.9.3 manager: conda @@ -224,6 +307,19 @@ package: sha256: be2dbd6710438fa48b83bf06841091227276ae545d145dfe5cb5149c6484e951 category: main optional: false +- name: aioitertools + version: 0.11.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + typing_extensions: '>=4.0' + url: https://conda.anaconda.org/conda-forge/noarch/aioitertools-0.11.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 59c40397276a286241c65faec5e1be3c + sha256: be2dbd6710438fa48b83bf06841091227276ae545d145dfe5cb5149c6484e951 + category: main + optional: false - name: aioitertools version: 0.11.0 manager: conda @@ -253,10 +349,23 @@ package: - name: aiosignal version: 1.3.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' frozenlist: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: d1e1eb7e21a9e2c74279d87dafb68156 + sha256: 575c742e14c86575986dc867463582a970463da50b77264cdf54df74f5563783 + category: main + optional: false +- name: aiosignal + version: 1.3.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + frozenlist: '>=1.1.0' url: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 hash: md5: d1e1eb7e21a9e2c74279d87dafb68156 @@ -275,6 +384,18 @@ package: sha256: fd39ad2fabec1569bbb0dfdae34ab6ce7de6ec09dcec8638f83dad0373594069 category: main optional: false +- name: alabaster + version: 0.7.16 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda + hash: + md5: def531a3ac77b7fb8c21d17bb5d0badb + sha256: fd39ad2fabec1569bbb0dfdae34ab6ce7de6ec09dcec8638f83dad0373594069 + category: main + optional: false - name: alabaster version: 0.7.16 manager: conda @@ -304,6 +425,23 @@ package: sha256: e4bc9aa5a6e866461274826bb750407a407fed9207a5adb70bf727f6addd7fe6 category: main optional: false +- name: alembic + version: 1.13.1 + manager: conda + platform: osx-64 + dependencies: + importlib-metadata: '' + importlib_resources: '' + mako: '' + python: '>=3.8' + sqlalchemy: '>=1.3.0' + typing-extensions: '>=4' + url: https://conda.anaconda.org/conda-forge/noarch/alembic-1.13.1-pyhd8ed1ab_1.conda + hash: + md5: 7b7b0062b0de9f3f71502d31215fcbbb + sha256: e4bc9aa5a6e866461274826bb750407a407fed9207a5adb70bf727f6addd7fe6 + category: main + optional: false - name: alembic version: 1.13.1 manager: conda @@ -321,6 +459,18 @@ package: sha256: e4bc9aa5a6e866461274826bb750407a407fed9207a5adb70bf727f6addd7fe6 category: main optional: false +- name: alsa-lib + version: 1.2.11 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda + hash: + md5: 0bb492cca54017ea314b809b1ee3a176 + sha256: 0e2b75b9834a6e520b13db516f7cf5c9cea8f0bbc9157c978444173dacb98fec + category: main + optional: false - name: altair version: 4.2.2 manager: conda @@ -342,15 +492,33 @@ package: - name: altair version: 4.2.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - entrypoints: '' jinja2: '' + toolz: '' + entrypoints: '' + python: '>=3.7' + pandas: '>=0.18' jsonschema: '>=3.0' numpy: '>=0.18' - pandas: '>=0.18' - python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/altair-4.2.2-pyhd8ed1ab_0.conda + hash: + md5: afca9c6a93335c55bbc84072011e86dc + sha256: 5b36be4717e05b7c1f016d3534b7fe316381260ac2367a7815ff96fb88273deb + category: main + optional: false +- name: altair + version: 4.2.2 + manager: conda + platform: osx-arm64 + dependencies: + jinja2: '' toolz: '' + entrypoints: '' + python: '>=3.7' + pandas: '>=0.18' + jsonschema: '>=3.0' + numpy: '>=0.18' url: https://conda.anaconda.org/conda-forge/noarch/altair-4.2.2-pyhd8ed1ab_0.conda hash: md5: afca9c6a93335c55bbc84072011e86dc @@ -373,10 +541,23 @@ package: - name: ansiwrap version: 0.8.4 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + textwrap3: '' python: <3.12.0a0 + url: https://conda.anaconda.org/conda-forge/noarch/ansiwrap-0.8.4-py_0.tar.bz2 + hash: + md5: f09557e2a7cbd2470a2ab6353000cebd + sha256: 34e2445a78857c7418ab738b3a3c88f3226923676c3c185688dd570a6f9129a4 + category: main + optional: false +- name: ansiwrap + version: 0.8.4 + manager: conda + platform: osx-arm64 + dependencies: textwrap3: '' + python: <3.12.0a0 url: https://conda.anaconda.org/conda-forge/noarch/ansiwrap-0.8.4-py_0.tar.bz2 hash: md5: f09557e2a7cbd2470a2ab6353000cebd @@ -402,13 +583,29 @@ package: - name: anyio version: 4.3.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - exceptiongroup: '>=1.0.2' + python: '>=3.8' + sniffio: '>=1.1' + typing_extensions: '>=4.1' idna: '>=2.8' + exceptiongroup: '>=1.0.2' + url: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + hash: + md5: ac95aa8ed65adfdde51132595c79aade + sha256: 86aca4a31c09f9b4dbdb332cd9a6a7dbab62ca734d3f832651c0ab59c6a7f52e + category: main + optional: false +- name: anyio + version: 4.3.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' sniffio: '>=1.1' typing_extensions: '>=4.1' + idna: '>=2.8' + exceptiongroup: '>=1.0.2' url: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda hash: md5: ac95aa8ed65adfdde51132595c79aade @@ -427,6 +624,18 @@ package: sha256: 7f2734233106b9ccfcf0bcd916cfdd39b59dcedf1a8832e6b1ec0048b6bc1ba2 category: main optional: false +- name: aplus + version: 0.11.0 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/aplus-0.11.0-py_1.tar.bz2 + hash: + md5: 7785bb1ae3202fb550f23699c6f89121 + sha256: 7f2734233106b9ccfcf0bcd916cfdd39b59dcedf1a8832e6b1ec0048b6bc1ba2 + category: main + optional: false - name: aplus version: 0.11.0 manager: conda @@ -439,6 +648,18 @@ package: sha256: 7f2734233106b9ccfcf0bcd916cfdd39b59dcedf1a8832e6b1ec0048b6bc1ba2 category: main optional: false +- name: appnope + version: 0.1.4 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_0.conda + hash: + md5: cc4834a9ee7cc49ce8d25177c47b10d8 + sha256: 45ae2d41f4a4dcf8707633d3d7ae376fc62f0c09b1d063c3049c3f6f8c911670 + category: main + optional: false - name: appnope version: 0.1.4 manager: conda @@ -468,11 +689,25 @@ package: - name: argon2-cffi version: 23.1.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + typing-extensions: '' argon2-cffi-bindings: '' python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda + hash: + md5: 3afef1f55a1366b4d3b6a0d92e2235e4 + sha256: 130766446f5507bd44df957b6b5c898a8bd98f024bb426ed6cb9ff1ad67fc677 + category: main + optional: false +- name: argon2-cffi + version: 23.1.0 + manager: conda + platform: osx-arm64 + dependencies: typing-extensions: '' + argon2-cffi-bindings: '' + python: '>=3.7' url: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_0.conda hash: md5: 3afef1f55a1366b4d3b6a0d92e2235e4 @@ -494,6 +729,20 @@ package: sha256: 63c6f462a18e655e6c5fe4e433ac94100bca1a076e5bb5382c2479ac7a42fd54 category: main optional: false +- name: argon2-cffi-bindings + version: 21.2.0 + manager: conda + platform: osx-64 + dependencies: + cffi: '>=1.0.1' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-21.2.0-py39hdc70f33_4.conda + hash: + md5: 3a0f682e6fdf53ff630c22cdd90ac0c1 + sha256: 47eb7e5826557364e7f71f3cb57d98486572c6af9bc4b1a9cb6c164504c09d92 + category: main + optional: false - name: argon2-cffi-bindings version: 21.2.0 manager: conda @@ -522,6 +771,20 @@ package: sha256: ff49825c7f9e29e09afa6284300810e7a8640d621740efb47c4541f4dc4969db category: main optional: false +- name: arrow + version: 1.3.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + python-dateutil: '>=2.7.0' + types-python-dateutil: '>=2.8.10' + url: https://conda.anaconda.org/conda-forge/noarch/arrow-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: b77d8c2313158e6e461ca0efb1c2c508 + sha256: ff49825c7f9e29e09afa6284300810e7a8640d621740efb47c4541f4dc4969db + category: main + optional: false - name: arrow version: 1.3.0 manager: conda @@ -548,6 +811,18 @@ package: sha256: 1354731d0eb1b406b66b3cb3d6ab74d7cbe9c0ec1d30b9e5afa366d4539e4687 category: main optional: false +- name: asn1crypto + version: 1.5.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/asn1crypto-1.5.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: f3f2ab3ce28979a24d1a988ba211eb9b + sha256: 1354731d0eb1b406b66b3cb3d6ab74d7cbe9c0ec1d30b9e5afa366d4539e4687 + category: main + optional: false - name: asn1crypto version: 1.5.1 manager: conda @@ -574,6 +849,20 @@ package: sha256: b73df723ff5fc3446b8d416e10e99a48cff3be668113b94a36a3154e9b495c7d category: main optional: false +- name: astroid + version: 3.1.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + typing-extensions: '>=4.0.0' + url: https://conda.anaconda.org/conda-forge/osx-64/astroid-3.1.0-py39h6e9494a_0.conda + hash: + md5: a6ecd75c6b8076b53152f11bb41ce9ca + sha256: b2bc5c7d074578beb2234a1a993ab1ba2983b41289c82e2a347fc66969646491 + category: main + optional: false - name: astroid version: 3.1.0 manager: conda @@ -601,6 +890,19 @@ package: sha256: 708168f026df19a0344983754d27d1f7b28bb21afc7b97a82f02c4798a3d2111 category: main optional: false +- name: asttokens + version: 2.4.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + six: '>=1.12.0' + url: https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda + hash: + md5: 5f25798dcefd8252ce5f9dc494d5f571 + sha256: 708168f026df19a0344983754d27d1f7b28bb21afc7b97a82f02c4798a3d2111 + category: main + optional: false - name: asttokens version: 2.4.1 manager: conda @@ -627,6 +929,19 @@ package: sha256: e5173d1ed038038e24c0623f0219dc587ee8663cf7efa737e7075128edbc6c60 category: main optional: false +- name: astunparse + version: 1.6.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + six: '>=1.6.1,<2.0' + url: https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 000b6f68a0bfaba800ced7500c11780f + sha256: e5173d1ed038038e24c0623f0219dc587ee8663cf7efa737e7075128edbc6c60 + category: main + optional: false - name: astunparse version: 1.6.3 manager: conda @@ -653,6 +968,19 @@ package: sha256: 7ed83731979fe5b046c157730e50af0e24454468bbba1ed8fc1a3107db5d7518 category: main optional: false +- name: async-lru + version: 2.0.4 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + typing_extensions: '>=4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.4-pyhd8ed1ab_0.conda + hash: + md5: 3d081de3a6ea9f894bbb585e8e3a4dcb + sha256: 7ed83731979fe5b046c157730e50af0e24454468bbba1ed8fc1a3107db5d7518 + category: main + optional: false - name: async-lru version: 2.0.4 manager: conda @@ -679,6 +1007,19 @@ package: sha256: bd8b698e7f037a9c6107216646f1191f4f7a7fc6da6c34d1a6d4c211bcca8979 category: main optional: false +- name: async-timeout + version: 4.0.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + typing-extensions: '>=3.6.5' + url: https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.3-pyhd8ed1ab_0.conda + hash: + md5: 3ce482ec3066e6d809dbbb1d1679f215 + sha256: bd8b698e7f037a9c6107216646f1191f4f7a7fc6da6c34d1a6d4c211bcca8979 + category: main + optional: false - name: async-timeout version: 4.0.3 manager: conda @@ -706,6 +1047,19 @@ package: sha256: 2f9314de13c1f0b54510a2afa0cdc02c0e3f828fccfc4277734f9590b11a65f1 category: main optional: false +- name: atk-1.0 + version: 2.38.0 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=14.0.4' + libglib: '>=2.74.1,<3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2 + hash: + md5: 5a538295f97a484ee332aacc131718b5 + sha256: 7af1f86cfc85b1e57547e2a81c069095545ff6a52f3f8e15184df954dce446dd + category: main + optional: false - name: atk-1.0 version: 2.38.0 manager: conda @@ -719,6 +1073,18 @@ package: sha256: d40f103467fd2fa426072691919fd135a4fed4a2b03cd12256ff0fee37a98249 category: main optional: false +- name: attr + version: 2.5.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + hash: + md5: d9c69a24ad678ffce24c6543a0176b00 + sha256: 82c13b1772c21fc4a17441734de471d3aabf82b61db9b11f4a1bd04a9c4ac324 + category: main + optional: false - name: attrs version: 23.2.0 manager: conda @@ -731,6 +1097,18 @@ package: sha256: 77c7d03bdb243a048fff398cedc74327b7dc79169ebe3b4c8448b0331ea55fea category: main optional: false +- name: attrs + version: 23.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + hash: + md5: 5e4c0743c70186509d1412e03c2d8dfa + sha256: 77c7d03bdb243a048fff398cedc74327b7dc79169ebe3b4c8448b0331ea55fea + category: main + optional: false - name: attrs version: 23.2.0 manager: conda @@ -760,6 +1138,22 @@ package: sha256: ef98131dbff55f482b0af10d17aa6c478e59987661cf3c22dddb30a441986aa5 category: main optional: false +- name: aws-c-auth + version: 0.7.11 + manager: conda + platform: osx-64 + dependencies: + aws-c-cal: '>=0.6.9,<0.6.10.0a0' + aws-c-common: '>=0.9.12,<0.9.13.0a0' + aws-c-http: '>=0.8.0,<0.8.1.0a0' + aws-c-io: '>=0.14.0,<0.14.1.0a0' + aws-c-sdkutils: '>=0.1.13,<0.1.14.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.7.11-h94c8779_1.conda + hash: + md5: 0c504fbf22cf8560e4cbe1a68d71bace + sha256: 2aa423f5c64c4df7a8a2d9b4f7fa915c4a7d6e01a018f04fbf4c4bd9b699ea50 + category: main + optional: false - name: aws-c-auth version: 0.7.11 manager: conda @@ -790,6 +1184,18 @@ package: sha256: d4f593f586378d7544900847b16d922a10c4d92aec7add6e3cb5dbe69965ab2f category: main optional: false +- name: aws-c-cal + version: 0.6.9 + manager: conda + platform: osx-64 + dependencies: + aws-c-common: '>=0.9.12,<0.9.13.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.6.9-he75d6b7_3.conda + hash: + md5: 56bca8b8f924ba21b26b9a0a158b93be + sha256: 772a3d9864658df5097c866633f14a78d88f21509157b09f9f8d6d0c04f09166 + category: main + optional: false - name: aws-c-cal version: 0.6.9 manager: conda @@ -814,6 +1220,17 @@ package: sha256: 22e7c9438f2fe3c46a1747efcaae4ab3a078714ff8992a6ec3c213f50b9d6704 category: main optional: false +- name: aws-c-common + version: 0.9.12 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.9.12-h10d778d_0.conda + hash: + md5: d04b9a72861e43eb78e0c133056e1655 + sha256: 21171720a36e233246ce9fa602b124b2fb4fffe97b906fa58bf7603d1af93789 + category: main + optional: false - name: aws-c-common version: 0.9.12 manager: conda @@ -838,6 +1255,18 @@ package: sha256: 0627434bcee61f94cf35d7719a395d4b7c9967f20bb877f1bd05868013a8a93c category: main optional: false +- name: aws-c-compression + version: 0.2.17 + manager: conda + platform: osx-64 + dependencies: + aws-c-common: '>=0.9.12,<0.9.13.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.2.17-h45babc2_8.conda + hash: + md5: 3b63d41977e0e390e42446372f5f1b03 + sha256: 19d3fb58b89ad3c1a2693ea81f98bca51843c7cdec7afaebc96b5013d73b2a91 + category: main + optional: false - name: aws-c-compression version: 0.2.17 manager: conda @@ -866,6 +1295,21 @@ package: sha256: a7cb50ccb2779d2934cae3a4fcc3d032a4525b63a464d6bd23957650381d633e category: main optional: false +- name: aws-c-event-stream + version: 0.4.1 + manager: conda + platform: osx-64 + dependencies: + aws-c-common: '>=0.9.12,<0.9.13.0a0' + aws-c-io: '>=0.14.0,<0.14.1.0a0' + aws-checksums: '>=0.1.17,<0.1.18.0a0' + libcxx: '>=15' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.4.1-h3600a39_2.conda + hash: + md5: d15584e342a31e978262627e6fd4063b + sha256: ef306832c033c46ab4b434ebf6e0a53a0f1a5023d6dbd6d31b90c2deea997a6c + category: main + optional: false - name: aws-c-event-stream version: 0.4.1 manager: conda @@ -897,6 +1341,21 @@ package: sha256: 5929ac8e3118146f9d23a5fdff54e2025501ee20a2cd9d8dd2b0115a60442dce category: main optional: false +- name: aws-c-http + version: 0.8.0 + manager: conda + platform: osx-64 + dependencies: + aws-c-cal: '>=0.6.9,<0.6.10.0a0' + aws-c-common: '>=0.9.12,<0.9.13.0a0' + aws-c-compression: '>=0.2.17,<0.2.18.0a0' + aws-c-io: '>=0.14.0,<0.14.1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.8.0-h19e0e28_2.conda + hash: + md5: 0714dff2eee274db27ad65d82b61374d + sha256: f6de21c9ade6ac83b418a5277025b9a0ec55fdcb9c34f8cf3a595122b9b5e43f + category: main + optional: false - name: aws-c-http version: 0.8.0 manager: conda @@ -927,6 +1386,19 @@ package: sha256: dd52e17a5be987b384c62574d90ddafbba68fa65b1f1344236b90c50ffed304d category: main optional: false +- name: aws-c-io + version: 0.14.0 + manager: conda + platform: osx-64 + dependencies: + aws-c-cal: '>=0.6.9,<0.6.10.0a0' + aws-c-common: '>=0.9.12,<0.9.13.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.14.0-h49ca7b5_1.conda + hash: + md5: f276e1df52ac6d261e5fa7e85d8cb02f + sha256: 27d102f01cc662f703ecc7cff9350526587e6fc57347ddc6d3df8db569b2e19b + category: main + optional: false - name: aws-c-io version: 0.14.0 manager: conda @@ -941,7 +1413,7 @@ package: category: main optional: false - name: aws-c-mqtt - version: 0.10.1 + version: 0.10.0 manager: conda platform: linux-64 dependencies: @@ -949,10 +1421,24 @@ package: aws-c-http: '>=0.8.0,<0.8.1.0a0' aws-c-io: '>=0.14.0,<0.14.1.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.1-h2b97f5f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.0-h2b97f5f_3.conda hash: - md5: 4cba7afc0f74a7cce3159c0bceb607c3 - sha256: 8edcb09a2d93c24320f517f837a0e46e98749b72dc7c9d55ce1fa0c4fa5db116 + md5: fd57022ff2e0bd1dcaf5399ad16763b0 + sha256: 2cd60ece1706c84b50be9ccca101a711d1905a3c38395c4ff1f9b5d1a689d207 + category: main + optional: false +- name: aws-c-mqtt + version: 0.10.1 + manager: conda + platform: osx-64 + dependencies: + aws-c-common: '>=0.9.12,<0.9.13.0a0' + aws-c-http: '>=0.8.0,<0.8.1.0a0' + aws-c-io: '>=0.14.0,<0.14.1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.10.1-h947eb33_0.conda + hash: + md5: 572658337a20c3a1e6ecf59f610be930 + sha256: 0f9a6de491c1c61ed1635a2814d6be52f041f2bf393c04a85a1da13ee862c90b category: main optional: false - name: aws-c-mqtt @@ -988,6 +1474,23 @@ package: sha256: b10ad88a1b1f7bf8bb999e06b4bb92e87fa9ede81a10492a373d354f4276a77b category: main optional: false +- name: aws-c-s3 + version: 0.4.9 + manager: conda + platform: osx-64 + dependencies: + aws-c-auth: '>=0.7.11,<0.7.12.0a0' + aws-c-cal: '>=0.6.9,<0.6.10.0a0' + aws-c-common: '>=0.9.12,<0.9.13.0a0' + aws-c-http: '>=0.8.0,<0.8.1.0a0' + aws-c-io: '>=0.14.0,<0.14.1.0a0' + aws-checksums: '>=0.1.17,<0.1.18.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.4.9-hee0ca28_0.conda + hash: + md5: b3d80d5c3ff89a4e04799caf71e8ec41 + sha256: 4d85b122da9250ad318922e09e63f2ed9efb2c394c9c5e38bcdc38a534f6db1a + category: main + optional: false - name: aws-c-s3 version: 0.4.9 manager: conda @@ -1018,6 +1521,18 @@ package: sha256: eb54d7573f9bbd1d01458203dd83e9c0c94c73be91af9142dd78e1a928be5b7e category: main optional: false +- name: aws-c-sdkutils + version: 0.1.13 + manager: conda + platform: osx-64 + dependencies: + aws-c-common: '>=0.9.12,<0.9.13.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.1.13-h45babc2_1.conda + hash: + md5: 4fd7f6b8225feb707d401eb18bfc0b2a + sha256: f780e3d3de1a4111b63ee7fad24046e2618c4086fcbdebca5cb75469fc7abfda + category: main + optional: false - name: aws-c-sdkutils version: 0.1.13 manager: conda @@ -1043,6 +1558,18 @@ package: sha256: c29ca126f9dd520cc749e8cb99b07168badb333b4b1b95577bb1788c432fe2d0 category: main optional: false +- name: aws-checksums + version: 0.1.17 + manager: conda + platform: osx-64 + dependencies: + aws-c-common: '>=0.9.12,<0.9.13.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.1.17-h45babc2_7.conda + hash: + md5: 356e6abc54e4a2e26027d179ddad29ce + sha256: 9f6e240ce66f3d120b6bc7d6ac9f3625c039a2f0b4132479ccc9798d08200e8f + category: main + optional: false - name: aws-checksums version: 0.1.17 manager: conda @@ -1066,15 +1593,36 @@ package: aws-c-event-stream: '>=0.4.1,<0.4.2.0a0' aws-c-http: '>=0.8.0,<0.8.1.0a0' aws-c-io: '>=0.14.0,<0.14.1.0a0' - aws-c-mqtt: '>=0.10.1,<0.10.2.0a0' + aws-c-mqtt: '>=0.10.0,<0.10.1.0a0' aws-c-s3: '>=0.4.9,<0.4.10.0a0' aws-c-sdkutils: '>=0.1.13,<0.1.14.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.0-h04327c0_8.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.0-hc5c3545_8.conda + hash: + md5: 504eb8e5c22244f9f2427c2313ac629a + sha256: a81784ae987c6cddb65fd28dfcea48bbe9dcfb82b08b9d1add7faa92cfb72b42 + category: main + optional: false +- name: aws-crt-cpp + version: 0.26.0 + manager: conda + platform: osx-64 + dependencies: + aws-c-auth: '>=0.7.11,<0.7.12.0a0' + aws-c-cal: '>=0.6.9,<0.6.10.0a0' + aws-c-common: '>=0.9.12,<0.9.13.0a0' + aws-c-event-stream: '>=0.4.1,<0.4.2.0a0' + aws-c-http: '>=0.8.0,<0.8.1.0a0' + aws-c-io: '>=0.14.0,<0.14.1.0a0' + aws-c-mqtt: '>=0.10.1,<0.10.2.0a0' + aws-c-s3: '>=0.4.9,<0.4.10.0a0' + aws-c-sdkutils: '>=0.1.13,<0.1.14.0a0' + libcxx: '>=15' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.26.0-he4637c3_8.conda hash: - md5: 8d2aeb8c24b47ad3ff87166957b216fd - sha256: 4bdef70ff6362d8a3350b4c4181d078e7b1f654a249d63294e9ab1c5a9ca72c7 + md5: 47d83636ee8f3876199ad1c3bf32a5b3 + sha256: 1eaea1b9e4ce6e39ffbdc9533e5f738d01b88b3219cb6a583d8a270a923abaec category: main optional: false - name: aws-crt-cpp @@ -1118,6 +1666,25 @@ package: sha256: 97b50927c4312ad80f3729669fa8b55195c066710e0af73c818c244df01b7604 category: main optional: false +- name: aws-sdk-cpp + version: 1.11.210 + manager: conda + platform: osx-64 + dependencies: + aws-c-common: '>=0.9.12,<0.9.13.0a0' + aws-c-event-stream: '>=0.4.1,<0.4.2.0a0' + aws-checksums: '>=0.1.17,<0.1.18.0a0' + aws-crt-cpp: '>=0.26.0,<0.26.1.0a0' + libcurl: '>=8.5.0,<9.0a0' + libcxx: '>=15' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.210-hf51409f_10.conda + hash: + md5: 10d6bd28caf5b216b9042d3fd891fab4 + sha256: fd4ff9b0422d104bde364fb0dc27f85eb64adce03fc866315120493e9409a64a + category: main + optional: false - name: aws-sdk-cpp version: 1.11.210 manager: conda @@ -1155,11 +1722,11 @@ package: - name: azure-core version: 1.30.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: python: '>=3.7' - requests: '>=2.21.0' six: '>=1.11.0' + requests: '>=2.21.0' typing-extensions: '>=4.6.0' url: https://conda.anaconda.org/conda-forge/noarch/azure-core-1.30.1-pyhd8ed1ab_0.conda hash: @@ -1167,10 +1734,25 @@ package: sha256: c70bef5f28ee9efead58f5a4992e2b1dc120c66d24e4c9678356c123e031553f category: main optional: false -- name: azure-core-cpp - version: 1.10.3 +- name: azure-core + version: 1.30.1 manager: conda - platform: linux-64 + platform: osx-arm64 + dependencies: + python: '>=3.7' + six: '>=1.11.0' + requests: '>=2.21.0' + typing-extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/noarch/azure-core-1.30.1-pyhd8ed1ab_0.conda + hash: + md5: 690b51eb2dbc703e8f9ba2f7ce298363 + sha256: c70bef5f28ee9efead58f5a4992e2b1dc120c66d24e4c9678356c123e031553f + category: main + optional: false +- name: azure-core-cpp + version: 1.10.3 + manager: conda + platform: linux-64 dependencies: libcurl: '>=8.5.0,<9.0a0' libgcc-ng: '>=12' @@ -1182,6 +1764,20 @@ package: sha256: 8740ccf0a22b13ddc7e6b0b577398fc3ec82aa8e020428aa13d69cf4c02bd0b6 category: main optional: false +- name: azure-core-cpp + version: 1.10.3 + manager: conda + platform: osx-64 + dependencies: + libcurl: '>=8.5.0,<9.0a0' + libcxx: '>=15' + openssl: '>=3.2.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.10.3-hbb1e571_1.conda + hash: + md5: 9c258c44761c173f7b21b4375a459496 + sha256: 9dd27a9a321ec113cd52f7e2cee268c44e31b7ce1963d34d9623d2119215652e + category: main + optional: false - name: azure-core-cpp version: 1.10.3 manager: conda @@ -1214,12 +1810,27 @@ package: - name: azure-datalake-store version: 0.0.51 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - adal: '>=0.4.2' + python: '' cffi: '' + requests: '>=2.20.0' + adal: '>=0.4.2' + url: https://conda.anaconda.org/conda-forge/noarch/azure-datalake-store-0.0.51-pyh9f0ad1d_0.tar.bz2 + hash: + md5: 0a6d240a3a8198dce8508a5409b4737e + sha256: 8ba71f78851d238d8dc9f469f88b2f5619c7f6f5d009a96bcbd8bd595ed85273 + category: main + optional: false +- name: azure-datalake-store + version: 0.0.51 + manager: conda + platform: osx-arm64 + dependencies: python: '' + cffi: '' requests: '>=2.20.0' + adal: '>=0.4.2' url: https://conda.anaconda.org/conda-forge/noarch/azure-datalake-store-0.0.51-pyh9f0ad1d_0.tar.bz2 hash: md5: 0a6d240a3a8198dce8508a5409b4737e @@ -1245,13 +1856,29 @@ package: - name: azure-identity version: 1.15.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - azure-core: <2.0.0,>=1.23.0 + python: '>=3.7' cryptography: '>=2.5' - msal: <2.0.0,>=1.24.0 + azure-core: <2.0.0,>=1.23.0 msal_extensions: <2.0.0,>=0.3.0 + msal: <2.0.0,>=1.24.0 + url: https://conda.anaconda.org/conda-forge/noarch/azure-identity-1.15.0-pyhd8ed1ab_0.conda + hash: + md5: d1ef208ae2a355e5bb9cdce337644ce9 + sha256: a7a80ce603b0b2af0670e676b0ce96cc3fddd7c59f8f2c4d5767f5cfda7a74e9 + category: main + optional: false +- name: azure-identity + version: 1.15.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + cryptography: '>=2.5' + azure-core: <2.0.0,>=1.23.0 + msal_extensions: <2.0.0,>=0.3.0 + msal: <2.0.0,>=1.24.0 url: https://conda.anaconda.org/conda-forge/noarch/azure-identity-1.15.0-pyhd8ed1ab_0.conda hash: md5: d1ef208ae2a355e5bb9cdce337644ce9 @@ -1277,13 +1904,29 @@ package: - name: azure-storage-blob version: 12.19.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - azure-core: <2.0.0,>=1.28.0 + python: '>=3.7' + typing-extensions: '>=4.3.0' cryptography: '>=2.1.4' isodate: '>=0.6.1' + azure-core: <2.0.0,>=1.28.0 + url: https://conda.anaconda.org/conda-forge/noarch/azure-storage-blob-12.19.1-pyhd8ed1ab_0.conda + hash: + md5: 57fdaf60fb362bb31c685b0f5e2b1f3a + sha256: fe43dcceec8cea87f1c5fcf3c155fb0e5c0c1a9d3656112ec4da232c053edaca + category: main + optional: false +- name: azure-storage-blob + version: 12.19.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' typing-extensions: '>=4.3.0' + cryptography: '>=2.1.4' + isodate: '>=0.6.1' + azure-core: <2.0.0,>=1.28.0 url: https://conda.anaconda.org/conda-forge/noarch/azure-storage-blob-12.19.1-pyhd8ed1ab_0.conda hash: md5: 57fdaf60fb362bb31c685b0f5e2b1f3a @@ -1305,6 +1948,21 @@ package: sha256: ea323e7028590b1877af92b76bc3cda52db5a1d90b8321ec91b9db0689f07fb3 category: main optional: false +- name: azure-storage-blobs-cpp + version: 12.10.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + azure-core-cpp: '>=1.10.3,<1.10.4.0a0' + azure-storage-common-cpp: '>=12.5.0,<12.5.1.0a0' + libcxx: '>=16.0.6' + url: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.10.0-he51d815_0.conda + hash: + md5: 49b100390f08fbbf2219b4e220f79983 + sha256: 2b20c7884bebc511a7433802a81b7fc95a9aae957a760779a1699f087ffdf018 + category: main + optional: false - name: azure-storage-blobs-cpp version: 12.10.0 manager: conda @@ -1336,6 +1994,22 @@ package: sha256: 68e177ae983d63323b9bd1c1528776bb0e03d5d5aef0addba97aed4537e649a6 category: main optional: false +- name: azure-storage-common-cpp + version: 12.5.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + azure-core-cpp: '>=1.10.3,<1.10.4.0a0' + libcxx: '>=16.0.6' + libxml2: '>=2.12.1,<3.0.0a0' + openssl: '>=3.2.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.5.0-hf4badfb_2.conda + hash: + md5: 277020b2f0245d1d5a0a3bb0e921c069 + sha256: b9336e9cbbf7a26f5cfab7dca2aec8037549efe8c8d6022e07b38f8840bbc608 + category: main + optional: false - name: azure-storage-common-cpp version: 12.5.0 manager: conda @@ -1369,11 +2043,25 @@ package: - name: babel version: 2.14.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - python: '>=3.7' + setuptools: '' pytz: '' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda + hash: + md5: 9669586875baeced8fc30c0826c3270e + sha256: 8584e3da58e92b72641c89ff9b98c51f0d5dbe76e527867804cbdf03ac91d8e6 + category: main + optional: false +- name: babel + version: 2.14.0 + manager: conda + platform: osx-arm64 + dependencies: setuptools: '' + pytz: '' + python: '>=3.7' url: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda hash: md5: 9669586875baeced8fc30c0826c3270e @@ -1394,6 +2082,19 @@ package: sha256: 72c5a63962463b0d7c7c95db33266c8dbcdd72cd8ae9ca81d42f253f9d80cdf3 category: main optional: false +- name: bcrypt + version: 4.1.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/bcrypt-4.1.2-py39h3f9c672_0.conda + hash: + md5: e323c9439e1c508bd341839aac2972ce + sha256: cd1fa9468e71bd3d62c7c68833ac788d3bb51090993480ac606016bc99af2928 + category: main + optional: false - name: bcrypt version: 4.1.2 manager: conda @@ -1420,6 +2121,19 @@ package: sha256: 7b05b2d0669029326c623b9df7a29fa49d1982a9e7e31b2fea34b4c9a4a72317 category: main optional: false +- name: beautifulsoup4 + version: 4.12.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + soupsieve: '>=1.2' + url: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda + hash: + md5: 332493000404d8411859539a5a630865 + sha256: 7b05b2d0669029326c623b9df7a29fa49d1982a9e7e31b2fea34b4c9a4a72317 + category: main + optional: false - name: beautifulsoup4 version: 4.12.3 manager: conda @@ -1449,10 +2163,23 @@ package: - name: binaryornot version: 0.4.4 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '' chardet: '' + url: https://conda.anaconda.org/conda-forge/noarch/binaryornot-0.4.4-py_1.tar.bz2 + hash: + md5: a556fa60840fcb9dd739d186bfd252f7 + sha256: 8f65c16a9f85285e1f704a26d4c5ced25f46544f5cc20dc8a4aebd7796f8011a + category: main + optional: false +- name: binaryornot + version: 0.4.4 + manager: conda + platform: osx-arm64 + dependencies: python: '' + chardet: '' url: https://conda.anaconda.org/conda-forge/noarch/binaryornot-0.4.4-py_1.tar.bz2 hash: md5: a556fa60840fcb9dd739d186bfd252f7 @@ -1460,7 +2187,7 @@ package: category: main optional: false - name: black - version: 24.2.0 + version: 24.3.0 manager: conda platform: linux-64 dependencies: @@ -1473,14 +2200,34 @@ package: python_abi: 3.9.* tomli: '>=1.1.0' typing_extensions: '>=4.0.1' - url: https://conda.anaconda.org/conda-forge/linux-64/black-24.2.0-py39hf3d152e_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/black-24.3.0-py39hf3d152e_0.conda + hash: + md5: 831bcbaf689b20fc85bf87eab3b5ee29 + sha256: 7a4d9a43600c24ac29845689e24465b6c15819ad53d35e7120197aaf0badd1bb + category: main + optional: false +- name: black + version: 24.3.0 + manager: conda + platform: osx-64 + dependencies: + click: '>=8.0.0' + mypy_extensions: '>=0.4.3' + packaging: '>=22.0' + pathspec: '>=0.9' + platformdirs: '>=2' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + tomli: '>=1.1.0' + typing_extensions: '>=4.0.1' + url: https://conda.anaconda.org/conda-forge/osx-64/black-24.3.0-py39h6e9494a_0.conda hash: - md5: 8060f38a7e9ced7e0ff82adfa5c01b65 - sha256: 71539f1f61a9a3c0ceceae79ed7460e901bf0294599dbcd170496e8671e5d3b8 + md5: d1fd38166a4edfc6b81ca209ac7393d2 + sha256: 03d2486854754203540352e2ff94d9ddc4a25674c450f2a3cacaa682faf23b90 category: main optional: false - name: black - version: 24.2.0 + version: 24.3.0 manager: conda platform: osx-arm64 dependencies: @@ -1493,10 +2240,10 @@ package: python_abi: 3.9.* tomli: '>=1.1.0' typing_extensions: '>=4.0.1' - url: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.2.0-py39h2804cbe_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.3.0-py39h2804cbe_0.conda hash: - md5: ea3b2d9d3b5d32361056e8c0eed7153c - sha256: 07397f3989ee6c50538f9c98b8b5ab7256ded48bfebe513c7c831945f0689364 + md5: c86e0fc313a494cc855e80c02959fbff + sha256: 8e14d423a9613ad2763949d9ecc8c0e740a46dfac2dba7307f2c6790796c7f49 category: main optional: false - name: blake3 @@ -1514,6 +2261,20 @@ package: sha256: 7a5db684002e9e01c7387ba19a1e7954d9ef9f91656d3cd9f4cdf5250f0a1d5c category: main optional: false +- name: blake3 + version: 0.3.3 + manager: conda + platform: osx-64 + dependencies: + numpy: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/blake3-0.3.3-py39hf33989b_2.conda + hash: + md5: 00f9bcdfe7f207893d57fbf3a0d55cef + sha256: c8072db21e0e7b167b451cf2456c3482ad3409314b229104b1fdbab35af073a7 + category: main + optional: false - name: blake3 version: 0.3.3 manager: conda @@ -1547,13 +2308,29 @@ package: - name: bleach version: 6.1.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + setuptools: '' packaging: '' + webencodings: '' python: '>=3.6' - setuptools: '' six: '>=1.9.0' + url: https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda + hash: + md5: 0ed9d7c0e9afa7c025807a9a8136ea3e + sha256: 845e77ef495376c5c3c328ccfd746ca0ef1978150cae8eae61a300fe7755fb08 + category: main + optional: false +- name: bleach + version: 6.1.0 + manager: conda + platform: osx-arm64 + dependencies: + setuptools: '' + packaging: '' webencodings: '' + python: '>=3.6' + six: '>=1.9.0' url: https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda hash: md5: 0ed9d7c0e9afa7c025807a9a8136ea3e @@ -1572,6 +2349,18 @@ package: sha256: c8d72c2af4f57898dfd5e4c62ae67f7fea1490a37c8b6855460a170d61591177 category: main optional: false +- name: blinker + version: 1.7.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/blinker-1.7.0-pyhd8ed1ab_0.conda + hash: + md5: 550da20b2c2e38be9cc44bb819fda5d5 + sha256: c8d72c2af4f57898dfd5e4c62ae67f7fea1490a37c8b6855460a170d61591177 + category: main + optional: false - name: blinker version: 1.7.0 manager: conda @@ -1601,6 +2390,22 @@ package: sha256: e2b15b017775d1bda8edbb1bc48e545e45364edefa4d926732fc5488cc600731 category: main optional: false +- name: blosc + version: 1.21.5 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + snappy: '>=1.1.10,<2.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/blosc-1.21.5-heccf04b_0.conda + hash: + md5: 3003fa6dd18769db1a616982dcee5b40 + sha256: db629047f1721d5a6e3bd41b07c1a3bacd0dee70f4063b61db2aa46f19a0b8b4 + category: main + optional: false - name: blosc version: 1.21.5 manager: conda @@ -1641,18 +2446,39 @@ package: - name: bokeh version: 3.4.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - contourpy: '>=1.2' - jinja2: '>=2.9' + python: '>=3.9' numpy: '>=1.16' - packaging: '>=16.8' + pyyaml: '>=3.10' pandas: '>=1.2' pillow: '>=7.1.0' + packaging: '>=16.8' + jinja2: '>=2.9' + tornado: '>=6.2' + xyzservices: '>=2021.09.1' + contourpy: '>=1.2' + url: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.0-pyhd8ed1ab_0.conda + hash: + md5: eebbbfdb7eb885ddc751c790c3d0ad64 + sha256: a980687100456202425af0936185ef95c53309044e271daa60d2eeb009410f73 + category: main + optional: false +- name: bokeh + version: 3.4.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.9' + numpy: '>=1.16' pyyaml: '>=3.10' + pandas: '>=1.2' + pillow: '>=7.1.0' + packaging: '>=16.8' + jinja2: '>=2.9' tornado: '>=6.2' xyzservices: '>=2021.09.1' + contourpy: '>=1.2' url: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.0-pyhd8ed1ab_0.conda hash: md5: eebbbfdb7eb885ddc751c790c3d0ad64 @@ -1677,11 +2503,26 @@ package: - name: botocore version: 1.34.51 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - jmespath: '>=0.7.1,<2.0.0' python: '>=3.8' python-dateutil: '>=2.1,<3.0.0' + jmespath: '>=0.7.1,<2.0.0' + urllib3: '>=1.25.4,<1.27' + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.34.51-pyge38_1234567_0.conda + hash: + md5: 79fc60a0a40d6254f67da7ce274c30a8 + sha256: b264cf2547f0730a4c3efaa771533be790a76b35e3dd5f0c19cc7f7a6aad6151 + category: main + optional: false +- name: botocore + version: 1.34.51 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.8' + python-dateutil: '>=2.1,<3.0.0' + jmespath: '>=0.7.1,<2.0.0' urllib3: '>=1.25.4,<1.27' url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.34.51-pyge38_1234567_0.conda hash: @@ -1705,10 +2546,23 @@ package: - name: branca version: 0.7.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' jinja2: '>=3' + url: https://conda.anaconda.org/conda-forge/noarch/branca-0.7.1-pyhd8ed1ab_0.conda + hash: + md5: 35fa1bfd27c4d4c3cd46501a9ca7bd78 + sha256: 4053ce4389a524e226eea020e2e507335e908a45d324b4f48d4b4407b17c88e3 + category: main + optional: false +- name: branca + version: 0.7.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + jinja2: '>=3' url: https://conda.anaconda.org/conda-forge/noarch/branca-0.7.1-pyhd8ed1ab_0.conda hash: md5: 35fa1bfd27c4d4c3cd46501a9ca7bd78 @@ -1730,6 +2584,20 @@ package: sha256: f2d918d351edd06c55a6c2d84b488fe392f85ea018ff227daac07db22b408f6b category: main optional: false +- name: brotli + version: 1.1.0 + manager: conda + platform: osx-64 + dependencies: + brotli-bin: 1.1.0 + libbrotlidec: 1.1.0 + libbrotlienc: 1.1.0 + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h0dc2134_1.conda + hash: + md5: 9272dd3b19c4e8212f8542cefd5c3d67 + sha256: 4bf66d450be5d3f9ebe029b50f818d088b1ef9666b1f19e90c85479c77bbdcde + category: main + optional: false - name: brotli version: 1.1.0 manager: conda @@ -1758,6 +2626,19 @@ package: sha256: a641abfbaec54f454c8434061fffa7fdaa9c695e8a5a400ed96b4f07c0c00677 category: main optional: false +- name: brotli-bin + version: 1.1.0 + manager: conda + platform: osx-64 + dependencies: + libbrotlidec: 1.1.0 + libbrotlienc: 1.1.0 + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h0dc2134_1.conda + hash: + md5: ece565c215adcc47fc1db4e651ee094b + sha256: 7ca3cfb4c5df314ed481301335387ab2b2ee651e2c74fbb15bacc795c664a5f1 + category: main + optional: false - name: brotli-bin version: 1.1.0 manager: conda @@ -1786,6 +2667,20 @@ package: sha256: e22afb19527a93da24c1108c3e91532811f9c3df64a9473989faf332c98af082 category: main optional: false +- name: brotli-python + version: 1.1.0 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py39h840bb9f_1.conda + hash: + md5: bf1edb07835e15685718843f7e71bab1 + sha256: e19de8f5d9e1fe650b49eff6b0111eebd3b98368b5ae82733b90ec0abea5062a + category: main + optional: false - name: brotli-python version: 1.1.0 manager: conda @@ -1812,6 +2707,17 @@ package: sha256: 242c0c324507ee172c0e0dd2045814e746bb303d1eb78870d182ceb0abc726a8 category: main optional: false +- name: bzip2 + version: 1.0.8 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda + hash: + md5: 6097a6ca9ada32699b5fc4312dd6ef18 + sha256: 61fb2b488928a54d9472113e1280b468a309561caa54f33825a3593da390b242 + category: main + optional: false - name: bzip2 version: 1.0.8 manager: conda @@ -1824,26 +2730,37 @@ package: category: main optional: false - name: c-ares - version: 1.27.0 + version: 1.28.1 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda + hash: + md5: dcde58ff9a1f30b0037a2315d1846d1f + sha256: cb25063f3342149c7924b21544109696197a9d774f1407567477d4f3026bf38a + category: main + optional: false +- name: c-ares + version: 1.28.1 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.28.1-h10d778d_0.conda hash: - md5: f6afff0e9ee08d2f1b897881a4f38cdb - sha256: 2a5866b19d28cb963fab291a62ff1c884291b9d6f59de14643e52f103e255749 + md5: d5eb7992227254c0e9a0ce71151f0079 + sha256: fccd7ad7e3dfa6b19352705b33eb738c4c55f79f398e106e6cf03bab9415595a category: main optional: false - name: c-ares - version: 1.27.0 + version: 1.28.1 manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.27.0-h93a5062_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.28.1-h93a5062_0.conda hash: - md5: d3579ba506791b1f8f8a16cfc2885326 - sha256: a168e53ee462980cd78b324e055afdd00080ded378ca974969a0917eb4ae1ccb + md5: 04f776a6139f7eafc2f38668570eb7db + sha256: 2fc553d7a75e912efbdd6b82cd7916cc9cb2773e6cd873b77e02d631dd7be698 category: main optional: false - name: ca-certificates @@ -1857,6 +2774,17 @@ package: sha256: 91d81bfecdbb142c15066df70cc952590ae8991670198f92c66b62019b251aeb category: main optional: false +- name: ca-certificates + version: 2024.2.2 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda + hash: + md5: f2eacee8c33c43692f1ccfd33d0f50b1 + sha256: 54a794aedbb4796afeabdf54287b06b1d27f7b13b3814520925f4c2c80f58ca9 + category: main + optional: false - name: ca-certificates version: 2024.2.2 manager: conda @@ -1880,6 +2808,18 @@ package: sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 category: main optional: false +- name: cached-property + version: 1.5.2 + manager: conda + platform: osx-64 + dependencies: + cached_property: '>=1.5.2,<1.5.3.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + hash: + md5: 9b347a7ec10940d3f7941ff6c460b551 + sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 + category: main + optional: false - name: cached-property version: 1.5.2 manager: conda @@ -1904,6 +2844,18 @@ package: sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 category: main optional: false +- name: cached_property + version: 1.5.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + hash: + md5: 576d629e47797577ab0f1b351297ef4a + sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 + category: main + optional: false - name: cached_property version: 1.5.2 manager: conda @@ -1928,6 +2880,18 @@ package: sha256: 561b860cba68da76cab8c6504bb5bfb4756ecb2ec9f124d0c17e76caad4f6dfd category: main optional: false +- name: cachetools + version: 5.3.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda + hash: + md5: cd4c26c702a9bcdc70ff05b609ddacbe + sha256: 561b860cba68da76cab8c6504bb5bfb4756ecb2ec9f124d0c17e76caad4f6dfd + category: main + optional: false - name: cachetools version: 5.3.3 manager: conda @@ -1968,6 +2932,28 @@ package: sha256: 142e2639a5bc0e99c44d76f4cc8dce9c6a2d87330c4beeabb128832cd871a86e category: main optional: false +- name: cairo + version: 1.18.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freetype: '>=2.12.1,<3.0a0' + icu: '>=73.2,<74.0a0' + libcxx: '>=16.0.6' + libglib: '>=2.78.0,<3.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + pixman: '>=0.42.2,<1.0a0' + zlib: '' + url: https://conda.anaconda.org/conda-forge/osx-64/cairo-1.18.0-h99e66fa_0.conda + hash: + md5: 13f830b1bf46018f7062d1b798d53eca + sha256: f8d1142cf244eadcbc44e8ca2266aa61a05b6cda5571f9b745ba32c7ebbfdfba + category: main + optional: false - name: cairo version: 1.18.0 manager: conda @@ -2002,6 +2988,18 @@ package: sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 category: main optional: false +- name: certifi + version: 2024.2.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + hash: + md5: 0876280e409658fc6f9e75d035960333 + sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 + category: main + optional: false - name: certifi version: 2024.2.2 manager: conda @@ -2030,6 +3028,21 @@ package: sha256: 1536a2ca65caaf568bbdfe75aff8e12cb0e0507587b25af3b532a8bd22cb3ddb category: main optional: false +- name: cffi + version: 1.16.0 + manager: conda + platform: osx-64 + dependencies: + libffi: '>=3.4,<4.0a0' + pycparser: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.16.0-py39h18ef598_0.conda + hash: + md5: c31ac48f93f773fd27e99f113cfffb98 + sha256: 26f365b87864cac155aa966a979d8cb17195032c05b61041d3d0dabd43ba0c0b + category: main + optional: false - name: cffi version: 1.16.0 manager: conda @@ -2057,6 +3070,18 @@ package: sha256: fbc03537a27ef756162c49b1d0608bf7ab12fa5e38ceb8563d6f4859e835ac5c category: main optional: false +- name: cfgv + version: 3.3.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6.1' + url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: ebb5f5f7dc4f1a3780ef7ea7738db08c + sha256: fbc03537a27ef756162c49b1d0608bf7ab12fa5e38ceb8563d6f4859e835ac5c + category: main + optional: false - name: cfgv version: 3.3.1 manager: conda @@ -2086,6 +3111,22 @@ package: sha256: b91003bff71351a0132c84d69fbb5afcfa90e57d83f76a180c6a5a0289099fb1 category: main optional: false +- name: cfitsio + version: 4.3.1 + manager: conda + platform: osx-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libcurl: '>=8.4.0,<9.0a0' + libgfortran: 5.* + libgfortran5: '>=13.2.0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/cfitsio-4.3.1-h60fb419_0.conda + hash: + md5: 03ab895afe3804b527c12193a9612cac + sha256: 5bd157478529ff4d05b8e8654de0580609177252eb11ecf5201b831effeeb2ec + category: main + optional: false - name: cfitsio version: 4.3.1 manager: conda @@ -2115,6 +3156,19 @@ package: sha256: 1733218d1da1ce2f1e9a0d28b6e9c62fe32c3b86c5bd7a0cdceb2f3a4b03cfa9 category: main optional: false +- name: chardet + version: 5.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/chardet-5.2.0-py39h6e9494a_1.conda + hash: + md5: ad452e3e1b22c65052c17219c7a868e6 + sha256: 3af30427ac7a2f32f12ebc948beb29f9990005249172ed9803186945dea7920f + category: main + optional: false - name: chardet version: 5.2.0 manager: conda @@ -2140,6 +3194,18 @@ package: sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 category: main optional: false +- name: charset-normalizer + version: 3.3.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + hash: + md5: 7f4a9e3fcff3f6356ae99244a014da6a + sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 + category: main + optional: false - name: charset-normalizer version: 3.3.2 manager: conda @@ -2165,6 +3231,19 @@ package: sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec category: main optional: false +- name: click + version: 8.1.7 + manager: conda + platform: osx-64 + dependencies: + __unix: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + hash: + md5: f3ad426304898027fc619827ff428eca + sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec + category: main + optional: false - name: click version: 8.1.7 manager: conda @@ -2194,10 +3273,23 @@ package: - name: click-plugins version: 1.1.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '' click: '>=3.0' + url: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2 + hash: + md5: 4fd2c6b53934bd7d96d1f3fdaf99b79f + sha256: ddef6e559dde6673ee504b0e29dd814d36e22b6b9b1f519fa856ee268905bf92 + category: main + optional: false +- name: click-plugins + version: 1.1.1 + manager: conda + platform: osx-arm64 + dependencies: python: '' + click: '>=3.0' url: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2 hash: md5: 4fd2c6b53934bd7d96d1f3fdaf99b79f @@ -2220,10 +3312,23 @@ package: - name: cligj version: 0.7.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: <4.0 click: '>=4.0' + url: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2 + hash: + md5: a29b7c141d6b2de4bb67788a5f107734 + sha256: 97bd58f0cfcff56a0bcda101e26f7d936625599325beba3e3a1fa512dd7fc174 + category: main + optional: false +- name: cligj + version: 0.7.2 + manager: conda + platform: osx-arm64 + dependencies: python: <4.0 + click: '>=4.0' url: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2 hash: md5: a29b7c141d6b2de4bb67788a5f107734 @@ -2242,6 +3347,18 @@ package: sha256: f0c2fd0e842899a05ddd7b147fb26424adf58be0e8e54e5bc68b8f7e67d05dcd category: main optional: false +- name: cloudpickle + version: 2.2.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda + hash: + md5: b325bfc4cff7d7f8a868f1f7ecc4ed16 + sha256: f0c2fd0e842899a05ddd7b147fb26424adf58be0e8e54e5bc68b8f7e67d05dcd + category: main + optional: false - name: cloudpickle version: 2.2.1 manager: conda @@ -2269,7 +3386,7 @@ package: - name: codespell version: 2.2.6 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: python: '>=3.8' url: https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.6-pyhd8ed1ab_0.conda @@ -2278,14 +3395,38 @@ package: sha256: b49d5482fbdeeb610275f6e7def3ee1409e6f2305b0eae4d37e23ada8b01e989 category: main optional: false -- name: colorama - version: 0.4.6 +- name: codespell + version: 2.2.6 manager: conda - platform: linux-64 + platform: osx-arm64 dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - hash: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.6-pyhd8ed1ab_0.conda + hash: + md5: a206349b7bb7475ae580f987cb425bdd + sha256: b49d5482fbdeeb610275f6e7def3ee1409e6f2305b0eae4d37e23ada8b01e989 + category: main + optional: false +- name: colorama + version: 0.4.6 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 3faab06a954c2a04039983f2c4a50d99 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + category: main + optional: false +- name: colorama + version: 0.4.6 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + hash: md5: 3faab06a954c2a04039983f2c4a50d99 sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 category: main @@ -2315,6 +3456,19 @@ package: sha256: e923acf02708a8a0b591f3bce4bdc11c8e63b73198b99b35fe6cd96bfb6a0dbe category: main optional: false +- name: comm + version: 0.2.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + traitlets: '>=5.3' + url: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda + hash: + md5: 948d84721b578d426294e17a02e24cbb + sha256: e923acf02708a8a0b591f3bce4bdc11c8e63b73198b99b35fe6cd96bfb6a0dbe + category: main + optional: false - name: comm version: 0.2.2 manager: conda @@ -2344,10 +3498,23 @@ package: - name: commonmark version: 0.9.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '' future: '>=0.14.0' + url: https://conda.anaconda.org/conda-forge/noarch/commonmark-0.9.1-py_0.tar.bz2 + hash: + md5: 6aa0173c14befcd577ded130cf6f22f5 + sha256: 10577f82bafd5d37f0c3f2122272d0dc1f2d133655c2bdd1a3cd5f910d0bd4c5 + category: main + optional: false +- name: commonmark + version: 0.9.1 + manager: conda + platform: osx-arm64 + dependencies: python: '' + future: '>=0.14.0' url: https://conda.anaconda.org/conda-forge/noarch/commonmark-0.9.1-py_0.tar.bz2 hash: md5: 6aa0173c14befcd577ded130cf6f22f5 @@ -2366,6 +3533,18 @@ package: sha256: e01107b458dd21f1915dcd9901f5ecc7d918a8157d9a9802020286ed83f9847e category: main optional: false +- name: configparser + version: 6.0.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/configparser-6.0.1-pyhd8ed1ab_0.conda + hash: + md5: 2a24e68637e51e2adf001e9d0af848b1 + sha256: e01107b458dd21f1915dcd9901f5ecc7d918a8157d9a9802020286ed83f9847e + category: main + optional: false - name: configparser version: 6.0.1 manager: conda @@ -2394,6 +3573,22 @@ package: sha256: 7a85421667d97132c5d23575da63c2da850775c81832607e56bfd881c9750f3a category: main optional: false +- name: contourpy + version: 1.2.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + numpy: '>=1.20,<2' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.0-py39h6be1789_0.conda + hash: + md5: f612db80986ecdc867662b9dc4e46f11 + sha256: cd0808189a10f45b41ef8eee2f373ae870673b0fe49d17ecee4e401445f17ea6 + category: main + optional: false - name: contourpy version: 1.2.0 manager: conda @@ -2433,17 +3628,37 @@ package: - name: cookiecutter version: 2.6.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + rich: '' arrow: '' + python: '>=3.7' + pyyaml: '>=5.3.1' + requests: '>=2.23.0' + python-slugify: '>=4.0.0' binaryornot: '>=0.4.4' - click: '>=7.0,<9.0.0' jinja2: '>=2.7,<4.0.0' + click: '>=7.0,<9.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/cookiecutter-2.6.0-pyhca7485f_0.conda + hash: + md5: d6260b53b9db90017321af0b45cc00da + sha256: 5bed5805127757a4f03231eb7fe971cfe3c3411eeef036e670c41bfd8a42d91d + category: main + optional: false +- name: cookiecutter + version: 2.6.0 + manager: conda + platform: osx-arm64 + dependencies: + rich: '' + arrow: '' python: '>=3.7' - python-slugify: '>=4.0.0' pyyaml: '>=5.3.1' requests: '>=2.23.0' - rich: '' + python-slugify: '>=4.0.0' + binaryornot: '>=0.4.4' + jinja2: '>=2.7,<4.0.0' + click: '>=7.0,<9.0.0' url: https://conda.anaconda.org/conda-forge/noarch/cookiecutter-2.6.0-pyhca7485f_0.conda hash: md5: d6260b53b9db90017321af0b45cc00da @@ -2451,31 +3666,45 @@ package: category: main optional: false - name: croniter - version: 2.0.2 + version: 2.0.3 manager: conda platform: linux-64 dependencies: python: '>=3.7' python-dateutil: '' pytz: '>2021.1' - url: https://conda.anaconda.org/conda-forge/noarch/croniter-2.0.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/croniter-2.0.3-pyhd8ed1ab_0.conda hash: - md5: 81e82a2922ee960cc5e324b0102174d0 - sha256: e235c57e6070f5d2b161f7b496d00cb9e75796c5234cf62aff9e04258302940e + md5: e78f1f7d43de7213744075a90881c789 + sha256: eeed424fd485c23b19db8df76cbd21987af4190036292f5b7372745e8ad9f216 category: main optional: false - name: croniter - version: 2.0.2 + version: 2.0.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python-dateutil: '' python: '>=3.7' + pytz: '>2021.1' + url: https://conda.anaconda.org/conda-forge/noarch/croniter-2.0.3-pyhd8ed1ab_0.conda + hash: + md5: e78f1f7d43de7213744075a90881c789 + sha256: eeed424fd485c23b19db8df76cbd21987af4190036292f5b7372745e8ad9f216 + category: main + optional: false +- name: croniter + version: 2.0.3 + manager: conda + platform: osx-arm64 + dependencies: python-dateutil: '' + python: '>=3.7' pytz: '>2021.1' - url: https://conda.anaconda.org/conda-forge/noarch/croniter-2.0.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/croniter-2.0.3-pyhd8ed1ab_0.conda hash: - md5: 81e82a2922ee960cc5e324b0102174d0 - sha256: e235c57e6070f5d2b161f7b496d00cb9e75796c5234cf62aff9e04258302940e + md5: e78f1f7d43de7213744075a90881c789 + sha256: eeed424fd485c23b19db8df76cbd21987af4190036292f5b7372745e8ad9f216 category: main optional: false - name: cryptography @@ -2494,6 +3723,22 @@ package: sha256: dbde9bd3cc0400cdefbdfe7a41ddb7cb33efc472dbd291485308eb5f5830f1a9 category: main optional: false +- name: cryptography + version: 42.0.5 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.12' + cffi: '>=1.12' + openssl: '>=3.2.1,<4.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/cryptography-42.0.5-py39h915638b_0.conda + hash: + md5: ca39a462c79476c4237b8abbe82e5584 + sha256: 798d6f7b12397ea3bbf1e298a7bad6dc82af0bccf8f4b4acc2917e99bcc877a5 + category: main + optional: false - name: cryptography version: 42.0.5 manager: conda @@ -2509,46 +3754,43 @@ package: sha256: 4ce400c11245a79feb9fea93e8179379c48af6e755347f3c91181c5fd54423e9 category: main optional: false -- name: cuda-version - version: '11.8' +- name: cuda-cudart + version: 12.4.99 manager: conda platform: linux-64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda + dependencies: + __glibc: '>=2.17,<3.0.a0' + cuda-cudart_linux-64: 12.4.99 + cuda-version: '>=12.4,<12.5.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.99-hd3aeb46_0.conda hash: - md5: 670f0e1593b8c1d84f57ad5fe5256799 - sha256: 53e0ffc14ea2f2b8c12320fd2aa38b01112763eba851336ff5953b436ae61259 + md5: 4d229c1bd27b08f176d35dd2b6fa3e43 + sha256: a98f120b8578e9d5dc6997e49caca972147d22e69760c432ca24b1f16208e5b0 category: main optional: false -- name: cudatoolkit - version: 11.8.0 +- name: cuda-cudart_linux-64 + version: 12.4.99 manager: conda platform: linux-64 dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/cudatoolkit-11.8.0-h4ba93d1_13.conda + cuda-version: '>=12.4,<12.5.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.99-h59595ed_0.conda hash: - md5: eb43f5f1f16e2fad2eba22219c3e499b - sha256: 1797bacaf5350f272413c7f50787c01aef0e8eb955df0f0db144b10be2819752 + md5: 2c184d2ca9f4e01b501103b42b895016 + sha256: dc8734b59e2765fdcf8c7765193af2fc5e8120ca1a47b9b2c13eb8789c20a781 category: main optional: false -- name: cudnn - version: 8.9.7.29 +- name: cuda-version + version: '12.4' manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - cuda-version: '>=11.0,<12.0a0' - cudatoolkit: 11.* - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/cudnn-8.9.7.29-hbc23b4c_3.conda + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda hash: - md5: 4a2d5fab2871d95544de4e1752948d0f - sha256: c553234d447d9938556f067aba7a4686c8e5427e03e740e67199da3782cc420c + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da category: main optional: false - name: cycler @@ -2563,6 +3805,18 @@ package: sha256: f221233f21b1d06971792d491445fd548224641af9443739b4b7b6d5d72954a8 category: main optional: false +- name: cycler + version: 0.12.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + hash: + md5: 5cd86562580f274031ede6aa6aa24441 + sha256: f221233f21b1d06971792d491445fd548224641af9443739b4b7b6d5d72954a8 + category: main + optional: false - name: cycler version: 0.12.1 manager: conda @@ -2590,6 +3844,20 @@ package: sha256: bbc7069221cb5ff29dd8f10f2ae32a6caa72394459a7c67ec2e19d9b9f42cd78 category: main optional: false +- name: cytoolz + version: 0.12.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + toolz: '>=0.10.0' + url: https://conda.anaconda.org/conda-forge/osx-64/cytoolz-0.12.3-py39ha09f3b3_0.conda + hash: + md5: 069c271e8e59773b433717998f1ffd4e + sha256: 7871cef868636cc21c710a931c359bd1af79fe198d2b3aaaa6256cbbc0300570 + category: main + optional: false - name: cytoolz version: 0.12.3 manager: conda @@ -2605,15 +3873,15 @@ package: category: main optional: false - name: dask - version: 2024.3.0 + version: 2024.3.1 manager: conda platform: linux-64 dependencies: bokeh: '>=2.4.2,!=3.0.*' cytoolz: '>=0.11.0' - dask-core: '>=2024.3.0,<2024.3.1.0a0' + dask-core: '>=2024.3.1,<2024.3.2.0a0' dask-expr: '>=1.0,<1.1' - distributed: '>=2024.3.0,<2024.3.1.0a0' + distributed: '>=2024.3.1,<2024.3.2.0a0' jinja2: '>=2.10.3' lz4: '>=4.3.2' numpy: '>=1.21' @@ -2621,37 +3889,60 @@ package: pyarrow: '>=7.0' pyarrow-hotfix: '' python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.3.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.3.1-pyhd8ed1ab_0.conda hash: - md5: 271447895d7d7f1bd28a74e6afc51be3 - sha256: 666cd081c8a33164aa2f20177cd2e3c952746936390f38558898269cf80cf8ed + md5: e3f23f17022881c62e75ddbab7a61f9e + sha256: ee6ba90fab615bd224d58e1c8f6d049e42a044dcd66ee465e516d85282d08336 category: main optional: false - name: dask - version: 2024.3.0 + version: 2024.3.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - bokeh: '>=2.4.2,!=3.0.*' - cytoolz: '>=0.11.0' - dask-core: '>=2024.3.0,<2024.3.1.0a0' - dask-expr: '>=1.0,<1.1' - distributed: '>=2024.3.0,<2024.3.1.0a0' - jinja2: '>=2.10.3' - lz4: '>=4.3.2' + pyarrow-hotfix: '' + python: '>=3.9' numpy: '>=1.21' pandas: '>=1.3' + jinja2: '>=2.10.3' pyarrow: '>=7.0' + lz4: '>=4.3.2' + cytoolz: '>=0.11.0' + bokeh: '>=2.4.2,!=3.0.*' + dask-expr: '>=1.0,<1.1' + dask-core: '>=2024.3.1,<2024.3.2.0a0' + distributed: '>=2024.3.1,<2024.3.2.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.3.1-pyhd8ed1ab_0.conda + hash: + md5: e3f23f17022881c62e75ddbab7a61f9e + sha256: ee6ba90fab615bd224d58e1c8f6d049e42a044dcd66ee465e516d85282d08336 + category: main + optional: false +- name: dask + version: 2024.3.1 + manager: conda + platform: osx-arm64 + dependencies: pyarrow-hotfix: '' python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.3.0-pyhd8ed1ab_1.conda + numpy: '>=1.21' + pandas: '>=1.3' + jinja2: '>=2.10.3' + pyarrow: '>=7.0' + lz4: '>=4.3.2' + cytoolz: '>=0.11.0' + bokeh: '>=2.4.2,!=3.0.*' + dask-expr: '>=1.0,<1.1' + dask-core: '>=2024.3.1,<2024.3.2.0a0' + distributed: '>=2024.3.1,<2024.3.2.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.3.1-pyhd8ed1ab_0.conda hash: - md5: 271447895d7d7f1bd28a74e6afc51be3 - sha256: 666cd081c8a33164aa2f20177cd2e3c952746936390f38558898269cf80cf8ed + md5: e3f23f17022881c62e75ddbab7a61f9e + sha256: ee6ba90fab615bd224d58e1c8f6d049e42a044dcd66ee465e516d85282d08336 category: main optional: false - name: dask-core - version: 2024.3.0 + version: 2024.3.1 manager: conda platform: linux-64 dependencies: @@ -2664,60 +3955,95 @@ package: python: '>=3.9' pyyaml: '>=5.3.1' toolz: '>=0.10.0' - url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda hash: - md5: b6c573c271bf4c062873d7f3df97c3ba - sha256: b7c1514f0be3b447305440bad0d7cc5842f521d46b01788e1d9bbdbf623bc76a + md5: 52dd56ce3afa6a52c2f3d3116875ff32 + sha256: 396607b11601c89331d6934ded9f9765a9aa8485fee19ea8d466c631bee3ba61 category: main optional: false - name: dask-core - version: 2024.3.0 + version: 2024.3.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - click: '>=8.1' - cloudpickle: '>=1.5.0' - fsspec: '>=2021.09.0' - importlib_metadata: '>=4.13.0' + python: '>=3.9' packaging: '>=20.0' + pyyaml: '>=5.3.1' + cloudpickle: '>=1.5.0' + toolz: '>=0.10.0' partd: '>=1.2.0' + click: '>=8.1' + importlib_metadata: '>=4.13.0' + fsspec: '>=2021.09.0' + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda + hash: + md5: 52dd56ce3afa6a52c2f3d3116875ff32 + sha256: 396607b11601c89331d6934ded9f9765a9aa8485fee19ea8d466c631bee3ba61 + category: main + optional: false +- name: dask-core + version: 2024.3.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.9' + packaging: '>=20.0' pyyaml: '>=5.3.1' + cloudpickle: '>=1.5.0' toolz: '>=0.10.0' - url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.0-pyhd8ed1ab_0.conda + partd: '>=1.2.0' + click: '>=8.1' + importlib_metadata: '>=4.13.0' + fsspec: '>=2021.09.0' + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda hash: - md5: b6c573c271bf4c062873d7f3df97c3ba - sha256: b7c1514f0be3b447305440bad0d7cc5842f521d46b01788e1d9bbdbf623bc76a + md5: 52dd56ce3afa6a52c2f3d3116875ff32 + sha256: 396607b11601c89331d6934ded9f9765a9aa8485fee19ea8d466c631bee3ba61 category: main optional: false - name: dask-expr - version: 1.0.2 + version: 1.0.5 manager: conda platform: linux-64 dependencies: - dask-core: 2024.3.0 + dask-core: 2024.3.1 pandas: '>=2' pyarrow: '' python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.5-pyhd8ed1ab_0.conda hash: - md5: 55fad7bd4735ae915926b7c14aed1d97 - sha256: 7d09a3b8499b3fb3f035977809959e212de669c4a4a0619e728e9f52a7bbc97b + md5: d1e973e2e617f806194f4e664c2d3d33 + sha256: fb83d89b4303c620bc1d7ff968db15622548110d74f0d2d8f9cc5fd180830e61 category: main optional: false - name: dask-expr - version: 1.0.2 + version: 1.0.5 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - dask-core: 2024.3.0 + pyarrow: '' + python: '>=3.9' pandas: '>=2' + dask-core: 2024.3.1 + url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.5-pyhd8ed1ab_0.conda + hash: + md5: d1e973e2e617f806194f4e664c2d3d33 + sha256: fb83d89b4303c620bc1d7ff968db15622548110d74f0d2d8f9cc5fd180830e61 + category: main + optional: false +- name: dask-expr + version: 1.0.5 + manager: conda + platform: osx-arm64 + dependencies: pyarrow: '' python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.2-pyhd8ed1ab_0.conda + pandas: '>=2' + dask-core: 2024.3.1 + url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.5-pyhd8ed1ab_0.conda hash: - md5: 55fad7bd4735ae915926b7c14aed1d97 - sha256: 7d09a3b8499b3fb3f035977809959e212de669c4a4a0619e728e9f52a7bbc97b + md5: d1e973e2e617f806194f4e664c2d3d33 + sha256: fb83d89b4303c620bc1d7ff968db15622548110d74f0d2d8f9cc5fd180830e61 category: main optional: false - name: databricks-cli @@ -2743,16 +4069,36 @@ package: - name: databricks-cli version: 0.18.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' click: '>=7.0' + six: '>=1.10.0' + pyjwt: '>=1.7.0' + tabulate: '>=0.7.7' + requests: '>=2.17.3' configparser: '>=0.3.5' oauthlib: '>=3.1.0' - pyjwt: '>=1.7.0' + urllib3: '>=1.26.7,<3' + url: https://conda.anaconda.org/conda-forge/noarch/databricks-cli-0.18.0-pyhd8ed1ab_0.conda + hash: + md5: 5036bba5b1dd105148a5bab9ff4b0620 + sha256: 6ac45a54c2d7e14195d413bbe372f4636d00bc6ce76ffc0c737fb9c7d80a32eb + category: main + optional: false +- name: databricks-cli + version: 0.18.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' - requests: '>=2.17.3' + click: '>=7.0' six: '>=1.10.0' + pyjwt: '>=1.7.0' tabulate: '>=0.7.7' + requests: '>=2.17.3' + configparser: '>=0.3.5' + oauthlib: '>=3.1.0' urllib3: '>=1.26.7,<3' url: https://conda.anaconda.org/conda-forge/noarch/databricks-cli-0.18.0-pyhd8ed1ab_0.conda hash: @@ -2779,13 +4125,29 @@ package: - name: dataclasses-json version: 0.5.7 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.6' + typing_inspect: '>=0.4.0' marshmallow: '>=3.3.0,<4.0.0' marshmallow-enum: '>=1.5.1,<2.0.0' - python: '>=3.6' stringcase: 1.2.0,<2.0.0 + url: https://conda.anaconda.org/conda-forge/noarch/dataclasses-json-0.5.7-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 460d0446b90718c6b535bfe807eab1cd + sha256: 8775cfe2a7583f724c1b424088f988eb480f242b9a09823e92f4af9df3c190de + category: main + optional: false +- name: dataclasses-json + version: 0.5.7 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.6' typing_inspect: '>=0.4.0' + marshmallow: '>=3.3.0,<4.0.0' + marshmallow-enum: '>=1.5.1,<2.0.0' + stringcase: 1.2.0,<2.0.0 url: https://conda.anaconda.org/conda-forge/noarch/dataclasses-json-0.5.7-pyhd8ed1ab_0.tar.bz2 hash: md5: 460d0446b90718c6b535bfe807eab1cd @@ -2793,57 +4155,81 @@ package: category: main optional: false - name: datasets - version: 2.18.0 + version: 2.14.4 manager: conda platform: linux-64 dependencies: aiohttp: '' - dill: '>=0.3.0,<0.3.9' - filelock: '' - fsspec: '>=2023.1.0,<=2024.2.0' - huggingface_hub: '>=0.19.4' + dill: '>=0.3.0,<0.3.8' + fsspec: '>=2021.11.1' + huggingface_hub: '>=0.14.0,<1.0.0' + importlib-metadata: '' multiprocess: '' numpy: '>=1.17' packaging: '' pandas: '' - pyarrow: '>=12.0.0' - pyarrow-hotfix: '' + pyarrow: '>=8.0.0' python: '>=3.8.0' python-xxhash: '' pyyaml: '>=5.1' requests: '>=2.19.0' tqdm: '>=4.62.1' - url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.18.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda hash: - md5: 3482c9b417757df305ff4e3a7e4b7c10 - sha256: 2d792e6f8ecd3ac02921e13f0d5013f412c61d39bcbb8fad4a1f42d6cf6e7a53 + md5: 3e087f072ce03c43a9b60522f5d0ca2f + sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f category: main optional: false - name: datasets - version: 2.18.0 + version: 2.14.4 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + pandas: '' + packaging: '' + importlib-metadata: '' aiohttp: '' - dill: '>=0.3.0,<0.3.9' - filelock: '' - fsspec: '>=2023.1.0,<=2024.2.0' - huggingface_hub: '>=0.19.4' + python-xxhash: '' multiprocess: '' + pyyaml: '>=5.1' numpy: '>=1.17' - packaging: '' - pandas: '' - pyarrow: '>=12.0.0' - pyarrow-hotfix: '' + pyarrow: '>=8.0.0' + requests: '>=2.19.0' python: '>=3.8.0' + tqdm: '>=4.62.1' + fsspec: '>=2021.11.1' + dill: '>=0.3.0,<0.3.8' + huggingface_hub: '>=0.14.0,<1.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + hash: + md5: 3e087f072ce03c43a9b60522f5d0ca2f + sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f + category: main + optional: false +- name: datasets + version: 2.14.4 + manager: conda + platform: osx-arm64 + dependencies: + pandas: '' + packaging: '' + importlib-metadata: '' + aiohttp: '' python-xxhash: '' + multiprocess: '' pyyaml: '>=5.1' + numpy: '>=1.17' + pyarrow: '>=8.0.0' requests: '>=2.19.0' + python: '>=3.8.0' tqdm: '>=4.62.1' - url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.18.0-pyhd8ed1ab_0.conda + fsspec: '>=2021.11.1' + dill: '>=0.3.0,<0.3.8' + huggingface_hub: '>=0.14.0,<1.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda hash: - md5: 3482c9b417757df305ff4e3a7e4b7c10 - sha256: 2d792e6f8ecd3ac02921e13f0d5013f412c61d39bcbb8fad4a1f42d6cf6e7a53 + md5: 3e087f072ce03c43a9b60522f5d0ca2f + sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f category: main optional: false - name: db-dtypes @@ -2865,13 +4251,29 @@ package: - name: db-dtypes version: 1.2.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - numpy: '>=1.16.6' - packaging: '>=17.0' + python: '>=3.7' pandas: '>=0.24.2' + packaging: '>=17.0' pyarrow: '>=3.0.0' + numpy: '>=1.16.6' + url: https://conda.anaconda.org/conda-forge/noarch/db-dtypes-1.2.0-pyhd8ed1ab_0.conda + hash: + md5: d7dbb7a600bb820b5b7874b3a2a87990 + sha256: f96091a81a3dbef3ef27e9860dd220c4f87ed6b1791b56f0096b7054c4130d7a + category: main + optional: false +- name: db-dtypes + version: 1.2.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + pandas: '>=0.24.2' + packaging: '>=17.0' + pyarrow: '>=3.0.0' + numpy: '>=1.16.6' url: https://conda.anaconda.org/conda-forge/noarch/db-dtypes-1.2.0-pyhd8ed1ab_0.conda hash: md5: d7dbb7a600bb820b5b7874b3a2a87990 @@ -2907,6 +4309,20 @@ package: sha256: 17b1f8a3b4c4df1cf78ec1cdd46d53743ad9fe8bb34fa162dfaaee698f9a6864 category: main optional: false +- name: debugpy + version: 1.8.1 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.1-py39hd253f6c_0.conda + hash: + md5: 328dc0de8a70c8f8de65d37a6b289220 + sha256: 9c45fffa6c2c4494b267e371d6c55cd0f8c7703e89b167263f4906a7339339b7 + category: main + optional: false - name: debugpy version: 1.8.1 manager: conda @@ -2933,6 +4349,18 @@ package: sha256: 328a6a379f9bdfd0230e51de291ce858e6479411ea4b0545fb377c71662ef3e2 category: main optional: false +- name: decorator + version: 5.1.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 43afe5ab04e35e17ba28649471dd7364 + sha256: 328a6a379f9bdfd0230e51de291ce858e6479411ea4b0545fb377c71662ef3e2 + category: main + optional: false - name: decorator version: 5.1.1 manager: conda @@ -2957,6 +4385,18 @@ package: sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be category: main optional: false +- name: defusedxml + version: 0.7.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 961b3a227b437d82ad7054484cfa71b2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + category: main + optional: false - name: defusedxml version: 0.7.1 manager: conda @@ -2970,27 +4410,39 @@ package: category: main optional: false - name: dill - version: 0.3.8 + version: 0.3.7 manager: conda platform: linux-64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda hash: - md5: 78745f157d56877a2c6e7b386f66f3e2 - sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 + md5: 5e4f3466526c52bc9af2d2353a1460bd + sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 category: main optional: false - name: dill - version: 0.3.8 + version: 0.3.7 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + hash: + md5: 5e4f3466526c52bc9af2d2353a1460bd + sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 + category: main + optional: false +- name: dill + version: 0.3.7 manager: conda platform: osx-arm64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda hash: - md5: 78745f157d56877a2c6e7b386f66f3e2 - sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 + md5: 5e4f3466526c52bc9af2d2353a1460bd + sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 category: main optional: false - name: diskcache @@ -3005,6 +4457,18 @@ package: sha256: 2547a3aa97f0862e55d9d4bbef457b087d35f4bff05766c8169c82719bc61e17 category: main optional: false +- name: diskcache + version: 5.6.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/diskcache-5.6.3-pyhd8ed1ab_0.conda + hash: + md5: 4c33109f652b5d8c995ab243436c9370 + sha256: 2547a3aa97f0862e55d9d4bbef457b087d35f4bff05766c8169c82719bc61e17 + category: main + optional: false - name: diskcache version: 5.6.3 manager: conda @@ -3029,6 +4493,18 @@ package: sha256: 3ff11acdd5cc2f80227682966916e878e45ced94f59c402efb94911a5774e84e category: main optional: false +- name: distlib + version: 0.3.8 + manager: conda + platform: osx-64 + dependencies: + python: 2.7|>=3.6 + url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + hash: + md5: db16c66b759a64dc5183d69cc3745a52 + sha256: 3ff11acdd5cc2f80227682966916e878e45ced94f59c402efb94911a5774e84e + category: main + optional: false - name: distlib version: 0.3.8 manager: conda @@ -3042,14 +4518,14 @@ package: category: main optional: false - name: distributed - version: 2024.3.0 + version: 2024.3.1 manager: conda platform: linux-64 dependencies: click: '>=8.0' cloudpickle: '>=1.5.0' cytoolz: '>=0.10.1' - dask-core: '>=2024.3.0,<2024.3.1.0a0' + dask-core: '>=2024.3.1,<2024.3.2.0a0' jinja2: '>=2.10.3' locket: '>=1.0.0' msgpack-python: '>=1.0.0' @@ -3063,38 +4539,66 @@ package: tornado: '>=6.0.4' urllib3: '>=1.24.3' zict: '>=3.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda hash: - md5: e4736ce580a5b289f7412f14ae8df42a - sha256: d13ee04cb06fa760b7b1fab4ce3b1d4bef37013daafb49aad6d28cb7c7dae906 + md5: b0ad5ef44595ef37c3008fc04ecd2abf + sha256: f587da3ff040968fecac7f424b88c5bc5fe16fe92fe08643fb5be8318d05c275 category: main optional: false - name: distributed - version: 2024.3.0 + version: 2024.3.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - click: '>=8.0' + python: '>=3.9' + packaging: '>=20.0' + pyyaml: '>=5.3.1' cloudpickle: '>=1.5.0' - cytoolz: '>=0.10.1' - dask-core: '>=2024.3.0,<2024.3.1.0a0' + click: '>=8.0' + msgpack-python: '>=1.0.0' + urllib3: '>=1.24.3' + toolz: '>=0.10.0' jinja2: '>=2.10.3' + tblib: '>=1.6.0' locket: '>=1.0.0' - msgpack-python: '>=1.0.0' - packaging: '>=20.0' + tornado: '>=6.0.4' + sortedcontainers: '>=2.0.5' + cytoolz: '>=0.10.1' psutil: '>=5.7.2' + zict: '>=3.0.0' + dask-core: '>=2024.3.1,<2024.3.2.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda + hash: + md5: b0ad5ef44595ef37c3008fc04ecd2abf + sha256: f587da3ff040968fecac7f424b88c5bc5fe16fe92fe08643fb5be8318d05c275 + category: main + optional: false +- name: distributed + version: 2024.3.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.9' + packaging: '>=20.0' pyyaml: '>=5.3.1' - sortedcontainers: '>=2.0.5' - tblib: '>=1.6.0' + cloudpickle: '>=1.5.0' + click: '>=8.0' + msgpack-python: '>=1.0.0' + urllib3: '>=1.24.3' toolz: '>=0.10.0' + jinja2: '>=2.10.3' + tblib: '>=1.6.0' + locket: '>=1.0.0' tornado: '>=6.0.4' - urllib3: '>=1.24.3' + sortedcontainers: '>=2.0.5' + cytoolz: '>=0.10.1' + psutil: '>=5.7.2' zict: '>=3.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.0-pyhd8ed1ab_0.conda + dask-core: '>=2024.3.1,<2024.3.2.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda hash: - md5: e4736ce580a5b289f7412f14ae8df42a - sha256: d13ee04cb06fa760b7b1fab4ce3b1d4bef37013daafb49aad6d28cb7c7dae906 + md5: b0ad5ef44595ef37c3008fc04ecd2abf + sha256: f587da3ff040968fecac7f424b88c5bc5fe16fe92fe08643fb5be8318d05c275 category: main optional: false - name: distro @@ -3109,6 +4613,18 @@ package: sha256: ae1c13d709c8001331b5b9345e4bcd77e9ae712d25f7958b2ebcbe0b068731b7 category: main optional: false +- name: distro + version: 1.9.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_0.conda + hash: + md5: bbdb409974cd6cb30071b1d978302726 + sha256: ae1c13d709c8001331b5b9345e4bcd77e9ae712d25f7958b2ebcbe0b068731b7 + category: main + optional: false - name: distro version: 1.9.0 manager: conda @@ -3142,15 +4658,33 @@ package: - name: docker-py version: 6.1.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + pywin32-on-windows: '' + python: '>=3.7' + requests: '>=2.26.0' + urllib3: '>=1.26.0' packaging: '>=14.0' + websocket-client: '>=0.32.0' paramiko: '>=2.4.3' - python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/docker-py-6.1.3-pyhd8ed1ab_0.conda + hash: + md5: c95d23d8bae7e21491868cc7772d7c73 + sha256: 7c3031602e92fd7682302ef98a45bdf7374d48a849cdd3900b7c68a32d162177 + category: main + optional: false +- name: docker-py + version: 6.1.3 + manager: conda + platform: osx-arm64 + dependencies: pywin32-on-windows: '' + python: '>=3.7' requests: '>=2.26.0' urllib3: '>=1.26.0' + packaging: '>=14.0' websocket-client: '>=0.32.0' + paramiko: '>=2.4.3' url: https://conda.anaconda.org/conda-forge/noarch/docker-py-6.1.3-pyhd8ed1ab_0.conda hash: md5: c95d23d8bae7e21491868cc7772d7c73 @@ -3169,6 +4703,18 @@ package: sha256: da4fcb232504392344a2ddae6863cbbbbf2a876ddd6d00c8f1dfcdefc29f7f2a category: main optional: false +- name: docstring_parser + version: '0.16' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.16-pyhd8ed1ab_0.conda + hash: + md5: 1541834779ec03de593eb3c35f393632 + sha256: da4fcb232504392344a2ddae6863cbbbbf2a876ddd6d00c8f1dfcdefc29f7f2a + category: main + optional: false - name: docstring_parser version: '0.16' manager: conda @@ -3194,6 +4740,19 @@ package: sha256: 3205c831e88f49ae5bfea74f3d0b5924f51a7da8b4ad966fe1511ad7dd0be158 category: main optional: false +- name: docutils + version: 0.17.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/docutils-0.17.1-py39h6e9494a_4.conda + hash: + md5: 2075bada3661d0a7fb762b4f84f7c06a + sha256: de75694b8d0c0e244aa6f3a50d3915311410a51bfb4e8074e8bc61152b63396d + category: main + optional: false - name: docutils version: 0.17.1 manager: conda @@ -3219,6 +4778,18 @@ package: sha256: 2ec4a0900a4a9f42615fc04d0fb3286b796abe56590e8e042f6ec25e102dd5af category: main optional: false +- name: entrypoints + version: '0.4' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 3cf04868fee0a029769bd41f4b2fbf2d + sha256: 2ec4a0900a4a9f42615fc04d0fb3286b796abe56590e8e042f6ec25e102dd5af + category: main + optional: false - name: entrypoints version: '0.4' manager: conda @@ -3243,6 +4814,18 @@ package: sha256: a6ae416383bda0e3ed14eaa187c653e22bec94ff2aa3b56970cdf0032761e80d category: main optional: false +- name: exceptiongroup + version: 1.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + hash: + md5: 8d652ea2ee8eaee02ed8dc820bc794aa + sha256: a6ae416383bda0e3ed14eaa187c653e22bec94ff2aa3b56970cdf0032761e80d + category: main + optional: false - name: exceptiongroup version: 1.2.0 manager: conda @@ -3267,6 +4850,18 @@ package: sha256: c738804ab1e6376f8ea63372229a04c8d658dc90fd5a218c6273a2eaf02f4057 category: main optional: false +- name: executing + version: 2.0.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda + hash: + md5: e16be50e378d8a4533b989035b196ab8 + sha256: c738804ab1e6376f8ea63372229a04c8d658dc90fd5a218c6273a2eaf02f4057 + category: main + optional: false - name: executing version: 2.0.1 manager: conda @@ -3292,6 +4887,18 @@ package: sha256: 89916c536ae5b85bb8bf0cfa27d751e274ea0911f04e4a928744735c14ef5155 category: main optional: false +- name: expat + version: 2.6.2 + manager: conda + platform: osx-64 + dependencies: + libexpat: 2.6.2 + url: https://conda.anaconda.org/conda-forge/osx-64/expat-2.6.2-h73e2aa4_0.conda + hash: + md5: dc0882915da2ec74696ad87aa2350f27 + sha256: 0fd1befb18d9d937358a90d5b8f97ac2402761e9d4295779cbad9d7adfb47976 + category: main + optional: false - name: expat version: 2.6.2 manager: conda @@ -3319,6 +4926,20 @@ package: sha256: d60e58580c4202d1f1787c8fe1cdc783e297ebb192aaf89cc84b29eb348ea224 category: main optional: false +- name: fastavro + version: 1.9.4 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + pytz: '' + url: https://conda.anaconda.org/conda-forge/osx-64/fastavro-1.9.4-py39ha09f3b3_0.conda + hash: + md5: 824ffedb4e9e643043ebf0ee4f885587 + sha256: e360caf1086152665d06e383981f1bdfdc33c5e390ae45cf6046a9cee2bd2506 + category: main + optional: false - name: fastavro version: 1.9.4 manager: conda @@ -3334,27 +4955,39 @@ package: category: main optional: false - name: filelock - version: 3.13.1 + version: 3.13.3 manager: conda platform: linux-64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + hash: + md5: ff15f46b0d34308f4d40c1c51df07592 + sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 + category: main + optional: false +- name: filelock + version: 3.13.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda hash: - md5: 0c1729b74a8152fde6a38ba0a2ab9f45 - sha256: 4d742d91412d1f163e5399d2b50c5d479694ebcd309127abb549ca3977f89d2b + md5: ff15f46b0d34308f4d40c1c51df07592 + sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 category: main optional: false - name: filelock - version: 3.13.1 + version: 3.13.3 manager: conda platform: osx-arm64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda hash: - md5: 0c1729b74a8152fde6a38ba0a2ab9f45 - sha256: 4d742d91412d1f163e5399d2b50c5d479694ebcd309127abb549ca3977f89d2b + md5: ff15f46b0d34308f4d40c1c51df07592 + sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 category: main optional: false - name: fiona @@ -3383,6 +5016,31 @@ package: sha256: 89e29d589bd8f749471a7286cfd275f6b27c37bdf7b87a2f81bac24c025018d3 category: main optional: false +- name: fiona + version: 1.9.6 + manager: conda + platform: osx-64 + dependencies: + attrs: '>=19.2.0' + certifi: '' + click: '>=8.0,<9.dev0' + click-plugins: '>=1.0' + cligj: '>=0.5' + gdal: '' + importlib-metadata: '' + libcxx: '>=16' + libgdal: '>=3.8.4,<3.9.0a0' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + shapely: '' + six: '' + url: https://conda.anaconda.org/conda-forge/osx-64/fiona-1.9.6-py39h0f5ad13_0.conda + hash: + md5: 0d4dc7f0a01bec071b0e7b5925405dc7 + sha256: 00d0672d38b04db3a45ef03de94472135423bd5b20ef9855292adcec5f1a2992 + category: main + optional: false - name: fiona version: 1.9.6 manager: conda @@ -3429,14 +5087,32 @@ package: - name: flask version: 2.3.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - blinker: '>=1.6.2' + python: '>=3.8' click: '>=8.1.3' + jinja2: '>=3.1.2' importlib-metadata: '>=3.6.0' itsdangerous: '>=2.1.2' - jinja2: '>=3.1.2' + blinker: '>=1.6.2' + werkzeug: '>=2.3.7' + url: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda + hash: + md5: 9b0d29067484a8dfacfae85b8fba81bc + sha256: 4f84ffdc5471236e8225db86c7508426b46aa2c3802d58ca40b3c3e174533b39 + category: main + optional: false +- name: flask + version: 2.3.3 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + click: '>=8.1.3' + jinja2: '>=3.1.2' + importlib-metadata: '>=3.6.0' + itsdangerous: '>=2.1.2' + blinker: '>=1.6.2' werkzeug: '>=2.3.7' url: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda hash: @@ -3457,6 +5133,18 @@ package: sha256: 898446f402c14da0e74cd2062e78ebcfbc531e08a8207f4df36dd596d30ccb70 category: main optional: false +- name: flatbuffers + version: 23.5.26 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + url: https://conda.anaconda.org/conda-forge/osx-64/flatbuffers-23.5.26-he965462_1.conda + hash: + md5: 76123c120b7b701941234d774e18c7c0 + sha256: 4b1c90079e7bb323dd22f13b9bc014da7f0105b29323efb9097b0610997c9e04 + category: main + optional: false - name: flatbuffers version: 23.5.26 manager: conda @@ -3487,12 +5175,27 @@ package: - name: flyteidl version: 1.11.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: googleapis-common-protos: '' + protoc-gen-openapiv2: '' + python: '>=3.8' protobuf: '>=4.21.1,<5.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/flyteidl-1.11.0-pyhd8ed1ab_0.conda + hash: + md5: 131db08709c41ff9dcb9d9a9d0b1b06c + sha256: 20bdb20e0cecfc3ac3c55a435f5be794f87497984fc8a25ae1c9378e8f11fa5d + category: main + optional: false +- name: flyteidl + version: 1.11.0 + manager: conda + platform: osx-arm64 + dependencies: + googleapis-common-protos: '' protoc-gen-openapiv2: '' python: '>=3.8' + protobuf: '>=4.21.1,<5.0.0' url: https://conda.anaconda.org/conda-forge/noarch/flyteidl-1.11.0-pyhd8ed1ab_0.conda hash: md5: 131db08709c41ff9dcb9d9a9d0b1b06c @@ -3551,46 +5254,95 @@ package: - name: flytekit version: 1.11.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - adlfs: '>=2023.3.0' - click: '>=6.6,<9.0' - cloudpickle: '>=2.0.0' - cookiecutter: '>=1.7.3' - croniter: '>=0.3.20,<4.0.0' - dataclasses-json: '>=0.5.2,<0.5.12' - diskcache: '>=5.2.1' - docker-py: '>=4.0.0,<7.0.0' - docstring_parser: '>=0.9.0' - flyteidl: '>=1.11.0b1' - fsspec: '>=2023.3.0' - gcsfs: '>=2023.3.0' - googleapis-common-protos: '>=1.57' - grpcio: '' - grpcio-status: '' + typing-extensions: '' importlib-metadata: '' - isodate: '' + rich: '' joblib: '' + pyarrow: '' + pygments: '' jsonpickle: '' - keyring: '>=18.0.1' + grpcio: '' + rich-click: '' markdown-it-py: '' + isodate: '' + grpcio-status: '' marshmallow-enum: '' + python: '>=3.8,<3.12' + diskcache: '>=5.2.1' + python-json-logger: '>=2.0.0' + cloudpickle: '>=2.0.0' + fsspec: '>=2023.3.0' + cookiecutter: '>=1.7.3' + gcsfs: '>=2023.3.0' + croniter: '>=0.3.20,<4.0.0' + docstring_parser: '>=0.9.0' + keyring: '>=18.0.1' marshmallow-jsonschema: '>=0.12.0' + pytimeparse: '>=1.1.8,<2.0.0' + requests: '>=2.18.4,<3.0.0' + statsd: '>=3.0.0,<4.0.0' + urllib3: '>=1.22,<2.0.0' + click: '>=6.6,<9.0' + googleapis-common-protos: '>=1.57' + docker-py: '>=4.0.0,<7.0.0' + pyyaml: '!=6.0.0,!=5.4.0,!=5.4.1' + dataclasses-json: '>=0.5.2,<0.5.12' mashumaro: '>=3.9.1' + adlfs: '>=2023.3.0' protobuf: '!=4.25.0' + s3fs: '>=2023.3.0' + flyteidl: '>=1.11.0b1' + url: https://conda.anaconda.org/conda-forge/noarch/flytekit-1.11.0-pyhd8ed1ab_0.conda + hash: + md5: acf5fdc7bc5aeed83f7f8500b02d68d5 + sha256: 2df4e56f582f1e9800f7fc304c043b0165d989fae705ac82875e82f04d0d0d18 + category: main + optional: false +- name: flytekit + version: 1.11.0 + manager: conda + platform: osx-arm64 + dependencies: + typing-extensions: '' + importlib-metadata: '' + rich: '' + joblib: '' pyarrow: '' pygments: '' + jsonpickle: '' + grpcio: '' + rich-click: '' + markdown-it-py: '' + isodate: '' + grpcio-status: '' + marshmallow-enum: '' python: '>=3.8,<3.12' + diskcache: '>=5.2.1' python-json-logger: '>=2.0.0' + cloudpickle: '>=2.0.0' + fsspec: '>=2023.3.0' + cookiecutter: '>=1.7.3' + gcsfs: '>=2023.3.0' + croniter: '>=0.3.20,<4.0.0' + docstring_parser: '>=0.9.0' + keyring: '>=18.0.1' + marshmallow-jsonschema: '>=0.12.0' pytimeparse: '>=1.1.8,<2.0.0' - pyyaml: '!=6.0.0,!=5.4.0,!=5.4.1' requests: '>=2.18.4,<3.0.0' - rich: '' - rich-click: '' - s3fs: '>=2023.3.0' statsd: '>=3.0.0,<4.0.0' - typing-extensions: '' urllib3: '>=1.22,<2.0.0' + click: '>=6.6,<9.0' + googleapis-common-protos: '>=1.57' + docker-py: '>=4.0.0,<7.0.0' + pyyaml: '!=6.0.0,!=5.4.0,!=5.4.1' + dataclasses-json: '>=0.5.2,<0.5.12' + mashumaro: '>=3.9.1' + adlfs: '>=2023.3.0' + protobuf: '!=4.25.0' + s3fs: '>=2023.3.0' + flyteidl: '>=1.11.0b1' url: https://conda.anaconda.org/conda-forge/noarch/flytekit-1.11.0-pyhd8ed1ab_0.conda hash: md5: acf5fdc7bc5aeed83f7f8500b02d68d5 @@ -3617,14 +5369,31 @@ package: - name: folium version: 0.16.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - branca: '>=0.6.0' - jinja2: '>=2.9' numpy: '' + requests: '' + xyzservices: '' python: '>=3.7' + jinja2: '>=2.9' + branca: '>=0.6.0' + url: https://conda.anaconda.org/conda-forge/noarch/folium-0.16.0-pyhd8ed1ab_0.conda + hash: + md5: cb1d2aa705a5b1f0fbdabd1beebce205 + sha256: 9696ffafd873a40815312e9ea245a863b7796b73dd2759f93174cd65d6bf2144 + category: main + optional: false +- name: folium + version: 0.16.0 + manager: conda + platform: osx-arm64 + dependencies: + numpy: '' requests: '' xyzservices: '' + python: '>=3.7' + jinja2: '>=2.9' + branca: '>=0.6.0' url: https://conda.anaconda.org/conda-forge/noarch/folium-0.16.0-pyhd8ed1ab_0.conda hash: md5: cb1d2aa705a5b1f0fbdabd1beebce205 @@ -3642,6 +5411,17 @@ package: sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b category: main optional: false +- name: font-ttf-dejavu-sans-mono + version: '2.37' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + hash: + md5: 0c96522c6bdaed4b1566d11387caaf45 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + category: main + optional: false - name: font-ttf-dejavu-sans-mono version: '2.37' manager: conda @@ -3664,6 +5444,17 @@ package: sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c category: main optional: false +- name: font-ttf-inconsolata + version: '3.000' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + hash: + md5: 34893075a5c9e55cdafac56607368fc6 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + category: main + optional: false - name: font-ttf-inconsolata version: '3.000' manager: conda @@ -3686,6 +5477,17 @@ package: sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 category: main optional: false +- name: font-ttf-source-code-pro + version: '2.038' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + hash: + md5: 4d59c254e01d9cde7957100457e2d5fb + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + category: main + optional: false - name: font-ttf-source-code-pro version: '2.038' manager: conda @@ -3708,6 +5510,17 @@ package: sha256: 056c85b482d58faab5fd4670b6c1f5df0986314cca3bc831d458b22e4ef2c792 category: main optional: false +- name: font-ttf-ubuntu + version: '0.83' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + hash: + md5: 6185f640c43843e5ad6fd1c5372c3f80 + sha256: 056c85b482d58faab5fd4670b6c1f5df0986314cca3bc831d458b22e4ef2c792 + category: main + optional: false - name: font-ttf-ubuntu version: '0.83' manager: conda @@ -3738,20 +5551,34 @@ package: - name: fontconfig version: 2.14.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: expat: '>=2.5.0,<3.0a0' freetype: '>=2.12.1,<3.0a0' libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.14.2-h82840c6_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.14.2-h5bb23bf_0.conda hash: - md5: f77d47ddb6d3cc5b39b9bdf65635afbb - sha256: 7094917fc6758186e17c61d8ee8fd2bbbe9f303b4addac61d918fa415c497e2b + md5: 86cc5867dfbee4178118392bae4a3c89 + sha256: f63e6d1d6aef8ba6de4fc54d3d7898a153479888d40ffdf2e4cfad6f92679d34 category: main optional: false -- name: fonts-conda-ecosystem - version: '1' - manager: conda +- name: fontconfig + version: 2.14.2 + manager: conda + platform: osx-arm64 + dependencies: + expat: '>=2.5.0,<3.0a0' + freetype: '>=2.12.1,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.14.2-h82840c6_0.conda + hash: + md5: f77d47ddb6d3cc5b39b9bdf65635afbb + sha256: 7094917fc6758186e17c61d8ee8fd2bbbe9f303b4addac61d918fa415c497e2b + category: main + optional: false +- name: fonts-conda-ecosystem + version: '1' + manager: conda platform: linux-64 dependencies: fonts-conda-forge: '' @@ -3761,6 +5588,18 @@ package: sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 category: main optional: false +- name: fonts-conda-ecosystem + version: '1' + manager: conda + platform: osx-64 + dependencies: + fonts-conda-forge: '' + url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + hash: + md5: fee5683a3f04bd15cbd8318b096a27ab + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + category: main + optional: false - name: fonts-conda-ecosystem version: '1' manager: conda @@ -3791,12 +5630,27 @@ package: - name: fonts-conda-forge version: '1' manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + font-ttf-inconsolata: '' + font-ttf-source-code-pro: '' + font-ttf-ubuntu: '' font-ttf-dejavu-sans-mono: '' + url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + hash: + md5: f766549260d6815b0c52253f1fb1bb29 + sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 + category: main + optional: false +- name: fonts-conda-forge + version: '1' + manager: conda + platform: osx-arm64 + dependencies: font-ttf-inconsolata: '' font-ttf-source-code-pro: '' font-ttf-ubuntu: '' + font-ttf-dejavu-sans-mono: '' url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 hash: md5: f766549260d6815b0c52253f1fb1bb29 @@ -3804,7 +5658,7 @@ package: category: main optional: false - name: fonttools - version: 4.49.0 + version: 4.50.0 manager: conda platform: linux-64 dependencies: @@ -3814,14 +5668,30 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* unicodedata2: '>=14.0.0' - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py39hd1e30aa_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py39hd1e30aa_0.conda + hash: + md5: 8b689d531a6f99ef71212081c0126147 + sha256: 22a510a2cc44444668f995ce0c8a7ac9653a6442c7f45dc903fa598962066593 + category: main + optional: false +- name: fonttools + version: 4.50.0 + manager: conda + platform: osx-64 + dependencies: + brotli: '' + munkres: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + unicodedata2: '>=14.0.0' + url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.50.0-py39ha09f3b3_0.conda hash: - md5: dd1b02484cc8c31d4093111a82b6efb2 - sha256: 142a8d3288855101804d0c0d2a998dbca1b56c0d9e0e745cbee86878baaac2ea + md5: a575dd8aa43e8b7e2e1da6bd6acbddc0 + sha256: 6f319ed091af3d14df5165ceba659869569e6827da9ca084f17237b7e440eee7 category: main optional: false - name: fonttools - version: 4.49.0 + version: 4.50.0 manager: conda platform: osx-arm64 dependencies: @@ -3830,10 +5700,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* unicodedata2: '>=14.0.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.49.0-py39h17cfd9d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.50.0-py39h17cfd9d_0.conda hash: - md5: 0ea078a1395ab6ddc465e755fe6273ac - sha256: 765f5f689df8ff4bf888b0434e50bf426dcf869c9537dab05678e96a863b2685 + md5: 9cf95b92068842801c4237e7a799c330 + sha256: 2f40b1ae9cb965f7683dd69af3db71d9575d4b7363a74e230651a669f25d1abd category: main optional: false - name: fqdn @@ -3849,6 +5719,19 @@ package: sha256: 6cfd1f9bcd2358a69fb571f4b3af049b630d52647d906822dbedac03e84e4f63 category: main optional: false +- name: fqdn + version: 1.5.1 + manager: conda + platform: osx-64 + dependencies: + cached-property: '>=1.3.0' + python: '>=2.7,<4' + url: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 642d35437078749ef23a5dca2c9bb1f3 + sha256: 6cfd1f9bcd2358a69fb571f4b3af049b630d52647d906822dbedac03e84e4f63 + category: main + optional: false - name: fqdn version: 1.5.1 manager: conda @@ -3876,6 +5759,19 @@ package: sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 category: main optional: false +- name: freetype + version: 2.12.1 + manager: conda + platform: osx-64 + dependencies: + libpng: '>=1.6.39,<1.7.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda + hash: + md5: 25152fce119320c980e5470e64834b50 + sha256: b292cf5a25f094eeb4b66e37d99a97894aafd04a5683980852a8cbddccdc8e4e + category: main + optional: false - name: freetype version: 2.12.1 manager: conda @@ -3904,6 +5800,20 @@ package: sha256: 9213f60ba710ecfd3632ce47e036775c9f15ce80a6682ff63cbf12d9dddd5382 category: main optional: false +- name: freexl + version: 2.0.0 + manager: conda + platform: osx-64 + dependencies: + libexpat: '>=2.5.0,<3.0a0' + libiconv: '>=1.17,<2.0a0' + minizip: '>=4.0.1,<5.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/freexl-2.0.0-h3ec172f_0.conda + hash: + md5: 640c34a8084e2a812bcee5b804597fc9 + sha256: 9d59f1894c3b526e6806e376e979b81d0df23a836415122b86458aef72cda24a + category: main + optional: false - name: freexl version: 2.0.0 manager: conda @@ -3924,10 +5834,21 @@ package: platform: linux-64 dependencies: libgcc-ng: '>=7.5.0' - url: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h516909a_0.tar.bz2 + hash: + md5: bdc16c2b8852914fdbadb8e4d6361a8b + sha256: b619c1ec2c2b0951e23c683c6ca33de295183ee82f080e97eda68a7a7a955d85 + category: main + optional: false +- name: fribidi + version: 1.0.10 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.10-hbcb3906_0.tar.bz2 hash: - md5: ac7bc6a654f8f41b352b38f4051135f8 - sha256: 5d7b6c0ee7743ba41399e9e05a58ccc1cfc903942e49ff6f677f6e423ea7a627 + md5: f1c6b41e0f56998ecd9a3e210faa1dc0 + sha256: 4f6db86ecc4984cd4ac88ca52030726c3cfd11a64dfb15c8602025ee3001a2b5 category: main optional: false - name: fribidi @@ -3955,6 +5876,19 @@ package: sha256: 40e9730732769b8ef0797f025f108d998d8d2d4edb0c709da9e6dd65475064a6 category: main optional: false +- name: frozendict + version: 2.4.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/frozendict-2.4.0-py39ha09f3b3_0.conda + hash: + md5: 0fc918c0e051981921878c2d65fc403b + sha256: 7ec12ed6358e326dff1ffdd714098b99f49291d347f5ac44839e968a02721105 + category: main + optional: false - name: frozendict version: 2.4.0 manager: conda @@ -3982,6 +5916,19 @@ package: sha256: a011b537e04ef72d85ff47d7d60ebc815c457a2790a6ab8d77a0956db78b08e1 category: main optional: false +- name: frozenlist + version: 1.4.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.4.1-py39ha09f3b3_0.conda + hash: + md5: b5e09c98363b742af6900c85b987f3ef + sha256: c2d3322ee17e65afe8bcf734ca12d76654e7a5c80f1bd2f090d996e2914bfe36 + category: main + optional: false - name: frozenlist version: 1.4.1 manager: conda @@ -3996,27 +5943,39 @@ package: category: main optional: false - name: fsspec - version: 2024.2.0 + version: 2024.3.1 manager: conda platform: linux-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda hash: - md5: fad86b90138cf5d82c6f5a2ed6e683d9 - sha256: 3f7e123dd82fe99450d1e0ffa389e8218ef8c9ee257c836e21b489548c039ae6 + md5: b7f0662ef2c9d4404f0af9eef5ed2fde + sha256: b8621151939bb5ea4ea4aa84f010e6130a47b1453cd9178283f335816b72a895 category: main optional: false - name: fsspec - version: 2024.2.0 + version: 2024.3.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda + hash: + md5: b7f0662ef2c9d4404f0af9eef5ed2fde + sha256: b8621151939bb5ea4ea4aa84f010e6130a47b1453cd9178283f335816b72a895 + category: main + optional: false +- name: fsspec + version: 2024.3.1 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda hash: - md5: fad86b90138cf5d82c6f5a2ed6e683d9 - sha256: 3f7e123dd82fe99450d1e0ffa389e8218ef8c9ee257c836e21b489548c039ae6 + md5: b7f0662ef2c9d4404f0af9eef5ed2fde + sha256: b8621151939bb5ea4ea4aa84f010e6130a47b1453cd9178283f335816b72a895 category: main optional: false - name: furo @@ -4040,15 +5999,33 @@ package: - name: furo version: 2023.5.20 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: beautifulsoup4: '' myst-parser: '' - pygments: '>=2.7' + sphinx-inline-tabs: '' + sphinx-basic-ng: '' python: '>=3.6' sphinx: '>=4' - sphinx-basic-ng: '' + pygments: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/furo-2023.5.20-pyhd8ed1ab_0.conda + hash: + md5: 786e474a83de249aecf767102d7fd87d + sha256: 3513f6e2bc2036e6941b30dd03ea9c98a452e0d311d7dc5d1b45be87e145e3d3 + category: main + optional: false +- name: furo + version: 2023.5.20 + manager: conda + platform: osx-arm64 + dependencies: + beautifulsoup4: '' + myst-parser: '' sphinx-inline-tabs: '' + sphinx-basic-ng: '' + python: '>=3.6' + sphinx: '>=4' + pygments: '>=2.7' url: https://conda.anaconda.org/conda-forge/noarch/furo-2023.5.20-pyhd8ed1ab_0.conda hash: md5: 786e474a83de249aecf767102d7fd87d @@ -4067,6 +6044,18 @@ package: sha256: 8c918a63595ae01575b738ddf0bff10dc23a5002d4af4c8b445d1179a76a8efd category: main optional: false +- name: future + version: 1.0.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_0.conda + hash: + md5: 650a7807e689642dddd3590eb817beed + sha256: 8c918a63595ae01575b738ddf0bff10dc23a5002d4af4c8b445d1179a76a8efd + category: main + optional: false - name: future version: 1.0.0 manager: conda @@ -4091,6 +6080,18 @@ package: sha256: e029d50d55f8fe8cf9323045f84416b7af50e25a0dc1b978f8ba6b9ca8d53ca7 category: main optional: false +- name: gast + version: 0.5.4 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.4' + url: https://conda.anaconda.org/conda-forge/noarch/gast-0.5.4-pyhd8ed1ab_0.conda + hash: + md5: 8189adbad784030b76bbf81c68d7b0d4 + sha256: e029d50d55f8fe8cf9323045f84416b7af50e25a0dc1b978f8ba6b9ca8d53ca7 + category: main + optional: false - name: gast version: 0.5.4 manager: conda @@ -4104,41 +6105,60 @@ package: category: main optional: false - name: gcsfs - version: 2024.2.0 + version: 2024.3.1 manager: conda platform: linux-64 dependencies: aiohttp: '' decorator: '>4.1.2' - fsspec: 2024.2.0 + fsspec: 2024.3.1 google-auth: '>=1.2' google-auth-oauthlib: '' google-cloud-storage: '>1.40' python: '>=3.7' requests: '' - url: https://conda.anaconda.org/conda-forge/noarch/gcsfs-2024.2.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/gcsfs-2024.3.1-pyhd8ed1ab_0.conda hash: - md5: babf81bf8ff3af8bd8ad83ed5b9603a4 - sha256: eeb396cfaa15eecb1ec34d44801df8b6036c3b4beacf13d08d038f87e8d451e8 + md5: 2a794cb30f494b38dd57ece3af30ed6a + sha256: 3db31215462e399848d49c5258ce03f6c3e72e7c20fb488ad0b1ebbe6a359607 category: main optional: false - name: gcsfs - version: 2024.2.0 + version: 2024.3.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + requests: '' aiohttp: '' - decorator: '>4.1.2' - fsspec: 2024.2.0 - google-auth: '>=1.2' google-auth-oauthlib: '' - google-cloud-storage: '>1.40' python: '>=3.7' + google-auth: '>=1.2' + decorator: '>4.1.2' + google-cloud-storage: '>1.40' + fsspec: 2024.3.1 + url: https://conda.anaconda.org/conda-forge/noarch/gcsfs-2024.3.1-pyhd8ed1ab_0.conda + hash: + md5: 2a794cb30f494b38dd57ece3af30ed6a + sha256: 3db31215462e399848d49c5258ce03f6c3e72e7c20fb488ad0b1ebbe6a359607 + category: main + optional: false +- name: gcsfs + version: 2024.3.1 + manager: conda + platform: osx-arm64 + dependencies: requests: '' - url: https://conda.anaconda.org/conda-forge/noarch/gcsfs-2024.2.0-pyhd8ed1ab_0.conda + aiohttp: '' + google-auth-oauthlib: '' + python: '>=3.7' + google-auth: '>=1.2' + decorator: '>4.1.2' + google-cloud-storage: '>1.40' + fsspec: 2024.3.1 + url: https://conda.anaconda.org/conda-forge/noarch/gcsfs-2024.3.1-pyhd8ed1ab_0.conda hash: - md5: babf81bf8ff3af8bd8ad83ed5b9603a4 - sha256: eeb396cfaa15eecb1ec34d44801df8b6036c3b4beacf13d08d038f87e8d451e8 + md5: 2a794cb30f494b38dd57ece3af30ed6a + sha256: 3db31215462e399848d49c5258ce03f6c3e72e7c20fb488ad0b1ebbe6a359607 category: main optional: false - name: gdal @@ -4161,6 +6181,25 @@ package: sha256: 64d5b859a4b10a45a0a7eab22e8143f178d9a44f935c8aa32ee75d6111a0b5f9 category: main optional: false +- name: gdal + version: 3.8.4 + manager: conda + platform: osx-64 + dependencies: + hdf5: '>=1.14.3,<1.14.4.0a0' + libcxx: '>=16' + libgdal: 3.8.4 + libxml2: '>=2.12.5,<3.0a0' + numpy: '>=1.22.4,<2.0a0' + openssl: '>=3.2.1,<4.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/gdal-3.8.4-py39ha0dfb3d_0.conda + hash: + md5: ccb936d7310c8d946b7eb4c224c2ffde + sha256: 9e2d46bad74aa846ce306ca69c11f6b9e11cca10fcfbec253154de7538ec0898 + category: main + optional: false - name: gdal version: 3.8.4 manager: conda @@ -4195,6 +6234,21 @@ package: sha256: bacd1cc3ed77699dec11ea5a670160db3cf701f1b19f34f1a19be36cae25c396 category: main optional: false +- name: gdk-pixbuf + version: 2.42.10 + manager: conda + platform: osx-64 + dependencies: + libglib: '>=2.78.4,<3.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libpng: '>=1.6.43,<1.7.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.10-hd9e0ca3_5.conda + hash: + md5: 308cefd960b6ba51bdbdc5ba9e9b2377 + sha256: e15a0923d2640020dc7f2ff2b04f09face4ddce6484e09f78752cd0e65ad1cdf + category: main + optional: false - name: gdk-pixbuf version: 2.42.10 manager: conda @@ -4232,16 +6286,35 @@ package: - name: geopandas version: 0.14.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - fiona: '>=1.8.21' + matplotlib-base: '' + rtree: '' folium: '' - geopandas-base: 0.14.3 + xyzservices: '' + python: '>=3.9' mapclassify: '>=2.4.0' + fiona: '>=1.8.21' + geopandas-base: 0.14.3 + url: https://conda.anaconda.org/conda-forge/noarch/geopandas-0.14.3-pyhd8ed1ab_0.conda + hash: + md5: d8e208e375441bf1404e9693f13f3c25 + sha256: 15bdc3d85ffa9c6601f57dd5e2780dbcbe52ca5da70164fb5bb1bb4c72b92010 + category: main + optional: false +- name: geopandas + version: 0.14.3 + manager: conda + platform: osx-arm64 + dependencies: matplotlib-base: '' - python: '>=3.9' rtree: '' + folium: '' xyzservices: '' + python: '>=3.9' + mapclassify: '>=2.4.0' + fiona: '>=1.8.21' + geopandas-base: 0.14.3 url: https://conda.anaconda.org/conda-forge/noarch/geopandas-0.14.3-pyhd8ed1ab_0.conda hash: md5: d8e208e375441bf1404e9693f13f3c25 @@ -4267,32 +6340,61 @@ package: - name: geopandas-base version: 0.14.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: packaging: '' - pandas: '>=1.4.0' - pyproj: '>=3.3.0' python: '>=3.9' + pandas: '>=1.4.0' shapely: '>=1.8.0' + pyproj: '>=3.3.0' url: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-0.14.3-pyha770c72_0.conda hash: md5: fbac4b2194c962b97324a3f5dd7d2696 sha256: 0a8fb5a368d19fd08f7f65dfcff563322cb34e47947cabab8fc7f187d9bc9269 category: main optional: false -- name: geos - version: 3.12.1 +- name: geopandas-base + version: 0.14.3 manager: conda - platform: linux-64 + platform: osx-arm64 dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda - hash: - md5: 8c0f4f71f5a59ceb0c6fa9f51501066d + packaging: '' + python: '>=3.9' + pandas: '>=1.4.0' + shapely: '>=1.8.0' + pyproj: '>=3.3.0' + url: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-0.14.3-pyha770c72_0.conda + hash: + md5: fbac4b2194c962b97324a3f5dd7d2696 + sha256: 0a8fb5a368d19fd08f7f65dfcff563322cb34e47947cabab8fc7f187d9bc9269 + category: main + optional: false +- name: geos + version: 3.12.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda + hash: + md5: 8c0f4f71f5a59ceb0c6fa9f51501066d sha256: 2593b255cb9c4639d6ea261c47aaed1380216a366546f0468e95c36c2afd1c1a category: main optional: false +- name: geos + version: 3.12.1 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + url: https://conda.anaconda.org/conda-forge/osx-64/geos-3.12.1-h93d8f39_0.conda + hash: + md5: d13f05ed3985f57456b610bab66366db + sha256: 6feffb0d1999a22c5f94d2168b1af9c5fbdd25c9a963a6825ee32cf05e5c07f5 + category: main + optional: false - name: geos version: 3.12.1 manager: conda @@ -4324,6 +6426,24 @@ package: sha256: f7dcc865f5522713048397702490ba917abf9d2fbfe89d6b703e0ea333a27b01 category: main optional: false +- name: geotiff + version: 1.7.1 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + proj: '>=9.3.1,<9.3.2.0a0' + zlib: '' + url: https://conda.anaconda.org/conda-forge/osx-64/geotiff-1.7.1-h509af15_15.conda + hash: + md5: 96cb876ae9551821ad4cd6ce860d75f1 + sha256: e6047c9008746788d265ec6b30551387efd204a5a9a599f0f0359956e8513e76 + category: main + optional: false - name: geotiff version: 1.7.1 manager: conda @@ -4354,6 +6474,18 @@ package: sha256: 4fcfedc44e4c9a053f0416f9fc6ab6ed50644fca3a761126dbd00d09db1f546a category: main optional: false +- name: gettext + version: 0.21.1 + manager: conda + platform: osx-64 + dependencies: + libiconv: '>=1.17,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.21.1-h8a4c099_0.tar.bz2 + hash: + md5: 1e3aff29ce703d421c43f371ad676cc5 + sha256: 915d3cd2d777b9b3fc2e87a25901b8e4a6aa1b2b33cf2ba54e9e9ed4f6b67d94 + category: main + optional: false - name: gettext version: 0.21.1 manager: conda @@ -4379,6 +6511,18 @@ package: sha256: a853c0cacf53cfc59e1bca8d6e5cdfe9f38fce836f08c2a69e35429c2a492e77 category: main optional: false +- name: gflags + version: 2.2.2 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=10.0.1' + url: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hb1e8313_1004.tar.bz2 + hash: + md5: 3f59cc77a929537e42120faf104e0d16 + sha256: 39540f879057ae529cad131644af111a8c3c48b384ec6212de6a5381e0863948 + category: main + optional: false - name: gflags version: 2.2.2 manager: conda @@ -4403,6 +6547,17 @@ package: sha256: 41ec165704ccce2faa0437f4f53c03c06261a2cc9ff7614828e51427d9261f4b category: main optional: false +- name: giflib + version: 5.2.1 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.1-hb7f2c08_3.conda + hash: + md5: aca150b0186836f893ebac79019e5498 + sha256: 47515e0874bcf67e438e1d5d093b074c1781f055067195f0d00a7790a56d446d + category: main + optional: false - name: giflib version: 5.2.1 manager: conda @@ -4427,6 +6582,19 @@ package: sha256: 52ab2798be31b8f509eeec458712f447ced4f96ecb672c6c9a42778f47e07b1b category: main optional: false +- name: gitdb + version: 4.0.11 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + smmap: '>=3.0.1,<6' + url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + hash: + md5: 623b19f616f2ca0c261441067e18ae40 + sha256: 52ab2798be31b8f509eeec458712f447ced4f96ecb672c6c9a42778f47e07b1b + category: main + optional: false - name: gitdb version: 4.0.11 manager: conda @@ -4457,17 +6625,95 @@ package: - name: gitpython version: 3.1.42 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' + typing_extensions: '>=3.7.4.3' gitdb: '>=4.0.1,<5' + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.42-pyhd8ed1ab_0.conda + hash: + md5: 6bc8e496351bafd761c0922c3ebd989a + sha256: a11e1cf4404157467d0f51906d1db80bcb8bfe4bb3d3eba703b28e981ea7e308 + category: main + optional: false +- name: gitpython + version: 3.1.42 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' typing_extensions: '>=3.7.4.3' + gitdb: '>=4.0.1,<5' url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.42-pyhd8ed1ab_0.conda hash: md5: 6bc8e496351bafd761c0922c3ebd989a sha256: a11e1cf4404157467d0f51906d1db80bcb8bfe4bb3d3eba703b28e981ea7e308 category: main optional: false +- name: glib + version: 2.78.4 + manager: conda + platform: linux-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + glib-tools: 2.78.4 + libgcc-ng: '>=12' + libglib: 2.78.4 + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + python: '*' + url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.78.4-hfc55251_0.conda + hash: + md5: f36a7b2420c3fc3c48a3d609841d8fee + sha256: 316c95dcbde46b7418d2b667a7e0c1d05101b673cd8c691d78d8699600a07a5b + category: main + optional: false +- name: glib + version: 2.78.4 + manager: conda + platform: osx-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + glib-tools: 2.78.4 + libcxx: '>=16' + libglib: 2.78.4 + libzlib: '>=1.2.13,<1.3.0a0' + python: '*' + url: https://conda.anaconda.org/conda-forge/osx-64/glib-2.78.4-h2d185b6_0.conda + hash: + md5: 0383ef91e41caea857176363c2bf7387 + sha256: 546775c50a28dcbe22b784d6cc4e8ba3774aac59517858529742657b0563c326 + category: main + optional: false +- name: glib-tools + version: 2.78.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libglib: 2.78.4 + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.78.4-hfc55251_0.conda + hash: + md5: d184ba1bf15a2bbb3be6118c90fd487d + sha256: e94494b895f77ba54922ffb1dcfb7f1a987591b823eb5ce608afb2e2391d7d82 + category: main + optional: false +- name: glib-tools + version: 2.78.4 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16' + libglib: 2.78.4 + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.78.4-h2d185b6_0.conda + hash: + md5: f91cde30ad552c39b485bb5ad0ce454c + sha256: bf3d98bd8a1e0b105d124468c3ca276194c1a06ddc4a9dc44a77df65c44f8eb8 + category: main + optional: false - name: glog version: 0.6.0 manager: conda @@ -4482,6 +6728,19 @@ package: sha256: 888cbcfb67f6e3d88a4c4ab9d26c9a406f620c4101a35dc6d2dbadb95f2221d4 category: main optional: false +- name: glog + version: 0.6.0 + manager: conda + platform: osx-64 + dependencies: + gflags: '>=2.2.2,<2.3.0a0' + libcxx: '>=12.0.1' + url: https://conda.anaconda.org/conda-forge/osx-64/glog-0.6.0-h8ac2a54_0.tar.bz2 + hash: + md5: 69eb97ca709a136c53fdca1f2fd33ddf + sha256: fdb38560094fb4a952346dc72a79b3cb09e23e4d0cae9ba4f524e6e88203d3c8 + category: main + optional: false - name: glog version: 0.6.0 manager: conda @@ -4508,6 +6767,18 @@ package: sha256: cfc4202c23d6895d9c84042d08d5cda47d597772df870d4d2a10fc86dded5576 category: main optional: false +- name: gmp + version: 6.3.0 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-h73e2aa4_1.conda + hash: + md5: 92f8d748d95d97f92fc26cfac9bb5b6e + sha256: 1a5b117908deb5a12288aba84dd0cb913f779c31c75f5a57d1a00e659e8fa3d3 + category: main + optional: false - name: gmp version: 6.3.0 manager: conda @@ -4537,6 +6808,22 @@ package: sha256: f5a5ab463d7d9e9c4f6a70748adf334ad28072c9befe4748d0eaa48fccc24d56 category: main optional: false +- name: gmpy2 + version: 2.1.2 + manager: conda + platform: osx-64 + dependencies: + gmp: '>=6.2.1,<7.0a0' + mpc: '>=1.2.1,<2.0a0' + mpfr: '>=4.1.0,<5.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/gmpy2-2.1.2-py39h2da61ea_1.tar.bz2 + hash: + md5: 57d1deb8ae2f5f74e7da55f2cc4732cc + sha256: 05172243422cfd285036f20fc5310e64dd61ccfb1e25501723837dc8ee9b387a + category: main + optional: false - name: gmpy2 version: 2.1.2 manager: conda @@ -4554,67 +6841,100 @@ package: category: main optional: false - name: google-api-core - version: 2.17.1 + version: 2.18.0 manager: conda platform: linux-64 dependencies: google-auth: '>=2.14.1,<3.0.dev0' googleapis-common-protos: '>=1.56.2,<2.0.dev0' + proto-plus: '>=1.22.3,<2.0.0dev' protobuf: '>=3.19.5,<5.0.0.dev0,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' python: '>=3.7' requests: '>=2.18.0,<3.0.0.dev0' - url: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.17.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.18.0-pyhd8ed1ab_0.conda hash: - md5: b505c957ab68e07800aaba6287ca008e - sha256: a92bf55d70fe4868c7c50163ed876939028ba3a2b513c5742282d8fc12a61074 + md5: 58d10fd3977fa2142cc64c5d9c7a9d20 + sha256: 29ea75a93c596466ebc3954ac05e1c3298bf9d95296bc4769fdc95c71e53a19e category: main optional: false - name: google-api-core - version: 2.17.1 + version: 2.18.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' + proto-plus: '>=1.22.3,<2.0.0dev' google-auth: '>=2.14.1,<3.0.dev0' googleapis-common-protos: '>=1.56.2,<2.0.dev0' protobuf: '>=3.19.5,<5.0.0.dev0,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' + requests: '>=2.18.0,<3.0.0.dev0' + url: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.18.0-pyhd8ed1ab_0.conda + hash: + md5: 58d10fd3977fa2142cc64c5d9c7a9d20 + sha256: 29ea75a93c596466ebc3954ac05e1c3298bf9d95296bc4769fdc95c71e53a19e + category: main + optional: false +- name: google-api-core + version: 2.18.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + proto-plus: '>=1.22.3,<2.0.0dev' + google-auth: '>=2.14.1,<3.0.dev0' + googleapis-common-protos: '>=1.56.2,<2.0.dev0' + protobuf: '>=3.19.5,<5.0.0.dev0,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' requests: '>=2.18.0,<3.0.0.dev0' - url: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.17.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.18.0-pyhd8ed1ab_0.conda hash: - md5: b505c957ab68e07800aaba6287ca008e - sha256: a92bf55d70fe4868c7c50163ed876939028ba3a2b513c5742282d8fc12a61074 + md5: 58d10fd3977fa2142cc64c5d9c7a9d20 + sha256: 29ea75a93c596466ebc3954ac05e1c3298bf9d95296bc4769fdc95c71e53a19e category: main optional: false - name: google-api-core-grpc - version: 2.17.1 + version: 2.18.0 manager: conda platform: linux-64 dependencies: - google-api-core: 2.17.1 + google-api-core: 2.18.0 + grpcio: '>=1.49.1,<2.0.dev0' + grpcio-status: '>=1.49.1,<2.0.dev0' + url: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.18.0-hd8ed1ab_0.conda + hash: + md5: 40e7019aeaee275ea669b9820e480f78 + sha256: c86c76a9242d43c96baee309f588fa4efecbc20d0ef74a16d79fab0b14e519d7 + category: main + optional: false +- name: google-api-core-grpc + version: 2.18.0 + manager: conda + platform: osx-64 + dependencies: grpcio: '>=1.49.1,<2.0.dev0' grpcio-status: '>=1.49.1,<2.0.dev0' - url: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.17.1-hd8ed1ab_0.conda + google-api-core: 2.18.0 + url: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.18.0-hd8ed1ab_0.conda hash: - md5: 9dcac80e562d6471fdbc234604dab09c - sha256: f86d21641f1d44c67a81cfa68aca0031c762aaef7220f4ebca161f0455625c2c + md5: 40e7019aeaee275ea669b9820e480f78 + sha256: c86c76a9242d43c96baee309f588fa4efecbc20d0ef74a16d79fab0b14e519d7 category: main optional: false - name: google-api-core-grpc - version: 2.17.1 + version: 2.18.0 manager: conda platform: osx-arm64 dependencies: - google-api-core: 2.17.1 grpcio: '>=1.49.1,<2.0.dev0' grpcio-status: '>=1.49.1,<2.0.dev0' - url: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.17.1-hd8ed1ab_0.conda + google-api-core: 2.18.0 + url: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.18.0-hd8ed1ab_0.conda hash: - md5: 9dcac80e562d6471fdbc234604dab09c - sha256: f86d21641f1d44c67a81cfa68aca0031c762aaef7220f4ebca161f0455625c2c + md5: 40e7019aeaee275ea669b9820e480f78 + sha256: c86c76a9242d43c96baee309f588fa4efecbc20d0ef74a16d79fab0b14e519d7 category: main optional: false - name: google-auth - version: 2.28.2 + version: 2.29.0 manager: conda platform: linux-64 dependencies: @@ -4627,30 +6947,50 @@ package: pyu2f: '>=0.1.5' requests: '>=2.20.0,<3.0.0' rsa: '>=3.1.4,<5' - url: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.28.2-pyhca7485f_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.29.0-pyhca7485f_0.conda hash: - md5: f8879cf0e5b8f7761d01bce40ce7c089 - sha256: b1ccc8d5110092867c6f58e044248f55836848b06acea280138b1adcae690dff + md5: a12a2abc807053bc378b218a2a525c7d + sha256: 1eaa741eba0a6d34c80f68438cb8283b2d9d2adf8629d024df14222c0fc0b397 category: main optional: false - name: google-auth - version: 2.28.2 + version: 2.29.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - aiohttp: '>=3.6.2,<4.0.0' + python: '>=3.7' + pyasn1-modules: '>=0.2.1' + rsa: '>=3.1.4,<5' + pyopenssl: '>=20.0.0' + pyu2f: '>=0.1.5' + requests: '>=2.20.0,<3.0.0' cachetools: '>=2.0.0,<6.0' + aiohttp: '>=3.6.2,<4.0.0' cryptography: '>=38.0.3' + url: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.29.0-pyhca7485f_0.conda + hash: + md5: a12a2abc807053bc378b218a2a525c7d + sha256: 1eaa741eba0a6d34c80f68438cb8283b2d9d2adf8629d024df14222c0fc0b397 + category: main + optional: false +- name: google-auth + version: 2.29.0 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.7' pyasn1-modules: '>=0.2.1' + rsa: '>=3.1.4,<5' pyopenssl: '>=20.0.0' - python: '>=3.7' pyu2f: '>=0.1.5' requests: '>=2.20.0,<3.0.0' - rsa: '>=3.1.4,<5' - url: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.28.2-pyhca7485f_0.conda + cachetools: '>=2.0.0,<6.0' + aiohttp: '>=3.6.2,<4.0.0' + cryptography: '>=38.0.3' + url: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.29.0-pyhca7485f_0.conda hash: - md5: f8879cf0e5b8f7761d01bce40ce7c089 - sha256: b1ccc8d5110092867c6f58e044248f55836848b06acea280138b1adcae690dff + md5: a12a2abc807053bc378b218a2a525c7d + sha256: 1eaa741eba0a6d34c80f68438cb8283b2d9d2adf8629d024df14222c0fc0b397 category: main optional: false - name: google-auth-oauthlib @@ -4671,12 +7011,27 @@ package: - name: google-auth-oauthlib version: 1.2.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.6' + requests-oauthlib: '>=0.7.0' click: '>=6.0.0' google-auth: '>=2.15.0' + url: https://conda.anaconda.org/conda-forge/noarch/google-auth-oauthlib-1.2.0-pyhd8ed1ab_0.conda + hash: + md5: 2057f12885a73b4d621c075423cec969 + sha256: 39d031780d9ac2da430ead078a40ff67db3ad57e24ab1e3c68b4e0f2b48a2311 + category: main + optional: false +- name: google-auth-oauthlib + version: 1.2.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' requests-oauthlib: '>=0.7.0' + click: '>=6.0.0' + google-auth: '>=2.15.0' url: https://conda.anaconda.org/conda-forge/noarch/google-auth-oauthlib-1.2.0-pyhd8ed1ab_0.conda hash: md5: 2057f12885a73b4d621c075423cec969 @@ -4712,39 +7067,65 @@ package: - name: google-cloud-bigquery version: 3.19.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - db-dtypes: '>=0.3.0,<2.0.0dev' + python: '>=3.8' + protobuf: '>=3.19.5,<5.0.0dev,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' + pandas: '>=1.1.0' + tqdm: '>=4.7.4,<=5.0.0dev' + proto-plus: '>=1.15.0,<2.0.0dev' geopandas: '>=0.9.0,<1.0dev' - google-cloud-bigquery-core: 3.19.0 - google-cloud-bigquery-storage: '>=2.6.0,<3.0.0dev' + pyarrow: '>=3.0.0' + db-dtypes: '>=0.3.0,<2.0.0dev' grpcio: '>=1.49.1,<2.0dev' + ipywidgets: '>=7.7.0' ipykernel: '>=6.0.0' ipython: '>=7.23.1,!=8.1.0' - ipywidgets: '>=7.7.0' - pandas: '>=1.1.0' - proto-plus: '>=1.15.0,<2.0.0dev' - protobuf: '>=3.19.5,<5.0.0dev,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' - pyarrow: '>=3.0.0' - python: '>=3.8' + google-cloud-bigquery-storage: '>=2.6.0,<3.0.0dev' shapely: '>=1.8.4,<3.0.0dev' - tqdm: '>=4.7.4,<=5.0.0dev' + google-cloud-bigquery-core: 3.19.0 url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.19.0-pyhd8ed1ab_0.conda hash: md5: dd4a8cca66b72bee53373e2926f1d39c sha256: a134a103b50285e521eeaa5bffd6b0b7efb69e6ab2e15f46354105e0d6ede412 category: main optional: false -- name: google-cloud-bigquery-core +- name: google-cloud-bigquery version: 3.19.0 manager: conda - platform: linux-64 + platform: osx-arm64 dependencies: - google-api-core-grpc: '>=1.34.1,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' - google-auth: '>=2.14.1,<3.0.0dev' - google-cloud-core: '>=1.6.0,<3.0.0dev' - google-resumable-media: '>=0.6.0,<3.0dev' - packaging: '>=20.0.0' + python: '>=3.8' + protobuf: '>=3.19.5,<5.0.0dev,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' + pandas: '>=1.1.0' + tqdm: '>=4.7.4,<=5.0.0dev' + proto-plus: '>=1.15.0,<2.0.0dev' + geopandas: '>=0.9.0,<1.0dev' + pyarrow: '>=3.0.0' + db-dtypes: '>=0.3.0,<2.0.0dev' + grpcio: '>=1.49.1,<2.0dev' + ipywidgets: '>=7.7.0' + ipykernel: '>=6.0.0' + ipython: '>=7.23.1,!=8.1.0' + google-cloud-bigquery-storage: '>=2.6.0,<3.0.0dev' + shapely: '>=1.8.4,<3.0.0dev' + google-cloud-bigquery-core: 3.19.0 + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.19.0-pyhd8ed1ab_0.conda + hash: + md5: dd4a8cca66b72bee53373e2926f1d39c + sha256: a134a103b50285e521eeaa5bffd6b0b7efb69e6ab2e15f46354105e0d6ede412 + category: main + optional: false +- name: google-cloud-bigquery-core + version: 3.19.0 + manager: conda + platform: linux-64 + dependencies: + google-api-core-grpc: '>=1.34.1,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' + google-auth: '>=2.14.1,<3.0.0dev' + google-cloud-core: '>=1.6.0,<3.0.0dev' + google-resumable-media: '>=0.6.0,<3.0dev' + packaging: '>=20.0.0' python: '>=3.8' python-dateutil: '>=2.7.2,<3.0dev' requests: '>=2.21.0,<3.0.0dev' @@ -4757,16 +7138,35 @@ package: - name: google-cloud-bigquery-core version: 3.19.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - google-api-core-grpc: '>=1.34.1,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' - google-auth: '>=2.14.1,<3.0.0dev' - google-cloud-core: '>=1.6.0,<3.0.0dev' + python: '>=3.8' google-resumable-media: '>=0.6.0,<3.0dev' + google-auth: '>=2.14.1,<3.0.0dev' + python-dateutil: '>=2.7.2,<3.0dev' packaging: '>=20.0.0' + requests: '>=2.21.0,<3.0.0dev' + google-cloud-core: '>=1.6.0,<3.0.0dev' + google-api-core-grpc: '>=1.34.1,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.19.0-pyhd8ed1ab_0.conda + hash: + md5: e9a57c9845bcbaf6df5cb006b399d690 + sha256: 910415a2a06c29585957638f83837c6f5fb7b901de27eebbebff1cceecbdd682 + category: main + optional: false +- name: google-cloud-bigquery-core + version: 3.19.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + google-resumable-media: '>=0.6.0,<3.0dev' + google-auth: '>=2.14.1,<3.0.0dev' python-dateutil: '>=2.7.2,<3.0dev' + packaging: '>=20.0.0' requests: '>=2.21.0,<3.0.0dev' + google-cloud-core: '>=1.6.0,<3.0.0dev' + google-api-core-grpc: '>=1.34.1,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.19.0-pyhd8ed1ab_0.conda hash: md5: e9a57c9845bcbaf6df5cb006b399d690 @@ -4792,13 +7192,29 @@ package: - name: google-cloud-bigquery-storage version: 2.24.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' + pyarrow: '>=0.15.0' fastavro: '>=0.21.2' - google-cloud-bigquery-storage-core: 2.24.0.* pandas: '>=0.21.1' - pyarrow: '>=0.15.0' + google-cloud-bigquery-storage-core: 2.24.0.* + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-storage-2.24.0-pyhca7485f_0.conda + hash: + md5: 86a0630f1f8b18915d909503f17ca1e0 + sha256: 63935dd8bdc4da2d8164ada820492b7ec9beba3197b5cb9ab34495d8fd56b0cd + category: main + optional: false +- name: google-cloud-bigquery-storage + version: 2.24.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + pyarrow: '>=0.15.0' + fastavro: '>=0.21.2' + pandas: '>=0.21.1' + google-cloud-bigquery-storage-core: 2.24.0.* url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-storage-2.24.0-pyhca7485f_0.conda hash: md5: 86a0630f1f8b18915d909503f17ca1e0 @@ -4823,12 +7239,27 @@ package: - name: google-cloud-bigquery-storage-core version: 2.24.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - google-api-core-grpc: '>=1.34.0,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' - proto-plus: '>=1.22.0,<2.0.0dev' + python: '>=3.8' protobuf: '>=3.19.5,<5.0.0dev,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' + proto-plus: '>=1.22.0,<2.0.0dev' + google-api-core-grpc: '>=1.34.0,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-storage-core-2.24.0-pyhca7485f_0.conda + hash: + md5: 1d1a6f7938f1a29044e676d112c0b424 + sha256: 60994f98e7386bd5836dd04b74112d30286df2bb15e8edf2f2d460dd37821860 + category: main + optional: false +- name: google-cloud-bigquery-storage-core + version: 2.24.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + protobuf: '>=3.19.5,<5.0.0dev,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' + proto-plus: '>=1.22.0,<2.0.0dev' + google-api-core-grpc: '>=1.34.0,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-storage-core-2.24.0-pyhca7485f_0.conda hash: md5: 1d1a6f7938f1a29044e676d112c0b424 @@ -4853,12 +7284,27 @@ package: - name: google-cloud-core version: 2.4.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - google-api-core: '>=1.31.6,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0' + python: '>=3.8' google-auth: '>=1.25.0,<3.0dev' + google-api-core: '>=1.31.6,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0' grpcio: '>=1.38.0,<2.0.0dev' + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.4.1-pyhd8ed1ab_0.conda + hash: + md5: 1853cdebbfe25fb6ee253855a44945a6 + sha256: d01b787bad2ec4da9536ce2cedb3e53ed092fe6a4a596c043ab358bb9b2fbcdd + category: main + optional: false +- name: google-cloud-core + version: 2.4.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + google-auth: '>=1.25.0,<3.0dev' + google-api-core: '>=1.31.6,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0' + grpcio: '>=1.38.0,<2.0.0dev' url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.4.1-pyhd8ed1ab_0.conda hash: md5: 1853cdebbfe25fb6ee253855a44945a6 @@ -4866,41 +7312,60 @@ package: category: main optional: false - name: google-cloud-storage - version: 2.14.0 + version: 2.16.0 manager: conda platform: linux-64 dependencies: - google-api-core: '>=1.31.5,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0' - google-auth: '>=2.23.3,<3.0dev' + google-api-core: '>=2.15.0,<3.0.0dev' + google-auth: '>=2.26.1,<3.0dev' google-cloud-core: '>=2.3.0,<3.0dev' google-crc32c: '>=1.0,<2.0dev' google-resumable-media: '>=2.6.0' protobuf: <5.0.0dev - python: '>=3.6' + python: '>=3.7' requests: '>=2.18.0,<3.0.0dev' - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-2.14.0-pyhca7485f_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-2.16.0-pyhca7485f_0.conda hash: - md5: 7b2a2b429fd0b5571544019a6814cfe4 - sha256: 175e88ea6e9cf353d63dfbb0007cb6be9240ab795c38ca4b5d5101b576383698 + md5: a465dd6977e00f7fd955f03e787a745b + sha256: 7c196842cb591516d10af4f90fbf046085f459a326b9cf0e3946f5ec8cae2fbd category: main optional: false - name: google-cloud-storage - version: 2.14.0 + version: 2.16.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - google-api-core: '>=1.31.5,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0' - google-auth: '>=2.23.3,<3.0dev' + python: '>=3.7' + requests: '>=2.18.0,<3.0.0dev' google-cloud-core: '>=2.3.0,<3.0dev' google-crc32c: '>=1.0,<2.0dev' - google-resumable-media: '>=2.6.0' protobuf: <5.0.0dev - python: '>=3.6' + google-resumable-media: '>=2.6.0' + google-api-core: '>=2.15.0,<3.0.0dev' + google-auth: '>=2.26.1,<3.0dev' + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-2.16.0-pyhca7485f_0.conda + hash: + md5: a465dd6977e00f7fd955f03e787a745b + sha256: 7c196842cb591516d10af4f90fbf046085f459a326b9cf0e3946f5ec8cae2fbd + category: main + optional: false +- name: google-cloud-storage + version: 2.16.0 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.7' requests: '>=2.18.0,<3.0.0dev' - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-2.14.0-pyhca7485f_0.conda + google-cloud-core: '>=2.3.0,<3.0dev' + google-crc32c: '>=1.0,<2.0dev' + protobuf: <5.0.0dev + google-resumable-media: '>=2.6.0' + google-api-core: '>=2.15.0,<3.0.0dev' + google-auth: '>=2.26.1,<3.0dev' + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-2.16.0-pyhca7485f_0.conda hash: - md5: 7b2a2b429fd0b5571544019a6814cfe4 - sha256: 175e88ea6e9cf353d63dfbb0007cb6be9240ab795c38ca4b5d5101b576383698 + md5: a465dd6977e00f7fd955f03e787a745b + sha256: 7c196842cb591516d10af4f90fbf046085f459a326b9cf0e3946f5ec8cae2fbd category: main optional: false - name: google-crc32c @@ -4919,6 +7384,21 @@ package: sha256: 21aefa9eb310072f0b2b9315db5fcc483be9a68376ceabf259095456faf7d65e category: main optional: false +- name: google-crc32c + version: 1.1.2 + manager: conda + platform: osx-64 + dependencies: + cffi: '>=1.0.0' + libcrc32c: '>=1.1.2,<1.2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/google-crc32c-1.1.2-py39heba5dd3_5.conda + hash: + md5: 7f1909cffc2854341b9f00ef62bb6187 + sha256: ba88eb2c1785f26e16ef1e9fa84c8356d6d05903557f5f6250ab053e499a0911 + category: main + optional: false - name: google-crc32c version: 1.1.2 manager: conda @@ -4947,6 +7427,19 @@ package: sha256: 6fe6859982e0600bc2347df4e4ad2b374971f1b913fbae468658e40e9095e748 category: main optional: false +- name: google-pasta + version: 0.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '' + six: '' + url: https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyh8c360ce_0.tar.bz2 + hash: + md5: 26e27d7d3d7fe2336b543dd8e0f12cbf + sha256: 6fe6859982e0600bc2347df4e4ad2b374971f1b913fbae468658e40e9095e748 + category: main + optional: false - name: google-pasta version: 0.2.0 manager: conda @@ -4976,10 +7469,23 @@ package: - name: google-resumable-media version: 2.7.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' google-crc32c: '>=1.0,<2.0.0dev' + url: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.7.0-pyhd8ed1ab_0.conda + hash: + md5: 28d1e160d8b2e405b16bb40773135225 + sha256: b7f08e89a491cfaa904328b96c1700da18d2cc33affefc2d15077e03ad4ec8bf + category: main + optional: false +- name: google-resumable-media + version: 2.7.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + google-crc32c: '>=1.0,<2.0.0dev' url: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.7.0-pyhd8ed1ab_0.conda hash: md5: 28d1e160d8b2e405b16bb40773135225 @@ -5002,10 +7508,23 @@ package: - name: googleapis-common-protos version: 1.63.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' protobuf: '>=3.19.5,<5.0.0dev0,!=3.20.0,!=3.20.1,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' + url: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.63.0-pyhd8ed1ab_0.conda + hash: + md5: 058e77f4f0285aa4945c5539de931ff0 + sha256: 41d3eea46623836e2be7234bdbfc0e7a42fc0853229c687cea6d7b652bb4a4fa + category: main + optional: false +- name: googleapis-common-protos + version: 1.63.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + protobuf: '>=3.19.5,<5.0.0dev0,!=3.20.0,!=3.20.1,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' url: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.63.0-pyhd8ed1ab_0.conda hash: md5: 058e77f4f0285aa4945c5539de931ff0 @@ -5017,12 +7536,24 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=7.5.0' - libstdcxx-ng: '>=7.5.0' - url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2 + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + hash: + md5: f87c7b7c2cb45f323ffbce941c78ab7c + sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add + category: main + optional: false +- name: graphite2 + version: 1.3.13 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.13-h73e2aa4_1003.conda hash: - md5: 8c54672728e8ec6aa6db90cf2806d220 - sha256: 65da967f3101b737b08222de6a6a14e20e480e7d523a5d1e19ace7b960b5d6b1 + md5: fc7124f86e1d359fc5d878accd9e814c + sha256: b71db966e47cd83b16bfcc2099b8fa87c07286f24a0742078fede4c84314f91a category: main optional: false - name: graphite2 @@ -5030,11 +7561,11 @@ package: manager: conda platform: osx-arm64 dependencies: - libcxx: '>=11.0.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.13-h9f76cd9_1001.tar.bz2 + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.13-hebf3989_1003.conda hash: - md5: 288b591645cb9cb9c0af7309ac1114f5 - sha256: 57db1e563cdfe469cd453a2988039118e96ce4b77c9219e2f1022be0e1c2b03f + md5: 339991336eeddb70076d8ca826dac625 + sha256: 2eadafbfc52f5e7df3da3c3b7e5bbe34d970bea1d645ffe60b0b1c3a216657f5 category: main optional: false - name: graphviz @@ -5062,6 +7593,31 @@ package: sha256: 1813800d655c120a3941d543a6fc64e3c178c737f1c84f6b7ebe1f19f27fa4fb category: main optional: false +- name: graphviz + version: 9.0.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + cairo: '>=1.18.0,<2.0a0' + fonts-conda-ecosystem: '' + gdk-pixbuf: '>=2.42.10,<3.0a0' + gtk2: '' + gts: '>=0.7.6,<0.8.0a0' + libcxx: '>=16.0.6' + libexpat: '>=2.5.0,<3.0a0' + libgd: '>=2.3.3,<2.4.0a0' + libglib: '>=2.78.1,<3.0a0' + librsvg: '>=2.56.3,<3.0a0' + libwebp-base: '>=1.3.2,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + pango: '>=1.50.14,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/graphviz-9.0.0-hee74176_1.conda + hash: + md5: 7cd479251093c332aa9fe93cfb8f698b + sha256: 3080dc2f9ea708af0ea94d49348cff05884a149214a5e225e9647eff4cdac849 + category: main + optional: false - name: graphviz version: 9.0.0 manager: conda @@ -5088,7 +7644,7 @@ package: category: main optional: false - name: great-expectations - version: 0.18.11 + version: 0.18.12 manager: conda platform: linux-64 dependencies: @@ -5121,50 +7677,90 @@ package: typing-extensions: '>=3.10.0.0' tzlocal: '>=1.2' urllib3: '>=1.26' - url: https://conda.anaconda.org/conda-forge/noarch/great-expectations-0.18.11-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/great-expectations-0.18.12-pyhd8ed1ab_0.conda hash: - md5: f5fec30dfe5c45d15f7de3dac276d965 - sha256: 3c95a8573889782fc227cc6e5273e80cba9fde10af314d86e5868ae9cae74bfe + md5: bb82b4df54271dfecebe07f7da6d7a59 + sha256: 4f0a1928d265f69eadf97e96c48a6ca3fdbd66690da8026c80c2478be6be5456 category: main optional: false - name: great-expectations - version: 0.18.11 + version: 0.18.12 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - altair: '>=4.2.1,<5.0.0' + packaging: '' + python: '>=3.8' + requests: '>=2.20' + jinja2: '>=2.10' + python-dateutil: '>=2.8.1' + pandas: '>=1.1.0' click: '>=7.1.2' - colorama: '>=0.4.3' - cryptography: '>=3.2' - ipython: '>=7.16.3' ipywidgets: '>=7.5.1' - jinja2: '>=2.10' - jsonpatch: '>=1.22' + colorama: '>=0.4.3' jsonschema: '>=2.5.1' - makefun: '>=1.7.0,<2' - marshmallow: '>=3.7.1,<4.0.0' + tqdm: '>=4.59.0' + scipy: '>=1.6.0' + tzlocal: '>=1.2' + jsonpatch: '>=1.22' mistune: '>=0.8.4' + typing-extensions: '>=3.10.0.0' + pytz: '>=2021.3' nbformat: '>=5.0' + ruamel.yaml: '>=0.16,<0.17.18' + urllib3: '>=1.26' + ipython: '>=7.16.3' + cryptography: '>=3.2' notebook: '>=6.4.10' + pyparsing: '>=2.4' + makefun: '>=1.7.0,<2' + marshmallow: '>=3.7.1,<4.0.0' numpy: '>=1.20.3' - packaging: '' - pandas: '>=1.1.0' + altair: '>=4.2.1,<5.0.0' pydantic: '>=1.9.2' - pyparsing: '>=2.4' + url: https://conda.anaconda.org/conda-forge/noarch/great-expectations-0.18.12-pyhd8ed1ab_0.conda + hash: + md5: bb82b4df54271dfecebe07f7da6d7a59 + sha256: 4f0a1928d265f69eadf97e96c48a6ca3fdbd66690da8026c80c2478be6be5456 + category: main + optional: false +- name: great-expectations + version: 0.18.12 + manager: conda + platform: osx-arm64 + dependencies: + packaging: '' python: '>=3.8' - python-dateutil: '>=2.8.1' - pytz: '>=2021.3' requests: '>=2.20' - ruamel.yaml: '>=0.16,<0.17.18' - scipy: '>=1.6.0' + jinja2: '>=2.10' + python-dateutil: '>=2.8.1' + pandas: '>=1.1.0' + click: '>=7.1.2' + ipywidgets: '>=7.5.1' + colorama: '>=0.4.3' + jsonschema: '>=2.5.1' tqdm: '>=4.59.0' - typing-extensions: '>=3.10.0.0' + scipy: '>=1.6.0' tzlocal: '>=1.2' + jsonpatch: '>=1.22' + mistune: '>=0.8.4' + typing-extensions: '>=3.10.0.0' + pytz: '>=2021.3' + nbformat: '>=5.0' + ruamel.yaml: '>=0.16,<0.17.18' urllib3: '>=1.26' - url: https://conda.anaconda.org/conda-forge/noarch/great-expectations-0.18.11-pyhd8ed1ab_0.conda + ipython: '>=7.16.3' + cryptography: '>=3.2' + notebook: '>=6.4.10' + pyparsing: '>=2.4' + makefun: '>=1.7.0,<2' + marshmallow: '>=3.7.1,<4.0.0' + numpy: '>=1.20.3' + altair: '>=4.2.1,<5.0.0' + pydantic: '>=1.9.2' + url: https://conda.anaconda.org/conda-forge/noarch/great-expectations-0.18.12-pyhd8ed1ab_0.conda hash: - md5: f5fec30dfe5c45d15f7de3dac276d965 - sha256: 3c95a8573889782fc227cc6e5273e80cba9fde10af314d86e5868ae9cae74bfe + md5: bb82b4df54271dfecebe07f7da6d7a59 + sha256: 4f0a1928d265f69eadf97e96c48a6ca3fdbd66690da8026c80c2478be6be5456 category: main optional: false - name: greenlet @@ -5182,6 +7778,20 @@ package: sha256: 3cc114aaf9051dc40dc63be9969284a6691fdbf9d55668a7e245de9bc3bbcf38 category: main optional: false +- name: greenlet + version: 3.0.3 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/greenlet-3.0.3-py39hd253f6c_0.conda + hash: + md5: 49761a832d2843cb4fee86788f44d0f5 + sha256: 13f0152db5f0d4002862e5c8287e33d648a5301474cf3e9ed6e12009d3050651 + category: main + optional: false - name: greenlet version: 3.0.3 manager: conda @@ -5213,20 +7823,38 @@ package: sha256: 7136df5e62c5af83981e29733f95fe88140d9f02def426db5302f01777f43b24 category: main optional: false +- name: grpcio + version: 1.59.3 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + libgrpc: 1.59.3 + libzlib: '>=1.2.13,<1.3.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.59.3-py39h512e3ab_0.conda + hash: + md5: c41a6dcb4b7620902b304a5b296db491 + sha256: 905aaf937f6884180490ddc9a43b98114c976f343ea0cb0c3d052ab92cff5f00 + category: main + optional: false - name: grpcio version: 1.59.3 manager: conda platform: osx-arm64 dependencies: - libcxx: '>=16' + __osx: '>=10.9' + libcxx: '>=16.0.6' libgrpc: 1.59.3 libzlib: '>=1.2.13,<1.3.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.59.3-py39h047a24b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.59.3-py39h52f163a_0.conda hash: - md5: 1afaf768107e5ab3284afb7d64d4a99c - sha256: 9f508baa6330ecf5a4a8129049e25ae40b2e534979a52995a6df08d8b65b7651 + md5: 65c1499ad010b38f0acab66e753f43b8 + sha256: 9939546b8eaf9a5666b31f872e6d70950139b108a557f3a1a3f14f0548af1fb3 category: main optional: false - name: grpcio-status @@ -5247,18 +7875,116 @@ package: - name: grpcio-status version: 1.59.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' googleapis-common-protos: '>=1.5.5' - grpcio: '>=1.59.3' protobuf: '>=4.21.6' + grpcio: '>=1.59.3' + url: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.59.3-pyhd8ed1ab_0.conda + hash: + md5: 667999da148378ada5b9f13e7f3850c3 + sha256: 45c00a3feaf80f29cbc4b2f6a7ef73b08ce4e4a847b32a82eed443c7dd95d0c9 + category: main + optional: false +- name: grpcio-status + version: 1.59.3 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + googleapis-common-protos: '>=1.5.5' + protobuf: '>=4.21.6' + grpcio: '>=1.59.3' url: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.59.3-pyhd8ed1ab_0.conda hash: md5: 667999da148378ada5b9f13e7f3850c3 sha256: 45c00a3feaf80f29cbc4b2f6a7ef73b08ce4e4a847b32a82eed443c7dd95d0c9 category: main optional: false +- name: gst-plugins-base + version: 1.22.9 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + alsa-lib: '>=1.2.10,<1.3.0.0a0' + gettext: '>=0.21.1,<1.0a0' + gstreamer: 1.22.9 + libexpat: '>=2.5.0,<3.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.3,<3.0a0' + libogg: '>=1.3.4,<1.4.0a0' + libopus: '>=1.3.1,<2.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=12' + libvorbis: '>=1.3.7,<1.4.0a0' + libxcb: '>=1.15,<1.16.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xorg-libx11: '>=1.8.7,<2.0a0' + xorg-libxau: '>=1.0.11,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-libxrender: '>=0.9.11,<0.10.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda + hash: + md5: 614b81f8ed66c56b640faee7076ad14a + sha256: a4312c96a670fdbf9ff0c3efd935e42fa4b655ff33dcc52c309b76a2afaf03f0 + category: main + optional: false +- name: gst-plugins-base + version: 1.22.9 + manager: conda + platform: osx-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + gstreamer: 1.22.9 + libcxx: '>=15' + libglib: '>=2.78.3,<3.0a0' + libogg: '>=1.3.4,<1.4.0a0' + libopus: '>=1.3.1,<2.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libvorbis: '>=1.3.7,<1.4.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/gst-plugins-base-1.22.9-h3fb38fc_0.conda + hash: + md5: a0a4e1596c79cb67ba243e5e4dfd559f + sha256: c633c837b6e24da03129144ac1ab5940f43035a639b39bb2a1b086ea2f025e8f + category: main + optional: false +- name: gstreamer + version: 1.22.9 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + gettext: '>=0.21.1,<1.0a0' + glib: '>=2.78.3,<3.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.3,<3.0a0' + libiconv: '>=1.17,<2.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_0.conda + hash: + md5: bcc7157b06fce7f5e055402a8135dfd8 + sha256: aa2395bf1790f72d2706bac77430f765ec1318ca22e60e791c13ae452c045263 + category: main + optional: false +- name: gstreamer + version: 1.22.9 + manager: conda + platform: osx-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + glib: '>=2.78.3,<3.0a0' + libcxx: '>=15' + libglib: '>=2.78.3,<3.0a0' + libiconv: '>=1.17,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/gstreamer-1.22.9-hf63bbb8_0.conda + hash: + md5: 1581bb03c4655191284a3eab9ee8690d + sha256: be9d64972f997e1f865673cbb059a8c653f1fb38ff5e6c6a049699823bad0d9f + category: main + optional: false - name: gtk2 version: 2.24.33 manager: conda @@ -5283,6 +8009,23 @@ package: sha256: b946ba60d177d72157cad8af51723f1d081a4794741d35debe53f8b2c807f3af category: main optional: false +- name: gtk2 + version: 2.24.33 + manager: conda + platform: osx-64 + dependencies: + atk-1.0: '>=2.38.0' + cairo: '>=1.18.0,<2.0a0' + gdk-pixbuf: '>=2.42.10,<3.0a0' + gettext: '>=0.21.1,<1.0a0' + libglib: '>=2.78.4,<3.0a0' + pango: '>=1.50.14,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/gtk2-2.24.33-h8ca4665_4.conda + hash: + md5: ff451625250bf843393ca3d660accab3 + sha256: 5283dfb9a96d78a67e0cbf6e4592411bb19eaf27f2c7c14b47e63162e71317d2 + category: main + optional: false - name: gtk2 version: 2.24.33 manager: conda @@ -5314,6 +8057,19 @@ package: sha256: b5cd16262fefb836f69dc26d879b6508d29f8a5c5948a966c47fe99e2e19c99b category: main optional: false +- name: gts + version: 0.7.6 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + libglib: '>=2.76.3,<3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda + hash: + md5: 848cc963fcfbd063c7a023024aa3bec0 + sha256: d5b82a36f7e9d7636b854e56d1b4fe01c4d895128a7b73e2ec6945b691ff3314 + category: main + optional: false - name: gts version: 0.7.6 manager: conda @@ -5342,6 +8098,21 @@ package: sha256: a96b3b110bd9e8d0c3199209adf797923592f02d1869d716e320b0edc61a1785 category: main optional: false +- name: gunicorn + version: 21.2.0 + manager: conda + platform: osx-64 + dependencies: + packaging: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + setuptools: '>=3.0' + url: https://conda.anaconda.org/conda-forge/osx-64/gunicorn-21.2.0-py39h6e9494a_1.conda + hash: + md5: fa8ff108ccec5fa7bc5fd3622b30f0cd + sha256: c852849bfd342702145799141079bee72148b54a560b344b301821799285e6c6 + category: main + optional: false - name: gunicorn version: 21.2.0 manager: conda @@ -5373,10 +8144,23 @@ package: - name: h11 version: 0.14.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + typing_extensions: '' python: '>=3' + url: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: b21ed0883505ba1910994f1df031a428 + sha256: 817d2c77d53afe3f3d9cf7f6eb8745cdd8ea76c7adaa9d7ced75c455a2c2c085 + category: main + optional: false +- name: h11 + version: 0.14.0 + manager: conda + platform: osx-arm64 + dependencies: typing_extensions: '' + python: '>=3' url: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 hash: md5: b21ed0883505ba1910994f1df031a428 @@ -5390,21 +8174,37 @@ package: dependencies: hpack: '>=4.0,<5' hyperframe: '>=6.0,<7' - python: '>=3.6.1' - url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/linux-64/h2-4.1.0-py39hf3d152e_0.tar.bz2 hash: - md5: b748fbf7060927a6e82df7cb5ee8f097 - sha256: bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a + md5: 4d6e35bbcba4f0c06f02a285f5602333 + sha256: f2aaa56f152e889f2f9d7db78f4b0534dce91c8de3e2a5b2627fbfcb01b14054 category: main optional: false - name: h2 version: 4.1.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: hpack: '>=4.0,<5' hyperframe: '>=6.0,<7' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/h2-4.1.0-py39h6e9494a_0.tar.bz2 + hash: + md5: d926c73961d5ccfe6e8b2b18a9316a9a + sha256: 0d0b28ed10072f3e58c66992a1af76f7e7ea9c0922b04821955b05039dbca414 + category: main + optional: false +- name: h2 + version: 4.1.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6.1' + hpack: '>=4.0,<5' + hyperframe: '>=6.0,<7' url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 hash: md5: b748fbf7060927a6e82df7cb5ee8f097 @@ -5428,6 +8228,22 @@ package: sha256: eb19a7f87d770612ab0267427d2f0ac07a0d5584d9e4d539019e7e934a2a3278 category: main optional: false +- name: h5py + version: 3.10.0 + manager: conda + platform: osx-64 + dependencies: + cached-property: '' + hdf5: '>=1.14.3,<1.14.4.0a0' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.10.0-nompi_py39h9420513_101.conda + hash: + md5: 60e349d82eecd97910178c43c5c8c83d + sha256: 598656f6f12f4fe3826ed5ce107c78dfb8a7cec61b9e11e6ea24836d7ba09f09 + category: main + optional: false - name: h5py version: 3.10.0 manager: conda @@ -5462,6 +8278,24 @@ package: sha256: 4b55aea03b18a4084b750eee531ad978d4a3690f63019132c26c6ad26bbe3aed category: main optional: false +- name: harfbuzz + version: 8.3.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + cairo: '>=1.18.0,<2.0a0' + freetype: '>=2.12.1,<3.0a0' + graphite2: '' + icu: '>=73.2,<74.0a0' + libcxx: '>=16.0.6' + libglib: '>=2.78.1,<3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.3.0-hf45c392_0.conda + hash: + md5: 41d890485f909e4ecdc608741718c75e + sha256: c6ea14e4f4869bc78b27276c09832af845dfa415585362ed6064e37a1b5fe9c5 + category: main + optional: false - name: harfbuzz version: 8.3.0 manager: conda @@ -5495,6 +8329,20 @@ package: sha256: 0d09b6dc1ce5c4005ae1c6a19dc10767932ef9a5e9c755cfdbb5189ac8fb0684 category: main optional: false +- name: hdf4 + version: 4.2.15 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/hdf4-4.2.15-h8138101_7.conda + hash: + md5: 7ce543bf38dbfae0de9af112ee178af2 + sha256: 8c767cc71226e9eb62649c903c68ba73c5f5e7e3696ec0319d1f90586cebec7d + category: main + optional: false - name: hdf4 version: 4.2.15 manager: conda @@ -5528,6 +8376,25 @@ package: sha256: b814f8f9598cc6e50127533ec256725183ba69db5fd8cf5443223627f19e3e59 category: main optional: false +- name: hdf5 + version: 1.14.3 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libaec: '>=1.1.2,<2.0a0' + libcurl: '>=8.4.0,<9.0a0' + libcxx: '>=16.0.6' + libgfortran: 5.* + libgfortran5: '>=13.2.0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.3-nompi_h691f4bf_100.conda + hash: + md5: 8e2ac4ae815a8c9743fe37d70f48f075 + sha256: 158dd2ab901659b47e8f7ee0ec1d9e45a1fedc4871391a44a1c8b9e8ba4c9c6b + category: main + optional: false - name: hdf5 version: 1.14.3 manager: conda @@ -5562,7 +8429,7 @@ package: - name: hpack version: 4.0.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: python: '' url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 @@ -5571,38 +8438,67 @@ package: sha256: 5dec948932c4f740674b1afb551223ada0c55103f4c7bf86a110454da3d27cb8 category: main optional: false -- name: httpcore - version: 1.0.4 +- name: hpack + version: 4.0.0 manager: conda - platform: linux-64 + platform: osx-arm64 dependencies: - anyio: '>=3.0,<5.0' - certifi: '' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + hash: + md5: 914d6646c4dbb1fd3ff539830a12fd71 + sha256: 5dec948932c4f740674b1afb551223ada0c55103f4c7bf86a110454da3d27cb8 + category: main + optional: false +- name: httpcore + version: 1.0.5 + manager: conda + platform: linux-64 + dependencies: + anyio: '>=3.0,<5.0' + certifi: '' h11: '>=0.13,<0.15' h2: '>=3,<5' python: '>=3.8' sniffio: 1.* - url: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda hash: - md5: 20f047662cf4fa8b97836111df87dbb4 - sha256: dec07ca00223d52433e7c20c71d5e645a7828b3e50206d855ad7a540869341f2 + md5: a6b9a0158301e697e4d0a36a3d60e133 + sha256: 4025644200eefa0598e4600a66fd4804a57d9fd7054a5c8c45e508fd875e0b84 category: main optional: false - name: httpcore - version: 1.0.4 + version: 1.0.5 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - anyio: '>=3.0,<5.0' certifi: '' - h11: '>=0.13,<0.15' + python: '>=3.8' + sniffio: 1.* h2: '>=3,<5' + anyio: '>=3.0,<5.0' + h11: '>=0.13,<0.15' + url: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + hash: + md5: a6b9a0158301e697e4d0a36a3d60e133 + sha256: 4025644200eefa0598e4600a66fd4804a57d9fd7054a5c8c45e508fd875e0b84 + category: main + optional: false +- name: httpcore + version: 1.0.5 + manager: conda + platform: osx-arm64 + dependencies: + certifi: '' python: '>=3.8' sniffio: 1.* - url: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.4-pyhd8ed1ab_0.conda + h2: '>=3,<5' + anyio: '>=3.0,<5.0' + h11: '>=0.13,<0.15' + url: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda hash: - md5: 20f047662cf4fa8b97836111df87dbb4 - sha256: dec07ca00223d52433e7c20c71d5e645a7828b3e50206d855ad7a540869341f2 + md5: a6b9a0158301e697e4d0a36a3d60e133 + sha256: 4025644200eefa0598e4600a66fd4804a57d9fd7054a5c8c45e508fd875e0b84 category: main optional: false - name: httpx @@ -5625,14 +8521,31 @@ package: - name: httpx version: 0.27.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - anyio: '' certifi: '' - httpcore: 1.* idna: '' + anyio: '' + sniffio: '' python: '>=3.8' + httpcore: 1.* + url: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + hash: + md5: 9f359af5a886fd6ca6b2b6ea02e58332 + sha256: fdaf341fb2630b7afe8238315448fc93947f77ebfa4da68bb349e1bcf820af58 + category: main + optional: false +- name: httpx + version: 0.27.0 + manager: conda + platform: osx-arm64 + dependencies: + certifi: '' + idna: '' + anyio: '' sniffio: '' + python: '>=3.8' + httpcore: 1.* url: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda hash: md5: 9f359af5a886fd6ca6b2b6ea02e58332 @@ -5640,7 +8553,7 @@ package: category: main optional: false - name: huggingface_hub - version: 0.21.4 + version: 0.22.1 manager: conda platform: linux-64 dependencies: @@ -5652,29 +8565,48 @@ package: requests: '' tqdm: '>=4.42.1' typing-extensions: '>=3.7.4.3' - url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.21.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.22.1-pyhd8ed1ab_0.conda hash: - md5: d47cf217a7bcc3a03dd1c6169c3f0f98 - sha256: e748e5f1ed8cbcbdcc4dd0e0da14063687bb1c3b65c4266f81b73cb56801805e + md5: b9f58e10a6247f5ca5d70a6040f62943 + sha256: 2b6e1276089d2563b047497ecc1ce9d4a502594852c46886f881a4129d1993ce category: main optional: false - name: huggingface_hub - version: 0.21.4 + version: 0.22.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + requests: '' filelock: '' - fsspec: '>=2023.5.0' - packaging: '>=20.9' python: '>=3.8' pyyaml: '>=5.1' - requests: '' + packaging: '>=20.9' + typing-extensions: '>=3.7.4.3' + fsspec: '>=2023.5.0' tqdm: '>=4.42.1' + url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.22.1-pyhd8ed1ab_0.conda + hash: + md5: b9f58e10a6247f5ca5d70a6040f62943 + sha256: 2b6e1276089d2563b047497ecc1ce9d4a502594852c46886f881a4129d1993ce + category: main + optional: false +- name: huggingface_hub + version: 0.22.1 + manager: conda + platform: osx-arm64 + dependencies: + requests: '' + filelock: '' + python: '>=3.8' + pyyaml: '>=5.1' + packaging: '>=20.9' typing-extensions: '>=3.7.4.3' - url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.21.4-pyhd8ed1ab_0.conda + fsspec: '>=2023.5.0' + tqdm: '>=4.42.1' + url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.22.1-pyhd8ed1ab_0.conda hash: - md5: d47cf217a7bcc3a03dd1c6169c3f0f98 - sha256: e748e5f1ed8cbcbdcc4dd0e0da14063687bb1c3b65c4266f81b73cb56801805e + md5: b9f58e10a6247f5ca5d70a6040f62943 + sha256: 2b6e1276089d2563b047497ecc1ce9d4a502594852c46886f881a4129d1993ce category: main optional: false - name: hyperframe @@ -5689,6 +8621,18 @@ package: sha256: e374a9d0f53149328134a8d86f5d72bca4c6dcebed3c0ecfa968c02996289330 category: main optional: false +- name: hyperframe + version: 6.0.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 9f765cbfab6870c8435b9eefecd7a1f4 + sha256: e374a9d0f53149328134a8d86f5d72bca4c6dcebed3c0ecfa968c02996289330 + category: main + optional: false - name: hyperframe version: 6.0.1 manager: conda @@ -5714,6 +8658,17 @@ package: sha256: e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8 category: main optional: false +- name: icu + version: '73.2' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda + hash: + md5: 5cc301d759ec03f28328428e28f65591 + sha256: f66362dc36178ac9b7c7a9b012948a9d2d050b3debec24bbd94aadbc44854185 + category: main + optional: false - name: icu version: '73.2' manager: conda @@ -5741,10 +8696,23 @@ package: - name: identify version: 2.5.35 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + ukkonen: '' python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda + hash: + md5: 9472bfd206a2b7bb8143835e37667054 + sha256: 971683b13d1b820157bef9993c63dd8b0611d2d60fc4b522da163aee2e70e518 + category: main + optional: false +- name: identify + version: 2.5.35 + manager: conda + platform: osx-arm64 + dependencies: ukkonen: '' + python: '>=3.6' url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda hash: md5: 9472bfd206a2b7bb8143835e37667054 @@ -5763,6 +8731,18 @@ package: sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 category: main optional: false +- name: idna + version: '3.6' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + hash: + md5: 1a76f09108576397c41c0b0c5bd84134 + sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 + category: main + optional: false - name: idna version: '3.6' manager: conda @@ -5787,6 +8767,18 @@ package: sha256: c2bfd7043e0c4c12d8b5593de666c1e81d67b83c474a0a79282cc5c4ef845460 category: main optional: false +- name: imagesize + version: 1.4.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.4' + url: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 7de5386c8fea29e76b303f37dde4c352 + sha256: c2bfd7043e0c4c12d8b5593de666c1e81d67b83c474a0a79282cc5c4ef845460 + category: main + optional: false - name: imagesize version: 1.4.1 manager: conda @@ -5812,6 +8804,19 @@ package: sha256: 4b823af311e7f5093fca41ec0142d0e1ec9b3d1ee91924dc63133611bdfcaee5 category: main optional: false +- name: importlib-metadata + version: 6.10.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + zipp: '>=0.5' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + hash: + md5: ae2ad334f34040e147cc5824b450463b + sha256: 4b823af311e7f5093fca41ec0142d0e1ec9b3d1ee91924dc63133611bdfcaee5 + category: main + optional: false - name: importlib-metadata version: 6.10.0 manager: conda @@ -5826,29 +8831,42 @@ package: category: main optional: false - name: importlib-resources - version: 6.3.0 + version: 6.4.0 manager: conda platform: linux-64 dependencies: - importlib_resources: '>=6.3.0,<6.3.1.0a0' + importlib_resources: '>=6.4.0,<6.4.1.0a0' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda hash: - md5: 828e394294c4a0e31872a9f420cf92f7 - sha256: ed401d44578cec3bf8bd924bee7867c6d86c0707e55dd543b99640fa0fc85e47 + md5: dcbadab7a68738a028e195ab68ab2d2e + sha256: 38db827f445ae437a15d50a94816ae67a48285d0700f736af3eb90800a71f079 category: main optional: false - name: importlib-resources - version: 6.3.0 + version: 6.4.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + importlib_resources: '>=6.4.0,<6.4.1.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda + hash: + md5: dcbadab7a68738a028e195ab68ab2d2e + sha256: 38db827f445ae437a15d50a94816ae67a48285d0700f736af3eb90800a71f079 + category: main + optional: false +- name: importlib-resources + version: 6.4.0 manager: conda platform: osx-arm64 dependencies: - importlib_resources: '>=6.3.0,<6.3.1.0a0' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.3.0-pyhd8ed1ab_0.conda + importlib_resources: '>=6.4.0,<6.4.1.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda hash: - md5: 828e394294c4a0e31872a9f420cf92f7 - sha256: ed401d44578cec3bf8bd924bee7867c6d86c0707e55dd543b99640fa0fc85e47 + md5: dcbadab7a68738a028e195ab68ab2d2e + sha256: 38db827f445ae437a15d50a94816ae67a48285d0700f736af3eb90800a71f079 category: main optional: false - name: importlib_metadata @@ -5863,6 +8881,18 @@ package: sha256: a3688dc4fb2ed84e4f11738375eee542800ca0bcb343cf5993f4e3e092dcc6bf category: main optional: false +- name: importlib_metadata + version: 6.10.0 + manager: conda + platform: osx-64 + dependencies: + importlib-metadata: '>=6.10.0,<6.10.1.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.10.0-hd8ed1ab_0.conda + hash: + md5: c063ddbb9908499fd4f20b31dc67065a + sha256: a3688dc4fb2ed84e4f11738375eee542800ca0bcb343cf5993f4e3e092dcc6bf + category: main + optional: false - name: importlib_metadata version: 6.10.0 manager: conda @@ -5876,29 +8906,42 @@ package: category: main optional: false - name: importlib_resources - version: 6.3.0 + version: 6.4.0 manager: conda platform: linux-64 dependencies: python: '>=3.8' zipp: '>=3.1.0' - url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda hash: - md5: 18850e65ca439066484607b26ed09ecd - sha256: 8ad2fdd72f6a0ebefaa1496d2f43f100596f1733468fd9b549891f6195a5b8cb + md5: c5d3907ad8bd7bf557521a1833cf7e6d + sha256: c6ae80c0beaeabb342c5b041f19669992ae6e937dbec56ced766cb035900f9de category: main optional: false - name: importlib_resources - version: 6.3.0 + version: 6.4.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + zipp: '>=3.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda + hash: + md5: c5d3907ad8bd7bf557521a1833cf7e6d + sha256: c6ae80c0beaeabb342c5b041f19669992ae6e937dbec56ced766cb035900f9de + category: main + optional: false +- name: importlib_resources + version: 6.4.0 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' zipp: '>=3.1.0' - url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda hash: - md5: 18850e65ca439066484607b26ed09ecd - sha256: 8ad2fdd72f6a0ebefaa1496d2f43f100596f1733468fd9b549891f6195a5b8cb + md5: c5d3907ad8bd7bf557521a1833cf7e6d + sha256: c6ae80c0beaeabb342c5b041f19669992ae6e937dbec56ced766cb035900f9de category: main optional: false - name: ipykernel @@ -5929,23 +8972,49 @@ package: - name: ipykernel version: 6.29.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + packaging: '' + psutil: '' + nest-asyncio: '' __osx: '' appnope: '' - comm: '>=0.1.1' - debugpy: '>=1.6.5' - ipython: '>=7.23.1' + python: '>=3.8' + tornado: '>=6.1' jupyter_client: '>=6.1.12' jupyter_core: '>=4.12,!=5.0.*' + ipython: '>=7.23.1' matplotlib-inline: '>=0.1' - nest-asyncio: '' + debugpy: '>=1.6.5' + comm: '>=0.1.1' + traitlets: '>=5.4.0' + pyzmq: '>=24' + url: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.3-pyh3cd1d5f_0.conda + hash: + md5: 28e74fca8d8abf09c1ed0d190a17e307 + sha256: ef2f9c1d83afd693db3793c368c5c6afcd37a416958ece490a2e1fbcd85012eb + category: main + optional: false +- name: ipykernel + version: 6.29.3 + manager: conda + platform: osx-arm64 + dependencies: packaging: '' psutil: '' + nest-asyncio: '' + __osx: '' + appnope: '' python: '>=3.8' - pyzmq: '>=24' tornado: '>=6.1' + jupyter_client: '>=6.1.12' + jupyter_core: '>=4.12,!=5.0.*' + ipython: '>=7.23.1' + matplotlib-inline: '>=0.1' + debugpy: '>=1.6.5' + comm: '>=0.1.1' traitlets: '>=5.4.0' + pyzmq: '>=24' url: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.3-pyh3cd1d5f_0.conda hash: md5: 28e74fca8d8abf09c1ed0d190a17e307 @@ -5979,21 +9048,45 @@ package: - name: ipython version: 8.18.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + typing_extensions: '' __unix: '' decorator: '' exceptiongroup: '' - jedi: '>=0.16' matplotlib-inline: '' - pexpect: '>4.3' + stack_data: '' pickleshare: '' - prompt-toolkit: '>=3.0.41,<3.1.0' - pygments: '>=2.4.0' python: '>=3.9' - stack_data: '' + pygments: '>=2.4.0' traitlets: '>=5' + jedi: '>=0.16' + pexpect: '>4.3' + prompt-toolkit: '>=3.0.41,<3.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/ipython-8.18.1-pyh707e725_3.conda + hash: + md5: 15c6f45a45f7ac27f6d60b0b084f6761 + sha256: d98d615ac8ad71de698afbc50e8269570d4b89706821c4ff3058a4ceec69bd9b + category: main + optional: false +- name: ipython + version: 8.18.1 + manager: conda + platform: osx-arm64 + dependencies: typing_extensions: '' + __unix: '' + decorator: '' + exceptiongroup: '' + matplotlib-inline: '' + stack_data: '' + pickleshare: '' + python: '>=3.9' + pygments: '>=2.4.0' + traitlets: '>=5' + jedi: '>=0.16' + pexpect: '>4.3' + prompt-toolkit: '>=3.0.41,<3.1.0' url: https://conda.anaconda.org/conda-forge/noarch/ipython-8.18.1-pyh707e725_3.conda hash: md5: 15c6f45a45f7ac27f6d60b0b084f6761 @@ -6020,13 +9113,30 @@ package: - name: ipywidgets version: 8.1.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - comm: '>=0.1.3' + python: '>=3.7' + traitlets: '>=4.3.1' ipython: '>=6.1.0' + comm: '>=0.1.3' jupyterlab_widgets: '>=3.0.10,<3.1.0' + widgetsnbextension: '>=4.0.10,<4.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.2-pyhd8ed1ab_0.conda + hash: + md5: 67f86478c78637f68c1f3858973021f2 + sha256: 0be846f1374faa2d9b6f5e100187d56afa9268221f7c7815265f30aa008da8ca + category: main + optional: false +- name: ipywidgets + version: 8.1.2 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' traitlets: '>=4.3.1' + ipython: '>=6.1.0' + comm: '>=0.1.3' + jupyterlab_widgets: '>=3.0.10,<3.1.0' widgetsnbextension: '>=4.0.10,<4.1.0' url: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.2-pyhd8ed1ab_0.conda hash: @@ -6050,10 +9160,23 @@ package: - name: isodate version: 0.6.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + six: '' python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 4a62c93c1b5c0b920508ae3fd285eaf5 + sha256: af8f801e093da52a50ca0ea0510dfaf6898fea37e66d08d335e370235dede9fc + category: main + optional: false +- name: isodate + version: 0.6.1 + manager: conda + platform: osx-arm64 + dependencies: six: '' + python: '>=3.6' url: https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2 hash: md5: 4a62c93c1b5c0b920508ae3fd285eaf5 @@ -6076,10 +9199,23 @@ package: - name: isoduration version: 20.11.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' arrow: '>=0.15.0' + url: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 4cb68948e0b8429534380243d063a27a + sha256: 7bb5c4d994361022f47a807b5e7d101b3dce16f7dd8a0af6ffad9f479d346493 + category: main + optional: false +- name: isoduration + version: 20.11.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + arrow: '>=0.15.0' url: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_0.tar.bz2 hash: md5: 4cb68948e0b8429534380243d063a27a @@ -6098,6 +9234,18 @@ package: sha256: 31e3492686b4e92b53db9b48bc0eb03873b1caaf28629fee7d2d47627a2c56d3 category: main optional: false +- name: itsdangerous + version: 2.1.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 3c3de74912f11d2b590184f03c7cd09b + sha256: 31e3492686b4e92b53db9b48bc0eb03873b1caaf28629fee7d2d47627a2c56d3 + category: main + optional: false - name: itsdangerous version: 2.1.2 manager: conda @@ -6119,21 +9267,109 @@ package: python: '>=3.7' url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.3.1-pyhd8ed1ab_0.conda hash: - md5: c541ae264c9f1f21d83fc30dffb908ee - sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + md5: c541ae264c9f1f21d83fc30dffb908ee + sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + category: main + optional: false +- name: jaraco.classes + version: 3.3.1 + manager: conda + platform: osx-64 + dependencies: + more-itertools: '' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.3.1-pyhd8ed1ab_0.conda + hash: + md5: c541ae264c9f1f21d83fc30dffb908ee + sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + category: main + optional: false +- name: jaraco.classes + version: 3.3.1 + manager: conda + platform: osx-arm64 + dependencies: + more-itertools: '' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.3.1-pyhd8ed1ab_0.conda + hash: + md5: c541ae264c9f1f21d83fc30dffb908ee + sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + category: main + optional: false +- name: jaraco.context + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-4.3.0-pyhd8ed1ab_0.conda + hash: + md5: 53511e966e3ced065fbb1d3d5470d16d + sha256: 7ce041636e6a62bf5f54b2d45f506dc77e27cd854fd754df975382f636282619 + category: main + optional: false +- name: jaraco.context + version: 4.3.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-4.3.0-pyhd8ed1ab_0.conda + hash: + md5: 53511e966e3ced065fbb1d3d5470d16d + sha256: 7ce041636e6a62bf5f54b2d45f506dc77e27cd854fd754df975382f636282619 + category: main + optional: false +- name: jaraco.context + version: 4.3.0 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-4.3.0-pyhd8ed1ab_0.conda + hash: + md5: 53511e966e3ced065fbb1d3d5470d16d + sha256: 7ce041636e6a62bf5f54b2d45f506dc77e27cd854fd754df975382f636282619 + category: main + optional: false +- name: jaraco.functools + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 547670a612fd335eaa5ffbf0fa75cb64 + sha256: d2e866fd22a48eaa2f795b6a3b0bf16f066293322ce04dd65cca36267160ead6 + category: main + optional: false +- name: jaraco.functools + version: 4.0.0 + manager: conda + platform: osx-64 + dependencies: + more-itertools: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 547670a612fd335eaa5ffbf0fa75cb64 + sha256: d2e866fd22a48eaa2f795b6a3b0bf16f066293322ce04dd65cca36267160ead6 category: main optional: false -- name: jaraco.classes - version: 3.3.1 +- name: jaraco.functools + version: 4.0.0 manager: conda platform: osx-arm64 dependencies: more-itertools: '' - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.3.1-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda hash: - md5: c541ae264c9f1f21d83fc30dffb908ee - sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + md5: 547670a612fd335eaa5ffbf0fa75cb64 + sha256: d2e866fd22a48eaa2f795b6a3b0bf16f066293322ce04dd65cca36267160ead6 category: main optional: false - name: jedi @@ -6152,10 +9388,23 @@ package: - name: jedi version: 0.19.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.6' parso: '>=0.8.3,<0.9.0' + url: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda + hash: + md5: 81a3be0b2023e1ea8555781f0ad904a2 + sha256: 362f0936ef37dfd1eaa860190e42a6ebf8faa094eaa3be6aa4d9ace95f40047a + category: main + optional: false +- name: jedi + version: 0.19.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' + parso: '>=0.8.3,<0.9.0' url: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda hash: md5: 81a3be0b2023e1ea8555781f0ad904a2 @@ -6190,10 +9439,23 @@ package: - name: jinja2 version: 3.1.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' markupsafe: '>=2.0' + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + hash: + md5: e7d8df6509ba635247ff9aea31134262 + sha256: fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc + category: main + optional: false +- name: jinja2 + version: 3.1.3 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + markupsafe: '>=2.0' url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda hash: md5: e7d8df6509ba635247ff9aea31134262 @@ -6212,6 +9474,18 @@ package: sha256: 95ac5f9ee95fd4e34dc051746fc86016d3d4f6abefed113e2ede049d59ec2991 category: main optional: false +- name: jmespath + version: 1.0.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.0.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 2cfa3e1cf3fb51bb9b17acc5b5e9ea11 + sha256: 95ac5f9ee95fd4e34dc051746fc86016d3d4f6abefed113e2ede049d59ec2991 + category: main + optional: false - name: jmespath version: 1.0.1 manager: conda @@ -6240,10 +9514,23 @@ package: - name: joblib version: 1.3.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + setuptools: '' python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda + hash: + md5: 4da50d410f553db77e62ab62ffaa1abc + sha256: 31e05d47970d956206188480b038829d24ac11fe8216409d8584d93d40233878 + category: main + optional: false +- name: joblib + version: 1.3.2 + manager: conda + platform: osx-arm64 + dependencies: setuptools: '' + python: '>=3.7' url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda hash: md5: 4da50d410f553db77e62ab62ffaa1abc @@ -6262,6 +9549,17 @@ package: sha256: 5646496ca07dfa1486d27ed07282967007811dfc63d6394652e87f94166ecae3 category: main optional: false +- name: json-c + version: '0.17' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/json-c-0.17-h8e11ae5_0.conda + hash: + md5: 266d2e4ebbf37091c8322937392bb540 + sha256: 2a493095fe1292108ff1799a1b47ababe82d844bfa3abcf2252676c1017a1e04 + category: main + optional: false - name: json-c version: '0.17' manager: conda @@ -6285,6 +9583,18 @@ package: sha256: 148a427d4867ecd367b2bb9c2ef11ae7795abeabc8454f802f28ff692b3ce1aa category: main optional: false +- name: json5 + version: 0.9.24 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7,<4.0' + url: https://conda.anaconda.org/conda-forge/noarch/json5-0.9.24-pyhd8ed1ab_0.conda + hash: + md5: fc9780a517b51ea3798fc011c17ffd51 + sha256: 148a427d4867ecd367b2bb9c2ef11ae7795abeabc8454f802f28ff692b3ce1aa + category: main + optional: false - name: json5 version: 0.9.24 manager: conda @@ -6313,10 +9623,23 @@ package: - name: jsonpatch version: '1.33' manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' jsonpointer: '>=1.9' + url: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_0.conda + hash: + md5: bfdb7c5c6ad1077c82a69a8642c87aff + sha256: fbb17e33ace3225c6416d1604637c1058906b8223da968cc015128985336b2b4 + category: main + optional: false +- name: jsonpatch + version: '1.33' + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + jsonpointer: '>=1.9' url: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_0.conda hash: md5: bfdb7c5c6ad1077c82a69a8642c87aff @@ -6336,6 +9659,19 @@ package: sha256: c947f2a64e4f06c722973894afb8e26df3aa2212e2e742def3506ccbad42141b category: main optional: false +- name: jsonpickle + version: 3.0.2 + manager: conda + platform: osx-64 + dependencies: + importlib_metadata: '' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.2-pyhd8ed1ab_1.conda + hash: + md5: f351864256e291b24b5a3bedda184bff + sha256: c947f2a64e4f06c722973894afb8e26df3aa2212e2e742def3506ccbad42141b + category: main + optional: false - name: jsonpickle version: 3.0.2 manager: conda @@ -6362,6 +9698,19 @@ package: sha256: cd6f07324a83678072675e8c0720558c807682466181f33eb4d2de03aa8bff49 category: main optional: false +- name: jsonpointer + version: '2.4' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-2.4-py39h6e9494a_3.conda + hash: + md5: 7712a5f0d4f3f7d9ec69fb24dcf9bf0a + sha256: a775708266d1243d31dc682f0fd9b0d8811653b82c8d89cb312d44685508e1f5 + category: main + optional: false - name: jsonpointer version: '2.4' manager: conda @@ -6396,13 +9745,31 @@ package: - name: jsonschema version: 4.21.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' attrs: '>=22.2.0' importlib_resources: '>=1.4.0' - jsonschema-specifications: '>=2023.03.6' pkgutil-resolve-name: '>=1.3.10' + jsonschema-specifications: '>=2023.03.6' + referencing: '>=0.28.4' + rpds-py: '>=0.7.1' + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + hash: + md5: 8a3a3d01629da20befa340919e3dd2c4 + sha256: c5c1b4e08e91fdd697289015be1a176409b4e63942899a43b276f1f250be8129 + category: main + optional: false +- name: jsonschema + version: 4.21.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + attrs: '>=22.2.0' + importlib_resources: '>=1.4.0' + pkgutil-resolve-name: '>=1.3.10' + jsonschema-specifications: '>=2023.03.6' referencing: '>=0.28.4' rpds-py: '>=0.7.1' url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda @@ -6428,10 +9795,24 @@ package: - name: jsonschema-specifications version: 2023.12.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' importlib_resources: '>=1.4.0' + referencing: '>=0.31.0' + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda + hash: + md5: a0e4efb5f35786a05af4809a2fb1f855 + sha256: a9630556ddc3121c0be32f4cbf792dd9102bd380d5cd81d57759d172cf0c2da2 + category: main + optional: false +- name: jsonschema-specifications + version: 2023.12.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + importlib_resources: '>=1.4.0' referencing: '>=0.31.0' url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda hash: @@ -6463,18 +9844,39 @@ package: - name: jsonschema-with-format-nongpl version: 4.21.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - fqdn: '' + python: '' idna: '' + rfc3339-validator: '' + uri-template: '' + fqdn: '' isoduration: '' jsonpointer: '>1.13' + webcolors: '>=1.11' + rfc3986-validator: '>0.1.0' jsonschema: '>=4.21.1,<4.21.2.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.21.1-pyhd8ed1ab_0.conda + hash: + md5: 26bce4b5405738c09304d4f4796b2c2a + sha256: 6e458c325c097956ac4605ef386f0d67bad5223041cedd66819892988b72f83a + category: main + optional: false +- name: jsonschema-with-format-nongpl + version: 4.21.1 + manager: conda + platform: osx-arm64 + dependencies: python: '' + idna: '' rfc3339-validator: '' - rfc3986-validator: '>0.1.0' uri-template: '' + fqdn: '' + isoduration: '' + jsonpointer: '>1.13' webcolors: '>=1.11' + rfc3986-validator: '>0.1.0' + jsonschema: '>=4.21.1,<4.21.2.0a0' url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.21.1-pyhd8ed1ab_0.conda hash: md5: 26bce4b5405738c09304d4f4796b2c2a @@ -6491,12 +9893,32 @@ package: jupyter_console: '' nbconvert: '' notebook: '' - python: '>=3.6' - qtconsole-base: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.0.0-pyhd8ed1ab_10.conda + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + qtconsole: '' + url: https://conda.anaconda.org/conda-forge/linux-64/jupyter-1.0.0-py39hf3d152e_9.conda + hash: + md5: b99828f9a77b6106a72b541427a90957 + sha256: c309d7ab20b44dd123fd40fb5cf717f386404912521e3b586c96ce018109d054 + category: main + optional: false +- name: jupyter + version: 1.0.0 + manager: conda + platform: osx-64 + dependencies: + ipykernel: '' + ipywidgets: '' + jupyter_console: '' + nbconvert: '' + notebook: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + qtconsole: '' + url: https://conda.anaconda.org/conda-forge/osx-64/jupyter-1.0.0-py39h6e9494a_9.conda hash: - md5: 056b8cc3d9b03f54fc49e6d70d7dc359 - sha256: 308b521b149e7a1739f717538b929bc2d87b9001b94f13ee8baa939632a86150 + md5: 59bebdd70986cd5e06cafc32c609612f + sha256: 26e5fc44fa638c4e67dfe9c6960b6b673233d2309258bc6d7ba0edbf75649e54 category: main optional: false - name: jupyter @@ -6509,12 +9931,12 @@ package: jupyter_console: '' nbconvert: '' notebook: '' - python: '>=3.6' - qtconsole-base: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.0.0-pyhd8ed1ab_10.conda + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-arm64/jupyter-1.0.0-py39h2804cbe_9.conda hash: - md5: 056b8cc3d9b03f54fc49e6d70d7dc359 - sha256: 308b521b149e7a1739f717538b929bc2d87b9001b94f13ee8baa939632a86150 + md5: 9052c4ca944cccc46d58958ec3affe02 + sha256: 370057a9b78f48cc4df52f82e62eb285b74e41784c1d267057a74ef8ae1c99f3 category: main optional: false - name: jupyter-cache @@ -6540,17 +9962,37 @@ package: - name: jupyter-cache version: 0.6.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - attrs: '' + pyyaml: '' click: '' importlib-metadata: '' - nbclient: '>=0.2,<0.8' + tabulate: '' nbformat: '' + attrs: '' python: '>=3.8' - pyyaml: '' sqlalchemy: '>=1.3.12,<3' + nbclient: '>=0.2,<0.8' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-0.6.1-pyhd8ed1ab_0.conda + hash: + md5: 2e360820ae68e3d28e1a5a9d2714ca5c + sha256: b22ba507904f33fcc7b218cc2a3ed8d39027524d0f223f3696b8344b7c5a1e1f + category: main + optional: false +- name: jupyter-cache + version: 0.6.1 + manager: conda + platform: osx-arm64 + dependencies: + pyyaml: '' + click: '' + importlib-metadata: '' tabulate: '' + nbformat: '' + attrs: '' + python: '>=3.8' + sqlalchemy: '>=1.3.12,<3' + nbclient: '>=0.2,<0.8' url: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-0.6.1-pyhd8ed1ab_0.conda hash: md5: 2e360820ae68e3d28e1a5a9d2714ca5c @@ -6574,29 +10016,61 @@ package: - name: jupyter-lsp version: 2.2.4 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' importlib-metadata: '>=4.8.3' jupyter_server: '>=1.1.2' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.4-pyhd8ed1ab_0.conda + hash: + md5: 91f93e1ebf6535be518715432d89fd92 + sha256: 8000b1904a2a10cf039b46305781128e1a93da4c2fd857445b4924ecf3535bdb + category: main + optional: false +- name: jupyter-lsp + version: 2.2.4 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + importlib-metadata: '>=4.8.3' + jupyter_server: '>=1.1.2' url: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.4-pyhd8ed1ab_0.conda hash: - md5: 91f93e1ebf6535be518715432d89fd92 - sha256: 8000b1904a2a10cf039b46305781128e1a93da4c2fd857445b4924ecf3535bdb + md5: 91f93e1ebf6535be518715432d89fd92 + sha256: 8000b1904a2a10cf039b46305781128e1a93da4c2fd857445b4924ecf3535bdb + category: main + optional: false +- name: jupyter_client + version: 8.6.1 + manager: conda + platform: linux-64 + dependencies: + importlib_metadata: '>=4.8.3' + jupyter_core: '>=4.12,!=5.0.*' + python: '>=3.8' + python-dateutil: '>=2.8.2' + pyzmq: '>=23.0' + tornado: '>=6.2' + traitlets: '>=5.3' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.1-pyhd8ed1ab_0.conda + hash: + md5: c03972cfce69ad913d520c652e5ed908 + sha256: c7d10d7941fd2e61480e49d3b2b21a530af4ae4b0d449a1746a72a38bacb63e2 category: main optional: false - name: jupyter_client version: 8.6.1 manager: conda - platform: linux-64 + platform: osx-64 dependencies: - importlib_metadata: '>=4.8.3' - jupyter_core: '>=4.12,!=5.0.*' python: '>=3.8' python-dateutil: '>=2.8.2' + jupyter_core: '>=4.12,!=5.0.*' + importlib_metadata: '>=4.8.3' + traitlets: '>=5.3' pyzmq: '>=23.0' tornado: '>=6.2' - traitlets: '>=5.3' url: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.1-pyhd8ed1ab_0.conda hash: md5: c03972cfce69ad913d520c652e5ed908 @@ -6608,13 +10082,13 @@ package: manager: conda platform: osx-arm64 dependencies: - importlib_metadata: '>=4.8.3' - jupyter_core: '>=4.12,!=5.0.*' python: '>=3.8' python-dateutil: '>=2.8.2' + jupyter_core: '>=4.12,!=5.0.*' + importlib_metadata: '>=4.8.3' + traitlets: '>=5.3' pyzmq: '>=23.0' tornado: '>=6.2' - traitlets: '>=5.3' url: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.1-pyhd8ed1ab_0.conda hash: md5: c03972cfce69ad913d520c652e5ed908 @@ -6644,17 +10118,37 @@ package: - name: jupyter_console version: 6.6.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - ipykernel: '>=6.14' ipython: '' - jupyter_client: '>=7.0.0' + pygments: '' + python: '>=3.7' + pyzmq: '>=17' jupyter_core: '>=4.12,!=5.0.*' + jupyter_client: '>=7.0.0' + ipykernel: '>=6.14' + traitlets: '>=5.4' prompt_toolkit: '>=3.0.30' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.6.3-pyhd8ed1ab_0.conda + hash: + md5: 7cf6f52a66f8e3cd9d8b6c231262dcab + sha256: 4e51764d5fe2f6e43d83bcfbcf8b4da6569721bf82eaf4d647be8717cd6be75a + category: main + optional: false +- name: jupyter_console + version: 6.6.3 + manager: conda + platform: osx-arm64 + dependencies: + ipython: '' pygments: '' python: '>=3.7' pyzmq: '>=17' + jupyter_core: '>=4.12,!=5.0.*' + jupyter_client: '>=7.0.0' + ipykernel: '>=6.14' traitlets: '>=5.4' + prompt_toolkit: '>=3.0.30' url: https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.6.3-pyhd8ed1ab_0.conda hash: md5: 7cf6f52a66f8e3cd9d8b6c231262dcab @@ -6676,6 +10170,21 @@ package: sha256: fbe43f4db84cd4eb0b3eed971a197237c9a0d53fa90b695a7fa82e4ccd193cbf category: main optional: false +- name: jupyter_core + version: 5.7.1 + manager: conda + platform: osx-64 + dependencies: + platformdirs: '>=2.5' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + traitlets: '>=5.3' + url: https://conda.anaconda.org/conda-forge/osx-64/jupyter_core-5.7.1-py39h6e9494a_0.conda + hash: + md5: 9611b1806866adc1693cfb5a323f16e4 + sha256: f30dc74ac083f9c97d5287b335ea193e0ddc27f02195f677436df84d6ccdf59e + category: main + optional: false - name: jupyter_core version: 5.7.2 manager: conda @@ -6692,7 +10201,7 @@ package: category: main optional: false - name: jupyter_events - version: 0.9.1 + version: 0.10.0 manager: conda platform: linux-64 dependencies: @@ -6704,29 +10213,48 @@ package: rfc3339-validator: '' rfc3986-validator: '>=0.1.1' traitlets: '>=5.3' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.9.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda hash: - md5: 331ea2fc883fc5f2fc002a4e66e38bc5 - sha256: 9054dea8926daf867ee0f366b3b45579e1bd16cbc7667d1f7541531d037fdbfd + md5: ed45423c41b3da15ea1df39b1f80c2ca + sha256: cd3f41dc093162a41d4bae171e40a1b9b115c4d488e9bb837a8fa9d084931fb9 category: main optional: false - name: jupyter_events - version: 0.9.1 + version: 0.10.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - jsonschema-with-format-nongpl: '>=4.18.0' + referencing: '' + rfc3339-validator: '' python: '>=3.8' - python-json-logger: '>=2.0.4' pyyaml: '>=5.3' + rfc3986-validator: '>=0.1.1' + traitlets: '>=5.3' + python-json-logger: '>=2.0.4' + jsonschema-with-format-nongpl: '>=4.18.0' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda + hash: + md5: ed45423c41b3da15ea1df39b1f80c2ca + sha256: cd3f41dc093162a41d4bae171e40a1b9b115c4d488e9bb837a8fa9d084931fb9 + category: main + optional: false +- name: jupyter_events + version: 0.10.0 + manager: conda + platform: osx-arm64 + dependencies: referencing: '' rfc3339-validator: '' + python: '>=3.8' + pyyaml: '>=5.3' rfc3986-validator: '>=0.1.1' traitlets: '>=5.3' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.9.1-pyhd8ed1ab_0.conda + python-json-logger: '>=2.0.4' + jsonschema-with-format-nongpl: '>=4.18.0' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda hash: - md5: 331ea2fc883fc5f2fc002a4e66e38bc5 - sha256: 9054dea8926daf867ee0f366b3b45579e1bd16cbc7667d1f7541531d037fdbfd + md5: ed45423c41b3da15ea1df39b1f80c2ca + sha256: cd3f41dc093162a41d4bae171e40a1b9b115c4d488e9bb837a8fa9d084931fb9 category: main optional: false - name: jupyter_server @@ -6762,27 +10290,57 @@ package: - name: jupyter_server version: 2.13.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - anyio: '>=3.1.0' - argon2-cffi: '' + packaging: '' jinja2: '' - jupyter_client: '>=7.4.4' - jupyter_core: '>=4.12,!=5.0.*' - jupyter_events: '>=0.9.0' + prometheus_client: '' + websocket-client: '' + argon2-cffi: '' + overrides: '' jupyter_server_terminals: '' + python: '>=3.8' + terminado: '>=0.8.3' + jupyter_core: '>=4.12,!=5.0.*' + tornado: '>=6.2.0' nbconvert-core: '>=6.4.4' + pyzmq: '>=24' + jupyter_client: '>=7.4.4' nbformat: '>=5.3.0' - overrides: '' + traitlets: '>=5.6.0' + anyio: '>=3.1.0' + send2trash: '>=1.8.2' + jupyter_events: '>=0.9.0' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.13.0-pyhd8ed1ab_0.conda + hash: + md5: e242df505f194c4932fbb840a99207e2 + sha256: 7e3259506b1b8500ebac4b4b097629ca8c32ee70d1c1df122052fea65c7cbae0 + category: main + optional: false +- name: jupyter_server + version: 2.13.0 + manager: conda + platform: osx-arm64 + dependencies: packaging: '' + jinja2: '' prometheus_client: '' + websocket-client: '' + argon2-cffi: '' + overrides: '' + jupyter_server_terminals: '' python: '>=3.8' - pyzmq: '>=24' - send2trash: '>=1.8.2' terminado: '>=0.8.3' + jupyter_core: '>=4.12,!=5.0.*' tornado: '>=6.2.0' + nbconvert-core: '>=6.4.4' + pyzmq: '>=24' + jupyter_client: '>=7.4.4' + nbformat: '>=5.3.0' traitlets: '>=5.6.0' - websocket-client: '' + anyio: '>=3.1.0' + send2trash: '>=1.8.2' + jupyter_events: '>=0.9.0' url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.13.0-pyhd8ed1ab_0.conda hash: md5: e242df505f194c4932fbb840a99207e2 @@ -6802,6 +10360,19 @@ package: sha256: 038efbc7e4b2e72d49ed193cfb2bbbe9fbab2459786ce9350301f466a32567db category: main optional: false +- name: jupyter_server_terminals + version: 0.5.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + terminado: '>=0.8.3' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.3-pyhd8ed1ab_0.conda + hash: + md5: 219b3833aa8ed91d47d1be6ca03f30be + sha256: 038efbc7e4b2e72d49ed193cfb2bbbe9fbab2459786ce9350301f466a32567db + category: main + optional: false - name: jupyter_server_terminals version: 0.5.3 manager: conda @@ -6845,24 +10416,51 @@ package: - name: jupyterlab version: 4.1.5 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - async-lru: '>=1.0.0' - httpx: '>=0.25.0' - importlib_metadata: '>=4.8.3' - importlib_resources: '>=1.4' + packaging: '' + tomli: '' + traitlets: '' ipykernel: '' - jinja2: '>=3.0.3' - jupyter-lsp: '>=2.0.0' jupyter_core: '' + python: '>=3.8' + tornado: '>=6.2.0' + jinja2: '>=3.0.3' + importlib_metadata: '>=4.8.3' jupyter_server: '>=2.4.0,<3' + importlib_resources: '>=1.4' + jupyter-lsp: '>=2.0.0' + async-lru: '>=1.0.0' jupyterlab_server: '>=2.19.0,<3' notebook-shim: '>=0.2' + httpx: '>=0.25.0' + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.1.5-pyhd8ed1ab_0.conda + hash: + md5: 04b1ca9d7ac414b3f5c3fb16066c6861 + sha256: b098b79ef34d5c6a9ef7fc482bd2373072820006757ed7db33328af88fb91496 + category: main + optional: false +- name: jupyterlab + version: 4.1.5 + manager: conda + platform: osx-arm64 + dependencies: packaging: '' - python: '>=3.8' tomli: '' - tornado: '>=6.2.0' traitlets: '' + ipykernel: '' + jupyter_core: '' + python: '>=3.8' + tornado: '>=6.2.0' + jinja2: '>=3.0.3' + importlib_metadata: '>=4.8.3' + jupyter_server: '>=2.4.0,<3' + importlib_resources: '>=1.4' + jupyter-lsp: '>=2.0.0' + async-lru: '>=1.0.0' + jupyterlab_server: '>=2.19.0,<3' + notebook-shim: '>=0.2' + httpx: '>=0.25.0' url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.1.5-pyhd8ed1ab_0.conda hash: md5: 04b1ca9d7ac414b3f5c3fb16066c6861 @@ -6885,10 +10483,23 @@ package: - name: jupyterlab_pygments version: 0.3.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' pygments: '>=2.4.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda + hash: + md5: afcd1b53bcac8844540358e33f33d28f + sha256: 4aa622bbcf97e44cd1adf0100b7ff71b7e20268f043bdf6feae4d16152f1f242 + category: main + optional: false +- name: jupyterlab_pygments + version: 0.3.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + pygments: '>=2.4.1,<3' url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda hash: md5: afcd1b53bcac8844540358e33f33d28f @@ -6918,17 +10529,37 @@ package: - name: jupyterlab_server version: 2.25.4 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - babel: '>=2.10' - importlib-metadata: '>=4.8.3' + python: '>=3.8' + packaging: '>=21.3' jinja2: '>=3.0.3' + importlib-metadata: '>=4.8.3' + jupyter_server: '>=1.21,<3' + requests: '>=2.31' + babel: '>=2.10' json5: '>=0.9.0' jsonschema: '>=4.18' - jupyter_server: '>=1.21,<3' - packaging: '>=21.3' + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.4-pyhd8ed1ab_0.conda + hash: + md5: ffd61670ae09d2d3c637f6afd29db443 + sha256: d0336d0c0223a66d648b24cfd1512fd7aebc85550d47f55ad5edbd53f482e7e5 + category: main + optional: false +- name: jupyterlab_server + version: 2.25.4 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + packaging: '>=21.3' + jinja2: '>=3.0.3' + importlib-metadata: '>=4.8.3' + jupyter_server: '>=1.21,<3' requests: '>=2.31' + babel: '>=2.10' + json5: '>=0.9.0' + jsonschema: '>=4.18' url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.4-pyhd8ed1ab_0.conda hash: md5: ffd61670ae09d2d3c637f6afd29db443 @@ -6947,6 +10578,18 @@ package: sha256: 7c14d0b377ddd2e21f23d2f55fbd827aca726860e504a131b67ef936aef2b8c4 category: main optional: false +- name: jupyterlab_widgets + version: 3.0.10 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.10-pyhd8ed1ab_0.conda + hash: + md5: 16b73b2c4ff7dda8bbecf88aadfe2027 + sha256: 7c14d0b377ddd2e21f23d2f55fbd827aca726860e504a131b67ef936aef2b8c4 + category: main + optional: false - name: jupyterlab_widgets version: 3.0.10 manager: conda @@ -6980,15 +10623,33 @@ package: - name: jupytext version: 1.16.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - markdown-it-py: '>=1.0' - mdit-py-plugins: '' - nbformat: '' + pyyaml: '' packaging: '' + toml: '' + nbformat: '' + mdit-py-plugins: '' python: '>=3.8' + markdown-it-py: '>=1.0' + url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda + hash: + md5: 14a45070afec994235a23ae09b098cce + sha256: 450d03ec711a5cbd643f99f4fb2f08aa167db7a0cb54dcbb53700c81b290c316 + category: main + optional: false +- name: jupytext + version: 1.16.1 + manager: conda + platform: osx-arm64 + dependencies: pyyaml: '' + packaging: '' toml: '' + nbformat: '' + mdit-py-plugins: '' + python: '>=3.8' + markdown-it-py: '>=1.0' url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda hash: md5: 14a45070afec994235a23ae09b098cce @@ -7009,6 +10670,19 @@ package: sha256: ee0934ff426d3cab015055808bed33eb9d20f635ec14bc421c596f4b70927102 category: main optional: false +- name: kealib + version: 1.5.3 + manager: conda + platform: osx-64 + dependencies: + hdf5: '>=1.14.3,<1.14.4.0a0' + libcxx: '>=15' + url: https://conda.anaconda.org/conda-forge/osx-64/kealib-1.5.3-h5f07ac3_0.conda + hash: + md5: 7a0924f6214e4c17b6062b21d1240253 + sha256: 54a847faf2d2aea83c149d98634646edb8e7f346faefc6af1aa52106200b43aa + category: main + optional: false - name: kealib version: 1.5.3 manager: conda @@ -7034,6 +10708,18 @@ package: sha256: 7a1144e42f7815a216c46038e3c71b004feb3082fb4e9b9cf9abc5da725d8448 category: main optional: false +- name: keras + version: 2.15.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/keras-2.15.0-pyhd8ed1ab_0.conda + hash: + md5: 91e789823c9a5577a0a6979d7e594159 + sha256: 7a1144e42f7815a216c46038e3c71b004feb3082fb4e9b9cf9abc5da725d8448 + category: main + optional: false - name: keras version: 2.15.0 manager: conda @@ -7047,35 +10733,56 @@ package: category: main optional: false - name: keyring - version: 24.3.1 + version: 25.0.0 manager: conda platform: linux-64 dependencies: importlib_metadata: '>=4.11.4' jaraco.classes: '' + jaraco.context: '' + jaraco.functools: '' jeepney: '>=0.4.2' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* secretstorage: '>=3.2' - url: https://conda.anaconda.org/conda-forge/linux-64/keyring-24.3.1-py39hf3d152e_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/keyring-25.0.0-py39hf3d152e_0.conda + hash: + md5: 9dffaab106d52fe3a52b303253f9b251 + sha256: a5f89e3bddc2031a9d550e2e4ae3766a55a1a53d4808bf304c7ffee5ab725d28 + category: main + optional: false +- name: keyring + version: 25.0.0 + manager: conda + platform: osx-64 + dependencies: + importlib_metadata: '>=4.11.4' + jaraco.classes: '' + jaraco.context: '' + jaraco.functools: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/keyring-25.0.0-py39h6e9494a_0.conda hash: - md5: 2482396e5d629d60526bce6268cfde6a - sha256: 8d231971f2ab5a9ab17d0b792021e287b982cb28c5258a93076a7fb937fa40c5 + md5: 7116583f9a9df43462b5860330fdce38 + sha256: 1904fbeb9d6ea150514a59f58775e04420b5d760e6b222753a3616eee492e3bb category: main optional: false - name: keyring - version: 24.3.1 + version: 25.0.0 manager: conda platform: osx-arm64 dependencies: importlib_metadata: '>=4.11.4' jaraco.classes: '' + jaraco.context: '' + jaraco.functools: '' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/keyring-24.3.1-py39h2804cbe_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/keyring-25.0.0-py39h2804cbe_0.conda hash: - md5: 692efb054402209710ffea6a93960f33 - sha256: 8182aa6970a92eed22d05e2a007d07c64cae655bf51538fa36cf00623e47bf8c + md5: 1314ad438df943a4e57da2cc51cc0cc8 + sha256: c4949d83989c746c5b1a28edb6a02df7892b78cda277ac8126c97b8744237e4f category: main optional: false - name: keyutils @@ -7105,6 +10812,20 @@ package: sha256: 620d2aa2c3f016aa569b4a679688cb34f27c05e08555e4860099cf001bd740e4 category: main optional: false +- name: kiwisolver + version: 1.4.5 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py39h8ee36c8_1.conda + hash: + md5: 6072db04642b21329b0502a177ec18bf + sha256: 1ef89b03dd04951e0d78dd36e678b276f18b94326a85b271251e41465aded09b + category: main + optional: false - name: kiwisolver version: 1.4.5 manager: conda @@ -7135,6 +10856,20 @@ package: sha256: 259bfaae731989b252b7d2228c1330ef91b641c9d68ff87dae02cbae682cb3e4 category: main optional: false +- name: krb5 + version: 1.21.2 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + libedit: '>=3.1.20191231,<4.0a0' + openssl: '>=3.1.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.2-hb884880_0.conda + hash: + md5: 80505a68783f01dc8d7308c075261b2f + sha256: 081ae2008a21edf57c048f331a17c65d1ccb52d6ca2f87ee031a73eff4dc0fc6 + category: main + optional: false - name: krb5 version: 1.21.2 manager: conda @@ -7163,6 +10898,20 @@ package: sha256: 624ee9537664756032437b6378497b9cbd90d9a6bbca6e805615615314a6d480 category: main optional: false +- name: kubernetes + version: 1.23.6 + manager: conda + platform: osx-64 + dependencies: + kubernetes-client: 1.23.6 + kubernetes-node: 1.23.6 + kubernetes-server: 1.23.6 + url: https://conda.anaconda.org/conda-forge/osx-64/kubernetes-1.23.6-h694c41f_0.tar.bz2 + hash: + md5: 15d632fc1aa27bf07ffa49293001314e + sha256: 58f02f5e80d03ebe21131abec6234d6163ef9058cb3c8e6e9e570990602b0e54 + category: main + optional: false - name: kubernetes version: 1.25.3 manager: conda @@ -7190,6 +10939,17 @@ package: sha256: b6baddbf7fe6e53e71cf8998d225fa8e6d187b60dc0e466d34fbfe876aec9a5c category: main optional: false +- name: kubernetes-client + version: 1.23.6 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/kubernetes-client-1.23.6-h12d39d3_0.tar.bz2 + hash: + md5: d1d1813735923043bd8f955accfcd58f + sha256: 498305675babb8a86982d596418cda2278953816a414cbd37fe2da5984ff7b50 + category: main + optional: false - name: kubernetes-client version: 1.25.3 manager: conda @@ -7214,6 +10974,17 @@ package: sha256: 9be6b6d2fc4fc90741e2efb12a7e3b60f3bb44e6c458ef6e6fe8824635020c87 category: main optional: false +- name: kubernetes-node + version: 1.23.6 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/kubernetes-node-1.23.6-h12d39d3_0.tar.bz2 + hash: + md5: 0e810138f6453ce694da9247b68032db + sha256: 122c046da126d554238e289479e38c4d1300597ab8ea96007c3bf1468d5c5b62 + category: main + optional: false - name: kubernetes-node version: 1.25.3 manager: conda @@ -7239,6 +11010,18 @@ package: sha256: 3b8410040ff355d871ce90bcbccc6fba8482d097411da99a73d7bfb7e13bf264 category: main optional: false +- name: kubernetes-server + version: 1.23.6 + manager: conda + platform: osx-64 + dependencies: + kubernetes-node: 1.23.6 + url: https://conda.anaconda.org/conda-forge/osx-64/kubernetes-server-1.23.6-h12d39d3_0.tar.bz2 + hash: + md5: b6f60a6a061f9bf2d5e36c79cd8514b0 + sha256: b75e8fa3e198c7b527a28253907d326bc04a820c32684ceaab21241e1bfe3260 + category: main + optional: false - name: kubernetes-server version: 1.25.3 manager: conda @@ -7251,6 +11034,18 @@ package: sha256: dcef741d5f7d922b8b7490057e8532214197489dead2de22dee136055d8705ee category: main optional: false +- name: lame + version: '3.100' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + hash: + md5: a8832b479f93521a9e7b5b743803be51 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + category: main + optional: false - name: lcms2 version: '2.16' manager: conda @@ -7265,6 +11060,19 @@ package: sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 category: main optional: false +- name: lcms2 + version: '2.16' + manager: conda + platform: osx-64 + dependencies: + libjpeg-turbo: '>=3.0.0,<4.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda + hash: + md5: 1442db8f03517834843666c422238c9b + sha256: 222ebc0a55544b9922f61e75015d02861e65b48f12113af41d48ba0814e14e4e + category: main + optional: false - name: lcms2 version: '2.16' manager: conda @@ -7302,6 +11110,18 @@ package: sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 category: main optional: false +- name: lerc + version: 4.0.0 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=13.0.1' + url: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 + hash: + md5: f9d6a4c82889d5ecedec1d90eb673c55 + sha256: e41790fc0f4089726369b3c7f813117bbc14b533e0ed8b94cf75aba252e82497 + category: main + optional: false - name: lerc version: 4.0.0 manager: conda @@ -7327,6 +11147,18 @@ package: sha256: 8729021a93e67bb93b4e73ef0a132499db516accfea11561b667635bcd0507e7 category: main optional: false +- name: libabseil + version: '20230802.1' + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + url: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20230802.1-cxx17_h048a20a_0.conda + hash: + md5: 6554f5fb47c025273268bcdb7bf3cd48 + sha256: 05431a6adb376a865e10d4ae673399d7890083c06f61cf18edb7c6629e75f39e + category: main + optional: false - name: libabseil version: '20230802.1' manager: conda @@ -7340,28 +11172,40 @@ package: category: main optional: false - name: libaec - version: 1.1.2 + version: 1.1.3 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda hash: - md5: 127b0be54c1c90760d7fe02ea7a56426 - sha256: fdde15e74dc099ab1083823ec0f615958e53d9a8fae10405af977de251668bea + md5: 5e97e271911b8b2001a8b71860c32faa + sha256: 2ef420a655528bca9d269086cf33b7e90d2f54ad941b437fb1ed5eca87cee017 category: main optional: false - name: libaec - version: 1.1.2 + version: 1.1.3 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.3-h73e2aa4_0.conda + hash: + md5: 66d3c1f6dd4636216b4fca7a748d50eb + sha256: dae5921339c5d89f4bf58a95fd4e9c76270dbf7f6a94f3c5081b574905fcccf8 + category: main + optional: false +- name: libaec + version: 1.1.3 manager: conda platform: osx-arm64 dependencies: - libcxx: '>=15.0.7' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.2-h13dd4ca_1.conda + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.3-hebf3989_0.conda hash: - md5: b7962cdc2cedcc9f8d12928824c11fbd - sha256: c9d6f01d511bd3686ce590addf829f34031b95e3feb34418496cbb45924c5d17 + md5: 6f0b8e56d2e7bae12a18fc5b2cd9f310 + sha256: 896189b7b48a194c46a3556ea04943ef81cbe0498521231f8eb25816a68bc8ed category: main optional: false - name: libarchive @@ -7384,6 +11228,26 @@ package: sha256: 340ed0bb02fe26a2b2e29cedf6559e2999b820f434e745c108e788d629ae4b17 category: main optional: false +- name: libarchive + version: 3.7.2 + manager: conda + platform: osx-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libiconv: '>=1.17,<2.0a0' + libxml2: '>=2.12.2,<3.0.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + lzo: '>=2.10,<3.0a0' + openssl: '>=3.2.0,<4.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.7.2-hd35d340_1.conda + hash: + md5: 8c7b79b20a67287a87b39df8a8c8dcc4 + sha256: f458515a49c56e117e05fe607493b7683a7bf06d2a625b59e378dbbf7f308895 + category: main + optional: false - name: libarchive version: 3.7.2 manager: conda @@ -7438,6 +11302,39 @@ package: sha256: cd40afed871226bdfb5bc87f92899269006d02373f8b853efc2c4d2bde96c371 category: main optional: false +- name: libarrow + version: 13.0.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.13' + aws-crt-cpp: '>=0.26.0,<0.26.1.0a0' + aws-sdk-cpp: '>=1.11.210,<1.11.211.0a0' + bzip2: '>=1.0.8,<2.0a0' + glog: '>=0.6.0,<0.7.0a0' + libabseil: '>=20230802.1,<20230803.0a0' + libbrotlidec: '>=1.1.0,<1.2.0a0' + libbrotlienc: '>=1.1.0,<1.2.0a0' + libcxx: '>=14' + libgoogle-cloud: '>=2.12.0,<2.13.0a0' + libgrpc: '>=1.59.3,<1.60.0a0' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libre2-11: '>=2023.6.2,<2024.0a0' + libthrift: '>=0.19.0,<0.19.1.0a0' + libutf8proc: '>=2.8.0,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + openssl: '>=3.2.0,<4.0a0' + orc: '>=1.9.2,<1.9.3.0a0' + re2: '' + snappy: '>=1.1.10,<2.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-13.0.0-hdae7707_23_cpu.conda + hash: + md5: 799848b44f6d7cc4a9cd5511101a7b59 + sha256: 1f79ceed195d10cbc8a47141c0b4402161ac37ee4c4899c79f2e13ec7782719c + category: main + optional: false - name: libarrow version: 13.0.0 manager: conda @@ -7482,6 +11379,18 @@ package: sha256: ebd5c91f029f779fb88a1fcbd1e499559a9c258e3674ff58a2fbb4e375ae56d9 category: main optional: false +- name: libblas + version: 3.9.0 + manager: conda + platform: osx-64 + dependencies: + libopenblas: '>=0.3.26,<1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-21_osx64_openblas.conda + hash: + md5: 23286066c595986aa0df6452a8416c08 + sha256: 5381eab20f4793996cf22e58461ea8a3a4dff1442bb45663b5920f2d26288688 + category: main + optional: false - name: libblas version: 3.9.0 manager: conda @@ -7499,10 +11408,21 @@ package: manager: conda platform: linux-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.84.0-ha770c72_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.84.0-ha770c72_2.conda hash: - md5: 63a2690ffde5448bd8bbf19b5d1d366c - sha256: f5ac6b12768e5c735d2c8e4e1e05093b105d649a68f02f6a5349f5cb61719b9c + md5: 85d30a3fcc0f1cfc252776208af546a1 + sha256: 5a7843db33422d043256af27f288836f51530b058653bdb074704eb72282f601 + category: main + optional: false +- name: libboost-headers + version: 1.84.0 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.84.0-h694c41f_2.conda + hash: + md5: 37678c6938655e8862e121b48101365a + sha256: e51f3b877ab4a7a68bf1e1f95e9b007d716e85547078bfd5f6f7f114545dc26e category: main optional: false - name: libboost-headers @@ -7510,10 +11430,10 @@ package: manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.84.0-hce30654_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.84.0-hce30654_2.conda hash: - md5: 6e665d044322dfffd437d7c6090e64f2 - sha256: 006d0e4e266b806eb2280c6e3250e79a011428c21a706ee7d3e4251f66d1f278 + md5: bf16112d5337a9a80d7126ac3a2cee7c + sha256: 2850952cc521318b6a5b18d8f55c86149b779a9103cca9875ff128ce9b6d6400 category: main optional: false - name: libbrotlicommon @@ -7528,6 +11448,17 @@ package: sha256: 40f29d1fab92c847b083739af86ad2f36d8154008cf99b64194e4705a1725d78 category: main optional: false +- name: libbrotlicommon + version: 1.1.0 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h0dc2134_1.conda + hash: + md5: 9e6c31441c9aa24e41ace40d6151aab6 + sha256: f57c57c442ef371982619f82af8735f93a4f50293022cfd1ffaf2ff89c2e0b2a + category: main + optional: false - name: libbrotlicommon version: 1.1.0 manager: conda @@ -7552,6 +11483,18 @@ package: sha256: 86fc861246fbe5ad85c1b6b3882aaffc89590a48b42d794d3d5c8e6d99e5f926 category: main optional: false +- name: libbrotlidec + version: 1.1.0 + manager: conda + platform: osx-64 + dependencies: + libbrotlicommon: 1.1.0 + url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h0dc2134_1.conda + hash: + md5: 9ee0bab91b2ca579e10353738be36063 + sha256: b11939c4c93c29448660ab5f63273216969d1f2f315dd9be60f3c43c4e61a50c + category: main + optional: false - name: libbrotlidec version: 1.1.0 manager: conda @@ -7577,6 +11520,18 @@ package: sha256: f751b8b1c4754a2a8dfdc3b4040fa7818f35bbf6b10e905a47d3a194b746b071 category: main optional: false +- name: libbrotlienc + version: 1.1.0 + manager: conda + platform: osx-64 + dependencies: + libbrotlicommon: 1.1.0 + url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h0dc2134_1.conda + hash: + md5: 8a421fe09c6187f0eb5e2338a8a8be6d + sha256: bc964c23e1a60ca1afe7bac38a9c1f2af3db4a8072c9f2eac4e4de537a844ac7 + category: main + optional: false - name: libbrotlienc version: 1.1.0 manager: conda @@ -7589,6 +11544,19 @@ package: sha256: 690dfc98e891ee1871c54166d30f6e22edfc2d7d6b29e7988dde5f1ce271c81a category: main optional: false +- name: libcap + version: '2.69' + manager: conda + platform: linux-64 + dependencies: + attr: '>=2.5.1,<2.6.0a0' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda + hash: + md5: 25cb5999faa414e5ccb2c1388f62d3d5 + sha256: 942f9564b4228609f017b6617425d29a74c43b8a030e12239fa4458e5cb6323c + category: main + optional: false - name: libcblas version: 3.9.0 manager: conda @@ -7601,6 +11569,18 @@ package: sha256: 467bbfbfe1a1aeb8b1f9f6485eedd8ed1b6318941bf3702da72336ccf4dc25a6 category: main optional: false +- name: libcblas + version: 3.9.0 + manager: conda + platform: osx-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-21_osx64_openblas.conda + hash: + md5: 7a1b54774bad723e8ba01ca48eb301b5 + sha256: e2b1455612d4cfb3ac3170f0c538516ebd0b113780ac6603338245354e1b2f02 + category: main + optional: false - name: libcblas version: 3.9.0 manager: conda @@ -7613,6 +11593,62 @@ package: sha256: 4510e3e4824693c3f80fc54e72d81dd89acaa6e6d68cd948af0870a640ea7eeb category: main optional: false +- name: libclang + version: 15.0.7 + manager: conda + platform: linux-64 + dependencies: + libclang13: 15.0.7 + libgcc-ng: '>=12' + libllvm15: '>=15.0.7,<15.1.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_h127d8a8_5.conda + hash: + md5: 09b94dd3a7e304df5b83176239347920 + sha256: 606b79c8a4a926334191d79f4a1447aac1d82c43344e3a603cbba31ace859b8f + category: main + optional: false +- name: libclang + version: 15.0.7 + manager: conda + platform: osx-64 + dependencies: + libclang13: 15.0.7 + libcxx: '>=16.0.6' + libllvm15: '>=15.0.7,<15.1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libclang-15.0.7-default_h7151d67_5.conda + hash: + md5: 2e7eb31c1431630f111be17f7f0cb948 + sha256: ea3c840b7e931228007f1dc21c1cfe8e3e833990da9e92fff9c23c98d035b89a + category: main + optional: false +- name: libclang13 + version: 15.0.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libllvm15: '>=15.0.7,<15.1.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h5d6823c_5.conda + hash: + md5: 2d694a9ffdcc30e89dea34a8dcdab6ae + sha256: 91ecfcf545a5d4588e9fad5db2b5b04eeef18cae1c03b790829ef8b978f06ccd + category: main + optional: false +- name: libclang13 + version: 15.0.7 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16.0.6' + libllvm15: '>=15.0.7,<15.1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libclang13-15.0.7-default_h0edc4dd_5.conda + hash: + md5: 3bfcf640ab0956a9db86335e917100e3 + sha256: fec1ff1ae4a49f96eefeae9dd14ea8d9e591fc29995861ad49e92104ae6bb8e6 + category: main + optional: false - name: libcrc32c version: 1.1.2 manager: conda @@ -7626,6 +11662,18 @@ package: sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 category: main optional: false +- name: libcrc32c + version: 1.1.2 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=11.1.0' + url: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 + hash: + md5: 23d6d5a69918a438355d7cbc4c3d54c9 + sha256: 3043869ac1ee84554f177695e92f2f3c2c507b260edad38a0bf3981fce1632ff + category: main + optional: false - name: libcrc32c version: 1.1.2 manager: conda @@ -7638,8 +11686,23 @@ package: sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 category: main optional: false +- name: libcups + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + krb5: '>=1.21.1,<1.22.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda + hash: + md5: d4529f4dff3057982a7617c7ac58fde3 + sha256: bc67b9b21078c99c6bd8595fe7e1ed6da1f721007726e717f0449de7032798c4 + category: main + optional: false - name: libcurl - version: 8.6.0 + version: 8.7.1 manager: conda platform: linux-64 dependencies: @@ -7650,14 +11713,31 @@ package: libzlib: '>=1.2.13,<1.3.0a0' openssl: '>=3.2.1,<4.0a0' zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.6.0-hca28451_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda + hash: + md5: 755c7f876815003337d2c61ff5d047e5 + sha256: 82a75e9a5d9ee5b2f487d850ec5d4edc18a56eb9527608a95a916c40baae3843 + category: main + optional: false +- name: libcurl + version: 8.7.1 + manager: conda + platform: osx-64 + dependencies: + krb5: '>=1.21.2,<1.22.0a0' + libnghttp2: '>=1.58.0,<2.0a0' + libssh2: '>=1.11.0,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.1,<4.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.7.1-h726d00d_0.conda hash: - md5: 704739398d858872cb91610f49f0ef29 - sha256: 357ce806adf1818dc8dccdcd64627758e1858eb0d8a9c91aae4a0eeee2a44608 + md5: fa58e5eaa12006bc3289a71357bef167 + sha256: 06cb1bd3bbaf905213777d6ade190ac4c7fb7a20dfe0cf901c977dbbc6cec265 category: main optional: false - name: libcurl - version: 8.6.0 + version: 8.7.1 manager: conda platform: osx-arm64 dependencies: @@ -7667,10 +11747,21 @@ package: libzlib: '>=1.2.13,<1.3.0a0' openssl: '>=3.2.1,<4.0a0' zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.6.0-h2d989ff_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.7.1-h2d989ff_0.conda + hash: + md5: 34b9171710f0d9bf093d55bdc36ff355 + sha256: 973ac9368efca712a8fd19fe68524d7d9a3087fd88ad6b7fcdf60c3d2e19a498 + category: main + optional: false +- name: libcxx + version: 16.0.6 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda hash: - md5: 3c0b1d8a9c8952e97c240fe0133dd27e - sha256: 85d2cbba4b0435a6fbf22963a50d2fd8cf2124eb76118e62d616ef355003c5a5 + md5: 7d6972792161077908b62971802f289a + sha256: 9063271847cf05f3a6cc6cae3e7f0ced032ab5f3a3c9d3f943f876f39c5c2549 category: main optional: false - name: libcxx @@ -7696,6 +11787,17 @@ package: sha256: 985ad27aa0ba7aad82afa88a8ede6a1aacb0aaca950d710f15d85360451e72fd category: main optional: false +- name: libdeflate + version: '1.19' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.19-ha4e1b8e_0.conda + hash: + md5: 6a45f543c2beb40023df5ee7e3cedfbd + sha256: d0f789120fedd0881b129aba9993ec5dcf0ecca67a71ea20c74394e41adcb503 + category: main + optional: false - name: libdeflate version: '1.19' manager: conda @@ -7720,6 +11822,18 @@ package: sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf category: main optional: false +- name: libedit + version: 3.1.20191231 + manager: conda + platform: osx-64 + dependencies: + ncurses: '>=6.1,<7.0.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20191231-hed1e85f_2.tar.bz2 + hash: + md5: 779da5393199c3af97bd8f12c804b749 + sha256: 5af7fd4a68bce10114b18eea4fb4ca638b4ecd4b6dfea11d97b89ee4e728210b + category: main + optional: false - name: libedit version: 3.1.20191231 manager: conda @@ -7744,6 +11858,17 @@ package: sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 category: main optional: false +- name: libev + version: '4.33' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + hash: + md5: 899db79329439820b7e8f8de41bca902 + sha256: 0d238488564a7992942aa165ff994eca540f687753b4f0998b29b4e4d030ff43 + category: main + optional: false - name: libev version: '4.33' manager: conda @@ -7768,6 +11893,18 @@ package: sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 category: main optional: false +- name: libevent + version: 2.1.12 + manager: conda + platform: osx-64 + dependencies: + openssl: '>=3.1.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libevent-2.1.12-ha90c15b_1.conda + hash: + md5: e38e467e577bd193a7d5de7c2c540b04 + sha256: e0bd9af2a29f8dd74309c0ae4f17a7c2b8c4b89f875ff1d6540c941eefbd07fb + category: main + optional: false - name: libevent version: 2.1.12 manager: conda @@ -7792,6 +11929,17 @@ package: sha256: 331bb7c7c05025343ebd79f86ae612b9e1e74d2687b8f3179faec234f986ce19 category: main optional: false +- name: libexpat + version: 2.6.2 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda + hash: + md5: 3d1d51c8f716d97c864d12f7af329526 + sha256: a188a77b275d61159a32ab547f7d17892226e7dac4518d2c6ac3ac8fc8dfde92 + category: main + optional: false - name: libexpat version: 2.6.2 manager: conda @@ -7815,6 +11963,17 @@ package: sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e category: main optional: false +- name: libffi + version: 3.4.2 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + hash: + md5: ccb34fb14960ad8b125962d3d79b31a9 + sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f + category: main + optional: false - name: libffi version: 3.4.2 manager: conda @@ -7826,6 +11985,21 @@ package: sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca category: main optional: false +- name: libflac + version: 1.4.3 + manager: conda + platform: linux-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + libgcc-ng: '>=12' + libogg: '>=1.3.4,<1.4.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + hash: + md5: ee48bf17cc83a00f59ca1494d5646869 + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + category: main + optional: false - name: libgcc-ng version: 13.2.0 manager: conda @@ -7852,6 +12026,18 @@ package: sha256: d1bd47faa29fec7288c7b212198432b07f890d3d6f646078da93b059c2e9daff category: main optional: false +- name: libgcrypt + version: 1.10.3 + manager: conda + platform: osx-64 + dependencies: + libgpg-error: '>=1.47,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libgcrypt-1.10.3-h49d49c5_0.conda + hash: + md5: 9a87bef20f74258ff46f8deefd2842d6 + sha256: 34e23c3e0baf53adbcbe5f160b901d94e3f3edc23894274c8248658e9a80f455 + category: main + optional: false - name: libgcrypt version: 1.10.3 manager: conda @@ -7889,6 +12075,31 @@ package: sha256: b74f95a6e1f3b31a74741b39cba83ed99fc82d17243c0fd3b5ab16ddd48ab89d category: main optional: false +- name: libgd + version: 2.3.3 + manager: conda + platform: osx-64 + dependencies: + expat: '' + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freetype: '>=2.12.1,<3.0a0' + icu: '>=73.2,<74.0a0' + libexpat: '>=2.5.0,<3.0a0' + libiconv: '>=1.17,<2.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + libwebp: '' + libwebp-base: '>=1.3.2,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + zlib: '' + url: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-h0dceb68_9.conda + hash: + md5: 1feb43971521d430bf826f8398598c5b + sha256: 4ed8546ff3356fc42f0e155446a060b14ee4aa96802e2da586532861deb3b917 + category: main + optional: false - name: libgd version: 2.3.3 manager: conda @@ -7968,6 +12179,57 @@ package: sha256: af88738b2eda7d388daad5bd7dd8fe66efbaba300921ecb6fb03d9c5823a950d category: main optional: false +- name: libgdal + version: 3.8.4 + manager: conda + platform: osx-64 + dependencies: + blosc: '>=1.21.5,<2.0a0' + cfitsio: '>=4.3.1,<4.3.2.0a0' + freexl: '>=2.0.0,<3.0a0' + geos: '>=3.12.1,<3.12.2.0a0' + geotiff: '>=1.7.1,<1.8.0a0' + giflib: '>=5.2.1,<5.3.0a0' + hdf4: '>=4.2.15,<4.2.16.0a0' + hdf5: '>=1.14.3,<1.14.4.0a0' + json-c: '>=0.17,<0.18.0a0' + kealib: '>=1.5.3,<1.6.0a0' + lerc: '>=4.0.0,<5.0a0' + libaec: '>=1.1.2,<2.0a0' + libarchive: '>=3.7.2,<3.8.0a0' + libcurl: '>=8.5.0,<9.0a0' + libcxx: '>=16' + libdeflate: '>=1.19,<1.20.0a0' + libexpat: '>=2.5.0,<3.0a0' + libiconv: '>=1.17,<2.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libkml: '>=1.3.0,<1.4.0a0' + libnetcdf: '>=4.9.2,<4.9.3.0a0' + libpng: '>=1.6.42,<1.7.0a0' + libpq: '>=16.2,<17.0a0' + libspatialite: '>=5.1.0,<5.2.0a0' + libsqlite: '>=3.45.1,<4.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + libwebp-base: '>=1.3.2,<2.0a0' + libxml2: '>=2.12.5,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + openjpeg: '>=2.5.0,<3.0a0' + openssl: '>=3.2.1,<4.0a0' + pcre2: '>=10.42,<10.43.0a0' + poppler: '>=24.2.0,<24.3.0a0' + postgresql: '' + proj: '>=9.3.1,<9.3.2.0a0' + tiledb: '>=2.20.0,<2.21.0a0' + xerces-c: '>=3.2.5,<3.3.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libgdal-3.8.4-h46636ed_0.conda + hash: + md5: 5cf7d0f51e6e9dd8d175d8660b843024 + sha256: 12a0151e5e0d05590bcf5c6abf2fe36977df8b1198564198c167ed05492d5b1b + category: main + optional: false - name: libgdal version: 3.8.4 manager: conda @@ -8019,6 +12281,18 @@ package: sha256: bff62d710f8a3ae6a0c4671c0584a7680e9e3a468003367ddf5bee8c90ff0079 category: main optional: false +- name: libgfortran + version: 5.0.0 + manager: conda + platform: osx-64 + dependencies: + libgfortran5: 13.2.0 + url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda + hash: + md5: 0b6e23a012ee7a9a5f6b244f5a92c1d5 + sha256: 4874422e567b68334705c135c17e5acdca1404de8255673ce30ad3510e00be0d + category: main + optional: false - name: libgfortran version: 5.0.0 manager: conda @@ -8055,6 +12329,18 @@ package: sha256: ba8d94e8493222ce155bb264d9de4200e41498a458e866fedf444de809bde8b6 category: main optional: false +- name: libgfortran5 + version: 13.2.0 + manager: conda + platform: osx-64 + dependencies: + llvm-openmp: '>=8.0.0' + url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda + hash: + md5: e4fb4d23ec2870ff3c40d10afe305aec + sha256: da3db4b947e30aec7596a3ef92200d17e774cccbbf7efc47802529a4ca5ca31b + category: main + optional: false - name: libgfortran5 version: 13.2.0 manager: conda @@ -8082,6 +12368,20 @@ package: sha256: 1393f41401f5858e12ec77476e844b86c4d11cc0d82150adaca74f0401cd1b87 category: main optional: false +- name: libgirepository + version: 1.78.1 + manager: conda + platform: osx-64 + dependencies: + cairo: '>=1.16.0,<2.0a0' + libffi: '>=3.4,<4.0a0' + libglib: '>=2.78.0,<3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libgirepository-1.78.1-h388745a_1.conda + hash: + md5: 4ea5c5ce9f5c51e73fb28976d9462ef3 + sha256: 63e2b20f155fa9a3e78b39579267501e72c246fc18fa8447853d156f628a3782 + category: main + optional: false - name: libgirepository version: 1.78.1 manager: conda @@ -8114,6 +12414,23 @@ package: sha256: 3a03a5254d2fd29c1e0ffda7250e22991dfbf2c854301fd56c408d97a647cfbd category: main optional: false +- name: libglib + version: 2.78.4 + manager: conda + platform: osx-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + libcxx: '>=16' + libffi: '>=3.4,<4.0a0' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + pcre2: '>=10.42,<10.43.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.78.4-hab64008_0.conda + hash: + md5: ff7e302784375cfc3157b8120a18124d + sha256: 122060ba63fd27e53672dbac7dc0b4f55a6432993446f4ed3c30a69a9457c615 + category: main + optional: false - name: libglib version: 2.78.4 manager: conda @@ -8150,6 +12467,25 @@ package: sha256: 82a7d211d0df165b073f9e8ba6d789c4b1c7c4882d546ca12d40f201fc3496fc category: main optional: false +- name: libgoogle-cloud + version: 2.12.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libabseil: '>=20230802.1,<20230803.0a0' + libcrc32c: '>=1.1.2,<1.2.0a0' + libcurl: '>=8.4.0,<9.0a0' + libcxx: '>=16.0.6' + libgrpc: '>=1.59.2,<1.60.0a0' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + openssl: '>=3.1.4,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.12.0-hc0857f6_4.conda + hash: + md5: 976555c39f83093265491c9c081a801c + sha256: 1bf47f43796369ec85a27221ab9a84ecc848f93a88049d046cd8521c25b129f6 + category: main + optional: false - name: libgoogle-cloud version: 2.12.0 manager: conda @@ -8183,6 +12519,19 @@ package: sha256: c448c6d86d27e10b9e844172000540e9cbfe9c28f968db87f949ba05add9bd50 category: main optional: false +- name: libgpg-error + version: '1.48' + manager: conda + platform: osx-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-64/libgpg-error-1.48-h29b4ebe_0.conda + hash: + md5: ca280b4ab3b4cf0d4335b7869a835d93 + sha256: ac468527fa3e52e075facf717e0f7bc2d250708341ffbb969a864e1fccccda75 + category: main + optional: false - name: libgpg-error version: '1.48' manager: conda @@ -8216,37 +12565,71 @@ package: sha256: 3f95a2792e565b628cb284de92017a37a1cddc4a3f83453b8f75d9adc9f8cfdd category: main optional: false +- name: libgrpc + version: 1.59.3 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + c-ares: '>=1.21.0,<2.0a0' + libabseil: '>=20230802.1,<20230803.0a0' + libcxx: '>=16.0.6' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libre2-11: '>=2023.6.2,<2024.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.4,<4.0a0' + re2: '' + url: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.59.3-ha7f534c_0.conda + hash: + md5: a557d871e80f2dd22efd78e00f9a1597 + sha256: 1b7330bb2aa16ca0dd319e97a829d5494fb2459a841b54f7631932b144e38624 + category: main + optional: false - name: libgrpc version: 1.59.3 manager: conda platform: osx-arm64 dependencies: - c-ares: '>=1.26.0,<2.0a0' + __osx: '>=10.9' + c-ares: '>=1.21.0,<2.0a0' libabseil: '>=20230802.1,<20230803.0a0' - libcxx: '>=16' + libcxx: '>=16.0.6' libprotobuf: '>=4.24.4,<4.24.5.0a0' libre2-11: '>=2023.6.2,<2024.0a0' libzlib: '>=1.2.13,<1.3.0a0' - openssl: '>=3.2.1,<4.0a0' + openssl: '>=3.1.4,<4.0a0' re2: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.59.3-h9560976_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.59.3-hbcf6334_0.conda + hash: + md5: e9c7cbc84af929dd47501629a5e19713 + sha256: 54cacd1fc7503d48c135301a775568f15089b537b3c56804767c627a89a20c30 + category: main + optional: false +- name: libhwloc + version: 2.9.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libxml2: '>=2.11.5,<3.0.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda hash: - md5: 31e7f059601587954b1370fe172d3114 - sha256: 9c0291bf797df0cee46d870bd410968e5955b0573c6b603c0ee7a5fcac06ad91 + md5: f36ddc11ca46958197a45effdd286e45 + sha256: 6950fee24766d03406e0f6f965262a5d98829c71eed8d1004f313892423b559b category: main optional: false - name: libhwloc version: 2.9.3 manager: conda - platform: linux-64 + platform: osx-64 dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' + libcxx: '>=15.0.7' libxml2: '>=2.11.5,<3.0.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.9.3-default_h961836e_1009.conda hash: - md5: f36ddc11ca46958197a45effdd286e45 - sha256: 6950fee24766d03406e0f6f965262a5d98829c71eed8d1004f313892423b559b + md5: 0dfacfef521f5ea278c8136d590421d8 + sha256: ec5047c81fdefdbf63559554bc74d9644ea1e715f5d05298844c01893732fcfb category: main optional: false - name: libiconv @@ -8261,6 +12644,17 @@ package: sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 category: main optional: false +- name: libiconv + version: '1.17' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda + hash: + md5: 6c3628d047e151efba7cf08c5e54d1ca + sha256: 23d4923baeca359423a7347c2ed7aaf48c68603df0cf8b87cc94a10b0d4e9a23 + category: main + optional: false - name: libiconv version: '1.17' manager: conda @@ -8284,6 +12678,17 @@ package: sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f category: main optional: false +- name: libjpeg-turbo + version: 3.0.0 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda + hash: + md5: 72507f8e3961bc968af17435060b6dd6 + sha256: d9572fd1024adc374aae7c247d0f29fdf4b122f1e3586fe62acc18067f40d02f + category: main + optional: false - name: libjpeg-turbo version: 3.0.0 manager: conda @@ -8312,6 +12717,22 @@ package: sha256: f67fc0be886c7eac14dbce858bfcffbc90a55b598e897e513f0979dd2caad750 category: main optional: false +- name: libkml + version: 1.3.0 + manager: conda + platform: osx-64 + dependencies: + libboost-headers: '' + libcxx: '>=15.0.7' + libexpat: '>=2.5.0,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + uriparser: '>=0.9.7,<1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libkml-1.3.0-hab3ca0e_1018.conda + hash: + md5: 535b1bb4896b113c14dfa64141370a12 + sha256: f546750a59b85a4b721f69e34e797ceddb93c438ee384db285e3344490d6a9b5 + category: main + optional: false - name: libkml version: 1.3.0 manager: conda @@ -8340,6 +12761,18 @@ package: sha256: 64b5c35dce00dd6f9f53178b2fe87116282e00967970bd6551a5a42923806ded category: main optional: false +- name: liblapack + version: 3.9.0 + manager: conda + platform: osx-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-21_osx64_openblas.conda + hash: + md5: cf0e4d82cfca6cd9d6c9ed3df45907c9 + sha256: 5d0ef4743e8684ad436e31bd3c378d48642815a20c260d358668ba29cd80987a + category: main + optional: false - name: liblapack version: 3.9.0 manager: conda @@ -8352,41 +12785,35 @@ package: sha256: a917e99f26d205df1ec22d7a9fff0d2f2f3c7ba06ea2be886dc220a8340d5917 category: main optional: false -- name: libmagma - version: 2.7.2 +- name: libllvm15 + version: 15.0.7 manager: conda platform: linux-64 dependencies: - __glibc: '>=2.17' - _openmp_mutex: '>=4.5' - cudatoolkit: '>=11.8,<12' - libblas: '>=3.9.0,<4.0a0' libgcc-ng: '>=12' - liblapack: '>=3.9.0,<4.0a0' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.7.2-h09b5827_2.conda + libxml2: '>=2.12.1,<3.0.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda hash: - md5: f6de79234f35c2fcc2e49dc66436601d - sha256: 4dd54775f2cfa9c09f4b4cc58a6db00bad50b30e65adf62ffe4213a30d962766 + md5: 8a35df3cbc0c8b12cc8af9473ae75eef + sha256: e71584c0f910140630580fdd0a013029a52fd31e435192aea2aa8d29005262d1 category: main optional: false -- name: libmagma_sparse - version: 2.7.2 +- name: libllvm15 + version: 15.0.7 manager: conda - platform: linux-64 + platform: osx-64 dependencies: - __glibc: '>=2.17' - _openmp_mutex: '>=4.5' - cudatoolkit: '>=11.8,<12' - libblas: '>=3.9.0,<4.0a0' - libgcc-ng: '>=12' - liblapack: '>=3.9.0,<4.0a0' - libmagma: '>=2.7.2,<2.7.3.0a0' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.7.2-h09b5827_3.conda + libcxx: '>=16' + libxml2: '>=2.12.1,<3.0.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libllvm15-15.0.7-hbedff68_4.conda hash: - md5: 53157a5777c664896654d8dbc9fd6bf9 - sha256: ee4a2367446763e6a4ef6d2fa5aea06adfd4ff44853f7390a02b0da77c6f129c + md5: bdc80cf2aa69d6eb8dd101dfd804db07 + sha256: a0598cc166e92c6c63e58a7eaa184fa0b8b467693b965dbe19f1c9ff37e134c3 category: main optional: false - name: libnetcdf @@ -8414,6 +12841,31 @@ package: sha256: 0b4d984c7be21531e9254ce742e04101f7f7e77c0bbb7074855c0806c28323b0 category: main optional: false +- name: libnetcdf + version: 4.9.2 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + blosc: '>=1.21.5,<2.0a0' + bzip2: '>=1.0.8,<2.0a0' + hdf4: '>=4.2.15,<4.2.16.0a0' + hdf5: '>=1.14.3,<1.14.4.0a0' + libaec: '>=1.1.2,<2.0a0' + libcurl: '>=8.5.0,<9.0a0' + libcxx: '>=16.0.6' + libxml2: '>=2.12.2,<3.0.0a0' + libzip: '>=1.10.1,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.0,<4.0a0' + zlib: '' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libnetcdf-4.9.2-nompi_h7760872_113.conda + hash: + md5: bce76ace6497221c2a2a02840aaceac5 + sha256: 3d6a950d82a8dfb9fa51c263e543cfa9c113703add20646ec85401e7b557da49 + category: main + optional: false - name: libnetcdf version: 4.9.2 manager: conda @@ -8456,6 +12908,23 @@ package: sha256: 1910c5306c6aa5bcbd623c3c930c440e9c77a5a019008e1487810e3c1d3716cb category: main optional: false +- name: libnghttp2 + version: 1.58.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + c-ares: '>=1.23.0,<2.0a0' + libcxx: '>=16.0.6' + libev: '>=4.33,<5.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + hash: + md5: faecc55c2a8155d9ff1c0ff9a0fef64f + sha256: 412fd768e787e586602f8e9ea52bf089f3460fc630f6987f0cbd89b70e9a4380 + category: main + optional: false - name: libnghttp2 version: 1.58.0 manager: conda @@ -8497,6 +12966,29 @@ package: sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 category: main optional: false +- name: libogg + version: 1.3.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 + hash: + md5: 6e8cc2173440d77708196c5b93771680 + sha256: b88afeb30620b11bed54dac4295aa57252321446ba4e6babd7dce4b9ffde9b25 + category: main + optional: false +- name: libogg + version: 1.3.4 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libogg-1.3.4-h35c211d_1.tar.bz2 + hash: + md5: a7ab4b53ef18c598ffaa597230bc3ba1 + sha256: e3cec0c66d352d822b7a90db8edbc62f237fca079b6044e5b27f6ca529f7d9d9 + category: main + optional: false - name: libopenblas version: 0.3.26 manager: conda @@ -8511,6 +13003,20 @@ package: sha256: b626954b5a1113dafec8df89fa8bf18ce9b4701464d9f084ddd7fc9fac404bbd category: main optional: false +- name: libopenblas + version: 0.3.26 + manager: conda + platform: osx-64 + dependencies: + libgfortran: 5.* + libgfortran5: '>=12.3.0' + llvm-openmp: '>=16.0.6' + url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.26-openmp_hfef2a42_0.conda + hash: + md5: 9df60162aea811087267b515f359536c + sha256: 4a5994cc608708eca19b90b642a144bb073e4a1cd27b824281dfcae67917204e + category: main + optional: false - name: libopenblas version: 0.3.26 manager: conda @@ -8525,6 +13031,29 @@ package: sha256: 2a59b92c412fd0f59a8079dfa21c561ae17e72e72e47d4d7aee474bf6fd642e1 category: main optional: false +- name: libopus + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + hash: + md5: 15345e56d527b330e1cacbdf58676e8f + sha256: 0e1c2740ebd1c93226dc5387461bbcf8142c518f2092f3ea7551f77755decc8f + category: main + optional: false +- name: libopus + version: 1.3.1 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libopus-1.3.1-hc929b4f_1.tar.bz2 + hash: + md5: 380b9ea5f6a7a277e6c1ac27d034369b + sha256: c126fc225bece591a8f010e95ca7d010ea2d02df9251830bec24a19bf823fc31 + category: main + optional: false - name: libpng version: 1.6.43 manager: conda @@ -8538,6 +13067,18 @@ package: sha256: 502f6ff148ac2777cc55ae4ade01a8fc3543b4ffab25c4e0eaa15f94e90dd997 category: main optional: false +- name: libpng + version: 1.6.43 + manager: conda + platform: osx-64 + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda + hash: + md5: 65dcddb15965c9de2c0365cb14910532 + sha256: 13e646d24b5179e6b0a5ece4451a587d759f55d9a360b7015f8f96eff4524b8f + category: main + optional: false - name: libpng version: 1.6.43 manager: conda @@ -8558,10 +13099,23 @@ package: krb5: '>=1.21.2,<1.22.0a0' libgcc-ng: '>=12' openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda + hash: + md5: 9e49ec2a61d02623b379dc332eb6889d + sha256: e03a8439b79e013840c44c957d37dbce10316888b2b5dc7dcfcfc0cfe3a3b128 + category: main + optional: false +- name: libpq + version: '16.2' + manager: conda + platform: osx-64 + dependencies: + krb5: '>=1.21.2,<1.22.0a0' + openssl: '>=3.2.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libpq-16.2-ha925e61_1.conda hash: - md5: fe0e297faf462ee579c95071a5211665 - sha256: 352748b0499a22e2a8e103f071b8d9357e1fb710c0aec0f79895d3ba03dccb03 + md5: a10ef466bbc68a8e74112a8e26028d66 + sha256: bfb252cb14b88a75ba4af930c16dccae265dce0afdf5abde7de1718181aa2cea category: main optional: false - name: libpq @@ -8571,10 +13125,10 @@ package: dependencies: krb5: '>=1.21.2,<1.22.0a0' openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-16.2-h0f8b458_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-16.2-h0f8b458_1.conda hash: - md5: fea5d30234a7158f4eaa915b5a6e0c9c - sha256: 0ad2265131a6d79fcfe8c5b7a04884f7377f981d18af775ebb71bc61b0c938b6 + md5: e236a8e95b82a454e333f22418b9c879 + sha256: 7a6a195d37f6fe2f2d608033755f6e9522c9a2b7b07e52529159105f635c6cae category: main optional: false - name: libprotobuf @@ -8595,15 +13149,31 @@ package: - name: libprotobuf version: 4.24.4 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + __osx: '>=10.13' libabseil: '>=20230802.1,<20230803.0a0' libcxx: '>=15' libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-4.24.4-h810fc01_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-4.24.4-hc4f2305_0.conda + hash: + md5: b0f4b64fca855d81e9cde1ceecbcb333 + sha256: 6516b3a430ae3678190a1ece9a8cb38a3ddd9c3acedc3955b76c1e668eeb2eb1 + category: main + optional: false +- name: libprotobuf + version: 4.24.4 + manager: conda + platform: osx-arm64 + dependencies: + __osx: '>=10.9' + libabseil: '>=20230802.1,<20230803.0a0' + libcxx: '>=16.0.6' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-4.24.4-hc9861d8_0.conda hash: - md5: 36d9b941d8686f7926415275f8f75829 - sha256: 9b2cd4027b081a9f90069b429e52bf177ea4968032c684ea5d5c6d78e9e11c08 + md5: ac5438d981e105e053b341eb30c44273 + sha256: 2e81e023f463ef239e2fb7f56a4e8eed61a1d8e9ca3f2f07bec1668cc369b2ce category: main optional: false - name: libre2-11 @@ -8620,6 +13190,20 @@ package: sha256: 63ebe0a3244b5f1c61337b5b387a2bacd1ca88cd894229a8cd538ef9a4b51d1a category: main optional: false +- name: libre2-11 + version: 2023.09.01 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.13' + libabseil: '>=20230802.1,<20230803.0a0' + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2023.09.01-h4694dbf_1.conda + hash: + md5: c33c8c1b04c200c2c2aac01571d3a2cf + sha256: cacd50ad7a7dd052dc38e79f6910aee82c032d4a8b5e85aeee9ee64f6bbac2da + category: main + optional: false - name: libre2-11 version: 2023.09.01 manager: conda @@ -8651,6 +13235,23 @@ package: sha256: b82d0c60376da88a2bf15d35d17c176aa923917ad7de4bc62ddef6d02f3518fb category: main optional: false +- name: librsvg + version: 2.56.3 + manager: conda + platform: osx-64 + dependencies: + cairo: '>=1.18.0,<2.0a0' + gdk-pixbuf: '>=2.42.10,<3.0a0' + gettext: '>=0.21.1,<1.0a0' + libglib: '>=2.78.1,<3.0a0' + libxml2: '>=2.12.1,<3.0.0a0' + pango: '>=1.50.14,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.56.3-h1877882_1.conda + hash: + md5: 43b31ab0e9cf3538fb3ab138ee663a0b + sha256: 29c94b30363cdcae427a2a303de3c634db05f1e28101b6e865e135e72fa8b7ec + category: main + optional: false - name: librsvg version: 2.56.3 manager: conda @@ -8682,6 +13283,20 @@ package: sha256: 03e248787162a1804683c614c0681c2488fa6d9f353cb32e2f8c1158157165ea category: main optional: false +- name: librttopo + version: 1.1.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + geos: '>=3.12.1,<3.12.2.0a0' + libcxx: '>=16.0.6' + url: https://conda.anaconda.org/conda-forge/osx-64/librttopo-1.1.0-hf05f67e_15.conda + hash: + md5: e65bedc9d9779a161cf26b6d12305246 + sha256: 10c46efefda5cc77143832a186f517e401098907cf9c3ec7406a5c242bb34e33 + category: main + optional: false - name: librttopo version: 1.1.0 manager: conda @@ -8710,6 +13325,20 @@ package: sha256: c3ffd1ff0d2fa1626a4270ee50a687d25424e8812024d92f88445a2ac9f13931 category: main optional: false +- name: libsecret + version: 0.18.8 + manager: conda + platform: osx-64 + dependencies: + gettext: '>=0.19.8.1,<1.0a0' + libgcrypt: '>=1.10.1,<2.0a0' + libglib: '>=2.70.2,<3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libsecret-0.18.8-hc7eb428_2.tar.bz2 + hash: + md5: 2fac4a5ee39b33170786ed29efe49e73 + sha256: 67aaf2e7686272631afa4c4982b61553195ed52640f9855f44c4ae28d020ed61 + category: main + optional: false - name: libsecret version: 0.18.8 manager: conda @@ -8724,16 +13353,46 @@ package: sha256: 1a86748681f1435763d981ec965e87c4bb281c5e463cd80c82a2841d3553be89 category: main optional: false +- name: libsndfile + version: 1.2.2 + manager: conda + platform: linux-64 + dependencies: + lame: '>=3.100,<3.101.0a0' + libflac: '>=1.4.3,<1.5.0a0' + libgcc-ng: '>=12' + libogg: '>=1.3.4,<1.4.0a0' + libopus: '>=1.3.1,<2.0a0' + libstdcxx-ng: '>=12' + libvorbis: '>=1.3.7,<1.4.0a0' + mpg123: '>=1.32.1,<1.33.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + hash: + md5: ef1910918dd895516a769ed36b5b3a4e + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + category: main + optional: false - name: libsodium version: 1.0.18 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=7.5.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2 + url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h516909a_1.tar.bz2 + hash: + md5: e1ca1a4b82f7b51b29318f80cebae84a + sha256: 86e0ef59cbec7e68e372b3380f5809669968d3f674a9b8f2f76f7059c83b4ad1 + category: main + optional: false +- name: libsodium + version: 1.0.18 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.18-hbcb3906_1.tar.bz2 hash: - md5: c3788462a6fbddafdb413a9f9053e58d - sha256: 53da0c8b79659df7b53eebdb80783503ce72fb4b10ed6e9e05cc0e9e4207a130 + md5: 24632c09ed931af617fe6d5292919cab + sha256: 2da45f14e3d383b4b9e3a8bacc95cd2832aac2dbf9fbc70d255d384a310c5660 category: main optional: false - name: libsodium @@ -8760,6 +13419,18 @@ package: sha256: 588fbd0c11bc44e354365d5f836183216a4ed17d680b565ff416a93b839f1a8b category: main optional: false +- name: libspatialindex + version: 1.9.3 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=11.1.0' + url: https://conda.anaconda.org/conda-forge/osx-64/libspatialindex-1.9.3-he49afe7_4.tar.bz2 + hash: + md5: b1c13764417c32fa87fac733caa82a64 + sha256: 443db45215e08fbf134a019486c20540d9903c1d9b14ac28ba299f8a730069da + category: main + optional: false - name: libspatialindex version: 1.9.3 manager: conda @@ -8794,6 +13465,29 @@ package: sha256: 2d07badb81296f42dd0c59b02dbf7d64ca2c78c086226327c1e11e11f71effbd category: main optional: false +- name: libspatialite + version: 5.1.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + freexl: '>=2.0.0,<3.0a0' + geos: '>=3.12.1,<3.12.2.0a0' + libcxx: '>=16.0.6' + libiconv: '>=1.17,<2.0a0' + librttopo: '>=1.1.0,<1.2.0a0' + libsqlite: '>=3.44.2,<4.0a0' + libxml2: '>=2.12.2,<3.0.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + proj: '>=9.3.1,<9.3.2.0a0' + sqlite: '' + zlib: '' + url: https://conda.anaconda.org/conda-forge/osx-64/libspatialite-5.1.0-hebe6af1_4.conda + hash: + md5: 9e8f3012e1b4460819395357cc7c4371 + sha256: 48ff63495ed9ed86db1fb62ea51e1053747e76481200fb33aa164f7bdb1bec93 + category: main + optional: false - name: libspatialite version: 5.1.0 manager: conda @@ -8826,8 +13520,20 @@ package: libzlib: '>=1.2.13,<1.3.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda hash: - md5: 866983a220e27a80cb75e85cb30466a1 - sha256: 8cdbeb7902729e319510a82d7c642402981818702b58812af265ef55d1315473 + md5: 866983a220e27a80cb75e85cb30466a1 + sha256: 8cdbeb7902729e319510a82d7c642402981818702b58812af265ef55d1315473 + category: main + optional: false +- name: libsqlite + version: 3.45.2 + manager: conda + platform: osx-64 + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.2-h92b6c6a_0.conda + hash: + md5: 086f56e13a96a6cfb1bf640505ae6b70 + sha256: 320ec73a4e3dd377757a2595770b8137ec4583df4d7782472d76377cdbdc4543 category: main optional: false - name: libsqlite @@ -8856,6 +13562,19 @@ package: sha256: 50e47fd9c4f7bf841a11647ae7486f65220cfc988ec422a4475fe8d5a823824d category: main optional: false +- name: libssh2 + version: 1.11.0 + manager: conda + platform: osx-64 + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda + hash: + md5: ca3a72efba692c59a90d4b9fc0dfe774 + sha256: f3886763b88f4b24265db6036535ef77b7b77ce91b1cbe588c0fbdd861eec515 + category: main + optional: false - name: libssh2 version: 1.11.0 manager: conda @@ -8880,6 +13599,24 @@ package: sha256: a56c5b11f1e73a86e120e6141a42d9e935a99a2098491ac9e15347a1476ce777 category: main optional: false +- name: libsystemd0 + version: '255' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libcap: '>=2.69,<2.70.0a0' + libgcc-ng: '>=12' + libgcrypt: '>=1.10.3,<2.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda + hash: + md5: 3366af27f0b593544a6cd453c7932ac5 + sha256: af27b0d225435d03f378a119f8eab6b280c53557a3c84cdb3bb8fd3167615aed + category: main + optional: false - name: libthrift version: 0.19.0 manager: conda @@ -8896,6 +13633,21 @@ package: sha256: 719add2cf20d144ef9962c57cd0f77178259bdb3aae1cded2e2b2b7c646092f5 category: main optional: false +- name: libthrift + version: 0.19.0 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + libevent: '>=2.1.12,<2.1.13.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.3,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.19.0-h064b379_1.conda + hash: + md5: b152655bfad7c2374ff03be0596052b6 + sha256: 4346c25ef6e2ff3d0fc93074238508531188ecd0dbea6414f6cb93a7775072c4 + category: main + optional: false - name: libthrift version: 0.19.0 manager: conda @@ -8931,6 +13683,25 @@ package: sha256: 45158f5fbee7ee3e257e6b9f51b9f1c919ed5518a94a9973fe7fa4764330473e category: main optional: false +- name: libtiff + version: 4.6.0 + manager: conda + platform: osx-64 + dependencies: + lerc: '>=4.0.0,<5.0a0' + libcxx: '>=15.0.7' + libdeflate: '>=1.19,<1.20.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libwebp-base: '>=1.3.2,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h684deea_2.conda + hash: + md5: 2ca10a325063e000ad6d2a5900061e0d + sha256: 1ef5bd7295f4316b111f70ad21356fb9f0de50b85a341cac9e3a61ac6487fdf1 + category: main + optional: false - name: libtiff version: 4.6.0 manager: conda @@ -8957,23 +13728,17 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' - cudatoolkit: '>=11.8,<12' - cudnn: '>=8.8.0.121,<9.0a0' libcblas: '>=3.9.0,<4.0a0' libgcc-ng: '>=12' - libmagma: '>=2.7.2,<2.7.3.0a0' - libmagma_sparse: '>=2.7.2,<2.7.3.0a0' libprotobuf: '>=4.24.4,<4.24.5.0a0' libstdcxx-ng: '>=12' libuv: '>=1.46.0,<2.0a0' - magma: '>=2.7.2,<2.7.3.0a0' mkl: '>=2023.2.0,<2024.0a0' - nccl: '>=2.19.4.1,<3.0a0' sleef: '>=3.5.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.1.2-cuda118_h3d7bd98_300.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.1.2-cpu_mkl_hadc400e_100.conda hash: - md5: 19f2c0ac4037db9622363dbdcdd21df0 - sha256: 80c47ee854a10b028841f581c8651b85ed2453d086b8a8a784326606bbb7a945 + md5: 54f228509c64d8de523ee6ab19e5f3e9 + sha256: e904bb9260816595e34c5fed07ce8d1ae5572bce36c283425fbec0bddcd3ce88 category: main optional: false - name: libutf8proc @@ -8988,6 +13753,17 @@ package: sha256: 49082ee8d01339b225f7f8c60f32a2a2c05fe3b16f31b554b4fb2c1dea237d1c category: main optional: false +- name: libutf8proc + version: 2.8.0 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.8.0-hb7f2c08_0.tar.bz2 + hash: + md5: db98dc3e58cbc11583180609c429c17d + sha256: 55a7f96b2802e94def207fdfe92bc52c24d705d139bb6cdb3d936cbe85e1c505 + category: main + optional: false - name: libutf8proc version: 2.8.0 manager: conda @@ -9023,6 +13799,17 @@ package: sha256: b7c0e8a0c93c2621be7645b37123d4e8d27e8a974da26a3fba47a9c37711aa7f category: main optional: false +- name: libuv + version: 1.48.0 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.48.0-h67532ce_0.conda + hash: + md5: c8e7344c74f0d86584f7ecdc9f25c198 + sha256: fb87f7bfd464a3a841d23f418c86a206818da0c4346984392071d9342c9ea367 + category: main + optional: false - name: libuv version: 1.48.0 manager: conda @@ -9034,6 +13821,33 @@ package: sha256: 60bed2a7a85096387ab0381cbc32ea2da7f8dd99bd90e440983019c0cdd96ad1 category: main optional: false +- name: libvorbis + version: 1.3.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + libogg: '>=1.3.2,<1.4.0a0' + libstdcxx-ng: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-he1b5a44_0.tar.bz2 + hash: + md5: de5b60f584a98d397cc589fcabfa3889 + sha256: 7ad72b75a143ea0bbd72f088b6150db9de66f0c2f25e5745e96aca0a16918d7f + category: main + optional: false +- name: libvorbis + version: 1.3.7 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=11.0.0' + libogg: '>=1.3.4,<1.4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libvorbis-1.3.7-h046ec9c_0.tar.bz2 + hash: + md5: fbbda1fede0aadaa252f6919148c4ce1 + sha256: fbcce1005efcd616e452dea07fe34893d8dd13c65628e74920eeb68ac549faf7 + category: main + optional: false - name: libwebp version: 1.3.2 manager: conda @@ -9051,6 +13865,22 @@ package: sha256: cc5e55531d8067ea379b145861aea8c749a545912bc016372f5e3c69cc925efd category: main optional: false +- name: libwebp + version: 1.3.2 + manager: conda + platform: osx-64 + dependencies: + giflib: '>=5.2.1,<5.3.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + libwebp-base: '>=1.3.2,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-1.3.2-h44782d1_1.conda + hash: + md5: 46d48ff2cd600a82db18d7b83471aa86 + sha256: 4d7e1efb76e398f578c5a3d0905c5eca1e4a93298aed6e2f7a10854f6671dfe8 + category: main + optional: false - name: libwebp version: 1.3.2 manager: conda @@ -9079,6 +13909,17 @@ package: sha256: 68764a760fa81ef35dacb067fe8ace452bbb41476536a4a147a1051df29525f0 category: main optional: false +- name: libwebp-base + version: 1.3.2 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h0dc2134_0.conda + hash: + md5: 4e7e9d244e87d66c18d36894fd6a8ae5 + sha256: fa7580f26fec4c28321ec2ece1257f3293e0c646c635e9904679f4a8369be401 + category: main + optional: false - name: libwebp-base version: 1.3.2 manager: conda @@ -9105,6 +13946,20 @@ package: sha256: a670902f0a3173a466c058d2ac22ca1dd0df0453d3a80e0212815c20a16b0485 category: main optional: false +- name: libxcb + version: '1.15' + manager: conda + platform: osx-64 + dependencies: + pthread-stubs: '' + xorg-libxau: '' + xorg-libxdmcp: '' + url: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda + hash: + md5: 5513f57e0238c87c12dffedbcc9c1a4a + sha256: f41904f466acc8b3197f37f2dd3a08da75720c7f7464d9267635debc4ac1902b + category: main + optional: false - name: libxcb version: '1.15' manager: conda @@ -9131,6 +13986,23 @@ package: sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c category: main optional: false +- name: libxkbcommon + version: 1.7.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + libxml2: '>=2.12.6,<3.0a0' + xkeyboard-config: '' + xorg-libxau: '>=1.0.11,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda + hash: + md5: b32c0da42b1f24a98577bb3d7fc0b995 + sha256: 3d97d7f964237f42452295d461afdbc51e93f72e2c80be516f56de80e3bb6621 + category: main + optional: false - name: libxml2 version: 2.12.6 manager: conda @@ -9141,10 +14013,25 @@ package: libiconv: '>=1.17,<2.0a0' libzlib: '>=1.2.13,<1.3.0a0' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda + hash: + md5: 6853448e9ca1cfd5f15382afd2a6d123 + sha256: c0bd693bb1a7e5aba388a0c79be16ff92e2411e03aaa920f94b4b33bf099e254 + category: main + optional: false +- name: libxml2 + version: 2.12.6 + manager: conda + platform: osx-64 + dependencies: + icu: '>=73.2,<74.0a0' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xz: '>=5.2.6,<6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_1.conda hash: - md5: d86653ff5ccb88bf7f13833fdd8789e0 - sha256: 4646ae14fb226080d2bfeb89510147abebd603bab1c80bb6b3c02a01c10c6ee5 + md5: bd85e0ca9e1ffaadc3b56079fd956035 + sha256: 07a5dc7316d4c1ff3d924df6a76e6a13380d702fa5b3b1889e56d0672e5b8201 category: main optional: false - name: libxml2 @@ -9156,10 +14043,10 @@ package: libiconv: '>=1.17,<2.0a0' libzlib: '>=1.2.13,<1.3.0a0' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_1.conda hash: - md5: 4713f0d8bb1e50cc4757c118b6fe20d5 - sha256: 38a5e25e1fd3b59fd31301f39a0f02ca28925d7d102348921b9366e580cd810c + md5: c08526c957192192e1e7b4f622761144 + sha256: f18775ca8494ead5451d4acfc53fa7ebf7a8b5ed04c43bcc50fab847c9780cb3 category: main optional: false - name: libzip @@ -9177,6 +14064,20 @@ package: sha256: 84e93f189072dcfcbe77744f19c7e4171523fbecfaba7352e5a23bbe014574c7 category: main optional: false +- name: libzip + version: 1.10.1 + manager: conda + platform: osx-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libzip-1.10.1-hc158999_3.conda + hash: + md5: 6112b3173f3aa2f12a8f40d07a77cc35 + sha256: 0689e4a6e67e80027e43eefb8a365273405a01f5ab2ece97319155b8be5d64f6 + category: main + optional: false - name: libzip version: 1.10.1 manager: conda @@ -9203,6 +14104,17 @@ package: sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4 category: main optional: false +- name: libzlib + version: 1.2.13 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda + hash: + md5: 4a3ad23f6e16f99c04e166767193d700 + sha256: fc58ad7f47ffea10df1f2165369978fba0a1cc32594aad778f5eec725f334867 + category: main + optional: false - name: libzlib version: 1.2.13 manager: conda @@ -9215,27 +14127,38 @@ package: category: main optional: false - name: llvm-openmp - version: 18.1.1 + version: 18.1.2 manager: conda platform: linux-64 dependencies: libzlib: '>=1.2.13,<1.3.0a0' zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.1-h4dfa4b3_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.2-h4dfa4b3_0.conda + hash: + md5: 0118c8a03e3dbbb6b348ef71e94ac7af + sha256: a27691201ccf157e7b53390f29f66469957302a05abb22a6b6d6701673bba3bb + category: main + optional: false +- name: llvm-openmp + version: 18.1.2 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.2-hb6ac08f_0.conda hash: - md5: 89023cfc92c7e9dd2e822ebdb4f753b0 - sha256: a85cadbb1b00d181a6462700c3d1da7092c53b3f1f90c76ec560fef34aff226b + md5: e7f7e91cfabd8c7172c9ae405214dd68 + sha256: dc40b678f5be2caf4e89ee3dc9037399d0bcd46543bc258dc46e1b92d241c6a6 category: main optional: false - name: llvm-openmp - version: 18.1.1 + version: 18.1.2 manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.1-hcd81f8e_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.2-hcd81f8e_0.conda hash: - md5: 4f878f28804ed85e5191132c12c1fca5 - sha256: 38cf66997aae1bb20575ca829c322cb255c23652609576f76590f4ab7e35572a + md5: 34646dc152f3949a2f8a67136d406dce + sha256: 2ed8ae5a4c6122d542564a9bb9d4961ed7d2fb9581f0ea8bd81e3a83e614b110 category: main optional: false - name: locket @@ -9250,6 +14173,18 @@ package: sha256: 9afe0b5cfa418e8bdb30d8917c5a6cec10372b037924916f1f85b9f4899a67a6 category: main optional: false +- name: locket + version: 1.0.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' + url: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 91e27ef3d05cc772ce627e51cff111c4 + sha256: 9afe0b5cfa418e8bdb30d8917c5a6cec10372b037924916f1f85b9f4899a67a6 + category: main + optional: false - name: locket version: 1.0.0 manager: conda @@ -9277,6 +14212,20 @@ package: sha256: 85b0f58f4ab75bbfbf16036487f66aac0d577f2894b52ee2e86a82c0d04e8131 category: main optional: false +- name: lz4 + version: 4.3.3 + manager: conda + platform: osx-64 + dependencies: + lz4-c: '>=1.9.3,<1.10.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/lz4-4.3.3-py39h91cfb08_0.conda + hash: + md5: 3a809e3cf5adb89819ebd964d26fbb33 + sha256: 60a0d2a5878636b556923b8a54dc6e992f69ce8b2a3a062c3d8f91ea627ba545 + category: main + optional: false - name: lz4 version: 4.3.3 manager: conda @@ -9304,6 +14253,18 @@ package: sha256: 1b4c105a887f9b2041219d57036f72c4739ab9e9fe5a1486f094e58c76b31f5f category: main optional: false +- name: lz4-c + version: 1.9.4 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=14.0.6' + url: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.9.4-hf0c8a7f_0.conda + hash: + md5: aa04f7143228308662696ac24023f991 + sha256: 39aa0c01696e4e202bf5e337413de09dfeec061d89acd5f28e9968b4e93c3f48 + category: main + optional: false - name: lz4-c version: 1.9.4 manager: conda @@ -9328,6 +14289,17 @@ package: sha256: 25d16e6aaa3d0b450e61d0c4fadd7c9fd17f16e2fef09b34507209342d63c9f6 category: main optional: false +- name: lzo + version: '2.10' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/lzo-2.10-haf1e3a3_1000.tar.bz2 + hash: + md5: 0b6bca372a95d6c602c7a922e928ce79 + sha256: c8a9401eff2efbbcc6da03d0066ee85d72402f7658c240e7968c64052a0d0493 + category: main + optional: false - name: lzo version: '2.10' manager: conda @@ -9339,25 +14311,22 @@ package: sha256: ae029e5c16893071d29a11ddbfdbdb01b2ebf10d1785f54370934439d8b71817 category: main optional: false -- name: magma - version: 2.7.2 +- name: makefun + version: 1.15.2 manager: conda platform: linux-64 dependencies: - __glibc: '>=2.17' - cudatoolkit: '>=11.8,<12' - libmagma: '>=2.7.2,<2.7.3.0a0' - libmagma_sparse: 2.7.2 - url: https://conda.anaconda.org/conda-forge/linux-64/magma-2.7.2-h4aca40b_3.conda + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/makefun-1.15.2-pyhd8ed1ab_0.conda hash: - md5: fe218300f1dfb9fbedbd210b3b9e020e - sha256: 9e3240a60a16269c986bcd3d1bee9e35cf81a843ff33b68ee6a2a1e7cbb7fd1c + md5: f0ebb89ab17982033d8f0fea244b0822 + sha256: bcd48b9d591a5cc97803701c25aeec06122baf3af4e799e764eddcede112533b category: main optional: false - name: makefun version: 1.15.2 manager: conda - platform: linux-64 + platform: osx-64 dependencies: python: '>=3.5' url: https://conda.anaconda.org/conda-forge/noarch/makefun-1.15.2-pyhd8ed1ab_0.conda @@ -9395,11 +14364,25 @@ package: - name: mako version: 1.3.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: importlib-metadata: '' + python: '>=3.6' markupsafe: '>=0.9.2' + url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.2-pyhd8ed1ab_0.conda + hash: + md5: a6b5f0124bc6d061350edd6d7f96dd05 + sha256: 5f21876a83bcc040196d7f3950d576eb492bf0f6293eacd55e48e2c58a069bce + category: main + optional: false +- name: mako + version: 1.3.2 + manager: conda + platform: osx-arm64 + dependencies: + importlib-metadata: '' python: '>=3.6' + markupsafe: '>=0.9.2' url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.2-pyhd8ed1ab_0.conda hash: md5: a6b5f0124bc6d061350edd6d7f96dd05 @@ -9426,14 +14409,31 @@ package: - name: mapclassify version: 2.6.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - networkx: '>=2.7' + python: '>=3.9' numpy: '>=1.23' + scikit-learn: '>=1.0' + scipy: '>=1.8' + networkx: '>=2.7' pandas: '>=1.4,!=1.5.0' + url: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.6.1-pyhd8ed1ab_0.conda + hash: + md5: 6aceae1ad4f16cf7b73ee04189947f98 + sha256: 204ab8b242229d422b33cfec07ea61cefa8bd22375a16658afbabaafce031d64 + category: main + optional: false +- name: mapclassify + version: 2.6.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.9' + numpy: '>=1.23' scikit-learn: '>=1.0' scipy: '>=1.8' + networkx: '>=2.7' + pandas: '>=1.4,!=1.5.0' url: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.6.1-pyhd8ed1ab_0.conda hash: md5: 6aceae1ad4f16cf7b73ee04189947f98 @@ -9456,24 +14456,51 @@ package: - name: markdown version: '3.6' manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.6' importlib-metadata: '>=4.4' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda + hash: + md5: 06e9bebf748a0dea03ecbe1f0e27e909 + sha256: fce1fde00359696983989699c00f9891194c4ebafea647a8d21b7e2e3329b56e + category: main + optional: false +- name: markdown + version: '3.6' + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' + importlib-metadata: '>=4.4' url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda hash: - md5: 06e9bebf748a0dea03ecbe1f0e27e909 - sha256: fce1fde00359696983989699c00f9891194c4ebafea647a8d21b7e2e3329b56e + md5: 06e9bebf748a0dea03ecbe1f0e27e909 + sha256: fce1fde00359696983989699c00f9891194c4ebafea647a8d21b7e2e3329b56e + category: main + optional: false +- name: markdown-it-py + version: 2.2.0 + manager: conda + platform: linux-64 + dependencies: + mdurl: '>=0.1,<1' + python: '>=3.7' + typing_extensions: '>=3.7.4' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-2.2.0-pyhd8ed1ab_0.conda + hash: + md5: b2928a6c6d52d7e3562b4a59c3214e3a + sha256: 65ed439862c1851463f03a9bc5109992ce3e3e025e9a2d76d13ca19f576eee9f category: main optional: false - name: markdown-it-py version: 2.2.0 manager: conda - platform: linux-64 + platform: osx-64 dependencies: - mdurl: '>=0.1,<1' python: '>=3.7' typing_extensions: '>=3.7.4' + mdurl: '>=0.1,<1' url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-2.2.0-pyhd8ed1ab_0.conda hash: md5: b2928a6c6d52d7e3562b4a59c3214e3a @@ -9485,9 +14512,9 @@ package: manager: conda platform: osx-arm64 dependencies: - mdurl: '>=0.1,<1' python: '>=3.7' typing_extensions: '>=3.7.4' + mdurl: '>=0.1,<1' url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-2.2.0-pyhd8ed1ab_0.conda hash: md5: b2928a6c6d52d7e3562b4a59c3214e3a @@ -9508,6 +14535,19 @@ package: sha256: 855d305ceda4751cdd495923104dd34da5a6be45e4fd50a4e80361d9f95bcb38 category: main optional: false +- name: markupsafe + version: 2.1.5 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py39ha09f3b3_0.conda + hash: + md5: db347b50af50d030b73be1d1e457cac2 + sha256: 2fbc1105e680dd34e44f59c67ad30b5e5fbbed65ce4dfb09dac0df811bc24f73 + category: main + optional: false - name: markupsafe version: 2.1.5 manager: conda @@ -9537,10 +14577,23 @@ package: - name: marshmallow version: 3.21.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' packaging: '>=17.0' + url: https://conda.anaconda.org/conda-forge/noarch/marshmallow-3.21.1-pyhd8ed1ab_0.conda + hash: + md5: ae303aa7dc100bc3bc01b5a3b7ca3567 + sha256: d1c825bebd47db2327819562d23560b1e9cb50c73e964848a6f2e58f61d962d1 + category: main + optional: false +- name: marshmallow + version: 3.21.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + packaging: '>=17.0' url: https://conda.anaconda.org/conda-forge/noarch/marshmallow-3.21.1-pyhd8ed1ab_0.conda hash: md5: ae303aa7dc100bc3bc01b5a3b7ca3567 @@ -9553,20 +14606,35 @@ package: platform: linux-64 dependencies: marshmallow: '>=2.0.0' - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/marshmallow-enum-1.5.1-pyh9f0ad1d_3.tar.bz2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/linux-64/marshmallow-enum-1.5.1-py39hde42818_2.tar.bz2 hash: - md5: 67c5202bf14543cd1bb97f129d3f26dd - sha256: 7729d878c2129d691e86b81fce346320a0152a6bbfc862a8c12ec646763f4857 + md5: cf3771b0c8d7662dff2212b4db9dd27b + sha256: 3fbc341d3a4dc6a5fa8063b19330a6e598f2832c86f74924453a8511869d2624 category: main optional: false - name: marshmallow-enum version: 1.5.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: marshmallow: '>=2.0.0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/marshmallow-enum-1.5.1-py39hde42818_2.tar.bz2 + hash: + md5: 9fc9b6435d828044de3701b1ce6ef0df + sha256: 95aff28070c789f3f9302a991a358c84dcbd547729464491e0f0b4ec8926eb9c + category: main + optional: false +- name: marshmallow-enum + version: 1.5.1 + manager: conda + platform: osx-arm64 + dependencies: python: '' + marshmallow: '>=2.0.0' url: https://conda.anaconda.org/conda-forge/noarch/marshmallow-enum-1.5.1-pyh9f0ad1d_3.tar.bz2 hash: md5: 67c5202bf14543cd1bb97f129d3f26dd @@ -9589,10 +14657,23 @@ package: - name: marshmallow-jsonschema version: 0.13.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.6' marshmallow: '>=3.11' + url: https://conda.anaconda.org/conda-forge/noarch/marshmallow-jsonschema-0.13.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: bd47c87386365fcaf782c9c407b50507 + sha256: 74c6bd772e9ed1b33bdb216737186eae36fca27dbf0e1cb6bd9847494f08c9d6 + category: main + optional: false +- name: marshmallow-jsonschema + version: 0.13.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' + marshmallow: '>=3.11' url: https://conda.anaconda.org/conda-forge/noarch/marshmallow-jsonschema-0.13.0-pyhd8ed1ab_0.tar.bz2 hash: md5: bd47c87386365fcaf782c9c407b50507 @@ -9612,6 +14693,19 @@ package: sha256: c0b2c8b745a5492aabe9cbece7be6dcbd1458166333c7f96c11741640ed348da category: main optional: false +- name: mashumaro + version: '3.12' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + typing-extensions: '>=4.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/mashumaro-3.12-pyhd8ed1ab_0.conda + hash: + md5: 1a8457271699e24f59dbaadc92e7330f + sha256: c0b2c8b745a5492aabe9cbece7be6dcbd1458166333c7f96c11741640ed348da + category: main + optional: false - name: mashumaro version: '3.12' manager: conda @@ -9653,6 +14747,33 @@ package: sha256: 6a430a5816f189b7277182b6c251236c5af22e254b8253eeb6ffcb06a8ea7087 category: main optional: false +- name: matplotlib-base + version: 3.8.3 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.12' + certifi: '>=2020.06.20' + contourpy: '>=1.0.1' + cycler: '>=0.10' + fonttools: '>=4.22.0' + freetype: '>=2.12.1,<3.0a0' + importlib-resources: '>=3.2.0' + kiwisolver: '>=1.3.1' + libcxx: '>=16' + numpy: '>=1.22.4,<2.0a0' + packaging: '>=20.0' + pillow: '>=8' + pyparsing: '>=2.3.1' + python: '>=3.9,<3.10.0a0' + python-dateutil: '>=2.7' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.3-py39h7070ae8_0.conda + hash: + md5: 241e91172dfaa6ad66e3c838a6185641 + sha256: 4173787e0ff755e25ebe1c4bb9e0a64fd397cd0fa18f28e54a592cc1af2b6049 + category: main + optional: false - name: matplotlib-base version: 3.8.3 manager: conda @@ -9695,10 +14816,23 @@ package: - name: matplotlib-inline version: 0.1.6 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + traitlets: '' python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2 + hash: + md5: b21613793fcc81d944c76c9f2864a7de + sha256: aa091b88aec55bfa2d9207028d8cdc689b9efb090ae27b99557e93c675be2f3c + category: main + optional: false +- name: matplotlib-inline + version: 0.1.6 + manager: conda + platform: osx-arm64 + dependencies: traitlets: '' + python: '>=3.6' url: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2 hash: md5: b21613793fcc81d944c76c9f2864a7de @@ -9721,10 +14855,23 @@ package: - name: mdit-py-plugins version: 0.4.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' markdown-it-py: '>=1.0.0,<4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda + hash: + md5: 6c5358a10873a15398b6f15f60cb5e1f + sha256: 1ddac8d2be448cd1fbe49d2ca09df7e10d99679d53146a917f8bb4899f76d0ca + category: main + optional: false +- name: mdit-py-plugins + version: 0.4.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + markdown-it-py: '>=1.0.0,<4.0.0' url: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda hash: md5: 6c5358a10873a15398b6f15f60cb5e1f @@ -9743,6 +14890,18 @@ package: sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 category: main optional: false +- name: mdurl + version: 0.1.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + hash: + md5: 776a8dd9e824f77abac30e6ef43a8f7a + sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 + category: main + optional: false - name: mdurl version: 0.1.2 manager: conda @@ -9774,6 +14933,24 @@ package: sha256: 1a56549751f4c4a7998e0a8bcff367c3992cb832c0b211d775cfd644e1ef5e6b category: main optional: false +- name: minizip + version: 4.0.5 + manager: conda + platform: osx-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libcxx: '>=16' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.1,<4.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/minizip-4.0.5-h37d7099_0.conda + hash: + md5: 2203b2e83c20305b3d669556c345c8e9 + sha256: 426f4db1d56cdefa478a5ece35ed7624860548ace87d6ad927c4c9c6a7a20fec + category: main + optional: false - name: minizip version: 4.0.5 manager: conda @@ -9804,6 +14981,18 @@ package: sha256: f95cb70007e3cc2ba44e17c29a056b499e6dadf08746706d0c817c8e2f47e05c category: main optional: false +- name: mistune + version: 3.0.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda + hash: + md5: 5cbee699846772cc939bef23a0d524ed + sha256: f95cb70007e3cc2ba44e17c29a056b499e6dadf08746706d0c817c8e2f47e05c + category: main + optional: false - name: mistune version: 3.0.2 manager: conda @@ -9830,6 +15019,19 @@ package: sha256: 046073737bf73153b0c39e343b197cdf0b7867d336962369407465a17ea5979a category: main optional: false +- name: mkl + version: 2022.2.1 + manager: conda + platform: osx-64 + dependencies: + llvm-openmp: '>=14.0.6' + tbb: 2021.* + url: https://conda.anaconda.org/conda-forge/osx-64/mkl-2022.2.1-h44ed08c_16952.conda + hash: + md5: a51e7035c0075d4341942a5894ef20b9 + sha256: 70896885df3cf031ac547c42f27384f769f190bc2bfb9e2520a7ef2c34db4806 + category: main + optional: false - name: ml_dtypes version: 0.2.0 manager: conda @@ -9846,6 +15048,21 @@ package: sha256: 075bc750ecd95c7fc64be32181a6818d2bb7e9a965123c7eb8f1e0f3e29ab00a category: main optional: false +- name: ml_dtypes + version: 0.2.0 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/ml_dtypes-0.2.0-py39hcc9a0c8_2.conda + hash: + md5: d7047358980c481b056abbce772338c7 + sha256: c57a511548bc13ccc0007afd4a2b699000563c74d13d38c14dd264e66f61f390 + category: main + optional: false - name: ml_dtypes version: 0.2.0 manager: conda @@ -9902,6 +15119,47 @@ package: sha256: 8c973c4dfe492f7141c0ba9513e273ed31cf51f80b173d3f0f7c6f681914c7e7 category: main optional: false +- name: mlflow + version: 2.7.0 + manager: conda + platform: osx-64 + dependencies: + alembic: <2,!=1.10 + click: '>=7.0,<9' + cloudpickle: <3 + databricks-cli: '>=0.8.7,<1' + docker-py: '>=4.0.0,<7' + entrypoints: <1 + flask: <3 + gitpython: '>=2.1.0,<4' + gunicorn: <22 + importlib-metadata: <7,>=3.7.0,!=4.7.0 + jinja2: <4,>=2.11 + markdown: <4,>=3.3 + matplotlib-base: <4 + numpy: <2 + openssl: '' + packaging: <24 + pandas: <3 + prometheus_flask_exporter: <1 + protobuf: '>=3.12.0,<5' + pyarrow: <14,>=4.0.0 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + pytz: <2024 + pyyaml: '>=5.1,<7' + querystring_parser: <2 + requests: '>=2.17.3,<3' + scikit-learn: <2 + scipy: <2 + sqlalchemy: '>=1.4.0,<3' + sqlparse: '>=0.4.0,<1' + url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-2.7.0-py39h8ac9d56_0.conda + hash: + md5: 21c33f5f9e9a1d053544620b5d00bc79 + sha256: c98ec57de0451c1045e8e462d859aeda8c948a6eb87ac55d23e65063bd914159 + category: main + optional: false - name: mlflow version: 2.7.0 manager: conda @@ -9957,6 +15215,20 @@ package: sha256: 6e99d2506b6943549283b7e48f1e529c085ac9b5ef52b2e617efb2ea20e6562a category: main optional: false +- name: modin + version: 0.28.0 + manager: conda + platform: osx-64 + dependencies: + modin-dask: 0.28.0 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/modin-0.28.0-py39h6e9494a_0.conda + hash: + md5: e240c76fd1104c2681dce94af6e9facc + sha256: ad88d88d53aaa5e2a366709f46989475aea168eb2d10daba738f5c4e2f4695a1 + category: main + optional: false - name: modin version: 0.28.0 manager: conda @@ -9989,6 +15261,24 @@ package: sha256: c9fbb625f88191618fd9cd8b9c4ba7b490a12c87b283bc1115d34b698190f4c7 category: main optional: false +- name: modin-core + version: 0.28.0 + manager: conda + platform: osx-64 + dependencies: + fsspec: '>=2022.11.0' + numpy: '>=1.22.4' + packaging: '>=21.0' + pandas: '>=2.2,<2.3' + psutil: '>=5.8.0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/modin-core-0.28.0-py39h6e9494a_0.conda + hash: + md5: a6f9748ee9de1f41e12565d534813e39 + sha256: 6cece38062322e656cfd91ba0661fe300407234e390337e404b245a4c30b6080 + category: main + optional: false - name: modin-core version: 0.28.0 manager: conda @@ -10001,26 +15291,42 @@ package: psutil: '>=5.8.0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/modin-core-0.28.0-py39h2804cbe_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/modin-core-0.28.0-py39h2804cbe_0.conda + hash: + md5: d378d3a53862f2adb93bd6873bf2d0d0 + sha256: 426aba167d8b471578ee94fedfa72c19c7275bc305116e38613597ead256e61e + category: main + optional: false +- name: modin-dask + version: 0.28.0 + manager: conda + platform: linux-64 + dependencies: + dask: '>=2.22.0' + distributed: '>=2.22.0' + modin-core: 0.28.0 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/linux-64/modin-dask-0.28.0-py39hf3d152e_0.conda hash: - md5: d378d3a53862f2adb93bd6873bf2d0d0 - sha256: 426aba167d8b471578ee94fedfa72c19c7275bc305116e38613597ead256e61e + md5: 16ab25beae69cde03b76e72f061d2bf6 + sha256: 97c4ba6e462c1dd227bd1cf1e3af156ba7eb2136e31db40832650c117d9e9ec2 category: main optional: false - name: modin-dask version: 0.28.0 manager: conda - platform: linux-64 + platform: osx-64 dependencies: dask: '>=2.22.0' distributed: '>=2.22.0' modin-core: 0.28.0 python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/modin-dask-0.28.0-py39hf3d152e_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/modin-dask-0.28.0-py39h6e9494a_0.conda hash: - md5: 16ab25beae69cde03b76e72f061d2bf6 - sha256: 97c4ba6e462c1dd227bd1cf1e3af156ba7eb2136e31db40832650c117d9e9ec2 + md5: 60224e14c75aa0619a0efb08aeee8d4b + sha256: e03a929af284ac9bcf357d2d9da203972c4e0281270f4a966d476fe39ec8eca0 category: main optional: false - name: modin-dask @@ -10051,6 +15357,18 @@ package: sha256: 9e49e9484ff279453f0b55323a3f0c7cb97440c74f69eecda1f4ad29fae5cd3c category: main optional: false +- name: more-itertools + version: 10.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.2.0-pyhd8ed1ab_0.conda + hash: + md5: d5c98e9706fdc5328d49a9bf2ce5fb42 + sha256: 9e49e9484ff279453f0b55323a3f0c7cb97440c74f69eecda1f4ad29fae5cd3c + category: main + optional: false - name: more-itertools version: 10.2.0 manager: conda @@ -10077,6 +15395,19 @@ package: sha256: 2f88965949ba7b4b21e7e5facd62285f7c6efdb17359d1b365c3bb4ecc968d29 category: main optional: false +- name: mpc + version: 1.3.1 + manager: conda + platform: osx-64 + dependencies: + gmp: '>=6.2.1,<7.0a0' + mpfr: '>=4.1.0,<5.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h81bd1dd_0.conda + hash: + md5: c752c0eb6c250919559172c011e5f65b + sha256: 2ae945a15c8a984d581dcfb974ad3b5d877a6527de2c95a3363e6b4490b2f312 + category: main + optional: false - name: mpc version: 1.3.1 manager: conda @@ -10103,6 +15434,18 @@ package: sha256: 008230a53ff15cf61966476b44f7ba2c779826825b9ca639a0a2b44d8f7aa6cb category: main optional: false +- name: mpfr + version: 4.2.1 + manager: conda + platform: osx-64 + dependencies: + gmp: '>=6.2.1,<7.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-h0c69b56_0.conda + hash: + md5: d545aecded064848432bc994075dfccf + sha256: e7c93a5399661b0528981c6fd53e8614eee3f9ba97f92e8167c092c4a5d9368c + category: main + optional: false - name: mpfr version: 4.2.1 manager: conda @@ -10115,6 +15458,19 @@ package: sha256: 811ca63177cf638ac01442fc8d1148d3a0cef18dc1f870fceed1feb24be6fd8f category: main optional: false +- name: mpg123 + version: 1.32.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda + hash: + md5: 3f1017b4141e943d9bc8739237f749e8 + sha256: 512f4ad7eda3b2c9a1cc9f7931932aefa6e79567e35b76de03895e769cb3b43c + category: main + optional: false - name: mpmath version: 1.3.0 manager: conda @@ -10127,6 +15483,18 @@ package: sha256: a4f025c712ec1502a55c471b56a640eaeebfce38dd497d5a1a33729014cac47a category: main optional: false +- name: mpmath + version: 1.3.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: dbf6e2d89137da32fa6670f3bffc024e + sha256: a4f025c712ec1502a55c471b56a640eaeebfce38dd497d5a1a33729014cac47a + category: main + optional: false - name: mpmath version: 1.3.0 manager: conda @@ -10140,7 +15508,7 @@ package: category: main optional: false - name: msal - version: 1.27.0 + version: 1.28.0 manager: conda platform: linux-64 dependencies: @@ -10148,25 +15516,40 @@ package: pyjwt: <3,>=1.0.0 python: '>=3.6' requests: <3,>=2.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/msal-1.27.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/msal-1.28.0-pyhd8ed1ab_0.conda hash: - md5: 95a138b82ec36756dd8c4bd25e564597 - sha256: e3f5876e8ea2078aba5b34d6dde53910afc8f88bf6d9eec11c0bee9eb9ba6ea8 + md5: 6f11e244d25bd0f23fd2f8f7e3c21c9e + sha256: ce36a188f4148810b12d298d0fc369ce46ad16efef2acc6fc03fb9aa4a68cdcc category: main optional: false - name: msal - version: 1.27.0 + version: 1.28.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - cryptography: <45,>=0.6 + python: '>=3.6' pyjwt: <3,>=1.0.0 + requests: <3,>=2.0.0 + cryptography: <45,>=0.6 + url: https://conda.anaconda.org/conda-forge/noarch/msal-1.28.0-pyhd8ed1ab_0.conda + hash: + md5: 6f11e244d25bd0f23fd2f8f7e3c21c9e + sha256: ce36a188f4148810b12d298d0fc369ce46ad16efef2acc6fc03fb9aa4a68cdcc + category: main + optional: false +- name: msal + version: 1.28.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' + pyjwt: <3,>=1.0.0 requests: <3,>=2.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/msal-1.27.0-pyhd8ed1ab_0.conda + cryptography: <45,>=0.6 + url: https://conda.anaconda.org/conda-forge/noarch/msal-1.28.0-pyhd8ed1ab_0.conda hash: - md5: 95a138b82ec36756dd8c4bd25e564597 - sha256: e3f5876e8ea2078aba5b34d6dde53910afc8f88bf6d9eec11c0bee9eb9ba6ea8 + md5: 6f11e244d25bd0f23fd2f8f7e3c21c9e + sha256: ce36a188f4148810b12d298d0fc369ce46ad16efef2acc6fc03fb9aa4a68cdcc category: main optional: false - name: msal_extensions @@ -10187,6 +15570,24 @@ package: sha256: 650f8abd6ffb20e2d07dcebe98cee4f4aa1e14194ac6f19e5f6af75642122b33 category: main optional: false +- name: msal_extensions + version: 1.1.0 + manager: conda + platform: osx-64 + dependencies: + libsecret: '' + msal: '>=0.4.1,<2.0' + packaging: '' + portalocker: '>=1.6,<3.0' + pygobject: '>=3,<4' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/msal_extensions-1.1.0-py39h6e9494a_1.conda + hash: + md5: 9a1c3be0f877ecbb47df44144a79e4a0 + sha256: 34df8ac13f32f482a4933baf7315445b53f904ac1a958be1289063f410b375c4 + category: main + optional: false - name: msal_extensions version: 1.1.0 manager: conda @@ -10220,6 +15621,21 @@ package: sha256: a47f46861f206043602b5f8b176e3957dd4a59876b819a2e089d63d52e312412 category: main optional: false +- name: msgpack-python + version: 1.0.7 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/msgpack-python-1.0.7-py39h6be1789_0.conda + hash: + md5: 41e836f12229ef10ceb7b54383702aeb + sha256: f00d36cf25d0059be8473255b1bfa0ddae5b52fc5cb78c2b94bcf38b2bb5d971 + category: main + optional: false - name: msgpack-python version: 1.0.7 manager: conda @@ -10249,6 +15665,19 @@ package: sha256: 9d07c952bd052b95155942d07d30d95eb0d8dfecfc9b0b40b8ba50323dc719da category: main optional: false +- name: multidict + version: 6.0.5 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py39ha30fb19_0.conda + hash: + md5: 326ed77e6a7a635f37555e85f9029697 + sha256: d01cbd410def2d8c928d7796e5a33f83731a701f5a675d0cdf6efe7added79ab + category: main + optional: false - name: multidict version: 6.0.5 manager: conda @@ -10274,6 +15703,18 @@ package: sha256: 7fcfda7b4a1d74205fcfdefd93804226a6eaffc74a319414c7d8d88f9249db3b category: main optional: false +- name: multimethod + version: 1.9.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/multimethod-1.9.1-pyhd8ed1ab_0.conda + hash: + md5: 48223af3f697ccd9b114adb6a66e0f11 + sha256: 7fcfda7b4a1d74205fcfdefd93804226a6eaffc74a319414c7d8d88f9249db3b + category: main + optional: false - name: multimethod version: 1.9.1 manager: conda @@ -10287,32 +15728,46 @@ package: category: main optional: false - name: multiprocess - version: 0.70.16 + version: 0.70.15 manager: conda platform: linux-64 dependencies: - dill: '>=0.3.8' + dill: '>=0.3.6' libgcc-ng: '>=12' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py39hd1e30aa_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py39hd1e30aa_1.conda + hash: + md5: ba981804a87d06ba9899e938c3178ed2 + sha256: 7f9c6d04b5ec3df502599ebd3e86a95194bb7358d70c23374f8b71a89040194a + category: main + optional: false +- name: multiprocess + version: 0.70.15 + manager: conda + platform: osx-64 + dependencies: + dill: '>=0.3.6' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/multiprocess-0.70.15-py39hdc70f33_1.conda hash: - md5: 9cef252eafc7a1a0ddba737290a1c4e2 - sha256: 805bc36c1aa37d80757b96cae7f12944343f1099c68813606416e35486c703d3 + md5: fb095a5ac1085f0e0bb5051818520144 + sha256: c1b42c332f6ed3aa83b5b0d3949c9288fa9895c551c6bc1ff1c54f740813c721 category: main optional: false - name: multiprocess - version: 0.70.16 + version: 0.70.15 manager: conda platform: osx-arm64 dependencies: - dill: '>=0.3.8' + dill: '>=0.3.6' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py39h17cfd9d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py39h0f82c59_1.conda hash: - md5: 785e3f2fca33cf22a899ad2f25b1f6df - sha256: 9d9d0ebe8f7ab624ff3951ef2ca9a12a46ce2fae9a17f78596322fa043f4290b + md5: 3b94f36e225c5b5fe8d37ce3577cf72c + sha256: 0675aaf60406afb644f42b714f58979feaa99892e98aca83b81b8376df7b5997 category: main optional: false - name: munkres @@ -10327,6 +15782,18 @@ package: sha256: f86fb22b58e93d04b6f25e0d811b56797689d598788b59dcb47f59045b568306 category: main optional: false +- name: munkres + version: 1.1.4 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + hash: + md5: 2ba8498c1018c1e9c61eb99b973dfe19 + sha256: f86fb22b58e93d04b6f25e0d811b56797689d598788b59dcb47f59045b568306 + category: main + optional: false - name: munkres version: 1.1.4 manager: conda @@ -10351,6 +15818,18 @@ package: sha256: f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3 category: main optional: false +- name: mypy_extensions + version: 1.0.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + hash: + md5: 4eccaeba205f0aed9ac3a9ea58568ca3 + sha256: f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3 + category: main + optional: false - name: mypy_extensions version: 1.0.0 manager: conda @@ -10363,6 +15842,68 @@ package: sha256: f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3 category: main optional: false +- name: mysql-common + version: 8.0.33 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openssl: '>=3.1.4,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_6.conda + hash: + md5: 80bf3b277c120dd294b51d404b931a75 + sha256: c8b2c5c9d0d013a4f6ef96cb4b339bfdc53a74232d8c61ed08178e5b1ec4eb63 + category: main + optional: false +- name: mysql-common + version: 8.0.33 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + openssl: '>=3.1.4,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/mysql-common-8.0.33-h1d20c9b_6.conda + hash: + md5: ad07fbd8dc7992e5e004f7bdfdee246d + sha256: b6b18aeed435d4075b4aac3559a070a6caa5a174a339e8de87785fca2f8f57a6 + category: main + optional: false +- name: mysql-libs + version: 8.0.33 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + mysql-common: 8.0.33 + openssl: '>=3.1.4,<4.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_6.conda + hash: + md5: e87530d1b12dd7f4e0f856dc07358d60 + sha256: 78c905637dac79b197395065c169d452b8ca2a39773b58e45e23114f1cb6dcdb + category: main + optional: false +- name: mysql-libs + version: 8.0.33 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + libzlib: '>=1.2.13,<1.3.0a0' + mysql-common: 8.0.33 + openssl: '>=3.1.4,<4.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/mysql-libs-8.0.33-hed35180_6.conda + hash: + md5: c27fddc4d3c2d471d1d706b243570f37 + sha256: 87d754167fddf342b894e377fdcaac096c93c941773267ad9c89bb7b64924a33 + category: main + optional: false - name: myst-nb version: 0.17.2 manager: conda @@ -10388,19 +15929,41 @@ package: - name: myst-nb version: 0.17.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + pyyaml: '' + typing_extensions: '' + ipython: '' importlib-metadata: '' ipykernel: '' - ipython: '' - jupyter-cache: '>=0.5.0,<0.7.0' - myst-parser: '>=0.18.0,<0.19.0' nbclient: '' - nbformat: '>=5.0,<6' python: '>=3.7' - pyyaml: '' + nbformat: '>=5.0,<6' sphinx: '>=4,<6' + myst-parser: '>=0.18.0,<0.19.0' + jupyter-cache: '>=0.5.0,<0.7.0' + url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-0.17.2-pyhd8ed1ab_0.conda + hash: + md5: 40190b7d06f86b63d28fa78aaa39c023 + sha256: 37bcf6de8618a0668ef6b364b14e0eceea87b202a3882c59dcd85bc1172a5402 + category: main + optional: false +- name: myst-nb + version: 0.17.2 + manager: conda + platform: osx-arm64 + dependencies: + pyyaml: '' typing_extensions: '' + ipython: '' + importlib-metadata: '' + ipykernel: '' + nbclient: '' + python: '>=3.7' + nbformat: '>=5.0,<6' + sphinx: '>=4,<6' + myst-parser: '>=0.18.0,<0.19.0' + jupyter-cache: '>=0.5.0,<0.7.0' url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-0.17.2-pyhd8ed1ab_0.conda hash: md5: 40190b7d06f86b63d28fa78aaa39c023 @@ -10429,31 +15992,66 @@ package: - name: myst-parser version: 0.18.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + pyyaml: '' + typing-extensions: '' + jinja2: '' + python: '>=3.7' + markdown-it-py: '>=1.0.0,<3.0.0' + sphinx: '>=4,<6' docutils: '>=0.15,<0.20' + mdit-py-plugins: '>=0.3.1,<1' + url: https://conda.anaconda.org/conda-forge/noarch/myst-parser-0.18.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: bcfdf5c7d8bf5c6f6be7b4c66fff2eca + sha256: 260812a430adee3598103d75704c1c855a9816a3895971ca0190d0f5e1e8165a + category: main + optional: false +- name: myst-parser + version: 0.18.1 + manager: conda + platform: osx-arm64 + dependencies: + pyyaml: '' + typing-extensions: '' jinja2: '' + python: '>=3.7' markdown-it-py: '>=1.0.0,<3.0.0' + sphinx: '>=4,<6' + docutils: '>=0.15,<0.20' mdit-py-plugins: '>=0.3.1,<1' + url: https://conda.anaconda.org/conda-forge/noarch/myst-parser-0.18.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: bcfdf5c7d8bf5c6f6be7b4c66fff2eca + sha256: 260812a430adee3598103d75704c1c855a9816a3895971ca0190d0f5e1e8165a + category: main + optional: false +- name: nbclient + version: 0.7.4 + manager: conda + platform: linux-64 + dependencies: + jupyter_client: '>=6.1.12' + jupyter_core: '>=4.12,!=5.0.*' + nbformat: '>=5.1' python: '>=3.7' - pyyaml: '' - sphinx: '>=4,<6' - typing-extensions: '' - url: https://conda.anaconda.org/conda-forge/noarch/myst-parser-0.18.1-pyhd8ed1ab_0.tar.bz2 + traitlets: '>=5.3' + url: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.4-pyhd8ed1ab_0.conda hash: - md5: bcfdf5c7d8bf5c6f6be7b4c66fff2eca - sha256: 260812a430adee3598103d75704c1c855a9816a3895971ca0190d0f5e1e8165a + md5: f7aa15f77d29b11caa1df1eb15383c59 + sha256: f26afcbbdd4bd1245db514c6ebc6ef18cc12067145dcab229b6f88653575d44c category: main optional: false - name: nbclient version: 0.7.4 manager: conda - platform: linux-64 + platform: osx-64 dependencies: + python: '>=3.7' jupyter_client: '>=6.1.12' jupyter_core: '>=4.12,!=5.0.*' nbformat: '>=5.1' - python: '>=3.7' traitlets: '>=5.3' url: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.4-pyhd8ed1ab_0.conda hash: @@ -10466,10 +16064,10 @@ package: manager: conda platform: osx-arm64 dependencies: + python: '>=3.7' jupyter_client: '>=6.1.12' jupyter_core: '>=4.12,!=5.0.*' nbformat: '>=5.1' - python: '>=3.7' traitlets: '>=5.3' url: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.4-pyhd8ed1ab_0.conda hash: @@ -10478,35 +16076,46 @@ package: category: main optional: false - name: nbconvert - version: 7.16.2 + version: 7.16.3 manager: conda platform: linux-64 dependencies: - nbconvert-core: 7.16.2 - nbconvert-pandoc: 7.16.2 - python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.2-pyhd8ed1ab_0.conda + nbconvert-core: 7.16.3 + nbconvert-pandoc: 7.16.3 + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.3-hd8ed1ab_0.conda hash: - md5: e14e35cc4a5c90694bb41c5317b576a8 - sha256: 551bbd14019a1df2f44b7e392f590674f63547bcfc7729b93bc4de46125f8565 + md5: b0c9bbbe54a11a6db3bec51eb0ef0281 + sha256: c9bb08085ba1508607cd1ba839a31f1164e3ed15f4e499a490b71721d1df7ec5 category: main optional: false - name: nbconvert - version: 7.16.2 + version: 7.16.3 + manager: conda + platform: osx-64 + dependencies: + nbconvert-core: 7.16.3 + nbconvert-pandoc: 7.16.3 + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.3-hd8ed1ab_0.conda + hash: + md5: b0c9bbbe54a11a6db3bec51eb0ef0281 + sha256: c9bb08085ba1508607cd1ba839a31f1164e3ed15f4e499a490b71721d1df7ec5 + category: main + optional: false +- name: nbconvert + version: 7.16.3 manager: conda platform: osx-arm64 dependencies: - nbconvert-core: 7.16.2 - nbconvert-pandoc: 7.16.2 - python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.2-pyhd8ed1ab_0.conda + nbconvert-core: 7.16.3 + nbconvert-pandoc: 7.16.3 + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.3-hd8ed1ab_0.conda hash: - md5: e14e35cc4a5c90694bb41c5317b576a8 - sha256: 551bbd14019a1df2f44b7e392f590674f63547bcfc7729b93bc4de46125f8565 + md5: b0c9bbbe54a11a6db3bec51eb0ef0281 + sha256: c9bb08085ba1508607cd1ba839a31f1164e3ed15f4e499a490b71721d1df7ec5 category: main optional: false - name: nbconvert-core - version: 7.16.2 + version: 7.16.3 manager: conda platform: linux-64 dependencies: @@ -10527,66 +16136,105 @@ package: python: '>=3.8' tinycss2: '' traitlets: '>=5.0' - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.3-pyhd8ed1ab_0.conda hash: - md5: 5ab3248dd05c543dc631276455ef6a54 - sha256: e1fe894114763addc98ef147a78fcd9a518bf97d268394c356b80c572c78c82f + md5: 0cab42b4917e71df9dc2224b9940ef19 + sha256: 522d28206fbafa634763da1ae9119a9edd141d8c516ed13878f77b67921e1bb5 category: main optional: false - name: nbconvert-core - version: 7.16.2 + version: 7.16.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + packaging: '' beautifulsoup4: '' - bleach: '' defusedxml: '' - entrypoints: '>=0.2.2' - jinja2: '>=3.0' - jupyter_core: '>=4.7' + bleach: '' + tinycss2: '' jupyterlab_pygments: '' + python: '>=3.8' + jinja2: '>=3.0' + entrypoints: '>=0.2.2' markupsafe: '>=2.0' - mistune: '>=2.0.3,<4' - nbclient: '>=0.5.0' - nbformat: '>=5.1' - packaging: '' + jupyter_core: '>=4.7' + traitlets: '>=5.0' pandocfilters: '>=1.4.1' + nbformat: '>=5.1' pygments: '>=2.4.1' - python: '>=3.8' + nbclient: '>=0.5.0' + mistune: '>=2.0.3,<4' + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.3-pyhd8ed1ab_0.conda + hash: + md5: 0cab42b4917e71df9dc2224b9940ef19 + sha256: 522d28206fbafa634763da1ae9119a9edd141d8c516ed13878f77b67921e1bb5 + category: main + optional: false +- name: nbconvert-core + version: 7.16.3 + manager: conda + platform: osx-arm64 + dependencies: + packaging: '' + beautifulsoup4: '' + defusedxml: '' + bleach: '' tinycss2: '' + jupyterlab_pygments: '' + python: '>=3.8' + jinja2: '>=3.0' + entrypoints: '>=0.2.2' + markupsafe: '>=2.0' + jupyter_core: '>=4.7' traitlets: '>=5.0' - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.2-pyhd8ed1ab_0.conda + pandocfilters: '>=1.4.1' + nbformat: '>=5.1' + pygments: '>=2.4.1' + nbclient: '>=0.5.0' + mistune: '>=2.0.3,<4' + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.3-pyhd8ed1ab_0.conda hash: - md5: 5ab3248dd05c543dc631276455ef6a54 - sha256: e1fe894114763addc98ef147a78fcd9a518bf97d268394c356b80c572c78c82f + md5: 0cab42b4917e71df9dc2224b9940ef19 + sha256: 522d28206fbafa634763da1ae9119a9edd141d8c516ed13878f77b67921e1bb5 category: main optional: false - name: nbconvert-pandoc - version: 7.16.2 + version: 7.16.3 manager: conda platform: linux-64 dependencies: - nbconvert-core: 7.16.2 + nbconvert-core: 7.16.3 pandoc: '' - python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.3-hd8ed1ab_0.conda + hash: + md5: 1344bbd74e8bcd1acdd8ec0824e9840c + sha256: d22ef91db4ca9592860168499b4d6e5443eca0176190431321ee78ef9cc977df + category: main + optional: false +- name: nbconvert-pandoc + version: 7.16.3 + manager: conda + platform: osx-64 + dependencies: + pandoc: '' + nbconvert-core: 7.16.3 + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.3-hd8ed1ab_0.conda hash: - md5: 7a0bfebd69213722427cb61b077b4187 - sha256: 9887eb63dd5131b9bc5a250e29d018b12ad4f3bbfb7ceb59c5923fb405cc36ce + md5: 1344bbd74e8bcd1acdd8ec0824e9840c + sha256: d22ef91db4ca9592860168499b4d6e5443eca0176190431321ee78ef9cc977df category: main optional: false - name: nbconvert-pandoc - version: 7.16.2 + version: 7.16.3 manager: conda platform: osx-arm64 dependencies: - nbconvert-core: 7.16.2 pandoc: '' - python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.2-pyhd8ed1ab_0.conda + nbconvert-core: 7.16.3 + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.3-hd8ed1ab_0.conda hash: - md5: 7a0bfebd69213722427cb61b077b4187 - sha256: 9887eb63dd5131b9bc5a250e29d018b12ad4f3bbfb7ceb59c5923fb405cc36ce + md5: 1344bbd74e8bcd1acdd8ec0824e9840c + sha256: d22ef91db4ca9592860168499b4d6e5443eca0176190431321ee78ef9cc977df category: main optional: false - name: nbformat @@ -10608,55 +16256,67 @@ package: - name: nbformat version: 5.10.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - jsonschema: '>=2.6' jupyter_core: '' - python: '>=3.8' python-fastjsonschema: '' + python: '>=3.8' traitlets: '>=5.1' + jsonschema: '>=2.6' url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda hash: md5: ca3d437c0ef2e87f63d085822c74c49a sha256: 774ba7f0f175851723d9e1524ca5246b431eca1b1e22387b58a80ad0dcd7acd8 category: main optional: false -- name: nccl - version: 2.20.5.1 +- name: nbformat + version: 5.10.3 manager: conda - platform: linux-64 + platform: osx-arm64 dependencies: - cuda-version: '>=11.8,<12.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.20.5.1-h6103f9b_0.conda + jupyter_core: '' + python-fastjsonschema: '' + python: '>=3.8' + traitlets: '>=5.1' + jsonschema: '>=2.6' + url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda hash: - md5: bedb0b33c5e3e6fbd4dce4f6f07fea72 - sha256: 0ccf2718580f5cfc173ddc6b073512de24395a316176071288ec97a97e876c22 + md5: ca3d437c0ef2e87f63d085822c74c49a + sha256: 774ba7f0f175851723d9e1524ca5246b431eca1b1e22387b58a80ad0dcd7acd8 category: main optional: false - name: ncurses - version: '6.4' + version: 6.4.20240210 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda hash: - md5: 7dbaa197d7ba6032caf7ae7f32c1efa0 - sha256: 91cc03f14caf96243cead96c76fe91ab5925a695d892e83285461fb927dece5e + md5: 97da8860a0da5413c7c98a3b3838a645 + sha256: aa0f005b6727aac6507317ed490f0904430584fa8ca722657e7f0fb94741de81 category: main optional: false - name: ncurses - version: '6.4' + version: 6.4.20240210 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda + hash: + md5: 50f28c512e9ad78589e3eab34833f762 + sha256: 50b72acf08acbc4e5332807653e2ca6b26d4326e8af16fad1fd3f2ce9ea55503 + category: main + optional: false +- name: ncurses + version: 6.4.20240210 manager: conda platform: osx-arm64 - dependencies: - __osx: '>=10.9' - url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4-h463b476_2.conda + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda hash: - md5: 52b6f254a7b9663e854f44b6570ed982 - sha256: f6890634f815e8408d08f36503353f8dfd7b055e4c3b9ea2ee52180255cf4b0a + md5: 616ae8691e6608527d0071e6766dcb81 + sha256: 06f0905791575e2cd3aa961493c56e490b3d82ad9eb49f1c332bd338b0216911 category: main optional: false - name: nest-asyncio @@ -10671,6 +16331,18 @@ package: sha256: 30db21d1f7e59b3408b831a7e0417b83b53ee6223afae56482c5f26da3ceb49a category: main optional: false +- name: nest-asyncio + version: 1.6.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda + hash: + md5: 6598c056f64dc8800d40add25e4e2c34 + sha256: 30db21d1f7e59b3408b831a7e0417b83b53ee6223afae56482c5f26da3ceb49a + category: main + optional: false - name: nest-asyncio version: 1.6.0 manager: conda @@ -10695,6 +16367,18 @@ package: sha256: 7629aa4f9f8cdff45ea7a4701fe58dccce5bf2faa01c26eb44cbb27b7e15ca9d category: main optional: false +- name: networkx + version: 3.2.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + hash: + md5: 425fce3b531bed6ec3c74fab3e5f0a1c + sha256: 7629aa4f9f8cdff45ea7a4701fe58dccce5bf2faa01c26eb44cbb27b7e15ca9d + category: main + optional: false - name: networkx version: 3.2.1 manager: conda @@ -10723,10 +16407,23 @@ package: - name: nodeenv version: 1.8.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + setuptools: '' python: 2.7|>=3.7 + url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda + hash: + md5: 2a75b296096adabbabadd5e9782e5fcc + sha256: 1320306234552717149f36f825ddc7e27ea295f24829e9db4cc6ceaff0b032bd + category: main + optional: false +- name: nodeenv + version: 1.8.0 + manager: conda + platform: osx-arm64 + dependencies: setuptools: '' + python: 2.7|>=3.7 url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda hash: md5: 2a75b296096adabbabadd5e9782e5fcc @@ -10764,14 +16461,31 @@ package: - name: notebook version: 7.1.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' + tornado: '>=6.2.0' jupyter_server: '>=2.4.0,<3' - jupyterlab: '>=4.1.1,<4.2' jupyterlab_server: '>=2.22.1,<3' notebook-shim: '>=0.2,<0.3' + jupyterlab: '>=4.1.1,<4.2' + url: https://conda.anaconda.org/conda-forge/noarch/notebook-7.1.2-pyhd8ed1ab_0.conda + hash: + md5: fa781da51f05c9211b75b5e7bcff8136 + sha256: ed5987efcf3a394c4ab12288b4fe7d858784aabc591cebf3dabcd1cdbc7b7347 + category: main + optional: false +- name: notebook + version: 7.1.2 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' tornado: '>=6.2.0' + jupyter_server: '>=2.4.0,<3' + jupyterlab_server: '>=2.22.1,<3' + notebook-shim: '>=0.2,<0.3' + jupyterlab: '>=4.1.1,<4.2' url: https://conda.anaconda.org/conda-forge/noarch/notebook-7.1.2-pyhd8ed1ab_0.conda hash: md5: fa781da51f05c9211b75b5e7bcff8136 @@ -10794,10 +16508,23 @@ package: - name: notebook-shim version: 0.2.4 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' jupyter_server: '>=1.8,<3' + url: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda + hash: + md5: 3d85618e2c97ab896b5b5e298d32b5b3 + sha256: 9b5fdef9ebe89222baa9da2796ebe7bc02ec6c5a1f61327b651d6b92cf9a0230 + category: main + optional: false +- name: notebook-shim + version: 0.2.4 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + jupyter_server: '>=1.8,<3' url: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_0.conda hash: md5: 3d85618e2c97ab896b5b5e298d32b5b3 @@ -10817,6 +16544,18 @@ package: sha256: 8fadeebb2b7369a4f3b2c039a980d419f65c7b18267ba0c62588f9f894396d0c category: main optional: false +- name: nspr + version: '4.35' + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=14.0.6' + url: https://conda.anaconda.org/conda-forge/osx-64/nspr-4.35-hea0b92c_0.conda + hash: + md5: a9e56c98d13d8b7ce72bf4357317c29b + sha256: da6e19bd0ff31e219760e647cfe1cc499a8cdfaff305f06c56d495ca062b86de + category: main + optional: false - name: nspr version: '4.35' manager: conda @@ -10846,6 +16585,21 @@ package: sha256: a9bc94d03df48014011cf6caaf447f2ef86a5edf7c70d70002ec4b59f5a4e198 category: main optional: false +- name: nss + version: '3.98' + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16' + libsqlite: '>=3.45.1,<4.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + nspr: '>=4.35,<5.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/nss-3.98-ha05da47_0.conda + hash: + md5: 79d062716d8e1f77cf806c6fe0f4405c + sha256: 3d99dd976aeb8678e4ac5fcbd574e1de50cdc57b742e22855f294c8047d5c68e + category: main + optional: false - name: nss version: '3.98' manager: conda @@ -10879,6 +16633,23 @@ package: sha256: ab8c088aa07adfed0ec39ca53541b09cdf13538d7f96086f60b784cdb7ee1ff0 category: main optional: false +- name: numpy + version: 1.23.5 + manager: conda + platform: osx-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + libcxx: '>=14.0.6' + liblapack: '>=3.9.0,<4.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.23.5-py39hdfa1d0c_0.conda + hash: + md5: 162e42439dbb526b1acb08f35546eaa4 + sha256: 069c2c0a37457a6625269a932c19d83f64857149415b9fe37012ddc17e20b09a + category: main + optional: false - name: numpy version: 1.23.5 manager: conda @@ -10914,12 +16685,27 @@ package: - name: oauthlib version: 3.2.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - blinker: '' cryptography: '' + blinker: '' + python: '>=3.6' pyjwt: '>=1.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 8f882b197fd9c4941a787926baea4868 + sha256: 0cfd5146a91d3974f4abfc2a45de890371d510a77238fe553e036ec8c031dc5b + category: main + optional: false +- name: oauthlib + version: 3.2.2 + manager: conda + platform: osx-arm64 + dependencies: + cryptography: '' + blinker: '' python: '>=3.6' + pyjwt: '>=1.0.0' url: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.2.2-pyhd8ed1ab_0.tar.bz2 hash: md5: 8f882b197fd9c4941a787926baea4868 @@ -10945,6 +16731,25 @@ package: sha256: 83370d694316b40036270969cf8c3cd3bd3340ddcdc72a79cc4208f43a402536 category: main optional: false +- name: onnx + version: 1.15.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + numpy: '>=1.22.4,<2.0a0' + protobuf: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + typing-extensions: '>=3.6.2.1' + url: https://conda.anaconda.org/conda-forge/osx-64/onnx-1.15.0-py39h3e801cf_0.conda + hash: + md5: b6003760e84a6fd1ad3bd66439f839d5 + sha256: 046ef793b29d2d142c1c4b745939c8fdf0fe97939cc11a317859344340d8f3c8 + category: main + optional: false - name: onnx version: 1.15.0 manager: conda @@ -10983,12 +16788,28 @@ package: - name: onnxconverter-common version: 1.13.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: numpy: '' + packaging: '' + protobuf: '' onnx: '' + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/onnxconverter-common-1.13.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: a1749e40ac6377dc5b3cde8fe683f5c9 + sha256: 8320927bbbae5f9dd4ba2abb2c046f9629111ac49ef539f537876a57af54d2ed + category: main + optional: false +- name: onnxconverter-common + version: 1.13.0 + manager: conda + platform: osx-arm64 + dependencies: + numpy: '' packaging: '' protobuf: '' + onnx: '' python: '>=3.6' url: https://conda.anaconda.org/conda-forge/noarch/onnxconverter-common-1.13.0-pyhd8ed1ab_0.tar.bz2 hash: @@ -10997,7 +16818,7 @@ package: category: main optional: false - name: openai - version: 1.14.0 + version: 1.14.3 manager: conda platform: linux-64 dependencies: @@ -11009,29 +16830,48 @@ package: sniffio: '' tqdm: '>4' typing-extensions: '>=4.7,<5' - url: https://conda.anaconda.org/conda-forge/noarch/openai-1.14.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/openai-1.14.3-pyhd8ed1ab_0.conda hash: - md5: dbcb7019fbb2d03eee4b4435425097b4 - sha256: fe302835e25244e987633e2cf8c6e7f38f9d649abdf685e8c5cf6f7a73f0d2a2 + md5: 0c216c2228d136632cc7e19097f7aaac + sha256: 5d919b945556b42ad2d86e0a585ed95353baf1571ab5c95e97f86fe1fa80e138 category: main optional: false - name: openai - version: 1.14.0 + version: 1.14.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - anyio: '>=3.5.0,<5' + sniffio: '' + python: '>=3.7.1' distro: '>=1.7.0,<2' httpx: '>=0.23.0,<1' pydantic: '>=1.9.0,<3' - python: '>=3.7.1' + tqdm: '>4' + anyio: '>=3.5.0,<5' + typing-extensions: '>=4.7,<5' + url: https://conda.anaconda.org/conda-forge/noarch/openai-1.14.3-pyhd8ed1ab_0.conda + hash: + md5: 0c216c2228d136632cc7e19097f7aaac + sha256: 5d919b945556b42ad2d86e0a585ed95353baf1571ab5c95e97f86fe1fa80e138 + category: main + optional: false +- name: openai + version: 1.14.3 + manager: conda + platform: osx-arm64 + dependencies: sniffio: '' + python: '>=3.7.1' + distro: '>=1.7.0,<2' + httpx: '>=0.23.0,<1' + pydantic: '>=1.9.0,<3' tqdm: '>4' + anyio: '>=3.5.0,<5' typing-extensions: '>=4.7,<5' - url: https://conda.anaconda.org/conda-forge/noarch/openai-1.14.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/openai-1.14.3-pyhd8ed1ab_0.conda hash: - md5: dbcb7019fbb2d03eee4b4435425097b4 - sha256: fe302835e25244e987633e2cf8c6e7f38f9d649abdf685e8c5cf6f7a73f0d2a2 + md5: 0c216c2228d136632cc7e19097f7aaac + sha256: 5d919b945556b42ad2d86e0a585ed95353baf1571ab5c95e97f86fe1fa80e138 category: main optional: false - name: openjpeg @@ -11050,6 +16890,21 @@ package: sha256: 5600a0b82df042bd27d01e4e687187411561dfc11cc05143a08ce29b64bf2af2 category: main optional: false +- name: openjpeg + version: 2.5.2 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16' + libpng: '>=1.6.43,<1.7.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda + hash: + md5: 05a14cc9d725dd74995927968d6547e3 + sha256: dc9c405119b9b54f8ca5984da27ba498bd848ab4f0f580da6f293009ca5adc13 + category: main + optional: false - name: openjpeg version: 2.5.2 manager: conda @@ -11072,10 +16927,22 @@ package: dependencies: ca-certificates: '' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda + hash: + md5: 9d731343cff6ee2e5a25c4a091bf8e2a + sha256: 2c689444ed19a603be457284cf2115ee728a3fafb7527326e96054dee7cdc1a7 + category: main + optional: false +- name: openssl + version: 3.2.1 + manager: conda + platform: osx-64 + dependencies: + ca-certificates: '' + url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.1-hd75f5a5_1.conda hash: - md5: 51a753e64a3027bd7e23a189b1f6e91e - sha256: c02c12bdb898daacf7eb3d09859f93ea8f285fd1a6132ff6ff0493ab52c7fe57 + md5: 570a6f04802df580be529f3a72d2bbf7 + sha256: 7ae0ac6a1673584a8a380c2ff3d46eca48ed53bc7174c0d4eaa0dd2f247a0984 category: main optional: false - name: openssl @@ -11084,10 +16951,10 @@ package: platform: osx-arm64 dependencies: ca-certificates: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda hash: - md5: 421cc6e8715447b73c2c57dcf78cb9d2 - sha256: 13663fcd4abc8681b31ccbad39800fee2127cb6159b51a989ed48a816af36cf5 + md5: eb580fb888d93d5d550c557323ac5cee + sha256: 519dc941d7ab0ebf31a2878d85c2f444450e7c5f6f41c4d07252c6bb3417b78b category: main optional: false - name: opt_einsum @@ -11103,6 +16970,19 @@ package: sha256: 1995657f10e23dbe534219f754c66b7fb2a805d68a3385abdacb7807a915b0c3 category: main optional: false +- name: opt_einsum + version: 3.3.0 + manager: conda + platform: osx-64 + dependencies: + numpy: '' + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.3.0-pyhc1e730c_2.conda + hash: + md5: 7a94ac68b892daa9f17ae8a52b31ed81 + sha256: 1995657f10e23dbe534219f754c66b7fb2a805d68a3385abdacb7807a915b0c3 + category: main + optional: false - name: opt_einsum version: 3.3.0 manager: conda @@ -11134,6 +17014,24 @@ package: sha256: a06dd76bc0f2f99f5db5e348298c906007c3aa9e31b963f71d16e63f770b900b category: main optional: false +- name: orc + version: 1.9.2 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + snappy: '>=1.1.10,<2.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/orc-1.9.2-h9ab30d4_0.conda + hash: + md5: 8fb76f7b135aec885cfe47c52b2eb4b5 + sha256: a948db80c0b756db07abce1972d6b8d1a08a7ced5a687b02435348c81443de08 + category: main + optional: false - name: orc version: 1.9.2 manager: conda @@ -11168,10 +17066,23 @@ package: - name: overrides version: 7.7.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + typing_utils: '' python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda + hash: + md5: 24fba5a9d161ad8103d4e84c0e1a3ed4 + sha256: 5e238e5e646414d517a13f6786c7227206ace58271e3ef63f6adca4d6a4c2839 + category: main + optional: false +- name: overrides + version: 7.7.0 + manager: conda + platform: osx-arm64 + dependencies: typing_utils: '' + python: '>=3.6' url: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_0.conda hash: md5: 24fba5a9d161ad8103d4e84c0e1a3ed4 @@ -11190,6 +17101,18 @@ package: sha256: 69b3ace6cca2dab9047b2c24926077d81d236bef45329d264b394001e3c3e52f category: main optional: false +- name: packaging + version: '23.2' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda + hash: + md5: 79002079284aa895f883c6b7f3f88fd6 + sha256: 69b3ace6cca2dab9047b2c24926077d81d236bef45329d264b394001e3c3e52f + category: main + optional: false - name: packaging version: '23.2' manager: conda @@ -11221,6 +17144,24 @@ package: sha256: 91a2f8062d905f65548a5f3e9cf91e4acd70ac151d9e9fcbb32af9980643c1d7 category: main optional: false +- name: pandas + version: 2.2.1 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.9,<3.10.0a0' + python-dateutil: '>=2.8.1' + python-tzdata: '>=2022a' + python_abi: 3.9.* + pytz: '>=2020.1' + url: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.1-py39haf03413_0.conda + hash: + md5: d29dc35b665029951dae988810f84508 + sha256: f6651dbf55da899a4e2590c910bee764b6f3ead78eb5e35e104ccaeb884f9fc7 + category: main + optional: false - name: pandas version: 2.2.1 manager: conda @@ -11251,6 +17192,18 @@ package: sha256: 80daf30527d62c5694a89ae551be4aff40d7a82c9d25b73ea6b6e24309a5a50d category: main optional: false +- name: pandera + version: 0.18.3 + manager: conda + platform: osx-64 + dependencies: + pandera-base: '>=0.18.3,<0.18.4.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/pandera-0.18.3-hd8ed1ab_0.conda + hash: + md5: a8e2857c67ded4b6d0ab6fabbb9ec065 + sha256: 80daf30527d62c5694a89ae551be4aff40d7a82c9d25b73ea6b6e24309a5a50d + category: main + optional: false - name: pandera version: 0.18.3 manager: conda @@ -11286,17 +17239,37 @@ package: - name: pandera-base version: 0.18.3 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - multimethod: <=1.10.0 - numpy: '>=1.19.0' + pydantic: '' + wrapt: '' + python: '>=3.8' packaging: '>=20.0' + numpy: '>=1.19.0' pandas: '>=1.2.0' + typing_inspect: '>=0.6.0' + typeguard: '>=3.0.2' + multimethod: <=1.10.0 + url: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.18.3-pyhd8ed1ab_0.conda + hash: + md5: e96ee36cbebac49688a927b3b74c38ed + sha256: 00b0994260df53f85077e478ba6dbdbc227f62c4e077ec6a7906722e91df223f + category: main + optional: false +- name: pandera-base + version: 0.18.3 + manager: conda + platform: osx-arm64 + dependencies: pydantic: '' + wrapt: '' python: '>=3.8' - typeguard: '>=3.0.2' + packaging: '>=20.0' + numpy: '>=1.19.0' + pandas: '>=1.2.0' typing_inspect: '>=0.6.0' - wrapt: '' + typeguard: '>=3.0.2' + multimethod: <=1.10.0 url: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.18.3-pyhd8ed1ab_0.conda hash: md5: e96ee36cbebac49688a927b3b74c38ed @@ -11314,6 +17287,17 @@ package: sha256: 26bfcda675fbddd059a8861dc75b9e497980ec6c679ec2a27e7d74042c4b295b category: main optional: false +- name: pandoc + version: 3.1.12.3 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.1.12.3-h694c41f_0.conda + hash: + md5: dbd54d0b1e33c2c2713ca41fb32c51f6 + sha256: a1b36cfe362fd70ebb2ce7afa0ba6e5ccadfbb6a805bc0132f1642f151af080e + category: main + optional: false - name: pandoc version: 3.1.12.3 manager: conda @@ -11337,6 +17321,18 @@ package: sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f category: main optional: false +- name: pandocfilters + version: 1.5.0 + manager: conda + platform: osx-64 + dependencies: + python: '!=3.0,!=3.1,!=3.2,!=3.3' + url: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 457c2c8c08e54905d6954e79cb5b5db9 + sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f + category: main + optional: false - name: pandocfilters version: 1.5.0 manager: conda @@ -11369,6 +17365,25 @@ package: sha256: 53d3442fb39eb9f0ac36646769469f2f825afaeda984719002460efd7c3d354f category: main optional: false +- name: pango + version: 1.52.1 + manager: conda + platform: osx-64 + dependencies: + cairo: '>=1.18.0,<2.0a0' + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freetype: '>=2.12.1,<3.0a0' + fribidi: '>=1.0.10,<2.0a0' + harfbuzz: '>=8.3.0,<9.0a0' + libglib: '>=2.78.4,<3.0a0' + libpng: '>=1.6.43,<1.7.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/pango-1.52.1-h7f2093b_0.conda + hash: + md5: 5525033b1743273720d851e430b3eaed + sha256: 93ccddbcd2845bdbb5bc65ef3c7039170f1ccb4a1c21fa062986b82665ec513b + category: main + optional: false - name: pango version: 1.52.1 manager: conda @@ -11413,19 +17428,41 @@ package: - name: papermill version: 2.5.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - ansiwrap: '' - black: '' + requests: '' + pyyaml: '' click: '' + black: '' entrypoints: '' - nbclient: '>=0.2.0' - nbformat: '>=5.1.2' + tenacity: '' + ansiwrap: '' python: '>=3.7' - pyyaml: '' + nbformat: '>=5.1.2' + tqdm: '>=4.32.2' + nbclient: '>=0.2.0' + url: https://conda.anaconda.org/conda-forge/noarch/papermill-2.5.0-pyhd8ed1ab_0.conda + hash: + md5: e6e69b90afd3d0597da8f1f74cc4bd58 + sha256: c9896ec2358bf9da079ce34b986d8843ecf75f840d2d719f430b665cfa674a59 + category: main + optional: false +- name: papermill + version: 2.5.0 + manager: conda + platform: osx-arm64 + dependencies: requests: '' + pyyaml: '' + click: '' + black: '' + entrypoints: '' tenacity: '' + ansiwrap: '' + python: '>=3.7' + nbformat: '>=5.1.2' tqdm: '>=4.32.2' + nbclient: '>=0.2.0' url: https://conda.anaconda.org/conda-forge/noarch/papermill-2.5.0-pyhd8ed1ab_0.conda hash: md5: e6e69b90afd3d0597da8f1f74cc4bd58 @@ -11450,12 +17487,27 @@ package: - name: paramiko version: 3.4.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - bcrypt: '>=3.2' + python: '>=3.6' cryptography: '>=3.3' + bcrypt: '>=3.2' pynacl: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/paramiko-3.4.0-pyhd8ed1ab_0.conda + hash: + md5: a5e792523b028b06d7ce6e65a6cd4a33 + sha256: 2e66359261954a79b66858c30e69ea6dd4380bf8bd733940527386b25e31dd13 + category: main + optional: false +- name: paramiko + version: 3.4.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' + cryptography: '>=3.3' + bcrypt: '>=3.2' + pynacl: '>=1.5' url: https://conda.anaconda.org/conda-forge/noarch/paramiko-3.4.0-pyhd8ed1ab_0.conda hash: md5: a5e792523b028b06d7ce6e65a6cd4a33 @@ -11474,6 +17526,18 @@ package: sha256: 4e26d5daf5de0e31aa5e74ac56386a361b202433b83f024fdadbf07d4a244da4 category: main optional: false +- name: parso + version: 0.8.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 17a565a0c3899244e938cdf417e7b094 + sha256: 4e26d5daf5de0e31aa5e74ac56386a361b202433b83f024fdadbf07d4a244da4 + category: main + optional: false - name: parso version: 0.8.3 manager: conda @@ -11482,18 +17546,32 @@ package: python: '>=3.6' url: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2 hash: - md5: 17a565a0c3899244e938cdf417e7b094 - sha256: 4e26d5daf5de0e31aa5e74ac56386a361b202433b83f024fdadbf07d4a244da4 + md5: 17a565a0c3899244e938cdf417e7b094 + sha256: 4e26d5daf5de0e31aa5e74ac56386a361b202433b83f024fdadbf07d4a244da4 + category: main + optional: false +- name: partd + version: 1.4.1 + manager: conda + platform: linux-64 + dependencies: + locket: '' + python: '>=3.7' + toolz: '' + url: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda + hash: + md5: acf4b7c0bcd5fa3b0e05801c4d2accd6 + sha256: b248238da2bb9dfe98e680af911dc7013af86095e3ec8baf08905555632d34c7 category: main optional: false - name: partd version: 1.4.1 manager: conda - platform: linux-64 + platform: osx-64 dependencies: + toolz: '' locket: '' python: '>=3.7' - toolz: '' url: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda hash: md5: acf4b7c0bcd5fa3b0e05801c4d2accd6 @@ -11505,9 +17583,9 @@ package: manager: conda platform: osx-arm64 dependencies: + toolz: '' locket: '' python: '>=3.7' - toolz: '' url: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda hash: md5: acf4b7c0bcd5fa3b0e05801c4d2accd6 @@ -11526,6 +17604,18 @@ package: sha256: 4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d category: main optional: false +- name: pathspec + version: 0.12.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + hash: + md5: 17064acba08d3686f1135b5ec1b32b12 + sha256: 4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d + category: main + optional: false - name: pathspec version: 0.12.1 manager: conda @@ -11551,6 +17641,18 @@ package: sha256: 8f35c244b1631a4f31fb1d66ab6e1d9bfac0ca9b679deced1112c7225b3ad138 category: main optional: false +- name: pcre + version: '8.45' + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=11.1.0' + url: https://conda.anaconda.org/conda-forge/osx-64/pcre-8.45-he49afe7_0.tar.bz2 + hash: + md5: 0526850419e04ac003bc0b65a78dc4cc + sha256: 8002279cf4084fbf219f137c2bdef2825d076a5a57a14d1d922d7c5fa7872a5c + category: main + optional: false - name: pcre version: '8.45' manager: conda @@ -11577,6 +17679,19 @@ package: sha256: 3ca54ff0abcda964af7d4724d389ae20d931159ae1881cfe57ad4b0ab9e6a380 category: main optional: false +- name: pcre2 + version: '10.42' + manager: conda + platform: osx-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.42-h0ad2156_0.conda + hash: + md5: 41de8bab2d5e5cd6daaba1896e81d366 + sha256: 689559d94b64914e503d2ced53b78afc19562ed1ccfb284040797a6d41bb564c + category: main + optional: false - name: pcre2 version: '10.42' manager: conda @@ -11606,10 +17721,23 @@ package: - name: pexpect version: 4.9.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' ptyprocess: '>=0.5' + url: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + hash: + md5: 629f3203c99b32e0988910c93e77f3b6 + sha256: 90a09d134a4a43911b716d4d6eb9d169238aff2349056f7323d9db613812667e + category: main + optional: false +- name: pexpect + version: 4.9.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + ptyprocess: '>=0.5' url: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda hash: md5: 629f3203c99b32e0988910c93e77f3b6 @@ -11621,11 +17749,25 @@ package: manager: conda platform: linux-64 dependencies: - python: '>=3' - url: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/linux-64/pickleshare-0.7.5-py39hde42818_1002.tar.bz2 hash: - md5: 415f0ebb6198cc2801c73438a9fb5761 - sha256: a1ed1a094dd0d1b94a09ed85c283a0eb28943f2e6f22161fb45e128d35229738 + md5: 2dc9995512c80256532250a6fd616b14 + sha256: f3864a023507cda727997bcdf17baf404c98342a4dea6eb834b5e1fc9bdc388b + category: main + optional: false +- name: pickleshare + version: 0.7.5 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/pickleshare-0.7.5-py39hde42818_1002.tar.bz2 + hash: + md5: ea16ea8f9953518f231b76ca97acea9a + sha256: eb2f1ef2bed9ed433e5992c4b875ed3894acddf79b40ee29af768e902348cca7 category: main optional: false - name: pickleshare @@ -11663,6 +17805,28 @@ package: sha256: 6936d54f9830ac66bee7b26187eb2297d80febe110e978cd9ae6a54e62ec6aaf category: main optional: false +- name: pillow + version: 10.2.0 + manager: conda + platform: osx-64 + dependencies: + freetype: '>=2.12.1,<3.0a0' + lcms2: '>=2.16,<3.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + libwebp-base: '>=1.3.2,<2.0a0' + libxcb: '>=1.15,<1.16.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openjpeg: '>=2.5.0,<3.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + tk: '>=8.6.13,<8.7.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.2.0-py39hdd30358_0.conda + hash: + md5: 38aef4e0b3355d32485cd4a199296a5b + sha256: 70d5e8c36b1ac538d212816474594cf87aaa0c2e8f98308e952357df1b6b1c4f + category: main + optional: false - name: pillow version: 10.2.0 manager: conda @@ -11702,11 +17866,25 @@ package: - name: pip version: '24.0' manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + setuptools: '' + wheel: '' python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + hash: + md5: f586ac1e56c8638b64f9c8122a7b8a67 + sha256: b7c1c5d8f13e8cb491c4bd1d0d1896a4cf80fc47de01059ad77509112b664a4a + category: main + optional: false +- name: pip + version: '24.0' + manager: conda + platform: osx-arm64 + dependencies: setuptools: '' wheel: '' + python: '>=3.7' url: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda hash: md5: f586ac1e56c8638b64f9c8122a7b8a67 @@ -11726,6 +17904,18 @@ package: sha256: 366d28e2a0a191d6c535e234741e0cd1d94d713f76073d8af4a5ccb2a266121e category: main optional: false +- name: pixman + version: 0.43.4 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.43.4-h73e2aa4_0.conda + hash: + md5: cb134c1e03fd32f4e6bea3f6de2614fd + sha256: 3ab44e12e566c67a6e9fd831f557ab195456aa996b8dd9af19787ca80caa5cd1 + category: main + optional: false - name: pixman version: 0.43.4 manager: conda @@ -11750,6 +17940,18 @@ package: sha256: fecf95377134b0e8944762d92ecf7b0149c07d8186fb5db583125a2705c7ea0a category: main optional: false +- name: pkgutil-resolve-name + version: 1.3.10 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + hash: + md5: 405678b942f2481cecdb3e010f4925d9 + sha256: fecf95377134b0e8944762d92ecf7b0149c07d8186fb5db583125a2705c7ea0a + category: main + optional: false - name: pkgutil-resolve-name version: 1.3.10 manager: conda @@ -11775,6 +17977,19 @@ package: sha256: b3d809ff5a18ee8514bba8bc05a23b4cdf1758090a18a2cf742af38aed405144 category: main optional: false +- name: platformdirs + version: 3.11.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + typing-extensions: '>=4.6.3' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda + hash: + md5: 8f567c0a74aa44cf732f15773b4083b0 + sha256: b3d809ff5a18ee8514bba8bc05a23b4cdf1758090a18a2cf742af38aed405144 + category: main + optional: false - name: platformdirs version: 3.11.0 manager: conda @@ -11802,6 +18017,20 @@ package: sha256: fa9ae81e1f304f1480378ea25d559748e061c5b8d55b3ade433c3bc483dbae9e category: main optional: false +- name: plotly + version: 5.19.0 + manager: conda + platform: osx-64 + dependencies: + packaging: '' + python: '>=3.6' + tenacity: '>=6.2.0' + url: https://conda.anaconda.org/conda-forge/noarch/plotly-5.19.0-pyhd8ed1ab_0.conda + hash: + md5: 669cd7065794633b9e64e6a9612ec700 + sha256: fa9ae81e1f304f1480378ea25d559748e061c5b8d55b3ade433c3bc483dbae9e + category: main + optional: false - name: plotly version: 5.19.0 manager: conda @@ -11816,8 +18045,32 @@ package: sha256: fa9ae81e1f304f1480378ea25d559748e061c5b8d55b3ade433c3bc483dbae9e category: main optional: false +- name: ply + version: '3.11' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 + hash: + md5: 7205635cd71531943440fbfe3b6b5727 + sha256: 2cd6fae8f9cbc806b7f828f006ae4a83c23fac917cacfd73c37ce322d4324e53 + category: main + optional: false +- name: ply + version: '3.11' + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 + hash: + md5: 7205635cd71531943440fbfe3b6b5727 + sha256: 2cd6fae8f9cbc806b7f828f006ae4a83c23fac917cacfd73c37ce322d4324e53 + category: main + optional: false - name: polars - version: 0.20.15 + version: 0.20.17 manager: conda platform: linux-64 dependencies: @@ -11826,14 +18079,29 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* typing_extensions: '>=4.0.0' - url: https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.15-py39h87fa3cb_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.17-py39h87fa3cb_0.conda + hash: + md5: 6a2ac5515e8f4b5aff4e41e60c514532 + sha256: afc4aac478c7b60c1214a58e4175cd2299330e70512de3c28af18b713d101e68 + category: main + optional: false +- name: polars + version: 0.20.17 + manager: conda + platform: osx-64 + dependencies: + numpy: '>=1.16.0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + typing_extensions: '>=4.0.0' + url: https://conda.anaconda.org/conda-forge/osx-64/polars-0.20.17-py39hcc1e243_0.conda hash: - md5: fd5fb1c8bf319ea2edc3feede63f88e1 - sha256: 97dbca690a6805c4483115dfb57b998da3506b42c6cb9669eb9fa73f7e39788e + md5: 2cadbd83308ee0e78b62e4707b880309 + sha256: 3a2f9581d7ba400c003cf6b73cd3f14c2b37f8f09c2a30d413129127145a204f category: main optional: false - name: polars - version: 0.20.15 + version: 0.20.17 manager: conda platform: osx-arm64 dependencies: @@ -11841,10 +18109,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* typing_extensions: '>=4.0.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/polars-0.20.15-py39h08ca3d8_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/polars-0.20.17-py39h08ca3d8_0.conda hash: - md5: bc4b06d948d57003cd5f482e77856ca0 - sha256: 34e841ad27b077f7cf93e6da1be05e2519da1eec12b7791f729503122f206cb4 + md5: c544345111324210efaed43f9f5bb266 + sha256: cdbe8f41dda3e5a8cac19a2a11295f7ee24cb30ffc7bf05e18a53c2b5162ceee category: main optional: false - name: poppler @@ -11876,6 +18144,35 @@ package: sha256: 55bb2deb67c76bd9f5592bf9765cc879cf11e555c4f8879292cbd5544e88887e category: main optional: false +- name: poppler + version: 24.02.0 + manager: conda + platform: osx-64 + dependencies: + cairo: '>=1.18.0,<2.0a0' + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freetype: '>=2.12.1,<3.0a0' + gettext: '>=0.21.1,<1.0a0' + lcms2: '>=2.16,<3.0a0' + libcurl: '>=8.5.0,<9.0a0' + libcxx: '>=16' + libglib: '>=2.78.3,<3.0a0' + libiconv: '>=1.17,<2.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libpng: '>=1.6.42,<1.7.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + nspr: '>=4.35,<5.0a0' + nss: '>=3.97,<4.0a0' + openjpeg: '>=2.5.0,<3.0a0' + poppler-data: '' + url: https://conda.anaconda.org/conda-forge/osx-64/poppler-24.02.0-h0c752f9_0.conda + hash: + md5: 064e1d83d148b0ff5fa9ddd21141d0b1 + sha256: 54400c2961eca96f14ecbb9ccdac457ef7f86ee6741e38aa71db47eee22b76b6 + category: main + optional: false - name: poppler version: 24.02.0 manager: conda @@ -11916,6 +18213,17 @@ package: sha256: 2f227e17b3c0346112815faa605502b66c1c4511a856127f2899abf15a98a2cf category: main optional: false +- name: poppler-data + version: 0.4.12 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda + hash: + md5: d8d7293c5b37f39b2ac32940621c6592 + sha256: 2f227e17b3c0346112815faa605502b66c1c4511a856127f2899abf15a98a2cf + category: main + optional: false - name: poppler-data version: 0.4.12 manager: conda @@ -11940,6 +18248,19 @@ package: sha256: 7b78075d514c602946a36df7604630c058b80a7378f7d0e29e4a082031fde19b category: main optional: false +- name: portalocker + version: 2.8.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/portalocker-2.8.2-py39h6e9494a_1.conda + hash: + md5: f13186cc46a4593ffce2f29e4f0fbebf + sha256: 6f3611666a1beeda9c0d1e5a652e2879dcf7c7e6416dbbae03c62f5ecf79b7ac + category: main + optional: false - name: portalocker version: 2.8.2 manager: conda @@ -11961,16 +18282,35 @@ package: krb5: '>=1.21.2,<1.22.0a0' libgcc-ng: '>=12' libpq: '16.2' - libxml2: '>=2.12.5,<3.0a0' + libxml2: '>=2.12.6,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.1,<4.0a0' + readline: '>=8.2,<9.0a0' + tzcode: '' + tzdata: '' + url: https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.2-h82ecc9d_1.conda + hash: + md5: 7a5806219d0f77ce8393375d040df065 + sha256: 7fc52e69478973f173f055ade6c4087564362be9172c294b493a79671fef9a7e + category: main + optional: false +- name: postgresql + version: '16.2' + manager: conda + platform: osx-64 + dependencies: + krb5: '>=1.21.2,<1.22.0a0' + libpq: '16.2' + libxml2: '>=2.12.6,<3.0a0' libzlib: '>=1.2.13,<1.3.0a0' openssl: '>=3.2.1,<4.0a0' readline: '>=8.2,<9.0a0' tzcode: '' tzdata: '' - url: https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.2-h7387d8b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/postgresql-16.2-h06f2bd8_1.conda hash: - md5: 4e86738066b4966f0357f661b3691cae - sha256: 5b4fcfbd51957bb51fb1d2d28c3e9d8f4a50be0ac1be9c40083b1e9a39df7f3d + md5: fe36c4a9254176dde4ca696016c50aa8 + sha256: 2a96af8385c51e97950ed00d802186069bf4933b3be111956508ab6be158d463 category: main optional: false - name: postgresql @@ -11980,20 +18320,20 @@ package: dependencies: krb5: '>=1.21.2,<1.22.0a0' libpq: '16.2' - libxml2: '>=2.12.5,<3.0a0' + libxml2: '>=2.12.6,<3.0a0' libzlib: '>=1.2.13,<1.3.0a0' openssl: '>=3.2.1,<4.0a0' readline: '>=8.2,<9.0a0' tzcode: '' tzdata: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/postgresql-16.2-h1d0603d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/postgresql-16.2-hf829917_1.conda hash: - md5: 29f3fd38f23da95692ab11af12fdb6da - sha256: 01b5bb78c909778fefca380bb808044850adba2972cd92f8fe6ead122a34fc45 + md5: a80492a97dc9c6f05b4181b8ab4dfb14 + sha256: cfc337097f145a3e527c45b2ab40663421480acc225c3eb997459a80e5e1f9ae category: main optional: false - name: pre-commit - version: 3.6.2 + version: 3.7.0 manager: conda platform: linux-64 dependencies: @@ -12003,33 +18343,63 @@ package: python: '>=3.9' pyyaml: '>=5.1' virtualenv: '>=20.10.0' - url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.2-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda hash: - md5: 61534ee57ffdf26d7b1b514d33daccc4 - sha256: 8eb9f5965c37d2bbee9302e16cc7c5517ee06491986356112be13431a043681e + md5: 846ba0877cda9c4f11e13720cacd1968 + sha256: b7a1d56fb1374df77019521bbcbe109ff17337181c4d392918e5ec1a10a9df87 category: main optional: false - name: pre-commit - version: 3.6.2 + version: 3.7.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - cfgv: '>=2.0.0' + python: '>=3.9' + pyyaml: '>=5.1' identify: '>=1.0.0' nodeenv: '>=0.11.1' + cfgv: '>=2.0.0' + virtualenv: '>=20.10.0' + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda + hash: + md5: 846ba0877cda9c4f11e13720cacd1968 + sha256: b7a1d56fb1374df77019521bbcbe109ff17337181c4d392918e5ec1a10a9df87 + category: main + optional: false +- name: pre-commit + version: 3.7.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.9' pyyaml: '>=5.1' + identify: '>=1.0.0' + nodeenv: '>=0.11.1' + cfgv: '>=2.0.0' virtualenv: '>=20.10.0' - url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.2-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda + hash: + md5: 846ba0877cda9c4f11e13720cacd1968 + sha256: b7a1d56fb1374df77019521bbcbe109ff17337181c4d392918e5ec1a10a9df87 + category: main + optional: false +- name: progressbar2 + version: 4.4.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + python-utils: '>=3.8.1' + url: https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.4.2-pyhd8ed1ab_0.conda hash: - md5: 61534ee57ffdf26d7b1b514d33daccc4 - sha256: 8eb9f5965c37d2bbee9302e16cc7c5517ee06491986356112be13431a043681e + md5: aca82be28a1c676a3e0365e83892f412 + sha256: 3661ceb2d69fa43cfba498486aee45e7f69e3a83c27430ca8aa21b27e5686d09 category: main optional: false - name: progressbar2 version: 4.4.2 manager: conda - platform: linux-64 + platform: osx-64 dependencies: python: '>=3.8' python-utils: '>=3.8.1' @@ -12069,6 +18439,23 @@ package: sha256: 234f8f7b255dc9036812ec30d097c0725047f3fc7e8e0bc7944e4e17d242ab99 category: main optional: false +- name: proj + version: 9.3.1 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcurl: '>=8.4.0,<9.0a0' + libcxx: '>=16.0.6' + libsqlite: '>=3.44.2,<4.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + sqlite: '' + url: https://conda.anaconda.org/conda-forge/osx-64/proj-9.3.1-h81faed2_0.conda + hash: + md5: 3940ef505861767d26659645f9ec0460 + sha256: 51bc021e25c88a12151d6ab4d3e956e72ea21d2684315f6ea99ee699aaefc1ea + category: main + optional: false - name: proj version: 9.3.1 manager: conda @@ -12098,6 +18485,18 @@ package: sha256: 757cd91d01c2e0b64fadf6bc9a11f558cf7638d897dfbaf7415ddf324d5405c9 category: main optional: false +- name: prometheus_client + version: 0.20.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.20.0-pyhd8ed1ab_0.conda + hash: + md5: 9a19b94034dd3abb2b348c8b93388035 + sha256: 757cd91d01c2e0b64fadf6bc9a11f558cf7638d897dfbaf7415ddf324d5405c9 + category: main + optional: false - name: prometheus_client version: 0.20.0 manager: conda @@ -12124,6 +18523,20 @@ package: sha256: 6601b7520b3c18d07d2ef8086377c1af8ef85fcbd9122d786a69494585b31235 category: main optional: false +- name: prometheus_flask_exporter + version: 0.23.0 + manager: conda + platform: osx-64 + dependencies: + flask: '' + prometheus_client: '' + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/prometheus_flask_exporter-0.23.0-pyhd8ed1ab_0.conda + hash: + md5: bff3dd780880d653865a542dc13741ed + sha256: 6601b7520b3c18d07d2ef8086377c1af8ef85fcbd9122d786a69494585b31235 + category: main + optional: false - name: prometheus_flask_exporter version: 0.23.0 manager: conda @@ -12154,10 +18567,23 @@ package: - name: prompt-toolkit version: 3.0.42 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + wcwidth: '' python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.42-pyha770c72_0.conda + hash: + md5: 0bf64bf10eee21f46ac83c161917fa86 + sha256: 58525b2a9305fb154b2b0d43a48b9a6495441b80e4fbea44f2a34a597d2cef16 + category: main + optional: false +- name: prompt-toolkit + version: 3.0.42 + manager: conda + platform: osx-arm64 + dependencies: wcwidth: '' + python: '>=3.7' url: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.42-pyha770c72_0.conda hash: md5: 0bf64bf10eee21f46ac83c161917fa86 @@ -12176,6 +18602,18 @@ package: sha256: fd2185d501bf34cb4c121f2f5ade9157ac75e1644a9da81355c4c8f9c1b82d4d category: main optional: false +- name: prompt_toolkit + version: 3.0.42 + manager: conda + platform: osx-64 + dependencies: + prompt-toolkit: '>=3.0.42,<3.0.43.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.42-hd8ed1ab_0.conda + hash: + md5: 85a2189ecd2fcdd86e92b2d4ea8fe461 + sha256: fd2185d501bf34cb4c121f2f5ade9157ac75e1644a9da81355c4c8f9c1b82d4d + category: main + optional: false - name: prompt_toolkit version: 3.0.42 manager: conda @@ -12204,10 +18642,23 @@ package: - name: proto-plus version: 1.23.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.6' protobuf: '>=3.19.0,<5.0.0dev' + url: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.23.0-pyhd8ed1ab_0.conda + hash: + md5: 26c043ffe1c027eaed894d70ea04a18d + sha256: 2c9ca8233672032fb372792b1e4c2a556205e631dc375c2c606eab478f32349d + category: main + optional: false +- name: proto-plus + version: 1.23.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' + protobuf: '>=3.19.0,<5.0.0dev' url: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.23.0-pyhd8ed1ab_0.conda hash: md5: 26c043ffe1c027eaed894d70ea04a18d @@ -12232,6 +18683,24 @@ package: sha256: 191a019f70fa8819842a93e6e1d4a371c3e3926740a47c51a6b840d95a61f601 category: main optional: false +- name: protobuf + version: 4.24.4 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libabseil: '>=20230802.1,<20230803.0a0' + libcxx: '>=16.0.6' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + setuptools: '' + url: https://conda.anaconda.org/conda-forge/osx-64/protobuf-4.24.4-py39h31269fc_0.conda + hash: + md5: 4f6b85a78cb55f8bf9b19f2943c981b7 + sha256: 9adf770eaff4b547e5adf27cf5cc890675cb83b27043fb7569c53932be571e93 + category: main + optional: false - name: protobuf version: 4.24.4 manager: conda @@ -12267,11 +18736,25 @@ package: - name: protoc-gen-openapiv2 version: 0.0.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: googleapis-common-protos: '' + python: '>=3.6' protobuf: '>=4.21.0' + url: https://conda.anaconda.org/conda-forge/noarch/protoc-gen-openapiv2-0.0.1-pyhd8ed1ab_0.conda + hash: + md5: 7a0af408c81dccfc5a420fb1f27c9064 + sha256: a6b561d1d09f4d88e256efc10cc6065866acf53efd32d03509a5b8c0aed40f3e + category: main + optional: false +- name: protoc-gen-openapiv2 + version: 0.0.1 + manager: conda + platform: osx-arm64 + dependencies: + googleapis-common-protos: '' python: '>=3.6' + protobuf: '>=4.21.0' url: https://conda.anaconda.org/conda-forge/noarch/protoc-gen-openapiv2-0.0.1-pyhd8ed1ab_0.conda hash: md5: 7a0af408c81dccfc5a420fb1f27c9064 @@ -12292,6 +18775,19 @@ package: sha256: d0fa2b24b7245483208014e3567ef3aeeb3242b77ba1002c46923a60a3a05c3b category: main optional: false +- name: psutil + version: 5.9.8 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/psutil-5.9.8-py39ha09f3b3_0.conda + hash: + md5: e8737c3c0c404559b0e2c8a9eb91e977 + sha256: 944c585e1496e22c6457a202127a49f93c81f9b02df46f75200c0fd315a00abb + category: main + optional: false - name: psutil version: 5.9.8 manager: conda @@ -12320,6 +18816,21 @@ package: sha256: 717e8791ee5281e8c8051134a4c6597d9e54f47686aa02dc3210af089e2ac3b3 category: main optional: false +- name: psycopg2 + version: 2.9.9 + manager: conda + platform: osx-64 + dependencies: + libpq: '>=16.1,<17.0a0' + openssl: '>=3.2.0,<4.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/psycopg2-2.9.9-py39h41b6f7b_0.conda + hash: + md5: a24bc3feec4620aeb36d60e5d2773adc + sha256: 1eda217b6664773634a1b760b9f13e56280c1159f9a016eb23eb93d421be5c66 + category: main + optional: false - name: psycopg2 version: 2.9.9 manager: conda @@ -12351,10 +18862,23 @@ package: - name: psycopg2-binary version: 2.9.9 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.6' psycopg2: '>=2.9.9,<2.9.10.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/psycopg2-binary-2.9.9-pyhd8ed1ab_0.conda + hash: + md5: c15b2ec0570f8988819eea58286dbc19 + sha256: bb6184a3de8a6fddaed9104539ada9ac7c5e2bd900284ccf96ef5e4e285e75db + category: main + optional: false +- name: psycopg2-binary + version: 2.9.9 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' + psycopg2: '>=2.9.9,<2.9.10.0a0' url: https://conda.anaconda.org/conda-forge/noarch/psycopg2-binary-2.9.9-pyhd8ed1ab_0.conda hash: md5: c15b2ec0570f8988819eea58286dbc19 @@ -12373,6 +18897,17 @@ package: sha256: 67c84822f87b641d89df09758da498b2d4558d47b920fd1d3fe6d3a871e000ff category: main optional: false +- name: pthread-stubs + version: '0.4' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2 + hash: + md5: addd19059de62181cd11ae8f4ef26084 + sha256: 6e3900bb241bcdec513d4e7180fe9a19186c1a38f0b4080ed619d26014222c53 + category: main + optional: false - name: pthread-stubs version: '0.4' manager: conda @@ -12396,6 +18931,18 @@ package: sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a category: main optional: false +- name: ptyprocess + version: 0.7.0 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + hash: + md5: 359eeb6536da0e687af562ed265ec263 + sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a + category: main + optional: false - name: ptyprocess version: 0.7.0 manager: conda @@ -12408,6 +18955,22 @@ package: sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a category: main optional: false +- name: pulseaudio-client + version: '16.1' + manager: conda + platform: linux-64 + dependencies: + dbus: '>=1.13.6,<2.0a0' + libgcc-ng: '>=12' + libglib: '>=2.76.4,<3.0a0' + libsndfile: '>=1.2.2,<1.3.0a0' + libsystemd0: '>=254' + url: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda + hash: + md5: ac902ff3c1c6d750dd0dfc93a974ab74 + sha256: 9981c70893d95c8cac02e7edd1a9af87f2c8745b772d529f08b7f9dafbe98606 + category: main + optional: false - name: pure_eval version: 0.2.2 manager: conda @@ -12420,6 +18983,18 @@ package: sha256: 72792f9fc2b1820e37cc57f84a27bc819c71088c3002ca6db05a2e56404f9d44 category: main optional: false +- name: pure_eval + version: 0.2.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 6784285c7e55cb7212efabc79e4c2883 + sha256: 72792f9fc2b1820e37cc57f84a27bc819c71088c3002ca6db05a2e56404f9d44 + category: main + optional: false - name: pure_eval version: 0.2.2 manager: conda @@ -12444,6 +19019,18 @@ package: sha256: 5a1d134f58dbc2c77b7985069a5485fe4aa09d49f1b545087913af62559ff738 category: main optional: false +- name: py4j + version: 0.10.9.7 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/py4j-0.10.9.7-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 0f01a52cf858aef86632a8ab08011c0c + sha256: 5a1d134f58dbc2c77b7985069a5485fe4aa09d49f1b545087913af62559ff738 + category: main + optional: false - name: py4j version: 0.10.9.7 manager: conda @@ -12473,6 +19060,22 @@ package: sha256: 0b723965361c9b2ecd31369a314aa9667e2482ce8f0912a6dd87fa70f7d2126a category: main optional: false +- name: pyarrow + version: 13.0.0 + manager: conda + platform: osx-64 + dependencies: + libarrow: 13.0.0 + libcxx: '>=14' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-13.0.0-py39h8632116_23_cpu.conda + hash: + md5: b49feea876499e9169549f9e522029b8 + sha256: 1f9918533e6190210048b935709727c0f1a673b5db5c7c685e813873218ed39d + category: main + optional: false - name: pyarrow version: 13.0.0 manager: conda @@ -12505,10 +19108,23 @@ package: - name: pyarrow-hotfix version: '0.6' manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.5' pyarrow: '>=0.14' + url: https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda + hash: + md5: ccc06e6ef2064ae129fab3286299abda + sha256: 9b767969d059c106aac6596438a7e7ebd3aa1e2ff6553d4b7e05126dfebf4bd6 + category: main + optional: false +- name: pyarrow-hotfix + version: '0.6' + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.5' + pyarrow: '>=0.14' url: https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda hash: md5: ccc06e6ef2064ae129fab3286299abda @@ -12527,6 +19143,18 @@ package: sha256: 8b116da9acbb471e107203c11acaffcb259aca2367aa7e83e796e43ed5d381b3 category: main optional: false +- name: pyasn1 + version: 0.5.1 + manager: conda + platform: osx-64 + dependencies: + python: '!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,!=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.5.1-pyhd8ed1ab_0.conda + hash: + md5: fb1a800972b072aa4d16450983c81418 + sha256: 8b116da9acbb471e107203c11acaffcb259aca2367aa7e83e796e43ed5d381b3 + category: main + optional: false - name: pyasn1 version: 0.5.1 manager: conda @@ -12555,10 +19183,23 @@ package: - name: pyasn1-modules version: 0.3.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.6' pyasn1: '>=0.4.6,<0.6.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.3.0-pyhd8ed1ab_0.conda + hash: + md5: 26db749166cdca55e5ef1ffdc7767d0e + sha256: 7867ba43b6ef1e66054ca6b70f59bbef4cdb0cc761f0be3b66d79d15bd43143b + category: main + optional: false +- name: pyasn1-modules + version: 0.3.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' + pyasn1: '>=0.4.6,<0.6.0' url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.3.0-pyhd8ed1ab_0.conda hash: md5: 26db749166cdca55e5ef1ffdc7767d0e @@ -12580,6 +19221,20 @@ package: sha256: 9e9e4bf4667d964678ef9dfe031b48f803c7e981e60b7095431bc3d1578f3cc2 category: main optional: false +- name: pycairo + version: 1.26.0 + manager: conda + platform: osx-64 + dependencies: + cairo: '>=1.18.0,<2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/pycairo-1.26.0-py39h98db87f_0.conda + hash: + md5: f2b18d13eccce2b713a06675a3b31ad8 + sha256: 89afd72b42e7db08a71b35eae108c7b38974474ee99d430a3fd1911bee532380 + category: main + optional: false - name: pycairo version: 1.26.0 manager: conda @@ -12595,27 +19250,39 @@ package: category: main optional: false - name: pycparser - version: '2.21' + version: '2.22' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + hash: + md5: 844d9eb3b43095b031874477f7d70088 + sha256: 406001ebf017688b1a1554b49127ca3a4ac4626ec0fd51dc75ffa4415b720b64 + category: main + optional: false +- name: pycparser + version: '2.22' manager: conda - platform: linux-64 + platform: osx-64 dependencies: - python: 2.7.*|>=3.4 - url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda hash: - md5: 076becd9e05608f8dc72757d5f3a91ff - sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + md5: 844d9eb3b43095b031874477f7d70088 + sha256: 406001ebf017688b1a1554b49127ca3a4ac4626ec0fd51dc75ffa4415b720b64 category: main optional: false - name: pycparser - version: '2.21' + version: '2.22' manager: conda platform: osx-arm64 dependencies: - python: 2.7.*|>=3.4 - url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda hash: - md5: 076becd9e05608f8dc72757d5f3a91ff - sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + md5: 844d9eb3b43095b031874477f7d70088 + sha256: 406001ebf017688b1a1554b49127ca3a4ac4626ec0fd51dc75ffa4415b720b64 category: main optional: false - name: pydantic @@ -12633,6 +19300,20 @@ package: sha256: 351e7a25060d9b86a312b5662691dd5f7416099587d24f5293da3972b6606e76 category: main optional: false +- name: pydantic + version: 1.10.14 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + typing-extensions: '>=4.2.0' + url: https://conda.anaconda.org/conda-forge/osx-64/pydantic-1.10.14-py39ha09f3b3_0.conda + hash: + md5: ee0eda42563d26e60a20d2907723afb1 + sha256: 0bcaa75d9dee087991f20f89f7b1b5a3553d8680748d02204eb93aa7754956ee + category: main + optional: false - name: pydantic version: 1.10.14 manager: conda @@ -12659,6 +19340,18 @@ package: sha256: af5f8867450dc292f98ea387d4d8945fc574284677c8f60eaa9846ede7387257 category: main optional: false +- name: pygments + version: 2.17.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda + hash: + md5: 140a7f159396547e9799aa98f9f0742e + sha256: af5f8867450dc292f98ea387d4d8945fc574284677c8f60eaa9846ede7387257 + category: main + optional: false - name: pygments version: 2.17.2 manager: conda @@ -12690,6 +19383,25 @@ package: sha256: 282e82bba4f1b89b0fd2fbe8bb4891ad4f503aa9d15dcbacbdffac928f5f298a category: main optional: false +- name: pygobject + version: 3.48.1 + manager: conda + platform: osx-64 + dependencies: + cairo: '>=1.18.0,<2.0a0' + libffi: '>=3.4,<4.0a0' + libgirepository: '' + libglib: '>=2.78.4,<3.0a0' + libiconv: '' + pycairo: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/pygobject-3.48.1-py39hd2ce206_0.conda + hash: + md5: 2f6cf64674b290798fa724129ba27df7 + sha256: 361ad4d6e532674ddfac6f5d28447906ac7a54738422e4d806ee068944ee7aba + category: main + optional: false - name: pygobject version: 3.48.1 manager: conda @@ -12721,6 +19433,18 @@ package: sha256: d7cb7fbafd767e938db10820c76a9c16d91faf5a081842159cc185787879eb07 category: main optional: false +- name: pyjwt + version: 2.8.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.8.0-pyhd8ed1ab_1.conda + hash: + md5: 74f76d4868dbba5870f2cf1d9b12d8f3 + sha256: d7cb7fbafd767e938db10820c76a9c16d91faf5a081842159cc185787879eb07 + category: main + optional: false - name: pyjwt version: 2.8.0 manager: conda @@ -12750,6 +19474,22 @@ package: sha256: 92ab9febd08bf59bd21ca851829b7af075b9b182aecc54e025fcbad620034897 category: main optional: false +- name: pynacl + version: 1.5.0 + manager: conda + platform: osx-64 + dependencies: + cffi: '>=1.4.1' + libsodium: '>=1.0.18,<1.0.19.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + six: '' + url: https://conda.anaconda.org/conda-forge/osx-64/pynacl-1.5.0-py39hdc70f33_3.conda + hash: + md5: 2d6bf7df608e80d7ad571be07746afcb + sha256: 6625a03a7cee82ed46fcfbeb91f1b00c01dfb2e4d9fc90be9a2d353ba4aa8b0d + category: main + optional: false - name: pynacl version: 1.5.0 manager: conda @@ -12766,6 +19506,21 @@ package: sha256: 5113a7fbf60125c02f7c624f92caee30962e967bb6e57b7cb6fd730ba4f04d2c category: main optional: false +- name: pyobjc-core + version: '10.2' + manager: conda + platform: osx-64 + dependencies: + libffi: '>=3.4,<4.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + setuptools: '' + url: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-10.2-py39h8602b6b_0.conda + hash: + md5: 37b6b21536780b9665b9c84908318d7a + sha256: 6517faf0ad9a22763655b682dc41d53b08c388bcb67c77d1654158baf609ae3f + category: main + optional: false - name: pyobjc-core version: '10.2' manager: conda @@ -12781,6 +19536,21 @@ package: sha256: cc3d5e2ba7cd678600aa8f10434dea88ff798bc40e9733595fbad387c265410c category: main optional: false +- name: pyobjc-framework-cocoa + version: '10.2' + manager: conda + platform: osx-64 + dependencies: + libffi: '>=3.4,<4.0a0' + pyobjc-core: 10.2.* + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-10.2-py39h8602b6b_0.conda + hash: + md5: 271f368ad661bf3bba2d5740ac8ee24c + sha256: e69322b541ceca63691ee40d5745642b90b3f280a64b878e9c67259b551d3223 + category: main + optional: false - name: pyobjc-framework-cocoa version: '10.2' manager: conda @@ -12812,10 +19582,23 @@ package: - name: pyopenssl version: 24.0.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' cryptography: '>=41.0.5,<43' + url: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.0.0-pyhd8ed1ab_0.conda + hash: + md5: b50aec2c744a5c493c09cce9e2e7533e + sha256: bacd1d38585f447e2809e7621283661da7c97cfa20f545edb0ac5838356ed87b + category: main + optional: false +- name: pyopenssl + version: 24.0.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + cryptography: '>=41.0.5,<43' url: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.0.0-pyhd8ed1ab_0.conda hash: md5: b50aec2c744a5c493c09cce9e2e7533e @@ -12834,6 +19617,18 @@ package: sha256: 06c77cb03e5dde2d939b216c99dd2db52ea93a4c7c599f3882f136005c359c7b category: main optional: false +- name: pyparsing + version: 3.1.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + hash: + md5: b9a4dacf97241704529131a0dfc0494f + sha256: 06c77cb03e5dde2d939b216c99dd2db52ea93a4c7c599f3882f136005c359c7b + category: main + optional: false - name: pyparsing version: 3.1.2 manager: conda @@ -12862,6 +19657,21 @@ package: sha256: 8aaa223df3738765b242d50a09deacee13b1e991133b825d6000b67e43cd27c0 category: main optional: false +- name: pyproj + version: 3.6.1 + manager: conda + platform: osx-64 + dependencies: + certifi: '' + proj: '>=9.3.1,<9.3.2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/pyproj-3.6.1-py39h50371c4_5.conda + hash: + md5: 3d3ea2d86757dc1aabb013775b0a6869 + sha256: b01f80c96b3466922714c01fe0788677fb3e3a359d5291a54e5954b271d1f20d + category: main + optional: false - name: pyproj version: 3.6.1 manager: conda @@ -12877,17 +19687,100 @@ package: sha256: d056de9eb7e7b568a003d5a24caa7a9c73e2cf34cbac0aecd253056157770ea3 category: main optional: false +- name: pyqt + version: 5.15.9 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + pyqt5-sip: 12.12.2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + qt-main: '>=5.15.8,<5.16.0a0' + sip: '>=6.7.11,<6.8.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda + hash: + md5: e1f148e57d071b09187719df86f513c1 + sha256: a0d0662c73b343931dbd66d9c25ec74f40115512568a87bf4d01af8d1a8ddf1c + category: main + optional: false +- name: pyqt + version: 5.15.9 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + pyqt5-sip: 12.12.2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + qt-main: '>=5.15.8,<5.16.0a0' + sip: '>=6.7.11,<6.8.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/pyqt-5.15.9-py39h3dce684_5.conda + hash: + md5: ecc396e7a7badba032c3f9dd30c40e9c + sha256: 58e3f096357bc899fa446bc9ff28cf04feaa3cb7b394b2fcf7e4facce442ff72 + category: main + optional: false +- name: pyqt5-sip + version: 12.12.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + packaging: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + sip: '' + toml: '' + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda + hash: + md5: 93aff412f3e49fdb43361c0215cbd72d + sha256: 86efec5e57111794e039bb14dfce23d9df6ed8df139ab1404086140eba6d4d7c + category: main + optional: false +- name: pyqt5-sip + version: 12.12.2 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + packaging: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + sip: '' + toml: '' + url: https://conda.anaconda.org/conda-forge/osx-64/pyqt5-sip-12.12.2-py39hb11a7c1_5.conda + hash: + md5: 10288bdb5ec36c5207d79deee15c6be5 + sha256: ab6ffa5e1755f72cddd9ff45bf681ec710b914705258d6462f606ecf873ff435 + category: main + optional: false - name: pysocks version: 1.7.1 manager: conda platform: linux-64 dependencies: - __unix: '' - python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py39hf3d152e_5.tar.bz2 + hash: + md5: d34b97a2386932b97c7cb80916a673e7 + sha256: 42d46baeab725d3c70d22a4258549e9f0f1a72b740166cd9c3b394c4369cb306 + category: main + optional: false +- name: pysocks + version: 1.7.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/pysocks-1.7.1-py39h6e9494a_5.tar.bz2 hash: - md5: 2a7de29fb590ca14b5243c4c812c8025 - sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + md5: e6845a71941ffc957c9e4ac0c4c88edd + sha256: 452a784735cc5c45b8494697885bb3530e3af83ac1e9931961a5667c10ea67ba category: main optional: false - name: pysocks @@ -12895,12 +19788,12 @@ package: manager: conda platform: osx-arm64 dependencies: - __unix: '' - python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-arm64/pysocks-1.7.1-py39h2804cbe_5.tar.bz2 hash: - md5: 2a7de29fb590ca14b5243c4c812c8025 - sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + md5: 831038e9e2af74015b03d82209ac5f87 + sha256: 33258403558102b27ccc918338eb90906028f8f3f2b2af549b3232335dc355e1 category: main optional: false - name: pyspark @@ -12922,13 +19815,29 @@ package: - name: pyspark version: 3.5.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' numpy: '>=1.15' pandas: '>=1.0.5' - py4j: 0.10.9.7 pyarrow: '>=4.0.0' + py4j: 0.10.9.7 + url: https://conda.anaconda.org/conda-forge/noarch/pyspark-3.5.1-pyhd8ed1ab_0.conda + hash: + md5: fc1824942077c7ed5f0e24ff869c6f37 + sha256: 6ba987ac0a2c5c6de98b4ce943e72cfbfca1134678c3984959cdb11070997005 + category: main + optional: false +- name: pyspark + version: 3.5.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + numpy: '>=1.15' + pandas: '>=1.0.5' + pyarrow: '>=4.0.0' + py4j: 0.10.9.7 url: https://conda.anaconda.org/conda-forge/noarch/pyspark-3.5.1-pyhd8ed1ab_0.conda hash: md5: fc1824942077c7ed5f0e24ff869c6f37 @@ -12936,7 +19845,7 @@ package: category: main optional: false - name: python - version: 3.9.18 + version: 3.9.19 manager: conda platform: linux-64 dependencies: @@ -12945,41 +19854,62 @@ package: libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' libnsl: '>=2.0.1,<2.1.0a0' - libsqlite: '>=3.44.2,<4.0a0' + libsqlite: '>=3.45.2,<4.0a0' libuuid: '>=2.38.1,<3.0a0' libxcrypt: '>=4.4.36' libzlib: '>=1.2.13,<1.3.0a0' - ncurses: '>=6.4,<7.0a0' - openssl: '>=3.2.0,<4.0a0' + ncurses: '>=6.4.20240210,<7.0a0' + openssl: '>=3.2.1,<4.0a0' + readline: '>=8.2,<9.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + xz: '>=5.2.6,<6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda + hash: + md5: d9ee3647fbd9e8595b8df759b2bbefb8 + sha256: b9253ca9ca5427e6da4b1d43353a110e0f2edfab9c951afb4bf01cbae2825b31 + category: main + optional: false +- name: python + version: 3.9.19 + manager: conda + platform: osx-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libffi: '>=3.4,<4.0a0' + libsqlite: '>=3.45.2,<4.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + ncurses: '>=6.4.20240210,<7.0a0' + openssl: '>=3.2.1,<4.0a0' readline: '>=8.2,<9.0a0' tk: '>=8.6.13,<8.7.0a0' tzdata: '' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda + url: https://conda.anaconda.org/conda-forge/osx-64/python-3.9.19-h7a9c478_0_cpython.conda hash: - md5: 255a7002aeec7a067ff19b545aca6328 - sha256: c0e800d255a771926007043d2859cbbbdb1387477ec813f085640c8887b391a2 + md5: 7d53d366acd9dbfb498c69326ccb520a + sha256: 58b76be84683bc03112b3ed7e377e99af24844ebf7d7568f6466a2dae7a887fe category: main optional: false - name: python - version: 3.9.18 + version: 3.9.19 manager: conda platform: osx-arm64 dependencies: bzip2: '>=1.0.8,<2.0a0' libffi: '>=3.4,<4.0a0' - libsqlite: '>=3.44.2,<4.0a0' + libsqlite: '>=3.45.2,<4.0a0' libzlib: '>=1.2.13,<1.3.0a0' - ncurses: '>=6.4,<7.0a0' - openssl: '>=3.2.0,<4.0a0' + ncurses: '>=6.4.20240210,<7.0a0' + openssl: '>=3.2.1,<4.0a0' readline: '>=8.2,<9.0a0' tk: '>=8.6.13,<8.7.0a0' tzdata: '' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.9.18-hd7ebdb9_1_cpython.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.9.19-hd7ebdb9_0_cpython.conda hash: - md5: c48f67fd7147f37c941037de0a328560 - sha256: 7336d2cfefff2466f1f60144f10f5bf98f9d176a8c72ca85336baa5dc32299ef + md5: 45c4d173b12154f746be3b49b1190634 + sha256: 3b93f7a405f334043758dfa8aaca050429a954a37721a6462ebd20e94ef7c5a0 category: main optional: false - name: python-dateutil @@ -12995,6 +19925,19 @@ package: sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 category: main optional: false +- name: python-dateutil + version: 2.9.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + six: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + hash: + md5: 2cf4264fffb9e6eff6031c5b6884d61c + sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 + category: main + optional: false - name: python-dateutil version: 2.9.0 manager: conda @@ -13020,6 +19963,18 @@ package: sha256: 38b2db169d65cc5595e3ce63294c4fdb6a242ecf71f70b3ad8cad3bd4230d82f category: main optional: false +- name: python-fastjsonschema + version: 2.19.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.3' + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda + hash: + md5: 4d3ceee3af4b0f9a1f48f57176bf8625 + sha256: 38b2db169d65cc5595e3ce63294c4fdb6a242ecf71f70b3ad8cad3bd4230d82f + category: main + optional: false - name: python-fastjsonschema version: 2.19.1 manager: conda @@ -13033,33 +19988,57 @@ package: category: main optional: false - name: python-flatbuffers - version: 24.3.7 + version: 24.3.25 manager: conda platform: linux-64 dependencies: python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-24.3.7-pyh59ac667_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-24.3.25-pyh59ac667_0.conda + hash: + md5: dfc884dcd61ff6543fde37a41b7d7f31 + sha256: 6a9d285fef959480eccbc69e276ede64e292c8eee35ddc727d5a0fb9a4bcc3a2 + category: main + optional: false +- name: python-flatbuffers + version: 24.3.25 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-24.3.25-pyh59ac667_0.conda hash: - md5: 24c1a37849fcd4c74923a38b029b208f - sha256: cacba4db8e9e8500f11fb5e43bd7ef5f0d43ba58f668f74544924e7dba63b7e8 + md5: dfc884dcd61ff6543fde37a41b7d7f31 + sha256: 6a9d285fef959480eccbc69e276ede64e292c8eee35ddc727d5a0fb9a4bcc3a2 category: main optional: false - name: python-flatbuffers - version: 24.3.7 + version: 24.3.25 manager: conda platform: osx-arm64 dependencies: python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-24.3.7-pyh59ac667_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-24.3.25-pyh59ac667_0.conda + hash: + md5: dfc884dcd61ff6543fde37a41b7d7f31 + sha256: 6a9d285fef959480eccbc69e276ede64e292c8eee35ddc727d5a0fb9a4bcc3a2 + category: main + optional: false +- name: python-json-logger + version: 2.0.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda hash: - md5: 24c1a37849fcd4c74923a38b029b208f - sha256: cacba4db8e9e8500f11fb5e43bd7ef5f0d43ba58f668f74544924e7dba63b7e8 + md5: a61bf9ec79426938ff785eb69dbb1960 + sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca category: main optional: false - name: python-json-logger version: 2.0.7 manager: conda - platform: linux-64 + platform: osx-64 dependencies: python: '>=3.6' url: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda @@ -13105,19 +20084,41 @@ package: - name: python-kubernetes version: 29.0.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + requests: '' + requests-oauthlib: '' + python: '>=3.6' + six: '>=1.9.0' + pyyaml: '>=5.4.1' + python-dateutil: '>=2.5.3' certifi: '>=14.05.14' google-auth: '>=1.0.1' + websocket-client: '>=0.32.0,!=0.40.0,!=0.41.*,!=0.42.*' oauthlib: '>=3.2.2' - python: '>=3.6' - python-dateutil: '>=2.5.3' - pyyaml: '>=5.4.1' + urllib3: '>=1.24.2,<2.0' + url: https://conda.anaconda.org/conda-forge/noarch/python-kubernetes-29.0.0-pyhd8ed1ab_0.conda + hash: + md5: a94f4c6a1cff1e9837a8b62ae35c673f + sha256: 30e268b5e3299ae77f5bc34a2e290e47d5663f72be2ae3451ae7c24936670a74 + category: main + optional: false +- name: python-kubernetes + version: 29.0.0 + manager: conda + platform: osx-arm64 + dependencies: requests: '' requests-oauthlib: '' + python: '>=3.6' six: '>=1.9.0' - urllib3: '>=1.24.2,<2.0' + pyyaml: '>=5.4.1' + python-dateutil: '>=2.5.3' + certifi: '>=14.05.14' + google-auth: '>=1.0.1' websocket-client: '>=0.32.0,!=0.40.0,!=0.41.*,!=0.42.*' + oauthlib: '>=3.2.2' + urllib3: '>=1.24.2,<2.0' url: https://conda.anaconda.org/conda-forge/noarch/python-kubernetes-29.0.0-pyhd8ed1ab_0.conda hash: md5: a94f4c6a1cff1e9837a8b62ae35c673f @@ -13137,6 +20138,19 @@ package: sha256: a1270bfd4f1d648766c8f95403f208e50d34af94761bc553a960102c6bff9fa0 category: main optional: false +- name: python-slugify + version: 8.0.4 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + text-unidecode: '>=1.3' + url: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_0.conda + hash: + md5: 4b11845622b3c3178c0e989235b53975 + sha256: a1270bfd4f1d648766c8f95403f208e50d34af94761bc553a960102c6bff9fa0 + category: main + optional: false - name: python-slugify version: 8.0.4 manager: conda @@ -13162,6 +20176,18 @@ package: sha256: 9da9a849d53705dee450b83507df1ca8ffea5f83bd21a215202221f1c492f8ad category: main optional: false +- name: python-tzdata + version: '2024.1' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda + hash: + md5: 98206ea9954216ee7540f0c773f2104d + sha256: 9da9a849d53705dee450b83507df1ca8ffea5f83bd21a215202221f1c492f8ad + category: main + optional: false - name: python-tzdata version: '2024.1' manager: conda @@ -13187,6 +20213,19 @@ package: sha256: 56aac9317cde48fc8ff59806587afd4d1c262dcd7598f94c0748a2ec51523d09 category: main optional: false +- name: python-utils + version: 3.8.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + typing_extensions: '>3.10.0.2' + url: https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.2-pyhd8ed1ab_0.conda + hash: + md5: 89703b4f38bd1c0353881f085bc8fdaa + sha256: 56aac9317cde48fc8ff59806587afd4d1c262dcd7598f94c0748a2ec51523d09 + category: main + optional: false - name: python-utils version: 3.8.2 manager: conda @@ -13215,6 +20254,20 @@ package: sha256: 1172021966a2227236dcab73e4f456d03d4c5afe2bbfcc25ccf7357b49539a15 category: main optional: false +- name: python-xxhash + version: 3.4.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + xxhash: '>=0.8.2,<0.8.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/python-xxhash-3.4.1-py39hdc70f33_0.conda + hash: + md5: 69a7ee634ee74be28ca77036e6550c99 + sha256: 55039275108af1024c2f4e002bd0a52250f44fafacd7a1e967de864859c34bda + category: main + optional: false - name: python-xxhash version: 3.4.1 manager: conda @@ -13240,6 +20293,17 @@ package: sha256: 7e0157e35929711e1a986c18a8bfb7a38a2209cfada16b541ebb0481f74376d6 category: main optional: false +- name: python_abi + version: '3.9' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.9-4_cp39.conda + hash: + md5: 2d9f6c00555127a9058cfa955adf1090 + sha256: a2b38ce566d9f48a49369f46c50912300a6ac09bf1c58a0d6c2caab074ee551e + category: main + optional: false - name: python_abi version: '3.9' manager: conda @@ -13263,6 +20327,18 @@ package: sha256: 313cbde8ded706790d4fb8ea114ba1d706ff5be0780f63c01de81f569e593a03 category: main optional: false +- name: pytimeparse + version: 1.1.8 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pytimeparse-1.1.8-py_0.tar.bz2 + hash: + md5: edde7e7260599f9860002187486b3e01 + sha256: 313cbde8ded706790d4fb8ea114ba1d706ff5be0780f63c01de81f569e593a03 + category: main + optional: false - name: pytimeparse version: 1.1.8 manager: conda @@ -13280,25 +20356,18 @@ package: manager: conda platform: linux-64 dependencies: - __cuda: '' __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' - cudatoolkit: '>=11.8,<12' - cudnn: '>=8.8.0.121,<9.0a0' filelock: '' fsspec: '' jinja2: '' libcblas: '>=3.9.0,<4.0a0' libgcc-ng: '>=12' - libmagma: '>=2.7.2,<2.7.3.0a0' - libmagma_sparse: '>=2.7.2,<2.7.3.0a0' libprotobuf: '>=4.24.4,<4.24.5.0a0' libstdcxx-ng: '>=12' libtorch: 2.1.2.* libuv: '>=1.46.0,<2.0a0' - magma: '>=2.7.2,<2.7.3.0a0' mkl: '>=2023.2.0,<2024.0a0' - nccl: '>=2.19.4.1,<3.0a0' networkx: '' numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' @@ -13306,10 +20375,38 @@ package: sleef: '>=3.5.1,<4.0a0' sympy: '' typing_extensions: '' - url: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.1.2-cuda118_py39hcb596ef_300.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.1.2-cpu_mkl_py39h9c325db_100.conda + hash: + md5: bb34e51d3542a1b4b6afc04f28585055 + sha256: c363db53861a5ffe1613e57a8c3624f447fa203dde66f52b29ddb9859fb2e8bc + category: main + optional: false +- name: pytorch + version: 2.1.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + filelock: '' + fsspec: '' + jinja2: '' + libcblas: '>=3.9.0,<4.0a0' + libcxx: '>=15.0.7' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libuv: '>=1.46.0,<2.0a0' + llvm-openmp: '>=16.0.6' + mkl: '>=2022.2.1,<2023.0a0' + networkx: '' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + sleef: '>=3.5.1,<4.0a0' + sympy: '' + typing_extensions: '' + url: https://conda.anaconda.org/conda-forge/osx-64/pytorch-2.1.0-cpu_mkl_py39h0a49516_100.conda hash: - md5: d7355cce6a80513f7e9980e5e2e836be - sha256: 4f84efcd67159d4117b9519da2542da4f71c21e2abe2dae3368a54e365df6d98 + md5: a3d21e02ee1f4551b728dcaf9d97f99a + sha256: cbc26a8691107d3833f5876a37eb0b9f73fd68d66e62011f6f4aa800ebcd0aa4 category: main optional: false - name: pytorch @@ -13353,6 +20450,18 @@ package: sha256: c988e6b9032ac2f917540a1d5a2268f45c01892c392fd7eee9d5c60270337835 category: main optional: false +- name: pytz + version: '2023.4' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2023.4-pyhd8ed1ab_0.conda + hash: + md5: 89445e229eb2d6605be88e0908afc912 + sha256: c988e6b9032ac2f917540a1d5a2268f45c01892c392fd7eee9d5c60270337835 + category: main + optional: false - name: pytz version: '2023.4' manager: conda @@ -13381,10 +20490,23 @@ package: - name: pyu2f version: 0.1.5 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + six: '' python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_0.tar.bz2 + hash: + md5: caabbeaa83928d0c3e3949261daa18eb + sha256: 667a5a30b65a60b15f38fa4cb09efd6d2762b5a0a9563acd9555eaa5e0b953a2 + category: main + optional: false +- name: pyu2f + version: 0.1.5 + manager: conda + platform: osx-arm64 + dependencies: six: '' + python: '>=2.7' url: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_0.tar.bz2 hash: md5: caabbeaa83928d0c3e3949261daa18eb @@ -13404,6 +20526,19 @@ package: sha256: 6502696aaef571913b22a808b15c185bd8ea4aabb952685deb29e6a6765761cb category: main optional: false +- name: pywin32-on-windows + version: 0.1.0 + manager: conda + platform: osx-64 + dependencies: + __unix: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + hash: + md5: 2807a0becd1d986fe1ef9b7f8135f215 + sha256: 6502696aaef571913b22a808b15c185bd8ea4aabb952685deb29e6a6765761cb + category: main + optional: false - name: pywin32-on-windows version: 0.1.0 manager: conda @@ -13432,6 +20567,20 @@ package: sha256: 28b147c50ad48215f9427a52811848223ac0371be7caae88522e661a3bfb1448 category: main optional: false +- name: pyyaml + version: 6.0.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + yaml: '>=0.2.5,<0.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py39hdc70f33_1.conda + hash: + md5: 542378f49240a94056b50ab1385b3bfb + sha256: 4a8d084617571ecb8d816fe4c46b672d8b9b4bd354cbfdbb6c843143abe3896f + category: main + optional: false - name: pyyaml version: 6.0.1 manager: conda @@ -13463,6 +20612,23 @@ package: sha256: ada6b641a9fca2a4a7efe72bb5133d3da89bc52ac16a1d67083c065bdccdb321 category: main optional: false +- name: pyzmq + version: 25.1.2 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + libsodium: '>=1.0.18,<1.0.19.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + zeromq: '>=4.3.5,<4.4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-25.1.2-py39hcb7a90d_0.conda + hash: + md5: 39754a321b3dece3df9a0eb213d43dc8 + sha256: 9e491ef2066050c2c34a49aeddf2be773cee59bcdde037f6ef6b114690f21f69 + category: main + optional: false - name: pyzmq version: 25.1.2 manager: conda @@ -13480,6 +20646,116 @@ package: sha256: 23e9a498414af4613c51d93dd74c6c20f63a03545c7b11b7b0bdeaf70f194d1c category: main optional: false +- name: qt-main + version: 5.15.8 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + alsa-lib: '>=1.2.10,<1.3.0.0a0' + dbus: '>=1.13.6,<2.0a0' + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freetype: '>=2.12.1,<3.0a0' + gst-plugins-base: '>=1.22.9,<1.23.0a0' + gstreamer: '>=1.22.9,<1.23.0a0' + harfbuzz: '>=8.3.0,<9.0a0' + icu: '>=73.2,<74.0a0' + krb5: '>=1.21.2,<1.22.0a0' + libclang: '>=15.0.7,<16.0a0' + libclang13: '>=15.0.7' + libcups: '>=2.3.3,<2.4.0a0' + libevent: '>=2.1.12,<2.1.13.0a0' + libexpat: '>=2.5.0,<3.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.3,<3.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libpng: '>=1.6.42,<1.7.0a0' + libpq: '>=16.2,<17.0a0' + libsqlite: '>=3.45.1,<4.0a0' + libstdcxx-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + libxkbcommon: '>=1.6.0,<2.0a0' + libxml2: '>=2.12.5,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + mysql-libs: '>=8.0.33,<8.1.0a0' + nspr: '>=4.35,<5.0a0' + nss: '>=3.97,<4.0a0' + openssl: '>=3.2.1,<4.0a0' + pulseaudio-client: '>=16.1,<16.2.0a0' + xcb-util: '>=0.4.0,<0.5.0a0' + xcb-util-image: '>=0.4.0,<0.5.0a0' + xcb-util-keysyms: '>=0.4.0,<0.5.0a0' + xcb-util-renderutil: '>=0.3.9,<0.4.0a0' + xcb-util-wm: '>=0.4.1,<0.5.0a0' + xorg-libice: '>=1.1.1,<2.0a0' + xorg-libsm: '>=1.2.4,<2.0a0' + xorg-libx11: '>=1.8.7,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-xf86vidmodeproto: '' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5810be5_19.conda + hash: + md5: 54866f708d43002a514d0b9b0f84bc11 + sha256: 41228ec12346d640ef1f549885d8438e98b1be0fdeb68cd1dd3938f255cbd719 + category: main + optional: false +- name: qt-main + version: 5.15.8 + manager: conda + platform: osx-64 + dependencies: + gst-plugins-base: '>=1.22.9,<1.23.0a0' + gstreamer: '>=1.22.9,<1.23.0a0' + icu: '>=73.2,<74.0a0' + krb5: '>=1.21.2,<1.22.0a0' + libclang: '>=15.0.7,<16.0a0' + libclang13: '>=15.0.7' + libcxx: '>=14' + libglib: '>=2.78.3,<3.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libpng: '>=1.6.42,<1.7.0a0' + libpq: '>=16.2,<17.0a0' + libsqlite: '>=3.45.1,<4.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + mysql-libs: '>=8.0.33,<8.1.0a0' + nspr: '>=4.35,<5.0a0' + nss: '>=3.97,<4.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/qt-main-5.15.8-h4385fff_19.conda + hash: + md5: e9e7fc8f8b31e436472e6c2697dfa9fa + sha256: f1ab73268198fe66c0b438b58b34bc56b987d0c411c4d60882c9474186a7d7f0 + category: main + optional: false +- name: qtconsole + version: 5.5.1 + manager: conda + platform: linux-64 + dependencies: + pyqt: '' + python: '>=3.7' + qtconsole-base: '>=5.5.1,<5.5.2.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/qtconsole-5.5.1-pyhd8ed1ab_0.conda + hash: + md5: eb44d4dc1e8c84287c4fb28518ffedd0 + sha256: c102ef2919dc780086ee59cb1dd9823603bf6e6d394eace6ae53c84c97661e9d + category: main + optional: false +- name: qtconsole + version: 5.5.1 + manager: conda + platform: osx-64 + dependencies: + pyqt: '' + python: '>=3.7' + qtconsole-base: '>=5.5.1,<5.5.2.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/qtconsole-5.5.1-pyhd8ed1ab_0.conda + hash: + md5: eb44d4dc1e8c84287c4fb28518ffedd0 + sha256: c102ef2919dc780086ee59cb1dd9823603bf6e6d394eace6ae53c84c97661e9d + category: main + optional: false - name: qtconsole-base version: 5.5.1 manager: conda @@ -13502,16 +20778,16 @@ package: - name: qtconsole-base version: 5.5.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - ipykernel: '>=4.1' - jupyter_client: '>=4.1' - jupyter_core: '' packaging: '' pygments: '' + traitlets: '' + jupyter_core: '' python: '>=3.8' + ipykernel: '>=4.1' + jupyter_client: '>=4.1' qtpy: '>=2.4.0' - traitlets: '' url: https://conda.anaconda.org/conda-forge/noarch/qtconsole-base-5.5.1-pyha770c72_0.conda hash: md5: 5528a3eda283b421055c89bface19a1c @@ -13534,7 +20810,7 @@ package: - name: qtpy version: 2.4.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: packaging: '' python: '>=3.7' @@ -13558,6 +20834,20 @@ package: sha256: 06977a9af6d8605fb6068d8af6bb9c1cb565f8f5e15aa6cf0fb94109d4148b54 category: main optional: false +- name: querystring_parser + version: 1.2.4 + manager: conda + platform: osx-64 + dependencies: + python: '' + requests: '' + six: '' + url: https://conda.anaconda.org/conda-forge/noarch/querystring_parser-1.2.4-py_0.tar.bz2 + hash: + md5: 0ebdca9b753c2e082e5b5ad06aa76b41 + sha256: 06977a9af6d8605fb6068d8af6bb9c1cb565f8f5e15aa6cf0fb94109d4148b54 + category: main + optional: false - name: querystring_parser version: 1.2.4 manager: conda @@ -13599,6 +20889,18 @@ package: sha256: b8f9e366f02c559587327f0cd7fa45c5c399b4025f2c9e1aa292bb7cbe1482c0 category: main optional: false +- name: re2 + version: 2023.09.01 + manager: conda + platform: osx-64 + dependencies: + libre2-11: 2023.09.01 + url: https://conda.anaconda.org/conda-forge/osx-64/re2-2023.09.01-hb168e87_1.conda + hash: + md5: 81ce9e6ddc1c123aecc59234aa12d3b1 + sha256: e8c9d1fc5c254573bd46e46e4cc4dea6d6101d353ea54081f682438f815e224a + category: main + optional: false - name: re2 version: 2023.09.01 manager: conda @@ -13624,6 +20926,18 @@ package: sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 category: main optional: false +- name: readline + version: '8.2' + manager: conda + platform: osx-64 + dependencies: + ncurses: '>=6.3,<7.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + hash: + md5: f17f77f2acf4d344734bda76829ce14e + sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 + category: main + optional: false - name: readline version: '8.2' manager: conda @@ -13654,11 +20968,26 @@ package: - name: recommonmark version: 0.7.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - commonmark: '>=0.8.1' + python: '>=3' docutils: '>=0.11' + commonmark: '>=0.8.1' + sphinx: '>=1.3.1' + url: https://conda.anaconda.org/conda-forge/noarch/recommonmark-0.7.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: b3becf9905b8c7ba839072f65e693253 + sha256: 2bd6134e7540a1d458be34aef4a94a839540cba29ac75cc558be6a394549b8a6 + category: main + optional: false +- name: recommonmark + version: 0.7.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3' + docutils: '>=0.11' + commonmark: '>=0.8.1' sphinx: '>=1.3.1' url: https://conda.anaconda.org/conda-forge/noarch/recommonmark-0.7.1-pyhd8ed1ab_0.tar.bz2 hash: @@ -13683,10 +21012,24 @@ package: - name: referencing version: 0.34.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' attrs: '>=22.2.0' + rpds-py: '>=0.7.0' + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + hash: + md5: e4492c22e314be5c75db3469e3bbf3d9 + sha256: 2e631e9e1d49280770573f7acc7441b70181b2dc21948bb1be15eaae80550672 + category: main + optional: false +- name: referencing + version: 0.34.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + attrs: '>=22.2.0' rpds-py: '>=0.7.0' url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda hash: @@ -13713,12 +21056,28 @@ package: - name: requests version: 2.31.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' + idna: '>=2.5,<4' certifi: '>=2017.4.17' charset-normalizer: '>=2,<4' - idna: '>=2.5,<4' + urllib3: '>=1.21.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + hash: + md5: a30144e4156cdbb236f99ebb49828f8b + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + category: main + optional: false +- name: requests + version: 2.31.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + idna: '>=2.5,<4' + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' urllib3: '>=1.21.1,<3' url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda hash: @@ -13727,31 +21086,45 @@ package: category: main optional: false - name: requests-oauthlib - version: 1.4.0 + version: 2.0.0 manager: conda platform: linux-64 dependencies: oauthlib: '>=3.0.0' python: '>=3.4' requests: '>=2.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-1.4.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-2.0.0-pyhd8ed1ab_0.conda hash: - md5: a55b220de8970208f583e38639cfbecc - sha256: 909ec1510bbb6fad9276534352025f428050a4deeea86e68d61c8c580938ac82 + md5: 87ce3f09ae7e1d3d0f748a1a634ea3b7 + sha256: 3d2b0ad106ad5745445c2eb7e7f90b0ce75dc9f4d8c518eb6fd75aad3c80c2cc category: main optional: false - name: requests-oauthlib - version: 1.4.0 + version: 2.0.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.4' + requests: '>=2.0.0' oauthlib: '>=3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-2.0.0-pyhd8ed1ab_0.conda + hash: + md5: 87ce3f09ae7e1d3d0f748a1a634ea3b7 + sha256: 3d2b0ad106ad5745445c2eb7e7f90b0ce75dc9f4d8c518eb6fd75aad3c80c2cc + category: main + optional: false +- name: requests-oauthlib + version: 2.0.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.4' requests: '>=2.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-1.4.0-pyhd8ed1ab_0.conda + oauthlib: '>=3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-2.0.0-pyhd8ed1ab_0.conda hash: - md5: a55b220de8970208f583e38639cfbecc - sha256: 909ec1510bbb6fad9276534352025f428050a4deeea86e68d61c8c580938ac82 + md5: 87ce3f09ae7e1d3d0f748a1a634ea3b7 + sha256: 3d2b0ad106ad5745445c2eb7e7f90b0ce75dc9f4d8c518eb6fd75aad3c80c2cc category: main optional: false - name: rfc3339-validator @@ -13770,10 +21143,23 @@ package: - name: rfc3339-validator version: 0.1.4 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + six: '' python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2 + hash: + md5: fed45fc5ea0813240707998abe49f520 + sha256: 7c7052b51de0b5c558f890bb11f8b5edbb9934a653d76be086b1182b9f54185d + category: main + optional: false +- name: rfc3339-validator + version: 0.1.4 + manager: conda + platform: osx-arm64 + dependencies: six: '' + python: '>=3.5' url: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2 hash: md5: fed45fc5ea0813240707998abe49f520 @@ -13792,6 +21178,18 @@ package: sha256: 2a5b495a1de0f60f24d8a74578ebc23b24aa53279b1ad583755f223097c41c37 category: main optional: false +- name: rfc3986-validator + version: 0.1.1 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + hash: + md5: 912a71cc01012ee38e6b90ddd561e36f + sha256: 2a5b495a1de0f60f24d8a74578ebc23b24aa53279b1ad583755f223097c41c37 + category: main + optional: false - name: rfc3986-validator version: 0.1.1 manager: conda @@ -13822,12 +21220,27 @@ package: - name: rich version: 13.7.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - markdown-it-py: '>=2.2.0' + python: '>=3.7.0' + typing_extensions: '>=4.0.0,<5.0.0' pygments: '>=2.13.0,<3.0.0' + markdown-it-py: '>=2.2.0' + url: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + hash: + md5: ba445bf767ae6f0d959ff2b40c20912b + sha256: 2b26d58aa59e46f933c3126367348651b0dab6e0bf88014e857415bb184a4667 + category: main + optional: false +- name: rich + version: 13.7.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7.0' typing_extensions: '>=4.0.0,<5.0.0' + pygments: '>=2.13.0,<3.0.0' + markdown-it-py: '>=2.2.0' url: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda hash: md5: ba445bf767ae6f0d959ff2b40c20912b @@ -13851,10 +21264,24 @@ package: - name: rich-click version: 1.7.4 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' click: '>=7,<9' + rich: '>=10' + url: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.7.4-pyhd8ed1ab_0.conda + hash: + md5: a3e6556c7cfce33ba7dae23fb17d3303 + sha256: 91e0b041cf663d4a8e27f1cf572d265d90fdf3a58fa6513bc41292572ca5462f + category: main + optional: false +- name: rich-click + version: 1.7.4 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + click: '>=7,<9' rich: '>=10' url: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.7.4-pyhd8ed1ab_0.conda hash: @@ -13876,6 +21303,19 @@ package: sha256: 1bc9bdf6f4a14f38f8decf967fc40bfcd1ab069f012ef0f109163d1ef7b7c633 category: main optional: false +- name: rpds-py + version: 0.18.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.18.0-py39hcf47035_0.conda + hash: + md5: 0e8641e9f0d42d844cf17f5520225e6e + sha256: 02f4bc23980602a53243f46ec08e4bf8f3fb9e53c09322624af38ff4aebc0056 + category: main + optional: false - name: rpds-py version: 0.18.0 manager: conda @@ -13905,10 +21345,23 @@ package: - name: rsa version: '4.9' manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.6' pyasn1: '>=0.1.3' + url: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 03bf410858b2cefc267316408a77c436 + sha256: 23214cdc15a41d14136754857fd9cd46ca3c55a7e751da3b3a48c673f0ee2a57 + category: main + optional: false +- name: rsa + version: '4.9' + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' + pyasn1: '>=0.1.3' url: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9-pyhd8ed1ab_0.tar.bz2 hash: md5: 03bf410858b2cefc267316408a77c436 @@ -13929,6 +21382,20 @@ package: sha256: 91816e8ed8a9aaa7c351578131a85403ad600ebe1799628fe56e9eddf22daf3e category: main optional: false +- name: rtree + version: 1.2.0 + manager: conda + platform: osx-64 + dependencies: + libspatialindex: '>=1.9.3,<1.9.4.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/rtree-1.2.0-py39h7d0d40a_0.conda + hash: + md5: d3fe322db2ce58e65f1e964a11a8b979 + sha256: 628968440a4cbefffde514b2d8482e069086a55250fc5e078d34076e57641188 + category: main + optional: false - name: rtree version: 1.2.0 manager: conda @@ -13959,6 +21426,21 @@ package: sha256: eb70d985ce60baa5a8ba1a5b0ab49dcf2173f326ae3d77faadf38174253e9b66 category: main optional: false +- name: ruamel.yaml + version: 0.17.17 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + ruamel.yaml.clib: '>=0.1.2' + setuptools: '' + url: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml-0.17.17-py39ha09f3b3_2.conda + hash: + md5: b594c875bb95d5fdd63ce4357364ac6c + sha256: 651ff88b109d82c69c02fac80688da47d3f052e05148693d30d174ae83714f12 + category: main + optional: false - name: ruamel.yaml version: 0.17.17 manager: conda @@ -13988,6 +21470,19 @@ package: sha256: 32b7b4f13493eeff0d18de85d58d7b8c2b04234ea737b8769871067189c70d69 category: main optional: false +- name: ruamel.yaml.clib + version: 0.2.8 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml.clib-0.2.8-py39ha09f3b3_0.conda + hash: + md5: 835c656934865805c0b02dbff74fe5b7 + sha256: cd879e616da91e627297a6816955d59ea544c1111a0ce128e7fa2e86ab61680f + category: main + optional: false - name: ruamel.yaml.clib version: 0.2.8 manager: conda @@ -14015,33 +21510,48 @@ package: category: main optional: false - name: s3fs - version: 2024.2.0 + version: 2024.3.1 manager: conda platform: linux-64 dependencies: aiobotocore: '>=2.5.4,<3.0.0' aiohttp: '' - fsspec: 2024.2.0 + fsspec: 2024.3.1 python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/s3fs-2024.2.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/s3fs-2024.3.1-pyhd8ed1ab_0.conda hash: - md5: a0d35978a4caf8b78957dac03e2bc039 - sha256: b67e93d4584b26e7cb6f98e7415daf72d531ca854fdc0d0fe2d5e281fad8ec28 + md5: 09003467a61e115c4652f8b1ffa7ccbb + sha256: a893cf822ca952cacb89ffa3daf312a4c367056a94db942ad792dcd672940f42 category: main optional: false - name: s3fs - version: 2024.2.0 + version: 2024.3.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + aiohttp: '' + python: '>=3.8' aiobotocore: '>=2.5.4,<3.0.0' + fsspec: 2024.3.1 + url: https://conda.anaconda.org/conda-forge/noarch/s3fs-2024.3.1-pyhd8ed1ab_0.conda + hash: + md5: 09003467a61e115c4652f8b1ffa7ccbb + sha256: a893cf822ca952cacb89ffa3daf312a4c367056a94db942ad792dcd672940f42 + category: main + optional: false +- name: s3fs + version: 2024.3.1 + manager: conda + platform: osx-arm64 + dependencies: aiohttp: '' - fsspec: 2024.2.0 python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/s3fs-2024.2.0-pyhd8ed1ab_0.conda + aiobotocore: '>=2.5.4,<3.0.0' + fsspec: 2024.3.1 + url: https://conda.anaconda.org/conda-forge/noarch/s3fs-2024.3.1-pyhd8ed1ab_0.conda hash: - md5: a0d35978a4caf8b78957dac03e2bc039 - sha256: b67e93d4584b26e7cb6f98e7415daf72d531ca854fdc0d0fe2d5e281fad8ec28 + md5: 09003467a61e115c4652f8b1ffa7ccbb + sha256: a893cf822ca952cacb89ffa3daf312a4c367056a94db942ad792dcd672940f42 category: main optional: false - name: scikit-learn @@ -14064,6 +21574,25 @@ package: sha256: 72fe5a1a19a4ed66a8e0aeceee256e58c7a7b3dd9a97139c6e7b2ba73e0c9f63 category: main optional: false +- name: scikit-learn + version: 1.4.1.post1 + manager: conda + platform: osx-64 + dependencies: + joblib: '>=1.2.0' + libcxx: '>=16' + llvm-openmp: '>=17.0.6' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + scipy: '' + threadpoolctl: '>=2.0.0' + url: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.1.post1-py39hf36d3f6_0.conda + hash: + md5: 6840465b23096b25f4f2340441599b54 + sha256: 622c1d231e1d41a89021f6e2ebbcd3fdc2dc5198331ee4b05b21ff2bb504b45f + category: main + optional: false - name: scikit-learn version: 1.4.1.post1 manager: conda @@ -14094,14 +21623,34 @@ package: libgfortran-ng: '' libgfortran5: '>=12.3.0' liblapack: '>=3.9.0,<4.0a0' - libstdcxx-ng: '>=12' + libstdcxx-ng: '>=12' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda + hash: + md5: 6ab241b2023730f6b41712dc1b503afa + sha256: 8b2312d5be30bfb226e83af8e070c65df6816d0a9b179f51b9f915990bfd86ee + category: main + optional: false +- name: scipy + version: 1.12.0 + manager: conda + platform: osx-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + libcxx: '>=15' + libgfortran: 5.* + libgfortran5: '>=13.2.0' + liblapack: '>=3.9.0,<4.0a0' numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda + url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.12.0-py39h0ed1e0f_2.conda hash: - md5: 6ab241b2023730f6b41712dc1b503afa - sha256: 8b2312d5be30bfb226e83af8e070c65df6816d0a9b179f51b9f915990bfd86ee + md5: dcc2e3dd279432335b58f986d91dd9fd + sha256: 3a721490dff7c37d6e516ab3991761afa5586e3722f97a793dba538ee9cfa310 category: main optional: false - name: scipy @@ -14153,6 +21702,20 @@ package: sha256: e74d3faf51a6cc429898da0209d95b209270160f3edbf2f6d8b61a99428301cd category: main optional: false +- name: send2trash + version: 1.8.2 + manager: conda + platform: osx-64 + dependencies: + __osx: '' + pyobjc-framework-cocoa: '' + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyhd1c38e8_0.conda + hash: + md5: 2657c3de5371c571aef6678afb4aaadd + sha256: dca4022bae47618ed738ab7d45ead5202d174b741cfb98e4484acdc6e76da32a + category: main + optional: false - name: send2trash version: 1.8.2 manager: conda @@ -14179,6 +21742,18 @@ package: sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 category: main optional: false +- name: setuptools + version: 69.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + hash: + md5: da214ecd521a720a9d521c68047682dc + sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 + category: main + optional: false - name: setuptools version: 69.2.0 manager: conda @@ -14207,6 +21782,21 @@ package: sha256: 43af6c106ff55be27be3be99b7f313fa3becee9aeeb826e31257c1159416f53a category: main optional: false +- name: shapely + version: 2.0.3 + manager: conda + platform: osx-64 + dependencies: + geos: '>=3.12.1,<3.12.2.0a0' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.3-py39h19e25c1_0.conda + hash: + md5: 139065ace3542c37f2f6c2def6a7248f + sha256: ef82124eacdccc7109306fab623a130689e0e2efa65b5930aafe9de67ecdbfe3 + category: main + optional: false - name: shapely version: 2.0.3 manager: conda @@ -14222,6 +21812,42 @@ package: sha256: 2bd385c02e2ef0a9a15bf3a1e79ab40119a441d03ffa72339ac2f5c73c583eed category: main optional: false +- name: sip + version: 6.7.12 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + packaging: '' + ply: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda + hash: + md5: e667a3ab0df62c54e60e1843d2e6defb + sha256: fd50c71dc05daf9d28663d448d17f150b3eb79ae629198c73e2186b5b1e990dc + category: main + optional: false +- name: sip + version: 6.7.12 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + packaging: '' + ply: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/osx-64/sip-6.7.12-py39h110ca85_0.conda + hash: + md5: 4c3651b3e1e14064a05a3d722d1ba7cb + sha256: 0c105b599c2e9ba83692a32e14df44fe8eee0d8042550bfa6218f48d641dfbf1 + category: main + optional: false - name: six version: 1.16.0 manager: conda @@ -14234,6 +21860,18 @@ package: sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 category: main optional: false +- name: six + version: 1.16.0 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + hash: + md5: e5f25f8dbc060e9a8d912e432202afc2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + category: main + optional: false - name: six version: 1.16.0 manager: conda @@ -14268,16 +21906,35 @@ package: - name: skl2onnx version: 1.16.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + packaging: '' + protobuf: '' + python: '>=3.6' numpy: '>=1.15' - onnx: '>=1.2.1' + scipy: '>=1.0' + scikit-learn: '>=0.19' onnxconverter-common: '>=1.7.0' + onnx: '>=1.2.1' + url: https://conda.anaconda.org/conda-forge/noarch/skl2onnx-1.16.0-pyhd8ed1ab_0.conda + hash: + md5: 52a160919ba780e1971e6db6a9f91e81 + sha256: d0b120a4eed4cc29f32d115f0f49dae9ff1665f004d6aba00654e91c1f8540d7 + category: main + optional: false +- name: skl2onnx + version: 1.16.0 + manager: conda + platform: osx-arm64 + dependencies: packaging: '' protobuf: '' python: '>=3.6' - scikit-learn: '>=0.19' + numpy: '>=1.15' scipy: '>=1.0' + scikit-learn: '>=0.19' + onnxconverter-common: '>=1.7.0' + onnx: '>=1.2.1' url: https://conda.anaconda.org/conda-forge/noarch/skl2onnx-1.16.0-pyhd8ed1ab_0.conda hash: md5: 52a160919ba780e1971e6db6a9f91e81 @@ -14291,10 +21948,22 @@ package: dependencies: _openmp_mutex: '>=4.5' libgcc-ng: '>=9.4.0' - url: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.5.1-h9b69904_2.tar.bz2 + url: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.5.1-h28343ad_2.tar.bz2 + hash: + md5: a41b5f5f2ee067f55d9774815d3d42db + sha256: 17457848ad97e9e8c2ff5f56316b68284e16ed854c46460c0ba7374e880dba1f + category: main + optional: false +- name: sleef + version: 3.5.1 + manager: conda + platform: osx-64 + dependencies: + llvm-openmp: '>=12.0.1' + url: https://conda.anaconda.org/conda-forge/osx-64/sleef-3.5.1-h5412eb4_2.tar.bz2 hash: - md5: 6e016cf4c525d04a7bd038cee53ad3fd - sha256: 77d644a16f682e6d01df63fe9d25315011393498b63cf08c0e548780e46b2170 + md5: 07992f27f5407bd5fc7b69cc7b9931cc + sha256: 5e5a83b418c8c3d0885cd94428fa5cf251ffb7d245a124fcc172d7311a4d071e category: main optional: false - name: sleef @@ -14303,10 +21972,10 @@ package: platform: osx-arm64 dependencies: llvm-openmp: '>=12.0.1' - url: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.5.1-h156473d_2.tar.bz2 + url: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.5.1-he9cb808_2.tar.bz2 hash: - md5: bd159e7f04dbf79b06ed2bd37e112458 - sha256: a3d20bed697aaababfcb53ca2011486cf5e44e20855142c170fa0826df5f952c + md5: bb73bb3beec3fef3870d8cd328a39bd8 + sha256: b01163e1e97f3eada667d45196f9695e9fa1fa82cd89c35d52fc025e0af2777c category: main optional: false - name: smmap @@ -14321,6 +21990,18 @@ package: sha256: 23011cb3e064525bdb8787c75126a2e78d2344a72cd6773922006d1da1f2af16 category: main optional: false +- name: smmap + version: 5.0.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 62f26a3d1387acee31322208f0cfa3e0 + sha256: 23011cb3e064525bdb8787c75126a2e78d2344a72cd6773922006d1da1f2af16 + category: main + optional: false - name: smmap version: 5.0.0 manager: conda @@ -14346,6 +22027,18 @@ package: sha256: 02219f2382b4fe39250627dade087a4412d811936a5a445636b7260477164eac category: main optional: false +- name: snappy + version: 1.1.10 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=14.0.6' + url: https://conda.anaconda.org/conda-forge/osx-64/snappy-1.1.10-h225ccf5_0.conda + hash: + md5: 4320a8781f14cd959689b86e349f3b73 + sha256: 575915dc13152e446a84e2f88de70a14f8b6af1a870e708f9370bd4be105583b + category: main + optional: false - name: snappy version: 1.1.10 manager: conda @@ -14370,6 +22063,18 @@ package: sha256: bc12100b2d8836b93c55068b463190505b8064d0fc7d025e89f20ebf22fe6c2b category: main optional: false +- name: sniffio + version: 1.3.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + hash: + md5: 490730480d76cf9c8f8f2849719c6e2b + sha256: bc12100b2d8836b93c55068b463190505b8064d0fc7d025e89f20ebf22fe6c2b + category: main + optional: false - name: sniffio version: 1.3.1 manager: conda @@ -14394,6 +22099,18 @@ package: sha256: a0fd916633252d99efb6223b1050202841fa8d2d53dacca564b0ed77249d3228 category: main optional: false +- name: snowballstemmer + version: 2.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 4d22a9315e78c6827f806065957d566e + sha256: a0fd916633252d99efb6223b1050202841fa8d2d53dacca564b0ed77249d3228 + category: main + optional: false - name: snowballstemmer version: 2.2.0 manager: conda @@ -14439,6 +22156,38 @@ package: sha256: 58203509b4118463bb7e29ad29b96e2908e6f57efd44e38b32e57049eab0ecfc category: main optional: false +- name: snowflake-connector-python + version: 3.7.1 + manager: conda + platform: osx-64 + dependencies: + asn1crypto: '>0.24.0,<2.0.0' + certifi: '>=2017.4.17' + cffi: '>=1.9,<2.0.0' + charset-normalizer: '>=2,<4' + cryptography: '>=3.1.0,<43.0.0' + filelock: '>=3.5,<4' + idna: '>=2.5,<4' + libcxx: '>=16' + numpy: '>=1.22.4,<2.0a0' + packaging: '' + platformdirs: '>=2.6.0,<4.0.0' + pyjwt: <3.0.0 + pyopenssl: '>=16.2.0,<25.0.0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + pytz: '' + requests: <3.0.0 + sortedcontainers: '>=2.4.0' + tomlkit: '' + typing_extensions: '>=4.3,<5' + urllib3: '>=1.21.1,<2' + url: https://conda.anaconda.org/conda-forge/osx-64/snowflake-connector-python-3.7.1-py39haf03413_2.conda + hash: + md5: 0aaa98c22a1a8c0b4744bcf6616bdfb4 + sha256: 3540360351e3b37671b7c30118c0d599390d73b8187d691fccba0ef6fd57825d + category: main + optional: false - name: snowflake-connector-python version: 3.7.1 manager: conda @@ -14483,6 +22232,18 @@ package: sha256: 0cea408397d50c2afb2d25e987ebac4546ae11e549d65b1403d80dc368dfaaa6 category: main optional: false +- name: sortedcontainers + version: 2.4.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 6d6552722448103793743dabfbda532d + sha256: 0cea408397d50c2afb2d25e987ebac4546ae11e549d65b1403d80dc368dfaaa6 + category: main + optional: false - name: sortedcontainers version: 2.4.0 manager: conda @@ -14507,6 +22268,18 @@ package: sha256: 54ae221033db8fbcd4998ccb07f3c3828b4d77e73b0c72b18c1d6a507059059c category: main optional: false +- name: soupsieve + version: '2.5' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda + hash: + md5: 3f144b2c34f8cb5a9abd9ed23a39c561 + sha256: 54ae221033db8fbcd4998ccb07f3c3828b4d77e73b0c72b18c1d6a507059059c + category: main + optional: false - name: soupsieve version: '2.5' manager: conda @@ -14551,26 +22324,55 @@ package: - name: sphinx version: 4.5.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + packaging: '' + sphinxcontrib-jsmath: '' + sphinxcontrib-applehelp: '' + sphinxcontrib-devhelp: '' + sphinxcontrib-qthelp: '' + imagesize: '' + python: '>=3.6' + importlib-metadata: '>=4.4' + pygments: '>=2.0' alabaster: '>=0.7,<0.8' + requests: '>=2.5.0' + jinja2: '>=2.3' + snowballstemmer: '>=1.1' babel: '>=1.3' + sphinxcontrib-htmlhelp: '>=2.0.0' + sphinxcontrib-serializinghtml: '>=1.1.5' colorama: '>=0.3.5' docutils: '>=0.14,<0.18' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2 + hash: + md5: 46b38d88c4270ff9ba78a89c83c66345 + sha256: 2fe70d936cc969e20f07a7df64438587261f187d4f08e1c0f412cdd1d632730c + category: main + optional: false +- name: sphinx + version: 4.5.0 + manager: conda + platform: osx-arm64 + dependencies: + packaging: '' + sphinxcontrib-jsmath: '' + sphinxcontrib-applehelp: '' + sphinxcontrib-devhelp: '' + sphinxcontrib-qthelp: '' imagesize: '' + python: '>=3.6' importlib-metadata: '>=4.4' - jinja2: '>=2.3' - packaging: '' pygments: '>=2.0' - python: '>=3.6' + alabaster: '>=0.7,<0.8' requests: '>=2.5.0' + jinja2: '>=2.3' snowballstemmer: '>=1.1' - sphinxcontrib-applehelp: '' - sphinxcontrib-devhelp: '' + babel: '>=1.3' sphinxcontrib-htmlhelp: '>=2.0.0' - sphinxcontrib-jsmath: '' - sphinxcontrib-qthelp: '' sphinxcontrib-serializinghtml: '>=1.1.5' + colorama: '>=0.3.5' + docutils: '>=0.14,<0.18' url: https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2 hash: md5: 46b38d88c4270ff9ba78a89c83c66345 @@ -14586,10 +22388,29 @@ package: jinja2: '' python: '>=3.6' pyyaml: '' - sphinx: '>=3.0' + sphinx: '>=3.0' + sphinxcontrib-dotnetdomain: '' + sphinxcontrib-golangdomain: '' + unidecode: '' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-2.1.0-pyhd8ed1ab_0.conda + hash: + md5: 6cb2b182390f837ce98737e92b9461f7 + sha256: 07f4a813627c3b4f4e1175366b58574d886f14ea94df855c3c69cb0676d004e4 + category: main + optional: false +- name: sphinx-autoapi + version: 2.1.0 + manager: conda + platform: osx-64 + dependencies: + pyyaml: '' + jinja2: '' + unidecode: '' sphinxcontrib-dotnetdomain: '' sphinxcontrib-golangdomain: '' - unidecode: '' + python: '>=3.6' + sphinx: '>=3.0' + astroid: '>=2.7' url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-2.1.0-pyhd8ed1ab_0.conda hash: md5: 6cb2b182390f837ce98737e92b9461f7 @@ -14601,14 +22422,14 @@ package: manager: conda platform: osx-arm64 dependencies: - astroid: '>=2.7' - jinja2: '' - python: '>=3.6' pyyaml: '' - sphinx: '>=3.0' + jinja2: '' + unidecode: '' sphinxcontrib-dotnetdomain: '' sphinxcontrib-golangdomain: '' - unidecode: '' + python: '>=3.6' + sphinx: '>=3.0' + astroid: '>=2.7' url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-2.1.0-pyhd8ed1ab_0.conda hash: md5: 6cb2b182390f837ce98737e92b9461f7 @@ -14628,6 +22449,19 @@ package: sha256: 3c7a6a8bb6c9921741ef940cd61ff1694beac3c95ca7e9ad4b0ea32e2f6ac2fa category: main optional: false +- name: sphinx-basic-ng + version: 1.0.0b2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + sphinx: '>=4.0,<8.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_1.conda + hash: + md5: a631f5c7b7f5045448f966ad71aa2881 + sha256: 3c7a6a8bb6c9921741ef940cd61ff1694beac3c95ca7e9ad4b0ea32e2f6ac2fa + category: main + optional: false - name: sphinx-basic-ng version: 1.0.0b2 manager: conda @@ -14658,10 +22492,24 @@ package: - name: sphinx-click version: 5.1.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.6' click: '>=6.0' + sphinx: '>=2.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-5.1.0-pyhd8ed1ab_0.conda + hash: + md5: 3d7a8ef24d20f30ed2ce7468b8ae5c89 + sha256: 1ad63a6f1dc72cc10ee67217cdfc64f6f8c0a827a1afa0c89d0e6306762945bd + category: main + optional: false +- name: sphinx-click + version: 5.1.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.6' + click: '>=6.0' sphinx: '>=2.0' url: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-5.1.0-pyhd8ed1ab_0.conda hash: @@ -14682,6 +22530,19 @@ package: sha256: 7ea21f009792e7c69612ddba367afe0412b3fdff2e92f439e8cd222de4b40bfe category: main optional: false +- name: sphinx-copybutton + version: 0.5.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3' + sphinx: '>=1.8' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda + hash: + md5: ac832cc43adc79118cf6e23f1f9b8995 + sha256: 7ea21f009792e7c69612ddba367afe0412b3fdff2e92f439e8cd222de4b40bfe + category: main + optional: false - name: sphinx-copybutton version: 0.5.2 manager: conda @@ -14709,6 +22570,20 @@ package: sha256: 142f45bb224380f13f800ae3769f0d2aa3efcd9c49e5389b48863d03c08a801a category: main optional: false +- name: sphinx-inline-tabs + version: 2023.4.21 + manager: conda + platform: osx-64 + dependencies: + beautifulsoup4: '' + python: '>=3.6' + sphinx: '>3' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-inline-tabs-2023.4.21-pyhd8ed1ab_0.conda + hash: + md5: 4addb035e43d09440597352079305513 + sha256: 142f45bb224380f13f800ae3769f0d2aa3efcd9c49e5389b48863d03c08a801a + category: main + optional: false - name: sphinx-inline-tabs version: 2023.4.21 manager: conda @@ -14736,6 +22611,19 @@ package: sha256: 9d98392bff12194c45c6f13c6c93d0b15b2fe489de5746654e732009fce41a86 category: main optional: false +- name: sphinx-issues + version: 1.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '' + sphinx: '' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-issues-1.2.0-py_0.tar.bz2 + hash: + md5: 2d5c0dddca9bb724dcf5a3fb295a2266 + sha256: 9d98392bff12194c45c6f13c6c93d0b15b2fe489de5746654e732009fce41a86 + category: main + optional: false - name: sphinx-issues version: 1.2.0 manager: conda @@ -14763,6 +22651,20 @@ package: sha256: c6043ff3f25905453f5c11d1620a4bc118a87a3eda02a3041f4ef98d8e6e6389 category: main optional: false +- name: sphinx-panels + version: 0.6.0 + manager: conda + platform: osx-64 + dependencies: + docutils: '' + python: '>=3.6' + sphinx: '>=2,<5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-panels-0.6.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 6eec6480601f5d15babf9c3b3987f34a + sha256: c6043ff3f25905453f5c11d1620a4bc118a87a3eda02a3041f4ef98d8e6e6389 + category: main + optional: false - name: sphinx-panels version: 0.6.0 manager: conda @@ -14794,11 +22696,25 @@ package: - name: sphinx-prompt version: 1.4.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: pygments: '' + sphinx: '' python: '>=3.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 88ee91e8679603f2a5bd036d52919cc2 + sha256: 3690b4b70322adc77f18c2b31545ddbbe69f1627de76ea9deace8c9809550bab + category: main + optional: false +- name: sphinx-prompt + version: 1.4.0 + manager: conda + platform: osx-arm64 + dependencies: + pygments: '' sphinx: '' + python: '>=3.0' url: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 hash: md5: 88ee91e8679603f2a5bd036d52919cc2 @@ -14823,12 +22739,27 @@ package: - name: sphinx-tabs version: 3.4.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + pygments: '' + python: '>=3.6' + sphinx: '>=2,<5' docutils: '>=0.16.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: b04565a0bfac26170025770fe3256dcd + sha256: 79228ab583277a527456786f2060211bfed2647259b960566af1718d44dae2aa + category: main + optional: false +- name: sphinx-tabs + version: 3.4.1 + manager: conda + platform: osx-arm64 + dependencies: pygments: '' python: '>=3.6' sphinx: '>=2,<5' + docutils: '>=0.16.0' url: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_0.tar.bz2 hash: md5: b04565a0bfac26170025770fe3256dcd @@ -14849,6 +22780,20 @@ package: sha256: 16848eedb611ed28abffc1d8594d07df08659a8135c100c1131a8223b99b556d category: main optional: false +- name: sphinx-tags + version: 0.2.1 + manager: conda + platform: osx-64 + dependencies: + pre-commit: '' + python: '>=3.6' + sphinx: '>4' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-tags-0.2.1-pyhd8ed1ab_0.conda + hash: + md5: 690eb6bc03d9154ac1e679d7c861b845 + sha256: 16848eedb611ed28abffc1d8594d07df08659a8135c100c1131a8223b99b556d + category: main + optional: false - name: sphinx-tags version: 0.2.1 manager: conda @@ -14876,6 +22821,19 @@ package: sha256: 2125421eada1cbafdc5e0058e07a417f7f6c938b447eb63e80fbe8403e7235e5 category: main optional: false +- name: sphinx_fontawesome + version: 0.0.6 + manager: conda + platform: osx-64 + dependencies: + python: '' + sphinx: '>=1.5.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx_fontawesome-0.0.6-pyh8c360ce_0.tar.bz2 + hash: + md5: fc037d1b4a799959b8770375e6458bfd + sha256: 2125421eada1cbafdc5e0058e07a417f7f6c938b447eb63e80fbe8403e7235e5 + category: main + optional: false - name: sphinx_fontawesome version: 0.0.6 manager: conda @@ -14901,6 +22859,18 @@ package: sha256: 802810d8321d55e5666806d565e72949eabf77ad510fe2758ce1da2441675ef1 category: main optional: false +- name: sphinxcontrib-applehelp + version: 1.0.4 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda + hash: + md5: 5a31a7d564f551d0e6dff52fd8cb5b16 + sha256: 802810d8321d55e5666806d565e72949eabf77ad510fe2758ce1da2441675ef1 + category: main + optional: false - name: sphinxcontrib-applehelp version: 1.0.4 manager: conda @@ -14925,6 +22895,18 @@ package: sha256: 66cca7eccb7f92eee53f9f5a552e3e1d643daa3a1ebd03c185e2819e5c491576 category: main optional: false +- name: sphinxcontrib-devhelp + version: 1.0.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2 + hash: + md5: 68e01cac9d38d0e717cd5c87bc3d2cc9 + sha256: 66cca7eccb7f92eee53f9f5a552e3e1d643daa3a1ebd03c185e2819e5c491576 + category: main + optional: false - name: sphinxcontrib-devhelp version: 1.0.2 manager: conda @@ -14950,6 +22932,19 @@ package: sha256: bcec8d02205dc27bc399e42513d204f8557b8b06a9546ed784c283086850211c category: main optional: false +- name: sphinxcontrib-dotnetdomain + version: '0.4' + manager: conda + platform: osx-64 + dependencies: + python: '' + sphinx: '>=0.6' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-dotnetdomain-0.4-py_0.tar.bz2 + hash: + md5: fb61a7369f505b4bb98e1530c3e09f9f + sha256: bcec8d02205dc27bc399e42513d204f8557b8b06a9546ed784c283086850211c + category: main + optional: false - name: sphinxcontrib-dotnetdomain version: '0.4' manager: conda @@ -14976,6 +22971,19 @@ package: sha256: 1610ab148559364b6927e481f5c97f31c8130ffcca2dc16d1c4b33c281e408d6 category: main optional: false +- name: sphinxcontrib-golangdomain + version: 0.2.0.dev0 + manager: conda + platform: osx-64 + dependencies: + python: '' + sphinx: '>=1.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-golangdomain-0.2.0.dev0-py_0.tar.bz2 + hash: + md5: d1a73c192888d08cedec232602c22f32 + sha256: 1610ab148559364b6927e481f5c97f31c8130ffcca2dc16d1c4b33c281e408d6 + category: main + optional: false - name: sphinxcontrib-golangdomain version: 0.2.0.dev0 manager: conda @@ -15001,6 +23009,18 @@ package: sha256: aeff20be994e6f9520a91fc177a33cb3e4d0911cdf8d27e575d001f00afa33fd category: main optional: false +- name: sphinxcontrib-htmlhelp + version: 2.0.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda + hash: + md5: 6c8c4d6eb2325e59290ac6dbbeacd5f0 + sha256: aeff20be994e6f9520a91fc177a33cb3e4d0911cdf8d27e575d001f00afa33fd + category: main + optional: false - name: sphinxcontrib-htmlhelp version: 2.0.1 manager: conda @@ -15025,6 +23045,18 @@ package: sha256: d4337d83b8edba688547766fc80f1ac86d6ec86ceeeda93f376acc04079c5ce2 category: main optional: false +- name: sphinxcontrib-jsmath + version: 1.0.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda + hash: + md5: da1d979339e2714c30a8e806a33ec087 + sha256: d4337d83b8edba688547766fc80f1ac86d6ec86ceeeda93f376acc04079c5ce2 + category: main + optional: false - name: sphinxcontrib-jsmath version: 1.0.1 manager: conda @@ -15054,11 +23086,25 @@ package: - name: sphinxcontrib-mermaid version: 0.9.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + sphinx: '' docutils: '' python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-0.9.2-pyhd8ed1ab_0.conda + hash: + md5: 54a6a75e5b3989f1d925d8e5674bbbcb + sha256: bb02467bb3569406d978112f299e8d8b0832cc495b8bbd5d591858ddbe3a291d + category: main + optional: false +- name: sphinxcontrib-mermaid + version: 0.9.2 + manager: conda + platform: osx-arm64 + dependencies: sphinx: '' + docutils: '' + python: '>=3.7' url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-0.9.2-pyhd8ed1ab_0.conda hash: md5: 54a6a75e5b3989f1d925d8e5674bbbcb @@ -15080,19 +23126,43 @@ package: - name: sphinxcontrib-qthelp version: 1.0.3 manager: conda - platform: osx-arm64 + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2 + hash: + md5: d01180388e6d1838c3e1ad029590aa7a + sha256: 35d8f01fc798d38b72ae003c040d2dee650d315f904268a1f793d4d59460d1e2 + category: main + optional: false +- name: sphinxcontrib-qthelp + version: 1.0.3 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2 + hash: + md5: d01180388e6d1838c3e1ad029590aa7a + sha256: 35d8f01fc798d38b72ae003c040d2dee650d315f904268a1f793d4d59460d1e2 + category: main + optional: false +- name: sphinxcontrib-serializinghtml + version: 1.1.5 + manager: conda + platform: linux-64 dependencies: python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2 hash: - md5: d01180388e6d1838c3e1ad029590aa7a - sha256: 35d8f01fc798d38b72ae003c040d2dee650d315f904268a1f793d4d59460d1e2 + md5: 9ff55a0901cf952f05c654394de76bf7 + sha256: 890bbf815cff114ddbb618b9876d492fce07d02956c1d7b3d46cb7f835f563f6 category: main optional: false - name: sphinxcontrib-serializinghtml version: 1.1.5 manager: conda - platform: linux-64 + platform: osx-64 dependencies: python: '>=3.5' url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2 @@ -15130,10 +23200,24 @@ package: - name: sphinxcontrib-youtube version: 1.2.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + requests: '' python: '>=3.6' + sphinx: '>=0.6' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-youtube-1.2.0-pyhd8ed1ab_0.conda + hash: + md5: 08b58a79c8cc29922dd65fff31577008 + sha256: 90e8c853aa0f99ad82ae28f8289f7d56153970bd81dcc9f810ab9ec051d9365a + category: main + optional: false +- name: sphinxcontrib-youtube + version: 1.2.0 + manager: conda + platform: osx-arm64 + dependencies: requests: '' + python: '>=3.6' sphinx: '>=0.6' url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-youtube-1.2.0-pyhd8ed1ab_0.conda hash: @@ -15142,7 +23226,7 @@ package: category: main optional: false - name: sqlalchemy - version: 2.0.28 + version: 2.0.29 manager: conda platform: linux-64 dependencies: @@ -15151,14 +23235,29 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* typing-extensions: '>=4.6.0' - url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.28-py39hd1e30aa_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.29-py39hd1e30aa_0.conda + hash: + md5: 73068cb68de45fae9c27989c4d0e722f + sha256: ea79a5f0ef320f0cfd336a55cb92bcdef2abf98b83fcdbaa0afa6c5d14075875 + category: main + optional: false +- name: sqlalchemy + version: 2.0.29 + manager: conda + platform: osx-64 + dependencies: + greenlet: '!=0.4.17' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + typing-extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/osx-64/sqlalchemy-2.0.29-py39ha09f3b3_0.conda hash: - md5: 0b3b73db2d2931fa07a98e0ba1a6764b - sha256: 5f2074a4750c14134f0c35a6c7f0a731534f78ecc3dd578dc4f362ea8dc62075 + md5: bf50a33f593a504eb82637a3bb90d0bb + sha256: aed0613826da4cee04037d1308ff6366558eca271dafd10ef25506b3514bad22 category: main optional: false - name: sqlalchemy - version: 2.0.28 + version: 2.0.29 manager: conda platform: osx-arm64 dependencies: @@ -15166,10 +23265,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* typing-extensions: '>=4.6.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlalchemy-2.0.28-py39h17cfd9d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlalchemy-2.0.29-py39h17cfd9d_0.conda hash: - md5: 1b66bccb5e13f902e86255d5ce8c8e8e - sha256: 8953b2bba824a6feaad98840aaa57a3c889f4621883bd67c41595ece7b5a599e + md5: dea3032485b3fb978ecbb0feac193539 + sha256: bb86774008fbedec67b4ad726c5f66cfe84173053b71b10486d826ce9fb828d7 category: main optional: false - name: sqlite @@ -15188,6 +23287,21 @@ package: sha256: 22d2692c82b73480c9adc80472bfb241262586edaf1dac1a7504434e47185d3c category: main optional: false +- name: sqlite + version: 3.45.2 + manager: conda + platform: osx-64 + dependencies: + libsqlite: 3.45.2 + libzlib: '>=1.2.13,<1.3.0a0' + ncurses: '>=6.4,<7.0a0' + readline: '>=8.2,<9.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.45.2-h7461747_0.conda + hash: + md5: fc4dae09f6b38084f3bfc87c77032584 + sha256: c9c1b7d6025d5efa74f4ddbda1ae72a721f041ad3d4a6ec3dda600befe9dffaa + category: main + optional: false - name: sqlite version: 3.45.2 manager: conda @@ -15215,6 +23329,18 @@ package: sha256: 7972c9b15dafa1885f3d4cd22dc4edea4cd969d12739fb71f8632f2c3350706a category: main optional: false +- name: sqlparse + version: 0.4.4 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.4.4-pyhd8ed1ab_0.conda + hash: + md5: 2e2f31b3b1c866c29636377e14f8c4c6 + sha256: 7972c9b15dafa1885f3d4cd22dc4edea4cd969d12739fb71f8632f2c3350706a + category: main + optional: false - name: sqlparse version: 0.4.4 manager: conda @@ -15242,6 +23368,21 @@ package: sha256: a58433e75229bec39f3be50c02efbe9b7083e53a1f31d8ee247564f370191eec category: main optional: false +- name: stack_data + version: 0.6.2 + manager: conda + platform: osx-64 + dependencies: + asttokens: '' + executing: '' + pure_eval: '' + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda + hash: + md5: e7df0fdd404616638df5ece6e69ba7af + sha256: a58433e75229bec39f3be50c02efbe9b7083e53a1f31d8ee247564f370191eec + category: main + optional: false - name: stack_data version: 0.6.2 manager: conda @@ -15269,6 +23410,18 @@ package: sha256: 3553501b2981764bdd650d83a8d03886e9ffcbe7930327e5d2043322953da8ca category: main optional: false +- name: statsd + version: 3.3.0 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/statsd-3.3.0-py_0.tar.bz2 + hash: + md5: 8f5c03d5657905e6c70c3e6e522bfb4e + sha256: 3553501b2981764bdd650d83a8d03886e9ffcbe7930327e5d2043322953da8ca + category: main + optional: false - name: statsd version: 3.3.0 manager: conda @@ -15293,6 +23446,18 @@ package: sha256: ebd515c57537799ee7829055fe9aa93d1c4695334b991fe1de9d7947f53f18f2 category: main optional: false +- name: stringcase + version: 1.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/stringcase-1.2.0-py_0.tar.bz2 + hash: + md5: 26a9caf3173939377bac7152379daac0 + sha256: ebd515c57537799ee7829055fe9aa93d1c4695334b991fe1de9d7947f53f18f2 + category: main + optional: false - name: stringcase version: 1.2.0 manager: conda @@ -15323,12 +23488,27 @@ package: - name: sympy version: '1.12' manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: __unix: '' + python: '*' + mpmath: '>=0.19' gmpy2: '>=2.0.8' + url: https://conda.anaconda.org/conda-forge/noarch/sympy-1.12-pypyh9d50eac_103.conda + hash: + md5: 2f7d6347d7acf6edf1ac7f2189f44c8f + sha256: 0025dd4e6411423903bf478d1b9fbff0cbbbe546f51c9375dfd6729ef2e1a1ac + category: main + optional: false +- name: sympy + version: '1.12' + manager: conda + platform: osx-arm64 + dependencies: + __unix: '' + python: '*' mpmath: '>=0.19' - python: '>=3.8' + gmpy2: '>=2.0.8' url: https://conda.anaconda.org/conda-forge/noarch/sympy-1.12-pypyh9d50eac_103.conda hash: md5: 2f7d6347d7acf6edf1ac7f2189f44c8f @@ -15347,6 +23527,18 @@ package: sha256: f6e4a0dd24ba060a4af69ca79d32361a6678e61d78c73eb5e357909b025b4620 category: main optional: false +- name: tabulate + version: 0.9.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2 + hash: + md5: 4759805cce2d914c38472f70bf4d8bcb + sha256: f6e4a0dd24ba060a4af69ca79d32361a6678e61d78c73eb5e357909b025b4620 + category: main + optional: false - name: tabulate version: 0.9.0 manager: conda @@ -15373,6 +23565,19 @@ package: sha256: ded4de0d5a3eb7b47ed829f0ed0e3c61ccd428308bde52d8d22ced228038223b category: main optional: false +- name: tbb + version: 2021.11.0 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15' + libhwloc: '>=2.9.3,<2.9.4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/tbb-2021.11.0-h7728843_1.conda + hash: + md5: 29e29beba9deb0ef66bee015c5bf3c14 + sha256: 6d531daba5ccf150b58d434fa72b1da0da04e8f14ab71bdad289a90d355f47e8 + category: main + optional: false - name: tblib version: 3.0.0 manager: conda @@ -15385,6 +23590,18 @@ package: sha256: 2e2c255b6f24a6d75b9938cb184520e27db697db2c24f04e18342443ae847c0a category: main optional: false +- name: tblib + version: 3.0.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda + hash: + md5: 04eedddeb68ad39871c8127dd1c21f4f + sha256: 2e2c255b6f24a6d75b9938cb184520e27db697db2c24f04e18342443ae847c0a + category: main + optional: false - name: tblib version: 3.0.0 manager: conda @@ -15409,6 +23626,18 @@ package: sha256: 860c11e7369d6a86fcc9c6cbca49d5c457f6c0a27faeacca4d46267f9dd10d78 category: main optional: false +- name: tenacity + version: 8.2.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tenacity-8.2.3-pyhd8ed1ab_0.conda + hash: + md5: 1482e77f87c6a702a7e05ef22c9b197b + sha256: 860c11e7369d6a86fcc9c6cbca49d5c457f6c0a27faeacca4d46267f9dd10d78 + category: main + optional: false - name: tenacity version: 8.2.3 manager: conda @@ -15448,21 +23677,45 @@ package: - name: tensorboard version: 2.15.2 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' + six: '>=1.9' + numpy: '>=1.12.0' + setuptools: '>=41.0.0' + markdown: '>=2.6.8' absl-py: '>=0.4' + requests: '>=2.21.0,<3' + werkzeug: '>=1.0.1' google-auth: '>=1.6.3,<3' - google-auth-oauthlib: '>=0.5,<2' - grpcio: '>=1.48.2' - markdown: '>=2.6.8' - numpy: '>=1.12.0' protobuf: '>=3.19.6' + grpcio: '>=1.48.2' + tensorboard-data-server: '>=0.7.0,<0.8.0' + google-auth-oauthlib: '>=0.5,<2' + url: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.15.2-pyhd8ed1ab_0.conda + hash: + md5: be92712a3adb1f9371551a72c5881cd9 + sha256: 37c9ecd571c227f3c062d8d38c9e0b6c6454cb4533f498be5cf991a9cd370b99 + category: main + optional: false +- name: tensorboard + version: 2.15.2 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' - requests: '>=2.21.0,<3' - setuptools: '>=41.0.0' six: '>=1.9' - tensorboard-data-server: '>=0.7.0,<0.8.0' + numpy: '>=1.12.0' + setuptools: '>=41.0.0' + markdown: '>=2.6.8' + absl-py: '>=0.4' + requests: '>=2.21.0,<3' werkzeug: '>=1.0.1' + google-auth: '>=1.6.3,<3' + protobuf: '>=3.19.6' + grpcio: '>=1.48.2' + tensorboard-data-server: '>=0.7.0,<0.8.0' + google-auth-oauthlib: '>=0.5,<2' url: https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.15.2-pyhd8ed1ab_0.conda hash: md5: be92712a3adb1f9371551a72c5881cd9 @@ -15484,6 +23737,20 @@ package: sha256: 0389876d33062d7859a8078e6658569ea5df7a06206852c8dd02314e0db170b5 category: main optional: false +- name: tensorboard-data-server + version: 0.7.0 + manager: conda + platform: osx-64 + dependencies: + openssl: '>=3.1.3,<4.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/tensorboard-data-server-0.7.0-py39he8b0a07_1.conda + hash: + md5: d4d0a09da91604f5a8b3f66bc5d7193e + sha256: 5d06949defa921353a97701ff669b4e55c77e31855dfe910be7debe9c03fd937 + category: main + optional: false - name: tensorboard-data-server version: 0.7.0 manager: conda @@ -15513,6 +23780,21 @@ package: sha256: d2f7f80ea6ce4c2d0ec992c6fea57cf2bdd111d6065cb01ac5d53542d5248c1a category: main optional: false +- name: tensorflow + version: 2.15.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + tensorflow-base: 2.15.0 + tensorflow-estimator: 2.15.0 + url: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-2.15.0-cpu_py39hb71d5be_2.conda + hash: + md5: 08060f56b168740ecddb503f5d201be3 + sha256: dae7d7e16aa3abfaef27360751bbfa451f8216249b6fd6c322becbc945b073ac + category: main + optional: false - name: tensorflow version: 2.15.0 manager: conda @@ -15531,8 +23813,55 @@ package: - name: tensorflow-base version: 2.15.0 manager: conda - platform: linux-64 + platform: linux-64 + dependencies: + absl-py: '>=1.0.0' + astunparse: '>=1.6.0' + flatbuffers: '>=23.5.26,<23.5.27.0a0' + gast: '>=0.2.1,!=0.5.0,!=0.5.1,!=0.5.2' + giflib: '>=5.2.1,<5.3.0a0' + google-pasta: '>=0.1.1' + grpcio: 1.59.* + h5py: '>=2.9.0' + icu: '>=73.2,<74.0a0' + keras: '>=2.15,<2.16' + libabseil: '>=20230802.1,<20230803.0a0' + libcurl: '>=8.5.0,<9.0a0' + libgcc-ng: '>=12' + libgrpc: '>=1.59.3,<1.60.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libsqlite: '>=3.44.2,<4.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + ml_dtypes: 0.2.0.* + numpy: '>=1.22.4,<2.0a0' + openssl: '>=3.2.0,<4.0a0' + opt_einsum: '>=2.3.2' + packaging: '' + protobuf: '>=3.20.3,<5,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5' + python: '>=3.9,<3.10.0a0' + python-flatbuffers: '>=23.5.26' + python_abi: 3.9.* + six: '>=1.12' + snappy: '>=1.1.10,<2.0a0' + tensorboard: '>=2.15,<2.16' + termcolor: '>=1.1.0' + typing_extensions: '>=3.6.6' + wrapt: '>=1.11.0,<1.15' + url: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.15.0-cpu_py39he1df281_2.conda + hash: + md5: 973044417623cce843b3f8068a7f2b93 + sha256: 897a6f9602aee8daf0e645dc697ad5aacca61ef5a2f02c53b6a66fd5a30db476 + category: main + optional: false +- name: tensorflow-base + version: 2.15.0 + manager: conda + platform: osx-64 dependencies: + __osx: '>=10.13' absl-py: '>=1.0.0' astunparse: '>=1.6.0' flatbuffers: '>=23.5.26,<23.5.27.0a0' @@ -15545,13 +23874,12 @@ package: keras: '>=2.15,<2.16' libabseil: '>=20230802.1,<20230803.0a0' libcurl: '>=8.5.0,<9.0a0' - libgcc-ng: '>=12' + libcxx: '>=15' libgrpc: '>=1.59.3,<1.60.0a0' libjpeg-turbo: '>=3.0.0,<4.0a0' libpng: '>=1.6.39,<1.7.0a0' libprotobuf: '>=4.24.4,<4.24.5.0a0' libsqlite: '>=3.44.2,<4.0a0' - libstdcxx-ng: '>=12' libzlib: '>=1.2.13,<1.3.0a0' ml_dtypes: 0.2.0.* numpy: '>=1.22.4,<2.0a0' @@ -15568,10 +23896,10 @@ package: termcolor: '>=1.1.0' typing_extensions: '>=3.6.6' wrapt: '>=1.11.0,<1.15' - url: https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.15.0-cpu_py39he1df281_2.conda + url: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-base-2.15.0-cpu_py39h1d1916d_2.conda hash: - md5: 973044417623cce843b3f8068a7f2b93 - sha256: 897a6f9602aee8daf0e645dc697ad5aacca61ef5a2f02c53b6a66fd5a30db476 + md5: 53be17bb1d7a3ec1bddf9ffbb87190c2 + sha256: 5b76b8dd404bfaac01f2a2819f0101e5110d8a94f300eb92fe4c177d57e69273 category: main optional: false - name: tensorflow-base @@ -15636,6 +23964,22 @@ package: sha256: a26851fa3a4c96901b134c10b5804666ecf7d4c67151058358f806a634f5a5bf category: main optional: false +- name: tensorflow-estimator + version: 2.15.0 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15' + openssl: '>=3.2.0,<4.0a0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + tensorflow-base: 2.15.0 + url: https://conda.anaconda.org/conda-forge/osx-64/tensorflow-estimator-2.15.0-cpu_py39h805f699_2.conda + hash: + md5: 9c4d4faafcd4f7562b8a704a3a620e2a + sha256: ef2376d6eb860f7b81d37a5ada4c8d13ac92d57e46bffec10f95c3587f79bd6f + category: main + optional: false - name: tensorflow-estimator version: 2.15.0 manager: conda @@ -15664,6 +24008,18 @@ package: sha256: 59588d41f2c02d599fd6528583013d85bd47d17b1acec11edbb29deadd81fbca category: main optional: false +- name: termcolor + version: 2.4.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/termcolor-2.4.0-pyhd8ed1ab_0.conda + hash: + md5: a5033708ad9283907c3b1bc1f90d0d0d + sha256: 59588d41f2c02d599fd6528583013d85bd47d17b1acec11edbb29deadd81fbca + category: main + optional: false - name: termcolor version: 2.4.0 manager: conda @@ -15691,6 +24047,21 @@ package: sha256: b300557c0382478cf661ddb520263508e4b3b5871b471410450ef2846e8c352c category: main optional: false +- name: terminado + version: 0.18.1 + manager: conda + platform: osx-64 + dependencies: + __osx: '' + ptyprocess: '' + python: '>=3.8' + tornado: '>=6.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh31c8845_0.conda + hash: + md5: 00b54981b923f5aefcd5e8547de056d5 + sha256: 4daae56fc8da17784578fbdd064f17e3b3076b394730a14119e571707568dc8a + category: main + optional: false - name: terminado version: 0.18.1 manager: conda @@ -15718,6 +24089,18 @@ package: sha256: db64669a918dec8c744f80a85b9c82216b79298256c7c8bd19bdba54a02f8914 category: main optional: false +- name: text-unidecode + version: '1.3' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.4' + url: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_1.conda + hash: + md5: ba8aba332d8868897ce44ad74015a7fe + sha256: db64669a918dec8c744f80a85b9c82216b79298256c7c8bd19bdba54a02f8914 + category: main + optional: false - name: text-unidecode version: '1.3' manager: conda @@ -15742,6 +24125,18 @@ package: sha256: d7b40d3a3f1c2e74bbea5ee845b34a30abc1ae8e4f2a92f4a58800e1e669c076 category: main optional: false +- name: textwrap3 + version: 0.9.2 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/textwrap3-0.9.2-py_0.tar.bz2 + hash: + md5: 1f84e74e9dbe2e5ae38c58496bffaca8 + sha256: d7b40d3a3f1c2e74bbea5ee845b34a30abc1ae8e4f2a92f4a58800e1e669c076 + category: main + optional: false - name: textwrap3 version: 0.9.2 manager: conda @@ -15775,15 +24170,33 @@ package: - name: tf2onnx version: 1.16.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: - numpy: '>=1.14.1' - onnx: '>=1.4.1' + requests: '' + six: '' python: '>=3.8' + numpy: '>=1.14.1' + tensorflow: '>=2.6' python-flatbuffers: '>=1.12' + onnx: '>=1.4.1' + url: https://conda.anaconda.org/conda-forge/noarch/tf2onnx-1.16.1-pyhd8ed1ab_0.conda + hash: + md5: 3882e49e3d01c69231a7e48d09ca0ec6 + sha256: 17b0ed248ed0a5ac822ed6a4fa55b122c7c4ab01e069d4dacec5606f6d655233 + category: main + optional: false +- name: tf2onnx + version: 1.16.1 + manager: conda + platform: osx-arm64 + dependencies: requests: '' six: '' + python: '>=3.8' + numpy: '>=1.14.1' tensorflow: '>=2.6' + python-flatbuffers: '>=1.12' + onnx: '>=1.4.1' url: https://conda.anaconda.org/conda-forge/noarch/tf2onnx-1.16.1-pyhd8ed1ab_0.conda hash: md5: 3882e49e3d01c69231a7e48d09ca0ec6 @@ -15791,27 +24204,39 @@ package: category: main optional: false - name: threadpoolctl - version: 3.3.0 + version: 3.4.0 manager: conda platform: linux-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.3.0-pyhc1e730c_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.4.0-pyhc1e730c_0.conda hash: - md5: 698d2d2b621640bddb9191f132967c9f - sha256: 5ba8bd3f2d49b3b860eb4481ca9505c57d4427212eb12cadd2b351309d5c28e6 + md5: b296278eef667c673bf51de6535bad88 + sha256: 4f4ad4f2a4ee8875cf2cb9c80abf4c7383e5e53cfec41104da7058569d9063b7 category: main optional: false - name: threadpoolctl - version: 3.3.0 + version: 3.4.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.4.0-pyhc1e730c_0.conda + hash: + md5: b296278eef667c673bf51de6535bad88 + sha256: 4f4ad4f2a4ee8875cf2cb9c80abf4c7383e5e53cfec41104da7058569d9063b7 + category: main + optional: false +- name: threadpoolctl + version: 3.4.0 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.3.0-pyhc1e730c_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.4.0-pyhc1e730c_0.conda hash: - md5: 698d2d2b621640bddb9191f132967c9f - sha256: 5ba8bd3f2d49b3b860eb4481ca9505c57d4427212eb12cadd2b351309d5c28e6 + md5: b296278eef667c673bf51de6535bad88 + sha256: 4f4ad4f2a4ee8875cf2cb9c80abf4c7383e5e53cfec41104da7058569d9063b7 category: main optional: false - name: tiledb @@ -15839,6 +24264,31 @@ package: sha256: abc460ddf0205dfbeb987678ca882fedcf152d91fbfe7acba2a46c10a306d9cd category: main optional: false +- name: tiledb + version: 2.20.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.13' + azure-core-cpp: '>=1.10.3,<1.10.4.0a0' + azure-storage-blobs-cpp: '>=12.10.0,<12.10.1.0a0' + azure-storage-common-cpp: '>=12.5.0,<12.5.1.0a0' + bzip2: '>=1.0.8,<2.0a0' + libabseil: '>=20230802.1,<20230803.0a0' + libcurl: '>=8.5.0,<9.0a0' + libcxx: '>=16' + libgoogle-cloud: '>=2.12.0,<2.13.0a0' + libxml2: '>=2.12.5,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + openssl: '>=3.2.1,<4.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/tiledb-2.20.0-h8fd0293_0.conda + hash: + md5: 6585a0f5ff3f277826a392e1a5ab0ee6 + sha256: 6d1d383dcd6722f99ce26d4e042eb1ea69da4d62256f29b9318d3849d56a359c + category: main + optional: false - name: tiledb version: 2.20.0 manager: conda @@ -15876,6 +24326,19 @@ package: sha256: f0db1a2298a5e10e30f4b947566c7229442834702f549dded40a73ecdea7502d category: main optional: false +- name: tinycss2 + version: 1.2.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + webencodings: '>=0.4' + url: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 7234c9eefff659501cd2fe0d2ede4d48 + sha256: f0db1a2298a5e10e30f4b947566c7229442834702f549dded40a73ecdea7502d + category: main + optional: false - name: tinycss2 version: 1.2.1 manager: conda @@ -15902,6 +24365,18 @@ package: sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e category: main optional: false +- name: tk + version: 8.6.13 + manager: conda + platform: osx-64 + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + hash: + md5: bf830ba5afc507c6232d4ef0fb1a882d + sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 + category: main + optional: false - name: tk version: 8.6.13 manager: conda @@ -15926,6 +24401,18 @@ package: sha256: f0f3d697349d6580e4c2f35ba9ce05c65dc34f9f049e85e45da03800b46139c1 category: main optional: false +- name: toml + version: 0.10.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + hash: + md5: f832c45a477c78bebd107098db465095 + sha256: f0f3d697349d6580e4c2f35ba9ce05c65dc34f9f049e85e45da03800b46139c1 + category: main + optional: false - name: toml version: 0.10.2 manager: conda @@ -15950,6 +24437,18 @@ package: sha256: 4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f category: main optional: false +- name: tomli + version: 2.0.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 5844808ffab9ebdb694585b50ba02a96 + sha256: 4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f + category: main + optional: false - name: tomli version: 2.0.1 manager: conda @@ -15974,6 +24473,18 @@ package: sha256: 8d45c266bf919788abacd9828f4a2101d7216f6d4fc7c8d3417034fe0d795a18 category: main optional: false +- name: tomlkit + version: 0.12.4 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.4-pyha770c72_0.conda + hash: + md5: 37c47ea93ef00dd80d880fc4ba21256a + sha256: 8d45c266bf919788abacd9828f4a2101d7216f6d4fc7c8d3417034fe0d795a18 + category: main + optional: false - name: tomlkit version: 0.12.4 manager: conda @@ -15998,6 +24509,18 @@ package: sha256: 22b0a9790317526e08609d5dfdd828210ae89e6d444a9e954855fc29012e90c6 category: main optional: false +- name: toolz + version: 0.12.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda + hash: + md5: 2fcb582444635e2c402e8569bb94e039 + sha256: 22b0a9790317526e08609d5dfdd828210ae89e6d444a9e954855fc29012e90c6 + category: main + optional: false - name: toolz version: 0.12.1 manager: conda @@ -16024,6 +24547,19 @@ package: sha256: 27ab8f208c9a8fef7341d8f603059073f445de39c52eed73218f5823212ca73c category: main optional: false +- name: tornado + version: '6.4' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py39ha09f3b3_0.conda + hash: + md5: 4541517b5a605bf45d4a5fb074bb4cf5 + sha256: 4466eabed63d4a979b8f1aefc3241b91a70ee186e69ce23e5fbe23c122033c16 + category: main + optional: false - name: tornado version: '6.4' manager: conda @@ -16050,6 +24586,19 @@ package: sha256: 416d1d9318f3267325ad7e2b8a575df20ff9031197b30c0222c3d3b023877260 category: main optional: false +- name: tqdm + version: 4.66.2 + manager: conda + platform: osx-64 + dependencies: + colorama: '' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.2-pyhd8ed1ab_0.conda + hash: + md5: 2b8dfb969f984497f3f98409a9545776 + sha256: 416d1d9318f3267325ad7e2b8a575df20ff9031197b30c0222c3d3b023877260 + category: main + optional: false - name: tqdm version: 4.66.2 manager: conda @@ -16075,6 +24624,18 @@ package: sha256: 9ea6073091c130470a51b51703c8d2d959434992e29c4aa4abeba07cd56533a3 category: main optional: false +- name: traitlets + version: 5.14.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + hash: + md5: af5fa2d2186003472e766a23c46cae04 + sha256: 9ea6073091c130470a51b51703c8d2d959434992e29c4aa4abeba07cd56533a3 + category: main + optional: false - name: traitlets version: 5.14.2 manager: conda @@ -16088,31 +24649,45 @@ package: category: main optional: false - name: typeguard - version: 4.1.5 + version: 4.2.1 manager: conda platform: linux-64 dependencies: importlib_metadata: '>=3.6' python: '>=3.8' typing_extensions: '>=4.7.0' - url: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.1.5-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.2.1-pyhd8ed1ab_0.conda hash: - md5: 59d22e0ca481b057b94d54fc9ebacb13 - sha256: df63f90625d2eaefcb6990437b941c1c90ec3c224bc65a2becac928542d0aa5f + md5: 47102c2390ebdc73a8a1843e77dab61e + sha256: dd140e850215c729a50cbface4a1fc640dcc91f8da43ce467977a298c4dfe89a category: main optional: false - name: typeguard - version: 4.1.5 + version: 4.2.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' importlib_metadata: '>=3.6' + typing_extensions: '>=4.7.0' + url: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.2.1-pyhd8ed1ab_0.conda + hash: + md5: 47102c2390ebdc73a8a1843e77dab61e + sha256: dd140e850215c729a50cbface4a1fc640dcc91f8da43ce467977a298c4dfe89a + category: main + optional: false +- name: typeguard + version: 4.2.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + importlib_metadata: '>=3.6' typing_extensions: '>=4.7.0' - url: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.1.5-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.2.1-pyhd8ed1ab_0.conda hash: - md5: 59d22e0ca481b057b94d54fc9ebacb13 - sha256: df63f90625d2eaefcb6990437b941c1c90ec3c224bc65a2becac928542d0aa5f + md5: 47102c2390ebdc73a8a1843e77dab61e + sha256: dd140e850215c729a50cbface4a1fc640dcc91f8da43ce467977a298c4dfe89a category: main optional: false - name: types-python-dateutil @@ -16127,6 +24702,18 @@ package: sha256: 6630bbc43dfb72339fadafc521db56c9d17af72bfce459af195eecb01163de20 category: main optional: false +- name: types-python-dateutil + version: 2.9.0.20240316 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240316-pyhd8ed1ab_0.conda + hash: + md5: 7831efa91d57475373ee52fb92e8d137 + sha256: 6630bbc43dfb72339fadafc521db56c9d17af72bfce459af195eecb01163de20 + category: main + optional: false - name: types-python-dateutil version: 2.9.0.20240316 manager: conda @@ -16135,14 +24722,26 @@ package: python: '>=3.6' url: https://conda.anaconda.org/conda-forge/noarch/types-python-dateutil-2.9.0.20240316-pyhd8ed1ab_0.conda hash: - md5: 7831efa91d57475373ee52fb92e8d137 - sha256: 6630bbc43dfb72339fadafc521db56c9d17af72bfce459af195eecb01163de20 + md5: 7831efa91d57475373ee52fb92e8d137 + sha256: 6630bbc43dfb72339fadafc521db56c9d17af72bfce459af195eecb01163de20 + category: main + optional: false +- name: typing-extensions + version: 4.10.0 + manager: conda + platform: linux-64 + dependencies: + typing_extensions: 4.10.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + hash: + md5: 091683b9150d2ebaa62fd7e2c86433da + sha256: 0698fe2c4e555fb44c27c60f7a21fa0eea7f5bf8186ad109543c5b056e27f96a category: main optional: false - name: typing-extensions version: 4.10.0 manager: conda - platform: linux-64 + platform: osx-64 dependencies: typing_extensions: 4.10.0 url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda @@ -16175,6 +24774,18 @@ package: sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 category: main optional: false +- name: typing_extensions + version: 4.10.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + hash: + md5: 16ae769069b380646c47142d719ef466 + sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 + category: main + optional: false - name: typing_extensions version: 4.10.0 manager: conda @@ -16204,11 +24815,25 @@ package: - name: typing_inspect version: 0.9.0 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.5' + typing_extensions: '>=3.7.4' mypy_extensions: '>=0.3.0' + url: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_0.conda + hash: + md5: 9e924b76b91908a17e28a19a0ab88687 + sha256: 16e0b825c138e14ebc84623248d91d93a8cff29bb93595cc4aa46ca32f24f1de + category: main + optional: false +- name: typing_inspect + version: 0.9.0 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.5' typing_extensions: '>=3.7.4' + mypy_extensions: '>=0.3.0' url: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_0.conda hash: md5: 9e924b76b91908a17e28a19a0ab88687 @@ -16227,6 +24852,18 @@ package: sha256: 9e3758b620397f56fb709f796969de436d63b7117897159619b87938e1f78739 category: main optional: false +- name: typing_utils + version: 0.1.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6.1' + url: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: eb67e3cace64c66233e2d35949e20f92 + sha256: 9e3758b620397f56fb709f796969de436d63b7117897159619b87938e1f78739 + category: main + optional: false - name: typing_utils version: 0.1.0 manager: conda @@ -16252,6 +24889,17 @@ package: sha256: d3ea2927cabd6c9f27ee0cb498f893ac0133687d6a9e65e0bce4861c732a18df category: main optional: false +- name: tzcode + version: 2024a + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/tzcode-2024a-h10d778d_0.conda + hash: + md5: 8d50ba6668dbd193cd42ccd9099fa2ae + sha256: e3ee34b2711500f3b1d38309d47cfd7e4d05c0144f0b2b2bdfbc271a28cfdd76 + category: main + optional: false - name: tzcode version: 2024a manager: conda @@ -16274,6 +24922,17 @@ package: sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 category: main optional: false +- name: tzdata + version: 2024a + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + hash: + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + category: main + optional: false - name: tzdata version: 2024a manager: conda @@ -16298,6 +24957,19 @@ package: sha256: 265e13afdb42de545e0d0b9752d1bc8b128ed6b27089347ec42da4803dde2519 category: main optional: false +- name: tzlocal + version: '5.2' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/tzlocal-5.2-py39h6e9494a_0.conda + hash: + md5: 828412576e7202ba22e5ee3256c70951 + sha256: 42971089fa77cb29905c494c78c59e45d554b56ead732966cbe71eea10371751 + category: main + optional: false - name: tzlocal version: '5.2' manager: conda @@ -16316,13 +24988,14 @@ package: manager: conda platform: linux-64 dependencies: + cuda-cudart: '>=12.0.107,<13.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' rdma-core: '>=50.0' - url: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-h11edf95_7.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-hf604dca_7.conda hash: - md5: 20a94f617ad76922f8737ad1fe317f4d - sha256: 3e381ec5918045a43e0f349214a4d38e53990897ba07a6abf025f9e0156acaf2 + md5: 65df290dcf5d4f6d11e98faf6429f392 + sha256: 0992f449135cb8af2320fbfea2d76f5c543468858e77f35fa39c1048bf2d8782 category: main optional: false - name: ukkonen @@ -16341,6 +25014,21 @@ package: sha256: 6ca31e79eeee63ea33e5b18dd81c1bc202c43741b5f0de3bcd4409f9ffd93a95 category: main optional: false +- name: ukkonen + version: 1.0.1 + manager: conda + platform: osx-64 + dependencies: + cffi: '' + libcxx: '>=15.0.7' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py39h8ee36c8_4.conda + hash: + md5: 234e1d8799d93d5d51b3d778019a6db9 + sha256: 87b17e86e8540aa4a598fd024fd884427557138dceae2ba48d3e99a51dad623a + category: main + optional: false - name: ukkonen version: 1.0.1 manager: conda @@ -16370,6 +25058,19 @@ package: sha256: 90077cbf116112d5112b7beedf896e59c98416d09860ba98c06a770c014829b2 category: main optional: false +- name: unicodedata2 + version: 15.1.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py39hdc70f33_0.conda + hash: + md5: ede122e9ef2775a8879063d9d3ee819f + sha256: 2c3049ec6ffd44beb61964bf109993f654a7316fa6a368c634d603e8347f9fdf + category: main + optional: false - name: unicodedata2 version: 15.1.0 manager: conda @@ -16395,6 +25096,18 @@ package: sha256: 3f29636a555736983ac2bdeb6e41a5cd85b572fa4f6cc2270d6c6543d8eb8c0b category: main optional: false +- name: unidecode + version: 1.3.8 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/unidecode-1.3.8-pyhd8ed1ab_0.conda + hash: + md5: 913724e0dfe2708b7b7d4e35b8cc2e0f + sha256: 3f29636a555736983ac2bdeb6e41a5cd85b572fa4f6cc2270d6c6543d8eb8c0b + category: main + optional: false - name: unidecode version: 1.3.8 manager: conda @@ -16419,6 +25132,18 @@ package: sha256: b76904b53721dc88a46352324c79d2b077c2f74a9f7208ad2c4249892669ae94 category: main optional: false +- name: uri-template + version: 1.3.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: 0944dc65cb4a9b5b68522c3bb585d41c + sha256: b76904b53721dc88a46352324c79d2b077c2f74a9f7208ad2c4249892669ae94 + category: main + optional: false - name: uri-template version: 1.3.0 manager: conda @@ -16438,10 +25163,22 @@ package: dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.7-h59595ed_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.7-hcb278e6_1.conda + hash: + md5: 2c46deb08ba9b10e90d0a6401ad65deb + sha256: bc7670384fc3e519b376eab25b2c747afe392b243f17e881075231f4a0f2e5a0 + category: main + optional: false +- name: uriparser + version: 0.9.7 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=14.0.6' + url: https://conda.anaconda.org/conda-forge/osx-64/uriparser-0.9.7-hf0c8a7f_1.conda hash: - md5: c5edf07141147789784f89d5b4e4a9ad - sha256: ec997599b6dcfef34242c67b695c4704d9ba6cb0b9de8f390defa475a95cdb3f + md5: 998073b0ccb5f99d07d2089cf06363b3 + sha256: faf0f7919851960bbb1d18d977f62082c0e4dc8f26e348d702e8a2dba53a4c37 category: main optional: false - name: uriparser @@ -16449,11 +25186,11 @@ package: manager: conda platform: osx-arm64 dependencies: - libcxx: '>=14' - url: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.7-h13dd4ca_1.conda + libcxx: '>=14.0.6' + url: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.7-hb7217d7_1.conda hash: - md5: df83a53820f413eb8b14045433a2d587 - sha256: 019103df9eec86c9afa92dec21a849e63d57bfa9125ca811e68b78dab224c4ee + md5: 4fe532e3c6b0cfa5365eb01743d32578 + sha256: bedd03f3bb30b73ae7b0dc9626f1371a8568ce6d41303df3e8299688428dfa94 category: main optional: false - name: urllib3 @@ -16473,11 +25210,25 @@ package: - name: urllib3 version: 1.26.18 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.7' brotli-python: '>=1.0.9' pysocks: '>=1.5.6,<2.0,!=1.5.7' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.18-pyhd8ed1ab_0.conda + hash: + md5: bf61cfd2a7f212efba378167a07d4a6a + sha256: 1cc0bab65a6ad0f5a8bd7657760a4fb4e670d30377f9dab88b792977cb3687e7 + category: main + optional: false +- name: urllib3 + version: 1.26.18 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.7' + brotli-python: '>=1.0.9' + pysocks: '>=1.5.6,<2.0,!=1.5.7' url: https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.18-pyhd8ed1ab_0.conda hash: md5: bf61cfd2a7f212efba378167a07d4a6a @@ -16518,6 +25269,39 @@ package: sha256: b85bf700aac63cafae0d728f36ab35848fdb390be973232d74d61edef78fdcea category: main optional: false +- name: vaex-core + version: 4.17.1 + manager: conda + platform: osx-64 + dependencies: + aplus: '' + blake3: '' + cloudpickle: '' + dask: '' + filelock: '' + frozendict: '' + future: '>=0.15.2' + libcxx: '>=15.0.7' + nest-asyncio: '>=1.3.3' + numpy: '>=1.21.6,<2.0a0' + pandas: '' + pcre: '>=8.45,<9.0a0' + progressbar2: '' + pyarrow: '>=3.0' + pydantic: '>=1.8.0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + pyyaml: '' + requests: '' + rich: '' + six: '' + tabulate: '>=0.8.3' + url: https://conda.anaconda.org/conda-forge/osx-64/vaex-core-4.17.1-py39h49cddf2_0.conda + hash: + md5: a4e3728d9012ba7b18b734c94b69368b + sha256: a15de94253142a6ade7da9ffd3d787560fc1698006946d54c03106d059dda231 + category: main + optional: false - name: vaex-core version: 4.17.1 manager: conda @@ -16569,12 +25353,27 @@ package: - name: virtualenv version: 20.25.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' distlib: <1,>=0.3.7 filelock: <4,>=3.12.2 platformdirs: <5,>=3.9.1 + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda + hash: + md5: 8797a4e26be36880a603aba29c785352 + sha256: 1ced4445cf72cd9dc344ad04bdaf703a08cc428c8c46e4bda928ad79786ee153 + category: main + optional: false +- name: virtualenv + version: 20.25.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + distlib: <1,>=0.3.7 + filelock: <4,>=3.12.2 + platformdirs: <5,>=3.9.1 url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda hash: md5: 8797a4e26be36880a603aba29c785352 @@ -16593,6 +25392,18 @@ package: sha256: b6cd2fee7e728e620ec736d8dfee29c6c9e2adbd4e695a31f1d8f834a83e57e3 category: main optional: false +- name: wcwidth + version: 0.2.13 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda + hash: + md5: 68f0738df502a14213624b288c60c9ad + sha256: b6cd2fee7e728e620ec736d8dfee29c6c9e2adbd4e695a31f1d8f834a83e57e3 + category: main + optional: false - name: wcwidth version: 0.2.13 manager: conda @@ -16617,6 +25428,18 @@ package: sha256: 6e097d5fe92849ad3af2c2a313771ad2fbf1cadd4dc4afd552303b2bf3f85211 category: main optional: false +- name: webcolors + version: '1.13' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/webcolors-1.13-pyhd8ed1ab_0.conda + hash: + md5: 166212fe82dad8735550030488a01d03 + sha256: 6e097d5fe92849ad3af2c2a313771ad2fbf1cadd4dc4afd552303b2bf3f85211 + category: main + optional: false - name: webcolors version: '1.13' manager: conda @@ -16641,6 +25464,18 @@ package: sha256: 2adf9bd5482802837bc8814cbe28d7b2a4cbd2e2c52e381329eaa283b3ed1944 category: main optional: false +- name: webencodings + version: 0.5.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=2.6' + url: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda + hash: + md5: daf5160ff9cde3a468556965329085b9 + sha256: 2adf9bd5482802837bc8814cbe28d7b2a4cbd2e2c52e381329eaa283b3ed1944 + category: main + optional: false - name: webencodings version: 0.5.1 manager: conda @@ -16665,6 +25500,18 @@ package: sha256: d9b537d5b7c5aa7a02a4ce4c6b755e458bd8083b67752a73c92d113ccec6c10f category: main optional: false +- name: websocket-client + version: 1.7.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.7.0-pyhd8ed1ab_0.conda + hash: + md5: 50ad31e07d706aae88b14a4ac9c73f23 + sha256: d9b537d5b7c5aa7a02a4ce4c6b755e458bd8083b67752a73c92d113ccec6c10f + category: main + optional: false - name: websocket-client version: 1.7.0 manager: conda @@ -16693,10 +25540,23 @@ package: - name: werkzeug version: 3.0.1 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: + python: '>=3.8' markupsafe: '>=2.1.1' + url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.1-pyhd8ed1ab_0.conda + hash: + md5: af8d825d93dbe6331ee6d61c69869ca0 + sha256: b7ac49549d370a411b1d6150d24243a15adcce07f1c61ec2ea1b536346e47aa0 + category: main + optional: false +- name: werkzeug + version: 3.0.1 + manager: conda + platform: osx-arm64 + dependencies: python: '>=3.8' + markupsafe: '>=2.1.1' url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.1-pyhd8ed1ab_0.conda hash: md5: af8d825d93dbe6331ee6d61c69869ca0 @@ -16704,33 +25564,57 @@ package: category: main optional: false - name: wheel - version: 0.42.0 + version: 0.43.0 manager: conda platform: linux-64 dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda hash: - md5: 1cdea58981c5cbc17b51973bcaddcea7 - sha256: 80be0ccc815ce22f80c141013302839b0ed938a2edb50b846cf48d8a8c1cfa01 + md5: 0b5293a157c2b5cd513dd1b03d8d3aae + sha256: cb318f066afd6fd64619f14c030569faf3f53e6f50abf743b4c865e7d95b96bc category: main optional: false - name: wheel - version: 0.42.0 + version: 0.43.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda + hash: + md5: 0b5293a157c2b5cd513dd1b03d8d3aae + sha256: cb318f066afd6fd64619f14c030569faf3f53e6f50abf743b4c865e7d95b96bc + category: main + optional: false +- name: wheel + version: 0.43.0 manager: conda platform: osx-arm64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda + hash: + md5: 0b5293a157c2b5cd513dd1b03d8d3aae + sha256: cb318f066afd6fd64619f14c030569faf3f53e6f50abf743b4c865e7d95b96bc + category: main + optional: false +- name: widgetsnbextension + version: 4.0.10 + manager: conda + platform: linux-64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.10-pyhd8ed1ab_0.conda hash: - md5: 1cdea58981c5cbc17b51973bcaddcea7 - sha256: 80be0ccc815ce22f80c141013302839b0ed938a2edb50b846cf48d8a8c1cfa01 + md5: 521f489e3babeddeec638c2add7e9e64 + sha256: 981b06c76a1a86bb84be09522768be0458274926b22f4b0225dfcdd30a6593e0 category: main optional: false - name: widgetsnbextension version: 4.0.10 manager: conda - platform: linux-64 + platform: osx-64 dependencies: python: '>=3.7' url: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.10-pyhd8ed1ab_0.conda @@ -16765,6 +25649,19 @@ package: sha256: 16fa658554048c0eb37684685cf046ea3ef9e1f1fe03c92cbd8f726197ba60fe category: main optional: false +- name: wrapt + version: 1.14.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.14.1-py39ha30fb19_1.tar.bz2 + hash: + md5: 1f32082a7afac6f4b7255d4d3be520e0 + sha256: ad1587b6685aebb0e0f912020f3dc02e00626912953f49591f9c7aac230aeaf4 + category: main + optional: false - name: wrapt version: 1.14.1 manager: conda @@ -16778,6 +25675,72 @@ package: sha256: 83f5c4e8963137f6c0287846d118d9e3baac69cfa86b4734a4ea02f4e276422c category: main optional: false +- name: xcb-util + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda + hash: + md5: 9bfac7ccd94d54fd21a0501296d60424 + sha256: 0c91d87f0efdaadd4e56a5f024f8aab20ec30f90aa2ce9e4ebea05fbc20f71ad + category: main + optional: false +- name: xcb-util-image + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + xcb-util: '>=0.4.0,<0.5.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda + hash: + md5: 9d7bcddf49cbf727730af10e71022c73 + sha256: 92ffd68d2801dbc27afe223e04ae7e78ef605fc8575f107113c93c7bafbd15b0 + category: main + optional: false +- name: xcb-util-keysyms + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda + hash: + md5: 632413adcd8bc16b515cab87a2932913 + sha256: 8451d92f25d6054a941b962179180728c48c62aab5bf20ac10fef713d5da6a9a + category: main + optional: false +- name: xcb-util-renderutil + version: 0.3.9 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda + hash: + md5: e995b155d938b6779da6ace6c6b13816 + sha256: 6987588e6fff5892056021c2ea52f7a0deefb2c7348e70d24750e2d60dabf009 + category: main + optional: false +- name: xcb-util-wm + version: 0.4.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda + hash: + md5: 90108a432fb5c6150ccfee3f03388656 + sha256: 08ba7147c7579249b6efd33397dc1a8c2404278053165aaecd39280fee705724 + category: main + optional: false - name: xerces-c version: 3.2.5 manager: conda @@ -16794,6 +25757,20 @@ package: sha256: 75d06ca406f03f653d7a3183f2a1ccfdb3a3c6c830493933ec4c3c98e06a32bb category: main optional: false +- name: xerces-c + version: 3.2.5 + manager: conda + platform: osx-64 + dependencies: + icu: '>=73.2,<74.0a0' + libcurl: '>=8.5.0,<9.0a0' + libcxx: '>=15' + url: https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.2.5-hbbe9ea5_0.conda + hash: + md5: ade166000a13c81d9a75f65281e302b0 + sha256: 10487c0b28ee2303570c6d0867000587a8c36836fffd4d634d8778c494d16965 + category: main + optional: false - name: xerces-c version: 3.2.5 manager: conda @@ -16808,16 +25785,29 @@ package: sha256: 8ad901a5fe535ebd16b469cf8e46cf174f7e6e4d9b432cc8cc02666a87e7e2ee category: main optional: false +- name: xkeyboard-config + version: '2.41' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + xorg-libx11: '>=1.8.7,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda + hash: + md5: 81f740407b45e3f9047b3174fa94eb9e + sha256: 56955610c0747ea7cb026bb8aa9ef165ff41d616e89894538173b8b7dd2ee49a + category: main + optional: false - name: xorg-kbproto version: 1.0.7 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 + libgcc-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h14c3975_1002.tar.bz2 hash: - md5: 4b230e8381279d76131116660f5a241a - sha256: e90b0a6a5d41776f11add74aa030f789faf4efd3875c31964d6f9cfa63a10dd1 + md5: 6dfe5dbe10d55266e4a5e89287eed578 + sha256: e0ecf489734baf996703b2b274b0d130485476162ef5aae1d4e74851549a470e category: main optional: false - name: xorg-libice @@ -16874,6 +25864,17 @@ package: sha256: 309751371d525ce50af7c87811b435c176915239fc9e132b99a25d5e1703f2d4 category: main optional: false +- name: xorg-libxau + version: 1.0.11 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h0dc2134_0.conda + hash: + md5: 9566b4c29274125b0266d0177b5eb97b + sha256: 8a2e398c4f06f10c64e69f56bcf3ddfa30b432201446a0893505e735b346619a + category: main + optional: false - name: xorg-libxau version: 1.0.11 manager: conda @@ -16890,11 +25891,22 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 + libgcc-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h516909a_0.tar.bz2 + hash: + md5: e95a160e60b2a327309a6d323a4d780e + sha256: 6cd3f826a853bb26bf303b26560439b135ebc2a88c9806e70a8d6935cfeeea91 + category: main + optional: false +- name: xorg-libxdmcp + version: 1.1.3 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.3-h35c211d_0.tar.bz2 hash: - md5: be93aabceefa2fac576e971aef407908 - sha256: 4df7c5ee11b8686d3453e7f3f4aa20ceef441262b49860733066c52cfd0e4a77 + md5: 86ac76d6bf1cbb9621943eb3bd9ae36e + sha256: 485421c16f03a01b8ed09984e0b2ababdbb3527e1abf354ff7646f8329be905f category: main optional: false - name: xorg-libxdmcp @@ -16941,11 +25953,11 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2 + libgcc-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h14c3975_1002.tar.bz2 hash: - md5: 06feff3d2634e3097ce2fe681474b534 - sha256: 38942930f233d1898594dd9edf4b0c0786f3dbc12065a0c308634c37fd936034 + md5: fbcb7fa11dee1a5d3df4371cc55bb229 + sha256: bbed3c5ab97fdde0a0a2d725be15cd9b5fc770086e0afecebc8c155873bfff73 category: main optional: false - name: xorg-xextproto @@ -16960,16 +25972,28 @@ package: sha256: b8dda3b560e8a7830fe23be1c58cc41f407b2e20ae2f3b6901eb5842ba62b743 category: main optional: false +- name: xorg-xf86vidmodeproto + version: 2.3.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h516909a_1002.tar.bz2 + hash: + md5: c3f8431e8a5e0b54f8f2ebd812000516 + sha256: 88e67824b807173c684988244965982cd9e63f1ddf33c10333b64c55e1768bf9 + category: main + optional: false - name: xorg-xproto version: 7.0.31 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2 + libgcc-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h14c3975_1007.tar.bz2 hash: - md5: b4a4381d54784606820704f7b5f05a15 - sha256: f197bb742a17c78234c24605ad1fe2d88b1d25f332b75d73e5ba8cf8fbc2a10d + md5: a45d8cd411bdf8f08ced463f68986b62 + sha256: d24dfec052d1ed796604caf405d8846a394c7950c60a611ec24a4b91aaa9d56f category: main optional: false - name: xxhash @@ -16984,6 +26008,17 @@ package: sha256: 6fe74a8fd84ab0dc25e4dc3e0c22388dd8accb212897a208b14fe5d4fbb8fc2f category: main optional: false +- name: xxhash + version: 0.8.2 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/xxhash-0.8.2-h4140336_0.conda + hash: + md5: 7e1dd1923f44ab000be63d9e40ed9ed7 + sha256: 2a4bbe7965b99d405ddafcd05434425d8d57b34982c590eb8036eb870d8d8b86 + category: main + optional: false - name: xxhash version: 0.8.2 manager: conda @@ -17007,6 +26042,18 @@ package: sha256: da655e2e0a742fddefeeaf2dd828b62a1820a3755d13341e1a555a10fcb9cf81 category: main optional: false +- name: xyzservices + version: 2023.10.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2023.10.1-pyhd8ed1ab_0.conda + hash: + md5: 1e0d85c0e2fef9539218da185b285f54 + sha256: da655e2e0a742fddefeeaf2dd828b62a1820a3755d13341e1a555a10fcb9cf81 + category: main + optional: false - name: xyzservices version: 2023.10.1 manager: conda @@ -17031,6 +26078,17 @@ package: sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 category: main optional: false +- name: xz + version: 5.2.6 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + hash: + md5: a72f9d4ea13d55d745ff1ed594747f10 + sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 + category: main + optional: false - name: xz version: 5.2.6 manager: conda @@ -17054,6 +26112,17 @@ package: sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 category: main optional: false +- name: yaml + version: 0.2.5 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + hash: + md5: d7e08fcf8259d742156188e8762b4d20 + sha256: 5301417e2c8dea45b401ffee8df3957d2447d4ce80c83c5ff151fc6bfe1c4148 + category: main + optional: false - name: yaml version: 0.2.5 manager: conda @@ -17081,6 +26150,21 @@ package: sha256: a0370c724d347103ae1a7c8a49166cc69359d80055c11bc5d7222d259efd8f12 category: main optional: false +- name: yarl + version: 1.9.4 + manager: conda + platform: osx-64 + dependencies: + idna: '>=2.0' + multidict: '>=4.0' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.9.4-py39ha09f3b3_0.conda + hash: + md5: f6e21fa521a3eb23889768cb5a4cc186 + sha256: a2e07a7568395f7bf121c5a777f22046dd4870f9a26febb6c3f14c12ba666b92 + category: main + optional: false - name: yarl version: 1.9.4 manager: conda @@ -17110,6 +26194,20 @@ package: sha256: 3bec658f5c23abf5e200d98418add7a20ff7b45c928ad4560525bef899496256 category: main optional: false +- name: zeromq + version: 4.3.5 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + libsodium: '>=1.0.18,<1.0.19.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h93d8f39_0.conda + hash: + md5: 4c055e46b394be36681fe476c1e2ee6e + sha256: 19be553b3cc8352b6e842134b8de66ae39fcae80bc575c203076370faab6009c + category: main + optional: false - name: zeromq version: 4.3.5 manager: conda @@ -17135,6 +26233,18 @@ package: sha256: 3d65c081514569ab3642ba7e6c2a6b4615778b596db6b1c82ee30a2d912539e5 category: main optional: false +- name: zict + version: 3.0.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda + hash: + md5: cf30c2c15b82aacb07f9c09e28ff2275 + sha256: 3d65c081514569ab3642ba7e6c2a6b4615778b596db6b1c82ee30a2d912539e5 + category: main + optional: false - name: zict version: 3.0.0 manager: conda @@ -17159,6 +26269,18 @@ package: sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 category: main optional: false +- name: zipp + version: 3.17.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + hash: + md5: 2e4d6bc0b14e10f895fc6791a7d9b26a + sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 + category: main + optional: false - name: zipp version: 3.17.0 manager: conda @@ -17184,6 +26306,18 @@ package: sha256: 9887a04d7e7cb14bd2b52fa01858f05a6d7f002c890f618d9fcd864adbfecb1b category: main optional: false +- name: zlib + version: 1.2.13 + manager: conda + platform: osx-64 + dependencies: + libzlib: 1.2.13 + url: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda + hash: + md5: 75a8a98b1c4671c5d2897975731da42d + sha256: d1f4c82fd7bd240a78ce8905e931e68dca5f523c7da237b6b63c87d5625c5b35 + category: main + optional: false - name: zlib version: 1.2.13 manager: conda @@ -17210,6 +26344,18 @@ package: sha256: 607cbeb1a533be98ba96cf5cdf0ddbb101c78019f1fda063261871dad6248609 category: main optional: false +- name: zstd + version: 1.5.5 + manager: conda + platform: osx-64 + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda + hash: + md5: 80abc41d0c48b82fe0f04e7f42f5cb7e + sha256: d54e31d3d8de5e254c0804abd984807b8ae5cd3708d758a8bf1adff1f5df166c + category: main + optional: false - name: zstd version: 1.5.5 manager: conda @@ -17233,6 +26379,17 @@ package: sha256: 268b98046f8e1e303b4bbc553b60643b26c0031b4290ef163caf80c3be5ecf85 category: main optional: false +- name: aioboto3 + version: 12.3.0 + manager: pip + platform: osx-64 + dependencies: + aiobotocore: 2.11.2 + url: https://files.pythonhosted.org/packages/2d/69/e375ee955f67eb468d5bc907423bdbdb39cbdd2012652e8abd98ba0bb255/aioboto3-12.3.0-py3-none-any.whl + hash: + sha256: 268b98046f8e1e303b4bbc553b60643b26c0031b4290ef163caf80c3be5ecf85 + category: main + optional: false - name: aioboto3 version: 12.3.0 manager: pip @@ -17259,6 +26416,21 @@ package: sha256: 487fede588040bfa3a43df945275c28c1c73ca75bf705295adb9fbadd2e89be7 category: main optional: false +- name: aiobotocore + version: 2.11.2 + manager: pip + platform: osx-64 + dependencies: + botocore: '>=1.33.2,<1.34.35' + aiohttp: '>=3.7.4.post0,<4.0.0' + wrapt: '>=1.10.10,<2.0.0' + aioitertools: '>=0.5.1,<1.0.0' + boto3: '>=1.33.2,<1.34.35' + url: https://files.pythonhosted.org/packages/25/cf/c695f7f3301117766d778f536082c41ba20fd01b02e14a5c06f92a5ea75e/aiobotocore-2.11.2-py3-none-any.whl + hash: + sha256: 487fede588040bfa3a43df945275c28c1c73ca75bf705295adb9fbadd2e89be7 + category: main + optional: false - name: aiobotocore version: 2.11.2 manager: pip @@ -17284,6 +26456,16 @@ package: sha256: 0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 category: main optional: false +- name: annotated-types + version: 0.6.0 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/28/78/d31230046e58c207284c6b2c4e8d96e6d3cb4e52354721b944d3e1ee4aa5/annotated_types-0.6.0-py3-none-any.whl + hash: + sha256: 0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 + category: main + optional: false - name: annotated-types version: 0.6.0 manager: pip @@ -17307,6 +26489,19 @@ package: sha256: 33a8b6d9136fa7427160edb92d2e50f2035f04e9d63a2d1027349053e12626aa category: main optional: false +- name: boto3 + version: 1.34.34 + manager: pip + platform: osx-64 + dependencies: + botocore: '>=1.34.34,<1.35.0' + jmespath: '>=0.7.1,<2.0.0' + s3transfer: '>=0.10.0,<0.11.0' + url: https://files.pythonhosted.org/packages/0e/78/d505b8c71139d234e34df1c4a18d0567287494ce63f690337aa2af23219c/boto3-1.34.34-py3-none-any.whl + hash: + sha256: 33a8b6d9136fa7427160edb92d2e50f2035f04e9d63a2d1027349053e12626aa + category: main + optional: false - name: boto3 version: 1.34.34 manager: pip @@ -17333,6 +26528,19 @@ package: sha256: cd060b0d88ebb2b893f1411c1db7f2ba66cc18e52dcc57ad029564ef5fec437b category: main optional: false +- name: botocore + version: 1.34.34 + manager: pip + platform: osx-64 + dependencies: + jmespath: '>=0.7.1,<2.0.0' + python-dateutil: '>=2.1,<3.0.0' + urllib3: '>=1.25.4,<1.27' + url: https://files.pythonhosted.org/packages/6e/71/b81be726c424784858e9b9ccada167dbb19364f37744d9d780c2f79f9e6e/botocore-1.34.34-py3-none-any.whl + hash: + sha256: cd060b0d88ebb2b893f1411c1db7f2ba66cc18e52dcc57ad029564ef5fec437b + category: main + optional: false - name: botocore version: 1.34.34 manager: pip @@ -17356,6 +26564,16 @@ package: sha256: cc31ad6fdea1f49962ea42db9421772afe01ac5442380d9a99fcf3d188c61afe category: main optional: false +- name: dacite + version: 1.8.1 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/21/0f/cf0943f4f55f0fbc7c6bd60caf1343061dff818b02af5a0d444e473bb78d/dacite-1.8.1-py3-none-any.whl + hash: + sha256: cc31ad6fdea1f49962ea42db9421772afe01ac5442380d9a99fcf3d188c61afe + category: main + optional: false - name: dacite version: 1.8.1 manager: pip @@ -17379,6 +26597,19 @@ package: sha256: d90eb2eb4cae3dbc50f544f37e3a71bf50fdda8428109cfc15056fe94febc1b4 category: main optional: false +- name: dolt-integrations + version: 0.1.5 + manager: pip + platform: osx-64 + dependencies: + pandas: '>=0.25.2' + dataclasses-json: '>=0.5.2' + doltcli: '>=0.1.6,<0.2.0' + url: https://files.pythonhosted.org/packages/a6/24/318bd96f965b8b8c37d38a1b2268029e500718d19913fdc59e569eb14161/dolt_integrations-0.1.5-py3-none-any.whl + hash: + sha256: d90eb2eb4cae3dbc50f544f37e3a71bf50fdda8428109cfc15056fe94febc1b4 + category: main + optional: false - name: dolt-integrations version: 0.1.5 manager: pip @@ -17403,6 +26634,17 @@ package: sha256: 9d8a8454ef2337d388e40de2fc915fbc6d616e4ac494926488d0d4da9ce1747a category: main optional: false +- name: doltcli + version: 0.1.18 + manager: pip + platform: osx-64 + dependencies: + typed-ast: '>1.4.3' + url: https://files.pythonhosted.org/packages/19/d0/3a3119ca82af8d27c06d2f1fe826f4ae8be2a3bd3e5a4c7a59852e962059/doltcli-0.1.18-py3-none-any.whl + hash: + sha256: 9d8a8454ef2337d388e40de2fc915fbc6d616e4ac494926488d0d4da9ce1747a + category: main + optional: false - name: doltcli version: 0.1.18 manager: pip @@ -17424,6 +26666,16 @@ package: sha256: a5cfb93e73911696a98b9479299d19cfbc21dd05bb7ab11a923a903f86b4d06e category: main optional: false +- name: duckdb + version: 0.9.2 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/7f/c6/b822ecfcb10e955bdb9b637af2901df04ac9c8fad6722daf83536adc2f8a/duckdb-0.9.2-cp39-cp39-macosx_10_9_x86_64.whl + hash: + sha256: e5d0bb845a80aa48ed1fd1d2d285dd352e96dc97f8efced2a7429437ccd1fe1f + category: main + optional: false - name: duckdb version: 0.9.2 manager: pip @@ -17449,6 +26701,21 @@ package: sha256: bb71de7d462b2ca51d42812fb61a2ca3e42ad19866fe973bef1ffa0ce147965c category: main optional: false +- name: flytekitplugins-deck-standard + version: 1.10.2 + manager: pip + platform: osx-64 + dependencies: + flytekit: '>=1.3.0b2,<2.0.0' + markdown: '*' + plotly: '*' + ydata-profiling: '*' + ipywidgets: '*' + url: https://files.pythonhosted.org/packages/c4/13/1f7c371031967e541012eb017b95dd266ccd919abe7ed6996a96870e39ea/flytekitplugins_deck_standard-1.10.2-py3-none-any.whl + hash: + sha256: bb71de7d462b2ca51d42812fb61a2ca3e42ad19866fe973bef1ffa0ce147965c + category: main + optional: false - name: flytekitplugins-deck-standard version: 1.10.2 manager: pip @@ -17477,6 +26744,19 @@ package: sha256: baac1698148a63f72478b063ee93ad81346626407f302ea0f6f44b1083e2e723 category: main optional: false +- name: flytekitplugins-kfpytorch + version: 1.10.2 + manager: pip + platform: osx-64 + dependencies: + cloudpickle: '*' + flyteidl: '>=1.5.1' + flytekit: '>=1.6.1' + url: https://files.pythonhosted.org/packages/b0/31/64f935cfc7d2784101045fdc9151ab38036057afb8d102793e4f8a76e22d/flytekitplugins_kfpytorch-1.10.2-py3-none-any.whl + hash: + sha256: baac1698148a63f72478b063ee93ad81346626407f302ea0f6f44b1083e2e723 + category: main + optional: false - name: flytekitplugins-kfpytorch version: 1.10.2 manager: pip @@ -17502,6 +26782,18 @@ package: sha256: 9e19b16edfc7468c94e1e69801a465abe89412e5c46d50a19e283ab717afca3f category: main optional: false +- name: flytekitplugins-sqlalchemy + version: 1.10.2 + manager: pip + platform: osx-64 + dependencies: + flytekit: '>=1.3.0b2,<2.0.0' + sqlalchemy: '>=1.4.7' + url: https://files.pythonhosted.org/packages/99/c3/82bb331973c1ee7fd374e314f209d4bffb63d896a1f345da145cac24a91a/flytekitplugins_sqlalchemy-1.10.2-py3-none-any.whl + hash: + sha256: 9e19b16edfc7468c94e1e69801a465abe89412e5c46d50a19e283ab717afca3f + category: main + optional: false - name: flytekitplugins-sqlalchemy version: 1.10.2 manager: pip @@ -17526,6 +26818,18 @@ package: sha256: 69112d0890c075e6ab03950cd9b8e1b953d6e89ba51de5f393e939fb3bc68284 category: main optional: false +- name: google-auth-oauthlib + version: 0.6.0 + manager: pip + platform: osx-64 + dependencies: + google-auth: '>=1.0.0' + requests-oauthlib: '>=0.7.0' + url: https://files.pythonhosted.org/packages/4d/d1/79277a5c507df72cc22ee2c3949ae384c4af8110bc0b472f0c49fcdcba3b/google_auth_oauthlib-0.6.0-py2.py3-none-any.whl + hash: + sha256: 69112d0890c075e6ab03950cd9b8e1b953d6e89ba51de5f393e939fb3bc68284 + category: main + optional: false - name: google-auth-oauthlib version: 0.6.0 manager: pip @@ -17548,6 +26852,16 @@ package: sha256: fb1ab7b0548fe44b3d538041f0a374505b7f990d448a935ea36649c5ccab5acf category: main optional: false +- name: google-cloud + version: 0.34.0 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/ba/b1/7c54d1950e7808df06642274e677dbcedba57f75307adf2e5ad8d39e5e0e/google_cloud-0.34.0-py2.py3-none-any.whl + hash: + sha256: fb1ab7b0548fe44b3d538041f0a374505b7f990d448a935ea36649c5ccab5acf + category: main + optional: false - name: google-cloud version: 0.34.0 manager: pip @@ -17569,6 +26883,17 @@ package: sha256: 594aaa0469f4fca7773e80d8c27bf1298e7bbce5f6da0f084b07489a708f16ab category: main optional: false +- name: grpcio + version: 1.43.0 + manager: pip + platform: osx-64 + dependencies: + six: '>=1.5.2' + url: https://files.pythonhosted.org/packages/2a/62/902308b06a02a99ac60dc20cad08a2fb223b6b35dfca814d513f195ac770/grpcio-1.43.0-cp39-cp39-macosx_10_10_x86_64.whl + hash: + sha256: 2f96142d0abc91290a63ba203f01649e498302b1b6007c67bad17f823ecde0cf + category: main + optional: false - name: grpcio version: 1.43.0 manager: pip @@ -17593,6 +26918,19 @@ package: sha256: 9036b24f5769adafdc3e91d9434c20e9ede0b30f50cc6bff105c0f414bb9e0e0 category: main optional: false +- name: grpcio-status + version: 1.43.0 + manager: pip + platform: osx-64 + dependencies: + protobuf: '>=3.6.0' + grpcio: '>=1.43.0' + googleapis-common-protos: '>=1.5.5' + url: https://files.pythonhosted.org/packages/a3/6b/4d49846da5b5a496658fde7c1315c2ed48b3d98f7460122a19f94af39248/grpcio_status-1.43.0-py3-none-any.whl + hash: + sha256: 9036b24f5769adafdc3e91d9434c20e9ede0b30f50cc6bff105c0f414bb9e0e0 + category: main + optional: false - name: grpcio-status version: 1.43.0 manager: pip @@ -17616,6 +26954,16 @@ package: sha256: 50c1ef4630374a5d723900096a961cff426dff46b48f34d194a81bbe14eca178 category: main optional: false +- name: htmlmin + version: 0.1.12 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/b3/e7/fcd59e12169de19f0131ff2812077f964c6b960e7c09804d30a7bf2ab461/htmlmin-0.1.12.tar.gz + hash: + sha256: 50c1ef4630374a5d723900096a961cff426dff46b48f34d194a81bbe14eca178 + category: main + optional: false - name: htmlmin version: 0.1.12 manager: pip @@ -17640,6 +26988,20 @@ package: sha256: 5ad9a5cde14fe255745a8245677293ac0d67f09c330986a351f34b614ba62fb5 category: main optional: false +- name: imagehash + version: 4.3.1 + manager: pip + platform: osx-64 + dependencies: + pywavelets: '*' + numpy: '*' + pillow: '*' + scipy: '*' + url: https://files.pythonhosted.org/packages/2d/b4/19a746a986c6e38595fa5947c028b1b8e287773dcad766e648897ad2a4cf/ImageHash-4.3.1-py2.py3-none-any.whl + hash: + sha256: 5ad9a5cde14fe255745a8245677293ac0d67f09c330986a351f34b614ba62fb5 + category: main + optional: false - name: imagehash version: 4.3.1 manager: pip @@ -17665,6 +27027,17 @@ package: sha256: 10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb category: main optional: false +- name: jaraco.classes + version: 3.3.0 + manager: pip + platform: osx-64 + dependencies: + more-itertools: '*' + url: https://files.pythonhosted.org/packages/c7/6b/1bc8fa93ea85146e08f0e0883bc579b7c7328364ed7df90b1628dcb36e10/jaraco.classes-3.3.0-py3-none-any.whl + hash: + sha256: 10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb + category: main + optional: false - name: jaraco.classes version: 3.3.0 manager: pip @@ -17676,6 +27049,69 @@ package: sha256: 10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb category: main optional: false +- name: jaraco.context + version: 4.3.0 + manager: pip + platform: linux-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/0a/de/3f889cd55e69f0a91b396f6799ca31ea0d6869cde338e7c79335699090cb/jaraco.context-4.3.0-py3-none-any.whl + hash: + sha256: 5d9e95ca0faa78943ed66f6bc658dd637430f16125d86988e77844c741ff2f11 + category: main + optional: false +- name: jaraco.context + version: 4.3.0 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/0a/de/3f889cd55e69f0a91b396f6799ca31ea0d6869cde338e7c79335699090cb/jaraco.context-4.3.0-py3-none-any.whl + hash: + sha256: 5d9e95ca0faa78943ed66f6bc658dd637430f16125d86988e77844c741ff2f11 + category: main + optional: false +- name: jaraco.context + version: 4.3.0 + manager: pip + platform: osx-arm64 + dependencies: {} + url: https://files.pythonhosted.org/packages/0a/de/3f889cd55e69f0a91b396f6799ca31ea0d6869cde338e7c79335699090cb/jaraco.context-4.3.0-py3-none-any.whl + hash: + sha256: 5d9e95ca0faa78943ed66f6bc658dd637430f16125d86988e77844c741ff2f11 + category: main + optional: false +- name: jaraco.functools + version: 4.0.0 + manager: pip + platform: linux-64 + dependencies: + more-itertools: '*' + url: https://files.pythonhosted.org/packages/4c/57/726a9c80c1b36f98b497debd72f4c81ae444d55abf9647367e5d53e1cc93/jaraco.functools-4.0.0-py3-none-any.whl + hash: + sha256: daf276ddf234bea897ef14f43c4e1bf9eefeac7b7a82a4dd69228ac20acff68d + category: main + optional: false +- name: jaraco.functools + version: 4.0.0 + manager: pip + platform: osx-64 + dependencies: + more-itertools: '*' + url: https://files.pythonhosted.org/packages/4c/57/726a9c80c1b36f98b497debd72f4c81ae444d55abf9647367e5d53e1cc93/jaraco.functools-4.0.0-py3-none-any.whl + hash: + sha256: daf276ddf234bea897ef14f43c4e1bf9eefeac7b7a82a4dd69228ac20acff68d + category: main + optional: false +- name: jaraco.functools + version: 4.0.0 + manager: pip + platform: osx-arm64 + dependencies: + more-itertools: '*' + url: https://files.pythonhosted.org/packages/4c/57/726a9c80c1b36f98b497debd72f4c81ae444d55abf9647367e5d53e1cc93/jaraco.functools-4.0.0-py3-none-any.whl + hash: + sha256: daf276ddf234bea897ef14f43c4e1bf9eefeac7b7a82a4dd69228ac20acff68d + category: main + optional: false - name: llvmlite version: 0.41.1 manager: pip @@ -17686,6 +27122,16 @@ package: sha256: 24091a6b31242bcdd56ae2dbea40007f462260bc9bdf947953acc39dffd54f8f category: main optional: false +- name: llvmlite + version: 0.41.1 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/fc/7a/c6741000d767fed4b339fcd4fa65afbc5fe776473d5f9e9c41eceab0a7c6/llvmlite-0.41.1-cp39-cp39-macosx_10_9_x86_64.whl + hash: + sha256: 04725975e5b2af416d685ea0769f4ecc33f97be541e301054c9f741003085802 + category: main + optional: false - name: llvmlite version: 0.41.1 manager: pip @@ -17711,6 +27157,21 @@ package: sha256: e438ead6eb8dc536dbf8c74365e007d88d6187196f2d0756b77d6551bf35a686 category: main optional: false +- name: modin + version: 0.22.3 + manager: pip + platform: osx-64 + dependencies: + pandas: 1.5.3 + packaging: '*' + numpy: '>=1.18.5' + fsspec: '*' + psutil: '*' + url: https://files.pythonhosted.org/packages/79/68/e560890fe0b8b89eb55e30bf7c11c4f43d1975da578e516a0996a7fce562/modin-0.22.3-py3-none-any.whl + hash: + sha256: e438ead6eb8dc536dbf8c74365e007d88d6187196f2d0756b77d6551bf35a686 + category: main + optional: false - name: modin version: 0.22.3 manager: pip @@ -17738,6 +27199,18 @@ package: sha256: 45698b995914003f890ad839cfc909eeb9c74921849c712a05405d1a79c50f68 category: main optional: false +- name: numba + version: 0.58.1 + manager: pip + platform: osx-64 + dependencies: + llvmlite: '>=0.41.0dev0,<0.42' + numpy: '>=1.22,<1.27' + url: https://files.pythonhosted.org/packages/b5/de/e2ef933a99c502d2ec5dda1a43a74ab98b1b606c0ff17422d42c62a6f00f/numba-0.58.1-cp39-cp39-macosx_10_9_x86_64.whl + hash: + sha256: 5c765aef472a9406a97ea9782116335ad4f9ef5c9f93fc05fd44aab0db486954 + category: main + optional: false - name: numba version: 0.58.1 manager: pip @@ -17763,6 +27236,19 @@ package: sha256: 9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5 category: main optional: false +- name: pandas + version: 1.5.3 + manager: pip + platform: osx-64 + dependencies: + python-dateutil: '>=2.8.1' + pytz: '>=2020.1' + numpy: '>=1.20.3' + url: https://files.pythonhosted.org/packages/02/4a/8e2513db9d15929b833147f975d8424dc6a3e18100ead10aab78756a1aad/pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl + hash: + sha256: c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee + category: main + optional: false - name: pandas version: 1.5.3 manager: pip @@ -17788,6 +27274,18 @@ package: sha256: 0486413077a527db51ddea8fa94a5234d0feb17a4f4dc01b59b6086c58a70f80 category: main optional: false +- name: patsy + version: 0.5.4 + manager: pip + platform: osx-64 + dependencies: + six: '*' + numpy: '>=1.4' + url: https://files.pythonhosted.org/packages/29/ab/373449d6f741732f94e2d15d116a90f050b2857cb727b26d2f7bead50815/patsy-0.5.4-py2.py3-none-any.whl + hash: + sha256: 0486413077a527db51ddea8fa94a5234d0feb17a4f4dc01b59b6086c58a70f80 + category: main + optional: false - name: patsy version: 0.5.4 manager: pip @@ -17815,6 +27313,21 @@ package: sha256: cfed89c9a1bb88d80df8259bb30aa650244c877aaaca218025d92324074716b9 category: main optional: false +- name: phik + version: 0.12.3 + manager: pip + platform: osx-64 + dependencies: + numpy: '>=1.18.0' + scipy: '>=1.5.2' + pandas: '>=0.25.1' + matplotlib: '>=2.2.3' + joblib: '>=0.14.1' + url: https://files.pythonhosted.org/packages/11/53/b1f8520fc7f90904cfb7dd5765cace015069cacf45953f62f0dccc74a073/phik-0.12.3-cp39-cp39-macosx_10_13_x86_64.whl + hash: + sha256: dfbb20614288df46970640c9127f500f7e03a66631bb9aa3774a2f5222f19f75 + category: main + optional: false - name: phik version: 0.12.3 manager: pip @@ -17827,13 +27340,26 @@ package: joblib: '>=0.14.1' url: https://files.pythonhosted.org/packages/11/c0/ae6bed243d3e7194a4a2b31e32682ca852cff7b564b38b4e5493cc4f4e49/phik-0.12.3-cp39-cp39-macosx_11_0_arm64.whl hash: - sha256: baac8ace316b801cdb38c84cd0e7e35e60d17d50032c34af9879b0cd91c20861 + sha256: baac8ace316b801cdb38c84cd0e7e35e60d17d50032c34af9879b0cd91c20861 + category: main + optional: false +- name: pydantic + version: 2.5.2 + manager: pip + platform: linux-64 + dependencies: + annotated-types: '>=0.4.0' + pydantic-core: 2.14.5 + typing-extensions: '>=4.6.1' + url: https://files.pythonhosted.org/packages/0a/2b/64066de1c4cf3d4ed623beeb3bbf3f8d0cc26661f1e7d180ec5eb66b75a5/pydantic-2.5.2-py3-none-any.whl + hash: + sha256: 80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 category: main optional: false - name: pydantic version: 2.5.2 manager: pip - platform: linux-64 + platform: osx-64 dependencies: annotated-types: '>=0.4.0' pydantic-core: 2.14.5 @@ -17867,6 +27393,17 @@ package: sha256: c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db category: main optional: false +- name: pydantic-core + version: 2.14.5 + manager: pip + platform: osx-64 + dependencies: + typing-extensions: '>=4.6.0,<4.7.0 || >4.7.0' + url: https://files.pythonhosted.org/packages/9a/e1/c33fcdbdad7f5c29376fa2e57f8d60f966c44fc77fc36a70d0ae03bbe813/pydantic_core-2.14.5-cp39-cp39-macosx_10_7_x86_64.whl + hash: + sha256: a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 + category: main + optional: false - name: pydantic-core version: 2.14.5 manager: pip @@ -17889,6 +27426,17 @@ package: sha256: 49aa6abf9ac941f47f7ea26a3c7dd5c8bfcf0e903dc5ec68ed105b52bfccd4e2 category: main optional: false +- name: pywavelets + version: 1.5.0 + manager: pip + platform: osx-64 + dependencies: + numpy: '>=1.22.4,<2.0' + url: https://files.pythonhosted.org/packages/b0/a8/787508e85d579d0990b344410acdba4b6f45f19284404d2895cc8a35769d/pywavelets-1.5.0-cp39-cp39-macosx_10_13_x86_64.whl + hash: + sha256: 34d189aed544687500a2fba5b8970951a76f62f1d140cc5f9440d9b32b14b8f5 + category: main + optional: false - name: pywavelets version: 1.5.0 manager: pip @@ -17922,6 +27470,28 @@ package: sha256: 18d033cc468e5171d9995476c33f99a5b79f091c34265c7e9f3d8b1c9042437e category: main optional: false +- name: ray + version: 2.6.3 + manager: pip + platform: osx-64 + dependencies: + click: '>=7.0' + filelock: '*' + jsonschema: '*' + msgpack: '>=1.0.0,<2.0.0' + packaging: '*' + protobuf: '>=3.15.3,<3.19.5 || >3.19.5' + pyyaml: '*' + aiosignal: '*' + frozenlist: '*' + requests: '*' + grpcio: '>=1.32.0' + numpy: '>=1.19.3' + url: https://files.pythonhosted.org/packages/8a/78/7c241d4c34cfb342749158ab483709a65ceae727883261f2f4998b485d9f/ray-2.6.3-cp39-cp39-macosx_10_15_x86_64.whl + hash: + sha256: 3ccf809e5948333c1c8c81694514b5900259e79cbdc8bddd3680695820cafcf2 + category: main + optional: false - name: ray version: 2.6.3 manager: pip @@ -17957,6 +27527,19 @@ package: sha256: 77b5b12e9fa6bb7ab623e7be5bfbd7523c83a2ea72c48f6f6f4d5e3df87ac896 category: main optional: false +- name: readthedocs-sphinx-ext + version: 2.2.4 + manager: pip + platform: osx-64 + dependencies: + requests: '*' + jinja2: '>=2.9' + packaging: '*' + url: https://files.pythonhosted.org/packages/12/45/c0db0a248a10395a6d8d3cacff3a50279b62f0fe165c2b23341c43db7d18/readthedocs_sphinx_ext-2.2.4-py2.py3-none-any.whl + hash: + sha256: 77b5b12e9fa6bb7ab623e7be5bfbd7523c83a2ea72c48f6f6f4d5e3df87ac896 + category: main + optional: false - name: readthedocs-sphinx-ext version: 2.2.4 manager: pip @@ -17981,6 +27564,17 @@ package: sha256: ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d category: main optional: false +- name: s3transfer + version: 0.10.1 + manager: pip + platform: osx-64 + dependencies: + botocore: '>=1.33.2,<2.0a.0' + url: https://files.pythonhosted.org/packages/83/37/395cdb6ee92925fa211e55d8f07b9f93cf93f60d7d4ce5e66fd73f1ea986/s3transfer-0.10.1-py3-none-any.whl + hash: + sha256: ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d + category: main + optional: false - name: s3transfer version: 0.10.1 manager: pip @@ -18003,6 +27597,17 @@ package: sha256: 91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937 category: main optional: false +- name: scipy + version: 1.11.4 + manager: pip + platform: osx-64 + dependencies: + numpy: '>=1.21.6,<1.28.0' + url: https://files.pythonhosted.org/packages/c5/e0/9872b7923c0ff7a420af8f559d0f5c6831143477b4ce57afe1b2a7c59a63/scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl + hash: + sha256: 6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7 + category: main + optional: false - name: scipy version: 1.11.4 manager: pip @@ -18027,6 +27632,19 @@ package: sha256: ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08 category: main optional: false +- name: seaborn + version: 0.12.2 + manager: pip + platform: osx-64 + dependencies: + numpy: '>=1.17,<1.24.0 || >1.24.0' + pandas: '>=0.25' + matplotlib: '>=3.1,<3.6.1 || >3.6.1' + url: https://files.pythonhosted.org/packages/8f/2e/17bbb83fbf102687bb2aa3d808add39da820a7698159302a1a69bb82e01c/seaborn-0.12.2-py3-none-any.whl + hash: + sha256: ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08 + category: main + optional: false - name: seaborn version: 0.12.2 manager: pip @@ -18053,6 +27671,19 @@ package: sha256: 8c7d680fabb9fe45a74d036c967a61ef574fe1bd49d1539a74f52b9abbe50207 category: main optional: false +- name: sphinx-code-include + version: 1.1.1 + manager: pip + platform: osx-64 + dependencies: + beautifulsoup4: '>=4.8' + six: '>=1.12' + sphinx: '>=1.3' + url: https://files.pythonhosted.org/packages/89/bf/95e6eb1b9a5cf502684006c9ac8a11f7d543a95a45856dcaf8f7bf9b31f1/sphinx_code_include-1.1.1-py2.py3-none-any.whl + hash: + sha256: 8c7d680fabb9fe45a74d036c967a61ef574fe1bd49d1539a74f52b9abbe50207 + category: main + optional: false - name: sphinx-code-include version: 1.1.1 manager: pip @@ -18080,7 +27711,7 @@ package: - name: sphinx-markdown-tables version: 0.0.17 manager: pip - platform: osx-arm64 + platform: osx-64 dependencies: markdown: '>=3.4' url: https://files.pythonhosted.org/packages/93/8d/8785a36892992582ef8d87c69ab90e26124ab1059c501d93ebecd99d2323/sphinx_markdown_tables-0.0.17-py3-none-any.whl @@ -18088,32 +27719,32 @@ package: sha256: 2bd0c30779653e4dd120300cbd9ca412c480738cc2241f6dea477a883f299e04 category: main optional: false -- name: sphinx-new-tab-link - version: 0.2.3 +- name: sphinx-markdown-tables + version: 0.0.17 manager: pip - platform: linux-64 + platform: osx-arm64 dependencies: - sphinx: '*' - url: https://files.pythonhosted.org/packages/23/b4/8269282568ac9e26dbefdbdb642e89b8f2b211ef9f5f00f50a466c05f0b6/sphinx_new_tab_link-0.2.3-py3-none-any.whl + markdown: '>=3.4' + url: https://files.pythonhosted.org/packages/93/8d/8785a36892992582ef8d87c69ab90e26124ab1059c501d93ebecd99d2323/sphinx_markdown_tables-0.0.17-py3-none-any.whl hash: - sha256: 2321b633170d8e33acae8afb96b3d7d9a8b3f081271987ae12a53151e2a0ab56 + sha256: 2bd0c30779653e4dd120300cbd9ca412c480738cc2241f6dea477a883f299e04 category: main optional: false -- name: sphinx-new-tab-link - version: 0.2.3 +- name: sphinxcontrib-video + version: 0.2.0 manager: pip - platform: osx-arm64 + platform: linux-64 dependencies: sphinx: '*' - url: https://files.pythonhosted.org/packages/23/b4/8269282568ac9e26dbefdbdb642e89b8f2b211ef9f5f00f50a466c05f0b6/sphinx_new_tab_link-0.2.3-py3-none-any.whl + url: https://files.pythonhosted.org/packages/76/7e/d346546cfc532a52c3a3c961100ea023e77a0c1c51b1ab5a500421a285c6/sphinxcontrib_video-0.2.0-py3-none-any.whl hash: - sha256: 2321b633170d8e33acae8afb96b3d7d9a8b3f081271987ae12a53151e2a0ab56 + sha256: 8973278316c02547efd0910bfd69205385462c423885cf03edc28b1c66f3b23c category: main optional: false - name: sphinxcontrib-video version: 0.2.0 manager: pip - platform: linux-64 + platform: osx-64 dependencies: sphinx: '*' url: https://files.pythonhosted.org/packages/76/7e/d346546cfc532a52c3a3c961100ea023e77a0c1c51b1ab5a500421a285c6/sphinxcontrib_video-0.2.0-py3-none-any.whl @@ -18143,6 +27774,17 @@ package: sha256: e91378f07f378e6ca435246e07334c19a8c16b9baf6e180fc3e428a359846ea2 category: main optional: false +- name: sphinxext-remoteliteralinclude + version: 0.4.0 + manager: pip + platform: osx-64 + dependencies: + six: '*' + url: https://files.pythonhosted.org/packages/13/0d/7e5009f48c33d5fd533dda80b42c4a79fce8dfdd1b617d0a9df9a9836145/sphinxext_remoteliteralinclude-0.4.0-py3-none-any.whl + hash: + sha256: e91378f07f378e6ca435246e07334c19a8c16b9baf6e180fc3e428a359846ea2 + category: main + optional: false - name: sphinxext-remoteliteralinclude version: 0.4.0 manager: pip @@ -18169,6 +27811,21 @@ package: sha256: 68b1c768dd94cc5ba8398121a632b673c625491aa7ed627b82cb4c880a25563f category: main optional: false +- name: statsmodels + version: 0.14.0 + manager: pip + platform: osx-64 + dependencies: + numpy: '>=1.18' + scipy: '>=1.4,<1.9.2 || >1.9.2' + pandas: '>=1.0' + patsy: '>=0.5.2' + packaging: '>=21.3' + url: https://files.pythonhosted.org/packages/cb/c2/37e017b50ce4f368a904f6b4d753520bd49ccc56aefc4610fc64e383f56c/statsmodels-0.14.0-cp39-cp39-macosx_10_9_x86_64.whl + hash: + sha256: 1c7724ad573af26139a98393ae64bc318d1b19762b13442d96c7a3e793f495c3 + category: main + optional: false - name: statsmodels version: 0.14.0 manager: pip @@ -18194,6 +27851,16 @@ package: sha256: 154be12605b1687a17133aa741ae951cf9ee531c48a0c19f98d83ec5cb3cc7be category: main optional: false +- name: tangled-up-in-unicode + version: 0.2.0 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/dd/60/3651960b74aead282ec1ad819e70bdccf3ee73322d13d4339a6e3f5b7ed3/tangled_up_in_unicode-0.2.0-py3-none-any.whl + hash: + sha256: 154be12605b1687a17133aa741ae951cf9ee531c48a0c19f98d83ec5cb3cc7be + category: main + optional: false - name: tangled-up-in-unicode version: 0.2.0 manager: pip @@ -18214,6 +27881,16 @@ package: sha256: f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274 category: main optional: false +- name: typed-ast + version: 1.5.5 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/b1/88/6e7f36f5fab6fbf0586a2dd866ac337924b7d4796a4d1b2b04443a864faf/typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl + hash: + sha256: 042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10 + category: main + optional: false - name: typed-ast version: 1.5.5 manager: pip @@ -18235,6 +27912,17 @@ package: sha256: c6cf08e120ca9f0dc4fa4e32c3f953c3fba222bcc1db6b97695bce8da1ba9864 category: main optional: false +- name: types-requests + version: 2.30.0.0 + manager: pip + platform: osx-64 + dependencies: + types-urllib3: '*' + url: https://files.pythonhosted.org/packages/fa/c7/024171d587afe75934a6f779922d24fcc6dd468e947c74598eb17840e229/types_requests-2.30.0.0-py3-none-any.whl + hash: + sha256: c6cf08e120ca9f0dc4fa4e32c3f953c3fba222bcc1db6b97695bce8da1ba9864 + category: main + optional: false - name: types-requests version: 2.30.0.0 manager: pip @@ -18256,6 +27944,16 @@ package: sha256: 9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e category: main optional: false +- name: types-urllib3 + version: 1.26.25.14 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/11/7b/3fc711b2efea5e85a7a0bbfe269ea944aa767bbba5ec52f9ee45d362ccf3/types_urllib3-1.26.25.14-py3-none-any.whl + hash: + sha256: 9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e + category: main + optional: false - name: types-urllib3 version: 1.26.25.14 manager: pip @@ -18284,6 +27982,24 @@ package: sha256: 1e57219715255282a909cfb93d25d6e453535aa0c26640a0d6f03e40be6263d7 category: main optional: false +- name: visions + version: 0.7.5 + manager: pip + platform: osx-64 + dependencies: + numpy: '*' + pandas: '>=0.25.3' + attrs: '>=19.3.0' + networkx: '>=2.4' + tangled-up-in-unicode: '>=0.0.4' + multimethod: '>=1.4' + imagehash: '*' + pillow: '*' + url: https://files.pythonhosted.org/packages/62/fa/6a8539c83d2ccbd08d5f0c843b1784af9ff514e77f4c9d5d6800fdd340f6/visions-0.7.5-py3-none-any.whl + hash: + sha256: 1e57219715255282a909cfb93d25d6e453535aa0c26640a0d6f03e40be6263d7 + category: main + optional: false - name: visions version: 0.7.5 manager: pip @@ -18314,6 +28030,18 @@ package: sha256: 540f85f490b00abcd29237a6bf39967fea85cac452f1262a762a6667bf0a5f7a category: main optional: false +- name: whylabs-client + version: 0.5.9 + manager: pip + platform: osx-64 + dependencies: + urllib3: '>=1.25.3' + python-dateutil: '*' + url: https://files.pythonhosted.org/packages/b1/48/a7a8d3d55a4751497c68f2fd1c3da1bfb1145a47870ae571295de8fa329d/whylabs_client-0.5.9-py3-none-any.whl + hash: + sha256: 540f85f490b00abcd29237a6bf39967fea85cac452f1262a762a6667bf0a5f7a + category: main + optional: false - name: whylabs-client version: 0.5.9 manager: pip @@ -18343,6 +28071,23 @@ package: sha256: 8aeab6ff2634a6bbf2adc5b6ee34b2e29eadecfb64a5f50f1a95b1b28b358531 category: main optional: false +- name: whylogs + version: 1.3.3 + manager: pip + platform: osx-64 + dependencies: + platformdirs: '>=3.5.0,<4.0.0' + protobuf: '>=3.19.4' + requests: '>=2.27,<3.0' + types-requests: '>=2.30.0.0,<3.0.0.0' + typing-extensions: '>=3.10' + whylabs-client: '>=0.5.5,<0.6.0' + whylogs-sketching: '>=3.4.1.dev3' + url: https://files.pythonhosted.org/packages/91/cc/2c90e7ef06e940bf912d5b0a7373b9f15547efdf07a38ddcc6e739d9981b/whylogs-1.3.3-py3-none-any.whl + hash: + sha256: 8aeab6ff2634a6bbf2adc5b6ee34b2e29eadecfb64a5f50f1a95b1b28b358531 + category: main + optional: false - name: whylogs version: 1.3.3 manager: pip @@ -18370,6 +28115,16 @@ package: sha256: d1d6e7d0ddb66ab725d7af63518ef6a24cd45b075b81e1d2081709df4c989853 category: main optional: false +- name: whylogs-sketching + version: 3.4.1.dev3 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/36/f9/baa5edfc07aa551e951111523d71b207793de843ca5a47bddd93ed0e5047/whylogs_sketching-3.4.1.dev3-cp39-cp39-macosx_10_9_x86_64.whl + hash: + sha256: 832247fd9d3ecf13791418a75c359db6c3aeffd51d7372d026e95f307ef286cc + category: main + optional: false - name: whylogs-sketching version: 3.4.1.dev3 manager: pip @@ -18393,6 +28148,19 @@ package: sha256: 91e025b5e50d814601703aa4878dbafdceaa0a3e64d42cd1633317d9b829bb64 category: main optional: false +- name: wordcloud + version: 1.9.2 + manager: pip + platform: osx-64 + dependencies: + numpy: '>=1.6.1' + pillow: '*' + matplotlib: '*' + url: https://files.pythonhosted.org/packages/6a/cf/4b158a4847515c757398a6762e0c0473278dfe6cfb5dd018e09853b25dba/wordcloud-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl + hash: + sha256: 139f0dbf6b6aeb32a20ccb383320dde514297c9aeba9b6cc7a82f4bb2502b1f9 + category: main + optional: false - name: wordcloud version: 1.9.2 manager: pip @@ -18436,6 +28204,36 @@ package: sha256: 156d68a20f1a1de4c449177291e4eed07e46429d332d162243d8bf2c61f60903 category: main optional: false +- name: ydata-profiling + version: 4.6.3 + manager: pip + platform: osx-64 + dependencies: + scipy: '>=1.4.1,<1.12' + pandas: '>1.1,<1.4.0 || >1.4.0,<3' + matplotlib: '>=3.2,<3.9' + pydantic: '>=2' + pyyaml: '>=5.0.0,<6.1' + jinja2: '>=2.11.1,<3.2' + visions: 0.7.5 + numpy: '>=1.16.0,<1.26' + htmlmin: 0.1.12 + phik: '>=0.11.1,<0.13' + requests: '>=2.24.0,<3' + tqdm: '>=4.48.2,<5' + seaborn: '>=0.10.1,<0.13' + multimethod: '>=1.4,<2' + statsmodels: '>=0.13.2,<1' + typeguard: '>=4.1.2,<5' + imagehash: 4.3.1 + wordcloud: '>=1.9.1' + dacite: '>=1.8' + numba: '>=0.56.0,<0.59.0' + url: https://files.pythonhosted.org/packages/c6/12/a869b9f81c992a179a27d76154b3ae3c1a65a43c9ec117437762093a75ca/ydata_profiling-4.6.3-py2.py3-none-any.whl + hash: + sha256: 156d68a20f1a1de4c449177291e4eed07e46429d332d162243d8bf2c61f60903 + category: main + optional: false - name: ydata-profiling version: 4.6.3 manager: pip diff --git a/monodocs-environment.yaml b/monodocs-environment.yaml index 988086cd0f..82ce9868f1 100644 --- a/monodocs-environment.yaml +++ b/monodocs-environment.yaml @@ -76,7 +76,6 @@ dependencies: - ray==2.6.3 - duckdb - aioboto3>=12.3.0 # aws sagemaker inference - - sphinx-new-tab-link platforms: - linux-64 From a78025afc872cb54add637302da47201ed69c021 Mon Sep 17 00:00:00 2001 From: David Espejo <82604841+davidmirror-ops@users.noreply.github.com> Date: Mon, 1 Apr 2024 12:23:15 -0500 Subject: [PATCH 383/645] Update K8s plugin config docs (#5070) * Change intro and reorder sections Signed-off-by: davidmirror-ops * Update K8s operator install instructions Signed-off-by: davidmirror-ops * Reorder plugin config part 1 Signed-off-by: davidmirror-ops * Update Ray config and introduce cloud tabs Signed-off-by: davidmirror-ops * Update Spark config for binary on AWS Signed-off-by: davidmirror-ops * Complete Spark config on AWS Signed-off-by: davidmirror-ops * Add Spark config for core on GCP Signed-off-by: davidmirror-ops * Add Spark config for binary on GCP Signed-off-by: davidmirror-ops * Remove upgrade deployment instructions (already covered) Signed-off-by: davidmirror-ops * Remove repeated Helm upgrade instructions Signed-off-by: davidmirror-ops * Update Helm upgrade instructions Signed-off-by: davidmirror-ops * Add link to examples Signed-off-by: davidmirror-ops * Fix lint error 01 Signed-off-by: davidmirror-ops * Fix anon link Signed-off-by: davidmirror-ops * Fix Kubeflow operator instructions Signed-off-by: davidmirror-ops * reorder tabs for Spark config Signed-off-by: davidmirror-ops * Fix bottom link Signed-off-by: davidmirror-ops * Fix lint error Signed-off-by: davidmirror-ops * Fix lint error in text below gang sch Signed-off-by: davidmirror-ops * Fix notes sections Signed-off-by: davidmirror-ops * Fix notes sections v2 Signed-off-by: davidmirror-ops * Fix notes indentation v1 Signed-off-by: davidmirror-ops * Fix notes indentation v2 Signed-off-by: davidmirror-ops * Apply reviews Signed-off-by: davidmirror-ops --------- Signed-off-by: davidmirror-ops Co-authored-by: davidmirror-ops --- docs/deployment/plugins/k8s/index.rst | 1508 +++++++++++++------------ 1 file changed, 760 insertions(+), 748 deletions(-) diff --git a/docs/deployment/plugins/k8s/index.rst b/docs/deployment/plugins/k8s/index.rst index 7e1c103eec..0d00e737e1 100644 --- a/docs/deployment/plugins/k8s/index.rst +++ b/docs/deployment/plugins/k8s/index.rst @@ -5,376 +5,23 @@ Configure Kubernetes Plugins .. tags:: Kubernetes, Integration, Spark, AWS, GCP, Advanced -This guide provides an overview of setting up the Kubernetes Operator backend plugin in your Flyte deployment. - -Spin up a cluster ------------------ - -.. tabs:: - - .. group-tab:: Flyte binary - - .. tabs:: - - .. group-tab:: Demo cluster - - .. tabs:: - - .. group-tab:: PyTorch - - Enable the PyTorch plugin on the demo cluster by adding the following block to ``~/.flyte/sandbox/config.yaml``: - - .. code-block:: yaml - - tasks: - task-plugins: - default-for-task-types: - container: container - container_array: k8s-array - sidecar: sidecar - pytorch: pytorch - enabled-plugins: - - container - - k8s-array - - sidecar - - pytorch - - .. group-tab:: TensorFlow - - Enable the TensorFlow plugin on the demo cluster by adding the following block to ``~/.flyte/sandbox/config.yaml``: - - .. code-block:: yaml - - tasks: - task-plugins: - default-for-task-types: - container: container - container_array: k8s-array - sidecar: sidecar - tensorflow: tensorflow - enabled-plugins: - - container - - k8s-array - - sidecar - - tensorflow - - .. group-tab:: MPI - - Enable the MPI plugin on the demo cluster by adding the following block to ``~/.flyte/sandbox/config.yaml``: - - .. code-block:: yaml - - tasks: - task-plugins: - default-for-task-types: - container: container - container_array: k8s-array - sidecar: sidecar - mpi: mpi - enabled-plugins: - - container - - k8s-array - - sidecar - - mpi - - .. group-tab:: Ray - - Enable the Ray plugin on the demo cluster by adding the following block to ``~/.flyte/sandbox/config.yaml``: - - .. code-block:: yaml - - tasks: - task-plugins: - default-for-task-types: - container: container - container_array: k8s-array - sidecar: sidecar - ray: ray - enabled-plugins: - - container - - k8s-array - - sidecar - - ray - - .. group-tab:: Spark - - Enable the Spark plugin on the demo cluster by adding the following config to ``~/.flyte/sandbox/config.yaml``: - - .. code-block:: yaml - - tasks: - task-plugins: - default-for-task-types: - container: container - container_array: k8s-array - sidecar: sidecar - spark: spark - enabled-plugins: - - container - - sidecar - - k8s-array - - spark - plugins: - spark: - spark-config-default: - - spark.driver.cores: "1" - - spark.hadoop.fs.s3a.aws.credentials.provider: "org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider" - - spark.hadoop.fs.s3a.endpoint: "http://minio.flyte:9000" - - spark.hadoop.fs.s3a.access.key: "minio" - - spark.hadoop.fs.s3a.secret.key: "miniostorage" - - spark.hadoop.fs.s3a.path.style.access: "true" - - spark.kubernetes.allocation.batch.size: "50" - - spark.hadoop.fs.s3a.acl.default: "BucketOwnerFullControl" - - spark.hadoop.fs.s3n.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3n.impl: "org.apache.hadoop.fs.s3a.S3A" - - spark.hadoop.fs.s3.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3.impl: "org.apache.hadoop.fs.s3a.S3A" - - spark.hadoop.fs.s3a.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3a.impl: "org.apache.hadoop.fs.s3a.S3A" - cluster_resources: - refreshInterval: 5m - customData: - - production: - - projectQuotaCpu: - value: "5" - - projectQuotaMemory: - value: "4000Mi" - - staging: - - projectQuotaCpu: - value: "2" - - projectQuotaMemory: - value: "3000Mi" - - development: - - projectQuotaCpu: - value: "4" - - projectQuotaMemory: - value: "5000Mi" - refresh: 5m - - Also add the following cluster resource templates to the ``~/.flyte/sandbox/cluster-resource-templates`` directory: - - 1. ``serviceaccount.yaml`` - - .. code-block:: yaml - - apiVersion: v1 - kind: ServiceAccount - metadata: - name: default - namespace: "{{ namespace }}" - annotations: - eks.amazonaws.com/role-arn: "{{ defaultIamRole }}" - - 2. ``spark_role.yaml`` - - .. code-block:: yaml - - apiVersion: rbac.authorization.k8s.io/v1 - kind: Role - metadata: - name: spark-role - namespace: "{{ namespace }}" - rules: - - apiGroups: - - "" - resources: - - pods - - services - - configmaps - verbs: - - "*" - - 3. ``spark_service_account.yaml`` - - .. code-block:: yaml - - apiVersion: v1 - kind: ServiceAccount - metadata: - name: spark - namespace: "{{ namespace }}" - annotations: - eks.amazonaws.com/role-arn: "{{ defaultIamRole }}" - - 4. ``spark_role_binding.yaml`` - - .. code-block:: yaml - - apiVersion: rbac.authorization.k8s.io/v1 - kind: RoleBinding - metadata: - name: spark-role-binding - namespace: "{{ namespace }}" - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: spark-role - subjects: - - kind: ServiceAccount - name: spark - namespace: "{{ namespace }}" - - .. group-tab:: Dask - - Enable the Dask plugin on the demo cluster by adding the following block to ``~/.flyte/sandbox/config.yaml``: - - .. code-block:: yaml - - tasks: - task-plugins: - default-for-task-types: - container: container - container_array: k8s-array - sidecar: sidecar - dask: dask - enabled-plugins: - - container - - k8s-array - - sidecar - - dask - - Start the demo cluster by running the following command: - - .. code-block:: bash - - flytectl demo start - - .. group-tab:: Helm chart - - 1. Add the following to your values file under `configmap.inline`: - - .. code-block:: yaml - - tasks: - task-plugins: - enabled-plugins: - - container - - sidecar - - K8S-ARRAY - - spark - - ray - default-for-task-types: - - container: container - - container_array: K8S-ARRAY - - spark: spark - - ray: ray - - 2. Install the :ref:`flyte-binary Helm chart `. - - .. group-tab:: Flyte core - - If you have installed Flyte using the `flyte-core Helm chart - `__, please ensure: - - * You have the correct kubeconfig and have selected the correct Kubernetes context. - - * You have configured the correct flytectl settings in ``~/.flyte/config.yaml``. - -.. note:: - - Add the Flyte chart repo to Helm if you're installing via the Helm charts. - - .. code-block:: bash - - helm repo add flyteorg https://flyteorg.github.io/flyte - - .. tabs:: - - If you have installed Flyte using the `flyte-sandbox Helm chart `__, please ensure: - - * You have the correct kubeconfig and have selected the correct Kubernetes context. - - * You have configured the correct flytectl settings in ``~/.flyte/config.yaml``. - - * You have the correct kubeconfig and have selected the correct Kubernetes context. - * You have configured the correct flytectl settings in ``~/.flyte/config.yaml``. - - .. tabs:: - - .. group-tab:: Helm chart - - .. tabs:: - - .. group-tab:: Spark - - create the following four files and apply them using ``kubectl apply -f ``: - - 1. ``serviceaccount.yaml`` - - .. code-block:: yaml - - apiVersion: v1 - kind: ServiceAccount - metadata: - name: default - namespace: "{{ namespace }}" - annotations: - eks.amazonaws.com/role-arn: "{{ defaultIamRole }}" - - 2. ``spark_role.yaml`` - - .. code-block:: yaml - - apiVersion: rbac.authorization.k8s.io/v1 - kind: Role - metadata: - name: spark-role - namespace: "{{ namespace }}" - rules: - - apiGroups: - - "" - resources: - - pods - - services - - configmaps - verbs: - - "*" - - 3. ``spark_service_account.yaml`` - - .. code-block:: yaml - - apiVersion: v1 - kind: ServiceAccount - metadata: - name: spark - namespace: "{{ namespace }}" - annotations: - eks.amazonaws.com/role-arn: "{{ defaultIamRole }}" - - 4. ``spark_role_binding.yaml`` - - .. code-block:: yaml - - apiVersion: rbac.authorization.k8s.io/v1 - kind: RoleBinding - metadata: - name: spark-role-binding - namespace: "{{ namespace }}" - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: spark-role - subjects: - - kind: ServiceAccount - name: spark - namespace: "{{ namespace }}" +This guide will help you configure the Flyte plugins that provision resources on Kubernetes. +The steps are defined in terms of the `deployment method `__ you used to install Flyte. Install the Kubernetes operator ------------------------------- +Select the integration you need and follow the steps to install the corresponding Kubernetes operator: + .. tabs:: .. group-tab:: PyTorch/TensorFlow/MPI - First, `install kustomize `__. + 1. Install the `Kubeflow training-operator `__: - Build and apply the training-operator. - .. code-block:: bash - - export KUBECONFIG=$KUBECONFIG:~/.kube/config:~/.flyte/k3s/k3s.yaml - kustomize build "https://github.com/kubeflow/training-operator.git/manifests/overlays/standalone?ref=v1.5.0" | kubectl apply -f - + + kubectl apply -k "github.com/kubeflow/training-operator/manifests/overlays/standalone" **Optional: Using a gang scheduler** @@ -382,91 +29,55 @@ Install the Kubernetes operator due to resource constraints, you can opt for a gang scheduler. This ensures that all worker pods are scheduled simultaneously, reducing the likelihood of job failures caused by timeout errors. - To `enable gang scheduling for the Kubeflow training-operator `__, - you can install the `Kubernetes scheduler plugins `__ - or the `Apache YuniKorn scheduler `__. - - 1. Install the `scheduler plugin `_ or - `Apache YuniKorn `_ as a second scheduler. - 2. Configure the Kubeflow training-operator to use the new scheduler: - - Create a manifest called ``kustomization.yaml`` with the following content: - - .. code-block:: yaml - - apiVersion: kustomize.config.k8s.io/v1beta1 - kind: Kustomization - - resources: - - github.com/kubeflow/training-operator/manifests/overlays/standalone + To enable gang scheduling for the ``training-operator``: - patchesStrategicMerge: - - patch.yaml + a. Select a second scheduler from + `Kubernetes scheduler plugins with co-scheduling `__ + or `Apache YuniKorn `__ . - Create a patch file called ``patch.yaml`` with the following content: + b. Configure a Flyte ``PodTemplate`` to use the gang scheduler for your Tasks: + + **K8s scheduler plugins with co-scheduling** - .. code-block:: yaml + .. code-block:: yaml - apiVersion: apps/v1 - kind: Deployment - metadata: - name: training-operator + template: spec: - template: - spec: - containers: - - name: training-operator - command: - - /manager - - --gang-scheduler-name= - - Install the patched kustomization with the following command: - - .. code-block:: bash - - kustomize build path/to/overlay/directory | kubectl apply -f - + schedulerName: "scheduler-plugins-scheduler" - (Only for Apache YuniKorn) To configure gang scheduling with Apache YuniKorn, - make sure to set the following annotations in Flyte pod templates: - - - ``template.metadata.annotations.yunikorn.apache.org/task-group-name`` - - ``template.metadata.annotations.yunikorn.apache.org/task-groups`` - - ``template.metadata.annotations.yunikorn.apache.org/schedulingPolicyParameters`` - - For more configuration details, - refer to the `Apache YuniKorn Gang-Scheduling documentation - `__. - - 3. Use a Flyte pod template with ``template.spec.schedulerName: scheduler-plugins-scheduler`` - to use the new gang scheduler for your tasks. - - See :ref:`deployment-configuration-general` for more information on pod templates in Flyte. - You can set the scheduler name in the pod template passed to the ``@task`` decorator. However, to prevent the - two different schedulers from competing for resources, it is recommended to set the scheduler name in the pod template - in the ``flyte`` namespace which is applied to all tasks. Non distributed training tasks can be scheduled by the - gang scheduler as well. + **Apache Yunikorn** + .. code-block:: yaml - For more information on pod templates in Flyte, see :ref:`deployment-configuration-general`. - You can set the scheduler name in the pod template passed to the ``@task`` decorator. - However, to avoid resource competition between the two different schedulers, - it is recommended to set the scheduler name in the pod template in the ``flyte`` namespace, - which is applied to all tasks. This allows non-distributed training tasks to be - scheduled by the gang scheduler as well. + template: + metadata: + annotations: + yunikorn.apache.org/task-group-name: "" + yunikorn.apache.org/task-groups: "" + yunikorn.apache.org/schedulingPolicyParameters: "" + + + See :ref:`deployment-configuration-general` for more information about Pod templates in Flyte. + You can set the scheduler name in the Pod template passed to the ``@task`` decorator. However, to prevent the + two different schedulers from competing for resources, we recommend setting the scheduler name in the pod template + in the ``flyte`` namespace which is applied to all tasks. Non distributed training tasks can be scheduled by the + gang scheduler as well. .. group-tab:: Ray - To install the Ray Operator, run the following commands: + To add the Kuberay Helm repo, run the following command: .. code-block:: bash + + helm repo add kuberay https://ray-project.github.io/kuberay-helm/ + + To install the Kuberay operator, run the following command: - export KUBERAY_VERSION=v0.5.2 - kubectl create -k "github.com/ray-project/kuberay/manifests/cluster-scope-resources?ref=${KUBERAY_VERSION}&timeout=90s" - kubectl apply -k "github.com/ray-project/kuberay/manifests/base?ref=${KUBERAY_VERSION}&timeout=90s" + helm install kuberay-operator kuberay/kuberay-operator --version 1.0.0 .. group-tab:: Spark - To add the Spark repository, run the following commands: + To add the Spark Helm repository, run the following commands: .. code-block:: bash @@ -480,7 +91,7 @@ Install the Kubernetes operator .. group-tab:: Dask - To add the Dask repository, run the following command: + To add the Dask Helm repository, run the following command: .. code-block:: bash @@ -503,28 +114,31 @@ Specify plugin configuration .. group-tab:: Flyte binary - To specify the plugin when using the Helm chart, edit the relevant YAML file. + Create a file named ``values-override.yaml`` and add the following config to it: .. code-block:: yaml - :emphasize-lines: 7,11 + :emphasize-lines: 9,13 - tasks: - task-plugins: - enabled-plugins: - - container - - sidecar - - k8s-array - - pytorch - default-for-task-types: - - container: container - - container_array: k8s-array - - pytorch: pytorch + configuration: + inline: + tasks: + task-plugins: + enabled-plugins: + - container + - sidecar + - k8s-array + - pytorch + default-for-task-types: + - container: container + - container_array: k8s-array + - pytorch: pytorch .. group-tab:: Flyte core Create a file named ``values-override.yaml`` and add the following config to it: .. code-block:: yaml + :emphasize-lines: 9,14 configmap: enabled_plugins: @@ -547,22 +161,24 @@ Specify plugin configuration .. group-tab:: Flyte binary - To specify the plugin when using the Helm chart, edit the relevant YAML file. + Create a file named ``values-override.yaml`` and add the following config to it: .. code-block:: yaml - :emphasize-lines: 7,11 + :emphasize-lines: 9,13 - tasks: - task-plugins: - enabled-plugins: - - container - - sidecar - - k8s-array - - tensorflow - default-for-task-types: - - container: container - - container_array: k8s-array - - tensorflow: tensorflow + configuration: + inline: + tasks: + task-plugins: + enabled-plugins: + - container + - sidecar + - k8s-array + - tensorflow + default-for-task-types: + - container: container + - container_array: k8s-array + - tensorflow: tensorflow .. group-tab:: Flyte core @@ -591,22 +207,24 @@ Specify plugin configuration .. group-tab:: Flyte binary - To specify the plugin when using the Helm chart, edit the relevant YAML file. + Create a file named ``values-override.yaml`` and add the following config to it: .. code-block:: yaml - :emphasize-lines: 7,11 + :emphasize-lines: 9,13 - tasks: - task-plugins: - enabled-plugins: - - container - - sidecar - - k8s-array - - mpi - default-for-task-types: - - container: container - - container_array: k8s-array - - mpi: mpi + configuration: + inline: + tasks: + task-plugins: + enabled-plugins: + - container + - sidecar + - k8s-array + - mpi + default-for-task-types: + - container: container + - container_array: k8s-array + - mpi: mpi .. group-tab:: Flyte core @@ -628,31 +246,30 @@ Specify plugin configuration sidecar: sidecar container_array: k8s-array mpi: mpi - + .. group-tab:: Ray .. tabs:: .. group-tab:: Flyte binary - 1. Make sure that your Helm values file includes the following configuration: + Create a file named ``values-override.yaml`` and add the following config to it: .. code-block:: yaml configuration: inline: - tasks: - task-plugins: - enabled-plugins: - - container - - sidecar - - k8s-array - - ray - default-for-task-types: - - container: container - - container_array: k8s-array - - ray: ray - + tasks: + task-plugins: + enabled-plugins: + - container + - sidecar + - k8s-array + - ray + default-for-task-types: + - container: container + - container_array: k8s-array + - ray: ray rbac: extraRules: - apiGroups: @@ -666,13 +283,12 @@ Specify plugin configuration - patch - update - 2. Run a ``helm upgrade`` operation - .. group-tab:: Flyte core Create a file named ``values-override.yaml`` and add the following config to it: .. code-block:: yaml + :emphasize-lines: 9,14 configmap: enabled_plugins: @@ -693,263 +309,658 @@ Specify plugin configuration .. tabs:: - .. group-tab:: Flyte binary + .. group-tab:: flyte-binary + + .. tabs:: + + .. group-tab:: AWS + + Create a file named ``values-override.yaml`` and add the following config to it: + + .. code-block:: yaml + + configuration: + inline: + tasks: + task-plugins: + enabled-plugins: + - container + - sidecar + - k8s-array + - spark + default-for-task-types: + - container: container + - container_array: k8s-array + - spark: spark + cluster_resources: + - production: + - defaultIamRole: + value: + - staging: + - defaultIamRole: + value: + - development: + - defaultIamRole: + value: + clusterResourceTemplates: + inline: + #This section automates the creation of the project-domain namespaces + - key: aa_namespace + value: | + apiVersion: v1 + kind: Namespace + metadata: + name: {{ namespace }} + spec: + finalizers: + - kubernetes + # This block performs the automated annotation of KSAs across all project-domain namespaces + - key: ab_service_account + value: | + apiVersion: v1 + kind: ServiceAccount + metadata: + name: default + namespace: '{{ namespace }}' + annotations: + eks.amazonaws.com/role-arn: '{{ defaultIamRole }}' + - key: ac_spark_role + value: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: Role + metadata: + name: spark-role + namespace: "{{ namespace }}" + rules: + - apiGroups: ["*"] + resources: + - pods + verbs: + - '*' + - apiGroups: ["*"] + resources: + - services + verbs: + - '*' + - apiGroups: ["*"] + resources: + - configmaps + verbs: + - '*' + - apiGroups: ["*"] + resources: + - persistentvolumeclaims + verbs: + - "*" + - key: ad_spark_service_account + value: | + apiVersion: v1 + kind: ServiceAccount + metadata: + name: spark + namespace: "{{ namespace }}" + annotations: + eks.amazonaws.com/role-arn: '{{ defaultIamRole }}' + - key: ae_spark_role_binding + value: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: RoleBinding + metadata: + name: spark-role-binding + namespace: "{{ namespace }}" + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: spark-role + subjects: + - kind: ServiceAccount + name: spark + namespace: "{{ namespace }}" + plugins: + spark: + # Edit the Spark configuration as you see fit + spark-config-default: + - spark.driver.cores: "1" + - spark.hadoop.fs.s3a.aws.credentials.provider: "com.amazonaws.auth.DefaultAWSCredentialsProviderChain" + - spark.kubernetes.allocation.batch.size: "50" + - spark.hadoop.fs.s3a.acl.default: "BucketOwnerFullControl" + - spark.hadoop.fs.s3n.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3n.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.hadoop.fs.s3.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.hadoop.fs.s3a.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3a.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.network.timeout: 600s + - spark.executorEnv.KUBERNETES_REQUEST_TIMEOUT: 100000 + - spark.executor.heartbeatInterval: 60s + + 2. (Optional) The Spark operator supports Kubernetes ResourceQuota enforcement. If you plan to use it, + set `per-Task resource requests `__ that fit into the quota for each project-namespace. A Task without resource requests + or limits will be rejected by the K8s scheduler as described `in the Kubernetes docs `__. + The following is a sample configuration you can add to your Helm chart values, adjusting the resources to match your needs: + + .. code-block:: yaml + + customData: + - production: + - projectQuotaCpu: + value: "5" + - projectQuotaMemory: + value: "4000Mi" + - staging: + - projectQuotaCpu: + value: "2" + - projectQuotaMemory: + value: "3000Mi" + - development: + - projectQuotaCpu: + value: "4" + - projectQuotaMemory: + value: "3000Mi" + + Plus an additional Cluster Resource template to automate the creation of the ``ResourceQuota``: + + .. code-block:: yaml + + templates: + - key: ab_project_resource_quota + value: | + apiVersion: v1 + kind: ResourceQuota + metadata: + name: project-quota + namespace: {{ namespace }} + spec: + hard: + limits.cpu: {{ projectQuotaCpu }} + limits.memory: {{ projectQuotaMemory }} + + .. group-tab:: GCP + + .. note:: + + Check out the `reference implementation for GCP `__ for information on how all the Flyte prerequisites are configured. + + Create a file named ``values-override.yaml`` and add the following config to it: - To specify the plugin when using the Helm chart, edit the relevant YAML file. - - .. group-tab:: Flyte core + .. code-block:: yaml - Create a file named ``values-override.yaml`` and add the following config to it: - - .. code-block:: yaml - - cluster_resource_manager: - enabled: true - config: - cluster_resources: - refreshInterval: 5m - templatePath: "/etc/flyte/clusterresource/templates" - customData: - - production: - - projectQuotaCpu: - value: "5" - - projectQuotaMemory: - value: "4000Mi" - - staging: - - projectQuotaCpu: - value: "2" - - projectQuotaMemory: - value: "3000Mi" - - development: - - projectQuotaCpu: - value: "4" - - projectQuotaMemory: - value: "3000Mi" - refresh: 5m + configuration: + inline: + tasks: + task-plugins: + enabled-plugins: + - container + - sidecar + - k8s-array + - spark + default-for-task-types: + - container: container + - container_array: k8s-array + - spark: spark + cluster_resources: + - production: + - gsa: + value: + - staging: + - gsa: + value: + - development: + - gsa: + value: + clusterResourceTemplates: + inline: + #This section automates the creation of the project-domain namespaces + - key: aa_namespace + value: | + apiVersion: v1 + kind: Namespace + metadata: + name: {{ namespace }} + spec: + finalizers: + - kubernetes + # This block performs the automated annotation of KSAs across all project-domain namespaces + - key: ab_service_account + value: | + apiVersion: v1 + kind: ServiceAccount + metadata: + name: default + namespace: '{{ namespace }}' + annotations: + iam.gke.io/gcp-service-account: {{ gsa }} + - key: ac_spark_role + value: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: Role + metadata: + name: spark-role + namespace: "{{ namespace }}" + rules: + - apiGroups: ["*"] + resources: + - pods + verbs: + - '*' + - apiGroups: ["*"] + resources: + - services + verbs: + - '*' + - apiGroups: ["*"] + resources: + - configmaps + verbs: + - '*' + - apiGroups: ["*"] + resources: + - persistentvolumeclaims + verbs: + - "*" + - key: ad_spark_service_account + value: | + apiVersion: v1 + kind: ServiceAccount + metadata: + name: spark + namespace: "{{ namespace }}" + annotations: + iam.gke.io/gcp-service-account: {{ gsa }} + - key: ae_spark_role_binding + value: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: RoleBinding + metadata: + name: spark-role-binding + namespace: "{{ namespace }}" + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: spark-role + subjects: + - kind: ServiceAccount + name: spark + namespace: "{{ namespace }}" + plugins: + spark: + # Edit the Spark configuration as you see fit + spark-config-default: + - spark.eventLog.enabled: "true" + - spark.eventLog.dir: "{{ .Values.userSettings.bucketName }}/spark-events" + - spark.driver.cores: "1" + - spark.executorEnv.HTTP2_DISABLE: "true" + - spark.hadoop.fs.AbstractFileSystem.gs.impl: com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS + - spark.kubernetes.allocation.batch.size: "50" + - spark.kubernetes.driverEnv.HTTP2_DISABLE: "true" + - spark.network.timeout: 600s + - spark.executorEnv.KUBERNETES_REQUEST_TIMEOUT: 100000 + - spark.executor.heartbeatInterval: 60s + + .. group-tab:: flyte-core + + .. tabs:: + + .. group-tab:: AWS + + Create a file named ``values-override.yaml`` and add the following config to it: - # -- Resource templates that should be applied - templates: - # -- Template for namespaces resources - - key: aa_namespace - value: | - apiVersion: v1 - kind: Namespace - metadata: - name: {{ namespace }} - spec: - finalizers: - - kubernetes - - - key: ab_project_resource_quota - value: | - apiVersion: v1 - kind: ResourceQuota - metadata: - name: project-quota - namespace: {{ namespace }} - spec: - hard: - limits.cpu: {{ projectQuotaCpu }} - limits.memory: {{ projectQuotaMemory }} - - - key: ac_spark_role - value: | - apiVersion: rbac.authorization.k8s.io/v1beta1 - kind: Role - metadata: - name: spark-role - namespace: {{ namespace }} - rules: - - apiGroups: ["*"] - resources: - - pods - verbs: - - '*' - - apiGroups: ["*"] - resources: - - services - verbs: - - '*' - - apiGroups: ["*"] - resources: - - configmaps - verbs: - - '*' - - - key: ad_spark_service_account - value: | - apiVersion: v1 - kind: ServiceAccount - metadata: - name: spark - namespace: {{ namespace }} - - - key: ae_spark_role_binding - value: | - apiVersion: rbac.authorization.k8s.io/v1beta1 - kind: RoleBinding - metadata: - name: spark-role-binding - namespace: {{ namespace }} - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: spark-role - subjects: - - kind: ServiceAccount - name: spark - namespace: {{ namespace }} + .. code-block:: yaml - sparkoperator: - enabled: true - plugin_config: - plugins: - spark: - # Edit the Spark configuration as you see fit - spark-config-default: - - spark.driver.cores: "1" - - spark.hadoop.fs.s3a.aws.credentials.provider: "com.amazonaws.auth.DefaultAWSCredentialsProviderChain" - - spark.kubernetes.allocation.batch.size: "50" - - spark.hadoop.fs.s3a.acl.default: "BucketOwnerFullControl" - - spark.hadoop.fs.s3n.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3n.impl: "org.apache.hadoop.fs.s3a.S3A" - - spark.hadoop.fs.s3.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3.impl: "org.apache.hadoop.fs.s3a.S3A" - - spark.hadoop.fs.s3a.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3a.impl: "org.apache.hadoop.fs.s3a.S3A" - - spark.network.timeout: 600s - - spark.executorEnv.KUBERNETES_REQUEST_TIMEOUT: 100000 - - spark.executor.heartbeatInterval: 60s - configmap: - enabled_plugins: - tasks: - task-plugins: - enabled-plugins: - - container - - sidecar - - k8s-array - - spark - default-for-task-types: - container: container - sidecar: sidecar - container_array: k8s-array - spark: spark - - .. group-tab:: Flyte sandbox - - Create a file named ``values-override.yaml`` and add the following config to it: - - .. note:: - - Within the flyte-binary block, the value of inline.storage.signedURL.stowConfigOverride.endpoint should be set to the corresponding node Hostname/IP on the MinIO pod if you are deploying on a Kubernetes cluster. - - .. code-block:: yaml - - flyte-binary: - nameOverride: flyte-sandbox - enabled: true - configuration: - database: - host: '{{ printf "%s-postgresql" .Release.Name | trunc 63 | trimSuffix "-" }}' - password: postgres - storage: - metadataContainer: my-s3-bucket - userDataContainer: my-s3-bucket - provider: s3 - providerConfig: - s3: - disableSSL: true - v2Signing: true - endpoint: http://{{ printf "%s-minio" .Release.Name | trunc 63 | trimSuffix "-" }}.{{ .Release.Namespace }}:9000 - authType: accesskey - accessKey: minio - secretKey: miniostorage - logging: - level: 5 - plugins: - kubernetes: + configmap: + enabled_plugins: + tasks: + task-plugins: + enabled-plugins: + - container + - sidecar + - k8s-array + - spark + default-for-task-types: + container: container + sidecar: sidecar + container_array: k8s-array + spark: spark + cluster_resource_manager: + enabled: true + standalone_deploy: false + # -- Resource templates that should be applied + templates: + # -- Template for namespaces resources + - key: aa_namespace + value: | + apiVersion: v1 + kind: Namespace + metadata: + name: {{ namespace }} + spec: + finalizers: + - kubernetes + - key: ac_spark_role + value: | + apiVersion: rbac.authorization.k8s.io/v1beta1 + kind: Role + metadata: + name: spark-role + namespace: {{ namespace }} + rules: + - apiGroups: ["*"] + resources: + - pods + verbs: + - '*' + - apiGroups: ["*"] + resources: + - services + verbs: + - '*' + - apiGroups: ["*"] + resources: + - configmaps + verbs: + - '*' + - apiGroups: ["*"] + resources: + - persistentvolumeclaims + verbs: + - "*" + + - key: ad_spark_service_account + value: | + apiVersion: v1 + kind: ServiceAccount + metadata: + name: spark + namespace: {{ namespace }} + + - key: ae_spark_role_binding + value: | + apiVersion: rbac.authorization.k8s.io/v1beta1 + kind: RoleBinding + metadata: + name: spark-role-binding + namespace: {{ namespace }} + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: spark-role + subjects: + - kind: ServiceAccount + name: spark + namespace: {{ namespace }} + + sparkoperator: + enabled: true + plugin_config: + plugins: + spark: + # Edit the Spark configuration as you see fit + spark-config-default: + - spark.driver.cores: "1" + - spark.hadoop.fs.s3a.aws.credentials.provider: "com.amazonaws.auth.DefaultAWSCredentialsProviderChain" + - spark.kubernetes.allocation.batch.size: "50" + - spark.hadoop.fs.s3a.acl.default: "BucketOwnerFullControl" + - spark.hadoop.fs.s3n.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3n.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.hadoop.fs.s3.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.hadoop.fs.s3a.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3a.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.network.timeout: 600s + - spark.executorEnv.KUBERNETES_REQUEST_TIMEOUT: 100000 + - spark.executor.heartbeatInterval: 60s + + .. group-tab:: GCP + + .. note:: + + Check out the `reference implementation for GCP `__ for information on how all the Flyte prerequisites are configured. + + Create a file named ``values-override.yaml`` and add the following config to it: + + .. code-block:: yaml + + enabled_plugins: + tasks: + task-plugins: + enabled-plugins: + - container + - sidecar + - k8s-array + - spark + default-for-task-types: + container: container + sidecar: sidecar + container_array: k8s-array + spark: spark + cluster_resource_manager: enabled: true - templateUri: |- - http://localhost:30080/kubernetes-dashboard/#/log/{{.namespace }}/{{ .podName }}/pod?namespace={{ .namespace }} - inline: - task_resources: - defaults: - cpu: 500m - ephemeralStorage: 0 - gpu: 0 - memory: 1Gi - limits: - cpu: 0 - ephemeralStorage: 0 - gpu: 0 - memory: 0 - storage: - signedURL: - stowConfigOverride: - endpoint: http://localhost:30002 - plugins: - k8s: - default-env-vars: - - FLYTE_AWS_ENDPOINT: http://{{ printf "%s-minio" .Release.Name | trunc 63 | trimSuffix "-" }}.{{ .Release.Namespace }}:9000 - - FLYTE_AWS_ACCESS_KEY_ID: minio - - FLYTE_AWS_SECRET_ACCESS_KEY: miniostorage - spark: - spark-config-default: - - spark.driver.cores: "1" - - spark.hadoop.fs.s3a.aws.credentials.provider: "org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider" - - spark.hadoop.fs.s3a.endpoint: http://{{ printf "%s-minio" .Release.Name | trunc 63 | trimSuffix "-" }}.{{ .Release.Namespace }}:9000 - - spark.hadoop.fs.s3a.access.key: "minio" - - spark.hadoop.fs.s3a.secret.key: "miniostorage" - - spark.hadoop.fs.s3a.path.style.access: "true" - - spark.kubernetes.allocation.batch.size: "50" - - spark.hadoop.fs.s3a.acl.default: "BucketOwnerFullControl" - - spark.hadoop.fs.s3n.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3n.impl: "org.apache.hadoop.fs.s3a.S3A" - - spark.hadoop.fs.s3.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3.impl: "org.apache.hadoop.fs.s3a.S3A" - - spark.hadoop.fs.s3a.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3a.impl: "org.apache.hadoop.fs.s3a.S3A" - inlineConfigMap: '{{ include "flyte-sandbox.configuration.inlineConfigMap" . }}' - clusterResourceTemplates: - inlineConfigMap: '{{ include "flyte-sandbox.clusterResourceTemplates.inlineConfigMap" . }}' - deployment: - image: - repository: flyte-binary - tag: sandbox - pullPolicy: Never - waitForDB: - image: - repository: bitnami/postgresql - tag: sandbox - pullPolicy: Never - rbac: - # This is strictly NOT RECOMMENDED in production clusters, and is only for use - # within local Flyte sandboxes. - # When using cluster resource templates to create additional namespaced roles, - # Flyte is required to have a superset of those permissions. To simplify - # experimenting with new backend plugins that require additional roles be created - # with cluster resource templates (e.g. Spark), we add the following: - extraRules: - - apiGroups: - - '*' - resources: - - '*' - verbs: - - '*' - enabled_plugins: - tasks: - task-plugins: - enabled-plugins: - - container - - sidecar - - k8s-array - - agent-service - - spark - default-for-task-types: - container: container - sidecar: sidecar - container_array: k8s-array - spark: spark + standalone_deploy: false + config: + cluster_resources: + customData: + - production: + - gsa: + #This is the GSA that the Task Pods will use to access GCP resources. + value: "" + - staging: + - gsa: + value: "" + - development: + - gsa: + value: "" + templates: + # -- Template for namespaces resources + - key: aa_namespace + value: | + apiVersion: v1 + kind: Namespace + metadata: + name: {{ namespace }} + spec: + finalizers: + - kubernetes + # -- Patch default service account + - key: aab_default_service_account + value: | + apiVersion: v1 + kind: ServiceAccount + metadata: + name: default + namespace: {{ namespace }} + annotations: + # Annotation needed for GCP Workload Identity to function + # https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity + iam.gke.io/gcp-service-account: {{ gsa }} + - key: ac_spark_role + value: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: Role + metadata: + name: spark-role + namespace: "{{ namespace }}" + rules: + - apiGroups: ["*"] + resources: + - pods + verbs: + - '*' + - apiGroups: ["*"] + resources: + - services + verbs: + - '*' + - apiGroups: ["*"] + resources: + - configmaps + verbs: + - '*' + - apiGroups: ["*"] + resources: + - persistentvolumeclaims + verbs: + - "*" + #While the Spark Helm chart creates a spark ServiceAccount, this template creates one + # on each project-domain namespace and annotates it with the GSA + #You should always run workflows with the Spark service account (eg pyflyte run --remote --service-account=spark ...) + - key: ad_spark_service_account + value: | + apiVersion: v1 + kind: ServiceAccount + metadata: + name: spark + namespace: "{{ namespace }}" + annotations: + iam.gke.io/gcp-service-account: {{ gsa }} + - key: ae_spark_role_binding + value: | + apiVersion: rbac.authorization.k8s.io/v1 + kind: RoleBinding + metadata: + name: spark-role-binding + namespace: "{{ namespace }}" + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: spark-role + subjects: + - kind: ServiceAccount + name: spark + namespace: "{{ namespace }}" + sparkoperator: + enabled: true + plugins: + spark: + spark-config-default: + - spark.eventLog.enabled: "true" + - spark.eventLog.dir: "{{ .Values.userSettings.bucketName }}/spark-events" + - spark.driver.cores: "1" + - spark.executorEnv.HTTP2_DISABLE: "true" + - spark.hadoop.fs.AbstractFileSystem.gs.impl: com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS + - spark.kubernetes.allocation.batch.size: "50" + - spark.kubernetes.driverEnv.HTTP2_DISABLE: "true" + - spark.network.timeout: 600s + - spark.executorEnv.KUBERNETES_REQUEST_TIMEOUT: 100000 + - spark.executor.heartbeatInterval: 60s + + .. group-tab:: flyte-sandbox + + If you installed the `flyte-sandbox `__ Helm chart to a K8s cluster, follow this section to configure the Spark plugin. + Note that none of this configuration applies to the demo cluster that you spin up with ``flytectl demo start``. + + 1. Create a file named ``values-override.yaml`` and add the following config to it: + + .. note:: + + Within the flyte-binary block, the value of ``inline.storage.signedURL.stowConfigOverride.endpoint`` should be set to the corresponding node Hostname/IP on the MinIO pod if you are deploying on a Kubernetes cluster. + + .. code-block:: yaml + + flyte-binary: + nameOverride: flyte-sandbox + enabled: true + configuration: + database: + host: '{{ printf "%s-postgresql" .Release.Name | trunc 63 | trimSuffix "-" }}' + password: postgres + storage: + metadataContainer: my-s3-bucket + userDataContainer: my-s3-bucket + provider: s3 + providerConfig: + s3: + disableSSL: true + v2Signing: true + endpoint: http://{{ printf "%s-minio" .Release.Name | trunc 63 | trimSuffix "-" }}.{{ .Release.Namespace }}:9000 + authType: accesskey + accessKey: minio + secretKey: miniostorage + logging: + level: 5 + plugins: + kubernetes: + enabled: true + templateUri: |- + http://localhost:30080/kubernetes-dashboard/#/log/{{.namespace }}/{{ .podName }}/pod?namespace={{ .namespace }} + inline: + task_resources: + defaults: + cpu: 500m + ephemeralStorage: 0 + gpu: 0 + memory: 1Gi + limits: + cpu: 0 + ephemeralStorage: 0 + gpu: 0 + memory: 0 + storage: + signedURL: + stowConfigOverride: + endpoint: http://localhost:30002 + plugins: + k8s: + default-env-vars: + - FLYTE_AWS_ENDPOINT: http://{{ printf "%s-minio" .Release.Name | trunc 63 | trimSuffix "-" }}.{{ .Release.Namespace }}:9000 + - FLYTE_AWS_ACCESS_KEY_ID: minio + - FLYTE_AWS_SECRET_ACCESS_KEY: miniostorage + spark: + spark-config-default: + - spark.driver.cores: "1" + - spark.hadoop.fs.s3a.aws.credentials.provider: "org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider" + - spark.hadoop.fs.s3a.endpoint: http://{{ printf "%s-minio" .Release.Name | trunc 63 | trimSuffix "-" }}.{{ .Release.Namespace }}:9000 + - spark.hadoop.fs.s3a.access.key: "minio" + - spark.hadoop.fs.s3a.secret.key: "miniostorage" + - spark.hadoop.fs.s3a.path.style.access: "true" + - spark.kubernetes.allocation.batch.size: "50" + - spark.hadoop.fs.s3a.acl.default: "BucketOwnerFullControl" + - spark.hadoop.fs.s3n.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3n.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.hadoop.fs.s3.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.hadoop.fs.s3a.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3a.impl: "org.apache.hadoop.fs.s3a.S3A" + inlineConfigMap: '{{ include "flyte-sandbox.configuration.inlineConfigMap" . }}' + clusterResourceTemplates: + inlineConfigMap: '{{ include "flyte-sandbox.clusterResourceTemplates.inlineConfigMap" . }}' + deployment: + image: + repository: flyte-binary + tag: sandbox + pullPolicy: Never + waitForDB: + image: + repository: bitnami/postgresql + tag: sandbox + pullPolicy: Never + rbac: + # This is strictly NOT RECOMMENDED in production clusters, and is only for use + # within local Flyte sandboxes. + # When using cluster resource templates to create additional namespaced roles, + # Flyte is required to have a superset of those permissions. To simplify + # experimenting with new backend plugins that require additional roles be created + # with cluster resource templates (e.g. Spark), we add the following: + extraRules: + - apiGroups: + - '*' + resources: + - '*' + verbs: + - '*' + enabled_plugins: + tasks: + task-plugins: + enabled-plugins: + - container + - sidecar + - k8s-array + - agent-service + - spark + default-for-task-types: + container: container + sidecar: sidecar + container_array: k8s-array + spark: spark .. group-tab:: Dask @@ -957,7 +968,7 @@ Specify plugin configuration .. group-tab:: Flyte binary - Edit the relevant YAML file to specify the plugin. + Create a file named ``values-override.yaml`` and add the following config to it: .. code-block:: yaml :emphasize-lines: 7,11 @@ -1000,23 +1011,16 @@ Upgrade the deployment .. tabs:: - .. group-tab:: Flyte binary - - If you are installing Flyte via the Helm chart, run the following command: - - .. note:: - - There is no need to run ``helm upgrade`` for Spark. + .. group-tab:: flyte-binary .. code-block:: bash - helm upgrade flyteorg/flyte-binary -n --values + helm upgrade flyteorg/flyte-binary -n --values values-override.yaml Replace ```` with the name of your release (e.g., ``flyte-backend``), - ```` with the name of your namespace (e.g., ``flyte``), - and ```` with the name of your YAML file. + ```` with the name of your namespace (e.g., ``flyte``). - .. group-tab:: Flyte core / sandbox + .. group-tab:: flyte-core .. code-block:: bash @@ -1030,3 +1034,11 @@ Wait for the upgrade to complete. You can check the status of the deployment pod .. code-block:: bash kubectl get pods -n flyte + +Once all the components are up and running, go to the `examples section `__ to learn more about how to use Flyte backend plugins. + + + + + + From e53de601dcd256f4ba19f27b1670e13685454f5b Mon Sep 17 00:00:00 2001 From: David Espejo <82604841+davidmirror-ops@users.noreply.github.com> Date: Mon, 1 Apr 2024 12:33:24 -0500 Subject: [PATCH 384/645] Update Propeller architecture documentation (#5117) * Exapnd intro and add diagram Signed-off-by: davidmirror-ops * Add note to intro Signed-off-by: davidmirror-ops * Add example CR contents Signed-off-by: davidmirror-ops * Update contents of the CR Signed-off-by: davidmirror-ops * Expand description of plugins diagram Signed-off-by: davidmirror-ops * Fix hyperlink structure Signed-off-by: davidmirror-ops * Apply reviews Signed-off-by: davidmirror-ops --------- Signed-off-by: davidmirror-ops Co-authored-by: davidmirror-ops --- .../flytepropeller_architecture.rst | 125 ++++++++++++++++-- 1 file changed, 114 insertions(+), 11 deletions(-) diff --git a/docs/concepts/component_architecture/flytepropeller_architecture.rst b/docs/concepts/component_architecture/flytepropeller_architecture.rst index c04edbf617..6de45566f0 100644 --- a/docs/concepts/component_architecture/flytepropeller_architecture.rst +++ b/docs/concepts/component_architecture/flytepropeller_architecture.rst @@ -15,13 +15,20 @@ Introduction A Flyte :ref:`workflow ` is represented as a Directed Acyclic Graph (DAG) of interconnected Nodes. Flyte supports a robust collection of Node types to ensure diverse functionality. - ``TaskNodes`` support a plugin system to externally add system integrations. -- Control flow can be altered during runtime using ``BranchNodes``, which prune downstream evaluation paths based on input. +- ``BranchNodes`` allow altering the control flow during runtime; pruning downstream evaluation paths based on input. - ``DynamicNodes`` add nodes to the DAG. - ``WorkflowNodes`` allow embedding workflows within each other. -FlytePropeller is responsible for scheduling and tracking execution of Flyte workflows. It is implemented using a K8s controller and adheres to the established K8s design principles. In this scheme, resources are periodically evaluated and the goal is to transition from the observed state to a requested state. +FlytePropeller is responsible for scheduling and tracking execution of Flyte workflows. It is implemented using a K8s controller that follows the reconciler pattern. -In our case, workflows are the resources and they are iteratively evaluated to transition from the current state to success. During each loop, the current workflow state is established as the phase of workflow nodes and subsequent tasks, and FlytePropeller performs operations to transition this state to success. The operations may include scheduling (or rescheduling) node executions, evaluating dynamic or branch nodes, etc. These design decisions ensure that FlytePropeller can scale to manage a large number of concurrent workflows without performance degradation. +.. image:: https://raw.githubusercontent.com/flyteorg/static-resources/main/common/reconciler-pattern.png + +In this scheme, resources are periodically evaluated and the goal is to transition from the observed state to a requested state. + +In our case, workflows are the resources, whose desired stated (*workflow definition*) is expressed using Flyte's SDK. Workflows are iteratively evaluated to transition from the current state to success. During each evaluation loop, the current workflow state is established as the `phase of workflow nodes `__ and subsequent tasks, and FlytePropeller performs operations to transition this state to success. +The operations may include scheduling (or rescheduling) node executions, evaluating dynamic or branch nodes, etc. + +By using a simple yet robust mechanism, FlytePropeller can scale to manage a large number of concurrent workflows without significant performance degradation. This document attempts to break down the FlytePropeller architecture by tracking workflow life cycle through each internal component. Below is a high-level illustration of the FlytePropeller architecture and a flow chart of each component's responsibilities during FlyteWorkflow execution. @@ -30,12 +37,98 @@ This document attempts to break down the FlytePropeller architecture by tracking Components ========== + +FlyteAdmin is the common entry point, where initialization of FlyteWorkflow Custom Resources may be triggered by user workflow definition executions, automatic relaunches, or periodically scheduled workflow definition executions. + FlyteWorkflow CRD / K8s Integration ----------------------------------- -Workflows in Flyte are maintained as Custom Resource Definitions (CRDs) in Kubernetes, which are stored in the backing etcd cluster. Each execution of a workflow definition results in the creation of a new FlyteWorkflow CR (Custom Resource) which maintains a state for the entirety of processing. CRDs provide variable definitions to describe both resource specifications (spec) and status (status). The FlyteWorkflow CRD uses the spec subsection to detail the workflow DAG, embodying node dependencies, etc. The status subsection tracks workflow metadata including overall workflow status, node/task phases, status/phase transition timestamps, etc. +Workflows in Flyte are maintained as `Custom Resource Definitions (CRDs) `__ in Kubernetes, which are stored in the backing ``etcd`` key-value store. Each workflow execution results in the creation of a new ``flyteworkflow`` CR (Custom Resource) which maintains its state for the duration of the execution. CRDs provide variable definitions to describe both resource specifications (``spec``) and status (``status``). The ``flyteworkflow`` CRD uses the ``spec`` subsection to detail the workflow DAG, embodying node dependencies, etc. + +**Example** + +1. Execute an `example workflow `__ on a remote Flyte cluster: + +.. code-block:: bash + + pyflyte run --remote example.py training_workflow --hyperparameters '{"C": 0.4}' + +2. Verify there's a new Custom Resource on the ``flytesnacks-development`` namespace (this is, the workflow belongs to the ``flytesnacks`` project and the ``development`` domain): + +.. code-block:: bash + + kubectl get flyteworkflows.flyte.lyft.com -n flytesnacks-development + +Example output: + +.. code-block:: bash + + NAME AGE + f7616dc75400f43e6920 3h42m + +3. Describe the contents of the Custom Resource, for example the ``spec`` section: + +.. code-block:: bash + + kubectl describe flyteworkflows.flyte.lyft.com f7616dc75400f43e6920 -n flytesnacks-development + +.. code-block:: json + + "spec": { + "connections": { + "n0": [ + "n1" + ], + "n1": [ + "n2" + ], + "n2": [ + "end-node" + ], + "start-node": [ + "n0", + "n2" + ] + }, + +The status subsection tracks workflow metadata including overall workflow status, node/task phases, status/phase transition timestamps, etc. + +.. code-block:: json + + "status": { + "dataDir": "gs://flyteontf-gcp-data-116223838137/metadata/propeller/flytesnacks-development-f7616dc75400f43e6920", + "defVersion": 1, + "lastUpdatedAt": "2024-03-26T16:22:16Z", + "nodeStatus": { + "end-node": { + "phase": 5, + "stoppedAt": "2024-03-26T16:22:16Z" + }, + "n0": { + "phase": 5, + "stoppedAt": "2024-03-26T16:21:46Z" + }, + "n1": { + "phase": 5, + "stoppedAt": "2024-03-26T16:22:02Z" + }, + "n2": { + "phase": 5, + "stoppedAt": "2024-03-26T16:22:16Z" + }, + "start-node": { + "phase": 5, + "stoppedAt": "2024-03-26T16:20:39Z" + } + }, + + +K8s exposes a powerful controller/operator API that enables entities to track creation/updates over a specific resource type. FlytePropeller uses this API to track FlyteWorkflows, meaning every time an instance of the ``flyteworkflow`` CR is created/updated, the FlytePropeller instance is notified. + +.. note:: + + Manual creation of ``flyteworkflow`` CRs, without the intervention of ``flyteadmin``, is possible but not supported as the resulting resource will have limited visibility and usability. -K8s exposes a powerful controller/operator API that enables entities to track creation/updates over a specific resource type. FlytePropeller uses this API to track FlyteWorkflows, meaning every time an instance of the FlyteWorkflow CR is created/updated, the FlytePropeller instance is notified. FlyteAdmin is the common entry point, where initialization of FlyteWorkflow CRs may be triggered by user workflow definition executions, automatic relaunches, or periodically scheduled workflow definition executions. However, it is conceivable to manually create FlyteWorkflow CRs, but this will have limited visibility and usability. WorkQueue/WorkerPool ---------------------- @@ -45,12 +138,12 @@ FlytePropeller supports concurrent execution of multiple, unique workflows using The WorkQueue is a FIFO queue storing workflow ID strings that require a lookup to retrieve the FlyteWorkflow CR to ensure up-to-date status. A workflow may be added to the queue in a variety of circumstances: #. A new FlyteWorkflow CR is created or an existing instance is updated -#. The K8s Informer resyncs the FlyteWorkflow periodically (necessary to detect workflow timeouts and ensure liveness) +#. The K8s Informer detects a workflow timeout or failed liveness check during its periodic resync operation on the FlyteWorkflow. #. A FlytePropeller worker experiences an error during a processing loop #. The WorkflowExecutor observes a completed downstream node -#. A NodeHandler observes state change and explicitly enqueues its owner (For example, K8s pod informer observes completion of a task) +#. A NodeHandler observes state change and explicitly enqueues its owner. (For example, K8s pod informer observes completion of a task.) -The WorkerPool is implemented as a collection of goroutines, one for each worker. Using this lightweight construct, FlytePropeller can scale to 1000s of workers on a single CPU. Workers continually poll the WorkQueue for workflows. On success, the workflow is executed (passed to WorkflowExecutor). +The WorkerPool is implemented as a collection of ``goroutines``, one for each worker. Using this lightweight construct, FlytePropeller can scale to 1000s of workers on a single CPU. Workers continually poll the WorkQueue for workflows. On success, the workflow is passed to the WorkflowExecutor. WorkflowExecutor ---------------- @@ -60,7 +153,15 @@ The WorkflowExecutor is responsible for handling high-level workflow operations. NodeExecutor ------------ -The NodeExecutor is executed on a single node, beginning with the workflow's start node. It traverses the workflow using a visitor pattern with a modified depth-first search (DFS), evaluating each node along the path. A few examples of node evaluation based on phase: successful nodes are skipped, unevaluated nodes are queued for processing, and failed nodes may be reattempted up to a configurable threshold. There are many configurable parameters to tune evaluation criteria including max parallelism which restricts the number of nodes which may be scheduled concurrently. Additionally, nodes may be retried to ensure recoverability on failure. +The NodeExecutor is executed on a single node, beginning with the workflow's start node. It traverses the workflow using a visitor pattern with a modified depth-first search (DFS), evaluating each node along the path. A few examples of node evaluation based on phase include: + +* Successful nodes are skipped +* Unevaluated nodes are queued for processing +* Failed nodes may be reattempted up to a configurable threshold. + +There are many configurable parameters to tune evaluation criteria including max parallelism which restricts the number of nodes which may be scheduled concurrently. Additionally, nodes may be retried to ensure recoverability on failure. + +Go to the `Optimizing Performance `__ section for more information on how to tune Propeller parameters. The NodeExecutor is also responsible for linking data readers/writers to facilitate data transfer between node executions. The data transfer process occurs automatically within Flyte, using efficient K8s events rather than a polling listener pattern which incurs more overhead. Relatively small amounts of data may be passed between nodes inline, but it is more common to pass data URLs to backing storage. A component of this is writing to and checking the data cache, which facilitates the reuse of previously completed evaluations. @@ -73,7 +174,7 @@ FlytePropeller includes a robust collection of NodeHandlers to support diverse e 1. **Pod Task**: Create a pod in the Kubernetes cluster, execute the task, and then delete the pod. - 2. **K8s Operator Backend Plugin**: Install a specific Kubernetes Operator (e.g., Spark, Ray, and Kubeflow) in the cluster, create pods by the Kubernetes Operator, execute the task, and then delete the pods. + 2. **K8s Operator Backend Plugin**: Install a specific Kubernetes Operator (e.g., Spark, Ray, or Kubeflow) in the cluster, create pods by the Kubernetes Operator, execute the task, and then delete the pods. 3. **Web API Task**: Send REST/gRPC requests to a server and return the response. Note: The Web API Task will not start a pod. @@ -91,6 +192,8 @@ It should be noted that the WorkflowExecutor, NodeExecutor, and TaskHandlers sen FlytePlugins ------------ -Here is an overview architecture of FlytePlugins: +Every operation that Propeller performs makes use of a plugin. The following diagram describe the different types of plugins available for Propeller and an example operation when using the Spark integration: .. image:: https://raw.githubusercontent.com/flyteorg/static-resources/main/flyte/concepts/architecture/flytepropeller_plugins_architecture.png + + \ No newline at end of file From 31ad627fff0fcad45362e06a314038bd6db2c7bf Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Mon, 1 Apr 2024 12:02:08 -0700 Subject: [PATCH 385/645] update protobuf v1.32.0 -> v1.33.0 (#5156) - Resolves medium CVE-2024-24786 Signed-off-by: ddl-ebrown --- datacatalog/go.mod | 2 +- datacatalog/go.sum | 4 ++-- docker/sandbox-bundled/bootstrap/go.mod | 2 +- docker/sandbox-bundled/bootstrap/go.sum | 4 ++-- flyteadmin/go.mod | 2 +- flyteadmin/go.sum | 4 ++-- flytecopilot/go.mod | 2 +- flytecopilot/go.sum | 4 ++-- flyteidl/go.mod | 2 +- flyteidl/go.sum | 4 ++-- flyteplugins/go.mod | 2 +- flyteplugins/go.sum | 4 ++-- flytepropeller/go.mod | 2 +- flytepropeller/go.sum | 4 ++-- flytestdlib/go.mod | 2 +- flytestdlib/go.sum | 4 ++-- go.mod | 2 +- go.sum | 6 ++++-- 18 files changed, 29 insertions(+), 27 deletions(-) diff --git a/datacatalog/go.mod b/datacatalog/go.mod index 9702461a0f..053ee8ea02 100644 --- a/datacatalog/go.mod +++ b/datacatalog/go.mod @@ -125,7 +125,7 @@ require ( google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/datacatalog/go.sum b/datacatalog/go.sum index 6c40957923..22533c26f4 100644 --- a/datacatalog/go.sum +++ b/datacatalog/go.sum @@ -812,8 +812,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/docker/sandbox-bundled/bootstrap/go.mod b/docker/sandbox-bundled/bootstrap/go.mod index e951f9fe6b..a79f930b5e 100644 --- a/docker/sandbox-bundled/bootstrap/go.mod +++ b/docker/sandbox-bundled/bootstrap/go.mod @@ -41,7 +41,7 @@ require ( golang.org/x/net v0.7.0 // indirect golang.org/x/sys v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/docker/sandbox-bundled/bootstrap/go.sum b/docker/sandbox-bundled/bootstrap/go.sum index c807128b2e..cfcb4fa152 100644 --- a/docker/sandbox-bundled/bootstrap/go.sum +++ b/docker/sandbox-bundled/bootstrap/go.sum @@ -181,8 +181,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index 39bde3ea23..41e11a265b 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -55,7 +55,7 @@ require ( google.golang.org/api v0.155.0 google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.1 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 gorm.io/driver/mysql v1.4.4 gorm.io/driver/postgres v1.5.3 gorm.io/driver/sqlite v1.5.4 diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index 456493c095..530f45e42f 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -1905,8 +1905,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/DataDog/dd-trace-go.v1 v1.22.0/go.mod h1:DVp8HmDh8PuTu2Z0fVVlBsyWaC++fzwVCaGWylTe3tg= gopkg.in/DataDog/dd-trace-go.v1 v1.27.0/go.mod h1:Sp1lku8WJMvNV0kjDI4Ni/T7J/U3BO5ct5kEaoVU8+I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= diff --git a/flytecopilot/go.mod b/flytecopilot/go.mod index 11800390ab..b06a9dc13e 100644 --- a/flytecopilot/go.mod +++ b/flytecopilot/go.mod @@ -111,7 +111,7 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/grpc v1.62.1 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/flytecopilot/go.sum b/flytecopilot/go.sum index 3a894c8995..2215c54e5c 100644 --- a/flytecopilot/go.sum +++ b/flytecopilot/go.sum @@ -706,8 +706,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/flyteidl/go.mod b/flyteidl/go.mod index 9aa214c942..1939e90151 100644 --- a/flyteidl/go.mod +++ b/flyteidl/go.mod @@ -21,7 +21,7 @@ require ( golang.org/x/oauth2 v0.16.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.1 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 k8s.io/apimachinery v0.28.2 ) diff --git a/flyteidl/go.sum b/flyteidl/go.sum index c91cec6d05..a1588be66a 100644 --- a/flyteidl/go.sum +++ b/flyteidl/go.sum @@ -674,8 +674,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/flyteplugins/go.mod b/flyteplugins/go.mod index 82f9a96ca9..7490e9aace 100644 --- a/flyteplugins/go.mod +++ b/flyteplugins/go.mod @@ -30,7 +30,7 @@ require ( golang.org/x/oauth2 v0.16.0 google.golang.org/api v0.155.0 google.golang.org/grpc v1.62.1 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 gopkg.in/yaml.v2 v2.4.0 gotest.tools v2.2.0+incompatible k8s.io/api v0.28.4 diff --git a/flyteplugins/go.sum b/flyteplugins/go.sum index ec5b0b6f6d..a2ed12d4ab 100644 --- a/flyteplugins/go.sum +++ b/flyteplugins/go.sum @@ -767,8 +767,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/flytepropeller/go.mod b/flytepropeller/go.mod index 1f465797d7..960dd00e12 100644 --- a/flytepropeller/go.mod +++ b/flytepropeller/go.mod @@ -32,7 +32,7 @@ require ( golang.org/x/sync v0.6.0 golang.org/x/time v0.5.0 google.golang.org/grpc v1.62.1 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 k8s.io/api v0.28.4 k8s.io/apiextensions-apiserver v0.28.4 k8s.io/apimachinery v0.28.4 diff --git a/flytepropeller/go.sum b/flytepropeller/go.sum index e0ff89ceaf..0dcde9cae4 100644 --- a/flytepropeller/go.sum +++ b/flytepropeller/go.sum @@ -814,8 +814,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/flytestdlib/go.mod b/flytestdlib/go.mod index ff6db04e38..e7be75f65e 100644 --- a/flytestdlib/go.mod +++ b/flytestdlib/go.mod @@ -35,7 +35,7 @@ require ( golang.org/x/time v0.5.0 golang.org/x/tools v0.9.3 google.golang.org/grpc v1.62.1 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 gorm.io/driver/postgres v1.5.3 gorm.io/driver/sqlite v1.5.4 gorm.io/gorm v1.25.4 diff --git a/flytestdlib/go.sum b/flytestdlib/go.sum index fbf1c37c9b..60173fbc27 100644 --- a/flytestdlib/go.sum +++ b/flytestdlib/go.sum @@ -816,8 +816,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/go.mod b/go.mod index 2a525c60fb..fefdd9c71d 100644 --- a/go.mod +++ b/go.mod @@ -202,7 +202,7 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/grpc v1.62.1 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect diff --git a/go.sum b/go.sum index 0fde6fca2c..bd39382016 100644 --- a/go.sum +++ b/go.sum @@ -635,6 +635,8 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= @@ -1937,8 +1939,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/DataDog/dd-trace-go.v1 v1.22.0/go.mod h1:DVp8HmDh8PuTu2Z0fVVlBsyWaC++fzwVCaGWylTe3tg= gopkg.in/DataDog/dd-trace-go.v1 v1.27.0/go.mod h1:Sp1lku8WJMvNV0kjDI4Ni/T7J/U3BO5ct5kEaoVU8+I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= From 215d3869f3d4bcdc1da9bc84d79aabf2d899fe81 Mon Sep 17 00:00:00 2001 From: Flyte Bot Date: Mon, 1 Apr 2024 12:05:01 -0700 Subject: [PATCH 386/645] Update boilerplate version (#5143) Signed-off-by: Flyte-Bot Co-authored-by: flyte-bot --- boilerplate/flyte/end2end/run-tests.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/boilerplate/flyte/end2end/run-tests.py b/boilerplate/flyte/end2end/run-tests.py index 905f29079c..f6558247a6 100644 --- a/boilerplate/flyte/end2end/run-tests.py +++ b/boilerplate/flyte/end2end/run-tests.py @@ -75,9 +75,11 @@ def schedule_workflow_groups( workflow_group_item = list( filter(lambda item: item["name"] == wf_group, parsed_manifest) ) - workflows = [] - if workflow_group_item: - workflows = workflow_group_item[0]["examples"] + if not workflow_group_item: + continue + workflows = workflow_group_item[0].get("examples") + if not workflows: + continue executions_by_wfgroup[wf_group] = [ execute_workflow(remote, tag, workflow[0], workflow[1], cluster_pool_name) for workflow in workflows From 811ce3937abd711d05f09961baf409582050b338 Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Mon, 1 Apr 2024 12:05:20 -0700 Subject: [PATCH 387/645] Upgrade grpc health probe 0.4.11 -> 0.4.25 (#5153) - Resolves vulnerability scans for the grpc health probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/tag/v0.4.25 https://github.com/grpc-ecosystem/grpc-health-probe/compare/v0.4.11...v0.4.25 Resolves CVE-2023-39325 CVE-2022-41723 CVE-2022-41716 CVE-2022-27664 CVE-2023-44487 CVE-2023-44487 CVE-2022-41717 CVE-2022-29526 CVE-2024-28180 Signed-off-by: ddl-ebrown --- Dockerfile.datacatalog | 4 ++-- Dockerfile.flyteadmin | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile.datacatalog b/Dockerfile.datacatalog index 16ef312c15..ffda0ca8db 100644 --- a/Dockerfile.datacatalog +++ b/Dockerfile.datacatalog @@ -15,10 +15,10 @@ RUN apk add git openssh-client make curl RUN mkdir /artifacts # Pull GRPC health probe binary for liveness and readiness checks -RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \ +RUN GRPC_HEALTH_PROBE_VERSION=v0.4.25 && \ wget -qO/artifacts/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ chmod +x /artifacts/grpc_health_probe && \ - echo 'ded15e598d887ccc47bf2321371950bbf930f5e4856b9f75712ce4b2b5120480 /artifacts/grpc_health_probe' > .grpc_checksum && \ + echo 'd14037ad94518eac8dbe57c146d6c2ca808f7f32600ee0c4057ef4b03ee0e42e /artifacts/grpc_health_probe' > .grpc_checksum && \ sha256sum -c .grpc_checksum WORKDIR /go/src/github.com/flyteorg/datacatalog diff --git a/Dockerfile.flyteadmin b/Dockerfile.flyteadmin index bf92438380..fa8b3acbd3 100644 --- a/Dockerfile.flyteadmin +++ b/Dockerfile.flyteadmin @@ -15,10 +15,10 @@ RUN apk add git openssh-client make curl RUN mkdir /artifacts # Pull GRPC health probe binary for liveness and readiness checks -RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \ +RUN GRPC_HEALTH_PROBE_VERSION=v0.4.25 && \ wget -qO/artifacts/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ chmod +x /artifacts/grpc_health_probe && \ - echo 'ded15e598d887ccc47bf2321371950bbf930f5e4856b9f75712ce4b2b5120480 /artifacts/grpc_health_probe' > .grpc_checksum && \ + echo 'd14037ad94518eac8dbe57c146d6c2ca808f7f32600ee0c4057ef4b03ee0e42e /artifacts/grpc_health_probe' > .grpc_checksum && \ sha256sum -c .grpc_checksum WORKDIR /go/src/github.com/flyteorg/flyteadmin From ba86c69c0f2e6c642eac31ab5e0e6cc5a6997062 Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Mon, 1 Apr 2024 12:06:10 -0700 Subject: [PATCH 388/645] Upgrade go-jose v3.0.0 -> v3.0.3 (#5154) * Upgrade golang.org/x/exp and golang.org/x/net Signed-off-by: ddl-ebrown * Upgrade go-jose v3.0.0 -> v3.0.3 - Resolves vulns GO-2023-2334 CVE-2024-28180 Signed-off-by: ddl-ebrown --------- Signed-off-by: ddl-ebrown --- datacatalog/go.mod | 8 ++++---- datacatalog/go.sum | 20 ++++++++++---------- flyteadmin/go.mod | 12 ++++++------ flyteadmin/go.sum | 39 +++++++++++++++++++++++++-------------- flytecopilot/go.mod | 8 ++++---- flytecopilot/go.sum | 20 ++++++++++---------- flyteidl/go.mod | 8 ++++---- flyteidl/go.sum | 20 ++++++++++---------- flyteplugins/go.mod | 8 ++++---- flyteplugins/go.sum | 20 ++++++++++---------- flytepropeller/go.mod | 8 ++++---- flytepropeller/go.sum | 20 ++++++++++---------- flytestdlib/go.mod | 12 ++++++------ flytestdlib/go.sum | 24 ++++++++++++------------ go.mod | 12 ++++++------ go.sum | 39 +++++++++++++++++++++++++-------------- 16 files changed, 150 insertions(+), 128 deletions(-) diff --git a/datacatalog/go.mod b/datacatalog/go.mod index 053ee8ea02..80cd3e05df 100644 --- a/datacatalog/go.mod +++ b/datacatalog/go.mod @@ -111,13 +111,13 @@ require ( go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect + golang.org/x/net v0.22.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.155.0 // indirect diff --git a/datacatalog/go.sum b/datacatalog/go.sum index 22533c26f4..f3229e65d7 100644 --- a/datacatalog/go.sum +++ b/datacatalog/go.sum @@ -471,8 +471,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -483,8 +483,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -545,8 +545,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -627,8 +627,8 @@ golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXR golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -698,8 +698,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index 41e11a265b..e6b07e0e23 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -97,7 +97,7 @@ require ( github.com/fatih/color v1.13.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-jose/go-jose/v3 v3.0.0 // indirect + github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect @@ -179,14 +179,14 @@ require ( go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect + golang.org/x/net v0.22.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/tools v0.19.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index 530f45e42f..ce5d7880b1 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -262,8 +262,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gormigrate/gormigrate/v2 v2.1.1 h1:eGS0WTFRV30r103lU8JNXY27KbviRnqqIDobW3EV3iY= github.com/go-gormigrate/gormigrate/v2 v2.1.1/go.mod h1:L7nJ620PFDKei9QOhJzqA8kRCk+E3UbV2f5gv+1ndLc= -github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo= -github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= +github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= +github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -674,6 +674,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-jsonnet v0.16.0/go.mod h1:sOcuej3UW1vpPTZOr8L7RQimqai1a57bt5j22LzGZCw= @@ -1419,8 +1420,9 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1435,8 +1437,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 h1:9k5exFQKQglLo+RoP+4zMjOFE14P6+vyR0baDAi0Rcs= -golang.org/x/exp v0.0.0-20231005195138-3e424a577f31/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1463,8 +1465,9 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180816102801-aaf60122140d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1524,8 +1527,9 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1551,6 +1555,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1640,14 +1645,18 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1658,6 +1667,7 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1768,8 +1778,9 @@ golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/flytecopilot/go.mod b/flytecopilot/go.mod index b06a9dc13e..5caf82b026 100644 --- a/flytecopilot/go.mod +++ b/flytecopilot/go.mod @@ -96,13 +96,13 @@ require ( go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect + golang.org/x/net v0.22.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.155.0 // indirect diff --git a/flytecopilot/go.sum b/flytecopilot/go.sum index 2215c54e5c..e0333902d0 100644 --- a/flytecopilot/go.sum +++ b/flytecopilot/go.sum @@ -382,8 +382,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -394,8 +394,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -454,8 +454,8 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -527,8 +527,8 @@ golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -594,8 +594,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/flyteidl/go.mod b/flyteidl/go.mod index 1939e90151..e776c2e6d2 100644 --- a/flyteidl/go.mod +++ b/flyteidl/go.mod @@ -17,7 +17,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 - golang.org/x/net v0.20.0 + golang.org/x/net v0.22.0 golang.org/x/oauth2 v0.16.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.1 @@ -93,11 +93,11 @@ require ( go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.155.0 // indirect diff --git a/flyteidl/go.sum b/flyteidl/go.sum index a1588be66a..fce3280f30 100644 --- a/flyteidl/go.sum +++ b/flyteidl/go.sum @@ -376,8 +376,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -388,8 +388,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -443,8 +443,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -508,8 +508,8 @@ golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -569,8 +569,8 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/flyteplugins/go.mod b/flyteplugins/go.mod index 7490e9aace..b080a5f001 100644 --- a/flyteplugins/go.mod +++ b/flyteplugins/go.mod @@ -25,8 +25,8 @@ require ( github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e - golang.org/x/net v0.20.0 + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 + golang.org/x/net v0.22.0 golang.org/x/oauth2 v0.16.0 google.golang.org/api v0.155.0 google.golang.org/grpc v1.62.1 @@ -123,10 +123,10 @@ require ( go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect - golang.org/x/crypto v0.18.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect diff --git a/flyteplugins/go.sum b/flyteplugins/go.sum index a2ed12d4ab..c8d1f7775c 100644 --- a/flyteplugins/go.sum +++ b/flyteplugins/go.sum @@ -431,8 +431,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -443,8 +443,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -504,8 +504,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -580,8 +580,8 @@ golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -648,8 +648,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/flytepropeller/go.mod b/flytepropeller/go.mod index 960dd00e12..c8458faa6e 100644 --- a/flytepropeller/go.mod +++ b/flytepropeller/go.mod @@ -28,7 +28,7 @@ require ( go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 go.opentelemetry.io/otel v1.21.0 go.opentelemetry.io/otel/trace v1.21.0 - golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 golang.org/x/sync v0.6.0 golang.org/x/time v0.5.0 google.golang.org/grpc v1.62.1 @@ -128,11 +128,11 @@ require ( go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/otel/sdk v1.21.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.22.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/api v0.155.0 // indirect diff --git a/flytepropeller/go.sum b/flytepropeller/go.sum index 0dcde9cae4..6174625603 100644 --- a/flytepropeller/go.sum +++ b/flytepropeller/go.sum @@ -467,8 +467,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -479,8 +479,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 h1:9k5exFQKQglLo+RoP+4zMjOFE14P6+vyR0baDAi0Rcs= -golang.org/x/exp v0.0.0-20231005195138-3e424a577f31/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -542,8 +542,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -625,8 +625,8 @@ golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -694,8 +694,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/flytestdlib/go.mod b/flytestdlib/go.mod index e7be75f65e..88a71e485f 100644 --- a/flytestdlib/go.mod +++ b/flytestdlib/go.mod @@ -33,7 +33,7 @@ require ( go.opentelemetry.io/otel/sdk v1.21.0 go.opentelemetry.io/otel/trace v1.21.0 golang.org/x/time v0.5.0 - golang.org/x/tools v0.9.3 + golang.org/x/tools v0.19.0 google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.33.0 gorm.io/driver/postgres v1.5.3 @@ -119,14 +119,14 @@ require ( go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/net v0.22.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/api v0.155.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/flytestdlib/go.sum b/flytestdlib/go.sum index 60173fbc27..77bdba56c8 100644 --- a/flytestdlib/go.sum +++ b/flytestdlib/go.sum @@ -473,8 +473,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -485,8 +485,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -511,8 +511,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -549,8 +549,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -631,8 +631,8 @@ golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXR golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -702,8 +702,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/go.mod b/go.mod index fefdd9c71d..6fd9002830 100644 --- a/go.mod +++ b/go.mod @@ -70,7 +70,7 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-gormigrate/gormigrate/v2 v2.1.1 // indirect - github.com/go-jose/go-jose/v3 v3.0.0 // indirect + github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect @@ -186,15 +186,15 @@ require ( go.opentelemetry.io/otel/trace v1.21.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect + golang.org/x/net v0.22.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/tools v0.19.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/api v0.155.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/go.sum b/go.sum index bd39382016..d6bda49ce4 100644 --- a/go.sum +++ b/go.sum @@ -285,8 +285,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gormigrate/gormigrate/v2 v2.1.1 h1:eGS0WTFRV30r103lU8JNXY27KbviRnqqIDobW3EV3iY= github.com/go-gormigrate/gormigrate/v2 v2.1.1/go.mod h1:L7nJ620PFDKei9QOhJzqA8kRCk+E3UbV2f5gv+1ndLc= -github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo= -github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= +github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= +github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -700,6 +700,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-jsonnet v0.16.0/go.mod h1:sOcuej3UW1vpPTZOr8L7RQimqai1a57bt5j22LzGZCw= @@ -1453,8 +1454,9 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1469,8 +1471,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231005195138-3e424a577f31 h1:9k5exFQKQglLo+RoP+4zMjOFE14P6+vyR0baDAi0Rcs= -golang.org/x/exp v0.0.0-20231005195138-3e424a577f31/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1497,8 +1499,9 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180816102801-aaf60122140d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1558,8 +1561,9 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1585,6 +1589,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1674,14 +1679,18 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1692,6 +1701,7 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1802,8 +1812,9 @@ golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From b2d0d85b9587bf1fdaa4ebf8ea889e04ff45904d Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Mon, 1 Apr 2024 13:28:33 -0700 Subject: [PATCH 389/645] docs: update agent development documentation (#5130) * docs: update agent development documentation * nit Signed-off-by: Kevin Su * lint Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su * Update docs/flyte_agents/developing_agents.md Co-authored-by: Nikki Everett Signed-off-by: Kevin Su --------- Signed-off-by: Kevin Su Co-authored-by: Nikki Everett --- docs/flyte_agents/developing_agents.md | 87 ++++++++++++++++----- docs/flyte_agents/index.md | 2 +- docs/flyte_agents/testing_agents_locally.md | 17 +++- 3 files changed, 80 insertions(+), 26 deletions(-) diff --git a/docs/flyte_agents/developing_agents.md b/docs/flyte_agents/developing_agents.md index 3ea6db1d03..f4fb1378b4 100644 --- a/docs/flyte_agents/developing_agents.md +++ b/docs/flyte_agents/developing_agents.md @@ -42,9 +42,12 @@ To create a new async agent, extend the [`AsyncAgentBase`](https://github.com/fl - `delete`: Invoking this method will send a request to delete the corresponding job. ```python -from flytekit.extend.backend.base_agent import AsyncAgentBase, AgentRegistry, Resource -from flytekit import StructuredDataset +from typing import Optional from dataclasses import dataclass +from flytekit.models.literals import LiteralMap +from flytekit.models.task import TaskTemplate +from flytekit.extend.backend.base_agent import AsyncAgentBase, AgentRegistry, Resource, ResourceMeta + @dataclass class BigQueryMetadata(ResourceMeta): @@ -60,21 +63,20 @@ class BigQueryAgent(AsyncAgentBase): def create( self, task_template: TaskTemplate, - inputs: typing.Optional[LiteralMap] = None, + inputs: Optional[LiteralMap] = None, **kwargs, ) -> BigQueryMetadata: - # Submit the job to BigQuery here. - return BigQueryMetadata(job_id=job_id, outputs={"o0": StructuredDataset(uri=result_table_uri))} + job_id = submit_bigquery_job(inputs) + return BigQueryMetadata(job_id=job_id) def get(self, resource_meta: BigQueryMetadata, **kwargs) -> Resource: - # Get the job status from BigQuery. - return Resource(phase=res.phase) + phase, outputs = get_job_status(resource_meta.job_id) + return Resource(phase=phase, outputs=outputs) def delete(self, resource_meta: BigQueryMetadata, **kwargs): - # Delete the job from BigQuery. - ... + cancel_bigquery_job(resource_meta.job_id) -# To register the custom agent +# To register the bigquery agent AgentRegistry.register(BigQueryAgent()) ``` @@ -87,8 +89,15 @@ To create a new sync agent, extend the [`SyncAgentBase`](https://github.com/flyt - `do`: This method is used to execute the synchronous task, and the worker in Flyte will be blocked until the method returns. ```python +from typing import Optional +from flytekit import FlyteContextManager +from flytekit.core.type_engine import TypeEngine +from flyteidl.core.execution_pb2 import TaskExecution +from flytekit.models.literals import LiteralMap +from flytekit.models.task import TaskTemplate from flytekit.extend.backend.base_agent import SyncAgentBase, AgentRegistry, Resource + class OpenAIAgent(SyncAgentBase): def __init__(self): super().__init__(task_type_name="openai") @@ -97,12 +106,31 @@ class OpenAIAgent(SyncAgentBase): # Convert the literal map to python value. ctx = FlyteContextManager.current_context() python_inputs = TypeEngine.literal_map_to_kwargs(ctx, inputs, literal_types=task_template.interface.inputs) - # Call the OpenAI API here. - return Resource(phase=phaseTaskExecution.SUCCEEDED, outputs={"o0": "Hello world!"}) + response = ask_chatgpt_question(python_inputs) + return Resource(phase=TaskExecution.SUCCEEDED, outputs={"o0": response}) AgentRegistry.register(OpenAIAgent()) ``` +#### Sensor interface specification +With the agent framework, you can easily build a custom sensor in Flyte to watch certain events or monitor the bucket in your workflow. + +To create a new sensor, extend the `[BaseSensor](https://github.com/flyteorg/flytekit/blob/master/flytekit/sensor/base_sensor.py#L43)` class and implement the `poke` method, which checks whether a specific condition is met. + +```python +from flytekit.sensor.base_sensor import BaseSensor +import s3fs + +class FileSensor(BaseSensor): + def __init__(self): + super().__init__(task_type="file_sensor") + + def poke(self, path: str) -> bool: + fs = s3fs.S3FileSystem() + return fs.exists(path) +``` + + ### 2. Test the agent locally See {doc}`"Testing agents locally" ` to test your agent locally. @@ -130,9 +158,14 @@ For flytekit versions `<=v1.10.2`, use `pyflyte serve`. For flytekit versions `>v1.10.2`, use `pyflyte serve agent`. ::: -### 4. Update FlyteAgent +### 4. Deploy Your Flyte agent 1. Update the FlyteAgent deployment's [image](https://github.com/flyteorg/flyte/blob/master/charts/flyteagent/templates/agent/deployment.yaml#L35) + +```bash +kubectl set image deployment/flyteagent flyteagent=ghcr.io/flyteorg/flyteagent:latest +``` + 2. Update the FlytePropeller configmap. ```YAML @@ -143,7 +176,26 @@ For flytekit versions `>v1.10.2`, use `pyflyte serve agent`. default-for-task-types: - bigquery_query_job_task: agent-service - custom_task: agent-service +``` +3. Restart FlytePropeller. + +``` +kubectl rollout restart deployment flytepropeller -n flyte +``` + + +### Canary deployment +Agents can be deployed independently in separate environments. Decoupling agents from the +production environment ensures that if any specific agent encounters an error or issue, it will not impact the overall production system. + +By running agents independently, you can thoroughly test and validate your agents in a +controlled environment before deploying them to the production cluster. + +By default, all agent requests will be sent to the default agent service. However, +you can route particular task requests to designated agent services by adjusting the flytepropeller configuration. + +```yaml plugins: agent-service: supportedTaskTypes: @@ -168,11 +220,4 @@ For flytekit versions `>v1.10.2`, use `pyflyte serve agent`. agentForTaskTypes: # It will override the default agent for custom_task, which means propeller will send the request to this agent. - custom_task: custom_agent - ``` - -3. Restart the FlytePropeller - -``` -kubectl rollout restart deployment flytepropeller -n flyte -``` - +``` \ No newline at end of file diff --git a/docs/flyte_agents/index.md b/docs/flyte_agents/index.md index 293f661be9..d5813650cc 100644 --- a/docs/flyte_agents/index.md +++ b/docs/flyte_agents/index.md @@ -23,7 +23,7 @@ You can create different agent services that host different agents, e.g., a prod If you need to connect to an external service in your workflow, we recommend using the corresponding agent rather than a web API plugin. Agents are designed to be scalable and can handle large workloads efficiently, and decrease load on FlytePropeller, since they run outside of it. You can also test agents locally without having to change the Flyte backend configuration, streamlining development. -For a list of agents you can use in your tasks and example usage for each, see the [Integrations](https://docs.flyte.org/en/latest/flytesnacks/integrations.html#agents) documentation. +For a list of agents you can use in your tasks and example usage for each, see the [Integrations](https://docs.flyte.org/en/latest/flytesnacks/integrations.html#flyte-agents) documentation. ## Table of contents diff --git a/docs/flyte_agents/testing_agents_locally.md b/docs/flyte_agents/testing_agents_locally.md index 2d7b98ba3e..dd4294dbea 100644 --- a/docs/flyte_agents/testing_agents_locally.md +++ b/docs/flyte_agents/testing_agents_locally.md @@ -11,7 +11,8 @@ jupytext: You can test agents locally without running the backend server, making agent development easier. -To test an agent locally, create a class for the agent task that inherits from [AsyncAgentExecutorMixin](https://github.com/flyteorg/flytekit/blob/master/flytekit/extend/backend/base_agent.py#L155). This mixin can handle both asynchronous tasks and synchronous tasks and allows flytekit to mimic FlytePropeller's behavior in calling the agent. +To test an agent locally, create a class for the agent task that inherits from `SyncAgentExecutorMixin` or `AsyncAgentExecutorMixin`. +These mixins can handle synchronous and asynchronous tasks, respectively, and allow flytekit to mimic FlytePropeller's behavior in calling the agent. ## BigQuery example @@ -24,11 +25,14 @@ For example, you need to set the `GOOGLE_APPLICATION_CREDENTIALS` environment va ``` -Add `AsyncAgentExecutorMixin` to this class to tell flytekit to use the agent to run the task. +Add `AsyncAgentExecutorMixin` or `SyncAgentExecutorMixin` to the class to tell flytekit to use the agent to run the task. ```python class BigQueryTask(AsyncAgentExecutorMixin, SQLTask[BigQueryConfig]): - def __init__(self, name: str, **kwargs): - ... + ... + +class ChatGPTTask(SyncAgentExecutorMixin, PythonTask): + ... + ``` Flytekit will automatically use the agent to run the task in the local execution. @@ -48,6 +52,10 @@ You can run the above example task locally and test the agent with the following pyflyte run bigquery_task.py bigquery_doge_coin --version 10 ``` +You can also run a BigQuery task in your Python interpreter to test the agent locally. + +![](https://raw.githubusercontent.com/flyteorg/static-resources/main/flyte/concepts/agents/bigquery_task.png) + ## Databricks example To test the Databricks agent, copy the following code to a file called `databricks_task.py`, modifying as needed. @@ -77,3 +85,4 @@ The Spark task will run locally if the `raw-output-data-prefix` is not set. pyflyte run --raw-output-data-prefix s3://my-s3-bucket/databricks databricks_task.py hello_spark ``` +![](https://raw.githubusercontent.com/flyteorg/static-resources/main/flyte/concepts/agents/spark_task.png) \ No newline at end of file From 524b473b832918f7477c6ec098e2ca190f914b5e Mon Sep 17 00:00:00 2001 From: David Espejo <82604841+davidmirror-ops@users.noreply.github.com> Date: Mon, 1 Apr 2024 15:50:22 -0500 Subject: [PATCH 390/645] Add variables to ease separate bucket config (#5015) * Add variables to ease separate bucket config Signed-off-by: davidmirror-ops * Output of make helm Signed-off-by: davidmirror-ops * Make Helm 3rd round Signed-off-by: davidmirror-ops * Make Helm Signed-off-by: davidmirror-ops * Make Helm Signed-off-by: davidmirror-ops --------- Signed-off-by: davidmirror-ops Signed-off-by: David Espejo <82604841+davidmirror-ops@users.noreply.github.com> Co-authored-by: davidmirror-ops --- charts/flyte-core/values-eks.yaml | 7 +++++-- charts/flyte-core/values-gcp.yaml | 7 +++++-- deployment/eks/flyte_aws_scheduler_helm_generated.yaml | 10 +++++----- deployment/eks/flyte_helm_controlplane_generated.yaml | 6 +++--- deployment/eks/flyte_helm_dataplane_generated.yaml | 4 ++-- deployment/eks/flyte_helm_generated.yaml | 10 +++++----- deployment/gcp/flyte_helm_controlplane_generated.yaml | 6 +++--- deployment/gcp/flyte_helm_dataplane_generated.yaml | 4 ++-- deployment/gcp/flyte_helm_generated.yaml | 10 +++++----- 9 files changed, 35 insertions(+), 29 deletions(-) diff --git a/charts/flyte-core/values-eks.yaml b/charts/flyte-core/values-eks.yaml index 3b7cbac830..0ab0dfc150 100644 --- a/charts/flyte-core/values-eks.yaml +++ b/charts/flyte-core/values-eks.yaml @@ -4,7 +4,10 @@ userSettings: certificateArn: dbPassword: rdsHost: - bucketName: +# These two storage buckets could be the same or you could specify different buckets if required. Both keys are required. +# Learn more https://docs.flyte.org/en/latest/concepts/data_management.html#understand-how-flyte-handles-data + bucketName: + rawDataBucketName: logGroup: redisHostUrl: redisHostKey: @@ -239,7 +242,7 @@ configmap: core: propeller: - rawoutput-prefix: "s3://{{ .Values.userSettings.bucketName }}/" + rawoutput-prefix: "s3://{{ .Values.userSettings.rawDataBucketName }}/" workers: 40 gc-interval: 12h max-workflow-retries: 50 diff --git a/charts/flyte-core/values-gcp.yaml b/charts/flyte-core/values-gcp.yaml index 4c91115c8d..b402924699 100644 --- a/charts/flyte-core/values-gcp.yaml +++ b/charts/flyte-core/values-gcp.yaml @@ -5,7 +5,10 @@ userSettings: googleProjectId: dbHost: dbPassword: - bucketName: +# These two storage buckets could be the same or you could specify different buckets if required. Both keys are required. +# Learn more https://docs.flyte.org/en/latest/concepts/data_management.html#understand-how-flyte-handles-data + bucketName: + rawDataBucketName: hostName: # @@ -268,7 +271,7 @@ configmap: core: propeller: - rawoutput-prefix: "gs://{{ .Values.userSettings.bucketName }}/" + rawoutput-prefix: "gs://{{ .Values.userSettings.rawDataBucketName }}/" workers: 40 gc-interval: 12h max-workflow-retries: 50 diff --git a/deployment/eks/flyte_aws_scheduler_helm_generated.yaml b/deployment/eks/flyte_aws_scheduler_helm_generated.yaml index 4420424c78..200fe365f2 100644 --- a/deployment/eks/flyte_aws_scheduler_helm_generated.yaml +++ b/deployment/eks/flyte_aws_scheduler_helm_generated.yaml @@ -182,7 +182,7 @@ data: storage.yaml: | storage: type: s3 - container: "" + container: "" connection: auth-type: iam region: @@ -391,7 +391,7 @@ data: storage.yaml: | storage: type: s3 - container: "" + container: "" connection: auth-type: iam region: @@ -473,7 +473,7 @@ data: rate: 100 type: bucket type: batch - rawoutput-prefix: s3:/// + rawoutput-prefix: s3:/// workers: 40 workflow-reeval-duration: 30s webhook: @@ -504,7 +504,7 @@ data: storage.yaml: | storage: type: s3 - container: "" + container: "" connection: auth-type: iam region: @@ -1167,7 +1167,7 @@ spec: template: metadata: annotations: - configChecksum: "59ef5b555bd41c3e854a315f21031c76dfa876455ff8069b989cb6c28ec1f17" + configChecksum: "c2a15ce5dc2fa465986d6006f93450723da58166b3ad5ee35a91cb37d5c39da" labels: app.kubernetes.io/name: datacatalog app.kubernetes.io/instance: flyte diff --git a/deployment/eks/flyte_helm_controlplane_generated.yaml b/deployment/eks/flyte_helm_controlplane_generated.yaml index 3c558f9485..36667d78f8 100644 --- a/deployment/eks/flyte_helm_controlplane_generated.yaml +++ b/deployment/eks/flyte_helm_controlplane_generated.yaml @@ -163,7 +163,7 @@ data: storage.yaml: | storage: type: s3 - container: "" + container: "" connection: auth-type: iam region: @@ -357,7 +357,7 @@ data: storage.yaml: | storage: type: s3 - container: "" + container: "" connection: auth-type: iam region: @@ -872,7 +872,7 @@ spec: template: metadata: annotations: - configChecksum: "59ef5b555bd41c3e854a315f21031c76dfa876455ff8069b989cb6c28ec1f17" + configChecksum: "c2a15ce5dc2fa465986d6006f93450723da58166b3ad5ee35a91cb37d5c39da" labels: app.kubernetes.io/name: datacatalog app.kubernetes.io/instance: flyte diff --git a/deployment/eks/flyte_helm_dataplane_generated.yaml b/deployment/eks/flyte_helm_dataplane_generated.yaml index 7ca99eee27..8627896512 100644 --- a/deployment/eks/flyte_helm_dataplane_generated.yaml +++ b/deployment/eks/flyte_helm_dataplane_generated.yaml @@ -137,7 +137,7 @@ data: rate: 100 type: bucket type: batch - rawoutput-prefix: s3:/// + rawoutput-prefix: s3:/// workers: 40 workflow-reeval-duration: 30s webhook: @@ -168,7 +168,7 @@ data: storage.yaml: | storage: type: s3 - container: "" + container: "" connection: auth-type: iam region: diff --git a/deployment/eks/flyte_helm_generated.yaml b/deployment/eks/flyte_helm_generated.yaml index bbfb0f32bc..4bec7d622f 100644 --- a/deployment/eks/flyte_helm_generated.yaml +++ b/deployment/eks/flyte_helm_generated.yaml @@ -194,7 +194,7 @@ data: storage.yaml: | storage: type: s3 - container: "" + container: "" connection: auth-type: iam region: @@ -388,7 +388,7 @@ data: storage.yaml: | storage: type: s3 - container: "" + container: "" connection: auth-type: iam region: @@ -504,7 +504,7 @@ data: rate: 100 type: bucket type: batch - rawoutput-prefix: s3:/// + rawoutput-prefix: s3:/// workers: 40 workflow-reeval-duration: 30s webhook: @@ -535,7 +535,7 @@ data: storage.yaml: | storage: type: s3 - container: "" + container: "" connection: auth-type: iam region: @@ -1198,7 +1198,7 @@ spec: template: metadata: annotations: - configChecksum: "59ef5b555bd41c3e854a315f21031c76dfa876455ff8069b989cb6c28ec1f17" + configChecksum: "c2a15ce5dc2fa465986d6006f93450723da58166b3ad5ee35a91cb37d5c39da" labels: app.kubernetes.io/name: datacatalog app.kubernetes.io/instance: flyte diff --git a/deployment/gcp/flyte_helm_controlplane_generated.yaml b/deployment/gcp/flyte_helm_controlplane_generated.yaml index cda8eb8df6..68fb7acb6b 100644 --- a/deployment/gcp/flyte_helm_controlplane_generated.yaml +++ b/deployment/gcp/flyte_helm_controlplane_generated.yaml @@ -171,7 +171,7 @@ data: json: "" project_id: scopes: https://www.googleapis.com/auth/cloud-platform - container: "" + container: "" enable-multicontainer: false limits: maxDownloadMBs: 10 @@ -373,7 +373,7 @@ data: json: "" project_id: scopes: https://www.googleapis.com/auth/cloud-platform - container: "" + container: "" enable-multicontainer: false limits: maxDownloadMBs: 10 @@ -887,7 +887,7 @@ spec: template: metadata: annotations: - configChecksum: "bc69ed841506b28a42ac19bd0884d483472b3d11fe85fe7e546b879aeb30a85" + configChecksum: "905a2a911a85dbf8d4f1dc3be24b9c4fd7bb46481db0e174274d6aea6129b4c" labels: app.kubernetes.io/name: datacatalog app.kubernetes.io/instance: flyte diff --git a/deployment/gcp/flyte_helm_dataplane_generated.yaml b/deployment/gcp/flyte_helm_dataplane_generated.yaml index ed40cc352e..4048f53c17 100644 --- a/deployment/gcp/flyte_helm_dataplane_generated.yaml +++ b/deployment/gcp/flyte_helm_dataplane_generated.yaml @@ -137,7 +137,7 @@ data: rate: 100 type: bucket type: batch - rawoutput-prefix: gs:/// + rawoutput-prefix: gs:/// workers: 40 workflow-reeval-duration: 30s webhook: @@ -174,7 +174,7 @@ data: json: "" project_id: scopes: https://www.googleapis.com/auth/cloud-platform - container: "" + container: "" enable-multicontainer: false limits: maxDownloadMBs: 10 diff --git a/deployment/gcp/flyte_helm_generated.yaml b/deployment/gcp/flyte_helm_generated.yaml index fd314eb457..a5a028f15c 100644 --- a/deployment/gcp/flyte_helm_generated.yaml +++ b/deployment/gcp/flyte_helm_generated.yaml @@ -202,7 +202,7 @@ data: json: "" project_id: scopes: https://www.googleapis.com/auth/cloud-platform - container: "" + container: "" enable-multicontainer: false limits: maxDownloadMBs: 10 @@ -404,7 +404,7 @@ data: json: "" project_id: scopes: https://www.googleapis.com/auth/cloud-platform - container: "" + container: "" enable-multicontainer: false limits: maxDownloadMBs: 10 @@ -517,7 +517,7 @@ data: rate: 100 type: bucket type: batch - rawoutput-prefix: gs:/// + rawoutput-prefix: gs:/// workers: 40 workflow-reeval-duration: 30s webhook: @@ -554,7 +554,7 @@ data: json: "" project_id: scopes: https://www.googleapis.com/auth/cloud-platform - container: "" + container: "" enable-multicontainer: false limits: maxDownloadMBs: 10 @@ -1221,7 +1221,7 @@ spec: template: metadata: annotations: - configChecksum: "bc69ed841506b28a42ac19bd0884d483472b3d11fe85fe7e546b879aeb30a85" + configChecksum: "905a2a911a85dbf8d4f1dc3be24b9c4fd7bb46481db0e174274d6aea6129b4c" labels: app.kubernetes.io/name: datacatalog app.kubernetes.io/instance: flyte From 9cf1f6fe67f3804178bbf39765f15aca39ce7d27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 22:36:45 +0000 Subject: [PATCH 391/645] Bump golang.org/x/net from 0.12.0 to 0.17.0 in /boilerplate/flyte/golang_support_tools (#5146) * Bump golang.org/x/net in /boilerplate/flyte/golang_support_tools Bumps [golang.org/x/net](https://github.com/golang/net) from 0.12.0 to 0.17.0. - [Commits](https://github.com/golang/net/compare/v0.12.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump google.golang.org/grpc and golang.org/x/net Signed-off-by: Eduardo Apolinario --------- Signed-off-by: dependabot[bot] Signed-off-by: Eduardo Apolinario Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eduardo Apolinario --- boilerplate/flyte/golang_support_tools/go.mod | 98 +++++--- boilerplate/flyte/golang_support_tools/go.sum | 220 ++++++++++++------ .../flyte_aws_scheduler_helm_generated.yaml | 6 +- .../flyte_helm_controlplane_generated.yaml | 4 +- .../eks/flyte_helm_dataplane_generated.yaml | 4 +- deployment/eks/flyte_helm_generated.yaml | 8 +- .../flyte_helm_controlplane_generated.yaml | 4 +- .../gcp/flyte_helm_dataplane_generated.yaml | 4 +- deployment/gcp/flyte_helm_generated.yaml | 8 +- docker/sandbox-bundled/bootstrap/go.mod | 6 +- docker/sandbox-bundled/bootstrap/go.sum | 12 +- .../manifests/complete-agent.yaml | 4 +- .../sandbox-bundled/manifests/complete.yaml | 4 +- docker/sandbox-bundled/manifests/dev.yaml | 4 +- 14 files changed, 246 insertions(+), 140 deletions(-) diff --git a/boilerplate/flyte/golang_support_tools/go.mod b/boilerplate/flyte/golang_support_tools/go.mod index df65dd7662..c157497a57 100644 --- a/boilerplate/flyte/golang_support_tools/go.mod +++ b/boilerplate/flyte/golang_support_tools/go.mod @@ -1,6 +1,8 @@ module github.com/flyteorg/boilerplate -go 1.19 +go 1.21 + +toolchain go1.21.7 require ( github.com/EngHabu/mockery v0.0.0-20220405200825-3f76291311cf @@ -13,11 +15,11 @@ require ( require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect 4d63.com/gochecknoglobals v0.2.1 // indirect - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.19.1 // indirect + cloud.google.com/go v0.112.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.13.0 // indirect - cloud.google.com/go/storage v1.29.0 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/storage v1.36.0 // indirect github.com/4meepo/tagalign v1.2.2 // indirect github.com/Abirdcfly/dupword v0.0.11 // indirect github.com/Antonboom/errname v0.1.10 // indirect @@ -57,20 +59,26 @@ require ( github.com/daixiang0/gci v0.10.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/denis-tingaikin/go-header v0.4.3 // indirect - github.com/envoyproxy/protoc-gen-validate v0.10.1 // indirect + github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 // indirect github.com/esimonov/ifshort v1.0.4 // indirect github.com/ettle/strcase v0.1.1 // indirect + github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.15.0 // indirect github.com/fatih/structtag v1.2.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/firefart/nonamedreturns v1.0.4 // indirect github.com/flyteorg/stow v0.3.10 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-critic/go-critic v0.8.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect github.com/go-toolsmith/astcopy v1.1.0 // indirect github.com/go-toolsmith/astequal v1.1.0 // indirect @@ -94,10 +102,13 @@ require ( github.com/golangci/misspell v0.4.0 // indirect github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect github.com/gostaticanalysis/comment v1.4.2 // indirect @@ -115,6 +126,8 @@ require ( github.com/jingyugao/rowserrcheck v1.1.1 // indirect github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/julz/importas v0.1.0 // indirect github.com/kisielk/errcheck v1.6.3 // indirect github.com/kisielk/gotool v1.0.0 // indirect @@ -128,6 +141,7 @@ require ( github.com/leonklingele/grouper v1.1.1 // indirect github.com/lufeee/execinquery v1.2.1 // indirect github.com/magiconair/properties v1.8.6 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/maratori/testableexamples v1.0.0 // indirect github.com/maratori/testpackage v1.1.1 // indirect github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect @@ -139,7 +153,10 @@ require ( github.com/mgechev/revive v1.3.2 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/moricho/tparallel v0.3.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect github.com/nakabonne/nestif v0.3.1 // indirect github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect @@ -177,7 +194,7 @@ require ( github.com/sivchari/tenv v1.7.1 // indirect github.com/sonatard/noctx v0.0.2 // indirect github.com/sourcegraph/go-diff v0.7.0 // indirect - github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/afero v1.10.0 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -204,47 +221,58 @@ require ( github.com/ykadowak/zerologlint v0.1.2 // indirect gitlab.com/bosi/decorder v0.2.3 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/sdk v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.tmz.dev/musttag v0.7.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.17.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.25.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.11.1 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.114.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect - google.golang.org/grpc v1.56.1 // indirect - google.golang.org/protobuf v1.30.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/api v0.155.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/grpc v1.62.1 // indirect + google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.4.3 // indirect + k8s.io/api v0.28.2 // indirect k8s.io/apimachinery v0.28.2 // indirect k8s.io/client-go v0.28.1 // indirect k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect mvdan.cc/gofumpt v0.5.0 // indirect mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d // indirect + sigs.k8s.io/controller-runtime v0.0.0-00010101000000-000000000000 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 +replace ( + github.com/pseudomuto/protoc-gen-doc => github.com/flyteorg/protoc-gen-doc v1.4.2 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.16.2 +) diff --git a/boilerplate/flyte/golang_support_tools/go.sum b/boilerplate/flyte/golang_support_tools/go.sum index a0f0dc574c..ae52773e15 100644 --- a/boilerplate/flyte/golang_support_tools/go.sum +++ b/boilerplate/flyte/golang_support_tools/go.sum @@ -21,23 +21,22 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -48,8 +47,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/4meepo/tagalign v1.2.2 h1:kQeUTkFTaBRtd/7jm8OKJl9iHk0gAO+TDFPHGSna0aw= github.com/4meepo/tagalign v1.2.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= @@ -66,6 +65,7 @@ github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQ github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0 h1:nVocQV40OQne5613EeLayJiRAJuKlBGy+m22qWG+WRg= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M= @@ -110,7 +110,8 @@ github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5Fc github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= github.com/aws/aws-sdk-go v1.44.2 h1:5VBk5r06bgxgRKVaUtm1/4NT/rtrnH2E4cnAYv5zgQc= github.com/aws/aws-sdk-go v1.44.2/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -141,6 +142,7 @@ github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoG github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -148,9 +150,12 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= github.com/daixiang0/gci v0.10.1 h1:eheNA3ljF6SxnPD/vE4lCBusVHmV3Rs3dkKvFrJ7MR0= @@ -162,6 +167,9 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -169,27 +177,32 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/flyteorg/flyte/flytestdlib v1.11.0 h1:I/pHpq02/FSpB0irbfLhss2AJZX7dPCFll98AHqF0Rk= -github.com/flyteorg/flyte/flytestdlib v1.11.0/go.mod h1:5cm+LxTc0N0R0TQwv8uG6uCu8MoOMwMsU/YbFP0akPA= +github.com/flyteorg/flyte/flytestdlib v1.11.0 h1:DxM/sf6H0ong8LIjgh0YwXK+abnGV8kWVi6EgfVCkO8= +github.com/flyteorg/flyte/flytestdlib v1.11.0/go.mod h1:AmgNCq/tGEDwVfilW1nFtgPQn8vQ9gcDu6SNwz1YY+M= github.com/flyteorg/protoc-gen-doc v1.4.2 h1:Otw0F+RHaPQ8XlpzhLLgjsCMcrAIcMO01Zh+ALe3rrE= github.com/flyteorg/protoc-gen-doc v1.4.2/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= github.com/flyteorg/stow v0.3.10 h1:uEe+tI+CGKn21H93uXp9z05hqynEki2BO9KkW/GweY8= github.com/flyteorg/stow v0.3.10/go.mod h1:fArjMpsYJNWkp/hyDKKdbcv07gxbuLmKFcb7YT1aSOM= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= @@ -209,12 +222,21 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= @@ -227,6 +249,7 @@ github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlN github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= +github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= @@ -296,6 +319,8 @@ github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSW github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -309,14 +334,17 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -328,17 +356,20 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= @@ -353,6 +384,7 @@ github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3 github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -376,6 +408,7 @@ github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= @@ -386,10 +419,13 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -409,10 +445,13 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= github.com/kunwardeep/paralleltest v1.0.7 h1:2uCk94js0+nVNQoHZNLBkAR1DQJrVzw6T0RMzJn55dQ= @@ -431,6 +470,8 @@ github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCE github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= @@ -458,12 +499,16 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= @@ -482,8 +527,10 @@ github.com/nunnatsa/ginkgolinter v0.12.1 h1:vwOqb5Nu05OikTXqhvLdHCGcx5uthIYIl0t7 github.com/nunnatsa/ginkgolinter v0.12.1/go.mod h1:AK8Ab1PypVrcGUusuKD8RDcl2KgsIwvNaaxAlyHSzso= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= @@ -546,6 +593,7 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= @@ -580,8 +628,8 @@ github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCp github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= @@ -658,6 +706,7 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= go-simpler.org/assert v0.5.0 h1:+5L/lajuQtzmbtEfh69sr5cRf2/xZzyJhFjoOz/PPqs= +go-simpler.org/assert v0.5.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -666,27 +715,30 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.tmz.dev/musttag v0.7.0 h1:QfytzjTWGXZmChoX0L++7uQN+yRCPfyFm+whsM+lfGc= go.tmz.dev/musttag v0.7.0/go.mod h1:oTFPvgOkJmp5kYL02S8+jrH0eLrBIl57rzWeA26zDEM= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= +go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -696,10 +748,10 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -785,14 +837,15 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -803,8 +856,8 @@ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -819,8 +872,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -881,14 +934,16 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -897,6 +952,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= @@ -905,8 +961,8 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -978,14 +1034,16 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.11.1 h1:ojD5zOW8+7dOGzdnNgersm8aPfcDjhMp12UfG93NIMc= -golang.org/x/tools v0.11.1/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1005,16 +1063,17 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1052,12 +1111,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1074,8 +1133,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1088,14 +1147,17 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1118,12 +1180,20 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= +k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= +k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= +k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= +k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= k8s.io/client-go v0.28.1 h1:pRhMzB8HyLfVwpngWKE8hDcXRqifh1ga2Z/PU9SXVK8= k8s.io/client-go v0.28.1/go.mod h1:pEZA3FqOsVkCc07pFVzK076R+P/eXqsgx5zuuRWukNE= +k8s.io/component-base v0.28.1 h1:LA4AujMlK2mr0tZbQDZkjWbdhTV5bRyEyAFe0TJxlWg= +k8s.io/component-base v0.28.1/go.mod h1:jI11OyhbX21Qtbav7JkhehyBsIRfnO8oEgoAR12ArIU= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= +k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= @@ -1137,3 +1207,11 @@ mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RF rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/controller-runtime v0.16.2 h1:mwXAVuEk3EQf478PQwQ48zGOXvW27UJc8NHktQVuIPU= +sigs.k8s.io/controller-runtime v0.16.2/go.mod h1:vpMu3LpI5sYWtujJOa2uPK61nB5rbwlN7BAB8aSLvGU= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/deployment/eks/flyte_aws_scheduler_helm_generated.yaml b/deployment/eks/flyte_aws_scheduler_helm_generated.yaml index 200fe365f2..1de7db3436 100644 --- a/deployment/eks/flyte_aws_scheduler_helm_generated.yaml +++ b/deployment/eks/flyte_aws_scheduler_helm_generated.yaml @@ -849,7 +849,7 @@ spec: template: metadata: annotations: - configChecksum: "d50d9b515795be1f4937c58f37335ec9bd505ba4c51f96caf8491fa323abb56" + configChecksum: "618a516ca42e8bbe5222a76f7865a0a444b6048002d7fcc06144c9188f3fd3d" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -1269,7 +1269,7 @@ spec: template: metadata: annotations: - configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" + configChecksum: "e7a065fd96ff8a6564199b17e054fac2da37f402b421e20fbe2160fc43f11cc" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -1351,7 +1351,7 @@ spec: app.kubernetes.io/name: flyte-pod-webhook app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" + configChecksum: "e7a065fd96ff8a6564199b17e054fac2da37f402b421e20fbe2160fc43f11cc" spec: securityContext: fsGroup: 65534 diff --git a/deployment/eks/flyte_helm_controlplane_generated.yaml b/deployment/eks/flyte_helm_controlplane_generated.yaml index 36667d78f8..45689f769c 100644 --- a/deployment/eks/flyte_helm_controlplane_generated.yaml +++ b/deployment/eks/flyte_helm_controlplane_generated.yaml @@ -554,7 +554,7 @@ spec: template: metadata: annotations: - configChecksum: "b6087931f4457971d5fcd17d64491188322ffc2f86e31f943b142c76edb9e67" + configChecksum: "5ce6f593fb92c9a6fd183825231d187471b5f10fe948f601f6d5b56edd02b51" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -974,7 +974,7 @@ spec: template: metadata: annotations: - configChecksum: "b6087931f4457971d5fcd17d64491188322ffc2f86e31f943b142c76edb9e67" + configChecksum: "5ce6f593fb92c9a6fd183825231d187471b5f10fe948f601f6d5b56edd02b51" labels: app.kubernetes.io/name: flytescheduler app.kubernetes.io/instance: flyte diff --git a/deployment/eks/flyte_helm_dataplane_generated.yaml b/deployment/eks/flyte_helm_dataplane_generated.yaml index 8627896512..41c7a5aef7 100644 --- a/deployment/eks/flyte_helm_dataplane_generated.yaml +++ b/deployment/eks/flyte_helm_dataplane_generated.yaml @@ -428,7 +428,7 @@ spec: template: metadata: annotations: - configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" + configChecksum: "e7a065fd96ff8a6564199b17e054fac2da37f402b421e20fbe2160fc43f11cc" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -510,7 +510,7 @@ spec: app.kubernetes.io/name: flyte-pod-webhook app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" + configChecksum: "e7a065fd96ff8a6564199b17e054fac2da37f402b421e20fbe2160fc43f11cc" spec: securityContext: fsGroup: 65534 diff --git a/deployment/eks/flyte_helm_generated.yaml b/deployment/eks/flyte_helm_generated.yaml index 4bec7d622f..85011afcda 100644 --- a/deployment/eks/flyte_helm_generated.yaml +++ b/deployment/eks/flyte_helm_generated.yaml @@ -880,7 +880,7 @@ spec: template: metadata: annotations: - configChecksum: "b6087931f4457971d5fcd17d64491188322ffc2f86e31f943b142c76edb9e67" + configChecksum: "5ce6f593fb92c9a6fd183825231d187471b5f10fe948f601f6d5b56edd02b51" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -1300,7 +1300,7 @@ spec: template: metadata: annotations: - configChecksum: "b6087931f4457971d5fcd17d64491188322ffc2f86e31f943b142c76edb9e67" + configChecksum: "5ce6f593fb92c9a6fd183825231d187471b5f10fe948f601f6d5b56edd02b51" labels: app.kubernetes.io/name: flytescheduler app.kubernetes.io/instance: flyte @@ -1399,7 +1399,7 @@ spec: template: metadata: annotations: - configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" + configChecksum: "e7a065fd96ff8a6564199b17e054fac2da37f402b421e20fbe2160fc43f11cc" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -1481,7 +1481,7 @@ spec: app.kubernetes.io/name: flyte-pod-webhook app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "e7d99d3cce2e4e6d410d7c61f8c05bbb6b5dc901f5e9a199849438d31d5e467" + configChecksum: "e7a065fd96ff8a6564199b17e054fac2da37f402b421e20fbe2160fc43f11cc" spec: securityContext: fsGroup: 65534 diff --git a/deployment/gcp/flyte_helm_controlplane_generated.yaml b/deployment/gcp/flyte_helm_controlplane_generated.yaml index 68fb7acb6b..56ed910d63 100644 --- a/deployment/gcp/flyte_helm_controlplane_generated.yaml +++ b/deployment/gcp/flyte_helm_controlplane_generated.yaml @@ -569,7 +569,7 @@ spec: template: metadata: annotations: - configChecksum: "b35a14d8bfd46ac863acf50bc4f338954b2f1315b66dc1fc17123885cc4dc37" + configChecksum: "0705f122f2535babec96a6083827c3e6d27e6e9b0e460b4d07292c858079ac7" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -989,7 +989,7 @@ spec: template: metadata: annotations: - configChecksum: "b35a14d8bfd46ac863acf50bc4f338954b2f1315b66dc1fc17123885cc4dc37" + configChecksum: "0705f122f2535babec96a6083827c3e6d27e6e9b0e460b4d07292c858079ac7" labels: app.kubernetes.io/name: flytescheduler app.kubernetes.io/instance: flyte diff --git a/deployment/gcp/flyte_helm_dataplane_generated.yaml b/deployment/gcp/flyte_helm_dataplane_generated.yaml index 4048f53c17..ab1be7e891 100644 --- a/deployment/gcp/flyte_helm_dataplane_generated.yaml +++ b/deployment/gcp/flyte_helm_dataplane_generated.yaml @@ -436,7 +436,7 @@ spec: template: metadata: annotations: - configChecksum: "8a15e3074047b226537f0c506efa34aa2459b94274bbd3073f597126f81a59a" + configChecksum: "ddc04c6de49a20c7b297c49103fb428ea5c5f46124331c2546848ac1e2d4bf1" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -517,7 +517,7 @@ spec: app.kubernetes.io/name: flyte-pod-webhook app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "8a15e3074047b226537f0c506efa34aa2459b94274bbd3073f597126f81a59a" + configChecksum: "ddc04c6de49a20c7b297c49103fb428ea5c5f46124331c2546848ac1e2d4bf1" spec: securityContext: fsGroup: 65534 diff --git a/deployment/gcp/flyte_helm_generated.yaml b/deployment/gcp/flyte_helm_generated.yaml index a5a028f15c..ff869a8322 100644 --- a/deployment/gcp/flyte_helm_generated.yaml +++ b/deployment/gcp/flyte_helm_generated.yaml @@ -903,7 +903,7 @@ spec: template: metadata: annotations: - configChecksum: "b35a14d8bfd46ac863acf50bc4f338954b2f1315b66dc1fc17123885cc4dc37" + configChecksum: "0705f122f2535babec96a6083827c3e6d27e6e9b0e460b4d07292c858079ac7" labels: app.kubernetes.io/name: flyteadmin app.kubernetes.io/instance: flyte @@ -1323,7 +1323,7 @@ spec: template: metadata: annotations: - configChecksum: "b35a14d8bfd46ac863acf50bc4f338954b2f1315b66dc1fc17123885cc4dc37" + configChecksum: "0705f122f2535babec96a6083827c3e6d27e6e9b0e460b4d07292c858079ac7" labels: app.kubernetes.io/name: flytescheduler app.kubernetes.io/instance: flyte @@ -1422,7 +1422,7 @@ spec: template: metadata: annotations: - configChecksum: "8a15e3074047b226537f0c506efa34aa2459b94274bbd3073f597126f81a59a" + configChecksum: "ddc04c6de49a20c7b297c49103fb428ea5c5f46124331c2546848ac1e2d4bf1" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -1503,7 +1503,7 @@ spec: app.kubernetes.io/name: flyte-pod-webhook app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "8a15e3074047b226537f0c506efa34aa2459b94274bbd3073f597126f81a59a" + configChecksum: "ddc04c6de49a20c7b297c49103fb428ea5c5f46124331c2546848ac1e2d4bf1" spec: securityContext: fsGroup: 65534 diff --git a/docker/sandbox-bundled/bootstrap/go.mod b/docker/sandbox-bundled/bootstrap/go.mod index a79f930b5e..994ee7cb97 100644 --- a/docker/sandbox-bundled/bootstrap/go.mod +++ b/docker/sandbox-bundled/bootstrap/go.mod @@ -38,9 +38,9 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/xlab/treeprint v1.1.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/docker/sandbox-bundled/bootstrap/go.sum b/docker/sandbox-bundled/bootstrap/go.sum index cfcb4fa152..4de5ac9839 100644 --- a/docker/sandbox-bundled/bootstrap/go.sum +++ b/docker/sandbox-bundled/bootstrap/go.sum @@ -131,8 +131,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -144,12 +144,12 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/docker/sandbox-bundled/manifests/complete-agent.yaml b/docker/sandbox-bundled/manifests/complete-agent.yaml index a9b42ba661..ad926e6109 100644 --- a/docker/sandbox-bundled/manifests/complete-agent.yaml +++ b/docker/sandbox-bundled/manifests/complete-agent.yaml @@ -816,7 +816,7 @@ type: Opaque --- apiVersion: v1 data: - haSharedSecret: ZjEwSmt1RUY3aDlCdDVsRg== + haSharedSecret: SDRTOVJwQzU0WURYTG1NbQ== proxyPassword: "" proxyUsername: "" kind: Secret @@ -1412,7 +1412,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: d7249c11a963bd048b55d03454927119ba2f4bbf0a6328ded80c2579cf224f1d + checksum/secret: 1d977a1daf6338c6d55444d6c0565a40353efd71d0a8bef422cfc6387b20a39f labels: app: docker-registry release: flyte-sandbox diff --git a/docker/sandbox-bundled/manifests/complete.yaml b/docker/sandbox-bundled/manifests/complete.yaml index 2ad06dca80..13dc038d3f 100644 --- a/docker/sandbox-bundled/manifests/complete.yaml +++ b/docker/sandbox-bundled/manifests/complete.yaml @@ -796,7 +796,7 @@ type: Opaque --- apiVersion: v1 data: - haSharedSecret: aWRqOTR0QTVZRE1CaGVRdw== + haSharedSecret: MGs1QlJSY2VKM3I0cEQ2bw== proxyPassword: "" proxyUsername: "" kind: Secret @@ -1360,7 +1360,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: 863f8bfa183a5195d769b933f0d975109a0d5f407710e22937545b2b118e6917 + checksum/secret: d2a40d222d6f4b81e6186400d7fc9818c90e07068ccc2569cfdb212ad7782e98 labels: app: docker-registry release: flyte-sandbox diff --git a/docker/sandbox-bundled/manifests/dev.yaml b/docker/sandbox-bundled/manifests/dev.yaml index 57001b01f3..c258d27b9c 100644 --- a/docker/sandbox-bundled/manifests/dev.yaml +++ b/docker/sandbox-bundled/manifests/dev.yaml @@ -499,7 +499,7 @@ metadata: --- apiVersion: v1 data: - haSharedSecret: Z0xGR25hRVd6TlZoOERxZA== + haSharedSecret: SVFrS2JhOWVndXFEYlE3WA== proxyPassword: "" proxyUsername: "" kind: Secret @@ -934,7 +934,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: 6c870dc393e0c203d57b719e52c73856e98c35788dd05e75b2d00194cb4392f2 + checksum/secret: b5ff29721af068e75a80eff30c7402def61a64a87c73e8e716d5d06cf05c4bd8 labels: app: docker-registry release: flyte-sandbox From 30d0bf5f33f66d5caf390d85e29ed5357f2756cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 23:40:04 +0000 Subject: [PATCH 392/645] Bump google.golang.org/protobuf from 1.30.0 to 1.33.0 in /boilerplate/flyte/golang_support_tools (#5147) * Bump google.golang.org/protobuf Bumps google.golang.org/protobuf from 1.30.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump github.com/golang/protobuf to 1.5.4 Signed-off-by: Eduardo Apolinario --------- Signed-off-by: dependabot[bot] Signed-off-by: Eduardo Apolinario Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eduardo Apolinario --- boilerplate/flyte/golang_support_tools/go.mod | 4 ++-- boilerplate/flyte/golang_support_tools/go.sum | 6 ++++-- go.mod | 2 +- go.sum | 2 ++ 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/boilerplate/flyte/golang_support_tools/go.mod b/boilerplate/flyte/golang_support_tools/go.mod index c157497a57..125151d090 100644 --- a/boilerplate/flyte/golang_support_tools/go.mod +++ b/boilerplate/flyte/golang_support_tools/go.mod @@ -92,7 +92,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect @@ -250,7 +250,7 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/grpc v1.62.1 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/boilerplate/flyte/golang_support_tools/go.sum b/boilerplate/flyte/golang_support_tools/go.sum index ae52773e15..e4c6cebc56 100644 --- a/boilerplate/flyte/golang_support_tools/go.sum +++ b/boilerplate/flyte/golang_support_tools/go.sum @@ -297,6 +297,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= @@ -1147,8 +1149,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/go.mod b/go.mod index 6fd9002830..aa695cefd6 100644 --- a/go.mod +++ b/go.mod @@ -84,7 +84,7 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect diff --git a/go.sum b/go.sum index d6bda49ce4..8ab41e21a7 100644 --- a/go.sum +++ b/go.sum @@ -681,6 +681,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= From dc1294e12a9401d29eda1df249bf4ff80f4796e8 Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Tue, 2 Apr 2024 18:50:52 -0700 Subject: [PATCH 393/645] Upgrade lestrrat-go/jwx to v1.2.29 (#5141) --- datacatalog/go.mod | 4 ++-- datacatalog/go.sum | 7 ++++--- flyteadmin/go.mod | 19 +++++++++--------- flyteadmin/go.sum | 46 +++++++++++++++++++++---------------------- flytecopilot/go.mod | 2 +- flytecopilot/go.sum | 7 ++++--- flyteidl/go.mod | 4 ++-- flyteidl/go.sum | 7 ++++--- flyteplugins/go.mod | 4 ++-- flyteplugins/go.sum | 7 ++++--- flytepropeller/go.mod | 4 ++-- flytepropeller/go.sum | 7 ++++--- flytestdlib/go.mod | 4 ++-- flytestdlib/go.sum | 7 ++++--- go.mod | 19 +++++++++--------- go.sum | 46 +++++++++++++++++++++---------------------- 16 files changed, 99 insertions(+), 95 deletions(-) diff --git a/datacatalog/go.mod b/datacatalog/go.mod index 80cd3e05df..631356a8cf 100644 --- a/datacatalog/go.mod +++ b/datacatalog/go.mod @@ -13,7 +13,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 go.opentelemetry.io/otel v1.21.0 google.golang.org/grpc v1.62.1 @@ -102,7 +102,7 @@ require ( github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.11.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect diff --git a/datacatalog/go.sum b/datacatalog/go.sum index f3229e65d7..8d2896cb85 100644 --- a/datacatalog/go.sum +++ b/datacatalog/go.sum @@ -404,8 +404,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -414,8 +415,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index e6b07e0e23..50077b3efb 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -34,7 +34,7 @@ require ( github.com/gtank/cryptopasta v0.0.0-20170601214702-1f550f6f2f69 github.com/jackc/pgconn v1.14.1 github.com/jackc/pgx/v5 v5.4.3 - github.com/lestrrat-go/jwx v1.1.6 + github.com/lestrrat-go/jwx v1.2.29 github.com/magiconair/properties v1.8.6 github.com/mitchellh/mapstructure v1.5.0 github.com/ory/fosite v0.42.2 @@ -46,7 +46,7 @@ require ( github.com/sendgrid/sendgrid-go v3.10.0+incompatible github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/wI2L/jsondiff v0.5.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 go.opentelemetry.io/otel v1.21.0 @@ -87,7 +87,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coocood/freecache v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/dgraph-io/ristretto v0.0.3 // indirect github.com/eapache/go-resiliency v1.2.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect @@ -105,7 +105,7 @@ require ( github.com/go-openapi/swag v0.22.3 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/go-test/deep v1.0.7 // indirect - github.com/goccy/go-json v0.4.8 // indirect + github.com/goccy/go-json v0.10.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -134,10 +134,11 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/klauspost/compress v1.9.8 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/lestrrat-go/backoff/v2 v2.0.7 // indirect - github.com/lestrrat-go/httpcc v1.0.0 // indirect - github.com/lestrrat-go/iter v1.0.1 // indirect - github.com/lestrrat-go/option v1.0.0 // indirect + github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect + github.com/lestrrat-go/blackmagic v1.0.2 // indirect + github.com/lestrrat-go/httpcc v1.0.1 // indirect + github.com/lestrrat-go/iter v1.0.2 // indirect + github.com/lestrrat-go/option v1.0.1 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.16 // indirect @@ -166,7 +167,7 @@ require ( github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.11.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/tidwall/gjson v1.17.0 // indirect github.com/tidwall/match v1.1.1 // indirect diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index ce5d7880b1..e61ac62c5e 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -182,10 +182,9 @@ github.com/cucumber/godog v0.8.1/go.mod h1:vSh3r/lM+psC1BPXvdkSEuNjmXfpVqrMGYAEl github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/chaincfg/chainhash v1.0.2/go.mod h1:BpbrGgrPTr3YJYRN3Bm+D9NuaFd+zGyNeIKgrhCXK60= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0 h1:sgNeV1VRMDzs6rzyPpxyM0jp317hnwiq58Filgag2xw= -github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0/go.mod h1:J70FGZSbzsjecRTiTzER+3f1KZLNaXkuv+yeFTKoxM8= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= @@ -598,8 +597,8 @@ github.com/gobuffalo/validate/v3 v3.1.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwy github.com/gobuffalo/validate/v3 v3.2.0/go.mod h1:PrhDOdDHxtN8KUgMvF3TDL0r1YZXV4sQnyFX/EmeETY= github.com/gobuffalo/x v0.0.0-20181003152136-452098b06085/go.mod h1:WevpGD+5YOreDJznWevcn8NTmQEW5STSBgIkpkjzqXc= github.com/gobuffalo/x v0.0.0-20181007152206-913e47c59ca7/go.mod h1:9rDPXaB3kXdKWzMc4odGQQdG2e2DIEmANy5aSJ9yesY= -github.com/goccy/go-json v0.4.8 h1:TfwOxfSp8hXH+ivoOk36RyDNmXATUETRdaNWDaZglf8= -github.com/goccy/go-json v0.4.8/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofrs/uuid v3.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid/v3 v3.1.2/go.mod h1:xPwMqoocQ1L5G6pXX5BcE7N5jlzn2o19oqAKxwZW/kI= @@ -902,20 +901,19 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lestrrat-go/backoff/v2 v2.0.7 h1:i2SeK33aOFJlUNJZzf2IpXRBvqBBnaGXfY5Xaop/GsE= -github.com/lestrrat-go/backoff/v2 v2.0.7/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/codegen v1.0.0/go.mod h1:JhJw6OQAuPEfVKUCLItpaVLumDGWQznd1VaXrBk9TdM= -github.com/lestrrat-go/httpcc v1.0.0 h1:FszVC6cKfDvBKcJv646+lkh4GydQg2Z29scgUfkOpYc= -github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++0Gf8MBnAvE= -github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= -github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/jwx v1.1.6 h1:VfyUo2PAU4lO/liwhdwiSZ55/QZDLTT3EYY5z9KfwZs= -github.com/lestrrat-go/jwx v1.1.6/go.mod h1:c+R8G7qsaFNmTzYjU98A+sMh8Bo/MJqO9GnpqR+X024= -github.com/lestrrat-go/option v0.0.0-20210103042652-6f1ecfceda35/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k= +github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx v1.2.29 h1:QT0utmUJ4/12rmsVQrJ3u55bycPkKqGYuGT4tyRhxSQ= +github.com/lestrrat-go/jwx v1.2.29/go.mod h1:hU8k2l6WF0ncx20uQdOmik/Gjg6E3/wIRtXSNFeZuB8= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lestrrat-go/pdebug/v3 v3.0.1 h1:3G5sX/aw/TbMTtVc9U7IHBWRZtMvwvBziF1e4HoQtv8= -github.com/lestrrat-go/pdebug/v3 v3.0.1/go.mod h1:za+m+Ve24yCxTEhR59N7UlnJomWwCiIqbJRmKeiADU4= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -1250,8 +1248,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1261,8 +1260,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.1.1/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -1413,7 +1413,6 @@ golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20201217014255-9d1352758620/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1528,6 +1527,7 @@ golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1767,14 +1767,12 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/flytecopilot/go.mod b/flytecopilot/go.mod index 5caf82b026..66218cb101 100644 --- a/flytecopilot/go.mod +++ b/flytecopilot/go.mod @@ -13,7 +13,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 k8s.io/api v0.28.2 k8s.io/apimachinery v0.28.2 k8s.io/client-go v0.28.1 diff --git a/flytecopilot/go.sum b/flytecopilot/go.sum index e0333902d0..11036d9cf5 100644 --- a/flytecopilot/go.sum +++ b/flytecopilot/go.sum @@ -327,8 +327,9 @@ github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -337,8 +338,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= diff --git a/flyteidl/go.mod b/flyteidl/go.mod index e776c2e6d2..bfb844126c 100644 --- a/flyteidl/go.mod +++ b/flyteidl/go.mod @@ -16,7 +16,7 @@ require ( github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 github.com/pkg/errors v0.9.1 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 golang.org/x/net v0.22.0 golang.org/x/oauth2 v0.16.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 @@ -83,7 +83,7 @@ require ( github.com/prometheus/procfs v0.10.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/cobra v1.7.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect diff --git a/flyteidl/go.sum b/flyteidl/go.sum index fce3280f30..0a59265b69 100644 --- a/flyteidl/go.sum +++ b/flyteidl/go.sum @@ -322,8 +322,9 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -332,8 +333,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= diff --git a/flyteplugins/go.mod b/flyteplugins/go.mod index b080a5f001..6e5ae9670a 100644 --- a/flyteplugins/go.mod +++ b/flyteplugins/go.mod @@ -24,7 +24,7 @@ require ( github.com/prometheus/client_golang v1.16.0 github.com/ray-project/kuberay/ray-operator v1.1.0-rc.1 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 golang.org/x/net v0.22.0 golang.org/x/oauth2 v0.16.0 @@ -112,7 +112,7 @@ require ( github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.11.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect diff --git a/flyteplugins/go.sum b/flyteplugins/go.sum index c8d1f7775c..94e1da46e8 100644 --- a/flyteplugins/go.sum +++ b/flyteplugins/go.sum @@ -373,8 +373,9 @@ github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -383,8 +384,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= diff --git a/flytepropeller/go.mod b/flytepropeller/go.mod index c8458faa6e..48a4571e7b 100644 --- a/flytepropeller/go.mod +++ b/flytepropeller/go.mod @@ -24,7 +24,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 go.opentelemetry.io/otel v1.21.0 go.opentelemetry.io/otel/trace v1.21.0 @@ -120,7 +120,7 @@ require ( github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.11.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect diff --git a/flytepropeller/go.sum b/flytepropeller/go.sum index 6174625603..3eeb7a0241 100644 --- a/flytepropeller/go.sum +++ b/flytepropeller/go.sum @@ -406,8 +406,9 @@ github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUs github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -416,8 +417,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= diff --git a/flytestdlib/go.mod b/flytestdlib/go.mod index 88a71e485f..7ab9d06f5b 100644 --- a/flytestdlib/go.mod +++ b/flytestdlib/go.mod @@ -26,7 +26,7 @@ require ( github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.11.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 go.opentelemetry.io/otel v1.21.0 go.opentelemetry.io/otel/exporters/jaeger v1.17.0 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 @@ -113,7 +113,7 @@ require ( github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect diff --git a/flytestdlib/go.sum b/flytestdlib/go.sum index 77bdba56c8..e7ccf5d3ef 100644 --- a/flytestdlib/go.sum +++ b/flytestdlib/go.sum @@ -406,8 +406,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -416,8 +417,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= diff --git a/go.mod b/go.mod index aa695cefd6..d48d1196f7 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( github.com/coreos/go-oidc/v3 v3.6.0 // indirect github.com/dask/dask-kubernetes/v2023 v2023.0.0-20230626103304-abd02cd17b26 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/dgraph-io/ristretto v0.0.3 // indirect github.com/eapache/go-resiliency v1.2.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect @@ -78,7 +78,7 @@ require ( github.com/go-openapi/swag v0.22.3 // indirect github.com/go-redis/redis v6.15.7+incompatible // indirect github.com/go-test/deep v1.0.7 // indirect - github.com/goccy/go-json v0.4.8 // indirect + github.com/goccy/go-json v0.10.2 // indirect github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect @@ -123,11 +123,12 @@ require ( github.com/kubeflow/common v0.4.3 // indirect github.com/kubeflow/training-operator v1.5.0-rc.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/lestrrat-go/backoff/v2 v2.0.7 // indirect - github.com/lestrrat-go/httpcc v1.0.0 // indirect - github.com/lestrrat-go/iter v1.0.1 // indirect - github.com/lestrrat-go/jwx v1.1.6 // indirect - github.com/lestrrat-go/option v1.0.0 // indirect + github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect + github.com/lestrrat-go/blackmagic v1.0.2 // indirect + github.com/lestrrat-go/httpcc v1.0.1 // indirect + github.com/lestrrat-go/iter v1.0.2 // indirect + github.com/lestrrat-go/jwx v1.2.29 // indirect + github.com/lestrrat-go/option v1.0.1 // indirect github.com/magiconair/properties v1.8.6 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect @@ -167,8 +168,8 @@ require ( github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.11.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/stretchr/testify v1.8.4 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/testify v1.9.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/tidwall/gjson v1.17.0 // indirect github.com/tidwall/match v1.1.1 // indirect diff --git a/go.sum b/go.sum index 8ab41e21a7..4704ec2bac 100644 --- a/go.sum +++ b/go.sum @@ -205,10 +205,9 @@ github.com/dask/dask-kubernetes/v2023 v2023.0.0-20230626103304-abd02cd17b26/go.m github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/chaincfg/chainhash v1.0.2/go.mod h1:BpbrGgrPTr3YJYRN3Bm+D9NuaFd+zGyNeIKgrhCXK60= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0 h1:sgNeV1VRMDzs6rzyPpxyM0jp317hnwiq58Filgag2xw= -github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0/go.mod h1:J70FGZSbzsjecRTiTzER+3f1KZLNaXkuv+yeFTKoxM8= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= @@ -622,8 +621,8 @@ github.com/gobuffalo/validate/v3 v3.1.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwy github.com/gobuffalo/validate/v3 v3.2.0/go.mod h1:PrhDOdDHxtN8KUgMvF3TDL0r1YZXV4sQnyFX/EmeETY= github.com/gobuffalo/x v0.0.0-20181003152136-452098b06085/go.mod h1:WevpGD+5YOreDJznWevcn8NTmQEW5STSBgIkpkjzqXc= github.com/gobuffalo/x v0.0.0-20181007152206-913e47c59ca7/go.mod h1:9rDPXaB3kXdKWzMc4odGQQdG2e2DIEmANy5aSJ9yesY= -github.com/goccy/go-json v0.4.8 h1:TfwOxfSp8hXH+ivoOk36RyDNmXATUETRdaNWDaZglf8= -github.com/goccy/go-json v0.4.8/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofrs/uuid v3.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= @@ -933,20 +932,19 @@ github.com/kubeflow/training-operator v1.5.0-rc.0 h1:MaxbG80SYpIbDG63tSiwav4OXcz github.com/kubeflow/training-operator v1.5.0-rc.0/go.mod h1:xgcu/ZI/RwKbTvYgzU7ZWFpxbsefSey5We3KmKroALY= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lestrrat-go/backoff/v2 v2.0.7 h1:i2SeK33aOFJlUNJZzf2IpXRBvqBBnaGXfY5Xaop/GsE= -github.com/lestrrat-go/backoff/v2 v2.0.7/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/codegen v1.0.0/go.mod h1:JhJw6OQAuPEfVKUCLItpaVLumDGWQznd1VaXrBk9TdM= -github.com/lestrrat-go/httpcc v1.0.0 h1:FszVC6cKfDvBKcJv646+lkh4GydQg2Z29scgUfkOpYc= -github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++0Gf8MBnAvE= -github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= -github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/jwx v1.1.6 h1:VfyUo2PAU4lO/liwhdwiSZ55/QZDLTT3EYY5z9KfwZs= -github.com/lestrrat-go/jwx v1.1.6/go.mod h1:c+R8G7qsaFNmTzYjU98A+sMh8Bo/MJqO9GnpqR+X024= -github.com/lestrrat-go/option v0.0.0-20210103042652-6f1ecfceda35/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k= +github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx v1.2.29 h1:QT0utmUJ4/12rmsVQrJ3u55bycPkKqGYuGT4tyRhxSQ= +github.com/lestrrat-go/jwx v1.2.29/go.mod h1:hU8k2l6WF0ncx20uQdOmik/Gjg6E3/wIRtXSNFeZuB8= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lestrrat-go/pdebug/v3 v3.0.1 h1:3G5sX/aw/TbMTtVc9U7IHBWRZtMvwvBziF1e4HoQtv8= -github.com/lestrrat-go/pdebug/v3 v3.0.1/go.mod h1:za+m+Ve24yCxTEhR59N7UlnJomWwCiIqbJRmKeiADU4= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -1286,8 +1284,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1297,8 +1296,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.1.1/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -1449,7 +1449,6 @@ golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20201217014255-9d1352758620/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1564,6 +1563,7 @@ golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1803,14 +1803,12 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= From b9dfb0182ab7e9cedeff88b636ead66e8b9b603f Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Wed, 3 Apr 2024 14:15:40 -0700 Subject: [PATCH 394/645] Revert "Pin flyteconsole version in release process (#5037)" (#5176) This reverts commit 68a34159b94ef4c82a5fa1199bbee142d04614e9. Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- script/release.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/script/release.sh b/script/release.sh index faa397ce9b..9816fb6a7c 100755 --- a/script/release.sh +++ b/script/release.sh @@ -3,10 +3,7 @@ set -ex FLYTEKIT_TAG=$(curl --silent "https://api.github.com/repos/flyteorg/flytekit/releases/latest" | jq -r .tag_name | sed 's/^v//') -# The flyteconsole revamp is not released yet (we need "schedules" to be present before we can release it). In the meantime -# we are using the latest release (v1.10.3) as the tag for flyteconsole. -# FLYTECONSOLE_TAG=$(curl --silent "https://api.github.com/repos/flyteorg/flyteconsole/releases/latest" | jq -r .tag_name) -FLYTECONSOLE_TAG=v1.10.3 +FLYTECONSOLE_TAG=$(curl --silent "https://api.github.com/repos/flyteorg/flyteconsole/releases/latest" | jq -r .tag_name) # bump latest release of flyte component in helm sed -i "s,tag:[^P]*# FLYTEADMIN_TAG,tag: ${VERSION} # FLYTEADMIN_TAG," ./charts/flyte/values.yaml From 94f4343ae632072ea7c15463bf4647311aa56310 Mon Sep 17 00:00:00 2001 From: Noah Jackson Date: Wed, 3 Apr 2024 15:36:22 -0700 Subject: [PATCH 395/645] Add identity to task execution metadata (#5105) Signed-off-by: noahjax --- flyteidl/gen/pb-es/flyteidl/admin/agent_pb.ts | 13 +- flyteidl/gen/pb-go/flyteidl/admin/agent.pb.go | 635 +++++++++--------- .../flyteidl/service/agent.swagger.json | 9 +- flyteidl/gen/pb-js/flyteidl.d.ts | 6 + flyteidl/gen/pb-js/flyteidl.js | 19 + .../gen/pb_python/flyteidl/admin/agent_pb2.py | 115 ++-- .../pb_python/flyteidl/admin/agent_pb2.pyi | 7 +- flyteidl/gen/pb_rust/flyteidl.admin.rs | 6 +- flyteidl/protos/flyteidl/admin/agent.proto | 4 + .../plugins/webapi/agent/integration_test.go | 3 + .../go/tasks/plugins/webapi/agent/plugin.go | 2 + 11 files changed, 444 insertions(+), 375 deletions(-) diff --git a/flyteidl/gen/pb-es/flyteidl/admin/agent_pb.ts b/flyteidl/gen/pb-es/flyteidl/admin/agent_pb.ts index deb3601202..f9f6c37564 100644 --- a/flyteidl/gen/pb-es/flyteidl/admin/agent_pb.ts +++ b/flyteidl/gen/pb-es/flyteidl/admin/agent_pb.ts @@ -7,6 +7,7 @@ import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialM import { Duration, Message, proto3, protoInt64, Struct, Timestamp } from "@bufbuild/protobuf"; import { TaskExecutionIdentifier } from "../core/identifier_pb.js"; import { TaskNodeOverrides } from "../core/workflow_pb.js"; +import { Identity } from "../core/security_pb.js"; import { LiteralMap } from "../core/literals_pb.js"; import { TaskTemplate } from "../core/tasks_pb.js"; import { TaskExecution_Phase, TaskLog } from "../core/execution_pb.js"; @@ -56,12 +57,12 @@ proto3.util.setEnumType(State, "flyteidl.admin.State", [ /** * Represents a subset of runtime task execution metadata that are relevant to external plugins. * + * ID of the task execution + * * @generated from message flyteidl.admin.TaskExecutionMetadata */ export class TaskExecutionMetadata extends Message { /** - * ID of the task execution - * * @generated from field: flyteidl.core.TaskExecutionIdentifier task_execution_id = 1; */ taskExecutionId?: TaskExecutionIdentifier; @@ -134,6 +135,13 @@ export class TaskExecutionMetadata extends Message { */ overrides?: TaskNodeOverrides; + /** + * Identity of user running this task execution + * + * @generated from field: flyteidl.core.Identity identity = 11; + */ + identity?: Identity; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -152,6 +160,7 @@ export class TaskExecutionMetadata extends Message { { no: 8, name: "interruptible", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, { no: 9, name: "interruptible_failure_threshold", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, { no: 10, name: "overrides", kind: "message", T: TaskNodeOverrides }, + { no: 11, name: "identity", kind: "message", T: Identity }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): TaskExecutionMetadata { diff --git a/flyteidl/gen/pb-go/flyteidl/admin/agent.pb.go b/flyteidl/gen/pb-go/flyteidl/admin/agent.pb.go index 01aee40e95..653fce6266 100644 --- a/flyteidl/gen/pb-go/flyteidl/admin/agent.pb.go +++ b/flyteidl/gen/pb-go/flyteidl/admin/agent.pb.go @@ -88,7 +88,6 @@ type TaskExecutionMetadata struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // ID of the task execution TaskExecutionId *core.TaskExecutionIdentifier `protobuf:"bytes,1,opt,name=task_execution_id,json=taskExecutionId,proto3" json:"task_execution_id,omitempty"` // k8s namespace where the task is executed in Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` @@ -113,6 +112,8 @@ type TaskExecutionMetadata struct { // Overrides for specific properties of the task node. // These overrides can be used to customize the behavior of the task node. Overrides *core.TaskNodeOverrides `protobuf:"bytes,10,opt,name=overrides,proto3" json:"overrides,omitempty"` + // Identity of user running this task execution + Identity *core.Identity `protobuf:"bytes,11,opt,name=identity,proto3" json:"identity,omitempty"` } func (x *TaskExecutionMetadata) Reset() { @@ -217,6 +218,13 @@ func (x *TaskExecutionMetadata) GetOverrides() *core.TaskNodeOverrides { return nil } +func (x *TaskExecutionMetadata) GetIdentity() *core.Identity { + if x != nil { + return x.Identity + } + return nil +} + // Represents a request structure to create task. type CreateTaskRequest struct { state protoimpl.MessageState @@ -1721,278 +1729,283 @@ var file_flyteidl_admin_agent_proto_rawDesc = []byte{ 0x72, 0x65, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe9, - 0x06, 0x0a, 0x15, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x11, 0x74, 0x61, 0x73, 0x6b, - 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0f, 0x74, 0x61, 0x73, - 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x66, 0x6c, 0x79, - 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x58, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x66, 0x6c, 0x79, - 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x2e, 0x0a, 0x13, 0x6b, 0x38, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6b, 0x38, - 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x74, 0x0a, 0x15, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, - 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, - 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x46, - 0x0a, 0x1f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x5f, - 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, - 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, - 0x64, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x66, 0x6c, 0x79, 0x74, - 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x4e, 0x6f, - 0x64, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x52, 0x09, 0x6f, 0x76, 0x65, - 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x47, 0x0a, 0x19, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x83, 0x02, 0x0a, 0x11, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x31, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x52, 0x06, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x12, 0x5d, 0x0a, 0x17, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x15, 0x74, 0x61, 0x73, 0x6b, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x39, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x87, 0x02, 0x0a, 0x13, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x12, 0x5d, 0x0a, 0x17, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x15, 0x74, 0x61, 0x73, 0x6b, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x33, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x13, 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3d, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x33, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x48, 0x00, 0x52, 0x06, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x70, 0x61, 0x72, 0x74, 0x22, 0x55, 0x0a, 0x1d, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x34, 0x0a, - 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x17, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x54, - 0x61, 0x73, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x47, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x79, 0x6e, 0x63, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, - 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, - 0x6c, 0x4d, 0x61, 0x70, 0x48, 0x00, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x42, - 0x05, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x09, 0x74, 0x61, 0x73, - 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, - 0x41, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, - 0x67, 0x6f, 0x72, 0x79, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, - 0x72, 0x79, 0x22, 0x47, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, - 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xb3, 0x02, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, - 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, - 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, - 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x6c, - 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x4c, 0x6f, 0x67, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x38, 0x0a, - 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x66, - 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x68, 0x61, 0x73, 0x65, - 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x49, 0x6e, 0x66, - 0x6f, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, - 0x74, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x41, 0x0a, - 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, - 0x72, 0x79, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, - 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x14, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x64, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x12, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x64, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, - 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x53, - 0x79, 0x6e, 0x63, 0x12, 0x58, 0x0a, 0x19, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, - 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, - 0x67, 0x6f, 0x72, 0x79, 0x52, 0x17, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, - 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x3c, 0x0a, - 0x0c, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x25, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x3f, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x43, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, - 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xdb, 0x02, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, - 0x74, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x18, 0x0a, - 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x73, 0x74, 0x65, - 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, 0x12, 0x41, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, - 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x0c, 0x74, - 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0x58, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, - 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x09, + 0x1c, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x73, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9e, 0x07, 0x0a, + 0x15, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x11, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0f, 0x74, 0x61, 0x73, 0x6b, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x12, 0x58, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, + 0x13, 0x6b, 0x38, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6b, 0x38, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x74, 0x0a, + 0x15, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x66, + 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, + 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x46, 0x0a, 0x1f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x69, 0x62, 0x6c, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x4e, 0x6f, 0x64, 0x65, + 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, + 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, + 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x47, 0x0a, 0x19, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x83, 0x02, + 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x52, 0x06, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x12, 0x5d, 0x0a, 0x17, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x15, 0x74, 0x61, + 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x39, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x87, + 0x02, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x12, 0x5d, 0x0a, 0x17, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x15, 0x74, 0x61, + 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x73, + 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x53, + 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x33, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x48, 0x00, 0x52, + 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x70, 0x61, 0x72, 0x74, 0x22, + 0x55, 0x0a, 0x1d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x79, + 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x12, 0x34, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x17, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, + 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x07, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, + 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x48, 0x00, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x73, 0x42, 0x05, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x41, - 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, - 0x6f, 0x72, 0x79, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x22, 0x31, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x33, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4c, - 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x12, - 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x43, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, + 0x74, 0x61, 0x12, 0x41, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, + 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0x47, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x6c, 0x79, + 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xb3, + 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x66, 0x6c, 0x79, + 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x07, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, + 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x6b, 0x73, + 0x12, 0x38, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x22, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x68, + 0x61, 0x73, 0x65, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x09, 0x74, 0x61, + 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, + 0x01, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x41, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x05, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x14, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x12, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x17, 0x0a, + 0x07, 0x69, 0x73, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x69, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x58, 0x0a, 0x19, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, + 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x17, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, + 0x22, 0x3c, 0x0a, 0x0c, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x25, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3f, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x43, 0x0a, 0x12, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0xdb, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x09, 0x74, 0x61, + 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, + 0x01, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, + 0x73, 0x74, 0x65, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, 0x12, 0x41, 0x0a, 0x0d, 0x74, + 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0x58, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x66, 0x6c, 0x79, 0x74, + 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1f, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x41, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x22, 0x31, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4c, + 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x33, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x6f, + 0x64, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xa1, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x6f, 0x67, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x48, 0x00, 0x52, - 0x04, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x70, 0x61, 0x72, 0x74, 0x2a, 0x62, 0x0a, - 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x52, 0x59, 0x41, - 0x42, 0x4c, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x00, 0x12, 0x15, 0x0a, - 0x11, 0x50, 0x45, 0x52, 0x4d, 0x41, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, - 0x52, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, - 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0d, - 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x04, 0x1a, 0x02, 0x18, - 0x01, 0x42, 0xb6, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, - 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x42, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x6f, 0x72, 0x67, 0x2f, 0x66, 0x6c, 0x79, 0x74, - 0x65, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, - 0x62, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0xa2, 0x02, 0x03, 0x46, 0x41, 0x58, 0xaa, 0x02, 0x0e, 0x46, 0x6c, 0x79, 0x74, - 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0xca, 0x02, 0x0e, 0x46, 0x6c, 0x79, - 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0xe2, 0x02, 0x1a, 0x46, 0x6c, - 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x46, 0x6c, 0x79, 0x74, 0x65, - 0x69, 0x64, 0x6c, 0x3a, 0x3a, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, + 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x04, 0x62, 0x6f, 0x64, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x6f, 0x64, 0x79, + 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x70, 0x61, 0x72, 0x74, + 0x2a, 0x62, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, + 0x52, 0x59, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x00, + 0x12, 0x15, 0x0a, 0x11, 0x50, 0x45, 0x52, 0x4d, 0x41, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x04, + 0x1a, 0x02, 0x18, 0x01, 0x42, 0xb6, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x6c, 0x79, + 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x42, 0x0a, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x6f, 0x72, 0x67, 0x2f, 0x66, + 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, + 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0xa2, 0x02, 0x03, 0x46, 0x41, 0x58, 0xaa, 0x02, 0x0e, 0x46, + 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0xca, 0x02, 0x0e, + 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0xe2, 0x02, + 0x1a, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x46, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x3a, 0x3a, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2040,14 +2053,15 @@ var file_flyteidl_admin_agent_proto_goTypes = []interface{}{ nil, // 27: flyteidl.admin.TaskExecutionMetadata.EnvironmentVariablesEntry (*core.TaskExecutionIdentifier)(nil), // 28: flyteidl.core.TaskExecutionIdentifier (*core.TaskNodeOverrides)(nil), // 29: flyteidl.core.TaskNodeOverrides - (*core.LiteralMap)(nil), // 30: flyteidl.core.LiteralMap - (*core.TaskTemplate)(nil), // 31: flyteidl.core.TaskTemplate - (*core.TaskLog)(nil), // 32: flyteidl.core.TaskLog - (core.TaskExecution_Phase)(0), // 33: flyteidl.core.TaskExecution.Phase - (*structpb.Struct)(nil), // 34: google.protobuf.Struct - (*timestamppb.Timestamp)(nil), // 35: google.protobuf.Timestamp - (*durationpb.Duration)(nil), // 36: google.protobuf.Duration - (*core.ExecutionMetricResult)(nil), // 37: flyteidl.core.ExecutionMetricResult + (*core.Identity)(nil), // 30: flyteidl.core.Identity + (*core.LiteralMap)(nil), // 31: flyteidl.core.LiteralMap + (*core.TaskTemplate)(nil), // 32: flyteidl.core.TaskTemplate + (*core.TaskLog)(nil), // 33: flyteidl.core.TaskLog + (core.TaskExecution_Phase)(0), // 34: flyteidl.core.TaskExecution.Phase + (*structpb.Struct)(nil), // 35: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 36: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 37: google.protobuf.Duration + (*core.ExecutionMetricResult)(nil), // 38: flyteidl.core.ExecutionMetricResult } var file_flyteidl_admin_agent_proto_depIdxs = []int32{ 28, // 0: flyteidl.admin.TaskExecutionMetadata.task_execution_id:type_name -> flyteidl.core.TaskExecutionIdentifier @@ -2055,40 +2069,41 @@ var file_flyteidl_admin_agent_proto_depIdxs = []int32{ 26, // 2: flyteidl.admin.TaskExecutionMetadata.annotations:type_name -> flyteidl.admin.TaskExecutionMetadata.AnnotationsEntry 27, // 3: flyteidl.admin.TaskExecutionMetadata.environment_variables:type_name -> flyteidl.admin.TaskExecutionMetadata.EnvironmentVariablesEntry 29, // 4: flyteidl.admin.TaskExecutionMetadata.overrides:type_name -> flyteidl.core.TaskNodeOverrides - 30, // 5: flyteidl.admin.CreateTaskRequest.inputs:type_name -> flyteidl.core.LiteralMap - 31, // 6: flyteidl.admin.CreateTaskRequest.template:type_name -> flyteidl.core.TaskTemplate - 1, // 7: flyteidl.admin.CreateTaskRequest.task_execution_metadata:type_name -> flyteidl.admin.TaskExecutionMetadata - 31, // 8: flyteidl.admin.CreateRequestHeader.template:type_name -> flyteidl.core.TaskTemplate - 1, // 9: flyteidl.admin.CreateRequestHeader.task_execution_metadata:type_name -> flyteidl.admin.TaskExecutionMetadata - 4, // 10: flyteidl.admin.ExecuteTaskSyncRequest.header:type_name -> flyteidl.admin.CreateRequestHeader - 30, // 11: flyteidl.admin.ExecuteTaskSyncRequest.inputs:type_name -> flyteidl.core.LiteralMap - 10, // 12: flyteidl.admin.ExecuteTaskSyncResponseHeader.resource:type_name -> flyteidl.admin.Resource - 6, // 13: flyteidl.admin.ExecuteTaskSyncResponse.header:type_name -> flyteidl.admin.ExecuteTaskSyncResponseHeader - 30, // 14: flyteidl.admin.ExecuteTaskSyncResponse.outputs:type_name -> flyteidl.core.LiteralMap - 14, // 15: flyteidl.admin.GetTaskRequest.task_category:type_name -> flyteidl.admin.TaskCategory - 10, // 16: flyteidl.admin.GetTaskResponse.resource:type_name -> flyteidl.admin.Resource - 0, // 17: flyteidl.admin.Resource.state:type_name -> flyteidl.admin.State - 30, // 18: flyteidl.admin.Resource.outputs:type_name -> flyteidl.core.LiteralMap - 32, // 19: flyteidl.admin.Resource.log_links:type_name -> flyteidl.core.TaskLog - 33, // 20: flyteidl.admin.Resource.phase:type_name -> flyteidl.core.TaskExecution.Phase - 34, // 21: flyteidl.admin.Resource.custom_info:type_name -> google.protobuf.Struct - 14, // 22: flyteidl.admin.DeleteTaskRequest.task_category:type_name -> flyteidl.admin.TaskCategory - 14, // 23: flyteidl.admin.Agent.supported_task_categories:type_name -> flyteidl.admin.TaskCategory - 13, // 24: flyteidl.admin.GetAgentResponse.agent:type_name -> flyteidl.admin.Agent - 13, // 25: flyteidl.admin.ListAgentsResponse.agents:type_name -> flyteidl.admin.Agent - 35, // 26: flyteidl.admin.GetTaskMetricsRequest.start_time:type_name -> google.protobuf.Timestamp - 35, // 27: flyteidl.admin.GetTaskMetricsRequest.end_time:type_name -> google.protobuf.Timestamp - 36, // 28: flyteidl.admin.GetTaskMetricsRequest.step:type_name -> google.protobuf.Duration - 14, // 29: flyteidl.admin.GetTaskMetricsRequest.task_category:type_name -> flyteidl.admin.TaskCategory - 37, // 30: flyteidl.admin.GetTaskMetricsResponse.results:type_name -> flyteidl.core.ExecutionMetricResult - 14, // 31: flyteidl.admin.GetTaskLogsRequest.task_category:type_name -> flyteidl.admin.TaskCategory - 22, // 32: flyteidl.admin.GetTaskLogsResponse.header:type_name -> flyteidl.admin.GetTaskLogsResponseHeader - 23, // 33: flyteidl.admin.GetTaskLogsResponse.body:type_name -> flyteidl.admin.GetTaskLogsResponseBody - 34, // [34:34] is the sub-list for method output_type - 34, // [34:34] is the sub-list for method input_type - 34, // [34:34] is the sub-list for extension type_name - 34, // [34:34] is the sub-list for extension extendee - 0, // [0:34] is the sub-list for field type_name + 30, // 5: flyteidl.admin.TaskExecutionMetadata.identity:type_name -> flyteidl.core.Identity + 31, // 6: flyteidl.admin.CreateTaskRequest.inputs:type_name -> flyteidl.core.LiteralMap + 32, // 7: flyteidl.admin.CreateTaskRequest.template:type_name -> flyteidl.core.TaskTemplate + 1, // 8: flyteidl.admin.CreateTaskRequest.task_execution_metadata:type_name -> flyteidl.admin.TaskExecutionMetadata + 32, // 9: flyteidl.admin.CreateRequestHeader.template:type_name -> flyteidl.core.TaskTemplate + 1, // 10: flyteidl.admin.CreateRequestHeader.task_execution_metadata:type_name -> flyteidl.admin.TaskExecutionMetadata + 4, // 11: flyteidl.admin.ExecuteTaskSyncRequest.header:type_name -> flyteidl.admin.CreateRequestHeader + 31, // 12: flyteidl.admin.ExecuteTaskSyncRequest.inputs:type_name -> flyteidl.core.LiteralMap + 10, // 13: flyteidl.admin.ExecuteTaskSyncResponseHeader.resource:type_name -> flyteidl.admin.Resource + 6, // 14: flyteidl.admin.ExecuteTaskSyncResponse.header:type_name -> flyteidl.admin.ExecuteTaskSyncResponseHeader + 31, // 15: flyteidl.admin.ExecuteTaskSyncResponse.outputs:type_name -> flyteidl.core.LiteralMap + 14, // 16: flyteidl.admin.GetTaskRequest.task_category:type_name -> flyteidl.admin.TaskCategory + 10, // 17: flyteidl.admin.GetTaskResponse.resource:type_name -> flyteidl.admin.Resource + 0, // 18: flyteidl.admin.Resource.state:type_name -> flyteidl.admin.State + 31, // 19: flyteidl.admin.Resource.outputs:type_name -> flyteidl.core.LiteralMap + 33, // 20: flyteidl.admin.Resource.log_links:type_name -> flyteidl.core.TaskLog + 34, // 21: flyteidl.admin.Resource.phase:type_name -> flyteidl.core.TaskExecution.Phase + 35, // 22: flyteidl.admin.Resource.custom_info:type_name -> google.protobuf.Struct + 14, // 23: flyteidl.admin.DeleteTaskRequest.task_category:type_name -> flyteidl.admin.TaskCategory + 14, // 24: flyteidl.admin.Agent.supported_task_categories:type_name -> flyteidl.admin.TaskCategory + 13, // 25: flyteidl.admin.GetAgentResponse.agent:type_name -> flyteidl.admin.Agent + 13, // 26: flyteidl.admin.ListAgentsResponse.agents:type_name -> flyteidl.admin.Agent + 36, // 27: flyteidl.admin.GetTaskMetricsRequest.start_time:type_name -> google.protobuf.Timestamp + 36, // 28: flyteidl.admin.GetTaskMetricsRequest.end_time:type_name -> google.protobuf.Timestamp + 37, // 29: flyteidl.admin.GetTaskMetricsRequest.step:type_name -> google.protobuf.Duration + 14, // 30: flyteidl.admin.GetTaskMetricsRequest.task_category:type_name -> flyteidl.admin.TaskCategory + 38, // 31: flyteidl.admin.GetTaskMetricsResponse.results:type_name -> flyteidl.core.ExecutionMetricResult + 14, // 32: flyteidl.admin.GetTaskLogsRequest.task_category:type_name -> flyteidl.admin.TaskCategory + 22, // 33: flyteidl.admin.GetTaskLogsResponse.header:type_name -> flyteidl.admin.GetTaskLogsResponseHeader + 23, // 34: flyteidl.admin.GetTaskLogsResponse.body:type_name -> flyteidl.admin.GetTaskLogsResponseBody + 35, // [35:35] is the sub-list for method output_type + 35, // [35:35] is the sub-list for method input_type + 35, // [35:35] is the sub-list for extension type_name + 35, // [35:35] is the sub-list for extension extendee + 0, // [0:35] is the sub-list for field type_name } func init() { file_flyteidl_admin_agent_proto_init() } diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json index 9a6175929f..a2d429d019 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json @@ -2023,8 +2023,7 @@ "type": "object", "properties": { "task_execution_id": { - "$ref": "#/definitions/coreTaskExecutionIdentifier", - "title": "ID of the task execution" + "$ref": "#/definitions/coreTaskExecutionIdentifier" }, "namespace": { "type": "string", @@ -2072,9 +2071,13 @@ "overrides": { "$ref": "#/definitions/coreTaskNodeOverrides", "description": "Overrides for specific properties of the task node.\nThese overrides can be used to customize the behavior of the task node." + }, + "identity": { + "$ref": "#/definitions/coreIdentity", + "title": "Identity of user running this task execution" } }, - "description": "Represents a subset of runtime task execution metadata that are relevant to external plugins." + "description": "Represents a subset of runtime task execution metadata that are relevant to external plugins.\n\nID of the task execution" }, "flyteidlcoreEnumType": { "type": "object", diff --git a/flyteidl/gen/pb-js/flyteidl.d.ts b/flyteidl/gen/pb-js/flyteidl.d.ts index 60556e3b43..e61fbc7acb 100644 --- a/flyteidl/gen/pb-js/flyteidl.d.ts +++ b/flyteidl/gen/pb-js/flyteidl.d.ts @@ -9155,6 +9155,9 @@ export namespace flyteidl { /** TaskExecutionMetadata overrides */ overrides?: (flyteidl.core.ITaskNodeOverrides|null); + + /** TaskExecutionMetadata identity */ + identity?: (flyteidl.core.IIdentity|null); } /** Represents a TaskExecutionMetadata. */ @@ -9196,6 +9199,9 @@ export namespace flyteidl { /** TaskExecutionMetadata overrides. */ public overrides?: (flyteidl.core.ITaskNodeOverrides|null); + /** TaskExecutionMetadata identity. */ + public identity?: (flyteidl.core.IIdentity|null); + /** * Creates a new TaskExecutionMetadata instance using the specified properties. * @param [properties] Properties to set diff --git a/flyteidl/gen/pb-js/flyteidl.js b/flyteidl/gen/pb-js/flyteidl.js index 4ec39993c5..0f1ffe6b40 100644 --- a/flyteidl/gen/pb-js/flyteidl.js +++ b/flyteidl/gen/pb-js/flyteidl.js @@ -22387,6 +22387,7 @@ * @property {boolean|null} [interruptible] TaskExecutionMetadata interruptible * @property {number|null} [interruptibleFailureThreshold] TaskExecutionMetadata interruptibleFailureThreshold * @property {flyteidl.core.ITaskNodeOverrides|null} [overrides] TaskExecutionMetadata overrides + * @property {flyteidl.core.IIdentity|null} [identity] TaskExecutionMetadata identity */ /** @@ -22487,6 +22488,14 @@ */ TaskExecutionMetadata.prototype.overrides = null; + /** + * TaskExecutionMetadata identity. + * @member {flyteidl.core.IIdentity|null|undefined} identity + * @memberof flyteidl.admin.TaskExecutionMetadata + * @instance + */ + TaskExecutionMetadata.prototype.identity = null; + /** * Creates a new TaskExecutionMetadata instance using the specified properties. * @function create @@ -22534,6 +22543,8 @@ writer.uint32(/* id 9, wireType 0 =*/72).int32(message.interruptibleFailureThreshold); if (message.overrides != null && message.hasOwnProperty("overrides")) $root.flyteidl.core.TaskNodeOverrides.encode(message.overrides, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); + if (message.identity != null && message.hasOwnProperty("identity")) + $root.flyteidl.core.Identity.encode(message.identity, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); return writer; }; @@ -22600,6 +22611,9 @@ case 10: message.overrides = $root.flyteidl.core.TaskNodeOverrides.decode(reader, reader.uint32()); break; + case 11: + message.identity = $root.flyteidl.core.Identity.decode(reader, reader.uint32()); + break; default: reader.skipType(tag & 7); break; @@ -22668,6 +22682,11 @@ if (error) return "overrides." + error; } + if (message.identity != null && message.hasOwnProperty("identity")) { + var error = $root.flyteidl.core.Identity.verify(message.identity); + if (error) + return "identity." + error; + } return null; }; diff --git a/flyteidl/gen/pb_python/flyteidl/admin/agent_pb2.py b/flyteidl/gen/pb_python/flyteidl/admin/agent_pb2.py index 950a916662..03e181a3e1 100644 --- a/flyteidl/gen/pb_python/flyteidl/admin/agent_pb2.py +++ b/flyteidl/gen/pb_python/flyteidl/admin/agent_pb2.py @@ -17,12 +17,13 @@ from flyteidl.core import identifier_pb2 as flyteidl_dot_core_dot_identifier__pb2 from flyteidl.core import execution_pb2 as flyteidl_dot_core_dot_execution__pb2 from flyteidl.core import metrics_pb2 as flyteidl_dot_core_dot_metrics__pb2 +from flyteidl.core import security_pb2 as flyteidl_dot_core_dot_security__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x66lyteidl/admin/agent.proto\x12\x0e\x66lyteidl.admin\x1a\x1c\x66lyteidl/core/literals.proto\x1a\x19\x66lyteidl/core/tasks.proto\x1a\x1c\x66lyteidl/core/workflow.proto\x1a\x1e\x66lyteidl/core/identifier.proto\x1a\x1d\x66lyteidl/core/execution.proto\x1a\x1b\x66lyteidl/core/metrics.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\xe9\x06\n\x15TaskExecutionMetadata\x12R\n\x11task_execution_id\x18\x01 \x01(\x0b\x32&.flyteidl.core.TaskExecutionIdentifierR\x0ftaskExecutionId\x12\x1c\n\tnamespace\x18\x02 \x01(\tR\tnamespace\x12I\n\x06labels\x18\x03 \x03(\x0b\x32\x31.flyteidl.admin.TaskExecutionMetadata.LabelsEntryR\x06labels\x12X\n\x0b\x61nnotations\x18\x04 \x03(\x0b\x32\x36.flyteidl.admin.TaskExecutionMetadata.AnnotationsEntryR\x0b\x61nnotations\x12.\n\x13k8s_service_account\x18\x05 \x01(\tR\x11k8sServiceAccount\x12t\n\x15\x65nvironment_variables\x18\x06 \x03(\x0b\x32?.flyteidl.admin.TaskExecutionMetadata.EnvironmentVariablesEntryR\x14\x65nvironmentVariables\x12!\n\x0cmax_attempts\x18\x07 \x01(\x05R\x0bmaxAttempts\x12$\n\rinterruptible\x18\x08 \x01(\x08R\rinterruptible\x12\x46\n\x1finterruptible_failure_threshold\x18\t \x01(\x05R\x1dinterruptibleFailureThreshold\x12>\n\toverrides\x18\n \x01(\x0b\x32 .flyteidl.core.TaskNodeOverridesR\toverrides\x1a\x39\n\x0bLabelsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x1a>\n\x10\x41nnotationsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x1aG\n\x19\x45nvironmentVariablesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"\x83\x02\n\x11\x43reateTaskRequest\x12\x31\n\x06inputs\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapR\x06inputs\x12\x37\n\x08template\x18\x02 \x01(\x0b\x32\x1b.flyteidl.core.TaskTemplateR\x08template\x12#\n\routput_prefix\x18\x03 \x01(\tR\x0coutputPrefix\x12]\n\x17task_execution_metadata\x18\x04 \x01(\x0b\x32%.flyteidl.admin.TaskExecutionMetadataR\x15taskExecutionMetadata\"9\n\x12\x43reateTaskResponse\x12#\n\rresource_meta\x18\x01 \x01(\x0cR\x0cresourceMeta\"\x87\x02\n\x13\x43reateRequestHeader\x12\x37\n\x08template\x18\x01 \x01(\x0b\x32\x1b.flyteidl.core.TaskTemplateR\x08template\x12#\n\routput_prefix\x18\x02 \x01(\tR\x0coutputPrefix\x12]\n\x17task_execution_metadata\x18\x03 \x01(\x0b\x32%.flyteidl.admin.TaskExecutionMetadataR\x15taskExecutionMetadata\x12\x33\n\x16max_dataset_size_bytes\x18\x04 \x01(\x03R\x13maxDatasetSizeBytes\"\x94\x01\n\x16\x45xecuteTaskSyncRequest\x12=\n\x06header\x18\x01 \x01(\x0b\x32#.flyteidl.admin.CreateRequestHeaderH\x00R\x06header\x12\x33\n\x06inputs\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapH\x00R\x06inputsB\x06\n\x04part\"U\n\x1d\x45xecuteTaskSyncResponseHeader\x12\x34\n\x08resource\x18\x01 \x01(\x0b\x32\x18.flyteidl.admin.ResourceR\x08resource\"\xa0\x01\n\x17\x45xecuteTaskSyncResponse\x12G\n\x06header\x18\x01 \x01(\x0b\x32-.flyteidl.admin.ExecuteTaskSyncResponseHeaderH\x00R\x06header\x12\x35\n\x07outputs\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapH\x00R\x07outputsB\x05\n\x03res\"\x99\x01\n\x0eGetTaskRequest\x12\x1f\n\ttask_type\x18\x01 \x01(\tB\x02\x18\x01R\x08taskType\x12#\n\rresource_meta\x18\x02 \x01(\x0cR\x0cresourceMeta\x12\x41\n\rtask_category\x18\x03 \x01(\x0b\x32\x1c.flyteidl.admin.TaskCategoryR\x0ctaskCategory\"G\n\x0fGetTaskResponse\x12\x34\n\x08resource\x18\x01 \x01(\x0b\x32\x18.flyteidl.admin.ResourceR\x08resource\"\xb3\x02\n\x08Resource\x12/\n\x05state\x18\x01 \x01(\x0e\x32\x15.flyteidl.admin.StateB\x02\x18\x01R\x05state\x12\x33\n\x07outputs\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapR\x07outputs\x12\x18\n\x07message\x18\x03 \x01(\tR\x07message\x12\x33\n\tlog_links\x18\x04 \x03(\x0b\x32\x16.flyteidl.core.TaskLogR\x08logLinks\x12\x38\n\x05phase\x18\x05 \x01(\x0e\x32\".flyteidl.core.TaskExecution.PhaseR\x05phase\x12\x38\n\x0b\x63ustom_info\x18\x06 \x01(\x0b\x32\x17.google.protobuf.StructR\ncustomInfo\"\x9c\x01\n\x11\x44\x65leteTaskRequest\x12\x1f\n\ttask_type\x18\x01 \x01(\tB\x02\x18\x01R\x08taskType\x12#\n\rresource_meta\x18\x02 \x01(\x0cR\x0cresourceMeta\x12\x41\n\rtask_category\x18\x03 \x01(\x0b\x32\x1c.flyteidl.admin.TaskCategoryR\x0ctaskCategory\"\x14\n\x12\x44\x65leteTaskResponse\"\xc4\x01\n\x05\x41gent\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x34\n\x14supported_task_types\x18\x02 \x03(\tB\x02\x18\x01R\x12supportedTaskTypes\x12\x17\n\x07is_sync\x18\x03 \x01(\x08R\x06isSync\x12X\n\x19supported_task_categories\x18\x04 \x03(\x0b\x32\x1c.flyteidl.admin.TaskCategoryR\x17supportedTaskCategories\"<\n\x0cTaskCategory\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07version\x18\x02 \x01(\x05R\x07version\"%\n\x0fGetAgentRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\"?\n\x10GetAgentResponse\x12+\n\x05\x61gent\x18\x01 \x01(\x0b\x32\x15.flyteidl.admin.AgentR\x05\x61gent\"\x13\n\x11ListAgentsRequest\"C\n\x12ListAgentsResponse\x12-\n\x06\x61gents\x18\x01 \x03(\x0b\x32\x15.flyteidl.admin.AgentR\x06\x61gents\"\xdb\x02\n\x15GetTaskMetricsRequest\x12\x1f\n\ttask_type\x18\x01 \x01(\tB\x02\x18\x01R\x08taskType\x12#\n\rresource_meta\x18\x02 \x01(\x0cR\x0cresourceMeta\x12\x18\n\x07queries\x18\x03 \x03(\tR\x07queries\x12\x39\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartTime\x12\x35\n\x08\x65nd_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x07\x65ndTime\x12-\n\x04step\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationR\x04step\x12\x41\n\rtask_category\x18\x07 \x01(\x0b\x32\x1c.flyteidl.admin.TaskCategoryR\x0ctaskCategory\"X\n\x16GetTaskMetricsResponse\x12>\n\x07results\x18\x01 \x03(\x0b\x32$.flyteidl.core.ExecutionMetricResultR\x07results\"\xc9\x01\n\x12GetTaskLogsRequest\x12\x1f\n\ttask_type\x18\x01 \x01(\tB\x02\x18\x01R\x08taskType\x12#\n\rresource_meta\x18\x02 \x01(\x0cR\x0cresourceMeta\x12\x14\n\x05lines\x18\x03 \x01(\x04R\x05lines\x12\x14\n\x05token\x18\x04 \x01(\tR\x05token\x12\x41\n\rtask_category\x18\x05 \x01(\x0b\x32\x1c.flyteidl.admin.TaskCategoryR\x0ctaskCategory\"1\n\x19GetTaskLogsResponseHeader\x12\x14\n\x05token\x18\x01 \x01(\tR\x05token\"3\n\x17GetTaskLogsResponseBody\x12\x18\n\x07results\x18\x01 \x03(\tR\x07results\"\xa1\x01\n\x13GetTaskLogsResponse\x12\x43\n\x06header\x18\x01 \x01(\x0b\x32).flyteidl.admin.GetTaskLogsResponseHeaderH\x00R\x06header\x12=\n\x04\x62ody\x18\x02 \x01(\x0b\x32\'.flyteidl.admin.GetTaskLogsResponseBodyH\x00R\x04\x62odyB\x06\n\x04part*b\n\x05State\x12\x15\n\x11RETRYABLE_FAILURE\x10\x00\x12\x15\n\x11PERMANENT_FAILURE\x10\x01\x12\x0b\n\x07PENDING\x10\x02\x12\x0b\n\x07RUNNING\x10\x03\x12\r\n\tSUCCEEDED\x10\x04\x1a\x02\x18\x01\x42\xb6\x01\n\x12\x63om.flyteidl.adminB\nAgentProtoP\x01Z;github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin\xa2\x02\x03\x46\x41X\xaa\x02\x0e\x46lyteidl.Admin\xca\x02\x0e\x46lyteidl\\Admin\xe2\x02\x1a\x46lyteidl\\Admin\\GPBMetadata\xea\x02\x0f\x46lyteidl::Adminb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x66lyteidl/admin/agent.proto\x12\x0e\x66lyteidl.admin\x1a\x1c\x66lyteidl/core/literals.proto\x1a\x19\x66lyteidl/core/tasks.proto\x1a\x1c\x66lyteidl/core/workflow.proto\x1a\x1e\x66lyteidl/core/identifier.proto\x1a\x1d\x66lyteidl/core/execution.proto\x1a\x1b\x66lyteidl/core/metrics.proto\x1a\x1c\x66lyteidl/core/security.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x9e\x07\n\x15TaskExecutionMetadata\x12R\n\x11task_execution_id\x18\x01 \x01(\x0b\x32&.flyteidl.core.TaskExecutionIdentifierR\x0ftaskExecutionId\x12\x1c\n\tnamespace\x18\x02 \x01(\tR\tnamespace\x12I\n\x06labels\x18\x03 \x03(\x0b\x32\x31.flyteidl.admin.TaskExecutionMetadata.LabelsEntryR\x06labels\x12X\n\x0b\x61nnotations\x18\x04 \x03(\x0b\x32\x36.flyteidl.admin.TaskExecutionMetadata.AnnotationsEntryR\x0b\x61nnotations\x12.\n\x13k8s_service_account\x18\x05 \x01(\tR\x11k8sServiceAccount\x12t\n\x15\x65nvironment_variables\x18\x06 \x03(\x0b\x32?.flyteidl.admin.TaskExecutionMetadata.EnvironmentVariablesEntryR\x14\x65nvironmentVariables\x12!\n\x0cmax_attempts\x18\x07 \x01(\x05R\x0bmaxAttempts\x12$\n\rinterruptible\x18\x08 \x01(\x08R\rinterruptible\x12\x46\n\x1finterruptible_failure_threshold\x18\t \x01(\x05R\x1dinterruptibleFailureThreshold\x12>\n\toverrides\x18\n \x01(\x0b\x32 .flyteidl.core.TaskNodeOverridesR\toverrides\x12\x33\n\x08identity\x18\x0b \x01(\x0b\x32\x17.flyteidl.core.IdentityR\x08identity\x1a\x39\n\x0bLabelsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x1a>\n\x10\x41nnotationsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x1aG\n\x19\x45nvironmentVariablesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"\x83\x02\n\x11\x43reateTaskRequest\x12\x31\n\x06inputs\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapR\x06inputs\x12\x37\n\x08template\x18\x02 \x01(\x0b\x32\x1b.flyteidl.core.TaskTemplateR\x08template\x12#\n\routput_prefix\x18\x03 \x01(\tR\x0coutputPrefix\x12]\n\x17task_execution_metadata\x18\x04 \x01(\x0b\x32%.flyteidl.admin.TaskExecutionMetadataR\x15taskExecutionMetadata\"9\n\x12\x43reateTaskResponse\x12#\n\rresource_meta\x18\x01 \x01(\x0cR\x0cresourceMeta\"\x87\x02\n\x13\x43reateRequestHeader\x12\x37\n\x08template\x18\x01 \x01(\x0b\x32\x1b.flyteidl.core.TaskTemplateR\x08template\x12#\n\routput_prefix\x18\x02 \x01(\tR\x0coutputPrefix\x12]\n\x17task_execution_metadata\x18\x03 \x01(\x0b\x32%.flyteidl.admin.TaskExecutionMetadataR\x15taskExecutionMetadata\x12\x33\n\x16max_dataset_size_bytes\x18\x04 \x01(\x03R\x13maxDatasetSizeBytes\"\x94\x01\n\x16\x45xecuteTaskSyncRequest\x12=\n\x06header\x18\x01 \x01(\x0b\x32#.flyteidl.admin.CreateRequestHeaderH\x00R\x06header\x12\x33\n\x06inputs\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapH\x00R\x06inputsB\x06\n\x04part\"U\n\x1d\x45xecuteTaskSyncResponseHeader\x12\x34\n\x08resource\x18\x01 \x01(\x0b\x32\x18.flyteidl.admin.ResourceR\x08resource\"\xa0\x01\n\x17\x45xecuteTaskSyncResponse\x12G\n\x06header\x18\x01 \x01(\x0b\x32-.flyteidl.admin.ExecuteTaskSyncResponseHeaderH\x00R\x06header\x12\x35\n\x07outputs\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapH\x00R\x07outputsB\x05\n\x03res\"\x99\x01\n\x0eGetTaskRequest\x12\x1f\n\ttask_type\x18\x01 \x01(\tB\x02\x18\x01R\x08taskType\x12#\n\rresource_meta\x18\x02 \x01(\x0cR\x0cresourceMeta\x12\x41\n\rtask_category\x18\x03 \x01(\x0b\x32\x1c.flyteidl.admin.TaskCategoryR\x0ctaskCategory\"G\n\x0fGetTaskResponse\x12\x34\n\x08resource\x18\x01 \x01(\x0b\x32\x18.flyteidl.admin.ResourceR\x08resource\"\xb3\x02\n\x08Resource\x12/\n\x05state\x18\x01 \x01(\x0e\x32\x15.flyteidl.admin.StateB\x02\x18\x01R\x05state\x12\x33\n\x07outputs\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapR\x07outputs\x12\x18\n\x07message\x18\x03 \x01(\tR\x07message\x12\x33\n\tlog_links\x18\x04 \x03(\x0b\x32\x16.flyteidl.core.TaskLogR\x08logLinks\x12\x38\n\x05phase\x18\x05 \x01(\x0e\x32\".flyteidl.core.TaskExecution.PhaseR\x05phase\x12\x38\n\x0b\x63ustom_info\x18\x06 \x01(\x0b\x32\x17.google.protobuf.StructR\ncustomInfo\"\x9c\x01\n\x11\x44\x65leteTaskRequest\x12\x1f\n\ttask_type\x18\x01 \x01(\tB\x02\x18\x01R\x08taskType\x12#\n\rresource_meta\x18\x02 \x01(\x0cR\x0cresourceMeta\x12\x41\n\rtask_category\x18\x03 \x01(\x0b\x32\x1c.flyteidl.admin.TaskCategoryR\x0ctaskCategory\"\x14\n\x12\x44\x65leteTaskResponse\"\xc4\x01\n\x05\x41gent\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x34\n\x14supported_task_types\x18\x02 \x03(\tB\x02\x18\x01R\x12supportedTaskTypes\x12\x17\n\x07is_sync\x18\x03 \x01(\x08R\x06isSync\x12X\n\x19supported_task_categories\x18\x04 \x03(\x0b\x32\x1c.flyteidl.admin.TaskCategoryR\x17supportedTaskCategories\"<\n\x0cTaskCategory\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07version\x18\x02 \x01(\x05R\x07version\"%\n\x0fGetAgentRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\"?\n\x10GetAgentResponse\x12+\n\x05\x61gent\x18\x01 \x01(\x0b\x32\x15.flyteidl.admin.AgentR\x05\x61gent\"\x13\n\x11ListAgentsRequest\"C\n\x12ListAgentsResponse\x12-\n\x06\x61gents\x18\x01 \x03(\x0b\x32\x15.flyteidl.admin.AgentR\x06\x61gents\"\xdb\x02\n\x15GetTaskMetricsRequest\x12\x1f\n\ttask_type\x18\x01 \x01(\tB\x02\x18\x01R\x08taskType\x12#\n\rresource_meta\x18\x02 \x01(\x0cR\x0cresourceMeta\x12\x18\n\x07queries\x18\x03 \x03(\tR\x07queries\x12\x39\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartTime\x12\x35\n\x08\x65nd_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x07\x65ndTime\x12-\n\x04step\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationR\x04step\x12\x41\n\rtask_category\x18\x07 \x01(\x0b\x32\x1c.flyteidl.admin.TaskCategoryR\x0ctaskCategory\"X\n\x16GetTaskMetricsResponse\x12>\n\x07results\x18\x01 \x03(\x0b\x32$.flyteidl.core.ExecutionMetricResultR\x07results\"\xc9\x01\n\x12GetTaskLogsRequest\x12\x1f\n\ttask_type\x18\x01 \x01(\tB\x02\x18\x01R\x08taskType\x12#\n\rresource_meta\x18\x02 \x01(\x0cR\x0cresourceMeta\x12\x14\n\x05lines\x18\x03 \x01(\x04R\x05lines\x12\x14\n\x05token\x18\x04 \x01(\tR\x05token\x12\x41\n\rtask_category\x18\x05 \x01(\x0b\x32\x1c.flyteidl.admin.TaskCategoryR\x0ctaskCategory\"1\n\x19GetTaskLogsResponseHeader\x12\x14\n\x05token\x18\x01 \x01(\tR\x05token\"3\n\x17GetTaskLogsResponseBody\x12\x18\n\x07results\x18\x01 \x03(\tR\x07results\"\xa1\x01\n\x13GetTaskLogsResponse\x12\x43\n\x06header\x18\x01 \x01(\x0b\x32).flyteidl.admin.GetTaskLogsResponseHeaderH\x00R\x06header\x12=\n\x04\x62ody\x18\x02 \x01(\x0b\x32\'.flyteidl.admin.GetTaskLogsResponseBodyH\x00R\x04\x62odyB\x06\n\x04part*b\n\x05State\x12\x15\n\x11RETRYABLE_FAILURE\x10\x00\x12\x15\n\x11PERMANENT_FAILURE\x10\x01\x12\x0b\n\x07PENDING\x10\x02\x12\x0b\n\x07RUNNING\x10\x03\x12\r\n\tSUCCEEDED\x10\x04\x1a\x02\x18\x01\x42\xb6\x01\n\x12\x63om.flyteidl.adminB\nAgentProtoP\x01Z;github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin\xa2\x02\x03\x46\x41X\xaa\x02\x0e\x46lyteidl.Admin\xca\x02\x0e\x46lyteidl\\Admin\xe2\x02\x1a\x46lyteidl\\Admin\\GPBMetadata\xea\x02\x0f\x46lyteidl::Adminb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -51,60 +52,60 @@ _GETTASKMETRICSREQUEST.fields_by_name['task_type']._serialized_options = b'\030\001' _GETTASKLOGSREQUEST.fields_by_name['task_type']._options = None _GETTASKLOGSREQUEST.fields_by_name['task_type']._serialized_options = b'\030\001' - _globals['_STATE']._serialized_start=4271 - _globals['_STATE']._serialized_end=4369 - _globals['_TASKEXECUTIONMETADATA']._serialized_start=321 - _globals['_TASKEXECUTIONMETADATA']._serialized_end=1194 - _globals['_TASKEXECUTIONMETADATA_LABELSENTRY']._serialized_start=1000 - _globals['_TASKEXECUTIONMETADATA_LABELSENTRY']._serialized_end=1057 - _globals['_TASKEXECUTIONMETADATA_ANNOTATIONSENTRY']._serialized_start=1059 - _globals['_TASKEXECUTIONMETADATA_ANNOTATIONSENTRY']._serialized_end=1121 - _globals['_TASKEXECUTIONMETADATA_ENVIRONMENTVARIABLESENTRY']._serialized_start=1123 - _globals['_TASKEXECUTIONMETADATA_ENVIRONMENTVARIABLESENTRY']._serialized_end=1194 - _globals['_CREATETASKREQUEST']._serialized_start=1197 - _globals['_CREATETASKREQUEST']._serialized_end=1456 - _globals['_CREATETASKRESPONSE']._serialized_start=1458 - _globals['_CREATETASKRESPONSE']._serialized_end=1515 - _globals['_CREATEREQUESTHEADER']._serialized_start=1518 - _globals['_CREATEREQUESTHEADER']._serialized_end=1781 - _globals['_EXECUTETASKSYNCREQUEST']._serialized_start=1784 - _globals['_EXECUTETASKSYNCREQUEST']._serialized_end=1932 - _globals['_EXECUTETASKSYNCRESPONSEHEADER']._serialized_start=1934 - _globals['_EXECUTETASKSYNCRESPONSEHEADER']._serialized_end=2019 - _globals['_EXECUTETASKSYNCRESPONSE']._serialized_start=2022 - _globals['_EXECUTETASKSYNCRESPONSE']._serialized_end=2182 - _globals['_GETTASKREQUEST']._serialized_start=2185 - _globals['_GETTASKREQUEST']._serialized_end=2338 - _globals['_GETTASKRESPONSE']._serialized_start=2340 - _globals['_GETTASKRESPONSE']._serialized_end=2411 - _globals['_RESOURCE']._serialized_start=2414 - _globals['_RESOURCE']._serialized_end=2721 - _globals['_DELETETASKREQUEST']._serialized_start=2724 - _globals['_DELETETASKREQUEST']._serialized_end=2880 - _globals['_DELETETASKRESPONSE']._serialized_start=2882 - _globals['_DELETETASKRESPONSE']._serialized_end=2902 - _globals['_AGENT']._serialized_start=2905 - _globals['_AGENT']._serialized_end=3101 - _globals['_TASKCATEGORY']._serialized_start=3103 - _globals['_TASKCATEGORY']._serialized_end=3163 - _globals['_GETAGENTREQUEST']._serialized_start=3165 - _globals['_GETAGENTREQUEST']._serialized_end=3202 - _globals['_GETAGENTRESPONSE']._serialized_start=3204 - _globals['_GETAGENTRESPONSE']._serialized_end=3267 - _globals['_LISTAGENTSREQUEST']._serialized_start=3269 - _globals['_LISTAGENTSREQUEST']._serialized_end=3288 - _globals['_LISTAGENTSRESPONSE']._serialized_start=3290 - _globals['_LISTAGENTSRESPONSE']._serialized_end=3357 - _globals['_GETTASKMETRICSREQUEST']._serialized_start=3360 - _globals['_GETTASKMETRICSREQUEST']._serialized_end=3707 - _globals['_GETTASKMETRICSRESPONSE']._serialized_start=3709 - _globals['_GETTASKMETRICSRESPONSE']._serialized_end=3797 - _globals['_GETTASKLOGSREQUEST']._serialized_start=3800 - _globals['_GETTASKLOGSREQUEST']._serialized_end=4001 - _globals['_GETTASKLOGSRESPONSEHEADER']._serialized_start=4003 - _globals['_GETTASKLOGSRESPONSEHEADER']._serialized_end=4052 - _globals['_GETTASKLOGSRESPONSEBODY']._serialized_start=4054 - _globals['_GETTASKLOGSRESPONSEBODY']._serialized_end=4105 - _globals['_GETTASKLOGSRESPONSE']._serialized_start=4108 - _globals['_GETTASKLOGSRESPONSE']._serialized_end=4269 + _globals['_STATE']._serialized_start=4354 + _globals['_STATE']._serialized_end=4452 + _globals['_TASKEXECUTIONMETADATA']._serialized_start=351 + _globals['_TASKEXECUTIONMETADATA']._serialized_end=1277 + _globals['_TASKEXECUTIONMETADATA_LABELSENTRY']._serialized_start=1083 + _globals['_TASKEXECUTIONMETADATA_LABELSENTRY']._serialized_end=1140 + _globals['_TASKEXECUTIONMETADATA_ANNOTATIONSENTRY']._serialized_start=1142 + _globals['_TASKEXECUTIONMETADATA_ANNOTATIONSENTRY']._serialized_end=1204 + _globals['_TASKEXECUTIONMETADATA_ENVIRONMENTVARIABLESENTRY']._serialized_start=1206 + _globals['_TASKEXECUTIONMETADATA_ENVIRONMENTVARIABLESENTRY']._serialized_end=1277 + _globals['_CREATETASKREQUEST']._serialized_start=1280 + _globals['_CREATETASKREQUEST']._serialized_end=1539 + _globals['_CREATETASKRESPONSE']._serialized_start=1541 + _globals['_CREATETASKRESPONSE']._serialized_end=1598 + _globals['_CREATEREQUESTHEADER']._serialized_start=1601 + _globals['_CREATEREQUESTHEADER']._serialized_end=1864 + _globals['_EXECUTETASKSYNCREQUEST']._serialized_start=1867 + _globals['_EXECUTETASKSYNCREQUEST']._serialized_end=2015 + _globals['_EXECUTETASKSYNCRESPONSEHEADER']._serialized_start=2017 + _globals['_EXECUTETASKSYNCRESPONSEHEADER']._serialized_end=2102 + _globals['_EXECUTETASKSYNCRESPONSE']._serialized_start=2105 + _globals['_EXECUTETASKSYNCRESPONSE']._serialized_end=2265 + _globals['_GETTASKREQUEST']._serialized_start=2268 + _globals['_GETTASKREQUEST']._serialized_end=2421 + _globals['_GETTASKRESPONSE']._serialized_start=2423 + _globals['_GETTASKRESPONSE']._serialized_end=2494 + _globals['_RESOURCE']._serialized_start=2497 + _globals['_RESOURCE']._serialized_end=2804 + _globals['_DELETETASKREQUEST']._serialized_start=2807 + _globals['_DELETETASKREQUEST']._serialized_end=2963 + _globals['_DELETETASKRESPONSE']._serialized_start=2965 + _globals['_DELETETASKRESPONSE']._serialized_end=2985 + _globals['_AGENT']._serialized_start=2988 + _globals['_AGENT']._serialized_end=3184 + _globals['_TASKCATEGORY']._serialized_start=3186 + _globals['_TASKCATEGORY']._serialized_end=3246 + _globals['_GETAGENTREQUEST']._serialized_start=3248 + _globals['_GETAGENTREQUEST']._serialized_end=3285 + _globals['_GETAGENTRESPONSE']._serialized_start=3287 + _globals['_GETAGENTRESPONSE']._serialized_end=3350 + _globals['_LISTAGENTSREQUEST']._serialized_start=3352 + _globals['_LISTAGENTSREQUEST']._serialized_end=3371 + _globals['_LISTAGENTSRESPONSE']._serialized_start=3373 + _globals['_LISTAGENTSRESPONSE']._serialized_end=3440 + _globals['_GETTASKMETRICSREQUEST']._serialized_start=3443 + _globals['_GETTASKMETRICSREQUEST']._serialized_end=3790 + _globals['_GETTASKMETRICSRESPONSE']._serialized_start=3792 + _globals['_GETTASKMETRICSRESPONSE']._serialized_end=3880 + _globals['_GETTASKLOGSREQUEST']._serialized_start=3883 + _globals['_GETTASKLOGSREQUEST']._serialized_end=4084 + _globals['_GETTASKLOGSRESPONSEHEADER']._serialized_start=4086 + _globals['_GETTASKLOGSRESPONSEHEADER']._serialized_end=4135 + _globals['_GETTASKLOGSRESPONSEBODY']._serialized_start=4137 + _globals['_GETTASKLOGSRESPONSEBODY']._serialized_end=4188 + _globals['_GETTASKLOGSRESPONSE']._serialized_start=4191 + _globals['_GETTASKLOGSRESPONSE']._serialized_end=4352 # @@protoc_insertion_point(module_scope) diff --git a/flyteidl/gen/pb_python/flyteidl/admin/agent_pb2.pyi b/flyteidl/gen/pb_python/flyteidl/admin/agent_pb2.pyi index 988985e5ae..956b5d5a4d 100644 --- a/flyteidl/gen/pb_python/flyteidl/admin/agent_pb2.pyi +++ b/flyteidl/gen/pb_python/flyteidl/admin/agent_pb2.pyi @@ -4,6 +4,7 @@ from flyteidl.core import workflow_pb2 as _workflow_pb2 from flyteidl.core import identifier_pb2 as _identifier_pb2 from flyteidl.core import execution_pb2 as _execution_pb2 from flyteidl.core import metrics_pb2 as _metrics_pb2 +from flyteidl.core import security_pb2 as _security_pb2 from google.protobuf import duration_pb2 as _duration_pb2 from google.protobuf import timestamp_pb2 as _timestamp_pb2 from google.protobuf import struct_pb2 as _struct_pb2 @@ -29,7 +30,7 @@ RUNNING: State SUCCEEDED: State class TaskExecutionMetadata(_message.Message): - __slots__ = ["task_execution_id", "namespace", "labels", "annotations", "k8s_service_account", "environment_variables", "max_attempts", "interruptible", "interruptible_failure_threshold", "overrides"] + __slots__ = ["task_execution_id", "namespace", "labels", "annotations", "k8s_service_account", "environment_variables", "max_attempts", "interruptible", "interruptible_failure_threshold", "overrides", "identity"] class LabelsEntry(_message.Message): __slots__ = ["key", "value"] KEY_FIELD_NUMBER: _ClassVar[int] @@ -61,6 +62,7 @@ class TaskExecutionMetadata(_message.Message): INTERRUPTIBLE_FIELD_NUMBER: _ClassVar[int] INTERRUPTIBLE_FAILURE_THRESHOLD_FIELD_NUMBER: _ClassVar[int] OVERRIDES_FIELD_NUMBER: _ClassVar[int] + IDENTITY_FIELD_NUMBER: _ClassVar[int] task_execution_id: _identifier_pb2.TaskExecutionIdentifier namespace: str labels: _containers.ScalarMap[str, str] @@ -71,7 +73,8 @@ class TaskExecutionMetadata(_message.Message): interruptible: bool interruptible_failure_threshold: int overrides: _workflow_pb2.TaskNodeOverrides - def __init__(self, task_execution_id: _Optional[_Union[_identifier_pb2.TaskExecutionIdentifier, _Mapping]] = ..., namespace: _Optional[str] = ..., labels: _Optional[_Mapping[str, str]] = ..., annotations: _Optional[_Mapping[str, str]] = ..., k8s_service_account: _Optional[str] = ..., environment_variables: _Optional[_Mapping[str, str]] = ..., max_attempts: _Optional[int] = ..., interruptible: bool = ..., interruptible_failure_threshold: _Optional[int] = ..., overrides: _Optional[_Union[_workflow_pb2.TaskNodeOverrides, _Mapping]] = ...) -> None: ... + identity: _security_pb2.Identity + def __init__(self, task_execution_id: _Optional[_Union[_identifier_pb2.TaskExecutionIdentifier, _Mapping]] = ..., namespace: _Optional[str] = ..., labels: _Optional[_Mapping[str, str]] = ..., annotations: _Optional[_Mapping[str, str]] = ..., k8s_service_account: _Optional[str] = ..., environment_variables: _Optional[_Mapping[str, str]] = ..., max_attempts: _Optional[int] = ..., interruptible: bool = ..., interruptible_failure_threshold: _Optional[int] = ..., overrides: _Optional[_Union[_workflow_pb2.TaskNodeOverrides, _Mapping]] = ..., identity: _Optional[_Union[_security_pb2.Identity, _Mapping]] = ...) -> None: ... class CreateTaskRequest(_message.Message): __slots__ = ["inputs", "template", "output_prefix", "task_execution_metadata"] diff --git a/flyteidl/gen/pb_rust/flyteidl.admin.rs b/flyteidl/gen/pb_rust/flyteidl.admin.rs index 3995c67bb0..f54e33a11a 100644 --- a/flyteidl/gen/pb_rust/flyteidl.admin.rs +++ b/flyteidl/gen/pb_rust/flyteidl.admin.rs @@ -1,9 +1,10 @@ // @generated /// Represents a subset of runtime task execution metadata that are relevant to external plugins. +/// +/// ID of the task execution #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TaskExecutionMetadata { - /// ID of the task execution #[prost(message, optional, tag="1")] pub task_execution_id: ::core::option::Option, /// k8s namespace where the task is executed in @@ -38,6 +39,9 @@ pub struct TaskExecutionMetadata { /// These overrides can be used to customize the behavior of the task node. #[prost(message, optional, tag="10")] pub overrides: ::core::option::Option, + /// Identity of user running this task execution + #[prost(message, optional, tag="11")] + pub identity: ::core::option::Option, } /// Represents a request structure to create task. #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/flyteidl/protos/flyteidl/admin/agent.proto b/flyteidl/protos/flyteidl/admin/agent.proto index 0256483d8f..931c27785f 100644 --- a/flyteidl/protos/flyteidl/admin/agent.proto +++ b/flyteidl/protos/flyteidl/admin/agent.proto @@ -9,6 +9,7 @@ import "flyteidl/core/workflow.proto"; import "flyteidl/core/identifier.proto"; import "flyteidl/core/execution.proto"; import "flyteidl/core/metrics.proto"; +import "flyteidl/core/security.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/struct.proto"; @@ -26,6 +27,7 @@ enum State { // Represents a subset of runtime task execution metadata that are relevant to external plugins. message TaskExecutionMetadata { // ID of the task execution + core.TaskExecutionIdentifier task_execution_id = 1; // k8s namespace where the task is executed in string namespace = 2; @@ -50,6 +52,8 @@ message TaskExecutionMetadata { // Overrides for specific properties of the task node. // These overrides can be used to customize the behavior of the task node. core.TaskNodeOverrides overrides = 10; + // Identity of user running this task execution + core.Identity identity = 11; } // Represents a request structure to create task. diff --git a/flyteplugins/go/tasks/plugins/webapi/agent/integration_test.go b/flyteplugins/go/tasks/plugins/webapi/agent/integration_test.go index 689527ee3b..6fb3828c0c 100644 --- a/flyteplugins/go/tasks/plugins/webapi/agent/integration_test.go +++ b/flyteplugins/go/tasks/plugins/webapi/agent/integration_test.go @@ -227,6 +227,9 @@ func getTaskContext(t *testing.T) *pluginCoreMocks.TaskExecutionContext { tMeta.OnGetAnnotations().Return(map[string]string{"foo": "bar"}) tMeta.OnGetK8sServiceAccount().Return("k8s-account") tMeta.OnGetEnvironmentVariables().Return(map[string]string{"foo": "bar"}) + tMeta.OnGetSecurityContext().Return(flyteIdlCore.SecurityContext{ + RunAs: &flyteIdlCore.Identity{ExecutionIdentity: "execution-identity"}, + }) resourceManager := &pluginCoreMocks.ResourceManager{} resourceManager.OnAllocateResourceMatch(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(pluginCore.AllocationStatusGranted, nil) resourceManager.OnReleaseResourceMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) diff --git a/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go b/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go index c4decd04ef..cc7f15bd80 100644 --- a/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go +++ b/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go @@ -347,6 +347,7 @@ func getFinalAgent(taskCategory *admin.TaskCategory, cfg *Config, agentRegistry func buildTaskExecutionMetadata(taskExecutionMetadata core.TaskExecutionMetadata) admin.TaskExecutionMetadata { taskExecutionID := taskExecutionMetadata.GetTaskExecutionID().GetID() + return admin.TaskExecutionMetadata{ TaskExecutionId: &taskExecutionID, Namespace: taskExecutionMetadata.GetNamespace(), @@ -354,6 +355,7 @@ func buildTaskExecutionMetadata(taskExecutionMetadata core.TaskExecutionMetadata Annotations: taskExecutionMetadata.GetAnnotations(), K8SServiceAccount: taskExecutionMetadata.GetK8sServiceAccount(), EnvironmentVariables: taskExecutionMetadata.GetEnvironmentVariables(), + Identity: taskExecutionMetadata.GetSecurityContext().RunAs, } } From b11b92eb5f84558f0083267a202211933ee9438e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 23:14:20 +0000 Subject: [PATCH 396/645] Bump k8s.io/client-go from 0.0.0-20210217172142-7279fc64d847 to 0.17.16 in /boilerplate/flyte/golang_support_tools (#5145) * Bump k8s.io/client-go in /boilerplate/flyte/golang_support_tools Bumps [k8s.io/client-go](https://github.com/kubernetes/client-go) from 0.0.0-20210217172142-7279fc64d847 to 0.17.16. - [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/kubernetes/client-go/commits/v0.17.16) --- updated-dependencies: - dependency-name: k8s.io/client-go dependency-type: indirect ... Signed-off-by: dependabot[bot] * Run make go-tidy Signed-off-by: Eduardo Apolinario --------- Signed-off-by: dependabot[bot] Signed-off-by: Eduardo Apolinario Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eduardo Apolinario --- boilerplate/flyte/golang_support_tools/go.sum | 2 -- go.sum | 2 -- 2 files changed, 4 deletions(-) diff --git a/boilerplate/flyte/golang_support_tools/go.sum b/boilerplate/flyte/golang_support_tools/go.sum index e4c6cebc56..6fc15fa251 100644 --- a/boilerplate/flyte/golang_support_tools/go.sum +++ b/boilerplate/flyte/golang_support_tools/go.sum @@ -295,8 +295,6 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= diff --git a/go.sum b/go.sum index 4704ec2bac..0a67d9e328 100644 --- a/go.sum +++ b/go.sum @@ -678,8 +678,6 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= From 5b5c238079e545a18dd10e8b05b05a801a4b02b0 Mon Sep 17 00:00:00 2001 From: "Ethan Brown (Domino)" <111539728+ddl-ebrown@users.noreply.github.com> Date: Wed, 3 Apr 2024 17:05:49 -0700 Subject: [PATCH 397/645] Upgrade jackc postgres libraries (#5155) - pgconn v1.14.1 -> v1.14.3 - pgx v5.4.3 -> v5.5.5 - pgproto3 v2.3.2 -> v2.3.3 - Resolves vuln CVE-2024-27304 Signed-off-by: ddl-ebrown --- datacatalog/go.mod | 9 +++-- datacatalog/go.sum | 95 +++++----------------------------------------- flyteadmin/go.mod | 9 +++-- flyteadmin/go.sum | 28 +++++--------- flytestdlib/go.mod | 9 +++-- flytestdlib/go.sum | 95 +++++----------------------------------------- go.mod | 9 +++-- go.sum | 28 +++++--------- 8 files changed, 60 insertions(+), 222 deletions(-) diff --git a/datacatalog/go.mod b/datacatalog/go.mod index 631356a8cf..8ede87b97a 100644 --- a/datacatalog/go.mod +++ b/datacatalog/go.mod @@ -9,7 +9,7 @@ require ( github.com/gofrs/uuid v4.2.0+incompatible github.com/golang/glog v1.2.0 github.com/golang/protobuf v1.5.3 - github.com/jackc/pgconn v1.14.1 + github.com/jackc/pgconn v1.14.3 github.com/mitchellh/mapstructure v1.5.0 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 @@ -69,9 +69,10 @@ require ( github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.2 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.4.3 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect + github.com/jackc/pgx/v5 v5.5.5 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect diff --git a/datacatalog/go.sum b/datacatalog/go.sum index 8d2896cb85..2ce700a43b 100644 --- a/datacatalog/go.sum +++ b/datacatalog/go.sum @@ -84,13 +84,9 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -138,7 +134,6 @@ github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2Kv github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= @@ -245,47 +240,25 @@ github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.14.1 h1:smbxIaZA08n6YuxEX1sDyjV/qkbtUtkH20qLkR9MUR4= -github.com/jackc/pgconn v1.14.1/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0= -github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= -github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= @@ -303,33 +276,24 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -376,14 +340,7 @@ github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPH github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= @@ -401,8 +358,6 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= @@ -424,7 +379,6 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -449,29 +403,18 @@ go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZ go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -522,7 +465,6 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -545,7 +487,6 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -573,21 +514,15 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -621,13 +556,10 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -636,10 +568,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -654,14 +584,12 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -701,8 +629,6 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -820,7 +746,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= diff --git a/flyteadmin/go.mod b/flyteadmin/go.mod index 50077b3efb..fc5e45aa90 100644 --- a/flyteadmin/go.mod +++ b/flyteadmin/go.mod @@ -32,8 +32,8 @@ require ( github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99 github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 github.com/gtank/cryptopasta v0.0.0-20170601214702-1f550f6f2f69 - github.com/jackc/pgconn v1.14.1 - github.com/jackc/pgx/v5 v5.4.3 + github.com/jackc/pgconn v1.14.3 + github.com/jackc/pgx/v5 v5.5.5 github.com/lestrrat-go/jwx v1.2.29 github.com/magiconair/properties v1.8.6 github.com/mitchellh/mapstructure v1.5.0 @@ -123,8 +123,9 @@ require ( github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.2 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jcmturner/gofork v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect diff --git a/flyteadmin/go.sum b/flyteadmin/go.sum index e61ac62c5e..8941483056 100644 --- a/flyteadmin/go.sum +++ b/flyteadmin/go.sum @@ -779,14 +779,11 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.3.2/go.mod h1:LvCquS3HbBKwgl7KbX9KyqEIumJAbm1UMcTvGaIf3bM= github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= github.com/jackc/pgconn v1.6.0/go.mod h1:yeseQo4xhQbgyJs2c87RAXOH2i624N0Fh1KSPJya7qo= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.14.1 h1:smbxIaZA08n6YuxEX1sDyjV/qkbtUtkH20qLkR9MUR4= -github.com/jackc/pgconn v1.14.1/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= @@ -798,14 +795,11 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0= -github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= @@ -818,11 +812,13 @@ github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9 github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.4.1/go.mod h1:6iSW+JznC0YT+SgBn7rNxoEBsBgSmnC5FwyCekOGUiE= github.com/jackc/pgx/v4 v4.6.0/go.mod h1:vPh43ZzxijXUVJ+t/EmXBtFmbFVO72cuneCT9oAlxAg= -github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= -github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jandelgado/gcov2lcov v1.0.4-0.20210120124023-b83752c6dc08/go.mod h1:NnSxK6TMlg1oGDBfGelGbjgorT5/L3cchlbtgFYZSss= github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8= @@ -1414,11 +1410,8 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= @@ -1663,7 +1656,6 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= diff --git a/flytestdlib/go.mod b/flytestdlib/go.mod index 7ab9d06f5b..1572f878c6 100644 --- a/flytestdlib/go.mod +++ b/flytestdlib/go.mod @@ -16,8 +16,8 @@ require ( github.com/go-test/deep v1.0.7 github.com/golang/protobuf v1.5.3 github.com/hashicorp/golang-lru v0.5.4 - github.com/jackc/pgconn v1.14.1 - github.com/jackc/pgx/v5 v5.4.3 + github.com/jackc/pgconn v1.14.3 + github.com/jackc/pgx/v5 v5.5.5 github.com/magiconair/properties v1.8.6 github.com/mitchellh/mapstructure v1.5.0 github.com/pkg/errors v0.9.1 @@ -85,8 +85,9 @@ require ( github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.2 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect diff --git a/flytestdlib/go.sum b/flytestdlib/go.sum index e7ccf5d3ef..a7d5932edb 100644 --- a/flytestdlib/go.sum +++ b/flytestdlib/go.sum @@ -84,13 +84,9 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -144,7 +140,6 @@ github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2Kv github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= @@ -247,47 +242,25 @@ github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.14.1 h1:smbxIaZA08n6YuxEX1sDyjV/qkbtUtkH20qLkR9MUR4= -github.com/jackc/pgconn v1.14.1/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0= -github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= -github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= @@ -305,33 +278,24 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -378,14 +342,7 @@ github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPH github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= @@ -403,8 +360,6 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= @@ -426,7 +381,6 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -451,29 +405,18 @@ go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZ go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -526,7 +469,6 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -549,7 +491,6 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -577,21 +518,15 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -625,13 +560,10 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -640,10 +572,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -658,14 +588,12 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -705,8 +633,6 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -824,7 +750,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= diff --git a/go.mod b/go.mod index d48d1196f7..479e732221 100644 --- a/go.mod +++ b/go.mod @@ -106,12 +106,13 @@ require ( github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.14.1 // indirect + github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.2 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.4.3 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect + github.com/jackc/pgx/v5 v5.5.5 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jcmturner/gofork v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect diff --git a/go.sum b/go.sum index 0a67d9e328..be1e98fc22 100644 --- a/go.sum +++ b/go.sum @@ -805,14 +805,11 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.3.2/go.mod h1:LvCquS3HbBKwgl7KbX9KyqEIumJAbm1UMcTvGaIf3bM= github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= github.com/jackc/pgconn v1.6.0/go.mod h1:yeseQo4xhQbgyJs2c87RAXOH2i624N0Fh1KSPJya7qo= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.14.1 h1:smbxIaZA08n6YuxEX1sDyjV/qkbtUtkH20qLkR9MUR4= -github.com/jackc/pgconn v1.14.1/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= @@ -824,14 +821,11 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0= -github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= @@ -844,11 +838,13 @@ github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9 github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.4.1/go.mod h1:6iSW+JznC0YT+SgBn7rNxoEBsBgSmnC5FwyCekOGUiE= github.com/jackc/pgx/v4 v4.6.0/go.mod h1:vPh43ZzxijXUVJ+t/EmXBtFmbFVO72cuneCT9oAlxAg= -github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= -github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jandelgado/gcov2lcov v1.0.4-0.20210120124023-b83752c6dc08/go.mod h1:NnSxK6TMlg1oGDBfGelGbjgorT5/L3cchlbtgFYZSss= github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8= @@ -1448,11 +1444,8 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= @@ -1697,7 +1690,6 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= From 5b64aebcb40c9482c677590d73b4d173007fe002 Mon Sep 17 00:00:00 2001 From: novahow <58504997+novahow@users.noreply.github.com> Date: Thu, 4 Apr 2024 08:07:47 +0800 Subject: [PATCH 398/645] fix make link error (#5175) Signed-off-by: novahow --- docs/community/contribute.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/community/contribute.rst b/docs/community/contribute.rst index 698762d691..c5e8311ba3 100644 --- a/docs/community/contribute.rst +++ b/docs/community/contribute.rst @@ -194,7 +194,7 @@ The resulting ``html`` files will be in ``docs/_build/html``. You can view them * Run the following commands: * ``make generate`` * ``make test_unit`` - * ``make link`` + * ``make lint`` * To compile, run ``make compile`` ``flyteadmin`` @@ -262,7 +262,7 @@ The resulting ``html`` files will be in ``docs/_build/html``. You can view them * Run the following commands: * ``make generate`` * ``make test_unit`` - * ``make link`` + * ``make lint`` ``flytestdlib`` *************** From 37255a11ae80e1edf34a00ac3e0f9e786a66787f Mon Sep 17 00:00:00 2001 From: Thomas Newton Date: Thu, 4 Apr 2024 04:06:40 +0100 Subject: [PATCH 399/645] Stop admin launcher copying shard key from parent workflow (#5174) * Remove shard key in admin-launcher Signed-off-by: Thomas Newton * Don't mutate existing state Signed-off-by: Thomas Newton * Don't mutate state Signed-off-by: Thomas Newton * Add a test Signed-off-by: Thomas Newton --------- Signed-off-by: Thomas Newton --- .../controller/nodes/subworkflow/launchplan/admin.go | 12 +++++++++++- .../nodes/subworkflow/launchplan/admin_test.go | 10 +++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/flytepropeller/pkg/controller/nodes/subworkflow/launchplan/admin.go b/flytepropeller/pkg/controller/nodes/subworkflow/launchplan/admin.go index 29de745acf..fbe0a8c1a6 100644 --- a/flytepropeller/pkg/controller/nodes/subworkflow/launchplan/admin.go +++ b/flytepropeller/pkg/controller/nodes/subworkflow/launchplan/admin.go @@ -15,6 +15,7 @@ import ( "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" evtErr "github.com/flyteorg/flyte/flytepropeller/events/errors" + "github.com/flyteorg/flyte/flytepropeller/pkg/compiler/transformers/k8s" "github.com/flyteorg/flyte/flytestdlib/cache" stdErr "github.com/flyteorg/flyte/flytestdlib/errors" "github.com/flyteorg/flyte/flytestdlib/logger" @@ -114,6 +115,15 @@ func (a *adminLaunchPlanExecutor) Launch(ctx context.Context, launchCtx LaunchCo }) } + // Make a copy of the labels with shard-key removed. This ensures that the shard-key is re-computed for each + // instead of being copied from the parent. + labels := make(map[string]string) + for key, value := range launchCtx.Labels { + if key != k8s.ShardKeyLabel { + labels[key] = value + } + } + req := &admin.ExecutionCreateRequest{ Project: executionID.Project, Domain: executionID.Domain, @@ -127,7 +137,7 @@ func (a *adminLaunchPlanExecutor) Launch(ctx context.Context, launchCtx LaunchCo Principal: launchCtx.Principal, ParentNodeExecution: launchCtx.ParentNodeExecution, }, - Labels: &admin.Labels{Values: launchCtx.Labels}, + Labels: &admin.Labels{Values: labels}, Annotations: &admin.Annotations{Values: launchCtx.Annotations}, SecurityContext: &launchCtx.SecurityContext, MaxParallelism: int32(launchCtx.MaxParallelism), diff --git a/flytepropeller/pkg/controller/nodes/subworkflow/launchplan/admin_test.go b/flytepropeller/pkg/controller/nodes/subworkflow/launchplan/admin_test.go index 89bb0e2477..2a442e3262 100644 --- a/flytepropeller/pkg/controller/nodes/subworkflow/launchplan/admin_test.go +++ b/flytepropeller/pkg/controller/nodes/subworkflow/launchplan/admin_test.go @@ -2,6 +2,7 @@ package launchplan import ( "context" + "reflect" "testing" "time" @@ -162,10 +163,14 @@ func TestAdminLaunchPlanExecutor_Launch(t *testing.T) { ctx, mock.MatchedBy(func(o *admin.ExecutionCreateRequest) bool { return o.Project == "p" && o.Domain == "d" && o.Name == "n" && o.Spec.Inputs == nil && - o.Spec.Metadata.Mode == admin.ExecutionMetadata_CHILD_WORKFLOW + o.Spec.Metadata.Mode == admin.ExecutionMetadata_CHILD_WORKFLOW && + reflect.DeepEqual(o.Spec.Labels.Values, map[string]string{"foo": "bar"}) // Ensure shard-key was removed. }), ).Return(nil, nil) assert.NoError(t, err) + + var labels = map[string]string{"foo": "bar", "shard-key": "1"} + err = exec.Launch(ctx, LaunchContext{ ParentNodeExecution: &core.NodeExecutionIdentifier{ @@ -176,12 +181,15 @@ func TestAdminLaunchPlanExecutor_Launch(t *testing.T) { Name: "w", }, }, + Labels: labels, }, id, &core.Identifier{}, nil, ) assert.NoError(t, err) + // Ensure we haven't mutated the state of the parent workflow. + assert.True(t, reflect.DeepEqual(labels, map[string]string{"foo": "bar", "shard-key": "1"})) }) t.Run("happy recover", func(t *testing.T) { From bcdbf5f392b02946f7efe4c2fe8655420bdd3212 Mon Sep 17 00:00:00 2001 From: Yi Sheng Date: Wed, 3 Apr 2024 20:27:36 -0700 Subject: [PATCH 400/645] fix id bigint conversation for not created table (#5157) Signed-off-by: YiShengOng --- flyteadmin/pkg/repositories/config/migrations.go | 8 +++++--- flyteadmin/pkg/repositories/config/migrations_test.go | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/flyteadmin/pkg/repositories/config/migrations.go b/flyteadmin/pkg/repositories/config/migrations.go index a3e5484a7d..b05da0d4c9 100644 --- a/flyteadmin/pkg/repositories/config/migrations.go +++ b/flyteadmin/pkg/repositories/config/migrations.go @@ -17,6 +17,7 @@ import ( // TODO: add a way to get these list of tables directly from the gorm loaded models var ( + // Tables are ordererd by creation. Migration code relies on this ordering. tables = []string{"execution_events", "executions", "launch_plans", "named_entity_metadata", "node_execution_events", "node_executions", "projects", "resources", "schedulable_entities", "schedule_entities_snapshots", "task_executions", "tasks", "workflows", "description_entities"} @@ -347,6 +348,7 @@ var LegacyMigrations = []*gormigrate.Migration{ // For any new table, Please use the following pattern due to a bug // in the postgres gorm layer https://github.com/go-gorm/postgres/issues/65 + // The 13th table in tables was created before this migration. { ID: "2022-01-11-id-to-bigint", Migrate: func(tx *gorm.DB) error { @@ -354,14 +356,14 @@ var LegacyMigrations = []*gormigrate.Migration{ if err != nil { return err } - return alterTableColumnType(db, "id", "bigint") + return alterTableColumnType(db, "id", "bigint", tables[:13]) }, Rollback: func(tx *gorm.DB) error { db, err := tx.DB() if err != nil { return err } - return alterTableColumnType(db, "id", "int") + return alterTableColumnType(db, "id", "int", tables[:13]) }, }, @@ -1225,7 +1227,7 @@ var ContinuedMigrations = []*gormigrate.Migration{ var m = append(LegacyMigrations, NoopMigrations...) var Migrations = append(m, ContinuedMigrations...) -func alterTableColumnType(db *sql.DB, columnName, columnType string) error { +func alterTableColumnType(db *sql.DB, columnName, columnType string, tables []string) error { var err error for _, table := range tables { if _, err = db.Exec(fmt.Sprintf(`ALTER TABLE IF EXISTS %s ALTER COLUMN "%s" TYPE %s`, table, columnName, diff --git a/flyteadmin/pkg/repositories/config/migrations_test.go b/flyteadmin/pkg/repositories/config/migrations_test.go index 570a01904d..4c64a916a6 100644 --- a/flyteadmin/pkg/repositories/config/migrations_test.go +++ b/flyteadmin/pkg/repositories/config/migrations_test.go @@ -20,7 +20,7 @@ func TestAlterTableColumnType(t *testing.T) { `ALTER TABLE IF EXISTS execution_events ALTER COLUMN "id" TYPE bigint`) assert.NoError(t, err) tables = []string{"execution_events"} - _ = alterTableColumnType(db, "id", "bigint") + _ = alterTableColumnType(db, "id", "bigint", tables) assert.True(t, query.Triggered) } From f1c22317a40b507e5113b0fce57396faa7379b23 Mon Sep 17 00:00:00 2001 From: Shardool Date: Wed, 3 Apr 2024 21:05:31 -0700 Subject: [PATCH 401/645] Add tracking for active node and task execution counts in propeller (#4986) * Add tracking for active node and task execution counts in propeller Signed-off-by: Shardool * Update unit tests for task and node execution counts Signed-off-by: Shardool * Fix linter errors Signed-off-by: Shardool * fix linter errors Signed-off-by: Paul Dittamo --------- Signed-off-by: Shardool Signed-off-by: Paul Dittamo Co-authored-by: Paul Dittamo --- flytepropeller/pkg/controller/controller.go | 19 +- .../controller/executors/execution_context.go | 36 +++- .../executors/mocks/execution_context.go | 128 +++++++++++++ .../controller/nodes/array/handler_test.go | 4 + .../pkg/controller/nodes/executor.go | 10 ++ .../pkg/controller/workflow/executor.go | 68 ++++--- .../pkg/controller/workflow/executor_test.go | 39 +++- .../workflowstore/execution_stats.go | 170 ++++++++++++++++++ .../workflowstore/execution_stats_test.go | 119 ++++++++++++ 9 files changed, 548 insertions(+), 45 deletions(-) create mode 100644 flytepropeller/pkg/controller/workflowstore/execution_stats.go create mode 100644 flytepropeller/pkg/controller/workflowstore/execution_stats_test.go diff --git a/flytepropeller/pkg/controller/controller.go b/flytepropeller/pkg/controller/controller.go index acd7747d3f..631d85bd2c 100644 --- a/flytepropeller/pkg/controller/controller.go +++ b/flytepropeller/pkg/controller/controller.go @@ -82,10 +82,11 @@ type Controller struct { workflowStore workflowstore.FlyteWorkflow // recorder is an event recorder for recording Event resources to the // Kubernetes API. - recorder record.EventRecorder - metrics *metrics - leaderElector *leaderelection.LeaderElector - levelMonitor *ResourceLevelMonitor + recorder record.EventRecorder + metrics *metrics + leaderElector *leaderelection.LeaderElector + levelMonitor *ResourceLevelMonitor + executionStats *workflowstore.ExecutionStatsMonitor } // Run either as a leader -if configured- or as a standalone process. @@ -117,6 +118,7 @@ func (c *Controller) run(ctx context.Context) error { // Start the collector process c.levelMonitor.RunCollector(ctx) + c.executionStats.RunStatsMonitor(ctx) // Start the informer factories to begin populating the informer caches logger.Info(ctx, "Starting FlyteWorkflow controller") @@ -329,7 +331,6 @@ func New(ctx context.Context, cfg *config.Config, kubeClientset kubernetes.Inter if sCfg == nil { logger.Errorf(ctx, "Storage configuration missing.") } - store, err := storage.NewDataStore(sCfg, scope.NewSubScope("metastore")) if err != nil { return nil, errors.Wrapf(err, "Failed to create Metadata storage") @@ -445,7 +446,13 @@ func New(ctx context.Context, cfg *config.Config, kubeClientset kubernetes.Inter return nil, errors.Wrapf(err, "Failed to create Controller.") } - workflowExecutor, err := workflow.NewExecutor(ctx, store, controller.enqueueWorkflowForNodeUpdates, eventSink, controller.recorder, cfg.MetadataPrefix, nodeExecutor, &cfg.EventConfig, cfg.ClusterID, scope) + activeExecutions, err := workflowstore.NewExecutionStatsHolder() + if err != nil { + return nil, err + } + controller.executionStats = workflowstore.NewExecutionStatsMonitor(scope.NewSubScope("execstats"), flyteworkflowInformer.Lister(), activeExecutions) + + workflowExecutor, err := workflow.NewExecutor(ctx, store, controller.enqueueWorkflowForNodeUpdates, eventSink, controller.recorder, cfg.MetadataPrefix, nodeExecutor, &cfg.EventConfig, cfg.ClusterID, scope, activeExecutions) if err != nil { return nil, err } diff --git a/flytepropeller/pkg/controller/executors/execution_context.go b/flytepropeller/pkg/controller/executors/execution_context.go index ec182ab3cd..84799a0400 100644 --- a/flytepropeller/pkg/controller/executors/execution_context.go +++ b/flytepropeller/pkg/controller/executors/execution_context.go @@ -33,6 +33,10 @@ type ImmutableParentInfo interface { type ControlFlow interface { CurrentParallelism() uint32 IncrementParallelism() uint32 + CurrentNodeExecutionCount() uint32 + IncrementNodeExecutionCount() uint32 + CurrentTaskExecutionCount() uint32 + IncrementTaskExecutionCount() uint32 } type ExecutionContext interface { @@ -71,16 +75,36 @@ func (p *parentExecutionInfo) CurrentAttempt() uint32 { type controlFlow struct { // We could use atomic.Uint32, but this is not required for current Propeller. As every round is run in a single // thread and using atomic will introduce memory barriers - v uint32 + parallelism uint32 + nodeExecutionCount uint32 + taskExecutionCount uint32 } func (c *controlFlow) CurrentParallelism() uint32 { - return c.v + return c.parallelism } func (c *controlFlow) IncrementParallelism() uint32 { - c.v = c.v + 1 - return c.v + c.parallelism = c.parallelism + 1 + return c.parallelism +} + +func (c *controlFlow) CurrentNodeExecutionCount() uint32 { + return c.nodeExecutionCount +} + +func (c *controlFlow) IncrementNodeExecutionCount() uint32 { + c.nodeExecutionCount++ + return c.nodeExecutionCount +} + +func (c *controlFlow) CurrentTaskExecutionCount() uint32 { + return c.taskExecutionCount +} + +func (c *controlFlow) IncrementTaskExecutionCount() uint32 { + c.taskExecutionCount++ + return c.taskExecutionCount } func NewExecutionContextWithTasksGetter(prevExecContext ExecutionContext, taskGetter TaskDetailsGetter) ExecutionContext { @@ -114,6 +138,8 @@ func NewParentInfo(uniqueID string, currentAttempts uint32) ImmutableParentInfo func InitializeControlFlow() ControlFlow { return &controlFlow{ - v: 0, + parallelism: 0, + nodeExecutionCount: 0, + taskExecutionCount: 0, } } diff --git a/flytepropeller/pkg/controller/executors/mocks/execution_context.go b/flytepropeller/pkg/controller/executors/mocks/execution_context.go index 1f551a7be1..cf9f4bcb49 100644 --- a/flytepropeller/pkg/controller/executors/mocks/execution_context.go +++ b/flytepropeller/pkg/controller/executors/mocks/execution_context.go @@ -20,6 +20,38 @@ type ExecutionContext struct { mock.Mock } +type ExecutionContext_CurrentNodeExecutionCount struct { + *mock.Call +} + +func (_m ExecutionContext_CurrentNodeExecutionCount) Return(_a0 uint32) *ExecutionContext_CurrentNodeExecutionCount { + return &ExecutionContext_CurrentNodeExecutionCount{Call: _m.Call.Return(_a0)} +} + +func (_m *ExecutionContext) OnCurrentNodeExecutionCount() *ExecutionContext_CurrentNodeExecutionCount { + c_call := _m.On("CurrentNodeExecutionCount") + return &ExecutionContext_CurrentNodeExecutionCount{Call: c_call} +} + +func (_m *ExecutionContext) OnCurrentNodeExecutionCountMatch(matchers ...interface{}) *ExecutionContext_CurrentNodeExecutionCount { + c_call := _m.On("CurrentNodeExecutionCount", matchers...) + return &ExecutionContext_CurrentNodeExecutionCount{Call: c_call} +} + +// CurrentNodeExecutionCount provides a mock function with given fields: +func (_m *ExecutionContext) CurrentNodeExecutionCount() uint32 { + ret := _m.Called() + + var r0 uint32 + if rf, ok := ret.Get(0).(func() uint32); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint32) + } + + return r0 +} + type ExecutionContext_CurrentParallelism struct { *mock.Call } @@ -52,6 +84,38 @@ func (_m *ExecutionContext) CurrentParallelism() uint32 { return r0 } +type ExecutionContext_CurrentTaskExecutionCount struct { + *mock.Call +} + +func (_m ExecutionContext_CurrentTaskExecutionCount) Return(_a0 uint32) *ExecutionContext_CurrentTaskExecutionCount { + return &ExecutionContext_CurrentTaskExecutionCount{Call: _m.Call.Return(_a0)} +} + +func (_m *ExecutionContext) OnCurrentTaskExecutionCount() *ExecutionContext_CurrentTaskExecutionCount { + c_call := _m.On("CurrentTaskExecutionCount") + return &ExecutionContext_CurrentTaskExecutionCount{Call: c_call} +} + +func (_m *ExecutionContext) OnCurrentTaskExecutionCountMatch(matchers ...interface{}) *ExecutionContext_CurrentTaskExecutionCount { + c_call := _m.On("CurrentTaskExecutionCount", matchers...) + return &ExecutionContext_CurrentTaskExecutionCount{Call: c_call} +} + +// CurrentTaskExecutionCount provides a mock function with given fields: +func (_m *ExecutionContext) CurrentTaskExecutionCount() uint32 { + ret := _m.Called() + + var r0 uint32 + if rf, ok := ret.Get(0).(func() uint32); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint32) + } + + return r0 +} + type ExecutionContext_FindSubWorkflow struct { *mock.Call } @@ -677,6 +741,38 @@ func (_m *ExecutionContext) GetTask(id string) (v1alpha1.ExecutableTask, error) return r0, r1 } +type ExecutionContext_IncrementNodeExecutionCount struct { + *mock.Call +} + +func (_m ExecutionContext_IncrementNodeExecutionCount) Return(_a0 uint32) *ExecutionContext_IncrementNodeExecutionCount { + return &ExecutionContext_IncrementNodeExecutionCount{Call: _m.Call.Return(_a0)} +} + +func (_m *ExecutionContext) OnIncrementNodeExecutionCount() *ExecutionContext_IncrementNodeExecutionCount { + c_call := _m.On("IncrementNodeExecutionCount") + return &ExecutionContext_IncrementNodeExecutionCount{Call: c_call} +} + +func (_m *ExecutionContext) OnIncrementNodeExecutionCountMatch(matchers ...interface{}) *ExecutionContext_IncrementNodeExecutionCount { + c_call := _m.On("IncrementNodeExecutionCount", matchers...) + return &ExecutionContext_IncrementNodeExecutionCount{Call: c_call} +} + +// IncrementNodeExecutionCount provides a mock function with given fields: +func (_m *ExecutionContext) IncrementNodeExecutionCount() uint32 { + ret := _m.Called() + + var r0 uint32 + if rf, ok := ret.Get(0).(func() uint32); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint32) + } + + return r0 +} + type ExecutionContext_IncrementParallelism struct { *mock.Call } @@ -709,6 +805,38 @@ func (_m *ExecutionContext) IncrementParallelism() uint32 { return r0 } +type ExecutionContext_IncrementTaskExecutionCount struct { + *mock.Call +} + +func (_m ExecutionContext_IncrementTaskExecutionCount) Return(_a0 uint32) *ExecutionContext_IncrementTaskExecutionCount { + return &ExecutionContext_IncrementTaskExecutionCount{Call: _m.Call.Return(_a0)} +} + +func (_m *ExecutionContext) OnIncrementTaskExecutionCount() *ExecutionContext_IncrementTaskExecutionCount { + c_call := _m.On("IncrementTaskExecutionCount") + return &ExecutionContext_IncrementTaskExecutionCount{Call: c_call} +} + +func (_m *ExecutionContext) OnIncrementTaskExecutionCountMatch(matchers ...interface{}) *ExecutionContext_IncrementTaskExecutionCount { + c_call := _m.On("IncrementTaskExecutionCount", matchers...) + return &ExecutionContext_IncrementTaskExecutionCount{Call: c_call} +} + +// IncrementTaskExecutionCount provides a mock function with given fields: +func (_m *ExecutionContext) IncrementTaskExecutionCount() uint32 { + ret := _m.Called() + + var r0 uint32 + if rf, ok := ret.Get(0).(func() uint32); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint32) + } + + return r0 +} + type ExecutionContext_IsInterruptible struct { *mock.Call } diff --git a/flytepropeller/pkg/controller/nodes/array/handler_test.go b/flytepropeller/pkg/controller/nodes/array/handler_test.go index f0b91217e0..b36f3a5b62 100644 --- a/flytepropeller/pkg/controller/nodes/array/handler_test.go +++ b/flytepropeller/pkg/controller/nodes/array/handler_test.go @@ -120,6 +120,10 @@ func createNodeExecutionContext(dataStore *storage.DataStore, eventRecorder inte }, nil, ) + executionContext.OnIncrementNodeExecutionCount().Return(1) + executionContext.OnIncrementTaskExecutionCount().Return(1) + executionContext.OnCurrentNodeExecutionCount().Return(1) + executionContext.OnCurrentTaskExecutionCount().Return(1) nCtx.OnExecutionContext().Return(executionContext) // EventsRecorder diff --git a/flytepropeller/pkg/controller/nodes/executor.go b/flytepropeller/pkg/controller/nodes/executor.go index cf8c62cfad..b3b63cc448 100644 --- a/flytepropeller/pkg/controller/nodes/executor.go +++ b/flytepropeller/pkg/controller/nodes/executor.go @@ -182,6 +182,15 @@ func (c *recursiveNodeExecutor) RecursiveNodeHandler(ctx context.Context, execCo nodeStatus := nl.GetNodeExecutionStatus(ctx, currentNode.GetID()) nodePhase := nodeStatus.GetPhase() + if nodePhase == v1alpha1.NodePhaseRunning && execContext != nil { + execContext.IncrementNodeExecutionCount() + if currentNode.GetKind() == v1alpha1.NodeKindTask { + execContext.IncrementTaskExecutionCount() + } + logger.Debugf(currentNodeCtx, "recursive handler - node execution count [%v], task execution count [%v], phase [%v], ", + execContext.CurrentNodeExecutionCount(), execContext.CurrentTaskExecutionCount(), nodePhase.String()) + } + if canHandleNode(nodePhase) { // TODO Follow up Pull Request, // 1. Rename this method to DAGTraversalHandleNode (accepts a DAGStructure along-with) the remaining arguments @@ -287,6 +296,7 @@ func (c *recursiveNodeExecutor) handleDownstream(ctx context.Context, execContex }), nil } + logger.Debugf(ctx, "downstream handler starting node id %v, ", downstreamNode.GetID()) state, err := c.RecursiveNodeHandler(ctx, execContext, dag, nl, downstreamNode) if err != nil { return interfaces.NodeStatusUndefined, err diff --git a/flytepropeller/pkg/controller/workflow/executor.go b/flytepropeller/pkg/controller/workflow/executor.go index 355681a746..c2f7a35ebe 100644 --- a/flytepropeller/pkg/controller/workflow/executor.go +++ b/flytepropeller/pkg/controller/workflow/executor.go @@ -17,6 +17,7 @@ import ( "github.com/flyteorg/flyte/flytepropeller/pkg/controller/executors" "github.com/flyteorg/flyte/flytepropeller/pkg/controller/nodes/interfaces" "github.com/flyteorg/flyte/flytepropeller/pkg/controller/workflow/errors" + "github.com/flyteorg/flyte/flytepropeller/pkg/controller/workflowstore" "github.com/flyteorg/flyte/flytepropeller/pkg/utils" "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flyte/flytestdlib/promutils" @@ -59,15 +60,16 @@ func StatusFailed(err *core.ExecutionError) Status { } type workflowExecutor struct { - enqueueWorkflow v1alpha1.EnqueueWorkflow - store *storage.DataStore - wfRecorder events.WorkflowEventRecorder - k8sRecorder record.EventRecorder - metadataPrefix storage.DataReference - nodeExecutor interfaces.Node - metrics *workflowMetrics - eventConfig *config.EventConfig - clusterID string + enqueueWorkflow v1alpha1.EnqueueWorkflow + store *storage.DataStore + wfRecorder events.WorkflowEventRecorder + k8sRecorder record.EventRecorder + metadataPrefix storage.DataReference + nodeExecutor interfaces.Node + metrics *workflowMetrics + eventConfig *config.EventConfig + clusterID string + activeExecutions *workflowstore.ExecutionStatsHolder } func (c *workflowExecutor) constructWorkflowMetadataPrefix(ctx context.Context, w *v1alpha1.FlyteWorkflow) (storage.DataReference, error) { @@ -135,6 +137,18 @@ func (c *workflowExecutor) handleReadyWorkflow(ctx context.Context, w *v1alpha1. return StatusRunning, nil } +func (c *workflowExecutor) updateExecutionStats(ctx context.Context, execcontext executors.ExecutionContext) { + execStats := workflowstore.SingleExecutionStats{ + ActiveNodeCount: execcontext.CurrentNodeExecutionCount(), + ActiveTaskCount: execcontext.CurrentTaskExecutionCount()} + logger.Debugf(ctx, "execution stats - execution count [%v], task execution count [%v], execution-id [%v], ", + execStats.ActiveNodeCount, execStats.ActiveTaskCount, execcontext.GetExecutionID()) + statErr := c.activeExecutions.AddOrUpdateEntry(execcontext.GetExecutionID().String(), execStats) + if statErr != nil { + logger.Errorf(ctx, "error updating active executions stats: %v", statErr) + } +} + func (c *workflowExecutor) handleRunningWorkflow(ctx context.Context, w *v1alpha1.FlyteWorkflow) (Status, error) { startNode := w.StartNode() if startNode == nil { @@ -144,10 +158,11 @@ func (c *workflowExecutor) handleRunningWorkflow(ctx context.Context, w *v1alpha Message: "Start node not found"}), nil } execcontext := executors.NewExecutionContext(w, w, w, nil, executors.InitializeControlFlow()) - state, err := c.nodeExecutor.RecursiveNodeHandler(ctx, execcontext, w, w, startNode) + state, handlerErr := c.nodeExecutor.RecursiveNodeHandler(ctx, execcontext, w, w, startNode) + c.updateExecutionStats(ctx, execcontext) - if err != nil { - return StatusRunning, err + if handlerErr != nil { + return StatusRunning, handlerErr } if state.HasFailed() { logger.Infof(ctx, "Workflow has failed. Error [%s]", state.Err.String()) @@ -175,9 +190,11 @@ func (c *workflowExecutor) handleFailureNode(ctx context.Context, w *v1alpha1.Fl failureNodeStatus := w.GetExecutionStatus().GetNodeExecutionStatus(ctx, failureNode.GetID()) failureNodeLookup := executors.NewFailureNodeLookup(w, failureNode, failureNodeStatus) - state, err := c.nodeExecutor.RecursiveNodeHandler(ctx, execcontext, failureNodeLookup, failureNodeLookup, failureNode) - if err != nil { - return StatusFailureNode(execErr), err + state, handlerErr := c.nodeExecutor.RecursiveNodeHandler(ctx, execcontext, failureNodeLookup, failureNodeLookup, failureNode) + c.updateExecutionStats(ctx, execcontext) + + if handlerErr != nil { + return StatusFailureNode(execErr), handlerErr } switch state.NodePhase { @@ -504,7 +521,7 @@ func (c *workflowExecutor) cleanupRunningNodes(ctx context.Context, w v1alpha1.E func NewExecutor(ctx context.Context, store *storage.DataStore, enQWorkflow v1alpha1.EnqueueWorkflow, eventSink events.EventSink, k8sEventRecorder record.EventRecorder, metadataPrefix string, nodeExecutor interfaces.Node, eventConfig *config.EventConfig, - clusterID string, scope promutils.Scope) (executors.Workflow, error) { + clusterID string, scope promutils.Scope, activeExecutions *workflowstore.ExecutionStatsHolder) (executors.Workflow, error) { basePrefix := store.GetBaseContainerFQN(ctx) if metadataPrefix != "" { var err error @@ -518,15 +535,16 @@ func NewExecutor(ctx context.Context, store *storage.DataStore, enQWorkflow v1al workflowScope := scope.NewSubScope("workflow") return &workflowExecutor{ - nodeExecutor: nodeExecutor, - store: store, - enqueueWorkflow: enQWorkflow, - wfRecorder: events.NewWorkflowEventRecorder(eventSink, workflowScope, store), - k8sRecorder: k8sEventRecorder, - metadataPrefix: basePrefix, - metrics: newMetrics(workflowScope), - eventConfig: eventConfig, - clusterID: clusterID, + nodeExecutor: nodeExecutor, + store: store, + enqueueWorkflow: enQWorkflow, + wfRecorder: events.NewWorkflowEventRecorder(eventSink, workflowScope, store), + k8sRecorder: k8sEventRecorder, + metadataPrefix: basePrefix, + metrics: newMetrics(workflowScope), + eventConfig: eventConfig, + clusterID: clusterID, + activeExecutions: activeExecutions, }, nil } diff --git a/flytepropeller/pkg/controller/workflow/executor_test.go b/flytepropeller/pkg/controller/workflow/executor_test.go index cc9910abc3..4050e41582 100644 --- a/flytepropeller/pkg/controller/workflow/executor_test.go +++ b/flytepropeller/pkg/controller/workflow/executor_test.go @@ -42,6 +42,7 @@ import ( "github.com/flyteorg/flyte/flytepropeller/pkg/controller/nodes/subworkflow/launchplan" "github.com/flyteorg/flyte/flytepropeller/pkg/controller/nodes/task/fakeplugins" wfErrors "github.com/flyteorg/flyte/flytepropeller/pkg/controller/workflow/errors" + execStats "github.com/flyteorg/flyte/flytepropeller/pkg/controller/workflowstore" "github.com/flyteorg/flyte/flytestdlib/contextutils" "github.com/flyteorg/flyte/flytestdlib/logger" "github.com/flyteorg/flyte/flytestdlib/promutils" @@ -248,7 +249,10 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_Error(t *testing.T) { nodeExec, err := nodes.NewExecutor(ctx, config.GetConfig().NodeConfig, store, enqueueWorkflow, eventSink, adminClient, adminClient, maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) assert.NoError(t, err) - executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "", nodeExec, eventConfig, testClusterID, promutils.NewTestScope()) + + execStatsHolder, err := execStats.NewExecutionStatsHolder() + assert.NoError(t, err) + executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "", nodeExec, eventConfig, testClusterID, promutils.NewTestScope(), execStatsHolder) assert.NoError(t, err) assert.NoError(t, executor.Initialize(ctx)) @@ -332,7 +336,9 @@ func TestWorkflowExecutor_HandleFlyteWorkflow(t *testing.T) { maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) assert.NoError(t, err) - executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "", nodeExec, eventConfig, testClusterID, promutils.NewTestScope()) + execStatsHolder, err := execStats.NewExecutionStatsHolder() + assert.NoError(t, err) + executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "", nodeExec, eventConfig, testClusterID, promutils.NewTestScope(), execStatsHolder) assert.NoError(t, err) assert.NoError(t, executor.Initialize(ctx)) @@ -396,7 +402,9 @@ func BenchmarkWorkflowExecutor(b *testing.B) { maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, scope) assert.NoError(b, err) - executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "", nodeExec, eventConfig, testClusterID, promutils.NewTestScope()) + execStatsHolder, err := execStats.NewExecutionStatsHolder() + assert.NoError(b, err) + executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "", nodeExec, eventConfig, testClusterID, promutils.NewTestScope(), execStatsHolder) assert.NoError(b, err) assert.NoError(b, executor.Initialize(ctx)) @@ -507,7 +515,10 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_Failing(t *testing.T) { nodeExec, err := nodes.NewExecutor(ctx, config.GetConfig().NodeConfig, store, enqueueWorkflow, eventSink, adminClient, adminClient, maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) assert.NoError(t, err) - executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "", nodeExec, eventConfig, testClusterID, promutils.NewTestScope()) + + execStatsHolder, err := execStats.NewExecutionStatsHolder() + assert.NoError(t, err) + executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "", nodeExec, eventConfig, testClusterID, promutils.NewTestScope(), execStatsHolder) assert.NoError(t, err) assert.NoError(t, executor.Initialize(ctx)) @@ -609,7 +620,9 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_Events(t *testing.T) { nodeExec, err := nodes.NewExecutor(ctx, config.GetConfig().NodeConfig, store, enqueueWorkflow, eventSink, adminClient, adminClient, maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) assert.NoError(t, err) - executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "metadata", nodeExec, eventConfig, testClusterID, promutils.NewTestScope()) + execStatsHolder, err := execStats.NewExecutionStatsHolder() + assert.NoError(t, err) + executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "metadata", nodeExec, eventConfig, testClusterID, promutils.NewTestScope(), execStatsHolder) assert.NoError(t, err) assert.NoError(t, executor.Initialize(ctx)) @@ -684,7 +697,9 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_EventFailure(t *testing.T) { Cause: errors.New("already exists"), } } - executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "metadata", nodeExec, eventConfig, testClusterID, promutils.NewTestScope()) + execStatsHolder, err := execStats.NewExecutionStatsHolder() + assert.NoError(t, err) + executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "metadata", nodeExec, eventConfig, testClusterID, promutils.NewTestScope(), execStatsHolder) assert.NoError(t, err) w := &v1alpha1.FlyteWorkflow{} assert.NoError(t, json.Unmarshal(wJSON, w)) @@ -703,7 +718,9 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_EventFailure(t *testing.T) { Cause: errors.New("already exists"), } } - executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "metadata", nodeExec, eventConfig, testClusterID, promutils.NewTestScope()) + execStatsHolder, err := execStats.NewExecutionStatsHolder() + assert.NoError(t, err) + executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "metadata", nodeExec, eventConfig, testClusterID, promutils.NewTestScope(), execStatsHolder) assert.NoError(t, err) w := &v1alpha1.FlyteWorkflow{} assert.NoError(t, json.Unmarshal(wJSON, w)) @@ -719,7 +736,9 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_EventFailure(t *testing.T) { Cause: errors.New("generic exists"), } } - executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "metadata", nodeExec, eventConfig, testClusterID, promutils.NewTestScope()) + execStatsHolder, err := execStats.NewExecutionStatsHolder() + assert.NoError(t, err) + executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "metadata", nodeExec, eventConfig, testClusterID, promutils.NewTestScope(), execStatsHolder) assert.NoError(t, err) w := &v1alpha1.FlyteWorkflow{} assert.NoError(t, json.Unmarshal(wJSON, w)) @@ -736,7 +755,9 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_EventFailure(t *testing.T) { Cause: errors.New("incompatible cluster"), } } - executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "metadata", nodeExec, eventConfig, testClusterID, promutils.NewTestScope()) + execStatsHolder, err := execStats.NewExecutionStatsHolder() + assert.NoError(t, err) + executor, err := NewExecutor(ctx, store, enqueueWorkflow, eventSink, recorder, "metadata", nodeExec, eventConfig, testClusterID, promutils.NewTestScope(), execStatsHolder) assert.NoError(t, err) w := &v1alpha1.FlyteWorkflow{} assert.NoError(t, json.Unmarshal(wJSON, w)) diff --git a/flytepropeller/pkg/controller/workflowstore/execution_stats.go b/flytepropeller/pkg/controller/workflowstore/execution_stats.go new file mode 100644 index 0000000000..e36ff6c578 --- /dev/null +++ b/flytepropeller/pkg/controller/workflowstore/execution_stats.go @@ -0,0 +1,170 @@ +package workflowstore + +import ( + "context" + "fmt" + "runtime/pprof" + "sync" + "time" + + "github.com/prometheus/client_golang/prometheus" + "k8s.io/apimachinery/pkg/labels" + + lister "github.com/flyteorg/flyte/flytepropeller/pkg/client/listers/flyteworkflow/v1alpha1" + "github.com/flyteorg/flyte/flytestdlib/contextutils" + "github.com/flyteorg/flyte/flytestdlib/logger" + "github.com/flyteorg/flyte/flytestdlib/promutils" +) + +const ( + resourceLevelExecutionStatsSyncDuration = 10 * time.Second +) + +type ExecutionStatsMonitor struct { + Scope promutils.Scope + + // Cached workflow list from the Informer + lister lister.FlyteWorkflowLister + + // Provides stats for the currently active executions + activeExecutions *ExecutionStatsHolder + + // These are currently aggregated values across all active workflows + ActiveNodeExecutions prometheus.Gauge + ActiveTaskExecutions prometheus.Gauge + ActiveWorkflowExecutions prometheus.Gauge +} + +func (e *ExecutionStatsMonitor) updateExecutionStats(ctx context.Context) { + // Convert the list of workflows to a map for faster lookups. + // Note that lister will exclude any workflows which are already marked terminated as the + // controller creates the informer with a label selector that excludes them - IgnoreCompletedWorkflowsLabelSelector() + workflows, err := e.lister.List(labels.Everything()) + if err != nil { + logger.Errorf(ctx, "Failed to list workflows while removing terminated executions, %v", err) + return + } + workflowSet := make(map[string]bool) + for _, wf := range workflows { + workflowSet[wf.GetExecutionID().String()] = true + } + + err = e.activeExecutions.RemoveTerminatedExecutions(ctx, workflowSet) + if err != nil { + logger.Errorf(ctx, "Error while removing terminated executions from stats: %v ", err) + } +} + +func (e *ExecutionStatsMonitor) emitExecutionStats(ctx context.Context) { + executions, nodes, tasks, err := e.activeExecutions.AggregateActiveValues() + if err != nil { + logger.Errorf(ctx, "Error aggregating active execution stats: %v", err) + } + logger.Debugf(ctx, "Execution stats: ActiveExecutions: %d ActiveNodes: %d, ActiveTasks: %d", executions, nodes, tasks) + e.ActiveNodeExecutions.Set(float64(nodes)) + e.ActiveTaskExecutions.Set(float64(tasks)) + e.ActiveWorkflowExecutions.Set(float64(executions)) +} + +func (e *ExecutionStatsMonitor) RunStatsMonitor(ctx context.Context) { + ticker := time.NewTicker(resourceLevelExecutionStatsSyncDuration) + execStatsCtx := contextutils.WithGoroutineLabel(ctx, "execution-stats-monitor") + + go func() { + pprof.SetGoroutineLabels(execStatsCtx) + for { + select { + case <-execStatsCtx.Done(): + return + case <-ticker.C: + e.updateExecutionStats(ctx) + e.emitExecutionStats(ctx) + } + } + }() +} + +func NewExecutionStatsMonitor(scope promutils.Scope, lister lister.FlyteWorkflowLister, activeExecutions *ExecutionStatsHolder) *ExecutionStatsMonitor { + return &ExecutionStatsMonitor{ + Scope: scope, + lister: lister, + activeExecutions: activeExecutions, + ActiveNodeExecutions: scope.MustNewGauge("active_node_executions", "active node executions for propeller"), + ActiveTaskExecutions: scope.MustNewGauge("active_task_executions", "active task executions for propeller"), + ActiveWorkflowExecutions: scope.MustNewGauge("active_workflow_executions", "active workflow executions for propeller"), + } +} + +// SingleExecutionStats holds stats about a single workflow execution, such as active node and task counts. +type SingleExecutionStats struct { + ActiveNodeCount uint32 + ActiveTaskCount uint32 +} + +// ExecutionStatsHolder manages a map of execution IDs to their ExecutionStats. +type ExecutionStatsHolder struct { + mu sync.Mutex // Guards access to the map + executions map[string]SingleExecutionStats +} + +// NewExecutionStatsHolder creates a new ExecutionStatsHolder instance with an initialized map. +func NewExecutionStatsHolder() (*ExecutionStatsHolder, error) { + return &ExecutionStatsHolder{ + executions: make(map[string]SingleExecutionStats), + }, nil +} + +// AddOrUpdateEntry adds or updates an entry in the executions map. +func (esh *ExecutionStatsHolder) AddOrUpdateEntry(executionID string, executionStats SingleExecutionStats) error { + if esh == nil || esh.executions == nil { + return fmt.Errorf("ExecutionStatsHolder is not initialized") + } + + esh.mu.Lock() + defer esh.mu.Unlock() + esh.executions[executionID] = executionStats + + return nil +} + +// Returns the aggregate of all active node and task counts in the map. +func (esh *ExecutionStatsHolder) AggregateActiveValues() (int, uint32, uint32, error) { + if esh == nil || esh.executions == nil { + return 0, 0, 0, fmt.Errorf("ActiveExecutions is not initialized") + } + + esh.mu.Lock() + defer esh.mu.Unlock() + + var sumNodes, sumTasks uint32 = 0, 0 + for _, stats := range esh.executions { + sumNodes += stats.ActiveNodeCount + sumTasks += stats.ActiveTaskCount + } + return len(esh.executions), sumNodes, sumTasks, nil +} + +func (esh *ExecutionStatsHolder) LogAllActiveExecutions(ctx context.Context) { + esh.mu.Lock() + defer esh.mu.Unlock() + + logger.Debugf(ctx, "Current Active Executions:") + for execID, stats := range esh.executions { + logger.Debugf(ctx, "ExecutionID: %s, ActiveNodeCount: %d, ActiveTaskCount: %d\n", execID, stats.ActiveNodeCount, stats.ActiveTaskCount) + } +} + +// RemoveTerminatedExecutions removes all terminated or deleted workflows from the executions map. +// This expects a set of strings for simplified lookup in the critical section. +func (esh *ExecutionStatsHolder) RemoveTerminatedExecutions(ctx context.Context, workflows map[string]bool) error { + // Acquire the mutex and remove all terminated or deleted workflows. + esh.mu.Lock() + defer esh.mu.Unlock() + for execID := range esh.executions { + if !workflows[execID] { + logger.Debugf(ctx, "Deleting active execution entry for execId: %s", execID) + delete(esh.executions, execID) + } + } + return nil +} diff --git a/flytepropeller/pkg/controller/workflowstore/execution_stats_test.go b/flytepropeller/pkg/controller/workflowstore/execution_stats_test.go new file mode 100644 index 0000000000..783e2ba688 --- /dev/null +++ b/flytepropeller/pkg/controller/workflowstore/execution_stats_test.go @@ -0,0 +1,119 @@ +package workflowstore + +import ( + "context" + "fmt" + "sync" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAddOrUpdateEntry(t *testing.T) { + esh, err := NewExecutionStatsHolder() + assert.NoError(t, err) + + err = esh.AddOrUpdateEntry("exec1", SingleExecutionStats{ActiveNodeCount: 5, ActiveTaskCount: 10}) + assert.NoError(t, err) + assert.Equal(t, 1, len(esh.executions)) + assert.Equal(t, uint32(5), esh.executions["exec1"].ActiveNodeCount) + assert.Equal(t, uint32(10), esh.executions["exec1"].ActiveTaskCount) +} + +func createDefaultExecutionStatsHolder() (*ExecutionStatsHolder, error) { + esh, err := NewExecutionStatsHolder() + if err != nil { + return nil, err + } + err = esh.AddOrUpdateEntry("exec1", SingleExecutionStats{ActiveNodeCount: 5, ActiveTaskCount: 10}) + if err != nil { + return nil, err + } + err = esh.AddOrUpdateEntry("exec2", SingleExecutionStats{ActiveNodeCount: 3, ActiveTaskCount: 6}) + if err != nil { + return nil, err + } + if err != nil { + return nil, err + } + return esh, nil +} + +func TestAggregateActiveValues(t *testing.T) { + esh, err := createDefaultExecutionStatsHolder() + assert.NoError(t, err) + + flows, nodes, tasks, err := esh.AggregateActiveValues() + assert.NoError(t, err) + assert.Equal(t, 2, flows) + assert.Equal(t, uint32(8), nodes) + assert.Equal(t, uint32(16), tasks) +} + +// Test removal on an empty ExecutionStatsHolder +func TestRemoveTerminatedExecutionsEmpty(t *testing.T) { + esh, err := NewExecutionStatsHolder() + assert.NoError(t, err) + + err = esh.RemoveTerminatedExecutions(context.TODO(), map[string]bool{}) + assert.NoError(t, err) + + err = esh.RemoveTerminatedExecutions(context.TODO(), map[string]bool{"exec1": true}) + assert.NoError(t, err) +} + +// Test removal of a subset of entries from ExcutionStatsHolder +func TestRemoveTerminatedExecutionsSubset(t *testing.T) { + esh, err := createDefaultExecutionStatsHolder() + assert.NoError(t, err) + + err = esh.RemoveTerminatedExecutions(context.TODO(), map[string]bool{"exec2": true}) + assert.NoError(t, err) + + assert.Equal(t, 1, len(esh.executions)) + assert.Equal(t, uint32(3), esh.executions["exec2"].ActiveNodeCount) + assert.Equal(t, uint32(6), esh.executions["exec2"].ActiveTaskCount) +} + +func TestConcurrentAccess(t *testing.T) { + esh, err := NewExecutionStatsHolder() + assert.NoError(t, err) + + var wg sync.WaitGroup + // Number of concurrent operations + concurrentOps := 100 + + // Concurrently add or update entries + for i := 0; i < concurrentOps; i++ { + wg.Add(1) + go func(id int) { + defer wg.Done() + execID := fmt.Sprintf("exec%d", id) + err := esh.AddOrUpdateEntry(execID, SingleExecutionStats{ActiveNodeCount: uint32(id), ActiveTaskCount: uint32(id * 2)}) + assert.NoError(t, err) + }(i) + } + + // Concurrently sum active values + for i := 0; i < concurrentOps/2; i++ { + wg.Add(1) + go func() { + defer wg.Done() + _, _, _, err := esh.AggregateActiveValues() + assert.NoError(t, err) + }() + } + + wg.Wait() + + // Remove all entries + err = esh.RemoveTerminatedExecutions(context.TODO(), map[string]bool{}) + assert.NoError(t, err) + + // After all operations, sum should be predictable as all entries should be deleted + flows, nodes, tasks, err := esh.AggregateActiveValues() + assert.NoError(t, err) + assert.Zero(t, flows) + assert.Zero(t, nodes) + assert.Zero(t, tasks) +} From f8d49923f6ac1e0bb31e125abafa0549b519f771 Mon Sep 17 00:00:00 2001 From: Paul Dittamo <37558497+pvditt@users.noreply.github.com> Date: Thu, 4 Apr 2024 05:40:23 -0700 Subject: [PATCH 402/645] [House keeping] include container statuses for all container exit errors (#5161) * include container statuses for all container exit errors Signed-off-by: Paul Dittamo * add unit test Signed-off-by: Paul Dittamo --------- Signed-off-by: Paul Dittamo --- .../pluginmachinery/flytek8s/pod_helper.go | 9 ++++++- .../flytek8s/pod_helper_test.go | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/flyteplugins/go/tasks/pluginmachinery/flytek8s/pod_helper.go b/flyteplugins/go/tasks/pluginmachinery/flytek8s/pod_helper.go index 7f010f6b7c..e25b3a4994 100644 --- a/flyteplugins/go/tasks/pluginmachinery/flytek8s/pod_helper.go +++ b/flyteplugins/go/tasks/pluginmachinery/flytek8s/pod_helper.go @@ -851,9 +851,11 @@ func DemystifyFailure(status v1.PodStatus, info pluginsCore.TaskInfo) (pluginsCo // } // } // + + var isSystemError bool // In some versions of GKE the reason can also be "Terminated" if code == "Shutdown" || code == "Terminated" { - return pluginsCore.PhaseInfoSystemRetryableFailure(Interrupted, message, &info), nil + isSystemError = true } // @@ -887,6 +889,11 @@ func DemystifyFailure(status v1.PodStatus, info pluginsCore.TaskInfo) (pluginsCo } } } + + if isSystemError { + return pluginsCore.PhaseInfoSystemRetryableFailure(Interrupted, message, &info), nil + } + return pluginsCore.PhaseInfoRetryableFailure(code, message, &info), nil } diff --git a/flyteplugins/go/tasks/pluginmachinery/flytek8s/pod_helper_test.go b/flyteplugins/go/tasks/pluginmachinery/flytek8s/pod_helper_test.go index 08b6c5b9d0..7869ed400f 100644 --- a/flyteplugins/go/tasks/pluginmachinery/flytek8s/pod_helper_test.go +++ b/flyteplugins/go/tasks/pluginmachinery/flytek8s/pod_helper_test.go @@ -1631,25 +1631,49 @@ func TestDemystifyFailure(t *testing.T) { }) t.Run("GKE kubelet graceful node shutdown", func(t *testing.T) { + containerReason := "some reason" phaseInfo, err := DemystifyFailure(v1.PodStatus{ Message: "Pod Node is in progress of shutting down, not admitting any new pods", Reason: "Shutdown", + ContainerStatuses: []v1.ContainerStatus{ + { + LastTerminationState: v1.ContainerState{ + Terminated: &v1.ContainerStateTerminated{ + Reason: containerReason, + ExitCode: SIGKILL, + }, + }, + }, + }, }, pluginsCore.TaskInfo{}) assert.Nil(t, err) assert.Equal(t, pluginsCore.PhaseRetryableFailure, phaseInfo.Phase()) assert.Equal(t, "Interrupted", phaseInfo.Err().Code) assert.Equal(t, core.ExecutionError_SYSTEM, phaseInfo.Err().Kind) + assert.Contains(t, phaseInfo.Err().Message, containerReason) }) t.Run("GKE kubelet graceful node shutdown", func(t *testing.T) { + containerReason := "some reason" phaseInfo, err := DemystifyFailure(v1.PodStatus{ Message: "Foobar", Reason: "Terminated", + ContainerStatuses: []v1.ContainerStatus{ + { + LastTerminationState: v1.ContainerState{ + Terminated: &v1.ContainerStateTerminated{ + Reason: containerReason, + ExitCode: SIGKILL, + }, + }, + }, + }, }, pluginsCore.TaskInfo{}) assert.Nil(t, err) assert.Equal(t, pluginsCore.PhaseRetryableFailure, phaseInfo.Phase()) assert.Equal(t, "Interrupted", phaseInfo.Err().Code) assert.Equal(t, core.ExecutionError_SYSTEM, phaseInfo.Err().Kind) + assert.Contains(t, phaseInfo.Err().Message, containerReason) }) } From e8a44b4f10ea67224da2248c51438fdb251aead4 Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 4 Apr 2024 18:21:01 +0200 Subject: [PATCH 403/645] docs: add missing key in auth guide (#5169) * docs(flyte-core): add missing key `adminServer` in authentication guide Signed-off-by: Julian Einhaus * docs(flyte-core): fix indentation for flyte-core with AzureAD authorization guide Signed-off-by: Julian Einhaus --------- Signed-off-by: Julian Einhaus --- docs/deployment/configuration/auth_setup.rst | 111 ++++++++++--------- 1 file changed, 57 insertions(+), 54 deletions(-) diff --git a/docs/deployment/configuration/auth_setup.rst b/docs/deployment/configuration/auth_setup.rst index 1131c30e98..d9a7f2c7eb 100644 --- a/docs/deployment/configuration/auth_setup.rst +++ b/docs/deployment/configuration/auth_setup.rst @@ -558,42 +558,43 @@ Follow the steps in this section to configure `flyteadmin` to use an external au .. code-block:: yaml configmap: - auth: - appAuth: + adminServer: + auth: + appAuth: - authServerType: External + authServerType: External - # 2. Optional: Set external auth server baseUrl if different from OpenId baseUrl. - externalAuthServer: - # baseUrl: https:///auth/realms/ # Uncomment for Keycloak and update with your installation host and realm name - # baseUrl: https://login.microsoftonline.com//oauth2/v2.0/authorize # Uncomment for Azure AD - # For Okta, use the Issuer URI of the custom auth server: - baseUrl: https://dev-.okta.com/oauth2/ + # 2. Optional: Set external auth server baseUrl if different from OpenId baseUrl. + externalAuthServer: + # baseUrl: https:///auth/realms/ # Uncomment for Keycloak and update with your installation host and realm name + # baseUrl: https://login.microsoftonline.com//oauth2/v2.0/authorize # Uncomment for Azure AD + # For Okta, use the Issuer URI of the custom auth server: + baseUrl: https://dev-.okta.com/oauth2/ - metadataUrl: .well-known/openid-configuration + metadataUrl: .well-known/openid-configuration - thirdPartyConfig: - flyteClient: - # 3. Replace with a new Native/Public Client ID provisioned in the custom authorization server. - clientId: flytectl - # This should not change - redirectUri: http://localhost:53593/callback - # 4. "all" is a required scope and must be configured in the custom authorization server. - scopes: - - offline - - all + thirdPartyConfig: + flyteClient: + # 3. Replace with a new Native/Public Client ID provisioned in the custom authorization server. + clientId: flytectl + # This should not change + redirectUri: http://localhost:53593/callback + # 4. "all" is a required scope and must be configured in the custom authorization server. + scopes: + - offline + - all - userAuth: - openId: - # baseUrl: https:///auth/realms/ # Uncomment for Keycloak and update with your installation host and realm name - # baseUrl: https://login.microsoftonline.com//oauth2/v2.0/authorize # Uncomment for Azure AD - # For Okta, use the Issuer URI of the custom auth server: - baseUrl: https://dev-.okta.com/oauth2/ - scopes: - - profile - - openid - # - offline_access # Uncomment if OIdC supports issuing refresh tokens. - clientId: + userAuth: + openId: + # baseUrl: https:///auth/realms/ # Uncomment for Keycloak and update with your installation host and realm name + # baseUrl: https://login.microsoftonline.com//oauth2/v2.0/authorize # Uncomment for Azure AD + # For Okta, use the Issuer URI of the custom auth server: + baseUrl: https://dev-.okta.com/oauth2/ + scopes: + - profile + - openid + # - offline_access # Uncomment if OIdC supports issuing refresh tokens. + clientId: secrets: @@ -616,14 +617,14 @@ Follow the steps in this section to configure `flyteadmin` to use an external au .. code-block:: yaml secrets: - adminOauthClientCredentials: - enabled: true - clientSecret: - clientId: + adminOauthClientCredentials: + enabled: true + clientSecret: + clientId: --- configmap: - admin: - admin: + admin: + admin: endpoint: insecure: true clientId: @@ -632,28 +633,30 @@ Follow the steps in this section to configure `flyteadmin` to use an external au - api:///.default useAudienceFromAdmin: true --- - auth: - appAuth: - authServerType: External - externalAuthServer: - baseUrl: https://login.microsoftonline.com//v2.0/ - metadataUrl: .well-known/openid-configuration - AllowedAudience: - - api:// - thirdPartyConfig: - flyteClient: + configmap: + adminServer: + auth: + appAuth: + authServerType: External + externalAuthServer: + baseUrl: https://login.microsoftonline.com//v2.0/ + metadataUrl: .well-known/openid-configuration + AllowedAudience: + - api:// + thirdPartyConfig: + flyteClient: clientId: redirectUri: http://localhost:53593/callback scopes: - api:/// - userAuth: - openId: - baseUrl: https://login.microsoftonline.com//v2.0 - scopes: - - openid - - profile - clientId: + userAuth: + openId: + baseUrl: https://login.microsoftonline.com//v2.0 + scopes: + - openid + - profile + clientId: .. note:: From 452538a2ed5cd3a0a300b8d5eab829454d9a07d5 Mon Sep 17 00:00:00 2001 From: Dan Rammer Date: Thu, 4 Apr 2024 14:20:43 -0500 Subject: [PATCH 404/645] shallow copying EnvironmentVariables map before modification (#5182) Signed-off-by: Daniel Rammer --- .../pkg/controller/nodes/array/execution_context.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/flytepropeller/pkg/controller/nodes/array/execution_context.go b/flytepropeller/pkg/controller/nodes/array/execution_context.go index 4fb5a8a214..9bd42c0b6b 100644 --- a/flytepropeller/pkg/controller/nodes/array/execution_context.go +++ b/flytepropeller/pkg/controller/nodes/array/execution_context.go @@ -23,11 +23,18 @@ func (a *arrayExecutionContext) GetExecutionConfig() v1alpha1.ExecutionConfig { func newArrayExecutionContext(executionContext executors.ExecutionContext, subNodeIndex int) *arrayExecutionContext { executionConfig := executionContext.GetExecutionConfig() - if executionConfig.EnvironmentVariables == nil { - executionConfig.EnvironmentVariables = make(map[string]string) + + // since maps are all reference types in golang if we are going to modify the + // EnvironmentVariables for each subNode we need to at least shallow copy the map to ensure + // there are no concurrent modifications during parallelized evaluation of subNodes + environmentVariables := executionConfig.EnvironmentVariables + executionConfig.EnvironmentVariables = make(map[string]string) + for key, value := range environmentVariables { + executionConfig.EnvironmentVariables[key] = value } executionConfig.EnvironmentVariables[JobIndexVarName] = FlyteK8sArrayIndexVarName executionConfig.EnvironmentVariables[FlyteK8sArrayIndexVarName] = strconv.Itoa(subNodeIndex) + executionConfig.MaxParallelism = 0 // hardcoded to 0 because parallelism is handled by the array node return &arrayExecutionContext{ From 24a6e4e5a8e554979160259d67c934464f4c7eb7 Mon Sep 17 00:00:00 2001 From: Paul Dittamo <37558497+pvditt@users.noreply.github.com> Date: Thu, 4 Apr 2024 16:02:26 -0700 Subject: [PATCH 405/645] Feature/array node workflow parallelism (#5062) * update arraynode proto parallelism field to varint compatible int64 Signed-off-by: Paul Dittamo * have array nodes utilize workflow parallelism Signed-off-by: Paul Dittamo * return if available parallelism is 0 Signed-off-by: Paul Dittamo * unit test Signed-off-by: Paul Dittamo --------- Signed-off-by: Paul Dittamo --- flyteidl/clients/go/assets/admin.swagger.json | 2 +- .../gen/pb-es/flyteidl/core/workflow_pb.ts | 8 +- .../gen/pb-go/flyteidl/core/workflow.pb.go | 6 +- .../flyteidl/service/admin.swagger.json | 2 +- flyteidl/gen/pb-js/flyteidl.d.ts | 4 +- flyteidl/gen/pb-js/flyteidl.js | 14 +-- .../pb_python/flyteidl/core/workflow_pb2.py | 2 +- flyteidl/gen/pb_rust/flyteidl.core.rs | 4 +- flyteidl/protos/flyteidl/core/workflow.proto | 2 +- .../pkg/apis/flyteworkflow/v1alpha1/array.go | 4 +- .../apis/flyteworkflow/v1alpha1/array_test.go | 2 +- .../pkg/apis/flyteworkflow/v1alpha1/iface.go | 2 +- .../v1alpha1/mocks/ExecutableArrayNode.go | 10 +- .../pkg/controller/nodes/array/handler.go | 32 +++++-- .../controller/nodes/array/handler_test.go | 92 ++++++++++++++++--- 15 files changed, 136 insertions(+), 50 deletions(-) diff --git a/flyteidl/clients/go/assets/admin.swagger.json b/flyteidl/clients/go/assets/admin.swagger.json index bcaf46928b..9273a46776 100644 --- a/flyteidl/clients/go/assets/admin.swagger.json +++ b/flyteidl/clients/go/assets/admin.swagger.json @@ -6483,7 +6483,7 @@ "description": "node is the sub-node that will be executed for each element in the array." }, "parallelism": { - "type": "integer", + "type": "string", "format": "int64", "description": "parallelism defines the minimum number of instances to bring up concurrently at any given\npoint. Note that this is an optimistic restriction and that, due to network partitioning or\nother failures, the actual number of currently running instances might be more. This has to\nbe a positive number if assigned. Default value is size." }, diff --git a/flyteidl/gen/pb-es/flyteidl/core/workflow_pb.ts b/flyteidl/gen/pb-es/flyteidl/core/workflow_pb.ts index 414e6eb319..9efdcf91dd 100644 --- a/flyteidl/gen/pb-es/flyteidl/core/workflow_pb.ts +++ b/flyteidl/gen/pb-es/flyteidl/core/workflow_pb.ts @@ -4,7 +4,7 @@ // @ts-nocheck import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Duration, Message, proto3 } from "@bufbuild/protobuf"; +import { Duration, Message, proto3, protoInt64 } from "@bufbuild/protobuf"; import { BooleanExpression } from "./condition_pb.js"; import { Error, LiteralType } from "./types_pb.js"; import { Identifier } from "./identifier_pb.js"; @@ -512,9 +512,9 @@ export class ArrayNode extends Message { * other failures, the actual number of currently running instances might be more. This has to * be a positive number if assigned. Default value is size. * - * @generated from field: uint32 parallelism = 2; + * @generated from field: int64 parallelism = 2; */ - parallelism = 0; + parallelism = protoInt64.zero; /** * @generated from oneof flyteidl.core.ArrayNode.success_criteria @@ -550,7 +550,7 @@ export class ArrayNode extends Message { static readonly typeName = "flyteidl.core.ArrayNode"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "node", kind: "message", T: Node }, - { no: 2, name: "parallelism", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 2, name: "parallelism", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, { no: 3, name: "min_successes", kind: "scalar", T: 13 /* ScalarType.UINT32 */, oneof: "success_criteria" }, { no: 4, name: "min_success_ratio", kind: "scalar", T: 2 /* ScalarType.FLOAT */, oneof: "success_criteria" }, ]); diff --git a/flyteidl/gen/pb-go/flyteidl/core/workflow.pb.go b/flyteidl/gen/pb-go/flyteidl/core/workflow.pb.go index 8b6cc6ab1d..983bbdcf43 100644 --- a/flyteidl/gen/pb-go/flyteidl/core/workflow.pb.go +++ b/flyteidl/gen/pb-go/flyteidl/core/workflow.pb.go @@ -727,7 +727,7 @@ type ArrayNode struct { // point. Note that this is an optimistic restriction and that, due to network partitioning or // other failures, the actual number of currently running instances might be more. This has to // be a positive number if assigned. Default value is size. - Parallelism uint32 `protobuf:"varint,2,opt,name=parallelism,proto3" json:"parallelism,omitempty"` + Parallelism int64 `protobuf:"varint,2,opt,name=parallelism,proto3" json:"parallelism,omitempty"` // Types that are assignable to SuccessCriteria: // // *ArrayNode_MinSuccesses @@ -774,7 +774,7 @@ func (x *ArrayNode) GetNode() *Node { return nil } -func (x *ArrayNode) GetParallelism() uint32 { +func (x *ArrayNode) GetParallelism() int64 { if x != nil { return x.Parallelism } @@ -1724,7 +1724,7 @@ var file_flyteidl_core_workflow_proto_rawDesc = []byte{ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, - 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, + 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x25, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x6d, diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json index bcaf46928b..9273a46776 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json @@ -6483,7 +6483,7 @@ "description": "node is the sub-node that will be executed for each element in the array." }, "parallelism": { - "type": "integer", + "type": "string", "format": "int64", "description": "parallelism defines the minimum number of instances to bring up concurrently at any given\npoint. Note that this is an optimistic restriction and that, due to network partitioning or\nother failures, the actual number of currently running instances might be more. This has to\nbe a positive number if assigned. Default value is size." }, diff --git a/flyteidl/gen/pb-js/flyteidl.d.ts b/flyteidl/gen/pb-js/flyteidl.d.ts index e61fbc7acb..0126d892f2 100644 --- a/flyteidl/gen/pb-js/flyteidl.d.ts +++ b/flyteidl/gen/pb-js/flyteidl.d.ts @@ -4506,7 +4506,7 @@ export namespace flyteidl { node?: (flyteidl.core.INode|null); /** ArrayNode parallelism */ - parallelism?: (number|null); + parallelism?: (Long|null); /** ArrayNode minSuccesses */ minSuccesses?: (number|null); @@ -4528,7 +4528,7 @@ export namespace flyteidl { public node?: (flyteidl.core.INode|null); /** ArrayNode parallelism. */ - public parallelism: number; + public parallelism: Long; /** ArrayNode minSuccesses. */ public minSuccesses: number; diff --git a/flyteidl/gen/pb-js/flyteidl.js b/flyteidl/gen/pb-js/flyteidl.js index 0f1ffe6b40..e288f8e111 100644 --- a/flyteidl/gen/pb-js/flyteidl.js +++ b/flyteidl/gen/pb-js/flyteidl.js @@ -10808,7 +10808,7 @@ * @memberof flyteidl.core * @interface IArrayNode * @property {flyteidl.core.INode|null} [node] ArrayNode node - * @property {number|null} [parallelism] ArrayNode parallelism + * @property {Long|null} [parallelism] ArrayNode parallelism * @property {number|null} [minSuccesses] ArrayNode minSuccesses * @property {number|null} [minSuccessRatio] ArrayNode minSuccessRatio */ @@ -10838,11 +10838,11 @@ /** * ArrayNode parallelism. - * @member {number} parallelism + * @member {Long} parallelism * @memberof flyteidl.core.ArrayNode * @instance */ - ArrayNode.prototype.parallelism = 0; + ArrayNode.prototype.parallelism = $util.Long ? $util.Long.fromBits(0,0,false) : 0; /** * ArrayNode minSuccesses. @@ -10901,7 +10901,7 @@ if (message.node != null && message.hasOwnProperty("node")) $root.flyteidl.core.Node.encode(message.node, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.parallelism != null && message.hasOwnProperty("parallelism")) - writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.parallelism); + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.parallelism); if (message.minSuccesses != null && message.hasOwnProperty("minSuccesses")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.minSuccesses); if (message.minSuccessRatio != null && message.hasOwnProperty("minSuccessRatio")) @@ -10931,7 +10931,7 @@ message.node = $root.flyteidl.core.Node.decode(reader, reader.uint32()); break; case 2: - message.parallelism = reader.uint32(); + message.parallelism = reader.int64(); break; case 3: message.minSuccesses = reader.uint32(); @@ -10965,8 +10965,8 @@ return "node." + error; } if (message.parallelism != null && message.hasOwnProperty("parallelism")) - if (!$util.isInteger(message.parallelism)) - return "parallelism: integer expected"; + if (!$util.isInteger(message.parallelism) && !(message.parallelism && $util.isInteger(message.parallelism.low) && $util.isInteger(message.parallelism.high))) + return "parallelism: integer|Long expected"; if (message.minSuccesses != null && message.hasOwnProperty("minSuccesses")) { properties.successCriteria = 1; if (!$util.isInteger(message.minSuccesses)) diff --git a/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.py b/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.py index 4c07024320..452c38c9c9 100644 --- a/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.py +++ b/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.py @@ -22,7 +22,7 @@ from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lyteidl/core/workflow.proto\x12\rflyteidl.core\x1a\x1d\x66lyteidl/core/condition.proto\x1a\x1d\x66lyteidl/core/execution.proto\x1a\x1e\x66lyteidl/core/identifier.proto\x1a\x1d\x66lyteidl/core/interface.proto\x1a\x1c\x66lyteidl/core/literals.proto\x1a\x19\x66lyteidl/core/tasks.proto\x1a\x19\x66lyteidl/core/types.proto\x1a\x1c\x66lyteidl/core/security.proto\x1a\x1egoogle/protobuf/duration.proto\"{\n\x07IfBlock\x12>\n\tcondition\x18\x01 \x01(\x0b\x32 .flyteidl.core.BooleanExpressionR\tcondition\x12\x30\n\tthen_node\x18\x02 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x08thenNode\"\xd4\x01\n\x0bIfElseBlock\x12*\n\x04\x63\x61se\x18\x01 \x01(\x0b\x32\x16.flyteidl.core.IfBlockR\x04\x63\x61se\x12,\n\x05other\x18\x02 \x03(\x0b\x32\x16.flyteidl.core.IfBlockR\x05other\x12\x32\n\telse_node\x18\x03 \x01(\x0b\x32\x13.flyteidl.core.NodeH\x00R\x08\x65lseNode\x12,\n\x05\x65rror\x18\x04 \x01(\x0b\x32\x14.flyteidl.core.ErrorH\x00R\x05\x65rrorB\t\n\x07\x64\x65\x66\x61ult\"A\n\nBranchNode\x12\x33\n\x07if_else\x18\x01 \x01(\x0b\x32\x1a.flyteidl.core.IfElseBlockR\x06ifElse\"\x97\x01\n\x08TaskNode\x12>\n\x0creference_id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\x0breferenceId\x12>\n\toverrides\x18\x02 \x01(\x0b\x32 .flyteidl.core.TaskNodeOverridesR\toverridesB\x0b\n\treference\"\xa6\x01\n\x0cWorkflowNode\x12\x42\n\x0elaunchplan_ref\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\rlaunchplanRef\x12\x45\n\x10sub_workflow_ref\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\x0esubWorkflowRefB\x0b\n\treference\"/\n\x10\x41pproveCondition\x12\x1b\n\tsignal_id\x18\x01 \x01(\tR\x08signalId\"\x90\x01\n\x0fSignalCondition\x12\x1b\n\tsignal_id\x18\x01 \x01(\tR\x08signalId\x12.\n\x04type\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x04type\x12\x30\n\x14output_variable_name\x18\x03 \x01(\tR\x12outputVariableName\"G\n\x0eSleepCondition\x12\x35\n\x08\x64uration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\"\xc5\x01\n\x08GateNode\x12;\n\x07\x61pprove\x18\x01 \x01(\x0b\x32\x1f.flyteidl.core.ApproveConditionH\x00R\x07\x61pprove\x12\x38\n\x06signal\x18\x02 \x01(\x0b\x32\x1e.flyteidl.core.SignalConditionH\x00R\x06signal\x12\x35\n\x05sleep\x18\x03 \x01(\x0b\x32\x1d.flyteidl.core.SleepConditionH\x00R\x05sleepB\x0b\n\tcondition\"\xbf\x01\n\tArrayNode\x12\'\n\x04node\x18\x01 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x04node\x12 \n\x0bparallelism\x18\x02 \x01(\rR\x0bparallelism\x12%\n\rmin_successes\x18\x03 \x01(\rH\x00R\x0cminSuccesses\x12,\n\x11min_success_ratio\x18\x04 \x01(\x02H\x00R\x0fminSuccessRatioB\x12\n\x10success_criteria\"\x8c\x03\n\x0cNodeMetadata\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x33\n\x07timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationR\x07timeout\x12\x36\n\x07retries\x18\x05 \x01(\x0b\x32\x1c.flyteidl.core.RetryStrategyR\x07retries\x12&\n\rinterruptible\x18\x06 \x01(\x08H\x00R\rinterruptible\x12\x1e\n\tcacheable\x18\x07 \x01(\x08H\x01R\tcacheable\x12%\n\rcache_version\x18\x08 \x01(\tH\x02R\x0c\x63\x61\x63heVersion\x12/\n\x12\x63\x61\x63he_serializable\x18\t \x01(\x08H\x03R\x11\x63\x61\x63heSerializableB\x15\n\x13interruptible_valueB\x11\n\x0f\x63\x61\x63heable_valueB\x15\n\x13\x63\x61\x63he_version_valueB\x1a\n\x18\x63\x61\x63he_serializable_value\"/\n\x05\x41lias\x12\x10\n\x03var\x18\x01 \x01(\tR\x03var\x12\x14\n\x05\x61lias\x18\x02 \x01(\tR\x05\x61lias\"\x9f\x04\n\x04Node\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x37\n\x08metadata\x18\x02 \x01(\x0b\x32\x1b.flyteidl.core.NodeMetadataR\x08metadata\x12.\n\x06inputs\x18\x03 \x03(\x0b\x32\x16.flyteidl.core.BindingR\x06inputs\x12*\n\x11upstream_node_ids\x18\x04 \x03(\tR\x0fupstreamNodeIds\x12;\n\x0eoutput_aliases\x18\x05 \x03(\x0b\x32\x14.flyteidl.core.AliasR\routputAliases\x12\x36\n\ttask_node\x18\x06 \x01(\x0b\x32\x17.flyteidl.core.TaskNodeH\x00R\x08taskNode\x12\x42\n\rworkflow_node\x18\x07 \x01(\x0b\x32\x1b.flyteidl.core.WorkflowNodeH\x00R\x0cworkflowNode\x12<\n\x0b\x62ranch_node\x18\x08 \x01(\x0b\x32\x19.flyteidl.core.BranchNodeH\x00R\nbranchNode\x12\x36\n\tgate_node\x18\t \x01(\x0b\x32\x17.flyteidl.core.GateNodeH\x00R\x08gateNode\x12\x39\n\narray_node\x18\n \x01(\x0b\x32\x18.flyteidl.core.ArrayNodeH\x00R\tarrayNodeB\x08\n\x06target\"\xfc\x02\n\x10WorkflowMetadata\x12M\n\x12quality_of_service\x18\x01 \x01(\x0b\x32\x1f.flyteidl.core.QualityOfServiceR\x10qualityOfService\x12N\n\non_failure\x18\x02 \x01(\x0e\x32/.flyteidl.core.WorkflowMetadata.OnFailurePolicyR\tonFailure\x12=\n\x04tags\x18\x03 \x03(\x0b\x32).flyteidl.core.WorkflowMetadata.TagsEntryR\x04tags\x1a\x37\n\tTagsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"Q\n\x0fOnFailurePolicy\x12\x14\n\x10\x46\x41IL_IMMEDIATELY\x10\x00\x12(\n$FAIL_AFTER_EXECUTABLE_NODES_COMPLETE\x10\x01\"@\n\x18WorkflowMetadataDefaults\x12$\n\rinterruptible\x18\x01 \x01(\x08R\rinterruptible\"\xa2\x03\n\x10WorkflowTemplate\x12)\n\x02id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierR\x02id\x12;\n\x08metadata\x18\x02 \x01(\x0b\x32\x1f.flyteidl.core.WorkflowMetadataR\x08metadata\x12;\n\tinterface\x18\x03 \x01(\x0b\x32\x1d.flyteidl.core.TypedInterfaceR\tinterface\x12)\n\x05nodes\x18\x04 \x03(\x0b\x32\x13.flyteidl.core.NodeR\x05nodes\x12\x30\n\x07outputs\x18\x05 \x03(\x0b\x32\x16.flyteidl.core.BindingR\x07outputs\x12\x36\n\x0c\x66\x61ilure_node\x18\x06 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x0b\x66\x61ilureNode\x12T\n\x11metadata_defaults\x18\x07 \x01(\x0b\x32\'.flyteidl.core.WorkflowMetadataDefaultsR\x10metadataDefaults\"\xc5\x01\n\x11TaskNodeOverrides\x12\x36\n\tresources\x18\x01 \x01(\x0b\x32\x18.flyteidl.core.ResourcesR\tresources\x12O\n\x12\x65xtended_resources\x18\x02 \x01(\x0b\x32 .flyteidl.core.ExtendedResourcesR\x11\x65xtendedResources\x12\'\n\x0f\x63ontainer_image\x18\x03 \x01(\tR\x0e\x63ontainerImage\"\xba\x01\n\x12LaunchPlanTemplate\x12)\n\x02id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierR\x02id\x12;\n\tinterface\x18\x02 \x01(\x0b\x32\x1d.flyteidl.core.TypedInterfaceR\tinterface\x12<\n\x0c\x66ixed_inputs\x18\x03 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapR\x0b\x66ixedInputsB\xb3\x01\n\x11\x63om.flyteidl.coreB\rWorkflowProtoP\x01Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\xa2\x02\x03\x46\x43X\xaa\x02\rFlyteidl.Core\xca\x02\rFlyteidl\\Core\xe2\x02\x19\x46lyteidl\\Core\\GPBMetadata\xea\x02\x0e\x46lyteidl::Coreb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lyteidl/core/workflow.proto\x12\rflyteidl.core\x1a\x1d\x66lyteidl/core/condition.proto\x1a\x1d\x66lyteidl/core/execution.proto\x1a\x1e\x66lyteidl/core/identifier.proto\x1a\x1d\x66lyteidl/core/interface.proto\x1a\x1c\x66lyteidl/core/literals.proto\x1a\x19\x66lyteidl/core/tasks.proto\x1a\x19\x66lyteidl/core/types.proto\x1a\x1c\x66lyteidl/core/security.proto\x1a\x1egoogle/protobuf/duration.proto\"{\n\x07IfBlock\x12>\n\tcondition\x18\x01 \x01(\x0b\x32 .flyteidl.core.BooleanExpressionR\tcondition\x12\x30\n\tthen_node\x18\x02 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x08thenNode\"\xd4\x01\n\x0bIfElseBlock\x12*\n\x04\x63\x61se\x18\x01 \x01(\x0b\x32\x16.flyteidl.core.IfBlockR\x04\x63\x61se\x12,\n\x05other\x18\x02 \x03(\x0b\x32\x16.flyteidl.core.IfBlockR\x05other\x12\x32\n\telse_node\x18\x03 \x01(\x0b\x32\x13.flyteidl.core.NodeH\x00R\x08\x65lseNode\x12,\n\x05\x65rror\x18\x04 \x01(\x0b\x32\x14.flyteidl.core.ErrorH\x00R\x05\x65rrorB\t\n\x07\x64\x65\x66\x61ult\"A\n\nBranchNode\x12\x33\n\x07if_else\x18\x01 \x01(\x0b\x32\x1a.flyteidl.core.IfElseBlockR\x06ifElse\"\x97\x01\n\x08TaskNode\x12>\n\x0creference_id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\x0breferenceId\x12>\n\toverrides\x18\x02 \x01(\x0b\x32 .flyteidl.core.TaskNodeOverridesR\toverridesB\x0b\n\treference\"\xa6\x01\n\x0cWorkflowNode\x12\x42\n\x0elaunchplan_ref\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\rlaunchplanRef\x12\x45\n\x10sub_workflow_ref\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\x0esubWorkflowRefB\x0b\n\treference\"/\n\x10\x41pproveCondition\x12\x1b\n\tsignal_id\x18\x01 \x01(\tR\x08signalId\"\x90\x01\n\x0fSignalCondition\x12\x1b\n\tsignal_id\x18\x01 \x01(\tR\x08signalId\x12.\n\x04type\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x04type\x12\x30\n\x14output_variable_name\x18\x03 \x01(\tR\x12outputVariableName\"G\n\x0eSleepCondition\x12\x35\n\x08\x64uration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\"\xc5\x01\n\x08GateNode\x12;\n\x07\x61pprove\x18\x01 \x01(\x0b\x32\x1f.flyteidl.core.ApproveConditionH\x00R\x07\x61pprove\x12\x38\n\x06signal\x18\x02 \x01(\x0b\x32\x1e.flyteidl.core.SignalConditionH\x00R\x06signal\x12\x35\n\x05sleep\x18\x03 \x01(\x0b\x32\x1d.flyteidl.core.SleepConditionH\x00R\x05sleepB\x0b\n\tcondition\"\xbf\x01\n\tArrayNode\x12\'\n\x04node\x18\x01 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x04node\x12 \n\x0bparallelism\x18\x02 \x01(\x03R\x0bparallelism\x12%\n\rmin_successes\x18\x03 \x01(\rH\x00R\x0cminSuccesses\x12,\n\x11min_success_ratio\x18\x04 \x01(\x02H\x00R\x0fminSuccessRatioB\x12\n\x10success_criteria\"\x8c\x03\n\x0cNodeMetadata\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x33\n\x07timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationR\x07timeout\x12\x36\n\x07retries\x18\x05 \x01(\x0b\x32\x1c.flyteidl.core.RetryStrategyR\x07retries\x12&\n\rinterruptible\x18\x06 \x01(\x08H\x00R\rinterruptible\x12\x1e\n\tcacheable\x18\x07 \x01(\x08H\x01R\tcacheable\x12%\n\rcache_version\x18\x08 \x01(\tH\x02R\x0c\x63\x61\x63heVersion\x12/\n\x12\x63\x61\x63he_serializable\x18\t \x01(\x08H\x03R\x11\x63\x61\x63heSerializableB\x15\n\x13interruptible_valueB\x11\n\x0f\x63\x61\x63heable_valueB\x15\n\x13\x63\x61\x63he_version_valueB\x1a\n\x18\x63\x61\x63he_serializable_value\"/\n\x05\x41lias\x12\x10\n\x03var\x18\x01 \x01(\tR\x03var\x12\x14\n\x05\x61lias\x18\x02 \x01(\tR\x05\x61lias\"\x9f\x04\n\x04Node\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x37\n\x08metadata\x18\x02 \x01(\x0b\x32\x1b.flyteidl.core.NodeMetadataR\x08metadata\x12.\n\x06inputs\x18\x03 \x03(\x0b\x32\x16.flyteidl.core.BindingR\x06inputs\x12*\n\x11upstream_node_ids\x18\x04 \x03(\tR\x0fupstreamNodeIds\x12;\n\x0eoutput_aliases\x18\x05 \x03(\x0b\x32\x14.flyteidl.core.AliasR\routputAliases\x12\x36\n\ttask_node\x18\x06 \x01(\x0b\x32\x17.flyteidl.core.TaskNodeH\x00R\x08taskNode\x12\x42\n\rworkflow_node\x18\x07 \x01(\x0b\x32\x1b.flyteidl.core.WorkflowNodeH\x00R\x0cworkflowNode\x12<\n\x0b\x62ranch_node\x18\x08 \x01(\x0b\x32\x19.flyteidl.core.BranchNodeH\x00R\nbranchNode\x12\x36\n\tgate_node\x18\t \x01(\x0b\x32\x17.flyteidl.core.GateNodeH\x00R\x08gateNode\x12\x39\n\narray_node\x18\n \x01(\x0b\x32\x18.flyteidl.core.ArrayNodeH\x00R\tarrayNodeB\x08\n\x06target\"\xfc\x02\n\x10WorkflowMetadata\x12M\n\x12quality_of_service\x18\x01 \x01(\x0b\x32\x1f.flyteidl.core.QualityOfServiceR\x10qualityOfService\x12N\n\non_failure\x18\x02 \x01(\x0e\x32/.flyteidl.core.WorkflowMetadata.OnFailurePolicyR\tonFailure\x12=\n\x04tags\x18\x03 \x03(\x0b\x32).flyteidl.core.WorkflowMetadata.TagsEntryR\x04tags\x1a\x37\n\tTagsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"Q\n\x0fOnFailurePolicy\x12\x14\n\x10\x46\x41IL_IMMEDIATELY\x10\x00\x12(\n$FAIL_AFTER_EXECUTABLE_NODES_COMPLETE\x10\x01\"@\n\x18WorkflowMetadataDefaults\x12$\n\rinterruptible\x18\x01 \x01(\x08R\rinterruptible\"\xa2\x03\n\x10WorkflowTemplate\x12)\n\x02id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierR\x02id\x12;\n\x08metadata\x18\x02 \x01(\x0b\x32\x1f.flyteidl.core.WorkflowMetadataR\x08metadata\x12;\n\tinterface\x18\x03 \x01(\x0b\x32\x1d.flyteidl.core.TypedInterfaceR\tinterface\x12)\n\x05nodes\x18\x04 \x03(\x0b\x32\x13.flyteidl.core.NodeR\x05nodes\x12\x30\n\x07outputs\x18\x05 \x03(\x0b\x32\x16.flyteidl.core.BindingR\x07outputs\x12\x36\n\x0c\x66\x61ilure_node\x18\x06 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x0b\x66\x61ilureNode\x12T\n\x11metadata_defaults\x18\x07 \x01(\x0b\x32\'.flyteidl.core.WorkflowMetadataDefaultsR\x10metadataDefaults\"\xc5\x01\n\x11TaskNodeOverrides\x12\x36\n\tresources\x18\x01 \x01(\x0b\x32\x18.flyteidl.core.ResourcesR\tresources\x12O\n\x12\x65xtended_resources\x18\x02 \x01(\x0b\x32 .flyteidl.core.ExtendedResourcesR\x11\x65xtendedResources\x12\'\n\x0f\x63ontainer_image\x18\x03 \x01(\tR\x0e\x63ontainerImage\"\xba\x01\n\x12LaunchPlanTemplate\x12)\n\x02id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierR\x02id\x12;\n\tinterface\x18\x02 \x01(\x0b\x32\x1d.flyteidl.core.TypedInterfaceR\tinterface\x12<\n\x0c\x66ixed_inputs\x18\x03 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapR\x0b\x66ixedInputsB\xb3\x01\n\x11\x63om.flyteidl.coreB\rWorkflowProtoP\x01Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\xa2\x02\x03\x46\x43X\xaa\x02\rFlyteidl.Core\xca\x02\rFlyteidl\\Core\xe2\x02\x19\x46lyteidl\\Core\\GPBMetadata\xea\x02\x0e\x46lyteidl::Coreb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) diff --git a/flyteidl/gen/pb_rust/flyteidl.core.rs b/flyteidl/gen/pb_rust/flyteidl.core.rs index 280140c75d..6922855798 100644 --- a/flyteidl/gen/pb_rust/flyteidl.core.rs +++ b/flyteidl/gen/pb_rust/flyteidl.core.rs @@ -2401,8 +2401,8 @@ pub struct ArrayNode { /// point. Note that this is an optimistic restriction and that, due to network partitioning or /// other failures, the actual number of currently running instances might be more. This has to /// be a positive number if assigned. Default value is size. - #[prost(uint32, tag="2")] - pub parallelism: u32, + #[prost(int64, tag="2")] + pub parallelism: i64, #[prost(oneof="array_node::SuccessCriteria", tags="3, 4")] pub success_criteria: ::core::option::Option, } diff --git a/flyteidl/protos/flyteidl/core/workflow.proto b/flyteidl/protos/flyteidl/core/workflow.proto index dcbe9367f9..a305c8fad7 100644 --- a/flyteidl/protos/flyteidl/core/workflow.proto +++ b/flyteidl/protos/flyteidl/core/workflow.proto @@ -118,7 +118,7 @@ message ArrayNode { // point. Note that this is an optimistic restriction and that, due to network partitioning or // other failures, the actual number of currently running instances might be more. This has to // be a positive number if assigned. Default value is size. - uint32 parallelism = 2; + int64 parallelism = 2; oneof success_criteria { // min_successes is an absolute number of the minimum number of successful completions of diff --git a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array.go b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array.go index 6680e74106..9916f6a075 100644 --- a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array.go +++ b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array.go @@ -2,7 +2,7 @@ package v1alpha1 type ArrayNodeSpec struct { SubNodeSpec *NodeSpec - Parallelism uint32 + Parallelism int64 MinSuccesses *uint32 MinSuccessRatio *float32 } @@ -11,7 +11,7 @@ func (a *ArrayNodeSpec) GetSubNodeSpec() *NodeSpec { return a.SubNodeSpec } -func (a *ArrayNodeSpec) GetParallelism() uint32 { +func (a *ArrayNodeSpec) GetParallelism() int64 { return a.Parallelism } diff --git a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array_test.go b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array_test.go index 74ea26a428..c17051b6bd 100644 --- a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array_test.go +++ b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array_test.go @@ -16,7 +16,7 @@ func TestArrayNodeSpec_GetSubNodeSpec(t *testing.T) { } func TestArrayNodeSpec_GetParallelism(t *testing.T) { - parallelism := uint32(5) + parallelism := int64(5) arrayNodeSpec := ArrayNodeSpec{ Parallelism: parallelism, } diff --git a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/iface.go b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/iface.go index 664ebb6767..d6f07b856f 100644 --- a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/iface.go +++ b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/iface.go @@ -258,7 +258,7 @@ type ExecutableGateNode interface { type ExecutableArrayNode interface { GetSubNodeSpec() *NodeSpec - GetParallelism() uint32 + GetParallelism() int64 GetMinSuccesses() *uint32 GetMinSuccessRatio() *float32 } diff --git a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/mocks/ExecutableArrayNode.go b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/mocks/ExecutableArrayNode.go index a4ca819a6a..742ceb2dbb 100644 --- a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/mocks/ExecutableArrayNode.go +++ b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/mocks/ExecutableArrayNode.go @@ -84,7 +84,7 @@ type ExecutableArrayNode_GetParallelism struct { *mock.Call } -func (_m ExecutableArrayNode_GetParallelism) Return(_a0 uint32) *ExecutableArrayNode_GetParallelism { +func (_m ExecutableArrayNode_GetParallelism) Return(_a0 int64) *ExecutableArrayNode_GetParallelism { return &ExecutableArrayNode_GetParallelism{Call: _m.Call.Return(_a0)} } @@ -99,14 +99,14 @@ func (_m *ExecutableArrayNode) OnGetParallelismMatch(matchers ...interface{}) *E } // GetParallelism provides a mock function with given fields: -func (_m *ExecutableArrayNode) GetParallelism() uint32 { +func (_m *ExecutableArrayNode) GetParallelism() int64 { ret := _m.Called() - var r0 uint32 - if rf, ok := ret.Get(0).(func() uint32); ok { + var r0 int64 + if rf, ok := ret.Get(0).(func() int64); ok { r0 = rf() } else { - r0 = ret.Get(0).(uint32) + r0 = ret.Get(0).(int64) } return r0 diff --git a/flytepropeller/pkg/controller/nodes/array/handler.go b/flytepropeller/pkg/controller/nodes/array/handler.go index 9a79b1fffd..1084326a33 100644 --- a/flytepropeller/pkg/controller/nodes/array/handler.go +++ b/flytepropeller/pkg/controller/nodes/array/handler.go @@ -252,13 +252,29 @@ func (a *arrayNodeHandler) Handle(ctx context.Context, nCtx interfaces.NodeExecu arrayNodeState.Phase = v1alpha1.ArrayNodePhaseExecuting case v1alpha1.ArrayNodePhaseExecuting: // process array node subNodes - currentParallelism := int(arrayNode.GetParallelism()) - if currentParallelism == 0 { - currentParallelism = len(arrayNodeState.SubNodePhases.GetItems()) + + availableParallelism := 0 + // using the workflow's parallelism if the array node parallelism is not set + useWorkflowParallelism := int(arrayNode.GetParallelism()) == -1 + if useWorkflowParallelism { + // greedily take all available slots + // TODO: This will need to be re-evaluated if we want to support dynamics & sub_workflows + currentParallelism := nCtx.ExecutionContext().CurrentParallelism() + maxParallelism := nCtx.ExecutionContext().GetExecutionConfig().MaxParallelism + availableParallelism = int(maxParallelism - currentParallelism) + } else { + availableParallelism = int(arrayNode.GetParallelism()) + if availableParallelism == 0 { + availableParallelism = len(arrayNodeState.SubNodePhases.GetItems()) + } } - nodeExecutionRequests := make([]*nodeExecutionRequest, 0, currentParallelism) + nodeExecutionRequests := make([]*nodeExecutionRequest, 0, availableParallelism) for i, nodePhaseUint64 := range arrayNodeState.SubNodePhases.GetItems() { + if availableParallelism == 0 { + break + } + nodePhase := v1alpha1.NodePhase(nodePhaseUint64) taskPhase := int(arrayNodeState.SubNodeTaskPhases.GetItem(i)) @@ -298,11 +314,11 @@ func (a *arrayNodeHandler) Handle(ctx context.Context, nCtx interfaces.NodeExecu // TODO - this is a naive implementation of parallelism, if we want to support more // complex subNodes (ie. dynamics / subworkflows) we need to revisit this so that - // parallelism is handled during subNode evaluations. - currentParallelism-- - if currentParallelism == 0 { - break + // parallelism is handled during subNode evaluations + avoid deadlocks + if useWorkflowParallelism { + nCtx.ExecutionContext().IncrementParallelism() } + availableParallelism-- } workerErrorCollector := errorcollector.NewErrorMessageCollector() diff --git a/flytepropeller/pkg/controller/nodes/array/handler_test.go b/flytepropeller/pkg/controller/nodes/array/handler_test.go index b36f3a5b62..f514790542 100644 --- a/flytepropeller/pkg/controller/nodes/array/handler_test.go +++ b/flytepropeller/pkg/controller/nodes/array/handler_test.go @@ -43,6 +43,7 @@ var ( }, }, } + workflowMaxParallelism = uint32(10) ) func createArrayNodeHandler(ctx context.Context, t *testing.T, nodeHandler interfaces.NodeHandler, dataStore *storage.DataStore, scope promutils.Scope) (interfaces.NodeHandler, error) { @@ -74,7 +75,8 @@ func createArrayNodeHandler(ctx context.Context, t *testing.T, nodeHandler inter } func createNodeExecutionContext(dataStore *storage.DataStore, eventRecorder interfaces.EventRecorder, outputVariables []string, - inputLiteralMap *idlcore.LiteralMap, arrayNodeSpec *v1alpha1.NodeSpec, arrayNodeState *handler.ArrayNodeState) interfaces.NodeExecutionContext { + inputLiteralMap *idlcore.LiteralMap, arrayNodeSpec *v1alpha1.NodeSpec, arrayNodeState *handler.ArrayNodeState, + currentParallelism uint32, maxParallelism uint32) interfaces.NodeExecutionContext { nCtx := &mocks.NodeExecutionContext{} nCtx.OnMaxDatasetSizeBytes().Return(9999999) @@ -91,7 +93,9 @@ func createNodeExecutionContext(dataStore *storage.DataStore, eventRecorder inte // ExecutionContext executionContext := &execmocks.ExecutionContext{} executionContext.OnGetEventVersion().Return(1) - executionContext.OnGetExecutionConfig().Return(v1alpha1.ExecutionConfig{}) + executionContext.OnGetExecutionConfig().Return(v1alpha1.ExecutionConfig{ + MaxParallelism: maxParallelism, + }) executionContext.OnGetExecutionID().Return( v1alpha1.ExecutionID{ WorkflowExecutionIdentifier: &idlcore.WorkflowExecutionIdentifier{ @@ -120,6 +124,8 @@ func createNodeExecutionContext(dataStore *storage.DataStore, eventRecorder inte }, nil, ) + executionContext.OnCurrentParallelism().Return(currentParallelism) + executionContext.On("IncrementParallelism").Run(func(args mock.Arguments) {}).Return(currentParallelism) executionContext.OnIncrementNodeExecutionCount().Return(1) executionContext.OnIncrementTaskExecutionCount().Return(1) executionContext.OnCurrentNodeExecutionCount().Return(1) @@ -258,7 +264,7 @@ func TestAbort(t *testing.T) { // create NodeExecutionContext eventRecorder := newBufferedEventRecorder() - nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState) + nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState, 0, workflowMaxParallelism) // evaluate node err := arrayNodeHandler.Abort(ctx, nCtx, "foo") @@ -354,7 +360,7 @@ func TestFinalize(t *testing.T) { // create NodeExecutionContext eventRecorder := newBufferedEventRecorder() - nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState) + nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState, 0, workflowMaxParallelism) // evaluate node err := arrayNodeHandler.Finalize(ctx, nCtx) @@ -425,7 +431,7 @@ func TestHandleArrayNodePhaseNone(t *testing.T) { arrayNodeState := &handler.ArrayNodeState{ Phase: v1alpha1.ArrayNodePhaseNone, } - nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState) + nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState, 0, workflowMaxParallelism) // evaluate node transition, err := arrayNodeHandler.Handle(ctx, nCtx) @@ -480,6 +486,9 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { expectedArrayNodePhase v1alpha1.ArrayNodePhase expectedTransitionPhase handler.EPhase expectedExternalResourcePhases []idlcore.TaskExecution_Phase + currentWfParallelism uint32 + maxWfParallelism uint32 + incrementParallelismCount uint32 }{ { name: "StartAllSubNodes", @@ -517,6 +526,65 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { expectedTransitionPhase: handler.EPhaseRunning, expectedExternalResourcePhases: []idlcore.TaskExecution_Phase{idlcore.TaskExecution_RUNNING}, }, + { + name: "UtilizeWfParallelismAllSubNodes", + parallelism: -1, + currentWfParallelism: 0, + incrementParallelismCount: 2, + subNodePhases: []v1alpha1.NodePhase{ + v1alpha1.NodePhaseQueued, + v1alpha1.NodePhaseQueued, + }, + subNodeTaskPhases: []core.Phase{ + core.PhaseUndefined, + core.PhaseUndefined, + }, + subNodeTransitions: []handler.Transition{ + handler.DoTransition(handler.TransitionTypeEphemeral, handler.PhaseInfoRunning(&handler.ExecutionInfo{})), + handler.DoTransition(handler.TransitionTypeEphemeral, handler.PhaseInfoRunning(&handler.ExecutionInfo{})), + }, + expectedArrayNodePhase: v1alpha1.ArrayNodePhaseExecuting, + expectedTransitionPhase: handler.EPhaseRunning, + expectedExternalResourcePhases: []idlcore.TaskExecution_Phase{idlcore.TaskExecution_RUNNING, idlcore.TaskExecution_RUNNING}, + }, + { + name: "UtilizeWfParallelismSomeSubNodes", + parallelism: -1, + currentWfParallelism: workflowMaxParallelism - 1, + incrementParallelismCount: 1, + subNodePhases: []v1alpha1.NodePhase{ + v1alpha1.NodePhaseQueued, + v1alpha1.NodePhaseQueued, + }, + subNodeTaskPhases: []core.Phase{ + core.PhaseUndefined, + core.PhaseUndefined, + }, + subNodeTransitions: []handler.Transition{ + handler.DoTransition(handler.TransitionTypeEphemeral, handler.PhaseInfoRunning(&handler.ExecutionInfo{})), + }, + expectedArrayNodePhase: v1alpha1.ArrayNodePhaseExecuting, + expectedTransitionPhase: handler.EPhaseRunning, + expectedExternalResourcePhases: []idlcore.TaskExecution_Phase{idlcore.TaskExecution_RUNNING}, + }, + { + name: "UtilizeWfParallelismNoSubNodes", + parallelism: -1, + currentWfParallelism: workflowMaxParallelism, + incrementParallelismCount: 0, + subNodePhases: []v1alpha1.NodePhase{ + v1alpha1.NodePhaseQueued, + v1alpha1.NodePhaseQueued, + }, + subNodeTaskPhases: []core.Phase{ + core.PhaseUndefined, + core.PhaseUndefined, + }, + subNodeTransitions: []handler.Transition{}, + expectedArrayNodePhase: v1alpha1.ArrayNodePhaseExecuting, + expectedTransitionPhase: handler.EPhaseRunning, + expectedExternalResourcePhases: []idlcore.TaskExecution_Phase{}, + }, { name: "StartSubNodesNewAttempts", subNodePhases: []v1alpha1.NodePhase{ @@ -629,10 +697,10 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { eventRecorder := newBufferedEventRecorder() nodeSpec := arrayNodeSpec - nodeSpec.ArrayNode.Parallelism = uint32(test.parallelism) + nodeSpec.ArrayNode.Parallelism = int64(test.parallelism) nodeSpec.ArrayNode.MinSuccessRatio = test.minSuccessRatio - nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState) + nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState, test.currentWfParallelism, workflowMaxParallelism) // initialize ArrayNodeHandler nodeHandler := &mocks.NodeHandler{} @@ -678,6 +746,8 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { } else { assert.Equal(t, 0, len(eventRecorder.taskExecutionEvents)) } + + nCtx.ExecutionContext().(*execmocks.ExecutionContext).AssertNumberOfCalls(t, "IncrementParallelism", int(test.incrementParallelismCount)) }) } } @@ -753,7 +823,7 @@ func TestHandleArrayNodePhaseExecutingSubNodeFailures(t *testing.T) { arrayNodeState := &handler.ArrayNodeState{ Phase: v1alpha1.ArrayNodePhaseNone, } - nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState) + nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState, 0, workflowMaxParallelism) // initialize ArrayNodeHandler nodeHandler := &mocks.NodeHandler{} @@ -781,7 +851,7 @@ func TestHandleArrayNodePhaseExecutingSubNodeFailures(t *testing.T) { // evaluate node until failure attempts := 1 for { - nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState) + nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState, 0, workflowMaxParallelism) _, err = arrayNodeHandler.Handle(ctx, nCtx) assert.NoError(t, err) @@ -866,7 +936,7 @@ func TestHandleArrayNodePhaseSucceeding(t *testing.T) { // create NodeExecutionContext eventRecorder := newBufferedEventRecorder() literalMap := &idlcore.LiteralMap{} - nCtx := createNodeExecutionContext(dataStore, eventRecorder, []string{test.outputVariable}, literalMap, &arrayNodeSpec, arrayNodeState) + nCtx := createNodeExecutionContext(dataStore, eventRecorder, []string{test.outputVariable}, literalMap, &arrayNodeSpec, arrayNodeState, 0, workflowMaxParallelism) // write mocked output files for i, outputValue := range test.outputValues { @@ -992,7 +1062,7 @@ func TestHandleArrayNodePhaseFailing(t *testing.T) { // create NodeExecutionContext eventRecorder := newBufferedEventRecorder() literalMap := &idlcore.LiteralMap{} - nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState) + nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState, 0, workflowMaxParallelism) // evaluate node transition, err := arrayNodeHandler.Handle(ctx, nCtx) From 14eaa16a43bff3ada4e93c6c6421c6b35471bf30 Mon Sep 17 00:00:00 2001 From: Thomas Newton Date: Fri, 5 Apr 2024 02:17:46 +0100 Subject: [PATCH 406/645] Fix streak length metric reporting (#5172) * Don't use `defer` for streak length reporting Signed-off-by: Thomas Newton * Make it work with defer Signed-off-by: Thomas Newton * Fix lint Signed-off-by: Thomas Newton --------- Signed-off-by: Thomas Newton --- flytepropeller/pkg/controller/handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytepropeller/pkg/controller/handler.go b/flytepropeller/pkg/controller/handler.go index 94e8ab6c12..49c2c21549 100644 --- a/flytepropeller/pkg/controller/handler.go +++ b/flytepropeller/pkg/controller/handler.go @@ -230,7 +230,7 @@ func (p *Propeller) Handle(ctx context.Context, namespace, name string) error { } streak := 0 - defer p.metrics.StreakLength.Add(ctx, float64(streak)) + defer func() { p.metrics.StreakLength.Add(ctx, float64(streak)) }() maxLength := p.cfg.MaxStreakLength if maxLength <= 0 { From 44c701ebe6dcf8469b910069d50fdd38bb6ec80d Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Thu, 4 Apr 2024 19:46:26 -0700 Subject: [PATCH 407/645] Fix path to AuthMetadataService in flyte-binary chart (#5185) Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- charts/flyte-binary/templates/_helpers.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/flyte-binary/templates/_helpers.tpl b/charts/flyte-binary/templates/_helpers.tpl index 85184a45db..b95af64a09 100644 --- a/charts/flyte-binary/templates/_helpers.tpl +++ b/charts/flyte-binary/templates/_helpers.tpl @@ -183,7 +183,7 @@ Get the Flyte service GRPC paths. - /flyteidl.service.AdminService - /flyteidl.service.AdminService/* - /flyteidl.service.AuthMetadataService -- /flyteidl.service.AuthMetadataService/ +- /flyteidl.service.AuthMetadataService/* - /flyteidl.service.DataProxyService - /flyteidl.service.DataProxyService/* - /flyteidl.service.IdentityService From 5f9abb1c48d161022b2a5089fc4917835b863d0d Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Fri, 5 Apr 2024 15:29:51 -0700 Subject: [PATCH 408/645] Change phase to queue on job submit for webapi plugins (#5188) Signed-off-by: Kevin Su --- .../go/tasks/pluginmachinery/internal/webapi/monitor.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/monitor.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/monitor.go index c68634d0e0..4edbadcb07 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/monitor.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/monitor.go @@ -2,6 +2,7 @@ package webapi import ( "context" + "time" "github.com/flyteorg/flyte/flyteplugins/go/tasks/errors" "github.com/flyteorg/flyte/flyteplugins/go/tasks/pluginmachinery/core" @@ -38,7 +39,7 @@ func monitor(ctx context.Context, tCtx core.TaskExecutionContext, p Client, cach } return state, core.PhaseInfoFailure(errors.CacheFailed, cacheItem.ErrorMessage, nil), nil } - return state, core.PhaseInfoRunning(0, nil), nil + return state, core.PhaseInfoQueued(time.Now(), core.DefaultPhaseVersion, "job submitted"), nil } newPhase, err := p.Status(ctx, newPluginContext(cacheItem.ResourceMeta, cacheItem.Resource, "", tCtx)) From 2eede8992cb1fecdc151e6250439ddfa57f25e41 Mon Sep 17 00:00:00 2001 From: Future-Outlier Date: Sat, 6 Apr 2024 07:19:51 +0800 Subject: [PATCH 409/645] [Docs] Testing agents in the development environment (#5106) * Testing agents in the development environment Signed-off-by: Future-Outlier * nit Signed-off-by: Future-Outlier * nit Signed-off-by: Future-Outlier * update Signed-off-by: Future-Outlier * rename Signed-off-by: Future-Outlier * blank Signed-off-by: Future-Outlier * rerun build docs ci Signed-off-by: Future-Outlier * update pingsu's advice Signed-off-by: Future-Outlier Co-authored-by: Kevin Su * Update pingsu's advice Signed-off-by: Future-Outlier Co-authored-by: Kevin Su * deploying agents in the sandbox Signed-off-by: Future-Outlier * rename Signed-off-by: Future-Outlier * nit Signed-off-by: Future-Outlier * Implementing Agent Metadata Service Signed-off-by: Future-Outlier * reorganize and copyedit new content Signed-off-by: nikki everett --------- Signed-off-by: Future-Outlier Signed-off-by: nikki everett Co-authored-by: Kevin Su Co-authored-by: nikki everett --- .../deploying_agents_to_the_flyte_sandbox.md | 98 +++++++++++++++++++ docs/flyte_agents/developing_agents.md | 13 ++- ...nabling_agents_in_your_flyte_deployment.md | 2 +- ...implementing_the_agent_metadata_service.md | 48 +++++++++ docs/flyte_agents/index.md | 30 +++--- ...g_agents_in_a_local_development_cluster.md | 94 ++++++++++++++++++ ...g_agents_in_a_local_python_environment.md} | 4 +- 7 files changed, 267 insertions(+), 22 deletions(-) create mode 100644 docs/flyte_agents/deploying_agents_to_the_flyte_sandbox.md create mode 100644 docs/flyte_agents/implementing_the_agent_metadata_service.md create mode 100644 docs/flyte_agents/testing_agents_in_a_local_development_cluster.md rename docs/flyte_agents/{testing_agents_locally.md => testing_agents_in_a_local_python_environment.md} (96%) diff --git a/docs/flyte_agents/deploying_agents_to_the_flyte_sandbox.md b/docs/flyte_agents/deploying_agents_to_the_flyte_sandbox.md new file mode 100644 index 0000000000..c4f1a2881e --- /dev/null +++ b/docs/flyte_agents/deploying_agents_to_the_flyte_sandbox.md @@ -0,0 +1,98 @@ +--- +jupytext: + formats: md:myst + text_representation: + extension: .md + format_name: myst +--- + +(deploying_agents_to_the_flyte_sandbox)= +# Deploying agents to the Flyte sandbox + +After you have finished {ref}`testing an agent locally `, you can deploy your agent to the Flyte sandbox. + +Here's a step by step guide to deploying your agent image to the Flyte sandbox. + +1. Start the Flyte sandbox: +```bash +flytectl demo start +``` + +2. Build an agent image: +You can go to [here](https://github.com/flyteorg/flytekit/blob/master/Dockerfile.agent) to see the Dockerfile we use in flytekit python. +Take Databricks agent as an example: +```Dockerfile +FROM python:3.9-slim-bookworm + +RUN apt-get update && apt-get install build-essential git -y +RUN pip install prometheus-client grpcio-health-checking +RUN pip install --no-cache-dir -U flytekit \ + git+https://github.com/flyteorg/flytekit.git@#subdirectory=plugins/flytekit-spark \ + && apt-get clean autoclean \ + && apt-get autoremove --yes \ + && rm -rf /var/lib/{apt,dpkg,cache,log}/ \ + && : + +CMD pyflyte serve agent --port 8000 +``` +```bash +docker buildx build -t localhost:30000/flyteagent:example -f Dockerfile.agent . --load +docker push localhost:30000/flyteagent:example +``` + +2. Deploy your agent image to the Kubernetes cluster: +```bash +kubectl edit deployment flyteagent -n flyte +``` +Search for the `image` key and change its value to your agent image: +```yaml +image: localhost:30000/flyteagent:example +``` + +3. Set up your secrets: +Let's take Databricks agent as an example: +```bash +kubectl edit secret flyteagent -n flyte +``` +Get your `BASE64_ENCODED_DATABRICKS_TOKEN`: +```bash +echo -n "" | base64 +``` +Add your token to the `data` field: +```yaml +apiVersion: v1 +data: + flyte_databricks_access_token: +kind: Secret +metadata: + annotations: + meta.helm.sh/release-name: flyteagent + meta.helm.sh/release-namespace: flyte + creationTimestamp: "2023-10-04T04:09:03Z" + labels: + app.kubernetes.io/managed-by: Helm + name: flyteagent + namespace: flyte + resourceVersion: "753" + uid: 5ac1e1b6-2a4c-4e26-9001-d4ba72c39e54 +type: Opaque +``` +:::{note} +Please ensure two things: +1. The secret name consists only of lowercase English letters. +2. The secret value is encoded in Base64. +::: + +4. Restart development: +```bash +kubectl rollout restart deployment flyte-sandbox -n flyte +``` + +5. Test your agent remotely in the Flyte sandbox: +```bash +pyflyte run --remote agent_workflow.py agent_task +``` + +:::{note} +You must build an image that includes the plugin for the task and specify its config with the [`--image` flag](https://docs.flyte.org/en/latest/api/flytekit/pyflyte.html#cmdoption-pyflyte-run-i) when running `pyflyte run` or in an {ref}`ImageSpec ` definition in your workflow file. +::: \ No newline at end of file diff --git a/docs/flyte_agents/developing_agents.md b/docs/flyte_agents/developing_agents.md index f4fb1378b4..9df49c2f8b 100644 --- a/docs/flyte_agents/developing_agents.md +++ b/docs/flyte_agents/developing_agents.md @@ -131,9 +131,9 @@ class FileSensor(BaseSensor): ``` -### 2. Test the agent locally +### 2. Test the agent -See {doc}`"Testing agents locally" ` to test your agent locally. +You can test your agent in a {ref}`local Python environment ` or in a {ref}. ### 3. Build a new Docker image @@ -166,7 +166,7 @@ For flytekit versions `>v1.10.2`, use `pyflyte serve agent`. kubectl set image deployment/flyteagent flyteagent=ghcr.io/flyteorg/flyteagent:latest ``` -2. Update the FlytePropeller configmap. +2. Update the FlytePropeller configmap: ```YAML tasks: @@ -178,14 +178,17 @@ kubectl set image deployment/flyteagent flyteagent=ghcr.io/flyteorg/flyteagent:l - custom_task: agent-service ``` -3. Restart FlytePropeller. +3. Restart FlytePropeller: ``` kubectl rollout restart deployment flytepropeller -n flyte ``` +### 5. + ### Canary deployment + Agents can be deployed independently in separate environments. Decoupling agents from the production environment ensures that if any specific agent encounters an error or issue, it will not impact the overall production system. @@ -193,7 +196,7 @@ By running agents independently, you can thoroughly test and validate your agent controlled environment before deploying them to the production cluster. By default, all agent requests will be sent to the default agent service. However, -you can route particular task requests to designated agent services by adjusting the flytepropeller configuration. +you can route particular task requests to designated agent services by adjusting the FlytePropeller configuration. ```yaml plugins: diff --git a/docs/flyte_agents/enabling_agents_in_your_flyte_deployment.md b/docs/flyte_agents/enabling_agents_in_your_flyte_deployment.md index f50b740a21..add7c2598c 100644 --- a/docs/flyte_agents/enabling_agents_in_your_flyte_deployment.md +++ b/docs/flyte_agents/enabling_agents_in_your_flyte_deployment.md @@ -6,7 +6,7 @@ jupytext: format_name: myst --- -(enabling_agents_in_your_flyte_deploymen)= +(enabling_agents_in_your_flyte_deployment)= # Enabling agents in your Flyte deployment After you have finished {ref}`testing an agent locally `, you can enable the agent in your Flyte deployment to use it in production. To enable a particular agent in your Flyte deployment, see the [Agent setup guide](https://docs.flyte.org/en/latest/deployment/agents/index.html) for the agent. diff --git a/docs/flyte_agents/implementing_the_agent_metadata_service.md b/docs/flyte_agents/implementing_the_agent_metadata_service.md new file mode 100644 index 0000000000..6a1956b774 --- /dev/null +++ b/docs/flyte_agents/implementing_the_agent_metadata_service.md @@ -0,0 +1,48 @@ +--- +jupytext: + formats: md:myst + text_representation: + extension: .md + format_name: myst +--- + +(implementing_the_agent_metadata_service)= +# Implementing the agent metadata service + +## About the agent metadata service + +Before FlytePropeller sends a request to the agent server, it needs to know four things: + +- The name of the agent +- Which task category the agent supports +- The version of the task category +- Whether the agent executes tasks synchronously or asynchronously + +After FlytePropeller obtains this metadata, it can send a request to the agent deployment using the correct gRPC method. + +:::{note} +- An agent can support multiple task categories. +- We will use the combination of [task category][version] to identify the specific agent's deployment and know whether the task is synchronous or asynchronous in FlytePropeller. +- The task category is `task_type` in flytekit. +::: + +Using the BigQuery Agent as an example: +- The agent's name is `BigQuery Agent`. +- The agent supports `bigquery_query_job_task`. +- The agent's version is `0`. +- By default, the agent executes tasks asynchronously. + +## Implement the agent metadata service + +To implement the agent metadata service, you must do two things: + +1. Implement the agent metadata service. +2. Add the agent metadata service to the agent server. + +You can refer to [base_agent.py](https://github.com/flyteorg/flytekit/blob/master/flytekit/extend/backend/base_agent.py), [agent_service.py](https://github.com/flyteorg/flytekit/blob/master/flytekit/extend/backend/agent_service.py), and [serve.py](https://github.com/flyteorg/flytekit/blob/master/flytekit/clis/sdk_in_container/serve.py) to see how the agent metadata service is implemented in flytekit's agent server. + +Those gRPC methods are generated by [flyteidl](https://github.com/flyteorg/flyte/blob/master/flyteidl/protos/flyteidl/service/agent.proto) and you can import them from [here](https://github.com/flyteorg/flyte/tree/master/flyteidl/gen). + +:::{note} +You can search the keyword `metadata` to find implementations in those files. +::: diff --git a/docs/flyte_agents/index.md b/docs/flyte_agents/index.md index d5813650cc..e7d627a670 100644 --- a/docs/flyte_agents/index.md +++ b/docs/flyte_agents/index.md @@ -18,32 +18,34 @@ You can create different agent services that host different agents, e.g., a prod :class: with-shadow ::: -(using_agents_in_tasks)= -## Using agents in tasks - -If you need to connect to an external service in your workflow, we recommend using the corresponding agent rather than a web API plugin. Agents are designed to be scalable and can handle large workloads efficiently, and decrease load on FlytePropeller, since they run outside of it. You can also test agents locally without having to change the Flyte backend configuration, streamlining development. - -For a list of agents you can use in your tasks and example usage for each, see the [Integrations](https://docs.flyte.org/en/latest/flytesnacks/integrations.html#flyte-agents) documentation. - ## Table of contents ```{list-table} :header-rows: 0 :widths: 20 30 -* - {doc}`Developing agents ` - - If the agent you need doesn't exist, follow these steps to create it. -* - {doc}`Testing agents locally ` - - Whether using an existing agent or developing a new one, you can test the agent locally without needing to configure your Flyte deployment. +* - {doc}`Testing agents locally ` + - Whether using an {ref}`existing agent ` or developing a new one, you can quickly test the agent in local Python environment without needing to configure your Flyte deployment. * - {doc}`Enabling agents in your Flyte deployment ` - - Once you have tested an agent locally and want to use it in production, you must configure your Flyte deployment for the agent. + - After you have tested an {ref}`existing agent ` in a local Python environment, you must configure your Flyte deployment for the agent to use it in production. +* - {doc}`Developing agents ` + - If the agent you need doesn't exist, follow these steps to create a new agent. +* - {doc}`Testing agents in a local development cluster ` + - After developing your new agent and testing it in a local Python environment, you can test it in a local development cluster to ensure it works well remotely. +* - {doc}`Deploying agents to the Flyte sandbox ` + - Once you have tested your new agent in a local development cluster and want to use it in production, you should test it in the Flyte sandbox. +* - {doc}`Implementing the agent metadata service ` + - If you want to develop an agent server in a language other than Python (e.g., Rust or Java), you must implement the agent metadata service in your agent server. ``` ```{toctree} :maxdepth: -1 :hidden: -developing_agents -testing_agents_locally +testing_agents_in_a_local_python_environment enabling_agents_in_your_flyte_deployment +developing_agents +testing_agents_in_a_local_development_cluster +deploying_agents_to_the_flyte_sandbox +implementing_the_agent_metadata_service ``` diff --git a/docs/flyte_agents/testing_agents_in_a_local_development_cluster.md b/docs/flyte_agents/testing_agents_in_a_local_development_cluster.md new file mode 100644 index 0000000000..be2c14210d --- /dev/null +++ b/docs/flyte_agents/testing_agents_in_a_local_development_cluster.md @@ -0,0 +1,94 @@ +--- +jupytext: + formats: md:myst + text_representation: + extension: .md + format_name: myst +--- + +(testing_agents_in_a_local_development_cluster)= +# Testing agents in a local development cluster + +The Flyte agent service runs in a separate deployment instead of inside FlytePropeller. To test an agent server in a local development cluster, you must run both the single binary and agent server at the same time, allowing FlytePropeller to send requests to your local agent server. + +## Backend plugin vs agent service architecture + +To understand why you must run both the single binary and agent server at the same time, it is helpful to compare the backend plugin architecture to the agent service architecture. + +### Backend plugin architecture + +In this architecture, FlytePropeller sends requests through the SDK: + +![image.png](https://raw.githubusercontent.com/flyteorg/static-resources/main/flyte/concepts/agents/plugin_life_cycle.png) + +### Agent service architecture + +With the agent service framework: +1. Flyteplugins send gRPC requests to the agent server. +2. The agent server sends requests through the SDK and returns the query data. + +![image.png](https://raw.githubusercontent.com/flyteorg/static-resources/main/flyte/concepts/agents/async_agent_life_cycle.png) + +## Configuring the agent service in development mode + +1. Start the demo cluster in dev mode: +```bash +flytectl demo start --dev +``` + +2. Start the agent grpc server: +```bash +pyflyte serve agent +``` + +3. Update the config for the task handled by the agent in the single binary yaml file. +```bash +cd flyte +vim ./flyte-single-binary-local.yaml +``` + +```yaml +:emphasize-lines: 9 +tasks: + task-plugins: + enabled-plugins: + - agent-service + - container + - sidecar + - K8S-ARRAY + default-for-task-types: + - bigquery_query_job_task: agent-service + - container: container + - container_array: K8S-ARRAY +``` +```yaml +plugins: + # Registered Task Types + agent-service: + defaultAgent: + endpoint: "localhost:8000" # your grpc agent server port + insecure: true + timeouts: + GetTask: 10s + defaultTimeout: 10s +``` + +4. Start the Flyte server with the single binary config file: +```bash +make compile +./flyte start --config ./flyte-single-binary-local.yaml +``` + +5. Set up your secrets: +In the development environment, you can set up your secrets on your local machine by adding secrets to `/etc/secrets/SECRET_NAME`. + +Since your agent server is running locally rather than within Kubernetes, it can retrieve the secret from your local file system. + +6. Test your agent task: +```bash +pyflyte run --remote agent_workflow.py agent_task +``` + +:::{note} +You must build an image that includes the plugin for the task and specify its config with the [`--image` flag](https://docs.flyte.org/en/latest/api/flytekit/pyflyte.html#cmdoption-pyflyte-run-i) when running `pyflyte run` or in an {ref}`ImageSpec ` definition in your workflow file. +::: diff --git a/docs/flyte_agents/testing_agents_locally.md b/docs/flyte_agents/testing_agents_in_a_local_python_environment.md similarity index 96% rename from docs/flyte_agents/testing_agents_locally.md rename to docs/flyte_agents/testing_agents_in_a_local_python_environment.md index dd4294dbea..ef26642d6b 100644 --- a/docs/flyte_agents/testing_agents_locally.md +++ b/docs/flyte_agents/testing_agents_in_a_local_python_environment.md @@ -7,9 +7,9 @@ jupytext: --- (testing_agents_locally)= -# Testing agents locally +# Testing agents in a local Python environment -You can test agents locally without running the backend server, making agent development easier. +You can test agents locally without running the backend server. To test an agent locally, create a class for the agent task that inherits from `SyncAgentExecutorMixin` or `AsyncAgentExecutorMixin`. These mixins can handle synchronous and asynchronous tasks, respectively, and allow flytekit to mimic FlytePropeller's behavior in calling the agent. From c8be3e47b3914ed6ad618266880b9d5171c5db0f Mon Sep 17 00:00:00 2001 From: Ketan Umare <16888709+kumare3@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:52:29 -0700 Subject: [PATCH 410/645] Use ratelimiter config in webapi plugins (#5190) Signed-off-by: Ketan Umare Co-authored-by: Ketan Umare --- flyteplugins/go.mod | 2 +- .../go/tasks/pluginmachinery/internal/webapi/cache.go | 8 +++++++- .../tasks/pluginmachinery/internal/webapi/cache_test.go | 3 ++- .../go/tasks/pluginmachinery/internal/webapi/core.go | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/flyteplugins/go.mod b/flyteplugins/go.mod index 6e5ae9670a..5464f06c89 100644 --- a/flyteplugins/go.mod +++ b/flyteplugins/go.mod @@ -28,6 +28,7 @@ require ( golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 golang.org/x/net v0.22.0 golang.org/x/oauth2 v0.16.0 + golang.org/x/time v0.5.0 google.golang.org/api v0.155.0 google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.33.0 @@ -128,7 +129,6 @@ require ( golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.5.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache.go index a305323dca..b13070534e 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache.go @@ -2,7 +2,9 @@ package webapi import ( "context" + "time" + "golang.org/x/time/rate" "k8s.io/client-go/util/workqueue" "github.com/flyteorg/flyte/flyteplugins/go/tasks/errors" @@ -161,6 +163,7 @@ func ToPluginPhase(s core.Phase) (Phase, error) { } func NewResourceCache(ctx context.Context, name string, client Client, cfg webapi.CachingConfig, + rateCfg webapi.RateLimiterConfig, scope promutils.Scope) (ResourceCache, error) { q := ResourceCache{ @@ -169,7 +172,10 @@ func NewResourceCache(ctx context.Context, name string, client Client, cfg webap } autoRefreshCache, err := cache.NewAutoRefreshCache(name, q.SyncResource, - workqueue.DefaultControllerRateLimiter(), cfg.ResyncInterval.Duration, cfg.Workers, cfg.Size, + workqueue.NewMaxOfRateLimiter( + workqueue.NewItemExponentialFailureRateLimiter(5*time.Millisecond, 1000*time.Second), + &workqueue.BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(rateCfg.QPS), rateCfg.Burst)}, + ), cfg.ResyncInterval.Duration, cfg.Workers, cfg.Size, scope.NewSubScope("cache")) if err != nil { diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache_test.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache_test.go index 53e80cd391..d228e7954e 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache_test.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache_test.go @@ -21,13 +21,14 @@ func TestNewResourceCache(t *testing.T) { t.Run("Simple", func(t *testing.T) { c, err := NewResourceCache(context.Background(), "Cache1", &mocks.Client{}, webapi.CachingConfig{ Size: 10, - }, promutils.NewTestScope()) + }, webapi.RateLimiterConfig{QPS: 1, Burst: 1}, promutils.NewTestScope()) assert.NoError(t, err) assert.NotNil(t, c) }) t.Run("Error", func(t *testing.T) { _, err := NewResourceCache(context.Background(), "Cache1", &mocks.Client{}, webapi.CachingConfig{}, + webapi.RateLimiterConfig{}, promutils.NewTestScope()) assert.Error(t, err) }) diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/core.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/core.go index a23f985fc6..9c98521897 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/core.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/core.go @@ -191,7 +191,7 @@ func createRemotePlugin(pluginEntry webapi.PluginEntry, c clock.Clock) core.Plug } resourceCache, err := NewResourceCache(ctx, pluginEntry.ID, p, p.GetConfig().Caching, - iCtx.MetricsScope().NewSubScope("cache")) + p.GetConfig().ReadRateLimiter, iCtx.MetricsScope().NewSubScope("cache")) if err != nil { return nil, err From 934f5c1ae619f4e7d22fe52f5c97f3b8a307cfdf Mon Sep 17 00:00:00 2001 From: Chi-Sheng Liu Date: Sun, 7 Apr 2024 13:26:40 +0800 Subject: [PATCH 411/645] docs(ray): Update kuberay documentation (#5179) Signed-off-by: Chi-Sheng Liu --- docs/deployment/plugins/k8s/index.rst | 24 +++--------------- monodocs-environment.lock.yaml | 36 +++++++++++++-------------- 2 files changed, 22 insertions(+), 38 deletions(-) diff --git a/docs/deployment/plugins/k8s/index.rst b/docs/deployment/plugins/k8s/index.rst index 0d00e737e1..908c986d9b 100644 --- a/docs/deployment/plugins/k8s/index.rst +++ b/docs/deployment/plugins/k8s/index.rst @@ -73,8 +73,10 @@ Select the integration you need and follow the steps to install the correspondin To install the Kuberay operator, run the following command: - helm install kuberay-operator kuberay/kuberay-operator --version 1.0.0 - + .. code-block:: bash + + helm install kuberay-operator kuberay/kuberay-operator --namespace ray-system --version 1.1.0 --create-namespace + .. group-tab:: Spark To add the Spark Helm repository, run the following commands: @@ -270,18 +272,6 @@ Specify plugin configuration - container: container - container_array: k8s-array - ray: ray - rbac: - extraRules: - - apiGroups: - - "ray.io" - resources: - - rayjob - verbs: - - create - - get - - list - - patch - - update .. group-tab:: Flyte core @@ -1036,9 +1026,3 @@ Wait for the upgrade to complete. You can check the status of the deployment pod kubectl get pods -n flyte Once all the components are up and running, go to the `examples section `__ to learn more about how to use Flyte backend plugins. - - - - - - diff --git a/monodocs-environment.lock.yaml b/monodocs-environment.lock.yaml index 65f4bc61aa..a07232ce14 100644 --- a/monodocs-environment.lock.yaml +++ b/monodocs-environment.lock.yaml @@ -17783,7 +17783,7 @@ package: category: main optional: false - name: pillow - version: 10.2.0 + version: 10.3.0 manager: conda platform: linux-64 dependencies: @@ -17795,14 +17795,14 @@ package: libwebp-base: '>=1.3.2,<2.0a0' libxcb: '>=1.15,<1.16.0a0' libzlib: '>=1.2.13,<1.3.0a0' - openjpeg: '>=2.5.0,<3.0a0' + openjpeg: '>=2.5.2,<3.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* tk: '>=8.6.13,<8.7.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda hash: - md5: 2972754dc054bb079d1d121918b5126f - sha256: 6936d54f9830ac66bee7b26187eb2297d80febe110e978cd9ae6a54e62ec6aaf + md5: 1e3b6af9592be71ce19f0a6aae05d97b + sha256: 1fa684d3f431f98a3e10f972025fc63fc81882e775059b358f5ff58cc46a951d category: main optional: false - name: pillow @@ -17817,7 +17817,7 @@ package: libwebp-base: '>=1.3.2,<2.0a0' libxcb: '>=1.15,<1.16.0a0' libzlib: '>=1.2.13,<1.3.0a0' - openjpeg: '>=2.5.0,<3.0a0' + openjpeg: '>=2.5.2,<3.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* tk: '>=8.6.13,<8.7.0a0' @@ -17828,7 +17828,7 @@ package: category: main optional: false - name: pillow - version: 10.2.0 + version: 10.3.0 manager: conda platform: osx-arm64 dependencies: @@ -17843,10 +17843,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* tk: '>=8.6.13,<8.7.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.2.0-py39h755f0b7_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py39h3352c98_0.conda hash: - md5: 9309cdb83d6c1617a58e57b61c556105 - sha256: 0e91b5467c3994760832fca4a45ed084853061b5c42a8015da4e19fed7e5b7aa + md5: ae81c249c46d2c8e37770a72f7568aaa + sha256: ec1a6fed0b5e114c79ecdbe195f1a1c9ace94ccb61379e59781afb68cba0f463 category: main optional: false - name: pip @@ -26031,15 +26031,15 @@ package: category: main optional: false - name: xyzservices - version: 2023.10.1 + version: 2024.4.0 manager: conda platform: linux-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2023.10.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.4.0-pyhd8ed1ab_0.conda hash: - md5: 1e0d85c0e2fef9539218da185b285f54 - sha256: da655e2e0a742fddefeeaf2dd828b62a1820a3755d13341e1a555a10fcb9cf81 + md5: 93dffc47dadbe36a1a644f3f50d4979d + sha256: 4e095631b52a78bbd9b53f28eb79b0c8f448d9509cf0451e99c2f3f85576f114 category: main optional: false - name: xyzservices @@ -26055,15 +26055,15 @@ package: category: main optional: false - name: xyzservices - version: 2023.10.1 + version: 2024.4.0 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2023.10.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.4.0-pyhd8ed1ab_0.conda hash: - md5: 1e0d85c0e2fef9539218da185b285f54 - sha256: da655e2e0a742fddefeeaf2dd828b62a1820a3755d13341e1a555a10fcb9cf81 + md5: 93dffc47dadbe36a1a644f3f50d4979d + sha256: 4e095631b52a78bbd9b53f28eb79b0c8f448d9509cf0451e99c2f3f85576f114 category: main optional: false - name: xz From 6d58c73214285f6beacc255eefe27699781d909e Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Sun, 7 Apr 2024 04:52:53 -0700 Subject: [PATCH 412/645] Change phase to WaitingForResources when quota exceeded (#5195) --- .../tasks/pluginmachinery/internal/webapi/allocation_token.go | 4 ++-- .../controller/nodes/task/resourcemanager/config/config.go | 2 +- .../nodes/task/resourcemanager/config/config_flags.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/allocation_token.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/allocation_token.go index a20ef4a1ab..4beaaad91f 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/allocation_token.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/allocation_token.go @@ -64,8 +64,8 @@ func (a tokenAllocator) allocateToken(ctx context.Context, p webapi.AsyncPlugin, return &State{ AllocationTokenRequestStartTime: startTime, Phase: PhaseNotStarted, - }, core.PhaseInfoQueued( - a.clock.Now(), 0, "Quota for task has exceeded. The request is enqueued."), nil + }, core.PhaseInfoWaitingForResourcesInfo( + a.clock.Now(), 0, "Quota for task has exceeded. Waiting for the resource.", nil), nil } return nil, core.PhaseInfo{}, fmt.Errorf("allocation status undefined [%v]", allocationStatus) diff --git a/flytepropeller/pkg/controller/nodes/task/resourcemanager/config/config.go b/flytepropeller/pkg/controller/nodes/task/resourcemanager/config/config.go index 5a92d3c8e8..8e8acd54b7 100644 --- a/flytepropeller/pkg/controller/nodes/task/resourcemanager/config/config.go +++ b/flytepropeller/pkg/controller/nodes/task/resourcemanager/config/config.go @@ -27,7 +27,7 @@ var ( // Configs for Resource Manager type Config struct { - Type Type `json:"type" pflag:"noop,Which resource manager to use"` + Type Type `json:"type" pflag:"noop, Which resource manager to use, redis or noop. Default is noop."` ResourceMaxQuota int `json:"resourceMaxQuota" pflag:",Global limit for concurrent Qubole queries"` RedisConfig RedisConfig `json:"redis" pflag:",Config for Redis resourcemanager."` } diff --git a/flytepropeller/pkg/controller/nodes/task/resourcemanager/config/config_flags.go b/flytepropeller/pkg/controller/nodes/task/resourcemanager/config/config_flags.go index 66bcc0eb13..bc76bb47c5 100755 --- a/flytepropeller/pkg/controller/nodes/task/resourcemanager/config/config_flags.go +++ b/flytepropeller/pkg/controller/nodes/task/resourcemanager/config/config_flags.go @@ -50,7 +50,7 @@ func (Config) mustMarshalJSON(v json.Marshaler) string { // flags is json-name.json-sub-name... etc. func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags := pflag.NewFlagSet("Config", pflag.ExitOnError) - cmdFlags.String(fmt.Sprintf("%v%v", prefix, "type"), defaultConfig.Type, "Which resource manager to use") + cmdFlags.String(fmt.Sprintf("%v%v", prefix, "type"), defaultConfig.Type, " Which resource manager to use, redis or noop. Default is noop.") cmdFlags.Int(fmt.Sprintf("%v%v", prefix, "resourceMaxQuota"), defaultConfig.ResourceMaxQuota, "Global limit for concurrent Qubole queries") cmdFlags.StringSlice(fmt.Sprintf("%v%v", prefix, "redis.hostPaths"), defaultConfig.RedisConfig.HostPaths, "Redis hosts locations.") cmdFlags.String(fmt.Sprintf("%v%v", prefix, "redis.primaryName"), defaultConfig.RedisConfig.PrimaryName, "Redis primary name, fill in only if you are connecting to a redis sentinel cluster.") From 8380f842b84d5b99f4a503edfca5a65b26ed591a Mon Sep 17 00:00:00 2001 From: "Fabio M. Graetz, Ph.D" Date: Mon, 8 Apr 2024 09:23:06 +0200 Subject: [PATCH 413/645] Fix: Update spark operator helm repository (#5198) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabio M. Graetz, Ph.D. Signed-off-by: Fabio Grätz --- docs/deployment/plugins/k8s/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deployment/plugins/k8s/index.rst b/docs/deployment/plugins/k8s/index.rst index 908c986d9b..9cc30b79d5 100644 --- a/docs/deployment/plugins/k8s/index.rst +++ b/docs/deployment/plugins/k8s/index.rst @@ -83,7 +83,7 @@ Select the integration you need and follow the steps to install the correspondin .. code-block:: bash - helm repo add spark-operator https://googlecloudplatform.github.io/spark-on-k8s-operator + helm repo add spark-operator https://kubeflow.github.io/spark-operator To install the Spark operator, run the following command: From 65685827276de4497663f732af4173d2bc698c91 Mon Sep 17 00:00:00 2001 From: Chi-Sheng Liu Date: Mon, 8 Apr 2024 22:14:41 +0800 Subject: [PATCH 414/645] docs(troubleshoot): Add docker error troubleshooting guide (#4972) Signed-off-by: Chi-Sheng Liu Co-authored-by: Kevin Su --- docs/community/troubleshoot.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/community/troubleshoot.rst b/docs/community/troubleshoot.rst index 41bc6624c3..692e3c2aed 100644 --- a/docs/community/troubleshoot.rst +++ b/docs/community/troubleshoot.rst @@ -32,6 +32,31 @@ Depending on the contents of the logs or the `Events`, you can try different thi Debugging common execution errors ---------------------------------- +``Error: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This error will show if you are not running Docker with the native Docker engine in a Linux machine. Most probably you are running Docker via Docker Desktop. + +- If you are using Docker Desktop in MacOs, run: + +.. prompt:: bash $ + + sudo ln -s ~/Library/Containers/com.docker.docker/Data/docker.raw.sock /var/run/docker.sock + +- If you are using Docker Desktop in Linux, run: + +.. prompt:: bash $ + + sudo ln -s ~$USER/.docker/desktop/docker.sock /var/run/docker.sock + +- If you are using another tool to run Docker, you need to make sure that ``/var/run/docker.sock`` is linked to the correct socket file. + + For example, if you are using Rancher Desktop on Linux, run: + + .. prompt:: bash $ + + sudo ln -s ~$USER/.rd/docker.sock /var/run/docker.sock + ``message: '0/1 nodes are available: 1 Insufficient cpu. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod.'`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 2528de73ce38b94c15e15a24a3b7416d752dedcc Mon Sep 17 00:00:00 2001 From: Paul Dittamo <37558497+pvditt@users.noreply.github.com> Date: Mon, 8 Apr 2024 15:46:50 -0700 Subject: [PATCH 415/645] add cache client read and write otel tracing (#5184) * add cache client read and write otel tracing Signed-off-by: Paul Dittamo * lint Signed-off-by: Paul Dittamo --------- Signed-off-by: Paul Dittamo --- flytepropeller/pkg/controller/nodes/cache.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/flytepropeller/pkg/controller/nodes/cache.go b/flytepropeller/pkg/controller/nodes/cache.go index 5d4c8455a5..59cf21057d 100644 --- a/flytepropeller/pkg/controller/nodes/cache.go +++ b/flytepropeller/pkg/controller/nodes/cache.go @@ -21,6 +21,7 @@ import ( "github.com/flyteorg/flyte/flytepropeller/pkg/controller/nodes/interfaces" "github.com/flyteorg/flyte/flytepropeller/pkg/controller/nodes/task" "github.com/flyteorg/flyte/flytestdlib/logger" + "github.com/flyteorg/flyte/flytestdlib/otelutils" "github.com/flyteorg/flyte/flytestdlib/storage" ) @@ -77,6 +78,8 @@ func updatePhaseCacheInfo(phaseInfo handler.PhaseInfo, cacheStatus *catalog.Stat // CheckCatalogCache uses the handler and contexts to check if cached outputs for the current node // exist. If the exist, this function also copies the outputs to this node. func (n *nodeExecutor) CheckCatalogCache(ctx context.Context, nCtx interfaces.NodeExecutionContext, cacheHandler interfaces.CacheableNodeHandler) (catalog.Entry, error) { + ctx, span := otelutils.NewSpan(ctx, otelutils.FlytePropellerTracer, "pkg.controller.nodes.NodeExecutor/CheckCatalogCache") + defer span.End() catalogKey, err := cacheHandler.GetCatalogKey(ctx, nCtx) if err != nil { return catalog.Entry{}, errors.Wrapf(err, "failed to initialize the catalogKey") @@ -197,6 +200,8 @@ func (n *nodeExecutor) ReleaseCatalogReservation(ctx context.Context, nCtx inter // WriteCatalogCache relays the outputs of this node to the cache. This allows future executions // to reuse these data to avoid recomputation. func (n *nodeExecutor) WriteCatalogCache(ctx context.Context, nCtx interfaces.NodeExecutionContext, cacheHandler interfaces.CacheableNodeHandler) (catalog.Status, error) { + ctx, span := otelutils.NewSpan(ctx, otelutils.FlytePropellerTracer, "pkg.controller.nodes.NodeExecutor/WriteCatalogCache") + defer span.End() catalogKey, err := cacheHandler.GetCatalogKey(ctx, nCtx) if err != nil { return catalog.NewStatus(core.CatalogCacheStatus_CACHE_DISABLED, nil), errors.Wrapf(err, "failed to initialize the catalogKey") From 6a39af7786c5a697bf486667f88d458bf5a2bab2 Mon Sep 17 00:00:00 2001 From: Nikki Everett Date: Tue, 9 Apr 2024 14:43:26 -0500 Subject: [PATCH 416/645] fix link (#5199) Signed-off-by: nikki everett --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 4720be51f7..9370cc9703 100644 --- a/docs/index.md +++ b/docs/index.md @@ -106,7 +106,7 @@ Below are the API reference to the different components of Flyte: - Flyte's official Python SDK. * - {doc}`FlyteCTL ` - Flyte's command-line interface for interacting with a Flyte cluster. -* - {doc}`FlyteIDL ` +* - {doc}`FlyteIDL ` - Flyte's core specification language. ``` From 674367f0c523a8c4432387f9a31727a193df7e6c Mon Sep 17 00:00:00 2001 From: Future-Outlier Date: Wed, 10 Apr 2024 15:44:52 +0800 Subject: [PATCH 417/645] add SyncTask's timeout setting (#5209) Signed-off-by: Future-Outlier --- .../go/tasks/plugins/webapi/agent/plugin.go | 8 +++++--- .../go/tasks/plugins/webapi/agent/plugin_test.go | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go b/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go index cc7f15bd80..03c04b4d27 100644 --- a/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go +++ b/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go @@ -92,12 +92,11 @@ func (p Plugin) Create(ctx context.Context, taskCtx webapi.TaskExecutionContextR taskCategory := admin.TaskCategory{Name: taskTemplate.Type, Version: taskTemplate.TaskTypeVersion} agent, isSync := getFinalAgent(&taskCategory, p.cfg, p.agentRegistry) - finalCtx, cancel := getFinalContext(ctx, "CreateTask", agent) - defer cancel() - taskExecutionMetadata := buildTaskExecutionMetadata(taskCtx.TaskExecutionMetadata()) if isSync { + finalCtx, cancel := getFinalContext(ctx, "ExecuteTaskSync", agent) + defer cancel() client, err := p.getSyncAgentClient(ctx, agent) if err != nil { return nil, nil, err @@ -106,6 +105,9 @@ func (p Plugin) Create(ctx context.Context, taskCtx webapi.TaskExecutionContextR return p.ExecuteTaskSync(finalCtx, client, header, inputs) } + finalCtx, cancel := getFinalContext(ctx, "CreateTask", agent) + defer cancel() + // Use async agent client client, err := p.getAsyncAgentClient(ctx, agent) if err != nil { diff --git a/flyteplugins/go/tasks/plugins/webapi/agent/plugin_test.go b/flyteplugins/go/tasks/plugins/webapi/agent/plugin_test.go index 9fa36c5c42..3e8cb882c8 100644 --- a/flyteplugins/go/tasks/plugins/webapi/agent/plugin_test.go +++ b/flyteplugins/go/tasks/plugins/webapi/agent/plugin_test.go @@ -75,15 +75,26 @@ func TestPlugin(t *testing.T) { t.Run("test getFinalTimeout", func(t *testing.T) { timeout := getFinalTimeout("CreateTask", &Deployment{Endpoint: "localhost:8080", Timeouts: map[string]config.Duration{"CreateTask": {Duration: 1 * time.Millisecond}}}) assert.Equal(t, 1*time.Millisecond, timeout.Duration) + timeout = getFinalTimeout("GetTask", &Deployment{Endpoint: "localhost:8080", Timeouts: map[string]config.Duration{"GetTask": {Duration: 1 * time.Millisecond}}}) + assert.Equal(t, 1*time.Millisecond, timeout.Duration) timeout = getFinalTimeout("DeleteTask", &Deployment{Endpoint: "localhost:8080", DefaultTimeout: config.Duration{Duration: 10 * time.Second}}) assert.Equal(t, 10*time.Second, timeout.Duration) + timeout = getFinalTimeout("ExecuteTaskSync", &Deployment{Endpoint: "localhost:8080", Timeouts: map[string]config.Duration{"ExecuteTaskSync": {Duration: 1 * time.Millisecond}}}) + assert.Equal(t, 1*time.Millisecond, timeout.Duration) }) t.Run("test getFinalContext", func(t *testing.T) { - ctx, _ := getFinalContext(context.TODO(), "DeleteTask", &Deployment{}) + + ctx, _ := getFinalContext(context.TODO(), "CreateTask", &Deployment{Endpoint: "localhost:8080", Timeouts: map[string]config.Duration{"CreateTask": {Duration: 1 * time.Millisecond}}}) + assert.NotEqual(t, context.TODO(), ctx) + + ctx, _ = getFinalContext(context.TODO(), "GetTask", &Deployment{Endpoint: "localhost:8080", Timeouts: map[string]config.Duration{"GetTask": {Duration: 1 * time.Millisecond}}}) + assert.NotEqual(t, context.TODO(), ctx) + + ctx, _ = getFinalContext(context.TODO(), "DeleteTask", &Deployment{}) assert.Equal(t, context.TODO(), ctx) - ctx, _ = getFinalContext(context.TODO(), "CreateTask", &Deployment{Endpoint: "localhost:8080", Timeouts: map[string]config.Duration{"CreateTask": {Duration: 1 * time.Millisecond}}}) + ctx, _ = getFinalContext(context.TODO(), "ExecuteTaskSync", &Deployment{Endpoint: "localhost:8080", Timeouts: map[string]config.Duration{"ExecuteTaskSync": {Duration: 10 * time.Second}}}) assert.NotEqual(t, context.TODO(), ctx) }) From 1ac8bbe8fab8cbde3f40f98ea307e5a3c75bb4fa Mon Sep 17 00:00:00 2001 From: Future-Outlier Date: Wed, 10 Apr 2024 15:46:07 +0800 Subject: [PATCH 418/645] [easy] [flyteagent] Add `agent-service` endpoint settings for `flyte-core` deployment (#5208) Signed-off-by: Future-Outlier --- charts/flyte/README.md | 8 ++++---- charts/flyte/values.yaml | 2 +- deployment/sandbox/flyte_helm_generated.yaml | 6 +++--- docker/sandbox-bundled/manifests/complete-agent.yaml | 4 ++-- docker/sandbox-bundled/manifests/complete.yaml | 4 ++-- docker/sandbox-bundled/manifests/dev.yaml | 4 ++-- docs/deployment/agents/chatgpt.rst | 12 ++++++++++++ docs/flyte_agents/developing_agents.md | 10 ++++++---- .../testing_agents_in_a_local_development_cluster.md | 9 +++++++-- 9 files changed, 39 insertions(+), 20 deletions(-) diff --git a/charts/flyte/README.md b/charts/flyte/README.md index c1820f5a3a..8dad6db9a5 100644 --- a/charts/flyte/README.md +++ b/charts/flyte/README.md @@ -71,7 +71,7 @@ helm upgrade -f values-sandbox.yaml flyte . | contour.tolerations | list | `[]` | tolerations for Contour deployment | | daskoperator | object | `{"enabled":false}` | Optional: Dask Plugin using the Dask Operator | | daskoperator.enabled | bool | `false` | - enable or disable the dask operator deployment installation | -| flyte | object | `{"cluster_resource_manager":{"config":{"cluster_resources":{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}},"enabled":true,"service_account_name":"flyteadmin","templates":[{"key":"aa_namespace","value":"apiVersion: v1\nkind: Namespace\nmetadata:\n name: {{ namespace }}\nspec:\n finalizers:\n - kubernetes\n"},{"key":"ab_project_resource_quota","value":"apiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: project-quota\n namespace: {{ namespace }}\nspec:\n hard:\n limits.cpu: {{ projectQuotaCpu }}\n limits.memory: {{ projectQuotaMemory }}\n"}]},"common":{"databaseSecret":{"name":"","secretManifest":{}},"flyteNamespaceTemplate":{"enabled":false},"ingress":{"albSSLRedirect":false,"annotations":{"nginx.ingress.kubernetes.io/app-root":"/console"},"enabled":true,"host":"","separateGrpcIngress":false,"separateGrpcIngressAnnotations":{"nginx.ingress.kubernetes.io/backend-protocol":"GRPC"},"tls":{"enabled":false},"webpackHMR":true}},"configmap":{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}},"datacatalog":{"affinity":{},"configPath":"/etc/datacatalog/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/datacatalog","tag":"v1.11.1-b1"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"NodePort"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"db":{"admin":{"database":{"dbname":"flyteadmin","host":"postgres","port":5432,"username":"postgres"}},"datacatalog":{"database":{"dbname":"datacatalog","host":"postgres","port":5432,"username":"postgres"}}},"deployRedoc":true,"flyteadmin":{"additionalVolumeMounts":[],"additionalVolumes":[],"affinity":{},"configPath":"/etc/flyte/config/*.yaml","env":[],"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteadmin","tag":"v1.11.1-b1"},"initialProjects":["flytesnacks","flytetester","flyteexamples"],"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"loadBalancerSourceRanges":[],"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flyteconsole":{"affinity":{},"ga":{"enabled":true,"tracking_id":"G-0QW4DJWJ20"},"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteconsole","tag":"v1.10.3"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","memory":"275Mi"},"requests":{"cpu":"10m","memory":"250Mi"}},"service":{"annotations":{},"type":"ClusterIP"},"tolerations":[]},"flytepropeller":{"affinity":{},"cacheSizeMbs":0,"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytepropeller","tag":"v1.11.1-b1"},"manager":false,"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"200m","ephemeral-storage":"100Mi","memory":"200Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flytescheduler":{"affinity":{},"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytescheduler","tag":"v1.11.1-b1"},"nodeSelector":{},"podAnnotations":{},"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"storage":{"bucketName":"my-s3-bucket","custom":{},"gcs":null,"s3":{"region":"us-east-1"},"type":"sandbox"},"webhook":{"enabled":true,"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]}},"workflow_notifications":{"config":{},"enabled":false},"workflow_scheduler":{"enabled":true,"type":"native"}}` | ------------------------------------------------------------------- Core System settings This section consists of Core components of Flyte and their deployment settings. This includes FlyteAdmin service, Datacatalog, FlytePropeller and Flyteconsole | +| flyte | object | `{"cluster_resource_manager":{"config":{"cluster_resources":{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}},"enabled":true,"service_account_name":"flyteadmin","templates":[{"key":"aa_namespace","value":"apiVersion: v1\nkind: Namespace\nmetadata:\n name: {{ namespace }}\nspec:\n finalizers:\n - kubernetes\n"},{"key":"ab_project_resource_quota","value":"apiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: project-quota\n namespace: {{ namespace }}\nspec:\n hard:\n limits.cpu: {{ projectQuotaCpu }}\n limits.memory: {{ projectQuotaMemory }}\n"}]},"common":{"databaseSecret":{"name":"","secretManifest":{}},"flyteNamespaceTemplate":{"enabled":false},"ingress":{"albSSLRedirect":false,"annotations":{"nginx.ingress.kubernetes.io/app-root":"/console"},"enabled":true,"host":"","separateGrpcIngress":false,"separateGrpcIngressAnnotations":{"nginx.ingress.kubernetes.io/backend-protocol":"GRPC"},"tls":{"enabled":false},"webpackHMR":true}},"configmap":{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"container":"container","container_array":"k8s-array","sensor":"agent-service","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}},"datacatalog":{"affinity":{},"configPath":"/etc/datacatalog/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/datacatalog","tag":"v1.11.1-b1"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"NodePort"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"db":{"admin":{"database":{"dbname":"flyteadmin","host":"postgres","port":5432,"username":"postgres"}},"datacatalog":{"database":{"dbname":"datacatalog","host":"postgres","port":5432,"username":"postgres"}}},"deployRedoc":true,"flyteadmin":{"additionalVolumeMounts":[],"additionalVolumes":[],"affinity":{},"configPath":"/etc/flyte/config/*.yaml","env":[],"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteadmin","tag":"v1.11.1-b1"},"initialProjects":["flytesnacks","flytetester","flyteexamples"],"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"loadBalancerSourceRanges":[],"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flyteconsole":{"affinity":{},"ga":{"enabled":true,"tracking_id":"G-0QW4DJWJ20"},"image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flyteconsole","tag":"v1.10.3"},"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"500m","memory":"275Mi"},"requests":{"cpu":"10m","memory":"250Mi"}},"service":{"annotations":{},"type":"ClusterIP"},"tolerations":[]},"flytepropeller":{"affinity":{},"cacheSizeMbs":0,"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytepropeller","tag":"v1.11.1-b1"},"manager":false,"nodeSelector":{},"podAnnotations":{},"replicaCount":1,"resources":{"limits":{"cpu":"200m","ephemeral-storage":"100Mi","memory":"200Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"flytescheduler":{"affinity":{},"configPath":"/etc/flyte/config/*.yaml","image":{"pullPolicy":"IfNotPresent","repository":"cr.flyte.org/flyteorg/flytescheduler","tag":"v1.11.1-b1"},"nodeSelector":{},"podAnnotations":{},"resources":{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}},"secrets":{},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]},"tolerations":[]},"storage":{"bucketName":"my-s3-bucket","custom":{},"gcs":null,"s3":{"region":"us-east-1"},"type":"sandbox"},"webhook":{"enabled":true,"service":{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"ClusterIP"},"serviceAccount":{"annotations":{},"create":true,"imagePullSecrets":[]}},"workflow_notifications":{"config":{},"enabled":false},"workflow_scheduler":{"enabled":true,"type":"native"}}` | ------------------------------------------------------------------- Core System settings This section consists of Core components of Flyte and their deployment settings. This includes FlyteAdmin service, Datacatalog, FlytePropeller and Flyteconsole | | flyte.cluster_resource_manager | object | `{"config":{"cluster_resources":{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}},"enabled":true,"service_account_name":"flyteadmin","templates":[{"key":"aa_namespace","value":"apiVersion: v1\nkind: Namespace\nmetadata:\n name: {{ namespace }}\nspec:\n finalizers:\n - kubernetes\n"},{"key":"ab_project_resource_quota","value":"apiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: project-quota\n namespace: {{ namespace }}\nspec:\n hard:\n limits.cpu: {{ projectQuotaCpu }}\n limits.memory: {{ projectQuotaMemory }}\n"}]}` | Configuration for the Cluster resource manager component. This is an optional component, that enables automatic cluster configuration. This is useful to set default quotas, manage namespaces etc that map to a project/domain | | flyte.cluster_resource_manager.config.cluster_resources | object | `{"customData":[{"production":[{"projectQuotaCpu":{"value":"5"}},{"projectQuotaMemory":{"value":"4000Mi"}}]},{"staging":[{"projectQuotaCpu":{"value":"2"}},{"projectQuotaMemory":{"value":"3000Mi"}}]},{"development":[{"projectQuotaCpu":{"value":"4"}},{"projectQuotaMemory":{"value":"3000Mi"}}]}],"refresh":"5m","refreshInterval":"5m","standaloneDeployment":false,"templatePath":"/etc/flyte/clusterresource/templates"}` | ClusterResource parameters Refer to the [structure](https://pkg.go.dev/github.com/lyft/flyteadmin@v0.3.37/pkg/runtime/interfaces#ClusterResourceConfig) to customize. | | flyte.cluster_resource_manager.config.cluster_resources.standaloneDeployment | bool | `false` | Starts the cluster resource manager in standalone mode with requisite auth credentials to call flyteadmin service endpoints | @@ -91,7 +91,7 @@ helm upgrade -f values-sandbox.yaml flyte . | flyte.common.ingress.separateGrpcIngressAnnotations | object | `{"nginx.ingress.kubernetes.io/backend-protocol":"GRPC"}` | - Extra Ingress annotations applied only to the GRPC ingress. Only makes sense if `separateGrpcIngress` is enabled. | | flyte.common.ingress.tls | object | `{"enabled":false}` | - TLS Settings | | flyte.common.ingress.webpackHMR | bool | `true` | - Enable or disable HMR route to flyteconsole. This is useful only for frontend development. | -| flyte.configmap | object | `{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}}` | ----------------------------------------------------------------- CONFIGMAPS SETTINGS | +| flyte.configmap | object | `{"adminServer":{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}},"catalog":{"catalog-cache":{"endpoint":"datacatalog:89","insecure":true,"type":"datacatalog"}},"console":{"BASE_URL":"/console","CONFIG_DIR":"/etc/flyte/config"},"copilot":{"plugins":{"k8s":{"co-pilot":{"image":"cr.flyte.org/flyteorg/flytecopilot:v1.11.1-b1","name":"flyte-copilot-","start-timeout":"30s"}}}},"core":{"propeller":{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"},"webhook":{"certDir":"/etc/webhook/certs","serviceName":"flyte-pod-webhook"}},"datacatalogServer":{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}},"domain":{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]},"enabled_plugins":{"tasks":{"task-plugins":{"default-for-task-types":{"container":"container","container_array":"k8s-array","sensor":"agent-service","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}},"k8s":{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}},"logger":{"logger":{"level":5,"show-source":true}},"remoteData":{"remoteData":{"region":"us-east-1","scheme":"local","signedUrls":{"durationMinutes":3}}},"resource_manager":{"propeller":{"resourcemanager":{"redis":null,"type":"noop"}}},"task_logs":{"plugins":{"logs":{"cloudwatch-enabled":false,"kubernetes-enabled":true,"kubernetes-template-uri":"http://localhost:30082/#/log/{{ \"{{\" }} .namespace {{ \"}}\" }}/{{ \"{{\" }} .podName {{ \"}}\" }}/pod?namespace={{ \"{{\" }} .namespace {{ \"}}\" }}"}}},"task_resource_defaults":{"task_resources":{"defaults":{"cpu":"100m","memory":"200Mi","storage":"5Mi"},"limits":{"cpu":2,"gpu":1,"memory":"1Gi","storage":"20Mi"}}}}` | ----------------------------------------------------------------- CONFIGMAPS SETTINGS | | flyte.configmap.adminServer | object | `{"auth":{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}},"flyteadmin":{"eventVersion":2,"metadataStoragePrefix":["metadata","admin"],"metricsScope":"flyte:","profilerPort":10254,"roleNameKey":"iam.amazonaws.com/role","testing":{"host":"http://flyteadmin"}},"server":{"grpc":{"port":8089},"httpPort":8088,"security":{"allowCors":true,"allowedHeaders":["Content-Type","flyte-authorization"],"allowedOrigins":["*"],"secure":false,"useAuth":false}}}` | FlyteAdmin server configuration | | flyte.configmap.adminServer.auth | object | `{"appAuth":{"thirdPartyConfig":{"flyteClient":{"clientId":"flytectl","redirectUri":"http://localhost:53593/callback","scopes":["offline","all"]}}},"authorizedUris":["https://localhost:30081","http://flyteadmin:80","http://flyteadmin.flyte.svc.cluster.local:80"],"userAuth":{"openId":{"baseUrl":"https://accounts.google.com","clientId":"657465813211-6eog7ek7li5k7i7fvgv2921075063hpe.apps.googleusercontent.com","scopes":["profile","openid"]}}}` | Authentication configuration | | flyte.configmap.adminServer.server.security.secure | bool | `false` | Controls whether to serve requests over SSL/TLS. | @@ -104,8 +104,8 @@ helm upgrade -f values-sandbox.yaml flyte . | flyte.configmap.core.propeller | object | `{"downstream-eval-duration":"30s","enable-admin-launcher":true,"leader-election":{"enabled":true,"lease-duration":"15s","lock-config-map":{"name":"propeller-leader","namespace":"flyte"},"renew-deadline":"10s","retry-period":"2s"},"limit-namespace":"all","max-workflow-retries":30,"metadata-prefix":"metadata/propeller","metrics-prefix":"flyte","prof-port":10254,"queue":{"batch-size":-1,"batching-interval":"2s","queue":{"base-delay":"5s","capacity":1000,"max-delay":"120s","rate":100,"type":"maxof"},"sub-queue":{"capacity":100,"rate":10,"type":"bucket"},"type":"batch"},"rawoutput-prefix":"s3://my-s3-bucket/","workers":4,"workflow-reeval-duration":"30s"}` | follows the structure specified [here](https://pkg.go.dev/github.com/flyteorg/flytepropeller/pkg/controller/config). | | flyte.configmap.datacatalogServer | object | `{"application":{"grpcPort":8089,"grpcServerReflection":true,"httpPort":8080},"datacatalog":{"metrics-scope":"datacatalog","profiler-port":10254,"storage-prefix":"metadata/datacatalog"}}` | Datacatalog server config | | flyte.configmap.domain | object | `{"domains":[{"id":"development","name":"development"},{"id":"staging","name":"staging"},{"id":"production","name":"production"}]}` | Domains configuration for Flyte projects. This enables the specified number of domains across all projects in Flyte. | -| flyte.configmap.enabled_plugins.tasks | object | `{"task-plugins":{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}` | Tasks specific configuration [structure](https://pkg.go.dev/github.com/flyteorg/flytepropeller/pkg/controller/nodes/task/config#GetConfig) | -| flyte.configmap.enabled_plugins.tasks.task-plugins | object | `{"default-for-task-types":{"bigquery_query_job_task":"agent-service","container":"container","container_array":"k8s-array","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}` | Plugins configuration, [structure](https://pkg.go.dev/github.com/flyteorg/flytepropeller/pkg/controller/nodes/task/config#TaskPluginConfig) | +| flyte.configmap.enabled_plugins.tasks | object | `{"task-plugins":{"default-for-task-types":{"container":"container","container_array":"k8s-array","sensor":"agent-service","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}}` | Tasks specific configuration [structure](https://pkg.go.dev/github.com/flyteorg/flytepropeller/pkg/controller/nodes/task/config#GetConfig) | +| flyte.configmap.enabled_plugins.tasks.task-plugins | object | `{"default-for-task-types":{"container":"container","container_array":"k8s-array","sensor":"agent-service","sidecar":"sidecar"},"enabled-plugins":["container","sidecar","k8s-array","agent-service"]}` | Plugins configuration, [structure](https://pkg.go.dev/github.com/flyteorg/flytepropeller/pkg/controller/nodes/task/config#TaskPluginConfig) | | flyte.configmap.enabled_plugins.tasks.task-plugins.enabled-plugins | list | `["container","sidecar","k8s-array","agent-service"]` | [Enabled Plugins](https://pkg.go.dev/github.com/lyft/flyteplugins/go/tasks/config#Config). Enable sagemaker*, athena if you install the backend plugins | | flyte.configmap.k8s | object | `{"plugins":{"k8s":{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}}}` | Kubernetes specific Flyte configuration | | flyte.configmap.k8s.plugins.k8s | object | `{"default-cpus":"100m","default-env-from-configmaps":[],"default-env-from-secrets":[],"default-env-vars":[{"FLYTE_AWS_ENDPOINT":"http://minio.flyte:9000"},{"FLYTE_AWS_ACCESS_KEY_ID":"minio"},{"FLYTE_AWS_SECRET_ACCESS_KEY":"miniostorage"}],"default-memory":"200Mi"}` | Configuration section for all K8s specific plugins [Configuration structure](https://pkg.go.dev/github.com/lyft/flyteplugins/go/tasks/pluginmachinery/flytek8s/config) | diff --git a/charts/flyte/values.yaml b/charts/flyte/values.yaml index 71c9d7a9af..8ca0b0a7fe 100755 --- a/charts/flyte/values.yaml +++ b/charts/flyte/values.yaml @@ -532,7 +532,7 @@ flyte: container: container sidecar: sidecar container_array: k8s-array - bigquery_query_job_task: agent-service + sensor: agent-service # -- Kubernetes specific Flyte configuration diff --git a/deployment/sandbox/flyte_helm_generated.yaml b/deployment/sandbox/flyte_helm_generated.yaml index e37cea4f37..87270cd8a1 100644 --- a/deployment/sandbox/flyte_helm_generated.yaml +++ b/deployment/sandbox/flyte_helm_generated.yaml @@ -634,9 +634,9 @@ data: tasks: task-plugins: default-for-task-types: - bigquery_query_job_task: agent-service container: container container_array: k8s-array + sensor: agent-service sidecar: sidecar enabled-plugins: - container @@ -7173,7 +7173,7 @@ spec: template: metadata: annotations: - configChecksum: "4fd54a75274d84bbb9a90cc421f7aece12c202911984a436a9ec5fe52e942eb" + configChecksum: "673119651fe870e114e1b95cfbc27a6e5c2418215569ab9d0b9451385c32a51" labels: app.kubernetes.io/name: flytepropeller app.kubernetes.io/instance: flyte @@ -7247,7 +7247,7 @@ spec: app.kubernetes.io/name: flyte-pod-webhook app.kubernetes.io/version: v1.11.1-b1 annotations: - configChecksum: "4fd54a75274d84bbb9a90cc421f7aece12c202911984a436a9ec5fe52e942eb" + configChecksum: "673119651fe870e114e1b95cfbc27a6e5c2418215569ab9d0b9451385c32a51" spec: securityContext: fsGroup: 65534 diff --git a/docker/sandbox-bundled/manifests/complete-agent.yaml b/docker/sandbox-bundled/manifests/complete-agent.yaml index ad926e6109..2db8226933 100644 --- a/docker/sandbox-bundled/manifests/complete-agent.yaml +++ b/docker/sandbox-bundled/manifests/complete-agent.yaml @@ -816,7 +816,7 @@ type: Opaque --- apiVersion: v1 data: - haSharedSecret: SDRTOVJwQzU0WURYTG1NbQ== + haSharedSecret: WEJxZGNCTWJiNFUwZEd1bQ== proxyPassword: "" proxyUsername: "" kind: Secret @@ -1412,7 +1412,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: 1d977a1daf6338c6d55444d6c0565a40353efd71d0a8bef422cfc6387b20a39f + checksum/secret: 45571013e2bcbc17744162363ccc7fc5c99072b2553a3fe29f41660a07e2e864 labels: app: docker-registry release: flyte-sandbox diff --git a/docker/sandbox-bundled/manifests/complete.yaml b/docker/sandbox-bundled/manifests/complete.yaml index 13dc038d3f..98b5aa3657 100644 --- a/docker/sandbox-bundled/manifests/complete.yaml +++ b/docker/sandbox-bundled/manifests/complete.yaml @@ -796,7 +796,7 @@ type: Opaque --- apiVersion: v1 data: - haSharedSecret: MGs1QlJSY2VKM3I0cEQ2bw== + haSharedSecret: a1Zqcm1HUlcxZUN4SExqSw== proxyPassword: "" proxyUsername: "" kind: Secret @@ -1360,7 +1360,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: d2a40d222d6f4b81e6186400d7fc9818c90e07068ccc2569cfdb212ad7782e98 + checksum/secret: bf4abdac7aaf5a74cf2f12f7511d4af46e5c2b8228637c5eb29f9ed5399e4942 labels: app: docker-registry release: flyte-sandbox diff --git a/docker/sandbox-bundled/manifests/dev.yaml b/docker/sandbox-bundled/manifests/dev.yaml index c258d27b9c..49c259b0d9 100644 --- a/docker/sandbox-bundled/manifests/dev.yaml +++ b/docker/sandbox-bundled/manifests/dev.yaml @@ -499,7 +499,7 @@ metadata: --- apiVersion: v1 data: - haSharedSecret: SVFrS2JhOWVndXFEYlE3WA== + haSharedSecret: dkdTTTV4ZkNpc2pneXZBRQ== proxyPassword: "" proxyUsername: "" kind: Secret @@ -934,7 +934,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: b5ff29721af068e75a80eff30c7402def61a64a87c73e8e716d5d06cf05c4bd8 + checksum/secret: 40299f1a8b9fffd1ef10051c289e1d654de7f755fff5f44cde65a9cf96bcd543 labels: app: docker-registry release: flyte-sandbox diff --git a/docs/deployment/agents/chatgpt.rst b/docs/deployment/agents/chatgpt.rst index a810bf5fdf..afc569222f 100644 --- a/docs/deployment/agents/chatgpt.rst +++ b/docs/deployment/agents/chatgpt.rst @@ -38,6 +38,12 @@ Specify agent configuration agent-service: supportedTaskTypes: - chatgpt + # Configuring the timeout is optional. + # Tasks like using ChatGPT with a large model might require a longer time, + # so we have the option to adjust the timeout setting here. + defaultAgent: + timeouts: + ExecuteTaskSync: 10s .. group-tab:: Flyte core @@ -66,6 +72,12 @@ Specify agent configuration agent-service: supportedTaskTypes: - chatgpt + # Configuring the timeout is optional. + # Tasks like using ChatGPT with a large model might require a longer time, + # so we have the option to adjust the timeout setting here. + defaultAgent: + timeouts: + ExecuteTaskSync: 10s Add the OpenAI API token ------------------------------- diff --git a/docs/flyte_agents/developing_agents.md b/docs/flyte_agents/developing_agents.md index 9df49c2f8b..fe55630248 100644 --- a/docs/flyte_agents/developing_agents.md +++ b/docs/flyte_agents/developing_agents.md @@ -184,10 +184,7 @@ kubectl set image deployment/flyteagent flyteagent=ghcr.io/flyteorg/flyteagent:l kubectl rollout restart deployment flytepropeller -n flyte ``` -### 5. - - -### Canary deployment +### 5. Canary deployment Agents can be deployed independently in separate environments. Decoupling agents from the production environment ensures that if any specific agent encounters an error or issue, it will not impact the overall production system. @@ -210,7 +207,12 @@ you can route particular task requests to designated agent services by adjusting endpoint: "dns:///flyteagent.flyte.svc.cluster.local:8000" insecure: true timeouts: + # CreateTask, GetTask and DeleteTask are for async agents. + # ExecuteTaskSync is for sync agents. + CreateTask: 5s GetTask: 5s + DeleteTask: 5s + ExecuteTaskSync: 10s defaultTimeout: 10s agents: custom_agent: diff --git a/docs/flyte_agents/testing_agents_in_a_local_development_cluster.md b/docs/flyte_agents/testing_agents_in_a_local_development_cluster.md index be2c14210d..940385b2fb 100644 --- a/docs/flyte_agents/testing_agents_in_a_local_development_cluster.md +++ b/docs/flyte_agents/testing_agents_in_a_local_development_cluster.md @@ -57,7 +57,7 @@ tasks: - sidecar - K8S-ARRAY default-for-task-types: - - bigquery_query_job_task: agent-service + - sensor: agent-service - container: container - container_array: K8S-ARRAY ``` @@ -69,7 +69,12 @@ plugins: endpoint: "localhost:8000" # your grpc agent server port insecure: true timeouts: - GetTask: 10s + # CreateTask, GetTask and DeleteTask are for async agents. + # ExecuteTaskSync is for sync agents. + CreateTask: 5s + GetTask: 5s + DeleteTask: 5s + ExecuteTaskSync: 10s defaultTimeout: 10s ``` From 8ef5ea9209d1c455a77239d2e32b1c8fcc38cdff Mon Sep 17 00:00:00 2001 From: David Espejo <82604841+davidmirror-ops@users.noreply.github.com> Date: Wed, 10 Apr 2024 12:32:36 -0500 Subject: [PATCH 419/645] Update Monitoring documentation (#5206) * Add reference to prom operator install guide Signed-off-by: davidmirror-ops * Adds info about the three base dashboards Signed-off-by: davidmirror-ops * Adds instructions to enable SMs Signed-off-by: davidmirror-ops * Incorporate reviews Signed-off-by: davidmirror-ops * Minor fixes Signed-off-by: davidmirror-ops * Improve format for steps Signed-off-by: davidmirror-ops --------- Signed-off-by: davidmirror-ops --- docs/deployment/configuration/monitoring.rst | 56 +++++++++++++++++--- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/docs/deployment/configuration/monitoring.rst b/docs/deployment/configuration/monitoring.rst index 75bc89adc4..7b0d9ddc0b 100644 --- a/docs/deployment/configuration/monitoring.rst +++ b/docs/deployment/configuration/monitoring.rst @@ -85,15 +85,55 @@ Use Published Dashboards to Monitor Flyte Deployment Flyte Backend is written in Golang and exposes stats using Prometheus. The stats are labeled with workflow, task, project & domain, wherever appropriate. -The dashboards are divided into two types: +Both ``flyteadmin`` and ``flytepropeller`` are instrumented to expose metrics. To visualize these metrics, Flyte provides three Grafana dashboards, each with a different focus: - **User-facing dashboards**: Dashboards that can be used to triage/investigate/observe performance and characteristics of workflows and tasks. - The user-facing dashboard is published under Grafana marketplace ID `13980 `__. + The user-facing dashboard is published under ID `13980 `__ in the Grafana marketplace. -- **System Dashboards**: Dashboards that are useful for the system maintainer to maintain their Flyte deployments. These are further divided into: - - DataPlane/FlytePropeller dashboards published @ `13979 `__ - - ControlPlane/Flyteadmin dashboards published @ `13981 `__ +- **System Dashboards**: Dashboards that are useful for the system maintainer to investigate the status and performance of their Flyte deployments. These are further divided into: + - `DataPlane/FlytePropeller `__: execution engine status and performance. + - `ControlPlane/Flyteadmin `__: API-level monitoring. + +The corresponding JSON files for each dashboard are also located at ``deployment/stats/prometheus``. + +.. note:: + + The dashboards are basic dashboards and do not include all the metrics exposed by Flyte. + Feel free to use the scripts provided `here `__ to improve and -hopefully- contribute the improved dashboards. + +How to use the dashboards +~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. We recommend installing and configuring the Prometheus operator as described in `their docs `__. +This is especially true if you plan to use the Service Monitors provided by the `flyte-core `__ Helm chart. + +2. Enable the Prometheus instance to use Service Monitors in the namespace where Flyte is running, configuring the following keys in the ``prometheus`` resource: + +.. code-block:: yaml + + spec: + serviceMonitorSelector: {} + serviceMonitorNamespaceSelector: {} + +.. note:: + + The above example configuration lets Prometheus use any ``ServiceMonitor`` in any namespace in the cluster. Adjust the configuration to reduce the scope if needed. + +3. Once you have installed and configured the Prometheus operator, enable the Service Monitors in the Helm chart by configuring the following keys in your ``values`` file: + +.. code-block:: yaml + + flyteadmin: + serviceMonitor: + enabled: true + + flytepropeller: + serviceMonitor: + enabled: true + +.. note:: + + By default, the ``ServiceMonitor`` is configured with a ``scrapeTimeout`` of 30s and and ``interval`` of 60s. You can customize these values if needed. + +With the above configuration in place you should be able to import the dashboards in your Grafana instance. -The above mentioned are basic dashboards and do no include all the metrics exposed by Flyte. -Please help us improve the dashboards by contributing to them 🙏. -Refer to the build scripts `here `__. \ No newline at end of file From dd67ff09284f1167bc397a207506ba7ca2f3b947 Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Wed, 10 Apr 2024 14:18:43 -0700 Subject: [PATCH 420/645] chore: remove obsolete flyte config files (#5196) * chore: remove obsolete flyte config files * nit Signed-off-by: Kevin Su --------- Signed-off-by: Kevin Su --- flyte.yaml | 106 ------------------------------------ flyte_local.yaml | 110 -------------------------------------- flyte_local_k3d.yaml | 104 ----------------------------------- script/setup_local_dev.sh | 4 +- 4 files changed, 2 insertions(+), 322 deletions(-) delete mode 100644 flyte.yaml delete mode 100644 flyte_local.yaml delete mode 100644 flyte_local_k3d.yaml diff --git a/flyte.yaml b/flyte.yaml deleted file mode 100644 index 9835ce0c9d..0000000000 --- a/flyte.yaml +++ /dev/null @@ -1,106 +0,0 @@ -# This is a sample configuration file. -# Real configuration when running inside K8s (local or otherwise) lives in a ConfigMap -# Look in the artifacts directory in the flyte repo for what's actually run -# https://github.com/lyft/flyte/blob/b47565c9998cde32b0b5f995981e3f3c990fa7cd/artifacts/flyteadmin.yaml#L72 -propeller: - rawoutput-prefix: "s3://my-s3-bucket/test/" - kube-config: "/Users/ytong/.flyte/state/kubeconfig" - create-flyteworkflow-crd: true -webhook: - certDir: /tmp/k8s-webhook-server/serving-certs - serviceName: flyte-pod-webhook - localCert: true - servicePort: 30090 - ListenPort: 30090 -tasks: - task-plugins: - enabled-plugins: - - container - - sidecar - - K8S-ARRAY - default-for-task-types: - - container: container - - container_array: K8S-ARRAY -server: - kube-config: "/Users/ytong/.flyte/state/kubeconfig" - httpPort: 30080 - serviceHttpEndpoint: http://localhost:30080/ - grpc: - port: 30081 -flyteadmin: - runScheduler: false -database: - postgres: - port: 30089 - username: postgres - host: localhost - dbname: flyteadmin - options: "sslmode=disable" -storage: - type: minio - connection: - access-key: minio - auth-type: accesskey - secret-key: miniostorage - disable-ssl: true - endpoint: "http://localhost:30084" - region: my-region - cache: - max_size_mbs: 10 - target_gc_percent: 100 - container: "my-s3-bucket" -Logger: - show-source: true - level: 4 -admin: - endpoint: localhost:30081 - insecure: true -plugins: - # All k8s plugins default configuration - k8s: - inject-finalizer: true - default-env-vars: - - AWS_METADATA_SERVICE_TIMEOUT: 5 - - AWS_METADATA_SERVICE_NUM_ATTEMPTS: 20 - - FLYTE_AWS_ENDPOINT: "http://minio.flyte:9000" - - FLYTE_AWS_ACCESS_KEY_ID: minio - - FLYTE_AWS_SECRET_ACCESS_KEY: miniostorage - # Logging configuration - logs: - kubernetes-enabled: true - kubernetes-url: "http://localhost:30082" - kubernetes-template-uri: "http://localhost:30082/#/log/{{ .namespace }}/{{ .podName }}/pod?namespace={{ .namespace }}" -cluster_resources: - refreshInterval: 5m - templatePath: "/etc/flyte/clusterresource/templates" - # -- Starts the cluster resource manager in standalone mode with requisite auth credentials to call flyteadmin service endpoints - standaloneDeployment: false - customData: - - production: - - projectQuotaCpu: - value: "8" - - projectQuotaMemory: - value: "16Gi" - - staging: - - projectQuotaCpu: - value: "8" - - projectQuotaMemory: - value: "16Gi" - - development: - - projectQuotaCpu: - value: "8" - - projectQuotaMemory: - value: "16Gi" - refresh: 5m -task_resources: - defaults: - cpu: 500m - memory: 1Gi - limits: - cpu: 2 - memory: 4Gi - gpu: 5 -catalog-cache: - endpoint: localhost:8081 - insecure: true - type: datacatalog diff --git a/flyte_local.yaml b/flyte_local.yaml deleted file mode 100644 index bcb2333440..0000000000 --- a/flyte_local.yaml +++ /dev/null @@ -1,110 +0,0 @@ -# This is a sample configuration file. -# Real configuration when running inside K8s (local or otherwise) lives in a ConfigMap -# Look in the artifacts directory in the flyte repo for what's actually run -# https://github.com/lyft/flyte/blob/b47565c9998cde32b0b5f995981e3f3c990fa7cd/artifacts/flyteadmin.yaml#L72 -# Flyte clusters can be run locally with this configuration -# flytectl demo start --dev -# flyte start --config flyte_local.yaml -propeller: - rawoutput-prefix: "s3://my-s3-bucket/test/" - kube-config: "$HOME/.flyte/sandbox/kubeconfig" - create-flyteworkflow-crd: true -webhook: - certDir: /tmp/k8s-webhook-server/serving-certs - serviceName: flyte-pod-webhook - localCert: true - servicePort: 9443 -tasks: - task-plugins: - enabled-plugins: - - container - - sidecar - - K8S-ARRAY - default-for-task-types: - - container: container - - container_array: K8S-ARRAY -server: - kube-config: "$HOME/.flyte/sandbox/kubeconfig" -flyteadmin: - runScheduler: false -database: - postgres: - port: 30001 - username: postgres - password: postgres - host: localhost - dbname: flyteadmin - options: "sslmode=disable" -storage: - type: minio - connection: - access-key: minio - auth-type: accesskey - secret-key: miniostorage - disable-ssl: true - endpoint: "http://localhost:30002" - region: my-region - cache: - max_size_mbs: 10 - target_gc_percent: 100 - container: "my-s3-bucket" -Logger: - show-source: true - level: 5 -admin: - endpoint: localhost:8089 - insecure: true -plugins: - # All k8s plugins default configuration - k8s: - inject-finalizer: true - default-env-vars: - - AWS_METADATA_SERVICE_TIMEOUT: 5 - - AWS_METADATA_SERVICE_NUM_ATTEMPTS: 20 - - FLYTE_AWS_ENDPOINT: "http://flyte-sandbox-minio.flyte:9000" - - FLYTE_AWS_ACCESS_KEY_ID: minio - - FLYTE_AWS_SECRET_ACCESS_KEY: miniostorage - # Logging configuration - logs: - kubernetes-enabled: true - kubernetes-template-uri: http://localhost:30080/kubernetes-dashboard/#/log/{{.namespace }}/{{ .podName }}/pod?namespace={{ .namespace }} -cluster_resources: - refreshInterval: 5m - templatePath: "/etc/flyte/clusterresource/templates" - # -- Starts the cluster resource manager in standalone mode with requisite auth credentials to call flyteadmin service endpoints - standaloneDeployment: false - customData: - - production: - - projectQuotaCpu: - value: "8" - - projectQuotaMemory: - value: "16Gi" - - staging: - - projectQuotaCpu: - value: "8" - - projectQuotaMemory: - value: "16Gi" - - development: - - projectQuotaCpu: - value: "8" - - projectQuotaMemory: - value: "16Gi" - refresh: 5m -flyte: - admin: - disableClusterResourceManager: true - disableScheduler: true - propeller: - disableWebhook: true -task_resources: - defaults: - cpu: 500m - memory: 1Gi - limits: - cpu: 2 - memory: 4Gi - gpu: 5 -catalog-cache: - endpoint: localhost:8081 - insecure: true - type: datacatalog diff --git a/flyte_local_k3d.yaml b/flyte_local_k3d.yaml deleted file mode 100644 index df15b58708..0000000000 --- a/flyte_local_k3d.yaml +++ /dev/null @@ -1,104 +0,0 @@ -# This is a sample configuration file. -# Real configuration when running inside K8s (local or otherwise) lives in a ConfigMap -# Look in the artifacts directory in the flyte repo for what's actually run -# https://github.com/lyft/flyte/blob/b47565c9998cde32b0b5f995981e3f3c990fa7cd/artifacts/flyteadmin.yaml#L72 -propeller: - rawoutput-prefix: "s3://my-s3-bucket/test/" - kube-config: "$HOME/.k3d/kubeconfig-flyte.yaml" - create-flyteworkflow-crd: true -webhook: - certDir: /tmp/k8s-webhook-server/serving-certs - serviceName: flyte-pod-webhook - localCert: true - servicePort: 9443 -tasks: - task-plugins: - enabled-plugins: - - container - - sidecar - - K8S-ARRAY - default-for-task-types: - - container: container - - container_array: K8S-ARRAY -server: - kube-config: "$HOME/.k3d/kubeconfig-flyte.yaml" -flyteadmin: - runScheduler: false -database: - postgres: - port: 30089 - username: postgres - host: localhost - dbname: flyteadmin - options: "sslmode=disable" -storage: - type: minio - connection: - access-key: minio - auth-type: accesskey - secret-key: miniostorage - disable-ssl: true - endpoint: "http://localhost:30084" - region: my-region - cache: - max_size_mbs: 10 - target_gc_percent: 100 - container: "my-s3-bucket" -Logger: - show-source: true - level: 5 -admin: - endpoint: localhost:8089 - insecure: true -plugins: - # All k8s plugins default configuration - k8s: - inject-finalizer: true - default-env-vars: - - AWS_METADATA_SERVICE_TIMEOUT: 5 - - AWS_METADATA_SERVICE_NUM_ATTEMPTS: 20 - - FLYTE_AWS_ENDPOINT: "http://minio.flyte:9000" - - FLYTE_AWS_ACCESS_KEY_ID: minio - - FLYTE_AWS_SECRET_ACCESS_KEY: miniostorage - # Logging configuration - logs: - kubernetes-enabled: true - kubernetes-url: "http://localhost:30082" -cluster_resources: - refreshInterval: 5m - templatePath: "/etc/flyte/clusterresource/templates" - # -- Starts the cluster resource manager in standalone mode with requisite auth credentials to call flyteadmin service endpoints - standaloneDeployment: false - customData: - - production: - - projectQuotaCpu: - value: "8" - - projectQuotaMemory: - value: "16Gi" - - staging: - - projectQuotaCpu: - value: "8" - - projectQuotaMemory: - value: "16Gi" - - development: - - projectQuotaCpu: - value: "8" - - projectQuotaMemory: - value: "16Gi" - refresh: 5m -task_resources: - defaults: - cpu: 500m - memory: 1Gi - limits: - cpu: 2 - memory: 4Gi - gpu: 5 -flyte: - admin: - disableClusterResourceManager: true - disableScheduler: true -catalog-cache: - endpoint: localhost:8081 - insecure: true - type: datacatalog \ No newline at end of file diff --git a/script/setup_local_dev.sh b/script/setup_local_dev.sh index 2889738656..9fbefeb9c1 100644 --- a/script/setup_local_dev.sh +++ b/script/setup_local_dev.sh @@ -8,7 +8,7 @@ : "${K3D_INSTALL_URL:="https://raw.githubusercontent.com/rancher/k3d/main/install.sh"}" # URL to k3d installer script : "${K3S_VERSION:="v1.21.1-k3s1"}" # version of k3s to run in k3d cluster, empty value uses default specified by k3d install : "${K3D_CLUSTER_NAME:="flyte"}" # name of k3d cluster to be used -: "${K3D_KUBECONFIG_FILE_PATH:="${HOME}/.k3d/kubeconfig-${K3D_CLUSTER_NAME}.yaml"}" # file path to store kubeconfig file for k3d cluster at +: "${K3D_KUBECONFIG_FILE_PATH:="${HOME}/.flyte/sandbox/kubeconfig"}" # file path to store kubeconfig file for k3d cluster at : "${KUBECTL_VERSION:=""}" # version of kubectl to install, empty value uses latest available : "${KUBECTL_INSTALL_URL:="https://dl.k8s.io/release/VERSION/bin/linux/amd64/kubectl"}" # URL to kubectl binary, include VERSION to be replaced with KUBECTL_VERSION @@ -170,4 +170,4 @@ kubectl wait --for=condition=available deployment/minio deployment/postgres -n $ mkdir -p /tmp/k8s-webhook-server/serving-certs echo -e "\n*** Successfully set up local development environment." -echo -e "*** Run \"flyte start --config flyte_local_k3d.yaml\" to start your local flyte installation.\n" +echo -e "*** Run \"flyte start --config flyte-single-binary-local.yaml\" to start your local flyte installation.\n" From 6be49e820c8e1028191b6d629a2ca728eb08d5c4 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Thu, 11 Apr 2024 03:58:55 -0400 Subject: [PATCH 421/645] Generate rust grpc using tonic (#5187) Signed-off-by: Eduardo Apolinario Co-authored-by: Eduardo Apolinario --- flyteidl/buf.gen.yaml | 2 + flyteidl/gen/pb_rust/datacatalog.rs | 3 +- flyteidl/gen/pb_rust/datacatalog.tonic.rs | 999 ++ flyteidl/gen/pb_rust/flyteidl.cacheservice.rs | 3 +- .../pb_rust/flyteidl.cacheservice.tonic.rs | 619 ++ flyteidl/gen/pb_rust/flyteidl.service.rs | 3 +- .../gen/pb_rust/flyteidl.service.tonic.rs | 8850 +++++++++++++++++ 7 files changed, 10476 insertions(+), 3 deletions(-) create mode 100644 flyteidl/gen/pb_rust/datacatalog.tonic.rs create mode 100644 flyteidl/gen/pb_rust/flyteidl.cacheservice.tonic.rs create mode 100644 flyteidl/gen/pb_rust/flyteidl.service.tonic.rs diff --git a/flyteidl/buf.gen.yaml b/flyteidl/buf.gen.yaml index 8bea491bf4..903801000a 100644 --- a/flyteidl/buf.gen.yaml +++ b/flyteidl/buf.gen.yaml @@ -10,6 +10,8 @@ plugins: out: gen/pb_python - plugin: buf.build/community/neoeinstein-prost out: gen/pb_rust + - plugin: buf.build/community/neoeinstein-tonic:v0.4.0 + out: gen/pb_rust - plugin: buf.build/protocolbuffers/go:v1.30.0 out: gen/pb-go opt: diff --git a/flyteidl/gen/pb_rust/datacatalog.rs b/flyteidl/gen/pb_rust/datacatalog.rs index ac2c695cab..f181704954 100644 --- a/flyteidl/gen/pb_rust/datacatalog.rs +++ b/flyteidl/gen/pb_rust/datacatalog.rs @@ -562,4 +562,5 @@ pub mod pagination_options { } } } -// @@protoc_insertion_point(module) +include!("datacatalog.tonic.rs"); +// @@protoc_insertion_point(module) \ No newline at end of file diff --git a/flyteidl/gen/pb_rust/datacatalog.tonic.rs b/flyteidl/gen/pb_rust/datacatalog.tonic.rs new file mode 100644 index 0000000000..e07a5269c4 --- /dev/null +++ b/flyteidl/gen/pb_rust/datacatalog.tonic.rs @@ -0,0 +1,999 @@ +// @generated +/// Generated client implementations. +pub mod data_catalog_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct DataCatalogClient { + inner: tonic::client::Grpc, + } + impl DataCatalogClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl DataCatalogClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> DataCatalogClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + DataCatalogClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn create_dataset( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/datacatalog.DataCatalog/CreateDataset", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("datacatalog.DataCatalog", "CreateDataset")); + self.inner.unary(req, path, codec).await + } + pub async fn get_dataset( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/datacatalog.DataCatalog/GetDataset", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("datacatalog.DataCatalog", "GetDataset")); + self.inner.unary(req, path, codec).await + } + pub async fn create_artifact( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/datacatalog.DataCatalog/CreateArtifact", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("datacatalog.DataCatalog", "CreateArtifact")); + self.inner.unary(req, path, codec).await + } + pub async fn get_artifact( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/datacatalog.DataCatalog/GetArtifact", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("datacatalog.DataCatalog", "GetArtifact")); + self.inner.unary(req, path, codec).await + } + pub async fn add_tag( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/datacatalog.DataCatalog/AddTag", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("datacatalog.DataCatalog", "AddTag")); + self.inner.unary(req, path, codec).await + } + pub async fn list_artifacts( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/datacatalog.DataCatalog/ListArtifacts", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("datacatalog.DataCatalog", "ListArtifacts")); + self.inner.unary(req, path, codec).await + } + pub async fn list_datasets( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/datacatalog.DataCatalog/ListDatasets", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("datacatalog.DataCatalog", "ListDatasets")); + self.inner.unary(req, path, codec).await + } + pub async fn update_artifact( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/datacatalog.DataCatalog/UpdateArtifact", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("datacatalog.DataCatalog", "UpdateArtifact")); + self.inner.unary(req, path, codec).await + } + pub async fn get_or_extend_reservation( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/datacatalog.DataCatalog/GetOrExtendReservation", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("datacatalog.DataCatalog", "GetOrExtendReservation"), + ); + self.inner.unary(req, path, codec).await + } + pub async fn release_reservation( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/datacatalog.DataCatalog/ReleaseReservation", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("datacatalog.DataCatalog", "ReleaseReservation"), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod data_catalog_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with DataCatalogServer. + #[async_trait] + pub trait DataCatalog: Send + Sync + 'static { + async fn create_dataset( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_dataset( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn create_artifact( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_artifact( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn add_tag( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + async fn list_artifacts( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn list_datasets( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn update_artifact( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_or_extend_reservation( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn release_reservation( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct DataCatalogServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl DataCatalogServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for DataCatalogServer + where + T: DataCatalog, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/datacatalog.DataCatalog/CreateDataset" => { + #[allow(non_camel_case_types)] + struct CreateDatasetSvc(pub Arc); + impl< + T: DataCatalog, + > tonic::server::UnaryService + for CreateDatasetSvc { + type Response = super::CreateDatasetResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_dataset(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateDatasetSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/datacatalog.DataCatalog/GetDataset" => { + #[allow(non_camel_case_types)] + struct GetDatasetSvc(pub Arc); + impl< + T: DataCatalog, + > tonic::server::UnaryService + for GetDatasetSvc { + type Response = super::GetDatasetResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_dataset(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetDatasetSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/datacatalog.DataCatalog/CreateArtifact" => { + #[allow(non_camel_case_types)] + struct CreateArtifactSvc(pub Arc); + impl< + T: DataCatalog, + > tonic::server::UnaryService + for CreateArtifactSvc { + type Response = super::CreateArtifactResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_artifact(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateArtifactSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/datacatalog.DataCatalog/GetArtifact" => { + #[allow(non_camel_case_types)] + struct GetArtifactSvc(pub Arc); + impl< + T: DataCatalog, + > tonic::server::UnaryService + for GetArtifactSvc { + type Response = super::GetArtifactResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_artifact(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetArtifactSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/datacatalog.DataCatalog/AddTag" => { + #[allow(non_camel_case_types)] + struct AddTagSvc(pub Arc); + impl< + T: DataCatalog, + > tonic::server::UnaryService + for AddTagSvc { + type Response = super::AddTagResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::add_tag(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = AddTagSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/datacatalog.DataCatalog/ListArtifacts" => { + #[allow(non_camel_case_types)] + struct ListArtifactsSvc(pub Arc); + impl< + T: DataCatalog, + > tonic::server::UnaryService + for ListArtifactsSvc { + type Response = super::ListArtifactsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_artifacts(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListArtifactsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/datacatalog.DataCatalog/ListDatasets" => { + #[allow(non_camel_case_types)] + struct ListDatasetsSvc(pub Arc); + impl< + T: DataCatalog, + > tonic::server::UnaryService + for ListDatasetsSvc { + type Response = super::ListDatasetsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_datasets(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListDatasetsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/datacatalog.DataCatalog/UpdateArtifact" => { + #[allow(non_camel_case_types)] + struct UpdateArtifactSvc(pub Arc); + impl< + T: DataCatalog, + > tonic::server::UnaryService + for UpdateArtifactSvc { + type Response = super::UpdateArtifactResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_artifact(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdateArtifactSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/datacatalog.DataCatalog/GetOrExtendReservation" => { + #[allow(non_camel_case_types)] + struct GetOrExtendReservationSvc(pub Arc); + impl< + T: DataCatalog, + > tonic::server::UnaryService + for GetOrExtendReservationSvc { + type Response = super::GetOrExtendReservationResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_or_extend_reservation( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetOrExtendReservationSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/datacatalog.DataCatalog/ReleaseReservation" => { + #[allow(non_camel_case_types)] + struct ReleaseReservationSvc(pub Arc); + impl< + T: DataCatalog, + > tonic::server::UnaryService + for ReleaseReservationSvc { + type Response = super::ReleaseReservationResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::release_reservation(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ReleaseReservationSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for DataCatalogServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for DataCatalogServer { + const NAME: &'static str = "datacatalog.DataCatalog"; + } +} diff --git a/flyteidl/gen/pb_rust/flyteidl.cacheservice.rs b/flyteidl/gen/pb_rust/flyteidl.cacheservice.rs index 9f2122fc4e..ff3264c633 100644 --- a/flyteidl/gen/pb_rust/flyteidl.cacheservice.rs +++ b/flyteidl/gen/pb_rust/flyteidl.cacheservice.rs @@ -169,4 +169,5 @@ pub struct ReleaseReservationRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct ReleaseReservationResponse { } -// @@protoc_insertion_point(module) +include!("flyteidl.cacheservice.tonic.rs"); +// @@protoc_insertion_point(module) \ No newline at end of file diff --git a/flyteidl/gen/pb_rust/flyteidl.cacheservice.tonic.rs b/flyteidl/gen/pb_rust/flyteidl.cacheservice.tonic.rs new file mode 100644 index 0000000000..5138db427a --- /dev/null +++ b/flyteidl/gen/pb_rust/flyteidl.cacheservice.tonic.rs @@ -0,0 +1,619 @@ +// @generated +/// Generated client implementations. +pub mod cache_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct CacheServiceClient { + inner: tonic::client::Grpc, + } + impl CacheServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl CacheServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> CacheServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + CacheServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn get( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.cacheservice.CacheService/Get", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.cacheservice.CacheService", "Get")); + self.inner.unary(req, path, codec).await + } + pub async fn put( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.cacheservice.CacheService/Put", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.cacheservice.CacheService", "Put")); + self.inner.unary(req, path, codec).await + } + pub async fn delete( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.cacheservice.CacheService/Delete", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.cacheservice.CacheService", "Delete")); + self.inner.unary(req, path, codec).await + } + pub async fn get_or_extend_reservation( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.cacheservice.CacheService/GetOrExtendReservation", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.cacheservice.CacheService", + "GetOrExtendReservation", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn release_reservation( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.cacheservice.CacheService/ReleaseReservation", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.cacheservice.CacheService", + "ReleaseReservation", + ), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod cache_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with CacheServiceServer. + #[async_trait] + pub trait CacheService: Send + Sync + 'static { + async fn get( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn put( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn delete( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_or_extend_reservation( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn release_reservation( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct CacheServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl CacheServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for CacheServiceServer + where + T: CacheService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/flyteidl.cacheservice.CacheService/Get" => { + #[allow(non_camel_case_types)] + struct GetSvc(pub Arc); + impl< + T: CacheService, + > tonic::server::UnaryService for GetSvc { + type Response = super::GetCacheResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.cacheservice.CacheService/Put" => { + #[allow(non_camel_case_types)] + struct PutSvc(pub Arc); + impl< + T: CacheService, + > tonic::server::UnaryService for PutSvc { + type Response = super::PutCacheResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::put(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = PutSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.cacheservice.CacheService/Delete" => { + #[allow(non_camel_case_types)] + struct DeleteSvc(pub Arc); + impl< + T: CacheService, + > tonic::server::UnaryService + for DeleteSvc { + type Response = super::DeleteCacheResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::delete(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = DeleteSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.cacheservice.CacheService/GetOrExtendReservation" => { + #[allow(non_camel_case_types)] + struct GetOrExtendReservationSvc(pub Arc); + impl< + T: CacheService, + > tonic::server::UnaryService + for GetOrExtendReservationSvc { + type Response = super::GetOrExtendReservationResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_or_extend_reservation( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetOrExtendReservationSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.cacheservice.CacheService/ReleaseReservation" => { + #[allow(non_camel_case_types)] + struct ReleaseReservationSvc(pub Arc); + impl< + T: CacheService, + > tonic::server::UnaryService + for ReleaseReservationSvc { + type Response = super::ReleaseReservationResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::release_reservation(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ReleaseReservationSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for CacheServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for CacheServiceServer { + const NAME: &'static str = "flyteidl.cacheservice.CacheService"; + } +} diff --git a/flyteidl/gen/pb_rust/flyteidl.service.rs b/flyteidl/gen/pb_rust/flyteidl.service.rs index b5a6b8b052..2fb065da4e 100644 --- a/flyteidl/gen/pb_rust/flyteidl.service.rs +++ b/flyteidl/gen/pb_rust/flyteidl.service.rs @@ -408,4 +408,5 @@ pub struct UserInfoResponse { #[prost(message, optional, tag="8")] pub additional_claims: ::core::option::Option<::prost_types::Struct>, } -// @@protoc_insertion_point(module) +include!("flyteidl.service.tonic.rs"); +// @@protoc_insertion_point(module) \ No newline at end of file diff --git a/flyteidl/gen/pb_rust/flyteidl.service.tonic.rs b/flyteidl/gen/pb_rust/flyteidl.service.tonic.rs new file mode 100644 index 0000000000..7fed85e2ed --- /dev/null +++ b/flyteidl/gen/pb_rust/flyteidl.service.tonic.rs @@ -0,0 +1,8850 @@ +// @generated +/// Generated client implementations. +pub mod admin_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /** The following defines an RPC service that is also served over HTTP via grpc-gateway. + Standard response codes for both are defined here: https://github.com/grpc-ecosystem/grpc-gateway/blob/master/runtime/errors.go +*/ + #[derive(Debug, Clone)] + pub struct AdminServiceClient { + inner: tonic::client::Grpc, + } + impl AdminServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl AdminServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> AdminServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + AdminServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /** Create and upload a :ref:`ref_flyteidl.admin.Task` definition +*/ + pub async fn create_task( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/CreateTask", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.service.AdminService", "CreateTask")); + self.inner.unary(req, path, codec).await + } + /** Fetch a :ref:`ref_flyteidl.admin.Task` definition. +*/ + pub async fn get_task( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetTask", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.service.AdminService", "GetTask")); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.NamedEntityIdentifier` of task objects. +*/ + pub async fn list_task_ids( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::NamedEntityIdentifierListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListTaskIds", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.service.AdminService", "ListTaskIds")); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.Task` definitions. +*/ + pub async fn list_tasks( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListTasks", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.service.AdminService", "ListTasks")); + self.inner.unary(req, path, codec).await + } + /** Create and upload a :ref:`ref_flyteidl.admin.Workflow` definition +*/ + pub async fn create_workflow( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/CreateWorkflow", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "CreateWorkflow"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a :ref:`ref_flyteidl.admin.Workflow` definition. +*/ + pub async fn get_workflow( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetWorkflow", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.service.AdminService", "GetWorkflow")); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.NamedEntityIdentifier` of workflow objects. +*/ + pub async fn list_workflow_ids( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::NamedEntityIdentifierListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListWorkflowIds", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "ListWorkflowIds"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.Workflow` definitions. +*/ + pub async fn list_workflows( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListWorkflows", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "ListWorkflows"), + ); + self.inner.unary(req, path, codec).await + } + /** Create and upload a :ref:`ref_flyteidl.admin.LaunchPlan` definition +*/ + pub async fn create_launch_plan( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::LaunchPlanCreateRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/CreateLaunchPlan", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "CreateLaunchPlan"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a :ref:`ref_flyteidl.admin.LaunchPlan` definition. +*/ + pub async fn get_launch_plan( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetLaunchPlan", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "GetLaunchPlan"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch the active version of a :ref:`ref_flyteidl.admin.LaunchPlan`. +*/ + pub async fn get_active_launch_plan( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ActiveLaunchPlanRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetActiveLaunchPlan", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "GetActiveLaunchPlan", + ), + ); + self.inner.unary(req, path, codec).await + } + /** List active versions of :ref:`ref_flyteidl.admin.LaunchPlan`. +*/ + pub async fn list_active_launch_plans( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ActiveLaunchPlanListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListActiveLaunchPlans", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "ListActiveLaunchPlans", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.NamedEntityIdentifier` of launch plan objects. +*/ + pub async fn list_launch_plan_ids( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::NamedEntityIdentifierListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListLaunchPlanIds", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "ListLaunchPlanIds"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.LaunchPlan` definitions. +*/ + pub async fn list_launch_plans( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListLaunchPlans", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "ListLaunchPlans"), + ); + self.inner.unary(req, path, codec).await + } + /** Updates the status of a registered :ref:`ref_flyteidl.admin.LaunchPlan`. +*/ + pub async fn update_launch_plan( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::LaunchPlanUpdateRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/UpdateLaunchPlan", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "UpdateLaunchPlan"), + ); + self.inner.unary(req, path, codec).await + } + /** Triggers the creation of a :ref:`ref_flyteidl.admin.Execution` +*/ + pub async fn create_execution( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/CreateExecution", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "CreateExecution"), + ); + self.inner.unary(req, path, codec).await + } + /** Triggers the creation of an identical :ref:`ref_flyteidl.admin.Execution` +*/ + pub async fn relaunch_execution( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ExecutionRelaunchRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/RelaunchExecution", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "RelaunchExecution"), + ); + self.inner.unary(req, path, codec).await + } + /** Recreates a previously-run workflow execution that will only start executing from the last known failure point. + In Recover mode, users cannot change any input parameters or update the version of the execution. + This is extremely useful to recover from system errors and byzantine faults like - Loss of K8s cluster, bugs in platform or instability, machine failures, + downstream system failures (downstream services), or simply to recover executions that failed because of retry exhaustion and should complete if tried again. + See :ref:`ref_flyteidl.admin.ExecutionRecoverRequest` for more details. +*/ + pub async fn recover_execution( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ExecutionRecoverRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/RecoverExecution", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "RecoverExecution"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches a :ref:`ref_flyteidl.admin.Execution`. +*/ + pub async fn get_execution( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::WorkflowExecutionGetRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetExecution", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "GetExecution"), + ); + self.inner.unary(req, path, codec).await + } + /** Update execution belonging to project domain :ref:`ref_flyteidl.admin.Execution`. +*/ + pub async fn update_execution( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/UpdateExecution", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "UpdateExecution"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches input and output data for a :ref:`ref_flyteidl.admin.Execution`. +*/ + pub async fn get_execution_data( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::WorkflowExecutionGetDataRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetExecutionData", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "GetExecutionData"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.Execution`. +*/ + pub async fn list_executions( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListExecutions", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "ListExecutions"), + ); + self.inner.unary(req, path, codec).await + } + /** Terminates an in-progress :ref:`ref_flyteidl.admin.Execution`. +*/ + pub async fn terminate_execution( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ExecutionTerminateRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/TerminateExecution", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "TerminateExecution", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches a :ref:`ref_flyteidl.admin.NodeExecution`. +*/ + pub async fn get_node_execution( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::NodeExecutionGetRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetNodeExecution", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "GetNodeExecution"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches a :ref:`ref_flyteidl.admin.DynamicNodeWorkflowResponse`. +*/ + pub async fn get_dynamic_node_workflow( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::GetDynamicNodeWorkflowRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetDynamicNodeWorkflow", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "GetDynamicNodeWorkflow", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.NodeExecution`. +*/ + pub async fn list_node_executions( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::NodeExecutionListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListNodeExecutions", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "ListNodeExecutions", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.NodeExecution` launched by the reference :ref:`ref_flyteidl.admin.TaskExecution`. +*/ + pub async fn list_node_executions_for_task( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::NodeExecutionForTaskListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListNodeExecutionsForTask", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "ListNodeExecutionsForTask", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches input and output data for a :ref:`ref_flyteidl.admin.NodeExecution`. +*/ + pub async fn get_node_execution_data( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::NodeExecutionGetDataRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetNodeExecutionData", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "GetNodeExecutionData", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Registers a :ref:`ref_flyteidl.admin.Project` with the Flyte deployment. +*/ + pub async fn register_project( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/RegisterProject", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "RegisterProject"), + ); + self.inner.unary(req, path, codec).await + } + /** Updates an existing :ref:`ref_flyteidl.admin.Project` + flyteidl.admin.Project should be passed but the domains property should be empty; + it will be ignored in the handler as domains cannot be updated via this API. +*/ + pub async fn update_project( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/UpdateProject", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "UpdateProject"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches a :ref:`ref_flyteidl.admin.Project` +*/ + pub async fn get_project( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetProject", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.service.AdminService", "GetProject")); + self.inner.unary(req, path, codec).await + } + /** Fetches a list of :ref:`ref_flyteidl.admin.Project` +*/ + pub async fn list_projects( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListProjects", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "ListProjects"), + ); + self.inner.unary(req, path, codec).await + } + /** Indicates a :ref:`ref_flyteidl.event.WorkflowExecutionEvent` has occurred. +*/ + pub async fn create_workflow_event( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::WorkflowExecutionEventRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/CreateWorkflowEvent", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "CreateWorkflowEvent", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Indicates a :ref:`ref_flyteidl.event.NodeExecutionEvent` has occurred. +*/ + pub async fn create_node_event( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::NodeExecutionEventRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/CreateNodeEvent", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "CreateNodeEvent"), + ); + self.inner.unary(req, path, codec).await + } + /** Indicates a :ref:`ref_flyteidl.event.TaskExecutionEvent` has occurred. +*/ + pub async fn create_task_event( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::TaskExecutionEventRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/CreateTaskEvent", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "CreateTaskEvent"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches a :ref:`ref_flyteidl.admin.TaskExecution`. +*/ + pub async fn get_task_execution( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::TaskExecutionGetRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetTaskExecution", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "GetTaskExecution"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches a list of :ref:`ref_flyteidl.admin.TaskExecution`. +*/ + pub async fn list_task_executions( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::TaskExecutionListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListTaskExecutions", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "ListTaskExecutions", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches input and output data for a :ref:`ref_flyteidl.admin.TaskExecution`. +*/ + pub async fn get_task_execution_data( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::TaskExecutionGetDataRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetTaskExecutionData", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "GetTaskExecutionData", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Creates or updates custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project and domain. +*/ + pub async fn update_project_domain_attributes( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ProjectDomainAttributesUpdateRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/UpdateProjectDomainAttributes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "UpdateProjectDomainAttributes", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project and domain. +*/ + pub async fn get_project_domain_attributes( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ProjectDomainAttributesGetRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetProjectDomainAttributes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "GetProjectDomainAttributes", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Deletes custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project and domain. +*/ + pub async fn delete_project_domain_attributes( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ProjectDomainAttributesDeleteRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/DeleteProjectDomainAttributes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "DeleteProjectDomainAttributes", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Creates or updates custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` at the project level +*/ + pub async fn update_project_attributes( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ProjectAttributesUpdateRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/UpdateProjectAttributes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "UpdateProjectAttributes", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project and domain. +*/ + pub async fn get_project_attributes( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ProjectAttributesGetRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetProjectAttributes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "GetProjectAttributes", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Deletes custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project and domain. +*/ + pub async fn delete_project_attributes( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ProjectAttributesDeleteRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/DeleteProjectAttributes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "DeleteProjectAttributes", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Creates or updates custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project, domain and workflow. +*/ + pub async fn update_workflow_attributes( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::WorkflowAttributesUpdateRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/UpdateWorkflowAttributes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "UpdateWorkflowAttributes", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project, domain and workflow. +*/ + pub async fn get_workflow_attributes( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::WorkflowAttributesGetRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetWorkflowAttributes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "GetWorkflowAttributes", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Deletes custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project, domain and workflow. +*/ + pub async fn delete_workflow_attributes( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::WorkflowAttributesDeleteRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/DeleteWorkflowAttributes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "DeleteWorkflowAttributes", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Lists custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a specific resource type. +*/ + pub async fn list_matchable_attributes( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::ListMatchableAttributesRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListMatchableAttributes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "ListMatchableAttributes", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Returns a list of :ref:`ref_flyteidl.admin.NamedEntity` objects. +*/ + pub async fn list_named_entities( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListNamedEntities", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "ListNamedEntities"), + ); + self.inner.unary(req, path, codec).await + } + /** Returns a :ref:`ref_flyteidl.admin.NamedEntity` object. +*/ + pub async fn get_named_entity( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetNamedEntity", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "GetNamedEntity"), + ); + self.inner.unary(req, path, codec).await + } + /** Updates a :ref:`ref_flyteidl.admin.NamedEntity` object. +*/ + pub async fn update_named_entity( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::NamedEntityUpdateRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/UpdateNamedEntity", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AdminService", "UpdateNamedEntity"), + ); + self.inner.unary(req, path, codec).await + } + /// + pub async fn get_version( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetVersion", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.service.AdminService", "GetVersion")); + self.inner.unary(req, path, codec).await + } + /** Fetch a :ref:`ref_flyteidl.admin.DescriptionEntity` object. +*/ + pub async fn get_description_entity( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetDescriptionEntity", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "GetDescriptionEntity", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.DescriptionEntity` definitions. +*/ + pub async fn list_description_entities( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::DescriptionEntityListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/ListDescriptionEntities", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "ListDescriptionEntities", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetches runtime metrics for a :ref:`ref_flyteidl.admin.Execution`. +*/ + pub async fn get_execution_metrics( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::WorkflowExecutionGetMetricsRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AdminService/GetExecutionMetrics", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AdminService", + "GetExecutionMetrics", + ), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod admin_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with AdminServiceServer. + #[async_trait] + pub trait AdminService: Send + Sync + 'static { + /** Create and upload a :ref:`ref_flyteidl.admin.Task` definition +*/ + async fn create_task( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a :ref:`ref_flyteidl.admin.Task` definition. +*/ + async fn get_task( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.NamedEntityIdentifier` of task objects. +*/ + async fn list_task_ids( + &self, + request: tonic::Request< + super::super::admin::NamedEntityIdentifierListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.Task` definitions. +*/ + async fn list_tasks( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Create and upload a :ref:`ref_flyteidl.admin.Workflow` definition +*/ + async fn create_workflow( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a :ref:`ref_flyteidl.admin.Workflow` definition. +*/ + async fn get_workflow( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.NamedEntityIdentifier` of workflow objects. +*/ + async fn list_workflow_ids( + &self, + request: tonic::Request< + super::super::admin::NamedEntityIdentifierListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.Workflow` definitions. +*/ + async fn list_workflows( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Create and upload a :ref:`ref_flyteidl.admin.LaunchPlan` definition +*/ + async fn create_launch_plan( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a :ref:`ref_flyteidl.admin.LaunchPlan` definition. +*/ + async fn get_launch_plan( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch the active version of a :ref:`ref_flyteidl.admin.LaunchPlan`. +*/ + async fn get_active_launch_plan( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** List active versions of :ref:`ref_flyteidl.admin.LaunchPlan`. +*/ + async fn list_active_launch_plans( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.NamedEntityIdentifier` of launch plan objects. +*/ + async fn list_launch_plan_ids( + &self, + request: tonic::Request< + super::super::admin::NamedEntityIdentifierListRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.LaunchPlan` definitions. +*/ + async fn list_launch_plans( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Updates the status of a registered :ref:`ref_flyteidl.admin.LaunchPlan`. +*/ + async fn update_launch_plan( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Triggers the creation of a :ref:`ref_flyteidl.admin.Execution` +*/ + async fn create_execution( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Triggers the creation of an identical :ref:`ref_flyteidl.admin.Execution` +*/ + async fn relaunch_execution( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Recreates a previously-run workflow execution that will only start executing from the last known failure point. + In Recover mode, users cannot change any input parameters or update the version of the execution. + This is extremely useful to recover from system errors and byzantine faults like - Loss of K8s cluster, bugs in platform or instability, machine failures, + downstream system failures (downstream services), or simply to recover executions that failed because of retry exhaustion and should complete if tried again. + See :ref:`ref_flyteidl.admin.ExecutionRecoverRequest` for more details. +*/ + async fn recover_execution( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches a :ref:`ref_flyteidl.admin.Execution`. +*/ + async fn get_execution( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Update execution belonging to project domain :ref:`ref_flyteidl.admin.Execution`. +*/ + async fn update_execution( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches input and output data for a :ref:`ref_flyteidl.admin.Execution`. +*/ + async fn get_execution_data( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.Execution`. +*/ + async fn list_executions( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Terminates an in-progress :ref:`ref_flyteidl.admin.Execution`. +*/ + async fn terminate_execution( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches a :ref:`ref_flyteidl.admin.NodeExecution`. +*/ + async fn get_node_execution( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches a :ref:`ref_flyteidl.admin.DynamicNodeWorkflowResponse`. +*/ + async fn get_dynamic_node_workflow( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.NodeExecution`. +*/ + async fn list_node_executions( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.NodeExecution` launched by the reference :ref:`ref_flyteidl.admin.TaskExecution`. +*/ + async fn list_node_executions_for_task( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches input and output data for a :ref:`ref_flyteidl.admin.NodeExecution`. +*/ + async fn get_node_execution_data( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Registers a :ref:`ref_flyteidl.admin.Project` with the Flyte deployment. +*/ + async fn register_project( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Updates an existing :ref:`ref_flyteidl.admin.Project` + flyteidl.admin.Project should be passed but the domains property should be empty; + it will be ignored in the handler as domains cannot be updated via this API. +*/ + async fn update_project( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches a :ref:`ref_flyteidl.admin.Project` +*/ + async fn get_project( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches a list of :ref:`ref_flyteidl.admin.Project` +*/ + async fn list_projects( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Indicates a :ref:`ref_flyteidl.event.WorkflowExecutionEvent` has occurred. +*/ + async fn create_workflow_event( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Indicates a :ref:`ref_flyteidl.event.NodeExecutionEvent` has occurred. +*/ + async fn create_node_event( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Indicates a :ref:`ref_flyteidl.event.TaskExecutionEvent` has occurred. +*/ + async fn create_task_event( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches a :ref:`ref_flyteidl.admin.TaskExecution`. +*/ + async fn get_task_execution( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches a list of :ref:`ref_flyteidl.admin.TaskExecution`. +*/ + async fn list_task_executions( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches input and output data for a :ref:`ref_flyteidl.admin.TaskExecution`. +*/ + async fn get_task_execution_data( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Creates or updates custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project and domain. +*/ + async fn update_project_domain_attributes( + &self, + request: tonic::Request< + super::super::admin::ProjectDomainAttributesUpdateRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project and domain. +*/ + async fn get_project_domain_attributes( + &self, + request: tonic::Request< + super::super::admin::ProjectDomainAttributesGetRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Deletes custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project and domain. +*/ + async fn delete_project_domain_attributes( + &self, + request: tonic::Request< + super::super::admin::ProjectDomainAttributesDeleteRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Creates or updates custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` at the project level +*/ + async fn update_project_attributes( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project and domain. +*/ + async fn get_project_attributes( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Deletes custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project and domain. +*/ + async fn delete_project_attributes( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Creates or updates custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project, domain and workflow. +*/ + async fn update_workflow_attributes( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project, domain and workflow. +*/ + async fn get_workflow_attributes( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Deletes custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a project, domain and workflow. +*/ + async fn delete_workflow_attributes( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Lists custom :ref:`ref_flyteidl.admin.MatchableAttributesConfiguration` for a specific resource type. +*/ + async fn list_matchable_attributes( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Returns a list of :ref:`ref_flyteidl.admin.NamedEntity` objects. +*/ + async fn list_named_entities( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Returns a :ref:`ref_flyteidl.admin.NamedEntity` object. +*/ + async fn get_named_entity( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Updates a :ref:`ref_flyteidl.admin.NamedEntity` object. +*/ + async fn update_named_entity( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// + async fn get_version( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a :ref:`ref_flyteidl.admin.DescriptionEntity` object. +*/ + async fn get_description_entity( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.DescriptionEntity` definitions. +*/ + async fn list_description_entities( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetches runtime metrics for a :ref:`ref_flyteidl.admin.Execution`. +*/ + async fn get_execution_metrics( + &self, + request: tonic::Request< + super::super::admin::WorkflowExecutionGetMetricsRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /** The following defines an RPC service that is also served over HTTP via grpc-gateway. + Standard response codes for both are defined here: https://github.com/grpc-ecosystem/grpc-gateway/blob/master/runtime/errors.go +*/ + #[derive(Debug)] + pub struct AdminServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl AdminServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for AdminServiceServer + where + T: AdminService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/flyteidl.service.AdminService/CreateTask" => { + #[allow(non_camel_case_types)] + struct CreateTaskSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService + for CreateTaskSvc { + type Response = super::super::admin::TaskCreateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::TaskCreateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_task(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateTaskSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetTask" => { + #[allow(non_camel_case_types)] + struct GetTaskSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService + for GetTaskSvc { + type Response = super::super::admin::Task; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ObjectGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_task(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetTaskSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListTaskIds" => { + #[allow(non_camel_case_types)] + struct ListTaskIdsSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NamedEntityIdentifierListRequest, + > for ListTaskIdsSvc { + type Response = super::super::admin::NamedEntityIdentifierList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NamedEntityIdentifierListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_task_ids(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListTaskIdsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListTasks" => { + #[allow(non_camel_case_types)] + struct ListTasksSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ResourceListRequest, + > for ListTasksSvc { + type Response = super::super::admin::TaskList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ResourceListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_tasks(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListTasksSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/CreateWorkflow" => { + #[allow(non_camel_case_types)] + struct CreateWorkflowSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::WorkflowCreateRequest, + > for CreateWorkflowSvc { + type Response = super::super::admin::WorkflowCreateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::WorkflowCreateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_workflow(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateWorkflowSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetWorkflow" => { + #[allow(non_camel_case_types)] + struct GetWorkflowSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService + for GetWorkflowSvc { + type Response = super::super::admin::Workflow; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ObjectGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_workflow(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetWorkflowSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListWorkflowIds" => { + #[allow(non_camel_case_types)] + struct ListWorkflowIdsSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NamedEntityIdentifierListRequest, + > for ListWorkflowIdsSvc { + type Response = super::super::admin::NamedEntityIdentifierList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NamedEntityIdentifierListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_workflow_ids(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListWorkflowIdsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListWorkflows" => { + #[allow(non_camel_case_types)] + struct ListWorkflowsSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ResourceListRequest, + > for ListWorkflowsSvc { + type Response = super::super::admin::WorkflowList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ResourceListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_workflows(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListWorkflowsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/CreateLaunchPlan" => { + #[allow(non_camel_case_types)] + struct CreateLaunchPlanSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::LaunchPlanCreateRequest, + > for CreateLaunchPlanSvc { + type Response = super::super::admin::LaunchPlanCreateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::LaunchPlanCreateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_launch_plan(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateLaunchPlanSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetLaunchPlan" => { + #[allow(non_camel_case_types)] + struct GetLaunchPlanSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService + for GetLaunchPlanSvc { + type Response = super::super::admin::LaunchPlan; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ObjectGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_launch_plan(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetLaunchPlanSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetActiveLaunchPlan" => { + #[allow(non_camel_case_types)] + struct GetActiveLaunchPlanSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ActiveLaunchPlanRequest, + > for GetActiveLaunchPlanSvc { + type Response = super::super::admin::LaunchPlan; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ActiveLaunchPlanRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_active_launch_plan(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetActiveLaunchPlanSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListActiveLaunchPlans" => { + #[allow(non_camel_case_types)] + struct ListActiveLaunchPlansSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ActiveLaunchPlanListRequest, + > for ListActiveLaunchPlansSvc { + type Response = super::super::admin::LaunchPlanList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ActiveLaunchPlanListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_active_launch_plans( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListActiveLaunchPlansSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListLaunchPlanIds" => { + #[allow(non_camel_case_types)] + struct ListLaunchPlanIdsSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NamedEntityIdentifierListRequest, + > for ListLaunchPlanIdsSvc { + type Response = super::super::admin::NamedEntityIdentifierList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NamedEntityIdentifierListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_launch_plan_ids(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListLaunchPlanIdsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListLaunchPlans" => { + #[allow(non_camel_case_types)] + struct ListLaunchPlansSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ResourceListRequest, + > for ListLaunchPlansSvc { + type Response = super::super::admin::LaunchPlanList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ResourceListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_launch_plans(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListLaunchPlansSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/UpdateLaunchPlan" => { + #[allow(non_camel_case_types)] + struct UpdateLaunchPlanSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::LaunchPlanUpdateRequest, + > for UpdateLaunchPlanSvc { + type Response = super::super::admin::LaunchPlanUpdateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::LaunchPlanUpdateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_launch_plan(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdateLaunchPlanSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/CreateExecution" => { + #[allow(non_camel_case_types)] + struct CreateExecutionSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ExecutionCreateRequest, + > for CreateExecutionSvc { + type Response = super::super::admin::ExecutionCreateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ExecutionCreateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_execution(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateExecutionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/RelaunchExecution" => { + #[allow(non_camel_case_types)] + struct RelaunchExecutionSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ExecutionRelaunchRequest, + > for RelaunchExecutionSvc { + type Response = super::super::admin::ExecutionCreateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ExecutionRelaunchRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::relaunch_execution(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = RelaunchExecutionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/RecoverExecution" => { + #[allow(non_camel_case_types)] + struct RecoverExecutionSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ExecutionRecoverRequest, + > for RecoverExecutionSvc { + type Response = super::super::admin::ExecutionCreateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ExecutionRecoverRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::recover_execution(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = RecoverExecutionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetExecution" => { + #[allow(non_camel_case_types)] + struct GetExecutionSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::WorkflowExecutionGetRequest, + > for GetExecutionSvc { + type Response = super::super::admin::Execution; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::WorkflowExecutionGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_execution(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetExecutionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/UpdateExecution" => { + #[allow(non_camel_case_types)] + struct UpdateExecutionSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ExecutionUpdateRequest, + > for UpdateExecutionSvc { + type Response = super::super::admin::ExecutionUpdateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ExecutionUpdateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_execution(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdateExecutionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetExecutionData" => { + #[allow(non_camel_case_types)] + struct GetExecutionDataSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::WorkflowExecutionGetDataRequest, + > for GetExecutionDataSvc { + type Response = super::super::admin::WorkflowExecutionGetDataResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::WorkflowExecutionGetDataRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_execution_data(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetExecutionDataSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListExecutions" => { + #[allow(non_camel_case_types)] + struct ListExecutionsSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ResourceListRequest, + > for ListExecutionsSvc { + type Response = super::super::admin::ExecutionList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ResourceListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_executions(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListExecutionsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/TerminateExecution" => { + #[allow(non_camel_case_types)] + struct TerminateExecutionSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ExecutionTerminateRequest, + > for TerminateExecutionSvc { + type Response = super::super::admin::ExecutionTerminateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ExecutionTerminateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::terminate_execution(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = TerminateExecutionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetNodeExecution" => { + #[allow(non_camel_case_types)] + struct GetNodeExecutionSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NodeExecutionGetRequest, + > for GetNodeExecutionSvc { + type Response = super::super::admin::NodeExecution; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NodeExecutionGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_node_execution(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetNodeExecutionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetDynamicNodeWorkflow" => { + #[allow(non_camel_case_types)] + struct GetDynamicNodeWorkflowSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::GetDynamicNodeWorkflowRequest, + > for GetDynamicNodeWorkflowSvc { + type Response = super::super::admin::DynamicNodeWorkflowResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::GetDynamicNodeWorkflowRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_dynamic_node_workflow( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetDynamicNodeWorkflowSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListNodeExecutions" => { + #[allow(non_camel_case_types)] + struct ListNodeExecutionsSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NodeExecutionListRequest, + > for ListNodeExecutionsSvc { + type Response = super::super::admin::NodeExecutionList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NodeExecutionListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_node_executions(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListNodeExecutionsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListNodeExecutionsForTask" => { + #[allow(non_camel_case_types)] + struct ListNodeExecutionsForTaskSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NodeExecutionForTaskListRequest, + > for ListNodeExecutionsForTaskSvc { + type Response = super::super::admin::NodeExecutionList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NodeExecutionForTaskListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_node_executions_for_task( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListNodeExecutionsForTaskSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetNodeExecutionData" => { + #[allow(non_camel_case_types)] + struct GetNodeExecutionDataSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NodeExecutionGetDataRequest, + > for GetNodeExecutionDataSvc { + type Response = super::super::admin::NodeExecutionGetDataResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NodeExecutionGetDataRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_node_execution_data( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetNodeExecutionDataSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/RegisterProject" => { + #[allow(non_camel_case_types)] + struct RegisterProjectSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ProjectRegisterRequest, + > for RegisterProjectSvc { + type Response = super::super::admin::ProjectRegisterResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ProjectRegisterRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::register_project(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = RegisterProjectSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/UpdateProject" => { + #[allow(non_camel_case_types)] + struct UpdateProjectSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService + for UpdateProjectSvc { + type Response = super::super::admin::ProjectUpdateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_project(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdateProjectSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetProject" => { + #[allow(non_camel_case_types)] + struct GetProjectSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService + for GetProjectSvc { + type Response = super::super::admin::Project; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ProjectGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_project(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetProjectSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListProjects" => { + #[allow(non_camel_case_types)] + struct ListProjectsSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ProjectListRequest, + > for ListProjectsSvc { + type Response = super::super::admin::Projects; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ProjectListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_projects(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListProjectsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/CreateWorkflowEvent" => { + #[allow(non_camel_case_types)] + struct CreateWorkflowEventSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::WorkflowExecutionEventRequest, + > for CreateWorkflowEventSvc { + type Response = super::super::admin::WorkflowExecutionEventResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::WorkflowExecutionEventRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_workflow_event(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateWorkflowEventSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/CreateNodeEvent" => { + #[allow(non_camel_case_types)] + struct CreateNodeEventSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NodeExecutionEventRequest, + > for CreateNodeEventSvc { + type Response = super::super::admin::NodeExecutionEventResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NodeExecutionEventRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_node_event(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateNodeEventSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/CreateTaskEvent" => { + #[allow(non_camel_case_types)] + struct CreateTaskEventSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::TaskExecutionEventRequest, + > for CreateTaskEventSvc { + type Response = super::super::admin::TaskExecutionEventResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::TaskExecutionEventRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_task_event(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateTaskEventSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetTaskExecution" => { + #[allow(non_camel_case_types)] + struct GetTaskExecutionSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::TaskExecutionGetRequest, + > for GetTaskExecutionSvc { + type Response = super::super::admin::TaskExecution; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::TaskExecutionGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_task_execution(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetTaskExecutionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListTaskExecutions" => { + #[allow(non_camel_case_types)] + struct ListTaskExecutionsSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::TaskExecutionListRequest, + > for ListTaskExecutionsSvc { + type Response = super::super::admin::TaskExecutionList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::TaskExecutionListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_task_executions(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListTaskExecutionsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetTaskExecutionData" => { + #[allow(non_camel_case_types)] + struct GetTaskExecutionDataSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::TaskExecutionGetDataRequest, + > for GetTaskExecutionDataSvc { + type Response = super::super::admin::TaskExecutionGetDataResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::TaskExecutionGetDataRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_task_execution_data( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetTaskExecutionDataSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/UpdateProjectDomainAttributes" => { + #[allow(non_camel_case_types)] + struct UpdateProjectDomainAttributesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ProjectDomainAttributesUpdateRequest, + > for UpdateProjectDomainAttributesSvc { + type Response = super::super::admin::ProjectDomainAttributesUpdateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ProjectDomainAttributesUpdateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_project_domain_attributes( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdateProjectDomainAttributesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetProjectDomainAttributes" => { + #[allow(non_camel_case_types)] + struct GetProjectDomainAttributesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ProjectDomainAttributesGetRequest, + > for GetProjectDomainAttributesSvc { + type Response = super::super::admin::ProjectDomainAttributesGetResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ProjectDomainAttributesGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_project_domain_attributes( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetProjectDomainAttributesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/DeleteProjectDomainAttributes" => { + #[allow(non_camel_case_types)] + struct DeleteProjectDomainAttributesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ProjectDomainAttributesDeleteRequest, + > for DeleteProjectDomainAttributesSvc { + type Response = super::super::admin::ProjectDomainAttributesDeleteResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ProjectDomainAttributesDeleteRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::delete_project_domain_attributes( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = DeleteProjectDomainAttributesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/UpdateProjectAttributes" => { + #[allow(non_camel_case_types)] + struct UpdateProjectAttributesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ProjectAttributesUpdateRequest, + > for UpdateProjectAttributesSvc { + type Response = super::super::admin::ProjectAttributesUpdateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ProjectAttributesUpdateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_project_attributes( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdateProjectAttributesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetProjectAttributes" => { + #[allow(non_camel_case_types)] + struct GetProjectAttributesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ProjectAttributesGetRequest, + > for GetProjectAttributesSvc { + type Response = super::super::admin::ProjectAttributesGetResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ProjectAttributesGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_project_attributes(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetProjectAttributesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/DeleteProjectAttributes" => { + #[allow(non_camel_case_types)] + struct DeleteProjectAttributesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ProjectAttributesDeleteRequest, + > for DeleteProjectAttributesSvc { + type Response = super::super::admin::ProjectAttributesDeleteResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ProjectAttributesDeleteRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::delete_project_attributes( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = DeleteProjectAttributesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/UpdateWorkflowAttributes" => { + #[allow(non_camel_case_types)] + struct UpdateWorkflowAttributesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::WorkflowAttributesUpdateRequest, + > for UpdateWorkflowAttributesSvc { + type Response = super::super::admin::WorkflowAttributesUpdateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::WorkflowAttributesUpdateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_workflow_attributes( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdateWorkflowAttributesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetWorkflowAttributes" => { + #[allow(non_camel_case_types)] + struct GetWorkflowAttributesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::WorkflowAttributesGetRequest, + > for GetWorkflowAttributesSvc { + type Response = super::super::admin::WorkflowAttributesGetResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::WorkflowAttributesGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_workflow_attributes( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetWorkflowAttributesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/DeleteWorkflowAttributes" => { + #[allow(non_camel_case_types)] + struct DeleteWorkflowAttributesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::WorkflowAttributesDeleteRequest, + > for DeleteWorkflowAttributesSvc { + type Response = super::super::admin::WorkflowAttributesDeleteResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::WorkflowAttributesDeleteRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::delete_workflow_attributes( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = DeleteWorkflowAttributesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListMatchableAttributes" => { + #[allow(non_camel_case_types)] + struct ListMatchableAttributesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::ListMatchableAttributesRequest, + > for ListMatchableAttributesSvc { + type Response = super::super::admin::ListMatchableAttributesResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ListMatchableAttributesRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_matchable_attributes( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListMatchableAttributesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListNamedEntities" => { + #[allow(non_camel_case_types)] + struct ListNamedEntitiesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NamedEntityListRequest, + > for ListNamedEntitiesSvc { + type Response = super::super::admin::NamedEntityList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NamedEntityListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_named_entities(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListNamedEntitiesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetNamedEntity" => { + #[allow(non_camel_case_types)] + struct GetNamedEntitySvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NamedEntityGetRequest, + > for GetNamedEntitySvc { + type Response = super::super::admin::NamedEntity; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NamedEntityGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_named_entity(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetNamedEntitySvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/UpdateNamedEntity" => { + #[allow(non_camel_case_types)] + struct UpdateNamedEntitySvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::NamedEntityUpdateRequest, + > for UpdateNamedEntitySvc { + type Response = super::super::admin::NamedEntityUpdateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::NamedEntityUpdateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_named_entity(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UpdateNamedEntitySvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetVersion" => { + #[allow(non_camel_case_types)] + struct GetVersionSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService + for GetVersionSvc { + type Response = super::super::admin::GetVersionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::GetVersionRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_version(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetVersionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetDescriptionEntity" => { + #[allow(non_camel_case_types)] + struct GetDescriptionEntitySvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService + for GetDescriptionEntitySvc { + type Response = super::super::admin::DescriptionEntity; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ObjectGetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_description_entity(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetDescriptionEntitySvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/ListDescriptionEntities" => { + #[allow(non_camel_case_types)] + struct ListDescriptionEntitiesSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::DescriptionEntityListRequest, + > for ListDescriptionEntitiesSvc { + type Response = super::super::admin::DescriptionEntityList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::DescriptionEntityListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_description_entities( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListDescriptionEntitiesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AdminService/GetExecutionMetrics" => { + #[allow(non_camel_case_types)] + struct GetExecutionMetricsSvc(pub Arc); + impl< + T: AdminService, + > tonic::server::UnaryService< + super::super::admin::WorkflowExecutionGetMetricsRequest, + > for GetExecutionMetricsSvc { + type Response = super::super::admin::WorkflowExecutionGetMetricsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::WorkflowExecutionGetMetricsRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_execution_metrics(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetExecutionMetricsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for AdminServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for AdminServiceServer { + const NAME: &'static str = "flyteidl.service.AdminService"; + } +} +/// Generated client implementations. +pub mod sync_agent_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct SyncAgentServiceClient { + inner: tonic::client::Grpc, + } + impl SyncAgentServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl SyncAgentServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> SyncAgentServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + SyncAgentServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /** ExecuteTaskSync streams the create request and inputs to the agent service and streams the outputs back. +*/ + pub async fn execute_task_sync( + &mut self, + request: impl tonic::IntoStreamingRequest< + Message = super::super::admin::ExecuteTaskSyncRequest, + >, + ) -> std::result::Result< + tonic::Response< + tonic::codec::Streaming, + >, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.SyncAgentService/ExecuteTaskSync", + ); + let mut req = request.into_streaming_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.SyncAgentService", + "ExecuteTaskSync", + ), + ); + self.inner.streaming(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod sync_agent_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with SyncAgentServiceServer. + #[async_trait] + pub trait SyncAgentService: Send + Sync + 'static { + /// Server streaming response type for the ExecuteTaskSync method. + type ExecuteTaskSyncStream: tonic::codegen::tokio_stream::Stream< + Item = std::result::Result< + super::super::admin::ExecuteTaskSyncResponse, + tonic::Status, + >, + > + + Send + + 'static; + /** ExecuteTaskSync streams the create request and inputs to the agent service and streams the outputs back. +*/ + async fn execute_task_sync( + &self, + request: tonic::Request< + tonic::Streaming, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct SyncAgentServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl SyncAgentServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for SyncAgentServiceServer + where + T: SyncAgentService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/flyteidl.service.SyncAgentService/ExecuteTaskSync" => { + #[allow(non_camel_case_types)] + struct ExecuteTaskSyncSvc(pub Arc); + impl< + T: SyncAgentService, + > tonic::server::StreamingService< + super::super::admin::ExecuteTaskSyncRequest, + > for ExecuteTaskSyncSvc { + type Response = super::super::admin::ExecuteTaskSyncResponse; + type ResponseStream = T::ExecuteTaskSyncStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + tonic::Streaming< + super::super::admin::ExecuteTaskSyncRequest, + >, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::execute_task_sync(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ExecuteTaskSyncSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for SyncAgentServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for SyncAgentServiceServer { + const NAME: &'static str = "flyteidl.service.SyncAgentService"; + } +} +/// Generated client implementations. +pub mod async_agent_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /** AsyncAgentService defines an RPC Service that allows propeller to send the request to the agent server asynchronously. +*/ + #[derive(Debug, Clone)] + pub struct AsyncAgentServiceClient { + inner: tonic::client::Grpc, + } + impl AsyncAgentServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl AsyncAgentServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> AsyncAgentServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + AsyncAgentServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /** CreateTask sends a task create request to the agent service. +*/ + pub async fn create_task( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AsyncAgentService/CreateTask", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AsyncAgentService", "CreateTask"), + ); + self.inner.unary(req, path, codec).await + } + /** Get job status. +*/ + pub async fn get_task( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AsyncAgentService/GetTask", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AsyncAgentService", "GetTask"), + ); + self.inner.unary(req, path, codec).await + } + /** Delete the task resource. +*/ + pub async fn delete_task( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AsyncAgentService/DeleteTask", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AsyncAgentService", "DeleteTask"), + ); + self.inner.unary(req, path, codec).await + } + /** GetTaskMetrics returns one or more task execution metrics, if available. + + Errors include + * OutOfRange if metrics are not available for the specified task time range + * various other errors +*/ + pub async fn get_task_metrics( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AsyncAgentService/GetTaskMetrics", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AsyncAgentService", + "GetTaskMetrics", + ), + ); + self.inner.unary(req, path, codec).await + } + /** GetTaskLogs returns task execution logs, if available. +*/ + pub async fn get_task_logs( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response< + tonic::codec::Streaming, + >, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AsyncAgentService/GetTaskLogs", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AsyncAgentService", "GetTaskLogs"), + ); + self.inner.server_streaming(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod async_agent_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with AsyncAgentServiceServer. + #[async_trait] + pub trait AsyncAgentService: Send + Sync + 'static { + /** CreateTask sends a task create request to the agent service. +*/ + async fn create_task( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Get job status. +*/ + async fn get_task( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Delete the task resource. +*/ + async fn delete_task( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** GetTaskMetrics returns one or more task execution metrics, if available. + + Errors include + * OutOfRange if metrics are not available for the specified task time range + * various other errors +*/ + async fn get_task_metrics( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// Server streaming response type for the GetTaskLogs method. + type GetTaskLogsStream: tonic::codegen::tokio_stream::Stream< + Item = std::result::Result< + super::super::admin::GetTaskLogsResponse, + tonic::Status, + >, + > + + Send + + 'static; + /** GetTaskLogs returns task execution logs, if available. +*/ + async fn get_task_logs( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /** AsyncAgentService defines an RPC Service that allows propeller to send the request to the agent server asynchronously. +*/ + #[derive(Debug)] + pub struct AsyncAgentServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl AsyncAgentServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for AsyncAgentServiceServer + where + T: AsyncAgentService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/flyteidl.service.AsyncAgentService/CreateTask" => { + #[allow(non_camel_case_types)] + struct CreateTaskSvc(pub Arc); + impl< + T: AsyncAgentService, + > tonic::server::UnaryService + for CreateTaskSvc { + type Response = super::super::admin::CreateTaskResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::CreateTaskRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_task(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateTaskSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AsyncAgentService/GetTask" => { + #[allow(non_camel_case_types)] + struct GetTaskSvc(pub Arc); + impl< + T: AsyncAgentService, + > tonic::server::UnaryService + for GetTaskSvc { + type Response = super::super::admin::GetTaskResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_task(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetTaskSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AsyncAgentService/DeleteTask" => { + #[allow(non_camel_case_types)] + struct DeleteTaskSvc(pub Arc); + impl< + T: AsyncAgentService, + > tonic::server::UnaryService + for DeleteTaskSvc { + type Response = super::super::admin::DeleteTaskResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::DeleteTaskRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::delete_task(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = DeleteTaskSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AsyncAgentService/GetTaskMetrics" => { + #[allow(non_camel_case_types)] + struct GetTaskMetricsSvc(pub Arc); + impl< + T: AsyncAgentService, + > tonic::server::UnaryService< + super::super::admin::GetTaskMetricsRequest, + > for GetTaskMetricsSvc { + type Response = super::super::admin::GetTaskMetricsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::GetTaskMetricsRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_task_metrics(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetTaskMetricsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AsyncAgentService/GetTaskLogs" => { + #[allow(non_camel_case_types)] + struct GetTaskLogsSvc(pub Arc); + impl< + T: AsyncAgentService, + > tonic::server::ServerStreamingService< + super::super::admin::GetTaskLogsRequest, + > for GetTaskLogsSvc { + type Response = super::super::admin::GetTaskLogsResponse; + type ResponseStream = T::GetTaskLogsStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::GetTaskLogsRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_task_logs(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetTaskLogsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for AsyncAgentServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService + for AsyncAgentServiceServer { + const NAME: &'static str = "flyteidl.service.AsyncAgentService"; + } +} +/// Generated client implementations. +pub mod agent_metadata_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /** AgentMetadataService defines an RPC service that is also served over HTTP via grpc-gateway. + This service allows propeller or users to get the metadata of agents. +*/ + #[derive(Debug, Clone)] + pub struct AgentMetadataServiceClient { + inner: tonic::client::Grpc, + } + impl AgentMetadataServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl AgentMetadataServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> AgentMetadataServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + AgentMetadataServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /** Fetch a :ref:`ref_flyteidl.admin.Agent` definition. +*/ + pub async fn get_agent( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AgentMetadataService/GetAgent", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.AgentMetadataService", "GetAgent"), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.Agent` definitions. +*/ + pub async fn list_agents( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AgentMetadataService/ListAgents", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AgentMetadataService", + "ListAgents", + ), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod agent_metadata_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with AgentMetadataServiceServer. + #[async_trait] + pub trait AgentMetadataService: Send + Sync + 'static { + /** Fetch a :ref:`ref_flyteidl.admin.Agent` definition. +*/ + async fn get_agent( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.Agent` definitions. +*/ + async fn list_agents( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /** AgentMetadataService defines an RPC service that is also served over HTTP via grpc-gateway. + This service allows propeller or users to get the metadata of agents. +*/ + #[derive(Debug)] + pub struct AgentMetadataServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl AgentMetadataServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> + for AgentMetadataServiceServer + where + T: AgentMetadataService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/flyteidl.service.AgentMetadataService/GetAgent" => { + #[allow(non_camel_case_types)] + struct GetAgentSvc(pub Arc); + impl< + T: AgentMetadataService, + > tonic::server::UnaryService + for GetAgentSvc { + type Response = super::super::admin::GetAgentResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_agent(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetAgentSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AgentMetadataService/ListAgents" => { + #[allow(non_camel_case_types)] + struct ListAgentsSvc(pub Arc); + impl< + T: AgentMetadataService, + > tonic::server::UnaryService + for ListAgentsSvc { + type Response = super::super::admin::ListAgentsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::ListAgentsRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_agents(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListAgentsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for AgentMetadataServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService + for AgentMetadataServiceServer { + const NAME: &'static str = "flyteidl.service.AgentMetadataService"; + } +} +/// Generated client implementations. +pub mod auth_metadata_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /** The following defines an RPC service that is also served over HTTP via grpc-gateway. + Standard response codes for both are defined here: https://github.com/grpc-ecosystem/grpc-gateway/blob/master/runtime/errors.go + RPCs defined in this service must be anonymously accessible. +*/ + #[derive(Debug, Clone)] + pub struct AuthMetadataServiceClient { + inner: tonic::client::Grpc, + } + impl AuthMetadataServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl AuthMetadataServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> AuthMetadataServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + AuthMetadataServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /** Anonymously accessible. Retrieves local or external oauth authorization server metadata. +*/ + pub async fn get_o_auth2_metadata( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AuthMetadataService/GetOAuth2Metadata", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AuthMetadataService", + "GetOAuth2Metadata", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Anonymously accessible. Retrieves the client information clients should use when initiating OAuth2 authorization + requests. +*/ + pub async fn get_public_client_config( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.AuthMetadataService/GetPublicClientConfig", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.AuthMetadataService", + "GetPublicClientConfig", + ), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod auth_metadata_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with AuthMetadataServiceServer. + #[async_trait] + pub trait AuthMetadataService: Send + Sync + 'static { + /** Anonymously accessible. Retrieves local or external oauth authorization server metadata. +*/ + async fn get_o_auth2_metadata( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Anonymously accessible. Retrieves the client information clients should use when initiating OAuth2 authorization + requests. +*/ + async fn get_public_client_config( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /** The following defines an RPC service that is also served over HTTP via grpc-gateway. + Standard response codes for both are defined here: https://github.com/grpc-ecosystem/grpc-gateway/blob/master/runtime/errors.go + RPCs defined in this service must be anonymously accessible. +*/ + #[derive(Debug)] + pub struct AuthMetadataServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl AuthMetadataServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for AuthMetadataServiceServer + where + T: AuthMetadataService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/flyteidl.service.AuthMetadataService/GetOAuth2Metadata" => { + #[allow(non_camel_case_types)] + struct GetOAuth2MetadataSvc(pub Arc); + impl< + T: AuthMetadataService, + > tonic::server::UnaryService + for GetOAuth2MetadataSvc { + type Response = super::OAuth2MetadataResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_o_auth2_metadata( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetOAuth2MetadataSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.AuthMetadataService/GetPublicClientConfig" => { + #[allow(non_camel_case_types)] + struct GetPublicClientConfigSvc(pub Arc); + impl< + T: AuthMetadataService, + > tonic::server::UnaryService + for GetPublicClientConfigSvc { + type Response = super::PublicClientAuthConfigResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_public_client_config( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetPublicClientConfigSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for AuthMetadataServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService + for AuthMetadataServiceServer { + const NAME: &'static str = "flyteidl.service.AuthMetadataService"; + } +} +/// Generated client implementations. +pub mod data_proxy_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /** DataProxyService defines an RPC Service that allows access to user-data in a controlled manner. +*/ + #[derive(Debug, Clone)] + pub struct DataProxyServiceClient { + inner: tonic::client::Grpc, + } + impl DataProxyServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl DataProxyServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> DataProxyServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + DataProxyServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /** CreateUploadLocation creates a signed url to upload artifacts to for a given project/domain. +*/ + pub async fn create_upload_location( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.DataProxyService/CreateUploadLocation", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.DataProxyService", + "CreateUploadLocation", + ), + ); + self.inner.unary(req, path, codec).await + } + /** CreateDownloadLocation creates a signed url to download artifacts. +*/ + pub async fn create_download_location( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.DataProxyService/CreateDownloadLocation", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.DataProxyService", + "CreateDownloadLocation", + ), + ); + self.inner.unary(req, path, codec).await + } + /** CreateDownloadLocation creates a signed url to download artifacts. +*/ + pub async fn create_download_link( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.DataProxyService/CreateDownloadLink", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.DataProxyService", + "CreateDownloadLink", + ), + ); + self.inner.unary(req, path, codec).await + } + /// + pub async fn get_data( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.DataProxyService/GetData", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.service.DataProxyService", "GetData")); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod data_proxy_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with DataProxyServiceServer. + #[async_trait] + pub trait DataProxyService: Send + Sync + 'static { + /** CreateUploadLocation creates a signed url to upload artifacts to for a given project/domain. +*/ + async fn create_upload_location( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** CreateDownloadLocation creates a signed url to download artifacts. +*/ + async fn create_download_location( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** CreateDownloadLocation creates a signed url to download artifacts. +*/ + async fn create_download_link( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// + async fn get_data( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + } + /** DataProxyService defines an RPC Service that allows access to user-data in a controlled manner. +*/ + #[derive(Debug)] + pub struct DataProxyServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl DataProxyServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for DataProxyServiceServer + where + T: DataProxyService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/flyteidl.service.DataProxyService/CreateUploadLocation" => { + #[allow(non_camel_case_types)] + struct CreateUploadLocationSvc(pub Arc); + impl< + T: DataProxyService, + > tonic::server::UnaryService + for CreateUploadLocationSvc { + type Response = super::CreateUploadLocationResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_upload_location( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateUploadLocationSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.DataProxyService/CreateDownloadLocation" => { + #[allow(non_camel_case_types)] + struct CreateDownloadLocationSvc(pub Arc); + impl< + T: DataProxyService, + > tonic::server::UnaryService + for CreateDownloadLocationSvc { + type Response = super::CreateDownloadLocationResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_download_location( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateDownloadLocationSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.DataProxyService/CreateDownloadLink" => { + #[allow(non_camel_case_types)] + struct CreateDownloadLinkSvc(pub Arc); + impl< + T: DataProxyService, + > tonic::server::UnaryService + for CreateDownloadLinkSvc { + type Response = super::CreateDownloadLinkResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_download_link( + &inner, + request, + ) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateDownloadLinkSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.DataProxyService/GetData" => { + #[allow(non_camel_case_types)] + struct GetDataSvc(pub Arc); + impl< + T: DataProxyService, + > tonic::server::UnaryService + for GetDataSvc { + type Response = super::GetDataResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_data(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetDataSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for DataProxyServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for DataProxyServiceServer { + const NAME: &'static str = "flyteidl.service.DataProxyService"; + } +} +/// Generated client implementations. +pub mod external_plugin_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct ExternalPluginServiceClient { + inner: tonic::client::Grpc, + } + impl ExternalPluginServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl ExternalPluginServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> ExternalPluginServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + ExternalPluginServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn create_task( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.ExternalPluginService/CreateTask", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.ExternalPluginService", + "CreateTask", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn get_task( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.ExternalPluginService/GetTask", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.ExternalPluginService", "GetTask"), + ); + self.inner.unary(req, path, codec).await + } + pub async fn delete_task( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.ExternalPluginService/DeleteTask", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.ExternalPluginService", + "DeleteTask", + ), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod external_plugin_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with ExternalPluginServiceServer. + #[async_trait] + pub trait ExternalPluginService: Send + Sync + 'static { + async fn create_task( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_task( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + async fn delete_task( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct ExternalPluginServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl ExternalPluginServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> + for ExternalPluginServiceServer + where + T: ExternalPluginService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/flyteidl.service.ExternalPluginService/CreateTask" => { + #[allow(non_camel_case_types)] + struct CreateTaskSvc(pub Arc); + impl< + T: ExternalPluginService, + > tonic::server::UnaryService + for CreateTaskSvc { + type Response = super::TaskCreateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_task(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = CreateTaskSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.ExternalPluginService/GetTask" => { + #[allow(non_camel_case_types)] + struct GetTaskSvc(pub Arc); + impl< + T: ExternalPluginService, + > tonic::server::UnaryService + for GetTaskSvc { + type Response = super::TaskGetResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_task(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetTaskSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.ExternalPluginService/DeleteTask" => { + #[allow(non_camel_case_types)] + struct DeleteTaskSvc(pub Arc); + impl< + T: ExternalPluginService, + > tonic::server::UnaryService + for DeleteTaskSvc { + type Response = super::TaskDeleteResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::delete_task(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = DeleteTaskSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for ExternalPluginServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService + for ExternalPluginServiceServer { + const NAME: &'static str = "flyteidl.service.ExternalPluginService"; + } +} +/// Generated client implementations. +pub mod identity_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /** IdentityService defines an RPC Service that interacts with user/app identities. +*/ + #[derive(Debug, Clone)] + pub struct IdentityServiceClient { + inner: tonic::client::Grpc, + } + impl IdentityServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl IdentityServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> IdentityServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + IdentityServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /** Retrieves user information about the currently logged in user. +*/ + pub async fn user_info( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.IdentityService/UserInfo", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.service.IdentityService", "UserInfo")); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod identity_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with IdentityServiceServer. + #[async_trait] + pub trait IdentityService: Send + Sync + 'static { + /** Retrieves user information about the currently logged in user. +*/ + async fn user_info( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /** IdentityService defines an RPC Service that interacts with user/app identities. +*/ + #[derive(Debug)] + pub struct IdentityServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl IdentityServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for IdentityServiceServer + where + T: IdentityService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/flyteidl.service.IdentityService/UserInfo" => { + #[allow(non_camel_case_types)] + struct UserInfoSvc(pub Arc); + impl< + T: IdentityService, + > tonic::server::UnaryService + for UserInfoSvc { + type Response = super::UserInfoResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::user_info(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = UserInfoSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for IdentityServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for IdentityServiceServer { + const NAME: &'static str = "flyteidl.service.IdentityService"; + } +} +/// Generated client implementations. +pub mod signal_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /** SignalService defines an RPC Service that may create, update, and retrieve signal(s). +*/ + #[derive(Debug, Clone)] + pub struct SignalServiceClient { + inner: tonic::client::Grpc, + } + impl SignalServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl SignalServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> SignalServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + SignalServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /** Fetches or creates a :ref:`ref_flyteidl.admin.Signal`. +*/ + pub async fn get_or_create_signal( + &mut self, + request: impl tonic::IntoRequest< + super::super::admin::SignalGetOrCreateRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.SignalService/GetOrCreateSignal", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "flyteidl.service.SignalService", + "GetOrCreateSignal", + ), + ); + self.inner.unary(req, path, codec).await + } + /** Fetch a list of :ref:`ref_flyteidl.admin.Signal` definitions. +*/ + pub async fn list_signals( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.SignalService/ListSignals", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("flyteidl.service.SignalService", "ListSignals"), + ); + self.inner.unary(req, path, codec).await + } + /** Sets the value on a :ref:`ref_flyteidl.admin.Signal` definition +*/ + pub async fn set_signal( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/flyteidl.service.SignalService/SetSignal", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("flyteidl.service.SignalService", "SetSignal")); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod signal_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with SignalServiceServer. + #[async_trait] + pub trait SignalService: Send + Sync + 'static { + /** Fetches or creates a :ref:`ref_flyteidl.admin.Signal`. +*/ + async fn get_or_create_signal( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Fetch a list of :ref:`ref_flyteidl.admin.Signal` definitions. +*/ + async fn list_signals( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /** Sets the value on a :ref:`ref_flyteidl.admin.Signal` definition +*/ + async fn set_signal( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /** SignalService defines an RPC Service that may create, update, and retrieve signal(s). +*/ + #[derive(Debug)] + pub struct SignalServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl SignalServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for SignalServiceServer + where + T: SignalService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/flyteidl.service.SignalService/GetOrCreateSignal" => { + #[allow(non_camel_case_types)] + struct GetOrCreateSignalSvc(pub Arc); + impl< + T: SignalService, + > tonic::server::UnaryService< + super::super::admin::SignalGetOrCreateRequest, + > for GetOrCreateSignalSvc { + type Response = super::super::admin::Signal; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::SignalGetOrCreateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_or_create_signal(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetOrCreateSignalSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.SignalService/ListSignals" => { + #[allow(non_camel_case_types)] + struct ListSignalsSvc(pub Arc); + impl< + T: SignalService, + > tonic::server::UnaryService + for ListSignalsSvc { + type Response = super::super::admin::SignalList; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::SignalListRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::list_signals(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ListSignalsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/flyteidl.service.SignalService/SetSignal" => { + #[allow(non_camel_case_types)] + struct SetSignalSvc(pub Arc); + impl< + T: SignalService, + > tonic::server::UnaryService + for SetSignalSvc { + type Response = super::super::admin::SignalSetResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::super::admin::SignalSetRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::set_signal(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = SetSignalSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for SignalServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for SignalServiceServer { + const NAME: &'static str = "flyteidl.service.SignalService"; + } +} From ab95f7e7241afd9c020b1fd1dedd69f9ff613baa Mon Sep 17 00:00:00 2001 From: Paul Dittamo <37558497+pvditt@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:27:37 -0700 Subject: [PATCH 422/645] enable parallelism to be set to nil for array node (#5214) * enable parallelism to be set to nil for array node Signed-off-by: Paul Dittamo * unit test Signed-off-by: Paul Dittamo --------- Signed-off-by: Paul Dittamo --- flyteidl/clients/go/assets/admin.swagger.json | 2 +- .../gen/pb-es/flyteidl/core/workflow_pb.ts | 24 +- .../gen/pb-go/flyteidl/core/workflow.pb.go | 363 ++++++++++-------- .../flyteidl/service/admin.swagger.json | 2 +- flyteidl/gen/pb-js/flyteidl.d.ts | 7 +- flyteidl/gen/pb-js/flyteidl.js | 29 +- .../pb_python/flyteidl/core/workflow_pb2.py | 83 ++-- .../pb_python/flyteidl/core/workflow_pb2.pyi | 1 + flyteidl/gen/pb_rust/flyteidl.core.rs | 18 +- flyteidl/protos/flyteidl/core/workflow.proto | 13 +- .../pkg/apis/flyteworkflow/v1alpha1/array.go | 4 +- .../apis/flyteworkflow/v1alpha1/array_test.go | 6 +- .../pkg/apis/flyteworkflow/v1alpha1/iface.go | 2 +- .../v1alpha1/mocks/ExecutableArrayNode.go | 12 +- .../pkg/compiler/transformers/k8s/node.go | 8 +- .../compiler/transformers/k8s/node_test.go | 33 +- .../pkg/controller/nodes/array/handler.go | 4 +- .../controller/nodes/array/handler_test.go | 29 +- 18 files changed, 373 insertions(+), 267 deletions(-) diff --git a/flyteidl/clients/go/assets/admin.swagger.json b/flyteidl/clients/go/assets/admin.swagger.json index 9273a46776..bcaf46928b 100644 --- a/flyteidl/clients/go/assets/admin.swagger.json +++ b/flyteidl/clients/go/assets/admin.swagger.json @@ -6483,7 +6483,7 @@ "description": "node is the sub-node that will be executed for each element in the array." }, "parallelism": { - "type": "string", + "type": "integer", "format": "int64", "description": "parallelism defines the minimum number of instances to bring up concurrently at any given\npoint. Note that this is an optimistic restriction and that, due to network partitioning or\nother failures, the actual number of currently running instances might be more. This has to\nbe a positive number if assigned. Default value is size." }, diff --git a/flyteidl/gen/pb-es/flyteidl/core/workflow_pb.ts b/flyteidl/gen/pb-es/flyteidl/core/workflow_pb.ts index 9efdcf91dd..0db88c5d3d 100644 --- a/flyteidl/gen/pb-es/flyteidl/core/workflow_pb.ts +++ b/flyteidl/gen/pb-es/flyteidl/core/workflow_pb.ts @@ -4,7 +4,7 @@ // @ts-nocheck import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Duration, Message, proto3, protoInt64 } from "@bufbuild/protobuf"; +import { Duration, Message, proto3 } from "@bufbuild/protobuf"; import { BooleanExpression } from "./condition_pb.js"; import { Error, LiteralType } from "./types_pb.js"; import { Identifier } from "./identifier_pb.js"; @@ -507,14 +507,20 @@ export class ArrayNode extends Message { node?: Node; /** - * parallelism defines the minimum number of instances to bring up concurrently at any given - * point. Note that this is an optimistic restriction and that, due to network partitioning or - * other failures, the actual number of currently running instances might be more. This has to - * be a positive number if assigned. Default value is size. - * - * @generated from field: int64 parallelism = 2; + * @generated from oneof flyteidl.core.ArrayNode.parallelism_option */ - parallelism = protoInt64.zero; + parallelismOption: { + /** + * parallelism defines the minimum number of instances to bring up concurrently at any given + * point. Note that this is an optimistic restriction and that, due to network partitioning or + * other failures, the actual number of currently running instances might be more. This has to + * be a positive number if assigned. Default value is size. + * + * @generated from field: uint32 parallelism = 2; + */ + value: number; + case: "parallelism"; + } | { case: undefined; value?: undefined } = { case: undefined }; /** * @generated from oneof flyteidl.core.ArrayNode.success_criteria @@ -550,7 +556,7 @@ export class ArrayNode extends Message { static readonly typeName = "flyteidl.core.ArrayNode"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "node", kind: "message", T: Node }, - { no: 2, name: "parallelism", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, + { no: 2, name: "parallelism", kind: "scalar", T: 13 /* ScalarType.UINT32 */, oneof: "parallelism_option" }, { no: 3, name: "min_successes", kind: "scalar", T: 13 /* ScalarType.UINT32 */, oneof: "success_criteria" }, { no: 4, name: "min_success_ratio", kind: "scalar", T: 2 /* ScalarType.FLOAT */, oneof: "success_criteria" }, ]); diff --git a/flyteidl/gen/pb-go/flyteidl/core/workflow.pb.go b/flyteidl/gen/pb-go/flyteidl/core/workflow.pb.go index 983bbdcf43..077f34da9b 100644 --- a/flyteidl/gen/pb-go/flyteidl/core/workflow.pb.go +++ b/flyteidl/gen/pb-go/flyteidl/core/workflow.pb.go @@ -10,6 +10,7 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" + _ "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" ) @@ -723,11 +724,10 @@ type ArrayNode struct { // node is the sub-node that will be executed for each element in the array. Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` - // parallelism defines the minimum number of instances to bring up concurrently at any given - // point. Note that this is an optimistic restriction and that, due to network partitioning or - // other failures, the actual number of currently running instances might be more. This has to - // be a positive number if assigned. Default value is size. - Parallelism int64 `protobuf:"varint,2,opt,name=parallelism,proto3" json:"parallelism,omitempty"` + // Types that are assignable to ParallelismOption: + // + // *ArrayNode_Parallelism + ParallelismOption isArrayNode_ParallelismOption `protobuf_oneof:"parallelism_option"` // Types that are assignable to SuccessCriteria: // // *ArrayNode_MinSuccesses @@ -774,8 +774,15 @@ func (x *ArrayNode) GetNode() *Node { return nil } -func (x *ArrayNode) GetParallelism() int64 { - if x != nil { +func (m *ArrayNode) GetParallelismOption() isArrayNode_ParallelismOption { + if m != nil { + return m.ParallelismOption + } + return nil +} + +func (x *ArrayNode) GetParallelism() uint32 { + if x, ok := x.GetParallelismOption().(*ArrayNode_Parallelism); ok { return x.Parallelism } return 0 @@ -802,6 +809,20 @@ func (x *ArrayNode) GetMinSuccessRatio() float32 { return 0 } +type isArrayNode_ParallelismOption interface { + isArrayNode_ParallelismOption() +} + +type ArrayNode_Parallelism struct { + // parallelism defines the minimum number of instances to bring up concurrently at any given + // point. Note that this is an optimistic restriction and that, due to network partitioning or + // other failures, the actual number of currently running instances might be more. This has to + // be a positive number if assigned. Default value is size. + Parallelism uint32 `protobuf:"varint,2,opt,name=parallelism,proto3,oneof"` +} + +func (*ArrayNode_Parallelism) isArrayNode_ParallelismOption() {} + type isArrayNode_SuccessCriteria interface { isArrayNode_SuccessCriteria() } @@ -1644,7 +1665,9 @@ var file_flyteidl_core_workflow_proto_rawDesc = []byte{ 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7b, 0x0a, 0x07, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7b, 0x0a, 0x07, 0x49, 0x66, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3e, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, @@ -1719,172 +1742,173 @@ var file_flyteidl_core_workflow_proto_rawDesc = []byte{ 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x05, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x42, 0x0b, - 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xbf, 0x01, 0x0a, 0x09, + 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd7, 0x01, 0x0a, 0x09, 0x41, 0x72, 0x72, 0x61, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, - 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, - 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, - 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x25, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6d, - 0x69, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x6d, - 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x42, 0x12, 0x0a, 0x10, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x22, 0x8c, 0x03, - 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, - 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x26, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, - 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x1e, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x09, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, - 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, - 0x0a, 0x12, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x11, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x42, - 0x15, 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x42, 0x1a, 0x0a, 0x18, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2f, 0x0a, 0x05, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x76, 0x61, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x9f, 0x04, - 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, - 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x2e, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, - 0x2a, 0x0a, 0x11, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x66, 0x6c, - 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x42, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, - 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x6e, - 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, - 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, - 0x52, 0x08, 0x67, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x72, - 0x72, 0x61, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, - 0x72, 0x72, 0x61, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x09, 0x61, 0x72, 0x72, 0x61, - 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, - 0xfc, 0x02, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x12, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, - 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x4f, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x10, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x4f, 0x66, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, - 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, - 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x09, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, - 0x75, 0x72, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x0f, 0x4f, - 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x14, - 0x0a, 0x10, 0x46, 0x41, 0x49, 0x4c, 0x5f, 0x49, 0x4d, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, 0x45, - 0x4c, 0x59, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x46, 0x41, 0x49, 0x4c, 0x5f, 0x41, 0x46, 0x54, - 0x45, 0x52, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, - 0x44, 0x45, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x22, 0x40, - 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, - 0x22, 0xa2, 0x03, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x64, 0x65, 0x12, 0x22, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, + 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, + 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x25, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, + 0x0c, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2c, 0x0a, + 0x11, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x48, 0x01, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x42, 0x14, 0x0a, 0x12, 0x70, + 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x72, 0x69, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x22, 0x8c, 0x03, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x36, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x07, + 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, + 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, + 0x1e, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x01, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x25, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x12, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x03, 0x52, 0x11, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x11, + 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x42, 0x15, 0x0a, 0x13, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2f, 0x0a, 0x05, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x76, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, 0x61, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x9f, 0x04, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x37, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, + 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x75, 0x70, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4e, 0x6f, 0x64, 0x65, + 0x49, 0x64, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, + 0x12, 0x36, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, + 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0c, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3c, 0x0a, 0x0b, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, - 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, - 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x6c, 0x79, 0x74, - 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, - 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x07, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x75, - 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x0b, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x54, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x6c, 0x79, + 0x65, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0a, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, 0x61, + 0x74, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x61, + 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x67, 0x61, 0x74, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, + 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x4e, 0x6f, 0x64, 0x65, + 0x48, 0x00, 0x52, 0x09, 0x61, 0x72, 0x72, 0x61, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x08, 0x0a, + 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xfc, 0x02, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x12, + 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x4f, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x10, 0x71, 0x75, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x4f, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x6f, + 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x09, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x79, 0x74, + 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, + 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x0f, 0x4f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x41, 0x49, 0x4c, 0x5f, 0x49, + 0x4d, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, 0x45, 0x4c, 0x59, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, + 0x46, 0x41, 0x49, 0x4c, 0x5f, 0x41, 0x46, 0x54, 0x45, 0x52, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, + 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, + 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x22, 0x40, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, + 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x72, 0x75, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x22, 0xa2, 0x03, 0x0a, 0x10, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, + 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x11, 0x54, 0x61, 0x73, 0x6b, 0x4e, 0x6f, - 0x64, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x52, 0x11, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x22, 0xba, 0x01, - 0x0a, 0x12, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x3b, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, - 0x65, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x0c, - 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x52, 0x0b, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x42, 0xb3, 0x01, 0x0a, 0x11, 0x63, - 0x6f, 0x6d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x42, 0x0d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, - 0x79, 0x74, 0x65, 0x6f, 0x72, 0x67, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, 0x79, - 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, 0x2f, - 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, - 0x46, 0x43, 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x43, - 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0d, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x43, - 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x19, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x43, - 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x0e, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, + 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, + 0x63, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x30, 0x0a, + 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x42, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, + 0x36, 0x0a, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x66, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x54, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x10, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xc5, 0x01, + 0x0a, 0x11, 0x54, 0x61, 0x73, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, + 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x12, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x11, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x12, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, + 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x66, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x6c, 0x79, + 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x66, 0x61, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, + 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x52, 0x0b, 0x66, 0x69, 0x78, 0x65, 0x64, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x73, 0x42, 0xb3, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x42, 0x0d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x6f, 0x72, 0x67, 0x2f, 0x66, + 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x46, 0x43, 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0d, 0x46, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x19, 0x46, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2233,6 +2257,7 @@ func file_flyteidl_core_workflow_proto_init() { (*GateNode_Sleep)(nil), } file_flyteidl_core_workflow_proto_msgTypes[9].OneofWrappers = []interface{}{ + (*ArrayNode_Parallelism)(nil), (*ArrayNode_MinSuccesses)(nil), (*ArrayNode_MinSuccessRatio)(nil), } diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json index 9273a46776..bcaf46928b 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json @@ -6483,7 +6483,7 @@ "description": "node is the sub-node that will be executed for each element in the array." }, "parallelism": { - "type": "string", + "type": "integer", "format": "int64", "description": "parallelism defines the minimum number of instances to bring up concurrently at any given\npoint. Note that this is an optimistic restriction and that, due to network partitioning or\nother failures, the actual number of currently running instances might be more. This has to\nbe a positive number if assigned. Default value is size." }, diff --git a/flyteidl/gen/pb-js/flyteidl.d.ts b/flyteidl/gen/pb-js/flyteidl.d.ts index 0126d892f2..54bd68f461 100644 --- a/flyteidl/gen/pb-js/flyteidl.d.ts +++ b/flyteidl/gen/pb-js/flyteidl.d.ts @@ -4506,7 +4506,7 @@ export namespace flyteidl { node?: (flyteidl.core.INode|null); /** ArrayNode parallelism */ - parallelism?: (Long|null); + parallelism?: (number|null); /** ArrayNode minSuccesses */ minSuccesses?: (number|null); @@ -4528,7 +4528,7 @@ export namespace flyteidl { public node?: (flyteidl.core.INode|null); /** ArrayNode parallelism. */ - public parallelism: Long; + public parallelism: number; /** ArrayNode minSuccesses. */ public minSuccesses: number; @@ -4536,6 +4536,9 @@ export namespace flyteidl { /** ArrayNode minSuccessRatio. */ public minSuccessRatio: number; + /** ArrayNode parallelismOption. */ + public parallelismOption?: "parallelism"; + /** ArrayNode successCriteria. */ public successCriteria?: ("minSuccesses"|"minSuccessRatio"); diff --git a/flyteidl/gen/pb-js/flyteidl.js b/flyteidl/gen/pb-js/flyteidl.js index e288f8e111..8a47c9bf30 100644 --- a/flyteidl/gen/pb-js/flyteidl.js +++ b/flyteidl/gen/pb-js/flyteidl.js @@ -10808,7 +10808,7 @@ * @memberof flyteidl.core * @interface IArrayNode * @property {flyteidl.core.INode|null} [node] ArrayNode node - * @property {Long|null} [parallelism] ArrayNode parallelism + * @property {number|null} [parallelism] ArrayNode parallelism * @property {number|null} [minSuccesses] ArrayNode minSuccesses * @property {number|null} [minSuccessRatio] ArrayNode minSuccessRatio */ @@ -10838,11 +10838,11 @@ /** * ArrayNode parallelism. - * @member {Long} parallelism + * @member {number} parallelism * @memberof flyteidl.core.ArrayNode * @instance */ - ArrayNode.prototype.parallelism = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + ArrayNode.prototype.parallelism = 0; /** * ArrayNode minSuccesses. @@ -10863,6 +10863,17 @@ // OneOf field names bound to virtual getters and setters var $oneOfFields; + /** + * ArrayNode parallelismOption. + * @member {"parallelism"|undefined} parallelismOption + * @memberof flyteidl.core.ArrayNode + * @instance + */ + Object.defineProperty(ArrayNode.prototype, "parallelismOption", { + get: $util.oneOfGetter($oneOfFields = ["parallelism"]), + set: $util.oneOfSetter($oneOfFields) + }); + /** * ArrayNode successCriteria. * @member {"minSuccesses"|"minSuccessRatio"|undefined} successCriteria @@ -10901,7 +10912,7 @@ if (message.node != null && message.hasOwnProperty("node")) $root.flyteidl.core.Node.encode(message.node, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.parallelism != null && message.hasOwnProperty("parallelism")) - writer.uint32(/* id 2, wireType 0 =*/16).int64(message.parallelism); + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.parallelism); if (message.minSuccesses != null && message.hasOwnProperty("minSuccesses")) writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.minSuccesses); if (message.minSuccessRatio != null && message.hasOwnProperty("minSuccessRatio")) @@ -10931,7 +10942,7 @@ message.node = $root.flyteidl.core.Node.decode(reader, reader.uint32()); break; case 2: - message.parallelism = reader.int64(); + message.parallelism = reader.uint32(); break; case 3: message.minSuccesses = reader.uint32(); @@ -10964,9 +10975,11 @@ if (error) return "node." + error; } - if (message.parallelism != null && message.hasOwnProperty("parallelism")) - if (!$util.isInteger(message.parallelism) && !(message.parallelism && $util.isInteger(message.parallelism.low) && $util.isInteger(message.parallelism.high))) - return "parallelism: integer|Long expected"; + if (message.parallelism != null && message.hasOwnProperty("parallelism")) { + properties.parallelismOption = 1; + if (!$util.isInteger(message.parallelism)) + return "parallelism: integer expected"; + } if (message.minSuccesses != null && message.hasOwnProperty("minSuccesses")) { properties.successCriteria = 1; if (!$util.isInteger(message.minSuccesses)) diff --git a/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.py b/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.py index 452c38c9c9..2113db78fe 100644 --- a/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.py +++ b/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.py @@ -20,9 +20,10 @@ from flyteidl.core import types_pb2 as flyteidl_dot_core_dot_types__pb2 from flyteidl.core import security_pb2 as flyteidl_dot_core_dot_security__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lyteidl/core/workflow.proto\x12\rflyteidl.core\x1a\x1d\x66lyteidl/core/condition.proto\x1a\x1d\x66lyteidl/core/execution.proto\x1a\x1e\x66lyteidl/core/identifier.proto\x1a\x1d\x66lyteidl/core/interface.proto\x1a\x1c\x66lyteidl/core/literals.proto\x1a\x19\x66lyteidl/core/tasks.proto\x1a\x19\x66lyteidl/core/types.proto\x1a\x1c\x66lyteidl/core/security.proto\x1a\x1egoogle/protobuf/duration.proto\"{\n\x07IfBlock\x12>\n\tcondition\x18\x01 \x01(\x0b\x32 .flyteidl.core.BooleanExpressionR\tcondition\x12\x30\n\tthen_node\x18\x02 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x08thenNode\"\xd4\x01\n\x0bIfElseBlock\x12*\n\x04\x63\x61se\x18\x01 \x01(\x0b\x32\x16.flyteidl.core.IfBlockR\x04\x63\x61se\x12,\n\x05other\x18\x02 \x03(\x0b\x32\x16.flyteidl.core.IfBlockR\x05other\x12\x32\n\telse_node\x18\x03 \x01(\x0b\x32\x13.flyteidl.core.NodeH\x00R\x08\x65lseNode\x12,\n\x05\x65rror\x18\x04 \x01(\x0b\x32\x14.flyteidl.core.ErrorH\x00R\x05\x65rrorB\t\n\x07\x64\x65\x66\x61ult\"A\n\nBranchNode\x12\x33\n\x07if_else\x18\x01 \x01(\x0b\x32\x1a.flyteidl.core.IfElseBlockR\x06ifElse\"\x97\x01\n\x08TaskNode\x12>\n\x0creference_id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\x0breferenceId\x12>\n\toverrides\x18\x02 \x01(\x0b\x32 .flyteidl.core.TaskNodeOverridesR\toverridesB\x0b\n\treference\"\xa6\x01\n\x0cWorkflowNode\x12\x42\n\x0elaunchplan_ref\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\rlaunchplanRef\x12\x45\n\x10sub_workflow_ref\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\x0esubWorkflowRefB\x0b\n\treference\"/\n\x10\x41pproveCondition\x12\x1b\n\tsignal_id\x18\x01 \x01(\tR\x08signalId\"\x90\x01\n\x0fSignalCondition\x12\x1b\n\tsignal_id\x18\x01 \x01(\tR\x08signalId\x12.\n\x04type\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x04type\x12\x30\n\x14output_variable_name\x18\x03 \x01(\tR\x12outputVariableName\"G\n\x0eSleepCondition\x12\x35\n\x08\x64uration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\"\xc5\x01\n\x08GateNode\x12;\n\x07\x61pprove\x18\x01 \x01(\x0b\x32\x1f.flyteidl.core.ApproveConditionH\x00R\x07\x61pprove\x12\x38\n\x06signal\x18\x02 \x01(\x0b\x32\x1e.flyteidl.core.SignalConditionH\x00R\x06signal\x12\x35\n\x05sleep\x18\x03 \x01(\x0b\x32\x1d.flyteidl.core.SleepConditionH\x00R\x05sleepB\x0b\n\tcondition\"\xbf\x01\n\tArrayNode\x12\'\n\x04node\x18\x01 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x04node\x12 \n\x0bparallelism\x18\x02 \x01(\x03R\x0bparallelism\x12%\n\rmin_successes\x18\x03 \x01(\rH\x00R\x0cminSuccesses\x12,\n\x11min_success_ratio\x18\x04 \x01(\x02H\x00R\x0fminSuccessRatioB\x12\n\x10success_criteria\"\x8c\x03\n\x0cNodeMetadata\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x33\n\x07timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationR\x07timeout\x12\x36\n\x07retries\x18\x05 \x01(\x0b\x32\x1c.flyteidl.core.RetryStrategyR\x07retries\x12&\n\rinterruptible\x18\x06 \x01(\x08H\x00R\rinterruptible\x12\x1e\n\tcacheable\x18\x07 \x01(\x08H\x01R\tcacheable\x12%\n\rcache_version\x18\x08 \x01(\tH\x02R\x0c\x63\x61\x63heVersion\x12/\n\x12\x63\x61\x63he_serializable\x18\t \x01(\x08H\x03R\x11\x63\x61\x63heSerializableB\x15\n\x13interruptible_valueB\x11\n\x0f\x63\x61\x63heable_valueB\x15\n\x13\x63\x61\x63he_version_valueB\x1a\n\x18\x63\x61\x63he_serializable_value\"/\n\x05\x41lias\x12\x10\n\x03var\x18\x01 \x01(\tR\x03var\x12\x14\n\x05\x61lias\x18\x02 \x01(\tR\x05\x61lias\"\x9f\x04\n\x04Node\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x37\n\x08metadata\x18\x02 \x01(\x0b\x32\x1b.flyteidl.core.NodeMetadataR\x08metadata\x12.\n\x06inputs\x18\x03 \x03(\x0b\x32\x16.flyteidl.core.BindingR\x06inputs\x12*\n\x11upstream_node_ids\x18\x04 \x03(\tR\x0fupstreamNodeIds\x12;\n\x0eoutput_aliases\x18\x05 \x03(\x0b\x32\x14.flyteidl.core.AliasR\routputAliases\x12\x36\n\ttask_node\x18\x06 \x01(\x0b\x32\x17.flyteidl.core.TaskNodeH\x00R\x08taskNode\x12\x42\n\rworkflow_node\x18\x07 \x01(\x0b\x32\x1b.flyteidl.core.WorkflowNodeH\x00R\x0cworkflowNode\x12<\n\x0b\x62ranch_node\x18\x08 \x01(\x0b\x32\x19.flyteidl.core.BranchNodeH\x00R\nbranchNode\x12\x36\n\tgate_node\x18\t \x01(\x0b\x32\x17.flyteidl.core.GateNodeH\x00R\x08gateNode\x12\x39\n\narray_node\x18\n \x01(\x0b\x32\x18.flyteidl.core.ArrayNodeH\x00R\tarrayNodeB\x08\n\x06target\"\xfc\x02\n\x10WorkflowMetadata\x12M\n\x12quality_of_service\x18\x01 \x01(\x0b\x32\x1f.flyteidl.core.QualityOfServiceR\x10qualityOfService\x12N\n\non_failure\x18\x02 \x01(\x0e\x32/.flyteidl.core.WorkflowMetadata.OnFailurePolicyR\tonFailure\x12=\n\x04tags\x18\x03 \x03(\x0b\x32).flyteidl.core.WorkflowMetadata.TagsEntryR\x04tags\x1a\x37\n\tTagsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"Q\n\x0fOnFailurePolicy\x12\x14\n\x10\x46\x41IL_IMMEDIATELY\x10\x00\x12(\n$FAIL_AFTER_EXECUTABLE_NODES_COMPLETE\x10\x01\"@\n\x18WorkflowMetadataDefaults\x12$\n\rinterruptible\x18\x01 \x01(\x08R\rinterruptible\"\xa2\x03\n\x10WorkflowTemplate\x12)\n\x02id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierR\x02id\x12;\n\x08metadata\x18\x02 \x01(\x0b\x32\x1f.flyteidl.core.WorkflowMetadataR\x08metadata\x12;\n\tinterface\x18\x03 \x01(\x0b\x32\x1d.flyteidl.core.TypedInterfaceR\tinterface\x12)\n\x05nodes\x18\x04 \x03(\x0b\x32\x13.flyteidl.core.NodeR\x05nodes\x12\x30\n\x07outputs\x18\x05 \x03(\x0b\x32\x16.flyteidl.core.BindingR\x07outputs\x12\x36\n\x0c\x66\x61ilure_node\x18\x06 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x0b\x66\x61ilureNode\x12T\n\x11metadata_defaults\x18\x07 \x01(\x0b\x32\'.flyteidl.core.WorkflowMetadataDefaultsR\x10metadataDefaults\"\xc5\x01\n\x11TaskNodeOverrides\x12\x36\n\tresources\x18\x01 \x01(\x0b\x32\x18.flyteidl.core.ResourcesR\tresources\x12O\n\x12\x65xtended_resources\x18\x02 \x01(\x0b\x32 .flyteidl.core.ExtendedResourcesR\x11\x65xtendedResources\x12\'\n\x0f\x63ontainer_image\x18\x03 \x01(\tR\x0e\x63ontainerImage\"\xba\x01\n\x12LaunchPlanTemplate\x12)\n\x02id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierR\x02id\x12;\n\tinterface\x18\x02 \x01(\x0b\x32\x1d.flyteidl.core.TypedInterfaceR\tinterface\x12<\n\x0c\x66ixed_inputs\x18\x03 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapR\x0b\x66ixedInputsB\xb3\x01\n\x11\x63om.flyteidl.coreB\rWorkflowProtoP\x01Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\xa2\x02\x03\x46\x43X\xaa\x02\rFlyteidl.Core\xca\x02\rFlyteidl\\Core\xe2\x02\x19\x46lyteidl\\Core\\GPBMetadata\xea\x02\x0e\x46lyteidl::Coreb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lyteidl/core/workflow.proto\x12\rflyteidl.core\x1a\x1d\x66lyteidl/core/condition.proto\x1a\x1d\x66lyteidl/core/execution.proto\x1a\x1e\x66lyteidl/core/identifier.proto\x1a\x1d\x66lyteidl/core/interface.proto\x1a\x1c\x66lyteidl/core/literals.proto\x1a\x19\x66lyteidl/core/tasks.proto\x1a\x19\x66lyteidl/core/types.proto\x1a\x1c\x66lyteidl/core/security.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1egoogle/protobuf/wrappers.proto\"{\n\x07IfBlock\x12>\n\tcondition\x18\x01 \x01(\x0b\x32 .flyteidl.core.BooleanExpressionR\tcondition\x12\x30\n\tthen_node\x18\x02 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x08thenNode\"\xd4\x01\n\x0bIfElseBlock\x12*\n\x04\x63\x61se\x18\x01 \x01(\x0b\x32\x16.flyteidl.core.IfBlockR\x04\x63\x61se\x12,\n\x05other\x18\x02 \x03(\x0b\x32\x16.flyteidl.core.IfBlockR\x05other\x12\x32\n\telse_node\x18\x03 \x01(\x0b\x32\x13.flyteidl.core.NodeH\x00R\x08\x65lseNode\x12,\n\x05\x65rror\x18\x04 \x01(\x0b\x32\x14.flyteidl.core.ErrorH\x00R\x05\x65rrorB\t\n\x07\x64\x65\x66\x61ult\"A\n\nBranchNode\x12\x33\n\x07if_else\x18\x01 \x01(\x0b\x32\x1a.flyteidl.core.IfElseBlockR\x06ifElse\"\x97\x01\n\x08TaskNode\x12>\n\x0creference_id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\x0breferenceId\x12>\n\toverrides\x18\x02 \x01(\x0b\x32 .flyteidl.core.TaskNodeOverridesR\toverridesB\x0b\n\treference\"\xa6\x01\n\x0cWorkflowNode\x12\x42\n\x0elaunchplan_ref\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\rlaunchplanRef\x12\x45\n\x10sub_workflow_ref\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.IdentifierH\x00R\x0esubWorkflowRefB\x0b\n\treference\"/\n\x10\x41pproveCondition\x12\x1b\n\tsignal_id\x18\x01 \x01(\tR\x08signalId\"\x90\x01\n\x0fSignalCondition\x12\x1b\n\tsignal_id\x18\x01 \x01(\tR\x08signalId\x12.\n\x04type\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x04type\x12\x30\n\x14output_variable_name\x18\x03 \x01(\tR\x12outputVariableName\"G\n\x0eSleepCondition\x12\x35\n\x08\x64uration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\"\xc5\x01\n\x08GateNode\x12;\n\x07\x61pprove\x18\x01 \x01(\x0b\x32\x1f.flyteidl.core.ApproveConditionH\x00R\x07\x61pprove\x12\x38\n\x06signal\x18\x02 \x01(\x0b\x32\x1e.flyteidl.core.SignalConditionH\x00R\x06signal\x12\x35\n\x05sleep\x18\x03 \x01(\x0b\x32\x1d.flyteidl.core.SleepConditionH\x00R\x05sleepB\x0b\n\tcondition\"\xd7\x01\n\tArrayNode\x12\'\n\x04node\x18\x01 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x04node\x12\"\n\x0bparallelism\x18\x02 \x01(\rH\x00R\x0bparallelism\x12%\n\rmin_successes\x18\x03 \x01(\rH\x01R\x0cminSuccesses\x12,\n\x11min_success_ratio\x18\x04 \x01(\x02H\x01R\x0fminSuccessRatioB\x14\n\x12parallelism_optionB\x12\n\x10success_criteria\"\x8c\x03\n\x0cNodeMetadata\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x33\n\x07timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationR\x07timeout\x12\x36\n\x07retries\x18\x05 \x01(\x0b\x32\x1c.flyteidl.core.RetryStrategyR\x07retries\x12&\n\rinterruptible\x18\x06 \x01(\x08H\x00R\rinterruptible\x12\x1e\n\tcacheable\x18\x07 \x01(\x08H\x01R\tcacheable\x12%\n\rcache_version\x18\x08 \x01(\tH\x02R\x0c\x63\x61\x63heVersion\x12/\n\x12\x63\x61\x63he_serializable\x18\t \x01(\x08H\x03R\x11\x63\x61\x63heSerializableB\x15\n\x13interruptible_valueB\x11\n\x0f\x63\x61\x63heable_valueB\x15\n\x13\x63\x61\x63he_version_valueB\x1a\n\x18\x63\x61\x63he_serializable_value\"/\n\x05\x41lias\x12\x10\n\x03var\x18\x01 \x01(\tR\x03var\x12\x14\n\x05\x61lias\x18\x02 \x01(\tR\x05\x61lias\"\x9f\x04\n\x04Node\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x37\n\x08metadata\x18\x02 \x01(\x0b\x32\x1b.flyteidl.core.NodeMetadataR\x08metadata\x12.\n\x06inputs\x18\x03 \x03(\x0b\x32\x16.flyteidl.core.BindingR\x06inputs\x12*\n\x11upstream_node_ids\x18\x04 \x03(\tR\x0fupstreamNodeIds\x12;\n\x0eoutput_aliases\x18\x05 \x03(\x0b\x32\x14.flyteidl.core.AliasR\routputAliases\x12\x36\n\ttask_node\x18\x06 \x01(\x0b\x32\x17.flyteidl.core.TaskNodeH\x00R\x08taskNode\x12\x42\n\rworkflow_node\x18\x07 \x01(\x0b\x32\x1b.flyteidl.core.WorkflowNodeH\x00R\x0cworkflowNode\x12<\n\x0b\x62ranch_node\x18\x08 \x01(\x0b\x32\x19.flyteidl.core.BranchNodeH\x00R\nbranchNode\x12\x36\n\tgate_node\x18\t \x01(\x0b\x32\x17.flyteidl.core.GateNodeH\x00R\x08gateNode\x12\x39\n\narray_node\x18\n \x01(\x0b\x32\x18.flyteidl.core.ArrayNodeH\x00R\tarrayNodeB\x08\n\x06target\"\xfc\x02\n\x10WorkflowMetadata\x12M\n\x12quality_of_service\x18\x01 \x01(\x0b\x32\x1f.flyteidl.core.QualityOfServiceR\x10qualityOfService\x12N\n\non_failure\x18\x02 \x01(\x0e\x32/.flyteidl.core.WorkflowMetadata.OnFailurePolicyR\tonFailure\x12=\n\x04tags\x18\x03 \x03(\x0b\x32).flyteidl.core.WorkflowMetadata.TagsEntryR\x04tags\x1a\x37\n\tTagsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"Q\n\x0fOnFailurePolicy\x12\x14\n\x10\x46\x41IL_IMMEDIATELY\x10\x00\x12(\n$FAIL_AFTER_EXECUTABLE_NODES_COMPLETE\x10\x01\"@\n\x18WorkflowMetadataDefaults\x12$\n\rinterruptible\x18\x01 \x01(\x08R\rinterruptible\"\xa2\x03\n\x10WorkflowTemplate\x12)\n\x02id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierR\x02id\x12;\n\x08metadata\x18\x02 \x01(\x0b\x32\x1f.flyteidl.core.WorkflowMetadataR\x08metadata\x12;\n\tinterface\x18\x03 \x01(\x0b\x32\x1d.flyteidl.core.TypedInterfaceR\tinterface\x12)\n\x05nodes\x18\x04 \x03(\x0b\x32\x13.flyteidl.core.NodeR\x05nodes\x12\x30\n\x07outputs\x18\x05 \x03(\x0b\x32\x16.flyteidl.core.BindingR\x07outputs\x12\x36\n\x0c\x66\x61ilure_node\x18\x06 \x01(\x0b\x32\x13.flyteidl.core.NodeR\x0b\x66\x61ilureNode\x12T\n\x11metadata_defaults\x18\x07 \x01(\x0b\x32\'.flyteidl.core.WorkflowMetadataDefaultsR\x10metadataDefaults\"\xc5\x01\n\x11TaskNodeOverrides\x12\x36\n\tresources\x18\x01 \x01(\x0b\x32\x18.flyteidl.core.ResourcesR\tresources\x12O\n\x12\x65xtended_resources\x18\x02 \x01(\x0b\x32 .flyteidl.core.ExtendedResourcesR\x11\x65xtendedResources\x12\'\n\x0f\x63ontainer_image\x18\x03 \x01(\tR\x0e\x63ontainerImage\"\xba\x01\n\x12LaunchPlanTemplate\x12)\n\x02id\x18\x01 \x01(\x0b\x32\x19.flyteidl.core.IdentifierR\x02id\x12;\n\tinterface\x18\x02 \x01(\x0b\x32\x1d.flyteidl.core.TypedInterfaceR\tinterface\x12<\n\x0c\x66ixed_inputs\x18\x03 \x01(\x0b\x32\x19.flyteidl.core.LiteralMapR\x0b\x66ixedInputsB\xb3\x01\n\x11\x63om.flyteidl.coreB\rWorkflowProtoP\x01Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\xa2\x02\x03\x46\x43X\xaa\x02\rFlyteidl.Core\xca\x02\rFlyteidl\\Core\xe2\x02\x19\x46lyteidl\\Core\\GPBMetadata\xea\x02\x0e\x46lyteidl::Coreb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -33,44 +34,44 @@ DESCRIPTOR._serialized_options = b'\n\021com.flyteidl.coreB\rWorkflowProtoP\001Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\242\002\003FCX\252\002\rFlyteidl.Core\312\002\rFlyteidl\\Core\342\002\031Flyteidl\\Core\\GPBMetadata\352\002\016Flyteidl::Core' _WORKFLOWMETADATA_TAGSENTRY._options = None _WORKFLOWMETADATA_TAGSENTRY._serialized_options = b'8\001' - _globals['_IFBLOCK']._serialized_start=318 - _globals['_IFBLOCK']._serialized_end=441 - _globals['_IFELSEBLOCK']._serialized_start=444 - _globals['_IFELSEBLOCK']._serialized_end=656 - _globals['_BRANCHNODE']._serialized_start=658 - _globals['_BRANCHNODE']._serialized_end=723 - _globals['_TASKNODE']._serialized_start=726 - _globals['_TASKNODE']._serialized_end=877 - _globals['_WORKFLOWNODE']._serialized_start=880 - _globals['_WORKFLOWNODE']._serialized_end=1046 - _globals['_APPROVECONDITION']._serialized_start=1048 - _globals['_APPROVECONDITION']._serialized_end=1095 - _globals['_SIGNALCONDITION']._serialized_start=1098 - _globals['_SIGNALCONDITION']._serialized_end=1242 - _globals['_SLEEPCONDITION']._serialized_start=1244 - _globals['_SLEEPCONDITION']._serialized_end=1315 - _globals['_GATENODE']._serialized_start=1318 - _globals['_GATENODE']._serialized_end=1515 - _globals['_ARRAYNODE']._serialized_start=1518 - _globals['_ARRAYNODE']._serialized_end=1709 - _globals['_NODEMETADATA']._serialized_start=1712 - _globals['_NODEMETADATA']._serialized_end=2108 - _globals['_ALIAS']._serialized_start=2110 - _globals['_ALIAS']._serialized_end=2157 - _globals['_NODE']._serialized_start=2160 - _globals['_NODE']._serialized_end=2703 - _globals['_WORKFLOWMETADATA']._serialized_start=2706 - _globals['_WORKFLOWMETADATA']._serialized_end=3086 - _globals['_WORKFLOWMETADATA_TAGSENTRY']._serialized_start=2948 - _globals['_WORKFLOWMETADATA_TAGSENTRY']._serialized_end=3003 - _globals['_WORKFLOWMETADATA_ONFAILUREPOLICY']._serialized_start=3005 - _globals['_WORKFLOWMETADATA_ONFAILUREPOLICY']._serialized_end=3086 - _globals['_WORKFLOWMETADATADEFAULTS']._serialized_start=3088 - _globals['_WORKFLOWMETADATADEFAULTS']._serialized_end=3152 - _globals['_WORKFLOWTEMPLATE']._serialized_start=3155 - _globals['_WORKFLOWTEMPLATE']._serialized_end=3573 - _globals['_TASKNODEOVERRIDES']._serialized_start=3576 - _globals['_TASKNODEOVERRIDES']._serialized_end=3773 - _globals['_LAUNCHPLANTEMPLATE']._serialized_start=3776 - _globals['_LAUNCHPLANTEMPLATE']._serialized_end=3962 + _globals['_IFBLOCK']._serialized_start=350 + _globals['_IFBLOCK']._serialized_end=473 + _globals['_IFELSEBLOCK']._serialized_start=476 + _globals['_IFELSEBLOCK']._serialized_end=688 + _globals['_BRANCHNODE']._serialized_start=690 + _globals['_BRANCHNODE']._serialized_end=755 + _globals['_TASKNODE']._serialized_start=758 + _globals['_TASKNODE']._serialized_end=909 + _globals['_WORKFLOWNODE']._serialized_start=912 + _globals['_WORKFLOWNODE']._serialized_end=1078 + _globals['_APPROVECONDITION']._serialized_start=1080 + _globals['_APPROVECONDITION']._serialized_end=1127 + _globals['_SIGNALCONDITION']._serialized_start=1130 + _globals['_SIGNALCONDITION']._serialized_end=1274 + _globals['_SLEEPCONDITION']._serialized_start=1276 + _globals['_SLEEPCONDITION']._serialized_end=1347 + _globals['_GATENODE']._serialized_start=1350 + _globals['_GATENODE']._serialized_end=1547 + _globals['_ARRAYNODE']._serialized_start=1550 + _globals['_ARRAYNODE']._serialized_end=1765 + _globals['_NODEMETADATA']._serialized_start=1768 + _globals['_NODEMETADATA']._serialized_end=2164 + _globals['_ALIAS']._serialized_start=2166 + _globals['_ALIAS']._serialized_end=2213 + _globals['_NODE']._serialized_start=2216 + _globals['_NODE']._serialized_end=2759 + _globals['_WORKFLOWMETADATA']._serialized_start=2762 + _globals['_WORKFLOWMETADATA']._serialized_end=3142 + _globals['_WORKFLOWMETADATA_TAGSENTRY']._serialized_start=3004 + _globals['_WORKFLOWMETADATA_TAGSENTRY']._serialized_end=3059 + _globals['_WORKFLOWMETADATA_ONFAILUREPOLICY']._serialized_start=3061 + _globals['_WORKFLOWMETADATA_ONFAILUREPOLICY']._serialized_end=3142 + _globals['_WORKFLOWMETADATADEFAULTS']._serialized_start=3144 + _globals['_WORKFLOWMETADATADEFAULTS']._serialized_end=3208 + _globals['_WORKFLOWTEMPLATE']._serialized_start=3211 + _globals['_WORKFLOWTEMPLATE']._serialized_end=3629 + _globals['_TASKNODEOVERRIDES']._serialized_start=3632 + _globals['_TASKNODEOVERRIDES']._serialized_end=3829 + _globals['_LAUNCHPLANTEMPLATE']._serialized_start=3832 + _globals['_LAUNCHPLANTEMPLATE']._serialized_end=4018 # @@protoc_insertion_point(module_scope) diff --git a/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.pyi b/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.pyi index 11efca2392..5c6f7f69d1 100644 --- a/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.pyi +++ b/flyteidl/gen/pb_python/flyteidl/core/workflow_pb2.pyi @@ -7,6 +7,7 @@ from flyteidl.core import tasks_pb2 as _tasks_pb2 from flyteidl.core import types_pb2 as _types_pb2 from flyteidl.core import security_pb2 as _security_pb2 from google.protobuf import duration_pb2 as _duration_pb2 +from google.protobuf import wrappers_pb2 as _wrappers_pb2 from google.protobuf.internal import containers as _containers from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper from google.protobuf import descriptor as _descriptor diff --git a/flyteidl/gen/pb_rust/flyteidl.core.rs b/flyteidl/gen/pb_rust/flyteidl.core.rs index 6922855798..5612d9c7a2 100644 --- a/flyteidl/gen/pb_rust/flyteidl.core.rs +++ b/flyteidl/gen/pb_rust/flyteidl.core.rs @@ -2397,18 +2397,24 @@ pub struct ArrayNode { /// node is the sub-node that will be executed for each element in the array. #[prost(message, optional, boxed, tag="1")] pub node: ::core::option::Option<::prost::alloc::boxed::Box>, - /// parallelism defines the minimum number of instances to bring up concurrently at any given - /// point. Note that this is an optimistic restriction and that, due to network partitioning or - /// other failures, the actual number of currently running instances might be more. This has to - /// be a positive number if assigned. Default value is size. - #[prost(int64, tag="2")] - pub parallelism: i64, + #[prost(oneof="array_node::ParallelismOption", tags="2")] + pub parallelism_option: ::core::option::Option, #[prost(oneof="array_node::SuccessCriteria", tags="3, 4")] pub success_criteria: ::core::option::Option, } /// Nested message and enum types in `ArrayNode`. pub mod array_node { #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum ParallelismOption { + /// parallelism defines the minimum number of instances to bring up concurrently at any given + /// point. Note that this is an optimistic restriction and that, due to network partitioning or + /// other failures, the actual number of currently running instances might be more. This has to + /// be a positive number if assigned. Default value is size. + #[prost(uint32, tag="2")] + Parallelism(u32), + } + #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum SuccessCriteria { /// min_successes is an absolute number of the minimum number of successful completions of diff --git a/flyteidl/protos/flyteidl/core/workflow.proto b/flyteidl/protos/flyteidl/core/workflow.proto index a305c8fad7..ec38904cbf 100644 --- a/flyteidl/protos/flyteidl/core/workflow.proto +++ b/flyteidl/protos/flyteidl/core/workflow.proto @@ -13,6 +13,7 @@ import "flyteidl/core/tasks.proto"; import "flyteidl/core/types.proto"; import "flyteidl/core/security.proto"; import "google/protobuf/duration.proto"; +import "google/protobuf/wrappers.proto"; // Defines a condition and the execution unit that should be executed if the condition is satisfied. message IfBlock { @@ -114,11 +115,13 @@ message ArrayNode { // node is the sub-node that will be executed for each element in the array. Node node = 1; - // parallelism defines the minimum number of instances to bring up concurrently at any given - // point. Note that this is an optimistic restriction and that, due to network partitioning or - // other failures, the actual number of currently running instances might be more. This has to - // be a positive number if assigned. Default value is size. - int64 parallelism = 2; + oneof parallelism_option { + // parallelism defines the minimum number of instances to bring up concurrently at any given + // point. Note that this is an optimistic restriction and that, due to network partitioning or + // other failures, the actual number of currently running instances might be more. This has to + // be a positive number if assigned. Default value is size. + uint32 parallelism = 2; + } oneof success_criteria { // min_successes is an absolute number of the minimum number of successful completions of diff --git a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array.go b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array.go index 9916f6a075..d8ba50546c 100644 --- a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array.go +++ b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array.go @@ -2,7 +2,7 @@ package v1alpha1 type ArrayNodeSpec struct { SubNodeSpec *NodeSpec - Parallelism int64 + Parallelism *uint32 MinSuccesses *uint32 MinSuccessRatio *float32 } @@ -11,7 +11,7 @@ func (a *ArrayNodeSpec) GetSubNodeSpec() *NodeSpec { return a.SubNodeSpec } -func (a *ArrayNodeSpec) GetParallelism() int64 { +func (a *ArrayNodeSpec) GetParallelism() *uint32 { return a.Parallelism } diff --git a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array_test.go b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array_test.go index c17051b6bd..1cd249acca 100644 --- a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array_test.go +++ b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/array_test.go @@ -16,12 +16,12 @@ func TestArrayNodeSpec_GetSubNodeSpec(t *testing.T) { } func TestArrayNodeSpec_GetParallelism(t *testing.T) { - parallelism := int64(5) + parallelism := uint32(5) arrayNodeSpec := ArrayNodeSpec{ - Parallelism: parallelism, + Parallelism: ¶llelism, } - if arrayNodeSpec.GetParallelism() != parallelism { + if arrayNodeSpec.GetParallelism() != ¶llelism { t.Errorf("Expected %d, but got %d", parallelism, arrayNodeSpec.GetParallelism()) } } diff --git a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/iface.go b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/iface.go index d6f07b856f..f92cca4a5a 100644 --- a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/iface.go +++ b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/iface.go @@ -258,7 +258,7 @@ type ExecutableGateNode interface { type ExecutableArrayNode interface { GetSubNodeSpec() *NodeSpec - GetParallelism() int64 + GetParallelism() *uint32 GetMinSuccesses() *uint32 GetMinSuccessRatio() *float32 } diff --git a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/mocks/ExecutableArrayNode.go b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/mocks/ExecutableArrayNode.go index 742ceb2dbb..8634d1175c 100644 --- a/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/mocks/ExecutableArrayNode.go +++ b/flytepropeller/pkg/apis/flyteworkflow/v1alpha1/mocks/ExecutableArrayNode.go @@ -84,7 +84,7 @@ type ExecutableArrayNode_GetParallelism struct { *mock.Call } -func (_m ExecutableArrayNode_GetParallelism) Return(_a0 int64) *ExecutableArrayNode_GetParallelism { +func (_m ExecutableArrayNode_GetParallelism) Return(_a0 *uint32) *ExecutableArrayNode_GetParallelism { return &ExecutableArrayNode_GetParallelism{Call: _m.Call.Return(_a0)} } @@ -99,14 +99,16 @@ func (_m *ExecutableArrayNode) OnGetParallelismMatch(matchers ...interface{}) *E } // GetParallelism provides a mock function with given fields: -func (_m *ExecutableArrayNode) GetParallelism() int64 { +func (_m *ExecutableArrayNode) GetParallelism() *uint32 { ret := _m.Called() - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { + var r0 *uint32 + if rf, ok := ret.Get(0).(func() *uint32); ok { r0 = rf() } else { - r0 = ret.Get(0).(int64) + if ret.Get(0) != nil { + r0 = ret.Get(0).(*uint32) + } } return r0 diff --git a/flytepropeller/pkg/compiler/transformers/k8s/node.go b/flytepropeller/pkg/compiler/transformers/k8s/node.go index 7b5df9b3b5..8a4c9248ec 100644 --- a/flytepropeller/pkg/compiler/transformers/k8s/node.go +++ b/flytepropeller/pkg/compiler/transformers/k8s/node.go @@ -178,11 +178,17 @@ func buildNodeSpec(n *core.Node, tasks []*core.CompiledTask, errs errors.Compile return nil, ok } + var parallelism *uint32 + switch x := arrayNode.GetParallelismOption().(type) { + case *core.ArrayNode_Parallelism: + parallelism = &x.Parallelism + } + // build ArrayNode nodeSpec.Kind = v1alpha1.NodeKindArray nodeSpec.ArrayNode = &v1alpha1.ArrayNodeSpec{ SubNodeSpec: subNodeSpecs[0], - Parallelism: arrayNode.Parallelism, + Parallelism: parallelism, } switch successCriteria := arrayNode.SuccessCriteria.(type) { diff --git a/flytepropeller/pkg/compiler/transformers/k8s/node_test.go b/flytepropeller/pkg/compiler/transformers/k8s/node_test.go index ff1f263b6e..c6a08b5991 100644 --- a/flytepropeller/pkg/compiler/transformers/k8s/node_test.go +++ b/flytepropeller/pkg/compiler/transformers/k8s/node_test.go @@ -296,7 +296,34 @@ func TestBuildNodeSpec(t *testing.T) { }, }, }, - Parallelism: 10, + ParallelismOption: &core.ArrayNode_Parallelism{ + Parallelism: 10, + }, + SuccessCriteria: &core.ArrayNode_MinSuccessRatio{ + MinSuccessRatio: 0.5, + }, + }, + } + + mustBuild(t, n, 1, errs.NewScope()) + specs, ok := buildNodeSpec(n.GetCoreNode(), tasks, errs) + assert.True(t, ok) + assert.Len(t, specs, 1) + assert.Equal(t, *specs[0].ArrayNode.Parallelism, uint32(10)) + + n.Node.Target = &core.Node_ArrayNode{ + ArrayNode: &core.ArrayNode{ + Node: &core.Node{ + Id: "foo", + Target: &core.Node_TaskNode{ + TaskNode: &core.TaskNode{ + Reference: &core.TaskNode_ReferenceId{ + ReferenceId: &core.Identifier{Name: "ref_1"}, + }, + }, + }, + }, + ParallelismOption: nil, SuccessCriteria: &core.ArrayNode_MinSuccessRatio{ MinSuccessRatio: 0.5, }, @@ -304,6 +331,10 @@ func TestBuildNodeSpec(t *testing.T) { } mustBuild(t, n, 1, errs.NewScope()) + specs, ok = buildNodeSpec(n.GetCoreNode(), tasks, errs) + assert.True(t, ok) + assert.Len(t, specs, 1) + assert.Nil(t, specs[0].ArrayNode.Parallelism) }) } diff --git a/flytepropeller/pkg/controller/nodes/array/handler.go b/flytepropeller/pkg/controller/nodes/array/handler.go index 1084326a33..1699d47de0 100644 --- a/flytepropeller/pkg/controller/nodes/array/handler.go +++ b/flytepropeller/pkg/controller/nodes/array/handler.go @@ -255,7 +255,7 @@ func (a *arrayNodeHandler) Handle(ctx context.Context, nCtx interfaces.NodeExecu availableParallelism := 0 // using the workflow's parallelism if the array node parallelism is not set - useWorkflowParallelism := int(arrayNode.GetParallelism()) == -1 + useWorkflowParallelism := arrayNode.GetParallelism() == nil if useWorkflowParallelism { // greedily take all available slots // TODO: This will need to be re-evaluated if we want to support dynamics & sub_workflows @@ -263,7 +263,7 @@ func (a *arrayNodeHandler) Handle(ctx context.Context, nCtx interfaces.NodeExecu maxParallelism := nCtx.ExecutionContext().GetExecutionConfig().MaxParallelism availableParallelism = int(maxParallelism - currentParallelism) } else { - availableParallelism = int(arrayNode.GetParallelism()) + availableParallelism = int(*arrayNode.GetParallelism()) if availableParallelism == 0 { availableParallelism = len(arrayNodeState.SubNodePhases.GetItems()) } diff --git a/flytepropeller/pkg/controller/nodes/array/handler_test.go b/flytepropeller/pkg/controller/nodes/array/handler_test.go index f514790542..b1f055c483 100644 --- a/flytepropeller/pkg/controller/nodes/array/handler_test.go +++ b/flytepropeller/pkg/controller/nodes/array/handler_test.go @@ -456,6 +456,10 @@ func TestHandleArrayNodePhaseNone(t *testing.T) { } } +func uint32Ptr(v uint32) *uint32 { + return &v +} + func TestHandleArrayNodePhaseExecuting(t *testing.T) { ctx := context.Background() minSuccessRatio := float32(0.5) @@ -478,7 +482,7 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { tests := []struct { name string - parallelism int + parallelism *uint32 minSuccessRatio *float32 subNodePhases []v1alpha1.NodePhase subNodeTaskPhases []core.Phase @@ -491,7 +495,8 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { incrementParallelismCount uint32 }{ { - name: "StartAllSubNodes", + name: "StartAllSubNodes", + parallelism: uint32Ptr(0), subNodePhases: []v1alpha1.NodePhase{ v1alpha1.NodePhaseQueued, v1alpha1.NodePhaseQueued, @@ -510,7 +515,7 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { }, { name: "StartOneSubNodeParallelism", - parallelism: 1, + parallelism: uint32Ptr(1), subNodePhases: []v1alpha1.NodePhase{ v1alpha1.NodePhaseQueued, v1alpha1.NodePhaseQueued, @@ -528,7 +533,7 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { }, { name: "UtilizeWfParallelismAllSubNodes", - parallelism: -1, + parallelism: nil, currentWfParallelism: 0, incrementParallelismCount: 2, subNodePhases: []v1alpha1.NodePhase{ @@ -549,7 +554,7 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { }, { name: "UtilizeWfParallelismSomeSubNodes", - parallelism: -1, + parallelism: nil, currentWfParallelism: workflowMaxParallelism - 1, incrementParallelismCount: 1, subNodePhases: []v1alpha1.NodePhase{ @@ -569,7 +574,7 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { }, { name: "UtilizeWfParallelismNoSubNodes", - parallelism: -1, + parallelism: nil, currentWfParallelism: workflowMaxParallelism, incrementParallelismCount: 0, subNodePhases: []v1alpha1.NodePhase{ @@ -586,7 +591,8 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { expectedExternalResourcePhases: []idlcore.TaskExecution_Phase{}, }, { - name: "StartSubNodesNewAttempts", + name: "StartSubNodesNewAttempts", + parallelism: uint32Ptr(0), subNodePhases: []v1alpha1.NodePhase{ v1alpha1.NodePhaseQueued, v1alpha1.NodePhaseQueued, @@ -604,7 +610,8 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { expectedExternalResourcePhases: []idlcore.TaskExecution_Phase{idlcore.TaskExecution_RUNNING, idlcore.TaskExecution_RUNNING}, }, { - name: "AllSubNodesSuccedeed", + name: "AllSubNodesSuccedeed", + parallelism: uint32Ptr(0), subNodePhases: []v1alpha1.NodePhase{ v1alpha1.NodePhaseRunning, v1alpha1.NodePhaseRunning, @@ -623,6 +630,7 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { }, { name: "OneSubNodeSuccedeedMinSuccessRatio", + parallelism: uint32Ptr(0), minSuccessRatio: &minSuccessRatio, subNodePhases: []v1alpha1.NodePhase{ v1alpha1.NodePhaseRunning, @@ -641,7 +649,8 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { expectedExternalResourcePhases: []idlcore.TaskExecution_Phase{idlcore.TaskExecution_SUCCEEDED, idlcore.TaskExecution_FAILED}, }, { - name: "OneSubNodeFailed", + name: "OneSubNodeFailed", + parallelism: uint32Ptr(0), subNodePhases: []v1alpha1.NodePhase{ v1alpha1.NodePhaseRunning, v1alpha1.NodePhaseRunning, @@ -697,7 +706,7 @@ func TestHandleArrayNodePhaseExecuting(t *testing.T) { eventRecorder := newBufferedEventRecorder() nodeSpec := arrayNodeSpec - nodeSpec.ArrayNode.Parallelism = int64(test.parallelism) + nodeSpec.ArrayNode.Parallelism = test.parallelism nodeSpec.ArrayNode.MinSuccessRatio = test.minSuccessRatio nCtx := createNodeExecutionContext(dataStore, eventRecorder, nil, literalMap, &arrayNodeSpec, arrayNodeState, test.currentWfParallelism, workflowMaxParallelism) From b03e86de079ff3fbce837500e41a7c3e13ac93e2 Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Thu, 11 Apr 2024 14:07:53 -0700 Subject: [PATCH 423/645] Fix get task resource attribute comment (#469) Signed-off-by: Yee Hing Tong --- flytectl/cmd/get/matchable_task_resource_attribute.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/flytectl/cmd/get/matchable_task_resource_attribute.go b/flytectl/cmd/get/matchable_task_resource_attribute.go index 63ec690666..cfc5f4c6d4 100644 --- a/flytectl/cmd/get/matchable_task_resource_attribute.go +++ b/flytectl/cmd/get/matchable_task_resource_attribute.go @@ -2,7 +2,6 @@ package get import ( "context" - "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytectl/cmd/config" sconfig "github.com/flyteorg/flytectl/cmd/config/subcommand" @@ -44,7 +43,7 @@ Example: content of tra.yaml: :: - flytectl get task-resource-attribute --attrFile tra.yaml + flytectl get -p flytesnacks -d development task-resource-attribute --attrFile tra.yaml .. code-block:: yaml From 99552560d535dbef9e34773470685a7dac403352 Mon Sep 17 00:00:00 2001 From: Yini <131146298+yini7777@users.noreply.github.com> Date: Thu, 11 Apr 2024 23:22:36 +0200 Subject: [PATCH 424/645] Fix mounting secrets (#5063) Signed-off-by: yini.gao@schibsted.com --- charts/flyte-core/README.md | 2 +- charts/flyte-core/templates/common/secret-auth.yaml | 2 +- ...ues-keycloak-idp-flyteclients-without-browser.yaml | 7 +++++-- charts/flyte-core/values.yaml | 7 +++++-- docker/sandbox-bundled/manifests/complete-agent.yaml | 4 ++-- docker/sandbox-bundled/manifests/complete.yaml | 4 ++-- docker/sandbox-bundled/manifests/dev.yaml | 4 ++-- docs/deployment/configuration/auth_setup.rst | 11 ++++++++--- 8 files changed, 26 insertions(+), 15 deletions(-) diff --git a/charts/flyte-core/README.md b/charts/flyte-core/README.md index 00fd69f368..55d327a25f 100644 --- a/charts/flyte-core/README.md +++ b/charts/flyte-core/README.md @@ -273,7 +273,7 @@ helm install gateway bitnami/contour -n flyte | flytescheduler.tolerations | list | `[]` | tolerations for Flytescheduler deployment | | secrets.adminOauthClientCredentials.clientId | string | `"flytepropeller"` | | | secrets.adminOauthClientCredentials.clientSecret | string | `"foobar"` | | -| secrets.adminOauthClientCredentials.enabled | bool | `true` | If enabled is true, helm will create and manage `flyte-secret-auth` and populate it with `clientSecret`. If enabled is false, it's up to the user to create `flyte-secret-auth` as described in https://docs.flyte.org/en/latest/deployment/cluster_config/auth_setup.html#oauth2-authorization-server | +| secrets.adminOauthClientCredentials.enabled | bool | `true` | | | sparkoperator | object | `{"enabled":false,"plugin_config":{"plugins":{"spark":{"spark-config-default":[{"spark.hadoop.fs.s3a.aws.credentials.provider":"com.amazonaws.auth.DefaultAWSCredentialsProviderChain"},{"spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version":"2"},{"spark.kubernetes.allocation.batch.size":"50"},{"spark.hadoop.fs.s3a.acl.default":"BucketOwnerFullControl"},{"spark.hadoop.fs.s3n.impl":"org.apache.hadoop.fs.s3a.S3AFileSystem"},{"spark.hadoop.fs.AbstractFileSystem.s3n.impl":"org.apache.hadoop.fs.s3a.S3A"},{"spark.hadoop.fs.s3.impl":"org.apache.hadoop.fs.s3a.S3AFileSystem"},{"spark.hadoop.fs.AbstractFileSystem.s3.impl":"org.apache.hadoop.fs.s3a.S3A"},{"spark.hadoop.fs.s3a.impl":"org.apache.hadoop.fs.s3a.S3AFileSystem"},{"spark.hadoop.fs.AbstractFileSystem.s3a.impl":"org.apache.hadoop.fs.s3a.S3A"},{"spark.hadoop.fs.s3a.multipart.threshold":"536870912"},{"spark.blacklist.enabled":"true"},{"spark.blacklist.timeout":"5m"},{"spark.task.maxfailures":"8"}]}}}}` | Optional: Spark Plugin using the Spark Operator | | sparkoperator.enabled | bool | `false` | - enable or disable Sparkoperator deployment installation | | sparkoperator.plugin_config | object | `{"plugins":{"spark":{"spark-config-default":[{"spark.hadoop.fs.s3a.aws.credentials.provider":"com.amazonaws.auth.DefaultAWSCredentialsProviderChain"},{"spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version":"2"},{"spark.kubernetes.allocation.batch.size":"50"},{"spark.hadoop.fs.s3a.acl.default":"BucketOwnerFullControl"},{"spark.hadoop.fs.s3n.impl":"org.apache.hadoop.fs.s3a.S3AFileSystem"},{"spark.hadoop.fs.AbstractFileSystem.s3n.impl":"org.apache.hadoop.fs.s3a.S3A"},{"spark.hadoop.fs.s3.impl":"org.apache.hadoop.fs.s3a.S3AFileSystem"},{"spark.hadoop.fs.AbstractFileSystem.s3.impl":"org.apache.hadoop.fs.s3a.S3A"},{"spark.hadoop.fs.s3a.impl":"org.apache.hadoop.fs.s3a.S3AFileSystem"},{"spark.hadoop.fs.AbstractFileSystem.s3a.impl":"org.apache.hadoop.fs.s3a.S3A"},{"spark.hadoop.fs.s3a.multipart.threshold":"536870912"},{"spark.blacklist.enabled":"true"},{"spark.blacklist.timeout":"5m"},{"spark.task.maxfailures":"8"}]}}}` | Spark plugin configuration | diff --git a/charts/flyte-core/templates/common/secret-auth.yaml b/charts/flyte-core/templates/common/secret-auth.yaml index 50290357d8..d13247bd9a 100644 --- a/charts/flyte-core/templates/common/secret-auth.yaml +++ b/charts/flyte-core/templates/common/secret-auth.yaml @@ -1,4 +1,4 @@ -{{- if .Values.secrets.adminOauthClientCredentials.enabled }} +{{- if and (.Values.secrets.adminOauthClientCredentials.enabled) (not (empty .Values.secrets.adminOauthClientCredentials.clientSecret)) }} apiVersion: v1 kind: Secret metadata: diff --git a/charts/flyte-core/values-keycloak-idp-flyteclients-without-browser.yaml b/charts/flyte-core/values-keycloak-idp-flyteclients-without-browser.yaml index 5b12b7b3f9..22624d8775 100644 --- a/charts/flyte-core/values-keycloak-idp-flyteclients-without-browser.yaml +++ b/charts/flyte-core/values-keycloak-idp-flyteclients-without-browser.yaml @@ -298,9 +298,12 @@ deployRedoc: false secrets: adminOauthClientCredentials: - # -- If enabled is true, helm will create and manage `flyte-secret-auth` and populate it with `clientSecret`. - # If enabled is false, it's up to the user to create `flyte-secret-auth` as described in + # If enabled is true, and `clientSecret` is specified, helm will create and mount `flyte-secret-auth`. + # If enabled is true, and `clientSecret` is null, it's up to the user to create `flyte-secret-auth` as described in # https://docs.flyte.org/en/latest/deployment/cluster_config/auth_setup.html#oauth2-authorization-server + # and helm will mount `flyte-secret-auth`. + # If enabled is false, auth is not turned on. + # Note: Unsupported combination: enabled.false and clientSecret.someValue enabled: true clientSecret: "<>" # put the secret for the confidential client flytepropeller defined in the IDP clientId: "flytepropeller" #use this client id and secret in the flytectl config with ClientSecret option diff --git a/charts/flyte-core/values.yaml b/charts/flyte-core/values.yaml index 8b1e4b89d6..f3580786a6 100755 --- a/charts/flyte-core/values.yaml +++ b/charts/flyte-core/values.yaml @@ -430,9 +430,12 @@ deployRedoc: false secrets: adminOauthClientCredentials: - # -- If enabled is true, helm will create and manage `flyte-secret-auth` and populate it with `clientSecret`. - # If enabled is false, it's up to the user to create `flyte-secret-auth` as described in + # If enabled is true, and `clientSecret` is specified, helm will create and mount `flyte-secret-auth`. + # If enabled is true, and `clientSecret` is null, it's up to the user to create `flyte-secret-auth` as described in # https://docs.flyte.org/en/latest/deployment/cluster_config/auth_setup.html#oauth2-authorization-server + # and helm will mount `flyte-secret-auth`. + # If enabled is false, auth is not turned on. + # Note: Unsupported combination: enabled.false and clientSecret.someValue enabled: true clientSecret: foobar clientId: flytepropeller diff --git a/docker/sandbox-bundled/manifests/complete-agent.yaml b/docker/sandbox-bundled/manifests/complete-agent.yaml index 2db8226933..4b31375fc3 100644 --- a/docker/sandbox-bundled/manifests/complete-agent.yaml +++ b/docker/sandbox-bundled/manifests/complete-agent.yaml @@ -816,7 +816,7 @@ type: Opaque --- apiVersion: v1 data: - haSharedSecret: WEJxZGNCTWJiNFUwZEd1bQ== + haSharedSecret: WlVScnNIb3I2RFM4UFhrcA== proxyPassword: "" proxyUsername: "" kind: Secret @@ -1412,7 +1412,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: 45571013e2bcbc17744162363ccc7fc5c99072b2553a3fe29f41660a07e2e864 + checksum/secret: a041f8b1e9c41f465e4f113957cc10f1b48b2e259a5d193657571ae597305e2c labels: app: docker-registry release: flyte-sandbox diff --git a/docker/sandbox-bundled/manifests/complete.yaml b/docker/sandbox-bundled/manifests/complete.yaml index 98b5aa3657..4f5f878a00 100644 --- a/docker/sandbox-bundled/manifests/complete.yaml +++ b/docker/sandbox-bundled/manifests/complete.yaml @@ -796,7 +796,7 @@ type: Opaque --- apiVersion: v1 data: - haSharedSecret: a1Zqcm1HUlcxZUN4SExqSw== + haSharedSecret: VU5MNDc1MDZUU05OWmZOYw== proxyPassword: "" proxyUsername: "" kind: Secret @@ -1360,7 +1360,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: bf4abdac7aaf5a74cf2f12f7511d4af46e5c2b8228637c5eb29f9ed5399e4942 + checksum/secret: 0c9fcdc5ba4f5091dbd31e0a907c4748391313df162b5e1d3ace3084b62cdd40 labels: app: docker-registry release: flyte-sandbox diff --git a/docker/sandbox-bundled/manifests/dev.yaml b/docker/sandbox-bundled/manifests/dev.yaml index 49c259b0d9..43144186ce 100644 --- a/docker/sandbox-bundled/manifests/dev.yaml +++ b/docker/sandbox-bundled/manifests/dev.yaml @@ -499,7 +499,7 @@ metadata: --- apiVersion: v1 data: - haSharedSecret: dkdTTTV4ZkNpc2pneXZBRQ== + haSharedSecret: RXhwTzhZT25HZzJjdUllSQ== proxyPassword: "" proxyUsername: "" kind: Secret @@ -934,7 +934,7 @@ spec: metadata: annotations: checksum/config: 8f50e768255a87f078ba8b9879a0c174c3e045ffb46ac8723d2eedbe293c8d81 - checksum/secret: 40299f1a8b9fffd1ef10051c289e1d654de7f755fff5f44cde65a9cf96bcd543 + checksum/secret: 6f8a6d8c2b4e54840abf28822833192923adeb062f926c962e8e0785b96877d5 labels: app: docker-registry release: flyte-sandbox diff --git a/docs/deployment/configuration/auth_setup.rst b/docs/deployment/configuration/auth_setup.rst index d9a7f2c7eb..bb73bef8e3 100644 --- a/docs/deployment/configuration/auth_setup.rst +++ b/docs/deployment/configuration/auth_setup.rst @@ -346,8 +346,12 @@ Apply OIDC Configuration secrets: adminOauthClientCredentials: - # -- If enabled is true, helm will create and manage `flyte-secret-auth` and populate it with `clientSecret`. - # If enabled is false, it's up to the user to create `flyte-secret-auth` + # If enabled is true, and `clientSecret` is specified, helm will create and mount `flyte-secret-auth`. + # If enabled is true, and `clientSecret` is null, it's up to the user to create `flyte-secret-auth` as described in + # https://docs.flyte.org/en/latest/deployment/cluster_config/auth_setup.html#oauth2-authorization-server + # and helm will mount `flyte-secret-auth`. + # If enabled is false, auth is not turned on. + # Note: Unsupported combination: enabled.false and clientSecret.someValue enabled: true # Use the non-encoded version of the random password clientSecret: "" @@ -677,7 +681,8 @@ Alternatively, you can instruct Helm not to create and manage the secret for ``f secrets: adminOauthClientCredentials: - enabled: false #set to false + enabled: true # enable mounting the flyte-secret-auth secret to the flytepropeller. + clientSecret: null # disable Helm from creating the flyte-secret-auth secret. # Replace with the client_id provided by provided by your IdP for flytepropeller. clientId: From 734d6f33b7182fc026894e97e508f06ab4ed5ded Mon Sep 17 00:00:00 2001 From: Nikki Everett Date: Thu, 11 Apr 2024 18:16:28 -0500 Subject: [PATCH 425/645] Update "Creating a Flyte project" with link to new Dockerfile project template (#5215) * update with link to dockerfile template Signed-off-by: nikki everett * fix 404 error Signed-off-by: nikki everett --------- Signed-off-by: nikki everett --- .../creating_a_flyte_project.md | 6 +++--- .../flyte_project_components.md | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/getting_started_with_workflow_development/creating_a_flyte_project.md b/docs/getting_started_with_workflow_development/creating_a_flyte_project.md index 7e9017664f..0e0160ec59 100644 --- a/docs/getting_started_with_workflow_development/creating_a_flyte_project.md +++ b/docs/getting_started_with_workflow_development/creating_a_flyte_project.md @@ -23,7 +23,7 @@ conda activate flyte-example Next, initialize your Flyte project. The [flytekit-python-template GitHub repository](https://github.com/flyteorg/flytekit-python-template) contains Flyte project templates with sample code that you can run as is or modify to suit your needs. -In this example, we will initialize the [basic-example-imagespec project template](https://github.com/flyteorg/flytekit-python-template/tree/main/basic-example-imagespec). +In this example, we will initialize the [basic-template-imagespec project template](https://github.com/flyteorg/flytekit-python-template/tree/main/basic-template-imagespec). ```{prompt} bash $ pyflyte init my_project @@ -31,9 +31,9 @@ pyflyte init my_project :::{note} -To initialize a Flyte project with a different template, use the `--template` parameter: +If you need to use a Dockerfile for your project, you can initialize the Dockerfile template: -`pyflyte init --template hello-world hello-world` +`pyflyte init --template basic-template-dockerfile my_project` ::: ### 3. Install additional requirements diff --git a/docs/getting_started_with_workflow_development/flyte_project_components.md b/docs/getting_started_with_workflow_development/flyte_project_components.md index 8c24946aad..47821c5201 100644 --- a/docs/getting_started_with_workflow_development/flyte_project_components.md +++ b/docs/getting_started_with_workflow_development/flyte_project_components.md @@ -1,3 +1,4 @@ +(flyte_project_components)= # Flyte project components A Flyte project is a directory containing task and workflow code, internal Python source code, configuration files, and other artifacts required to package up your code so that it can be run on a Flyte cluster. @@ -26,13 +27,13 @@ You can specify pip-installable Python dependencies in your project by adding th `requirements.txt` file. ```{note} -We recommend using [pip-compile](https://pip-tools.readthedocs.io/en/latest/) to +We recommend using [pip-compile](https://pip-tools.readthedocs.io/en/stable/) to manage your project's Python requirements. ``` ````{dropdown} See requirements.txt -```{rli} https://raw.githubusercontent.com/flyteorg/flytekit-python-template/main/simple-example/%7B%7Bcookiecutter.project_name%7D%7D/requirements.txt +```{rli} https://raw.githubusercontent.com/flyteorg/flytekit-python-template/main/basic-template-imagespec/%7B%7Bcookiecutter.project_name%7D%7D/requirements.txt :caption: requirements.txt ``` From b36556ea94007395b53d78db3fa28e1b9e39b7f3 Mon Sep 17 00:00:00 2001 From: Nikki Everett Date: Thu, 11 Apr 2024 22:40:21 -0500 Subject: [PATCH 426/645] Re-apply changes to dataclass docs from flytesnacks#1553 (#5211) * copy changes over from flytesnacks#1553 Signed-off-by: nikki everett * fix formatting Signed-off-by: nikki everett * fix 404 error Signed-off-by: nikki everett --------- Signed-off-by: nikki everett --- docs/user_guide/data_types_and_io/dataclass.md | 3 +++ docs/user_guide/data_types_and_io/index.md | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/user_guide/data_types_and_io/dataclass.md b/docs/user_guide/data_types_and_io/dataclass.md index fdb9f1d992..7bdaee0385 100644 --- a/docs/user_guide/data_types_and_io/dataclass.md +++ b/docs/user_guide/data_types_and_io/dataclass.md @@ -33,6 +33,9 @@ to serialize and deserialize dataclasses. :::{important} If you're using Flytekit version below v1.10, you'll need to decorate with `@dataclass_json` using `from dataclass_json import dataclass_json` instead of inheriting from Mashumaro's `DataClassJSONMixin`. + +If you're using Flytekit version >= v1.11.1, you don't need to decorate with `@dataclass_json` or +inherit from Mashumaro's `DataClassJSONMixin`. ::: To begin, import the necessary dependencies. diff --git a/docs/user_guide/data_types_and_io/index.md b/docs/user_guide/data_types_and_io/index.md index f55aec69b4..d03df92804 100644 --- a/docs/user_guide/data_types_and_io/index.md +++ b/docs/user_guide/data_types_and_io/index.md @@ -99,8 +99,7 @@ Here's a breakdown of these mappings: * - ``@dataclass`` - ``Struct`` - Automatic - - The class should be a pure value class that inherits from Mashumaro's DataClassJSONMixin, - and be annotated with the ``@dataclass`` decorator. + - The class should be a pure value class annotated with the ``@dataclass`` decorator. * - ``np.ndarray`` - File - Automatic From c7d1463090482b091e011e902f9d9a0060eed826 Mon Sep 17 00:00:00 2001 From: Chi-Sheng Liu Date: Fri, 12 Apr 2024 12:24:12 +0800 Subject: [PATCH 427/645] feat(ray): Remove initContainers (#5178) Signed-off-by: Chi-Sheng Liu Signed-off-by: Kevin Su Co-authored-by: Kevin Su --- flyteplugins/go/tasks/plugins/k8s/ray/ray.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/flyteplugins/go/tasks/plugins/k8s/ray/ray.go b/flyteplugins/go/tasks/plugins/k8s/ray/ray.go index 869b9abd9e..ff0cfc6cd3 100644 --- a/flyteplugins/go/tasks/plugins/k8s/ray/ray.go +++ b/flyteplugins/go/tasks/plugins/k8s/ray/ray.go @@ -380,19 +380,6 @@ func buildSubmitterPodTemplate(podSpec *v1.PodSpec, objectMeta *metav1.ObjectMet func buildWorkerPodTemplate(primaryContainer *v1.Container, podSpec *v1.PodSpec, objectMetadata *metav1.ObjectMeta, taskCtx pluginsCore.TaskExecutionContext) v1.PodTemplateSpec { // Some configs are copy from https://github.com/ray-project/kuberay/blob/b72e6bdcd9b8c77a9dc6b5da8560910f3a0c3ffd/apiserver/pkg/util/cluster.go#L185 // They should always be the same, so we could hard code here. - initContainers := []v1.Container{ - { - Name: "init-myservice", - Image: "busybox:1.28", - Command: []string{ - "sh", - "-c", - "until nslookup $RAY_IP.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done", - }, - Resources: primaryContainer.Resources, - }, - } - podSpec.InitContainers = append(podSpec.InitContainers, initContainers...) primaryContainer.Name = "ray-worker" From 6159c278c90ae84772545d35f4e72c1e87e0ebdb Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Fri, 12 Apr 2024 15:55:53 -0700 Subject: [PATCH 428/645] fix(databricks): Check the response body before unmarshal (#5226) Signed-off-by: Kevin Su --- .../go/tasks/plugins/webapi/databricks/plugin.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/flyteplugins/go/tasks/plugins/webapi/databricks/plugin.go b/flyteplugins/go/tasks/plugins/webapi/databricks/plugin.go index 5ebe1d0075..70d7c7e2f9 100644 --- a/flyteplugins/go/tasks/plugins/webapi/databricks/plugin.go +++ b/flyteplugins/go/tasks/plugins/webapi/databricks/plugin.go @@ -234,10 +234,14 @@ func (p Plugin) sendRequest(method string, databricksJob map[string]interface{}, return nil, err } var data map[string]interface{} - err = json.Unmarshal(responseBody, &data) - if err != nil { - return nil, fmt.Errorf("failed to parse response with err: [%v]", err) + + if len(responseBody) != 0 { + err = json.Unmarshal(responseBody, &data) + if err != nil { + return nil, fmt.Errorf("failed to parse response with err: [%v]", err) + } } + if resp.StatusCode != http.StatusOK { message := "" if v, ok := data["message"]; ok { @@ -259,10 +263,16 @@ func (p Plugin) Status(ctx context.Context, taskCtx webapi.StatusContext) (phase taskInfo := createTaskInfo(exec.RunID, jobID, exec.DatabricksInstance) switch lifeCycleState { // Job response format. https://docs.databricks.com/en/workflows/jobs/jobs-2.0-api.html#runlifecyclestate + case "QUEUED": + return core.PhaseInfoQueued(time.Now(), core.DefaultPhaseVersion, message), nil case "PENDING": return core.PhaseInfoInitializing(time.Now(), core.DefaultPhaseVersion, message, taskInfo), nil case "RUNNING": fallthrough + case "BLOCKED": + fallthrough + case "WAITING_FOR_RETRY": + fallthrough case "TERMINATING": return core.PhaseInfoRunning(core.DefaultPhaseVersion, taskInfo), nil case "TERMINATED": From 80ccda34cd994cefbdf61a35e9446202fcdafd3a Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Fri, 12 Apr 2024 16:31:57 -0700 Subject: [PATCH 429/645] perf(cache): Use AddRateLimited for batch enqueue (#5228) Signed-off-by: Kevin Su --- flytestdlib/cache/auto_refresh.go | 2 +- flytestdlib/cache/auto_refresh_test.go | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/flytestdlib/cache/auto_refresh.go b/flytestdlib/cache/auto_refresh.go index f2257813a7..58490669f4 100644 --- a/flytestdlib/cache/auto_refresh.go +++ b/flytestdlib/cache/auto_refresh.go @@ -252,7 +252,7 @@ func (w *autoRefresh) enqueueBatches(ctx context.Context) error { for _, batch := range batches { b := batch - w.workqueue.Add(&b) + w.workqueue.AddRateLimited(&b) } return nil diff --git a/flytestdlib/cache/auto_refresh_test.go b/flytestdlib/cache/auto_refresh_test.go index 4535e8c465..7707b593ff 100644 --- a/flytestdlib/cache/auto_refresh_test.go +++ b/flytestdlib/cache/auto_refresh_test.go @@ -19,11 +19,12 @@ import ( const fakeCacheItemValueLimit = 10 type fakeCacheItem struct { - val int + val int + isTerminal bool } func (f fakeCacheItem) IsTerminal() bool { - return false + return f.isTerminal } type terminalCacheItem struct { @@ -42,11 +43,15 @@ func syncFakeItem(_ context.Context, batch Batch) ([]ItemSyncResponse, error) { // After the item has gone through ten update cycles, leave it unchanged continue } - + isTerminal := false + if item.val == fakeCacheItemValueLimit-1 { + isTerminal = true + } items = append(items, ItemSyncResponse{ ID: obj.GetID(), Item: fakeCacheItem{ - val: item.val + 1, + val: item.val + 1, + isTerminal: isTerminal, }, Action: Update, }) @@ -60,7 +65,7 @@ func syncTerminalItem(_ context.Context, batch Batch) ([]ItemSyncResponse, error } func TestCacheFour(t *testing.T) { - testResyncPeriod := time.Millisecond + testResyncPeriod := 10 * time.Millisecond rateLimiter := workqueue.DefaultControllerRateLimiter() t.Run("normal operation", func(t *testing.T) { From 4a90440d8ca22e26ee4e8b080ac0d823e6c78cfd Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Sat, 13 Apr 2024 10:49:00 -0400 Subject: [PATCH 430/645] update scroll behavior so that sidebar maintains location (#5229) * update scroll behavior so that sidebar maintains location Signed-off-by: cosmicBboy * update conda-lock Signed-off-by: cosmicBboy * restore conda-lock Signed-off-by: cosmicBboy * update js Signed-off-by: cosmicBboy * revert make target Signed-off-by: cosmicBboy --------- Signed-off-by: cosmicBboy --- docs/_static/custom.js | 56 ++++++++++++++++++++++++++++++++++++++++++ docs/_static/flyte.css | 1 + 2 files changed, 57 insertions(+) diff --git a/docs/_static/custom.js b/docs/_static/custom.js index 388fda4e22..be7fef0314 100644 --- a/docs/_static/custom.js +++ b/docs/_static/custom.js @@ -9,3 +9,59 @@ window.addEventListener("DOMContentLoaded", function() { link.setAttribute("target", "_blank"); }); }); + +// This function was adapted from pydata-sphinx-theme +// https://github.com/pydata/pydata-sphinx-theme/blob/733d9f3264020c8a5bd3dde38f3ee3e5cdb2979a/src/pydata_sphinx_theme/assets/scripts/pydata-sphinx-theme.js#L133-L175 +function scrollToActive() { + // If the docs nav doesn't exist, do nothing (e.g., on search page) + if (!document.querySelector(".sidebar-scroll")) { + return; + } + + var sidebar = document.querySelector("div.sidebar-scroll"); + + // Remember the sidebar scroll position between page loads + // Inspired on source of revealjs.com + let storedScrollTop = parseInt( + sessionStorage.getItem("sidebar-scroll-top"), + 10 + ); + + if (!isNaN(storedScrollTop)) { + // If we've got a saved scroll position, just use that + sidebar.scrollTop = storedScrollTop; + console.log("Scrolled sidebar using stored browser position..."); + } else { + // Otherwise, calculate a position to scroll to based on the lowest `active` link + var sidebarNav = document.querySelector(".sidebar-scroll"); + var active_pages = sidebarNav.querySelectorAll(".current-page"); + if (active_pages.length > 0) { + // Use the last active page as the offset since it's the page we're on + var latest_active = active_pages[active_pages.length - 1]; + var offset = + latest_active.getBoundingClientRect().y - + sidebar.getBoundingClientRect().y; + // Only scroll the navbar if the active link is lower than 50% of the page + if (latest_active.getBoundingClientRect().y > window.innerHeight * 0.5) { + let buffer = 0.25; // Buffer so we have some space above the scrolled item + sidebar.scrollTop = offset - sidebar.clientHeight * buffer; + console.log("Scrolled sidebar using last active link..."); + } + } + } + + setTimeout(function() { + // sidebar is hidden by default, so we need to make it visible + // after scrolling. This prevents the scrollbar from jittering when + // the page loads. + console.log("Sidebar is now visible...") + sidebar.style.visibility = "visible"; + }, 10); + + // Store the sidebar scroll position + window.addEventListener("beforeunload", () => { + sessionStorage.setItem("sidebar-scroll-top", sidebar.scrollTop); + }); + } + +document.addEventListener('DOMContentLoaded', scrollToActive); diff --git a/docs/_static/flyte.css b/docs/_static/flyte.css index 6071b8ab51..3a537e177c 100644 --- a/docs/_static/flyte.css +++ b/docs/_static/flyte.css @@ -10,6 +10,7 @@ h6 { .sidebar-scroll { scroll-behavior: auto; + visibility: hidden; } .sidebar-tree ul:first-child li:not(:last-child) { From 7287470096edf38273ce267b4a67cd82b2ada5ca Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Sun, 14 Apr 2024 13:58:18 -0400 Subject: [PATCH 431/645] propagate dark/light theme to algolia search bar (#5231) * propagate dark/light theme to algolia search bar Signed-off-by: cosmicBboy * make sure escape key closes algolia searchbar Signed-off-by: cosmicBboy * debug Signed-off-by: cosmicBboy * remove log Signed-off-by: cosmicBboy --------- Signed-off-by: cosmicBboy --- docs/_static/custom.js | 48 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/docs/_static/custom.js b/docs/_static/custom.js index be7fef0314..7b974aa3bb 100644 --- a/docs/_static/custom.js +++ b/docs/_static/custom.js @@ -62,6 +62,50 @@ function scrollToActive() { window.addEventListener("beforeunload", () => { sessionStorage.setItem("sidebar-scroll-top", sidebar.scrollTop); }); - } +} + + +function setHtmlDataTheme() { + // Set theme at the root html element + setTimeout(() => { + const theme = document.body.dataset.theme; + const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + + if (theme === "auto") { + document.documentElement.dataset.theme = prefersDark ? "dark" : "light"; + } else { + document.documentElement.dataset.theme = theme; + } + }, 10) +} + -document.addEventListener('DOMContentLoaded', scrollToActive); +function setupAlgoliaTheme() { + // To get darkmode in the algolia search modal, we need to set the theme in + // the root html element. This function propagates the theme set by furo + // that's set in the body element. + const buttons = document.getElementsByClassName("theme-toggle"); + + // set for initial document load + setHtmlDataTheme(); + + // listen for when theme button is clicked. + Array.from(buttons).forEach((btn) => { + btn.addEventListener("click", setHtmlDataTheme); + }); +} + + +function main() { + scrollToActive() + setupAlgoliaTheme() +} + +document.addEventListener('DOMContentLoaded', main); +window.addEventListener('keydown', (event) => { + if (event.code === "Escape") { + // make sure to prevent default behavior with escape key so that algolia + // modal can be closed properly. + event.preventDefault(); + } +}); From 2ba277ffb56b2db8cd52767263b71c8abbcc3350 Mon Sep 17 00:00:00 2001 From: Dan Rammer Date: Mon, 15 Apr 2024 11:39:09 -0500 Subject: [PATCH 432/645] Added additional port configuration for flyte services (#5233) * added additional port configuration for flyte services Signed-off-by: Daniel Rammer * removed unecessary extra end Signed-off-by: Daniel Rammer * fixed datacatalog indentation Signed-off-by: Daniel Rammer --------- Signed-off-by: Daniel Rammer --- charts/flyte-core/README.md | 9 ++++++--- charts/flyte-core/templates/admin/service.yaml | 3 +++ charts/flyte-core/templates/datacatalog/service.yaml | 3 +++ charts/flyte-core/templates/propeller/service.yaml | 3 +++ charts/flyte-core/values.yaml | 6 ++++++ 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/charts/flyte-core/README.md b/charts/flyte-core/README.md index 55d327a25f..eaf517bda3 100644 --- a/charts/flyte-core/README.md +++ b/charts/flyte-core/README.md @@ -139,7 +139,8 @@ helm install gateway bitnami/contour -n flyte | datacatalog.replicaCount | int | `1` | Replicas count for Datacatalog deployment | | datacatalog.resources | object | `{"limits":{"cpu":"500m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}}` | Default resources requests and limits for Datacatalog deployment | | datacatalog.securityContext | object | `{"fsGroup":1001,"fsGroupChangePolicy":"OnRootMismatch","runAsNonRoot":true,"runAsUser":1001,"seLinuxOptions":{"type":"spc_t"}}` | Sets securityContext for datacatalog pod(s). | -| datacatalog.service | object | `{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"NodePort"}` | Service settings for Datacatalog | +| datacatalog.service | object | `{"additionalPorts":[],"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"type":"NodePort"}` | Service settings for Datacatalog | +| datacatalog.service.additionalPorts | list | `[]` | Appends additional ports to the service spec. | | datacatalog.serviceAccount | object | `{"annotations":{},"create":true,"imagePullSecrets":[]}` | Configuration for service accounts for Datacatalog | | datacatalog.serviceAccount.annotations | object | `{}` | Annotations for ServiceAccount attached to Datacatalog pods | | datacatalog.serviceAccount.create | bool | `true` | Should a service account be created for Datacatalog | @@ -175,7 +176,8 @@ helm install gateway bitnami/contour -n flyte | flyteadmin.resources | object | `{"limits":{"cpu":"250m","ephemeral-storage":"100Mi","memory":"500Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"50Mi"}}` | Default resources requests and limits for Flyteadmin deployment | | flyteadmin.secrets | object | `{}` | | | flyteadmin.securityContext | object | `{"fsGroup":65534,"fsGroupChangePolicy":"Always","runAsNonRoot":true,"runAsUser":1001,"seLinuxOptions":{"type":"spc_t"}}` | Sets securityContext for flyteadmin pod(s). | -| flyteadmin.service | object | `{"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"loadBalancerSourceRanges":[],"type":"ClusterIP"}` | Service settings for Flyteadmin | +| flyteadmin.service | object | `{"additionalPorts":[],"annotations":{"projectcontour.io/upstream-protocol.h2c":"grpc"},"loadBalancerSourceRanges":[],"type":"ClusterIP"}` | Service settings for Flyteadmin | +| flyteadmin.service.additionalPorts | list | `[]` | Appends additional ports to the service spec. | | flyteadmin.serviceAccount | object | `{"alwaysCreate":false,"annotations":{},"clusterRole":{"apiGroups":["","flyte.lyft.com","rbac.authorization.k8s.io"],"resources":["configmaps","flyteworkflows","namespaces","pods","resourcequotas","roles","rolebindings","secrets","services","serviceaccounts","spark-role","limitranges"],"verbs":["*"]},"create":true,"createClusterRole":true,"imagePullSecrets":[]}` | Configuration for service accounts for FlyteAdmin | | flyteadmin.serviceAccount.alwaysCreate | bool | `false` | Should a service account always be created for flyteadmin even without an actual flyteadmin deployment running (e.g. for multi-cluster setups) | | flyteadmin.serviceAccount.annotations | object | `{}` | Annotations for ServiceAccount attached to Flyteadmin pods | @@ -236,7 +238,8 @@ helm install gateway bitnami/contour -n flyte | flytepropeller.replicaCount | int | `1` | Replicas count for Flytepropeller deployment | | flytepropeller.resources | object | `{"limits":{"cpu":"200m","ephemeral-storage":"100Mi","memory":"200Mi"},"requests":{"cpu":"10m","ephemeral-storage":"50Mi","memory":"100Mi"}}` | Default resources requests and limits for Flytepropeller deployment | | flytepropeller.securityContext | object | `{"fsGroup":65534,"fsGroupChangePolicy":"Always","runAsUser":1001}` | Sets securityContext for flytepropeller pod(s). | -| flytepropeller.service | object | `{"enabled":false}` | Settings for flytepropeller service | +| flytepropeller.service | object | `{"additionalPorts":[],"enabled":false}` | Settings for flytepropeller service | +| flytepropeller.service.additionalPorts | list | `[]` | Appends additional ports to the service spec. | | flytepropeller.service.enabled | bool | `false` | If enabled create the flytepropeller service | | flytepropeller.serviceAccount | object | `{"annotations":{},"create":true,"imagePullSecrets":[]}` | Configuration for service accounts for FlytePropeller | | flytepropeller.serviceAccount.annotations | object | `{}` | Annotations for ServiceAccount attached to FlytePropeller pods | diff --git a/charts/flyte-core/templates/admin/service.yaml b/charts/flyte-core/templates/admin/service.yaml index 577533e48b..b23cbc24a2 100644 --- a/charts/flyte-core/templates/admin/service.yaml +++ b/charts/flyte-core/templates/admin/service.yaml @@ -32,5 +32,8 @@ spec: - name: http-metrics protocol: TCP port: 10254 + {{- with .Values.flyteadmin.service.additionalPorts -}} + {{ tpl (toYaml .) $ | nindent 4 }} + {{- end }} selector: {{ include "flyteadmin.selectorLabels" . | nindent 4 }} {{- end }} diff --git a/charts/flyte-core/templates/datacatalog/service.yaml b/charts/flyte-core/templates/datacatalog/service.yaml index 494d7c2b38..95a1b1c29b 100644 --- a/charts/flyte-core/templates/datacatalog/service.yaml +++ b/charts/flyte-core/templates/datacatalog/service.yaml @@ -21,5 +21,8 @@ spec: port: 89 protocol: TCP targetPort: 8089 + {{- with .Values.datacatalog.service.additionalPorts -}} + {{ tpl (toYaml .) $ | nindent 2 }} + {{- end }} selector: {{ include "datacatalog.selectorLabels" . | nindent 4 }} {{- end }} diff --git a/charts/flyte-core/templates/propeller/service.yaml b/charts/flyte-core/templates/propeller/service.yaml index 7569f3e6fc..cb87a53e9a 100644 --- a/charts/flyte-core/templates/propeller/service.yaml +++ b/charts/flyte-core/templates/propeller/service.yaml @@ -11,5 +11,8 @@ spec: - name: http-metrics protocol: TCP port: 10254 + {{- with .Values.flytepropeller.service.additionalPorts -}} + {{ tpl (toYaml .) $ | nindent 4 }} + {{- end }} selector: {{ include "flytepropeller.selectorLabels" . | nindent 4 }} {{- end }} diff --git a/charts/flyte-core/values.yaml b/charts/flyte-core/values.yaml index f3580786a6..f216b71d5e 100755 --- a/charts/flyte-core/values.yaml +++ b/charts/flyte-core/values.yaml @@ -54,6 +54,8 @@ flyteadmin: projectcontour.io/upstream-protocol.h2c: grpc type: ClusterIP loadBalancerSourceRanges: [] + # -- Appends additional ports to the service spec. + additionalPorts: [] # -- Configuration for service accounts for FlyteAdmin serviceAccount: # -- Should a service account be created for flyteadmin @@ -228,6 +230,8 @@ datacatalog: annotations: projectcontour.io/upstream-protocol.h2c: grpc type: NodePort + # -- Appends additional ports to the service spec. + additionalPorts: [] # -- Configuration for service accounts for Datacatalog serviceAccount: # -- Should a service account be created for Datacatalog @@ -356,6 +360,8 @@ flytepropeller: service: # -- If enabled create the flytepropeller service enabled: false + # -- Appends additional ports to the service spec. + additionalPorts: [] # -- Settings for flytepropeller service monitor serviceMonitor: From 30b167573e0762b4392093557ff9d2708e65981a Mon Sep 17 00:00:00 2001 From: WenChih Lo Date: Tue, 16 Apr 2024 02:18:43 +0800 Subject: [PATCH 433/645] [BUG] fix(doc): Wrong configuration in spark plugin with binary chart (#5230) Signed-off-by: Ryan Lo --- docs/deployment/plugins/k8s/index.rst | 65 ++++++++++++++------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/docs/deployment/plugins/k8s/index.rst b/docs/deployment/plugins/k8s/index.rst index 9cc30b79d5..cf9a211f85 100644 --- a/docs/deployment/plugins/k8s/index.rst +++ b/docs/deployment/plugins/k8s/index.rst @@ -332,6 +332,23 @@ Specify plugin configuration - development: - defaultIamRole: value: + plugins: + spark: + # Edit the Spark configuration as you see fit + spark-config-default: + - spark.driver.cores: "1" + - spark.hadoop.fs.s3a.aws.credentials.provider: "com.amazonaws.auth.DefaultAWSCredentialsProviderChain" + - spark.kubernetes.allocation.batch.size: "50" + - spark.hadoop.fs.s3a.acl.default: "BucketOwnerFullControl" + - spark.hadoop.fs.s3n.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3n.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.hadoop.fs.s3.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.hadoop.fs.s3a.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" + - spark.hadoop.fs.AbstractFileSystem.s3a.impl: "org.apache.hadoop.fs.s3a.S3A" + - spark.network.timeout: 600s + - spark.executorEnv.KUBERNETES_REQUEST_TIMEOUT: 100000 + - spark.executor.heartbeatInterval: 60s clusterResourceTemplates: inline: #This section automates the creation of the project-domain namespaces @@ -406,23 +423,6 @@ Specify plugin configuration - kind: ServiceAccount name: spark namespace: "{{ namespace }}" - plugins: - spark: - # Edit the Spark configuration as you see fit - spark-config-default: - - spark.driver.cores: "1" - - spark.hadoop.fs.s3a.aws.credentials.provider: "com.amazonaws.auth.DefaultAWSCredentialsProviderChain" - - spark.kubernetes.allocation.batch.size: "50" - - spark.hadoop.fs.s3a.acl.default: "BucketOwnerFullControl" - - spark.hadoop.fs.s3n.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3n.impl: "org.apache.hadoop.fs.s3a.S3A" - - spark.hadoop.fs.s3.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3.impl: "org.apache.hadoop.fs.s3a.S3A" - - spark.hadoop.fs.s3a.impl: "org.apache.hadoop.fs.s3a.S3AFileSystem" - - spark.hadoop.fs.AbstractFileSystem.s3a.impl: "org.apache.hadoop.fs.s3a.S3A" - - spark.network.timeout: 600s - - spark.executorEnv.KUBERNETES_REQUEST_TIMEOUT: 100000 - - spark.executor.heartbeatInterval: 60s 2. (Optional) The Spark operator supports Kubernetes ResourceQuota enforcement. If you plan to use it, set `per-Task resource requests `__ that fit into the quota for each project-namespace. A Task without resource requests @@ -498,6 +498,21 @@ Specify plugin configuration - development: - gsa: value: + plugins: + spark: + # Edit the Spark configuration as you see fit + spark-config-default: + - spark.eventLog.enabled: "true" + - spark.eventLog.dir: "{{ .Values.userSettings.bucketName }}/spark-events" + - spark.driver.cores: "1" + - spark.executorEnv.HTTP2_DISABLE: "true" + - spark.hadoop.fs.AbstractFileSystem.gs.impl: com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS + - spark.kubernetes.allocation.batch.size: "50" + - spark.kubernetes.driverEnv.HTTP2_DISABLE: "true" + - spark.network.timeout: 600s + - spark.executorEnv.KUBERNETES_REQUEST_TIMEOUT: 100000 + - spark.executor.heartbeatInterval: 60s + clusterResourceTemplates: inline: #This section automates the creation of the project-domain namespaces @@ -572,21 +587,7 @@ Specify plugin configuration - kind: ServiceAccount name: spark namespace: "{{ namespace }}" - plugins: - spark: - # Edit the Spark configuration as you see fit - spark-config-default: - - spark.eventLog.enabled: "true" - - spark.eventLog.dir: "{{ .Values.userSettings.bucketName }}/spark-events" - - spark.driver.cores: "1" - - spark.executorEnv.HTTP2_DISABLE: "true" - - spark.hadoop.fs.AbstractFileSystem.gs.impl: com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS - - spark.kubernetes.allocation.batch.size: "50" - - spark.kubernetes.driverEnv.HTTP2_DISABLE: "true" - - spark.network.timeout: 600s - - spark.executorEnv.KUBERNETES_REQUEST_TIMEOUT: 100000 - - spark.executor.heartbeatInterval: 60s - + .. group-tab:: flyte-core .. tabs:: From ed236202a85626efa5bc58096fc68571b07bdc23 Mon Sep 17 00:00:00 2001 From: Jason Parraga Date: Mon, 15 Apr 2024 13:12:57 -0700 Subject: [PATCH 434/645] Fix grammatical error in workflow lifecycle docs (#5227) Signed-off-by: Jason Parraga --- docs/concepts/workflow_lifecycle.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/concepts/workflow_lifecycle.rst b/docs/concepts/workflow_lifecycle.rst index efb11e52d8..f549493e83 100644 --- a/docs/concepts/workflow_lifecycle.rst +++ b/docs/concepts/workflow_lifecycle.rst @@ -172,7 +172,7 @@ settings are needed for the cluster. For more information on why this task contains these fields check ``TaskTemplate`` in `FlyteIDL repository `__. -I strongly advice you to take a look at the data structures in this file +I strongly advise you to take a look at the data structures in this file as they provide good insight in the interfaces used all across Flyte’s codebases. From 3004af407ccbb7cf49bea18d82a1d29cbae98c61 Mon Sep 17 00:00:00 2001 From: novahow <58504997+novahow@users.noreply.github.com> Date: Tue, 16 Apr 2024 04:16:32 +0800 Subject: [PATCH 435/645] add plugins support for k8s imagepullpolicy (#5167) Signed-off-by: novahow --- .../go/tasks/pluginmachinery/flytek8s/config/config.go | 3 +++ .../go/tasks/pluginmachinery/flytek8s/container_helper.go | 1 + 2 files changed, 4 insertions(+) diff --git a/flyteplugins/go/tasks/pluginmachinery/flytek8s/config/config.go b/flyteplugins/go/tasks/pluginmachinery/flytek8s/config/config.go index 404924ef07..109ef06ba1 100644 --- a/flyteplugins/go/tasks/pluginmachinery/flytek8s/config/config.go +++ b/flyteplugins/go/tasks/pluginmachinery/flytek8s/config/config.go @@ -156,6 +156,9 @@ type K8sPluginConfig struct { // one, and the corresponding task marked as failed ImagePullBackoffGracePeriod config2.Duration `json:"image-pull-backoff-grace-period" pflag:"-,Time to wait for transient ImagePullBackoff errors to be resolved."` + // ImagePullPolicy for the submitted pod. + ImagePullPolicy v1.PullPolicy `json:"image-pull-policy" pflag:"-,Image pull policy for all k8s pods created by FlytePropeller."` + // Time to wait while pod is in pending phase. If the pod is stuck in // pending phase past this timeout, it will be inferred to be a permanent // issue, and the corresponding task marked as failed diff --git a/flyteplugins/go/tasks/pluginmachinery/flytek8s/container_helper.go b/flyteplugins/go/tasks/pluginmachinery/flytek8s/container_helper.go index 268819473a..d0cbe62b07 100644 --- a/flyteplugins/go/tasks/pluginmachinery/flytek8s/container_helper.go +++ b/flyteplugins/go/tasks/pluginmachinery/flytek8s/container_helper.go @@ -226,6 +226,7 @@ func BuildRawContainer(ctx context.Context, tCtx pluginscore.TaskExecutionContex Env: ToK8sEnvVar(taskContainer.GetEnv()), TerminationMessagePolicy: v1.TerminationMessageFallbackToLogsOnError, Resources: *res, + ImagePullPolicy: config.GetK8sPluginConfig().ImagePullPolicy, } return container, nil From d0ed6c47e62736cdaa95795e8384b7841c4c11b0 Mon Sep 17 00:00:00 2001 From: pryce-turner <31577879+pryce-turner@users.noreply.github.com> Date: Mon, 15 Apr 2024 13:59:14 -0700 Subject: [PATCH 436/645] Added section on overriding lp config in loop (#5223) * Added section on overriding lp config in loop Signed-off-by: pryce-turner * Update docs/user_guide/advanced_composition/nested_parallelization.md Co-authored-by: Nikki Everett Signed-off-by: pryce-turner <31577879+pryce-turner@users.noreply.github.com> --------- Signed-off-by: pryce-turner Signed-off-by: pryce-turner <31577879+pryce-turner@users.noreply.github.com> Co-authored-by: Nikki Everett --- .../nested_parallelization.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/user_guide/advanced_composition/nested_parallelization.md b/docs/user_guide/advanced_composition/nested_parallelization.md index 73fd921b2e..bc49c70462 100644 --- a/docs/user_guide/advanced_composition/nested_parallelization.md +++ b/docs/user_guide/advanced_composition/nested_parallelization.md @@ -82,6 +82,27 @@ def multi_wf(l: typing.List[int], chunk: int) -> typing.List[int]: return level1(l=l, chunk=chunk) ``` +Overrides let you add additional arguments to the launch plan you are looping over in the dynamic. Here we add caching: + +```python +@task +def increment(num: int) -> int: + return num + 1 + +@workflow +def child(num: int) -> int: + return increment(num=num) + +child_lp = LaunchPlan.get_or_create(child) + +@dynamic +def spawn(n: int) -> List[int]: + l = [] + for i in [1,2,3,4,5]: + l.append(child_lp(num=i).with_overrides(cache=True, cache_version="1.0.0")) + # you can also pass l to another task if you want + return l +``` ### Flyte console From 1757750e580a0ff03fec877ba792a69825a3b720 Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:53:33 -0400 Subject: [PATCH 437/645] Added unmarshal attribute for expires_in for device flow auth token (#4319) Signed-off-by: Eduardo Apolinario --- flyteidl/clients/go/admin/deviceflow/payload.go | 3 ++- flyteidl/clients/go/admin/deviceflow/token_orchestrator.go | 6 ++++-- .../clients/go/admin/deviceflow/token_orchestrator_test.go | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/flyteidl/clients/go/admin/deviceflow/payload.go b/flyteidl/clients/go/admin/deviceflow/payload.go index 656e1a88d8..38e8b5502f 100644 --- a/flyteidl/clients/go/admin/deviceflow/payload.go +++ b/flyteidl/clients/go/admin/deviceflow/payload.go @@ -40,5 +40,6 @@ type DeviceAccessTokenRequest struct { type DeviceAccessTokenResponse struct { oauth2.Token - Error string `json:"error"` + Error string `json:"error"` + ExpiresIn int64 `json:"expires_in"` // relative seconds from now } diff --git a/flyteidl/clients/go/admin/deviceflow/token_orchestrator.go b/flyteidl/clients/go/admin/deviceflow/token_orchestrator.go index fc4f1d3786..e934ec6949 100644 --- a/flyteidl/clients/go/admin/deviceflow/token_orchestrator.go +++ b/flyteidl/clients/go/admin/deviceflow/token_orchestrator.go @@ -125,12 +125,14 @@ func (t TokenOrchestrator) PollTokenEndpoint(ctx context.Context, tokReq DeviceA // Unmarshalled response if it contains an error then check if we need to increase the polling interval if len(tokResp.Error) > 0 { if tokResp.Error == errSlowDown || tokResp.Error == errAuthPending { - pollInterval = pollInterval * 2 - + logger.Debugf(ctx, "going to poll again due to error %v", tokResp.Error) } else { return nil, fmt.Errorf("oauth error : %v", tokResp.Error) } } else { + if secs := tokResp.ExpiresIn; secs > 0 { + tokResp.Token.Expiry = time.Now().Add(time.Duration(secs) * time.Second) + } // Got the auth token in the response and save it in the cache err = t.TokenCache.SaveToken(&tokResp.Token) // Saving into the cache is only considered to be a warning in this case. diff --git a/flyteidl/clients/go/admin/deviceflow/token_orchestrator_test.go b/flyteidl/clients/go/admin/deviceflow/token_orchestrator_test.go index d5a22c523a..5c1dc5f2bd 100644 --- a/flyteidl/clients/go/admin/deviceflow/token_orchestrator_test.go +++ b/flyteidl/clients/go/admin/deviceflow/token_orchestrator_test.go @@ -85,6 +85,7 @@ func TestFetchFromAuthFlow(t *testing.T) { Token: oauth2.Token{ AccessToken: "access_token", }, + ExpiresIn: 300, } darBytes, err := json.Marshal(dar) assert.Nil(t, err) @@ -119,5 +120,6 @@ func TestFetchFromAuthFlow(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, authToken) assert.Equal(t, "access_token", authToken.AccessToken) + assert.True(t, authToken.Expiry.After(time.Now().Add(time.Second*200))) }) } From c899586448f842ae361b91ccb610d3d2c612546c Mon Sep 17 00:00:00 2001 From: "Thomas J. Fan" Date: Wed, 17 Apr 2024 11:45:16 -0700 Subject: [PATCH 438/645] Update template to link issue for closing (#5239) * Update template to link issue for closing * Use simplier syntax for reference issue Signed-off-by: Thomas J. Fan --------- Signed-off-by: Thomas J. Fan --- .github/PULL_REQUEST_TEMPLATE.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 166568ed6d..3956f99afb 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,11 +1,13 @@ ## Tracking issue -_https://github.com/flyteorg/flyte/issues/_ - - + +If your PR is related to an issue or PR, use `Related to #999` to link your PR. +Example: Related to #999 - +Remove this section if not applicable +--> ## Why are the changes needed? From 0095165f6e910ba911eb157a31e5c6233d5ec2db Mon Sep 17 00:00:00 2001 From: Paul Dittamo <37558497+pvditt@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:53:46 -0700 Subject: [PATCH 439/645] [Feature] add retries and backoffs for propeller sending events to admin (#5166) * add retries and backoffs for propeller sending events to admin Signed-off-by: Paul Dittamo * update docs Signed-off-by: Paul Dittamo * update retry types Signed-off-by: Paul Dittamo * support expontential backoffs w/ jitter for catalog connection Signed-off-by: Paul Dittamo --------- Signed-off-by: Paul Dittamo --- .../generated/flytepropeller_config.rst | 72 +++++++++++++++++++ flytepropeller/events/admin_eventsink.go | 16 ++++- flytepropeller/events/config.go | 41 ++++++++--- flytepropeller/events/config_flags.go | 3 + flytepropeller/events/config_flags_test.go | 42 +++++++++++ .../pkg/controller/nodes/catalog/config.go | 44 +++++++++--- .../controller/nodes/catalog/config_flags.go | 3 + .../nodes/catalog/config_flags_test.go | 42 +++++++++++ .../nodes/catalog/datacatalog/datacatalog.go | 7 +- 9 files changed, 247 insertions(+), 23 deletions(-) diff --git a/docs/deployment/configuration/generated/flytepropeller_config.rst b/docs/deployment/configuration/generated/flytepropeller_config.rst index b8fbe49f4e..c0a6e90fb9 100644 --- a/docs/deployment/configuration/generated/flytepropeller_config.rst +++ b/docs/deployment/configuration/generated/flytepropeller_config.rst @@ -608,6 +608,42 @@ Use the same gRPC credentials option as the flyteadmin client "false" +max-retries (int) +------------------------------------------------------------------------------------------------------------------------ + +The max number of retries for event recording. + +**Default Value**: + +.. code-block:: yaml + + "5" + + +base-scalar (int) +------------------------------------------------------------------------------------------------------------------------ + +The base/scalar backoff duration in milliseconds for event recording retries. + +**Default Value**: + +.. code-block:: yaml + + "100" + + +backoff-jitter (string) +------------------------------------------------------------------------------------------------------------------------ + +A string representation of a floating point number between 0 and 1 specifying the jitter factor for event recording retries. + +**Default Value**: + +.. code-block:: yaml + + "0.1" + + default-service-config (string) ------------------------------------------------------------------------------------------------------------------------ @@ -671,6 +707,42 @@ The max bucket size for event recording tokens. "1000" +max-retries (int) +------------------------------------------------------------------------------------------------------------------------ + +The max number of retries for event recording. + +**Default Value**: + +.. code-block:: yaml + + "5" + + +base-scalar (int) +------------------------------------------------------------------------------------------------------------------------ + +The base/scalar backoff duration in milliseconds for event recording retries. + +**Default Value**: + +.. code-block:: yaml + + "100" + + +backoff-jitter (string) +------------------------------------------------------------------------------------------------------------------------ + +A string representation of a floating point number between 0 and 1 specifying the jitter factor for event recording retries. + +**Default Value**: + +.. code-block:: yaml + + "0.1" + + Section: logger ======================================================================================================================== diff --git a/flytepropeller/events/admin_eventsink.go b/flytepropeller/events/admin_eventsink.go index df75348b34..cb4b88a69a 100644 --- a/flytepropeller/events/admin_eventsink.go +++ b/flytepropeller/events/admin_eventsink.go @@ -3,8 +3,10 @@ package events import ( "context" "fmt" + "time" "github.com/golang/protobuf/proto" + grpcRetry "github.com/grpc-ecosystem/go-grpc-middleware/retry" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "go.opentelemetry.io/otel/propagation" "golang.org/x/time/rate" @@ -128,15 +130,23 @@ func IDFromMessage(message proto.Message) ([]byte, error) { return []byte(id), nil } -func initializeAdminClientFromConfig(ctx context.Context) (client service.AdminServiceClient, err error) { +func initializeAdminClientFromConfig(ctx context.Context, config *Config) (client service.AdminServiceClient, err error) { cfg := admin2.GetConfig(ctx) tracerProvider := otelutils.GetTracerProvider(otelutils.AdminClientTracer) - opt := grpc.WithUnaryInterceptor( + + grpcOptions := []grpcRetry.CallOption{ + grpcRetry.WithBackoff(grpcRetry.BackoffExponentialWithJitter(time.Duration(config.BackoffScalar)*time.Millisecond, config.GetBackoffJitter(ctx))), + grpcRetry.WithMax(uint(config.MaxRetries)), + } + + opt := grpc.WithChainUnaryInterceptor( otelgrpc.UnaryClientInterceptor( otelgrpc.WithTracerProvider(tracerProvider), otelgrpc.WithPropagators(propagation.TraceContext{}), ), + grpcRetry.UnaryClientInterceptor(grpcOptions...), ) + clients, err := admin2.NewClientsetBuilder().WithDialOptions(opt).WithConfig(cfg).Build(ctx) if err != nil { return nil, fmt.Errorf("failed to initialize clientset. Error: %w", err) @@ -152,7 +162,7 @@ func ConstructEventSink(ctx context.Context, config *Config, scope promutils.Sco case EventSinkFile: return NewFileSink(config.FilePath) case EventSinkAdmin: - adminClient, err := initializeAdminClientFromConfig(ctx) + adminClient, err := initializeAdminClientFromConfig(ctx, config) if err != nil { return nil, err } diff --git a/flytepropeller/events/config.go b/flytepropeller/events/config.go index 895ae009b3..0e6d5a377c 100644 --- a/flytepropeller/events/config.go +++ b/flytepropeller/events/config.go @@ -2,6 +2,7 @@ package events import ( "context" + "strconv" "github.com/flyteorg/flyte/flytestdlib/config" "github.com/flyteorg/flyte/flytestdlib/logger" @@ -21,22 +22,46 @@ const ( ) type Config struct { - Type EventReportingType `json:"type" pflag:",Sets the type of EventSink to configure [log/admin/file]."` - FilePath string `json:"file-path" pflag:",For file types, specify where the file should be located."` - Rate int64 `json:"rate" pflag:",Max rate at which events can be recorded per second."` - Capacity int `json:"capacity" pflag:",The max bucket size for event recording tokens."` + Type EventReportingType `json:"type" pflag:",Sets the type of EventSink to configure [log/admin/file]."` + FilePath string `json:"file-path" pflag:",For file types, specify where the file should be located."` + Rate int64 `json:"rate" pflag:",Max rate at which events can be recorded per second."` + Capacity int `json:"capacity" pflag:",The max bucket size for event recording tokens."` + MaxRetries int `json:"max-retries" pflag:",The max number of retries for event recording."` + BackoffScalar int `json:"base-scalar" pflag:",The base/scalar backoff duration in milliseconds for event recording retries."` + BackoffJitter string `json:"backoff-jitter" pflag:",A string representation of a floating point number between 0 and 1 specifying the jitter factor for event recording retries."` } var ( defaultConfig = Config{ - Rate: int64(500), - Capacity: 1000, - Type: EventSinkAdmin, + Rate: int64(500), + Capacity: 1000, + Type: EventSinkAdmin, + MaxRetries: 5, + BackoffScalar: 100, + BackoffJitter: "0.1", } - configSection = config.MustRegisterSection(configSectionKey, &defaultConfig) + configSection = config.MustRegisterSectionWithUpdates(configSectionKey, &defaultConfig, func(ctx context.Context, newValue config.Config) { + if newValue.(*Config).MaxRetries < 0 { + logger.Panicf(ctx, "Admin configuration given with negative gRPC retry value.") + } + + if jitter, err := strconv.ParseFloat(newValue.(*Config).BackoffJitter, 64); err != nil || jitter < 0 || jitter > 1 { + logger.Panicf(ctx, "Invalid jitter value [%v]. Must be between 0 and 1.", jitter) + } + }) ) +func (c Config) GetBackoffJitter(ctx context.Context) float64 { + jitter, err := strconv.ParseFloat(c.BackoffJitter, 64) + if err != nil { + logger.Warnf(ctx, "Failed to parse backoff jitter [%v]. Error: %v", c.BackoffJitter, err) + return 0.1 + } + + return jitter +} + // GetConfig Retrieves current global config for storage. func GetConfig(ctx context.Context) *Config { if c, ok := configSection.GetConfig().(*Config); ok { diff --git a/flytepropeller/events/config_flags.go b/flytepropeller/events/config_flags.go index 36e047e0aa..5d18653b45 100755 --- a/flytepropeller/events/config_flags.go +++ b/flytepropeller/events/config_flags.go @@ -54,5 +54,8 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.String(fmt.Sprintf("%v%v", prefix, "file-path"), defaultConfig.FilePath, "For file types, specify where the file should be located.") cmdFlags.Int64(fmt.Sprintf("%v%v", prefix, "rate"), defaultConfig.Rate, "Max rate at which events can be recorded per second.") cmdFlags.Int(fmt.Sprintf("%v%v", prefix, "capacity"), defaultConfig.Capacity, "The max bucket size for event recording tokens.") + cmdFlags.Int(fmt.Sprintf("%v%v", prefix, "max-retries"), defaultConfig.MaxRetries, "The max number of retries for event recording.") + cmdFlags.Int(fmt.Sprintf("%v%v", prefix, "base-scalar"), defaultConfig.BackoffScalar, "The base/scalar backoff duration in milliseconds for event recording retries.") + cmdFlags.String(fmt.Sprintf("%v%v", prefix, "backoff-jitter"), defaultConfig.BackoffJitter, "A string representation of a floating point number between 0 and 1 specifying the jitter factor for event recording retries.") return cmdFlags } diff --git a/flytepropeller/events/config_flags_test.go b/flytepropeller/events/config_flags_test.go index e054350031..d55e39cbfd 100755 --- a/flytepropeller/events/config_flags_test.go +++ b/flytepropeller/events/config_flags_test.go @@ -155,4 +155,46 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_max-retries", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("max-retries", testValue) + if vInt, err := cmdFlags.GetInt("max-retries"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt), &actual.MaxRetries) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_base-scalar", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("base-scalar", testValue) + if vInt, err := cmdFlags.GetInt("base-scalar"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt), &actual.BackoffScalar) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_backoff-jitter", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("backoff-jitter", testValue) + if vString, err := cmdFlags.GetString("backoff-jitter"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.BackoffJitter) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) } diff --git a/flytepropeller/pkg/controller/nodes/catalog/config.go b/flytepropeller/pkg/controller/nodes/catalog/config.go index 2b0c484fb7..4dd7bc70ae 100644 --- a/flytepropeller/pkg/controller/nodes/catalog/config.go +++ b/flytepropeller/pkg/controller/nodes/catalog/config.go @@ -3,12 +3,14 @@ package catalog import ( "context" "fmt" + "strconv" "google.golang.org/grpc" "github.com/flyteorg/flyte/flyteplugins/go/tasks/pluginmachinery/catalog" "github.com/flyteorg/flyte/flytepropeller/pkg/controller/nodes/catalog/datacatalog" "github.com/flyteorg/flyte/flytestdlib/config" + "github.com/flyteorg/flyte/flytestdlib/logger" ) //go:generate pflags Config --default-var defaultConfig @@ -16,11 +18,22 @@ import ( const ConfigSectionKey = "catalog-cache" var ( - defaultConfig = &Config{ - Type: NoOpDiscoveryType, + defaultConfig = Config{ + Type: NoOpDiscoveryType, + MaxRetries: 5, + BackoffScalar: 100, + BackoffJitter: "0.1", } - configSection = config.MustRegisterSection(ConfigSectionKey, defaultConfig) + configSection = config.MustRegisterSectionWithUpdates(ConfigSectionKey, &defaultConfig, func(ctx context.Context, newValue config.Config) { + if newValue.(*Config).MaxRetries < 0 { + logger.Panicf(ctx, "Admin configuration given with negative gRPC retry value.") + } + + if jitter, err := strconv.ParseFloat(newValue.(*Config).BackoffJitter, 64); err != nil || jitter < 0 || jitter > 1 { + logger.Panicf(ctx, "Invalid jitter value [%v]. Must be between 0 and 1.", jitter) + } + }) ) type DiscoveryType = string @@ -31,11 +44,14 @@ const ( ) type Config struct { - Type DiscoveryType `json:"type" pflag:"\"noop\", Catalog Implementation to use"` - Endpoint string `json:"endpoint" pflag:"\"\", Endpoint for catalog service"` - Insecure bool `json:"insecure" pflag:"false, Use insecure grpc connection"` - MaxCacheAge config.Duration `json:"max-cache-age" pflag:", Cache entries past this age will incur cache miss. 0 means cache never expires"` - UseAdminAuth bool `json:"use-admin-auth" pflag:"false, Use the same gRPC credentials option as the flyteadmin client"` + Type DiscoveryType `json:"type" pflag:"\"noop\", Catalog Implementation to use"` + Endpoint string `json:"endpoint" pflag:"\"\", Endpoint for catalog service"` + Insecure bool `json:"insecure" pflag:"false, Use insecure grpc connection"` + MaxCacheAge config.Duration `json:"max-cache-age" pflag:", Cache entries past this age will incur cache miss. 0 means cache never expires"` + UseAdminAuth bool `json:"use-admin-auth" pflag:"false, Use the same gRPC credentials option as the flyteadmin client"` + MaxRetries int `json:"max-retries" pflag:",The max number of retries for event recording."` + BackoffScalar int `json:"base-scalar" pflag:",The base/scalar backoff duration in milliseconds for event recording retries."` + BackoffJitter string `json:"backoff-jitter" pflag:",A string representation of a floating point number between 0 and 1 specifying the jitter factor for event recording retries."` // Set the gRPC service config formatted as a json string https://github.com/grpc/grpc/blob/master/doc/service_config.md // eg. {"loadBalancingConfig": [{"round_robin":{}}], "methodConfig": [{"name":[{"service": "foo", "method": "bar"}, {"service": "baz"}], "timeout": "1.000000001s"}]} @@ -44,6 +60,16 @@ type Config struct { DefaultServiceConfig string `json:"default-service-config" pflag:"\"\", Set the default service config for the catalog gRPC client"` } +func (c Config) GetBackoffJitter(ctx context.Context) float64 { + jitter, err := strconv.ParseFloat(c.BackoffJitter, 64) + if err != nil { + logger.Warnf(ctx, "Failed to parse backoff jitter [%v]. Error: %v", c.BackoffJitter, err) + return 0.1 + } + + return jitter +} + // GetConfig gets loaded config for Discovery func GetConfig() *Config { return configSection.GetConfig().(*Config) @@ -56,7 +82,7 @@ func NewCatalogClient(ctx context.Context, authOpt ...grpc.DialOption) (catalog. case DataCatalogType: return datacatalog.NewDataCatalog(ctx, catalogConfig.Endpoint, catalogConfig.Insecure, catalogConfig.MaxCacheAge.Duration, catalogConfig.UseAdminAuth, catalogConfig.DefaultServiceConfig, - authOpt...) + uint(catalogConfig.MaxRetries), catalogConfig.BackoffScalar, catalogConfig.GetBackoffJitter(ctx), authOpt...) case NoOpDiscoveryType, "": return NOOPCatalog{}, nil } diff --git a/flytepropeller/pkg/controller/nodes/catalog/config_flags.go b/flytepropeller/pkg/controller/nodes/catalog/config_flags.go index 4bd40b20b4..1f9a748b2d 100755 --- a/flytepropeller/pkg/controller/nodes/catalog/config_flags.go +++ b/flytepropeller/pkg/controller/nodes/catalog/config_flags.go @@ -55,6 +55,9 @@ func (cfg Config) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.Bool(fmt.Sprintf("%v%v", prefix, "insecure"), defaultConfig.Insecure, " Use insecure grpc connection") cmdFlags.String(fmt.Sprintf("%v%v", prefix, "max-cache-age"), defaultConfig.MaxCacheAge.String(), " Cache entries past this age will incur cache miss. 0 means cache never expires") cmdFlags.Bool(fmt.Sprintf("%v%v", prefix, "use-admin-auth"), defaultConfig.UseAdminAuth, " Use the same gRPC credentials option as the flyteadmin client") + cmdFlags.Int(fmt.Sprintf("%v%v", prefix, "max-retries"), defaultConfig.MaxRetries, "The max number of retries for event recording.") + cmdFlags.Int(fmt.Sprintf("%v%v", prefix, "base-scalar"), defaultConfig.BackoffScalar, "The base/scalar backoff duration in milliseconds for event recording retries.") + cmdFlags.String(fmt.Sprintf("%v%v", prefix, "backoff-jitter"), defaultConfig.BackoffJitter, "A string representation of a floating point number between 0 and 1 specifying the jitter factor for event recording retries.") cmdFlags.String(fmt.Sprintf("%v%v", prefix, "default-service-config"), defaultConfig.DefaultServiceConfig, " Set the default service config for the catalog gRPC client") return cmdFlags } diff --git a/flytepropeller/pkg/controller/nodes/catalog/config_flags_test.go b/flytepropeller/pkg/controller/nodes/catalog/config_flags_test.go index 3b18a9282d..2e7537e981 100755 --- a/flytepropeller/pkg/controller/nodes/catalog/config_flags_test.go +++ b/flytepropeller/pkg/controller/nodes/catalog/config_flags_test.go @@ -169,6 +169,48 @@ func TestConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_max-retries", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("max-retries", testValue) + if vInt, err := cmdFlags.GetInt("max-retries"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt), &actual.MaxRetries) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_base-scalar", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("base-scalar", testValue) + if vInt, err := cmdFlags.GetInt("base-scalar"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vInt), &actual.BackoffScalar) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) + t.Run("Test_backoff-jitter", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("backoff-jitter", testValue) + if vString, err := cmdFlags.GetString("backoff-jitter"); err == nil { + testDecodeJson_Config(t, fmt.Sprintf("%v", vString), &actual.BackoffJitter) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_default-service-config", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/flytepropeller/pkg/controller/nodes/catalog/datacatalog/datacatalog.go b/flytepropeller/pkg/controller/nodes/catalog/datacatalog/datacatalog.go index 6a029255a8..a04623f88a 100644 --- a/flytepropeller/pkg/controller/nodes/catalog/datacatalog/datacatalog.go +++ b/flytepropeller/pkg/controller/nodes/catalog/datacatalog/datacatalog.go @@ -452,16 +452,17 @@ func (m *CatalogClient) ReleaseReservation(ctx context.Context, key catalog.Key, } // NewDataCatalog creates a new Datacatalog client for task execution caching -func NewDataCatalog(ctx context.Context, endpoint string, insecureConnection bool, maxCacheAge time.Duration, useAdminAuth bool, defaultServiceConfig string, authOpt ...grpc.DialOption) (*CatalogClient, error) { +func NewDataCatalog(ctx context.Context, endpoint string, insecureConnection bool, maxCacheAge time.Duration, + useAdminAuth bool, defaultServiceConfig string, maxRetries uint, backoffScalar int, backoffJitter float64, authOpt ...grpc.DialOption) (*CatalogClient, error) { var opts []grpc.DialOption if useAdminAuth && authOpt != nil { opts = append(opts, authOpt...) } grpcOptions := []grpcRetry.CallOption{ - grpcRetry.WithBackoff(grpcRetry.BackoffLinear(100 * time.Millisecond)), + grpcRetry.WithBackoff(grpcRetry.BackoffExponentialWithJitter(time.Duration(backoffScalar)*time.Millisecond, backoffJitter)), grpcRetry.WithCodes(codes.DeadlineExceeded, codes.Unavailable, codes.Canceled), - grpcRetry.WithMax(5), + grpcRetry.WithMax(maxRetries), } if insecureConnection { From 35797ecf2f7abc65832074722c6371ceb7496d0c Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Date: Thu, 18 Apr 2024 17:11:41 -0700 Subject: [PATCH 440/645] Explain how to enable/disable local caching (#5242) * Explain how to enable/disable local caching Signed-off-by: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> * Update docs/user_guide/development_lifecycle/caching.md Co-authored-by: David Espejo <82604841+davidmirror-ops@users.noreply.github.com> Signed-off-by: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> --------- Signed-off-by: Eduardo Apolinario <653394+eapolinario@users.noreply.github.com> Co-authored-by: David Espejo <82604841+davidmirror-ops@users.noreply.github.com> --- docs/user_guide/development_lifecycle/caching.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/user_guide/development_lifecycle/caching.md b/docs/user_guide/development_lifecycle/caching.md index b0cc202cd9..64f772054c 100644 --- a/docs/user_guide/development_lifecycle/caching.md +++ b/docs/user_guide/development_lifecycle/caching.md @@ -126,6 +126,7 @@ Task executions can be cached across different versions of the task because a ch The flytekit package uses the [diskcache](https://github.com/grantjenks/python-diskcache) package, specifically [diskcache.Cache](http://www.grantjenks.com/docs/diskcache/tutorial.html#cache), to aid in the memoization of task executions. The results of local task executions are stored under `~/.flyte/local-cache/` and cache keys are composed of **Cache Version**, **Task Signature**, and **Task Input Values**. Similar to the remote case, a local cache entry for a task will be invalidated if either the `cache_version` or the task signature is modified. In addition, the local cache can also be emptied by running the following command: `pyflyte local-cache clear`, which essentially obliterates the contents of the `~/.flyte/local-cache/` directory. +To disable the local cache, you can set the `local.cache_enabled` config option (e.g. by setting the environment variable `FLYTE_LOCAL_CACHE_ENABLED=False`). :::{note} The format used by the store is opaque and not meant to be inspectable. From 2ca31119d6b9258661a71f38e450f93b6692402c Mon Sep 17 00:00:00 2001 From: Paul Dittamo <37558497+pvditt@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:39:26 -0700 Subject: [PATCH 441/645] [House keeping] remove setting max size bytes in node context (#5092) * remove setting max size bytes in node context Signed-off-by: Paul Dittamo * add note for clarity Signed-off-by: Paul Dittamo --------- Signed-off-by: Paul Dittamo --- .../pluginmachinery/core/exec_context.go | 5 +- .../core/mocks/task_execution_context.go | 32 ------------ .../ioutils/remote_file_output_reader.go | 8 ++- .../k8s/mocks/plugin_context.go | 32 ------------ .../go/tasks/pluginmachinery/k8s/plugin.go | 3 -- .../webapi/mocks/status_context.go | 32 ------------ .../webapi/mocks/task_execution_context.go | 32 ------------ .../go/tasks/pluginmachinery/webapi/plugin.go | 3 -- .../go/tasks/plugins/array/outputs.go | 2 +- .../go/tasks/plugins/array/outputs_test.go | 2 - flyteplugins/go/tasks/plugins/testing/echo.go | 2 +- .../go/tasks/plugins/webapi/agent/plugin.go | 2 +- .../tasks/plugins/webapi/databricks/plugin.go | 2 +- flyteplugins/tests/end_to_end.go | 1 - flytepropeller/pkg/controller/controller.go | 2 +- .../pkg/controller/nodes/array/handler.go | 2 +- .../controller/nodes/array/handler_test.go | 3 +- .../controller/nodes/branch/handler_test.go | 1 - flytepropeller/pkg/controller/nodes/cache.go | 2 +- .../nodes/dynamic/dynamic_workflow_test.go | 1 - .../pkg/controller/nodes/dynamic/handler.go | 2 +- .../controller/nodes/dynamic/handler_test.go | 4 -- .../pkg/controller/nodes/executor.go | 4 +- .../pkg/controller/nodes/executor_test.go | 35 ++++++------- .../mocks/node_execution_context.go | 32 ------------ .../nodes/interfaces/node_exec_context.go | 3 +- .../pkg/controller/nodes/node_exec_context.go | 49 ++++++++----------- .../nodes/node_exec_context_test.go | 5 +- .../nodes/subworkflow/handler_test.go | 1 - .../pkg/controller/nodes/task/handler_test.go | 4 -- .../nodes/task/k8s/plugin_manager.go | 2 +- .../nodes/task/k8s/plugin_manager_test.go | 1 - .../nodes/task/taskexec_context_test.go | 2 - .../pkg/controller/workflow/executor_test.go | 15 +++--- 34 files changed, 67 insertions(+), 261 deletions(-) diff --git a/flyteplugins/go/tasks/pluginmachinery/core/exec_context.go b/flyteplugins/go/tasks/pluginmachinery/core/exec_context.go index 11f48a33b2..a2f20bcee5 100644 --- a/flyteplugins/go/tasks/pluginmachinery/core/exec_context.go +++ b/flyteplugins/go/tasks/pluginmachinery/core/exec_context.go @@ -9,6 +9,8 @@ import ( "github.com/flyteorg/flyte/flytestdlib/storage" ) +//go:generate mockery -all -case=underscore + // An interface to access a remote/sharable location that contains the serialized TaskTemplate type TaskTemplatePath interface { // Returns the path @@ -34,9 +36,6 @@ type TaskExecutionContext interface { // Returns a method that allows a plugin to indicate that the task has a new update and can be invoked again to check for updates TaskRefreshIndicator() SignalAsync - // Returns the max allowed dataset size that the outputwriter will accept - MaxDatasetSizeBytes() int64 - // Returns a handle to the currently configured storage backend that can be used to communicate with the tasks or write metadata DataStore() *storage.DataStore diff --git a/flyteplugins/go/tasks/pluginmachinery/core/mocks/task_execution_context.go b/flyteplugins/go/tasks/pluginmachinery/core/mocks/task_execution_context.go index ec4b5e346f..8ae8601b1e 100644 --- a/flyteplugins/go/tasks/pluginmachinery/core/mocks/task_execution_context.go +++ b/flyteplugins/go/tasks/pluginmachinery/core/mocks/task_execution_context.go @@ -154,38 +154,6 @@ func (_m *TaskExecutionContext) InputReader() io.InputReader { return r0 } -type TaskExecutionContext_MaxDatasetSizeBytes struct { - *mock.Call -} - -func (_m TaskExecutionContext_MaxDatasetSizeBytes) Return(_a0 int64) *TaskExecutionContext_MaxDatasetSizeBytes { - return &TaskExecutionContext_MaxDatasetSizeBytes{Call: _m.Call.Return(_a0)} -} - -func (_m *TaskExecutionContext) OnMaxDatasetSizeBytes() *TaskExecutionContext_MaxDatasetSizeBytes { - c_call := _m.On("MaxDatasetSizeBytes") - return &TaskExecutionContext_MaxDatasetSizeBytes{Call: c_call} -} - -func (_m *TaskExecutionContext) OnMaxDatasetSizeBytesMatch(matchers ...interface{}) *TaskExecutionContext_MaxDatasetSizeBytes { - c_call := _m.On("MaxDatasetSizeBytes", matchers...) - return &TaskExecutionContext_MaxDatasetSizeBytes{Call: c_call} -} - -// MaxDatasetSizeBytes provides a mock function with given fields: -func (_m *TaskExecutionContext) MaxDatasetSizeBytes() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - type TaskExecutionContext_OutputWriter struct { *mock.Call } diff --git a/flyteplugins/go/tasks/pluginmachinery/ioutils/remote_file_output_reader.go b/flyteplugins/go/tasks/pluginmachinery/ioutils/remote_file_output_reader.go index 152644d828..27d7748701 100644 --- a/flyteplugins/go/tasks/pluginmachinery/ioutils/remote_file_output_reader.go +++ b/flyteplugins/go/tasks/pluginmachinery/ioutils/remote_file_output_reader.go @@ -123,9 +123,15 @@ func (r RemoteFileOutputReader) DeckExists(ctx context.Context) (bool, error) { } func NewRemoteFileOutputReader(_ context.Context, store storage.ComposedProtobufStore, outPaths io.OutputFilePaths, maxDatasetSize int64) RemoteFileOutputReader { + // Note: even though the data store retrieval checks against GetLimitMegabytes, there might be external + // storage implementations, so we keep this check here as well. + maxPayloadSize := maxDatasetSize + if maxPayloadSize == 0 { + maxPayloadSize = storage.GetConfig().Limits.GetLimitMegabytes * 1024 * 1024 + } return RemoteFileOutputReader{ outPath: outPaths, store: store, - maxPayloadSize: maxDatasetSize, + maxPayloadSize: maxPayloadSize, } } diff --git a/flyteplugins/go/tasks/pluginmachinery/k8s/mocks/plugin_context.go b/flyteplugins/go/tasks/pluginmachinery/k8s/mocks/plugin_context.go index 532b5fe76c..a274b0559e 100644 --- a/flyteplugins/go/tasks/pluginmachinery/k8s/mocks/plugin_context.go +++ b/flyteplugins/go/tasks/pluginmachinery/k8s/mocks/plugin_context.go @@ -84,38 +84,6 @@ func (_m *PluginContext) InputReader() io.InputReader { return r0 } -type PluginContext_MaxDatasetSizeBytes struct { - *mock.Call -} - -func (_m PluginContext_MaxDatasetSizeBytes) Return(_a0 int64) *PluginContext_MaxDatasetSizeBytes { - return &PluginContext_MaxDatasetSizeBytes{Call: _m.Call.Return(_a0)} -} - -func (_m *PluginContext) OnMaxDatasetSizeBytes() *PluginContext_MaxDatasetSizeBytes { - c_call := _m.On("MaxDatasetSizeBytes") - return &PluginContext_MaxDatasetSizeBytes{Call: c_call} -} - -func (_m *PluginContext) OnMaxDatasetSizeBytesMatch(matchers ...interface{}) *PluginContext_MaxDatasetSizeBytes { - c_call := _m.On("MaxDatasetSizeBytes", matchers...) - return &PluginContext_MaxDatasetSizeBytes{Call: c_call} -} - -// MaxDatasetSizeBytes provides a mock function with given fields: -func (_m *PluginContext) MaxDatasetSizeBytes() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - type PluginContext_OutputWriter struct { *mock.Call } diff --git a/flyteplugins/go/tasks/pluginmachinery/k8s/plugin.go b/flyteplugins/go/tasks/pluginmachinery/k8s/plugin.go index 8b56f7dd5e..1bbe07c02a 100644 --- a/flyteplugins/go/tasks/pluginmachinery/k8s/plugin.go +++ b/flyteplugins/go/tasks/pluginmachinery/k8s/plugin.go @@ -61,9 +61,6 @@ type PluginContext interface { // Returns a handle to the currently configured storage backend that can be used to communicate with the tasks or write metadata DataStore() *storage.DataStore - // Returns the max allowed dataset size that the outputwriter will accept - MaxDatasetSizeBytes() int64 - // Returns a handle to the Task's execution metadata. TaskExecutionMetadata() pluginsCore.TaskExecutionMetadata diff --git a/flyteplugins/go/tasks/pluginmachinery/webapi/mocks/status_context.go b/flyteplugins/go/tasks/pluginmachinery/webapi/mocks/status_context.go index f9d1239185..e860c1843c 100644 --- a/flyteplugins/go/tasks/pluginmachinery/webapi/mocks/status_context.go +++ b/flyteplugins/go/tasks/pluginmachinery/webapi/mocks/status_context.go @@ -84,38 +84,6 @@ func (_m *StatusContext) InputReader() io.InputReader { return r0 } -type StatusContext_MaxDatasetSizeBytes struct { - *mock.Call -} - -func (_m StatusContext_MaxDatasetSizeBytes) Return(_a0 int64) *StatusContext_MaxDatasetSizeBytes { - return &StatusContext_MaxDatasetSizeBytes{Call: _m.Call.Return(_a0)} -} - -func (_m *StatusContext) OnMaxDatasetSizeBytes() *StatusContext_MaxDatasetSizeBytes { - c_call := _m.On("MaxDatasetSizeBytes") - return &StatusContext_MaxDatasetSizeBytes{Call: c_call} -} - -func (_m *StatusContext) OnMaxDatasetSizeBytesMatch(matchers ...interface{}) *StatusContext_MaxDatasetSizeBytes { - c_call := _m.On("MaxDatasetSizeBytes", matchers...) - return &StatusContext_MaxDatasetSizeBytes{Call: c_call} -} - -// MaxDatasetSizeBytes provides a mock function with given fields: -func (_m *StatusContext) MaxDatasetSizeBytes() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - type StatusContext_OutputWriter struct { *mock.Call } diff --git a/flyteplugins/go/tasks/pluginmachinery/webapi/mocks/task_execution_context.go b/flyteplugins/go/tasks/pluginmachinery/webapi/mocks/task_execution_context.go index 602c34114b..a8a78314ff 100644 --- a/flyteplugins/go/tasks/pluginmachinery/webapi/mocks/task_execution_context.go +++ b/flyteplugins/go/tasks/pluginmachinery/webapi/mocks/task_execution_context.go @@ -84,38 +84,6 @@ func (_m *TaskExecutionContext) InputReader() io.InputReader { return r0 } -type TaskExecutionContext_MaxDatasetSizeBytes struct { - *mock.Call -} - -func (_m TaskExecutionContext_MaxDatasetSizeBytes) Return(_a0 int64) *TaskExecutionContext_MaxDatasetSizeBytes { - return &TaskExecutionContext_MaxDatasetSizeBytes{Call: _m.Call.Return(_a0)} -} - -func (_m *TaskExecutionContext) OnMaxDatasetSizeBytes() *TaskExecutionContext_MaxDatasetSizeBytes { - c_call := _m.On("MaxDatasetSizeBytes") - return &TaskExecutionContext_MaxDatasetSizeBytes{Call: c_call} -} - -func (_m *TaskExecutionContext) OnMaxDatasetSizeBytesMatch(matchers ...interface{}) *TaskExecutionContext_MaxDatasetSizeBytes { - c_call := _m.On("MaxDatasetSizeBytes", matchers...) - return &TaskExecutionContext_MaxDatasetSizeBytes{Call: c_call} -} - -// MaxDatasetSizeBytes provides a mock function with given fields: -func (_m *TaskExecutionContext) MaxDatasetSizeBytes() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - type TaskExecutionContext_OutputWriter struct { *mock.Call } diff --git a/flyteplugins/go/tasks/pluginmachinery/webapi/plugin.go b/flyteplugins/go/tasks/pluginmachinery/webapi/plugin.go index 37be2c1e40..920040cab0 100644 --- a/flyteplugins/go/tasks/pluginmachinery/webapi/plugin.go +++ b/flyteplugins/go/tasks/pluginmachinery/webapi/plugin.go @@ -72,9 +72,6 @@ type TaskExecutionContext interface { // Provides the raw datastore to enable persisting outputs. DataStore() *storage.DataStore - - // Returns the max allowed dataset size that the outputwriter will accept - MaxDatasetSizeBytes() int64 } type GetContext interface { diff --git a/flyteplugins/go/tasks/plugins/array/outputs.go b/flyteplugins/go/tasks/plugins/array/outputs.go index d31988425f..cb07fb0de1 100644 --- a/flyteplugins/go/tasks/plugins/array/outputs.go +++ b/flyteplugins/go/tasks/plugins/array/outputs.go @@ -225,7 +225,7 @@ func AssembleFinalOutputs(ctx context.Context, assemblyQueue OutputAssembler, tC switch w.Status() { case workqueue.WorkStatusSucceeded: - or := ioutils.NewRemoteFileOutputReader(ctx, tCtx.DataStore(), tCtx.OutputWriter(), tCtx.MaxDatasetSizeBytes()) + or := ioutils.NewRemoteFileOutputReader(ctx, tCtx.DataStore(), tCtx.OutputWriter(), 0) if err = tCtx.OutputWriter().Put(ctx, or); err != nil { return nil, err } diff --git a/flyteplugins/go/tasks/plugins/array/outputs_test.go b/flyteplugins/go/tasks/plugins/array/outputs_test.go index f218e9540f..529eba0429 100644 --- a/flyteplugins/go/tasks/plugins/array/outputs_test.go +++ b/flyteplugins/go/tasks/plugins/array/outputs_test.go @@ -244,7 +244,6 @@ func TestAssembleFinalOutputs(t *testing.T) { tCtx := &mocks3.TaskExecutionContext{} tCtx.OnTaskExecutionMetadata().Return(tMeta) tCtx.OnOutputWriter().Return(ow) - tCtx.OnMaxDatasetSizeBytes().Return(10000) tCtx.OnDataStore().Return(d) _, err = AssembleFinalOutputs(ctx, assemblyQueue, tCtx, arrayCore.PhaseSuccess, 1, s) @@ -368,7 +367,6 @@ func TestAssembleFinalOutputs(t *testing.T) { tCtx.OnTaskReader().Return(tReader) tCtx.OnOutputWriter().Return(ow) tCtx.OnDataStore().Return(ds) - tCtx.OnMaxDatasetSizeBytes().Return(10000) _, err = AssembleFinalOutputs(ctx, assemblyQueue, tCtx, arrayCore.PhaseSuccess, 1, s) assert.NoError(t, err) diff --git a/flyteplugins/go/tasks/plugins/testing/echo.go b/flyteplugins/go/tasks/plugins/testing/echo.go index 7c5587dd71..885ab5dfc4 100644 --- a/flyteplugins/go/tasks/plugins/testing/echo.go +++ b/flyteplugins/go/tasks/plugins/testing/echo.go @@ -76,7 +76,7 @@ func (e *EchoPlugin) Handle(ctx context.Context, tCtx core.TaskExecutionContext) return core.UnknownTransition, err } - or := ioutils.NewRemoteFileOutputReader(ctx, tCtx.DataStore(), tCtx.OutputWriter(), tCtx.MaxDatasetSizeBytes()) + or := ioutils.NewRemoteFileOutputReader(ctx, tCtx.DataStore(), tCtx.OutputWriter(), 0) if err = tCtx.OutputWriter().Put(ctx, or); err != nil { return core.UnknownTransition, err } diff --git a/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go b/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go index 03c04b4d27..d1b18e76dd 100644 --- a/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go +++ b/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go @@ -334,7 +334,7 @@ func writeOutput(ctx context.Context, taskCtx webapi.StatusContext, outputs *fly opReader = ioutils.NewInMemoryOutputReader(outputs, nil, nil) } else { logger.Debugf(ctx, "AgentDeployment didn't return any output, assuming file based outputs.") - opReader = ioutils.NewRemoteFileOutputReader(ctx, taskCtx.DataStore(), taskCtx.OutputWriter(), taskCtx.MaxDatasetSizeBytes()) + opReader = ioutils.NewRemoteFileOutputReader(ctx, taskCtx.DataStore(), taskCtx.OutputWriter(), 0) } return taskCtx.OutputWriter().Put(ctx, opReader) } diff --git a/flyteplugins/go/tasks/plugins/webapi/databricks/plugin.go b/flyteplugins/go/tasks/plugins/webapi/databricks/plugin.go index 70d7c7e2f9..b3c423acaf 100644 --- a/flyteplugins/go/tasks/plugins/webapi/databricks/plugin.go +++ b/flyteplugins/go/tasks/plugins/webapi/databricks/plugin.go @@ -302,7 +302,7 @@ func writeOutput(ctx context.Context, taskCtx webapi.StatusContext) error { return nil } - outputReader := ioutils.NewRemoteFileOutputReader(ctx, taskCtx.DataStore(), taskCtx.OutputWriter(), taskCtx.MaxDatasetSizeBytes()) + outputReader := ioutils.NewRemoteFileOutputReader(ctx, taskCtx.DataStore(), taskCtx.OutputWriter(), 0) return taskCtx.OutputWriter().Put(ctx, outputReader) } diff --git a/flyteplugins/tests/end_to_end.go b/flyteplugins/tests/end_to_end.go index 1a55b52c0c..732241953d 100644 --- a/flyteplugins/tests/end_to_end.go +++ b/flyteplugins/tests/end_to_end.go @@ -243,7 +243,6 @@ func RunPluginEndToEndTest(t *testing.T, executor pluginCore.Plugin, template *i tCtx.OnCatalog().Return(cat) tCtx.OnEventsRecorder().Return(eRecorder) tCtx.OnResourceManager().Return(resourceManager) - tCtx.OnMaxDatasetSizeBytes().Return(1000000) tCtx.OnSecretManager().Return(secretManager) trns := pluginCore.DoTransition(pluginCore.PhaseInfoQueued(time.Now(), 0, "")) diff --git a/flytepropeller/pkg/controller/controller.go b/flytepropeller/pkg/controller/controller.go index 631d85bd2c..afa0c6e9ef 100644 --- a/flytepropeller/pkg/controller/controller.go +++ b/flytepropeller/pkg/controller/controller.go @@ -440,7 +440,7 @@ func New(ctx context.Context, cfg *config.Config, kubeClientset kubernetes.Inter } nodeExecutor, err := nodes.NewExecutor(ctx, cfg.NodeConfig, store, controller.enqueueWorkflowForNodeUpdates, eventSink, - launchPlanActor, launchPlanActor, sCfg.Limits.GetLimitMegabytes*1024*1024, storage.DataReference(cfg.DefaultRawOutputPrefix), kubeClient, + launchPlanActor, launchPlanActor, storage.DataReference(cfg.DefaultRawOutputPrefix), kubeClient, catalogClient, recoveryClient, &cfg.EventConfig, cfg.ClusterID, signalClient, nodeHandlerFactory, scope) if err != nil { return nil, errors.Wrapf(err, "Failed to create Controller.") diff --git a/flytepropeller/pkg/controller/nodes/array/handler.go b/flytepropeller/pkg/controller/nodes/array/handler.go index 1699d47de0..cb5787053d 100644 --- a/flytepropeller/pkg/controller/nodes/array/handler.go +++ b/flytepropeller/pkg/controller/nodes/array/handler.go @@ -485,7 +485,7 @@ func (a *arrayNodeHandler) Handle(ctx context.Context, nCtx interfaces.NodeExecu // checkpoint paths are not computed here because this function is only called when writing // existing cached outputs. if this functionality changes this will need to be revisited. outputPaths := ioutils.NewCheckpointRemoteFilePaths(ctx, nCtx.DataStore(), subOutputDir, ioutils.NewRawOutputPaths(ctx, subDataDir), "") - reader := ioutils.NewRemoteFileOutputReader(ctx, nCtx.DataStore(), outputPaths, nCtx.MaxDatasetSizeBytes()) + reader := ioutils.NewRemoteFileOutputReader(ctx, nCtx.DataStore(), outputPaths, 0) gatherOutputsRequest.reader = &reader a.gatherOutputsRequestChannel <- gatherOutputsRequest diff --git a/flytepropeller/pkg/controller/nodes/array/handler_test.go b/flytepropeller/pkg/controller/nodes/array/handler_test.go index b1f055c483..f7863731b4 100644 --- a/flytepropeller/pkg/controller/nodes/array/handler_test.go +++ b/flytepropeller/pkg/controller/nodes/array/handler_test.go @@ -61,7 +61,7 @@ func createArrayNodeHandler(ctx context.Context, t *testing.T, nodeHandler inter // create node executor nodeExecutor, err := nodes.NewExecutor(ctx, config.GetConfig().NodeConfig, dataStore, enqueueWorkflowFunc, mockEventSink, adminClient, - adminClient, 10, "s3://bucket/", mockKubeClient, noopCatalogClient, mockRecoveryClient, eventConfig, "clusterID", mockSignalClient, mockHandlerFactory, scope) + adminClient, "s3://bucket/", mockKubeClient, noopCatalogClient, mockRecoveryClient, eventConfig, "clusterID", mockSignalClient, mockHandlerFactory, scope) assert.NoError(t, err) // return ArrayNodeHandler @@ -79,7 +79,6 @@ func createNodeExecutionContext(dataStore *storage.DataStore, eventRecorder inte currentParallelism uint32, maxParallelism uint32) interfaces.NodeExecutionContext { nCtx := &mocks.NodeExecutionContext{} - nCtx.OnMaxDatasetSizeBytes().Return(9999999) nCtx.OnCurrentAttempt().Return(uint32(0)) // ContextualNodeLookup diff --git a/flytepropeller/pkg/controller/nodes/branch/handler_test.go b/flytepropeller/pkg/controller/nodes/branch/handler_test.go index a194452ff5..dfe0338fc1 100644 --- a/flytepropeller/pkg/controller/nodes/branch/handler_test.go +++ b/flytepropeller/pkg/controller/nodes/branch/handler_test.go @@ -118,7 +118,6 @@ func createNodeContext(phase v1alpha1.BranchNodePhase, childNodeID *v1alpha1.Nod tmpDataStore, _ := storage.NewDataStore(&storage.Config{Type: storage.TypeMemory}, promutils.NewTestScope()) nCtx.OnDataStore().Return(tmpDataStore) nCtx.OnCurrentAttempt().Return(uint32(1)) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeStatus().Return(ns) nCtx.OnNodeID().Return("n1") diff --git a/flytepropeller/pkg/controller/nodes/cache.go b/flytepropeller/pkg/controller/nodes/cache.go index 59cf21057d..e8e7fc3720 100644 --- a/flytepropeller/pkg/controller/nodes/cache.go +++ b/flytepropeller/pkg/controller/nodes/cache.go @@ -216,7 +216,7 @@ func (n *nodeExecutor) WriteCatalogCache(ctx context.Context, nCtx interfaces.No catalogKey.Identifier.Domain, catalogKey.Identifier.Name, catalogKey.Identifier.Version) outputPaths := ioutils.NewReadOnlyOutputFilePaths(ctx, nCtx.DataStore(), nCtx.NodeStatus().GetOutputDir()) - outputReader := ioutils.NewRemoteFileOutputReader(ctx, nCtx.DataStore(), outputPaths, nCtx.MaxDatasetSizeBytes()) + outputReader := ioutils.NewRemoteFileOutputReader(ctx, nCtx.DataStore(), outputPaths, 0) metadata := catalog.Metadata{ TaskExecutionIdentifier: task.GetTaskExecutionIdentifier(nCtx), } diff --git a/flytepropeller/pkg/controller/nodes/dynamic/dynamic_workflow_test.go b/flytepropeller/pkg/controller/nodes/dynamic/dynamic_workflow_test.go index 4011ffb956..389ea0439b 100644 --- a/flytepropeller/pkg/controller/nodes/dynamic/dynamic_workflow_test.go +++ b/flytepropeller/pkg/controller/nodes/dynamic/dynamic_workflow_test.go @@ -94,7 +94,6 @@ func Test_dynamicNodeHandler_buildContextualDynamicWorkflow_withLaunchPlans(t *t nCtx.OnInputReader().Return(ir) nCtx.OnCurrentAttempt().Return(uint32(1)) nCtx.OnTaskReader().Return(tr) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeID().Return("n1") nCtx.OnEnqueueOwnerFunc().Return(func() error { return nil }) nCtx.OnDataStore().Return(dataStore) diff --git a/flytepropeller/pkg/controller/nodes/dynamic/handler.go b/flytepropeller/pkg/controller/nodes/dynamic/handler.go index 21ef2da487..e23f145bb3 100644 --- a/flytepropeller/pkg/controller/nodes/dynamic/handler.go +++ b/flytepropeller/pkg/controller/nodes/dynamic/handler.go @@ -141,7 +141,7 @@ func (d dynamicNodeTaskNodeHandler) handleDynamicSubNodes(ctx context.Context, n // These outputPaths only reads the output metadata. So the sandbox is completely optional here and hence it is nil. // The sandbox creation as it uses hashing can be expensive and we skip that expense. outputPaths := ioutils.NewReadOnlyOutputFilePaths(ctx, nCtx.DataStore(), nCtx.NodeStatus().GetOutputDir()) - outputReader := ioutils.NewRemoteFileOutputReader(ctx, nCtx.DataStore(), outputPaths, nCtx.MaxDatasetSizeBytes()) + outputReader := ioutils.NewRemoteFileOutputReader(ctx, nCtx.DataStore(), outputPaths, 0) ee, err := d.TaskNodeHandler.ValidateOutput(ctx, nCtx.NodeID(), nCtx.InputReader(), outputReader, nil, nCtx.ExecutionContext().GetExecutionConfig(), nCtx.TaskReader()) diff --git a/flytepropeller/pkg/controller/nodes/dynamic/handler_test.go b/flytepropeller/pkg/controller/nodes/dynamic/handler_test.go index e66dadbebf..bab7b48f1b 100644 --- a/flytepropeller/pkg/controller/nodes/dynamic/handler_test.go +++ b/flytepropeller/pkg/controller/nodes/dynamic/handler_test.go @@ -135,7 +135,6 @@ func Test_dynamicNodeHandler_Handle_Parent(t *testing.T) { nCtx.OnInputReader().Return(ir) nCtx.OnCurrentAttempt().Return(uint32(1)) nCtx.OnTaskReader().Return(tr) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeStatus().Return(ns) nCtx.OnNodeID().Return("n1") nCtx.OnEnqueueOwnerFunc().Return(nil) @@ -467,7 +466,6 @@ func Test_dynamicNodeHandler_Handle_SubTaskV1(t *testing.T) { nCtx.OnInputReader().Return(ir) nCtx.OnCurrentAttempt().Return(uint32(1)) nCtx.OnTaskReader().Return(tr) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeID().Return(nodeID) nCtx.OnEnqueueOwnerFunc().Return(func() error { return nil }) nCtx.OnDataStore().Return(dataStore) @@ -665,7 +663,6 @@ func Test_dynamicNodeHandler_Handle_SubTask(t *testing.T) { nCtx.OnInputReader().Return(ir) nCtx.OnCurrentAttempt().Return(uint32(1)) nCtx.OnTaskReader().Return(tr) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeID().Return(nodeID) nCtx.OnEnqueueOwnerFunc().Return(func() error { return nil }) nCtx.OnDataStore().Return(dataStore) @@ -912,7 +909,6 @@ func TestDynamicNodeTaskNodeHandler_Finalize(t *testing.T) { nCtx.OnInputReader().Return(ir) nCtx.OnCurrentAttempt().Return(uint32(1)) nCtx.OnTaskReader().Return(tr) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeID().Return(nodeID) nCtx.OnEnqueueOwnerFunc().Return(func() error { return nil }) nCtx.OnDataStore().Return(dataStore) diff --git a/flytepropeller/pkg/controller/nodes/executor.go b/flytepropeller/pkg/controller/nodes/executor.go index b3b63cc448..46da9134eb 100644 --- a/flytepropeller/pkg/controller/nodes/executor.go +++ b/flytepropeller/pkg/controller/nodes/executor.go @@ -492,7 +492,6 @@ type nodeExecutor struct { enqueueWorkflow v1alpha1.EnqueueWorkflow eventConfig *config.EventConfig interruptibleFailureThreshold int32 - maxDatasetSizeBytes int64 maxNodeRetriesForSystemFailures uint32 metrics *nodeMetrics nodeRecorder events.NodeEventRecorder @@ -1399,7 +1398,7 @@ func (c *nodeExecutor) HandleNode(ctx context.Context, dag executors.DAGStructur } func NewExecutor(ctx context.Context, nodeConfig config.NodeConfig, store *storage.DataStore, enQWorkflow v1alpha1.EnqueueWorkflow, eventSink events.EventSink, - workflowLauncher launchplan.Executor, launchPlanReader launchplan.Reader, maxDatasetSize int64, defaultRawOutputPrefix storage.DataReference, kubeClient executors.Client, + workflowLauncher launchplan.Executor, launchPlanReader launchplan.Reader, defaultRawOutputPrefix storage.DataReference, kubeClient executors.Client, catalogClient catalog.Client, recoveryClient recovery.Client, eventConfig *config.EventConfig, clusterID string, signalClient service.SignalServiceClient, nodeHandlerFactory interfaces.HandlerFactory, scope promutils.Scope) (interfaces.Node, error) { @@ -1453,7 +1452,6 @@ func NewExecutor(ctx context.Context, nodeConfig config.NodeConfig, store *stora enqueueWorkflow: enQWorkflow, eventConfig: eventConfig, interruptibleFailureThreshold: nodeConfig.InterruptibleFailureThreshold, - maxDatasetSizeBytes: maxDatasetSize, maxNodeRetriesForSystemFailures: uint32(nodeConfig.MaxNodeRetriesOnSystemFailures), metrics: metrics, nodeRecorder: events.NewNodeEventRecorder(eventSink, nodeScope, store), diff --git a/flytepropeller/pkg/controller/nodes/executor_test.go b/flytepropeller/pkg/controller/nodes/executor_test.go index 237928a937..227f3e5f1b 100644 --- a/flytepropeller/pkg/controller/nodes/executor_test.go +++ b/flytepropeller/pkg/controller/nodes/executor_test.go @@ -69,7 +69,7 @@ func TestSetInputsForStartNode(t *testing.T) { hf := &nodemocks.HandlerFactory{} hf.On("Setup", mock.Anything, mock.Anything, mock.Anything).Return(nil) exec, err := NewExecutor(ctx, config.GetConfig().NodeConfig, mockStorage, enQWf, eventMocks.NewMockEventSink(), adminClient, - adminClient, 10, "s3://bucket/", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + adminClient, "s3://bucket/", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) inputs := &core.LiteralMap{ Literals: map[string]*core.Literal{ @@ -116,7 +116,7 @@ func TestSetInputsForStartNode(t *testing.T) { failStorage := createFailingDatastore(t, testScope.NewSubScope("failing")) execFail, err := NewExecutor(ctx, config.GetConfig().NodeConfig, failStorage, enQWf, eventMocks.NewMockEventSink(), adminClient, - adminClient, 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + adminClient, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) t.Run("StorageFailure", func(t *testing.T) { w := createDummyBaseWorkflow(mockStorage) @@ -145,7 +145,7 @@ func TestNodeExecutor_Initialize(t *testing.T) { hf.On("Setup", mock.Anything, mock.Anything, mock.Anything).Return(nil) execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, memStore, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -156,8 +156,7 @@ func TestNodeExecutor_Initialize(t *testing.T) { hf := &nodemocks.HandlerFactory{} hf.On("Setup", mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("error")) - execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, memStore, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, memStore, enQWf, mockEventSink, adminClient, adminClient, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -177,7 +176,7 @@ func TestNodeExecutor_RecursiveNodeHandler_RecurseStartNodes(t *testing.T) { hf := &nodemocks.HandlerFactory{} hf.On("Setup", mock.Anything, mock.Anything, mock.Anything).Return(nil) execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -282,8 +281,7 @@ func TestNodeExecutor_RecursiveNodeHandler_RecurseEndNode(t *testing.T) { adminClient := launchplan.NewFailFastLaunchPlanExecutor() hf := &nodemocks.HandlerFactory{} hf.On("Setup", mock.Anything, mock.Anything, mock.Anything).Return(nil) - execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -696,7 +694,7 @@ func TestNodeExecutor_RecursiveNodeHandler_Recurse(t *testing.T) { nodeConfig := config.GetConfig().NodeConfig nodeConfig.EnableCRDebugMetadata = test.enableCRDebugMetadata execIface, err := NewExecutor(ctx, nodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -771,7 +769,7 @@ func TestNodeExecutor_RecursiveNodeHandler_Recurse(t *testing.T) { store := createInmemoryDataStore(t, promutils.NewTestScope()) adminClient := launchplan.NewFailFastLaunchPlanExecutor() execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -885,7 +883,7 @@ func TestNodeExecutor_RecursiveNodeHandler_Recurse(t *testing.T) { store := createInmemoryDataStore(t, promutils.NewTestScope()) adminClient := launchplan.NewFailFastLaunchPlanExecutor() execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -952,7 +950,7 @@ func TestNodeExecutor_RecursiveNodeHandler_Recurse(t *testing.T) { store := createInmemoryDataStore(t, promutils.NewTestScope()) adminClient := launchplan.NewFailFastLaunchPlanExecutor() execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -983,7 +981,7 @@ func TestNodeExecutor_RecursiveNodeHandler_Recurse(t *testing.T) { store := createInmemoryDataStore(t, promutils.NewTestScope()) adminClient := launchplan.NewFailFastLaunchPlanExecutor() execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -1018,7 +1016,7 @@ func TestNodeExecutor_RecursiveNodeHandler_NoDownstream(t *testing.T) { hf := &nodemocks.HandlerFactory{} hf.On("Setup", mock.Anything, mock.Anything, mock.Anything).Return(nil) execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -1131,7 +1129,7 @@ func TestNodeExecutor_RecursiveNodeHandler_UpstreamNotReady(t *testing.T) { hf := &nodemocks.HandlerFactory{} hf.On("Setup", mock.Anything, mock.Anything, mock.Anything).Return(nil) execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -1249,7 +1247,7 @@ func TestNodeExecutor_RecursiveNodeHandler_BranchNode(t *testing.T) { hf := &nodemocks.HandlerFactory{} hf.On("Setup", mock.Anything, mock.Anything, mock.Anything).Return(nil) execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) // Node not yet started @@ -1855,7 +1853,7 @@ func TestNodeExecutor_RecursiveNodeHandler_ParallelismLimit(t *testing.T) { hf := &nodemocks.HandlerFactory{} hf.On("Setup", mock.Anything, mock.Anything, mock.Anything).Return(nil) execIface, err := NewExecutor(ctx, config.GetConfig().NodeConfig, store, enQWf, mockEventSink, adminClient, adminClient, - 10, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, hf, promutils.NewTestScope()) assert.NoError(t, err) exec := execIface.(*recursiveNodeExecutor) @@ -2621,7 +2619,6 @@ func TestNodeExecutor_RecursiveNodeHandler_Cache(t *testing.T) { RawOutputPolicy: config.RawOutputPolicyReference, } fakeKubeClient := mocks4.NewFakeKubeClient() - maxDatasetSize := int64(10) mockEventSink := eventMocks.NewMockEventSink() nodeConfig := config.GetConfig().NodeConfig rawOutputPrefix := storage.DataReference("s3://bucket/") @@ -2632,7 +2629,7 @@ func TestNodeExecutor_RecursiveNodeHandler_Cache(t *testing.T) { mockHandlerFactory := &nodemocks.HandlerFactory{} mockHandlerFactory.OnGetHandler(v1alpha1.NodeKindTask).Return(mockHandler, nil) nodeExecutor, err := NewExecutor(ctx, nodeConfig, dataStore, enqueueWorkflow, mockEventSink, - adminClient, adminClient, maxDatasetSize, rawOutputPrefix, fakeKubeClient, catalogClient, + adminClient, adminClient, rawOutputPrefix, fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, mockHandlerFactory, testScope) assert.NoError(t, err) diff --git a/flytepropeller/pkg/controller/nodes/interfaces/mocks/node_execution_context.go b/flytepropeller/pkg/controller/nodes/interfaces/mocks/node_execution_context.go index 448b5aa13f..7d6b66c61d 100644 --- a/flytepropeller/pkg/controller/nodes/interfaces/mocks/node_execution_context.go +++ b/flytepropeller/pkg/controller/nodes/interfaces/mocks/node_execution_context.go @@ -258,38 +258,6 @@ func (_m *NodeExecutionContext) InputReader() io.InputReader { return r0 } -type NodeExecutionContext_MaxDatasetSizeBytes struct { - *mock.Call -} - -func (_m NodeExecutionContext_MaxDatasetSizeBytes) Return(_a0 int64) *NodeExecutionContext_MaxDatasetSizeBytes { - return &NodeExecutionContext_MaxDatasetSizeBytes{Call: _m.Call.Return(_a0)} -} - -func (_m *NodeExecutionContext) OnMaxDatasetSizeBytes() *NodeExecutionContext_MaxDatasetSizeBytes { - c_call := _m.On("MaxDatasetSizeBytes") - return &NodeExecutionContext_MaxDatasetSizeBytes{Call: c_call} -} - -func (_m *NodeExecutionContext) OnMaxDatasetSizeBytesMatch(matchers ...interface{}) *NodeExecutionContext_MaxDatasetSizeBytes { - c_call := _m.On("MaxDatasetSizeBytes", matchers...) - return &NodeExecutionContext_MaxDatasetSizeBytes{Call: c_call} -} - -// MaxDatasetSizeBytes provides a mock function with given fields: -func (_m *NodeExecutionContext) MaxDatasetSizeBytes() int64 { - ret := _m.Called() - - var r0 int64 - if rf, ok := ret.Get(0).(func() int64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(int64) - } - - return r0 -} - type NodeExecutionContext_Node struct { *mock.Call } diff --git a/flytepropeller/pkg/controller/nodes/interfaces/node_exec_context.go b/flytepropeller/pkg/controller/nodes/interfaces/node_exec_context.go index 8f10becca4..b6a33a4e35 100644 --- a/flytepropeller/pkg/controller/nodes/interfaces/node_exec_context.go +++ b/flytepropeller/pkg/controller/nodes/interfaces/node_exec_context.go @@ -15,6 +15,8 @@ import ( "github.com/flyteorg/flyte/flytestdlib/storage" ) +//go:generate mockery -all -case=underscore + type TaskReader interface { Read(ctx context.Context) (*core.TaskTemplate, error) GetTaskType() v1alpha1.TaskType @@ -61,7 +63,6 @@ type NodeExecutionContext interface { NodeStateWriter() NodeStateWriter NodeExecutionMetadata() NodeExecutionMetadata - MaxDatasetSizeBytes() int64 EnqueueOwnerFunc() func() error diff --git a/flytepropeller/pkg/controller/nodes/node_exec_context.go b/flytepropeller/pkg/controller/nodes/node_exec_context.go index f42f8b0324..a579b241f3 100644 --- a/flytepropeller/pkg/controller/nodes/node_exec_context.go +++ b/flytepropeller/pkg/controller/nodes/node_exec_context.go @@ -119,20 +119,19 @@ func (e nodeExecMetadata) GetLabels() map[string]string { } type nodeExecContext struct { - store *storage.DataStore - tr interfaces.TaskReader - md interfaces.NodeExecutionMetadata - eventRecorder interfaces.EventRecorder - inputs io.InputReader - node v1alpha1.ExecutableNode - nodeStatus v1alpha1.ExecutableNodeStatus - maxDatasetSizeBytes int64 - nsm *nodeStateManager - enqueueOwner func() error - rawOutputPrefix storage.DataReference - shardSelector ioutils.ShardSelector - nl executors.NodeLookup - ic executors.ExecutionContext + store *storage.DataStore + tr interfaces.TaskReader + md interfaces.NodeExecutionMetadata + eventRecorder interfaces.EventRecorder + inputs io.InputReader + node v1alpha1.ExecutableNode + nodeStatus v1alpha1.ExecutableNodeStatus + nsm *nodeStateManager + enqueueOwner func() error + rawOutputPrefix storage.DataReference + shardSelector ioutils.ShardSelector + nl executors.NodeLookup + ic executors.ExecutionContext } func (e nodeExecContext) ExecutionContext() executors.ExecutionContext { @@ -199,13 +198,9 @@ func (e nodeExecContext) NodeExecutionMetadata() interfaces.NodeExecutionMetadat return e.md } -func (e nodeExecContext) MaxDatasetSizeBytes() int64 { - return e.maxDatasetSizeBytes -} - func newNodeExecContext(_ context.Context, store *storage.DataStore, execContext executors.ExecutionContext, nl executors.NodeLookup, node v1alpha1.ExecutableNode, nodeStatus v1alpha1.ExecutableNodeStatus, inputs io.InputReader, interruptible bool, interruptibleFailureThreshold int32, - maxDatasetSize int64, taskEventRecorder events.TaskEventRecorder, nodeEventRecorder events.NodeEventRecorder, tr interfaces.TaskReader, nsm *nodeStateManager, + taskEventRecorder events.TaskEventRecorder, nodeEventRecorder events.NodeEventRecorder, tr interfaces.TaskReader, nsm *nodeStateManager, enqueueOwner func() error, rawOutputPrefix storage.DataReference, outputShardSelector ioutils.ShardSelector) *nodeExecContext { md := nodeExecMetadata{ @@ -240,14 +235,13 @@ func newNodeExecContext(_ context.Context, store *storage.DataStore, execContext taskEventRecorder: taskEventRecorder, nodeEventRecorder: nodeEventRecorder, }, - maxDatasetSizeBytes: maxDatasetSize, - tr: tr, - nsm: nsm, - enqueueOwner: enqueueOwner, - rawOutputPrefix: rawOutputPrefix, - shardSelector: outputShardSelector, - nl: nl, - ic: execContext, + tr: tr, + nsm: nsm, + enqueueOwner: enqueueOwner, + rawOutputPrefix: rawOutputPrefix, + shardSelector: outputShardSelector, + nl: nl, + ic: execContext, } } @@ -331,7 +325,6 @@ func (c *nodeExecutor) BuildNodeExecutionContext(ctx context.Context, executionC ), interruptible, c.interruptibleFailureThreshold, - c.maxDatasetSizeBytes, c.taskRecorder, c.nodeRecorder, tr, diff --git a/flytepropeller/pkg/controller/nodes/node_exec_context_test.go b/flytepropeller/pkg/controller/nodes/node_exec_context_test.go index e64abb4c99..10e12d35e4 100644 --- a/flytepropeller/pkg/controller/nodes/node_exec_context_test.go +++ b/flytepropeller/pkg/controller/nodes/node_exec_context_test.go @@ -107,7 +107,7 @@ func Test_NodeContext(t *testing.T) { s, _ := storage.NewDataStore(&storage.Config{Type: storage.TypeMemory}, promutils.NewTestScope()) p := parentInfo{} execContext := executors.NewExecutionContext(w1, nil, nil, p, nil) - nCtx := newNodeExecContext(context.TODO(), s, execContext, w1, getTestNodeSpec(nil), nil, nil, false, 0, 2, nil, nil, TaskReader{}, nil, nil, "s3://bucket", ioutils.NewConstantShardSelector([]string{"x"})) + nCtx := newNodeExecContext(context.TODO(), s, execContext, w1, getTestNodeSpec(nil), nil, nil, false, 0, nil, nil, TaskReader{}, nil, nil, "s3://bucket", ioutils.NewConstantShardSelector([]string{"x"})) assert.Equal(t, "id", nCtx.NodeExecutionMetadata().GetLabels()["node-id"]) assert.Equal(t, "false", nCtx.NodeExecutionMetadata().GetLabels()["interruptible"]) assert.Equal(t, "task-name", nCtx.NodeExecutionMetadata().GetLabels()["task-name"]) @@ -127,7 +127,6 @@ func Test_NodeContextDefault(t *testing.T) { nodeExecutor := nodeExecutor{ interruptibleFailureThreshold: 0, - maxDatasetSizeBytes: 0, defaultDataSandbox: "s3://bucket-a", store: dataStore, shardSelector: ioutils.NewConstantShardSelector([]string{"x"}), @@ -152,7 +151,6 @@ func Test_NodeContextDefaultInterruptible(t *testing.T) { dataStore, _ := storage.NewDataStore(&storage.Config{Type: storage.TypeMemory}, scope.NewSubScope("dataStore")) nodeExecutor := nodeExecutor{ interruptibleFailureThreshold: 10, - maxDatasetSizeBytes: 0, defaultDataSandbox: "s3://bucket-a", store: dataStore, shardSelector: ioutils.NewConstantShardSelector([]string{"x"}), @@ -414,7 +412,6 @@ func Test_NodeContext_IsInterruptible(t *testing.T) { nodeExecutor := nodeExecutor{ interruptibleFailureThreshold: tt.interruptibleFailureThreshold, maxNodeRetriesForSystemFailures: tt.maxSystemFailures, - maxDatasetSizeBytes: 0, defaultDataSandbox: "s3://bucket-a", store: dataStore, shardSelector: ioutils.NewConstantShardSelector([]string{"x"}), diff --git a/flytepropeller/pkg/controller/nodes/subworkflow/handler_test.go b/flytepropeller/pkg/controller/nodes/subworkflow/handler_test.go index 6bf6781eac..c47c39cde8 100644 --- a/flytepropeller/pkg/controller/nodes/subworkflow/handler_test.go +++ b/flytepropeller/pkg/controller/nodes/subworkflow/handler_test.go @@ -100,7 +100,6 @@ func createNodeContextWithVersion(phase v1alpha1.WorkflowNodePhase, n v1alpha1.E nCtx.OnNodeExecutionMetadata().Return(nm) nCtx.OnInputReader().Return(ir) nCtx.OnCurrentAttempt().Return(uint32(1)) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeID().Return(n.GetID()) nCtx.OnEnqueueOwnerFunc().Return(nil) nCtx.OnNodeStatus().Return(s) diff --git a/flytepropeller/pkg/controller/nodes/task/handler_test.go b/flytepropeller/pkg/controller/nodes/task/handler_test.go index 91c0879759..f0e177838f 100644 --- a/flytepropeller/pkg/controller/nodes/task/handler_test.go +++ b/flytepropeller/pkg/controller/nodes/task/handler_test.go @@ -490,7 +490,6 @@ func Test_task_Handle_NoCatalog(t *testing.T) { nCtx.OnDataStore().Return(ds) nCtx.OnCurrentAttempt().Return(uint32(1)) nCtx.OnTaskReader().Return(tr) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeStatus().Return(ns) nCtx.OnNodeID().Return(nodeID) nCtx.OnEventsRecorder().Return(recorder) @@ -806,7 +805,6 @@ func Test_task_Abort(t *testing.T) { nCtx.OnDataStore().Return(ds) nCtx.OnCurrentAttempt().Return(uint32(1)) nCtx.OnTaskReader().Return(tr) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeStatus().Return(ns) nCtx.OnNodeID().Return("n1") nCtx.OnEnqueueOwnerFunc().Return(nil) @@ -968,7 +966,6 @@ func Test_task_Abort_v1(t *testing.T) { nCtx.OnDataStore().Return(ds) nCtx.OnCurrentAttempt().Return(uint32(1)) nCtx.OnTaskReader().Return(tr) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeStatus().Return(ns) nCtx.OnNodeID().Return("n1") nCtx.OnEnqueueOwnerFunc().Return(nil) @@ -1150,7 +1147,6 @@ func Test_task_Finalize(t *testing.T) { nCtx.OnDataStore().Return(ds) nCtx.OnCurrentAttempt().Return(uint32(1)) nCtx.OnTaskReader().Return(tr) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeStatus().Return(ns) nCtx.OnNodeID().Return("n1") nCtx.OnEventsRecorder().Return(nil) diff --git a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager.go b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager.go index f32651caa4..95975da7b4 100644 --- a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager.go +++ b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager.go @@ -289,7 +289,7 @@ func (e *PluginManager) checkResourcePhase(ctx context.Context, tCtx pluginsCore var opReader io.OutputReader if pCtx.ow == nil { logger.Infof(ctx, "Plugin [%s] returned no outputReader, assuming file based outputs", e.id) - opReader = ioutils.NewRemoteFileOutputReader(ctx, tCtx.DataStore(), tCtx.OutputWriter(), tCtx.MaxDatasetSizeBytes()) + opReader = ioutils.NewRemoteFileOutputReader(ctx, tCtx.DataStore(), tCtx.OutputWriter(), 0) } else { logger.Infof(ctx, "Plugin [%s] returned outputReader", e.id) opReader = pCtx.ow.GetReader() diff --git a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager_test.go b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager_test.go index 2c7fda0f6e..3a2b00508c 100644 --- a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager_test.go +++ b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager_test.go @@ -190,7 +190,6 @@ func getMockTaskContext(initPhase PluginPhase, wantPhase PluginPhase) pluginsCor taskExecutionContext.OnOutputWriter().Return(&dummyOutputWriter{}) taskExecutionContext.OnDataStore().Return(nil) - taskExecutionContext.OnMaxDatasetSizeBytes().Return(int64(0)) return taskExecutionContext } diff --git a/flytepropeller/pkg/controller/nodes/task/taskexec_context_test.go b/flytepropeller/pkg/controller/nodes/task/taskexec_context_test.go index 84245cea8f..e798f82a04 100644 --- a/flytepropeller/pkg/controller/nodes/task/taskexec_context_test.go +++ b/flytepropeller/pkg/controller/nodes/task/taskexec_context_test.go @@ -87,7 +87,6 @@ func dummyNodeExecutionContext(t *testing.T, parentInfo executors.ImmutableParen nCtx.OnInputReader().Return(ir) nCtx.OnCurrentAttempt().Return(uint32(1)) nCtx.OnTaskReader().Return(tr) - nCtx.OnMaxDatasetSizeBytes().Return(int64(1)) nCtx.OnNodeStatus().Return(ns) nCtx.OnNodeID().Return(nodeID) nCtx.OnEventsRecorder().Return(nil) @@ -162,7 +161,6 @@ func TestHandler_newTaskExecutionContext(t *testing.T) { assert.NotNil(t, got.psm.newState) assert.NotNil(t, got.TaskReader()) - assert.Equal(t, got.MaxDatasetSizeBytes(), int64(1)) assert.NotNil(t, got.SecretManager()) assert.NotNil(t, got.OutputWriter()) diff --git a/flytepropeller/pkg/controller/workflow/executor_test.go b/flytepropeller/pkg/controller/workflow/executor_test.go index 4050e41582..85667b0e26 100644 --- a/flytepropeller/pkg/controller/workflow/executor_test.go +++ b/flytepropeller/pkg/controller/workflow/executor_test.go @@ -59,7 +59,6 @@ var ( ) const ( - maxOutputSize = 10 * 1024 testClusterID = "C1" ) @@ -100,7 +99,7 @@ func (f fakeRemoteWritePlugin) Handle(ctx context.Context, tCtx pluginCore.TaskE o.Literals[k] = l } assert.NoError(f.t, tCtx.DataStore().WriteProtobuf(ctx, tCtx.OutputWriter().GetOutputPath(), storage.Options{}, o)) - assert.NoError(f.t, tCtx.OutputWriter().Put(ctx, ioutils.NewRemoteFileOutputReader(ctx, tCtx.DataStore(), tCtx.OutputWriter(), tCtx.MaxDatasetSizeBytes()))) + assert.NoError(f.t, tCtx.OutputWriter().Put(ctx, ioutils.NewRemoteFileOutputReader(ctx, tCtx.DataStore(), tCtx.OutputWriter(), 0))) } return trns, err } @@ -247,7 +246,7 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_Error(t *testing.T) { assert.NoError(t, err) nodeExec, err := nodes.NewExecutor(ctx, config.GetConfig().NodeConfig, store, enqueueWorkflow, eventSink, adminClient, adminClient, - maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) assert.NoError(t, err) execStatsHolder, err := execStats.NewExecutionStatsHolder() @@ -333,7 +332,7 @@ func TestWorkflowExecutor_HandleFlyteWorkflow(t *testing.T) { assert.NoError(t, err) nodeExec, err := nodes.NewExecutor(ctx, config.GetConfig().NodeConfig, store, enqueueWorkflow, eventSink, adminClient, adminClient, - maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) assert.NoError(t, err) execStatsHolder, err := execStats.NewExecutionStatsHolder() @@ -399,7 +398,7 @@ func BenchmarkWorkflowExecutor(b *testing.B) { adminClient := launchplan.NewFailFastLaunchPlanExecutor() handlerFactory := &nodemocks.HandlerFactory{} nodeExec, err := nodes.NewExecutor(ctx, config.GetConfig().NodeConfig, store, enqueueWorkflow, eventSink, adminClient, adminClient, - maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, scope) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, scope) assert.NoError(b, err) execStatsHolder, err := execStats.NewExecutionStatsHolder() @@ -513,7 +512,7 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_Failing(t *testing.T) { handlerFactory.OnGetHandlerMatch(mock.Anything).Return(h, nil) nodeExec, err := nodes.NewExecutor(ctx, config.GetConfig().NodeConfig, store, enqueueWorkflow, eventSink, adminClient, adminClient, - maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) assert.NoError(t, err) execStatsHolder, err := execStats.NewExecutionStatsHolder() @@ -618,7 +617,7 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_Events(t *testing.T) { assert.NoError(t, err) nodeExec, err := nodes.NewExecutor(ctx, config.GetConfig().NodeConfig, store, enqueueWorkflow, eventSink, adminClient, adminClient, - maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) assert.NoError(t, err) execStatsHolder, err := execStats.NewExecutionStatsHolder() assert.NoError(t, err) @@ -686,7 +685,7 @@ func TestWorkflowExecutor_HandleFlyteWorkflow_EventFailure(t *testing.T) { handlerFactory.OnSetupMatch(mock.Anything, mock.Anything, mock.Anything).Return(nil) handlerFactory.OnGetHandlerMatch(mock.Anything).Return(h, nil) nodeExec, err := nodes.NewExecutor(ctx, config.GetConfig().NodeConfig, store, enqueueWorkflow, nodeEventSink, adminClient, adminClient, - maxOutputSize, "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) + "s3://bucket", fakeKubeClient, catalogClient, recoveryClient, eventConfig, testClusterID, signalClient, handlerFactory, promutils.NewTestScope()) assert.NoError(t, err) t.Run("EventAlreadyInTerminalStateError", func(t *testing.T) { From e8588f3a04995a420559327e78c3f95fbf64dc01 Mon Sep 17 00:00:00 2001 From: Dan Rammer Date: Fri, 19 Apr 2024 12:40:39 -0500 Subject: [PATCH 442/645] Fix support for limit-namespace in FlytePropeller (#5238) Signed-off-by: Daniel Rammer --- .../nodes/task/k8s/plugin_collector.go | 58 ++++++++---------- .../nodes/task/k8s/plugin_collector_test.go | 59 ++++++++----------- .../nodes/task/k8s/plugin_manager.go | 23 +------- .../nodes/task/k8s/plugin_manager_test.go | 5 +- 4 files changed, 54 insertions(+), 91 deletions(-) diff --git a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_collector.go b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_collector.go index e747c65785..caf7c81721 100644 --- a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_collector.go +++ b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_collector.go @@ -7,9 +7,9 @@ import ( "sync" "time" - "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/tools/cache" + "sigs.k8s.io/controller-runtime/pkg/cache" "github.com/flyteorg/flyte/flytestdlib/contextutils" "github.com/flyteorg/flyte/flytestdlib/logger" @@ -33,8 +33,8 @@ type ResourceLevelMonitor struct { // to monitor current levels. Levels *labeled.Gauge - // This informer will be used to get a list of the underlying objects that we want a tally of - sharedInformer cache.SharedIndexInformer + // cache is used to retrieve the object lists + cache cache.Cache // The kind here will be used to differentiate all the metrics, we'll leave out group and version for now gvk schema.GroupVersionKind @@ -45,36 +45,30 @@ type ResourceLevelMonitor struct { once sync.Once } -// The reason that we use namespace as the one and only thing to cut by is because it's the feature that we are sure that any -// K8s resource created by a plugin will have (as yet, Flyte doesn't have any plugins that create cluster level resources and -// it probably won't for a long time). We can't assume that all the operators and CRDs that Flyte will ever work with will have -// the exact same set of labels or annotations or owner references. The only thing we can really count on is namespace. -func (r *ResourceLevelMonitor) countList(ctx context.Context, objects []interface{}) map[string]int { - // Map of namespace to counts - counts := map[string]int{} - - // Collect the object counts by namespace - for _, v := range objects { - metadata, err := meta.Accessor(v) - if err != nil { - logger.Errorf(ctx, "Error converting obj %v to an Accessor %s\n", v, err) - continue - } - counts[metadata.GetNamespace()]++ - } - - return counts -} - // The context here is expected to already have a value for the KindKey func (r *ResourceLevelMonitor) collect(ctx context.Context) { // Emit gauges at the namespace layer - since these are just K8s resources, we cannot be guaranteed to have the necessary // information to derive project/domain - objects := r.sharedInformer.GetStore().List() - counts := r.countList(ctx, objects) + list := metav1.PartialObjectMetadataList{ + TypeMeta: metav1.TypeMeta{ + Kind: r.gvk.Kind, + APIVersion: r.gvk.Version, + }, + } + if err := r.cache.List(ctx, &list); err != nil { + logger.Warnf(ctx, "failed to list objects for %s.%s: %v", r.gvk.Kind, r.gvk.Version, err) + return + } + + // aggregate the object counts by namespace + namespaceCounts := map[string]int{} + for _, item := range list.Items { + namespaceCounts[item.GetNamespace()]++ + } - for ns, count := range counts { - withNamespaceCtx := contextutils.WithNamespace(ctx, ns) + // emit namespace object count metrics + for namespace, count := range namespaceCounts { + withNamespaceCtx := contextutils.WithNamespace(ctx, namespace) r.Levels.Set(withNamespaceCtx, float64(count)) } } @@ -89,7 +83,7 @@ func (r *ResourceLevelMonitor) RunCollector(ctx context.Context) { go func() { defer ticker.Stop() pprof.SetGoroutineLabels(collectorCtx) - r.sharedInformer.HasSynced() + r.cache.WaitForCacheSync(collectorCtx) logger.Infof(ctx, "K8s resource collector %s has synced", r.gvk.Kind) for { select { @@ -125,7 +119,7 @@ type ResourceMonitorIndex struct { stopwatches map[promutils.Scope]*labeled.StopWatch } -func (r *ResourceMonitorIndex) GetOrCreateResourceLevelMonitor(ctx context.Context, scope promutils.Scope, si cache.SharedIndexInformer, +func (r *ResourceMonitorIndex) GetOrCreateResourceLevelMonitor(ctx context.Context, scope promutils.Scope, cache cache.Cache, gvk schema.GroupVersionKind) *ResourceLevelMonitor { logger.Infof(ctx, "Attempting to create K8s gauge emitter for kind %s/%s", gvk.Version, gvk.Kind) @@ -157,7 +151,7 @@ func (r *ResourceMonitorIndex) GetOrCreateResourceLevelMonitor(ctx context.Conte Scope: scope, CollectorTimer: r.stopwatches[scope], Levels: r.gauges[scope], - sharedInformer: si, + cache: cache, gvk: gvk, } r.monitors[gvk] = rm diff --git a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_collector_test.go b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_collector_test.go index 2dcec03e16..46a3ad1ddb 100644 --- a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_collector_test.go +++ b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_collector_test.go @@ -11,7 +11,8 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/tools/cache" + "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/client" "github.com/flyteorg/flyte/flytestdlib/promutils" ) @@ -37,34 +38,29 @@ var pods = []interface{}{ }, } -func TestNewResourceLevelMonitor(t *testing.T) { - x := v1.Pod{} - x.GetObjectMeta() - lm := ResourceLevelMonitor{} - res := lm.countList(context.Background(), pods) - assert.Equal(t, 2, res["ns-a"]) - assert.Equal(t, 1, res["ns-b"]) +type MyFakeCache struct { + cache.Cache } -type MyFakeInformer struct { - cache.SharedIndexInformer - store cache.Store -} - -func (m MyFakeInformer) GetStore() cache.Store { - return m.store -} +func (m MyFakeCache) List(_ context.Context, list client.ObjectList, _ ...client.ListOption) error { + objectMetadataList, ok := list.(*metav1.PartialObjectMetadataList) + if !ok { + return fmt.Errorf("unexpected type %T", list) + } -func (m MyFakeInformer) HasSynced() bool { - return true -} + objectMetadataList.Items = make([]metav1.PartialObjectMetadata, 0) + for _, pod := range pods { + objectMetadataList.Items = append(objectMetadataList.Items, metav1.PartialObjectMetadata{ + TypeMeta: objectMetadataList.TypeMeta, + ObjectMeta: pod.(*v1.Pod).ObjectMeta, + }) + } -type MyFakeStore struct { - cache.Store + return nil } -func (m MyFakeStore) List() []interface{} { - return pods +func (m MyFakeCache) WaitForCacheSync(_ context.Context) bool { + return true } func TestResourceLevelMonitor_collect(t *testing.T) { @@ -73,12 +69,10 @@ func TestResourceLevelMonitor_collect(t *testing.T) { kinds, _, err := scheme.Scheme.ObjectKinds(&v1.Pod{}) assert.NoError(t, err) - myInformer := MyFakeInformer{ - store: MyFakeStore{}, - } + myCache := MyFakeCache{} index := NewResourceMonitorIndex() - rm := index.GetOrCreateResourceLevelMonitor(ctx, scope, myInformer, kinds[0]) + rm := index.GetOrCreateResourceLevelMonitor(ctx, scope, myCache, kinds[0]) rm.collect(ctx) var expected = ` @@ -98,14 +92,11 @@ func TestResourceLevelMonitorSingletonness(t *testing.T) { kinds, _, err := scheme.Scheme.ObjectKinds(&v1.Pod{}) assert.NoError(t, err) - myInformer := MyFakeInformer{ - store: MyFakeStore{}, - } + myCache := MyFakeCache{} index := NewResourceMonitorIndex() - rm := index.GetOrCreateResourceLevelMonitor(ctx, scope, myInformer, kinds[0]) - fmt.Println(rm) - //rm2 := index.GetOrCreateResourceLevelMonitor(ctx, scope, myInformer, kinds[0]) + rm := index.GetOrCreateResourceLevelMonitor(ctx, scope, myCache, kinds[0]) + rm2 := index.GetOrCreateResourceLevelMonitor(ctx, scope, myCache, kinds[0]) - //assert.Equal(t, rm, rm2) + assert.Equal(t, rm, rm2) } diff --git a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager.go b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager.go index 95975da7b4..f9c3806ee6 100644 --- a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager.go +++ b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager.go @@ -3,7 +3,6 @@ package k8s import ( "context" "fmt" - "reflect" "time" "golang.org/x/time/rate" @@ -16,7 +15,6 @@ import ( "k8s.io/apimachinery/pkg/util/validation" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/workqueue" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/event" @@ -641,11 +639,8 @@ func NewPluginManager(ctx context.Context, iCtx pluginsCore.SetupContext, entry } // Construct the collector that will emit a gauge indicating current levels of the resource that this K8s plugin operates on - pluginInformer, err := getPluginSharedInformer(ctx, kubeClient, entry.ResourceToWatch) - if err != nil { - return nil, err - } - rm := monitorIndex.GetOrCreateResourceLevelMonitor(ctx, metricsScope, pluginInformer, gvk) + rm := monitorIndex.GetOrCreateResourceLevelMonitor(ctx, metricsScope, kubeClient.GetCache(), gvk) + // Start the poller and gauge emitter rm.RunCollectorOnce(ctx) @@ -667,17 +662,3 @@ func getPluginGvk(resourceToWatch runtime.Object) (schema.GroupVersionKind, erro } return kinds[0], nil } - -func getPluginSharedInformer(ctx context.Context, kubeClient pluginsCore.KubeClient, resourceToWatch client.Object) (cache.SharedIndexInformer, error) { - i, err := kubeClient.GetCache().GetInformer(ctx, resourceToWatch) - if err != nil { - return nil, errors.Wrapf(errors.PluginInitializationFailed, err, "Error getting informer for %s", reflect.TypeOf(i)) - } - - si, casted := i.(cache.SharedIndexInformer) - if !casted { - return nil, errors.Errorf(errors.PluginInitializationFailed, "wrong type. Actual: %v", reflect.TypeOf(i)) - } - - return si, nil -} diff --git a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager_test.go b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager_test.go index 3a2b00508c..73d00a6062 100644 --- a/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager_test.go +++ b/flytepropeller/pkg/controller/nodes/task/k8s/plugin_manager_test.go @@ -990,10 +990,7 @@ func TestResourceManagerConstruction(t *testing.T) { gvk, err := getPluginGvk(&v1.Pod{}) assert.NoError(t, err) assert.Equal(t, gvk.Kind, "Pod") - si, err := getPluginSharedInformer(ctx, fakeKubeClient, &v1.Pod{}) - assert.NotNil(t, si) - assert.NoError(t, err) - rm := index.GetOrCreateResourceLevelMonitor(ctx, scope, si, gvk) + rm := index.GetOrCreateResourceLevelMonitor(ctx, scope, fakeKubeClient.GetCache(), gvk) assert.NotNil(t, rm) } From 7e99ba4d58ded21ef07c0250b0536d5618ba8e62 Mon Sep 17 00:00:00 2001 From: Nikki Everett Date: Fri, 19 Apr 2024 13:18:27 -0500 Subject: [PATCH 443/645] [WAIT TO MERGE] Use remoteliteralinclude for code in user guide docs (#5207) * first commit Signed-off-by: nikki everett * update raw flytesnacks urls Signed-off-by: nikki everett * switch to remoteliteralinclude Signed-off-by: nikki everett * switch basics docs to remoteliteralinclude Signed-off-by: nikki everett * updates Signed-off-by: nikki everett * add example code links Signed-off-by: nikki everett * update flytesnacks links Signed-off-by: nikki everett * update flytesnacks links in basics docs Signed-off-by: nikki everett * fix links again Signed-off-by: nikki everett * clean up customizing dependencies files Signed-off-by: nikki everett * clean up data types and I/O files Signed-off-by: nikki everett * clean up development lifecycle files Signed-off-by: nikki everett * clean up extending files Signed-off-by: nikki everett * clean up productionizing files Signed-off-by: nikki everett * clean up testing files Signed-off-by: nikki everett * fix rli Signed-off-by: nikki everett --------- Signed-off-by: nikki everett --- .../chaining_flyte_entities.md | 84 +------ .../advanced_composition/conditionals.md | 222 +++--------------- .../advanced_composition/decorating_tasks.md | 107 +++------ .../decorating_workflows.md | 131 ++--------- .../advanced_composition/dynamic_workflows.md | 121 +++------- .../advanced_composition/eager_workflows.md | 200 +++------------- .../intratask_checkpoints.md | 87 ++----- .../advanced_composition/map_tasks.md | 152 +++--------- .../advanced_composition/subworkflows.md | 119 ++-------- .../waiting_for_external_inputs.md | 154 ++---------- .../basics/documenting_workflows.md | 115 ++------- docs/user_guide/basics/hello_world.md | 68 ++---- .../user_guide/basics/imperative_workflows.md | 91 +++---- docs/user_guide/basics/launch_plans.md | 95 +++----- docs/user_guide/basics/named_outputs.md | 90 ++----- docs/user_guide/basics/shell_tasks.md | 135 ++--------- docs/user_guide/basics/tasks.md | 56 ++--- docs/user_guide/basics/workflows.md | 101 +++----- .../customizing_dependencies/imagespec.md | 103 ++------ .../multiple_images_in_a_workflow.md | 51 +--- .../raw_containers.md | 170 ++------------ .../data_types_and_io/accessing_attributes.md | 137 ++--------- .../user_guide/data_types_and_io/dataclass.md | 136 ++--------- .../user_guide/data_types_and_io/enum_type.md | 83 ++----- .../data_types_and_io/flytedirectory.md | 158 ++----------- .../user_guide/data_types_and_io/flytefile.md | 149 ++---------- .../data_types_and_io/pickle_type.md | 93 ++------ .../data_types_and_io/pytorch_type.md | 151 ++---------- .../data_types_and_io/structureddataset.md | 204 ++++------------ .../cache_serializing.md | 50 +--- .../development_lifecycle/caching.md | 155 ++---------- .../creating_a_new_project.md | 17 -- .../debugging_executions.md | 17 -- .../user_guide/development_lifecycle/decks.md | 182 +++----------- .../development_lifecycle/failure_node.md | 75 ++---- .../inspecting_executions.md | 17 -- .../development_lifecycle/private_images.md | 17 -- .../running_launch_plans.md | 17 -- .../development_lifecycle/running_tasks.md | 17 -- .../running_workflows.md | 17 -- docs/user_guide/environment_setup.md | 4 +- docs/user_guide/extending/backend_plugins.md | 18 -- .../extending/container_interface.md | 17 -- docs/user_guide/extending/custom_types.md | 162 ++----------- .../prebuilt_container_task_plugins.md | 17 -- .../extending/user_container_task_plugins.md | 116 ++------- .../configuring_access_to_gpus.md | 17 -- .../configuring_logging_links_in_the_ui.md | 29 +-- .../customizing_task_resources.md | 136 ++++------- .../productionizing/notifications.md | 123 ++-------- .../productionizing/reference_launch_plans.md | 59 +---- .../productionizing/reference_tasks.md | 62 +---- docs/user_guide/productionizing/schedules.md | 103 ++------ docs/user_guide/productionizing/secrets.md | 159 +++---------- .../productionizing/spot_instances.md | 28 +-- .../workflow_labels_and_annotations.md | 17 -- docs/user_guide/testing/mocking_tasks.md | 108 +++------ 57 files changed, 1028 insertions(+), 4291 deletions(-) diff --git a/docs/user_guide/advanced_composition/chaining_flyte_entities.md b/docs/user_guide/advanced_composition/chaining_flyte_entities.md index f51b45a2d0..29bc71e1bf 100644 --- a/docs/user_guide/advanced_composition/chaining_flyte_entities.md +++ b/docs/user_guide/advanced_composition/chaining_flyte_entities.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (chain_flyte_entities)= # Chaining Flyte entities @@ -28,68 +9,27 @@ kernelspec: Flytekit offers a mechanism for chaining Flyte entities using the `>>` operator. This is particularly valuable when chaining tasks and subworkflows without the need for data flow between the entities. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` + ## Tasks Let's establish a sequence where `t1()` occurs after `t0()`, and `t2()` follows `t1()`. - -```{code-cell} -from flytekit import task, workflow - - -@task -def t2(): - print("Running t2") - return - - -@task -def t1(): - print("Running t1") - return - - -@task -def t0(): - print("Running t0") - return - - -@workflow -def chain_tasks_wf(): - t2_promise = t2() - t1_promise = t1() - t0_promise = t0() - - t0_promise >> t1_promise - t1_promise >> t2_promise + +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/chain_entities.py +:caption: advanced_composition/chain_entities.py +:lines: 1-30 ``` -+++ {"lines_to_next_cell": 0} - (chain_subworkflow)= ## Subworkflows Just like tasks, you can chain {ref}`subworkflows `. -```{code-cell} -:lines_to_next_cell: 2 - -@workflow -def sub_workflow_1(): - t1() - - -@workflow -def sub_workflow_0(): - t0() - - -@workflow -def chain_workflows_wf(): - sub_wf1 = sub_workflow_1() - sub_wf0 = sub_workflow_0() - - sub_wf0 >> sub_wf1 +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/chain_entities.py +:caption: advanced_composition/chain_entities.py +:lines: 34-49 ``` To run the provided workflows on the Flyte cluster, use the following commands: @@ -110,3 +50,5 @@ pyflyte run --remote \ Chaining tasks and subworkflows is not supported in local environments. Follow the progress of this issue [here](https://github.com/flyteorg/flyte/issues/4080). ::: + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/advanced_composition/ diff --git a/docs/user_guide/advanced_composition/conditionals.md b/docs/user_guide/advanced_composition/conditionals.md index 88c447a05c..e73b81e5ed 100644 --- a/docs/user_guide/advanced_composition/conditionals.md +++ b/docs/user_guide/advanced_composition/conditionals.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (conditional)= # Conditionals @@ -31,76 +12,39 @@ received as workflow inputs. While conditions are highly performant in their eva it's important to note that they are restricted to specific binary and logical operators and are applicable only to primitive values. -To begin, import the necessary libraries. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -import random +To begin, import the necessary libraries. -from flytekit import conditional, task, workflow +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py +:caption: advanced_composition/conditional.py +:lines: 1-3 ``` -+++ {"lines_to_next_cell": 0} - ## Simple branch In this example, we introduce two tasks, `calculate_circle_circumference` and `calculate_circle_area`. The workflow dynamically chooses between these tasks based on whether the input falls within the fraction range (0-1) or not. -```{code-cell} -@task -def calculate_circle_circumference(radius: float) -> float: - return 2 * 3.14 * radius # Task to calculate the circumference of a circle - - -@task -def calculate_circle_area(radius: float) -> float: - return 3.14 * radius * radius # Task to calculate the area of a circle - - -@workflow -def shape_properties(radius: float) -> float: - return ( - conditional("shape_properties") - .if_((radius >= 0.1) & (radius < 1.0)) - .then(calculate_circle_circumference(radius=radius)) - .else_() - .then(calculate_circle_area(radius=radius)) - ) - - -if __name__ == "__main__": - radius_small = 0.5 - print(f"Circumference of circle (radius={radius_small}): {shape_properties(radius=radius_small)}") - - radius_large = 3.0 - print(f"Area of circle (radius={radius_large}): {shape_properties(radius=radius_large)}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py +:caption: advanced_composition/conditional.py +:lines: 11-37 ``` -+++ {"lines_to_next_cell": 0} - ## Multiple branches We establish an `if` condition with multiple branches, which will result in a failure if none of the conditions is met. It's important to note that any `conditional` statement in Flyte is expected to be complete, meaning that all possible branches must be accounted for. -```{code-cell} -@workflow -def shape_properties_with_multiple_branches(radius: float) -> float: - return ( - conditional("shape_properties_with_multiple_branches") - .if_((radius >= 0.1) & (radius < 1.0)) - .then(calculate_circle_circumference(radius=radius)) - .elif_((radius >= 1.0) & (radius <= 10.0)) - .then(calculate_circle_area(radius=radius)) - .else_() - .fail("The input must be within the range of 0 to 10.") - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py +:caption: advanced_composition/conditional.py +:pyobject: shape_properties_with_multiple_branches ``` -+++ {"lines_to_next_cell": 0} - :::{note} Take note of the usage of bitwise operators (`&`). Due to Python's PEP-335, the logical `and`, `or` and `not` operators cannot be overloaded. @@ -111,69 +55,22 @@ a convention also observed in other libraries. ## Consuming the output of a conditional Here, we write a task that consumes the output returned by a `conditional`. -```{code-cell} -@workflow -def shape_properties_accept_conditional_output(radius: float) -> float: - result = ( - conditional("shape_properties_accept_conditional_output") - .if_((radius >= 0.1) & (radius < 1.0)) - .then(calculate_circle_circumference(radius=radius)) - .elif_((radius >= 1.0) & (radius <= 10.0)) - .then(calculate_circle_area(radius=radius)) - .else_() - .fail("The input must exist between 0 and 10.") - ) - return calculate_circle_area(radius=result) - - -if __name__ == "__main__": - print(f"Circumference of circle x Area of circle (radius={radius_small}): {shape_properties(radius=5.0)}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py +:caption: advanced_composition/conditional.py +:lines: 66-81 ``` -+++ {"lines_to_next_cell": 0} - ## Using the output of a previous task in a conditional You can check if a boolean returned from the previous task is `True`, but unary operations are not supported directly. Instead, use the `is_true`, `is_false` and `is_none` methods on the result. -```{code-cell} -@task -def coin_toss(seed: int) -> bool: - """ - Mimic a condition to verify the successful execution of an operation - """ - r = random.Random(seed) - if r.random() < 0.5: - return True - return False - - -@task -def failed() -> int: - """ - Mimic a task that handles failure - """ - return -1 - - -@task -def success() -> int: - """ - Mimic a task that handles success - """ - return 0 - - -@workflow -def boolean_wf(seed: int = 5) -> int: - result = coin_toss(seed=seed) - return conditional("coin_toss").if_(result.is_true()).then(success()).else_().then(failed()) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py +:caption: advanced_composition/conditional.py +:lines: 89-119 ``` -+++ {"lines_to_next_cell": 0} - :::{note} *How do output values acquire these methods?* In a workflow, direct access to outputs is not permitted. Inputs and outputs are automatically encapsulated in a special object known as {py:class}`flytekit.extend.Promise`. @@ -182,14 +79,11 @@ Inputs and outputs are automatically encapsulated in a special object known as { ## Using boolean workflow inputs in a conditional You can directly pass a boolean to a workflow. -```{code-cell} -@workflow -def boolean_input_wf(boolean_input: bool) -> int: - return conditional("boolean_input_conditional").if_(boolean_input.is_true()).then(success()).else_().then(failed()) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py +:caption: advanced_composition/conditional.py +:pyobject: boolean_input_wf ``` -+++ {"lines_to_next_cell": 0} - :::{note} Observe that the passed boolean possesses a method called `is_true`. This boolean resides within the workflow context and is encapsulated in a specialized Flytekit object. @@ -198,82 +92,36 @@ This special object enables it to exhibit additional behavior. You can run the workflows locally as follows: -```{code-cell} -if __name__ == "__main__": - print("Running boolean_wf a few times...") - for index in range(0, 5): - print(f"The output generated by boolean_wf = {boolean_wf(seed=index)}") - print( - f"Boolean input: {True if index < 2 else False}; workflow output: {boolean_input_wf(boolean_input=True if index < 2 else False)}" - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py +:caption: advanced_composition/conditional.py +:lines: 129-135 ``` -+++ {"lines_to_next_cell": 0} - ## Nested conditionals You can nest conditional sections arbitrarily inside other conditional sections. However, these nested sections can only be in the `then` part of a `conditional` block. -```{code-cell} -@workflow -def nested_conditions(radius: float) -> float: - return ( - conditional("nested_conditions") - .if_((radius >= 0.1) & (radius < 1.0)) - .then( - conditional("inner_nested_conditions") - .if_(radius < 0.5) - .then(calculate_circle_circumference(radius=radius)) - .elif_((radius >= 0.5) & (radius < 0.9)) - .then(calculate_circle_area(radius=radius)) - .else_() - .fail("0.9 is an outlier.") - ) - .elif_((radius >= 1.0) & (radius <= 10.0)) - .then(calculate_circle_area(radius=radius)) - .else_() - .fail("The input must be within the range of 0 to 10.") - ) - - -if __name__ == "__main__": - print(f"nested_conditions(0.4): {nested_conditions(radius=0.4)}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py +:caption: advanced_composition/conditional.py +:lines: 142-164 ``` -+++ {"lines_to_next_cell": 0} - ## Using the output of a task in a conditional Let's write a fun workflow that triggers the `calculate_circle_circumference` task in the event of a "heads" outcome, and alternatively, runs the `calculate_circle_area` task in the event of a "tail" outcome. -```{code-cell} -@workflow -def consume_task_output(radius: float, seed: int = 5) -> float: - is_heads = coin_toss(seed=seed) - return ( - conditional("double_or_square") - .if_(is_heads.is_true()) - .then(calculate_circle_circumference(radius=radius)) - .else_() - .then(calculate_circle_area(radius=radius)) - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py +:caption: advanced_composition/conditional.py +:pyobject: consume_task_output ``` -+++ {"lines_to_next_cell": 0} - You can run the workflow locally as follows: -```{code-cell} -if __name__ == "__main__": - default_seed_output = consume_task_output(radius=0.4) - print( - f"Executing consume_task_output(0.4) with default seed=5. Expected output: calculate_circle_circumference => {default_seed_output}" - ) - - custom_seed_output = consume_task_output(radius=0.4, seed=7) - print(f"Executing consume_task_output(0.4, seed=7). Expected output: calculate_circle_area => {custom_seed_output}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py +:caption: advanced_composition/conditional.py +:lines: 181-188 ``` ## Run the example on the Flyte cluster @@ -321,3 +169,5 @@ pyflyte run --remote \ https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/conditional.py \ consume_task_output --radius 0.4 --seed 7 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/advanced_composition diff --git a/docs/user_guide/advanced_composition/decorating_tasks.md b/docs/user_guide/advanced_composition/decorating_tasks.md index 50135ee8ab..87141d4cc0 100644 --- a/docs/user_guide/advanced_composition/decorating_tasks.md +++ b/docs/user_guide/advanced_composition/decorating_tasks.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (decorating_tasks)= # Decorating tasks @@ -30,58 +11,44 @@ You can easily change how tasks behave by using decorators to wrap your task fun In order to make sure that your decorated function contains all the type annotation and docstring information that Flyte needs, you will need to use the built-in {py:func}`~functools.wraps` decorator. -To begin, import the required dependencies. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -import logging -from functools import partial, wraps +To begin, import the required dependencies. -from flytekit import task, workflow +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_tasks.py +:caption: advanced_composition/decorating_tasks.py +:lines: 1-4 ``` -+++ {"lines_to_next_cell": 0} - Create a logger to monitor the execution's progress. -```{code-cell} -logger = logging.getLogger(__file__) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_tasks.py +:caption: advanced_composition/decorating_tasks.py +:lines: 7 ``` -+++ {"lines_to_next_cell": 0} - ## Using a single decorator We define a decorator that logs the input and output details for a decorated task. -```{code-cell} -def log_io(fn): - @wraps(fn) - def wrapper(*args, **kwargs): - logger.info(f"task {fn.__name__} called with args: {args}, kwargs: {kwargs}") - out = fn(*args, **kwargs) - logger.info(f"task {fn.__name__} output: {out}") - return out - - return wrapper +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_tasks.py +:caption: advanced_composition/decorating_tasks.py +:pyobject: log_io ``` -+++ {"lines_to_next_cell": 0} - We create a task named `t1` that is decorated with `log_io`. :::{note} The order of invoking the decorators is important. `@task` should always be the outer-most decorator. ::: -```{code-cell} -@task -@log_io -def t1(x: int) -> int: - return x + 1 +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_tasks.py +:caption: advanced_composition/decorating_tasks.py +:pyobject: t1 ``` -+++ {"lines_to_next_cell": 0} - (stacking_decorators)= ## Stacking multiple decorators @@ -91,49 +58,27 @@ You can also stack multiple decorators on top of each other as long as `@task` i We define a decorator that verifies if the output from the decorated function is a positive number before it's returned. If this assumption is violated, it raises a `ValueError` exception. -```{code-cell} -def validate_output(fn=None, *, floor=0): - @wraps(fn) - def wrapper(*args, **kwargs): - out = fn(*args, **kwargs) - if out <= floor: - raise ValueError(f"output of task {fn.__name__} must be a positive number, found {out}") - return out - - if fn is None: - return partial(validate_output, floor=floor) - - return wrapper +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_tasks.py +:caption: advanced_composition/decorating_tasks.py +:pyobject: validate_output ``` -+++ {"lines_to_next_cell": 0} - :::{note} The output of the `validate_output` task uses {py:func}`~functools.partial` to implement parameterized decorators. ::: We define a function that uses both the logging and validator decorators. -```{code-cell} -@task -@log_io -@validate_output(floor=10) -def t2(x: int) -> int: - return x + 10 +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_tasks.py +:caption: advanced_composition/decorating_tasks.py +:pyobject: t2 ``` -+++ {"lines_to_next_cell": 0} - Finally, we compose a workflow that calls `t1` and `t2`. -```{code-cell} -@workflow -def decorating_task_wf(x: int) -> int: - return t2(x=t1(x=x)) - - -if __name__ == "__main__": - print(f"Running decorating_task_wf(x=10) {decorating_task_wf(x=10)}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_tasks.py +:caption: advanced_composition/decorating_tasks.py +:lines: 53-59 ``` ## Run the example on the Flyte cluster @@ -150,3 +95,5 @@ In this example, you learned how to modify the behavior of tasks via function de {py:func}`~functools.wraps` decorator pattern. To learn more about how to extend Flyte at a deeper level, for example creating custom types, custom tasks or backend plugins, see {ref}`Extending Flyte `. + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/advanced_composition/ diff --git a/docs/user_guide/advanced_composition/decorating_workflows.md b/docs/user_guide/advanced_composition/decorating_workflows.md index 3a369cc433..3cd4fda0a2 100644 --- a/docs/user_guide/advanced_composition/decorating_workflows.md +++ b/docs/user_guide/advanced_composition/decorating_workflows.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (decorating_workflows)= # Decorating workflows @@ -28,51 +9,34 @@ kernelspec: The behavior of workflows can be modified in a light-weight fashion by using the built-in {py:func}`~functools.wraps` decorator pattern, similar to using decorators to {ref}`customize task behavior `. However, unlike in the case of -tasks, we need to do a little extra work to make sure that the DAG underlying the workflow executes tasks in the -correct order. +tasks, we need to do a little extra work to make sure that the DAG underlying the workflow executes tasks in the correct order. ## Setup-teardown pattern The main use case of decorating `@workflow`-decorated functions is to establish a setup-teardown pattern to execute task before and after your main workflow logic. This is useful when integrating with other external services -like [wandb](https://wandb.ai/site) or [clearml](https://clear.ml/), which enable you to track metrics of model -training runs. +like [wandb](https://wandb.ai/site) or [clearml](https://clear.ml/), which enable you to track metrics of model training runs. -To begin, import the necessary libraries. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -from functools import partial, wraps -from unittest.mock import MagicMock +To begin, import the necessary libraries. -import flytekit -from flytekit import FlyteContextManager, task, workflow -from flytekit.core.node_creation import create_node +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_workflows.py +:caption: advanced_composition/decorating_workflows.py +:lines: 1-6 ``` -+++ {"lines_to_next_cell": 0} - Let's define the tasks we need for setup and teardown. In this example, we use the {py:class}`unittest.mock.MagicMock` class to create a fake external service that we want to initialize at the beginning of our workflow and finish at the end. -```{code-cell} -external_service = MagicMock() - - -@task -def setup(): - print("initializing external service") - external_service.initialize(id=flytekit.current_context().execution_id) - - -@task -def teardown(): - print("finish external service") - external_service.complete(id=flytekit.current_context().execution_id) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_workflows.py +:caption: advanced_composition/decorating_workflows.py +:lines: 9-21 ``` -+++ {"lines_to_next_cell": 0} - As you can see, you can even use Flytekit's current context to access the `execution_id` of the current workflow if you need to link Flyte with the external service so that you reference the same unique identifier in both the external service and Flyte. @@ -81,46 +45,11 @@ external service and Flyte. We create a decorator that we want to use to wrap our workflow function. -```{code-cell} -def setup_teardown(fn=None, *, before, after): - @wraps(fn) - def wrapper(*args, **kwargs): - # get the current flyte context to obtain access to the compilation state of the workflow DAG. - ctx = FlyteContextManager.current_context() - - # defines before node - before_node = create_node(before) - # ctx.compilation_state.nodes == [before_node] - - # under the hood, flytekit compiler defines and threads - # together nodes within the `my_workflow` function body - outputs = fn(*args, **kwargs) - # ctx.compilation_state.nodes == [before_node, *nodes_created_by_fn] - - # defines the after node - after_node = create_node(after) - # ctx.compilation_state.nodes == [before_node, *nodes_created_by_fn, after_node] - - # compile the workflow correctly by making sure `before_node` - # runs before the first workflow node and `after_node` - # runs after the last workflow node. - if ctx.compilation_state is not None: - # ctx.compilation_state.nodes is a list of nodes defined in the - # order of execution above - workflow_node0 = ctx.compilation_state.nodes[1] - workflow_node1 = ctx.compilation_state.nodes[-2] - before_node >> workflow_node0 - workflow_node1 >> after_node - return outputs - - if fn is None: - return partial(setup_teardown, before=before, after=after) - - return wrapper +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_workflows.py +:caption: advanced_composition/decorating_workflows.py +:pyobject: setup_teardown ``` -+++ {"lines_to_next_cell": 0} - There are a few key pieces to note in the `setup_teardown` decorator above: 1. It takes a `before` and `after` argument, both of which need to be `@task`-decorated functions. These @@ -137,32 +66,16 @@ There are a few key pieces to note in the `setup_teardown` decorator above: We define two tasks that will constitute the workflow. -```{code-cell} -@task -def t1(x: float) -> float: - return x - 1 - - -@task -def t2(x: float) -> float: - return x**2 +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_workflows.py +:caption: advanced_composition/decorating_workflows.py +:lines: 63-70 ``` -+++ {"lines_to_next_cell": 0} - And then create our decorated workflow: -```{code-cell} -:lines_to_next_cell: 2 - -@workflow -@setup_teardown(before=setup, after=teardown) -def decorating_workflow(x: float) -> float: - return t2(x=t1(x=x)) - - -if __name__ == "__main__": - print(decorating_workflow(x=10.0)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/decorating_workflows.py +:caption: advanced_composition/decorating_workflows.py +:lines: 74-82 ``` ## Run the example on the Flyte cluster @@ -178,3 +91,5 @@ pyflyte run --remote \ To define workflows imperatively, refer to {ref}`this example `, and to learn more about how to extend Flyte at a deeper level, for example creating custom types, custom tasks or backend plugins, see {ref}`Extending Flyte `. + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/advanced_composition/ diff --git a/docs/user_guide/advanced_composition/dynamic_workflows.md b/docs/user_guide/advanced_composition/dynamic_workflows.md index 99bc88a372..c39272dfdf 100644 --- a/docs/user_guide/advanced_composition/dynamic_workflows.md +++ b/docs/user_guide/advanced_composition/dynamic_workflows.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (dynamic_workflow)= # Dynamic workflows @@ -53,51 +34,38 @@ Dynamic workflows become essential when you require: This example utilizes dynamic workflow to count the common characters between any two strings. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` + To begin, we import the required libraries. -```{code-cell} -from flytekit import dynamic, task, workflow +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/dynamic_workflow.py +:caption: advanced_composition/dynamic_workflow.py +:lines: 1 ``` -+++ {"lines_to_next_cell": 0} - We define a task that returns the index of a character, where A-Z/a-z is equivalent to 0-25. -```{code-cell} -@task -def return_index(character: str) -> int: - if character.islower(): - return ord(character) - ord("a") - else: - return ord(character) - ord("A") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/dynamic_workflow.py +:caption: advanced_composition/dynamic_workflow.py +:pyobject: return_index ``` -+++ {"lines_to_next_cell": 0} - We also create a task that prepares a list of 26 characters by populating the frequency of each character. -```{code-cell} -@task -def update_list(freq_list: list[int], list_index: int) -> list[int]: - freq_list[list_index] += 1 - return freq_list +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/dynamic_workflow.py +:caption: advanced_composition/dynamic_workflow.py +:pyobject: update_list ``` -+++ {"lines_to_next_cell": 0} - We define a task to calculate the number of common characters between the two strings. -```{code-cell} -@task -def derive_count(freq1: list[int], freq2: list[int]) -> int: - count = 0 - for i in range(26): - count += min(freq1[i], freq2[i]) - return count +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/dynamic_workflow.py +:caption: advanced_composition/dynamic_workflow.py +:pyobject: derive_count ``` -+++ {"lines_to_next_cell": 0} - We define a dynamic workflow to accomplish the following: 1. Initialize an empty 26-character list to be passed to the `update_list` task @@ -107,37 +75,11 @@ We define a dynamic workflow to accomplish the following: The looping process is contingent on the number of characters in both strings, which is unknown until runtime. -```{code-cell} -@dynamic -def count_characters(s1: str, s2: str) -> int: - # s1 and s2 should be accessible - - # Initialize empty lists with 26 slots each, corresponding to every alphabet (lower and upper case) - freq1 = [0] * 26 - freq2 = [0] * 26 - - # Loop through characters in s1 - for i in range(len(s1)): - # Calculate the index for the current character in the alphabet - index = return_index(character=s1[i]) - # Update the frequency list for s1 - freq1 = update_list(freq_list=freq1, list_index=index) - # index and freq1 are not accessible as they are promises - - # looping through the string s2 - for i in range(len(s2)): - # Calculate the index for the current character in the alphabet - index = return_index(character=s2[i]) - # Update the frequency list for s2 - freq2 = update_list(freq_list=freq2, list_index=index) - # index and freq2 are not accessible as they are promises - - # Count the common characters between s1 and s2 - return derive_count(freq1=freq1, freq2=freq2) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/dynamic_workflow.py +:caption: advanced_composition/dynamic_workflow.py +:pyobject: count_characters ``` -+++ {"lines_to_next_cell": 0} - A dynamic workflow is modeled as a task in the backend, but the body of the function is executed to produce a workflow at run-time. In both dynamic and static workflows, the output of tasks are promise objects. @@ -155,25 +97,18 @@ Local execution works when a `@dynamic` decorator is used because Flytekit treat Define a workflow that triggers the dynamic workflow. -```{code-cell} -@workflow -def dynamic_wf(s1: str, s2: str) -> int: - return count_characters(s1=s1, s2=s2) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/dynamic_workflow.py +:caption: advanced_composition/dynamic_workflow.py +:pyobject: dynamic_wf ``` -+++ {"lines_to_next_cell": 0} - You can run the workflow locally as follows: -```{code-cell} -:lines_to_next_cell: 2 - -if __name__ == "__main__": - print(dynamic_wf(s1="Pear", s2="Earth")) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/dynamic_workflow.py +:caption: advanced_composition/dynamic_workflow.py +:lines: 78-79 ``` -+++ {"lines_to_next_cell": 0} - ## Why use dynamic workflows? ### Flexibility @@ -206,9 +141,7 @@ resulting in less noticeable overhead. Merge sort is a perfect example to showcase how to seamlessly achieve recursion using dynamic workflows. Flyte imposes limitations on the depth of recursion to prevent misuse and potential impacts on the overall stability of the system. -```{code-cell} -:lines_to_next_cell: 2 - +```python from typing import Tuple from flytekit import conditional, dynamic, task, workflow @@ -290,3 +223,5 @@ pyflyte run --remote \ https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/dynamic_workflow.py \ merge_sort --numbers '[1813, 3105, 3260, 2634, 383, 7037, 3291, 2403, 315, 7164]' --numbers_count 10 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/advanced_composition/ diff --git a/docs/user_guide/advanced_composition/eager_workflows.md b/docs/user_guide/advanced_composition/eager_workflows.md index c2cc1dc542..480374413b 100644 --- a/docs/user_guide/advanced_composition/eager_workflows.md +++ b/docs/user_guide/advanced_composition/eager_workflows.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (eager_workflows)= # Eager workflows @@ -60,32 +41,14 @@ the python constructs that you're familiar with via the `asyncio` API. To understand what this looks like, let's define a very basic eager workflow using the `@eager` decorator. -```{code-cell} -:lines_to_next_cell: 2 - -from flytekit import task, workflow -from flytekit.experimental import eager - - -@task -def add_one(x: int) -> int: - return x + 1 - - -@task -def double(x: int) -> int: - return x * 2 - - -@eager -async def simple_eager_workflow(x: int) -> int: - out = await add_one(x=x) - if out < 0: - return -1 - return await double(x=out) +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 2} +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/eager_workflows.py +:caption: advanced_composition/eager_workflows.py +:lines: 1-21 +``` As we can see in the code above, we're defining an `async` function called `simple_eager_workflow` that takes an integer as input and returns an integer. @@ -153,19 +116,11 @@ One of the biggest benefits of eager workflows is that you can now materialize task and subworkflow outputs as Python values and do operations on them just like you would in any other Python function. Let's look at another example: -```{code-cell} -@eager -async def another_eager_workflow(x: int) -> int: - out = await add_one(x=x) - - # out is a Python integer - out = out - 1 - - return await double(x=out) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/eager_workflows.py +:caption: advanced_composition/eager_workflows.py +:pyobject: another_eager_workflow ``` -+++ {"lines_to_next_cell": 0} - Since out is an actual Python integer and not a promise, we can do operations on it at runtime, inside the eager workflow function body. This is not possible with static or dynamic workflows. @@ -176,27 +131,9 @@ As you saw in the `simple_eager_workflow` workflow above, you can use regular Python conditionals in your eager workflows. Let's look at a more complicated example: -```{code-cell} -:lines_to_next_cell: 2 - -@task -def gt_100(x: int) -> bool: - return x > 100 - - -@eager -async def eager_workflow_with_conditionals(x: int) -> int: - out = await add_one(x=x) - - if out < 0: - return -1 - elif await gt_100(x=out): - return 100 - else: - out = await double(x=out) - - assert out >= -1 - return out +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/eager_workflows.py +:caption: advanced_composition/eager_workflows.py +:lines: 36-53 ``` In the above example, we're using the eager workflow's Python runtime @@ -207,88 +144,36 @@ to check if `out` is negative, but we're also using the `gt_100` task in the You can also gather the outputs of multiple tasks or subworkflows into a list: -```{code-cell} -import asyncio - - -@eager -async def eager_workflow_with_for_loop(x: int) -> int: - outputs = [] - - for i in range(x): - outputs.append(add_one(x=i)) - - outputs = await asyncio.gather(*outputs) - return await double(x=sum(outputs)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/eager_workflows.py +:caption: advanced_composition/eager_workflows.py +:lines: 58-69 ``` -+++ {"lines_to_next_cell": 0} - ### Static subworkflows You can also invoke static workflows from within an eager workflow: -```{code-cell} -:lines_to_next_cell: 2 - -@workflow -def subworkflow(x: int) -> int: - out = add_one(x=x) - return double(x=out) - - -@eager -async def eager_workflow_with_static_subworkflow(x: int) -> int: - out = await subworkflow(x=x) - assert out == (x + 1) * 2 - return out +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/eager_workflows.py +:caption: advanced_composition/eager_workflows.py +:lines: 74-84 ``` -+++ {"lines_to_next_cell": 0} - ### Eager subworkflows You can have nest eager subworkflows inside a parent eager workflow: -```{code-cell} -:lines_to_next_cell: 2 - -@eager -async def eager_subworkflow(x: int) -> int: - return await add_one(x=x) - - -@eager -async def nested_eager_workflow(x: int) -> int: - out = await eager_subworkflow(x=x) - return await double(x=out) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/eager_workflows.py +:caption: advanced_composition/eager_workflows.py +:lines: 89-97 ``` -+++ {"lines_to_next_cell": 0} - ### Catching exceptions You can also catch exceptions in eager workflows through `EagerException`: -```{code-cell} -:lines_to_next_cell: 2 - -from flytekit.experimental import EagerException - - -@task -def raises_exc(x: int) -> int: - if x <= 0: - raise TypeError - return x - - -@eager -async def eager_workflow_with_exception(x: int) -> int: - try: - return await raises_exc(x=x) - except EagerException: - return -1 +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/eager_workflows.py +:caption: advanced_composition/eager_workflows.py +:lines: 102-117 ``` Even though the `raises_exc` exception task raises a `TypeError`, the @@ -310,10 +195,9 @@ and remotely. You can execute eager workflows locally by simply calling them like a regular `async` function: -```{code-cell} -if __name__ == "__main__": - result = asyncio.run(simple_eager_workflow(x=5)) - print(f"Result: {result}") # "Result: 12" +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/eager_workflows.py +:caption: advanced_composition/eager_workflows.py +:lines: 123-125 ``` This just uses the `asyncio.run` function to execute the eager workflow just @@ -329,7 +213,7 @@ object to kick off task, static workflow, and eager workflow executions. In order to actually execute them on a Flyte cluster, you'll need to configure eager workflows with a `FlyteRemote` object and secrets configuration that -allows you to authenticate into the cluster via a client secret key. +allows you to authenticate into the cluster via a client secret key: ```{code-block} python from flytekit.remote import FlyteRemote @@ -348,41 +232,21 @@ async def eager_workflow_remote(x: int) -> int: ... ``` -+++ - Where `config.yaml` contains a [flytectl](https://docs.flyte.org/projects/flytectl/en/latest/#configuration)-compatible config file and `my_client_secret_group` and `my_client_secret_key` are the {ref}`secret group and key ` that you've configured for your Flyte cluster to authenticate via a client key. -+++ - ### Sandbox Flyte cluster execution When using a sandbox cluster started with `flytectl demo start`, however, the `client_secret_group` and `client_secret_key` are not required, since the default sandbox configuration does not require key-based authentication. -```{code-cell} -:lines_to_next_cell: 2 - -from flytekit.configuration import Config -from flytekit.remote import FlyteRemote - - -@eager( - remote=FlyteRemote( - config=Config.for_sandbox(), - default_project="flytesnacks", - default_domain="development", - ) -) -async def eager_workflow_sandbox(x: int) -> int: - out = await add_one(x=x) - if out < 0: - return -1 - return await double(x=out) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/eager_workflows.py +:caption: advanced_composition/eager_workflows.py +:lines: 130-145 ``` ```{important} @@ -493,3 +357,5 @@ of promises and materialized values: | `@workflow` | Compiled at compile-time | All inputs and intermediary outputs are promises | Type errors caught at compile-time | Constrained by Flyte DSL | | `@dynamic` | Compiled at run-time | Inputs are materialized, but outputs of all Flyte entities are Promises | More flexible than `@workflow`, e.g. can do Python operations on inputs | Can't use a lot of Python constructs (e.g. try/except) | | `@eager` | Never compiled | Everything is materialized! | Can effectively use all Python constructs via `asyncio` syntax | No compile-time benefits, this is the wild west 🏜 | + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/advanced_composition/ diff --git a/docs/user_guide/advanced_composition/intratask_checkpoints.md b/docs/user_guide/advanced_composition/intratask_checkpoints.md index 703279abcb..8c83eb154b 100644 --- a/docs/user_guide/advanced_composition/intratask_checkpoints.md +++ b/docs/user_guide/advanced_composition/intratask_checkpoints.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - # Intratask checkpoints ```{eval-rst} @@ -64,66 +45,40 @@ It's important to note that Flyte currently offers the low-level API for checkpo Future integrations aim to incorporate higher-level checkpointing APIs from popular training frameworks like Keras, PyTorch, Scikit-learn, and big-data frameworks such as Spark and Flink, enhancing their fault-tolerance capabilities. -To begin, import the necessary libraries and set the number of task retries to `3`. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -from flytekit import current_context, task, workflow -from flytekit.exceptions.user import FlyteRecoverableException +To begin, import the necessary libraries and set the number of task retries to `3`: -RETRIES = 3 +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/checkpoint.py +:caption: advanced_composition/checkpoint.py +:lines: 1-4 ``` -+++ {"lines_to_next_cell": 0} - -We define a task to iterate precisely `n_iterations`, checkpoint its state, and recover from simulated failures. - -```{code-cell} -@task(retries=RETRIES) -def use_checkpoint(n_iterations: int) -> int: - cp = current_context().checkpoint - prev = cp.read() - - start = 0 - if prev: - start = int(prev.decode()) - - # Create a failure interval to simulate failures across 'n' iterations and then succeed after configured retries - failure_interval = n_iterations // RETRIES - index = 0 - for index in range(start, n_iterations): - # Simulate a deterministic failure for demonstration. Showcasing how it eventually completes within the given retries - if index > start and index % failure_interval == 0: - raise FlyteRecoverableException(f"Failed at iteration {index}, failure_interval {failure_interval}.") - # Save progress state. It is also entirely possible to save state every few intervals - cp.write(f"{index + 1}".encode()) - return index -``` +We define a task to iterate precisely `n_iterations`, checkpoint its state, and recover from simulated failures: -+++ {"lines_to_next_cell": 0} +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/checkpoint.py +:caption: advanced_composition/checkpoint.py +:pyobject: use_checkpoint +``` The checkpoint system offers additional APIs, documented in the code accessible at [checkpointer code](https://github.com/flyteorg/flytekit/blob/master/flytekit/core/checkpointer.py). -Create a workflow that invokes the task. +Create a workflow that invokes the task: The task will automatically undergo retries in the event of a {ref}`FlyteRecoverableException `. -```{code-cell} -@workflow -def checkpointing_example(n_iterations: int) -> int: - return use_checkpoint(n_iterations=n_iterations) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/checkpoint.py +:caption: advanced_composition/checkpoint.py +:pyobject: checkpointing_example ``` -+++ {"lines_to_next_cell": 0} - -The local checkpoint is not utilized here because retries are not supported. +The local checkpoint is not utilized here because retries are not supported: -```{code-cell} -if __name__ == "__main__": - try: - checkpointing_example(n_iterations=10) - except RuntimeError as e: # noqa : F841 - # Since no retries are performed, an exception is expected when run locally - pass +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/checkpoint.py +:caption: advanced_composition/checkpoint.py +:lines: 37-42 ``` ## Run the example on the Flyte cluster @@ -135,3 +90,5 @@ pyflyte run --remote \ https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/checkpoint.py \ checkpointing_example --n_iterations 10 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/advanced_composition/ diff --git a/docs/user_guide/advanced_composition/map_tasks.md b/docs/user_guide/advanced_composition/map_tasks.md index 6449b6d124..8c3127fc4e 100644 --- a/docs/user_guide/advanced_composition/map_tasks.md +++ b/docs/user_guide/advanced_composition/map_tasks.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (map_task)= # Map tasks @@ -36,37 +17,24 @@ Map tasks find utility in diverse scenarios, such as: The following examples demonstrate how to use map tasks with both single and multiple inputs. -To begin, import the required libraries. - -```{code-cell} -from flytekit import map_task, task, workflow +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} - -Here's a simple workflow that uses {py:func}`map_task `. - -```{code-cell} -threshold = 11 - - -@task -def detect_anomalies(data_point: int) -> bool: - return data_point > threshold - +To begin, import the required libraries: -@workflow -def map_workflow(data: list[int] = [10, 12, 11, 10, 13, 12, 100, 11, 12, 10]) -> list[bool]: - # Use the map task to apply the anomaly detection function to each data point - return map_task(detect_anomalies)(data_point=data) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/map_task.py +:caption: advanced_composition/map_task.py +:lines: 1 +``` +Here's a simple workflow that uses {py:func}`map_task `: -if __name__ == "__main__": - print(f"Anomalies Detected: {map_workflow()}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/map_task.py +:caption: advanced_composition/map_task.py +:lines: 4-19 ``` -+++ {"lines_to_next_cell": 0} - To customize resource allocations, such as memory usage for individual map tasks, you can leverage `with_overrides`. Here's an example using the `detect_anomalies` map task within a workflow: @@ -79,7 +47,7 @@ def map_workflow_with_resource_overrides(data: list[int] = [10, 12, 11, 10, 13, return map_task(detect_anomalies)(data_point=data).with_overrides(requests=Resources(mem="2Gi")) ``` -You can use {py:class}`~flytekit.TaskMetadata` to set attributes such as `cache`, `cache_version`, `interruptible`, `retries` and `timeout`. +You can use {py:class}`~flytekit.TaskMetadata` to set attributes such as `cache`, `cache_version`, `interruptible`, `retries` and `timeout`: ```python from flytekit import TaskMetadata @@ -93,10 +61,8 @@ def map_workflow_with_metadata(data: list[int] = [10, 12, 11, 10, 13, 12, 100, 1 You can also configure `concurrency` and `min_success_ratio` for a map task: - `concurrency` limits the number of mapped tasks that can run in parallel to the specified batch size. -If the input size exceeds the concurrency value, multiple batches will run serially until all inputs are processed. -If left unspecified, it implies unbounded concurrency. -- `min_success_ratio` determines the minimum fraction of total jobs that must complete successfully before terminating -the map task and marking it as successful. +If the input size exceeds the concurrency value, multiple batches will run serially until all inputs are processed. If left unspecified, it implies unbounded concurrency. +- `min_success_ratio` determines the minimum fraction of total jobs that must complete successfully before terminating the map task and marking it as successful. ```python @workflow @@ -107,94 +73,52 @@ def map_workflow_with_additional_params(data: list[int] = [10, 12, 11, 10, 13, 1 A map task internally uses a compression algorithm (bitsets) to handle every Flyte workflow node’s metadata, which would have otherwise been in the order of 100s of bytes. -When defining a map task, avoid calling other tasks in it. Flyte -can't accurately register tasks that call other tasks. While Flyte -will correctly execute a task that calls other tasks, it will not be -able to give full performance advantages. This is -especially true for map tasks. +When defining a map task, avoid calling other tasks in it. Flyte can't accurately register tasks that call other tasks. While Flyte will correctly execute a task that calls other tasks, it will not be able to give full performance advantages. This is especially true for map tasks. -In this example, the map task `suboptimal_mappable_task` would not -give you the best performance. +In this example, the map task `suboptimal_mappable_task` would not give you the best performance: -```{code-cell} -@task -def upperhalf(a: int) -> int: - return a / 2 + 1 - - -@task -def suboptimal_mappable_task(a: int) -> str: - inc = upperhalf(a=a) - stringified = str(inc) - return stringified +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/map_task.py +:caption: advanced_composition/map_task.py +:lines: 31-40 ``` -+++ {"lines_to_next_cell": 0} - By default, the map task utilizes the Kubernetes array plugin for execution. However, map tasks can also be run on alternate execution backends. For example, you can configure the map task to run on -[AWS Batch](https://docs.flyte.org/en/latest/deployment/plugin_setup/aws/batch.html#deployment-plugin-setup-aws-array), -a provisioned service that offers scalability for handling large-scale tasks. +[AWS Batch](https://docs.flyte.org/en/latest/deployment/plugin_setup/aws/batch.html#deployment-plugin-setup-aws-array), a provisioned service that offers scalability for handling large-scale tasks. ## Map a task with multiple inputs You might need to map a task with multiple inputs. -For instance, consider a task that requires three inputs. +For instance, consider a task that requires three inputs: -```{code-cell} -@task -def multi_input_task(quantity: int, price: float, shipping: float) -> float: - return quantity * price * shipping +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/map_task.py +:caption: advanced_composition/map_task.py +:pyobject: multi_input_task ``` -+++ {"lines_to_next_cell": 0} - You may want to map this task with only the ``quantity`` input, while keeping the other inputs unchanged. Since a map task accepts only one input, you can achieve this by partially binding values to the map task. -This can be done using the {py:func}`functools.partial` function. - -```{code-cell} -import functools +This can be done using the {py:func}`functools.partial` function: - -@workflow -def multiple_inputs_map_workflow(list_q: list[int] = [1, 2, 3, 4, 5], p: float = 6.0, s: float = 7.0) -> list[float]: - partial_task = functools.partial(multi_input_task, price=p, shipping=s) - return map_task(partial_task)(quantity=list_q) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/map_task.py +:caption: advanced_composition/map_task.py +:lines: 52-58 ``` -+++ {"lines_to_next_cell": 0} +Another possibility is to bind the outputs of a task to partials: -Another possibility is to bind the outputs of a task to partials. - -```{code-cell} -@task -def get_price() -> float: - return 7.0 - - -@workflow -def map_workflow_partial_with_task_output(list_q: list[int] = [1, 2, 3, 4, 5], s: float = 6.0) -> list[float]: - p = get_price() - partial_task = functools.partial(multi_input_task, price=p, shipping=s) - return map_task(partial_task)(quantity=list_q) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/map_task.py +:caption: advanced_composition/map_task.py +:lines: 63-72 ``` -+++ {"lines_to_next_cell": 0} - -You can also provide multiple lists as input to a ``map_task``. +You can also provide multiple lists as input to a `map_task`: -```{code-cell} -:lines_to_next_cell: 2 - -@workflow -def map_workflow_with_lists( - list_q: list[int] = [1, 2, 3, 4, 5], list_p: list[float] = [6.0, 9.0, 8.7, 6.5, 1.2], s: float = 6.0 -) -> list[float]: - partial_task = functools.partial(multi_input_task, shipping=s) - return map_task(partial_task)(quantity=list_q, price=list_p) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/map_task.py +:caption: advanced_composition/map_task.py +:pyobject: map_workflow_with_lists ``` ```{note} @@ -239,7 +163,7 @@ pyflyte run --remote \ :::{important} This feature is experimental and the API is subject to breaking changes. -If you encounter any issues please consider submitting a +If you encounter any issues, please submit a [bug report](https://github.com/flyteorg/flyte/issues/new?assignees=&labels=bug%2Cuntriaged&projects=&template=bug_report.yaml&title=%5BBUG%5D+). ::: @@ -276,3 +200,5 @@ In contrast to map tasks, an ArrayNode provides the following enhancements: - **Multiple input values**. Subtasks can be defined with multiple input values, enhancing their versatility. We expect the performance of ArrayNode map tasks to compare closely to standard map tasks. + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/advanced_composition/ diff --git a/docs/user_guide/advanced_composition/subworkflows.md b/docs/user_guide/advanced_composition/subworkflows.md index 59826aa491..8c4971e853 100644 --- a/docs/user_guide/advanced_composition/subworkflows.md +++ b/docs/user_guide/advanced_composition/subworkflows.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (subworkflow)= # Subworkflows @@ -37,81 +18,43 @@ Consequently, all nodes of a subworkflow adhere to the overall constraints impos Consider this scenario: when workflow `A` is integrated as a subworkflow of workflow `B`, running workflow `B` results in the entire graph of workflow `A` being duplicated into workflow `B` at the point of invocation. -Here's an example illustrating the calculation of slope, intercept and the corresponding y-value. - -```{code-cell} -from flytekit import task, workflow - - -@task -def slope(x: list[int], y: list[int]) -> float: - sum_xy = sum([x[i] * y[i] for i in range(len(x))]) - sum_x_squared = sum([x[i] ** 2 for i in range(len(x))]) - n = len(x) - return (n * sum_xy - sum(x) * sum(y)) / (n * sum_x_squared - sum(x) ** 2) - - -@task -def intercept(x: list[int], y: list[int], slope: float) -> float: - mean_x = sum(x) / len(x) - mean_y = sum(y) / len(y) - intercept = mean_y - slope * mean_x - return intercept - - -@workflow -def slope_intercept_wf(x: list[int], y: list[int]) -> (float, float): - slope_value = slope(x=x, y=y) - intercept_value = intercept(x=x, y=y, slope=slope_value) - return (slope_value, intercept_value) - - -@task -def regression_line(val: int, slope_value: float, intercept_value: float) -> float: - return (slope_value * val) + intercept_value # y = mx + c +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` +Here's an example illustrating the calculation of slope, intercept and the corresponding y-value: -@workflow -def regression_line_wf(val: int = 5, x: list[int] = [-3, 0, 3], y: list[int] = [7, 4, -2]) -> float: - slope_value, intercept_value = slope_intercept_wf(x=x, y=y) - return regression_line(val=val, slope_value=slope_value, intercept_value=intercept_value) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/subworkflow.py +:caption: advanced_composition/subworkflow.py +:lines: 1-35 ``` -+++ {"lines_to_next_cell": 0} - The `slope_intercept_wf` computes the slope and intercept of the regression line. Subsequently, the `regression_line_wf` triggers `slope_intercept_wf` and then computes the y-value. To execute the workflow locally, use the following: -```{code-cell} -if __name__ == "__main__": - print(f"Executing regression_line_wf(): {regression_line_wf()}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/subworkflow.py +:caption: advanced_composition/subworkflow.py +:lines: 39-40 ``` -+++ {"lines_to_next_cell": 0} - It's possible to nest a workflow that contains a subworkflow within another workflow. Workflows can be easily constructed from other workflows, even if they function as standalone entities. -Each workflow in this module has the capability to exist and run independently. +Each workflow in this module has the capability to exist and run independently: -```{code-cell} -@workflow -def nested_regression_line_wf() -> float: - return regression_line_wf() +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/subworkflow.py +:caption: advanced_composition/subworkflow.py +:pyobject: nested_regression_line_wf ``` -+++ {"lines_to_next_cell": 0} - -You can run the nested workflow locally as well. +You can run the nested workflow locally as well: -```{code-cell} -if __name__ == "__main__": - print(f"Running nested_regression_line_wf(): {nested_regression_line_wf()}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/subworkflow.py +:caption: advanced_composition/subworkflow.py +:lines: 52-53 ``` -+++ {"lines_to_next_cell": 0} - ## External workflow When launch plans are employed within a workflow to initiate the execution of a pre-defined workflow, @@ -128,23 +71,11 @@ external workflows may offer a way to distribute the workload of a workflow acro Here's an example that illustrates the concept of external workflows: -```{code-cell} - -from flytekit import LaunchPlan - -launch_plan = LaunchPlan.get_or_create( - regression_line_wf, "regression_line_workflow", default_inputs={"val": 7, "x": [-3, 0, 3], "y": [7, 4, -2]} -) - - -@workflow -def nested_regression_line_lp() -> float: - # Trigger launch plan from within a workflow - return launch_plan() +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/subworkflow.py +:caption: advanced_composition/subworkflow.py +:lines: 61-71 ``` -+++ {"lines_to_next_cell": 0} - :::{figure} https://raw.githubusercontent.com/flyteorg/static-resources/main/flytesnacks/user_guide/flyte_external_workflow_execution.png :alt: External workflow execution :class: with-shadow @@ -154,9 +85,9 @@ In the console screenshot above, note that the launch plan execution ID differs You can run a workflow containing an external workflow locally as follows: -```{code-cell} -if __name__ == "__main__": - print(f"Running nested_regression_line_lp(): {nested_regression_line_lp}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/subworkflow.py +:caption: advanced_composition/subworkflow.py +:lines: 75-76 ``` ## Run the example on a Flyte cluster @@ -180,3 +111,5 @@ pyflyte run --remote \ https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/subworkflow.py \ nested_regression_line_lp ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/advanced_composition/ diff --git a/docs/user_guide/advanced_composition/waiting_for_external_inputs.md b/docs/user_guide/advanced_composition/waiting_for_external_inputs.md index d694b62443..6af1782c12 100644 --- a/docs/user_guide/advanced_composition/waiting_for_external_inputs.md +++ b/docs/user_guide/advanced_composition/waiting_for_external_inputs.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - # Waiting for external inputs *New in Flyte 1.3.0* @@ -58,30 +39,14 @@ Though this type of node may not be used often in a production setting, you might want to use it, for example, if you want to simulate a delay in your workflow to mock out the behavior of some long-running computation. -```{code-cell} -from datetime import timedelta - -from flytekit import sleep, task, workflow - - -@task -def long_running_computation(num: int) -> int: - """A mock task pretending to be a long-running computation.""" - return num - - -@workflow -def sleep_wf(num: int) -> int: - """Simulate a "long-running" computation with sleep.""" - - # increase the sleep duration to actually make it long-running - sleeping = sleep(timedelta(seconds=10)) - result = long_running_computation(num=num) - sleeping >> result - return result +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/waiting_for_external_inputs.py +:caption: advanced_composition/waiting_for_external_inputs.py +:lines: 1-20 +``` As you can see above, we define a simple `add_one` task and a `sleep_wf` workflow. We first create a `sleeping` and `result` node, then @@ -97,6 +62,10 @@ You can learn more about the `>>` chaining operator Now that you have a general sense of how this works, let's move onto the {func}`~flytekit.wait_for_input` workflow node. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` + ## Supply external inputs with `wait_for_input` With the {py:func}`~flytekit.wait_for_input` node, you can pause a @@ -106,33 +75,9 @@ but before publishing it you want to give it a custom title. You can achieve this by defining a `wait_for_input` node that takes a `str` input and finalizes the report: -```{code-cell} -import typing - -from flytekit import wait_for_input - - -@task -def create_report(data: typing.List[float]) -> dict: # o0 - """A toy report task.""" - return { - "mean": sum(data) / len(data), - "length": len(data), - "max": max(data), - "min": min(data), - } - - -@task -def finalize_report(report: dict, title: str) -> dict: - return {"title": title, **report} - - -@workflow -def reporting_wf(data: typing.List[float]) -> dict: - report = create_report(data=data) - title_input = wait_for_input("title", timeout=timedelta(hours=1), expected_type=str) - return finalize_report(report=report, title=title_input) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/waiting_for_external_inputs.py +:caption: advanced_composition/waiting_for_external_inputs.py +:lines: 24-49 ``` Let's breakdown what's happening in the code above: @@ -162,23 +107,11 @@ an explicit approval signal before continuing execution. Going back to our report-publishing use case, suppose that we want to block the publishing of a report for some reason (e.g. if they don't appear to be valid): -```{code-cell} -from flytekit import approve - - -@workflow -def reporting_with_approval_wf(data: typing.List[float]) -> dict: - report = create_report(data=data) - title_input = wait_for_input("title", timeout=timedelta(hours=1), expected_type=str) - final_report = finalize_report(report=report, title=title_input) - - # approve the final report, where the output of approve is the final_report - # dictionary. - return approve(final_report, "approve-final-report", timeout=timedelta(hours=2)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/waiting_for_external_inputs.py +:caption: advanced_composition/waiting_for_external_inputs.py +:lines: 53-64 ``` -+++ {"lines_to_next_cell": 0} - The `approve` node will pass the `final_report` promise through as the output of the workflow, provided that the `approve-final-report` gets an approval input via the Flyte UI or Flyte API. @@ -187,25 +120,11 @@ You can also use the output of the `approve` function as a promise, feeding it to a subsequent task. Let's create a version of our report-publishing workflow where the approval happens after `create_report`: -```{code-cell} -@workflow -def approval_as_promise_wf(data: typing.List[float]) -> dict: - report = create_report(data=data) - title_input = wait_for_input("title", timeout=timedelta(hours=1), expected_type=str) - - # wait for report to run so that the user can view it before adding a custom - # title to the report - report >> title_input - - final_report = finalize_report( - report=approve(report, "raw-report-approval", timeout=timedelta(hours=2)), - title=title_input, - ) - return final_report +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/waiting_for_external_inputs.py +:caption: advanced_composition/waiting_for_external_inputs.py +:pyobject: approval_as_promise_wf ``` -+++ {"lines_to_next_cell": 0} - ## Working with conditionals The node constructs by themselves are useful, but they become even more @@ -214,36 +133,9 @@ useful when we combine them with other Flyte constructs, like {ref}`conditionals To illustrate this, let's extend the report-publishing use case so that we produce an "invalid report" output in case we don't approve the final report: -```{code-cell} -:lines_to_next_cell: 2 - -from flytekit import conditional - - -@task -def invalid_report() -> dict: - return {"invalid_report": True} - - -@workflow -def conditional_wf(data: typing.List[float]) -> dict: - report = create_report(data=data) - title_input = wait_for_input("title-input", timeout=timedelta(hours=1), expected_type=str) - - # Define a "review-passes" wait_for_input node so that a human can review - # the report before finalizing it. - review_passed = wait_for_input("review-passes", timeout=timedelta(hours=2), expected_type=bool) - report >> review_passed - - # This conditional returns the finalized report if the review passes, - # otherwise it returns an invalid report output. - return ( - conditional("final-report-condition") - .if_(review_passed.is_true()) - .then(finalize_report(report=report, title=title_input)) - .else_() - .then(invalid_report()) - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/advanced_composition/advanced_composition/waiting_for_external_inputs.py +:caption: advanced_composition/waiting_for_external_inputs.py +:lines: 88-114 ``` On top of the `approved` node, which we use in the `conditional` to @@ -312,3 +204,5 @@ remote.set_signal("title-input", execution.id.name, "my report") # node is in the `signals` list above remote.set_signal("review-passes", execution.id.name, True) ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/advanced_composition/ diff --git a/docs/user_guide/basics/documenting_workflows.md b/docs/user_guide/basics/documenting_workflows.md index d6a561c532..3a29f9e562 100644 --- a/docs/user_guide/basics/documenting_workflows.md +++ b/docs/user_guide/basics/documenting_workflows.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - # Documenting workflows ```{eval-rst} @@ -28,24 +9,24 @@ Flyte enables the use of docstrings to document your code. Docstrings are stored in [FlyteAdmin](https://docs.flyte.org/en/latest/concepts/admin.html) and displayed on the UI. -To begin, import the relevant libraries. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -from typing import Tuple +To begin, import the relevant libraries: -from flytekit import workflow +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/documenting_workflows.py +:caption: basics/documenting_workflows.py +:lines: 1-3 ``` -+++ {"lines_to_next_cell": 0} - We import the `slope` and `intercept` tasks from the `workflow.py` file. -```{code-cell} -from .workflow import intercept, slope +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/documenting_workflows.py +:caption: basics/documenting_workflows.py +:lines: 6 ``` -+++ {"lines_to_next_cell": 0} - ## Sphinx-style docstring An example to demonstrate Sphinx-style docstring. @@ -54,26 +35,11 @@ The initial section of the docstring provides a concise overview of the workflow The subsequent section provides a comprehensive explanation. The last part of the docstring outlines the parameters and return type. -```{code-cell} -@workflow -def sphinx_docstring_wf(x: list[int] = [-3, 0, 3], y: list[int] = [7, 4, -2]) -> Tuple[float, float]: - """ - Slope and intercept of a regression line - - This workflow accepts a list of coefficient pairs for a regression line. - It calculates both the slope and intercept of the regression line. - - :param x: List of x-coefficients - :param y: List of y-coefficients - :return: Slope and intercept values - """ - slope_value = slope(x=x, y=y) - intercept_value = intercept(x=x, y=y, slope=slope_value) - return slope_value, intercept_value +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/documenting_workflows.py +:caption: basics/documenting_workflows.py +:pyobject: sphinx_docstring_wf ``` -+++ {"lines_to_next_cell": 0} - ## NumPy-style docstring An example to demonstrate NumPy-style docstring. @@ -83,34 +49,11 @@ The next section offers a comprehensive description. The third section of the docstring details all parameters along with their respective data types. The final section of the docstring explains the return type and its associated data type. -```{code-cell} -@workflow -def numpy_docstring_wf(x: list[int] = [-3, 0, 3], y: list[int] = [7, 4, -2]) -> Tuple[float, float]: - """ - Slope and intercept of a regression line - - This workflow accepts a list of coefficient pairs for a regression line. - It calculates both the slope and intercept of the regression line. - - Parameters - ---------- - x : list[int] - List of x-coefficients - y : list[int] - List of y-coefficients - - Returns - ------- - out : Tuple[float, float] - Slope and intercept values - """ - slope_value = slope(x=x, y=y) - intercept_value = intercept(x=x, y=y, slope=slope_value) - return slope_value, intercept_value +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/documenting_workflows.py +:caption: basics/documenting_workflows.py +:pyobject: numpy_docstring_wf ``` -+++ {"lines_to_next_cell": 0} - ## Google-style docstring An example to demonstrate Google-style docstring. @@ -120,27 +63,9 @@ The subsequent section of the docstring provides an extensive explanation. The third segment of the docstring outlines the parameters and return type, including their respective data types. -```{code-cell} -:lines_to_next_cell: 2 - -@workflow -def google_docstring_wf(x: list[int] = [-3, 0, 3], y: list[int] = [7, 4, -2]) -> Tuple[float, float]: - """ - Slope and intercept of a regression line - - This workflow accepts a list of coefficient pairs for a regression line. - It calculates both the slope and intercept of the regression line. - - Args: - x (list[int]): List of x-coefficients - y (list[int]): List of y-coefficients - - Returns: - Tuple[float, float]: Slope and intercept values - """ - slope_value = slope(x=x, y=y) - intercept_value = intercept(x=x, y=y, slope=slope_value) - return slope_value, intercept_value +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/documenting_workflows.py +:caption: basics/documenting_workflows.py +:pyobject: google_docstring_wf ``` Here are two screenshots showcasing how the description appears on the UI: @@ -155,3 +80,5 @@ Here are two screenshots showcasing how the description appears on the UI: :alt: Long description :class: with-shadow ::: + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/basics diff --git a/docs/user_guide/basics/hello_world.md b/docs/user_guide/basics/hello_world.md index 45e5e89c4d..63b830c010 100644 --- a/docs/user_guide/basics/hello_world.md +++ b/docs/user_guide/basics/hello_world.md @@ -1,23 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - - # Hello, World! ```{eval-rst} @@ -31,45 +11,41 @@ Flyte tasks are the core building blocks of larger, more complex workflows. Workflows compose multiple tasks – or other workflows – into meaningful steps of computation to produce some useful set of outputs or outcomes. -To begin, import `task` and `workflow` from the `flytekit` library. - -```{code-cell} -from flytekit import task, workflow +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} +To begin, import `task` and `workflow` from the `flytekit` library: + +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/hello_world.py +:caption: basics/hello_world.py +:lines: 1 +``` Define a task that produces the string "Hello, World!". -Simply using the `@task` decorator to annotate the Python function. +Simply using the `@task` decorator to annotate the Python function: -```{code-cell} -@task -def say_hello() -> str: - return "Hello, World!" +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/hello_world.py +:caption: basics/hello_world.py +:pyobject: say_hello ``` -+++ {"lines_to_next_cell": 0} - You can handle the output of a task in the same way you would with a regular Python function. -Store the output in a variable and use it as a return value for a Flyte workflow. +Store the output in a variable and use it as a return value for a Flyte workflow: -```{code-cell} -@workflow -def hello_world_wf() -> str: - res = say_hello() - return res +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/hello_world.py +:caption: basics/hello_world.py +:pyobject: hello_world_wf ``` -+++ {"lines_to_next_cell": 0} - -Run the workflow by simply calling it like a Python function. +Run the workflow by simply calling it like a Python function: -```{code-cell} -:lines_to_next_cell: 2 - -if __name__ == "__main__": - print(f"Running hello_world_wf() {hello_world_wf()}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/hello_world.py +:caption: basics/hello_world.py +:lines: 19-20 ``` Next, let's delve into the specifics of {ref}`tasks `, {ref}`workflows ` and {ref}`launch plans `. + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/basics/ diff --git a/docs/user_guide/basics/imperative_workflows.md b/docs/user_guide/basics/imperative_workflows.md index b5da5b6336..562685f32a 100644 --- a/docs/user_guide/basics/imperative_workflows.md +++ b/docs/user_guide/basics/imperative_workflows.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (imperative_workflow)= # Imperative workflows @@ -36,73 +17,67 @@ in textual form (perhaps during a transition from a legacy system). In such scenarios, you want to orchestrate these tasks. This is where Flyte's imperative workflows come into play, allowing you to programmatically construct workflows. -To begin, import the necessary dependencies. - -```{code-cell} -from flytekit import Workflow +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} - -We import the `slope` and `intercept` tasks from the `workflow.py` file. +To begin, import the necessary dependencies: -```{code-cell} -from .workflow import intercept, slope +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/imperative_workflow.py +:caption: basics/imperative_workflow.py +:lines: 1 ``` -+++ {"lines_to_next_cell": 0} +We import the `slope` and `intercept` tasks from the `workflow.py` file: -Create an imperative workflow. - -```{code-cell} -imperative_wf = Workflow(name="imperative_workflow") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/imperative_workflow.py +:caption: basics/imperative_workflow.py +:lines: 4 ``` -+++ {"lines_to_next_cell": 0} - -Add the workflow inputs to the imperative workflow. +Create an imperative workflow: -```{code-cell} -imperative_wf.add_workflow_input("x", list[int]) -imperative_wf.add_workflow_input("y", list[int]) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/imperative_workflow.py +:caption: basics/imperative_workflow.py +:lines: 7 ``` -+++ {"lines_to_next_cell": 0} +Add the workflow inputs to the imperative workflow: + +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/imperative_workflow.py +:caption: basics/imperative_workflow.py +:lines: 11-12 +``` ::: {note} If you want to assign default values to the workflow inputs, you can create a {ref}`launch plan `. ::: -Add the tasks that need to be triggered from within the workflow. +Add the tasks that need to be triggered from within the workflow: -```{code-cell} -node_t1 = imperative_wf.add_entity(slope, x=imperative_wf.inputs["x"], y=imperative_wf.inputs["y"]) -node_t2 = imperative_wf.add_entity( - intercept, x=imperative_wf.inputs["x"], y=imperative_wf.inputs["y"], slope=node_t1.outputs["o0"] -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/imperative_workflow.py +:caption: basics/imperative_workflow.py +:lines: 16-19 ``` -+++ {"lines_to_next_cell": 0} - -Lastly, add the workflow output. +Lastly, add the workflow output: -```{code-cell} -imperative_wf.add_workflow_output("wf_output", node_t2.outputs["o0"]) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/imperative_workflow.py +:caption: basics/imperative_workflow.py +:lines: 23 ``` -+++ {"lines_to_next_cell": 0} - You can execute the workflow locally as follows: -```{code-cell} -if __name__ == "__main__": - print(f"Running imperative_wf() {imperative_wf(x=[-3, 0, 3], y=[7, 4, -2])}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/imperative_workflow.py +:caption: basics/imperative_workflow.py +:lines: 27-28 ``` :::{note} You also have the option to provide a list of inputs and -retrieve a list of outputs from the workflow. +retrieve a list of outputs from the workflow: ```python wf_input_y = imperative_wf.add_workflow_input("y", list[str]) @@ -117,3 +92,5 @@ wf.add_workflow_output( ) ``` ::: + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/basics/ diff --git a/docs/user_guide/basics/launch_plans.md b/docs/user_guide/basics/launch_plans.md index 01eb9d1051..7ef61e4d2f 100644 --- a/docs/user_guide/basics/launch_plans.md +++ b/docs/user_guide/basics/launch_plans.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (launch_plan)= # Launch plans @@ -40,73 +21,67 @@ When a workflow is serialized and registered, a _default launch plan_ is generat This default launch plan can bind default workflow inputs and runtime options defined in the project's flytekit configuration (such as user role). -To begin, import the necessary libraries. - -```{code-cell} -from flytekit import LaunchPlan, current_context +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} - -We import the workflow from the `workflow.py` file for which we're going to create a launch plan. +To begin, import the necessary libraries: -```{code-cell} -from .workflow import simple_wf +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/launch_plan.py +:caption: basics/launch_plan.py +:lines: 1 ``` -+++ {"lines_to_next_cell": 0} +We import the workflow from the `workflow.py` file for which we're going to create a launch plan: -Create a default launch plan with no inputs during serialization. - -```{code-cell} -default_lp = LaunchPlan.get_default_launch_plan(current_context(), simple_wf) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/launch_plan.py +:caption: basics/launch_plan.py +:lines: 5 ``` -+++ {"lines_to_next_cell": 0} +Create a default launch plan with no inputs during serialization: + +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/launch_plan.py +:caption: basics/launch_plan.py +:lines: 8 +``` You can run the launch plan locally as follows: -```{code-cell} -default_lp(x=[-3, 0, 3], y=[7, 4, -2]) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/launch_plan.py +:caption: basics/launch_plan.py +:lines: 11 ``` -+++ {"lines_to_next_cell": 0} +Create a launch plan and specify the default inputs: -Create a launch plan and specify the default inputs. - -```{code-cell} -simple_wf_lp = LaunchPlan.create( - name="simple_wf_lp", workflow=simple_wf, default_inputs={"x": [-3, 0, 3], "y": [7, 4, -2]} -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/launch_plan.py +:caption: basics/launch_plan.py +:lines: 14-16 ``` -+++ {"lines_to_next_cell": 0} - You can trigger the launch plan locally as follows: -```{code-cell} -simple_wf_lp() +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/launch_plan.py +:caption: basics/launch_plan.py +:lines: 19 ``` -+++ {"lines_to_next_cell": 0} - You can override the defaults as follows: -```{code-cell} -simple_wf_lp(x=[3, 5, 3], y=[-3, 2, -2]) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/launch_plan.py +:caption: basics/launch_plan.py +:lines: 22 ``` -+++ {"lines_to_next_cell": 0} +It's possible to lock launch plan inputs, preventing them from being overridden during execution: -It's possible to lock launch plan inputs, preventing them from being overridden during execution. - -```{code-cell} -simple_wf_lp_fixed_inputs = LaunchPlan.get_or_create( - name="fixed_inputs", workflow=simple_wf, fixed_inputs={"x": [-3, 0, 3]} -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/launch_plan.py +:caption: basics/launch_plan.py +:lines: 25-27 ``` -Attempting to modify the inputs will result in an error being raised by Flyte. +Attempting to modify the inputs will result in an error being raised by Flyte: :::{note} You can employ default and fixed inputs in conjunction in a launch plan. @@ -114,3 +89,5 @@ You can employ default and fixed inputs in conjunction in a launch plan. Launch plans can also be used to run workflows on a specific cadence. For more information, refer to the {ref}`scheduling_launch_plan` documentation. + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/basics/ diff --git a/docs/user_guide/basics/named_outputs.md b/docs/user_guide/basics/named_outputs.md index a609cd50a9..2e02678822 100644 --- a/docs/user_guide/basics/named_outputs.md +++ b/docs/user_guide/basics/named_outputs.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (named_outputs)= # Named outputs @@ -35,48 +16,31 @@ and you wish to assign a distinct name to each of them. The following example illustrates the process of assigning names to outputs for both a task and a workflow. -To begin, import the required dependencies. - -```{code-cell} -from typing import NamedTuple - -from flytekit import task, workflow +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} - -Define a `NamedTuple` and assign it as an output to a task. +To begin, import the required dependencies: -```{code-cell} -slope_value = NamedTuple("slope_value", [("slope", float)]) - - -@task -def slope(x: list[int], y: list[int]) -> slope_value: - sum_xy = sum([x[i] * y[i] for i in range(len(x))]) - sum_x_squared = sum([x[i] ** 2 for i in range(len(x))]) - n = len(x) - return (n * sum_xy - sum(x) * sum(y)) / (n * sum_x_squared - sum(x) ** 2) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/named_outputs.py +:caption: basics/named_outputs.py +:lines: 1-3 ``` -+++ {"lines_to_next_cell": 0} - -Likewise, assign a `NamedTuple` to the output of `intercept` task. +Define a `NamedTuple` and assign it as an output to a task: -```{code-cell} -intercept_value = NamedTuple("intercept_value", [("intercept", float)]) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/named_outputs.py +:caption: basics/named_outputs.py +:lines: 6-14 +``` +Likewise, assign a `NamedTuple` to the output of `intercept` task: -@task -def intercept(x: list[int], y: list[int], slope: float) -> intercept_value: - mean_x = sum(x) / len(x) - mean_y = sum(y) / len(y) - intercept = mean_y - slope * mean_x - return intercept +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/named_outputs.py +:caption: basics/named_outputs.py +:lines: 18-26 ``` -+++ {"lines_to_next_cell": 0} - :::{note} While it's possible to create `NamedTuple`s directly within the code, it's often better to declare them explicitly. This helps prevent potential linting errors in tools like mypy. @@ -92,25 +56,19 @@ Additionally, you can also have the workflow return a `NamedTuple` as an output. :::{note} Remember that we are extracting individual task execution outputs by dereferencing them. -This is necessary because `NamedTuple`s function as tuples and require this dereferencing. +This is necessary because `NamedTuple`s function as tuples and require this dereferencing: ::: -```{code-cell} -slope_and_intercept_values = NamedTuple("slope_and_intercept_values", [("slope", float), ("intercept", float)]) - - -@workflow -def simple_wf_with_named_outputs(x: list[int] = [-3, 0, 3], y: list[int] = [7, 4, -2]) -> slope_and_intercept_values: - slope_value = slope(x=x, y=y) - intercept_value = intercept(x=x, y=y, slope=slope_value.slope) - return slope_and_intercept_values(slope=slope_value.slope, intercept=intercept_value.intercept) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/named_outputs.py +:caption: basics/named_outputs.py +:lines: 32-39 ``` -+++ {"lines_to_next_cell": 0} - You can run the workflow locally as follows: -```{code-cell} -if __name__ == "__main__": - print(f"Running simple_wf_with_named_outputs() {simple_wf_with_named_outputs()}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/named_outputs.py +:caption: basics/named_outputs.py +:lines: 43-44 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/basics/ diff --git a/docs/user_guide/basics/shell_tasks.md b/docs/user_guide/basics/shell_tasks.md index 73cc5ab6b8..95df9a90d8 100644 --- a/docs/user_guide/basics/shell_tasks.md +++ b/docs/user_guide/basics/shell_tasks.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (shell_task)= # Shell tasks @@ -28,72 +9,25 @@ kernelspec: To execute bash scripts within Flyte, you can utilize the {py:class}`~flytekit.extras.tasks.shell.ShellTask` class. This example includes three shell tasks to execute bash commands. -First, import the necessary libraries. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -from pathlib import Path -from typing import Tuple +First, import the necessary libraries: -import flytekit -from flytekit import kwtypes, task, workflow -from flytekit.extras.tasks.shell import OutputLocation, ShellTask -from flytekit.types.directory import FlyteDirectory -from flytekit.types.file import FlyteFile +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/shell_task.py +:caption: basics/shell_task.py +:lines: 1-8 ``` -+++ {"lines_to_next_cell": 0} - With the required imports in place, you can proceed to define a shell task. To create a shell task, provide a name for it, specify the bash script to be executed, -and define inputs and outputs if needed. - -```{code-cell} -t1 = ShellTask( - name="task_1", - debug=True, - script=""" - set -ex - echo "Hey there! Let's run some bash scripts using Flyte's ShellTask." - echo "Showcasing Flyte's Shell Task." >> {inputs.x} - if grep "Flyte" {inputs.x} - then - echo "Found it!" >> {inputs.x} - else - echo "Not found!" - fi - """, - inputs=kwtypes(x=FlyteFile), - output_locs=[OutputLocation(var="i", var_type=FlyteFile, location="{inputs.x}")], -) - - -t2 = ShellTask( - name="task_2", - debug=True, - script=""" - set -ex - cp {inputs.x} {inputs.y} - tar -zcvf {outputs.j} {inputs.y} - """, - inputs=kwtypes(x=FlyteFile, y=FlyteDirectory), - output_locs=[OutputLocation(var="j", var_type=FlyteFile, location="{inputs.y}.tar.gz")], -) - - -t3 = ShellTask( - name="task_3", - debug=True, - script=""" - set -ex - tar -zxvf {inputs.z} - cat {inputs.y}/$(basename {inputs.x}) | wc -m > {outputs.k} - """, - inputs=kwtypes(x=FlyteFile, y=FlyteDirectory, z=FlyteFile), - output_locs=[OutputLocation(var="k", var_type=FlyteFile, location="output.txt")], -) -``` +and define inputs and outputs if needed: -+++ {"lines_to_next_cell": 0} +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/shell_task.py +:caption: basics/shell_task.py +:lines: 13-55 +``` Here's a breakdown of the parameters of the `ShellTask`: @@ -104,42 +38,25 @@ Here's a breakdown of the parameters of the `ShellTask`: - The `debug` parameter is helpful for debugging purposes We define a task to instantiate `FlyteFile` and `FlyteDirectory`. -A `.gitkeep` file is created in the FlyteDirectory as a placeholder to ensure the directory exists. +A `.gitkeep` file is created in the FlyteDirectory as a placeholder to ensure the directory exists: -```{code-cell} -@task -def create_entities() -> Tuple[FlyteFile, FlyteDirectory]: - working_dir = Path(flytekit.current_context().working_directory) - flytefile = working_dir / "test.txt" - flytefile.touch() - - flytedir = working_dir / "testdata" - flytedir.mkdir(exist_ok=True) - - flytedir_file = flytedir / ".gitkeep" - flytedir_file.touch() - return flytefile, flytedir +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/shell_task.py +:caption: basics/shell_task.py +:pyobject: create_entities ``` -+++ {"lines_to_next_cell": 0} - -We create a workflow to define the dependencies between the tasks. +We create a workflow to define the dependencies between the tasks: -```{code-cell} -@workflow -def shell_task_wf() -> FlyteFile: - x, y = create_entities() - t1_out = t1(x=x) - t2_out = t2(x=t1_out, y=y) - t3_out = t3(x=x, y=y, z=t2_out) - return t3_out +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/shell_task.py +:caption: basics/shell_task.py +:pyobject: shell_task_wf ``` -+++ {"lines_to_next_cell": 0} +You can run the workflow locally: -You can run the workflow locally. - -```{code-cell} -if __name__ == "__main__": - print(f"Running shell_task_wf() {shell_task_wf()}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/shell_task.py +:caption: basics/shell_task.py +:lines: 85-86 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/basics/ diff --git a/docs/user_guide/basics/tasks.md b/docs/user_guide/basics/tasks.md index 3f9fcb493d..8c059e8d02 100644 --- a/docs/user_guide/basics/tasks.md +++ b/docs/user_guide/basics/tasks.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (task)= # Tasks @@ -47,42 +28,39 @@ Flyte offers numerous plugins for tasks, including backend plugins like This example demonstrates how to write and execute a [Python function task](https://github.com/flyteorg/flytekit/blob/master/flytekit/core/python_function_task.py#L75). -To begin, import `task` from the `flytekit` library. - -```{code-cell} -from flytekit import task +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} +To begin, import `task` from the `flytekit` library: + +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/task.py +:caption: basics/task.py +:lines: 1 +``` The use of the {py:func}`~flytekit.task` decorator is mandatory for a ``PythonFunctionTask``. A task is essentially a regular Python function, with the exception that all inputs and outputs must be clearly annotated with their types. Learn more about the supported types in the {ref}`type-system section `. -We create a task that computes the slope of a regression line. +We create a task that computes the slope of a regression line: -```{code-cell} -@task -def slope(x: list[int], y: list[int]) -> float: - sum_xy = sum([x[i] * y[i] for i in range(len(x))]) - sum_x_squared = sum([x[i] ** 2 for i in range(len(x))]) - n = len(x) - return (n * sum_xy - sum(x) * sum(y)) / (n * sum_x_squared - sum(x) ** 2) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/task.py +:caption: basics/task.py +:pyobject: slope ``` -+++ {"lines_to_next_cell": 0} - :::{note} Flytekit will assign a default name to the output variable like `out0`. In case of multiple outputs, each output will be numbered in the order starting with 0, e.g., -> `out0, out1, out2, ...`. ::: -You can execute a Flyte task just like any regular Python function. +You can execute a Flyte task just like any regular Python function: -```{code-cell} -if __name__ == "__main__": - print(slope(x=[-3, 0, 3], y=[7, 4, -2])) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/task.py +:caption: basics/task.py +:lines: 14-15 ``` :::{note} @@ -106,3 +84,5 @@ pyflyte run --remote \ https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/task.py \ slope --x '[-3,0,3]' --y '[7,4,-2]' ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/basics/ diff --git a/docs/user_guide/basics/workflows.md b/docs/user_guide/basics/workflows.md index d5f46be04e..85b6db1b8e 100644 --- a/docs/user_guide/basics/workflows.md +++ b/docs/user_guide/basics/workflows.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (workflow)= # Workflows @@ -38,55 +19,34 @@ enabling the workflow to be triggered. For more information, see the {std:ref}`registration documentation `. -To begin, import {py:func}`~flytekit.task` and {py:func}`~flytekit.workflow` from the flytekit library. - -```{code-cell} -from flytekit import task, workflow +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} +To begin, import {py:func}`~flytekit.task` and {py:func}`~flytekit.workflow` from the flytekit library: -We define `slope` and `intercept` tasks to compute the slope and -intercept of the regression line, respectively. - -```{code-cell} -@task -def slope(x: list[int], y: list[int]) -> float: - sum_xy = sum([x[i] * y[i] for i in range(len(x))]) - sum_x_squared = sum([x[i] ** 2 for i in range(len(x))]) - n = len(x) - return (n * sum_xy - sum(x) * sum(y)) / (n * sum_x_squared - sum(x) ** 2) - - -@task -def intercept(x: list[int], y: list[int], slope: float) -> float: - mean_x = sum(x) / len(x) - mean_y = sum(y) / len(y) - intercept = mean_y - slope * mean_x - return intercept +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/workflow.py +:caption: basics/workflow.py +:lines: 1 ``` -+++ {"lines_to_next_cell": 0} +We define `slope` and `intercept` tasks to compute the slope and +intercept of the regression line, respectively: -Define a workflow to establish the task dependencies. -Just like a task, a workflow is also strongly typed. - -```{code-cell} -@workflow -def simple_wf(x: list[int], y: list[int]) -> float: - slope_value = slope(x=x, y=y) - intercept_value = intercept(x=x, y=y, slope=slope_value) - return intercept_value +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/workflow.py +:caption: basics/workflow.py +:lines: 6-19 ``` -+++ {"lines_to_next_cell": 0} +Define a workflow to establish the task dependencies. +Just like a task, a workflow is also strongly typed: + +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/workflow.py +:caption: basics/workflow.py +:pyobject: simple_wf +``` -The {py:func}`~flytekit.workflow` decorator encapsulates Flyte tasks, -essentially representing lazily evaluated promises. -During parsing, function calls are deferred until execution time. -These function calls generate {py:class}`~flytekit.extend.Promise`s that can be propagated to downstream functions, -yet remain inaccessible within the workflow itself. -The actual evaluation occurs when the workflow is executed. +The {py:func}`~flytekit.workflow` decorator encapsulates Flyte tasks, essentially representing lazily evaluated promises. During parsing, function calls are deferred until execution time. These function calls generate {py:class}`~flytekit.extend.Promise`s that can be propagated to downstream functions, yet remain inaccessible within the workflow itself. The actual evaluation occurs when the workflow is executed. Workflows can be executed locally, resulting in immediate evaluation, or through tools like [`pyflyte`](https://docs.flyte.org/projects/flytekit/en/latest/pyflyte.html), @@ -106,15 +66,13 @@ However, each task invocation within the dynamic workflow still generates a prom Bear in mind that a workflow can have tasks, other workflows and dynamic workflows. ::: -You can run a workflow by calling it as you would with a Python function and providing the necessary inputs. +You can run a workflow by calling it as you would with a Python function and providing the necessary inputs: -```{code-cell} -if __name__ == "__main__": - print(f"Running simple_wf() {simple_wf(x=[-3, 0, 3], y=[7, 4, -2])}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/workflow.py +:caption: basics/workflow.py +:lines: 33-34 ``` -+++ {"lines_to_next_cell": 0} - To run the workflow locally, you can use the following `pyflyte run` command: ``` @@ -143,12 +101,9 @@ without the confines of a workflow, offers a convenient approach for iterating o You can use the {py:func}`functools.partial` function to assign default or constant values to the parameters of your tasks. -```{code-cell} -import functools - - -@workflow -def simple_wf_with_partial(x: list[int], y: list[int]) -> float: - partial_task = functools.partial(slope, x=x) - return partial_task(y=y) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/workflow.py +:caption: basics/workflow.py +:lines: 39-45 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/basics/ diff --git a/docs/user_guide/customizing_dependencies/imagespec.md b/docs/user_guide/customizing_dependencies/imagespec.md index 12d9295b1e..586bfe2580 100644 --- a/docs/user_guide/customizing_dependencies/imagespec.md +++ b/docs/user_guide/customizing_dependencies/imagespec.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (image_spec_example)= # ImageSpec @@ -39,15 +20,15 @@ the [default Docker image](https://ghcr.io/flyteorg/flytekit), to all tasks. To use the `container_image` parameter available in the {py:func}`flytekit.task` decorator, and pass an `ImageSpec`. -Before building the image, Flytekit checks the container registry first to see if the image already exists. By doing -so, it avoids having to rebuild the image over and over again. If the image does not exist, flytekit will build the -image before registering the workflow, and replace the image name in the task template with the newly built image name. +Before building the image, Flytekit checks the container registry first to see if the image already exists. By doing so, it avoids having to rebuild the image over and over again. If the image does not exist, flytekit will build the image before registering the workflow, and replace the image name in the task template with the newly built image name. -```{code-cell} -import typing +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -import pandas as pd -from flytekit import ImageSpec, Resources, task, workflow +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/customizing_dependencies/customizing_dependencies/image_spec.py +:caption: customizing_dependencies/image_spec.py +:lines: 1-4 ``` :::{admonition} Prerequisites @@ -58,35 +39,19 @@ from flytekit import ImageSpec, Resources, task, workflow - When using a registry in ImageSpec, `docker login` is required to push the image ::: -+++ {"lines_to_next_cell": 0} - You can specify python packages, apt packages, and environment variables in the `ImageSpec`. These specified packages will be added on top of the [default image](https://github.com/flyteorg/flytekit/blob/master/Dockerfile), which can be found in the Flytekit Dockerfile. More specifically, flytekit invokes [DefaultImages.default_image()](https://github.com/flyteorg/flytekit/blob/f2cfef0ec098d4ae8f042ab915b0b30d524092c6/flytekit/configuration/default_images.py#L26-L27) function. This function determines and returns the default image based on the Python version and flytekit version. For example, if you are using python 3.8 and flytekit 0.16.0, the default image assigned will be `ghcr.io/flyteorg/flytekit:py3.8-1.6.0`. If desired, you can also override the default image by providing a custom `base_image` parameter when using the `ImageSpec`. -```{code-cell} -pandas_image_spec = ImageSpec( - base_image="ghcr.io/flyteorg/flytekit:py3.8-1.6.2", - packages=["pandas", "numpy"], - python_version="3.9", - apt_packages=["git"], - env={"Debug": "True"}, - registry="ghcr.io/flyteorg", -) - -sklearn_image_spec = ImageSpec( - base_image="ghcr.io/flyteorg/flytekit:py3.8-1.6.2", - packages=["scikit-learn"], - registry="ghcr.io/flyteorg", -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/customizing_dependencies/customizing_dependencies/image_spec.py +:caption: customizing_dependencies/image_spec.py +:lines: 6-19 ``` -+++ {"lines_to_next_cell": 0} - :::{important} -Replace `ghcr.io/flyteorg` with a container registry you've access to publish to. +Replace `ghcr.io/flyteorg` with a container registry you can publish to. To upload the image to the local registry in the demo cluster, indicate the registry as `localhost:30000`. ::: @@ -94,45 +59,16 @@ To upload the image to the local registry in the demo cluster, indicate the regi If the task is indeed using the image built from the `ImageSpec`, it will then import Tensorflow. This approach helps minimize module loading time and prevents unnecessary dependency installation within a single image. -```{code-cell} -if sklearn_image_spec.is_container(): - from sklearn.linear_model import LogisticRegression +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/customizing_dependencies/customizing_dependencies/image_spec.py +:caption: customizing_dependencies/image_spec.py +:lines: 21-22 ``` -+++ {"lines_to_next_cell": 0} - To enable tasks to utilize the images built with `ImageSpec`, you can specify the `container_image` parameter for those tasks. -```{code-cell} -@task(container_image=pandas_image_spec) -def get_pandas_dataframe() -> typing.Tuple[pd.DataFrame, pd.Series]: - df = pd.read_csv("https://storage.googleapis.com/download.tensorflow.org/data/heart.csv") - print(df.head()) - return df[["age", "thalach", "trestbps", "chol", "oldpeak"]], df.pop("target") - - -@task(container_image=sklearn_image_spec, requests=Resources(cpu="1", mem="1Gi")) -def get_model(max_iter: int, multi_class: str) -> typing.Any: - return LogisticRegression(max_iter=max_iter, multi_class=multi_class) - - -# Get a basic model to train. -@task(container_image=sklearn_image_spec, requests=Resources(cpu="1", mem="1Gi")) -def train_model(model: typing.Any, feature: pd.DataFrame, target: pd.Series) -> typing.Any: - model.fit(feature, target) - return model - - -# Lastly, let's define a workflow to capture the dependencies between the tasks. -@workflow() -def wf(): - feature, target = get_pandas_dataframe() - model = get_model(max_iter=3000, multi_class="auto") - train_model(model=model, feature=feature, target=target) - - -if __name__ == "__main__": - wf() +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/customizing_dependencies/customizing_dependencies/image_spec.py +:caption: customizing_dependencies/image_spec.py +:lines: 27-56 ``` There exists an option to override the container image by providing an Image Spec YAML file to the `pyflyte run` or `pyflyte register` command. @@ -153,16 +89,12 @@ env: pyflyte run --remote --image image.yaml image_spec.py wf ``` -+++ - If you only want to build the image without registering the workflow, you can use the `pyflyte build` command. ``` pyflyte build --remote image_spec.py wf ``` -+++ - In some cases, you may want to force an image to rebuild, even if the image spec hasn’t changed. If you want to overwrite an existing image, you can pass the `FLYTE_FORCE_PUSH_IMAGE_SPEC=True` to `pyflyte` command or add `force_push()` to the ImageSpec. ```bash @@ -174,3 +106,4 @@ or ```python image = ImageSpec(registry="ghcr.io/flyteorg", packages=["pandas"]).force_push() ``` +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/customizing_dependencies/ diff --git a/docs/user_guide/customizing_dependencies/multiple_images_in_a_workflow.md b/docs/user_guide/customizing_dependencies/multiple_images_in_a_workflow.md index 0c323cada9..f4411fac65 100644 --- a/docs/user_guide/customizing_dependencies/multiple_images_in_a_workflow.md +++ b/docs/user_guide/customizing_dependencies/multiple_images_in_a_workflow.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (multi_images)= # Multiple images in a workflow @@ -31,33 +14,13 @@ To modify this behavior, use the `container_image` parameter available in the {p If the Docker image is not available publicly, refer to {ref}`Pulling Private Images`. ::: -```{code-cell} -:lines_to_next_cell: 2 - -import numpy as np -from flytekit import task, workflow - - -@task(container_image="{{.image.mindmeld.fqn}}:{{.image.mindmeld.version}}") -def get_data() -> np.ndarray: - # here we're importing scikit learn within the Flyte task - from sklearn import datasets - - iris = datasets.load_iris() - X = iris.data[:, :2] - return X - - -@task(container_image="{{.image.borebuster.fqn}}:{{.image.borebuster.version}}") -def normalize(X: np.ndarray) -> np.ndarray: - return (X - X.mean(axis=0)) / X.std(axis=0) - +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -@workflow -def multi_images_wf() -> np.ndarray: - X = get_data() - X = normalize(X=X) - return X +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/customizing_dependencies/customizing_dependencies/multi_images.py +:caption: customizing_dependencies/multi_images.py +:lines: 1-24 ``` Observe how the `sklearn` library is imported in the context of a Flyte task. @@ -108,3 +71,5 @@ Send the name of the configuration file to your `pyflyte run` command as follows ``` pyflyte --config $HOME/.flyte/config.yaml run --remote multi_images.py multi_images_wf ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/customizing_dependencies/ diff --git a/docs/user_guide/customizing_dependencies/raw_containers.md b/docs/user_guide/customizing_dependencies/raw_containers.md index 2ba6cfec55..7f7d25afd6 100644 --- a/docs/user_guide/customizing_dependencies/raw_containers.md +++ b/docs/user_guide/customizing_dependencies/raw_containers.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (raw_container)= # Raw containers @@ -25,22 +6,19 @@ kernelspec: .. tags:: Containerization, Advanced ``` -This example demonstrates how to use arbitrary containers in 5 different languages, all orchestrated in flytekit seamlessly. -Flyte mounts an input data volume where all the data needed by the container is available, and an output data volume -for the container to write all the data which will be stored away. +This example demonstrates how to use arbitrary containers in 5 different languages, all orchestrated in flytekit seamlessly. Flyte mounts an input data volume where all the data needed by the container is available, and an output data volume for the container to write all the data which will be stored away. The data is written as separate files, one per input variable. The format of the file is serialized strings. Refer to the raw protocol to understand how to leverage this. -```{code-cell} -import logging - -from flytekit import ContainerTask, kwtypes, task, workflow - -logger = logging.getLogger(__file__) +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/customizing_dependencies/customizing_dependencies/raw_container.py +:caption: customizing_dependencies/raw_container.py +:lines: 1-5 +``` ## Container tasks @@ -53,137 +31,17 @@ is `calculate_ellipse_area_shell`. This name has to be unique in the entire proj `inputs` and `outputs` specify the interface for the task; thus it should be an ordered dictionary of typed input and output variables. -```{code-cell} -calculate_ellipse_area_shell = ContainerTask( - name="ellipse-area-metadata-shell", - input_data_dir="/var/inputs", - output_data_dir="/var/outputs", - inputs=kwtypes(a=float, b=float), - outputs=kwtypes(area=float, metadata=str), - image="ghcr.io/flyteorg/rawcontainers-shell:v2", - command=[ - "./calculate-ellipse-area.sh", - "{{.inputs.a}}", - "{{.inputs.b}}", - "/var/outputs", - ], -) - -calculate_ellipse_area_python = ContainerTask( - name="ellipse-area-metadata-python", - input_data_dir="/var/inputs", - output_data_dir="/var/outputs", - inputs=kwtypes(a=float, b=float), - outputs=kwtypes(area=float, metadata=str), - image="ghcr.io/flyteorg/rawcontainers-python:v2", - command=[ - "python", - "calculate-ellipse-area.py", - "{{.inputs.a}}", - "{{.inputs.b}}", - "/var/outputs", - ], -) - -calculate_ellipse_area_r = ContainerTask( - name="ellipse-area-metadata-r", - input_data_dir="/var/inputs", - output_data_dir="/var/outputs", - inputs=kwtypes(a=float, b=float), - outputs=kwtypes(area=float, metadata=str), - image="ghcr.io/flyteorg/rawcontainers-r:v2", - command=[ - "Rscript", - "--vanilla", - "calculate-ellipse-area.R", - "{{.inputs.a}}", - "{{.inputs.b}}", - "/var/outputs", - ], -) - -calculate_ellipse_area_haskell = ContainerTask( - name="ellipse-area-metadata-haskell", - input_data_dir="/var/inputs", - output_data_dir="/var/outputs", - inputs=kwtypes(a=float, b=float), - outputs=kwtypes(area=float, metadata=str), - image="ghcr.io/flyteorg/rawcontainers-haskell:v2", - command=[ - "./calculate-ellipse-area", - "{{.inputs.a}}", - "{{.inputs.b}}", - "/var/outputs", - ], -) - -calculate_ellipse_area_julia = ContainerTask( - name="ellipse-area-metadata-julia", - input_data_dir="/var/inputs", - output_data_dir="/var/outputs", - inputs=kwtypes(a=float, b=float), - outputs=kwtypes(area=float, metadata=str), - image="ghcr.io/flyteorg/rawcontainers-julia:v2", - command=[ - "julia", - "calculate-ellipse-area.jl", - "{{.inputs.a}}", - "{{.inputs.b}}", - "/var/outputs", - ], -) - - -@task -def report_all_calculated_areas( - area_shell: float, - metadata_shell: str, - area_python: float, - metadata_python: str, - area_r: float, - metadata_r: str, - area_haskell: float, - metadata_haskell: str, - area_julia: float, - metadata_julia: str, -): - logger.info(f"shell: area={area_shell}, metadata={metadata_shell}") - logger.info(f"python: area={area_python}, metadata={metadata_python}") - logger.info(f"r: area={area_r}, metadata={metadata_r}") - logger.info(f"haskell: area={area_haskell}, metadata={metadata_haskell}") - logger.info(f"julia: area={area_julia}, metadata={metadata_julia}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/customizing_dependencies/customizing_dependencies/raw_container.py +:caption: customizing_dependencies/raw_container.py +:lines: 15-112 ``` -+++ {"lines_to_next_cell": 0} - As can be seen in this example, `ContainerTask`s can be interacted with like normal Python functions, whose inputs correspond to the declared input variables. All data returned by the tasks are consumed and logged by a Flyte task. -```{code-cell} -:lines_to_next_cell: 2 - -@workflow -def wf(a: float, b: float): - # Calculate area in all languages - area_shell, metadata_shell = calculate_ellipse_area_shell(a=a, b=b) - area_python, metadata_python = calculate_ellipse_area_python(a=a, b=b) - area_r, metadata_r = calculate_ellipse_area_r(a=a, b=b) - area_haskell, metadata_haskell = calculate_ellipse_area_haskell(a=a, b=b) - area_julia, metadata_julia = calculate_ellipse_area_julia(a=a, b=b) - - # Report on all results in a single task to simplify comparison - report_all_calculated_areas( - area_shell=area_shell, - metadata_shell=metadata_shell, - area_python=area_python, - metadata_python=metadata_python, - area_r=area_r, - metadata_r=metadata_r, - area_haskell=area_haskell, - metadata_haskell=metadata_haskell, - area_julia=area_julia, - metadata_julia=metadata_julia, - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/customizing_dependencies/customizing_dependencies/raw_container.py +:caption: customizing_dependencies/raw_container.py +:pyobject: wf ``` One of the benefits of raw container tasks is that Flytekit does not need to be installed in the target container. @@ -225,3 +83,5 @@ The contents of each script specified in the `ContainerTask` is as follows: ```{literalinclude} raw-containers-supporting-files/per-language/julia/calculate-ellipse-area.jl :language: julia ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/customizing_dependencies/ diff --git a/docs/user_guide/data_types_and_io/accessing_attributes.md b/docs/user_guide/data_types_and_io/accessing_attributes.md index 42706a3d1d..4c4a01483f 100644 --- a/docs/user_guide/data_types_and_io/accessing_attributes.md +++ b/docs/user_guide/data_types_and_io/accessing_attributes.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (attribute_access)= # Accessing attributes @@ -25,27 +6,20 @@ kernelspec: .. tags:: Basic ``` -You can directly access attributes on output promises for lists, dicts, dataclasses and combinations of these types in Flyte. -This functionality facilitates the direct passing of output attributes within workflows, +You can directly access attributes on output promises for lists, dicts, dataclasses and combinations of these types in Flyte. This functionality facilitates the direct passing of output attributes within workflows, enhancing the convenience of working with complex data structures. -To begin, import the required dependencies and define a common task for subsequent use. - -```{code-cell} -from dataclasses import dataclass - -from dataclasses_json import dataclass_json -from flytekit import task, workflow +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` +To begin, import the required dependencies and define a common task for subsequent use: -@task -def print_message(message: str): - print(message) - return +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/attribute_access.py +:caption: data_types_and_io/attribute_access.py +:lines: 1-10 ``` -+++ {"lines_to_next_cell": 0} - ## List You can access an output list using index notation. @@ -53,103 +27,40 @@ You can access an output list using index notation. Flyte currently does not support output promise access through list slicing. ::: -```{code-cell} -@task -def list_task() -> list[str]: - return ["apple", "banana"] - - -@workflow -def list_wf(): - items = list_task() - first_item = items[0] - print_message(message=first_item) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/attribute_access.py +:caption: data_types_and_io/attribute_access.py +:lines: 14-23 ``` -+++ {"lines_to_next_cell": 0} - ## Dictionary Access the output dictionary by specifying the key. -```{code-cell} -@task -def dict_task() -> dict[str, str]: - return {"fruit": "banana"} - - -@workflow -def dict_wf(): - fruit_dict = dict_task() - print_message(message=fruit_dict["fruit"]) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/attribute_access.py +:caption: data_types_and_io/attribute_access.py +:lines: 27-35 ``` -+++ {"lines_to_next_cell": 0} - ## Data class Directly access an attribute of a dataclass. -```{code-cell} -@dataclass_json -@dataclass -class Fruit: - name: str - - -@task -def dataclass_task() -> Fruit: - return Fruit(name="banana") - - -@workflow -def dataclass_wf(): - fruit_instance = dataclass_task() - print_message(message=fruit_instance.name) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/attribute_access.py +:caption: data_types_and_io/attribute_access.py +:lines: 39-53 ``` -+++ {"lines_to_next_cell": 0} - ## Complex type Combinations of list, dict and dataclass also work effectively. -```{code-cell} -@task -def advance_task() -> (dict[str, list[str]], list[dict[str, str]], dict[str, Fruit]): - return {"fruits": ["banana"]}, [{"fruit": "banana"}], {"fruit": Fruit(name="banana")} - - -@task -def print_list(fruits: list[str]): - print(fruits) - - -@task -def print_dict(fruit_dict: dict[str, str]): - print(fruit_dict) - - -@workflow -def advanced_workflow(): - dictionary_list, list_dict, dict_dataclass = advance_task() - print_message(message=dictionary_list["fruits"][0]) - print_message(message=list_dict[0]["fruit"]) - print_message(message=dict_dataclass["fruit"].name) - - print_list(fruits=dictionary_list["fruits"]) - print_dict(fruit_dict=list_dict[0]) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/attribute_access.py +:caption: data_types_and_io/attribute_access.py +:lines: 57-80 ``` -+++ {"lines_to_next_cell": 0} - You can run all the workflows locally as follows: -```{code-cell} -:lines_to_next_cell: 2 - -if __name__ == "__main__": - list_wf() - dict_wf() - dataclass_wf() - advanced_workflow() +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/attribute_access.py +:caption: data_types_and_io/attribute_access.py +:lines: 84-88 ``` ## Failure scenario @@ -174,3 +85,5 @@ def failed_workflow(): print_message(message=fruit_dict["fruits"]) # Accessing a non-existent key print_message(message=fruit_instance.fruit) # Accessing a non-existent param ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/data_types_and_io/ diff --git a/docs/user_guide/data_types_and_io/dataclass.md b/docs/user_guide/data_types_and_io/dataclass.md index 7bdaee0385..4c7704d73a 100644 --- a/docs/user_guide/data_types_and_io/dataclass.md +++ b/docs/user_guide/data_types_and_io/dataclass.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (dataclass)= # Dataclass @@ -38,36 +19,25 @@ If you're using Flytekit version >= v1.11.1, you don't need to decorate with `@d inherit from Mashumaro's `DataClassJSONMixin`. ::: -To begin, import the necessary dependencies. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -import os -import tempfile -from dataclasses import dataclass +To begin, import the necessary dependencies: -import pandas as pd -from flytekit import task, workflow -from flytekit.types.directory import FlyteDirectory -from flytekit.types.file import FlyteFile -from flytekit.types.structured import StructuredDataset -from mashumaro.mixins.json import DataClassJSONMixin +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/dataclass.py +:caption: data_types_and_io/dataclass.py +:lines: 1-10 ``` -+++ {"lines_to_next_cell": 0} - ## Python types We define a `dataclass` with `int`, `str` and `dict` as the data types. -```{code-cell} -@dataclass -class Datum(DataClassJSONMixin): - x: int - y: str - z: dict[int, str] +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/dataclass.py +:caption: data_types_and_io/dataclass.py +:pyobject: Datum ``` -+++ {"lines_to_next_cell": 0} - You can send a `dataclass` between different tasks written in various languages, and input it through the Flyte console as raw JSON. :::{note} @@ -76,95 +46,35 @@ All variables in a data class should be **annotated with their type**. Failure t Once declared, a dataclass can be returned as an output or accepted as an input. -```{code-cell} -@task -def stringify(s: int) -> Datum: - """ - A dataclass return will be treated as a single complex JSON return. - """ - return Datum(x=s, y=str(s), z={s: str(s)}) - - -@task -def add(x: Datum, y: Datum) -> Datum: - """ - Flytekit automatically converts the provided JSON into a data class. - If the structures don't match, it triggers a runtime failure. - """ - x.z.update(y.z) - return Datum(x=x.x + y.x, y=x.y + y.y, z=x.z) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/dataclass.py +:caption: data_types_and_io/dataclass.py +:lines: 28-43 ``` -+++ {"lines_to_next_cell": 0} - ## Flyte types We also define a data class that accepts {std:ref}`StructuredDataset `, {std:ref}`FlyteFile ` and {std:ref}`FlyteDirectory `. -```{code-cell} -@dataclass -class FlyteTypes(DataClassJSONMixin): - dataframe: StructuredDataset - file: FlyteFile - directory: FlyteDirectory - - -@task -def upload_data() -> FlyteTypes: - """ - Flytekit will upload FlyteFile, FlyteDirectory and StructuredDataset to the blob store, - such as GCP or S3. - """ - # 1. StructuredDataset - df = pd.DataFrame({"Name": ["Tom", "Joseph"], "Age": [20, 22]}) - - # 2. FlyteDirectory - temp_dir = tempfile.mkdtemp(prefix="flyte-") - df.to_parquet(temp_dir + "/df.parquet") - - # 3. FlyteFile - file_path = tempfile.NamedTemporaryFile(delete=False) - file_path.write(b"Hello, World!") - - fs = FlyteTypes( - dataframe=StructuredDataset(dataframe=df), - file=FlyteFile(file_path.name), - directory=FlyteDirectory(temp_dir), - ) - return fs - - -@task -def download_data(res: FlyteTypes): - assert pd.DataFrame({"Name": ["Tom", "Joseph"], "Age": [20, 22]}).equals(res.dataframe.open(pd.DataFrame).all()) - f = open(res.file, "r") - assert f.read() == "Hello, World!" - assert os.listdir(res.directory) == ["df.parquet"] +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/dataclass.py +:caption: data_types_and_io/dataclass.py +:lines: 47-84 ``` -+++ {"lines_to_next_cell": 0} - A data class supports the usage of data associated with Python types, data classes, flyte file, flyte directory and structured dataset. We define a workflow that calls the tasks created above. -```{code-cell} -@workflow -def dataclass_wf(x: int, y: int) -> (Datum, FlyteTypes): - o1 = add(x=stringify(s=x), y=stringify(s=y)) - o2 = upload_data() - download_data(res=o2) - return o1, o2 +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/dataclass.py +:caption: data_types_and_io/dataclass.py +:pyobject: dataclass_wf ``` -+++ {"lines_to_next_cell": 0} - You can run the workflow locally as follows: -```{code-cell} -if __name__ == "__main__": - dataclass_wf(x=10, y=20) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/dataclass.py +:caption: data_types_and_io/dataclass.py +:lines: 97-98 ``` To trigger a task that accepts a dataclass as an input with `pyflyte run`, you can provide a JSON file as an input: @@ -173,3 +83,5 @@ pyflyte run \ https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/dataclass.py \ add --x dataclass_input.json --y dataclass_input.json ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/data_types_and_io/ diff --git a/docs/user_guide/data_types_and_io/enum_type.md b/docs/user_guide/data_types_and_io/enum_type.md index b4727c508f..58142c93ea 100644 --- a/docs/user_guide/data_types_and_io/enum_type.md +++ b/docs/user_guide/data_types_and_io/enum_type.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - # Enum type ```{eval-rst} @@ -35,55 +16,32 @@ Flyte assumes the first value in the list as the default, and Enum types cannot Therefore, when defining enums, it's important to design them with the first value as a valid default. ::: -To begin, import the dependencies. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -from enum import Enum +To begin, import the dependencies: -from flytekit import task, workflow +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/enum_type.py +:caption: data_types_and_io/enum_type.py +:lines: 1-3 ``` -+++ {"lines_to_next_cell": 0} - We define an enum and a simple coffee maker workflow that accepts an order and brews coffee ☕️ accordingly. -The assumption is that the coffee maker only understands enum inputs. - -```{code-cell} -class Coffee(Enum): - ESPRESSO = "espresso" - AMERICANO = "americano" - LATTE = "latte" - CAPPUCCINO = "cappucccino" - - -@task -def take_order(coffee: str) -> Coffee: - return Coffee(coffee) +The assumption is that the coffee maker only understands enum inputs: - -@task -def prep_order(coffee_enum: Coffee) -> str: - return f"Preparing {coffee_enum.value} ..." - - -@workflow -def coffee_maker(coffee: str) -> str: - coffee_enum = take_order(coffee=coffee) - return prep_order(coffee_enum=coffee_enum) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/enum_type.py +:caption: data_types_and_io/enum_type.py +:lines: 9-35 ``` -+++ {"lines_to_next_cell": 0} +The workflow can also accept an enum value: -The workflow can also accept an enum value. - -```{code-cell} -@workflow -def coffee_maker_enum(coffee_enum: Coffee) -> str: - return prep_order(coffee_enum=coffee_enum) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/enum_type.py +:caption: data_types_and_io/enum_type.py +:pyobject: coffee_maker_enum ``` -+++ {"lines_to_next_cell": 0} - You can send a string to the `coffee_maker_enum` workflow during its execution, like this: ``` pyflyte run \ @@ -91,10 +49,11 @@ pyflyte run \ coffee_maker_enum --coffee_enum="latte" ``` -You can run the workflows locally. +You can run the workflows locally: -```{code-cell} -if __name__ == "__main__": - print(coffee_maker(coffee="latte")) - print(coffee_maker_enum(coffee_enum=Coffee.LATTE)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/enum_type.py +:caption: data_types_and_io/enum_type.py +:lines: 44-46 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/data_types_and_io/ diff --git a/docs/user_guide/data_types_and_io/flytedirectory.md b/docs/user_guide/data_types_and_io/flytedirectory.md index 6dd75ed159..6297535269 100644 --- a/docs/user_guide/data_types_and_io/flytedirectory.md +++ b/docs/user_guide/data_types_and_io/flytedirectory.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (folder)= # FlyteDirectory @@ -29,50 +10,28 @@ In addition to files, folders are another fundamental operating system primitive Flyte supports folders in the form of [multi-part blobs](https://github.com/flyteorg/flyteidl/blob/master/protos/flyteidl/core/types.proto#L73). -To begin, import the libraries. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -import csv -import os -import urllib.request -from collections import defaultdict -from pathlib import Path -from typing import List +To begin, import the libraries: -import flytekit -from flytekit import task, workflow -from flytekit.types.directory import FlyteDirectory +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/folder.py +:caption: data_types_and_io/folder.py +:lines: 1-10 ``` -+++ {"lines_to_next_cell": 0} - Building upon the previous example demonstrated in the {std:ref}`file ` section, let's continue by considering the normalization of columns in a CSV file. The following task downloads a list of URLs pointing to CSV files and returns the folder path in a `FlyteDirectory` object. -```{code-cell} -@task -def download_files(csv_urls: List[str]) -> FlyteDirectory: - working_dir = flytekit.current_context().working_directory - local_dir = Path(os.path.join(working_dir, "csv_files")) - local_dir.mkdir(exist_ok=True) - - # get the number of digits needed to preserve the order of files in the local directory - zfill_len = len(str(len(csv_urls))) - for idx, remote_location in enumerate(csv_urls): - local_image = os.path.join( - # prefix the file name with the index location of the file in the original csv_urls list - local_dir, - f"{str(idx).zfill(zfill_len)}_{os.path.basename(remote_location)}", - ) - urllib.request.urlretrieve(remote_location, local_image) - return FlyteDirectory(path=str(local_dir)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/folder.py +:caption: data_types_and_io/folder.py +:pyobject: download_files ``` -+++ {"lines_to_next_cell": 0} - :::{note} You can annotate a `FlyteDirectory` when you want to download or upload the contents of the directory in batches. For example, @@ -98,102 +57,33 @@ demonstrates how Flyte tasks are simply entrypoints of execution, which can them other functions and routines that are written in pure Python. ::: -```{code-cell} -def normalize_columns( - local_csv_file: str, - column_names: List[str], - columns_to_normalize: List[str], -): - # read the data from the raw csv file - parsed_data = defaultdict(list) - with open(local_csv_file, newline="\n") as input_file: - reader = csv.DictReader(input_file, fieldnames=column_names) - for row in (x for i, x in enumerate(reader) if i > 0): - for column in columns_to_normalize: - parsed_data[column].append(float(row[column].strip())) - - # normalize the data - normalized_data = defaultdict(list) - for colname, values in parsed_data.items(): - mean = sum(values) / len(values) - std = (sum([(x - mean) ** 2 for x in values]) / len(values)) ** 0.5 - normalized_data[colname] = [(x - mean) / std for x in values] - - # overwrite the csv file with the normalized columns - with open(local_csv_file, mode="w") as output_file: - writer = csv.DictWriter(output_file, fieldnames=columns_to_normalize) - writer.writeheader() - for row in zip(*normalized_data.values()): - writer.writerow({k: row[i] for i, k in enumerate(columns_to_normalize)}) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/folder.py +:caption: data_types_and_io/folder.py +:pyobject: normalize_columns ``` -+++ {"lines_to_next_cell": 0} - We then define a task that accepts the previously downloaded folder, along with some metadata about the column names of each file in the directory and the column names that we want to normalize. -```{code-cell} -@task -def normalize_all_files( - csv_files_dir: FlyteDirectory, - columns_metadata: List[List[str]], - columns_to_normalize_metadata: List[List[str]], -) -> FlyteDirectory: - for local_csv_file, column_names, columns_to_normalize in zip( - # make sure we sort the files in the directory to preserve the original order of the csv urls - [os.path.join(csv_files_dir, x) for x in sorted(os.listdir(csv_files_dir))], - columns_metadata, - columns_to_normalize_metadata, - ): - normalize_columns(local_csv_file, column_names, columns_to_normalize) - return FlyteDirectory(path=csv_files_dir.path) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/folder.py +:caption: data_types_and_io/folder.py +:pyobject: normalize_all_files ``` -+++ {"lines_to_next_cell": 0} - Compose all of the above tasks into a workflow. This workflow accepts a list of URL strings pointing to a remote location containing a CSV file, a list of column names associated with each CSV file, and a list of columns that we want to normalize. -```{code-cell} -@workflow -def download_and_normalize_csv_files( - csv_urls: List[str], - columns_metadata: List[List[str]], - columns_to_normalize_metadata: List[List[str]], -) -> FlyteDirectory: - directory = download_files(csv_urls=csv_urls) - return normalize_all_files( - csv_files_dir=directory, - columns_metadata=columns_metadata, - columns_to_normalize_metadata=columns_to_normalize_metadata, - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/folder.py +:caption: data_types_and_io/folder.py +:pyobject: download_and_normalize_csv_files ``` -+++ {"lines_to_next_cell": 0} - You can run the workflow locally as follows: -```{code-cell} -if __name__ == "__main__": - csv_urls = [ - "https://people.sc.fsu.edu/~jburkardt/data/csv/biostats.csv", - "https://people.sc.fsu.edu/~jburkardt/data/csv/faithful.csv", - ] - columns_metadata = [ - ["Name", "Sex", "Age", "Heights (in)", "Weight (lbs)"], - ["Index", "Eruption length (mins)", "Eruption wait (mins)"], - ] - columns_to_normalize_metadata = [ - ["Age"], - ["Eruption length (mins)"], - ] - - print(f"Running {__file__} main...") - directory = download_and_normalize_csv_files( - csv_urls=csv_urls, - columns_metadata=columns_metadata, - columns_to_normalize_metadata=columns_to_normalize_metadata, - ) - print(f"Running download_and_normalize_csv_files on {csv_urls}: " f"{directory}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/folder.py +:caption: data_types_and_io/folder.py +:lines: 98-118 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/data_types_and_io/ diff --git a/docs/user_guide/data_types_and_io/flytefile.md b/docs/user_guide/data_types_and_io/flytefile.md index 474cad4041..97330669a5 100644 --- a/docs/user_guide/data_types_and_io/flytefile.md +++ b/docs/user_guide/data_types_and_io/flytefile.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (file)= # FlyteFile @@ -36,21 +17,17 @@ links, read them with the python built-in {py:class}`csv.DictReader` function, normalize some pre-specified columns, and output the normalized columns to another csv file. -First, import the libraries. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -import csv -import os -from collections import defaultdict -from typing import List +First, import the libraries: -import flytekit -from flytekit import task, workflow -from flytekit.types.file import FlyteFile +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/file.py +:caption: data_types_and_io/file.py +:lines: 1-8 ``` -+++ {"lines_to_next_cell": 0} - Define a task that accepts {py:class}`~flytekit.types.file.FlyteFile` as an input. The following is a task that accepts a `FlyteFile`, a list of column names, and a list of column names to normalize. The task then outputs a CSV file @@ -66,103 +43,29 @@ Predefined aliases for commonly used flyte file formats are also available. You can find them [here](https://github.com/flyteorg/flytekit/blob/master/flytekit/types/file/__init__.py). ::: -```{code-cell} -@task -def normalize_columns( - csv_url: FlyteFile, - column_names: List[str], - columns_to_normalize: List[str], - output_location: str, -) -> FlyteFile: - # read the data from the raw csv file - parsed_data = defaultdict(list) - with open(csv_url, newline="\n") as input_file: - reader = csv.DictReader(input_file, fieldnames=column_names) - next(reader) # Skip header - for row in reader: - for column in columns_to_normalize: - parsed_data[column].append(float(row[column].strip())) - - # normalize the data - normalized_data = defaultdict(list) - for colname, values in parsed_data.items(): - mean = sum(values) / len(values) - std = (sum([(x - mean) ** 2 for x in values]) / len(values)) ** 0.5 - normalized_data[colname] = [(x - mean) / std for x in values] - - # write to local path - out_path = os.path.join( - flytekit.current_context().working_directory, - f"normalized-{os.path.basename(csv_url.path).rsplit('.')[0]}.csv", - ) - with open(out_path, mode="w") as output_file: - writer = csv.DictWriter(output_file, fieldnames=columns_to_normalize) - writer.writeheader() - for row in zip(*normalized_data.values()): - writer.writerow({k: row[i] for i, k in enumerate(columns_to_normalize)}) - - if output_location: - return FlyteFile(path=out_path, remote_path=output_location) - else: - return FlyteFile(path=out_path) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/file.py +:caption: data_types_and_io/file.py +:pyobject: normalize_columns ``` -+++ {"lines_to_next_cell": 0} - -When the image URL is sent to the task, the Flytekit engine translates it into a `FlyteFile` object on the local -drive (but doesn't download it). The act of calling the `download()` method should trigger the download, and the `path` -attribute enables to `open` the file. - -If the `output_location` argument is specified, it will be passed to the `remote_path` argument of `FlyteFile`, -which will use that path as the storage location instead of a random location (Flyte's object store). - -When this task finishes, the Flytekit engine returns the `FlyteFile` instance, uploads the file to the location, and -creates a blob literal pointing to it. - -Lastly, define a workflow. The `normalize_csv_files` workflow has an `output_location` argument which is passed -to the `location` input of the task. If it's not an empty string, the task attempts to -upload its file to that location. - -```{code-cell} -@workflow -def normalize_csv_file( - csv_url: FlyteFile, - column_names: List[str], - columns_to_normalize: List[str], - output_location: str = "", -) -> FlyteFile: - return normalize_columns( - csv_url=csv_url, - column_names=column_names, - columns_to_normalize=columns_to_normalize, - output_location=output_location, - ) -``` +When the image URL is sent to the task, the Flytekit engine translates it into a `FlyteFile` object on the local drive (but doesn't download it). The act of calling the `download()` method should trigger the download, and the `path` attribute enables to `open` the file. + +If the `output_location` argument is specified, it will be passed to the `remote_path` argument of `FlyteFile`, which will use that path as the storage location instead of a random location (Flyte's object store). -+++ {"lines_to_next_cell": 0} +When this task finishes, the Flytekit engine returns the `FlyteFile` instance, uploads the file to the location, and creates a blob literal pointing to it. + +Lastly, define a workflow. The `normalize_csv_files` workflow has an `output_location` argument which is passed to the `location` input of the task. If it's not an empty string, the task attempts to upload its file to that location. + +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/file.py +:caption: data_types_and_io/file.py +:pyobject: normalize_csv_file +``` You can run the workflow locally as follows: -```{code-cell} -if __name__ == "__main__": - default_files = [ - ( - "https://people.sc.fsu.edu/~jburkardt/data/csv/biostats.csv", - ["Name", "Sex", "Age", "Heights (in)", "Weight (lbs)"], - ["Age"], - ), - ( - "https://people.sc.fsu.edu/~jburkardt/data/csv/faithful.csv", - ["Index", "Eruption length (mins)", "Eruption wait (mins)"], - ["Eruption length (mins)"], - ), - ] - print(f"Running {__file__} main...") - for index, (csv_url, column_names, columns_to_normalize) in enumerate(default_files): - normalized_columns = normalize_csv_file( - csv_url=csv_url, - column_names=column_names, - columns_to_normalize=columns_to_normalize, - ) - print(f"Running normalize_csv_file workflow on {csv_url}: " f"{normalized_columns}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/file.py +:caption: data_types_and_io/file.py +:lines: 75-95 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/data_types_and_io/ diff --git a/docs/user_guide/data_types_and_io/pickle_type.md b/docs/user_guide/data_types_and_io/pickle_type.md index b5cbb89f5a..19987d6288 100644 --- a/docs/user_guide/data_types_and_io/pickle_type.md +++ b/docs/user_guide/data_types_and_io/pickle_type.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (pickle_type)= # Pickle type @@ -42,11 +23,14 @@ or register a custom transformer, as using pickle types can result in lower perf This example demonstrates how you can utilize custom objects without registering a transformer. -```{code-cell} -from flytekit import task, workflow +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/pickle_type.py +:caption: data_types_and_io/pickle_type.py +:lines: 1 +``` `Superhero` represents a user-defined complex type that can be serialized to a pickle file by Flytekit and transferred between tasks as both input and output data. @@ -56,31 +40,11 @@ Alternatively, you can {ref}`turn this object into a dataclass ` for We have used a simple object here for demonstration purposes. ::: -```{code-cell} -class Superhero: - def __init__(self, name, power): - self.name = name - self.power = power - - -@task -def welcome_superhero(name: str, power: str) -> Superhero: - return Superhero(name, power) - - -@task -def greet_superhero(superhero: Superhero) -> str: - return f"👋 Hello {superhero.name}! Your superpower is {superhero.power}." - - -@workflow -def superhero_wf(name: str = "Thor", power: str = "Flight") -> str: - superhero = welcome_superhero(name=name, power=power) - return greet_superhero(superhero=superhero) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/pickle_type.py +:caption: data_types_and_io/pickle_type.py +:lines: 7-26 ``` -+++ {"lines_to_next_cell": 0} - ## Batch size By default, if the list subtype is unrecognized, a single pickle file is generated. @@ -89,43 +53,20 @@ or significant list elements, you can specify a batch size. This feature allows for the processing of each batch as a separate pickle file. The following example demonstrates how to set the batch size. -```{code-cell} -from typing import Iterator - -from flytekit.types.pickle.pickle import BatchSize -from typing_extensions import Annotated - - -@task -def welcome_superheroes(names: list[str], powers: list[str]) -> Annotated[list[Superhero], BatchSize(3)]: - return [Superhero(name, power) for name, power in zip(names, powers)] - - -@task -def greet_superheroes(superheroes: list[Superhero]) -> Iterator[str]: - for superhero in superheroes: - yield f"👋 Hello {superhero.name}! Your superpower is {superhero.power}." - - -@workflow -def superheroes_wf( - names: list[str] = ["Thor", "Spiderman", "Hulk"], - powers: list[str] = ["Flight", "Surface clinger", "Shapeshifting"], -) -> Iterator[str]: - superheroes = welcome_superheroes(names=names, powers=powers) - return greet_superheroes(superheroes=superheroes) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/pickle_type.py +:caption: data_types_and_io/pickle_type.py +:lines: 35-58 ``` -+++ {"lines_to_next_cell": 0} - :::{note} The `welcome_superheroes` task will generate two pickle files: one containing two superheroes and the other containing one superhero. ::: You can run the workflows locally as follows: -```{code-cell} -if __name__ == "__main__": - print(f"Superhero wf: {superhero_wf()}") - print(f"Superhero(es) wf: {superheroes_wf()}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/pickle_type.py +:caption: data_types_and_io/pickle_type.py +:lines: 62-64 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/data_types_and_io/ diff --git a/docs/user_guide/data_types_and_io/pytorch_type.md b/docs/user_guide/data_types_and_io/pytorch_type.md index 4e5715d128..b224b0f7b5 100644 --- a/docs/user_guide/data_types_and_io/pytorch_type.md +++ b/docs/user_guide/data_types_and_io/pytorch_type.md @@ -1,21 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} (pytorch_type)= @@ -25,73 +7,21 @@ kernelspec: .. tags:: MachineLearning, Basic ``` -Flyte advocates for the use of strongly-typed data to simplify the development of robust and testable pipelines. -In addition to its application in data engineering, Flyte is primarily used for machine learning. -To streamline the communication between Flyte tasks, particularly when dealing with tensors and models, -we have introduced support for PyTorch types. +Flyte advocates for the use of strongly-typed data to simplify the development of robust and testable pipelines. In addition to its application in data engineering, Flyte is primarily used for machine learning. +To streamline the communication between Flyte tasks, particularly when dealing with tensors and models, we have introduced support for PyTorch types. ## Tensors and modules -At times, you may find the need to pass tensors and modules (models) within your workflow. -Without native support for PyTorch tensors and modules, Flytekit relies on {std:ref}`pickle ` for serializing -and deserializing these entities, as well as any unknown types. -However, this approach isn't the most efficient. As a result, we've integrated PyTorch's -serialization and deserialization support into the Flyte type system. +At times, you may find the need to pass tensors and modules (models) within your workflow. Without native support for PyTorch tensors and modules, Flytekit relies on {std:ref}`pickle ` for serializing and deserializing these entities, as well as any unknown types. However, this approach isn't the most efficient. As a result, we've integrated PyTorch's serialization and deserialization support into the Flyte type system. -```{code-cell} -import torch -from flytekit import task, workflow - - -@task -def generate_tensor_2d() -> torch.Tensor: - return torch.tensor([[1.0, -1.0, 2], [1.0, -1.0, 9], [0, 7.0, 3]]) - - -@task -def reshape_tensor(tensor: torch.Tensor) -> torch.Tensor: - # convert 2D to 3D - tensor.unsqueeze_(-1) - return tensor.expand(3, 3, 2) - - -@task -def generate_module() -> torch.nn.Module: - bn = torch.nn.BatchNorm1d(3, track_running_stats=True) - return bn - - -@task -def get_model_weight(model: torch.nn.Module) -> torch.Tensor: - return model.weight - - -class MyModel(torch.nn.Module): - def __init__(self): - super(MyModel, self).__init__() - self.l0 = torch.nn.Linear(4, 2) - self.l1 = torch.nn.Linear(2, 1) - - def forward(self, input): - out0 = self.l0(input) - out0_relu = torch.nn.functional.relu(out0) - return self.l1(out0_relu) - - -@task -def get_l1() -> torch.nn.Module: - model = MyModel() - return model.l1 - - -@workflow -def pytorch_native_wf(): - reshape_tensor(tensor=generate_tensor_2d()) - get_model_weight(model=generate_module()) - get_l1() +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/pytorch_type.py +:caption: data_types_and_io/pytorch_type.py +:lines: 5-50 +``` Passing around tensors and modules is no more a hassle! @@ -106,64 +36,9 @@ According to the PyTorch [docs](https://pytorch.org/tutorials/beginner/saving_lo it's recommended to store the module's `state_dict` rather than the module itself, although the serialization should work in either case. -```{code-cell} -:lines_to_next_cell: 2 - -from dataclasses import dataclass - -import torch.nn as nn -import torch.nn.functional as F -import torch.optim as optim -from dataclasses_json import dataclass_json -from flytekit.extras.pytorch import PyTorchCheckpoint - - -@dataclass_json -@dataclass -class Hyperparameters: - epochs: int - loss: float - - -class Net(nn.Module): - def __init__(self): - super(Net, self).__init__() - self.conv1 = nn.Conv2d(3, 6, 5) - self.pool = nn.MaxPool2d(2, 2) - self.conv2 = nn.Conv2d(6, 16, 5) - self.fc1 = nn.Linear(16 * 5 * 5, 120) - self.fc2 = nn.Linear(120, 84) - self.fc3 = nn.Linear(84, 10) - - def forward(self, x): - x = self.pool(F.relu(self.conv1(x))) - x = self.pool(F.relu(self.conv2(x))) - x = x.view(-1, 16 * 5 * 5) - x = F.relu(self.fc1(x)) - x = F.relu(self.fc2(x)) - x = self.fc3(x) - return x - - -@task -def generate_model(hyperparameters: Hyperparameters) -> PyTorchCheckpoint: - bn = Net() - optimizer = optim.SGD(bn.parameters(), lr=0.001, momentum=0.9) - return PyTorchCheckpoint(module=bn, hyperparameters=hyperparameters, optimizer=optimizer) - - -@task -def load(checkpoint: PyTorchCheckpoint): - new_bn = Net() - new_bn.load_state_dict(checkpoint["module_state_dict"]) - optimizer = optim.SGD(new_bn.parameters(), lr=0.001, momentum=0.9) - optimizer.load_state_dict(checkpoint["optimizer_state_dict"]) - - -@workflow -def pytorch_checkpoint_wf(): - checkpoint = generate_model(hyperparameters=Hyperparameters(epochs=10, loss=0.1)) - load(checkpoint=checkpoint) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/pytorch_type.py +:caption: data_types_and_io/pytorch_type.py +:lines: 63-117 ``` :::{note} @@ -217,3 +92,5 @@ def predict( The `predict` task will run on a CPU, and the device conversion from GPU to CPU will be automatically handled by Flytekit. + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/data_types_and_io/ diff --git a/docs/user_guide/data_types_and_io/structureddataset.md b/docs/user_guide/data_types_and_io/structureddataset.md index 6639d1b2a7..03ebfb5275 100644 --- a/docs/user_guide/data_types_and_io/structureddataset.md +++ b/docs/user_guide/data_types_and_io/structureddataset.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (structured_dataset)= # StructuredDataset @@ -27,10 +8,7 @@ kernelspec: ```{currentmodule} flytekit.types.structured ``` -As with most type systems, Python has primitives, container types like maps and tuples, and support for user-defined structures. -However, while there’s a rich variety of dataframe classes (Pandas, Spark, Pandera, etc.), there’s no native Python type that -represents a dataframe in the abstract. This is the gap that the {py:class}`StructuredDataset` type is meant to fill. -It offers the following benefits: +As with most type systems, Python has primitives, container types like maps and tuples, and support for user-defined structures. However, while there’s a rich variety of dataframe classes (Pandas, Spark, Pandera, etc.), there’s no native Python type that represents a dataframe in the abstract. This is the gap that the {py:class}`StructuredDataset` type is meant to fill. It offers the following benefits: - Eliminate boilerplate code you would otherwise need to write to serialize/deserialize from file objects into dataframe instances, - Eliminate additional inputs/outputs that convey metadata around the format of the tabular data held in those files, @@ -50,45 +28,27 @@ the {py:class}`StructuredDataset` type. This example demonstrates how to work with a structured dataset using Flyte entities. ```{note} -To use the `StructuredDataset` type, you only need to import `pandas`. -The other imports specified below are only necessary for this specific example. +To use the `StructuredDataset` type, you only need to import `pandas`. The other imports specified below are only necessary for this specific example. +``` + +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` To begin, import the dependencies for the example: -```{code-cell} -import os -import typing - -import numpy as np -import pandas as pd -import pyarrow as pa -import pyarrow.parquet as pq -from flytekit import FlyteContext, StructuredDatasetType, kwtypes, task, workflow -from flytekit.models import literals -from flytekit.models.literals import StructuredDatasetMetadata -from flytekit.types.structured.structured_dataset import ( - PARQUET, - StructuredDataset, - StructuredDatasetDecoder, - StructuredDatasetEncoder, - StructuredDatasetTransformerEngine, -) -from typing_extensions import Annotated +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:lines: 1-18 ``` -+++ {"lines_to_next_cell": 0} - Define a task that returns a Pandas DataFrame. -```{code-cell} -@task -def generate_pandas_df(a: int) -> pd.DataFrame: - return pd.DataFrame({"Name": ["Tom", "Joseph"], "Age": [a, 22], "Height": [160, 178]}) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:pyobject: generate_pandas_df ``` -+++ {"lines_to_next_cell": 0} - Using this simplest form, however, the user is not able to set the additional dataframe information alluded to above, - Column type information @@ -106,34 +66,21 @@ you can just specify the column names and their types in the structured dataset First, initialize column types you want to extract from the `StructuredDataset`. -```{code-cell} -all_cols = kwtypes(Name=str, Age=int, Height=int) -col = kwtypes(Age=int) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:lines: 30-31 ``` -+++ {"lines_to_next_cell": 0} - Define a task that opens a structured dataset by calling `all()`. When you invoke `all()` with ``pandas.DataFrame``, the Flyte engine downloads the parquet file on S3, and deserializes it to `pandas.DataFrame`. Keep in mind that you can invoke ``open()`` with any dataframe type that's supported or added to structured dataset. For instance, you can use ``pa.Table`` to convert the Pandas DataFrame to a PyArrow table. -```{code-cell} -@task -def get_subset_pandas_df(df: Annotated[StructuredDataset, all_cols]) -> Annotated[StructuredDataset, col]: - df = df.open(pd.DataFrame).all() - df = pd.concat([df, pd.DataFrame([[30]], columns=["Age"])]) - return StructuredDataset(dataframe=df) - - -@workflow -def simple_sd_wf(a: int = 19) -> Annotated[StructuredDataset, col]: - pandas_df = generate_pandas_df(a=a) - return get_subset_pandas_df(df=pandas_df) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:lines: 41-51 ``` -+++ {"lines_to_next_cell": 0} - The code may result in runtime failures if the columns do not match. The input ``df`` has ``Name``, ``Age`` and ``Height`` columns, whereas the output structured dataset will only have the ``Age`` column. @@ -142,26 +89,11 @@ You can use a custom serialization format to serialize your dataframes. Here's how you can register the Pandas to CSV handler, which is already available, and enable the CSV serialization by annotating the structured dataset with the CSV format: -```{code-cell} -from flytekit.types.structured import register_csv_handlers -from flytekit.types.structured.structured_dataset import CSV - -register_csv_handlers() - - -@task -def pandas_to_csv(df: pd.DataFrame) -> Annotated[StructuredDataset, CSV]: - return StructuredDataset(dataframe=df) - - -@workflow -def pandas_to_csv_wf() -> Annotated[StructuredDataset, CSV]: - pandas_df = generate_pandas_df(a=19) - return pandas_to_csv(df=pandas_df) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:lines: 57-71 ``` -+++ {"lines_to_next_cell": 0} - ## Storage driver and location By default, the data will be written to the same place that all other pointer-types (FlyteFile, FlyteDirectory, etc.) are written to. This is controlled by the output data prefix option in Flyte which is configurable on multiple levels. @@ -266,111 +198,57 @@ enabling the use of a 2D NumPy array as a valid type within structured datasets. Extend `StructuredDatasetEncoder` and implement the `encode` function. The `encode` function converts NumPy array to an intermediate format (parquet file format in this case). -```{code-cell} -class NumpyEncodingHandler(StructuredDatasetEncoder): - def encode( - self, - ctx: FlyteContext, - structured_dataset: StructuredDataset, - structured_dataset_type: StructuredDatasetType, - ) -> literals.StructuredDataset: - df = typing.cast(np.ndarray, structured_dataset.dataframe) - name = ["col" + str(i) for i in range(len(df))] - table = pa.Table.from_arrays(df, name) - path = ctx.file_access.get_random_remote_directory() - local_dir = ctx.file_access.get_random_local_directory() - local_path = os.path.join(local_dir, f"{0:05}") - pq.write_table(table, local_path) - ctx.file_access.upload_directory(local_dir, path) - return literals.StructuredDataset( - uri=path, - metadata=StructuredDatasetMetadata(structured_dataset_type=StructuredDatasetType(format=PARQUET)), - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:pyobject: NumpyEncodingHandler ``` -+++ {"lines_to_next_cell": 0} - ### NumPy decoder Extend {py:class}`StructuredDatasetDecoder` and implement the {py:meth}`~StructuredDatasetDecoder.decode` function. The {py:meth}`~StructuredDatasetDecoder.decode` function converts the parquet file to a `numpy.ndarray`. -```{code-cell} -class NumpyDecodingHandler(StructuredDatasetDecoder): - def decode( - self, - ctx: FlyteContext, - flyte_value: literals.StructuredDataset, - current_task_metadata: StructuredDatasetMetadata, - ) -> np.ndarray: - local_dir = ctx.file_access.get_random_local_directory() - ctx.file_access.get_data(flyte_value.uri, local_dir, is_multipart=True) - table = pq.read_table(local_dir) - return table.to_pandas().to_numpy() +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:pyobject: NumpyDecodingHandler ``` -+++ {"lines_to_next_cell": 0} - ### NumPy renderer Create a default renderer for numpy array, then Flytekit will use this renderer to display schema of NumPy array on the Flyte deck. -```{code-cell} -class NumpyRenderer: - def to_html(self, df: np.ndarray) -> str: - assert isinstance(df, np.ndarray) - name = ["col" + str(i) for i in range(len(df))] - table = pa.Table.from_arrays(df, name) - return pd.DataFrame(table.schema).to_html(index=False) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:pyobject: NumpyRenderer ``` -+++ {"lines_to_next_cell": 0} - In the end, register the encoder, decoder and renderer with the `StructuredDatasetTransformerEngine`. Specify the Python type you want to register this encoder with (`np.ndarray`), the storage engine to register this against (if not specified, it is assumed to work for all the storage backends), and the byte format, which in this case is `PARQUET`. -```{code-cell} -StructuredDatasetTransformerEngine.register(NumpyEncodingHandler(np.ndarray, None, PARQUET)) -StructuredDatasetTransformerEngine.register(NumpyDecodingHandler(np.ndarray, None, PARQUET)) -StructuredDatasetTransformerEngine.register_renderer(np.ndarray, NumpyRenderer()) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:lines: 127-129 ``` -+++ {"lines_to_next_cell": 0} - You can now use `numpy.ndarray` to deserialize the parquet file to NumPy and serialize a task's output (NumPy array) to a parquet file. -```{code-cell} -@task -def generate_pd_df_with_str() -> pd.DataFrame: - return pd.DataFrame({"Name": ["Tom", "Joseph"]}) - - -@task -def to_numpy(sd: StructuredDataset) -> Annotated[StructuredDataset, None, PARQUET]: - numpy_array = sd.open(np.ndarray).all() - return StructuredDataset(dataframe=numpy_array) - - -@workflow -def numpy_wf() -> Annotated[StructuredDataset, None, PARQUET]: - return to_numpy(sd=generate_pd_df_with_str()) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:lines: 134-147 ``` -+++ {"lines_to_next_cell": 0} - :::{note} `pyarrow` raises an `Expected bytes, got a 'int' object` error when the dataframe contains integers. ::: You can run the code locally as follows: -```{code-cell} -if __name__ == "__main__": - sd = simple_sd_wf() - print(f"A simple Pandas dataframe workflow: {sd.open(pd.DataFrame).all()}") - print(f"Using CSV as the serializer: {pandas_to_csv_wf().open(pd.DataFrame).all()}") - print(f"NumPy encoder and decoder: {numpy_wf().open(np.ndarray).all()}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/data_types_and_io/data_types_and_io/structured_dataset.py +:caption: data_types_and_io/structured_dataset.py +:lines: 151-155 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/data_types_and_io/ diff --git a/docs/user_guide/development_lifecycle/cache_serializing.md b/docs/user_guide/development_lifecycle/cache_serializing.md index f570b1c351..6552b90d30 100644 --- a/docs/user_guide/development_lifecycle/cache_serializing.md +++ b/docs/user_guide/development_lifecycle/cache_serializing.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Cache serializing ```{eval-rst} @@ -28,43 +11,30 @@ Ensuring serialized evaluation requires a small degree of overhead to coordinate - Periodically scheduled workflow where a single task evaluation duration may span multiple scheduled executions. - Running a commonly shared task within different workflows (which receive the same inputs). -+++ {"lines_to_next_cell": 0} +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` For any {py:func}`flytekit.task` in Flyte, there is always one required import, which is: -```{code-cell} -from flytekit import task +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/task_cache_serialize.py +:caption: development_lifecycle/task_cache_serialize.py +:lines: 1 ``` -+++ {"lines_to_next_cell": 0} - Task cache serializing is disabled by default to avoid unexpected behavior for task executions. To enable use the `cache_serialize` parameter. `cache_serialize` is a switch to enable or disable serialization of the task This operation is only useful for cacheable tasks, where one may reuse output from a previous execution. Flyte requires implicitly enabling the `cache` parameter on all cache serializable tasks. Cache key definitions follow the same rules as non-serialized cache tasks. It is important to understand the implications of the task signature and `cache_version` parameter in defining cached results. -```{code-cell} -:lines_to_next_cell: 2 - -@task(cache=True, cache_serialize=True, cache_version="1.0") -def square(n: int) -> int: - """ - Parameters: - n (int): name of the parameter for the task will be derived from the name of the input variable. - The type will be automatically deduced to Types.Integer - - Return: - int: The label for the output will be automatically assigned, and the type will be deduced from the annotation - - """ - return n * n +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/task_cache_serialize.py +:caption: development_lifecycle/task_cache_serialize.py +:pyobject: square ``` In the above example calling `square(n=2)` multiple times concurrently (even in different executions or workflows) will only execute the multiplication operation once. Concurrently evaluated tasks will wait for completion of the first instance before reusing the cached results and subsequent evaluations will instantly reuse existing cache results. -+++ - ## How does serializing caches work? The cache serialize paradigm introduces a new artifact reservation system. Tasks may use this reservation system to acquire an artifact reservation, indicating that they are actively evaluating the task, and release the reservation, once the execution is completed. Flyte uses a clock-skew algorithm to define reservation timeouts. Therefore, tasks are required to periodically extend the reservation during execution. @@ -72,3 +42,5 @@ The cache serialize paradigm introduces a new artifact reservation system. Tasks The first execution of a serializable cached task will successfully acquire the artifact reservation. Execution will be performed as usual and upon completion, the results are written to the cache and reservation is released. Concurrently executed task instances (i.e. in parallel with the initial execution) will observe an active reservation, in which case the execution will wait until the next reevaluation and perform another check. Once the initial execution completes it will reuse the cached results. Subsequently executed task instances (i.e. after an execution has already completed successfully) will immediately reuse the existing cached results. Flyte handles task execution failures using a timeout on the reservation. If the task currently holding the reservation fails to extend it before it times out, another task may acquire the reservation and begin executing the task. + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/development_lifecycle/ diff --git a/docs/user_guide/development_lifecycle/caching.md b/docs/user_guide/development_lifecycle/caching.md index 64f772054c..8419992f89 100644 --- a/docs/user_guide/development_lifecycle/caching.md +++ b/docs/user_guide/development_lifecycle/caching.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Caching ```{eval-rst} @@ -29,33 +12,29 @@ Task caching is useful when a user knows that many executions with the same inpu - Running the code multiple times when debugging workflows - Running the commonly shared tasks amongst different workflows, which receive the same inputs -Let's watch a brief explanation of caching and a demo in this video, followed by how task caching can be enabled . +Let's watch a brief explanation of caching and a demo in this video, followed by how task caching can be enabled. ```{eval-rst} .. youtube:: WNkThCp-gqo ``` -+++ {"lines_to_next_cell": 0} - -Import the necessary libraries. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -import time +Import the necessary libraries: -import pandas +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/task_cache.py +:caption: development_lifecycle/task_cache.py +:lines: 1-3 ``` -+++ {"lines_to_next_cell": 0} - For any {py:func}`flytekit.task` in Flyte, there is always one required import, which is: -```{code-cell} -:lines_to_next_cell: 1 - -from flytekit import HashMethod, task, workflow -from flytekit.core.node_creation import create_node -from typing_extensions import Annotated +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/task_cache.py +:caption: development_lifecycle/task_cache.py +:lines: 8-10 ``` Task caching is disabled by default to avoid unintended consequences of caching tasks with side effects. To enable caching and control its behavior, use the `cache` and `cache_version` parameters when constructing a task. @@ -64,26 +43,14 @@ Task caching is disabled by default to avoid unintended consequences of caching Bumping the `cache_version` is akin to invalidating the cache. You can manually update this version and Flyte caches the next execution instead of relying on the old cache. -```{code-cell} -@task(cache=True, cache_version="1.0") # noqa: F841 -def square(n: int) -> int: - """ - Parameters: - n (int): name of the parameter for the task will be derived from the name of the input variable. - The type will be automatically deduced to ``Types.Integer``. - - Return: - int: The label for the output will be automatically assigned, and the type will be deduced from the annotation. - - """ - return n * n +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/task_cache.py +:caption: development_lifecycle/task_cache.py +:pyobject: square ``` In the above example, calling `square(n=2)` twice (even if it's across different executions or different workflows) will only execute the multiplication operation once. The next time, the output will be made available immediately since it is captured from the previous execution with the same inputs. -+++ - If in a subsequent code update, you update the signature of the task to return the original number along with the result, it'll automatically invalidate the cache (even though the cache version remains the same). ```python @@ -92,8 +59,6 @@ def square(n: int) -> Tuple[int, int]: ... ``` -+++ - :::{note} If the user changes the task interface in any way (such as adding, removing, or editing inputs/outputs), Flyte treats that as a task functionality change. In the subsequent execution, Flyte runs the task and stores the outputs as newly cached values. ::: @@ -138,52 +103,18 @@ The format used by the store is opaque and not meant to be inspectable. The default behavior displayed by Flyte's memoization feature might not match the user intuition. For example, this code makes use of pandas dataframes: -```{code-cell} -@task -def foo(a: int, b: str) -> pandas.DataFrame: - df = pandas.DataFrame(...) - ... - return df - - -@task(cache=True, cache_version="1.0") -def bar(df: pandas.DataFrame) -> int: - ... - - -@workflow -def wf(a: int, b: str): - df = foo(a=a, b=b) - v = bar(df=df) # noqa: F841 +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/task_cache.py +:caption: development_lifecycle/task_cache.py +:lines: 39-54 ``` If run twice with the same inputs, one would expect that `bar` would trigger a cache hit, but it turns out that's not the case because of how dataframes are represented in Flyte. However, with release 1.2.0, Flyte provides a new way to control memoization behavior of literals. This is done via a `typing.Annotated` call on the task signature. For example, in order to cache the result of calls to `bar`, you can rewrite the code above like this: -```{code-cell} -def hash_pandas_dataframe(df: pandas.DataFrame) -> str: - return str(pandas.util.hash_pandas_object(df)) - - -@task -def foo_1( # noqa: F811 - a: int, b: str # noqa: F821 -) -> Annotated[pandas.DataFrame, HashMethod(hash_pandas_dataframe)]: # noqa: F821 # noqa: F821 - df = pandas.DataFrame(...) # noqa: F821 - ... - return df - - -@task(cache=True, cache_version="1.0") # noqa: F811 -def bar_1(df: pandas.DataFrame) -> int: # noqa: F811 - ... # noqa: F811 - - -@workflow -def wf_1(a: int, b: str): # noqa: F811 - df = foo(a=a, b=b) # noqa: F811 - v = bar(df=df) # noqa: F841 +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/task_cache.py +:caption: development_lifecycle/task_cache.py +:lines: 64-85 ``` Note how the output of task `foo` is annotated with an object of type `HashMethod`. Essentially, it represents a function that produces a hash that is used as part of the cache key calculation in calling the task `bar`. @@ -195,47 +126,11 @@ This is done by turning the literal representation into a string and using that This feature also works in local execution. -+++ - Here's a complete example of the feature: -```{code-cell} -def hash_pandas_dataframe(df: pandas.DataFrame) -> str: - return str(pandas.util.hash_pandas_object(df)) - - -@task -def uncached_data_reading_task() -> Annotated[pandas.DataFrame, HashMethod(hash_pandas_dataframe)]: - return pandas.DataFrame({"column_1": [1, 2, 3]}) - - -@task(cache=True, cache_version="1.0") -def cached_data_processing_task(df: pandas.DataFrame) -> pandas.DataFrame: - time.sleep(1) - return df * 2 - - -@task -def compare_dataframes(df1: pandas.DataFrame, df2: pandas.DataFrame): - assert df1.equals(df2) - - -@workflow -def cached_dataframe_wf(): - raw_data = uncached_data_reading_task() - - # Execute `cached_data_processing_task` twice, but force those - # two executions to happen serially to demonstrate how the second run - # hits the cache. - t1_node = create_node(cached_data_processing_task, df=raw_data) - t2_node = create_node(cached_data_processing_task, df=raw_data) - t1_node >> t2_node - - # Confirm that the dataframes actually match - compare_dataframes(df1=t1_node.o0, df2=t2_node.o0) - - -if __name__ == "__main__": - df1 = cached_dataframe_wf() - print(f"Running cached_dataframe_wf once : {df1}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/task_cache.py +:caption: development_lifecycle/task_cache.py +:lines: 97-134 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/development_lifecycle/ diff --git a/docs/user_guide/development_lifecycle/creating_a_new_project.md b/docs/user_guide/development_lifecycle/creating_a_new_project.md index 7741b810d2..32477eb8c0 100644 --- a/docs/user_guide/development_lifecycle/creating_a_new_project.md +++ b/docs/user_guide/development_lifecycle/creating_a_new_project.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Creating a new project Creates project to be used as a home for the flyte resources of tasks and workflows. diff --git a/docs/user_guide/development_lifecycle/debugging_executions.md b/docs/user_guide/development_lifecycle/debugging_executions.md index 7c8f9562d3..641a9e505b 100644 --- a/docs/user_guide/development_lifecycle/debugging_executions.md +++ b/docs/user_guide/development_lifecycle/debugging_executions.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Debugging executions The inspection of task and workflow execution would provide you log links to debug things further diff --git a/docs/user_guide/development_lifecycle/decks.md b/docs/user_guide/development_lifecycle/decks.md index 5aae4955b1..8aeb2436c2 100644 --- a/docs/user_guide/development_lifecycle/decks.md +++ b/docs/user_guide/development_lifecycle/decks.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (decks)= # Decks @@ -41,16 +22,16 @@ Additionally, you can create new decks to render your data using custom renderer Flyte Decks is an opt-in feature; to enable it, set `enable_deck` to `True` in the task parameters. ::: -To begin, import the dependencies. - -```{code-cell} -import flytekit -from flytekit import ImageSpec, task -from flytekitplugins.deck.renderer import MarkdownRenderer -from sklearn.decomposition import PCA +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} +To begin, import the dependencies: + +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/decks.py +:caption: development_lifecycle/decks.py +:lines: 1-4 +``` We create a new deck named `pca` and render Markdown content along with a [PCA](https://en.wikipedia.org/wiki/Principal_component_analysis) plot. @@ -58,16 +39,11 @@ We create a new deck named `pca` and render Markdown content along with a You can begin by initializing an {ref}`ImageSpec ` object to encompass all the necessary dependencies. This approach automatically triggers a Docker build, alleviating the need for you to manually create a Docker image. -```{code-cell} -custom_image = ImageSpec(name="flyte-decks-example", packages=["plotly"], registry="ghcr.io/flyteorg") - -if custom_image.is_container(): - import plotly - import plotly.express as px +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/decks.py +:caption: development_lifecycle/decks.py +:lines: 15-19 ``` -+++ {"lines_to_next_cell": 0} - :::{important} Replace `ghcr.io/flyteorg` with a container registry you've access to publish to. To upload the image to the local registry in the demo cluster, indicate the registry as `localhost:30000`. @@ -75,29 +51,11 @@ To upload the image to the local registry in the demo cluster, indicate the regi Note the usage of `append` to append the Plotly deck to the Markdown deck. -```{code-cell} -@task(enable_deck=True, container_image=custom_image) -def pca_plot(): - iris_df = px.data.iris() - X = iris_df[["sepal_length", "sepal_width", "petal_length", "petal_width"]] - pca = PCA(n_components=3) - components = pca.fit_transform(X) - total_var = pca.explained_variance_ratio_.sum() * 100 - fig = px.scatter_3d( - components, - x=0, - y=1, - z=2, - color=iris_df["species"], - title=f"Total Explained Variance: {total_var:.2f}%", - labels={"0": "PC 1", "1": "PC 2", "2": "PC 3"}, - ) - main_deck = flytekit.Deck("pca", MarkdownRenderer().to_html("### Principal Component Analysis")) - main_deck.append(plotly.io.to_html(fig)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/decks.py +:caption: development_lifecycle/decks.py +:pyobject: pca_plot ``` -+++ {"lines_to_next_cell": 0} - :::{Important} To view the log output locally, the `FLYTE_SDK_LOGGING_LEVEL` environment variable should be set to 20. ::: @@ -138,44 +96,28 @@ When the task connected with a deck object is executed, these objects employ ren Creates a profile report from a Pandas DataFrame. -```{code-cell} -import pandas as pd -from flytekitplugins.deck.renderer import FrameProfilingRenderer - - -@task(enable_deck=True) -def frame_renderer() -> None: - df = pd.DataFrame(data={"col1": [1, 2], "col2": [3, 4]}) - flytekit.Deck("Frame Renderer", FrameProfilingRenderer().to_html(df=df)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/decks.py +:caption: development_lifecycle/decks.py +:lines: 44-51 ``` -+++ {"lines_to_next_cell": 0} - :::{figure} https://raw.githubusercontent.com/flyteorg/static-resources/main/flytesnacks/user_guide/flyte_decks_frame_renderer.png :alt: Frame renderer :class: with-shadow ::: -+++ {"lines_to_next_cell": 0} + #### Top-frame renderer Renders DataFrame as an HTML table. This renderer doesn't necessitate plugin installation since it's accessible within the flytekit library. -```{code-cell} -from typing import Annotated - -from flytekit.deck import TopFrameRenderer - - -@task(enable_deck=True) -def top_frame_renderer() -> Annotated[pd.DataFrame, TopFrameRenderer(1)]: - return pd.DataFrame(data={"col1": [1, 2], "col2": [3, 4]}) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/decks.py +:caption: development_lifecycle/decks.py +:lines: 57-64 ``` -+++ {"lines_to_next_cell": 0} - :::{figure} https://raw.githubusercontent.com/flyteorg/static-resources/main/flytesnacks/user_guide/flyte_decks_top_frame_renderer.png :alt: Top frame renderer :class: with-shadow @@ -185,16 +127,11 @@ def top_frame_renderer() -> Annotated[pd.DataFrame, TopFrameRenderer(1)]: Converts a Markdown string into HTML, producing HTML as a Unicode string. -```{code-cell} -@task(enable_deck=True) -def markdown_renderer() -> None: - flytekit.current_context().default_deck.append( - MarkdownRenderer().to_html("You can install flytekit using this command: ```import flytekit```") - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/decks.py +:caption: development_lifecycle/decks.py +:pyobject: markdown_renderer ``` -+++ {"lines_to_next_cell": 0} - :::{figure} https://raw.githubusercontent.com/flyteorg/static-resources/main/flytesnacks/user_guide/flyte_decks_markdown_renderer.png :alt: Markdown renderer :class: with-shadow @@ -210,18 +147,11 @@ The median (Q2) is indicated by a line within the box. Typically, the whiskers extend to the edges of the box, plus or minus 1.5 times the interquartile range (IQR: Q3-Q1). -```{code-cell} -from flytekitplugins.deck.renderer import BoxRenderer - - -@task(enable_deck=True) -def box_renderer() -> None: - iris_df = px.data.iris() - flytekit.Deck("Box Plot", BoxRenderer("sepal_length").to_html(iris_df)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/decks.py +:caption: development_lifecycle/decks.py +:lines: 85-91 ``` -+++ {"lines_to_next_cell": 0} - :::{figure} https://raw.githubusercontent.com/flyteorg/static-resources/main/flytesnacks/user_guide/flyte_decks_box_renderer.png :alt: Box renderer :class: with-shadow @@ -232,26 +162,11 @@ def box_renderer() -> None: Converts a {ref}`FlyteFile ` or `PIL.Image.Image` object into an HTML string, where the image data is encoded as a base64 string. -```{code-cell} -from flytekit import workflow -from flytekit.types.file import FlyteFile -from flytekitplugins.deck.renderer import ImageRenderer - - -@task(enable_deck=True) -def image_renderer(image: FlyteFile) -> None: - flytekit.Deck("Image Renderer", ImageRenderer().to_html(image_src=image)) - - -@workflow -def image_renderer_wf( - image: FlyteFile = "https://bit.ly/3KZ95q4", -) -> None: - image_renderer(image=image) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/decks.py +:caption: development_lifecycle/decks.py +:lines: 97-111 ``` -+++ {"lines_to_next_cell": 0} - :::{figure} https://raw.githubusercontent.com/flyteorg/static-resources/main/flytesnacks/user_guide/flyte_decks_image_renderer.png :alt: Image renderer :class: with-shadow @@ -261,20 +176,11 @@ def image_renderer_wf( Converts a Pandas dataframe into an HTML table. -```{code-cell} -from flytekitplugins.deck.renderer import TableRenderer - - -@task(enable_deck=True) -def table_renderer() -> None: - flytekit.Deck( - "Table Renderer", - TableRenderer().to_html(df=pd.DataFrame(data={"col1": [1, 2], "col2": [3, 4]}), table_width=50), - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/decks.py +:caption: development_lifecycle/decks.py +:lines: 115-123 ``` -+++ {"lines_to_next_cell": 0} - :::{figure} https://raw.githubusercontent.com/flyteorg/static-resources/main/flytesnacks/user_guide/flyte_decks_table_renderer.png :alt: Table renderer :class: with-shadow @@ -284,23 +190,9 @@ def table_renderer() -> None: Converts source code to HTML and renders it as a Unicode string on the deck. -```{code-cell} -:lines_to_next_cell: 2 - -import inspect - -from flytekitplugins.deck.renderer import SourceCodeRenderer - - -@task(enable_deck=True) -def source_code_renderer() -> None: - file_path = inspect.getsourcefile(frame_renderer.__wrapped__) - with open(file_path, "r") as f: - source_code = f.read() - flytekit.Deck( - "Source Code Renderer", - SourceCodeRenderer().to_html(source_code), - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/decks.py +:caption: development_lifecycle/decks.py +:lines: 128-141 ``` :::{figure} https://raw.githubusercontent.com/flyteorg/static-resources/main/flytesnacks/user_guide/flyte_decks_source_code_renderer.png @@ -314,3 +206,5 @@ Don't hesitate to integrate a new renderer into [renderer.py](https://github.com/flyteorg/flytekit/blob/master/plugins/flytekit-deck-standard/flytekitplugins/deck/renderer.py) if your deck renderers can enhance data visibility. Feel encouraged to open a pull request and play a part in enhancing the Flyte deck renderer ecosystem! + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/development_lifecycle/ diff --git a/docs/user_guide/development_lifecycle/failure_node.md b/docs/user_guide/development_lifecycle/failure_node.md index 61756e4a8a..a3bd1ae328 100644 --- a/docs/user_guide/development_lifecycle/failure_node.md +++ b/docs/user_guide/development_lifecycle/failure_node.md @@ -9,81 +9,54 @@ The failure node feature enables you to designate a specific node to execute in For example, a workflow involves creating a cluster at the beginning, followed by the execution of tasks, and concludes with the deletion of the cluster once all tasks are completed. However, if any task within the workflow encounters an error, flyte will abort the entire workflow and won’t delete the cluster. This poses a challenge if you still need to clean up the cluster even in a task failure. -To address this issue, you can add a failure node into your workflow. This ensures that critical actions, such as deleting the cluster, are executed even in the event of failures occurring throughout the workflow execution: +To address this issue, you can add a failure node into your workflow. This ensures that critical actions, such as deleting the cluster, are executed even in the event of failures occurring throughout the workflow execution -```python -from flytekit import WorkflowFailurePolicy, task, workflow - - -@task -def create_cluster(name: str): - print(f"Creating cluster: {name}") +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/failure_node.py +:caption: development_lifecycle/failure_node.py +:lines: 1-6 ``` Create a task that will fail during execution: -```python -@task -def t1(a: int, b: str): - print(f"{a} {b}") - raise ValueError("Fail!") - - -@task -def delete_cluster(name: str): - print(f"Deleting cluster {name}") +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/failure_node.py +:caption: development_lifecycle/failure_node.py +:lines: 10-18 ``` Create a task that will be executed if any of the tasks in the workflow fail: -```python -@task -def clean_up(name: str): - print(f"Cleaning up cluster {name}") - +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/failure_node.py +:caption: development_lifecycle/failure_node.py +:pyobject: clean_up ``` Specify the `on_failure` to a cleanup task. This task will be executed if any of the tasks in the workflow fail: - :::{note} The input of `clean_up` should be the exact same as the input of the workflow. ::: -```python -@workflow(on_failure=clean_up) -def subwf(name: str): - c = create_cluster(name=name) - t = t1(a=1, b="2") - d = delete_cluster(name=name) - c >> t >> d +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/failure_node.py +:caption: development_lifecycle/failure_node.py +:pyobject: subwf ``` By setting the failure policy to `FAIL_AFTER_EXECUTABLE_NODES_COMPLETE` to ensure that the `wf1` is executed even if the subworkflow fails. In this case, both parent and child workflows will fail, resulting in the `clean_up` task being executed twice: -```python -@workflow(on_failure=clean_up, failure_policy=WorkflowFailurePolicy.FAIL_AFTER_EXECUTABLE_NODES_COMPLETE) -def wf1(name: str = "my_cluster"): - c = create_cluster(name=name) - subwf(name="another_cluster") - t = t1(a=1, b="2") - d = delete_cluster(name=name) - c >> t >> d - - -@workflow -def clean_up_wf(name: str): - return clean_up(name=name) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/failure_node.py +:caption: development_lifecycle/failure_node.py +:lines: 42-53 ``` You can also set the `on_failure` to a workflow. This workflow will be executed if any of the tasks in the workflow fail: -```python -@workflow(on_failure=clean_up_wf) -def wf2(name: str = "my_cluster"): - c = create_cluster(name=name) - t = t1(a=1, b="2") - d = delete_cluster(name=name) - c >> t >> d +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/development_lifecycle/development_lifecycle/failure_node.py +:caption: development_lifecycle/failure_node.py +:pyobject: wf2 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/development_lifecycle/ diff --git a/docs/user_guide/development_lifecycle/inspecting_executions.md b/docs/user_guide/development_lifecycle/inspecting_executions.md index 1ce09ae155..73fd024c8d 100644 --- a/docs/user_guide/development_lifecycle/inspecting_executions.md +++ b/docs/user_guide/development_lifecycle/inspecting_executions.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Inspecting executions ## Flytectl diff --git a/docs/user_guide/development_lifecycle/private_images.md b/docs/user_guide/development_lifecycle/private_images.md index 5ebd41ea73..3783f10fe8 100644 --- a/docs/user_guide/development_lifecycle/private_images.md +++ b/docs/user_guide/development_lifecycle/private_images.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (private_images)= # Private images diff --git a/docs/user_guide/development_lifecycle/running_launch_plans.md b/docs/user_guide/development_lifecycle/running_launch_plans.md index 1fb8bb4c2c..73179046f3 100644 --- a/docs/user_guide/development_lifecycle/running_launch_plans.md +++ b/docs/user_guide/development_lifecycle/running_launch_plans.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (remote_launchplan)= # Running launch plans diff --git a/docs/user_guide/development_lifecycle/running_tasks.md b/docs/user_guide/development_lifecycle/running_tasks.md index 882380109d..26c31744d0 100644 --- a/docs/user_guide/development_lifecycle/running_tasks.md +++ b/docs/user_guide/development_lifecycle/running_tasks.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (remote_task)= # Running tasks diff --git a/docs/user_guide/development_lifecycle/running_workflows.md b/docs/user_guide/development_lifecycle/running_workflows.md index 2e04714adc..631cc6d4ae 100644 --- a/docs/user_guide/development_lifecycle/running_workflows.md +++ b/docs/user_guide/development_lifecycle/running_workflows.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Running workflows Workflows on their own are not runnable directly. However, a launchplan is always bound to a workflow and you can use diff --git a/docs/user_guide/environment_setup.md b/docs/user_guide/environment_setup.md index f23d32219c..1d6a8740c7 100644 --- a/docs/user_guide/environment_setup.md +++ b/docs/user_guide/environment_setup.md @@ -98,7 +98,7 @@ You can also run the code directly from a remote source: ``` pyflyte run --remote \ - https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/hello_world.py \ + https://raw.githubusercontent.com/flyteorg/flytesnacks/master/example_code/basics/basics/hello_world.py \ hello_world_wf ``` @@ -118,7 +118,7 @@ Finally, run a workflow that takes some inputs, for example the `workflow.py` ex ```{prompt} bash pyflyte run --remote \ - https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/basics/basics/workflow.py \ + https://raw.githubusercontent.com/flyteorg/flytesnacks/master/example_code/basics/basics/workflow.py \ simple_wf --x '[-3,0,3]' --y '[7,4,-2]' ``` diff --git a/docs/user_guide/extending/backend_plugins.md b/docs/user_guide/extending/backend_plugins.md index bbee56ea46..446c225f2d 100644 --- a/docs/user_guide/extending/backend_plugins.md +++ b/docs/user_guide/extending/backend_plugins.md @@ -1,21 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -%% [markdown] (extend-plugin-flyte-backend)= # Backend plugins diff --git a/docs/user_guide/extending/container_interface.md b/docs/user_guide/extending/container_interface.md index c0be559d76..56eec884ba 100644 --- a/docs/user_guide/extending/container_interface.md +++ b/docs/user_guide/extending/container_interface.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (core-extend-flyte-container-interface)= # Container interface diff --git a/docs/user_guide/extending/custom_types.md b/docs/user_guide/extending/custom_types.md index af82d1a6ec..d0c68b59e4 100644 --- a/docs/user_guide/extending/custom_types.md +++ b/docs/user_guide/extending/custom_types.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (advanced_custom_types)= # Custom types @@ -23,8 +6,7 @@ kernelspec: .. tags:: Extensibility, Contribute, Intermediate ``` -Flyte is a strongly-typed framework for authoring tasks and workflows. But there are situations when the existing -types do not directly work. This is true with any programming language! +Flyte is a strongly-typed framework for authoring tasks and workflows. But there are situations when the existing types do not directly work. This is true with any programming language! Similar to a programming language enabling higher-level concepts to describe user-specific objects such as classes in Python/Java/C++, struct in C/Golang, etc., Flytekit allows modeling user classes. The idea is to make an interface that is more productive for the @@ -37,63 +19,30 @@ The example is demonstrated in the video below: ```{eval-rst} .. youtube:: 1xExpRzz8Tw - ``` -+++ {"lines_to_next_cell": 0} - -First, we import the dependencies. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -import os -import tempfile -import typing -from typing import Type +First, we import the dependencies: -from flytekit import Blob, BlobMetadata, BlobType, FlyteContext, Literal, LiteralType, Scalar, task, workflow -from flytekit.extend import TypeEngine, TypeTransformer +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/extending/extending/custom_types.py +:caption: extending/custom_types.py +:lines: 1-7 ``` -+++ {"lines_to_next_cell": 0} - :::{note} `FlyteContext` is used to access a random local directory. ::: Defined type here represents a list of files on the disk. We will refer to it as `MyDataset`. -```{code-cell} -class MyDataset(object): - """ - ``MyDataset`` is a collection of files. In Flyte, this maps to a multi-part blob or directory. - """ - - def __init__(self, base_dir: str = None): - if base_dir is None: - self._tmp_dir = tempfile.TemporaryDirectory() - self._base_dir = self._tmp_dir.name - self._files = [] - else: - self._base_dir = base_dir - files = os.listdir(base_dir) - self._files = [os.path.join(base_dir, f) for f in files] - - @property - def base_dir(self) -> str: - return self._base_dir - - @property - def files(self) -> typing.List[str]: - return self._files - - def new_file(self, name: str) -> str: - new_file = os.path.join(self._base_dir, name) - self._files.append(new_file) - return new_file +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/extending/extending/custom_types.py +:caption: extending/custom_types.py +:pyobject: MyDataset ``` -+++ {"lines_to_next_cell": 0} - `MyDataset` represents a set of files locally. However, when a workflow consists of multiple steps, we want the data to flow between different steps. To achieve this, it is necessary to explain how the data will be transformed to Flyte's remote references. To do this, we create a new instance of @@ -104,92 +53,31 @@ The `TypeTransformer` is a Generic abstract base class. The `Generic` type argum that we want to work with. In this case, it is the `MyDataset` object. ::: -```{code-cell} -class MyDatasetTransformer(TypeTransformer[MyDataset]): - _TYPE_INFO = BlobType(format="binary", dimensionality=BlobType.BlobDimensionality.MULTIPART) - - def __init__(self): - super(MyDatasetTransformer, self).__init__(name="mydataset-transform", t=MyDataset) - - def get_literal_type(self, t: Type[MyDataset]) -> LiteralType: - """ - This is useful to tell the Flytekit type system that ``MyDataset`` actually refers to what corresponding type. - In this example, we say its of format binary (do not try to introspect) and there is more than one file in it. - """ - return LiteralType(blob=self._TYPE_INFO) - - def to_literal( - self, - ctx: FlyteContext, - python_val: MyDataset, - python_type: Type[MyDataset], - expected: LiteralType, - ) -> Literal: - """ - This method is used to convert from the given python type object ``MyDataset`` to the Literal representation. - """ - # Step 1: Upload all the data into a remote place recommended by Flyte - remote_dir = ctx.file_access.get_random_remote_directory() - ctx.file_access.upload_directory(python_val.base_dir, remote_dir) - # Step 2: Return a pointer to this remote_dir in the form of a Literal - return Literal(scalar=Scalar(blob=Blob(uri=remote_dir, metadata=BlobMetadata(type=self._TYPE_INFO)))) - - def to_python_value(self, ctx: FlyteContext, lv: Literal, expected_python_type: Type[MyDataset]) -> MyDataset: - """ - In this method, we want to be able to re-hydrate the custom object from Flyte Literal value. - """ - # Step 1: Download remote data locally - local_dir = ctx.file_access.get_random_local_directory() - ctx.file_access.download_directory(lv.scalar.blob.uri, local_dir) - # Step 2: Create the ``MyDataset`` object - return MyDataset(base_dir=local_dir) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/extending/extending/custom_types.py +:caption: extending/custom_types.py +:pyobject: MyDatasetTransformer ``` -+++ {"lines_to_next_cell": 0} - Before we can use MyDataset in our tasks, we need to let Flytekit know that `MyDataset` should be considered as a valid type. This is done using {py:class}`~flytekit:flytekit.extend.TypeEngine`'s `register` method. -```{code-cell} -TypeEngine.register(MyDatasetTransformer()) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/extending/extending/custom_types.py +:caption: extending/custom_types.py +:lines: 87 ``` -+++ {"lines_to_next_cell": 0} - The new type should be ready to use! Let us write an example generator and consumer for this new datatype. -```{code-cell} -@task -def generate() -> MyDataset: - d = MyDataset() - for i in range(3): - fp = d.new_file(f"x{i}") - with open(fp, "w") as f: - f.write(f"Contents of file{i}") - - return d - - -@task -def consume(d: MyDataset) -> str: - s = "" - for f in d.files: - with open(f) as fp: - s += fp.read() - s += "\n" - return s - - -@workflow -def wf() -> str: - return consume(d=generate()) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/extending/extending/custom_types.py +:caption: extending/custom_types.py +:lines: 91-114 ``` -+++ {"lines_to_next_cell": 0} - This workflow can be executed and tested locally. Flytekit will exercise the entire path even if you run it locally. -```{code-cell} -if __name__ == "__main__": - print(wf()) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/extending/extending/custom_types.py +:caption: extending/custom_types.py +:lines: 119-120 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/extending/ diff --git a/docs/user_guide/extending/prebuilt_container_task_plugins.md b/docs/user_guide/extending/prebuilt_container_task_plugins.md index ed51f1b7a6..bf03de5529 100644 --- a/docs/user_guide/extending/prebuilt_container_task_plugins.md +++ b/docs/user_guide/extending/prebuilt_container_task_plugins.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (prebuilt_container)= # Prebuilt container task plugins diff --git a/docs/user_guide/extending/user_container_task_plugins.md b/docs/user_guide/extending/user_container_task_plugins.md index 68cc1a859d..96ed6fb310 100644 --- a/docs/user_guide/extending/user_container_task_plugins.md +++ b/docs/user_guide/extending/user_container_task_plugins.md @@ -1,22 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - (user_container)= # User container task plugins @@ -27,17 +8,18 @@ kernelspec: A user container task plugin runs a user-defined container that has the user code. -This tutorial will walk you through writing your own sensor-style plugin that allows users to wait for a file to land -in the object store. Remember that if you follow the flyte/flytekit constructs, you will automatically make your plugin portable -across all cloud platforms that Flyte supports. +This tutorial will walk you through writing your own sensor-style plugin that allows users to wait for a file to land in the object store. Remember that if you follow the flyte/flytekit constructs, you will automatically make your plugin portable across all cloud platforms that Flyte supports. ## Sensor plugin -A sensor plugin waits for some event to happen before marking the task as success. You need not worry about the -timeout as that will be handled by the flyte engine itself when running in production. +A sensor plugin waits for some event to happen before marking the task as success. You need not worry about the timeout as that will be handled by the flyte engine itself when running in production. ### Plugin API +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` + ```python sensor = WaitForObjectStoreFile(metadata=metadata(timeout="1H", retries=10)) @@ -50,58 +32,19 @@ def wait_and_run(path: str) -> int: return do_next(path=path) ``` -```{code-cell} -import typing -from datetime import timedelta -from time import sleep - -from flytekit import TaskMetadata, task, workflow -from flytekit.extend import Interface, PythonTask, context_manager +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/extending/extending/user_container.py +:caption: extending/user_container.py +:lines: 1-6 ``` -+++ {"lines_to_next_cell": 0} - ### Plugin structure As illustrated above, to achieve this structure we need to create a class named `WaitForObjectStoreFile`, which derives from {py:class}`flytekit.PythonFunctionTask` as follows. -```{code-cell} -class WaitForObjectStoreFile(PythonTask): - """ - Add documentation here for your plugin. - This plugin creates an object store file sensor that waits and exits only when the file exists. - """ - - _VAR_NAME: str = "path" - - def __init__( - self, - name: str, - poll_interval: timedelta = timedelta(seconds=10), - **kwargs, - ): - super(WaitForObjectStoreFile, self).__init__( - task_type="object-store-sensor", - name=name, - task_config=None, - interface=Interface(inputs={self._VAR_NAME: str}, outputs={self._VAR_NAME: str}), - **kwargs, - ) - self._poll_interval = poll_interval - - def execute(self, **kwargs) -> typing.Any: - # No need to check for existence, as that is guaranteed. - path = kwargs[self._VAR_NAME] - ctx = context_manager.FlyteContext.current_context() - user_context = ctx.user_space_params - while True: - user_context.logging.info(f"Sensing file in path {path}...") - if ctx.file_access.exists(path): - user_context.logging.info(f"file in path {path} exists!") - return path - user_context.logging.warning(f"file in path {path} does not exists!") - sleep(self._poll_interval.seconds) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/extending/extending/user_container.py +:caption: extending/user_container.py +:pyobject: WaitForObjectStoreFile ``` #### Config objects @@ -122,43 +65,24 @@ In this example, we are creating a named class plugin, and hence, this construct Refer to the [spark plugin](https://github.com/flyteorg/flytekit/tree/master/plugins/flytekit-spark) for an example of a config object. -+++ ### Actual usage -```{code-cell} -sensor = WaitForObjectStoreFile( - name="my-objectstore-sensor", - metadata=TaskMetadata(retries=10, timeout=timedelta(minutes=20)), - poll_interval=timedelta(seconds=1), -) - - -@task -def print_file(path: str) -> str: - print(path) - return path - - -@workflow -def my_workflow(path: str) -> str: - return print_file(path=sensor(path=path)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/extending/extending/user_container.py +:caption: extending/user_container.py +:lines: 54-69 ``` -+++ {"lines_to_next_cell": 0} - And of course, you can run the workflow locally using your own new shiny plugin! -```{code-cell} -if __name__ == "__main__": - f = "/tmp/some-file" - with open(f, "w") as w: - w.write("Hello World!") - - print(my_workflow(path=f)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/extending/extending/user_container.py +:caption: extending/user_container.py +:lines: 73-78 ``` The key takeaways of a user container task plugin are: - The task object that gets serialized at compile-time is recreated using the user's code at run time. - At platform-run-time, the user-decorated function is executed. + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/extending/ diff --git a/docs/user_guide/productionizing/configuring_access_to_gpus.md b/docs/user_guide/productionizing/configuring_access_to_gpus.md index f2575b5adb..60e4a35ced 100644 --- a/docs/user_guide/productionizing/configuring_access_to_gpus.md +++ b/docs/user_guide/productionizing/configuring_access_to_gpus.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (configure-gpus)= # Configuring access to GPUs diff --git a/docs/user_guide/productionizing/configuring_logging_links_in_the_ui.md b/docs/user_guide/productionizing/configuring_logging_links_in_the_ui.md index 3091e1bc82..67726a23ce 100644 --- a/docs/user_guide/productionizing/configuring_logging_links_in_the_ui.md +++ b/docs/user_guide/productionizing/configuring_logging_links_in_the_ui.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (configure-logging)= # Configuring logging links in the UI @@ -24,20 +7,16 @@ kernelspec: ``` To debug your workflows in production, you want to access logs from your tasks as they run. -These logs are different from the core Flyte platform logs, are specific to execution, and may vary from plugin to plugin; -for example, Spark may have driver and executor logs. +These logs are different from the core Flyte platform logs, are specific to execution, and may vary from plugin to plugin; for example, Spark may have driver and executor logs. -Every organization potentially uses different log aggregators, making it hard to create a one-size-fits-all solution. -Some examples of the log aggregators include cloud-hosted solutions like AWS CloudWatch, GCP Stackdriver, Splunk, Datadog, etc. +Every organization potentially uses different log aggregators, making it hard to create a one-size-fits-all solution. Some examples of the log aggregators include cloud-hosted solutions like AWS CloudWatch, GCP Stackdriver, Splunk, Datadog, etc. Flyte provides a simplified interface to configure your log provider. Flyte-sandbox -ships with the Kubernetes dashboard to visualize the logs. This may not be safe for production, hence we recommend users -explore other log aggregators. +ships with the Kubernetes dashboard to visualize the logs. This may not be safe for production, hence we recommend users explore other log aggregators. ## How to configure? -To configure your log provider, the provider needs to support `URL` links that are shareable and can be templatized. -The templating engine has access to [these](https://github.com/flyteorg/flyteplugins/blob/b0684d97a1cf240f1a44f310f4a79cc21844caa9/go/tasks/pluginmachinery/tasklog/plugin.go#L7-L16) parameters. +To configure your log provider, the provider needs to support `URL` links that are shareable and can be templatized. The templating engine has access to [these](https://github.com/flyteorg/flyteplugins/blob/b0684d97a1cf240f1a44f310f4a79cc21844caa9/go/tasks/pluginmachinery/tasklog/plugin.go#L7-L16) parameters. The parameters can be used to generate a unique URL to the logs using a templated URI that pertain to a specific task. The templated URI has access to the following parameters: diff --git a/docs/user_guide/productionizing/customizing_task_resources.md b/docs/user_guide/productionizing/customizing_task_resources.md index 39fee64d55..1f95d26219 100644 --- a/docs/user_guide/productionizing/customizing_task_resources.md +++ b/docs/user_guide/productionizing/customizing_task_resources.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Customizing task resources ```{eval-rst} @@ -24,8 +7,6 @@ kernelspec: One of the reasons to use a hosted Flyte environment is the potential of leveraging CPU, memory and storage resources, far greater than what's available locally. Flytekit makes it possible to specify these requirements declaratively and close to where the task itself is declared. -+++ - In this example, the memory required by the function increases as the dataset size increases. Large datasets may not be able to run locally, so we would want to provide hints to the Flyte backend to request for more memory. This is done by decorating the task with the hints as shown in the following code sample. @@ -47,68 +28,51 @@ To ensure that regular tasks that don't require GPUs are not scheduled on GPU no To ensure that tasks that require GPUs get the needed tolerations on their pods, set up FlytePropeller using the following [configuration](https://github.com/flyteorg/flytepropeller/blob/v0.10.5/config.yaml#L51,L56). Ensure that this toleration config matches the taint config you have configured to protect your GPU providing nodes from dealing with regular non-GPU workloads (pods). -The actual values follow the [Kubernetes convention](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-units-in-kubernetes). -Let's look at an example to understand how to customize resources. - -+++ {"lines_to_next_cell": 0} +The actual values follow the [Kubernetes convention](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-units-in-kubernetes). Let's look at an example to understand how to customize resources. -Import the dependencies. +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -```{code-cell} -import typing +Import the dependencies: -from flytekit import Resources, task, workflow +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/customizing_resources.py +:caption: productionizing/customizing_resources.py +:lines: 1-3 ``` -+++ {"lines_to_next_cell": 0} +Define a task and configure the resources to be allocated to it: -Define a task and configure the resources to be allocated to it. - -```{code-cell} -@task(requests=Resources(cpu="1", mem="100Mi"), limits=Resources(cpu="2", mem="150Mi")) -def count_unique_numbers(x: typing.List[int]) -> int: - s = set() - for i in x: - s.add(i) - return len(s) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/customizing_resources.py +:caption: productionizing/customizing_resources.py +:pyobject: count_unique_numbers ``` -+++ {"lines_to_next_cell": 0} - -Define a task that computes the square of a number. +Define a task that computes the square of a number: -```{code-cell} -@task -def square(x: int) -> int: - return x * x +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/customizing_resources.py +:caption: productionizing/customizing_resources.py +:pyobject: square ``` -+++ {"lines_to_next_cell": 0} - You can use the tasks decorated with memory and storage hints like regular tasks in a workflow. -```{code-cell} -@workflow -def my_workflow(x: typing.List[int]) -> int: - return square(x=count_unique_numbers(x=x)) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/customizing_resources.py +:caption: productionizing/customizing_resources.py +:pyobject: my_workflow ``` -+++ {"lines_to_next_cell": 0} - You can execute the workflow locally. -```{code-cell} -if __name__ == "__main__": - print(count_unique_numbers(x=[1, 1, 2])) - print(my_workflow(x=[1, 1, 2])) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/customizing_resources.py +:caption: productionizing/customizing_resources.py +:lines: 32-34 ``` :::{note} To alter the limits of the default platform configuration, change the [admin config](https://github.com/flyteorg/flyte/blob/b16ffd76934d690068db1265ac9907a278fba2ee/deployment/eks/flyte_helm_generated.yaml#L203-L213) and [namespace level quota](https://github.com/flyteorg/flyte/blob/b16ffd76934d690068db1265ac9907a278fba2ee/deployment/eks/flyte_helm_generated.yaml#L214-L240) on the cluster. ::: -+++ - (resource_with_overrides)= ## Using `with_overrides` @@ -116,58 +80,40 @@ To alter the limits of the default platform configuration, change the [admin con You can use the `with_overrides` method to override the resources allocated to the tasks dynamically. Let's understand how the resources can be initialized with an example. -+++ {"lines_to_next_cell": 0} - Import the dependencies. -```{code-cell} -import typing # noqa: E402 - -from flytekit import Resources, task, workflow # noqa: E402 +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/customizing_resources.py +:caption: productionizing/customizing_resources.py +:lines: 38-40 ``` -+++ {"lines_to_next_cell": 0} - Define a task and configure the resources to be allocated to it. You can use tasks decorated with memory and storage hints like regular tasks in a workflow. -```{code-cell} -@task(requests=Resources(cpu="1", mem="200Mi"), limits=Resources(cpu="2", mem="350Mi")) -def count_unique_numbers_1(x: typing.List[int]) -> int: - s = set() - for i in x: - s.add(i) - return len(s) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/customizing_resources.py +:caption: productionizing/customizing_resources.py +:pyobject: count_unique_numbers ``` -+++ {"lines_to_next_cell": 0} - -Define a task that computes the square of a number. +Define a task that computes the square of a number: -```{code-cell} -@task -def square_1(x: int) -> int: - return x * x +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/customizing_resources.py +:caption: productionizing/customizing_resources.py +:pyobject: square_1 ``` -+++ {"lines_to_next_cell": 0} +The `with_overrides` method overrides the old resource allocations: -The `with_overrides` method overrides the old resource allocations. - -```{code-cell} -@workflow -def my_pipeline(x: typing.List[int]) -> int: - return square_1(x=count_unique_numbers_1(x=x)).with_overrides(limits=Resources(cpu="6", mem="500Mi")) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/customizing_resources.py +:caption: productionizing/customizing_resources.py +:pyobject: my_pipeline ``` -+++ {"lines_to_next_cell": 0} - -You can execute the workflow locally. +You can execute the workflow locally: -```{code-cell} -if __name__ == "__main__": - print(count_unique_numbers_1(x=[1, 1, 2])) - print(my_pipeline(x=[1, 1, 2])) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/customizing_resources.py +:caption: productionizing/customizing_resources.py +:lines: 65-67 ``` You can see the memory allocation below. The memory limit is `500Mi` rather than `350Mi`, and the @@ -179,3 +125,5 @@ This is because the default platform CPU quota for every pod is 4. Resource allocated using "with_overrides" method ::: + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/productionizing/ diff --git a/docs/user_guide/productionizing/notifications.md b/docs/user_guide/productionizing/notifications.md index 133a402c43..6837a7b632 100644 --- a/docs/user_guide/productionizing/notifications.md +++ b/docs/user_guide/productionizing/notifications.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Notifications ```{eval-rst} @@ -22,8 +5,6 @@ kernelspec: ``` -+++ - When a workflow is completed, users can be notified by: - Email @@ -34,100 +15,45 @@ The content of these notifications is configurable at the platform level. ## Code example -When a workflow reaches a specified [terminal workflow execution phase](https://github.com/flyteorg/flytekit/blob/v0.16.0b7/flytekit/core/notification.py#L10,L15), -the {py:class}`flytekit:flytekit.Email`, {py:class}`flytekit:flytekit.PagerDuty`, or {py:class}`flytekit:flytekit.Slack` -objects can be used in the construction of a {py:class}`flytekit:flytekit.LaunchPlan`. +When a workflow reaches a specified [terminal workflow execution phase](https://github.com/flyteorg/flytekit/blob/v0.16.0b7/flytekit/core/notification.py#L10,L15), the {py:class}`flytekit:flytekit.Email`, {py:class}`flytekit:flytekit.PagerDuty`, or {py:class}`flytekit:flytekit.Slack` objects can be used in the construction of a {py:class}`flytekit:flytekit.LaunchPlan`. -```{code-cell} -from datetime import timedelta +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/lp_notifications.py +:caption: productionizing/lp_notifications.py +:lines: 1 +``` Consider the following example workflow: -```{code-cell} -from flytekit import Email, FixedRate, LaunchPlan, PagerDuty, Slack, WorkflowExecutionPhase, task, workflow - - -@task -def double_int_and_print(a: int) -> str: - return str(a * 2) - - -@workflow -def int_doubler_wf(a: int) -> str: - doubled = double_int_and_print(a=a) - return doubled +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/lp_notifications.py +:caption: productionizing/lp_notifications.py +:lines: 3-14 ``` -+++ {"lines_to_next_cell": 0} - Here are three scenarios that can help deepen your understanding of how notifications work: 1. Launch Plan triggers email notifications when the workflow execution reaches the `SUCCEEDED` phase. -```{code-cell} -int_doubler_wf_lp = LaunchPlan.get_or_create( - name="email_notifications_lp", - workflow=int_doubler_wf, - default_inputs={"a": 4}, - notifications=[ - Email( - phases=[WorkflowExecutionPhase.SUCCEEDED], - recipients_email=["admin@example.com"], - ) - ], -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/lp_notifications.py +:caption: productionizing/lp_notifications.py +:lines: 20-30 ``` -+++ {"lines_to_next_cell": 0} - 2. Notifications shine when used for scheduled workflows to alert for failures. -```{code-cell} -:lines_to_next_cell: 2 - -int_doubler_wf_scheduled_lp = LaunchPlan.get_or_create( - name="int_doubler_wf_scheduled", - workflow=int_doubler_wf, - default_inputs={"a": 4}, - notifications=[ - PagerDuty( - phases=[WorkflowExecutionPhase.FAILED, WorkflowExecutionPhase.TIMED_OUT], - recipients_email=["abc@pagerduty.com"], - ) - ], - schedule=FixedRate(duration=timedelta(days=1)), -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/lp_notifications.py +:caption: productionizing/lp_notifications.py +:lines: 33-44 ``` 3. Notifications can be combined with different permutations of terminal phases and recipient targets. -```{code-cell} -wacky_int_doubler_lp = LaunchPlan.get_or_create( - name="wacky_int_doubler", - workflow=int_doubler_wf, - default_inputs={"a": 4}, - notifications=[ - Email( - phases=[WorkflowExecutionPhase.FAILED], - recipients_email=["me@example.com", "you@example.com"], - ), - Email( - phases=[WorkflowExecutionPhase.SUCCEEDED], - recipients_email=["myboss@example.com"], - ), - Slack( - phases=[ - WorkflowExecutionPhase.SUCCEEDED, - WorkflowExecutionPhase.ABORTED, - WorkflowExecutionPhase.TIMED_OUT, - ], - recipients_email=["myteam@slack.com"], - ), - ], -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/lp_notifications.py +:caption: productionizing/lp_notifications.py +:lines: 48-70 ``` 4. You can use pyflyte register to register the launch plan and launch it in the web console to get the notifications. @@ -142,13 +68,10 @@ Choose the launch plan with notifications config :class: with-shadow ::: -+++ ### Future work -Work is ongoing to support a generic event egress system that can be used to publish events for tasks, workflows, and -workflow nodes. When this is complete, generic event subscribers can asynchronously process these events for a rich -and fully customizable experience. +Work is ongoing to support a generic event egress system that can be used to publish events for tasks, workflows, and workflow nodes. When this is complete, generic event subscribers can asynchronously process these events for a rich and fully customizable experience. ## Platform configuration changes @@ -160,8 +83,7 @@ This is only supported for Flyte instances running on AWS. ### Config #### For Sandbox -To publish notifications, you'll need to register a sendgrid api key from [sendgrid](https://sendgrid.com/), it's free for 100 emails per day. -You have to add notifications config in your sandbox config file. +To publish notifications, you'll need to register a Sendgrid api key from [Sendgrid](https://sendgrid.com/), it's free for 100 emails per day. You have to add notifications config in your sandbox config file. ```yaml # config-sandbox.yaml @@ -223,3 +145,6 @@ notifications: - **body**: Configurable email body used in notifications. The complete set of parameters that can be used for email templating are checked in [here](https://github.com/flyteorg/flyteadmin/blob/a84223dab00dfa52d8ba1ed2d057e77b6c6ab6a7/pkg/async/notifications/email.go#L18,L30). + + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/productionizing/ diff --git a/docs/user_guide/productionizing/reference_launch_plans.md b/docs/user_guide/productionizing/reference_launch_plans.md index 8ea476ef3e..b089e1838e 100644 --- a/docs/user_guide/productionizing/reference_launch_plans.md +++ b/docs/user_guide/productionizing/reference_launch_plans.md @@ -1,28 +1,10 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Reference launch plans ```{eval-rst} .. tags:: Intermediate ``` -A {py:func}`flytekit.reference_launch_plan` references previously defined, serialized, and registered Flyte launch plans. -You can reference launch plans from other projects and create workflows that use launch plans declared by others. +A {py:func}`flytekit.reference_launch_plan` references previously defined, serialized, and registered Flyte launch plans. You can reference launch plans from other projects and create workflows that use launch plans declared by others. The following example illustrates how to use reference launch plans. @@ -30,38 +12,13 @@ The following example illustrates how to use reference launch plans. Reference launch plans cannot be run locally. You must mock them out. ::: -```{code-cell} -:lines_to_next_cell: 2 - -from typing import List - -from flytekit import reference_launch_plan, workflow -from flytekit.types.file import FlyteFile - - -@reference_launch_plan( - project="flytesnacks", - domain="development", - name="data_types_and_io.file.normalize_csv_file", - version="{{ registration.version }}", -) -def normalize_csv_file( - csv_url: FlyteFile, - column_names: List[str], - columns_to_normalize: List[str], - output_location: str, -) -> FlyteFile: - ... - +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -@workflow -def reference_lp_wf() -> FlyteFile: - return normalize_csv_file( - csv_url="https://people.sc.fsu.edu/~jburkardt/data/csv/biostats.csv", - column_names=["Name", "Sex", "Age", "Heights (in)", "Weight (lbs)"], - columns_to_normalize=["Age"], - output_location="", - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/reference_launch_plan.py +:caption: productionizing/reference_launch_plan.py +:lines: 1-36 ``` It's important to verify that the workflow interface corresponds to that of the referenced workflow. @@ -86,3 +43,5 @@ def normalize_csv_file(...): ... ``` ::: + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/productionizing/ diff --git a/docs/user_guide/productionizing/reference_tasks.md b/docs/user_guide/productionizing/reference_tasks.md index 057986d74a..83dfe9e2dc 100644 --- a/docs/user_guide/productionizing/reference_tasks.md +++ b/docs/user_guide/productionizing/reference_tasks.md @@ -1,31 +1,10 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - # Reference tasks ```{eval-rst} .. tags:: Intermediate ``` -A {py:func}`flytekit.reference_task` references the Flyte tasks that have already been defined, serialized, and registered. -You can reference tasks from other projects and create workflows that use tasks declared by others. -These tasks can be in their own containers, python runtimes, flytekit versions, and even different languages. +A {py:func}`flytekit.reference_task` references the Flyte tasks that have already been defined, serialized, and registered. You can reference tasks from other projects and create workflows that use tasks declared by others. These tasks can be in their own containers, python runtimes, flytekit versions, and even different languages. The following example illustrates how to use reference tasks. @@ -33,38 +12,13 @@ The following example illustrates how to use reference tasks. Reference tasks cannot be run locally. You must mock them out. ::: -```{code-cell} -:lines_to_next_cell: 2 - -from typing import List - -from flytekit import reference_task, workflow -from flytekit.types.file import FlyteFile - - -@reference_task( - project="flytesnacks", - domain="development", - name="data_types_and_io.file.normalize_columns", - version="{{ registration.version }}", -) -def normalize_columns( - csv_url: FlyteFile, - column_names: List[str], - columns_to_normalize: List[str], - output_location: str, -) -> FlyteFile: - ... - +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` -@workflow -def wf() -> FlyteFile: - return normalize_columns( - csv_url="https://people.sc.fsu.edu/~jburkardt/data/csv/biostats.csv", - column_names=["Name", "Sex", "Age", "Heights (in)", "Weight (lbs)"], - columns_to_normalize=["Age"], - output_location="", - ) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/reference_task.py +:caption: productionizing/reference_task.py +:lines: 1-36 ``` :::{note} @@ -87,3 +41,5 @@ A typical reference task would resemble the following: ... ``` ::: + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/productionizing/ diff --git a/docs/user_guide/productionizing/schedules.md b/docs/user_guide/productionizing/schedules.md index 0deda30d04..f361bb7a57 100644 --- a/docs/user_guide/productionizing/schedules.md +++ b/docs/user_guide/productionizing/schedules.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (scheduling_launch_plan)= # Schedules @@ -36,29 +19,17 @@ Check out a demo of how the Native Scheduler works: Native scheduler doesn't support [AWS syntax](http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions). ::: -+++ {"lines_to_next_cell": 0} +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` Consider the following example workflow: -```{code-cell} -from datetime import datetime - -from flytekit import task, workflow - - -@task -def format_date(run_date: datetime) -> str: - return run_date.strftime("%Y-%m-%d %H:%M") - - -@workflow -def date_formatter_wf(kickoff_time: datetime): - formatted_kickoff_time = format_date(run_date=kickoff_time) - print(formatted_kickoff_time) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/lp_schedules.py +:caption: productionizing/lp_schedules.py +:lines: 1-14 ``` -+++ {"lines_to_next_cell": 0} - The `date_formatter_wf` workflow can be scheduled using either the `CronSchedule` or the `FixedRate` object. (cron-schedules)= @@ -68,60 +39,24 @@ The `date_formatter_wf` workflow can be scheduled using either the `CronSchedule [Cron](https://en.wikipedia.org/wiki/Cron) expression strings use this {ref}`syntax `. An incorrect cron schedule expression would lead to failure in triggering the schedule. -```{code-cell} -from flytekit import CronSchedule, LaunchPlan # noqa: E402 - -# creates a launch plan that runs every minute. -cron_lp = LaunchPlan.get_or_create( - name="my_cron_scheduled_lp", - workflow=date_formatter_wf, - schedule=CronSchedule( - # Note that the ``kickoff_time_input_arg`` matches the workflow input we defined above: kickoff_time - # But in case you are using the AWS scheme of schedules and not using the native scheduler then switch over the schedule parameter with cron_expression - schedule="*/1 * * * *", # Following schedule runs every min - kickoff_time_input_arg="kickoff_time", - ), -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/lp_schedules.py +:caption: productionizing/lp_schedules.py +:lines: 17-29 ``` The `kickoff_time_input_arg` corresponds to the workflow input `kickoff_time`. Specifying this argument means that Flyte will pass in the kick-off time of the cron schedule into the `kickoff_time` argument of the `date_formatter_wf` workflow. -+++ - ## Fixed rate intervals -If you prefer to use an interval rather than a cron scheduler to schedule your workflows, you can use the fixed-rate scheduler. -A fixed-rate scheduler runs at the specified interval. +If you prefer to use an interval rather than a cron scheduler to schedule your workflows, you can use the fixed-rate scheduler. A fixed-rate scheduler runs at the specified interval. Here's an example: -```{code-cell} -from datetime import timedelta # noqa: E402 - -from flytekit import FixedRate, LaunchPlan # noqa: E402 - - -@task -def be_positive(name: str) -> str: - return f"You're awesome, {name}" - - -@workflow -def positive_wf(name: str): - reminder = be_positive(name=name) - print(f"{reminder}") - - -fixed_rate_lp = LaunchPlan.get_or_create( - name="my_fixed_rate_lp", - workflow=positive_wf, - # Note that the workflow above doesn't accept any kickoff time arguments. - # We just omit the ``kickoff_time_input_arg`` from the FixedRate schedule invocation - schedule=FixedRate(duration=timedelta(minutes=10)), - fixed_inputs={"name": "you"}, -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/lp_schedules.py +:caption: productionizing/lp_schedules.py +:lines: 34-57 ``` This fixed-rate scheduler runs every ten minutes. Similar to a cron scheduler, a fixed-rate scheduler also accepts `kickoff_time_input_arg` (which is omitted in this example). @@ -136,16 +71,12 @@ After initializing your launch plan, [activate the specific version of the launc flytectl update launchplan -p flyteexamples -d development {{ name_of_lp }} --version --activate ``` -+++ - Verify if your launch plan was activated: ```bash flytectl get launchplan -p flytesnacks -d development ``` -+++ - ## Deactivating a schedule You can [archive/deactivate the launch plan](https://docs.flyte.org/projects/flytectl/en/latest/gen/flytectl_update_launchplan.html) to deschedule any scheduled job associated with it. @@ -154,8 +85,6 @@ You can [archive/deactivate the launch plan](https://docs.flyte.org/projects/fly flytectl update launchplan -p flyteexamples -d development {{ name_of_lp }} --version --archive ``` -+++ - ## Platform configuration changes for AWS scheduler The Scheduling feature can be run using the Flyte native scheduler which comes with Flyte. If you intend to use the AWS scheduler then it requires additional infrastructure to run, so these will have to be created and configured. The following sections are only required if you use the AWS scheme for the scheduler. You can still run the Flyte native scheduler on AWS. @@ -186,8 +115,6 @@ scheduler: scheduleNamePrefix: "flyte" ``` -+++ - - **scheme**: in this case because AWS is the only cloud back-end supported for scheduling workflows, only `"aws"` is a valid value. By default, the no-op scheduler is used. - **region**: this specifies which region initialized AWS clients should use when creating CloudWatch rules. - **scheduleRole** This is the IAM role ARN with permissions set to `Allow` @@ -219,9 +146,9 @@ scheduler: accountId: "{{ YOUR ACCOUNT ID }}" ``` -+++ - - **scheme**: in this case because AWS is the only cloud back-end supported for executing scheduled workflows, only `"aws"` is a valid value. By default, the no-op executor is used and in case of sandbox we use `"local"` scheme which uses the Flyte native scheduler. - **region**: this specifies which region AWS clients should use when creating an SQS subscriber client. - **scheduleQueueName**: this is the name of the SQS Queue you've allocated to scheduling workflows. - **accountId**: Your AWS [account id](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html#FindingYourAWSId). + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/productionizing/ diff --git a/docs/user_guide/productionizing/secrets.md b/docs/user_guide/productionizing/secrets.md index d631594cc7..9957f5cdaf 100644 --- a/docs/user_guide/productionizing/secrets.md +++ b/docs/user_guide/productionizing/secrets.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - (secrets)= # Secrets @@ -32,8 +15,6 @@ different types of secrets, but for users writing Python tasks, you can only acc secure secrets either as environment variables or as a file injected into the running container. -+++ - ## Creating secrets with a secrets manager :::{admonition} Prerequisites @@ -71,27 +52,19 @@ define secrets using a [configuration file](https://kubernetes.io/docs/tasks/con or tools like [Kustomize](https://kubernetes.io/docs/tasks/configmap-secret/managing-secret-using-kustomize/). ::: -+++ - ## Using secrets in tasks +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. +``` + Once you've defined a secret on the Flyte backend, `flytekit` exposes a class called {py:class}`~flytekit.Secret`s, which allows you to request a secret -from the configured secret manager. +from the configured secret manager: -```{code-cell} -import os -from typing import Tuple - -import flytekit -from flytekit import Secret, task, workflow -from flytekit.testing import SecretsManager - -secret = Secret( - group="", - key="", - mount_requirement=Secret.MountType.ENV_VAR, -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/use_secrets.py +:caption: productionizing/use_secrets.py +:lines: 1-6, 49-53 ``` Secrets consists of `group`, `key`, and `mounting_requirement` arguments, @@ -103,9 +76,9 @@ In the code below we specify two variables, `SECRET_GROUP` and `SECRET_NAME`, which maps onto the `user-info` secret that we created with `kubectl` above, with a key called `user_secret`. -```{code-cell} -SECRET_GROUP = "user-info" -SECRET_NAME = "user_secret" +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/use_secrets.py +:caption: productionizing/use_secrets.py +:lines: 66-67 ``` Now we declare the secret in the `secret_requests` argument of the @@ -119,13 +92,9 @@ invoking the {py:func}`flytekit.current_context` function, as shown below. At runtime, flytekit looks inside the task pod for an environment variable or a mounted file with a predefined name/path and loads the value. -```{code-cell} -@task(secret_requests=[Secret(group=SECRET_GROUP, key=SECRET_NAME)]) -def secret_task() -> str: - context = flytekit.current_context() - secret_val = context.secrets.get(SECRET_GROUP, SECRET_NAME) - print(secret_val) - return secret_val +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/use_secrets.py +:caption: productionizing/use_secrets.py +:pyobject: secret_task ``` :::{warning} @@ -156,30 +125,18 @@ the same secret: ``` In this case, the secret group will be `user-info`, with three available -secret keys: `user_secret`, `username`, and `password`. +secret keys: `user_secret`, `username`, and `password`: -```{code-cell} -USERNAME_SECRET = "username" -PASSWORD_SECRET = "password" +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/use_secrets.py +:caption: productionizing/use_secrets.py +:lines: 107-108 ``` -+++ {"lines_to_next_cell": 0} - The Secret structure allows passing two fields, matching the key and the group, as previously described: -```{code-cell} -@task( - secret_requests=[ - Secret(key=USERNAME_SECRET, group=SECRET_GROUP), - Secret(key=PASSWORD_SECRET, group=SECRET_GROUP), - ] -) -def user_info_task() -> Tuple[str, str]: - context = flytekit.current_context() - secret_username = context.secrets.get(SECRET_GROUP, USERNAME_SECRET) - secret_pwd = context.secrets.get(SECRET_GROUP, PASSWORD_SECRET) - print(f"{secret_username}={secret_pwd}") - return secret_username, secret_pwd +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/use_secrets.py +:caption: productionizing/use_secrets.py +:lines: 113-124 ``` :::{warning} @@ -198,40 +155,16 @@ In these scenarios you can specify the `mount_requirement=Secret.MountType.FILE` In the following example we force the mounting to be an environment variable: -```{code-cell} -@task( - secret_requests=[ - Secret( - group=SECRET_GROUP, - key=SECRET_NAME, - mount_requirement=Secret.MountType.ENV_VAR, - ) - ] -) -def secret_file_task() -> Tuple[str, str]: - secret_manager = flytekit.current_context().secrets - - # get the secrets filename - f = secret_manager.get_secrets_file(SECRET_GROUP, SECRET_NAME) - - # get secret value from an environment variable - secret_val = secret_manager.get(SECRET_GROUP, SECRET_NAME) - - # returning the filename and the secret_val - return f, secret_val +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/use_secrets.py +:caption: productionizing/use_secrets.py +:lines: 139-158 ``` -+++ {"lines_to_next_cell": 0} - These tasks can be used in your workflow as usual -```{code-cell} -@workflow -def my_secret_workflow() -> Tuple[str, str, str, str, str]: - x = secret_task() - y, z = user_info_task() - f, s = secret_file_task() - return x, y, z, f, s +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/use_secrets.py +:caption: productionizing/use_secrets.py +:pyobject: my_secret_workflow ``` ### Testing with mock secrets @@ -239,18 +172,9 @@ def my_secret_workflow() -> Tuple[str, str, str, str, str]: The simplest way to test secret accessibility is to export the secret as an environment variable. There are some helper methods available to do so: -```{code-cell} -if __name__ == "__main__": - sec = SecretsManager() - os.environ[sec.get_secrets_env_var(SECRET_GROUP, SECRET_NAME)] = "value" - os.environ[sec.get_secrets_env_var(SECRET_GROUP, USERNAME_SECRET)] = "username_value" - os.environ[sec.get_secrets_env_var(SECRET_GROUP, PASSWORD_SECRET)] = "password_value" - x, y, z, f, s = my_secret_workflow() - assert x == "value" - assert y == "username_value" - assert z == "password_value" - assert f == sec.get_secrets_file(SECRET_GROUP, SECRET_NAME) - assert s == "value" +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/productionizing/productionizing/use_secrets.py +:caption: productionizing/use_secrets.py +:lines: 172-182 ``` ## Using secrets in task templates @@ -291,8 +215,6 @@ sql_query = SQLAlchemyTask( ) ``` -+++ - :::{note} Here the `secret_connect_args` map to the [SQLAlchemy engine configuration](https://docs.sqlalchemy.org/en/20/core/engines.html) @@ -302,7 +224,6 @@ argument names for the username and password. You can then use the `sql_query` task inside a workflow to grab data and perform downstream transformations on it. -+++ ## How secrets injection works @@ -386,18 +307,15 @@ When using the AWS secret management plugin, secrets need to be specified by nam ### Vault secrets manager -When using the Vault secret manager, make sure you have Vault Agent deployed on your cluster as described in this -[step-by-step tutorial](https://learn.hashicorp.com/tutorials/vault/kubernetes-sidecar). +When using the Vault secret manager, make sure you have Vault Agent deployed on your cluster as described in this [step-by-step tutorial](https://learn.hashicorp.com/tutorials/vault/kubernetes-sidecar). Vault secrets can only be mounted as files and will become available under `"/etc/flyte/secrets/SECRET_GROUP/SECRET_NAME"`. Vault comes with various secrets engines. Currently Flyte supports working with both version 1 and 2 of the `Key Vault engine ` as well as the `databases secrets engine `. You can use use the `group_version` parameter to specify which secret backend engine to use. Available choices are: "kv1", "kv2", "db": -+++ {"lines_to_next_cell": 0} - -How to request secrets with the Vault secret manager +#### Requesting secrets with the Vault secret manager -```{code-cell} +```python secret = Secret( group="", key="", @@ -434,12 +352,11 @@ If Flyte administrator wants to set up annotations for the entire system, they c ### Vertical scaling -To scale the Webhook to be able to process the number/rate of pods you need, you may need to configure a vertical [pod -autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler). +To scale the Webhook to be able to process the number/rate of pods you need, you may need to configure a vertical [pod autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler). ### Horizontal scaling -The Webhook does not make any external API Requests in response to Pod mutation requests. It should be able to handle traffic -quickly. For horizontal scaling, adding additional replicas for the Pod in the -deployment should be sufficient. A single `MutatingWebhookConfiguration` object will be used, the same TLS certificate -will be shared across the pods and the Service created will automatically load balance traffic across the available pods. +The Webhook does not make any external API Requests in response to Pod mutation requests. It should be able to handle traffic quickly. For horizontal scaling, adding additional replicas for the Pod in the +deployment should be sufficient. A single `MutatingWebhookConfiguration` object will be used, the same TLS certificate will be shared across the pods and the Service created will automatically load balance traffic across the available pods. + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/productionizing/ diff --git a/docs/user_guide/productionizing/spot_instances.md b/docs/user_guide/productionizing/spot_instances.md index 85024f6996..864cfbbd3c 100644 --- a/docs/user_guide/productionizing/spot_instances.md +++ b/docs/user_guide/productionizing/spot_instances.md @@ -1,31 +1,10 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -+++ {"lines_to_next_cell": 0} - -# Spot instances + # Spot instances ```{eval-rst} .. tags:: AWS, GCP, Intermediate ``` -+++ - ## What are spot instances? Spot instances are unused EC2 capacity in AWS. [Spot instances](https://aws.amazon.com/ec2/spot/?cards.sort-by=item.additionalFields.startDateTime&cards.sort-order=asc) can result in up to 90% savings on on-demand prices. The caveat is that these instances can be preempted at any point and no longer be available for use. This can happen due to: @@ -52,7 +31,6 @@ This can be done by setting taints and tolerations using the [config](https://gi When your spot/preemptible instance is terminated, ASG attempts to launch a replacement instance to maintain the desired capacity for the group. ::: -+++ ## What are interruptible tasks? @@ -68,8 +46,6 @@ def add_one_and_print(value_to_print: int) -> int: return value_to_print + 1 ``` -+++ - By setting this value, Flyte will schedule your task on an auto-scaling group (ASG) with only spot instances. :::{note} @@ -87,6 +63,4 @@ If your task does NOT exhibit the following properties, you can set `interruptib In a nutshell, you should use spot/preemptible instances when you want to reduce the total cost of running jobs at the expense of potential delays in execution due to restarts. -+++ - % TODO: Write "How to Recover From Interruptions?" section diff --git a/docs/user_guide/productionizing/workflow_labels_and_annotations.md b/docs/user_guide/productionizing/workflow_labels_and_annotations.md index 5b9fe6d4c6..a290b2afa5 100644 --- a/docs/user_guide/productionizing/workflow_labels_and_annotations.md +++ b/docs/user_guide/productionizing/workflow_labels_and_annotations.md @@ -1,20 +1,3 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Workflow labels and annotations ```{eval-rst} diff --git a/docs/user_guide/testing/mocking_tasks.md b/docs/user_guide/testing/mocking_tasks.md index 07b4f0239e..b22db0eb51 100644 --- a/docs/user_guide/testing/mocking_tasks.md +++ b/docs/user_guide/testing/mocking_tasks.md @@ -1,101 +1,49 @@ ---- -jupytext: - cell_metadata_filter: all - formats: md:myst - main_language: python - notebook_metadata_filter: all - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - # Mocking tasks -A lot of the tasks that you write you can run locally, but some of them you will not be able to, usually because they -are tasks that depend on a third-party only available on the backend. Hive tasks are a common example, as most users -will not have access to the service that executes Hive queries from their development environment. However, it's still -useful to be able to locally run a workflow that calls such a task. In these instances, flytekit provides a couple -of utilities to help navigate this. - -```{code-cell} -import datetime +A lot of the tasks that you write you can run locally, but some of them you will not be able to, usually because they are tasks that depend on a third-party only available on the backend. Hive tasks are a common example, as most users will not have access to the service that executes Hive queries from their development environment. However, it's still useful to be able to locally run a workflow that calls such a task. In these instances, flytekit provides a couple of utilities to help navigate this. -import pandas -from flytekit import SQLTask, TaskMetadata, kwtypes, task, workflow -from flytekit.testing import patch, task_mock -from flytekit.types.schema import FlyteSchema +```{note} +To clone and run the example code on this page, see the [Flytesnacks repo][flytesnacks]. ``` -+++ {"lines_to_next_cell": 0} +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/testing/testing/mocking.py +:caption: testing/mocking.py +:lines: 1-6 +``` -This is a generic SQL task (and is by default not hooked up to any datastore nor handled by any plugin), and must -be mocked. +This is a generic SQL task (and is by default not hooked up to any datastore nor handled by any plugin), and must be mocked: -```{code-cell} -sql = SQLTask( - "my-query", - query_template="SELECT * FROM hive.city.fact_airport_sessions WHERE ds = '{{ .Inputs.ds }}' LIMIT 10", - inputs=kwtypes(ds=datetime.datetime), - outputs=kwtypes(results=FlyteSchema), - metadata=TaskMetadata(retries=2), -) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/testing/testing/mocking.py +:caption: testing/mocking.py +:lines: 10-16 ``` -+++ {"lines_to_next_cell": 0} +This is a task that can run locally: -This is a task that can run locally - -```{code-cell} -@task -def t1() -> datetime.datetime: - return datetime.datetime.now() +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/testing/testing/mocking.py +:caption: testing/mocking.py +:pyobject: t1 ``` -+++ {"lines_to_next_cell": 0} - Declare a workflow that chains these two tasks together. -```{code-cell} -@workflow -def my_wf() -> FlyteSchema: - dt = t1() - return sql(ds=dt) +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/testing/testing/mocking.py +:caption: testing/mocking.py +:pyobject: my_wf ``` -+++ {"lines_to_next_cell": 0} - -Without a mock, calling the workflow would typically raise an exception, but with the `task_mock` construct, which -returns a `MagicMock` object, we can override the return value. +Without a mock, calling the workflow would typically raise an exception, but with the `task_mock` construct, which returns a `MagicMock` object, we can override the return value. -```{code-cell} -def main_1(): - with task_mock(sql) as mock: - mock.return_value = pandas.DataFrame(data={"x": [1, 2], "y": ["3", "4"]}) - assert (my_wf().open().all() == pandas.DataFrame(data={"x": [1, 2], "y": ["3", "4"]})).all().all() +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/testing/testing/mocking.py +:caption: testing/mocking.py +:pyobject: main_1 ``` -+++ {"lines_to_next_cell": 0} +There is another utility as well called `patch` which offers the same functionality, but in the traditional Python patching style, where the first argument is the `MagicMock` object. -There is another utility as well called `patch` which offers the same functionality, but in the traditional Python -patching style, where the first argument is the `MagicMock` object. - -```{code-cell} -def main_2(): - @patch(sql) - def test_user_demo_test(mock_sql): - mock_sql.return_value = pandas.DataFrame(data={"x": [1, 2], "y": ["3", "4"]}) - assert (my_wf().open().all() == pandas.DataFrame(data={"x": [1, 2], "y": ["3", "4"]})).all().all() - - test_user_demo_test() - - -if __name__ == "__main__": - main_1() - main_2() +```{rli} https://raw.githubusercontent.com/flyteorg/flytesnacks/master/examples/testing/testing/mocking.py +:caption: testing/mocking.py +:lines: 45-56 ``` + +[flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/testing/ From 6f0c274e1fa63e81471c501c85092af2e5993cdf Mon Sep 17 00:00:00 2001 From: Chi-Sheng Liu Date: Sat, 20 Apr 2024 08:00:06 +0800 Subject: [PATCH 444/645] refactor(python): Replace os.path with pathlib (#5243) Signed-off-by: Chi-Sheng Liu --- docs/_ext/import_projects.py | 27 +++++++++++---------------- docs/conf.py | 7 ++++--- flyteidl/conf.py | 2 +- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/docs/_ext/import_projects.py b/docs/_ext/import_projects.py index da551ae374..7cd5319921 100644 --- a/docs/_ext/import_projects.py +++ b/docs/_ext/import_projects.py @@ -1,5 +1,4 @@ import inspect -import os import re import shutil import subprocess @@ -83,27 +82,23 @@ def parse(self): def update_sys_path_for_flytekit(import_project_config: ImportProjectsConfig): + flytekit_dir = Path(import_project_config.flytekit_api_dir).resolve(strict=True) + flytekit_src_dir = flytekit_dir / "flytekit" + plugins_dir = flytekit_dir / "plugins" + # create flytekit/_version.py file manually - with open( - f"{import_project_config.flytekit_api_dir}/flytekit/_version.py", "w" - ) as f: + with (flytekit_src_dir / "_version.py").open("w") as f: f.write(f'__version__ = "dev"') # add flytekit to python path - flytekit_dir = os.path.abspath(import_project_config.flytekit_api_dir) - flytekit_src_dir = os.path.abspath(os.path.join(flytekit_dir, "flytekit")) - plugins_dir = os.path.abspath(os.path.join(flytekit_dir, "plugins")) - - sys.path.insert(0, flytekit_src_dir) - sys.path.insert(0, flytekit_dir) + sys.path.insert(0, str(flytekit_src_dir)) + sys.path.insert(0, str(flytekit_dir)) # add plugins to python path - for possible_plugin_dir in os.listdir(plugins_dir): - dir_path = os.path.abspath((os.path.join(plugins_dir, possible_plugin_dir))) - plugin_path = os.path.abspath(os.path.join(dir_path, "flytekitplugins")) - if os.path.isdir(dir_path) and os.path.exists(plugin_path): - sys.path.insert(0, dir_path) - + for possible_plugin_dir in plugins_dir.iterdir(): + plugin_path = possible_plugin_dir / "flytekitplugins" + if possible_plugin_dir.is_dir() and plugin_path.exists(): + sys.path.insert(0, str(possible_plugin_dir)) def update_html_context(project: Project, tag: str, commit: str, config: Config): tag_url = "#" if tag == "dev" else f"{project.source}/releases/tag/{tag}" diff --git a/docs/conf.py b/docs/conf.py index 00382fa77a..67baf0d907 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -10,9 +10,10 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. +# documentation root, use pathlib.Path.resolve(strict=True) to make it absolute, like shown here. import os +from pathlib import Path import logging import sys @@ -21,8 +22,8 @@ from sphinx.util import logging as sphinx_logging -sys.path.insert(0, os.path.abspath("../")) -sys.path.append(os.path.abspath("./_ext")) +sys.path.insert(0, str(Path("../").resolve(strict=True))) +sys.path.append(str(Path("./_ext").resolve(strict=True))) sphinx.application.ExtensionError = sphinx.errors.ExtensionError diff --git a/flyteidl/conf.py b/flyteidl/conf.py index 1aa29d6025..f74cb992cf 100644 --- a/flyteidl/conf.py +++ b/flyteidl/conf.py @@ -10,7 +10,7 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. +# documentation root, use pathlib.Path.resolve(strict=True) to make it absolute, like shown here. # import os import re From a521dd0d9d387f0e8475048a9d750addea0b70bb Mon Sep 17 00:00:00 2001 From: Chi-Sheng Liu Date: Sun, 21 Apr 2024 10:04:22 +0800 Subject: [PATCH 445/645] Containerize documentation build environment and add sphinx-autobuild for hot-reload (#4960) Signed-off-by: Chi-Sheng Liu --- .gitignore | 1 + Makefile | 27 +- docs/Dockerfile.conda-lock | 12 + docs/Dockerfile.docs | 21 + docs/Makefile | 2 +- docs/community/contribute.rst | 16 +- monodocs-environment.lock.yaml | 3512 ++++++++++++++++---------------- monodocs-environment.yaml | 2 +- script/local_build_docs.sh | 45 + 9 files changed, 1860 insertions(+), 1778 deletions(-) create mode 100644 docs/Dockerfile.conda-lock create mode 100644 docs/Dockerfile.docs create mode 100755 script/local_build_docs.sh diff --git a/.gitignore b/.gitignore index 301bf266a8..667375047f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ _build/ _bin/ build/ +.tmp_build/ .vscode/ *.swp *.swo diff --git a/Makefile b/Makefile index 9d441c06f1..21bc2e847d 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ GIT_HASH := $(shell git rev-parse --short HEAD) TIMESTAMP := $(shell date '+%Y-%m-%d') PACKAGE ?=github.com/flyteorg/flytestdlib LD_FLAGS="-s -w -X $(PACKAGE)/version.Version=$(GIT_VERSION) -X $(PACKAGE)/version.Build=$(GIT_HASH) -X $(PACKAGE)/version.BuildTime=$(TIMESTAMP)" +TMP_BUILD_DIR := .tmp_build .PHONY: cmd/single/dist cmd/single/dist: export FLYTECONSOLE_VERSION ?= latest @@ -43,7 +44,7 @@ release_automation: $(MAKE) -C docker/sandbox-bundled manifests .PHONY: deploy_sandbox -deploy_sandbox: +deploy_sandbox: bash script/deploy.sh .PHONY: install-piptools @@ -82,10 +83,30 @@ helm_install: ## Install helm charts helm_upgrade: ## Upgrade helm charts helm upgrade flyte --debug ./charts/flyte -f ./charts/flyte/values.yaml --create-namespace --namespace=flyte +# Used in CI .PHONY: docs docs: make -C docs clean html SPHINXOPTS=-W +$(TMP_BUILD_DIR): + mkdir $@ + +$(TMP_BUILD_DIR)/conda-lock-image: docs/Dockerfile.conda-lock | $(TMP_BUILD_DIR) + docker buildx build --load --platform=linux/amd64 --build-arg USER_UID=$$(id -u) --build-arg USER_GID=$$(id -g) -t flyte-conda-lock:latest -f docs/Dockerfile.conda-lock . + touch $(TMP_BUILD_DIR)/conda-lock-image + +monodocs-environment.lock.yaml: monodocs-environment.yaml $(TMP_BUILD_DIR)/conda-lock-image + docker run --platform=linux/amd64 --rm --pull never -v ./:/flyte flyte-conda-lock:latest lock --file monodocs-environment.yaml --lockfile monodocs-environment.lock.yaml + +$(TMP_BUILD_DIR)/dev-docs-image: docs/Dockerfile.docs monodocs-environment.lock.yaml | $(TMP_BUILD_DIR) + docker buildx build --load --platform=linux/amd64 --build-arg USER_UID=$$(id -u) --build-arg USER_GID=$$(id -g) -t flyte-dev-docs:latest -f docs/Dockerfile.docs . + touch $(TMP_BUILD_DIR)/dev-docs-image + +# Build docs in docker container for local development +.PHONY: dev-docs +dev-docs: $(TMP_BUILD_DIR)/dev-docs-image + bash script/local_build_docs.sh + .PHONY: help help: SHELL := /bin/sh help: ## List available commands and their usage @@ -121,5 +142,5 @@ lint-helm-charts: act pull_request -W .github/workflows/validate-helm-charts.yaml --container-architecture linux/amd64 -e charts/event.json .PHONY: clean -clean: ## Remove the HTML files related to the Flyteconsole. - rm -rf cmd/single/dist +clean: ## Remove the HTML files related to the Flyteconsole and Makefile + rm -rf cmd/single/dist .tmp_build diff --git a/docs/Dockerfile.conda-lock b/docs/Dockerfile.conda-lock new file mode 100644 index 0000000000..109b6e5bca --- /dev/null +++ b/docs/Dockerfile.conda-lock @@ -0,0 +1,12 @@ +FROM condaforge/mambaforge:latest + +ARG USER_UID +ARG USER_GID + +RUN getent group "${USER_GID}" || groupadd --gid "${USER_GID}" flyte +RUN getent passwd "${USER_UID}" || useradd --uid "${USER_UID}" --gid "${USER_GID}" -m flyte + +RUN conda install -c conda-forge conda-lock +WORKDIR flyte +USER ${USER_UID} +ENTRYPOINT ["conda", "run", "--no-capture-output", "conda-lock"] diff --git a/docs/Dockerfile.docs b/docs/Dockerfile.docs new file mode 100644 index 0000000000..33442bd911 --- /dev/null +++ b/docs/Dockerfile.docs @@ -0,0 +1,21 @@ +FROM condaforge/mambaforge:latest + +ARG USER_UID +ARG USER_GID + +RUN getent group "${USER_GID}" || groupadd --gid "${USER_GID}" flyte +RUN getent passwd "${USER_UID}" || useradd --uid "${USER_UID}" --gid "${USER_GID}" -m flyte + +RUN conda install -c conda-forge conda-lock +RUN --mount=type=bind,source=monodocs-environment.lock.yaml,target=monodocs-environment.lock.yaml \ + conda-lock install -n monodocs-env monodocs-environment.lock.yaml + +ENV SETUPTOOLS_SCM_PRETEND_VERSION 2.0.0 +COPY flyteidl flyteidl +SHELL ["conda", "run", "-n", "monodocs-env", "/bin/bash", "-c"] +RUN python -m pip install sphinx-autobuild +RUN python -m pip install ./flyteidl + +WORKDIR /flyte/docs +USER ${USER_UID} +ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "monodocs-env"] diff --git a/docs/Makefile b/docs/Makefile index 0bcb4e2f47..d88d8a755c 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -20,4 +20,4 @@ help: @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) clean: - rm -rf _build _src api flytectl flytekit flytesnacks protos examples + rm -rf _build _src _tags api flytectl flytekit flytesnacks protos examples tests _projects diff --git a/docs/community/contribute.rst b/docs/community/contribute.rst index c5e8311ba3..ee84046369 100644 --- a/docs/community/contribute.rst +++ b/docs/community/contribute.rst @@ -155,20 +155,10 @@ To understand how the below components interact with each other, refer to :ref:` To build the Flyte docs locally you will need the following prerequisites: -* Install ``conda``. - * We recommend Miniconda installed with an `official installer `__. * Install `conda-lock `__. -* In the ``flyteorg/flyte`` root directory run: - * ``conda-lock install --name monodocs-env monodocs-environment.lock.yaml`` - * ``conda activate monodocs-env`` - * ``pip install ./flyteidl`` - -This will set up the Python virtual environment for building the docs. Here we called it ``monodocs-env``. - -To actually build the docs, activate ``monodocs-env`` and (in the ``flyteorg/flyte`` root directory) run: - * ``make docs`` - -The resulting ``html`` files will be in ``docs/_build/html``. You can view them by running `open docs/_build/html/index.html` +* In the ``flyteorg/flyte`` root directory you can run: + * ``make dev-docs`` to build the documentation locally. The build will be in the ``docs/_build/html`` directory. See `the script `__ for additional environment variables that can be set. + * For example, to use the local flytekit source code instead of the source code from the flyteorg/flytekit repo, run ``export FLYTEKIT_LOCAL_PATH=/path/to/flytekit`` before running ``make dev-docs``. ``flyteidl`` ************ diff --git a/monodocs-environment.lock.yaml b/monodocs-environment.lock.yaml index a07232ce14..929cf9632b 100644 --- a/monodocs-environment.lock.yaml +++ b/monodocs-environment.lock.yaml @@ -13,8 +13,8 @@ version: 1 metadata: content_hash: - linux-64: c4ea2742c1d9704007aa9e822229cb0555a2f0da58b375bb5a1bdb05c82a5542 - osx-arm64: e58daa2c17c4401600ecf9a4e1039741eb1d186d902acfad0e7f254968ee3732 + linux-64: a77f3bb3db015b7747687ed6ad5ecb0fd05c8b39c4216cc0aa26500f539e71fc + osx-arm64: 446eed51611e2742973c1409920361539fa03e4c4c2cc3b6b4a5499a95831c85 osx-64: 99fdb22e3d6a1054e7f3e655d0550e0b9dff6adc206fb5b5c5219d371468faf8 channels: - url: conda-forge @@ -126,8 +126,8 @@ package: python: '>=3.6' requests: '>=2.0.0' pyjwt: '>=1.0.0' - cryptography: '>=1.1.0' python-dateutil: '>=2.1.0' + cryptography: '>=1.1.0' url: https://conda.anaconda.org/conda-forge/noarch/adal-1.2.7-pyhd8ed1ab_0.tar.bz2 hash: md5: 1a0f134d22bad81e93f1e130b35afb35 @@ -135,7 +135,7 @@ package: category: main optional: false - name: adlfs - version: 2024.2.0 + version: 2024.4.1 manager: conda platform: linux-64 dependencies: @@ -146,10 +146,10 @@ package: azure-storage-blob: '>=12.12.0' fsspec: '>=2023.12.0' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/adlfs-2024.2.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/adlfs-2024.4.1-pyhd8ed1ab_0.conda hash: - md5: 4dfa76ae23a7c27f4ccaf64945b71871 - sha256: b9ae4843b862ee69a1bfdcbb4604db817dd4f220d598fcbe64987c700b4e4cf4 + md5: 7819363253d016ca65ea5b78887afe94 + sha256: d66bca6f6aca41267bb51096f4cc6990cb054c302b4e621f52e7b0c9a1909611 category: main optional: false - name: adlfs @@ -171,7 +171,7 @@ package: category: main optional: false - name: adlfs - version: 2024.2.0 + version: 2024.4.1 manager: conda platform: osx-arm64 dependencies: @@ -182,14 +182,14 @@ package: fsspec: '>=2023.12.0' azure-storage-blob: '>=12.12.0' azure-core: '>=1.23.1,<2.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/adlfs-2024.2.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/adlfs-2024.4.1-pyhd8ed1ab_0.conda hash: - md5: 4dfa76ae23a7c27f4ccaf64945b71871 - sha256: b9ae4843b862ee69a1bfdcbb4604db817dd4f220d598fcbe64987c700b4e4cf4 + md5: 7819363253d016ca65ea5b78887afe94 + sha256: d66bca6f6aca41267bb51096f4cc6990cb054c302b4e621f52e7b0c9a1909611 category: main optional: false - name: aiobotocore - version: 2.12.1 + version: 2.12.2 manager: conda platform: linux-64 dependencies: @@ -198,10 +198,10 @@ package: botocore: '>=1.34.41,<1.34.52' python: '>=3.8' wrapt: '>=1.10.10,<2.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-2.12.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-2.12.2-pyhd8ed1ab_0.conda hash: - md5: 045560daef58c75a759c2638fbdb5c6a - sha256: e7d43681c7c2957b535aac2b3ad90013bcb39ed5514cea3cec52302f624d457a + md5: 624f424fa086b5ac029de79288c33308 + sha256: 97a7da3a5389a4b3a746b6565778319bde28edaeb11e3af371f2c08ebc99438a category: main optional: false - name: aiobotocore @@ -221,7 +221,7 @@ package: category: main optional: false - name: aiobotocore - version: 2.12.1 + version: 2.12.2 manager: conda platform: osx-arm64 dependencies: @@ -230,10 +230,10 @@ package: aioitertools: '>=0.5.1,<1.0.0' aiohttp: '>=3.7.4.post0,<4.0.0' botocore: '>=1.34.41,<1.34.52' - url: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-2.12.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-2.12.2-pyhd8ed1ab_0.conda hash: - md5: 045560daef58c75a759c2638fbdb5c6a - sha256: e7d43681c7c2957b535aac2b3ad90013bcb39ed5514cea3cec52302f624d457a + md5: 624f424fa086b5ac029de79288c33308 + sha256: 97a7da3a5389a4b3a746b6565778319bde28edaeb11e3af371f2c08ebc99438a category: main optional: false - name: aiohttp @@ -459,18 +459,6 @@ package: sha256: e4bc9aa5a6e866461274826bb750407a407fed9207a5adb70bf727f6addd7fe6 category: main optional: false -- name: alsa-lib - version: 1.2.11 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda - hash: - md5: 0bb492cca54017ea314b809b1ee3a176 - sha256: 0e2b75b9834a6e520b13db516f7cf5c9cea8f0bbc9157c978444173dacb98fec - category: main - optional: false - name: altair version: 4.2.2 manager: conda @@ -525,36 +513,62 @@ package: sha256: 5b36be4717e05b7c1f016d3534b7fe316381260ac2367a7815ff96fb88273deb category: main optional: false -- name: ansiwrap - version: 0.8.4 +- name: aniso8601 + version: 9.0.1 manager: conda platform: linux-64 dependencies: - python: <3.12.0a0 - textwrap3: '' - url: https://conda.anaconda.org/conda-forge/noarch/ansiwrap-0.8.4-py_0.tar.bz2 + python: '>=2.7' + python-dateutil: '' + url: https://conda.anaconda.org/conda-forge/noarch/aniso8601-9.0.1-pyhd8ed1ab_0.tar.bz2 hash: - md5: f09557e2a7cbd2470a2ab6353000cebd - sha256: 34e2445a78857c7418ab738b3a3c88f3226923676c3c185688dd570a6f9129a4 + md5: 36fba1a639f2d24723c5480345b78553 + sha256: 201c040b6ee0045805a777f75f37a8648eb8dfd4725d62a4fcddc24d7d6c2a9f category: main optional: false -- name: ansiwrap - version: 0.8.4 +- name: aniso8601 + version: 9.0.1 manager: conda - platform: osx-64 + platform: osx-arm64 dependencies: - textwrap3: '' - python: <3.12.0a0 - url: https://conda.anaconda.org/conda-forge/noarch/ansiwrap-0.8.4-py_0.tar.bz2 + python-dateutil: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/aniso8601-9.0.1-pyhd8ed1ab_0.tar.bz2 hash: - md5: f09557e2a7cbd2470a2ab6353000cebd - sha256: 34e2445a78857c7418ab738b3a3c88f3226923676c3c185688dd570a6f9129a4 + md5: 36fba1a639f2d24723c5480345b78553 + sha256: 201c040b6ee0045805a777f75f37a8648eb8dfd4725d62a4fcddc24d7d6c2a9f + category: main + optional: false +- name: annotated-types + version: 0.6.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + typing-extensions: '>=4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + hash: + md5: 997c29372bdbe2afee073dff71f35923 + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + category: main + optional: false +- name: annotated-types + version: 0.6.0 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.7' + typing-extensions: '>=4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + hash: + md5: 997c29372bdbe2afee073dff71f35923 + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd category: main optional: false - name: ansiwrap version: 0.8.4 manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: textwrap3: '' python: <3.12.0a0 @@ -1073,18 +1087,6 @@ package: sha256: d40f103467fd2fa426072691919fd135a4fed4a2b03cd12256ff0fee37a98249 category: main optional: false -- name: attr - version: 2.5.1 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 - hash: - md5: d9c69a24ad678ffce24c6543a0176b00 - sha256: 82c13b1772c21fc4a17441734de471d3aabf82b61db9b11f4a1bd04a9c4ac324 - category: main - optional: false - name: attrs version: 23.2.0 manager: conda @@ -1413,7 +1415,7 @@ package: category: main optional: false - name: aws-c-mqtt - version: 0.10.0 + version: 0.10.1 manager: conda platform: linux-64 dependencies: @@ -1421,10 +1423,10 @@ package: aws-c-http: '>=0.8.0,<0.8.1.0a0' aws-c-io: '>=0.14.0,<0.14.1.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.0-h2b97f5f_3.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.1-h2b97f5f_0.conda hash: - md5: fd57022ff2e0bd1dcaf5399ad16763b0 - sha256: 2cd60ece1706c84b50be9ccca101a711d1905a3c38395c4ff1f9b5d1a689d207 + md5: 4cba7afc0f74a7cce3159c0bceb607c3 + sha256: 8edcb09a2d93c24320f517f837a0e46e98749b72dc7c9d55ce1fa0c4fa5db116 category: main optional: false - name: aws-c-mqtt @@ -1593,15 +1595,15 @@ package: aws-c-event-stream: '>=0.4.1,<0.4.2.0a0' aws-c-http: '>=0.8.0,<0.8.1.0a0' aws-c-io: '>=0.14.0,<0.14.1.0a0' - aws-c-mqtt: '>=0.10.0,<0.10.1.0a0' + aws-c-mqtt: '>=0.10.1,<0.10.2.0a0' aws-c-s3: '>=0.4.9,<0.4.10.0a0' aws-c-sdkutils: '>=0.1.13,<0.1.14.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.0-hc5c3545_8.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.0-h04327c0_8.conda hash: - md5: 504eb8e5c22244f9f2427c2313ac629a - sha256: a81784ae987c6cddb65fd28dfcea48bbe9dcfb82b08b9d1add7faa92cfb72b42 + md5: 8d2aeb8c24b47ad3ff87166957b216fd + sha256: 4bdef70ff6362d8a3350b4c4181d078e7b1f654a249d63294e9ab1c5a9ca72c7 category: main optional: false - name: aws-crt-cpp @@ -1838,19 +1840,19 @@ package: category: main optional: false - name: azure-identity - version: 1.15.0 + version: 1.16.0 manager: conda platform: linux-64 dependencies: - azure-core: <2.0.0,>=1.23.0 + azure-core: '>=1.23.0' cryptography: '>=2.5' - msal: <2.0.0,>=1.24.0 - msal_extensions: <2.0.0,>=0.3.0 + msal: '>=1.24.0' + msal_extensions: '>=0.3.0' python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/azure-identity-1.15.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/azure-identity-1.16.0-pyhd8ed1ab_0.conda hash: - md5: d1ef208ae2a355e5bb9cdce337644ce9 - sha256: a7a80ce603b0b2af0670e676b0ce96cc3fddd7c59f8f2c4d5767f5cfda7a74e9 + md5: 2974f226dac8973dc9dbb6d053240a61 + sha256: d05901b713bae688daf511e12fd9481aa37e7b03beff6363d8b6801e4610ea54 category: main optional: false - name: azure-identity @@ -1870,19 +1872,19 @@ package: category: main optional: false - name: azure-identity - version: 1.15.0 + version: 1.16.0 manager: conda platform: osx-arm64 dependencies: python: '>=3.7' cryptography: '>=2.5' - azure-core: <2.0.0,>=1.23.0 - msal_extensions: <2.0.0,>=0.3.0 - msal: <2.0.0,>=1.24.0 - url: https://conda.anaconda.org/conda-forge/noarch/azure-identity-1.15.0-pyhd8ed1ab_0.conda + azure-core: '>=1.23.0' + msal: '>=1.24.0' + msal_extensions: '>=0.3.0' + url: https://conda.anaconda.org/conda-forge/noarch/azure-identity-1.16.0-pyhd8ed1ab_0.conda hash: - md5: d1ef208ae2a355e5bb9cdce337644ce9 - sha256: a7a80ce603b0b2af0670e676b0ce96cc3fddd7c59f8f2c4d5767f5cfda7a74e9 + md5: 2974f226dac8973dc9dbb6d053240a61 + sha256: d05901b713bae688daf511e12fd9481aa37e7b03beff6363d8b6801e4610ea54 category: main optional: false - name: azure-storage-blob @@ -2186,26 +2188,6 @@ package: sha256: 8f65c16a9f85285e1f704a26d4c5ced25f46544f5cc20dc8a4aebd7796f8011a category: main optional: false -- name: black - version: 24.3.0 - manager: conda - platform: linux-64 - dependencies: - click: '>=8.0.0' - mypy_extensions: '>=0.4.3' - packaging: '>=22.0' - pathspec: '>=0.9' - platformdirs: '>=2' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - tomli: '>=1.1.0' - typing_extensions: '>=4.0.1' - url: https://conda.anaconda.org/conda-forge/linux-64/black-24.3.0-py39hf3d152e_0.conda - hash: - md5: 831bcbaf689b20fc85bf87eab3b5ee29 - sha256: 7a4d9a43600c24ac29845689e24465b6c15819ad53d35e7120197aaf0badd1bb - category: main - optional: false - name: black version: 24.3.0 manager: conda @@ -2226,26 +2208,6 @@ package: sha256: 03d2486854754203540352e2ff94d9ddc4a25674c450f2a3cacaa682faf23b90 category: main optional: false -- name: black - version: 24.3.0 - manager: conda - platform: osx-arm64 - dependencies: - click: '>=8.0.0' - mypy_extensions: '>=0.4.3' - packaging: '>=22.0' - pathspec: '>=0.9' - platformdirs: '>=2' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - tomli: '>=1.1.0' - typing_extensions: '>=4.0.1' - url: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.3.0-py39h2804cbe_0.conda - hash: - md5: c86e0fc313a494cc855e80c02959fbff - sha256: 8e14d423a9613ad2763949d9ecc8c0e740a46dfac2dba7307f2c6790796c7f49 - category: main - optional: false - name: blake3 version: 0.3.3 manager: conda @@ -2382,7 +2344,7 @@ package: libstdcxx-ng: '>=12' libzlib: '>=1.2.13,<1.3.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - snappy: '>=1.1.10,<2.0a0' + snappy: '>=1.1.10,<1.2.0a0' zstd: '>=1.5.5,<1.6.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda hash: @@ -2414,7 +2376,7 @@ package: libcxx: '>=15.0.7' libzlib: '>=1.2.13,<1.3.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - snappy: '>=1.1.10,<2.0a0' + snappy: '>=1.1.10,<1.2.0a0' zstd: '>=1.5.5,<1.6.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.5-hc338f07_0.conda hash: @@ -2423,7 +2385,7 @@ package: category: main optional: false - name: bokeh - version: 3.4.0 + version: 3.4.1 manager: conda platform: linux-64 dependencies: @@ -2437,10 +2399,10 @@ package: pyyaml: '>=3.10' tornado: '>=6.2' xyzservices: '>=2021.09.1' - url: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.1-pyhd8ed1ab_0.conda hash: - md5: eebbbfdb7eb885ddc751c790c3d0ad64 - sha256: a980687100456202425af0936185ef95c53309044e271daa60d2eeb009410f73 + md5: 0f8e0831bbf38d83973438ce9af9af9a + sha256: 0289e61d7a30a693cf79d36484abd13f72ad785bd23cadc227c29dca89d95046 category: main optional: false - name: bokeh @@ -2465,7 +2427,7 @@ package: category: main optional: false - name: bokeh - version: 3.4.0 + version: 3.4.1 manager: conda platform: osx-arm64 dependencies: @@ -2479,10 +2441,10 @@ package: tornado: '>=6.2' xyzservices: '>=2021.09.1' contourpy: '>=1.2' - url: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.1-pyhd8ed1ab_0.conda hash: - md5: eebbbfdb7eb885ddc751c790c3d0ad64 - sha256: a980687100456202425af0936185ef95c53309044e271daa60d2eeb009410f73 + md5: 0f8e0831bbf38d83973438ce9af9af9a + sha256: 0289e61d7a30a693cf79d36484abd13f72ad785bd23cadc227c29dca89d95046 category: main optional: false - name: botocore @@ -3336,15 +3298,15 @@ package: category: main optional: false - name: cloudpickle - version: 2.2.1 + version: 3.0.0 manager: conda platform: linux-64 dependencies: - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda hash: - md5: b325bfc4cff7d7f8a868f1f7ecc4ed16 - sha256: f0c2fd0e842899a05ddd7b147fb26424adf58be0e8e54e5bc68b8f7e67d05dcd + md5: 753d29fe41bb881e4b9c004f0abf973f + sha256: 0dfbc1ffa72e7a0882f486c9b1e4e9cccb68cf5c576fe53a89d076c9f1d43754 category: main optional: false - name: cloudpickle @@ -3360,15 +3322,15 @@ package: category: main optional: false - name: cloudpickle - version: 2.2.1 + version: 3.0.0 manager: conda platform: osx-arm64 dependencies: - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda hash: - md5: b325bfc4cff7d7f8a868f1f7ecc4ed16 - sha256: f0c2fd0e842899a05ddd7b147fb26424adf58be0e8e54e5bc68b8f7e67d05dcd + md5: 753d29fe41bb881e4b9c004f0abf973f + sha256: 0dfbc1ffa72e7a0882f486c9b1e4e9cccb68cf5c576fe53a89d076c9f1d43754 category: main optional: false - name: codespell @@ -3521,18 +3483,6 @@ package: sha256: 10577f82bafd5d37f0c3f2122272d0dc1f2d133655c2bdd1a3cd5f910d0bd4c5 category: main optional: false -- name: configparser - version: 6.0.1 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/configparser-6.0.1-pyhd8ed1ab_0.conda - hash: - md5: 2a24e68637e51e2adf001e9d0af848b1 - sha256: e01107b458dd21f1915dcd9901f5ecc7d918a8157d9a9802020286ed83f9847e - category: main - optional: false - name: configparser version: 6.0.1 manager: conda @@ -3545,32 +3495,20 @@ package: sha256: e01107b458dd21f1915dcd9901f5ecc7d918a8157d9a9802020286ed83f9847e category: main optional: false -- name: configparser - version: 6.0.1 - manager: conda - platform: osx-arm64 - dependencies: - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/configparser-6.0.1-pyhd8ed1ab_0.conda - hash: - md5: 2a24e68637e51e2adf001e9d0af848b1 - sha256: e01107b458dd21f1915dcd9901f5ecc7d918a8157d9a9802020286ed83f9847e - category: main - optional: false - name: contourpy - version: 1.2.0 + version: 1.2.1 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - numpy: '>=1.20,<2' + numpy: '>=1.20' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda hash: - md5: ed71ad3e30eb03da363fb797419cce98 - sha256: 7a85421667d97132c5d23575da63c2da850775c81832607e56bfd881c9750f3a + md5: bdc188e59857d6efab332714e0d01d93 + sha256: 7799c6cd8425ac69b2495b2acf938d85e6776c0c9129de86d18ec55e53bcfefc category: main optional: false - name: contourpy @@ -3590,19 +3528,18 @@ package: category: main optional: false - name: contourpy - version: 1.2.0 + version: 1.2.1 manager: conda platform: osx-arm64 dependencies: - __osx: '>=10.9' - libcxx: '>=16.0.6' - numpy: '>=1.20,<2' + libcxx: '>=16' + numpy: '>=1.20' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.0-py39he9de807_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.1-py39h48c5dd5_0.conda hash: - md5: 1cf7d8ee627725a514622c863dd8821b - sha256: ac729314c46e04b455e0b1e08b2c223fe92c4f89e3e13c2ae42e1e349ad3958b + md5: 2c4998473ca34fa4df959bd90eb9247a + sha256: a0a42c5195a621ec86bb20b0f36e5406047bd655219cfab824ec20a2c6a0836d category: main optional: false - name: cookiecutter @@ -3754,43 +3691,46 @@ package: sha256: 4ce400c11245a79feb9fea93e8179379c48af6e755347f3c91181c5fd54423e9 category: main optional: false -- name: cuda-cudart - version: 12.4.99 +- name: cuda-version + version: '11.8' manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - cuda-cudart_linux-64: 12.4.99 - cuda-version: '>=12.4,<12.5.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.99-hd3aeb46_0.conda + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda hash: - md5: 4d229c1bd27b08f176d35dd2b6fa3e43 - sha256: a98f120b8578e9d5dc6997e49caca972147d22e69760c432ca24b1f16208e5b0 + md5: 670f0e1593b8c1d84f57ad5fe5256799 + sha256: 53e0ffc14ea2f2b8c12320fd2aa38b01112763eba851336ff5953b436ae61259 category: main optional: false -- name: cuda-cudart_linux-64 - version: 12.4.99 +- name: cudatoolkit + version: 11.8.0 manager: conda platform: linux-64 dependencies: - cuda-version: '>=12.4,<12.5.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.99-h59595ed_0.conda + __glibc: '>=2.17,<3.0.a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/cudatoolkit-11.8.0-h4ba93d1_13.conda hash: - md5: 2c184d2ca9f4e01b501103b42b895016 - sha256: dc8734b59e2765fdcf8c7765193af2fc5e8120ca1a47b9b2c13eb8789c20a781 + md5: eb43f5f1f16e2fad2eba22219c3e499b + sha256: 1797bacaf5350f272413c7f50787c01aef0e8eb955df0f0db144b10be2819752 category: main optional: false -- name: cuda-version - version: '12.4' +- name: cudnn + version: 8.9.7.29 manager: conda platform: linux-64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda + dependencies: + __glibc: '>=2.17,<3.0.a0' + cuda-version: '>=11.0,<12.0a0' + cudatoolkit: 11.* + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/cudnn-8.9.7.29-hbc23b4c_3.conda hash: - md5: c9a3fe8b957176e1a8452c6f3431b0d8 - sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da + md5: 4a2d5fab2871d95544de4e1752948d0f + sha256: c553234d447d9938556f067aba7a4686c8e5427e03e740e67199da3782cc420c category: main optional: false - name: cycler @@ -3873,15 +3813,15 @@ package: category: main optional: false - name: dask - version: 2024.3.1 + version: 2024.4.1 manager: conda platform: linux-64 dependencies: bokeh: '>=2.4.2,!=3.0.*' cytoolz: '>=0.11.0' - dask-core: '>=2024.3.1,<2024.3.2.0a0' + dask-core: '>=2024.4.1,<2024.4.2.0a0' dask-expr: '>=1.0,<1.1' - distributed: '>=2024.3.1,<2024.3.2.0a0' + distributed: '>=2024.4.1,<2024.4.2.0a0' jinja2: '>=2.10.3' lz4: '>=4.3.2' numpy: '>=1.21' @@ -3889,10 +3829,10 @@ package: pyarrow: '>=7.0' pyarrow-hotfix: '' python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.3.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.4.1-pyhd8ed1ab_0.conda hash: - md5: e3f23f17022881c62e75ddbab7a61f9e - sha256: ee6ba90fab615bd224d58e1c8f6d049e42a044dcd66ee465e516d85282d08336 + md5: 1afbed2c3ca32ee7c7acd9939460ddd3 + sha256: 5f6151fcb5e5395c3e2601e969645c5b8097db74381a3e41001dce846937ab7b category: main optional: false - name: dask @@ -3919,7 +3859,7 @@ package: category: main optional: false - name: dask - version: 2024.3.1 + version: 2024.4.1 manager: conda platform: osx-arm64 dependencies: @@ -3933,16 +3873,16 @@ package: cytoolz: '>=0.11.0' bokeh: '>=2.4.2,!=3.0.*' dask-expr: '>=1.0,<1.1' - dask-core: '>=2024.3.1,<2024.3.2.0a0' - distributed: '>=2024.3.1,<2024.3.2.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.3.1-pyhd8ed1ab_0.conda + dask-core: '>=2024.4.1,<2024.4.2.0a0' + distributed: '>=2024.4.1,<2024.4.2.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.4.1-pyhd8ed1ab_0.conda hash: - md5: e3f23f17022881c62e75ddbab7a61f9e - sha256: ee6ba90fab615bd224d58e1c8f6d049e42a044dcd66ee465e516d85282d08336 + md5: 1afbed2c3ca32ee7c7acd9939460ddd3 + sha256: 5f6151fcb5e5395c3e2601e969645c5b8097db74381a3e41001dce846937ab7b category: main optional: false - name: dask-core - version: 2024.3.1 + version: 2024.4.1 manager: conda platform: linux-64 dependencies: @@ -3955,10 +3895,10 @@ package: python: '>=3.9' pyyaml: '>=5.3.1' toolz: '>=0.10.0' - url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda hash: - md5: 52dd56ce3afa6a52c2f3d3116875ff32 - sha256: 396607b11601c89331d6934ded9f9765a9aa8485fee19ea8d466c631bee3ba61 + md5: 52387f00fee8dcd5cf75f8886025293f + sha256: b5df58b0b24da66acb21343a054e0f04edaf74c6aacf936422e2b000cd654457 category: main optional: false - name: dask-core @@ -3982,7 +3922,7 @@ package: category: main optional: false - name: dask-core - version: 2024.3.1 + version: 2024.4.1 manager: conda platform: osx-arm64 dependencies: @@ -3995,25 +3935,25 @@ package: click: '>=8.1' importlib_metadata: '>=4.13.0' fsspec: '>=2021.09.0' - url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda hash: - md5: 52dd56ce3afa6a52c2f3d3116875ff32 - sha256: 396607b11601c89331d6934ded9f9765a9aa8485fee19ea8d466c631bee3ba61 + md5: 52387f00fee8dcd5cf75f8886025293f + sha256: b5df58b0b24da66acb21343a054e0f04edaf74c6aacf936422e2b000cd654457 category: main optional: false - name: dask-expr - version: 1.0.5 + version: 1.0.11 manager: conda platform: linux-64 dependencies: - dask-core: 2024.3.1 + dask-core: 2024.4.1 pandas: '>=2' pyarrow: '' python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.11-pyhd8ed1ab_0.conda hash: - md5: d1e973e2e617f806194f4e664c2d3d33 - sha256: fb83d89b4303c620bc1d7ff968db15622548110d74f0d2d8f9cc5fd180830e61 + md5: 5c6bc104095ed12db6b1be04181e9afa + sha256: 193e176d808268a7eed7ea5c3f8f68ba3ab03cd9ff94cd5b2369d3d03fabe8cd category: main optional: false - name: dask-expr @@ -4032,38 +3972,18 @@ package: category: main optional: false - name: dask-expr - version: 1.0.5 + version: 1.0.11 manager: conda platform: osx-arm64 dependencies: pyarrow: '' python: '>=3.9' pandas: '>=2' - dask-core: 2024.3.1 - url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.5-pyhd8ed1ab_0.conda - hash: - md5: d1e973e2e617f806194f4e664c2d3d33 - sha256: fb83d89b4303c620bc1d7ff968db15622548110d74f0d2d8f9cc5fd180830e61 - category: main - optional: false -- name: databricks-cli - version: 0.18.0 - manager: conda - platform: linux-64 - dependencies: - click: '>=7.0' - configparser: '>=0.3.5' - oauthlib: '>=3.1.0' - pyjwt: '>=1.7.0' - python: '>=3.7' - requests: '>=2.17.3' - six: '>=1.10.0' - tabulate: '>=0.7.7' - urllib3: '>=1.26.7,<3' - url: https://conda.anaconda.org/conda-forge/noarch/databricks-cli-0.18.0-pyhd8ed1ab_0.conda + dask-core: 2024.4.1 + url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.11-pyhd8ed1ab_0.conda hash: - md5: 5036bba5b1dd105148a5bab9ff4b0620 - sha256: 6ac45a54c2d7e14195d413bbe372f4636d00bc6ce76ffc0c737fb9c7d80a32eb + md5: 5c6bc104095ed12db6b1be04181e9afa + sha256: 193e176d808268a7eed7ea5c3f8f68ba3ab03cd9ff94cd5b2369d3d03fabe8cd category: main optional: false - name: databricks-cli @@ -4086,26 +4006,6 @@ package: sha256: 6ac45a54c2d7e14195d413bbe372f4636d00bc6ce76ffc0c737fb9c7d80a32eb category: main optional: false -- name: databricks-cli - version: 0.18.0 - manager: conda - platform: osx-arm64 - dependencies: - python: '>=3.7' - click: '>=7.0' - six: '>=1.10.0' - pyjwt: '>=1.7.0' - tabulate: '>=0.7.7' - requests: '>=2.17.3' - configparser: '>=0.3.5' - oauthlib: '>=3.1.0' - urllib3: '>=1.26.7,<3' - url: https://conda.anaconda.org/conda-forge/noarch/databricks-cli-0.18.0-pyhd8ed1ab_0.conda - hash: - md5: 5036bba5b1dd105148a5bab9ff4b0620 - sha256: 6ac45a54c2d7e14195d413bbe372f4636d00bc6ce76ffc0c737fb9c7d80a32eb - category: main - optional: false - name: dataclasses-json version: 0.5.7 manager: conda @@ -4220,8 +4120,8 @@ package: pyyaml: '>=5.1' numpy: '>=1.17' pyarrow: '>=8.0.0' - requests: '>=2.19.0' python: '>=3.8.0' + requests: '>=2.19.0' tqdm: '>=4.62.1' fsspec: '>=2021.11.1' dill: '>=0.3.0,<0.3.8' @@ -4518,14 +4418,14 @@ package: category: main optional: false - name: distributed - version: 2024.3.1 + version: 2024.4.1 manager: conda platform: linux-64 dependencies: click: '>=8.0' cloudpickle: '>=1.5.0' cytoolz: '>=0.10.1' - dask-core: '>=2024.3.1,<2024.3.2.0a0' + dask-core: '>=2024.4.1,<2024.4.2.0a0' jinja2: '>=2.10.3' locket: '>=1.0.0' msgpack-python: '>=1.0.0' @@ -4539,10 +4439,10 @@ package: tornado: '>=6.0.4' urllib3: '>=1.24.3' zict: '>=3.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.4.1-pyhd8ed1ab_0.conda hash: - md5: b0ad5ef44595ef37c3008fc04ecd2abf - sha256: f587da3ff040968fecac7f424b88c5bc5fe16fe92fe08643fb5be8318d05c275 + md5: 822b8d8216764941bb099fea588127ad + sha256: 747ed8b12aff745c16ac415d17e0f76754fab992ea6ae68cf0c27f3fc2417b1f category: main optional: false - name: distributed @@ -4574,7 +4474,7 @@ package: category: main optional: false - name: distributed - version: 2024.3.1 + version: 2024.4.1 manager: conda platform: osx-arm64 dependencies: @@ -4594,11 +4494,11 @@ package: cytoolz: '>=0.10.1' psutil: '>=5.7.2' zict: '>=3.0.0' - dask-core: '>=2024.3.1,<2024.3.2.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda + dask-core: '>=2024.4.1,<2024.4.2.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.4.1-pyhd8ed1ab_0.conda hash: - md5: b0ad5ef44595ef37c3008fc04ecd2abf - sha256: f587da3ff040968fecac7f424b88c5bc5fe16fe92fe08643fb5be8318d05c275 + md5: 822b8d8216764941bb099fea588127ad + sha256: 747ed8b12aff745c16ac415d17e0f76754fab992ea6ae68cf0c27f3fc2417b1f category: main optional: false - name: distro @@ -4734,10 +4634,10 @@ package: dependencies: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py39hf3d152e_4.conda + url: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py39hf3d152e_5.conda hash: - md5: 0d71b15b6e77f2ae2ef81a478a384ead - sha256: 3205c831e88f49ae5bfea74f3d0b5924f51a7da8b4ad966fe1511ad7dd0be158 + md5: d74cf0b3351ffc48f1388424df827755 + sha256: fdf27fe364a38ef04d4c7b925bb767c1e4cb283f05645fba4a6f697f9adc269b category: main optional: false - name: docutils @@ -4760,10 +4660,10 @@ package: dependencies: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.17.1-py39h2804cbe_4.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.17.1-py39h2804cbe_5.conda hash: - md5: e61e7fb2f58fde42339a74370b55c1e9 - sha256: ca7a33d2f83d7760f384f565956d3a79663b33c94cf2753da20150f096dac0bc + md5: e686fb5afbd0f305e12773307094a635 + sha256: 5aff6d9caf2eec64598bdd7e066fa37642590938b9be3b57b7034bf426e60b46 category: main optional: false - name: entrypoints @@ -4955,15 +4855,15 @@ package: category: main optional: false - name: filelock - version: 3.13.3 + version: 3.13.4 manager: conda platform: linux-64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda hash: - md5: ff15f46b0d34308f4d40c1c51df07592 - sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 + md5: 6baa2e7fc09bd2c7c82cb6662d5f1d36 + sha256: 2eef860d5ad6ef1fac5002a3b75661f765d448e9f997f64482b0e51a097e037f category: main optional: false - name: filelock @@ -4979,15 +4879,15 @@ package: category: main optional: false - name: filelock - version: 3.13.3 + version: 3.13.4 manager: conda platform: osx-arm64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda hash: - md5: ff15f46b0d34308f4d40c1c51df07592 - sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 + md5: 6baa2e7fc09bd2c7c82cb6662d5f1d36 + sha256: 2eef860d5ad6ef1fac5002a3b75661f765d448e9f997f64482b0e51a097e037f category: main optional: false - name: fiona @@ -5067,7 +4967,7 @@ package: category: main optional: false - name: flask - version: 2.3.3 + version: 3.0.3 manager: conda platform: linux-64 dependencies: @@ -5077,11 +4977,11 @@ package: itsdangerous: '>=2.1.2' jinja2: '>=3.1.2' python: '>=3.8' - werkzeug: '>=2.3.7' - url: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda + werkzeug: '>=3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/flask-3.0.3-pyhd8ed1ab_0.conda hash: - md5: 9b0d29067484a8dfacfae85b8fba81bc - sha256: 4f84ffdc5471236e8225db86c7508426b46aa2c3802d58ca40b3c3e174533b39 + md5: dcdb937144fa20d7757bf512db1ea769 + sha256: 2fc508f656fe52cb2f9a69c9c62077934d6a81510256dbe85f95beb7d9620238 category: main optional: false - name: flask @@ -5103,7 +5003,7 @@ package: category: main optional: false - name: flask - version: 2.3.3 + version: 3.0.3 manager: conda platform: osx-arm64 dependencies: @@ -5113,11 +5013,11 @@ package: importlib-metadata: '>=3.6.0' itsdangerous: '>=2.1.2' blinker: '>=1.6.2' - werkzeug: '>=2.3.7' - url: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda + werkzeug: '>=3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/flask-3.0.3-pyhd8ed1ab_0.conda hash: - md5: 9b0d29067484a8dfacfae85b8fba81bc - sha256: 4f84ffdc5471236e8225db86c7508426b46aa2c3802d58ca40b3c3e174533b39 + md5: dcdb937144fa20d7757bf512db1ea769 + sha256: 2fc508f656fe52cb2f9a69c9c62077934d6a81510256dbe85f95beb7d9620238 category: main optional: false - name: flatbuffers @@ -5323,8 +5223,8 @@ package: python-json-logger: '>=2.0.0' cloudpickle: '>=2.0.0' fsspec: '>=2023.3.0' - cookiecutter: '>=1.7.3' gcsfs: '>=2023.3.0' + cookiecutter: '>=1.7.3' croniter: '>=0.3.20,<4.0.0' docstring_parser: '>=0.9.0' keyring: '>=18.0.1' @@ -5658,7 +5558,7 @@ package: category: main optional: false - name: fonttools - version: 4.50.0 + version: 4.51.0 manager: conda platform: linux-64 dependencies: @@ -5668,10 +5568,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* unicodedata2: '>=14.0.0' - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py39hd1e30aa_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py39hd1e30aa_0.conda hash: - md5: 8b689d531a6f99ef71212081c0126147 - sha256: 22a510a2cc44444668f995ce0c8a7ac9653a6442c7f45dc903fa598962066593 + md5: 79f5dd8778873faa54e8f7b2729fe8a6 + sha256: 28f93d872710b57ac952e82cd0da53ffda8ee54507cce60f3237f9df1dd0725a category: main optional: false - name: fonttools @@ -5691,7 +5591,7 @@ package: category: main optional: false - name: fonttools - version: 4.50.0 + version: 4.51.0 manager: conda platform: osx-arm64 dependencies: @@ -5700,10 +5600,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* unicodedata2: '>=14.0.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.50.0-py39h17cfd9d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.51.0-py39h17cfd9d_0.conda hash: - md5: 9cf95b92068842801c4237e7a799c330 - sha256: 2f40b1ae9cb965f7683dd69af3db71d9575d4b7363a74e230651a669f25d1abd + md5: 6596abf82afe59739e34c930e68f862a + sha256: bd20cea14440723d9dba287266fba0b31e96045d1e3d5d488fd4ad198cfd63bd category: main optional: false - name: fqdn @@ -5834,10 +5734,10 @@ package: platform: linux-64 dependencies: libgcc-ng: '>=7.5.0' - url: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h516909a_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 hash: - md5: bdc16c2b8852914fdbadb8e4d6361a8b - sha256: b619c1ec2c2b0951e23c683c6ca33de295183ee82f080e97eda68a7a7a955d85 + md5: ac7bc6a654f8f41b352b38f4051135f8 + sha256: 5d7b6c0ee7743ba41399e9e05a58ccc1cfc903942e49ff6f677f6e423ea7a627 category: main optional: false - name: fribidi @@ -5863,17 +5763,17 @@ package: category: main optional: false - name: frozendict - version: 2.4.0 + version: 2.4.2 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/frozendict-2.4.0-py39hd1e30aa_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/frozendict-2.4.2-py39hd1e30aa_0.conda hash: - md5: 52bd06467f60645e2cf293bd00f957cd - sha256: 40e9730732769b8ef0797f025f108d998d8d2d4edb0c709da9e6dd65475064a6 + md5: 5075fe926acc82c2854bf35a6e98e45f + sha256: 45cf4310519e3799afc09e892b1fe9e554b69158b1979f4f094a0d77b25d5fcb category: main optional: false - name: frozendict @@ -5890,16 +5790,16 @@ package: category: main optional: false - name: frozendict - version: 2.4.0 + version: 2.4.2 manager: conda platform: osx-arm64 dependencies: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/frozendict-2.4.0-py39h17cfd9d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/frozendict-2.4.2-py39h17cfd9d_0.conda hash: - md5: 30e673c8dfce564d6c2222ed0395ef8b - sha256: dc3079fb53f566c74661a03950d631950784fa18321c0efeb04037aeeb63ba15 + md5: 1b458f3b96972037d001c8c9070a2379 + sha256: 37e292844e993ea02b09d6b0789a674e8d303de3d9fb46d767d1da3e4705789c category: main optional: false - name: frozenlist @@ -6463,15 +6363,21 @@ package: category: main optional: false - name: gettext - version: 0.21.1 + version: 0.22.5 manager: conda platform: linux-64 dependencies: + gettext-tools: 0.22.5 + libasprintf: 0.22.5 + libasprintf-devel: 0.22.5 libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2 + libgettextpo: 0.22.5 + libgettextpo-devel: 0.22.5 + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda hash: - md5: 14947d8770185e5153fdd04d4673ed37 - sha256: 4fcfedc44e4c9a053f0416f9fc6ab6ed50644fca3a761126dbd00d09db1f546a + md5: 219ba82e95d7614cf7140d2a4afc0926 + sha256: 386181254ddd2aed1fccdfc217da5b6545f6df4e9979ad8e08f5e91e22eaf7dc category: main optional: false - name: gettext @@ -6487,15 +6393,48 @@ package: category: main optional: false - name: gettext - version: 0.21.1 + version: 0.22.5 + manager: conda + platform: osx-arm64 + dependencies: + gettext-tools: 0.22.5 + libasprintf: 0.22.5 + libasprintf-devel: 0.22.5 + libcxx: '>=16' + libgettextpo: 0.22.5 + libgettextpo-devel: 0.22.5 + libiconv: '>=1.17,<2.0a0' + libintl: 0.22.5 + libintl-devel: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.22.5-h8fbad5d_2.conda + hash: + md5: 404e2894e9cb2835246cef47317ff763 + sha256: 7188b466071698759b125aaed9b4d78940e72e6299b0c6dbad6f35c85cf3d27b + category: main + optional: false +- name: gettext-tools + version: 0.22.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda + hash: + md5: 985f2f453fb72408d6b6f1be0f324033 + sha256: 67d7b1d6fe4f1c516df2000640ec7dcfebf3ff6ea0785f0276870e730c403d33 + category: main + optional: false +- name: gettext-tools + version: 0.22.5 manager: conda platform: osx-arm64 dependencies: libiconv: '>=1.17,<2.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.21.1-h0186832_0.tar.bz2 + libintl: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-tools-0.22.5-h8fbad5d_2.conda hash: - md5: 63d2ff6fddfa74e5458488fd311bf635 - sha256: 093b2f96dc4b48e4952ab8946facec98b34b708a056251fc19c23c3aad30039e + md5: 31117a80d73f4fac856ab09fd9f3c6b5 + sha256: f60d1671e30ac60598396c11fcec4426f7ddb281bf9e37af2262016b4d812cce category: main optional: false - name: gflags @@ -6536,15 +6475,15 @@ package: category: main optional: false - name: giflib - version: 5.2.1 + version: 5.2.2 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda + url: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda hash: - md5: 96f3b11872ef6fad973eac856cd2624f - sha256: 41ec165704ccce2faa0437f4f53c03c06261a2cc9ff7614828e51427d9261f4b + md5: 3bf7b9fd5a7136126e0234db4b87c8b6 + sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff category: main optional: false - name: giflib @@ -6559,14 +6498,14 @@ package: category: main optional: false - name: giflib - version: 5.2.1 + version: 5.2.2 manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.1-h1a8c8d9_3.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda hash: - md5: f39a05d3dbb0e5024b7deabb2c0993f1 - sha256: dbf1e431d3e5e03f8eeb77ec08a4c5d6d5d9af84dbef13d4365e397dd389beb8 + md5: 95fa1486c77505330c20f7202492b913 + sha256: 843b3f364ff844137e37d5c0a181f11f6d51adcedd216f019d074e5aa5d7e09c category: main optional: false - name: gitdb @@ -6609,17 +6548,17 @@ package: category: main optional: false - name: gitpython - version: 3.1.42 + version: 3.1.43 manager: conda platform: linux-64 dependencies: gitdb: '>=4.0.1,<5' python: '>=3.7' typing_extensions: '>=3.7.4.3' - url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.42-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda hash: - md5: 6bc8e496351bafd761c0922c3ebd989a - sha256: a11e1cf4404157467d0f51906d1db80bcb8bfe4bb3d3eba703b28e981ea7e308 + md5: 0b2154c1818111e17381b1df5b4b0176 + sha256: cbb2802641a009ce9bcc2a047e817fd8816f9c842036a42f4730398d8e4cda2a category: main optional: false - name: gitpython @@ -6637,35 +6576,17 @@ package: category: main optional: false - name: gitpython - version: 3.1.42 + version: 3.1.43 manager: conda platform: osx-arm64 dependencies: python: '>=3.7' typing_extensions: '>=3.7.4.3' gitdb: '>=4.0.1,<5' - url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.42-pyhd8ed1ab_0.conda - hash: - md5: 6bc8e496351bafd761c0922c3ebd989a - sha256: a11e1cf4404157467d0f51906d1db80bcb8bfe4bb3d3eba703b28e981ea7e308 - category: main - optional: false -- name: glib - version: 2.78.4 - manager: conda - platform: linux-64 - dependencies: - gettext: '>=0.21.1,<1.0a0' - glib-tools: 2.78.4 - libgcc-ng: '>=12' - libglib: 2.78.4 - libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' - python: '*' - url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.78.4-hfc55251_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda hash: - md5: f36a7b2420c3fc3c48a3d609841d8fee - sha256: 316c95dcbde46b7418d2b667a7e0c1d05101b673cd8c691d78d8699600a07a5b + md5: 0b2154c1818111e17381b1df5b4b0176 + sha256: cbb2802641a009ce9bcc2a047e817fd8816f9c842036a42f4730398d8e4cda2a category: main optional: false - name: glib @@ -6685,21 +6606,6 @@ package: sha256: 546775c50a28dcbe22b784d6cc4e8ba3774aac59517858529742657b0563c326 category: main optional: false -- name: glib-tools - version: 2.78.4 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libglib: 2.78.4 - libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.78.4-hfc55251_0.conda - hash: - md5: d184ba1bf15a2bbb3be6118c90fd487d - sha256: e94494b895f77ba54922ffb1dcfb7f1a987591b823eb5ce608afb2e2391d7d82 - category: main - optional: false - name: glib-tools version: 2.78.4 manager: conda @@ -7039,13 +6945,13 @@ package: category: main optional: false - name: google-cloud-bigquery - version: 3.19.0 + version: 3.20.1 manager: conda platform: linux-64 dependencies: db-dtypes: '>=0.3.0,<2.0.0dev' geopandas: '>=0.9.0,<1.0dev' - google-cloud-bigquery-core: 3.19.0 + google-cloud-bigquery-core: 3.20.1 google-cloud-bigquery-storage: '>=2.6.0,<3.0.0dev' grpcio: '>=1.49.1,<2.0dev' ipykernel: '>=6.0.0' @@ -7058,10 +6964,10 @@ package: python: '>=3.8' shapely: '>=1.8.4,<3.0.0dev' tqdm: '>=4.7.4,<=5.0.0dev' - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.19.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.20.1-pyhd8ed1ab_0.conda hash: - md5: dd4a8cca66b72bee53373e2926f1d39c - sha256: a134a103b50285e521eeaa5bffd6b0b7efb69e6ab2e15f46354105e0d6ede412 + md5: e03a302b71d298055170d60f808b2c0b + sha256: 7d178c4926ed083f3d1e042be1d007cfa530eaceea1bd71266afd6697664f049 category: main optional: false - name: google-cloud-bigquery @@ -7091,7 +6997,7 @@ package: category: main optional: false - name: google-cloud-bigquery - version: 3.19.0 + version: 3.20.1 manager: conda platform: osx-arm64 dependencies: @@ -7109,15 +7015,15 @@ package: ipython: '>=7.23.1,!=8.1.0' google-cloud-bigquery-storage: '>=2.6.0,<3.0.0dev' shapely: '>=1.8.4,<3.0.0dev' - google-cloud-bigquery-core: 3.19.0 - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.19.0-pyhd8ed1ab_0.conda + google-cloud-bigquery-core: 3.20.1 + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.20.1-pyhd8ed1ab_0.conda hash: - md5: dd4a8cca66b72bee53373e2926f1d39c - sha256: a134a103b50285e521eeaa5bffd6b0b7efb69e6ab2e15f46354105e0d6ede412 + md5: e03a302b71d298055170d60f808b2c0b + sha256: 7d178c4926ed083f3d1e042be1d007cfa530eaceea1bd71266afd6697664f049 category: main optional: false - name: google-cloud-bigquery-core - version: 3.19.0 + version: 3.20.1 manager: conda platform: linux-64 dependencies: @@ -7129,10 +7035,10 @@ package: python: '>=3.8' python-dateutil: '>=2.7.2,<3.0dev' requests: '>=2.21.0,<3.0.0dev' - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.19.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.20.1-pyhd8ed1ab_0.conda hash: - md5: e9a57c9845bcbaf6df5cb006b399d690 - sha256: 910415a2a06c29585957638f83837c6f5fb7b901de27eebbebff1cceecbdd682 + md5: 91ebaa76bc54f9bb30f72a9f166b00a6 + sha256: 404f571f8b66d0f4f644a00719306adca8e92b28fe017bb378379ab470318323 category: main optional: false - name: google-cloud-bigquery-core @@ -7155,7 +7061,7 @@ package: category: main optional: false - name: google-cloud-bigquery-core - version: 3.19.0 + version: 3.20.1 manager: conda platform: osx-arm64 dependencies: @@ -7167,10 +7073,10 @@ package: requests: '>=2.21.0,<3.0.0dev' google-cloud-core: '>=1.6.0,<3.0.0dev' google-api-core-grpc: '>=1.34.1,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.19.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.20.1-pyhd8ed1ab_0.conda hash: - md5: e9a57c9845bcbaf6df5cb006b399d690 - sha256: 910415a2a06c29585957638f83837c6f5fb7b901de27eebbebff1cceecbdd682 + md5: 91ebaa76bc54f9bb30f72a9f166b00a6 + sha256: 404f571f8b66d0f4f644a00719306adca8e92b28fe017bb378379ab470318323 category: main optional: false - name: google-cloud-bigquery-storage @@ -7531,6 +7437,36 @@ package: sha256: 41d3eea46623836e2be7234bdbfc0e7a42fc0853229c687cea6d7b652bb4a4fa category: main optional: false +- name: graphene + version: '3.3' + manager: conda + platform: linux-64 + dependencies: + aniso8601: '>=8,<10' + graphql-core: '>=3.1,<3.3' + graphql-relay: '>=3.1,<3.3' + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/graphene-3.3-pyhd8ed1ab_0.conda + hash: + md5: ed2ae94977dfd96566e6eaf373216728 + sha256: 8b4e2c1d326849c0094f9e96a9833addb10f638be67bb0590836720879697ec6 + category: main + optional: false +- name: graphene + version: '3.3' + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.6' + aniso8601: '>=8,<10' + graphql-core: '>=3.1,<3.3' + graphql-relay: '>=3.1,<3.3' + url: https://conda.anaconda.org/conda-forge/noarch/graphene-3.3-pyhd8ed1ab_0.conda + hash: + md5: ed2ae94977dfd96566e6eaf373216728 + sha256: 8b4e2c1d326849c0094f9e96a9833addb10f638be67bb0590836720879697ec6 + category: main + optional: false - name: graphite2 version: 1.3.13 manager: conda @@ -7568,6 +7504,60 @@ package: sha256: 2eadafbfc52f5e7df3da3c3b7e5bbe34d970bea1d645ffe60b0b1c3a216657f5 category: main optional: false +- name: graphql-core + version: 3.2.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + typing_extensions: '>=4,<5' + url: https://conda.anaconda.org/conda-forge/noarch/graphql-core-3.2.3-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 87cafe8c7638a5ac6fd8ec8fb01f1508 + sha256: 6f7da913ecad98951cadfe512af2c3979fbff752bf714da66760701e5463dd29 + category: main + optional: false +- name: graphql-core + version: 3.2.3 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.6' + typing_extensions: '>=4,<5' + url: https://conda.anaconda.org/conda-forge/noarch/graphql-core-3.2.3-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 87cafe8c7638a5ac6fd8ec8fb01f1508 + sha256: 6f7da913ecad98951cadfe512af2c3979fbff752bf714da66760701e5463dd29 + category: main + optional: false +- name: graphql-relay + version: 3.2.0 + manager: conda + platform: linux-64 + dependencies: + graphql-core: '>=3.2,<3.3' + python: '>=3.6' + typing_extensions: '>=4.1,<5' + url: https://conda.anaconda.org/conda-forge/noarch/graphql-relay-3.2.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 1b2b83e3528f8fb83007161eff51073d + sha256: 04f2a3383e74421441e46eaed4c32940682c1de82036fd1b6f18663d6d5447c4 + category: main + optional: false +- name: graphql-relay + version: 3.2.0 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.6' + graphql-core: '>=3.2,<3.3' + typing_extensions: '>=4.1,<5' + url: https://conda.anaconda.org/conda-forge/noarch/graphql-relay-3.2.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 1b2b83e3528f8fb83007161eff51073d + sha256: 04f2a3383e74421441e46eaed4c32940682c1de82036fd1b6f18663d6d5447c4 + category: main + optional: false - name: graphviz version: 9.0.0 manager: conda @@ -7738,8 +7728,8 @@ package: ipywidgets: '>=7.5.1' colorama: '>=0.4.3' jsonschema: '>=2.5.1' - tqdm: '>=4.59.0' scipy: '>=1.6.0' + tqdm: '>=4.59.0' tzlocal: '>=1.2' jsonpatch: '>=1.22' mistune: '>=0.8.4' @@ -7845,16 +7835,15 @@ package: manager: conda platform: osx-arm64 dependencies: - __osx: '>=10.9' - libcxx: '>=16.0.6' + libcxx: '>=16' libgrpc: 1.59.3 libzlib: '>=1.2.13,<1.3.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.59.3-py39h52f163a_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.59.3-py39h047a24b_0.conda hash: - md5: 65c1499ad010b38f0acab66e753f43b8 - sha256: 9939546b8eaf9a5666b31f872e6d70950139b108a557f3a1a3f14f0548af1fb3 + md5: 1afaf768107e5ab3284afb7d64d4a99c + sha256: 9f508baa6330ecf5a4a8129049e25ae40b2e534979a52995a6df08d8b65b7651 category: main optional: false - name: grpcio-status @@ -7902,35 +7891,6 @@ package: sha256: 45c00a3feaf80f29cbc4b2f6a7ef73b08ce4e4a847b32a82eed443c7dd95d0c9 category: main optional: false -- name: gst-plugins-base - version: 1.22.9 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - alsa-lib: '>=1.2.10,<1.3.0.0a0' - gettext: '>=0.21.1,<1.0a0' - gstreamer: 1.22.9 - libexpat: '>=2.5.0,<3.0a0' - libgcc-ng: '>=12' - libglib: '>=2.78.3,<3.0a0' - libogg: '>=1.3.4,<1.4.0a0' - libopus: '>=1.3.1,<2.0a0' - libpng: '>=1.6.39,<1.7.0a0' - libstdcxx-ng: '>=12' - libvorbis: '>=1.3.7,<1.4.0a0' - libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<1.3.0a0' - xorg-libx11: '>=1.8.7,<2.0a0' - xorg-libxau: '>=1.0.11,<2.0a0' - xorg-libxext: '>=1.3.4,<2.0a0' - xorg-libxrender: '>=0.9.11,<0.10.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda - hash: - md5: 614b81f8ed66c56b640faee7076ad14a - sha256: a4312c96a670fdbf9ff0c3efd935e42fa4b655ff33dcc52c309b76a2afaf03f0 - category: main - optional: false - name: gst-plugins-base version: 1.22.9 manager: conda @@ -7951,24 +7911,6 @@ package: sha256: c633c837b6e24da03129144ac1ab5940f43035a639b39bb2a1b086ea2f025e8f category: main optional: false -- name: gstreamer - version: 1.22.9 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - gettext: '>=0.21.1,<1.0a0' - glib: '>=2.78.3,<3.0a0' - libgcc-ng: '>=12' - libglib: '>=2.78.3,<3.0a0' - libiconv: '>=1.17,<2.0a0' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_0.conda - hash: - md5: bcc7157b06fce7f5e055402a8135dfd8 - sha256: aa2395bf1790f72d2706bac77430f765ec1318ca22e60e791c13ae452c045263 - category: main - optional: false - name: gstreamer version: 1.22.9 manager: conda @@ -8174,12 +8116,11 @@ package: dependencies: hpack: '>=4.0,<5' hyperframe: '>=6.0,<7' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/h2-4.1.0-py39hf3d152e_0.tar.bz2 + python: '>=3.6.1' + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 hash: - md5: 4d6e35bbcba4f0c06f02a285f5602333 - sha256: f2aaa56f152e889f2f9d7db78f4b0534dce91c8de3e2a5b2627fbfcb01b14054 + md5: b748fbf7060927a6e82df7cb5ee8f097 + sha256: bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a category: main optional: false - name: h2 @@ -8212,7 +8153,7 @@ package: category: main optional: false - name: h5py - version: 3.10.0 + version: 3.11.0 manager: conda platform: linux-64 dependencies: @@ -8222,10 +8163,10 @@ package: numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.10.0-nompi_py39h2c511df_101.conda + url: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.11.0-nompi_py39h2c511df_100.conda hash: - md5: f4e131bcc793c2746beca216d13db900 - sha256: eb19a7f87d770612ab0267427d2f0ac07a0d5584d9e4d539019e7e934a2a3278 + md5: f62a80dd25076dbb95f7af9b3de91eb8 + sha256: dcddb2a0d5df92e5173fba2bd4f0fd7bf5a218b062d57d91df252674699d0a18 category: main optional: false - name: h5py @@ -8245,7 +8186,7 @@ package: category: main optional: false - name: h5py - version: 3.10.0 + version: 3.11.0 manager: conda platform: osx-arm64 dependencies: @@ -8254,10 +8195,10 @@ package: numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.10.0-nompi_py39hd62a535_101.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.11.0-nompi_py39hd62a535_100.conda hash: - md5: 31ac39821305a7f9344b2dfcc8b06ddd - sha256: 7a72228a0ce34a0416c7738d152a51c9fe5fcdfb9f9b8374986ce5b1e493fb1e + md5: d24cc4712dd5b8750ebde887ba2cd91e + sha256: b1406d569c6b10b2b84766d07c54b8ed7746d1eb519915affc6802f7dbecec46 category: main optional: false - name: harfbuzz @@ -8553,7 +8494,7 @@ package: category: main optional: false - name: huggingface_hub - version: 0.22.1 + version: 0.22.2 manager: conda platform: linux-64 dependencies: @@ -8565,10 +8506,10 @@ package: requests: '' tqdm: '>=4.42.1' typing-extensions: '>=3.7.4.3' - url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.22.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.22.2-pyhd8ed1ab_0.conda hash: - md5: b9f58e10a6247f5ca5d70a6040f62943 - sha256: 2b6e1276089d2563b047497ecc1ce9d4a502594852c46886f881a4129d1993ce + md5: f1b1b143f30f5ec0f6fc66c2c6e825fe + sha256: 58f574977fd2e35e9c946c4341627edcf4622fef40d5cd5924211070425335dc category: main optional: false - name: huggingface_hub @@ -8591,7 +8532,7 @@ package: category: main optional: false - name: huggingface_hub - version: 0.22.1 + version: 0.22.2 manager: conda platform: osx-arm64 dependencies: @@ -8603,10 +8544,10 @@ package: typing-extensions: '>=3.7.4.3' fsspec: '>=2023.5.0' tqdm: '>=4.42.1' - url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.22.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.22.2-pyhd8ed1ab_0.conda hash: - md5: b9f58e10a6247f5ca5d70a6040f62943 - sha256: 2b6e1276089d2563b047497ecc1ce9d4a502594852c46886f881a4129d1993ce + md5: f1b1b143f30f5ec0f6fc66c2c6e825fe + sha256: 58f574977fd2e35e9c946c4341627edcf4622fef40d5cd5924211070425335dc category: main optional: false - name: hyperframe @@ -8720,15 +8661,15 @@ package: category: main optional: false - name: idna - version: '3.6' + version: '3.7' manager: conda platform: linux-64 dependencies: python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda hash: - md5: 1a76f09108576397c41c0b0c5bd84134 - sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 + md5: c0cc1420498b17414d8617d0b9f506ca + sha256: 9687ee909ed46169395d4f99a0ee94b80a52f87bed69cd454bb6d37ffeb0ec7b category: main optional: false - name: idna @@ -8744,15 +8685,15 @@ package: category: main optional: false - name: idna - version: '3.6' + version: '3.7' manager: conda platform: osx-arm64 dependencies: python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda hash: - md5: 1a76f09108576397c41c0b0c5bd84134 - sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 + md5: c0cc1420498b17414d8617d0b9f506ca + sha256: 9687ee909ed46169395d4f99a0ee94b80a52f87bed69cd454bb6d37ffeb0ec7b category: main optional: false - name: imagesize @@ -8792,16 +8733,16 @@ package: category: main optional: false - name: importlib-metadata - version: 6.10.0 + version: 7.1.0 manager: conda platform: linux-64 dependencies: python: '>=3.8' zipp: '>=0.5' - url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda hash: - md5: ae2ad334f34040e147cc5824b450463b - sha256: 4b823af311e7f5093fca41ec0142d0e1ec9b3d1ee91924dc63133611bdfcaee5 + md5: 0896606848b2dc5cebdf111b6543aa04 + sha256: cc2e7d1f7f01cede30feafc1118b7aefa244d0a12224513734e24165ae12ba49 category: main optional: false - name: importlib-metadata @@ -8818,16 +8759,16 @@ package: category: main optional: false - name: importlib-metadata - version: 6.10.0 + version: 7.1.0 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' zipp: '>=0.5' - url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda hash: - md5: ae2ad334f34040e147cc5824b450463b - sha256: 4b823af311e7f5093fca41ec0142d0e1ec9b3d1ee91924dc63133611bdfcaee5 + md5: 0896606848b2dc5cebdf111b6543aa04 + sha256: cc2e7d1f7f01cede30feafc1118b7aefa244d0a12224513734e24165ae12ba49 category: main optional: false - name: importlib-resources @@ -8870,15 +8811,15 @@ package: category: main optional: false - name: importlib_metadata - version: 6.10.0 + version: 7.1.0 manager: conda platform: linux-64 dependencies: - importlib-metadata: '>=6.10.0,<6.10.1.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.10.0-hd8ed1ab_0.conda + importlib-metadata: '>=7.1.0,<7.1.1.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda hash: - md5: c063ddbb9908499fd4f20b31dc67065a - sha256: a3688dc4fb2ed84e4f11738375eee542800ca0bcb343cf5993f4e3e092dcc6bf + md5: 6ef2b72d291b39e479d7694efa2b2b98 + sha256: 01dc057a45dedcc742a71599f67c7383ae2bf873be6018ebcbd06ac8d994dedb category: main optional: false - name: importlib_metadata @@ -8894,15 +8835,15 @@ package: category: main optional: false - name: importlib_metadata - version: 6.10.0 + version: 7.1.0 manager: conda platform: osx-arm64 dependencies: - importlib-metadata: '>=6.10.0,<6.10.1.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.10.0-hd8ed1ab_0.conda + importlib-metadata: '>=7.1.0,<7.1.1.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda hash: - md5: c063ddbb9908499fd4f20b31dc67065a - sha256: a3688dc4fb2ed84e4f11738375eee542800ca0bcb343cf5993f4e3e092dcc6bf + md5: 6ef2b72d291b39e479d7694efa2b2b98 + sha256: 01dc057a45dedcc742a71599f67c7383ae2bf873be6018ebcbd06ac8d994dedb category: main optional: false - name: importlib_resources @@ -9223,15 +9164,15 @@ package: category: main optional: false - name: itsdangerous - version: 2.1.2 + version: 2.2.0 manager: conda platform: linux-64 dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2 + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda hash: - md5: 3c3de74912f11d2b590184f03c7cd09b - sha256: 31e3492686b4e92b53db9b48bc0eb03873b1caaf28629fee7d2d47627a2c56d3 + md5: ff7ca04134ee8dde1d7cf491a78ef7c7 + sha256: 4e933e36e9b0401b62ea8fd63393827ebeb4250de77a56687afb387d504523c5 category: main optional: false - name: itsdangerous @@ -9247,28 +9188,28 @@ package: category: main optional: false - name: itsdangerous - version: 2.1.2 + version: 2.2.0 manager: conda platform: osx-arm64 dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2 + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda hash: - md5: 3c3de74912f11d2b590184f03c7cd09b - sha256: 31e3492686b4e92b53db9b48bc0eb03873b1caaf28629fee7d2d47627a2c56d3 + md5: ff7ca04134ee8dde1d7cf491a78ef7c7 + sha256: 4e933e36e9b0401b62ea8fd63393827ebeb4250de77a56687afb387d504523c5 category: main optional: false - name: jaraco.classes - version: 3.3.1 + version: 3.4.0 manager: conda platform: linux-64 dependencies: more-itertools: '' python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.3.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_0.conda hash: - md5: c541ae264c9f1f21d83fc30dffb908ee - sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + md5: 5271aed7436e2145d405a53ba05610aa + sha256: c44030b080f33299ec5eb5d47d1be30277cd55859701d67b1b6e4e38f4b5bf06 category: main optional: false - name: jaraco.classes @@ -9285,16 +9226,16 @@ package: category: main optional: false - name: jaraco.classes - version: 3.3.1 + version: 3.4.0 manager: conda platform: osx-arm64 dependencies: more-itertools: '' python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.3.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_0.conda hash: - md5: c541ae264c9f1f21d83fc30dffb908ee - sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + md5: 5271aed7436e2145d405a53ba05610aa + sha256: c44030b080f33299ec5eb5d47d1be30277cd55859701d67b1b6e4e38f4b5bf06 category: main optional: false - name: jaraco.context @@ -9499,16 +9440,16 @@ package: category: main optional: false - name: joblib - version: 1.3.2 + version: 1.4.0 manager: conda platform: linux-64 dependencies: - python: '>=3.7' + python: '>=3.8' setuptools: '' - url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda hash: - md5: 4da50d410f553db77e62ab62ffaa1abc - sha256: 31e05d47970d956206188480b038829d24ac11fe8216409d8584d93d40233878 + md5: e0ed1bf13ce3a440e022157bf4764465 + sha256: 56eea2c4af35a9c8f9cdca530f6aea0dc8e2551bfcc8b8da37da78221366af10 category: main optional: false - name: joblib @@ -9525,16 +9466,16 @@ package: category: main optional: false - name: joblib - version: 1.3.2 + version: 1.4.0 manager: conda platform: osx-arm64 dependencies: setuptools: '' - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda hash: - md5: 4da50d410f553db77e62ab62ffaa1abc - sha256: 31e05d47970d956206188480b038829d24ac11fe8216409d8584d93d40233878 + md5: e0ed1bf13ce3a440e022157bf4764465 + sha256: 56eea2c4af35a9c8f9cdca530f6aea0dc8e2551bfcc8b8da37da78221366af10 category: main optional: false - name: json-c @@ -9572,15 +9513,15 @@ package: category: main optional: false - name: json5 - version: 0.9.24 + version: 0.9.25 manager: conda platform: linux-64 dependencies: python: '>=3.7,<4.0' - url: https://conda.anaconda.org/conda-forge/noarch/json5-0.9.24-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda hash: - md5: fc9780a517b51ea3798fc011c17ffd51 - sha256: 148a427d4867ecd367b2bb9c2ef11ae7795abeabc8454f802f28ff692b3ce1aa + md5: 5d8c241a9261e720a34a07a3e1ac4109 + sha256: 0c75e428970e8bb72ba1dd3a6dc32b8d68f6534b4fe16b38e53364963fdc8e38 category: main optional: false - name: json5 @@ -9596,15 +9537,15 @@ package: category: main optional: false - name: json5 - version: 0.9.24 + version: 0.9.25 manager: conda platform: osx-arm64 dependencies: python: '>=3.7,<4.0' - url: https://conda.anaconda.org/conda-forge/noarch/json5-0.9.24-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda hash: - md5: fc9780a517b51ea3798fc011c17ffd51 - sha256: 148a427d4867ecd367b2bb9c2ef11ae7795abeabc8454f802f28ff692b3ce1aa + md5: 5d8c241a9261e720a34a07a3e1ac4109 + sha256: 0c75e428970e8bb72ba1dd3a6dc32b8d68f6534b4fe16b38e53364963fdc8e38 category: main optional: false - name: jsonpatch @@ -9647,16 +9588,16 @@ package: category: main optional: false - name: jsonpickle - version: 3.0.2 + version: 3.0.4 manager: conda platform: linux-64 dependencies: importlib_metadata: '' python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.2-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.4-pyhd8ed1ab_0.conda hash: - md5: f351864256e291b24b5a3bedda184bff - sha256: c947f2a64e4f06c722973894afb8e26df3aa2212e2e742def3506ccbad42141b + md5: 955b8830bcceeac96d54911667e4f508 + sha256: b8325954c07d4740d4e914ffa231d8dd98a79a0cc11f50f4b7016ab9cd4c4f5b category: main optional: false - name: jsonpickle @@ -9673,16 +9614,16 @@ package: category: main optional: false - name: jsonpickle - version: 3.0.2 + version: 3.0.4 manager: conda platform: osx-arm64 dependencies: importlib_metadata: '' python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.2-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.4-pyhd8ed1ab_0.conda hash: - md5: f351864256e291b24b5a3bedda184bff - sha256: c947f2a64e4f06c722973894afb8e26df3aa2212e2e742def3506ccbad42141b + md5: 955b8830bcceeac96d54911667e4f508 + sha256: b8325954c07d4740d4e914ffa231d8dd98a79a0cc11f50f4b7016ab9cd4c4f5b category: main optional: false - name: jsonpointer @@ -9893,13 +9834,12 @@ package: jupyter_console: '' nbconvert: '' notebook: '' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - qtconsole: '' - url: https://conda.anaconda.org/conda-forge/linux-64/jupyter-1.0.0-py39hf3d152e_9.conda + python: '>=3.6' + qtconsole-base: '' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.0.0-pyhd8ed1ab_10.conda hash: - md5: b99828f9a77b6106a72b541427a90957 - sha256: c309d7ab20b44dd123fd40fb5cf717f386404912521e3b586c96ce018109d054 + md5: 056b8cc3d9b03f54fc49e6d70d7dc359 + sha256: 308b521b149e7a1739f717538b929bc2d87b9001b94f13ee8baa939632a86150 category: main optional: false - name: jupyter @@ -9926,17 +9866,17 @@ package: manager: conda platform: osx-arm64 dependencies: - ipykernel: '' ipywidgets: '' - jupyter_console: '' - nbconvert: '' notebook: '' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/jupyter-1.0.0-py39h2804cbe_9.conda + ipykernel: '' + nbconvert: '' + qtconsole-base: '' + jupyter_console: '' + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.0.0-pyhd8ed1ab_10.conda hash: - md5: 9052c4ca944cccc46d58958ec3affe02 - sha256: 370057a9b78f48cc4df52f82e62eb285b74e41784c1d267057a74ef8ae1c99f3 + md5: 056b8cc3d9b03f54fc49e6d70d7dc359 + sha256: 308b521b149e7a1739f717538b929bc2d87b9001b94f13ee8baa939632a86150 category: main optional: false - name: jupyter-cache @@ -10000,17 +9940,17 @@ package: category: main optional: false - name: jupyter-lsp - version: 2.2.4 + version: 2.2.5 manager: conda platform: linux-64 dependencies: importlib-metadata: '>=4.8.3' jupyter_server: '>=1.1.2' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda hash: - md5: 91f93e1ebf6535be518715432d89fd92 - sha256: 8000b1904a2a10cf039b46305781128e1a93da4c2fd857445b4924ecf3535bdb + md5: 885867f6adab3d7ecdf8ab6ca0785f51 + sha256: 2151c2c63e0442a4c69ee0ad8a634195eedab10b7b74c0ec8266471842239a93 category: main optional: false - name: jupyter-lsp @@ -10028,17 +9968,17 @@ package: category: main optional: false - name: jupyter-lsp - version: 2.2.4 + version: 2.2.5 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' importlib-metadata: '>=4.8.3' jupyter_server: '>=1.1.2' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda hash: - md5: 91f93e1ebf6535be518715432d89fd92 - sha256: 8000b1904a2a10cf039b46305781128e1a93da4c2fd857445b4924ecf3535bdb + md5: 885867f6adab3d7ecdf8ab6ca0785f51 + sha256: 2151c2c63e0442a4c69ee0ad8a634195eedab10b7b74c0ec8266471842239a93 category: main optional: false - name: jupyter_client @@ -10258,7 +10198,7 @@ package: category: main optional: false - name: jupyter_server - version: 2.13.0 + version: 2.14.0 manager: conda platform: linux-64 dependencies: @@ -10281,10 +10221,10 @@ package: tornado: '>=6.2.0' traitlets: '>=5.6.0' websocket-client: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.13.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.0-pyhd8ed1ab_0.conda hash: - md5: e242df505f194c4932fbb840a99207e2 - sha256: 7e3259506b1b8500ebac4b4b097629ca8c32ee70d1c1df122052fea65c7cbae0 + md5: b82b9798563dea0cd8e4e3074227f04c + sha256: 719be928812cd582713f96d0681a91890cf9d0e5fcb9d2e4ef4b09fc3ab4df4c category: main optional: false - name: jupyter_server @@ -10318,7 +10258,7 @@ package: category: main optional: false - name: jupyter_server - version: 2.13.0 + version: 2.14.0 manager: conda platform: osx-arm64 dependencies: @@ -10341,10 +10281,10 @@ package: anyio: '>=3.1.0' send2trash: '>=1.8.2' jupyter_events: '>=0.9.0' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.13.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.0-pyhd8ed1ab_0.conda hash: - md5: e242df505f194c4932fbb840a99207e2 - sha256: 7e3259506b1b8500ebac4b4b097629ca8c32ee70d1c1df122052fea65c7cbae0 + md5: b82b9798563dea0cd8e4e3074227f04c + sha256: 719be928812cd582713f96d0681a91890cf9d0e5fcb9d2e4ef4b09fc3ab4df4c category: main optional: false - name: jupyter_server_terminals @@ -10387,7 +10327,7 @@ package: category: main optional: false - name: jupyterlab - version: 4.1.5 + version: 4.1.6 manager: conda platform: linux-64 dependencies: @@ -10395,7 +10335,7 @@ package: httpx: '>=0.25.0' importlib_metadata: '>=4.8.3' importlib_resources: '>=1.4' - ipykernel: '' + ipykernel: '>=6.5.0' jinja2: '>=3.0.3' jupyter-lsp: '>=2.0.0' jupyter_core: '' @@ -10404,13 +10344,13 @@ package: notebook-shim: '>=0.2' packaging: '' python: '>=3.8' - tomli: '' + tomli: '>=1.2.2' tornado: '>=6.2.0' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.1.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.1.6-pyhd8ed1ab_0.conda hash: - md5: 04b1ca9d7ac414b3f5c3fb16066c6861 - sha256: b098b79ef34d5c6a9ef7fc482bd2373072820006757ed7db33328af88fb91496 + md5: 8b0a6b8edbaef9796d2b925c63441b8e + sha256: fe935cccc5766b0212ce66fdb91db7068d89c88a1b916f067b16b86fb352d7a5 category: main optional: false - name: jupyterlab @@ -10441,18 +10381,17 @@ package: category: main optional: false - name: jupyterlab - version: 4.1.5 + version: 4.1.6 manager: conda platform: osx-arm64 dependencies: packaging: '' - tomli: '' traitlets: '' - ipykernel: '' jupyter_core: '' python: '>=3.8' tornado: '>=6.2.0' jinja2: '>=3.0.3' + tomli: '>=1.2.2' importlib_metadata: '>=4.8.3' jupyter_server: '>=2.4.0,<3' importlib_resources: '>=1.4' @@ -10461,10 +10400,11 @@ package: jupyterlab_server: '>=2.19.0,<3' notebook-shim: '>=0.2' httpx: '>=0.25.0' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.1.5-pyhd8ed1ab_0.conda + ipykernel: '>=6.5.0' + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.1.6-pyhd8ed1ab_0.conda hash: - md5: 04b1ca9d7ac414b3f5c3fb16066c6861 - sha256: b098b79ef34d5c6a9ef7fc482bd2373072820006757ed7db33328af88fb91496 + md5: 8b0a6b8edbaef9796d2b925c63441b8e + sha256: fe935cccc5766b0212ce66fdb91db7068d89c88a1b916f067b16b86fb352d7a5 category: main optional: false - name: jupyterlab_pygments @@ -10507,7 +10447,7 @@ package: category: main optional: false - name: jupyterlab_server - version: 2.25.4 + version: 2.26.0 manager: conda platform: linux-64 dependencies: @@ -10520,10 +10460,10 @@ package: packaging: '>=21.3' python: '>=3.8' requests: '>=2.31' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.26.0-pyhd8ed1ab_0.conda hash: - md5: ffd61670ae09d2d3c637f6afd29db443 - sha256: d0336d0c0223a66d648b24cfd1512fd7aebc85550d47f55ad5edbd53f482e7e5 + md5: bd9f28ac8833e63eeadb69aa1341f269 + sha256: 1c90175218cdc910857423d5ffc356edba54d24a438ee1761fcd7f277270689f category: main optional: false - name: jupyterlab_server @@ -10547,7 +10487,7 @@ package: category: main optional: false - name: jupyterlab_server - version: 2.25.4 + version: 2.26.0 manager: conda platform: osx-arm64 dependencies: @@ -10560,10 +10500,10 @@ package: babel: '>=2.10' json5: '>=0.9.0' jsonschema: '>=4.18' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.26.0-pyhd8ed1ab_0.conda hash: - md5: ffd61670ae09d2d3c637f6afd29db443 - sha256: d0336d0c0223a66d648b24cfd1512fd7aebc85550d47f55ad5edbd53f482e7e5 + md5: bd9f28ac8833e63eeadb69aa1341f269 + sha256: 1c90175218cdc910857423d5ffc356edba54d24a438ee1761fcd7f277270689f category: main optional: false - name: jupyterlab_widgets @@ -10733,22 +10673,23 @@ package: category: main optional: false - name: keyring - version: 25.0.0 + version: 25.1.0 manager: conda platform: linux-64 dependencies: + __linux: '' importlib_metadata: '>=4.11.4' + importlib_resources: '' jaraco.classes: '' jaraco.context: '' jaraco.functools: '' jeepney: '>=0.4.2' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* + python: '>=3.8' secretstorage: '>=3.2' - url: https://conda.anaconda.org/conda-forge/linux-64/keyring-25.0.0-py39hf3d152e_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.1.0-pyha804496_0.conda hash: - md5: 9dffaab106d52fe3a52b303253f9b251 - sha256: a5f89e3bddc2031a9d550e2e4ae3766a55a1a53d4808bf304c7ffee5ab725d28 + md5: db81e05a29ff5d52ca21b18bbf880520 + sha256: 2acc90266689d2832bfe119608e5de458ca2b4a42f712912fe0b0b3c950d0d19 category: main optional: false - name: keyring @@ -10769,20 +10710,21 @@ package: category: main optional: false - name: keyring - version: 25.0.0 + version: 25.1.0 manager: conda platform: osx-arm64 dependencies: - importlib_metadata: '>=4.11.4' + importlib_resources: '' + __osx: '' jaraco.classes: '' - jaraco.context: '' jaraco.functools: '' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/keyring-25.0.0-py39h2804cbe_0.conda + jaraco.context: '' + python: '>=3.8' + importlib_metadata: '>=4.11.4' + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.1.0-pyh534df25_0.conda hash: - md5: 1314ad438df943a4e57da2cc51cc0cc8 - sha256: c4949d83989c746c5b1a28edb6a02df7892b78cda277ac8126c97b8744237e4f + md5: 537a5385c6cee5fa2275a457e0b51b21 + sha256: b5c1f6b9f9baf161b7fd560b62a279841f4114f216c627706a828621326d82ae category: main optional: false - name: keyutils @@ -10885,17 +10827,17 @@ package: category: main optional: false - name: kubernetes - version: 1.25.3 + version: 1.30.0 manager: conda platform: linux-64 dependencies: - kubernetes-client: 1.25.3 - kubernetes-node: 1.25.3 - kubernetes-server: 1.25.3 - url: https://conda.anaconda.org/conda-forge/linux-64/kubernetes-1.25.3-ha770c72_0.conda + kubernetes-client: 1.30.0 + kubernetes-node: 1.30.0 + kubernetes-server: 1.30.0 + url: https://conda.anaconda.org/conda-forge/linux-64/kubernetes-1.30.0-ha770c72_0.conda hash: - md5: d9c3df17c3020b839d47f252ba6885fd - sha256: 624ee9537664756032437b6378497b9cbd90d9a6bbca6e805615615314a6d480 + md5: de63f648197e1851a30a1f3476111b55 + sha256: 48d8ed1c00c6487233ca1ed32c2b83dcb733a81d3b15015e72a732e683e05c68 category: main optional: false - name: kubernetes @@ -10913,30 +10855,30 @@ package: category: main optional: false - name: kubernetes - version: 1.25.3 + version: 1.30.0 manager: conda platform: osx-arm64 dependencies: - kubernetes-client: 1.25.3 - kubernetes-node: 1.25.3 - kubernetes-server: 1.25.3 - url: https://conda.anaconda.org/conda-forge/osx-arm64/kubernetes-1.25.3-hce30654_0.conda + kubernetes-client: 1.30.0 + kubernetes-node: 1.30.0 + kubernetes-server: 1.30.0 + url: https://conda.anaconda.org/conda-forge/osx-arm64/kubernetes-1.30.0-hce30654_0.conda hash: - md5: 813fd5d1d2285f73e19ba2b88361ed88 - sha256: aca8453c92756205810500b60a25b71bb8b2a8dd5efaa5afe3e32c5ede727ff2 + md5: 66b03d9f598d3c07e9e3d3f025f89ac5 + sha256: 78c126e864896b8e7c1920beabdc05d055c779b103b6255b4003cf77d1cca7b3 category: main optional: false - name: kubernetes-client - version: 1.25.3 + version: 1.30.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/kubernetes-client-1.25.3-h449c3f6_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/kubernetes-client-1.30.0-hca7a7c1_0.conda hash: - md5: 53a9490aea421c6b43605c17b3fbb26c - sha256: b6baddbf7fe6e53e71cf8998d225fa8e6d187b60dc0e466d34fbfe876aec9a5c + md5: 9574dd714c9409c88e4b2e36b829a2d7 + sha256: e2bd8902c88b3e34ee6a901433db4586b93a120c172a4cb920bc0a86fe30cc9f category: main optional: false - name: kubernetes-client @@ -10951,27 +10893,27 @@ package: category: main optional: false - name: kubernetes-client - version: 1.25.3 + version: 1.30.0 manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/kubernetes-client-1.25.3-hc52dabb_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/kubernetes-client-1.30.0-hd504179_0.conda hash: - md5: a96c1ce6bfbfa86db064d2bc9ead119e - sha256: 6bca1eda3def0f5323569451d6b700ea1253017cc4970f3c3a063ae718006b93 + md5: d4942c19b4e4afe4e92dcb09cbfc2f48 + sha256: 42ebb15de9ee3da60f69f838d6a017b8638d0eadca07412e37f8ad287a1fe532 category: main optional: false - name: kubernetes-node - version: 1.25.3 + version: 1.30.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/kubernetes-node-1.25.3-h449c3f6_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/kubernetes-node-1.30.0-hca7a7c1_0.conda hash: - md5: f706346637b6175a91d7fc3b5c04db16 - sha256: 9be6b6d2fc4fc90741e2efb12a7e3b60f3bb44e6c458ef6e6fe8824635020c87 + md5: 7b212f545554cc386c79a043ba2b4ae2 + sha256: 37134a1df729eb47ce216270935a09e2498c57c86112ed4c2f24dcf5b55c15c5 category: main optional: false - name: kubernetes-node @@ -10986,28 +10928,28 @@ package: category: main optional: false - name: kubernetes-node - version: 1.25.3 + version: 1.30.0 manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/kubernetes-node-1.25.3-hc52dabb_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/kubernetes-node-1.30.0-hd504179_0.conda hash: - md5: 6695a06c4a0aa24d5a30a5d399a4f5b0 - sha256: d2656858f31486c4658bc842d7104da8cd68ec204c213b5b2a4e23ff25a65c2d + md5: e48b78c34780f80bd2ab97b578d101a4 + sha256: d50e3768d5da95eeaade728bf3b56782ed3e59b81c042c4f5fc9226271e34a6b category: main optional: false - name: kubernetes-server - version: 1.25.3 + version: 1.30.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17' - kubernetes-node: 1.25.3 + kubernetes-node: 1.30.0 libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/kubernetes-server-1.25.3-h449c3f6_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/kubernetes-server-1.30.0-hca7a7c1_0.conda hash: - md5: c7df8e51b39ffb41d2f3c9a3c782ef6d - sha256: 3b8410040ff355d871ce90bcbccc6fba8482d097411da99a73d7bfb7e13bf264 + md5: 3ad5df82fa00d66a26dfa999d5a94d7e + sha256: e98db05dc715d667a01bd6e955ccde236f32a0f8de3a2e13a2ab8c36ed84d09f category: main optional: false - name: kubernetes-server @@ -11023,27 +10965,15 @@ package: category: main optional: false - name: kubernetes-server - version: 1.25.3 + version: 1.30.0 manager: conda platform: osx-arm64 dependencies: - kubernetes-node: 1.25.3 - url: https://conda.anaconda.org/conda-forge/osx-arm64/kubernetes-server-1.25.3-hc52dabb_0.conda + kubernetes-node: 1.30.0 + url: https://conda.anaconda.org/conda-forge/osx-arm64/kubernetes-server-1.30.0-hd504179_0.conda hash: - md5: fe30b91760c813b6083a0285787b1ca4 - sha256: dcef741d5f7d922b8b7490057e8532214197489dead2de22dee136055d8705ee - category: main - optional: false -- name: lame - version: '3.100' - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - hash: - md5: a8832b479f93521a9e7b5b743803be51 - sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + md5: 75a8c006b1cf03917f2918d07cbae732 + sha256: 5e2c1b45027675970ce5d03976d806abf66427b9d156c6f761a215069f08faf1 category: main optional: false - name: lcms2 @@ -11269,7 +11199,7 @@ package: category: main optional: false - name: libarrow - version: 13.0.0 + version: 15.0.0 manager: conda platform: linux-64 dependencies: @@ -11282,24 +11212,19 @@ package: libbrotlienc: '>=1.1.0,<1.2.0a0' libgcc-ng: '>=12' libgoogle-cloud: '>=2.12.0,<2.13.0a0' - libgrpc: '>=1.59.3,<1.60.0a0' - libprotobuf: '>=4.24.4,<4.24.5.0a0' libre2-11: '>=2023.6.2,<2024.0a0' libstdcxx-ng: '>=12' - libthrift: '>=0.19.0,<0.19.1.0a0' libutf8proc: '>=2.8.0,<3.0a0' libzlib: '>=1.2.13,<1.3.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - openssl: '>=3.2.0,<4.0a0' orc: '>=1.9.2,<1.9.3.0a0' re2: '' - snappy: '>=1.1.10,<2.0a0' - ucx: '>=1.15.0,<1.16.0a0' + snappy: '>=1.1.10,<1.2.0a0' zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-13.0.0-h75ae66a_23_cpu.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-15.0.0-h84dd17c_0_cpu.conda hash: - md5: a474ac3e22c8f4c7540533e11e3ea820 - sha256: cd40afed871226bdfb5bc87f92899269006d02373f8b853efc2c4d2bde96c371 + md5: 5cf2631ef8e74b330cac73309085b271 + sha256: ec8ab78c117da8b88f73386c409ecbc8c1f1673bcbb3bde4f47af6ab413a7c8a category: main optional: false - name: libarrow @@ -11331,40 +11256,278 @@ package: zstd: '>=1.5.5,<1.6.0a0' url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-13.0.0-hdae7707_23_cpu.conda hash: - md5: 799848b44f6d7cc4a9cd5511101a7b59 - sha256: 1f79ceed195d10cbc8a47141c0b4402161ac37ee4c4899c79f2e13ec7782719c + md5: 799848b44f6d7cc4a9cd5511101a7b59 + sha256: 1f79ceed195d10cbc8a47141c0b4402161ac37ee4c4899c79f2e13ec7782719c + category: main + optional: false +- name: libarrow + version: 15.0.0 + manager: conda + platform: osx-arm64 + dependencies: + aws-crt-cpp: '>=0.26.0,<0.26.1.0a0' + aws-sdk-cpp: '>=1.11.210,<1.11.211.0a0' + bzip2: '>=1.0.8,<2.0a0' + glog: '>=0.6.0,<0.7.0a0' + libabseil: '>=20230802.1,<20230803.0a0' + libbrotlidec: '>=1.1.0,<1.2.0a0' + libbrotlienc: '>=1.1.0,<1.2.0a0' + libcxx: '>=14' + libgoogle-cloud: '>=2.12.0,<2.13.0a0' + libre2-11: '>=2023.6.2,<2024.0a0' + libutf8proc: '>=2.8.0,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + orc: '>=1.9.2,<1.9.3.0a0' + re2: '' + snappy: '>=1.1.10,<1.2.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-15.0.0-h4ce3932_0_cpu.conda + hash: + md5: 3ca9fab3389bb627c1fd354f9fa27dde + sha256: 6bec2ef16855088bb940cf74e4eaf3a5cbe64487e8ffd3f7d9b997dae24b8a69 + category: main + optional: false +- name: libarrow-acero + version: 15.0.0 + manager: conda + platform: linux-64 + dependencies: + libarrow: 15.0.0 + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-15.0.0-h59595ed_0_cpu.conda + hash: + md5: 3472c8807bff382e938ad85a261738f9 + sha256: 4f305e5fc7350752ac5248fbcd37ba5a0a88a628aadf341c3bcbc9949025a713 + category: main + optional: false +- name: libarrow-acero + version: 15.0.0 + manager: conda + platform: osx-arm64 + dependencies: + libarrow: 15.0.0 + libcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-15.0.0-h13dd4ca_0_cpu.conda + hash: + md5: 701da00ed0056b0236113e03e8ef53d0 + sha256: 355d75001711f9ddbd6764a83f1750cf4b5502fcca0e8bcef32ac4125cefa923 + category: main + optional: false +- name: libarrow-dataset + version: 15.0.0 + manager: conda + platform: linux-64 + dependencies: + libarrow: 15.0.0 + libarrow-acero: 15.0.0 + libgcc-ng: '>=12' + libparquet: 15.0.0 + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.0-h59595ed_0_cpu.conda + hash: + md5: 77a3299d7f6afb2e274c12d7395346b0 + sha256: f648faaddf25a697376b407cad4aaf593c14b7d264dc1013c7d75378554f2cc7 + category: main + optional: false +- name: libarrow-dataset + version: 15.0.0 + manager: conda + platform: osx-arm64 + dependencies: + libarrow: 15.0.0 + libarrow-acero: 15.0.0 + libcxx: '>=14' + libparquet: 15.0.0 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-15.0.0-h13dd4ca_0_cpu.conda + hash: + md5: 899b96fd6f030658293225fe503cface + sha256: 8062749716dd912b86ebcc055c205961cb5bb97034b35c4e4d5fc94931186423 + category: main + optional: false +- name: libarrow-flight + version: 15.0.0 + manager: conda + platform: linux-64 + dependencies: + libabseil: '>=20230802.1,<20230803.0a0' + libarrow: 15.0.0 + libgcc-ng: '>=12' + libgrpc: '>=1.59.3,<1.60.0a0' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libstdcxx-ng: '>=12' + ucx: '>=1.15.0,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-15.0.0-h120cb0d_0_cpu.conda + hash: + md5: 539c47e0a070a8ac36f1a91cc8b88376 + sha256: f2d5916d993a90c05cbb6830809cb5470af8570bbae0da8784e385577d91a3ab + category: main + optional: false +- name: libarrow-flight + version: 15.0.0 + manager: conda + platform: osx-arm64 + dependencies: + libabseil: '>=20230802.1,<20230803.0a0' + libarrow: 15.0.0 + libcxx: '>=14' + libgrpc: '>=1.59.3,<1.60.0a0' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-15.0.0-ha94d253_0_cpu.conda + hash: + md5: 1e70940cb025c33b4339c479ce16b4f1 + sha256: 43a3fcdc12a9ff2fec70a2626b7b184f6473abc3ffdad26a0e4153287d72e400 + category: main + optional: false +- name: libarrow-flight-sql + version: 15.0.0 + manager: conda + platform: linux-64 + dependencies: + libarrow: 15.0.0 + libarrow-flight: 15.0.0 + libgcc-ng: '>=12' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-15.0.0-h61ff412_0_cpu.conda + hash: + md5: 9d710114caa170858339ed1a99facbe6 + sha256: 8485b0af1503429c34c892fd82c9167934c28c95af57b7edb167e0bf3d0ccd00 + category: main + optional: false +- name: libarrow-flight-sql + version: 15.0.0 + manager: conda + platform: osx-arm64 + dependencies: + libarrow: 15.0.0 + libarrow-flight: 15.0.0 + libcxx: '>=14' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-flight-sql-15.0.0-h39a9b85_0_cpu.conda + hash: + md5: e801d904ab515ea185f733d9e613e15f + sha256: f0280819844b67efbd3630d6a941670b30c9d380713ce1c552fd00e0247bd162 + category: main + optional: false +- name: libarrow-gandiva + version: 15.0.0 + manager: conda + platform: linux-64 + dependencies: + libarrow: 15.0.0 + libgcc-ng: '>=12' + libllvm15: '>=15.0.7,<15.1.0a0' + libre2-11: '>=2023.6.2,<2024.0a0' + libstdcxx-ng: '>=12' + libutf8proc: '>=2.8.0,<3.0a0' + openssl: '>=3.2.1,<4.0a0' + re2: '' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-15.0.0-hacb8726_0_cpu.conda + hash: + md5: 70f3d17f20f717d3a6093b0d39b2b958 + sha256: ff0c88547635c0947beb5edc9f8fcbdf0f79d9b3b6aeb6614c896e79bc3179f8 + category: main + optional: false +- name: libarrow-gandiva + version: 15.0.0 + manager: conda + platform: osx-arm64 + dependencies: + libarrow: 15.0.0 + libcxx: '>=14' + libllvm15: '>=15.0.7,<15.1.0a0' + libre2-11: '>=2023.6.2,<2024.0a0' + libutf8proc: '>=2.8.0,<3.0a0' + openssl: '>=3.2.1,<4.0a0' + re2: '' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-gandiva-15.0.0-hf757142_0_cpu.conda + hash: + md5: 9ce11e82d2b971be33b44c83416adea2 + sha256: 851c6af4fff4146b847618bf6b003973143781880a520de6d2cb41cc1846ef42 + category: main + optional: false +- name: libarrow-substrait + version: 15.0.0 + manager: conda + platform: linux-64 + dependencies: + libarrow: 15.0.0 + libarrow-acero: 15.0.0 + libarrow-dataset: 15.0.0 + libgcc-ng: '>=12' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-15.0.0-h61ff412_0_cpu.conda + hash: + md5: 636da1ef050231a6ace3fbd5b3a4e03e + sha256: f07e62d97781bbb2584944a4b4426fd4eae1ec3967aa99ade2b874c31af7e360 + category: main + optional: false +- name: libarrow-substrait + version: 15.0.0 + manager: conda + platform: osx-arm64 + dependencies: + libarrow: 15.0.0 + libarrow-acero: 15.0.0 + libarrow-dataset: 15.0.0 + libcxx: '>=14' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-15.0.0-h7fd9903_0_cpu.conda + hash: + md5: 6b09fe677337fbe43f1d7c58e1b0219f + sha256: 4b7785ae74cadd921c6aead9667293550a0d890226ea7286da331b283a525a49 + category: main + optional: false +- name: libasprintf + version: 0.22.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda + hash: + md5: dd197c968bf9760bba0031888d431ede + sha256: 31d58af7eb54e2938123200239277f14893c5fa4b5d0280c8cf55ae10000638b + category: main + optional: false +- name: libasprintf + version: 0.22.5 + manager: conda + platform: osx-arm64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.22.5-h8fbad5d_2.conda + hash: + md5: 1b27402397a76115679c4855ab2ece41 + sha256: 04bbe4374719906cd08b639a3f34828030f405c33b47c757b47fd55aa7310179 + category: main + optional: false +- name: libasprintf-devel + version: 0.22.5 + manager: conda + platform: linux-64 + dependencies: + libasprintf: 0.22.5 + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda + hash: + md5: 02e41ab5834dcdcc8590cf29d9526f50 + sha256: 99d26d272a8203d30b3efbe734a99c823499884d7759b4291674438137c4b5ca category: main optional: false -- name: libarrow - version: 13.0.0 +- name: libasprintf-devel + version: 0.22.5 manager: conda platform: osx-arm64 dependencies: - aws-crt-cpp: '>=0.26.0,<0.26.1.0a0' - aws-sdk-cpp: '>=1.11.210,<1.11.211.0a0' - bzip2: '>=1.0.8,<2.0a0' - glog: '>=0.6.0,<0.7.0a0' - libabseil: '>=20230802.1,<20230803.0a0' - libbrotlidec: '>=1.1.0,<1.2.0a0' - libbrotlienc: '>=1.1.0,<1.2.0a0' - libcxx: '>=14' - libgoogle-cloud: '>=2.12.0,<2.13.0a0' - libgrpc: '>=1.59.3,<1.60.0a0' - libprotobuf: '>=4.24.4,<4.24.5.0a0' - libre2-11: '>=2023.6.2,<2024.0a0' - libthrift: '>=0.19.0,<0.19.1.0a0' - libutf8proc: '>=2.8.0,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' - lz4-c: '>=1.9.3,<1.10.0a0' - openssl: '>=3.2.0,<4.0a0' - orc: '>=1.9.2,<1.9.3.0a0' - re2: '' - snappy: '>=1.1.10,<2.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-13.0.0-h7c288cf_23_cpu.conda + libasprintf: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-devel-0.22.5-h8fbad5d_2.conda hash: - md5: 9fed5c58b68f1cd832dca7b5fcd1be2a - sha256: 30846fd0da328e5f2027feb3eebcc89b2b75ff7f506ab6f52a423d237a2faa6f + md5: 480c106e87d4c4791e6b55a6d1678866 + sha256: f5331486854a5fe80bb837891efb28a28623f762327372cb4cbc264c9c4bf9e2 category: main optional: false - name: libblas @@ -11372,11 +11535,11 @@ package: manager: conda platform: linux-64 dependencies: - libopenblas: '>=0.3.26,<1.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda + libopenblas: '>=0.3.27,<1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda hash: - md5: 0ac9f44fc096772b0aa092119b00c3ca - sha256: ebd5c91f029f779fb88a1fcbd1e499559a9c258e3674ff58a2fbb4e375ae56d9 + md5: 1a2a0cd3153464fee6646f3dd6dad9b8 + sha256: 082b8ac20d43a7bbcdc28b3b1cd40e4df3a8b5daf0a2d23d68953a44d2d12c1b category: main optional: false - name: libblas @@ -11396,11 +11559,11 @@ package: manager: conda platform: osx-arm64 dependencies: - libopenblas: '>=0.3.26,<1.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-21_osxarm64_openblas.conda + libopenblas: '>=0.3.27,<1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-22_osxarm64_openblas.conda hash: - md5: b3804f4af39eca9d77360b12811e6d1d - sha256: 9a553af92af9f241457f4d14eabb872bc341cd0ddea1da6e7939e9c6a7ee1a25 + md5: aeaf35355ef0f37c7c1ba35b7b7db55f + sha256: 8620e13366076011cfcc6b2565c7a2d362c5d3f0423f54b9ef9bfc17b1a012a4 category: main optional: false - name: libboost-headers @@ -11544,29 +11707,16 @@ package: sha256: 690dfc98e891ee1871c54166d30f6e22edfc2d7d6b29e7988dde5f1ce271c81a category: main optional: false -- name: libcap - version: '2.69' - manager: conda - platform: linux-64 - dependencies: - attr: '>=2.5.1,<2.6.0a0' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda - hash: - md5: 25cb5999faa414e5ccb2c1388f62d3d5 - sha256: 942f9564b4228609f017b6617425d29a74c43b8a030e12239fa4458e5cb6323c - category: main - optional: false - name: libcblas version: 3.9.0 manager: conda platform: linux-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda hash: - md5: 4a3816d06451c4946e2db26b86472cb6 - sha256: 467bbfbfe1a1aeb8b1f9f6485eedd8ed1b6318941bf3702da72336ccf4dc25a6 + md5: 4b31699e0ec5de64d5896e580389c9a1 + sha256: da1b2faa017663c8f5555c1c5518e96ac4cd8e0be2a673c1c9e2cb8507c8fe46 category: main optional: false - name: libcblas @@ -11587,25 +11737,10 @@ package: platform: osx-arm64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-21_osxarm64_openblas.conda - hash: - md5: 48e9d42c65ce664d8fccef2ac6af853c - sha256: 4510e3e4824693c3f80fc54e72d81dd89acaa6e6d68cd948af0870a640ea7eeb - category: main - optional: false -- name: libclang - version: 15.0.7 - manager: conda - platform: linux-64 - dependencies: - libclang13: 15.0.7 - libgcc-ng: '>=12' - libllvm15: '>=15.0.7,<15.1.0a0' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_h127d8a8_5.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-22_osxarm64_openblas.conda hash: - md5: 09b94dd3a7e304df5b83176239347920 - sha256: 606b79c8a4a926334191d79f4a1447aac1d82c43344e3a603cbba31ace859b8f + md5: 37b3682240a69874a22658dedbca37d9 + sha256: 2c7902985dc77db1d7252b4e838d92a34b1729799ae402988d62d077868f6cca category: main optional: false - name: libclang @@ -11622,20 +11757,6 @@ package: sha256: ea3c840b7e931228007f1dc21c1cfe8e3e833990da9e92fff9c23c98d035b89a category: main optional: false -- name: libclang13 - version: 15.0.7 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libllvm15: '>=15.0.7,<15.1.0a0' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h5d6823c_5.conda - hash: - md5: 2d694a9ffdcc30e89dea34a8dcdab6ae - sha256: 91ecfcf545a5d4588e9fad5db2b5b04eeef18cae1c03b790829ef8b978f06ccd - category: main - optional: false - name: libclang13 version: 15.0.7 manager: conda @@ -11686,21 +11807,6 @@ package: sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 category: main optional: false -- name: libcups - version: 2.3.3 - manager: conda - platform: linux-64 - dependencies: - krb5: '>=1.21.1,<1.22.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - hash: - md5: d4529f4dff3057982a7617c7ac58fde3 - sha256: bc67b9b21078c99c6bd8595fe7e1ed6da1f721007726e717f0449de7032798c4 - category: main - optional: false - name: libcurl version: 8.7.1 manager: conda @@ -11985,21 +12091,6 @@ package: sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca category: main optional: false -- name: libflac - version: 1.4.3 - manager: conda - platform: linux-64 - dependencies: - gettext: '>=0.21.1,<1.0a0' - libgcc-ng: '>=12' - libogg: '>=1.3.4,<1.4.0a0' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda - hash: - md5: ee48bf17cc83a00f59ca1494d5646869 - sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d - category: main - optional: false - name: libgcc-ng version: 13.2.0 manager: conda @@ -12281,6 +12372,58 @@ package: sha256: bff62d710f8a3ae6a0c4671c0584a7680e9e3a468003367ddf5bee8c90ff0079 category: main optional: false +- name: libgettextpo + version: 0.22.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda + hash: + md5: 172bcc51059416e7ce99e7b528cede83 + sha256: e2f784564a2bdc6f753f00f63cc77c97601eb03bc89dccc4413336ec6d95490b + category: main + optional: false +- name: libgettextpo + version: 0.22.5 + manager: conda + platform: osx-arm64 + dependencies: + libiconv: '>=1.17,<2.0a0' + libintl: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.22.5-h8fbad5d_2.conda + hash: + md5: a66fad933e22d22599a6dd149d359d25 + sha256: c3f5580e172c3fc03d33e8994024f08b709a239bd599792e51435fa7a06beb64 + category: main + optional: false +- name: libgettextpo-devel + version: 0.22.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libgettextpo: 0.22.5 + url: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda + hash: + md5: b63d9b6da3653179a278077f0de20014 + sha256: 695eb2439ad4a89e4205dd675cc52fba5cef6b5d41b83f07cdbf4770a336cc15 + category: main + optional: false +- name: libgettextpo-devel + version: 0.22.5 + manager: conda + platform: osx-arm64 + dependencies: + libgettextpo: 0.22.5 + libiconv: '>=1.17,<2.0a0' + libintl: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-devel-0.22.5-h8fbad5d_2.conda + hash: + md5: 1113aa220b042b7ce8d077ea8f696f98 + sha256: b1be0bb8a726e2c47a025ff348e6ba8b51ef668f6ace06694657025d84ae66e2 + category: main + optional: false - name: libgfortran version: 5.0.0 manager: conda @@ -12590,33 +12733,32 @@ package: manager: conda platform: osx-arm64 dependencies: - __osx: '>=10.9' - c-ares: '>=1.21.0,<2.0a0' + c-ares: '>=1.26.0,<2.0a0' libabseil: '>=20230802.1,<20230803.0a0' - libcxx: '>=16.0.6' + libcxx: '>=16' libprotobuf: '>=4.24.4,<4.24.5.0a0' libre2-11: '>=2023.6.2,<2024.0a0' libzlib: '>=1.2.13,<1.3.0a0' - openssl: '>=3.1.4,<4.0a0' + openssl: '>=3.2.1,<4.0a0' re2: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.59.3-hbcf6334_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.59.3-h9560976_0.conda hash: - md5: e9c7cbc84af929dd47501629a5e19713 - sha256: 54cacd1fc7503d48c135301a775568f15089b537b3c56804767c627a89a20c30 + md5: 31e7f059601587954b1370fe172d3114 + sha256: 9c0291bf797df0cee46d870bd410968e5955b0573c6b603c0ee7a5fcac06ad91 category: main optional: false - name: libhwloc - version: 2.9.3 + version: 2.10.0 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libxml2: '>=2.11.5,<3.0.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda + libxml2: '>=2.12.6,<3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h2fb2949_1000.conda hash: - md5: f36ddc11ca46958197a45effdd286e45 - sha256: 6950fee24766d03406e0f6f965262a5d98829c71eed8d1004f313892423b559b + md5: 7e3726e647a619c6ce5939014dfde86d + sha256: dab61dff22f40367e57b1fe024e789f451b7511e65c32b97ada97ca549dd8dbc category: main optional: false - name: libhwloc @@ -12666,6 +12808,31 @@ package: sha256: bc7de5097b97bcafcf7deaaed505f7ce02f648aac8eccc0d5a47cc599a1d0304 category: main optional: false +- name: libintl + version: 0.22.5 + manager: conda + platform: osx-arm64 + dependencies: + libiconv: '>=1.17,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda + hash: + md5: 3d216d0add050129007de3342be7b8c5 + sha256: 21bc79bdf34ffd20cb84d2a8bd82d7d0e2a1b94b9e72773f0fb207e5b4f1ff63 + category: main + optional: false +- name: libintl-devel + version: 0.22.5 + manager: conda + platform: osx-arm64 + dependencies: + libiconv: '>=1.17,<2.0a0' + libintl: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda + hash: + md5: 962b3348c68efd25da253e94590ea9a2 + sha256: e52b2d0c5711f64b523756ccd9b800ee6f10a6317432b20a417dc3792e0a794a + category: main + optional: false - name: libjpeg-turbo version: 3.0.0 manager: conda @@ -12755,10 +12922,10 @@ package: platform: linux-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda hash: - md5: 1a42f305615c3867684e049e85927531 - sha256: 64b5c35dce00dd6f9f53178b2fe87116282e00967970bd6551a5a42923806ded + md5: b083767b6c877e24ee597d93b87ab838 + sha256: db246341d42f9100d45adeb1a7ba8b1ef5b51ceb9056fd643e98046a3259fde6 category: main optional: false - name: liblapack @@ -12779,10 +12946,10 @@ package: platform: osx-arm64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-21_osxarm64_openblas.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-22_osxarm64_openblas.conda hash: - md5: a4510e3913ef552d69ab2080a0048523 - sha256: a917e99f26d205df1ec22d7a9fff0d2f2f3c7ba06ea2be886dc220a8340d5917 + md5: f2794950bc005e123b2c21f7fa3d7a6e + sha256: 2b1b24c98d15a6a3ad54cf7c8fef1ddccf84b7c557cde08235aaeffd1ff50ee8 category: main optional: false - name: libllvm15 @@ -12816,6 +12983,57 @@ package: sha256: a0598cc166e92c6c63e58a7eaa184fa0b8b467693b965dbe19f1c9ff37e134c3 category: main optional: false +- name: libllvm15 + version: 15.0.7 + manager: conda + platform: osx-arm64 + dependencies: + libcxx: '>=16' + libxml2: '>=2.12.1,<3.0.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm15-15.0.7-h2621b3d_4.conda + hash: + md5: 8d7f7a7286d99a2671df2619cb3bfb2c + sha256: 63e22ccd4c1b80dfc7da169c65c62a878a46ef0e5771c3b0c091071e718ae1b1 + category: main + optional: false +- name: libmagma + version: 2.7.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17' + _openmp_mutex: '>=4.5' + cudatoolkit: '>=11.8,<12' + libblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + liblapack: '>=3.9.0,<4.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.7.2-h09b5827_2.conda + hash: + md5: f6de79234f35c2fcc2e49dc66436601d + sha256: 4dd54775f2cfa9c09f4b4cc58a6db00bad50b30e65adf62ffe4213a30d962766 + category: main + optional: false +- name: libmagma_sparse + version: 2.7.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17' + _openmp_mutex: '>=4.5' + cudatoolkit: '>=11.8,<12' + libblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + liblapack: '>=3.9.0,<4.0a0' + libmagma: '>=2.7.2,<2.7.3.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.7.2-h09b5827_3.conda + hash: + md5: 53157a5777c664896654d8dbc9fd6bf9 + sha256: ee4a2367446763e6a4ef6d2fa5aea06adfd4ff44853f7390a02b0da77c6f129c + category: main + optional: false - name: libnetcdf version: 4.9.2 manager: conda @@ -12966,18 +13184,6 @@ package: sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 category: main optional: false -- name: libogg - version: 1.3.4 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=9.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 - hash: - md5: 6e8cc2173440d77708196c5b93771680 - sha256: b88afeb30620b11bed54dac4295aa57252321446ba4e6babd7dce4b9ffde9b25 - category: main - optional: false - name: libogg version: 1.3.4 manager: conda @@ -12990,17 +13196,17 @@ package: category: main optional: false - name: libopenblas - version: 0.3.26 + version: 0.3.27 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' libgfortran-ng: '' libgfortran5: '>=12.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda hash: - md5: 760ae35415f5ba8b15d09df5afe8b23a - sha256: b626954b5a1113dafec8df89fa8bf18ce9b4701464d9f084ddd7fc9fac404bbd + md5: a356024784da6dfd4683dc5ecf45b155 + sha256: 2ae7559aed0705deb3f716c7b247c74fd1b5e35b64e39834ce8b95f7564d4a3e category: main optional: false - name: libopenblas @@ -13018,40 +13224,59 @@ package: category: main optional: false - name: libopenblas - version: 0.3.26 + version: 0.3.27 manager: conda platform: osx-arm64 dependencies: libgfortran: 5.* libgfortran5: '>=12.3.0' llvm-openmp: '>=16.0.6' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.26-openmp_h6c19121_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h6c19121_0.conda hash: - md5: 000970261d954431ccca3cce68d873d8 - sha256: 2a59b92c412fd0f59a8079dfa21c561ae17e72e72e47d4d7aee474bf6fd642e1 + md5: 82eba59f4eca26a9fc904d584f8761c0 + sha256: feb2662444fc98a4842fe54cc70b1f109b2146108e7bac2b3bbad1f219cede90 category: main optional: false - name: libopus version: 1.3.1 manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libopus-1.3.1-hc929b4f_1.tar.bz2 + hash: + md5: 380b9ea5f6a7a277e6c1ac27d034369b + sha256: c126fc225bece591a8f010e95ca7d010ea2d02df9251830bec24a19bf823fc31 + category: main + optional: false +- name: libparquet + version: 15.0.0 + manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + libarrow: 15.0.0 + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libthrift: '>=0.19.0,<0.19.1.0a0' + openssl: '>=3.2.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libparquet-15.0.0-h352af49_0_cpu.conda hash: - md5: 15345e56d527b330e1cacbdf58676e8f - sha256: 0e1c2740ebd1c93226dc5387461bbcf8142c518f2092f3ea7551f77755decc8f + md5: d187f0119f9fbb9b1f3b46bde565bd01 + sha256: 505672cb7ec1e42a7e60fcee9f6cad38b35227186b2dbcf3d5f4686a4339c13a category: main optional: false -- name: libopus - version: 1.3.1 +- name: libparquet + version: 15.0.0 manager: conda - platform: osx-64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-64/libopus-1.3.1-hc929b4f_1.tar.bz2 + platform: osx-arm64 + dependencies: + libarrow: 15.0.0 + libcxx: '>=14' + libthrift: '>=0.19.0,<0.19.1.0a0' + openssl: '>=3.2.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-15.0.0-hf6ce1d5_0_cpu.conda hash: - md5: 380b9ea5f6a7a277e6c1ac27d034369b - sha256: c126fc225bece591a8f010e95ca7d010ea2d02df9251830bec24a19bf823fc31 + md5: bcba51f02dff1f1bb181dcf2b2d56a08 + sha256: 72ee8b091a0fcb3df18dc7c1b0c4cb3ea1011135dc39a2121a415ddf841e2ef0 category: main optional: false - name: libpng @@ -13166,14 +13391,13 @@ package: manager: conda platform: osx-arm64 dependencies: - __osx: '>=10.9' libabseil: '>=20230802.1,<20230803.0a0' - libcxx: '>=16.0.6' + libcxx: '>=15' libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-4.24.4-hc9861d8_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-4.24.4-h810fc01_0.conda hash: - md5: ac5438d981e105e053b341eb30c44273 - sha256: 2e81e023f463ef239e2fb7f56a4e8eed61a1d8e9ca3f2f07bec1668cc369b2ce + md5: 36d9b941d8686f7926415275f8f75829 + sha256: 9b2cd4027b081a9f90069b429e52bf177ea4968032c684ea5d5c6d78e9e11c08 category: main optional: false - name: libre2-11 @@ -13353,35 +13577,16 @@ package: sha256: 1a86748681f1435763d981ec965e87c4bb281c5e463cd80c82a2841d3553be89 category: main optional: false -- name: libsndfile - version: 1.2.2 - manager: conda - platform: linux-64 - dependencies: - lame: '>=3.100,<3.101.0a0' - libflac: '>=1.4.3,<1.5.0a0' - libgcc-ng: '>=12' - libogg: '>=1.3.4,<1.4.0a0' - libopus: '>=1.3.1,<2.0a0' - libstdcxx-ng: '>=12' - libvorbis: '>=1.3.7,<1.4.0a0' - mpg123: '>=1.32.1,<1.33.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - hash: - md5: ef1910918dd895516a769ed36b5b3a4e - sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 - category: main - optional: false - name: libsodium version: 1.0.18 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=7.5.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h516909a_1.tar.bz2 + url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2 hash: - md5: e1ca1a4b82f7b51b29318f80cebae84a - sha256: 86e0ef59cbec7e68e372b3380f5809669968d3f674a9b8f2f76f7059c83b4ad1 + md5: c3788462a6fbddafdb413a9f9053e58d + sha256: 53da0c8b79659df7b53eebdb80783503ce72fb4b10ed6e9e05cc0e9e4207a130 category: main optional: false - name: libsodium @@ -13512,16 +13717,16 @@ package: category: main optional: false - name: libsqlite - version: 3.45.2 + version: 3.45.3 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda hash: - md5: 866983a220e27a80cb75e85cb30466a1 - sha256: 8cdbeb7902729e319510a82d7c642402981818702b58812af265ef55d1315473 + md5: b3316cbe90249da4f8e84cd66e1cc55b + sha256: e2273d6860eadcf714a759ffb6dc24a69cfd01f2a0ea9d6c20f86049b9334e0c category: main optional: false - name: libsqlite @@ -13537,15 +13742,15 @@ package: category: main optional: false - name: libsqlite - version: 3.45.2 + version: 3.45.3 manager: conda platform: osx-arm64 dependencies: libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.2-h091b4b1_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda hash: - md5: 9d07427ee5bd9afd1e11ce14368a48d6 - sha256: 7c234320a1a2132b9cc972aaa06bb215bb220a5b1addb0bed7a5a321c805920e + md5: c8c1186c7f3351f6ffddb97b1f54fc58 + sha256: 4337f466eb55bbdc74e168b52ec8c38f598e3664244ec7a2536009036e2066cc category: main optional: false - name: libssh2 @@ -13599,24 +13804,6 @@ package: sha256: a56c5b11f1e73a86e120e6141a42d9e935a99a2098491ac9e15347a1476ce777 category: main optional: false -- name: libsystemd0 - version: '255' - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libcap: '>=2.69,<2.70.0a0' - libgcc-ng: '>=12' - libgcrypt: '>=1.10.3,<2.0a0' - lz4-c: '>=1.9.3,<1.10.0a0' - xz: '>=5.2.6,<6.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda - hash: - md5: 3366af27f0b593544a6cd453c7932ac5 - sha256: af27b0d225435d03f378a119f8eab6b280c53557a3c84cdb3bb8fd3167615aed - category: main - optional: false - name: libthrift version: 0.19.0 manager: conda @@ -13728,17 +13915,23 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' + cudatoolkit: '>=11.8,<12' + cudnn: '>=8.8.0.121,<9.0a0' libcblas: '>=3.9.0,<4.0a0' libgcc-ng: '>=12' + libmagma: '>=2.7.2,<2.7.3.0a0' + libmagma_sparse: '>=2.7.2,<2.7.3.0a0' libprotobuf: '>=4.24.4,<4.24.5.0a0' libstdcxx-ng: '>=12' libuv: '>=1.46.0,<2.0a0' + magma: '>=2.7.2,<2.7.3.0a0' mkl: '>=2023.2.0,<2024.0a0' + nccl: '>=2.19.4.1,<3.0a0' sleef: '>=3.5.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.1.2-cpu_mkl_hadc400e_100.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.1.2-cuda118_h3d7bd98_300.conda hash: - md5: 54f228509c64d8de523ee6ab19e5f3e9 - sha256: e904bb9260816595e34c5fed07ce8d1ae5572bce36c283425fbec0bddcd3ce88 + md5: 19f2c0ac4037db9622363dbdcdd21df0 + sha256: 80c47ee854a10b028841f581c8651b85ed2453d086b8a8a784326606bbb7a945 category: main optional: false - name: libutf8proc @@ -13821,20 +14014,6 @@ package: sha256: 60bed2a7a85096387ab0381cbc32ea2da7f8dd99bd90e440983019c0cdd96ad1 category: main optional: false -- name: libvorbis - version: 1.3.7 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=7.5.0' - libogg: '>=1.3.2,<1.4.0a0' - libstdcxx-ng: '>=7.5.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-he1b5a44_0.tar.bz2 - hash: - md5: de5b60f584a98d397cc589fcabfa3889 - sha256: 7ad72b75a143ea0bbd72f088b6150db9de66f0c2f25e5745e96aca0a16918d7f - category: main - optional: false - name: libvorbis version: 1.3.7 manager: conda @@ -13903,10 +14082,10 @@ package: platform: linux-64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda hash: - md5: 30de3fd9b3b602f7473f30e684eeea8c - sha256: 68764a760fa81ef35dacb067fe8ace452bbb41476536a4a147a1051df29525f0 + md5: 049b7df8bae5e184d1de42cdf64855f8 + sha256: c230e238646d0481851a44086767581cf7e112f27e97bb1c0b89175a079d961d category: main optional: false - name: libwebp-base @@ -13925,10 +14104,10 @@ package: manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-hb547adb_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-h93a5062_1.conda hash: - md5: 85dbc11098cdbe4244cd73f29a3ab795 - sha256: a159b848193043fb58465ae6a449361615dadcf27babfe0b18db2bd3eb59e958 + md5: ce4e2ea0aa859a8796b1437fe5cb07ed + sha256: 4336a22660ba77e9d2f5940ba184a85bb1da1b2f5488ba11b486dceca0b39aa1 category: main optional: false - name: libxcb @@ -13986,23 +14165,6 @@ package: sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c category: main optional: false -- name: libxkbcommon - version: 1.7.0 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' - libxml2: '>=2.12.6,<3.0a0' - xkeyboard-config: '' - xorg-libxau: '>=1.0.11,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda - hash: - md5: b32c0da42b1f24a98577bb3d7fc0b995 - sha256: 3d97d7f964237f42452295d461afdbc51e93f72e2c80be516f56de80e3bb6621 - category: main - optional: false - name: libxml2 version: 2.12.6 manager: conda @@ -14013,10 +14175,10 @@ package: libiconv: '>=1.17,<2.0a0' libzlib: '>=1.2.13,<1.3.0a0' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda hash: - md5: 6853448e9ca1cfd5f15382afd2a6d123 - sha256: c0bd693bb1a7e5aba388a0c79be16ff92e2411e03aaa920f94b4b33bf099e254 + md5: 9a3a42df8a95f65334dfc7b80da1195d + sha256: 0fd41df7211aae04f492c8550ce10238e8cfa8b1abebc2215a983c5e66d284ea category: main optional: false - name: libxml2 @@ -14043,10 +14205,10 @@ package: libiconv: '>=1.17,<2.0a0' libzlib: '>=1.2.13,<1.3.0a0' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_2.conda hash: - md5: c08526c957192192e1e7b4f622761144 - sha256: f18775ca8494ead5451d4acfc53fa7ebf7a8b5ed04c43bcc50fab847c9780cb3 + md5: 27577d561de7659487b062c363d8a527 + sha256: a5c10af641d6accf3effb3c3a3c594d931bb374f9e3e796719f3ecf769cfb0fc category: main optional: false - name: libzip @@ -14127,16 +14289,16 @@ package: category: main optional: false - name: llvm-openmp - version: 18.1.2 + version: 18.1.3 manager: conda platform: linux-64 dependencies: libzlib: '>=1.2.13,<1.3.0a0' zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.2-h4dfa4b3_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.3-h4dfa4b3_0.conda hash: - md5: 0118c8a03e3dbbb6b348ef71e94ac7af - sha256: a27691201ccf157e7b53390f29f66469957302a05abb22a6b6d6701673bba3bb + md5: d39965123dffcad4d750989be65bcb7c + sha256: 68f77d42fd748a51549b8ce47a5a6e51a3773284ebd5c2769f6e0c0643b1e971 category: main optional: false - name: llvm-openmp @@ -14151,14 +14313,14 @@ package: category: main optional: false - name: llvm-openmp - version: 18.1.2 + version: 18.1.3 manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.2-hcd81f8e_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda hash: - md5: 34646dc152f3949a2f8a67136d406dce - sha256: 2ed8ae5a4c6122d542564a9bb9d4961ed7d2fb9581f0ea8bd81e3a83e614b110 + md5: 24cbf1fb1b83056f8ba1beaac0619bf8 + sha256: 4cb4eadd633669496ed70c580c965f5f2ed29336890636c61a53e9c1c1541073 category: main optional: false - name: locket @@ -14307,8 +14469,23 @@ package: dependencies: {} url: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h642e427_1000.tar.bz2 hash: - md5: ddab5f96f5573a9bd5e24f9994fd6ec9 - sha256: ae029e5c16893071d29a11ddbfdbdb01b2ebf10d1785f54370934439d8b71817 + md5: ddab5f96f5573a9bd5e24f9994fd6ec9 + sha256: ae029e5c16893071d29a11ddbfdbdb01b2ebf10d1785f54370934439d8b71817 + category: main + optional: false +- name: magma + version: 2.7.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17' + cudatoolkit: '>=11.8,<12' + libmagma: '>=2.7.2,<2.7.3.0a0' + libmagma_sparse: 2.7.2 + url: https://conda.anaconda.org/conda-forge/linux-64/magma-2.7.2-h4aca40b_3.conda + hash: + md5: fe218300f1dfb9fbedbd210b3b9e020e + sha256: 9e3240a60a16269c986bcd3d1bee9e35cf81a843ff33b68ee6a2a1e7cbb7fd1c category: main optional: false - name: makefun @@ -14348,17 +14525,17 @@ package: category: main optional: false - name: mako - version: 1.3.2 + version: 1.3.3 manager: conda platform: linux-64 dependencies: importlib-metadata: '' markupsafe: '>=0.9.2' python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.3-pyhd8ed1ab_0.conda hash: - md5: a6b5f0124bc6d061350edd6d7f96dd05 - sha256: 5f21876a83bcc040196d7f3950d576eb492bf0f6293eacd55e48e2c58a069bce + md5: c622cbc0c7c98fab3526f6c92707d754 + sha256: c2b3b57b4a6715501cbac306c329fe271c194cf63fbb50ff5d40db78623a6d93 category: main optional: false - name: mako @@ -14376,17 +14553,17 @@ package: category: main optional: false - name: mako - version: 1.3.2 + version: 1.3.3 manager: conda platform: osx-arm64 dependencies: importlib-metadata: '' python: '>=3.6' markupsafe: '>=0.9.2' - url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.3-pyhd8ed1ab_0.conda hash: - md5: a6b5f0124bc6d061350edd6d7f96dd05 - sha256: 5f21876a83bcc040196d7f3950d576eb492bf0f6293eacd55e48e2c58a069bce + md5: c622cbc0c7c98fab3526f6c92707d754 + sha256: c2b3b57b4a6715501cbac306c329fe271c194cf63fbb50ff5d40db78623a6d93 category: main optional: false - name: mapclassify @@ -14606,12 +14783,11 @@ package: platform: linux-64 dependencies: marshmallow: '>=2.0.0' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/marshmallow-enum-1.5.1-py39hde42818_2.tar.bz2 + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/marshmallow-enum-1.5.1-pyh9f0ad1d_3.tar.bz2 hash: - md5: cf3771b0c8d7662dff2212b4db9dd27b - sha256: 3fbc341d3a4dc6a5fa8063b19330a6e598f2832c86f74924453a8511869d2624 + md5: 67c5202bf14543cd1bb97f129d3f26dd + sha256: 7729d878c2129d691e86b81fce346320a0152a6bbfc862a8c12ec646763f4857 category: main optional: false - name: marshmallow-enum @@ -14720,7 +14896,7 @@ package: category: main optional: false - name: matplotlib-base - version: 3.8.3 + version: 3.8.4 manager: conda platform: linux-64 dependencies: @@ -14741,10 +14917,10 @@ package: python-dateutil: '>=2.7' python_abi: 3.9.* tk: '>=8.6.13,<8.7.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39he9076e7_0.conda hash: - md5: 5456bdfe5809ebf5689eda6c808b686e - sha256: 6a430a5816f189b7277182b6c251236c5af22e254b8253eeb6ffcb06a8ea7087 + md5: 1919384a8420e7bb25f6c3a582e0857c + sha256: 20fa30a3c683a78975114f7132e1e0db3def81a3cf1952078f0da18ce533fc2b category: main optional: false - name: matplotlib-base @@ -14775,7 +14951,7 @@ package: category: main optional: false - name: matplotlib-base - version: 3.8.3 + version: 3.8.4 manager: conda platform: osx-arm64 dependencies: @@ -14794,23 +14970,23 @@ package: python: '>=3.9,<3.10.0a0' python-dateutil: '>=2.7' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.3-py39hbab7938_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.4-py39hbab7938_0.conda hash: - md5: c8a05fdf66e3f0bfc087d29461da56e5 - sha256: 698ac01f950fb5646275c94c2719782e3a77d26164a5491c4ad4dfc6d9be1b71 + md5: 95750a5aeb81a136d204e2747de59a18 + sha256: cb9e48efec82ca08b04251f18300f20c5f8d6656ba0c4c9f181202bb34de2361 category: main optional: false - name: matplotlib-inline - version: 0.1.6 + version: 0.1.7 manager: conda platform: linux-64 dependencies: python: '>=3.6' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda hash: - md5: b21613793fcc81d944c76c9f2864a7de - sha256: aa091b88aec55bfa2d9207028d8cdc689b9efb090ae27b99557e93c675be2f3c + md5: 779345c95648be40d22aaa89de7d4254 + sha256: 7ea68676ea35fbb095420bbcc1c82c4767b8be7bb56abb6989b7f89d957a3bab category: main optional: false - name: matplotlib-inline @@ -14827,16 +15003,16 @@ package: category: main optional: false - name: matplotlib-inline - version: 0.1.6 + version: 0.1.7 manager: conda platform: osx-arm64 dependencies: traitlets: '' python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda hash: - md5: b21613793fcc81d944c76c9f2864a7de - sha256: aa091b88aec55bfa2d9207028d8cdc689b9efb090ae27b99557e93c675be2f3c + md5: 779345c95648be40d22aaa89de7d4254 + sha256: 7ea68676ea35fbb095420bbcc1c82c4767b8be7bb56abb6989b7f89d957a3bab category: main optional: false - name: mdit-py-plugins @@ -15079,44 +15255,32 @@ package: category: main optional: false - name: mlflow - version: 2.7.0 + version: 2.12.1 manager: conda platform: linux-64 dependencies: alembic: <2,!=1.10 - click: '>=7.0,<9' - cloudpickle: <3 - databricks-cli: '>=0.8.7,<1' - docker-py: '>=4.0.0,<7' - entrypoints: <1 - flask: <3 - gitpython: '>=2.1.0,<4' + docker-py: '>=4.0.0,<8' + flask: <4 + graphene: <4 gunicorn: <22 - importlib-metadata: <7,>=3.7.0,!=4.7.0 jinja2: <4,>=2.11 markdown: <4,>=3.3 matplotlib-base: <4 + mlflow-ui: 2.12.1 numpy: <2 - openssl: '' - packaging: <24 pandas: <3 prometheus_flask_exporter: <1 - protobuf: '>=3.12.0,<5' - pyarrow: <14,>=4.0.0 - python: '>=3.9,<3.10.0a0' + pyarrow: <16,>=4.0.0 python_abi: 3.9.* - pytz: <2024 - pyyaml: '>=5.1,<7' querystring_parser: <2 - requests: '>=2.17.3,<3' scikit-learn: <2 scipy: <2 sqlalchemy: '>=1.4.0,<3' - sqlparse: '>=0.4.0,<1' - url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-2.7.0-py39ha39b057_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-2.12.1-hf3d152e_0.conda hash: - md5: e648a19e6574b337e7f3e50845c05421 - sha256: 8c973c4dfe492f7141c0ba9513e273ed31cf51f80b173d3f0f7c6f681914c7e7 + md5: 1e3f832d3843b750c8f5831e2006a8ce + sha256: 3de297846e3471e67cfb4307e28f3ff6a9a17fa636a8fcce9a144fa8b587520f category: main optional: false - name: mlflow @@ -15161,58 +15325,129 @@ package: category: main optional: false - name: mlflow - version: 2.7.0 + version: 2.12.1 manager: conda platform: osx-arm64 dependencies: alembic: <2,!=1.10 - click: '>=7.0,<9' - cloudpickle: <3 - databricks-cli: '>=0.8.7,<1' - docker-py: '>=4.0.0,<7' - entrypoints: <1 - flask: <3 - gitpython: '>=2.1.0,<4' + docker-py: '>=4.0.0,<8' + flask: <4 + graphene: <4 gunicorn: <22 - importlib-metadata: <7,>=3.7.0,!=4.7.0 jinja2: <4,>=2.11 markdown: <4,>=3.3 matplotlib-base: <4 + mlflow-ui: 2.12.1 numpy: <2 - openssl: '' - packaging: <24 pandas: <3 prometheus_flask_exporter: <1 - protobuf: '>=3.12.0,<5' - pyarrow: <14,>=4.0.0 + pyarrow: <16,>=4.0.0 python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - pytz: <2024 - pyyaml: '>=5.1,<7' querystring_parser: <2 - requests: '>=2.17.3,<3' scikit-learn: <2 scipy: <2 sqlalchemy: '>=1.4.0,<3' + url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-2.12.1-py39h2804cbe_0.conda + hash: + md5: 6f4f101ca12497a50cfced6bc6683f1f + sha256: c45d8cb30636f63982e365aa7d756f3792f688aee4b5ce775720449ca884ed48 + category: main + optional: false +- name: mlflow-skinny + version: 2.12.1 + manager: conda + platform: linux-64 + dependencies: + click: '>=7.0,<9' + cloudpickle: <4 + entrypoints: <1 + gitpython: '>=2.1.0,<4' + importlib-metadata: <8,>=3.7.0,!=4.7.0 + packaging: <25 + protobuf: '>=3.12.0,<6' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + pytz: <2025 + pyyaml: '>=5.1,<7' + requests: '>=2.17.3,<3' + sqlparse: '>=0.4.0,<1' + url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-skinny-2.12.1-py39hf3d152e_0.conda + hash: + md5: 4f14af5afcc79600aeb0ab9d4044668a + sha256: 9ee691fb4c2193a87d0aa8d19a50881a944d9726adf52ba02861f92fc5f05420 + category: main + optional: false +- name: mlflow-skinny + version: 2.12.1 + manager: conda + platform: osx-arm64 + dependencies: + click: '>=7.0,<9' + cloudpickle: <4 + entrypoints: <1 + gitpython: '>=2.1.0,<4' + importlib-metadata: <8,>=3.7.0,!=4.7.0 + packaging: <25 + protobuf: '>=3.12.0,<6' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + pytz: <2025 + pyyaml: '>=5.1,<7' + requests: '>=2.17.3,<3' sqlparse: '>=0.4.0,<1' - url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-2.7.0-py39h3c3ad29_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-skinny-2.12.1-py39h2804cbe_0.conda + hash: + md5: df4b64065cacb16e804876f117e3425e + sha256: ead5fb6c59820c124105359bb0692b7e63fd3d796fcb0a24059b0261ba8a2793 + category: main + optional: false +- name: mlflow-ui + version: 2.12.1 + manager: conda + platform: linux-64 + dependencies: + flask: <4 + gunicorn: <22 + mlflow-skinny: 2.12.1 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + querystring_parser: <2 + url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-ui-2.12.1-py39hf3d152e_0.conda + hash: + md5: 3b5e099d047a795249bc9712927dd788 + sha256: dd8fbc2f3cb3133c0811f3529700877a111703c1b5a0a24d5ea21673520b0c20 + category: main + optional: false +- name: mlflow-ui + version: 2.12.1 + manager: conda + platform: osx-arm64 + dependencies: + flask: <4 + gunicorn: <22 + mlflow-skinny: 2.12.1 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + querystring_parser: <2 + url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-ui-2.12.1-py39h2804cbe_0.conda hash: - md5: 669b33b508bd24330f169b452c92b2be - sha256: cf668816112d69cd77d36fcaae06d0ca6c7a9a842e2d96eec8defd9931e71d71 + md5: b1529f9ae07a996ecf2e7ce341d34dfe + sha256: 03ca55292d3aca340f38d8575b1bba5ef24ac75986a47a775fd8e0549da0f8ec category: main optional: false - name: modin - version: 0.28.0 + version: 0.29.0 manager: conda platform: linux-64 dependencies: - modin-dask: 0.28.0 + modin-dask: 0.29.0 python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/modin-0.28.0-py39hf3d152e_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/modin-0.29.0-py39hf3d152e_0.conda hash: - md5: 690520f01db06a532051adca1206c3de - sha256: 6e99d2506b6943549283b7e48f1e529c085ac9b5ef52b2e617efb2ea20e6562a + md5: ba4f037e8302a4ce188cea057b98807c + sha256: ec0f933769e958f902602c0ae05c7d829524af905833e75ff21d0fd5ce608f2c category: main optional: false - name: modin @@ -15230,21 +15465,21 @@ package: category: main optional: false - name: modin - version: 0.28.0 + version: 0.29.0 manager: conda platform: osx-arm64 dependencies: - modin-dask: 0.28.0 + modin-dask: 0.29.0 python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/modin-0.28.0-py39hdf13c20_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/modin-0.29.0-py39hdf13c20_0.conda hash: - md5: 2c0aa1fd11be5bf5b1bdbc915e0b9e40 - sha256: 9d886effb42c46ef14cb266e9b99853312ddabed3ada104dd30539e165f70932 + md5: 496f22b783c523ee11c695f3adc35a36 + sha256: 7c9eefb75bdbf4bc09c8a42158843ba02f78bdbe26383d39bf205ef79e4a7992 category: main optional: false - name: modin-core - version: 0.28.0 + version: 0.29.0 manager: conda platform: linux-64 dependencies: @@ -15255,10 +15490,10 @@ package: psutil: '>=5.8.0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/modin-core-0.28.0-py39hf3d152e_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/modin-core-0.29.0-py39hf3d152e_0.conda hash: - md5: 88880e1fc6ba6b759e7d0429fed741f8 - sha256: c9fbb625f88191618fd9cd8b9c4ba7b490a12c87b283bc1115d34b698190f4c7 + md5: 50cfcc3199a3a5431aca258e29850a93 + sha256: d67a4ffe0fc6bc6c7212b7efdbe1ce6244f8edc367dcdba1ccb62b2e4d391c70 category: main optional: false - name: modin-core @@ -15280,7 +15515,7 @@ package: category: main optional: false - name: modin-core - version: 0.28.0 + version: 0.29.0 manager: conda platform: osx-arm64 dependencies: @@ -15291,26 +15526,26 @@ package: psutil: '>=5.8.0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/modin-core-0.28.0-py39h2804cbe_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/modin-core-0.29.0-py39h2804cbe_0.conda hash: - md5: d378d3a53862f2adb93bd6873bf2d0d0 - sha256: 426aba167d8b471578ee94fedfa72c19c7275bc305116e38613597ead256e61e + md5: f09f52fe83f4be8c786dd43fa3937595 + sha256: fee3af3426d064348a78e0cef8844252761b830891067c27e39bd16d133a6b89 category: main optional: false - name: modin-dask - version: 0.28.0 + version: 0.29.0 manager: conda platform: linux-64 dependencies: dask: '>=2.22.0' distributed: '>=2.22.0' - modin-core: 0.28.0 + modin-core: 0.29.0 python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/modin-dask-0.28.0-py39hf3d152e_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/modin-dask-0.29.0-py39hf3d152e_0.conda hash: - md5: 16ab25beae69cde03b76e72f061d2bf6 - sha256: 97c4ba6e462c1dd227bd1cf1e3af156ba7eb2136e31db40832650c117d9e9ec2 + md5: 571303a77ae2dea12b45c104764679a8 + sha256: 9efc71aed46bc7c0544014be9a7dc1d3f9c2a398af55b3cb41369434b6fb3962 category: main optional: false - name: modin-dask @@ -15330,19 +15565,19 @@ package: category: main optional: false - name: modin-dask - version: 0.28.0 + version: 0.29.0 manager: conda platform: osx-arm64 dependencies: dask: '>=2.22.0' distributed: '>=2.22.0' - modin-core: 0.28.0 + modin-core: 0.29.0 python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/modin-dask-0.28.0-py39hdf13c20_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/modin-dask-0.29.0-py39hdf13c20_0.conda hash: - md5: f82af6f891bd9e583c2cdfef3ffe599b - sha256: 3902dd09fee2184faeb98ed87942a5db64e53736959a03e048aae6b5e82aa157 + md5: fb9583a40ffbdef615984ba67b36c1f7 + sha256: 496782ad8986a3c0b8f83a1c0d739a1d7478c99d68082a79e7473315f69a58fc category: main optional: false - name: more-itertools @@ -15426,12 +15661,12 @@ package: manager: conda platform: linux-64 dependencies: - gmp: '>=6.2.1,<7.0a0' + gmp: '>=6.3.0,<7.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_1.conda hash: - md5: 4c28f3210b30250037a4a627eeee9e0f - sha256: 008230a53ff15cf61966476b44f7ba2c779826825b9ca639a0a2b44d8f7aa6cb + md5: 8083b20f566639c22f78bcd6ca35b276 + sha256: 38c501f6b8dff124e57711c01da23e204703a3c14276f4cf6abd28850b2b9893 category: main optional: false - name: mpfr @@ -15451,24 +15686,11 @@ package: manager: conda platform: osx-arm64 dependencies: - gmp: '>=6.2.1,<7.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-h9546428_0.conda - hash: - md5: a0d56e1ff4ac1babc2e95516aeba7d24 - sha256: 811ca63177cf638ac01442fc8d1148d3a0cef18dc1f870fceed1feb24be6fd8f - category: main - optional: false -- name: mpg123 - version: 1.32.4 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda + gmp: '>=6.3.0,<7.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-h41d338b_1.conda hash: - md5: 3f1017b4141e943d9bc8739237f749e8 - sha256: 512f4ad7eda3b2c9a1cc9f7931932aefa6e79567e35b76de03895e769cb3b43c + md5: 616d9bb6983991de582589b9a06e4cea + sha256: a0b183cdf8bd1f2462d965f7a065cbfc32669d95bb6c8f970f7c7f63d2938436 category: main optional: false - name: mpmath @@ -15842,20 +16064,6 @@ package: sha256: f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3 category: main optional: false -- name: mysql-common - version: 8.0.33 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - openssl: '>=3.1.4,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_6.conda - hash: - md5: 80bf3b277c120dd294b51d404b931a75 - sha256: c8b2c5c9d0d013a4f6ef96cb4b339bfdc53a74232d8c61ed08178e5b1ec4eb63 - category: main - optional: false - name: mysql-common version: 8.0.33 manager: conda @@ -15870,23 +16078,6 @@ package: sha256: b6b18aeed435d4075b4aac3559a070a6caa5a174a339e8de87785fca2f8f57a6 category: main optional: false -- name: mysql-libs - version: 8.0.33 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' - mysql-common: 8.0.33 - openssl: '>=3.1.4,<4.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_6.conda - hash: - md5: e87530d1b12dd7f4e0f856dc07358d60 - sha256: 78c905637dac79b197395065c169d452b8ca2a39773b58e45e23114f1cb6dcdb - category: main - optional: false - name: mysql-libs version: 8.0.33 manager: conda @@ -16082,10 +16273,10 @@ package: dependencies: nbconvert-core: 7.16.3 nbconvert-pandoc: 7.16.3 - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.3-hd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.3-hd8ed1ab_1.conda hash: - md5: b0c9bbbe54a11a6db3bec51eb0ef0281 - sha256: c9bb08085ba1508607cd1ba839a31f1164e3ed15f4e499a490b71721d1df7ec5 + md5: c80cd9bcb93679ceb9ea0938cf5f7db0 + sha256: 03f1b45a9860217a58c077a38e65abc27360868cb498e30d19cdbd1011c79874 category: main optional: false - name: nbconvert @@ -16108,10 +16299,10 @@ package: dependencies: nbconvert-core: 7.16.3 nbconvert-pandoc: 7.16.3 - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.3-hd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.3-hd8ed1ab_1.conda hash: - md5: b0c9bbbe54a11a6db3bec51eb0ef0281 - sha256: c9bb08085ba1508607cd1ba839a31f1164e3ed15f4e499a490b71721d1df7ec5 + md5: c80cd9bcb93679ceb9ea0938cf5f7db0 + sha256: 03f1b45a9860217a58c077a38e65abc27360868cb498e30d19cdbd1011c79874 category: main optional: false - name: nbconvert-core @@ -16136,10 +16327,10 @@ package: python: '>=3.8' tinycss2: '' traitlets: '>=5.0' - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.3-pyhd8ed1ab_1.conda hash: - md5: 0cab42b4917e71df9dc2224b9940ef19 - sha256: 522d28206fbafa634763da1ae9119a9edd141d8c516ed13878f77b67921e1bb5 + md5: 2f34a65aee1d1f354e701d166413783a + sha256: b86ab6e91bb0b25a1bc12f3ff2e332f481ff8ad9c835724c86f1adf98b913733 category: main optional: false - name: nbconvert-core @@ -16192,10 +16383,10 @@ package: pygments: '>=2.4.1' nbclient: '>=0.5.0' mistune: '>=2.0.3,<4' - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.3-pyhd8ed1ab_1.conda hash: - md5: 0cab42b4917e71df9dc2224b9940ef19 - sha256: 522d28206fbafa634763da1ae9119a9edd141d8c516ed13878f77b67921e1bb5 + md5: 2f34a65aee1d1f354e701d166413783a + sha256: b86ab6e91bb0b25a1bc12f3ff2e332f481ff8ad9c835724c86f1adf98b913733 category: main optional: false - name: nbconvert-pandoc @@ -16205,10 +16396,10 @@ package: dependencies: nbconvert-core: 7.16.3 pandoc: '' - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.3-hd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.3-hd8ed1ab_1.conda hash: - md5: 1344bbd74e8bcd1acdd8ec0824e9840c - sha256: d22ef91db4ca9592860168499b4d6e5443eca0176190431321ee78ef9cc977df + md5: 105151637d2223d6274c5c79d839cc64 + sha256: ec4ce4efc6e4db87ff1d1deca0a0c71a3aea048a52931344db8944d0bc8a05eb category: main optional: false - name: nbconvert-pandoc @@ -16231,26 +16422,26 @@ package: dependencies: pandoc: '' nbconvert-core: 7.16.3 - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.3-hd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.3-hd8ed1ab_1.conda hash: - md5: 1344bbd74e8bcd1acdd8ec0824e9840c - sha256: d22ef91db4ca9592860168499b4d6e5443eca0176190431321ee78ef9cc977df + md5: 105151637d2223d6274c5c79d839cc64 + sha256: ec4ce4efc6e4db87ff1d1deca0a0c71a3aea048a52931344db8944d0bc8a05eb category: main optional: false - name: nbformat - version: 5.10.3 + version: 5.10.4 manager: conda platform: linux-64 dependencies: jsonschema: '>=2.6' - jupyter_core: '' + jupyter_core: '>=4.12,!=5.0.*' python: '>=3.8' - python-fastjsonschema: '' + python-fastjsonschema: '>=2.15' traitlets: '>=5.1' - url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda hash: - md5: ca3d437c0ef2e87f63d085822c74c49a - sha256: 774ba7f0f175851723d9e1524ca5246b431eca1b1e22387b58a80ad0dcd7acd8 + md5: 0b57b5368ab7fc7cdc9e3511fa867214 + sha256: 36fe73da4d37bc7ac2d1540526ecd294fbd09acda04e096181ab8f1ccd2b464c category: main optional: false - name: nbformat @@ -16270,19 +16461,33 @@ package: category: main optional: false - name: nbformat - version: 5.10.3 + version: 5.10.4 manager: conda platform: osx-arm64 dependencies: - jupyter_core: '' - python-fastjsonschema: '' python: '>=3.8' + jupyter_core: '>=4.12,!=5.0.*' traitlets: '>=5.1' jsonschema: '>=2.6' - url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + python-fastjsonschema: '>=2.15' + url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda hash: - md5: ca3d437c0ef2e87f63d085822c74c49a - sha256: 774ba7f0f175851723d9e1524ca5246b431eca1b1e22387b58a80ad0dcd7acd8 + md5: 0b57b5368ab7fc7cdc9e3511fa867214 + sha256: 36fe73da4d37bc7ac2d1540526ecd294fbd09acda04e096181ab8f1ccd2b464c + category: main + optional: false +- name: nccl + version: 2.21.5.1 + manager: conda + platform: linux-64 + dependencies: + cuda-version: '>=11.8,<12.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.21.5.1-h6103f9b_0.conda + hash: + md5: 05381b62b2faed9609fb68b27cd575aa + sha256: 64d0992b9e442f6e92c0fed7584c68bf48d43c741bb589d4afee450d41f805ca category: main optional: false - name: ncurses @@ -16442,7 +16647,7 @@ package: category: main optional: false - name: notebook - version: 7.1.2 + version: 7.1.3 manager: conda platform: linux-64 dependencies: @@ -16452,10 +16657,10 @@ package: notebook-shim: '>=0.2,<0.3' python: '>=3.8' tornado: '>=6.2.0' - url: https://conda.anaconda.org/conda-forge/noarch/notebook-7.1.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/notebook-7.1.3-pyhd8ed1ab_0.conda hash: - md5: fa781da51f05c9211b75b5e7bcff8136 - sha256: ed5987efcf3a394c4ab12288b4fe7d858784aabc591cebf3dabcd1cdbc7b7347 + md5: a4b1e12d54210fa80f3eb3fc270f2480 + sha256: 8ae08577df126ee1d583dcde59708928cca04ae405b1f38610a4bd44287f0e8e category: main optional: false - name: notebook @@ -16476,7 +16681,7 @@ package: category: main optional: false - name: notebook - version: 7.1.2 + version: 7.1.3 manager: conda platform: osx-arm64 dependencies: @@ -16486,10 +16691,10 @@ package: jupyterlab_server: '>=2.22.1,<3' notebook-shim: '>=0.2,<0.3' jupyterlab: '>=4.1.1,<4.2' - url: https://conda.anaconda.org/conda-forge/noarch/notebook-7.1.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/notebook-7.1.3-pyhd8ed1ab_0.conda hash: - md5: fa781da51f05c9211b75b5e7bcff8136 - sha256: ed5987efcf3a394c4ab12288b4fe7d858784aabc591cebf3dabcd1cdbc7b7347 + md5: a4b1e12d54210fa80f3eb3fc270f2480 + sha256: 8ae08577df126ee1d583dcde59708928cca04ae405b1f38610a4bd44287f0e8e category: main optional: false - name: notebook-shim @@ -16818,7 +17023,7 @@ package: category: main optional: false - name: openai - version: 1.14.3 + version: 1.23.1 manager: conda platform: linux-64 dependencies: @@ -16830,10 +17035,10 @@ package: sniffio: '' tqdm: '>4' typing-extensions: '>=4.7,<5' - url: https://conda.anaconda.org/conda-forge/noarch/openai-1.14.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/openai-1.23.1-pyhd8ed1ab_0.conda hash: - md5: 0c216c2228d136632cc7e19097f7aaac - sha256: 5d919b945556b42ad2d86e0a585ed95353baf1571ab5c95e97f86fe1fa80e138 + md5: 5d305543d3104015029feb7d0b342a8e + sha256: 26bd531f03a305b1336edb0f1071d1527ad9e7ab0c08b26869cd196fc795aa9c category: main optional: false - name: openai @@ -16856,7 +17061,7 @@ package: category: main optional: false - name: openai - version: 1.14.3 + version: 1.23.1 manager: conda platform: osx-arm64 dependencies: @@ -16868,10 +17073,10 @@ package: tqdm: '>4' anyio: '>=3.5.0,<5' typing-extensions: '>=4.7,<5' - url: https://conda.anaconda.org/conda-forge/noarch/openai-1.14.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/openai-1.23.1-pyhd8ed1ab_0.conda hash: - md5: 0c216c2228d136632cc7e19097f7aaac - sha256: 5d919b945556b42ad2d86e0a585ed95353baf1571ab5c95e97f86fe1fa80e138 + md5: 5d305543d3104015029feb7d0b342a8e + sha256: 26bd531f03a305b1336edb0f1071d1527ad9e7ab0c08b26869cd196fc795aa9c category: main optional: false - name: openjpeg @@ -17006,7 +17211,7 @@ package: libstdcxx-ng: '>=12' libzlib: '>=1.2.13,<1.3.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - snappy: '>=1.1.10,<2.0a0' + snappy: '>=1.1.10,<1.2.0a0' zstd: '>=1.5.5,<1.6.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/orc-1.9.2-h4b38347_0.conda hash: @@ -17042,7 +17247,7 @@ package: libprotobuf: '>=4.24.4,<4.24.5.0a0' libzlib: '>=1.2.13,<1.3.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - snappy: '>=1.1.10,<2.0a0' + snappy: '>=1.1.10,<1.2.0a0' zstd: '>=1.5.5,<1.6.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/orc-1.9.2-h7c018df_0.conda hash: @@ -17090,15 +17295,15 @@ package: category: main optional: false - name: packaging - version: '23.2' + version: '24.0' manager: conda platform: linux-64 dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda hash: - md5: 79002079284aa895f883c6b7f3f88fd6 - sha256: 69b3ace6cca2dab9047b2c24926077d81d236bef45329d264b394001e3c3e52f + md5: 248f521b64ce055e7feae3105e7abeb8 + sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a category: main optional: false - name: packaging @@ -17114,19 +17319,19 @@ package: category: main optional: false - name: packaging - version: '23.2' + version: '24.0' manager: conda platform: osx-arm64 dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda hash: - md5: 79002079284aa895f883c6b7f3f88fd6 - sha256: 69b3ace6cca2dab9047b2c24926077d81d236bef45329d264b394001e3c3e52f + md5: 248f521b64ce055e7feae3105e7abeb8 + sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a category: main optional: false - name: pandas - version: 2.2.1 + version: 2.2.2 manager: conda platform: linux-64 dependencies: @@ -17138,10 +17343,10 @@ package: python-tzdata: '>=2022a' python_abi: 3.9.* pytz: '>=2020.1' - url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py39hddac248_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py39hddac248_0.conda hash: - md5: 85293a042c24a08e71b7608ee66b6134 - sha256: 91a2f8062d905f65548a5f3e9cf91e4acd70ac151d9e9fcbb32af9980643c1d7 + md5: 259c4e76e6bda8888aefc098ae1ba749 + sha256: 14510984ff19843471468d2ef250e51200bd603fbf909e7bc6f1f57d02a43bea category: main optional: false - name: pandas @@ -17163,7 +17368,7 @@ package: category: main optional: false - name: pandas - version: 2.2.1 + version: 2.2.2 manager: conda platform: osx-arm64 dependencies: @@ -17174,10 +17379,10 @@ package: python-tzdata: '>=2022a' python_abi: 3.9.* pytz: '>=2020.1' - url: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.1-py39h47e51b9_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.2-py39h47e51b9_0.conda hash: - md5: be545eb72baf10c37f3ca5c974586abe - sha256: 08970c57a208e75ab99312ef27401ad76399669f2cc4bb3b5850ea21560393cb + md5: 5c4d68b2806d00c0a3607d77c7fb6a0d + sha256: 283f3d212548adead03bf32d18b350954e853c990e0571e35a7d740e553709f1 category: main optional: false - name: pandera @@ -17277,14 +17482,14 @@ package: category: main optional: false - name: pandoc - version: 3.1.12.3 + version: 3.1.13 manager: conda platform: linux-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.1.12.3-ha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.1.13-ha770c72_0.conda hash: - md5: cdea66892b19a454f939487318b6c517 - sha256: 26bfcda675fbddd059a8861dc75b9e497980ec6c679ec2a27e7d74042c4b295b + md5: 9105ee57dc4869bc5d1876b531202676 + sha256: b3c237a3ccfde48b28a9f9e3d27e6a75718be6f1fba41bd20649f91fdf6b356f category: main optional: false - name: pandoc @@ -17299,14 +17504,14 @@ package: category: main optional: false - name: pandoc - version: 3.1.12.3 + version: 3.1.13 manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.1.12.3-hce30654_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.1.13-hce30654_0.conda hash: - md5: e14b5833daffe398ea21308cb0559477 - sha256: 3bdfb8e65c7f7b050c07f5b84669024eaa38aa268195e1a804cbd20f07233fa4 + md5: c999ebdbdb15333e41e1c74e57eb56c7 + sha256: ea0e44622a0ece6aea9781c6581b700432bedfa881ac145a3de28eeec7e14272 category: main optional: false - name: pandocfilters @@ -17408,8 +17613,7 @@ package: manager: conda platform: linux-64 dependencies: - ansiwrap: '' - black: '' + aiohttp: '>=3.9,<3.10' click: '' entrypoints: '' nbclient: '>=0.2.0' @@ -17417,12 +17621,12 @@ package: python: '>=3.7' pyyaml: '' requests: '' - tenacity: '' + tenacity: '>=5.0.2' tqdm: '>=4.32.2' - url: https://conda.anaconda.org/conda-forge/noarch/papermill-2.5.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/papermill-2.5.0-pyhd8ed1ab_1.conda hash: - md5: e6e69b90afd3d0597da8f1f74cc4bd58 - sha256: c9896ec2358bf9da079ce34b986d8843ecf75f840d2d719f430b665cfa674a59 + md5: effa5bb75d544b8b7c165c7868f9612b + sha256: 67b06907b6c3e79e0a766fae1f02f3706927806a731a56ff9a74da8c22b0489f category: main optional: false - name: papermill @@ -17455,18 +17659,17 @@ package: requests: '' pyyaml: '' click: '' - black: '' entrypoints: '' - tenacity: '' - ansiwrap: '' python: '>=3.7' nbformat: '>=5.1.2' tqdm: '>=4.32.2' nbclient: '>=0.2.0' - url: https://conda.anaconda.org/conda-forge/noarch/papermill-2.5.0-pyhd8ed1ab_0.conda - hash: - md5: e6e69b90afd3d0597da8f1f74cc4bd58 - sha256: c9896ec2358bf9da079ce34b986d8843ecf75f840d2d719f430b665cfa674a59 + aiohttp: '>=3.9,<3.10' + tenacity: '>=5.0.2' + url: https://conda.anaconda.org/conda-forge/noarch/papermill-2.5.0-pyhd8ed1ab_1.conda + hash: + md5: effa5bb75d544b8b7c165c7868f9612b + sha256: 67b06907b6c3e79e0a766fae1f02f3706927806a731a56ff9a74da8c22b0489f category: main optional: false - name: paramiko @@ -17515,15 +17718,15 @@ package: category: main optional: false - name: parso - version: 0.8.3 + version: 0.8.4 manager: conda platform: linux-64 dependencies: python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda hash: - md5: 17a565a0c3899244e938cdf417e7b094 - sha256: 4e26d5daf5de0e31aa5e74ac56386a361b202433b83f024fdadbf07d4a244da4 + md5: 81534b420deb77da8833f2289b8d47ac + sha256: bfe404eebb930cc41782d34f8fc04c0388ea692eeebe2c5fc28df8ec8d4d61ae category: main optional: false - name: parso @@ -17539,15 +17742,15 @@ package: category: main optional: false - name: parso - version: 0.8.3 + version: 0.8.4 manager: conda platform: osx-arm64 dependencies: python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda hash: - md5: 17a565a0c3899244e938cdf417e7b094 - sha256: 4e26d5daf5de0e31aa5e74ac56386a361b202433b83f024fdadbf07d4a244da4 + md5: 81534b420deb77da8833f2289b8d47ac + sha256: bfe404eebb930cc41782d34f8fc04c0388ea692eeebe2c5fc28df8ec8d4d61ae category: main optional: false - name: partd @@ -17592,18 +17795,6 @@ package: sha256: b248238da2bb9dfe98e680af911dc7013af86095e3ec8baf08905555632d34c7 category: main optional: false -- name: pathspec - version: 0.12.1 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - hash: - md5: 17064acba08d3686f1135b5ec1b32b12 - sha256: 4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d - category: main - optional: false - name: pathspec version: 0.12.1 manager: conda @@ -17616,18 +17807,6 @@ package: sha256: 4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d category: main optional: false -- name: pathspec - version: 0.12.1 - manager: conda - platform: osx-arm64 - dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - hash: - md5: 17064acba08d3686f1135b5ec1b32b12 - sha256: 4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d - category: main - optional: false - name: pcre version: '8.45' manager: conda @@ -17749,12 +17928,11 @@ package: manager: conda platform: linux-64 dependencies: - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/pickleshare-0.7.5-py39hde42818_1002.tar.bz2 + python: '>=3' + url: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2 hash: - md5: 2dc9995512c80256532250a6fd616b14 - sha256: f3864a023507cda727997bcdf17baf404c98342a4dea6eb834b5e1fc9bdc388b + md5: 415f0ebb6198cc2801c73438a9fb5761 + sha256: a1ed1a094dd0d1b94a09ed85c283a0eb28943f2e6f22161fb45e128d35229738 category: main optional: false - name: pickleshare @@ -17839,7 +18017,7 @@ package: libwebp-base: '>=1.3.2,<2.0a0' libxcb: '>=1.15,<1.16.0a0' libzlib: '>=1.2.13,<1.3.0a0' - openjpeg: '>=2.5.0,<3.0a0' + openjpeg: '>=2.5.2,<3.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* tk: '>=8.6.13,<8.7.0a0' @@ -17965,16 +18143,15 @@ package: category: main optional: false - name: platformdirs - version: 3.11.0 + version: 4.2.0 manager: conda platform: linux-64 dependencies: - python: '>=3.7' - typing-extensions: '>=4.6.3' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda hash: - md5: 8f567c0a74aa44cf732f15773b4083b0 - sha256: b3d809ff5a18ee8514bba8bc05a23b4cdf1758090a18a2cf742af38aed405144 + md5: a0bc3eec34b0fab84be6b2da94e98e20 + sha256: 2ebfb971236ab825dd79dd6086ea742a9901008ffb9c6222c1f2b5172a8039d3 category: main optional: false - name: platformdirs @@ -17991,30 +18168,29 @@ package: category: main optional: false - name: platformdirs - version: 3.11.0 + version: 4.2.0 manager: conda platform: osx-arm64 dependencies: - python: '>=3.7' - typing-extensions: '>=4.6.3' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda hash: - md5: 8f567c0a74aa44cf732f15773b4083b0 - sha256: b3d809ff5a18ee8514bba8bc05a23b4cdf1758090a18a2cf742af38aed405144 + md5: a0bc3eec34b0fab84be6b2da94e98e20 + sha256: 2ebfb971236ab825dd79dd6086ea742a9901008ffb9c6222c1f2b5172a8039d3 category: main optional: false - name: plotly - version: 5.19.0 + version: 5.21.0 manager: conda platform: linux-64 dependencies: packaging: '' python: '>=3.6' tenacity: '>=6.2.0' - url: https://conda.anaconda.org/conda-forge/noarch/plotly-5.19.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/plotly-5.21.0-pyhd8ed1ab_0.conda hash: - md5: 669cd7065794633b9e64e6a9612ec700 - sha256: fa9ae81e1f304f1480378ea25d559748e061c5b8d55b3ade433c3bc483dbae9e + md5: c8f5835e6c3a850d9a000d23056d780b + sha256: 69d9b5b30b93c02cfd9cb93351cd1c377fa04dfbf82386a7231bb2525ef367f1 category: main optional: false - name: plotly @@ -18032,29 +18208,17 @@ package: category: main optional: false - name: plotly - version: 5.19.0 + version: 5.21.0 manager: conda platform: osx-arm64 dependencies: packaging: '' python: '>=3.6' tenacity: '>=6.2.0' - url: https://conda.anaconda.org/conda-forge/noarch/plotly-5.19.0-pyhd8ed1ab_0.conda - hash: - md5: 669cd7065794633b9e64e6a9612ec700 - sha256: fa9ae81e1f304f1480378ea25d559748e061c5b8d55b3ade433c3bc483dbae9e - category: main - optional: false -- name: ply - version: '3.11' - manager: conda - platform: linux-64 - dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/plotly-5.21.0-pyhd8ed1ab_0.conda hash: - md5: 7205635cd71531943440fbfe3b6b5727 - sha256: 2cd6fae8f9cbc806b7f828f006ae4a83c23fac917cacfd73c37ce322d4324e53 + md5: c8f5835e6c3a850d9a000d23056d780b + sha256: 69d9b5b30b93c02cfd9cb93351cd1c377fa04dfbf82386a7231bb2525ef367f1 category: main optional: false - name: ply @@ -18070,7 +18234,7 @@ package: category: main optional: false - name: polars - version: 0.20.17 + version: 0.20.21 manager: conda platform: linux-64 dependencies: @@ -18079,10 +18243,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* typing_extensions: '>=4.0.0' - url: https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.17-py39h87fa3cb_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.21-py39h87fa3cb_0.conda hash: - md5: 6a2ac5515e8f4b5aff4e41e60c514532 - sha256: afc4aac478c7b60c1214a58e4175cd2299330e70512de3c28af18b713d101e68 + md5: a9428fa5e1bf8d9816756db1287c4e73 + sha256: a822e9259339427b0b5aa1b6b925831f009aa45005073d65455c133709a842e8 category: main optional: false - name: polars @@ -18101,7 +18265,7 @@ package: category: main optional: false - name: polars - version: 0.20.17 + version: 0.20.21 manager: conda platform: osx-arm64 dependencies: @@ -18109,10 +18273,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* typing_extensions: '>=4.0.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/polars-0.20.17-py39h08ca3d8_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/polars-0.20.21-py39h08ca3d8_0.conda hash: - md5: c544345111324210efaed43f9f5bb266 - sha256: cdbe8f41dda3e5a8cac19a2a11295f7ee24cb30ffc7bf05e18a53c2b5162ceee + md5: 434ff585b23586578d1cb756895c384f + sha256: 909ab551e5764accdd03d64e1b16627e0754e3a37d27692f77e0a2e6c1652160 category: main optional: false - name: poppler @@ -18955,22 +19119,6 @@ package: sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a category: main optional: false -- name: pulseaudio-client - version: '16.1' - manager: conda - platform: linux-64 - dependencies: - dbus: '>=1.13.6,<2.0a0' - libgcc-ng: '>=12' - libglib: '>=2.76.4,<3.0a0' - libsndfile: '>=1.2.2,<1.3.0a0' - libsystemd0: '>=254' - url: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda - hash: - md5: ac902ff3c1c6d750dd0dfc93a974ab74 - sha256: 9981c70893d95c8cac02e7edd1a9af87f2c8745b772d529f08b7f9dafbe98606 - category: main - optional: false - name: pure_eval version: 0.2.2 manager: conda @@ -19044,20 +19192,27 @@ package: category: main optional: false - name: pyarrow - version: 13.0.0 + version: 15.0.0 manager: conda platform: linux-64 dependencies: - libarrow: 13.0.0 + libarrow: 15.0.0 + libarrow-acero: 15.0.0 + libarrow-dataset: 15.0.0 + libarrow-flight: 15.0.0 + libarrow-flight-sql: 15.0.0 + libarrow-gandiva: 15.0.0 + libarrow-substrait: 15.0.0 libgcc-ng: '>=12' + libparquet: 15.0.0 libstdcxx-ng: '>=12' numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-13.0.0-py39h6925388_23_cpu.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-15.0.0-py39h6925388_0_cpu.conda hash: - md5: fc0f30899de0ebba12091adbee386f94 - sha256: 0b723965361c9b2ecd31369a314aa9667e2482ce8f0912a6dd87fa70f7d2126a + md5: 2d527b5daac94b4b7641a1901b7c126c + sha256: 055bfef41e17b68ec92fcfa2c37dfd2cf21bd0d39717cc5d6d5fc23d2e1feab6 category: main optional: false - name: pyarrow @@ -19077,19 +19232,26 @@ package: category: main optional: false - name: pyarrow - version: 13.0.0 + version: 15.0.0 manager: conda platform: osx-arm64 dependencies: - libarrow: 13.0.0 + libarrow: 15.0.0 + libarrow-acero: 15.0.0 + libarrow-dataset: 15.0.0 + libarrow-flight: 15.0.0 + libarrow-flight-sql: 15.0.0 + libarrow-gandiva: 15.0.0 + libarrow-substrait: 15.0.0 libcxx: '>=14' + libparquet: 15.0.0 numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-13.0.0-py39hb25a2a0_23_cpu.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-15.0.0-py39hb25a2a0_0_cpu.conda hash: - md5: 652a9fa809d6944921ca49c6ff1472a1 - sha256: acb21e3792c47c7b57dece0da175a2083f00186a86e9f1414b17969b4d896f8c + md5: ada4dfcde53e226ad1cf13d83d007740 + sha256: 3e0ca6074cd75e34861db4d37ae8cb5ed5aa7b76e3f88811e34b6794072571bb category: main optional: false - name: pyarrow-hotfix @@ -19132,15 +19294,15 @@ package: category: main optional: false - name: pyasn1 - version: 0.5.1 + version: 0.6.0 manager: conda platform: linux-64 dependencies: python: '!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,!=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.5.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.0-pyhd8ed1ab_0.conda hash: - md5: fb1a800972b072aa4d16450983c81418 - sha256: 8b116da9acbb471e107203c11acaffcb259aca2367aa7e83e796e43ed5d381b3 + md5: d528d00a110a974e75aa6db6a4f04dc7 + sha256: 9b54bf52c76bb7365ceb36315258011b8c603fe00f568d4bbff8bc77c7ffcfdb category: main optional: false - name: pyasn1 @@ -19156,28 +19318,28 @@ package: category: main optional: false - name: pyasn1 - version: 0.5.1 + version: 0.6.0 manager: conda platform: osx-arm64 dependencies: python: '!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,!=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.5.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.0-pyhd8ed1ab_0.conda hash: - md5: fb1a800972b072aa4d16450983c81418 - sha256: 8b116da9acbb471e107203c11acaffcb259aca2367aa7e83e796e43ed5d381b3 + md5: d528d00a110a974e75aa6db6a4f04dc7 + sha256: 9b54bf52c76bb7365ceb36315258011b8c603fe00f568d4bbff8bc77c7ffcfdb category: main optional: false - name: pyasn1-modules - version: 0.3.0 + version: 0.4.0 manager: conda platform: linux-64 dependencies: - pyasn1: '>=0.4.6,<0.6.0' - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.3.0-pyhd8ed1ab_0.conda + pyasn1: '>=0.4.6,<0.7.0' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.0-pyhd8ed1ab_0.conda hash: - md5: 26db749166cdca55e5ef1ffdc7767d0e - sha256: 7867ba43b6ef1e66054ca6b70f59bbef4cdb0cc761f0be3b66d79d15bd43143b + md5: 8e40d7b2b3bdf9f3cab88d93d7dfaf3b + sha256: dcd5b96adf56cf9b26045bc845f8ca50ede4c4c5f8654cfa58ece2ba29cf9a67 category: main optional: false - name: pyasn1-modules @@ -19194,16 +19356,16 @@ package: category: main optional: false - name: pyasn1-modules - version: 0.3.0 + version: 0.4.0 manager: conda platform: osx-arm64 dependencies: - python: '>=3.6' - pyasn1: '>=0.4.6,<0.6.0' - url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.3.0-pyhd8ed1ab_0.conda + python: '>=3.8' + pyasn1: '>=0.4.6,<0.7.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.0-pyhd8ed1ab_0.conda hash: - md5: 26db749166cdca55e5ef1ffdc7767d0e - sha256: 7867ba43b6ef1e66054ca6b70f59bbef4cdb0cc761f0be3b66d79d15bd43143b + md5: 8e40d7b2b3bdf9f3cab88d93d7dfaf3b + sha256: dcd5b96adf56cf9b26045bc845f8ca50ede4c4c5f8654cfa58ece2ba29cf9a67 category: main optional: false - name: pycairo @@ -19286,18 +19448,18 @@ package: category: main optional: false - name: pydantic - version: 1.10.14 + version: 2.7.0 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=12' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - typing-extensions: '>=4.2.0' - url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-1.10.14-py39hd1e30aa_0.conda + annotated-types: '>=0.4.0' + pydantic-core: 2.18.1 + python: '>=3.7' + typing-extensions: '>=4.6.1' + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.0-pyhd8ed1ab_0.conda hash: - md5: 8b6ce436b927350e124b42aa12b79410 - sha256: 351e7a25060d9b86a312b5662691dd5f7416099587d24f5293da3972b6606e76 + md5: 369c93f0209568e7c33892d8960fe583 + sha256: e7b58685010aaeb64524d430b7fd9e732d81644a7185810f567097fc16804e88 category: main optional: false - name: pydantic @@ -19315,17 +19477,47 @@ package: category: main optional: false - name: pydantic - version: 1.10.14 + version: 2.7.0 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.7' + annotated-types: '>=0.4.0' + typing-extensions: '>=4.6.1' + pydantic-core: 2.18.1 + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.0-pyhd8ed1ab_0.conda + hash: + md5: 369c93f0209568e7c33892d8960fe583 + sha256: e7b58685010aaeb64524d430b7fd9e732d81644a7185810f567097fc16804e88 + category: main + optional: false +- name: pydantic-core + version: 2.18.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + typing-extensions: '>=4.6.0,!=4.7.0' + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.18.1-py39h9fdd4d6_0.conda + hash: + md5: aa00b918f0afe6e65b98f2dcb0791cf3 + sha256: 1896bbf0ec12cf3787404bb63c33323e7fb78fd80cebff8d841d818d7085f9ed + category: main + optional: false +- name: pydantic-core + version: 2.18.1 manager: conda platform: osx-arm64 dependencies: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - typing-extensions: '>=4.2.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-1.10.14-py39h17cfd9d_0.conda + typing-extensions: '>=4.6.0,!=4.7.0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.18.1-py39h8fec3ad_0.conda hash: - md5: 1018fbdc8224bd8dabfd3a6707aa2ff3 - sha256: 10e4199cabe3198ca559857a4c219e922cd08df32675543ff03f13d08a423e5c + md5: da4cfed9812b2ae4dfd50bcc8d544bc5 + sha256: e0898ef74522f3908fa31c88cb9edf91c4e01fb42e398b71ba1ca63c6ac72127 category: main optional: false - name: pygments @@ -19687,24 +19879,6 @@ package: sha256: d056de9eb7e7b568a003d5a24caa7a9c73e2cf34cbac0aecd253056157770ea3 category: main optional: false -- name: pyqt - version: 5.15.9 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - pyqt5-sip: 12.12.2 - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - qt-main: '>=5.15.8,<5.16.0a0' - sip: '>=6.7.11,<6.8.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda - hash: - md5: e1f148e57d071b09187719df86f513c1 - sha256: a0d0662c73b343931dbd66d9c25ec74f40115512568a87bf4d01af8d1a8ddf1c - category: main - optional: false - name: pyqt version: 5.15.9 manager: conda @@ -19722,24 +19896,6 @@ package: sha256: 58e3f096357bc899fa446bc9ff28cf04feaa3cb7b394b2fcf7e4facce442ff72 category: main optional: false -- name: pyqt5-sip - version: 12.12.2 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - packaging: '' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - sip: '' - toml: '' - url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda - hash: - md5: 93aff412f3e49fdb43361c0215cbd72d - sha256: 86efec5e57111794e039bb14dfce23d9df6ed8df139ab1404086140eba6d4d7c - category: main - optional: false - name: pyqt5-sip version: 12.12.2 manager: conda @@ -19762,12 +19918,12 @@ package: manager: conda platform: linux-64 dependencies: - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py39hf3d152e_5.tar.bz2 + __unix: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 hash: - md5: d34b97a2386932b97c7cb80916a673e7 - sha256: 42d46baeab725d3c70d22a4258549e9f0f1a72b740166cd9c3b394c4369cb306 + md5: 2a7de29fb590ca14b5243c4c812c8025 + sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b category: main optional: false - name: pysocks @@ -19788,12 +19944,12 @@ package: manager: conda platform: osx-arm64 dependencies: - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/pysocks-1.7.1-py39h2804cbe_5.tar.bz2 + __unix: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 hash: - md5: 831038e9e2af74015b03d82209ac5f87 - sha256: 33258403558102b27ccc918338eb90906028f8f3f2b2af549b3232335dc355e1 + md5: 2a7de29fb590ca14b5243c4c812c8025 + sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b category: main optional: false - name: pyspark @@ -20356,18 +20512,25 @@ package: manager: conda platform: linux-64 dependencies: + __cuda: '' __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' + cudatoolkit: '>=11.8,<12' + cudnn: '>=8.8.0.121,<9.0a0' filelock: '' fsspec: '' jinja2: '' libcblas: '>=3.9.0,<4.0a0' libgcc-ng: '>=12' + libmagma: '>=2.7.2,<2.7.3.0a0' + libmagma_sparse: '>=2.7.2,<2.7.3.0a0' libprotobuf: '>=4.24.4,<4.24.5.0a0' libstdcxx-ng: '>=12' libtorch: 2.1.2.* libuv: '>=1.46.0,<2.0a0' + magma: '>=2.7.2,<2.7.3.0a0' mkl: '>=2023.2.0,<2024.0a0' + nccl: '>=2.19.4.1,<3.0a0' networkx: '' numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' @@ -20375,10 +20538,10 @@ package: sleef: '>=3.5.1,<4.0a0' sympy: '' typing_extensions: '' - url: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.1.2-cpu_mkl_py39h9c325db_100.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.1.2-cuda118_py39hcb596ef_300.conda hash: - md5: bb34e51d3542a1b4b6afc04f28585055 - sha256: c363db53861a5ffe1613e57a8c3624f447fa203dde66f52b29ddb9859fb2e8bc + md5: d7355cce6a80513f7e9980e5e2e836be + sha256: 4f84efcd67159d4117b9519da2542da4f71c21e2abe2dae3368a54e365df6d98 category: main optional: false - name: pytorch @@ -20439,15 +20602,15 @@ package: category: main optional: false - name: pytz - version: '2023.4' + version: '2024.1' manager: conda platform: linux-64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/pytz-2023.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda hash: - md5: 89445e229eb2d6605be88e0908afc912 - sha256: c988e6b9032ac2f917540a1d5a2268f45c01892c392fd7eee9d5c60270337835 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 category: main optional: false - name: pytz @@ -20463,15 +20626,15 @@ package: category: main optional: false - name: pytz - version: '2023.4' + version: '2024.1' manager: conda platform: osx-arm64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/pytz-2023.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda hash: - md5: 89445e229eb2d6605be88e0908afc912 - sha256: c988e6b9032ac2f917540a1d5a2268f45c01892c392fd7eee9d5c60270337835 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 category: main optional: false - name: pyu2f @@ -20596,7 +20759,7 @@ package: category: main optional: false - name: pyzmq - version: 25.1.2 + version: 26.0.0 manager: conda platform: linux-64 dependencies: @@ -20606,10 +20769,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* zeromq: '>=4.3.5,<4.4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.2-py39h8c080ef_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.0-py39h8c080ef_0.conda hash: - md5: 852eb7bf636d4108530a27100c23f1c1 - sha256: ada6b641a9fca2a4a7efe72bb5133d3da89bc52ac16a1d67083c065bdccdb321 + md5: ff428448ae918fe8a1d4636995444fb0 + sha256: e1f156d2ebcca7897711f0c4acad66113dc0317a1baa94bc3fa5d43d7562f4ba category: main optional: false - name: pyzmq @@ -20630,74 +20793,19 @@ package: category: main optional: false - name: pyzmq - version: 25.1.2 + version: 26.0.0 manager: conda platform: osx-arm64 dependencies: - __osx: '>=10.9' - libcxx: '>=16.0.6' + libcxx: '>=16' libsodium: '>=1.0.18,<1.0.19.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* zeromq: '>=4.3.5,<4.4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-25.1.2-py39he1e2164_0.conda - hash: - md5: d4011b876d36c431553f6db2b3c7bad9 - sha256: 23e9a498414af4613c51d93dd74c6c20f63a03545c7b11b7b0bdeaf70f194d1c - category: main - optional: false -- name: qt-main - version: 5.15.8 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - alsa-lib: '>=1.2.10,<1.3.0.0a0' - dbus: '>=1.13.6,<2.0a0' - fontconfig: '>=2.14.2,<3.0a0' - fonts-conda-ecosystem: '' - freetype: '>=2.12.1,<3.0a0' - gst-plugins-base: '>=1.22.9,<1.23.0a0' - gstreamer: '>=1.22.9,<1.23.0a0' - harfbuzz: '>=8.3.0,<9.0a0' - icu: '>=73.2,<74.0a0' - krb5: '>=1.21.2,<1.22.0a0' - libclang: '>=15.0.7,<16.0a0' - libclang13: '>=15.0.7' - libcups: '>=2.3.3,<2.4.0a0' - libevent: '>=2.1.12,<2.1.13.0a0' - libexpat: '>=2.5.0,<3.0a0' - libgcc-ng: '>=12' - libglib: '>=2.78.3,<3.0a0' - libjpeg-turbo: '>=3.0.0,<4.0a0' - libpng: '>=1.6.42,<1.7.0a0' - libpq: '>=16.2,<17.0a0' - libsqlite: '>=3.45.1,<4.0a0' - libstdcxx-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' - libxkbcommon: '>=1.6.0,<2.0a0' - libxml2: '>=2.12.5,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' - mysql-libs: '>=8.0.33,<8.1.0a0' - nspr: '>=4.35,<5.0a0' - nss: '>=3.97,<4.0a0' - openssl: '>=3.2.1,<4.0a0' - pulseaudio-client: '>=16.1,<16.2.0a0' - xcb-util: '>=0.4.0,<0.5.0a0' - xcb-util-image: '>=0.4.0,<0.5.0a0' - xcb-util-keysyms: '>=0.4.0,<0.5.0a0' - xcb-util-renderutil: '>=0.3.9,<0.4.0a0' - xcb-util-wm: '>=0.4.1,<0.5.0a0' - xorg-libice: '>=1.1.1,<2.0a0' - xorg-libsm: '>=1.2.4,<2.0a0' - xorg-libx11: '>=1.8.7,<2.0a0' - xorg-libxext: '>=1.3.4,<2.0a0' - xorg-xf86vidmodeproto: '' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5810be5_19.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.0.0-py39he0a3c8b_0.conda hash: - md5: 54866f708d43002a514d0b9b0f84bc11 - sha256: 41228ec12346d640ef1f549885d8438e98b1be0fdeb68cd1dd3938f255cbd719 + md5: 9aefb8ff2c3871b14b5ce1dd2c95491a + sha256: 9c5e1fbafda650d01ff5f202317b4754885e02b7c9ed9183d1d33202b2209f28 category: main optional: false - name: qt-main @@ -20725,21 +20833,7 @@ package: url: https://conda.anaconda.org/conda-forge/osx-64/qt-main-5.15.8-h4385fff_19.conda hash: md5: e9e7fc8f8b31e436472e6c2697dfa9fa - sha256: f1ab73268198fe66c0b438b58b34bc56b987d0c411c4d60882c9474186a7d7f0 - category: main - optional: false -- name: qtconsole - version: 5.5.1 - manager: conda - platform: linux-64 - dependencies: - pyqt: '' - python: '>=3.7' - qtconsole-base: '>=5.5.1,<5.5.2.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/qtconsole-5.5.1-pyhd8ed1ab_0.conda - hash: - md5: eb44d4dc1e8c84287c4fb28518ffedd0 - sha256: c102ef2919dc780086ee59cb1dd9823603bf6e6d394eace6ae53c84c97661e9d + sha256: f1ab73268198fe66c0b438b58b34bc56b987d0c411c4d60882c9474186a7d7f0 category: main optional: false - name: qtconsole @@ -20794,6 +20888,25 @@ package: sha256: e81a294941a598aabfd9462cf9aaa3b3e2c04996420f82494bdc13233de8ca70 category: main optional: false +- name: qtconsole-base + version: 5.5.1 + manager: conda + platform: osx-arm64 + dependencies: + packaging: '' + pygments: '' + traitlets: '' + jupyter_core: '' + python: '>=3.8' + ipykernel: '>=4.1' + jupyter_client: '>=4.1' + qtpy: '>=2.4.0' + url: https://conda.anaconda.org/conda-forge/noarch/qtconsole-base-5.5.1-pyha770c72_0.conda + hash: + md5: 5528a3eda283b421055c89bface19a1c + sha256: e81a294941a598aabfd9462cf9aaa3b3e2c04996420f82494bdc13233de8ca70 + category: main + optional: false - name: qtpy version: 2.4.1 manager: conda @@ -20820,6 +20933,19 @@ package: sha256: 925bf48e747af6ceff1b073c10b12fc94ef79c88a34729059d253e43466a33f1 category: main optional: false +- name: qtpy + version: 2.4.1 + manager: conda + platform: osx-arm64 + dependencies: + packaging: '' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/qtpy-2.4.1-pyhd8ed1ab_0.conda + hash: + md5: 7f391bd70d2abfb70f304ba5aa4e1261 + sha256: 925bf48e747af6ceff1b073c10b12fc94ef79c88a34729059d253e43466a33f1 + category: main + optional: false - name: querystring_parser version: 1.2.4 manager: conda @@ -20863,7 +20989,7 @@ package: category: main optional: false - name: rdma-core - version: '50.0' + version: '51.0' manager: conda platform: linux-64 dependencies: @@ -20871,10 +20997,10 @@ package: libgcc-ng: '>=12' libnl: '>=3.9.0,<4.0a0' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-50.0-hd3aeb46_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-51.0-hd3aeb46_0.conda hash: - md5: f462219598fcf46c0cdfb985c3482b4f - sha256: 85e38508eb4921e53cf1cb97435f9c9408ea2ddc582c6588ec50f3f3ec3abdc0 + md5: 493598e1f28c01e316fda127715593aa + sha256: bcc774b60605b09701cfad41b2d6d9c3f052dd4adfc1f02bf1c929076f48fe30 category: main optional: false - name: re2 @@ -21555,7 +21681,7 @@ package: category: main optional: false - name: scikit-learn - version: 1.4.1.post1 + version: 1.4.2 manager: conda platform: linux-64 dependencies: @@ -21568,10 +21694,10 @@ package: python_abi: 3.9.* scipy: '' threadpoolctl: '>=2.0.0' - url: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.1.post1-py39ha22ef79_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py39ha22ef79_0.conda hash: - md5: 34570aedcdc0281c66ce0ed300844111 - sha256: 72fe5a1a19a4ed66a8e0aeceee256e58c7a7b3dd9a97139c6e7b2ba73e0c9f63 + md5: 0b700c2c45f449a1bd965d18bc10d179 + sha256: 4c6c4d07a5683e5655fc4fe2e80cc6eeee65dca89ec92ef3c7f047a765157ff0 category: main optional: false - name: scikit-learn @@ -21594,26 +21720,26 @@ package: category: main optional: false - name: scikit-learn - version: 1.4.1.post1 + version: 1.4.2 manager: conda platform: osx-arm64 dependencies: joblib: '>=1.2.0' libcxx: '>=16' - llvm-openmp: '>=17.0.6' + llvm-openmp: '>=18.1.3' numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* scipy: '' threadpoolctl: '>=2.0.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.1.post1-py39h6dd658b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py39h6dd658b_0.conda hash: - md5: c69932cee8782d57e5b1287a4a1fcae0 - sha256: ec0e745737bf152dd4a4cce7031683f42f15be3295ab3874185f3bdf07e1d475 + md5: e73969c4b1af11fc151c73cf16d220a5 + sha256: 96f299edadb9c29acd7d77af9ffcd2f8863d286498f33d4b8b3f9dde93107ed8 category: main optional: false - name: scipy - version: 1.12.0 + version: 1.13.0 manager: conda platform: linux-64 dependencies: @@ -21627,10 +21753,10 @@ package: numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda hash: - md5: 6ab241b2023730f6b41712dc1b503afa - sha256: 8b2312d5be30bfb226e83af8e070c65df6816d0a9b179f51b9f915990bfd86ee + md5: 46ae0ecba9726ab4fa44c78fefa522cf + sha256: 7eb1a6d883514f5f88fda702fe81a6e63d84c8a7076b2cbbd009bed21986f82a category: main optional: false - name: scipy @@ -21654,23 +21780,23 @@ package: category: main optional: false - name: scipy - version: 1.12.0 + version: 1.13.0 manager: conda platform: osx-arm64 dependencies: libblas: '>=3.9.0,<4.0a0' libcblas: '>=3.9.0,<4.0a0' - libcxx: '>=15' + libcxx: '>=16' libgfortran: 5.* libgfortran5: '>=13.2.0' liblapack: '>=3.9.0,<4.0a0' numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.12.0-py39hcc04109_2.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py39hcc04109_0.conda hash: - md5: d11014867a62eb349f91d65b31e6a322 - sha256: b319c34eb72aa97a9775c14ed64af02398f9e4d3b563453b4a0225cd4d5903eb + md5: 72a666030ab05e9de0d2eec63ffbc5cc + sha256: 3f5d5453aa7f295e501052c5bceab6626dd820b7e1e727d5ec3c1dfe46bcee21 category: main optional: false - name: secretstorage @@ -21690,16 +21816,16 @@ package: category: main optional: false - name: send2trash - version: 1.8.2 + version: 1.8.3 manager: conda platform: linux-64 dependencies: __linux: '' - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_0.conda hash: - md5: ada5a17adcd10be4fc7e37e4166ba0e2 - sha256: e74d3faf51a6cc429898da0209d95b209270160f3edbf2f6d8b61a99428301cd + md5: 778594b20097b5a948c59e50ae42482a + sha256: c4401b071e86ddfa0ea4f34b85308db2516b6aeca50053535996864cfdee7b3f category: main optional: false - name: send2trash @@ -21717,29 +21843,29 @@ package: category: main optional: false - name: send2trash - version: 1.8.2 + version: 1.8.3 manager: conda platform: osx-arm64 dependencies: __osx: '' pyobjc-framework-cocoa: '' - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyhd1c38e8_0.conda + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_0.conda hash: - md5: 2657c3de5371c571aef6678afb4aaadd - sha256: dca4022bae47618ed738ab7d45ead5202d174b741cfb98e4484acdc6e76da32a + md5: c3cb67fc72fb38020fe7923dbbcf69b0 + sha256: f911307db932c92510da6c3c15b461aef935720776643a1fbf3683f61001068b category: main optional: false - name: setuptools - version: 69.2.0 + version: 69.5.1 manager: conda platform: linux-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda hash: - md5: da214ecd521a720a9d521c68047682dc - sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 + md5: 7462280d81f639363e6e63c81276bd9e + sha256: 72d143408507043628b32bed089730b6d5f5445eccc44b59911ec9f262e365e7 category: main optional: false - name: setuptools @@ -21755,19 +21881,19 @@ package: category: main optional: false - name: setuptools - version: 69.2.0 + version: 69.5.1 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda hash: - md5: da214ecd521a720a9d521c68047682dc - sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 + md5: 7462280d81f639363e6e63c81276bd9e + sha256: 72d143408507043628b32bed089730b6d5f5445eccc44b59911ec9f262e365e7 category: main optional: false - name: shapely - version: 2.0.3 + version: 2.0.4 manager: conda platform: linux-64 dependencies: @@ -21776,10 +21902,10 @@ package: numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py39h6404dd3_0.conda hash: - md5: 1520f039123452cd2de847068449a618 - sha256: 43af6c106ff55be27be3be99b7f313fa3becee9aeeb826e31257c1159416f53a + md5: c33c60a88dad5df6960c4da482f9e313 + sha256: a43c894940645091626277f91463fa55de7ed934c1aea7c26891691ce8052b25 category: main optional: false - name: shapely @@ -21798,7 +21924,7 @@ package: category: main optional: false - name: shapely - version: 2.0.3 + version: 2.0.4 manager: conda platform: osx-arm64 dependencies: @@ -21806,28 +21932,10 @@ package: numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.3-py39ha70ab96_0.conda - hash: - md5: 6f1f893210f9daa0fe5e0634c0e0d2b6 - sha256: 2bd385c02e2ef0a9a15bf3a1e79ab40119a441d03ffa72339ac2f5c73c583eed - category: main - optional: false -- name: sip - version: 6.7.12 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - packaging: '' - ply: '' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - tomli: '' - url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.4-py39ha70ab96_0.conda hash: - md5: e667a3ab0df62c54e60e1843d2e6defb - sha256: fd50c71dc05daf9d28663d448d17f150b3eb79ae629198c73e2186b5b1e990dc + md5: a1979d786b7c352f7a8e305d0e69161a + sha256: 80afeeec485a95461333cc92d2d01b1eae229ff672a8a96b1ae6b6c401a44692 category: main optional: false - name: sip @@ -21948,10 +22056,10 @@ package: dependencies: _openmp_mutex: '>=4.5' libgcc-ng: '>=9.4.0' - url: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.5.1-h28343ad_2.tar.bz2 + url: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.5.1-h9b69904_2.tar.bz2 hash: - md5: a41b5f5f2ee067f55d9774815d3d42db - sha256: 17457848ad97e9e8c2ff5f56316b68284e16ed854c46460c0ba7374e880dba1f + md5: 6e016cf4c525d04a7bd038cee53ad3fd + sha256: 77d644a16f682e6d01df63fe9d25315011393498b63cf08c0e548780e46b2170 category: main optional: false - name: sleef @@ -21972,10 +22080,10 @@ package: platform: osx-arm64 dependencies: llvm-openmp: '>=12.0.1' - url: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.5.1-he9cb808_2.tar.bz2 + url: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.5.1-h156473d_2.tar.bz2 hash: - md5: bb73bb3beec3fef3870d8cd328a39bd8 - sha256: b01163e1e97f3eada667d45196f9695e9fa1fa82cd89c35d52fc025e0af2777c + md5: bd159e7f04dbf79b06ed2bd37e112458 + sha256: a3d20bed697aaababfcb53ca2011486cf5e44e20855142c170fa0826df5f952c category: main optional: false - name: smmap @@ -22021,10 +22129,10 @@ package: dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda hash: - md5: e6d228cd0bb74a51dd18f5bfce0b4115 - sha256: 02219f2382b4fe39250627dade087a4412d811936a5a445636b7260477164eac + md5: 78b8b85bdf1f42b8a2b3cb577d8742d1 + sha256: 082eadbc355016e948f1acc2f16e721ae362ecdaa204cbd60136ada19bd43f3a category: main optional: false - name: snappy @@ -22044,11 +22152,11 @@ package: manager: conda platform: osx-arm64 dependencies: - libcxx: '>=14.0.6' - url: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.1.10-h17c5cce_0.conda + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.1.10-hd04f947_1.conda hash: - md5: ac82a611d1a67a598096ebaa857198e3 - sha256: dfae03cd2339587871e53b42833657faa4c9e42e3e2c56ee9e32bc60797c7f62 + md5: 1506177f0a11c04cd16f330b2f4ad21d + sha256: d7f7b14bb299019419ef9984ce0eae1990fab1cf3708b04766b0b31fe193aa3d category: main optional: false - name: sniffio @@ -22124,7 +22232,7 @@ package: category: main optional: false - name: snowflake-connector-python - version: 3.7.1 + version: 3.8.1 manager: conda platform: linux-64 dependencies: @@ -22139,7 +22247,7 @@ package: libstdcxx-ng: '>=12' numpy: '>=1.22.4,<2.0a0' packaging: '' - platformdirs: '>=2.6.0,<4.0.0' + platformdirs: '>=2.6.0,<5.0.0' pyjwt: <3.0.0 pyopenssl: '>=16.2.0,<25.0.0' python: '>=3.9,<3.10.0a0' @@ -22150,10 +22258,10 @@ package: tomlkit: '' typing_extensions: '>=4.3,<5' urllib3: '>=1.21.1,<2' - url: https://conda.anaconda.org/conda-forge/linux-64/snowflake-connector-python-3.7.1-py39hddac248_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/snowflake-connector-python-3.8.1-py39hddac248_0.conda hash: - md5: 4afb71844868347f9a1654f777b11fb2 - sha256: 58203509b4118463bb7e29ad29b96e2908e6f57efd44e38b32e57049eab0ecfc + md5: e47ed4f0fa57c47ae737308c81e6c0a7 + sha256: 295f28fbc08fabc2eb4819f3f781ac55839ea3d777f5f67f923cecf75cfb3604 category: main optional: false - name: snowflake-connector-python @@ -22189,7 +22297,7 @@ package: category: main optional: false - name: snowflake-connector-python - version: 3.7.1 + version: 3.8.1 manager: conda platform: osx-arm64 dependencies: @@ -22203,7 +22311,7 @@ package: libcxx: '>=16' numpy: '>=1.22.4,<2.0a0' packaging: '' - platformdirs: '>=2.6.0,<4.0.0' + platformdirs: '>=2.6.0,<5.0.0' pyjwt: <3.0.0 pyopenssl: '>=16.2.0,<25.0.0' python: '>=3.9,<3.10.0a0' @@ -22214,10 +22322,10 @@ package: tomlkit: '' typing_extensions: '>=4.3,<5' urllib3: '>=1.21.1,<2' - url: https://conda.anaconda.org/conda-forge/osx-arm64/snowflake-connector-python-3.7.1-py39h47e51b9_2.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/snowflake-connector-python-3.8.1-py39h47e51b9_0.conda hash: - md5: 6fc6d135b3110f0714e65a29caa84e1d - sha256: dd9426602bf20f0ac28c92ec3035ed6b0011194fb3a149f03acb37934bc35575 + md5: e07bbc22b4ac20c6e2098323aad193c7 + sha256: 475e3baac73548638cfad332bcfdd9a47046c5687c1c8de903b9c79f9e3f2d30 category: main optional: false - name: sortedcontainers @@ -23272,19 +23380,19 @@ package: category: main optional: false - name: sqlite - version: 3.45.2 + version: 3.45.3 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - libsqlite: 3.45.2 + libsqlite: 3.45.3 libzlib: '>=1.2.13,<1.3.0a0' - ncurses: '>=6.4,<7.0a0' + ncurses: '>=6.4.20240210,<7.0a0' readline: '>=8.2,<9.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda hash: - md5: 1423efca06ed343c1da0fc429bae0779 - sha256: 22d2692c82b73480c9adc80472bfb241262586edaf1dac1a7504434e47185d3c + md5: be7d70f2db41b674733667bdd69bd000 + sha256: 945ac702e2bd8cc59cc780dfc37c18255d5e538c8433dc290c0edbad2bcbaeb4 category: main optional: false - name: sqlite @@ -23303,18 +23411,18 @@ package: category: main optional: false - name: sqlite - version: 3.45.2 + version: 3.45.3 manager: conda platform: osx-arm64 dependencies: - libsqlite: 3.45.2 + libsqlite: 3.45.3 libzlib: '>=1.2.13,<1.3.0a0' - ncurses: '>=6.4,<7.0a0' + ncurses: '>=6.4.20240210,<7.0a0' readline: '>=8.2,<9.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.45.2-hf2abe2d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.45.3-hf2abe2d_0.conda hash: - md5: 67af40712ec3989036429398b69ec206 - sha256: 43f30a40494bd631e7a19fa258115c09a3fed540e5398ba3a8da66f3e48942ca + md5: 95ba63aee059cdfc10b7e3ee1dd4c15d + sha256: 1d618ce2622e2e976f8f28ede2f14ae20f19f64eda706d9eda6419393c48015a category: main optional: false - name: sqlparse @@ -23552,17 +23660,17 @@ package: category: main optional: false - name: tbb - version: 2021.11.0 + version: 2021.12.0 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - libhwloc: '>=2.9.3,<2.9.4.0a0' + libhwloc: '>=2.10.0,<2.10.1.0a0' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.11.0-h00ab1b0_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h00ab1b0_0.conda hash: - md5: 4531d2927578e7e254ff3bcf6457518c - sha256: ded4de0d5a3eb7b47ed829f0ed0e3c61ccd428308bde52d8d22ced228038223b + md5: f1b776cff1b426e7e7461a8502a3b731 + sha256: 0b48f402e18f293e3c7a4c4e391ed2523f173bdec86aa42658db787196eb27ca category: main optional: false - name: tbb @@ -23845,7 +23953,7 @@ package: python-flatbuffers: '>=23.5.26' python_abi: 3.9.* six: '>=1.12' - snappy: '>=1.1.10,<2.0a0' + snappy: '>=1.1.10,<1.2.0a0' tensorboard: '>=2.15,<2.16' termcolor: '>=1.1.0' typing_extensions: '>=3.6.6' @@ -23936,7 +24044,7 @@ package: python-flatbuffers: '>=23.5.26' python_abi: 3.9.* six: '>=1.12' - snappy: '>=1.1.10,<2.0a0' + snappy: '>=1.1.10,<1.2.0a0' tensorboard: '>=2.15,<2.16' termcolor: '>=1.1.0' typing_extensions: '>=3.6.6' @@ -24113,18 +24221,6 @@ package: sha256: db64669a918dec8c744f80a85b9c82216b79298256c7c8bd19bdba54a02f8914 category: main optional: false -- name: textwrap3 - version: 0.9.2 - manager: conda - platform: linux-64 - dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/textwrap3-0.9.2-py_0.tar.bz2 - hash: - md5: 1f84e74e9dbe2e5ae38c58496bffaca8 - sha256: d7b40d3a3f1c2e74bbea5ee845b34a30abc1ae8e4f2a92f4a58800e1e669c076 - category: main - optional: false - name: textwrap3 version: 0.9.2 manager: conda @@ -24137,18 +24233,6 @@ package: sha256: d7b40d3a3f1c2e74bbea5ee845b34a30abc1ae8e4f2a92f4a58800e1e669c076 category: main optional: false -- name: textwrap3 - version: 0.9.2 - manager: conda - platform: osx-arm64 - dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/textwrap3-0.9.2-py_0.tar.bz2 - hash: - md5: 1f84e74e9dbe2e5ae38c58496bffaca8 - sha256: d7b40d3a3f1c2e74bbea5ee845b34a30abc1ae8e4f2a92f4a58800e1e669c076 - category: main - optional: false - name: tf2onnx version: 1.16.1 manager: conda @@ -24727,15 +24811,15 @@ package: category: main optional: false - name: typing-extensions - version: 4.10.0 + version: 4.11.0 manager: conda platform: linux-64 dependencies: - typing_extensions: 4.10.0 - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + typing_extensions: 4.11.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda hash: - md5: 091683b9150d2ebaa62fd7e2c86433da - sha256: 0698fe2c4e555fb44c27c60f7a21fa0eea7f5bf8186ad109543c5b056e27f96a + md5: 471e3988f8ca5e9eb3ce6be7eac3bcee + sha256: aecbd9c601ba5a6c128da8975276fd817b968a9edc969b7ae97aee76e80a14a6 category: main optional: false - name: typing-extensions @@ -24751,27 +24835,27 @@ package: category: main optional: false - name: typing-extensions - version: 4.10.0 + version: 4.11.0 manager: conda platform: osx-arm64 dependencies: - typing_extensions: 4.10.0 - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + typing_extensions: 4.11.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda hash: - md5: 091683b9150d2ebaa62fd7e2c86433da - sha256: 0698fe2c4e555fb44c27c60f7a21fa0eea7f5bf8186ad109543c5b056e27f96a + md5: 471e3988f8ca5e9eb3ce6be7eac3bcee + sha256: aecbd9c601ba5a6c128da8975276fd817b968a9edc969b7ae97aee76e80a14a6 category: main optional: false - name: typing_extensions - version: 4.10.0 + version: 4.11.0 manager: conda platform: linux-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda hash: - md5: 16ae769069b380646c47142d719ef466 - sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 + md5: 6ef2fc37559256cf682d8b3375e89b80 + sha256: a7e8714d14f854058e971a6ed44f18cc37cc685f98ddefb2e6b7899a0cc4d1a2 category: main optional: false - name: typing_extensions @@ -24787,15 +24871,15 @@ package: category: main optional: false - name: typing_extensions - version: 4.10.0 + version: 4.11.0 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda hash: - md5: 16ae769069b380646c47142d719ef466 - sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 + md5: 6ef2fc37559256cf682d8b3375e89b80 + sha256: a7e8714d14f854058e971a6ed44f18cc37cc685f98ddefb2e6b7899a0cc4d1a2 category: main optional: false - name: typing_inspect @@ -24988,14 +25072,13 @@ package: manager: conda platform: linux-64 dependencies: - cuda-cudart: '>=12.0.107,<13.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - rdma-core: '>=50.0' - url: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-hf604dca_7.conda + rdma-core: '>=51.0' + url: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-ha691c75_8.conda hash: - md5: 65df290dcf5d4f6d11e98faf6429f392 - sha256: 0992f449135cb8af2320fbfea2d76f5c543468858e77f35fa39c1048bf2d8782 + md5: 3f9bc6137b240642504a6c9b07a10c25 + sha256: 85b40ac6607c9e4e32bcb13e95da41ff48a10f813df0c1e74ff32412e1f7da35 category: main optional: false - name: ukkonen @@ -25163,10 +25246,10 @@ package: dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.7-hcb278e6_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.7-h59595ed_1.conda hash: - md5: 2c46deb08ba9b10e90d0a6401ad65deb - sha256: bc7670384fc3e519b376eab25b2c747afe392b243f17e881075231f4a0f2e5a0 + md5: c5edf07141147789784f89d5b4e4a9ad + sha256: ec997599b6dcfef34242c67b695c4704d9ba6cb0b9de8f390defa475a95cdb3f category: main optional: false - name: uriparser @@ -25186,11 +25269,11 @@ package: manager: conda platform: osx-arm64 dependencies: - libcxx: '>=14.0.6' - url: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.7-hb7217d7_1.conda + libcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.7-h13dd4ca_1.conda hash: - md5: 4fe532e3c6b0cfa5365eb01743d32578 - sha256: bedd03f3bb30b73ae7b0dc9626f1371a8568ce6d41303df3e8299688428dfa94 + md5: df83a53820f413eb8b14045433a2d587 + sha256: 019103df9eec86c9afa92dec21a849e63d57bfa9125ca811e68b78dab224c4ee category: main optional: false - name: urllib3 @@ -25336,7 +25419,7 @@ package: category: main optional: false - name: virtualenv - version: 20.25.1 + version: 20.25.3 manager: conda platform: linux-64 dependencies: @@ -25344,10 +25427,10 @@ package: filelock: <4,>=3.12.2 platformdirs: <5,>=3.9.1 python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.3-pyhd8ed1ab_0.conda hash: - md5: 8797a4e26be36880a603aba29c785352 - sha256: 1ced4445cf72cd9dc344ad04bdaf703a08cc428c8c46e4bda928ad79786ee153 + md5: ac56e5a52b659482dc333de69475f99c + sha256: dd95bcaf4c0b88dd4abca0e15da109b2a276dd6fa0b59bb33d67aba5f0031aa7 category: main optional: false - name: virtualenv @@ -25366,7 +25449,7 @@ package: category: main optional: false - name: virtualenv - version: 20.25.1 + version: 20.25.3 manager: conda platform: osx-arm64 dependencies: @@ -25374,10 +25457,10 @@ package: distlib: <1,>=0.3.7 filelock: <4,>=3.12.2 platformdirs: <5,>=3.9.1 - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.3-pyhd8ed1ab_0.conda hash: - md5: 8797a4e26be36880a603aba29c785352 - sha256: 1ced4445cf72cd9dc344ad04bdaf703a08cc428c8c46e4bda928ad79786ee153 + md5: ac56e5a52b659482dc333de69475f99c + sha256: dd95bcaf4c0b88dd4abca0e15da109b2a276dd6fa0b59bb33d67aba5f0031aa7 category: main optional: false - name: wcwidth @@ -25525,16 +25608,16 @@ package: category: main optional: false - name: werkzeug - version: 3.0.1 + version: 3.0.2 manager: conda platform: linux-64 dependencies: markupsafe: '>=2.1.1' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.2-pyhd8ed1ab_0.conda hash: - md5: af8d825d93dbe6331ee6d61c69869ca0 - sha256: b7ac49549d370a411b1d6150d24243a15adcce07f1c61ec2ea1b536346e47aa0 + md5: 96b2d2e2550ccba0f4008b4d0b4199dd + sha256: ae5744d6e3826d71826ca939436437016d14f38e3535517e160f74d392788d5d category: main optional: false - name: werkzeug @@ -25551,16 +25634,16 @@ package: category: main optional: false - name: werkzeug - version: 3.0.1 + version: 3.0.2 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' markupsafe: '>=2.1.1' - url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.2-pyhd8ed1ab_0.conda hash: - md5: af8d825d93dbe6331ee6d61c69869ca0 - sha256: b7ac49549d370a411b1d6150d24243a15adcce07f1c61ec2ea1b536346e47aa0 + md5: 96b2d2e2550ccba0f4008b4d0b4199dd + sha256: ae5744d6e3826d71826ca939436437016d14f38e3535517e160f74d392788d5d category: main optional: false - name: wheel @@ -25675,72 +25758,6 @@ package: sha256: 83f5c4e8963137f6c0287846d118d9e3baac69cfa86b4734a4ea02f4e276422c category: main optional: false -- name: xcb-util - version: 0.4.0 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda - hash: - md5: 9bfac7ccd94d54fd21a0501296d60424 - sha256: 0c91d87f0efdaadd4e56a5f024f8aab20ec30f90aa2ce9e4ebea05fbc20f71ad - category: main - optional: false -- name: xcb-util-image - version: 0.4.0 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' - xcb-util: '>=0.4.0,<0.5.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda - hash: - md5: 9d7bcddf49cbf727730af10e71022c73 - sha256: 92ffd68d2801dbc27afe223e04ae7e78ef605fc8575f107113c93c7bafbd15b0 - category: main - optional: false -- name: xcb-util-keysyms - version: 0.4.0 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda - hash: - md5: 632413adcd8bc16b515cab87a2932913 - sha256: 8451d92f25d6054a941b962179180728c48c62aab5bf20ac10fef713d5da6a9a - category: main - optional: false -- name: xcb-util-renderutil - version: 0.3.9 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda - hash: - md5: e995b155d938b6779da6ace6c6b13816 - sha256: 6987588e6fff5892056021c2ea52f7a0deefb2c7348e70d24750e2d60dabf009 - category: main - optional: false -- name: xcb-util-wm - version: 0.4.1 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda - hash: - md5: 90108a432fb5c6150ccfee3f03388656 - sha256: 08ba7147c7579249b6efd33397dc1a8c2404278053165aaecd39280fee705724 - category: main - optional: false - name: xerces-c version: 3.2.5 manager: conda @@ -25785,29 +25802,16 @@ package: sha256: 8ad901a5fe535ebd16b469cf8e46cf174f7e6e4d9b432cc8cc02666a87e7e2ee category: main optional: false -- name: xkeyboard-config - version: '2.41' - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - xorg-libx11: '>=1.8.7,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda - hash: - md5: 81f740407b45e3f9047b3174fa94eb9e - sha256: 56955610c0747ea7cb026bb8aa9ef165ff41d616e89894538173b8b7dd2ee49a - category: main - optional: false - name: xorg-kbproto version: 1.0.7 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=7.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h14c3975_1002.tar.bz2 + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 hash: - md5: 6dfe5dbe10d55266e4a5e89287eed578 - sha256: e0ecf489734baf996703b2b274b0d130485476162ef5aae1d4e74851549a470e + md5: 4b230e8381279d76131116660f5a241a + sha256: e90b0a6a5d41776f11add74aa030f789faf4efd3875c31964d6f9cfa63a10dd1 category: main optional: false - name: xorg-libice @@ -25837,7 +25841,7 @@ package: category: main optional: false - name: xorg-libx11 - version: 1.8.7 + version: 1.8.9 manager: conda platform: linux-64 dependencies: @@ -25846,10 +25850,10 @@ package: xorg-kbproto: '' xorg-xextproto: '>=7.3.0,<8.0a0' xorg-xproto: '' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda hash: - md5: 49e482d882669206653b095f5206c05b - sha256: 7a02a7beac472ae2759498550b5fc5261bf5be7a9a2b4648a3f67818a7bfefcf + md5: 077b6e8ad6a3ddb741fce2496dd01bec + sha256: 3e53ba247f1ad68353f18aceba5bf8ce87e3dea930de85d36946844a7658c9fb category: main optional: false - name: xorg-libxau @@ -25891,11 +25895,11 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=7.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h516909a_0.tar.bz2 + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 hash: - md5: e95a160e60b2a327309a6d323a4d780e - sha256: 6cd3f826a853bb26bf303b26560439b135ebc2a88c9806e70a8d6935cfeeea91 + md5: be93aabceefa2fac576e971aef407908 + sha256: 4df7c5ee11b8686d3453e7f3f4aa20ceef441262b49860733066c52cfd0e4a77 category: main optional: false - name: xorg-libxdmcp @@ -25953,11 +25957,11 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=7.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h14c3975_1002.tar.bz2 + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2 hash: - md5: fbcb7fa11dee1a5d3df4371cc55bb229 - sha256: bbed3c5ab97fdde0a0a2d725be15cd9b5fc770086e0afecebc8c155873bfff73 + md5: 06feff3d2634e3097ce2fe681474b534 + sha256: 38942930f233d1898594dd9edf4b0c0786f3dbc12065a0c308634c37fd936034 category: main optional: false - name: xorg-xextproto @@ -25972,28 +25976,16 @@ package: sha256: b8dda3b560e8a7830fe23be1c58cc41f407b2e20ae2f3b6901eb5842ba62b743 category: main optional: false -- name: xorg-xf86vidmodeproto - version: 2.3.1 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=7.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h516909a_1002.tar.bz2 - hash: - md5: c3f8431e8a5e0b54f8f2ebd812000516 - sha256: 88e67824b807173c684988244965982cd9e63f1ddf33c10333b64c55e1768bf9 - category: main - optional: false - name: xorg-xproto version: 7.0.31 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=7.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h14c3975_1007.tar.bz2 + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2 hash: - md5: a45d8cd411bdf8f08ced463f68986b62 - sha256: d24dfec052d1ed796604caf405d8846a394c7950c60a611ec24a4b91aaa9d56f + md5: b4a4381d54784606820704f7b5f05a15 + sha256: f197bb742a17c78234c24605ad1fe2d88b1d25f332b75d73e5ba8cf8fbc2a10d category: main optional: false - name: xxhash @@ -26446,16 +26438,6 @@ package: sha256: 487fede588040bfa3a43df945275c28c1c73ca75bf705295adb9fbadd2e89be7 category: main optional: false -- name: annotated-types - version: 0.6.0 - manager: pip - platform: linux-64 - dependencies: {} - url: https://files.pythonhosted.org/packages/28/78/d31230046e58c207284c6b2c4e8d96e6d3cb4e52354721b944d3e1ee4aa5/annotated_types-0.6.0-py3-none-any.whl - hash: - sha256: 0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 - category: main - optional: false - name: annotated-types version: 0.6.0 manager: pip @@ -26466,16 +26448,6 @@ package: sha256: 0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 category: main optional: false -- name: annotated-types - version: 0.6.0 - manager: pip - platform: osx-arm64 - dependencies: {} - url: https://files.pythonhosted.org/packages/28/78/d31230046e58c207284c6b2c4e8d96e6d3cb4e52354721b944d3e1ee4aa5/annotated_types-0.6.0-py3-none-any.whl - hash: - sha256: 0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 - category: main - optional: false - name: boto3 version: 1.34.34 manager: pip @@ -27343,6 +27315,26 @@ package: sha256: baac8ace316b801cdb38c84cd0e7e35e60d17d50032c34af9879b0cd91c20861 category: main optional: false +- name: platformdirs + version: 3.11.0 + manager: pip + platform: linux-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/56/29/3ec311dc18804409ecf0d2b09caa976f3ae6215559306b5b530004e11156/platformdirs-3.11.0-py3-none-any.whl + hash: + sha256: e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e + category: main + optional: false +- name: platformdirs + version: 3.11.0 + manager: pip + platform: osx-arm64 + dependencies: {} + url: https://files.pythonhosted.org/packages/56/29/3ec311dc18804409ecf0d2b09caa976f3ae6215559306b5b530004e11156/platformdirs-3.11.0-py3-none-any.whl + hash: + sha256: e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e + category: main + optional: false - name: pydantic version: 2.5.2 manager: pip diff --git a/monodocs-environment.yaml b/monodocs-environment.yaml index 82ce9868f1..6008991174 100644 --- a/monodocs-environment.yaml +++ b/monodocs-environment.yaml @@ -53,7 +53,7 @@ dependencies: - tensorflow>=2.13.0 # onnxtensorflow - scikit-learn # scikit-learn - dask[distributed] # dask - - mlflow==2.7.0 # mlflow + - mlflow>=2.10.0 # mlflow - snowflake-connector-python # snowflake - vaex-core # vaex - openai # chatgpt diff --git a/script/local_build_docs.sh b/script/local_build_docs.sh new file mode 100755 index 0000000000..3e9054bda4 --- /dev/null +++ b/script/local_build_docs.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +set -eo pipefail + +# Available environment variables +# - DEV_DOCS_WATCH: If set, the docs will be built and served using sphinx-autobuild for live updates +# - FLYTEKIT_LOCAL_PATH: If set, the local path to flytekit will be used instead of the source code from the flyteorg/flytekit repo +# - FLYTECTL_LOCAL_PATH: If set, the local path to flytectl will be used instead of the source code from the flyteorg/flytectl repo +# - FLYTESNACKS_LOCAL_PATH: If set, the local path to flytesnacks will be used instead of the source code from the flyteorg/flytesnacks repo +# +# Example usages: +# ./script/local_build_docs.sh +# DEV_DOCS_WATCH=1 ./script/local_build_docs.sh +# FLYTEKIT_LOCAL_PATH=$(realpath ../flytekit) ./script/local_build_docs.sh + +DOCKER_ENV=() +DOCKER_VOLUME_MAPPING=("-v" ".:/flyte") +DOCKER_PORT_MAPPING=() +BUILD_CMD=("sphinx-build" "-M" "html" "." "_build" "-W") + +if [ -n "$DEV_DOCS_WATCH" ]; then + DOCKER_PORT_MAPPING+=("-p" "8000:8000") + BUILD_CMD=("sphinx-autobuild" "--host" "0.0.0.0" "--re-ignore" "'_build|_src|_tags|api|examples|flytectl|flytekit|flytesnacks|protos|tests'" "." "_build/html") +fi + +if [ -n "$FLYTEKIT_LOCAL_PATH" ]; then + DOCKER_VOLUME_MAPPING+=("-v" "$FLYTEKIT_LOCAL_PATH:/flytekit") + DOCKER_ENV+=("--env" "FLYTEKIT_LOCAL_PATH=/flytekit") +fi + +if [ -n "$FLYTECTL_LOCAL_PATH" ]; then + DOCKER_VOLUME_MAPPING+=("-v" "$FLYTECTL_LOCAL_PATH:/flytectl") + DOCKER_ENV+=("--env" "FLYTECTL_LOCAL_PATH=/flytectl") +fi + +if [ -n "$FLYTESNACKS_LOCAL_PATH" ]; then + DOCKER_VOLUME_MAPPING+=("-v" "$FLYTESNACKS_LOCAL_PATH:/flytesnacks") + DOCKER_ENV+=("--env" "FLYTESNACKS_LOCAL_PATH=/flytesnacks") +fi + +DOCKER_CMD=("docker" "run" "--platform" "linux/amd64" "--rm" "--pull" "never" "${DOCKER_ENV[@]}" "${DOCKER_PORT_MAPPING[@]}" "${DOCKER_VOLUME_MAPPING[@]}" "flyte-dev-docs:latest" "${BUILD_CMD[@]}") + +echo "${DOCKER_CMD[*]}" + +"${DOCKER_CMD[@]}" From de61bd0192acfda9cfa4cda4d6034ba00391d59a Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Sun, 21 Apr 2024 01:00:32 -0400 Subject: [PATCH 446/645] use sphinx-design directives instead of sphinx-panels (#471) Signed-off-by: cosmicBboy --- flytectl/docs/source/index.rst | 90 ++++++++++++++++--------------- flytectl/docs/source/overview.rst | 90 ++++++++++++++++--------------- 2 files changed, 94 insertions(+), 86 deletions(-) diff --git a/flytectl/docs/source/index.rst b/flytectl/docs/source/index.rst index 0445ec929c..93ccc96622 100644 --- a/flytectl/docs/source/index.rst +++ b/flytectl/docs/source/index.rst @@ -21,29 +21,31 @@ Installation Flytectl is a Golang binary that can be installed on any platform supported by Golang. -.. tabbed:: OSX +.. tab-set:: - .. prompt:: bash $ + .. tab-item:: OSX - brew install flyteorg/homebrew-tap/flytectl + .. prompt:: bash $ - *Upgrade* existing installation using the following command: + brew install flyteorg/homebrew-tap/flytectl - .. prompt:: bash $ + *Upgrade* existing installation using the following command: - flytectl upgrade + .. prompt:: bash $ -.. tabbed:: Other Operating systems + flytectl upgrade - .. prompt:: bash $ + .. tab-item:: Other Operating systems - curl -sL https://ctl.flyte.org/install | bash + .. prompt:: bash $ - *Upgrade* existing installation using the following command: + curl -sL https://ctl.flyte.org/install | bash - .. prompt:: bash $ + *Upgrade* existing installation using the following command: - flytectl upgrade + .. prompt:: bash $ + + flytectl upgrade **Test** if Flytectl is installed correctly (your Flytectl version should be > 0.2.0) using the following command: @@ -66,50 +68,52 @@ The full list of available configurable options can be found by running ``flytec Currently, the Project ``-p``, Domain ``-d``, and Output ``-o`` flags cannot be used in the config file. -.. tabbed:: Local Flyte Sandbox +.. tab-set:: + + .. tab-item:: Local Flyte Sandbox + + Automatically configured for you by ``flytectl sandbox`` command. - Automatically configured for you by ``flytectl sandbox`` command. + .. code-block:: yaml - .. code-block:: yaml + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:///localhost:30081 + insecure: true # Set to false to enable TLS/SSL connection (not recommended except on local sandbox deployment). + authType: Pkce # authType: Pkce # if using authentication or just drop this. - admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///localhost:30081 - insecure: true # Set to false to enable TLS/SSL connection (not recommended except on local sandbox deployment). - authType: Pkce # authType: Pkce # if using authentication or just drop this. + .. tab-item:: AWS Configuration -.. tabbed:: AWS Configuration + .. code-block:: yaml - .. code-block:: yaml + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:/// + authType: Pkce # authType: Pkce # if using authentication or just drop this. + insecure: true # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) - admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:/// - authType: Pkce # authType: Pkce # if using authentication or just drop this. - insecure: true # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + .. tab-item:: GCS Configuration -.. tabbed:: GCS Configuration + .. code-block:: yaml - .. code-block:: yaml + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:/// + authType: Pkce # authType: Pkce # if using authentication or just drop this. + insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) - admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:/// - authType: Pkce # authType: Pkce # if using authentication or just drop this. - insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + .. tab-item:: Others -.. tabbed:: Others + For other supported storage backends like Oracle, Azure, etc., refer to the configuration structure `here `__. - For other supported storage backends like Oracle, Azure, etc., refer to the configuration structure `here `__. + Place the config file in ``$HOME/.flyte`` directory with the name config.yaml. + This file is typically searched in: - Place the config file in ``$HOME/.flyte`` directory with the name config.yaml. - This file is typically searched in: + * ``$HOME/.flyte`` + * currDir from where you run flytectl + * ``/etc/flyte/config`` - * ``$HOME/.flyte`` - * currDir from where you run flytectl - * ``/etc/flyte/config`` - - You can also pass the file name in the command line using ``--config ``. + You can also pass the file name in the command line using ``--config ``. .. toctree:: diff --git a/flytectl/docs/source/overview.rst b/flytectl/docs/source/overview.rst index 08bb11a01c..aac4c99ee6 100644 --- a/flytectl/docs/source/overview.rst +++ b/flytectl/docs/source/overview.rst @@ -14,29 +14,31 @@ Installation Flytectl is a Golang binary that can be installed on any platform supported by Golang. -.. tabbed:: OSX +.. tab-set:: - .. prompt:: bash $ + .. tab-item:: OSX - brew install flyteorg/homebrew-tap/flytectl + .. prompt:: bash $ - *Upgrade* existing installation using the following command: + brew install flyteorg/homebrew-tap/flytectl - .. prompt:: bash $ + *Upgrade* existing installation using the following command: - flytectl upgrade + .. prompt:: bash $ -.. tabbed:: Other Operating systems + flytectl upgrade - .. prompt:: bash $ + .. tab-item:: Other Operating systems - curl -sL https://ctl.flyte.org/install | bash + .. prompt:: bash $ - *Upgrade* existing installation using the following command: + curl -sL https://ctl.flyte.org/install | bash - .. prompt:: bash $ + *Upgrade* existing installation using the following command: - flytectl upgrade + .. prompt:: bash $ + + flytectl upgrade **Test** if Flytectl is installed correctly (your Flytectl version should be > 0.2.0) using the following command: @@ -59,47 +61,49 @@ The full list of available configurable options can be found by running ``flytec Currently, the Project ``-p``, Domain ``-d``, and Output ``-o`` flags cannot be used in the config file. -.. tabbed:: Local Flyte Sandbox +.. tab-set:: + + .. tab-item:: Local Flyte Sandbox + + Automatically configured for you by ``flytectl sandbox`` command. - Automatically configured for you by ``flytectl sandbox`` command. + .. code-block:: yaml - .. code-block:: yaml + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:///localhost:30081 + insecure: true # Set to false to enable TLS/SSL connection (not recommended except on local sandbox deployment). + authType: Pkce # authType: Pkce # if using authentication or just drop this. - admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:///localhost:30081 - insecure: true # Set to false to enable TLS/SSL connection (not recommended except on local sandbox deployment). - authType: Pkce # authType: Pkce # if using authentication or just drop this. + .. tab-item:: AWS Configuration -.. tabbed:: AWS Configuration + .. code-block:: yaml - .. code-block:: yaml + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:/// + authType: Pkce # authType: Pkce # if using authentication or just drop this. + insecure: true # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) - admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:/// - authType: Pkce # authType: Pkce # if using authentication or just drop this. - insecure: true # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + .. tab-item:: GCS Configuration -.. tabbed:: GCS Configuration + .. code-block:: yaml - .. code-block:: yaml + admin: + # For GRPC endpoints you might want to use dns:///flyte.myexample.com + endpoint: dns:/// + authType: Pkce # authType: Pkce # if using authentication or just drop this. + insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) - admin: - # For GRPC endpoints you might want to use dns:///flyte.myexample.com - endpoint: dns:/// - authType: Pkce # authType: Pkce # if using authentication or just drop this. - insecure: false # insecure: True # Set to true if the endpoint isn't accessible through TLS/SSL connection (not recommended except on local sandbox deployment) + .. tab-item:: Others -.. tabbed:: Others + For other supported storage backends like Oracle, Azure, etc., refer to the configuration structure `here `__. - For other supported storage backends like Oracle, Azure, etc., refer to the configuration structure `here `__. + Place the config file in ``$HOME/.flyte`` directory with the name config.yaml. + This file is typically searched in: - Place the config file in ``$HOME/.flyte`` directory with the name config.yaml. - This file is typically searched in: + * ``$HOME/.flyte`` + * currDir from where you run flytectl + * ``/etc/flyte/config`` - * ``$HOME/.flyte`` - * currDir from where you run flytectl - * ``/etc/flyte/config`` - - You can also pass the file name in the command line using ``--config ``. + You can also pass the file name in the command line using ``--config ``. From c64b5e3e6e86ffd787d547d61c27745a2153ab61 Mon Sep 17 00:00:00 2001 From: Austin Liu Date: Sun, 21 Apr 2024 13:32:47 +0800 Subject: [PATCH 447/645] Finalize flyteidl Rust crate (#5219) Signed-off-by: Austin Liu --- flyteidl/Cargo.lock | 922 ++++++++++++++++++++++++++++++++++++++++++++ flyteidl/Cargo.toml | 15 + flyteidl/lib.rs | 24 ++ 3 files changed, 961 insertions(+) create mode 100644 flyteidl/Cargo.lock create mode 100644 flyteidl/Cargo.toml create mode 100644 flyteidl/lib.rs diff --git a/flyteidl/Cargo.lock b/flyteidl/Cargo.lock new file mode 100644 index 0000000000..3a918d4ae2 --- /dev/null +++ b/flyteidl/Cargo.lock @@ -0,0 +1,922 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "anyhow" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "cc" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "flyteidl" +version = "0.1.0" +dependencies = [ + "prost", + "prost-types", + "tonic", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "getrandom" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" +dependencies = [ + "prost", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustversion" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "syn" +version = "2.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "tokio" +version = "1.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" diff --git a/flyteidl/Cargo.toml b/flyteidl/Cargo.toml new file mode 100644 index 0000000000..ee15f0bffb --- /dev/null +++ b/flyteidl/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "flyteidl" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +prost = "0.12.3" +prost-types = "0.12.3" +tonic = "0.11.0" + +[lib] +name = "flyteidl" +path = "lib.rs" diff --git a/flyteidl/lib.rs b/flyteidl/lib.rs new file mode 100644 index 0000000000..a4757cded0 --- /dev/null +++ b/flyteidl/lib.rs @@ -0,0 +1,24 @@ +pub mod flyteidl { + + pub mod admin { + include!("gen/pb_rust/flyteidl.admin.rs"); + } + pub mod cache { + include!("gen/pb_rust/flyteidl.cacheservice.rs"); + } + pub mod core { + include!("gen/pb_rust/flyteidl.core.rs"); + } + pub mod event { + include!("gen/pb_rust/flyteidl.event.rs"); + } + pub mod plugins { + include!("gen/pb_rust/flyteidl.plugins.rs"); + pub mod kubeflow { + include!("gen/pb_rust/flyteidl.plugins.kubeflow.rs"); + } + } + pub mod service { + include!("gen/pb_rust/flyteidl.service.rs"); + } +} From 6b7467386ad3e21e609c9be74ac7ac9d8b5b4fbb Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Sun, 21 Apr 2024 02:00:45 -0400 Subject: [PATCH 448/645] Use sphinx design instead of sphinx panels (#5254) * use sphinx-design instead of sphinx-panel Signed-off-by: cosmicBboy * update css Signed-off-by: cosmicBboy * update monodocs env Signed-off-by: cosmicBboy * update conda lock file Signed-off-by: cosmicBboy --------- Signed-off-by: cosmicBboy --- docs/_static/custom.css | 11 + docs/conf.py | 3 +- docs/deployment/deployment/index.rst | 8 +- docs/deployment/deployment/multicluster.rst | 591 +-- .../running_a_workflow_locally.md | 14 +- docs/quickstart_guide.md | 10 +- docs/reference/index.rst | 75 - monodocs-environment.lock.yaml | 3588 ++++++++++------- monodocs-environment.yaml | 7 +- 9 files changed, 2437 insertions(+), 1870 deletions(-) delete mode 100644 docs/reference/index.rst diff --git a/docs/_static/custom.css b/docs/_static/custom.css index f9687a7b15..ef4e90b206 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -36,3 +36,14 @@ table { width: 100%; box-shadow: none !important; } + +.sidebar-container, .toc-drawer { + width: 22em; + padding-right: 0; +} + +@media (max-width: 82em) { + .toc-drawer { + right: -22em; + } +} diff --git a/docs/conf.py b/docs/conf.py index 67baf0d907..69068cc7e8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -66,7 +66,7 @@ "sphinxext.remoteliteralinclude", "sphinx_issues", "sphinx_click", - "sphinx_panels", + "sphinx_design", "sphinxcontrib.mermaid", "sphinxcontrib.video", "sphinxcontrib.youtube", @@ -141,7 +141,6 @@ "protos/index.rst", "api/flytekit/_templates/**", "api/flytekit/index.rst", - "reference/index.rst", ] # -- Options for HTML output ------------------------------------------------- diff --git a/docs/deployment/deployment/index.rst b/docs/deployment/deployment/index.rst index 0a44f437ef..40ce8f2739 100644 --- a/docs/deployment/deployment/index.rst +++ b/docs/deployment/deployment/index.rst @@ -102,28 +102,28 @@ team maintains Helm charts that correspond with the latter two deployment paths. K3s bundled container. .. dropdown:: ``flyte-binary``: chart for the **Single Cluster** option. - :title: text-muted + :color: muted .. literalinclude:: ../../../charts/flyte-binary/Chart.yaml :language: yaml :caption: charts/flyte-binary/Chart.yaml .. dropdown:: ``flyte-core``: chart for the **Multiple Cluster** option. - :title: text-muted + :color: muted .. literalinclude:: ../../../charts/flyte-core/Chart.yaml :language: yaml :caption: charts/flyte-core/Chart.yaml .. dropdown:: ``flyte-deps``: chart that installs additional useful dependencies alongside Flyte. - :title: text-muted + :color: muted .. literalinclude:: ../../../charts/flyte-deps/Chart.yaml :language: yaml :caption: charts/flyte-deps/Chart.yaml .. dropdown:: ``flyte``: chart that depends on ``flyte-core``, installing additional dependencies to Flyte deployment. - :title: text-muted + :color: muted .. literalinclude:: ../../../charts/flyte/Chart.yaml :language: yaml diff --git a/docs/deployment/deployment/multicluster.rst b/docs/deployment/deployment/multicluster.rst index 52e0378955..ac2278748c 100644 --- a/docs/deployment/deployment/multicluster.rst +++ b/docs/deployment/deployment/multicluster.rst @@ -42,129 +42,130 @@ Prerequisites To make sure that your multicluster deployment is able to scale and process requests successfully, the following environment-specific requirements should be met: -.. tabbed:: AWS - - 1. An IAM Policy that defines the permissions needed for Flyte. A minimum set of permissions include: - - .. code-block:: json - - "Action": [ - "s3:DeleteObject*", - "s3:GetObject*", - "s3:ListBucket", - "s3:PutObject*" - ], - "Resource": [ - "arn:aws:s3:::*", - "arn:aws:s3:::*/*" +.. tab-set:: + + .. tab-item:: AWS + + 1. An IAM Policy that defines the permissions needed for Flyte. A minimum set of permissions include: + + .. code-block:: json + + "Action": [ + "s3:DeleteObject*", + "s3:GetObject*", + "s3:ListBucket", + "s3:PutObject*" ], - - - 2. Two IAM Roles configured: one for the control plane components, and another for the data plane where the worker Pods and ``flytepropeller`` run. + "Resource": [ + "arn:aws:s3:::*", + "arn:aws:s3:::*/*" + ], - .. note:: - - Using the guidance from this document, make sure to follow your organization's policies to configure IAM resources. - 3. An OIDC Provider associated with each of your EKS clusters. You can use the following command to create and connect the Provider: + 2. Two IAM Roles configured: one for the control plane components, and another for the data plane where the worker Pods and ``flytepropeller`` run. - .. prompt:: bash + .. note:: - eksctl utils associate-iam-oidc-provider --cluster --approve + Using the guidance from this document, make sure to follow your organization's policies to configure IAM resources. - 4. An IAM Trust Relationship that associates each EKS cluster type (control plane or data plane) with the Service Account(s) and namespaces - where the different elements of the system will run. - - Follow the steps in this section to complete the requirements indicated above: + 3. An OIDC Provider associated with each of your EKS clusters. You can use the following command to create and connect the Provider: - **Control plane role** + .. prompt:: bash - 1. Use the following command to simplify the process of both creating a role and configuring an initial Trust Relationship: + eksctl utils associate-iam-oidc-provider --cluster --approve - .. prompt:: bash - - eksctl create iamserviceaccount --cluster= --name=flyteadmin --role-only --role-name=flyte-controlplane-role --attach-policy-arn --approve --region --namespace flyte - - 2. Go to the **IAM** section in your **AWS Management Console** and select the role that was just created - 3. Go to the **Trust Relationships** tab and **Edit the Trust Policy** - 4. Add the ``datacatalog`` Service Account to the ``sub`` section + 4. An IAM Trust Relationship that associates each EKS cluster type (control plane or data plane) with the Service Account(s) and namespaces + where the different elements of the system will run. - .. note:: + Follow the steps in this section to complete the requirements indicated above: - When caching is enabled, the ``datacatalog`` service store hashes of workflow inputs alongside with outputs on blob storage. Learn more `here `__. - - Example configuration: + **Control plane role** - .. code-block:: json + 1. Use the following command to simplify the process of both creating a role and configuring an initial Trust Relationship: - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "Federated": "arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/" - }, - "Action": "sts:AssumeRoleWithWebIdentity", - "Condition": { - "StringEquals": { - "oidc.eks..amazonaws.com/id/:aud": "sts.amazonaws.com", - "oidc.eks..amazonaws.com/id/:sub": [ - "system:serviceaccount:flyte:flyteadmin", - "system:serviceaccount:flyte:datacatalog" - ] - } - } - } - ] - } + .. prompt:: bash - **Data plane role** + eksctl create iamserviceaccount --cluster= --name=flyteadmin --role-only --role-name=flyte-controlplane-role --attach-policy-arn --approve --region --namespace flyte - 1. Create the role and Trust Relationship: + 2. Go to the **IAM** section in your **AWS Management Console** and select the role that was just created + 3. Go to the **Trust Relationships** tab and **Edit the Trust Policy** + 4. Add the ``datacatalog`` Service Account to the ``sub`` section - .. prompt:: bash - - eksctl create iamserviceaccount --cluster= --name=flytepropeller --role-only --role-name=flyte-dataplane-role --attach-policy-arn --approve --region --namespace flyte - - 2. Edit the **Trust Relationship** of the data plane role + .. note:: - .. note:: + When caching is enabled, the ``datacatalog`` service store hashes of workflow inputs alongside with outputs on blob storage. Learn more `here `__. - By default, every Pod created for Task execution, uses the ``default`` Service Account on their respective namespace. In your cluster, you'll have as many - namespaces as ``project`` and ``domain`` combinations you may have. Hence, it might be useful to use a ``StringLike`` condition and to use a wildcard for the namespace name in the Trust Policy + Example configuration: - 3. Add the ``default`` Service Account: - - - Example configuration for one data plane cluster: - - .. code-block:: json - - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "Federated": "arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/" - }, - "Action": "sts:AssumeRoleWithWebIdentity", - "Condition": { - "StringLike": { - "oidc.eks..amazonaws.com/id/.:aud": "sts.amazonaws.com", - "oidc.eks..amazonaws.com/id/.:sub": [ - "system:serviceaccount:flyte:flytepropeller", - "system:serviceaccount:*:default" - ] - } - } - } + .. code-block:: json + + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringEquals": { + "oidc.eks..amazonaws.com/id/:aud": "sts.amazonaws.com", + "oidc.eks..amazonaws.com/id/:sub": [ + "system:serviceaccount:flyte:flyteadmin", + "system:serviceaccount:flyte:datacatalog" + ] + } + } + } + ] + } + + **Data plane role** + + 1. Create the role and Trust Relationship: + + .. prompt:: bash + + eksctl create iamserviceaccount --cluster= --name=flytepropeller --role-only --role-name=flyte-dataplane-role --attach-policy-arn --approve --region --namespace flyte + + 2. Edit the **Trust Relationship** of the data plane role + + .. note:: + + By default, every Pod created for Task execution, uses the ``default`` Service Account on their respective namespace. In your cluster, you'll have as many + namespaces as ``project`` and ``domain`` combinations you may have. Hence, it might be useful to use a ``StringLike`` condition and to use a wildcard for the namespace name in the Trust Policy + + 3. Add the ``default`` Service Account: + + Example configuration for one data plane cluster: - .. note:: + .. code-block:: json - To further refine the Trust Relationship, consider using a ``StringEquals`` condition and adding the ``default`` Service Account only for the ``project``-``domain`` - namespaces where Flyte tasks will run, instead of using a wildcard. + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringLike": { + "oidc.eks..amazonaws.com/id/.:aud": "sts.amazonaws.com", + "oidc.eks..amazonaws.com/id/.:sub": [ + "system:serviceaccount:flyte:flytepropeller", + "system:serviceaccount:*:default" + ] + } + } + } + + .. note:: + + To further refine the Trust Relationship, consider using a ``StringEquals`` condition and adding the ``default`` Service Account only for the ``project``-``domain`` + namespaces where Flyte tasks will run, instead of using a wildcard. .. _dataplane-deployment: @@ -212,22 +213,24 @@ the first cluster only. Use the same ``values-eks.yaml`` or ``values-gcp.yaml`` file you used to deploy the control plane. -.. tabbed:: AWS +.. tab-set:: - .. code-block:: + .. tab-item:: AWS - helm install flyte-core-data flyteorg/flyte-core -n flyte \ - --values values-eks.yaml --values values-dataplane.yaml \ - --create-namespace + .. code-block:: -.. tabbed:: GCP + helm install flyte-core-data flyteorg/flyte-core -n flyte \ + --values values-eks.yaml --values values-dataplane.yaml \ + --create-namespace - .. code-block:: + .. tab-item:: GCP - helm install flyte-core-data -n flyte flyteorg/flyte-core \ - --values values-gcp.yaml \ - --values values-dataplane.yaml \ - --create-namespace flyte + .. code-block:: + + helm install flyte-core-data -n flyte flyteorg/flyte-core \ + --values values-gcp.yaml \ + --values values-dataplane.yaml \ + --create-namespace flyte .. _control-plane-deployment: @@ -379,22 +382,24 @@ label has to be 1. the control plane to run workflows, edit the ``values-controlplane.yaml`` file and set ``flytepropeller.enabled`` to ``true``. Then, perform the ``helm upgrade`` operation and complete the steps in :ref:`this section ` to configure it as a dataplane cluster. -.. tabbed:: AWS +.. tab-set:: + + .. tab-item:: AWS - .. code-block:: + .. code-block:: - helm upgrade flyte-core flyteorg/flyte-core \ - --values values-eks-controlplane.yaml --values values-override.yaml \ - --values values-eks.yaml -n flyte + helm upgrade flyte-core flyteorg/flyte-core \ + --values values-eks-controlplane.yaml --values values-override.yaml \ + --values values-eks.yaml -n flyte -.. tabbed:: GCP + .. tab-item:: GCP - .. code-block:: + .. code-block:: - helm upgrade flyte -n flyte flyteorg/flyte-core values.yaml \ - --values values-gcp.yaml \ - --values values-controlplane.yaml \ - --values values-override.yaml + helm upgrade flyte -n flyte flyteorg/flyte-core values.yaml \ + --values values-gcp.yaml \ + --values values-controlplane.yaml \ + --values values-override.yaml 11. Verify that all Pods in the ``flyte`` namespace are ``Running``: @@ -423,69 +428,71 @@ Configure Execution Cluster Labels The next step is to configure project-domain or workflow labels to schedule on a specific Kubernetes cluster. -.. tabbed:: Configure Project & Domain +.. tab-set:: - 1. Create an ``ecl.yaml`` file with the following contents: - - .. code-block:: yaml + .. tab-item:: Configure Project & Domain - domain: development - project: project1 - value: label1 + 1. Create an ``ecl.yaml`` file with the following contents: - .. note:: + .. code-block:: yaml - Change ``domain`` and ``project`` according to your environment. The ``value`` has - to match with the entry under ``labelClusterMap`` in the ``values-override.yaml`` file. - - 2. Repeat step 1 for every project-domain mapping you need to configure, creating a YAML file for each one. + domain: development + project: project1 + value: label1 - 3. Update the execution cluster label of the project and domain: + .. note:: - .. prompt:: bash $ + Change ``domain`` and ``project`` according to your environment. The ``value`` has + to match with the entry under ``labelClusterMap`` in the ``values-override.yaml`` file. - flytectl update execution-cluster-label --attrFile ecl.yaml + 2. Repeat step 1 for every project-domain mapping you need to configure, creating a YAML file for each one. - Example output: + 3. Update the execution cluster label of the project and domain: - .. prompt:: bash $ + .. prompt:: bash $ - Updated attributes from team1 project and domain development + flytectl update execution-cluster-label --attrFile ecl.yaml + Example output: - 4. Execute a workflow indicating project and domain: + .. prompt:: bash $ - .. prompt:: bash $ + Updated attributes from team1 project and domain development - pyflyte run --remote --project team1 --domain development example.py training_workflow \  ✔ ╱ docs-development-env  - --hyperparameters '{"C": 0.1}' -.. tabbed:: Configure a Specific Workflow mapping + 4. Execute a workflow indicating project and domain: - 1. Create a ``workflow-ecl.yaml`` file with the following example contents: - - .. code-block:: yaml + .. prompt:: bash $ - domain: development - project: project1 - workflow: example.training_workflow - value: project1 + pyflyte run --remote --project team1 --domain development example.py training_workflow \  ✔ ╱ docs-development-env  + --hyperparameters '{"C": 0.1}' - 2. Update execution cluster label of the project and domain + .. tab-item:: Configure a Specific Workflow mapping - .. prompt:: bash $ + 1. Create a ``workflow-ecl.yaml`` file with the following example contents: - flytectl update execution-cluster-label \ - -p project1 -d development \ - example.training_workflow \ - --attrFile workflow-ecl.yaml + .. code-block:: yaml + + domain: development + project: project1 + workflow: example.training_workflow + value: project1 - 3. Execute a workflow indicating project and domain: + 2. Update execution cluster label of the project and domain .. prompt:: bash $ - pyflyte run --remote --project team1 --domain development example.py training_workflow \  ✔ ╱ docs-development-env  - --hyperparameters '{"C": 0.1}' + flytectl update execution-cluster-label \ + -p project1 -d development \ + example.training_workflow \ + --attrFile workflow-ecl.yaml + + 3. Execute a workflow indicating project and domain: + + .. prompt:: bash $ + + pyflyte run --remote --project team1 --domain development example.py training_workflow \  ✔ ╱ docs-development-env  + --hyperparameters '{"C": 0.1}' Congratulations 🎉! With this, the execution of workflows belonging to a specific project-domain or a single specific workflow will be scheduled on the target label @@ -500,165 +507,163 @@ Add another Kubernetes cluster Find in this section the necessary steps to scale out your deployment by adding one Kubernetes cluster. The process can be repeated for additional clusters. -.. tabbed:: AWS +.. tab-set:: - + .. tab-item:: AWS - 1. Create the new cluster: - - .. prompt:: bash $ + 1. Create the new cluster: + + .. prompt:: bash $ - eksctl create cluster --name flyte-dataplane-2 --region --version 1.25 --vpc-private-subnets , --without-nodegroup + eksctl create cluster --name flyte-dataplane-2 --region --version 1.25 --vpc-private-subnets , --without-nodegroup - .. note:: + .. note:: - This is only one of multiple ways to provision an EKS cluster. Follow your organization's policies to complete this step. - + This is only one of multiple ways to provision an EKS cluster. Follow your organization's policies to complete this step. - 2. Add a nodegroup to the cluster. Typically ``t3.xlarge`` instances provide enough resources to get started. Follow your organization's policies in this regard. - 4. Create an OIDC Provider for the new cluster: + 2. Add a nodegroup to the cluster. Typically ``t3.xlarge`` instances provide enough resources to get started. Follow your organization's policies in this regard. - .. prompt:: bash $ + 4. Create an OIDC Provider for the new cluster: - eksctl utils associate-iam-oidc-provider --cluster flyte-dataplane-2 --region --approve + .. prompt:: bash $ - 5. Take note of the OIDC Provider ID: + eksctl utils associate-iam-oidc-provider --cluster flyte-dataplane-2 --region --approve - .. prompt:: bash $ + 5. Take note of the OIDC Provider ID: - aws eks describe-cluster --region --name flyte-dataplane-2 --query "cluster.identity.oidc.issuer" --output text - - 6. Go to the **IAM** section in the **AWS Management Console** and edit the **Trust Policy** of the ``flyte-dataplane-role`` - 7. Add a new ``Principal`` with the new cluster's OIDC Provider ID. Include the ``Action`` and ``Conditions`` section: + .. prompt:: bash $ - .. code-block:: json + aws eks describe-cluster --region --name flyte-dataplane-2 --query "cluster.identity.oidc.issuer" --output text - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "Federated": "arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/" - }, - "Action": "sts:AssumeRoleWithWebIdentity", - "Condition": { - "StringLike": { - "oidc.eks..amazonaws.com/id/:aud": "sts.amazonaws.com", + 6. Go to the **IAM** section in the **AWS Management Console** and edit the **Trust Policy** of the ``flyte-dataplane-role`` + 7. Add a new ``Principal`` with the new cluster's OIDC Provider ID. Include the ``Action`` and ``Conditions`` section: - "oidc.eks..amazonaws.com/id/:sub": [ - "system:serviceaccount:flyte:flytepropeller", - "system:serviceaccount:*:default" - ] + .. code-block:: json + + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringLike": { + "oidc.eks..amazonaws.com/id/:aud": "sts.amazonaws.com", + + "oidc.eks..amazonaws.com/id/:sub": [ + "system:serviceaccount:flyte:flytepropeller", + "system:serviceaccount:*:default" + ] + } + } + }, + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringLike": { + "oidc.eks..amazonaws.com/id/:aud": "sts.amazonaws.com", + "oidc.eks..amazonaws.com/id/:sub": [ + "system:serviceaccount:flyte:flytepropeller", + "system:serviceaccount:*:default" + ] + } + } } - } - }, - { - "Effect": "Allow", - "Principal": { - "Federated": "arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/" - }, - "Action": "sts:AssumeRoleWithWebIdentity", - "Condition": { - "StringLike": { - "oidc.eks..amazonaws.com/id/:aud": "sts.amazonaws.com", - "oidc.eks..amazonaws.com/id/:sub": [ - "system:serviceaccount:flyte:flytepropeller", - "system:serviceaccount:*:default" - ] - } - } - } - ] - } - - - - 7. Install the data plane Helm chart following the steps in the **Data plane deployment** section. See :ref:`section `. - 8. Follow steps 1-3 in the **control plane configuration** section (see :ref:`section `) to generate and populate a new section in your ``secrets.yaml`` file - - Example: + ] + } - .. code-block:: yaml + 7. Install the data plane Helm chart following the steps in the **Data plane deployment** section. See :ref:`section `. + 8. Follow steps 1-3 in the **control plane configuration** section (see :ref:`section `) to generate and populate a new section in your ``secrets.yaml`` file - apiVersion: v1 - kind: Secret - metadata: - name: cluster-credentials - namespace: flyte - type: Opaque - data: - dataplane_1_token: - dataplane_1_cacert: - dataplane_2_token: - dataplane_2_cacert: - - 9. Connect to the control plane cluster and update the ``cluster-credentials`` Secret: + Example: - .. prompt:: bash $ + .. code-block:: yaml - kubect apply -f secrets.yaml + apiVersion: v1 + kind: Secret + metadata: + name: cluster-credentials + namespace: flyte + type: Opaque + data: + dataplane_1_token: + dataplane_1_cacert: + dataplane_2_token: + dataplane_2_cacert: - 10. Go to your ``values-override.yaml`` file and add the information of the new cluster. Adding a new label is not entirely needed. - Nevertheless, in the following example a new label is created to illustrate Flyte's capability to schedule workloads on different clusters - in response to user-defined mappings of ``project``, ``domain`` and ``label``:abbr: + 9. Connect to the control plane cluster and update the ``cluster-credentials`` Secret: - .. code-block:: yaml - - ... #all the above content remains the same - configmap: - clusters: - labelClusterMap: - label1: - - id: dataplane_1 - weight: 1 - label2: - - id: dataplane_2 - weight: 1 - clusterConfigs: - - name: "dataplane_1" - endpoint: https://.com:443 - enabled: true - auth: - type: "file_path" - tokenPath: "/var/run/credentials/dataplane_1_token" - certPath: "/var/run/credentials/dataplane_1_cacert" - - name: "dataplane_2" - endpoint: https://:443 - enabled: true - auth: - type: "file_path" - tokenPath: "/var/run/credentials/dataplane_2_token" - certPath: "/var/run/credentials/dataplane_2_cacert" - - 11. Update the Helm release in the control plane cluster: + .. prompt:: bash $ - .. prompt:: bash $ + kubect apply -f secrets.yaml - helm upgrade flyte-core-control flyteorg/flyte-core -n flyte --values values-controlplane.yaml --values values-eks.yaml --values values-override.yaml + 10. Go to your ``values-override.yaml`` file and add the information of the new cluster. Adding a new label is not entirely needed. + Nevertheless, in the following example a new label is created to illustrate Flyte's capability to schedule workloads on different clusters + in response to user-defined mappings of ``project``, ``domain`` and ``label``:abbr: - 12. Create a new execution cluster labels file with the following sample content: + .. code-block:: yaml - .. code-block:: yaml + ... #all the above content remains the same + configmap: + clusters: + labelClusterMap: + label1: + - id: dataplane_1 + weight: 1 + label2: + - id: dataplane_2 + weight: 1 + clusterConfigs: + - name: "dataplane_1" + endpoint: https://.com:443 + enabled: true + auth: + type: "file_path" + tokenPath: "/var/run/credentials/dataplane_1_token" + certPath: "/var/run/credentials/dataplane_1_cacert" + - name: "dataplane_2" + endpoint: https://:443 + enabled: true + auth: + type: "file_path" + tokenPath: "/var/run/credentials/dataplane_2_token" + certPath: "/var/run/credentials/dataplane_2_cacert" - domain: production - project: team1 - value: label2 - - 13. Update the cluster execution labels for the project: + 11. Update the Helm release in the control plane cluster: - .. prompt:: bash $ + .. prompt:: bash $ - flytectl update execution-cluster-label --attrFile ecl-production.yaml + helm upgrade flyte-core-control flyteorg/flyte-core -n flyte --values values-controlplane.yaml --values values-eks.yaml --values values-override.yaml - 14. Finally, submit a workflow execution that matches the label of the new cluster: - - .. prompt:: bash $ + 12. Create a new execution cluster labels file with the following sample content: + + .. code-block:: yaml + + domain: production + project: team1 + value: label2 + + 13. Update the cluster execution labels for the project: + + .. prompt:: bash $ + + flytectl update execution-cluster-label --attrFile ecl-production.yaml + + 14. Finally, submit a workflow execution that matches the label of the new cluster: + + .. prompt:: bash $ + + pyflyte run --remote --project team1 --domain production example.py \ + training_workflow --hyperparameters '{"C": 0.1}' - pyflyte run --remote --project team1 --domain production example.py training_workflow \ - --hyperparameters '{"C": 0.1}' - - 15. A successful execution should be visible on the UI, confirming it ran in the new cluster: + 15. A successful execution should be visible on the UI, confirming it ran in the new cluster: - .. image:: https://raw.githubusercontent.com/flyteorg/static-resources/main/common/multicluster-execution.png + .. image:: https://raw.githubusercontent.com/flyteorg/static-resources/main/common/multicluster-execution.png diff --git a/docs/getting_started_with_workflow_development/running_a_workflow_locally.md b/docs/getting_started_with_workflow_development/running_a_workflow_locally.md index db194905dc..64573f990d 100644 --- a/docs/getting_started_with_workflow_development/running_a_workflow_locally.md +++ b/docs/getting_started_with_workflow_development/running_a_workflow_locally.md @@ -69,7 +69,8 @@ Flyte supports any [OCI-compatible](https://opencontainers.org/) container techn You must install `flytectl` to start and configure a local Flyte cluster, as well as register workflows to a local or remote Flyte cluster. -````{tabbed} macOS +::::{tab-set} +:::{tab-item} macOS To use Homebrew, on the command line, run the following: ```{prompt} bash $ @@ -83,9 +84,9 @@ curl -sL https://ctl.flyte.org/install | sudo bash -s -- -b /usr/local/bin ``` To download manually, see the [flytectl releases](https://github.com/flyteorg/flytectl/releases). -```` +::: -````{tabbed} Linux +:::{tab-item} Linux To use `curl`, on the command line, run the following: ```{prompt} bash $ @@ -93,9 +94,9 @@ curl -sL https://ctl.flyte.org/install | sudo bash -s -- -b /usr/local/bin ``` To download manually, see the [flytectl releases](https://github.com/flyteorg/flytectl/releases). -```` +::: -````{tabbed} Windows +:::{tab-item} Windows To use `curl`, in a Linux shell (such as [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)), on the command line, run the following: ```{prompt} bash $ @@ -103,7 +104,8 @@ curl -sL https://ctl.flyte.org/install | sudo bash -s -- -b /usr/local/bin ``` To download manually, see the [flytectl releases](https://github.com/flyteorg/flytectl/releases). -```` +::: +:::: ### Steps diff --git a/docs/quickstart_guide.md b/docs/quickstart_guide.md index eb6d186d86..85a28ff5af 100644 --- a/docs/quickstart_guide.md +++ b/docs/quickstart_guide.md @@ -4,15 +4,17 @@ In this guide, you will create and run a Flyte workflow in a local Python environment to generate the output "Hello, world!" ````{dropdown} Try Flyte in your browser -:title: text-muted +:color: muted :animate: fade-in-slide-down -```{link-button} https://sandbox.union.ai/ +```{button-link} https://sandbox.union.ai/ --- -classes: try-hosted-flyte btn-warning btn-block -text: Hosted Flyte sandbox +class: try-hosted-flyte btn-warning btn-block --- + +Hosted Flyte sandbox ``` + ```{div} text-muted *Courtesy of [Union.ai](https://www.union.ai/)* ``` diff --git a/docs/reference/index.rst b/docs/reference/index.rst deleted file mode 100644 index 2b4d977a45..0000000000 --- a/docs/reference/index.rst +++ /dev/null @@ -1,75 +0,0 @@ -.. _reference: - -############# -API Reference -############# - -.. panels:: - :header: text-center - :column: col-lg-12 p-2 - - .. link-button:: https://flytectl.readthedocs.io - :type: url - :text: Flytectl - :classes: btn-block stretched-link - ^^^^^^^^^^^^ - The official Flyte Command-line Interface. - - --- - - .. link-button:: https://flyteidl.readthedocs.io - :type: url - :text: FlyteIDL - :classes: btn-block stretched-link - ^^^^^^^^^^^^ - The core language specification and backend service API specification for Flyte. - - --- - - .. link-button:: https://flytekit.readthedocs.io - :type: url - :text: Flytekit - :classes: btn-block stretched-link - ^^^^^^^^^^^^ - The Python SDK for Flyte. - - --- - - .. link-button:: https://github.com/spotify/flytekit-java - :type: url - :text: Flytekit-java - :classes: btn-block stretched-link - ^^^^^^^^^^^^ - The Java/Scala SDK for Flyte. - - --- - - .. link-button:: https://docs.flyte.org/en/latest/protos/docs/service/service.html - :type: url - :text: FlyteAdmin - :classes: btn-block stretched-link - ^^^^^^^^^^^^ - Flyte Backend REST/gRPC API specification. - - --- - - .. link-button:: reference-swagger - :type: ref - :text: Flyte API Swagger Playground - :classes: btn-block stretched-link - ^^^^^^^^^^^^ - FlyteAdmin exposes a REST interface. Try out the API using an interactive environment. - - -.. toctree:: - :maxdepth: 1 - :caption: API Reference - :name: apiref - :hidden: - - FlyteCTL - FlyteIDL - Flytekit Python - Flytekit Java - FlyteAdmin - swagger diff --git a/monodocs-environment.lock.yaml b/monodocs-environment.lock.yaml index 929cf9632b..5dff255b91 100644 --- a/monodocs-environment.lock.yaml +++ b/monodocs-environment.lock.yaml @@ -13,9 +13,9 @@ version: 1 metadata: content_hash: - linux-64: a77f3bb3db015b7747687ed6ad5ecb0fd05c8b39c4216cc0aa26500f539e71fc - osx-arm64: 446eed51611e2742973c1409920361539fa03e4c4c2cc3b6b4a5499a95831c85 - osx-64: 99fdb22e3d6a1054e7f3e655d0550e0b9dff6adc206fb5b5c5219d371468faf8 + linux-64: 9a43f83349c8eac7d553b282ec449bcfc3082d7988b474f46a32eadbbe40deb9 + osx-arm64: 66b012a98cf6f80cb97eb0652346151569c28e12c761cdbf858de411bf680dde + osx-64: c9ef67ba3bc4d7884f697ccecf0f0605850d2aa97a1f27052160a6eeacaf35c9 channels: - url: conda-forge used_env_vars: [] @@ -110,8 +110,8 @@ package: python: '>=3.6' requests: '>=2.0.0' pyjwt: '>=1.0.0' - cryptography: '>=1.1.0' python-dateutil: '>=2.1.0' + cryptography: '>=1.1.0' url: https://conda.anaconda.org/conda-forge/noarch/adal-1.2.7-pyhd8ed1ab_0.tar.bz2 hash: md5: 1a0f134d22bad81e93f1e130b35afb35 @@ -153,7 +153,7 @@ package: category: main optional: false - name: adlfs - version: 2024.2.0 + version: 2024.4.1 manager: conda platform: osx-64 dependencies: @@ -164,10 +164,10 @@ package: fsspec: '>=2023.12.0' azure-storage-blob: '>=12.12.0' azure-core: '>=1.23.1,<2.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/adlfs-2024.2.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/adlfs-2024.4.1-pyhd8ed1ab_0.conda hash: - md5: 4dfa76ae23a7c27f4ccaf64945b71871 - sha256: b9ae4843b862ee69a1bfdcbb4604db817dd4f220d598fcbe64987c700b4e4cf4 + md5: 7819363253d016ca65ea5b78887afe94 + sha256: d66bca6f6aca41267bb51096f4cc6990cb054c302b4e621f52e7b0c9a1909611 category: main optional: false - name: adlfs @@ -205,7 +205,7 @@ package: category: main optional: false - name: aiobotocore - version: 2.12.1 + version: 2.12.2 manager: conda platform: osx-64 dependencies: @@ -214,10 +214,10 @@ package: aioitertools: '>=0.5.1,<1.0.0' aiohttp: '>=3.7.4.post0,<4.0.0' botocore: '>=1.34.41,<1.34.52' - url: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-2.12.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-2.12.2-pyhd8ed1ab_0.conda hash: - md5: 045560daef58c75a759c2638fbdb5c6a - sha256: e7d43681c7c2957b535aac2b3ad90013bcb39ed5514cea3cec52302f624d457a + md5: 624f424fa086b5ac029de79288c33308 + sha256: 97a7da3a5389a4b3a746b6565778319bde28edaeb11e3af371f2c08ebc99438a category: main optional: false - name: aiobotocore @@ -459,6 +459,18 @@ package: sha256: e4bc9aa5a6e866461274826bb750407a407fed9207a5adb70bf727f6addd7fe6 category: main optional: false +- name: alsa-lib + version: 1.2.11 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda + hash: + md5: 0bb492cca54017ea314b809b1ee3a176 + sha256: 0e2b75b9834a6e520b13db516f7cf5c9cea8f0bbc9157c978444173dacb98fec + category: main + optional: false - name: altair version: 4.2.2 manager: conda @@ -526,6 +538,19 @@ package: sha256: 201c040b6ee0045805a777f75f37a8648eb8dfd4725d62a4fcddc24d7d6c2a9f category: main optional: false +- name: aniso8601 + version: 9.0.1 + manager: conda + platform: osx-64 + dependencies: + python-dateutil: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/aniso8601-9.0.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 36fba1a639f2d24723c5480345b78553 + sha256: 201c040b6ee0045805a777f75f37a8648eb8dfd4725d62a4fcddc24d7d6c2a9f + category: main + optional: false - name: aniso8601 version: 9.0.1 manager: conda @@ -552,6 +577,19 @@ package: sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd category: main optional: false +- name: annotated-types + version: 0.6.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + typing-extensions: '>=4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + hash: + md5: 997c29372bdbe2afee073dff71f35923 + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + category: main + optional: false - name: annotated-types version: 0.6.0 manager: conda @@ -565,17 +603,40 @@ package: sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd category: main optional: false -- name: ansiwrap - version: 0.8.4 +- name: anyascii + version: 0.3.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/anyascii-0.3.2-pyhd8ed1ab_0.conda + hash: + md5: 70b6fc71d80ea6176f5302ebbeb13d8a + sha256: 8ad0591c262e63f3a66fe093886a4b5d00d3ad6223560fc2a88da441c672fddc + category: main + optional: false +- name: anyascii + version: 0.3.2 manager: conda platform: osx-64 dependencies: - textwrap3: '' - python: <3.12.0a0 - url: https://conda.anaconda.org/conda-forge/noarch/ansiwrap-0.8.4-py_0.tar.bz2 + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/anyascii-0.3.2-pyhd8ed1ab_0.conda + hash: + md5: 70b6fc71d80ea6176f5302ebbeb13d8a + sha256: 8ad0591c262e63f3a66fe093886a4b5d00d3ad6223560fc2a88da441c672fddc + category: main + optional: false +- name: anyascii + version: 0.3.2 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/anyascii-0.3.2-pyhd8ed1ab_0.conda hash: - md5: f09557e2a7cbd2470a2ab6353000cebd - sha256: 34e2445a78857c7418ab738b3a3c88f3226923676c3c185688dd570a6f9129a4 + md5: 70b6fc71d80ea6176f5302ebbeb13d8a + sha256: 8ad0591c262e63f3a66fe093886a4b5d00d3ad6223560fc2a88da441c672fddc category: main optional: false - name: anyio @@ -1087,6 +1148,18 @@ package: sha256: d40f103467fd2fa426072691919fd135a4fed4a2b03cd12256ff0fee37a98249 category: main optional: false +- name: attr + version: 2.5.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + hash: + md5: d9c69a24ad678ffce24c6543a0176b00 + sha256: 82c13b1772c21fc4a17441734de471d3aabf82b61db9b11f4a1bd04a9c4ac324 + category: main + optional: false - name: attrs version: 23.2.0 manager: conda @@ -1415,7 +1488,7 @@ package: category: main optional: false - name: aws-c-mqtt - version: 0.10.1 + version: 0.10.0 manager: conda platform: linux-64 dependencies: @@ -1423,10 +1496,10 @@ package: aws-c-http: '>=0.8.0,<0.8.1.0a0' aws-c-io: '>=0.14.0,<0.14.1.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.1-h2b97f5f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.0-h2b97f5f_3.conda hash: - md5: 4cba7afc0f74a7cce3159c0bceb607c3 - sha256: 8edcb09a2d93c24320f517f837a0e46e98749b72dc7c9d55ce1fa0c4fa5db116 + md5: fd57022ff2e0bd1dcaf5399ad16763b0 + sha256: 2cd60ece1706c84b50be9ccca101a711d1905a3c38395c4ff1f9b5d1a689d207 category: main optional: false - name: aws-c-mqtt @@ -1595,15 +1668,15 @@ package: aws-c-event-stream: '>=0.4.1,<0.4.2.0a0' aws-c-http: '>=0.8.0,<0.8.1.0a0' aws-c-io: '>=0.14.0,<0.14.1.0a0' - aws-c-mqtt: '>=0.10.1,<0.10.2.0a0' + aws-c-mqtt: '>=0.10.0,<0.10.1.0a0' aws-c-s3: '>=0.4.9,<0.4.10.0a0' aws-c-sdkutils: '>=0.1.13,<0.1.14.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.0-h04327c0_8.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.0-hc5c3545_8.conda hash: - md5: 8d2aeb8c24b47ad3ff87166957b216fd - sha256: 4bdef70ff6362d8a3350b4c4181d078e7b1f654a249d63294e9ab1c5a9ca72c7 + md5: 504eb8e5c22244f9f2427c2313ac629a + sha256: a81784ae987c6cddb65fd28dfcea48bbe9dcfb82b08b9d1add7faa92cfb72b42 category: main optional: false - name: aws-crt-cpp @@ -1856,19 +1929,19 @@ package: category: main optional: false - name: azure-identity - version: 1.15.0 + version: 1.16.0 manager: conda platform: osx-64 dependencies: python: '>=3.7' cryptography: '>=2.5' - azure-core: <2.0.0,>=1.23.0 - msal_extensions: <2.0.0,>=0.3.0 - msal: <2.0.0,>=1.24.0 - url: https://conda.anaconda.org/conda-forge/noarch/azure-identity-1.15.0-pyhd8ed1ab_0.conda + azure-core: '>=1.23.0' + msal: '>=1.24.0' + msal_extensions: '>=0.3.0' + url: https://conda.anaconda.org/conda-forge/noarch/azure-identity-1.16.0-pyhd8ed1ab_0.conda hash: - md5: d1ef208ae2a355e5bb9cdce337644ce9 - sha256: a7a80ce603b0b2af0670e676b0ce96cc3fddd7c59f8f2c4d5767f5cfda7a74e9 + md5: 2974f226dac8973dc9dbb6d053240a61 + sha256: d05901b713bae688daf511e12fd9481aa37e7b03beff6363d8b6801e4610ea54 category: main optional: false - name: azure-identity @@ -2188,26 +2261,6 @@ package: sha256: 8f65c16a9f85285e1f704a26d4c5ced25f46544f5cc20dc8a4aebd7796f8011a category: main optional: false -- name: black - version: 24.3.0 - manager: conda - platform: osx-64 - dependencies: - click: '>=8.0.0' - mypy_extensions: '>=0.4.3' - packaging: '>=22.0' - pathspec: '>=0.9' - platformdirs: '>=2' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - tomli: '>=1.1.0' - typing_extensions: '>=4.0.1' - url: https://conda.anaconda.org/conda-forge/osx-64/black-24.3.0-py39h6e9494a_0.conda - hash: - md5: d1fd38166a4edfc6b81ca209ac7393d2 - sha256: 03d2486854754203540352e2ff94d9ddc4a25674c450f2a3cacaa682faf23b90 - category: main - optional: false - name: blake3 version: 0.3.3 manager: conda @@ -2360,7 +2413,7 @@ package: libcxx: '>=15.0.7' libzlib: '>=1.2.13,<1.3.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - snappy: '>=1.1.10,<2.0a0' + snappy: '>=1.1.10,<1.2.0a0' zstd: '>=1.5.5,<1.6.0a0' url: https://conda.anaconda.org/conda-forge/osx-64/blosc-1.21.5-heccf04b_0.conda hash: @@ -2406,7 +2459,7 @@ package: category: main optional: false - name: bokeh - version: 3.4.0 + version: 3.4.1 manager: conda platform: osx-64 dependencies: @@ -2420,10 +2473,10 @@ package: tornado: '>=6.2' xyzservices: '>=2021.09.1' contourpy: '>=1.2' - url: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.1-pyhd8ed1ab_0.conda hash: - md5: eebbbfdb7eb885ddc751c790c3d0ad64 - sha256: a980687100456202425af0936185ef95c53309044e271daa60d2eeb009410f73 + md5: 0f8e0831bbf38d83973438ce9af9af9a + sha256: 0289e61d7a30a693cf79d36484abd13f72ad785bd23cadc227c29dca89d95046 category: main optional: false - name: bokeh @@ -3310,15 +3363,15 @@ package: category: main optional: false - name: cloudpickle - version: 2.2.1 + version: 3.0.0 manager: conda platform: osx-64 dependencies: - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda hash: - md5: b325bfc4cff7d7f8a868f1f7ecc4ed16 - sha256: f0c2fd0e842899a05ddd7b147fb26424adf58be0e8e54e5bc68b8f7e67d05dcd + md5: 753d29fe41bb881e4b9c004f0abf973f + sha256: 0dfbc1ffa72e7a0882f486c9b1e4e9cccb68cf5c576fe53a89d076c9f1d43754 category: main optional: false - name: cloudpickle @@ -3483,18 +3536,6 @@ package: sha256: 10577f82bafd5d37f0c3f2122272d0dc1f2d133655c2bdd1a3cd5f910d0bd4c5 category: main optional: false -- name: configparser - version: 6.0.1 - manager: conda - platform: osx-64 - dependencies: - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/configparser-6.0.1-pyhd8ed1ab_0.conda - hash: - md5: 2a24e68637e51e2adf001e9d0af848b1 - sha256: e01107b458dd21f1915dcd9901f5ecc7d918a8157d9a9802020286ed83f9847e - category: main - optional: false - name: contourpy version: 1.2.1 manager: conda @@ -3512,19 +3553,18 @@ package: category: main optional: false - name: contourpy - version: 1.2.0 + version: 1.2.1 manager: conda platform: osx-64 dependencies: - __osx: '>=10.9' - libcxx: '>=16.0.6' - numpy: '>=1.20,<2' + libcxx: '>=16' + numpy: '>=1.20' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.0-py39h6be1789_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py39h0ca7971_0.conda hash: - md5: f612db80986ecdc867662b9dc4e46f11 - sha256: cd0808189a10f45b41ef8eee2f373ae870673b0fe49d17ecee4e401445f17ea6 + md5: a4c478d3b64c81d1742dc8073e4996b6 + sha256: 2ed1f40e016afaeb705297d6ce5b474c3570890bf972d3425c37bf45e196d088 category: main optional: false - name: contourpy @@ -3691,46 +3731,43 @@ package: sha256: 4ce400c11245a79feb9fea93e8179379c48af6e755347f3c91181c5fd54423e9 category: main optional: false -- name: cuda-version - version: '11.8' +- name: cuda-cudart + version: 12.4.127 manager: conda platform: linux-64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda + dependencies: + __glibc: '>=2.17,<3.0.a0' + cuda-cudart_linux-64: 12.4.127 + cuda-version: '>=12.4,<12.5.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.4.127-hd3aeb46_0.conda hash: - md5: 670f0e1593b8c1d84f57ad5fe5256799 - sha256: 53e0ffc14ea2f2b8c12320fd2aa38b01112763eba851336ff5953b436ae61259 + md5: fb2b98fe862228c47f67ab7d8bcdc259 + sha256: a80c060ae8c2eed29dd1db0d01404547f6f1537c98ccdbf218a0e7d1ee8e2498 category: main optional: false -- name: cudatoolkit - version: 11.8.0 +- name: cuda-cudart_linux-64 + version: 12.4.127 manager: conda platform: linux-64 dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/cudatoolkit-11.8.0-h4ba93d1_13.conda + cuda-version: '>=12.4,<12.5.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.4.127-h59595ed_0.conda hash: - md5: eb43f5f1f16e2fad2eba22219c3e499b - sha256: 1797bacaf5350f272413c7f50787c01aef0e8eb955df0f0db144b10be2819752 + md5: 8abaa644e2567a0413c8a391c546ea8c + sha256: a4ef8e2f9017bd0f2759fd4790c0ffc451564c17693bc114de9540c4453de00a category: main optional: false -- name: cudnn - version: 8.9.7.29 +- name: cuda-version + version: '12.4' manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - cuda-version: '>=11.0,<12.0a0' - cudatoolkit: 11.* - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/cudnn-8.9.7.29-hbc23b4c_3.conda + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.4-h3060b56_3.conda hash: - md5: 4a2d5fab2871d95544de4e1752948d0f - sha256: c553234d447d9938556f067aba7a4686c8e5427e03e740e67199da3782cc420c + md5: c9a3fe8b957176e1a8452c6f3431b0d8 + sha256: 571d32fbd0dc8df6e85c14d1757549927e272af9c70b935d7e3a553ab0b0b4da category: main optional: false - name: cycler @@ -3813,15 +3850,15 @@ package: category: main optional: false - name: dask - version: 2024.4.1 + version: 2024.4.2 manager: conda platform: linux-64 dependencies: bokeh: '>=2.4.2,!=3.0.*' cytoolz: '>=0.11.0' - dask-core: '>=2024.4.1,<2024.4.2.0a0' + dask-core: '>=2024.4.2,<2024.4.3.0a0' dask-expr: '>=1.0,<1.1' - distributed: '>=2024.4.1,<2024.4.2.0a0' + distributed: '>=2024.4.2,<2024.4.3.0a0' jinja2: '>=2.10.3' lz4: '>=4.3.2' numpy: '>=1.21' @@ -3829,14 +3866,14 @@ package: pyarrow: '>=7.0' pyarrow-hotfix: '' python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.4.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.4.2-pyhd8ed1ab_0.conda hash: - md5: 1afbed2c3ca32ee7c7acd9939460ddd3 - sha256: 5f6151fcb5e5395c3e2601e969645c5b8097db74381a3e41001dce846937ab7b + md5: a0e5045f4fae04acbe70f4c821d65302 + sha256: 7c12de297cef16920dd96ec0796578b071086dfbe6d7befb1a9c6ceaaf4c572a category: main optional: false - name: dask - version: 2024.3.1 + version: 2024.4.2 manager: conda platform: osx-64 dependencies: @@ -3850,16 +3887,16 @@ package: cytoolz: '>=0.11.0' bokeh: '>=2.4.2,!=3.0.*' dask-expr: '>=1.0,<1.1' - dask-core: '>=2024.3.1,<2024.3.2.0a0' - distributed: '>=2024.3.1,<2024.3.2.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.3.1-pyhd8ed1ab_0.conda + dask-core: '>=2024.4.2,<2024.4.3.0a0' + distributed: '>=2024.4.2,<2024.4.3.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.4.2-pyhd8ed1ab_0.conda hash: - md5: e3f23f17022881c62e75ddbab7a61f9e - sha256: ee6ba90fab615bd224d58e1c8f6d049e42a044dcd66ee465e516d85282d08336 + md5: a0e5045f4fae04acbe70f4c821d65302 + sha256: 7c12de297cef16920dd96ec0796578b071086dfbe6d7befb1a9c6ceaaf4c572a category: main optional: false - name: dask - version: 2024.4.1 + version: 2024.4.2 manager: conda platform: osx-arm64 dependencies: @@ -3873,16 +3910,16 @@ package: cytoolz: '>=0.11.0' bokeh: '>=2.4.2,!=3.0.*' dask-expr: '>=1.0,<1.1' - dask-core: '>=2024.4.1,<2024.4.2.0a0' - distributed: '>=2024.4.1,<2024.4.2.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.4.1-pyhd8ed1ab_0.conda + dask-core: '>=2024.4.2,<2024.4.3.0a0' + distributed: '>=2024.4.2,<2024.4.3.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/dask-2024.4.2-pyhd8ed1ab_0.conda hash: - md5: 1afbed2c3ca32ee7c7acd9939460ddd3 - sha256: 5f6151fcb5e5395c3e2601e969645c5b8097db74381a3e41001dce846937ab7b + md5: a0e5045f4fae04acbe70f4c821d65302 + sha256: 7c12de297cef16920dd96ec0796578b071086dfbe6d7befb1a9c6ceaaf4c572a category: main optional: false - name: dask-core - version: 2024.4.1 + version: 2024.4.2 manager: conda platform: linux-64 dependencies: @@ -3895,14 +3932,14 @@ package: python: '>=3.9' pyyaml: '>=5.3.1' toolz: '>=0.10.0' - url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda hash: - md5: 52387f00fee8dcd5cf75f8886025293f - sha256: b5df58b0b24da66acb21343a054e0f04edaf74c6aacf936422e2b000cd654457 + md5: bb4e6c52855aa64a5443ca4eedaa6cfe + sha256: 5911f7de216d57941d1eeb77d6bfa224bd3d7370957807381be1c5c437ac07f0 category: main optional: false - name: dask-core - version: 2024.3.1 + version: 2024.4.2 manager: conda platform: osx-64 dependencies: @@ -3915,14 +3952,14 @@ package: click: '>=8.1' importlib_metadata: '>=4.13.0' fsspec: '>=2021.09.0' - url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda hash: - md5: 52dd56ce3afa6a52c2f3d3116875ff32 - sha256: 396607b11601c89331d6934ded9f9765a9aa8485fee19ea8d466c631bee3ba61 + md5: bb4e6c52855aa64a5443ca4eedaa6cfe + sha256: 5911f7de216d57941d1eeb77d6bfa224bd3d7370957807381be1c5c437ac07f0 category: main optional: false - name: dask-core - version: 2024.4.1 + version: 2024.4.2 manager: conda platform: osx-arm64 dependencies: @@ -3935,75 +3972,55 @@ package: click: '>=8.1' importlib_metadata: '>=4.13.0' fsspec: '>=2021.09.0' - url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda hash: - md5: 52387f00fee8dcd5cf75f8886025293f - sha256: b5df58b0b24da66acb21343a054e0f04edaf74c6aacf936422e2b000cd654457 + md5: bb4e6c52855aa64a5443ca4eedaa6cfe + sha256: 5911f7de216d57941d1eeb77d6bfa224bd3d7370957807381be1c5c437ac07f0 category: main optional: false - name: dask-expr - version: 1.0.11 + version: 1.0.12 manager: conda platform: linux-64 dependencies: - dask-core: 2024.4.1 + dask-core: 2024.4.2 pandas: '>=2' pyarrow: '' python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.11-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.12-pyhd8ed1ab_0.conda hash: - md5: 5c6bc104095ed12db6b1be04181e9afa - sha256: 193e176d808268a7eed7ea5c3f8f68ba3ab03cd9ff94cd5b2369d3d03fabe8cd + md5: 2480fde61a52e5a2f73fb73553b317ab + sha256: c1023da9890c41c523de9530a728d7a5caf9c4e68967baf5280676e6ba06aa65 category: main optional: false - name: dask-expr - version: 1.0.5 + version: 1.0.12 manager: conda platform: osx-64 dependencies: pyarrow: '' python: '>=3.9' pandas: '>=2' - dask-core: 2024.3.1 - url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.5-pyhd8ed1ab_0.conda + dask-core: 2024.4.2 + url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.12-pyhd8ed1ab_0.conda hash: - md5: d1e973e2e617f806194f4e664c2d3d33 - sha256: fb83d89b4303c620bc1d7ff968db15622548110d74f0d2d8f9cc5fd180830e61 + md5: 2480fde61a52e5a2f73fb73553b317ab + sha256: c1023da9890c41c523de9530a728d7a5caf9c4e68967baf5280676e6ba06aa65 category: main optional: false - name: dask-expr - version: 1.0.11 + version: 1.0.12 manager: conda platform: osx-arm64 dependencies: pyarrow: '' python: '>=3.9' pandas: '>=2' - dask-core: 2024.4.1 - url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.11-pyhd8ed1ab_0.conda - hash: - md5: 5c6bc104095ed12db6b1be04181e9afa - sha256: 193e176d808268a7eed7ea5c3f8f68ba3ab03cd9ff94cd5b2369d3d03fabe8cd - category: main - optional: false -- name: databricks-cli - version: 0.18.0 - manager: conda - platform: osx-64 - dependencies: - python: '>=3.7' - click: '>=7.0' - six: '>=1.10.0' - pyjwt: '>=1.7.0' - tabulate: '>=0.7.7' - requests: '>=2.17.3' - configparser: '>=0.3.5' - oauthlib: '>=3.1.0' - urllib3: '>=1.26.7,<3' - url: https://conda.anaconda.org/conda-forge/noarch/databricks-cli-0.18.0-pyhd8ed1ab_0.conda + dask-core: 2024.4.2 + url: https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.0.12-pyhd8ed1ab_0.conda hash: - md5: 5036bba5b1dd105148a5bab9ff4b0620 - sha256: 6ac45a54c2d7e14195d413bbe372f4636d00bc6ce76ffc0c737fb9c7d80a32eb + md5: 2480fde61a52e5a2f73fb73553b317ab + sha256: c1023da9890c41c523de9530a728d7a5caf9c4e68967baf5280676e6ba06aa65 category: main optional: false - name: dataclasses-json @@ -4055,81 +4072,84 @@ package: category: main optional: false - name: datasets - version: 2.14.4 + version: 2.19.0 manager: conda platform: linux-64 dependencies: aiohttp: '' - dill: '>=0.3.0,<0.3.8' - fsspec: '>=2021.11.1' - huggingface_hub: '>=0.14.0,<1.0.0' - importlib-metadata: '' + dill: '>=0.3.0,<0.3.9' + filelock: '' + fsspec: '>=2023.1.0,<=2024.3.1' + huggingface_hub: '>=0.21.2' multiprocess: '' numpy: '>=1.17' packaging: '' pandas: '' - pyarrow: '>=8.0.0' + pyarrow: '>=12.0.0' + pyarrow-hotfix: '' python: '>=3.8.0' python-xxhash: '' pyyaml: '>=5.1' requests: '>=2.19.0' tqdm: '>=4.62.1' - url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.19.0-pyhd8ed1ab_0.conda hash: - md5: 3e087f072ce03c43a9b60522f5d0ca2f - sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f + md5: c83801043a66de267fb0fabe2c1358fd + sha256: 71570e605a0940e960d02c7634de7cce69d8258971bf6fa0b04eaff542acb2f9 category: main optional: false - name: datasets - version: 2.14.4 + version: 2.19.0 manager: conda platform: osx-64 dependencies: pandas: '' packaging: '' - importlib-metadata: '' aiohttp: '' + filelock: '' python-xxhash: '' multiprocess: '' + pyarrow-hotfix: '' pyyaml: '>=5.1' numpy: '>=1.17' - pyarrow: '>=8.0.0' - requests: '>=2.19.0' python: '>=3.8.0' + requests: '>=2.19.0' tqdm: '>=4.62.1' - fsspec: '>=2021.11.1' - dill: '>=0.3.0,<0.3.8' - huggingface_hub: '>=0.14.0,<1.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + pyarrow: '>=12.0.0' + dill: '>=0.3.0,<0.3.9' + fsspec: '>=2023.1.0,<=2024.3.1' + huggingface_hub: '>=0.21.2' + url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.19.0-pyhd8ed1ab_0.conda hash: - md5: 3e087f072ce03c43a9b60522f5d0ca2f - sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f + md5: c83801043a66de267fb0fabe2c1358fd + sha256: 71570e605a0940e960d02c7634de7cce69d8258971bf6fa0b04eaff542acb2f9 category: main optional: false - name: datasets - version: 2.14.4 + version: 2.19.0 manager: conda platform: osx-arm64 dependencies: pandas: '' packaging: '' - importlib-metadata: '' aiohttp: '' + filelock: '' python-xxhash: '' multiprocess: '' + pyarrow-hotfix: '' pyyaml: '>=5.1' numpy: '>=1.17' - pyarrow: '>=8.0.0' python: '>=3.8.0' requests: '>=2.19.0' tqdm: '>=4.62.1' - fsspec: '>=2021.11.1' - dill: '>=0.3.0,<0.3.8' - huggingface_hub: '>=0.14.0,<1.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + pyarrow: '>=12.0.0' + dill: '>=0.3.0,<0.3.9' + fsspec: '>=2023.1.0,<=2024.3.1' + huggingface_hub: '>=0.21.2' + url: https://conda.anaconda.org/conda-forge/noarch/datasets-2.19.0-pyhd8ed1ab_0.conda hash: - md5: 3e087f072ce03c43a9b60522f5d0ca2f - sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f + md5: c83801043a66de267fb0fabe2c1358fd + sha256: 71570e605a0940e960d02c7634de7cce69d8258971bf6fa0b04eaff542acb2f9 category: main optional: false - name: db-dtypes @@ -4310,39 +4330,39 @@ package: category: main optional: false - name: dill - version: 0.3.7 + version: 0.3.8 manager: conda platform: linux-64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda hash: - md5: 5e4f3466526c52bc9af2d2353a1460bd - sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 + md5: 78745f157d56877a2c6e7b386f66f3e2 + sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 category: main optional: false - name: dill - version: 0.3.7 + version: 0.3.8 manager: conda platform: osx-64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda hash: - md5: 5e4f3466526c52bc9af2d2353a1460bd - sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 + md5: 78745f157d56877a2c6e7b386f66f3e2 + sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 category: main optional: false - name: dill - version: 0.3.7 + version: 0.3.8 manager: conda platform: osx-arm64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda hash: - md5: 5e4f3466526c52bc9af2d2353a1460bd - sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 + md5: 78745f157d56877a2c6e7b386f66f3e2 + sha256: 482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4 category: main optional: false - name: diskcache @@ -4418,14 +4438,14 @@ package: category: main optional: false - name: distributed - version: 2024.4.1 + version: 2024.4.2 manager: conda platform: linux-64 dependencies: click: '>=8.0' cloudpickle: '>=1.5.0' cytoolz: '>=0.10.1' - dask-core: '>=2024.4.1,<2024.4.2.0a0' + dask-core: '>=2024.4.2,<2024.4.3.0a0' jinja2: '>=2.10.3' locket: '>=1.0.0' msgpack-python: '>=1.0.0' @@ -4439,14 +4459,14 @@ package: tornado: '>=6.0.4' urllib3: '>=1.24.3' zict: '>=3.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.4.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.4.2-pyhd8ed1ab_0.conda hash: - md5: 822b8d8216764941bb099fea588127ad - sha256: 747ed8b12aff745c16ac415d17e0f76754fab992ea6ae68cf0c27f3fc2417b1f + md5: e4e11467ccf467cbe34cbe84dedbca77 + sha256: 418df5d885310bb111637054baafe013b75e52cdc5116f844fc0d2aed4784bf5 category: main optional: false - name: distributed - version: 2024.3.1 + version: 2024.4.2 manager: conda platform: osx-64 dependencies: @@ -4466,15 +4486,15 @@ package: cytoolz: '>=0.10.1' psutil: '>=5.7.2' zict: '>=3.0.0' - dask-core: '>=2024.3.1,<2024.3.2.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda + dask-core: '>=2024.4.2,<2024.4.3.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.4.2-pyhd8ed1ab_0.conda hash: - md5: b0ad5ef44595ef37c3008fc04ecd2abf - sha256: f587da3ff040968fecac7f424b88c5bc5fe16fe92fe08643fb5be8318d05c275 + md5: e4e11467ccf467cbe34cbe84dedbca77 + sha256: 418df5d885310bb111637054baafe013b75e52cdc5116f844fc0d2aed4784bf5 category: main optional: false - name: distributed - version: 2024.4.1 + version: 2024.4.2 manager: conda platform: osx-arm64 dependencies: @@ -4494,11 +4514,11 @@ package: cytoolz: '>=0.10.1' psutil: '>=5.7.2' zict: '>=3.0.0' - dask-core: '>=2024.4.1,<2024.4.2.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.4.1-pyhd8ed1ab_0.conda + dask-core: '>=2024.4.2,<2024.4.3.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/distributed-2024.4.2-pyhd8ed1ab_0.conda hash: - md5: 822b8d8216764941bb099fea588127ad - sha256: 747ed8b12aff745c16ac415d17e0f76754fab992ea6ae68cf0c27f3fc2417b1f + md5: e4e11467ccf467cbe34cbe84dedbca77 + sha256: 418df5d885310bb111637054baafe013b75e52cdc5116f844fc0d2aed4784bf5 category: main optional: false - name: distro @@ -4628,42 +4648,42 @@ package: category: main optional: false - name: docutils - version: 0.17.1 + version: 0.20.1 manager: conda platform: linux-64 dependencies: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py39hf3d152e_5.conda + url: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py39hf3d152e_3.conda hash: - md5: d74cf0b3351ffc48f1388424df827755 - sha256: fdf27fe364a38ef04d4c7b925bb767c1e4cb283f05645fba4a6f697f9adc269b + md5: 09a48956e1c155907fd0d626f3e80f2e + sha256: fe2b7316146a73a33fd16c637e6e82c2638e91d1b8c95560b9c477a6f3082b6d category: main optional: false - name: docutils - version: 0.17.1 + version: 0.20.1 manager: conda platform: osx-64 dependencies: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/docutils-0.17.1-py39h6e9494a_4.conda + url: https://conda.anaconda.org/conda-forge/osx-64/docutils-0.20.1-py39h6e9494a_3.conda hash: - md5: 2075bada3661d0a7fb762b4f84f7c06a - sha256: de75694b8d0c0e244aa6f3a50d3915311410a51bfb4e8074e8bc61152b63396d + md5: e62f04874e6143288ee89ca941dcc302 + sha256: 4dcabec8ce6d47cf465c902b0ed6142fb1e86ce7e3a676458c39d02aedd750a6 category: main optional: false - name: docutils - version: 0.17.1 + version: 0.20.1 manager: conda platform: osx-arm64 dependencies: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.17.1-py39h2804cbe_5.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.20.1-py39h2804cbe_3.conda hash: - md5: e686fb5afbd0f305e12773307094a635 - sha256: 5aff6d9caf2eec64598bdd7e066fa37642590938b9be3b57b7034bf426e60b46 + md5: 70e347b3f092848cf7eb473b3ee3a72b + sha256: ab092e0c2f4084e0b7e38893a05e81d807a07a6a4a965bec027c39e4147672b7 category: main optional: false - name: entrypoints @@ -4867,15 +4887,15 @@ package: category: main optional: false - name: filelock - version: 3.13.3 + version: 3.13.4 manager: conda platform: osx-64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda hash: - md5: ff15f46b0d34308f4d40c1c51df07592 - sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 + md5: 6baa2e7fc09bd2c7c82cb6662d5f1d36 + sha256: 2eef860d5ad6ef1fac5002a3b75661f765d448e9f997f64482b0e51a097e037f category: main optional: false - name: filelock @@ -4985,7 +5005,7 @@ package: category: main optional: false - name: flask - version: 2.3.3 + version: 3.0.3 manager: conda platform: osx-64 dependencies: @@ -4995,11 +5015,11 @@ package: importlib-metadata: '>=3.6.0' itsdangerous: '>=2.1.2' blinker: '>=1.6.2' - werkzeug: '>=2.3.7' - url: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda + werkzeug: '>=3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/flask-3.0.3-pyhd8ed1ab_0.conda hash: - md5: 9b0d29067484a8dfacfae85b8fba81bc - sha256: 4f84ffdc5471236e8225db86c7508426b46aa2c3802d58ca40b3c3e174533b39 + md5: dcdb937144fa20d7757bf512db1ea769 + sha256: 2fc508f656fe52cb2f9a69c9c62077934d6a81510256dbe85f95beb7d9620238 category: main optional: false - name: flask @@ -5174,8 +5194,8 @@ package: python-json-logger: '>=2.0.0' cloudpickle: '>=2.0.0' fsspec: '>=2023.3.0' - cookiecutter: '>=1.7.3' gcsfs: '>=2023.3.0' + cookiecutter: '>=1.7.3' croniter: '>=0.3.20,<4.0.0' docstring_parser: '>=0.9.0' keyring: '>=18.0.1' @@ -5575,7 +5595,7 @@ package: category: main optional: false - name: fonttools - version: 4.50.0 + version: 4.51.0 manager: conda platform: osx-64 dependencies: @@ -5584,10 +5604,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* unicodedata2: '>=14.0.0' - url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.50.0-py39ha09f3b3_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.51.0-py39ha09f3b3_0.conda hash: - md5: a575dd8aa43e8b7e2e1da6bd6acbddc0 - sha256: 6f319ed091af3d14df5165ceba659869569e6827da9ca084f17237b7e440eee7 + md5: 713f4aa3625e861796da39bbeb112675 + sha256: 52a283f3c1dee76694dd65cea473a594b84f1616f9062630c09b472eedd76fa0 category: main optional: false - name: fonttools @@ -5734,10 +5754,10 @@ package: platform: linux-64 dependencies: libgcc-ng: '>=7.5.0' - url: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h516909a_0.tar.bz2 hash: - md5: ac7bc6a654f8f41b352b38f4051135f8 - sha256: 5d7b6c0ee7743ba41399e9e05a58ccc1cfc903942e49ff6f677f6e423ea7a627 + md5: bdc16c2b8852914fdbadb8e4d6361a8b + sha256: b619c1ec2c2b0951e23c683c6ca33de295183ee82f080e97eda68a7a7a955d85 category: main optional: false - name: fribidi @@ -5777,16 +5797,16 @@ package: category: main optional: false - name: frozendict - version: 2.4.0 + version: 2.4.2 manager: conda platform: osx-64 dependencies: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/frozendict-2.4.0-py39ha09f3b3_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/frozendict-2.4.2-py39ha09f3b3_0.conda hash: - md5: 0fc918c0e051981921878c2d65fc403b - sha256: 7ec12ed6358e326dff1ffdd714098b99f49291d347f5ac44839e968a02721105 + md5: 7f2cf3a0e1e46aa8aa0b941b70ed3b01 + sha256: c30b1c08d174cd2eeccfe75cdd501cb983123c9cfb7c9d6f4a6f9cf6f01926fc category: main optional: false - name: frozendict @@ -5879,57 +5899,51 @@ package: category: main optional: false - name: furo - version: 2023.5.20 + version: 2024.1.29 manager: conda platform: linux-64 dependencies: beautifulsoup4: '' - myst-parser: '' pygments: '>=2.7' - python: '>=3.6' - sphinx: '>=4' + python: '>=3.7' + sphinx: '>=6.0,<8.0' sphinx-basic-ng: '' - sphinx-inline-tabs: '' - url: https://conda.anaconda.org/conda-forge/noarch/furo-2023.5.20-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/furo-2024.1.29-pyhd8ed1ab_0.conda hash: - md5: 786e474a83de249aecf767102d7fd87d - sha256: 3513f6e2bc2036e6941b30dd03ea9c98a452e0d311d7dc5d1b45be87e145e3d3 + md5: f67437927d5ead424d7dcf1f4d9b7c66 + sha256: aba336c5d783817f63d8c8d12b3488911953dc6a88c692de242b6387482337eb category: main optional: false - name: furo - version: 2023.5.20 + version: 2024.1.29 manager: conda platform: osx-64 dependencies: beautifulsoup4: '' - myst-parser: '' - sphinx-inline-tabs: '' sphinx-basic-ng: '' - python: '>=3.6' - sphinx: '>=4' + python: '>=3.7' pygments: '>=2.7' - url: https://conda.anaconda.org/conda-forge/noarch/furo-2023.5.20-pyhd8ed1ab_0.conda + sphinx: '>=6.0,<8.0' + url: https://conda.anaconda.org/conda-forge/noarch/furo-2024.1.29-pyhd8ed1ab_0.conda hash: - md5: 786e474a83de249aecf767102d7fd87d - sha256: 3513f6e2bc2036e6941b30dd03ea9c98a452e0d311d7dc5d1b45be87e145e3d3 + md5: f67437927d5ead424d7dcf1f4d9b7c66 + sha256: aba336c5d783817f63d8c8d12b3488911953dc6a88c692de242b6387482337eb category: main optional: false - name: furo - version: 2023.5.20 + version: 2024.1.29 manager: conda platform: osx-arm64 dependencies: beautifulsoup4: '' - myst-parser: '' - sphinx-inline-tabs: '' sphinx-basic-ng: '' - python: '>=3.6' - sphinx: '>=4' + python: '>=3.7' pygments: '>=2.7' - url: https://conda.anaconda.org/conda-forge/noarch/furo-2023.5.20-pyhd8ed1ab_0.conda + sphinx: '>=6.0,<8.0' + url: https://conda.anaconda.org/conda-forge/noarch/furo-2024.1.29-pyhd8ed1ab_0.conda hash: - md5: 786e474a83de249aecf767102d7fd87d - sha256: 3513f6e2bc2036e6941b30dd03ea9c98a452e0d311d7dc5d1b45be87e145e3d3 + md5: f67437927d5ead424d7dcf1f4d9b7c66 + sha256: aba336c5d783817f63d8c8d12b3488911953dc6a88c692de242b6387482337eb category: main optional: false - name: future @@ -6381,15 +6395,23 @@ package: category: main optional: false - name: gettext - version: 0.21.1 + version: 0.22.5 manager: conda platform: osx-64 dependencies: + gettext-tools: 0.22.5 + libasprintf: 0.22.5 + libasprintf-devel: 0.22.5 + libcxx: '>=16' + libgettextpo: 0.22.5 + libgettextpo-devel: 0.22.5 libiconv: '>=1.17,<2.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.21.1-h8a4c099_0.tar.bz2 + libintl: 0.22.5 + libintl-devel: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.22.5-h5ff76d1_2.conda hash: - md5: 1e3aff29ce703d421c43f371ad676cc5 - sha256: 915d3cd2d777b9b3fc2e87a25901b8e4a6aa1b2b33cf2ba54e9e9ed4f6b67d94 + md5: c09b3dcf2adc5a2a32d11ab90289b8fa + sha256: ba9a4680b018a4ca517ec20beb25b09c97e293ecd16b931075e689db10291712 category: main optional: false - name: gettext @@ -6424,6 +6446,19 @@ package: sha256: 67d7b1d6fe4f1c516df2000640ec7dcfebf3ff6ea0785f0276870e730c403d33 category: main optional: false +- name: gettext-tools + version: 0.22.5 + manager: conda + platform: osx-64 + dependencies: + libiconv: '>=1.17,<2.0a0' + libintl: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-64/gettext-tools-0.22.5-h5ff76d1_2.conda + hash: + md5: 37e1cb0efeff4d4623a6357e37e0105d + sha256: 4db71a66340d068c57e16c574c356db6df54ac0147b5b26d3313093f7854ee6d + category: main + optional: false - name: gettext-tools version: 0.22.5 manager: conda @@ -6487,14 +6522,14 @@ package: category: main optional: false - name: giflib - version: 5.2.1 + version: 5.2.2 manager: conda platform: osx-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.1-hb7f2c08_3.conda + url: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda hash: - md5: aca150b0186836f893ebac79019e5498 - sha256: 47515e0874bcf67e438e1d5d093b074c1781f055067195f0d00a7790a56d446d + md5: 03e8c9b4d3da5f3d6eabdd020c2d63ac + sha256: 2c825df829097536314a195ae5cacaa8695209da6b4400135a65d8e23c008ff8 category: main optional: false - name: giflib @@ -6562,17 +6597,17 @@ package: category: main optional: false - name: gitpython - version: 3.1.42 + version: 3.1.43 manager: conda platform: osx-64 dependencies: python: '>=3.7' typing_extensions: '>=3.7.4.3' gitdb: '>=4.0.1,<5' - url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.42-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda hash: - md5: 6bc8e496351bafd761c0922c3ebd989a - sha256: a11e1cf4404157467d0f51906d1db80bcb8bfe4bb3d3eba703b28e981ea7e308 + md5: 0b2154c1818111e17381b1df5b4b0176 + sha256: cbb2802641a009ce9bcc2a047e817fd8816f9c842036a42f4730398d8e4cda2a category: main optional: false - name: gitpython @@ -6589,6 +6624,24 @@ package: sha256: cbb2802641a009ce9bcc2a047e817fd8816f9c842036a42f4730398d8e4cda2a category: main optional: false +- name: glib + version: 2.78.4 + manager: conda + platform: linux-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + glib-tools: 2.78.4 + libgcc-ng: '>=12' + libglib: 2.78.4 + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + python: '*' + url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.78.4-hfc55251_0.conda + hash: + md5: f36a7b2420c3fc3c48a3d609841d8fee + sha256: 316c95dcbde46b7418d2b667a7e0c1d05101b673cd8c691d78d8699600a07a5b + category: main + optional: false - name: glib version: 2.78.4 manager: conda @@ -6606,6 +6659,21 @@ package: sha256: 546775c50a28dcbe22b784d6cc4e8ba3774aac59517858529742657b0563c326 category: main optional: false +- name: glib-tools + version: 2.78.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libglib: 2.78.4 + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.78.4-hfc55251_0.conda + hash: + md5: d184ba1bf15a2bbb3be6118c90fd487d + sha256: e94494b895f77ba54922ffb1dcfb7f1a987591b823eb5ce608afb2e2391d7d82 + category: main + optional: false - name: glib-tools version: 2.78.4 manager: conda @@ -6945,13 +7013,13 @@ package: category: main optional: false - name: google-cloud-bigquery - version: 3.20.1 + version: 3.21.0 manager: conda platform: linux-64 dependencies: db-dtypes: '>=0.3.0,<2.0.0dev' geopandas: '>=0.9.0,<1.0dev' - google-cloud-bigquery-core: 3.20.1 + google-cloud-bigquery-core: 3.21.0 google-cloud-bigquery-storage: '>=2.6.0,<3.0.0dev' grpcio: '>=1.49.1,<2.0dev' ipykernel: '>=6.0.0' @@ -6964,14 +7032,14 @@ package: python: '>=3.8' shapely: '>=1.8.4,<3.0.0dev' tqdm: '>=4.7.4,<=5.0.0dev' - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.20.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.21.0-pyhd8ed1ab_0.conda hash: - md5: e03a302b71d298055170d60f808b2c0b - sha256: 7d178c4926ed083f3d1e042be1d007cfa530eaceea1bd71266afd6697664f049 + md5: d1218ae83bdd14d12b0ba4231aeea06b + sha256: 00ab60c50ffafdcfedecdef004c2f429e5f1a6dfde1169f02605610fb39c2cfc category: main optional: false - name: google-cloud-bigquery - version: 3.19.0 + version: 3.21.0 manager: conda platform: osx-64 dependencies: @@ -6989,15 +7057,15 @@ package: ipython: '>=7.23.1,!=8.1.0' google-cloud-bigquery-storage: '>=2.6.0,<3.0.0dev' shapely: '>=1.8.4,<3.0.0dev' - google-cloud-bigquery-core: 3.19.0 - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.19.0-pyhd8ed1ab_0.conda + google-cloud-bigquery-core: 3.21.0 + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.21.0-pyhd8ed1ab_0.conda hash: - md5: dd4a8cca66b72bee53373e2926f1d39c - sha256: a134a103b50285e521eeaa5bffd6b0b7efb69e6ab2e15f46354105e0d6ede412 + md5: d1218ae83bdd14d12b0ba4231aeea06b + sha256: 00ab60c50ffafdcfedecdef004c2f429e5f1a6dfde1169f02605610fb39c2cfc category: main optional: false - name: google-cloud-bigquery - version: 3.20.1 + version: 3.21.0 manager: conda platform: osx-arm64 dependencies: @@ -7015,15 +7083,15 @@ package: ipython: '>=7.23.1,!=8.1.0' google-cloud-bigquery-storage: '>=2.6.0,<3.0.0dev' shapely: '>=1.8.4,<3.0.0dev' - google-cloud-bigquery-core: 3.20.1 - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.20.1-pyhd8ed1ab_0.conda + google-cloud-bigquery-core: 3.21.0 + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-3.21.0-pyhd8ed1ab_0.conda hash: - md5: e03a302b71d298055170d60f808b2c0b - sha256: 7d178c4926ed083f3d1e042be1d007cfa530eaceea1bd71266afd6697664f049 + md5: d1218ae83bdd14d12b0ba4231aeea06b + sha256: 00ab60c50ffafdcfedecdef004c2f429e5f1a6dfde1169f02605610fb39c2cfc category: main optional: false - name: google-cloud-bigquery-core - version: 3.20.1 + version: 3.21.0 manager: conda platform: linux-64 dependencies: @@ -7035,14 +7103,14 @@ package: python: '>=3.8' python-dateutil: '>=2.7.2,<3.0dev' requests: '>=2.21.0,<3.0.0dev' - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.20.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.21.0-pyhd8ed1ab_0.conda hash: - md5: 91ebaa76bc54f9bb30f72a9f166b00a6 - sha256: 404f571f8b66d0f4f644a00719306adca8e92b28fe017bb378379ab470318323 + md5: 97104a3e7c46b7879ccb086cc673c4cf + sha256: fa7e6b4fd4b569dce918d6c240f5c2255894b37433be8fe086f8a7ee922110b2 category: main optional: false - name: google-cloud-bigquery-core - version: 3.19.0 + version: 3.21.0 manager: conda platform: osx-64 dependencies: @@ -7054,14 +7122,14 @@ package: requests: '>=2.21.0,<3.0.0dev' google-cloud-core: '>=1.6.0,<3.0.0dev' google-api-core-grpc: '>=1.34.1,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.19.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.21.0-pyhd8ed1ab_0.conda hash: - md5: e9a57c9845bcbaf6df5cb006b399d690 - sha256: 910415a2a06c29585957638f83837c6f5fb7b901de27eebbebff1cceecbdd682 + md5: 97104a3e7c46b7879ccb086cc673c4cf + sha256: fa7e6b4fd4b569dce918d6c240f5c2255894b37433be8fe086f8a7ee922110b2 category: main optional: false - name: google-cloud-bigquery-core - version: 3.20.1 + version: 3.21.0 manager: conda platform: osx-arm64 dependencies: @@ -7073,10 +7141,10 @@ package: requests: '>=2.21.0,<3.0.0dev' google-cloud-core: '>=1.6.0,<3.0.0dev' google-api-core-grpc: '>=1.34.1,<3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*' - url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.20.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/google-cloud-bigquery-core-3.21.0-pyhd8ed1ab_0.conda hash: - md5: 91ebaa76bc54f9bb30f72a9f166b00a6 - sha256: 404f571f8b66d0f4f644a00719306adca8e92b28fe017bb378379ab470318323 + md5: 97104a3e7c46b7879ccb086cc673c4cf + sha256: fa7e6b4fd4b569dce918d6c240f5c2255894b37433be8fe086f8a7ee922110b2 category: main optional: false - name: google-cloud-bigquery-storage @@ -7455,7 +7523,7 @@ package: - name: graphene version: '3.3' manager: conda - platform: osx-arm64 + platform: osx-64 dependencies: python: '>=3.6' aniso8601: '>=8,<10' @@ -7467,17 +7535,32 @@ package: sha256: 8b4e2c1d326849c0094f9e96a9833addb10f638be67bb0590836720879697ec6 category: main optional: false -- name: graphite2 - version: 1.3.13 +- name: graphene + version: '3.3' manager: conda - platform: linux-64 + platform: osx-arm64 dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - hash: - md5: f87c7b7c2cb45f323ffbce941c78ab7c - sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add + python: '>=3.6' + aniso8601: '>=8,<10' + graphql-core: '>=3.1,<3.3' + graphql-relay: '>=3.1,<3.3' + url: https://conda.anaconda.org/conda-forge/noarch/graphene-3.3-pyhd8ed1ab_0.conda + hash: + md5: ed2ae94977dfd96566e6eaf373216728 + sha256: 8b4e2c1d326849c0094f9e96a9833addb10f638be67bb0590836720879697ec6 + category: main + optional: false +- name: graphite2 + version: 1.3.13 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + hash: + md5: f87c7b7c2cb45f323ffbce941c78ab7c + sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add category: main optional: false - name: graphite2 @@ -7517,6 +7600,19 @@ package: sha256: 6f7da913ecad98951cadfe512af2c3979fbff752bf714da66760701e5463dd29 category: main optional: false +- name: graphql-core + version: 3.2.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + typing_extensions: '>=4,<5' + url: https://conda.anaconda.org/conda-forge/noarch/graphql-core-3.2.3-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 87cafe8c7638a5ac6fd8ec8fb01f1508 + sha256: 6f7da913ecad98951cadfe512af2c3979fbff752bf714da66760701e5463dd29 + category: main + optional: false - name: graphql-core version: 3.2.3 manager: conda @@ -7544,6 +7640,20 @@ package: sha256: 04f2a3383e74421441e46eaed4c32940682c1de82036fd1b6f18663d6d5447c4 category: main optional: false +- name: graphql-relay + version: 3.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + graphql-core: '>=3.2,<3.3' + typing_extensions: '>=4.1,<5' + url: https://conda.anaconda.org/conda-forge/noarch/graphql-relay-3.2.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 1b2b83e3528f8fb83007161eff51073d + sha256: 04f2a3383e74421441e46eaed4c32940682c1de82036fd1b6f18663d6d5447c4 + category: main + optional: false - name: graphql-relay version: 3.2.0 manager: conda @@ -7688,8 +7798,8 @@ package: ipywidgets: '>=7.5.1' colorama: '>=0.4.3' jsonschema: '>=2.5.1' - tqdm: '>=4.59.0' scipy: '>=1.6.0' + tqdm: '>=4.59.0' tzlocal: '>=1.2' jsonpatch: '>=1.22' mistune: '>=0.8.4' @@ -7835,15 +7945,16 @@ package: manager: conda platform: osx-arm64 dependencies: - libcxx: '>=16' + __osx: '>=10.9' + libcxx: '>=16.0.6' libgrpc: 1.59.3 libzlib: '>=1.2.13,<1.3.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.59.3-py39h047a24b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.59.3-py39h52f163a_0.conda hash: - md5: 1afaf768107e5ab3284afb7d64d4a99c - sha256: 9f508baa6330ecf5a4a8129049e25ae40b2e534979a52995a6df08d8b65b7651 + md5: 65c1499ad010b38f0acab66e753f43b8 + sha256: 9939546b8eaf9a5666b31f872e6d70950139b108a557f3a1a3f14f0548af1fb3 category: main optional: false - name: grpcio-status @@ -7891,6 +8002,35 @@ package: sha256: 45c00a3feaf80f29cbc4b2f6a7ef73b08ce4e4a847b32a82eed443c7dd95d0c9 category: main optional: false +- name: gst-plugins-base + version: 1.22.9 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + alsa-lib: '>=1.2.10,<1.3.0.0a0' + gettext: '>=0.21.1,<1.0a0' + gstreamer: 1.22.9 + libexpat: '>=2.5.0,<3.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.3,<3.0a0' + libogg: '>=1.3.4,<1.4.0a0' + libopus: '>=1.3.1,<2.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=12' + libvorbis: '>=1.3.7,<1.4.0a0' + libxcb: '>=1.15,<1.16.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xorg-libx11: '>=1.8.7,<2.0a0' + xorg-libxau: '>=1.0.11,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-libxrender: '>=0.9.11,<0.10.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda + hash: + md5: 614b81f8ed66c56b640faee7076ad14a + sha256: a4312c96a670fdbf9ff0c3efd935e42fa4b655ff33dcc52c309b76a2afaf03f0 + category: main + optional: false - name: gst-plugins-base version: 1.22.9 manager: conda @@ -7911,6 +8051,24 @@ package: sha256: c633c837b6e24da03129144ac1ab5940f43035a639b39bb2a1b086ea2f025e8f category: main optional: false +- name: gstreamer + version: 1.22.9 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + gettext: '>=0.21.1,<1.0a0' + glib: '>=2.78.3,<3.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.3,<3.0a0' + libiconv: '>=1.17,<2.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_0.conda + hash: + md5: bcc7157b06fce7f5e055402a8135dfd8 + sha256: aa2395bf1790f72d2706bac77430f765ec1318ca22e60e791c13ae452c045263 + category: main + optional: false - name: gstreamer version: 1.22.9 manager: conda @@ -8116,11 +8274,12 @@ package: dependencies: hpack: '>=4.0,<5' hyperframe: '>=6.0,<7' - python: '>=3.6.1' - url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/linux-64/h2-4.1.0-py39hf3d152e_0.tar.bz2 hash: - md5: b748fbf7060927a6e82df7cb5ee8f097 - sha256: bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a + md5: 4d6e35bbcba4f0c06f02a285f5602333 + sha256: f2aaa56f152e889f2f9d7db78f4b0534dce91c8de3e2a5b2627fbfcb01b14054 category: main optional: false - name: h2 @@ -8170,7 +8329,7 @@ package: category: main optional: false - name: h5py - version: 3.10.0 + version: 3.11.0 manager: conda platform: osx-64 dependencies: @@ -8179,10 +8338,10 @@ package: numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.10.0-nompi_py39h9420513_101.conda + url: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.11.0-nompi_py39h9420513_100.conda hash: - md5: 60e349d82eecd97910178c43c5c8c83d - sha256: 598656f6f12f4fe3826ed5ce107c78dfb8a7cec61b9e11e6ea24836d7ba09f09 + md5: f5dae058722729a180540de4fed91a27 + sha256: 12f076d066fe3c20100f58086bc98973696eb34f7f918cc7b6cd8960c675543e category: main optional: false - name: h5py @@ -8513,7 +8672,7 @@ package: category: main optional: false - name: huggingface_hub - version: 0.22.1 + version: 0.22.2 manager: conda platform: osx-64 dependencies: @@ -8525,10 +8684,10 @@ package: typing-extensions: '>=3.7.4.3' fsspec: '>=2023.5.0' tqdm: '>=4.42.1' - url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.22.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.22.2-pyhd8ed1ab_0.conda hash: - md5: b9f58e10a6247f5ca5d70a6040f62943 - sha256: 2b6e1276089d2563b047497ecc1ce9d4a502594852c46886f881a4129d1993ce + md5: f1b1b143f30f5ec0f6fc66c2c6e825fe + sha256: 58f574977fd2e35e9c946c4341627edcf4622fef40d5cd5924211070425335dc category: main optional: false - name: huggingface_hub @@ -8622,42 +8781,42 @@ package: category: main optional: false - name: identify - version: 2.5.35 + version: 2.5.36 manager: conda platform: linux-64 dependencies: python: '>=3.6' ukkonen: '' - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda hash: - md5: 9472bfd206a2b7bb8143835e37667054 - sha256: 971683b13d1b820157bef9993c63dd8b0611d2d60fc4b522da163aee2e70e518 + md5: ba68cb5105760379432cebc82b45af40 + sha256: dc98ab2233d3ed3692499e2a06b027489ee317658cef9277ec23cab00236f31c category: main optional: false - name: identify - version: 2.5.35 + version: 2.5.36 manager: conda platform: osx-64 dependencies: ukkonen: '' python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda hash: - md5: 9472bfd206a2b7bb8143835e37667054 - sha256: 971683b13d1b820157bef9993c63dd8b0611d2d60fc4b522da163aee2e70e518 + md5: ba68cb5105760379432cebc82b45af40 + sha256: dc98ab2233d3ed3692499e2a06b027489ee317658cef9277ec23cab00236f31c category: main optional: false - name: identify - version: 2.5.35 + version: 2.5.36 manager: conda platform: osx-arm64 dependencies: ukkonen: '' python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda hash: - md5: 9472bfd206a2b7bb8143835e37667054 - sha256: 971683b13d1b820157bef9993c63dd8b0611d2d60fc4b522da163aee2e70e518 + md5: ba68cb5105760379432cebc82b45af40 + sha256: dc98ab2233d3ed3692499e2a06b027489ee317658cef9277ec23cab00236f31c category: main optional: false - name: idna @@ -8673,15 +8832,15 @@ package: category: main optional: false - name: idna - version: '3.6' + version: '3.7' manager: conda platform: osx-64 dependencies: python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda hash: - md5: 1a76f09108576397c41c0b0c5bd84134 - sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 + md5: c0cc1420498b17414d8617d0b9f506ca + sha256: 9687ee909ed46169395d4f99a0ee94b80a52f87bed69cd454bb6d37ffeb0ec7b category: main optional: false - name: idna @@ -8746,16 +8905,16 @@ package: category: main optional: false - name: importlib-metadata - version: 6.10.0 + version: 7.1.0 manager: conda platform: osx-64 dependencies: python: '>=3.8' zipp: '>=0.5' - url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda hash: - md5: ae2ad334f34040e147cc5824b450463b - sha256: 4b823af311e7f5093fca41ec0142d0e1ec9b3d1ee91924dc63133611bdfcaee5 + md5: 0896606848b2dc5cebdf111b6543aa04 + sha256: cc2e7d1f7f01cede30feafc1118b7aefa244d0a12224513734e24165ae12ba49 category: main optional: false - name: importlib-metadata @@ -8823,15 +8982,15 @@ package: category: main optional: false - name: importlib_metadata - version: 6.10.0 + version: 7.1.0 manager: conda platform: osx-64 dependencies: - importlib-metadata: '>=6.10.0,<6.10.1.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.10.0-hd8ed1ab_0.conda + importlib-metadata: '>=7.1.0,<7.1.1.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda hash: - md5: c063ddbb9908499fd4f20b31dc67065a - sha256: a3688dc4fb2ed84e4f11738375eee542800ca0bcb343cf5993f4e3e092dcc6bf + md5: 6ef2b72d291b39e479d7694efa2b2b98 + sha256: 01dc057a45dedcc742a71599f67c7383ae2bf873be6018ebcbd06ac8d994dedb category: main optional: false - name: importlib_metadata @@ -9176,15 +9335,15 @@ package: category: main optional: false - name: itsdangerous - version: 2.1.2 + version: 2.2.0 manager: conda platform: osx-64 dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2 + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda hash: - md5: 3c3de74912f11d2b590184f03c7cd09b - sha256: 31e3492686b4e92b53db9b48bc0eb03873b1caaf28629fee7d2d47627a2c56d3 + md5: ff7ca04134ee8dde1d7cf491a78ef7c7 + sha256: 4e933e36e9b0401b62ea8fd63393827ebeb4250de77a56687afb387d504523c5 category: main optional: false - name: itsdangerous @@ -9213,16 +9372,16 @@ package: category: main optional: false - name: jaraco.classes - version: 3.3.1 + version: 3.4.0 manager: conda platform: osx-64 dependencies: more-itertools: '' python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.3.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_0.conda hash: - md5: c541ae264c9f1f21d83fc30dffb908ee - sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + md5: 5271aed7436e2145d405a53ba05610aa + sha256: c44030b080f33299ec5eb5d47d1be30277cd55859701d67b1b6e4e38f4b5bf06 category: main optional: false - name: jaraco.classes @@ -9453,16 +9612,16 @@ package: category: main optional: false - name: joblib - version: 1.3.2 + version: 1.4.0 manager: conda platform: osx-64 dependencies: setuptools: '' - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda hash: - md5: 4da50d410f553db77e62ab62ffaa1abc - sha256: 31e05d47970d956206188480b038829d24ac11fe8216409d8584d93d40233878 + md5: e0ed1bf13ce3a440e022157bf4764465 + sha256: 56eea2c4af35a9c8f9cdca530f6aea0dc8e2551bfcc8b8da37da78221366af10 category: main optional: false - name: joblib @@ -9525,15 +9684,15 @@ package: category: main optional: false - name: json5 - version: 0.9.24 + version: 0.9.25 manager: conda platform: osx-64 dependencies: python: '>=3.7,<4.0' - url: https://conda.anaconda.org/conda-forge/noarch/json5-0.9.24-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/json5-0.9.25-pyhd8ed1ab_0.conda hash: - md5: fc9780a517b51ea3798fc011c17ffd51 - sha256: 148a427d4867ecd367b2bb9c2ef11ae7795abeabc8454f802f28ff692b3ce1aa + md5: 5d8c241a9261e720a34a07a3e1ac4109 + sha256: 0c75e428970e8bb72ba1dd3a6dc32b8d68f6534b4fe16b38e53364963fdc8e38 category: main optional: false - name: json5 @@ -9601,16 +9760,16 @@ package: category: main optional: false - name: jsonpickle - version: 3.0.2 + version: 3.0.4 manager: conda platform: osx-64 dependencies: importlib_metadata: '' python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.2-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.4-pyhd8ed1ab_0.conda hash: - md5: f351864256e291b24b5a3bedda184bff - sha256: c947f2a64e4f06c722973894afb8e26df3aa2212e2e742def3506ccbad42141b + md5: 955b8830bcceeac96d54911667e4f508 + sha256: b8325954c07d4740d4e914ffa231d8dd98a79a0cc11f50f4b7016ab9cd4c4f5b category: main optional: false - name: jsonpickle @@ -9834,12 +9993,13 @@ package: jupyter_console: '' nbconvert: '' notebook: '' - python: '>=3.6' - qtconsole-base: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.0.0-pyhd8ed1ab_10.conda + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + qtconsole: '' + url: https://conda.anaconda.org/conda-forge/linux-64/jupyter-1.0.0-py39hf3d152e_9.conda hash: - md5: 056b8cc3d9b03f54fc49e6d70d7dc359 - sha256: 308b521b149e7a1739f717538b929bc2d87b9001b94f13ee8baa939632a86150 + md5: b99828f9a77b6106a72b541427a90957 + sha256: c309d7ab20b44dd123fd40fb5cf717f386404912521e3b586c96ce018109d054 category: main optional: false - name: jupyter @@ -9866,41 +10026,41 @@ package: manager: conda platform: osx-arm64 dependencies: - ipywidgets: '' - notebook: '' ipykernel: '' - nbconvert: '' - qtconsole-base: '' + ipywidgets: '' jupyter_console: '' - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter-1.0.0-pyhd8ed1ab_10.conda + nbconvert: '' + notebook: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-arm64/jupyter-1.0.0-py39h2804cbe_9.conda hash: - md5: 056b8cc3d9b03f54fc49e6d70d7dc359 - sha256: 308b521b149e7a1739f717538b929bc2d87b9001b94f13ee8baa939632a86150 + md5: 9052c4ca944cccc46d58958ec3affe02 + sha256: 370057a9b78f48cc4df52f82e62eb285b74e41784c1d267057a74ef8ae1c99f3 category: main optional: false - name: jupyter-cache - version: 0.6.1 + version: 1.0.0 manager: conda platform: linux-64 dependencies: attrs: '' click: '' importlib-metadata: '' - nbclient: '>=0.2,<0.8' + nbclient: '>=0.2' nbformat: '' - python: '>=3.8' + python: '>=3.9' pyyaml: '' sqlalchemy: '>=1.3.12,<3' tabulate: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-0.6.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.0-pyhd8ed1ab_0.conda hash: - md5: 2e360820ae68e3d28e1a5a9d2714ca5c - sha256: b22ba507904f33fcc7b218cc2a3ed8d39027524d0f223f3696b8344b7c5a1e1f + md5: b667cf7b57baa559f628d374f017fa32 + sha256: 16dd4d3601d0532bbe755267486d62f7c77e099d0f0517e20ef635f836425d57 category: main optional: false - name: jupyter-cache - version: 0.6.1 + version: 1.0.0 manager: conda platform: osx-64 dependencies: @@ -9910,17 +10070,17 @@ package: tabulate: '' nbformat: '' attrs: '' - python: '>=3.8' + python: '>=3.9' sqlalchemy: '>=1.3.12,<3' - nbclient: '>=0.2,<0.8' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-0.6.1-pyhd8ed1ab_0.conda + nbclient: '>=0.2' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.0-pyhd8ed1ab_0.conda hash: - md5: 2e360820ae68e3d28e1a5a9d2714ca5c - sha256: b22ba507904f33fcc7b218cc2a3ed8d39027524d0f223f3696b8344b7c5a1e1f + md5: b667cf7b57baa559f628d374f017fa32 + sha256: 16dd4d3601d0532bbe755267486d62f7c77e099d0f0517e20ef635f836425d57 category: main optional: false - name: jupyter-cache - version: 0.6.1 + version: 1.0.0 manager: conda platform: osx-arm64 dependencies: @@ -9930,13 +10090,13 @@ package: tabulate: '' nbformat: '' attrs: '' - python: '>=3.8' + python: '>=3.9' sqlalchemy: '>=1.3.12,<3' - nbclient: '>=0.2,<0.8' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-0.6.1-pyhd8ed1ab_0.conda + nbclient: '>=0.2' + url: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.0-pyhd8ed1ab_0.conda hash: - md5: 2e360820ae68e3d28e1a5a9d2714ca5c - sha256: b22ba507904f33fcc7b218cc2a3ed8d39027524d0f223f3696b8344b7c5a1e1f + md5: b667cf7b57baa559f628d374f017fa32 + sha256: 16dd4d3601d0532bbe755267486d62f7c77e099d0f0517e20ef635f836425d57 category: main optional: false - name: jupyter-lsp @@ -9954,17 +10114,17 @@ package: category: main optional: false - name: jupyter-lsp - version: 2.2.4 + version: 2.2.5 manager: conda platform: osx-64 dependencies: python: '>=3.8' importlib-metadata: '>=4.8.3' jupyter_server: '>=1.1.2' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.5-pyhd8ed1ab_0.conda hash: - md5: 91f93e1ebf6535be518715432d89fd92 - sha256: 8000b1904a2a10cf039b46305781128e1a93da4c2fd857445b4924ecf3535bdb + md5: 885867f6adab3d7ecdf8ab6ca0785f51 + sha256: 2151c2c63e0442a4c69ee0ad8a634195eedab10b7b74c0ec8266471842239a93 category: main optional: false - name: jupyter-lsp @@ -10228,7 +10388,7 @@ package: category: main optional: false - name: jupyter_server - version: 2.13.0 + version: 2.14.0 manager: conda platform: osx-64 dependencies: @@ -10251,10 +10411,10 @@ package: anyio: '>=3.1.0' send2trash: '>=1.8.2' jupyter_events: '>=0.9.0' - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.13.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.14.0-pyhd8ed1ab_0.conda hash: - md5: e242df505f194c4932fbb840a99207e2 - sha256: 7e3259506b1b8500ebac4b4b097629ca8c32ee70d1c1df122052fea65c7cbae0 + md5: b82b9798563dea0cd8e4e3074227f04c + sha256: 719be928812cd582713f96d0681a91890cf9d0e5fcb9d2e4ef4b09fc3ab4df4c category: main optional: false - name: jupyter_server @@ -10354,18 +10514,17 @@ package: category: main optional: false - name: jupyterlab - version: 4.1.5 + version: 4.1.6 manager: conda platform: osx-64 dependencies: packaging: '' - tomli: '' traitlets: '' - ipykernel: '' jupyter_core: '' python: '>=3.8' tornado: '>=6.2.0' jinja2: '>=3.0.3' + tomli: '>=1.2.2' importlib_metadata: '>=4.8.3' jupyter_server: '>=2.4.0,<3' importlib_resources: '>=1.4' @@ -10374,10 +10533,11 @@ package: jupyterlab_server: '>=2.19.0,<3' notebook-shim: '>=0.2' httpx: '>=0.25.0' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.1.5-pyhd8ed1ab_0.conda + ipykernel: '>=6.5.0' + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.1.6-pyhd8ed1ab_0.conda hash: - md5: 04b1ca9d7ac414b3f5c3fb16066c6861 - sha256: b098b79ef34d5c6a9ef7fc482bd2373072820006757ed7db33328af88fb91496 + md5: 8b0a6b8edbaef9796d2b925c63441b8e + sha256: fe935cccc5766b0212ce66fdb91db7068d89c88a1b916f067b16b86fb352d7a5 category: main optional: false - name: jupyterlab @@ -10467,7 +10627,7 @@ package: category: main optional: false - name: jupyterlab_server - version: 2.25.4 + version: 2.26.0 manager: conda platform: osx-64 dependencies: @@ -10480,10 +10640,10 @@ package: babel: '>=2.10' json5: '>=0.9.0' jsonschema: '>=4.18' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.26.0-pyhd8ed1ab_0.conda hash: - md5: ffd61670ae09d2d3c637f6afd29db443 - sha256: d0336d0c0223a66d648b24cfd1512fd7aebc85550d47f55ad5edbd53f482e7e5 + md5: bd9f28ac8833e63eeadb69aa1341f269 + sha256: 1c90175218cdc910857423d5ffc356edba54d24a438ee1761fcd7f277270689f category: main optional: false - name: jupyterlab_server @@ -10693,20 +10853,21 @@ package: category: main optional: false - name: keyring - version: 25.0.0 + version: 25.1.0 manager: conda platform: osx-64 dependencies: - importlib_metadata: '>=4.11.4' + importlib_resources: '' + __osx: '' jaraco.classes: '' - jaraco.context: '' jaraco.functools: '' - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/keyring-25.0.0-py39h6e9494a_0.conda + jaraco.context: '' + python: '>=3.8' + importlib_metadata: '>=4.11.4' + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.1.0-pyh534df25_0.conda hash: - md5: 7116583f9a9df43462b5860330fdce38 - sha256: 1904fbeb9d6ea150514a59f58775e04420b5d760e6b222753a3616eee492e3bb + md5: 537a5385c6cee5fa2275a457e0b51b21 + sha256: b5c1f6b9f9baf161b7fd560b62a279841f4114f216c627706a828621326d82ae category: main optional: false - name: keyring @@ -10976,6 +11137,18 @@ package: sha256: 5e2c1b45027675970ce5d03976d806abf66427b9d156c6f761a215069f08faf1 category: main optional: false +- name: lame + version: '3.100' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + hash: + md5: a8832b479f93521a9e7b5b743803be51 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + category: main + optional: false - name: lcms2 version: '2.16' manager: conda @@ -11228,7 +11401,7 @@ package: category: main optional: false - name: libarrow - version: 13.0.0 + version: 15.0.0 manager: conda platform: osx-64 dependencies: @@ -11242,22 +11415,18 @@ package: libbrotlienc: '>=1.1.0,<1.2.0a0' libcxx: '>=14' libgoogle-cloud: '>=2.12.0,<2.13.0a0' - libgrpc: '>=1.59.3,<1.60.0a0' - libprotobuf: '>=4.24.4,<4.24.5.0a0' libre2-11: '>=2023.6.2,<2024.0a0' - libthrift: '>=0.19.0,<0.19.1.0a0' libutf8proc: '>=2.8.0,<3.0a0' libzlib: '>=1.2.13,<1.3.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - openssl: '>=3.2.0,<4.0a0' orc: '>=1.9.2,<1.9.3.0a0' re2: '' - snappy: '>=1.1.10,<2.0a0' + snappy: '>=1.1.10,<1.2.0a0' zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-13.0.0-hdae7707_23_cpu.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-15.0.0-h1aaacd4_0_cpu.conda hash: - md5: 799848b44f6d7cc4a9cd5511101a7b59 - sha256: 1f79ceed195d10cbc8a47141c0b4402161ac37ee4c4899c79f2e13ec7782719c + md5: b2e8a2a9cce613511f35a114fd261252 + sha256: 2b3c0ab8bf1c53456cfe9d4190c0a4cf15c0e13f42a3036f0790a8d32b80fc1d category: main optional: false - name: libarrow @@ -11302,6 +11471,19 @@ package: sha256: 4f305e5fc7350752ac5248fbcd37ba5a0a88a628aadf341c3bcbc9949025a713 category: main optional: false +- name: libarrow-acero + version: 15.0.0 + manager: conda + platform: osx-64 + dependencies: + libarrow: 15.0.0 + libcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-15.0.0-h000cb23_0_cpu.conda + hash: + md5: 2e846a23df996a8bdad4062625917a71 + sha256: dc98876d07ed4ed78421d251796fa87bf9987d6b3c3ea1a008690c063c7b2435 + category: main + optional: false - name: libarrow-acero version: 15.0.0 manager: conda @@ -11331,6 +11513,21 @@ package: sha256: f648faaddf25a697376b407cad4aaf593c14b7d264dc1013c7d75378554f2cc7 category: main optional: false +- name: libarrow-dataset + version: 15.0.0 + manager: conda + platform: osx-64 + dependencies: + libarrow: 15.0.0 + libarrow-acero: 15.0.0 + libcxx: '>=14' + libparquet: 15.0.0 + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-15.0.0-h000cb23_0_cpu.conda + hash: + md5: 4bd6394431a7bfedf5ef9848e832b69b + sha256: b24739ed304b4e46382234fe1020c0f338b091292a98f707e320f016ec9cd63d + category: main + optional: false - name: libarrow-dataset version: 15.0.0 manager: conda @@ -11364,6 +11561,23 @@ package: sha256: f2d5916d993a90c05cbb6830809cb5470af8570bbae0da8784e385577d91a3ab category: main optional: false +- name: libarrow-flight + version: 15.0.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.13' + libabseil: '>=20230802.1,<20230803.0a0' + libarrow: 15.0.0 + libcxx: '>=14' + libgrpc: '>=1.59.3,<1.60.0a0' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-15.0.0-ha1803ca_0_cpu.conda + hash: + md5: 296b77ef6cf42ff01ad0b45bc223eaf6 + sha256: 105551d2c15ce1e61176690644a9f5b22adb87d6e87910f93d7f6299d062bba1 + category: main + optional: false - name: libarrow-flight version: 15.0.0 manager: conda @@ -11399,7 +11613,23 @@ package: - name: libarrow-flight-sql version: 15.0.0 manager: conda - platform: osx-arm64 + platform: osx-64 + dependencies: + __osx: '>=10.13' + libarrow: 15.0.0 + libarrow-flight: 15.0.0 + libcxx: '>=14' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-flight-sql-15.0.0-h8ec153b_0_cpu.conda + hash: + md5: 380b2bff75201a8b1b9a27b4e645d7b7 + sha256: a49d6c35bc042a046f8213074905518fa2eb559074bde5dcfbade076c40ecf40 + category: main + optional: false +- name: libarrow-flight-sql + version: 15.0.0 + manager: conda + platform: osx-arm64 dependencies: libarrow: 15.0.0 libarrow-flight: 15.0.0 @@ -11430,6 +11660,24 @@ package: sha256: ff0c88547635c0947beb5edc9f8fcbdf0f79d9b3b6aeb6614c896e79bc3179f8 category: main optional: false +- name: libarrow-gandiva + version: 15.0.0 + manager: conda + platform: osx-64 + dependencies: + libarrow: 15.0.0 + libcxx: '>=14' + libllvm15: '>=15.0.7,<15.1.0a0' + libre2-11: '>=2023.6.2,<2024.0a0' + libutf8proc: '>=2.8.0,<3.0a0' + openssl: '>=3.2.1,<4.0a0' + re2: '' + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-gandiva-15.0.0-h01dce7f_0_cpu.conda + hash: + md5: 93ec7f2b11cbed836f39c70901a308aa + sha256: 429ff9442149adc528f4d81fa2eeb370990d7601947cf11d829ae084150afd11 + category: main + optional: false - name: libarrow-gandiva version: 15.0.0 manager: conda @@ -11465,6 +11713,23 @@ package: sha256: f07e62d97781bbb2584944a4b4426fd4eae1ec3967aa99ade2b874c31af7e360 category: main optional: false +- name: libarrow-substrait + version: 15.0.0 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.13' + libarrow: 15.0.0 + libarrow-acero: 15.0.0 + libarrow-dataset: 15.0.0 + libcxx: '>=14' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-15.0.0-h8ec153b_0_cpu.conda + hash: + md5: 36aa0a4cde810dedeaf96202c389aec8 + sha256: f1e224d941b702b3b48107127ee914cb77fb524b1f0bbaefa33dd2c77ff4bf0b + category: main + optional: false - name: libarrow-substrait version: 15.0.0 manager: conda @@ -11494,6 +11759,17 @@ package: sha256: 31d58af7eb54e2938123200239277f14893c5fa4b5d0280c8cf55ae10000638b category: main optional: false +- name: libasprintf + version: 0.22.5 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.22.5-h5ff76d1_2.conda + hash: + md5: ad803793d7168331f1395685cbdae212 + sha256: 4babb29b8d39ae8b341c094c134a1917c595846e5f974c9d0cb64d3f734b46b1 + category: main + optional: false - name: libasprintf version: 0.22.5 manager: conda @@ -11518,6 +11794,18 @@ package: sha256: 99d26d272a8203d30b3efbe734a99c823499884d7759b4291674438137c4b5ca category: main optional: false +- name: libasprintf-devel + version: 0.22.5 + manager: conda + platform: osx-64 + dependencies: + libasprintf: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-devel-0.22.5-h5ff76d1_2.conda + hash: + md5: c7182eda3bc727384e2f98f4d680fa7d + sha256: 39fa757378b49993142013c1f69dd56248cc3703c2f04c5bcf4cc4acdc644ae3 + category: main + optional: false - name: libasprintf-devel version: 0.22.5 manager: conda @@ -11547,11 +11835,11 @@ package: manager: conda platform: osx-64 dependencies: - libopenblas: '>=0.3.26,<1.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-21_osx64_openblas.conda + libopenblas: '>=0.3.27,<1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda hash: - md5: 23286066c595986aa0df6452a8416c08 - sha256: 5381eab20f4793996cf22e58461ea8a3a4dff1442bb45663b5920f2d26288688 + md5: b80966a8c8dd0b531f8e65f709d732e8 + sha256: d72060239f904b3a81d2329efcf84dc62c2dfd66dbc4efc8dcae1afdf8f02b59 category: main optional: false - name: libblas @@ -11707,6 +11995,19 @@ package: sha256: 690dfc98e891ee1871c54166d30f6e22edfc2d7d6b29e7988dde5f1ce271c81a category: main optional: false +- name: libcap + version: '2.69' + manager: conda + platform: linux-64 + dependencies: + attr: '>=2.5.1,<2.6.0a0' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda + hash: + md5: 25cb5999faa414e5ccb2c1388f62d3d5 + sha256: 942f9564b4228609f017b6617425d29a74c43b8a030e12239fa4458e5cb6323c + category: main + optional: false - name: libcblas version: 3.9.0 manager: conda @@ -11725,10 +12026,10 @@ package: platform: osx-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-21_osx64_openblas.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda hash: - md5: 7a1b54774bad723e8ba01ca48eb301b5 - sha256: e2b1455612d4cfb3ac3170f0c538516ebd0b113780ac6603338245354e1b2f02 + md5: b9fef82772330f61b2b0201c72d2c29b + sha256: 6a2ba9198e2320c3e22fe3d121310cf8a8ac663e94100c5693b34523fcb3cc04 category: main optional: false - name: libcblas @@ -11743,6 +12044,21 @@ package: sha256: 2c7902985dc77db1d7252b4e838d92a34b1729799ae402988d62d077868f6cca category: main optional: false +- name: libclang + version: 15.0.7 + manager: conda + platform: linux-64 + dependencies: + libclang13: 15.0.7 + libgcc-ng: '>=12' + libllvm15: '>=15.0.7,<15.1.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_h127d8a8_5.conda + hash: + md5: 09b94dd3a7e304df5b83176239347920 + sha256: 606b79c8a4a926334191d79f4a1447aac1d82c43344e3a603cbba31ace859b8f + category: main + optional: false - name: libclang version: 15.0.7 manager: conda @@ -11757,6 +12073,20 @@ package: sha256: ea3c840b7e931228007f1dc21c1cfe8e3e833990da9e92fff9c23c98d035b89a category: main optional: false +- name: libclang13 + version: 15.0.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libllvm15: '>=15.0.7,<15.1.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h5d6823c_5.conda + hash: + md5: 2d694a9ffdcc30e89dea34a8dcdab6ae + sha256: 91ecfcf545a5d4588e9fad5db2b5b04eeef18cae1c03b790829ef8b978f06ccd + category: main + optional: false - name: libclang13 version: 15.0.7 manager: conda @@ -11807,6 +12137,21 @@ package: sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 category: main optional: false +- name: libcups + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + krb5: '>=1.21.1,<1.22.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda + hash: + md5: d4529f4dff3057982a7617c7ac58fde3 + sha256: bc67b9b21078c99c6bd8595fe7e1ed6da1f721007726e717f0449de7032798c4 + category: main + optional: false - name: libcurl version: 8.7.1 manager: conda @@ -12091,6 +12436,21 @@ package: sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca category: main optional: false +- name: libflac + version: 1.4.3 + manager: conda + platform: linux-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + libgcc-ng: '>=12' + libogg: '>=1.3.4,<1.4.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + hash: + md5: ee48bf17cc83a00f59ca1494d5646869 + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + category: main + optional: false - name: libgcc-ng version: 13.2.0 manager: conda @@ -12384,6 +12744,19 @@ package: sha256: e2f784564a2bdc6f753f00f63cc77c97601eb03bc89dccc4413336ec6d95490b category: main optional: false +- name: libgettextpo + version: 0.22.5 + manager: conda + platform: osx-64 + dependencies: + libiconv: '>=1.17,<2.0a0' + libintl: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.22.5-h5ff76d1_2.conda + hash: + md5: 54cc9d12c29c2f0516f2ef4987de53ae + sha256: 139d1861e21c41b950ebf9e395db2492839337a3b481ad2901a4a6800c555e37 + category: main + optional: false - name: libgettextpo version: 0.22.5 manager: conda @@ -12410,6 +12783,20 @@ package: sha256: 695eb2439ad4a89e4205dd675cc52fba5cef6b5d41b83f07cdbf4770a336cc15 category: main optional: false +- name: libgettextpo-devel + version: 0.22.5 + manager: conda + platform: osx-64 + dependencies: + libgettextpo: 0.22.5 + libiconv: '>=1.17,<2.0a0' + libintl: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-devel-0.22.5-h5ff76d1_2.conda + hash: + md5: 1e0384c52cd8b54812912e7234e66056 + sha256: 57940f6a872ffcf5a3406e96bdbd9d25854943e4dd84acee56178ffb728a9671 + category: main + optional: false - name: libgettextpo-devel version: 0.22.5 manager: conda @@ -12733,18 +13120,19 @@ package: manager: conda platform: osx-arm64 dependencies: - c-ares: '>=1.26.0,<2.0a0' + __osx: '>=10.9' + c-ares: '>=1.21.0,<2.0a0' libabseil: '>=20230802.1,<20230803.0a0' - libcxx: '>=16' + libcxx: '>=16.0.6' libprotobuf: '>=4.24.4,<4.24.5.0a0' libre2-11: '>=2023.6.2,<2024.0a0' libzlib: '>=1.2.13,<1.3.0a0' - openssl: '>=3.2.1,<4.0a0' + openssl: '>=3.1.4,<4.0a0' re2: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.59.3-h9560976_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.59.3-hbcf6334_0.conda hash: - md5: 31e7f059601587954b1370fe172d3114 - sha256: 9c0291bf797df0cee46d870bd410968e5955b0573c6b603c0ee7a5fcac06ad91 + md5: e9c7cbc84af929dd47501629a5e19713 + sha256: 54cacd1fc7503d48c135301a775568f15089b537b3c56804767c627a89a20c30 category: main optional: false - name: libhwloc @@ -12762,16 +13150,16 @@ package: category: main optional: false - name: libhwloc - version: 2.9.3 + version: 2.10.0 manager: conda platform: osx-64 dependencies: - libcxx: '>=15.0.7' - libxml2: '>=2.11.5,<3.0.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.9.3-default_h961836e_1009.conda + libcxx: '>=16' + libxml2: '>=2.12.6,<3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.10.0-default_h1321489_1000.conda hash: - md5: 0dfacfef521f5ea278c8136d590421d8 - sha256: ec5047c81fdefdbf63559554bc74d9644ea1e715f5d05298844c01893732fcfb + md5: 6f5fe4374d1003e116e2573022178da6 + sha256: 86f0867081792d52f5c4e51e673478ba0a31e38fc7be59e1ba1890decc46e8da category: main optional: false - name: libiconv @@ -12808,6 +13196,18 @@ package: sha256: bc7de5097b97bcafcf7deaaed505f7ce02f648aac8eccc0d5a47cc599a1d0304 category: main optional: false +- name: libintl + version: 0.22.5 + manager: conda + platform: osx-64 + dependencies: + libiconv: '>=1.17,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-h5ff76d1_2.conda + hash: + md5: 3fb6774cb8cdbb93a6013b67bcf9716d + sha256: 280aaef0ed84637ee869012ad9ad9ed208e068dd9b8cf010dafeea717dad7203 + category: main + optional: false - name: libintl version: 0.22.5 manager: conda @@ -12820,6 +13220,19 @@ package: sha256: 21bc79bdf34ffd20cb84d2a8bd82d7d0e2a1b94b9e72773f0fb207e5b4f1ff63 category: main optional: false +- name: libintl-devel + version: 0.22.5 + manager: conda + platform: osx-64 + dependencies: + libiconv: '>=1.17,<2.0a0' + libintl: 0.22.5 + url: https://conda.anaconda.org/conda-forge/osx-64/libintl-devel-0.22.5-h5ff76d1_2.conda + hash: + md5: ea0a07e556d6b238db685cae6e3585d0 + sha256: e3f15a85c6e63633a5ff503d56366bab31cd2e07ea21559889bc7eb19564106d + category: main + optional: false - name: libintl-devel version: 0.22.5 manager: conda @@ -12934,10 +13347,10 @@ package: platform: osx-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-21_osx64_openblas.conda + url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda hash: - md5: cf0e4d82cfca6cd9d6c9ed3df45907c9 - sha256: 5d0ef4743e8684ad436e31bd3c378d48642815a20c260d358668ba29cd80987a + md5: f21b282ff7ba14df6134a0fe6ab42b1b + sha256: e36744f3e780564d6748b5dd05e15ad6a1af9184cf32ab9d1304c13a6bc3e16b category: main optional: false - name: liblapack @@ -12997,43 +13410,6 @@ package: sha256: 63e22ccd4c1b80dfc7da169c65c62a878a46ef0e5771c3b0c091071e718ae1b1 category: main optional: false -- name: libmagma - version: 2.7.2 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17' - _openmp_mutex: '>=4.5' - cudatoolkit: '>=11.8,<12' - libblas: '>=3.9.0,<4.0a0' - libgcc-ng: '>=12' - liblapack: '>=3.9.0,<4.0a0' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.7.2-h09b5827_2.conda - hash: - md5: f6de79234f35c2fcc2e49dc66436601d - sha256: 4dd54775f2cfa9c09f4b4cc58a6db00bad50b30e65adf62ffe4213a30d962766 - category: main - optional: false -- name: libmagma_sparse - version: 2.7.2 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17' - _openmp_mutex: '>=4.5' - cudatoolkit: '>=11.8,<12' - libblas: '>=3.9.0,<4.0a0' - libgcc-ng: '>=12' - liblapack: '>=3.9.0,<4.0a0' - libmagma: '>=2.7.2,<2.7.3.0a0' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.7.2-h09b5827_3.conda - hash: - md5: 53157a5777c664896654d8dbc9fd6bf9 - sha256: ee4a2367446763e6a4ef6d2fa5aea06adfd4ff44853f7390a02b0da77c6f129c - category: main - optional: false - name: libnetcdf version: 4.9.2 manager: conda @@ -13184,6 +13560,18 @@ package: sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 category: main optional: false +- name: libogg + version: 1.3.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 + hash: + md5: 6e8cc2173440d77708196c5b93771680 + sha256: b88afeb30620b11bed54dac4295aa57252321446ba4e6babd7dce4b9ffde9b25 + category: main + optional: false - name: libogg version: 1.3.4 manager: conda @@ -13210,17 +13598,17 @@ package: category: main optional: false - name: libopenblas - version: 0.3.26 + version: 0.3.27 manager: conda platform: osx-64 dependencies: libgfortran: 5.* libgfortran5: '>=12.3.0' llvm-openmp: '>=16.0.6' - url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.26-openmp_hfef2a42_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda hash: - md5: 9df60162aea811087267b515f359536c - sha256: 4a5994cc608708eca19b90b642a144bb073e4a1cd27b824281dfcae67917204e + md5: 00237c9c7f2cb6725fe2960680a6e225 + sha256: 45519189c0295296268cb7eabeeaa03ef54d780416c9a24be1d2a21db63a7848 category: main optional: false - name: libopenblas @@ -13237,6 +13625,18 @@ package: sha256: feb2662444fc98a4842fe54cc70b1f109b2146108e7bac2b3bbad1f219cede90 category: main optional: false +- name: libopus + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + hash: + md5: 15345e56d527b330e1cacbdf58676e8f + sha256: 0e1c2740ebd1c93226dc5387461bbcf8142c518f2092f3ea7551f77755decc8f + category: main + optional: false - name: libopus version: 1.3.1 manager: conda @@ -13264,6 +13664,21 @@ package: sha256: 505672cb7ec1e42a7e60fcee9f6cad38b35227186b2dbcf3d5f4686a4339c13a category: main optional: false +- name: libparquet + version: 15.0.0 + manager: conda + platform: osx-64 + dependencies: + libarrow: 15.0.0 + libcxx: '>=14' + libthrift: '>=0.19.0,<0.19.1.0a0' + openssl: '>=3.2.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libparquet-15.0.0-h381d950_0_cpu.conda + hash: + md5: 8af9454451433ecef89a6baadd8575e7 + sha256: fab9fa004d0dab465969f5f02c4091d6ec5f6f9f7023529e1c0ce8ac01f366b8 + category: main + optional: false - name: libparquet version: 15.0.0 manager: conda @@ -13391,13 +13806,14 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=10.9' libabseil: '>=20230802.1,<20230803.0a0' - libcxx: '>=15' + libcxx: '>=16.0.6' libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-4.24.4-h810fc01_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-4.24.4-hc9861d8_0.conda hash: - md5: 36d9b941d8686f7926415275f8f75829 - sha256: 9b2cd4027b081a9f90069b429e52bf177ea4968032c684ea5d5c6d78e9e11c08 + md5: ac5438d981e105e053b341eb30c44273 + sha256: 2e81e023f463ef239e2fb7f56a4e8eed61a1d8e9ca3f2f07bec1668cc369b2ce category: main optional: false - name: libre2-11 @@ -13577,16 +13993,35 @@ package: sha256: 1a86748681f1435763d981ec965e87c4bb281c5e463cd80c82a2841d3553be89 category: main optional: false +- name: libsndfile + version: 1.2.2 + manager: conda + platform: linux-64 + dependencies: + lame: '>=3.100,<3.101.0a0' + libflac: '>=1.4.3,<1.5.0a0' + libgcc-ng: '>=12' + libogg: '>=1.3.4,<1.4.0a0' + libopus: '>=1.3.1,<2.0a0' + libstdcxx-ng: '>=12' + libvorbis: '>=1.3.7,<1.4.0a0' + mpg123: '>=1.32.1,<1.33.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + hash: + md5: ef1910918dd895516a769ed36b5b3a4e + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + category: main + optional: false - name: libsodium version: 1.0.18 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=7.5.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2 + url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h516909a_1.tar.bz2 hash: - md5: c3788462a6fbddafdb413a9f9053e58d - sha256: 53da0c8b79659df7b53eebdb80783503ce72fb4b10ed6e9e05cc0e9e4207a130 + md5: e1ca1a4b82f7b51b29318f80cebae84a + sha256: 86e0ef59cbec7e68e372b3380f5809669968d3f674a9b8f2f76f7059c83b4ad1 category: main optional: false - name: libsodium @@ -13730,15 +14165,15 @@ package: category: main optional: false - name: libsqlite - version: 3.45.2 + version: 3.45.3 manager: conda platform: osx-64 dependencies: libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.2-h92b6c6a_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda hash: - md5: 086f56e13a96a6cfb1bf640505ae6b70 - sha256: 320ec73a4e3dd377757a2595770b8137ec4583df4d7782472d76377cdbdc4543 + md5: 68e462226209f35182ef66eda0f794ff + sha256: 4d44b68fb29dcbc2216a8cae0b274b02ef9b4ae05d1d0f785362ed30b91c9b52 category: main optional: false - name: libsqlite @@ -13804,6 +14239,24 @@ package: sha256: a56c5b11f1e73a86e120e6141a42d9e935a99a2098491ac9e15347a1476ce777 category: main optional: false +- name: libsystemd0 + version: '255' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libcap: '>=2.69,<2.70.0a0' + libgcc-ng: '>=12' + libgcrypt: '>=1.10.3,<2.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda + hash: + md5: 3366af27f0b593544a6cd453c7932ac5 + sha256: af27b0d225435d03f378a119f8eab6b280c53557a3c84cdb3bb8fd3167615aed + category: main + optional: false - name: libthrift version: 0.19.0 manager: conda @@ -13915,23 +14368,17 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' - cudatoolkit: '>=11.8,<12' - cudnn: '>=8.8.0.121,<9.0a0' libcblas: '>=3.9.0,<4.0a0' libgcc-ng: '>=12' - libmagma: '>=2.7.2,<2.7.3.0a0' - libmagma_sparse: '>=2.7.2,<2.7.3.0a0' libprotobuf: '>=4.24.4,<4.24.5.0a0' libstdcxx-ng: '>=12' libuv: '>=1.46.0,<2.0a0' - magma: '>=2.7.2,<2.7.3.0a0' mkl: '>=2023.2.0,<2024.0a0' - nccl: '>=2.19.4.1,<3.0a0' sleef: '>=3.5.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.1.2-cuda118_h3d7bd98_300.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.1.2-cpu_mkl_hadc400e_100.conda hash: - md5: 19f2c0ac4037db9622363dbdcdd21df0 - sha256: 80c47ee854a10b028841f581c8651b85ed2453d086b8a8a784326606bbb7a945 + md5: 54f228509c64d8de523ee6ab19e5f3e9 + sha256: e904bb9260816595e34c5fed07ce8d1ae5572bce36c283425fbec0bddcd3ce88 category: main optional: false - name: libutf8proc @@ -14014,6 +14461,20 @@ package: sha256: 60bed2a7a85096387ab0381cbc32ea2da7f8dd99bd90e440983019c0cdd96ad1 category: main optional: false +- name: libvorbis + version: 1.3.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + libogg: '>=1.3.2,<1.4.0a0' + libstdcxx-ng: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-he1b5a44_0.tar.bz2 + hash: + md5: de5b60f584a98d397cc589fcabfa3889 + sha256: 7ad72b75a143ea0bbd72f088b6150db9de66f0c2f25e5745e96aca0a16918d7f + category: main + optional: false - name: libvorbis version: 1.3.7 manager: conda @@ -14093,10 +14554,10 @@ package: manager: conda platform: osx-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h0dc2134_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h10d778d_1.conda hash: - md5: 4e7e9d244e87d66c18d36894fd6a8ae5 - sha256: fa7580f26fec4c28321ec2ece1257f3293e0c646c635e9904679f4a8369be401 + md5: 1ff09ca6e85ee516442a6a94cdfc7065 + sha256: cd2d651e90b93b03e4e38617aa15ddf8e5537b2bd22dd2628784e4c80bc107eb category: main optional: false - name: libwebp-base @@ -14165,6 +14626,23 @@ package: sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c category: main optional: false +- name: libxkbcommon + version: 1.7.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + libxml2: '>=2.12.6,<3.0a0' + xkeyboard-config: '' + xorg-libxau: '>=1.0.11,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda + hash: + md5: b32c0da42b1f24a98577bb3d7fc0b995 + sha256: 3d97d7f964237f42452295d461afdbc51e93f72e2c80be516f56de80e3bb6621 + category: main + optional: false - name: libxml2 version: 2.12.6 manager: conda @@ -14190,10 +14668,10 @@ package: libiconv: '>=1.17,<2.0a0' libzlib: '>=1.2.13,<1.3.0a0' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_2.conda hash: - md5: bd85e0ca9e1ffaadc3b56079fd956035 - sha256: 07a5dc7316d4c1ff3d924df6a76e6a13380d702fa5b3b1889e56d0672e5b8201 + md5: 50b997370584f2c83ca0c38e9028eab9 + sha256: 2598a525b1769338f96c3d4badad7d8b95c9ddcea86db3f9479a274803190e5c category: main optional: false - name: libxml2 @@ -14302,14 +14780,14 @@ package: category: main optional: false - name: llvm-openmp - version: 18.1.2 + version: 18.1.3 manager: conda platform: osx-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.2-hb6ac08f_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda hash: - md5: e7f7e91cfabd8c7172c9ae405214dd68 - sha256: dc40b678f5be2caf4e89ee3dc9037399d0bcd46543bc258dc46e1b92d241c6a6 + md5: 506f270f4f00980d27cc1fc127e0ed37 + sha256: 997e4169ea474a7bc137fed3b5f4d94b1175162b3318e8cb3943003e460fe458 category: main optional: false - name: llvm-openmp @@ -14444,11 +14922,11 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=7.5.0' - url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h516909a_1000.tar.bz2 + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda hash: - md5: bb14fcb13341b81d5eb386423b9d2bac - sha256: 25d16e6aaa3d0b450e61d0c4fadd7c9fd17f16e2fef09b34507209342d63c9f6 + md5: ec7398d21e2651e0dcb0044d03b9a339 + sha256: 88433b98a9dd9da315400e7fb9cd5f70804cb17dca8b1c85163a64f90f584126 category: main optional: false - name: lzo @@ -14456,10 +14934,10 @@ package: manager: conda platform: osx-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-64/lzo-2.10-haf1e3a3_1000.tar.bz2 + url: https://conda.anaconda.org/conda-forge/osx-64/lzo-2.10-h10d778d_1001.conda hash: - md5: 0b6bca372a95d6c602c7a922e928ce79 - sha256: c8a9401eff2efbbcc6da03d0066ee85d72402f7658c240e7968c64052a0d0493 + md5: bfecd73e4a2dc18ffd5288acf8a212ab + sha256: 4006c57f805ca6aec72ee0eb7166b2fd648dd1bf3721b9de4b909cd374196643 category: main optional: false - name: lzo @@ -14467,25 +14945,10 @@ package: manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h642e427_1000.tar.bz2 + url: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h93a5062_1001.conda hash: - md5: ddab5f96f5573a9bd5e24f9994fd6ec9 - sha256: ae029e5c16893071d29a11ddbfdbdb01b2ebf10d1785f54370934439d8b71817 - category: main - optional: false -- name: magma - version: 2.7.2 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17' - cudatoolkit: '>=11.8,<12' - libmagma: '>=2.7.2,<2.7.3.0a0' - libmagma_sparse: 2.7.2 - url: https://conda.anaconda.org/conda-forge/linux-64/magma-2.7.2-h4aca40b_3.conda - hash: - md5: fe218300f1dfb9fbedbd210b3b9e020e - sha256: 9e3240a60a16269c986bcd3d1bee9e35cf81a843ff33b68ee6a2a1e7cbb7fd1c + md5: 915996063a7380c652f83609e970c2a7 + sha256: b68160b0a8ec374cea12de7afb954ca47419cdc300358232e19cec666d60b929 category: main optional: false - name: makefun @@ -14539,17 +15002,17 @@ package: category: main optional: false - name: mako - version: 1.3.2 + version: 1.3.3 manager: conda platform: osx-64 dependencies: importlib-metadata: '' python: '>=3.6' markupsafe: '>=0.9.2' - url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.3-pyhd8ed1ab_0.conda hash: - md5: a6b5f0124bc6d061350edd6d7f96dd05 - sha256: 5f21876a83bcc040196d7f3950d576eb492bf0f6293eacd55e48e2c58a069bce + md5: c622cbc0c7c98fab3526f6c92707d754 + sha256: c2b3b57b4a6715501cbac306c329fe271c194cf63fbb50ff5d40db78623a6d93 category: main optional: false - name: mako @@ -14657,45 +15120,42 @@ package: category: main optional: false - name: markdown-it-py - version: 2.2.0 + version: 3.0.0 manager: conda platform: linux-64 dependencies: mdurl: '>=0.1,<1' - python: '>=3.7' - typing_extensions: '>=3.7.4' - url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-2.2.0-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda hash: - md5: b2928a6c6d52d7e3562b4a59c3214e3a - sha256: 65ed439862c1851463f03a9bc5109992ce3e3e025e9a2d76d13ca19f576eee9f + md5: 93a8e71256479c62074356ef6ebf501b + sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 category: main optional: false - name: markdown-it-py - version: 2.2.0 + version: 3.0.0 manager: conda platform: osx-64 dependencies: - python: '>=3.7' - typing_extensions: '>=3.7.4' + python: '>=3.8' mdurl: '>=0.1,<1' - url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-2.2.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda hash: - md5: b2928a6c6d52d7e3562b4a59c3214e3a - sha256: 65ed439862c1851463f03a9bc5109992ce3e3e025e9a2d76d13ca19f576eee9f + md5: 93a8e71256479c62074356ef6ebf501b + sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 category: main optional: false - name: markdown-it-py - version: 2.2.0 + version: 3.0.0 manager: conda platform: osx-arm64 dependencies: - python: '>=3.7' - typing_extensions: '>=3.7.4' + python: '>=3.8' mdurl: '>=0.1,<1' - url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-2.2.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda hash: - md5: b2928a6c6d52d7e3562b4a59c3214e3a - sha256: 65ed439862c1851463f03a9bc5109992ce3e3e025e9a2d76d13ca19f576eee9f + md5: 93a8e71256479c62074356ef6ebf501b + sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 category: main optional: false - name: markupsafe @@ -14783,11 +15243,12 @@ package: platform: linux-64 dependencies: marshmallow: '>=2.0.0' - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/marshmallow-enum-1.5.1-pyh9f0ad1d_3.tar.bz2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/linux-64/marshmallow-enum-1.5.1-py39hde42818_2.tar.bz2 hash: - md5: 67c5202bf14543cd1bb97f129d3f26dd - sha256: 7729d878c2129d691e86b81fce346320a0152a6bbfc862a8c12ec646763f4857 + md5: cf3771b0c8d7662dff2212b4db9dd27b + sha256: 3fbc341d3a4dc6a5fa8063b19330a6e598f2832c86f74924453a8511869d2624 category: main optional: false - name: marshmallow-enum @@ -14924,7 +15385,7 @@ package: category: main optional: false - name: matplotlib-base - version: 3.8.3 + version: 3.8.4 manager: conda platform: osx-64 dependencies: @@ -14944,10 +15405,10 @@ package: python: '>=3.9,<3.10.0a0' python-dateutil: '>=2.7' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.3-py39h7070ae8_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py39h7070ae8_0.conda hash: - md5: 241e91172dfaa6ad66e3c838a6185641 - sha256: 4173787e0ff755e25ebe1c4bb9e0a64fd397cd0fa18f28e54a592cc1af2b6049 + md5: cb9e1f8aff1f759b9685e908f9dc0a5b + sha256: 4d48e1826a03d65650bf5c79883c05f28a88a56759a0d0c5f21a815fef10ff09 category: main optional: false - name: matplotlib-base @@ -14990,16 +15451,16 @@ package: category: main optional: false - name: matplotlib-inline - version: 0.1.6 + version: 0.1.7 manager: conda platform: osx-64 dependencies: traitlets: '' python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda hash: - md5: b21613793fcc81d944c76c9f2864a7de - sha256: aa091b88aec55bfa2d9207028d8cdc689b9efb090ae27b99557e93c675be2f3c + md5: 779345c95648be40d22aaa89de7d4254 + sha256: 7ea68676ea35fbb095420bbcc1c82c4767b8be7bb56abb6989b7f89d957a3bab category: main optional: false - name: matplotlib-inline @@ -15277,51 +15738,39 @@ package: scikit-learn: <2 scipy: <2 sqlalchemy: '>=1.4.0,<3' - url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-2.12.1-hf3d152e_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-2.12.1-hf3d152e_1.conda hash: - md5: 1e3f832d3843b750c8f5831e2006a8ce - sha256: 3de297846e3471e67cfb4307e28f3ff6a9a17fa636a8fcce9a144fa8b587520f + md5: 60da3afe1dd38b6fb0bccb3f79419d03 + sha256: e3a588aedffbebc734d5a77bd7b1bf721a3fe89abc76692b102015693875a5e5 category: main optional: false - name: mlflow - version: 2.7.0 + version: 2.12.1 manager: conda platform: osx-64 dependencies: alembic: <2,!=1.10 - click: '>=7.0,<9' - cloudpickle: <3 - databricks-cli: '>=0.8.7,<1' - docker-py: '>=4.0.0,<7' - entrypoints: <1 - flask: <3 - gitpython: '>=2.1.0,<4' + docker-py: '>=4.0.0,<8' + flask: <4 + graphene: <4 gunicorn: <22 - importlib-metadata: <7,>=3.7.0,!=4.7.0 jinja2: <4,>=2.11 markdown: <4,>=3.3 matplotlib-base: <4 + mlflow-ui: 2.12.1 numpy: <2 - openssl: '' - packaging: <24 pandas: <3 prometheus_flask_exporter: <1 - protobuf: '>=3.12.0,<5' - pyarrow: <14,>=4.0.0 - python: '>=3.9,<3.10.0a0' + pyarrow: <16,>=4.0.0 python_abi: 3.9.* - pytz: <2024 - pyyaml: '>=5.1,<7' querystring_parser: <2 - requests: '>=2.17.3,<3' scikit-learn: <2 scipy: <2 sqlalchemy: '>=1.4.0,<3' - sqlparse: '>=0.4.0,<1' - url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-2.7.0-py39h8ac9d56_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-2.12.1-h6e9494a_1.conda hash: - md5: 21c33f5f9e9a1d053544620b5d00bc79 - sha256: c98ec57de0451c1045e8e462d859aeda8c948a6eb87ac55d23e65063bd914159 + md5: 7d6bb37e5061dd12831e70470a1fe98e + sha256: 2342807335c88821fb990392d657c58b2e952299dfa9d919b4388ea7a89b909d category: main optional: false - name: mlflow @@ -15348,10 +15797,10 @@ package: scikit-learn: <2 scipy: <2 sqlalchemy: '>=1.4.0,<3' - url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-2.12.1-py39h2804cbe_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-2.12.1-py39h2804cbe_1.conda hash: - md5: 6f4f101ca12497a50cfced6bc6683f1f - sha256: c45d8cb30636f63982e365aa7d756f3792f688aee4b5ce775720449ca884ed48 + md5: 0f050babf3367f3c0284ca2520f7ef0f + sha256: 5e535d0774fcdcc382ae236abcdee536c39ba86393103e71eb0e99f87b132882 category: main optional: false - name: mlflow-skinny @@ -15372,10 +15821,34 @@ package: pyyaml: '>=5.1,<7' requests: '>=2.17.3,<3' sqlparse: '>=0.4.0,<1' - url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-skinny-2.12.1-py39hf3d152e_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-skinny-2.12.1-py39hf3d152e_1.conda hash: - md5: 4f14af5afcc79600aeb0ab9d4044668a - sha256: 9ee691fb4c2193a87d0aa8d19a50881a944d9726adf52ba02861f92fc5f05420 + md5: 8d118abd6b7840de27b37ec08ef0cd24 + sha256: 5f813182db844ce54f7d84951a918b9d7f08e00d39d64feaab8677fdb82ecddd + category: main + optional: false +- name: mlflow-skinny + version: 2.12.1 + manager: conda + platform: osx-64 + dependencies: + click: '>=7.0,<9' + cloudpickle: <4 + entrypoints: <1 + gitpython: '>=2.1.0,<4' + importlib-metadata: <8,>=3.7.0,!=4.7.0 + packaging: <25 + protobuf: '>=3.12.0,<6' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + pytz: <2025 + pyyaml: '>=5.1,<7' + requests: '>=2.17.3,<3' + sqlparse: '>=0.4.0,<1' + url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-skinny-2.12.1-py39h6e9494a_1.conda + hash: + md5: 51233b556527f45820fb3ab1e8e420ce + sha256: ba3b43f56ea5d3be777df36575d475bf2993e08ee72ebdb2807b792bccc9aaed category: main optional: false - name: mlflow-skinny @@ -15396,16 +15869,33 @@ package: pyyaml: '>=5.1,<7' requests: '>=2.17.3,<3' sqlparse: '>=0.4.0,<1' - url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-skinny-2.12.1-py39h2804cbe_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-skinny-2.12.1-py39h2804cbe_1.conda + hash: + md5: b2af316d152bd9491589cbba54b34735 + sha256: 4cd23c1d7581e694185471452ceccb96f51c546330b914f70e5e5759365eff6e + category: main + optional: false +- name: mlflow-ui + version: 2.12.1 + manager: conda + platform: linux-64 + dependencies: + flask: <4 + gunicorn: <22 + mlflow-skinny: 2.12.1 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + querystring_parser: <2 + url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-ui-2.12.1-py39hf3d152e_1.conda hash: - md5: df4b64065cacb16e804876f117e3425e - sha256: ead5fb6c59820c124105359bb0692b7e63fd3d796fcb0a24059b0261ba8a2793 + md5: 2a4c7d9d456e9eed06be716889b1baca + sha256: 0afcb6f8b1f7dc0f4d7e1b8cdd4a5c82f0fb3a2e164d1d937806217a4e08fabd category: main optional: false - name: mlflow-ui version: 2.12.1 manager: conda - platform: linux-64 + platform: osx-64 dependencies: flask: <4 gunicorn: <22 @@ -15413,10 +15903,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* querystring_parser: <2 - url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-ui-2.12.1-py39hf3d152e_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-ui-2.12.1-py39h6e9494a_1.conda hash: - md5: 3b5e099d047a795249bc9712927dd788 - sha256: dd8fbc2f3cb3133c0811f3529700877a111703c1b5a0a24d5ea21673520b0c20 + md5: b6209f08579417deb9ee7c5460cd96d8 + sha256: 5f92995fa5de526566335874ee9fa773285dc337986ff0c29a389fa3abd84349 category: main optional: false - name: mlflow-ui @@ -15430,10 +15920,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* querystring_parser: <2 - url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-ui-2.12.1-py39h2804cbe_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-ui-2.12.1-py39h2804cbe_1.conda hash: - md5: b1529f9ae07a996ecf2e7ce341d34dfe - sha256: 03ca55292d3aca340f38d8575b1bba5ef24ac75986a47a775fd8e0549da0f8ec + md5: aca5d6f79b7f0528b6382ad79229f401 + sha256: b1088a0afe635c196c4bf4981e36d92f04a87d433e24a35777c2a7023fb89954 category: main optional: false - name: modin @@ -15451,17 +15941,17 @@ package: category: main optional: false - name: modin - version: 0.28.0 + version: 0.29.0 manager: conda platform: osx-64 dependencies: - modin-dask: 0.28.0 + modin-dask: 0.29.0 python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/modin-0.28.0-py39h6e9494a_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/modin-0.29.0-py39h6e9494a_0.conda hash: - md5: e240c76fd1104c2681dce94af6e9facc - sha256: ad88d88d53aaa5e2a366709f46989475aea168eb2d10daba738f5c4e2f4695a1 + md5: af41de5e474b141c8cb3aaafbfa96288 + sha256: f5015aa75c5874271eb3bed8a326984194dc981258104e77bb7a3561b9ce58e7 category: main optional: false - name: modin @@ -15497,7 +15987,7 @@ package: category: main optional: false - name: modin-core - version: 0.28.0 + version: 0.29.0 manager: conda platform: osx-64 dependencies: @@ -15508,10 +15998,10 @@ package: psutil: '>=5.8.0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/modin-core-0.28.0-py39h6e9494a_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/modin-core-0.29.0-py39h6e9494a_0.conda hash: - md5: a6f9748ee9de1f41e12565d534813e39 - sha256: 6cece38062322e656cfd91ba0661fe300407234e390337e404b245a4c30b6080 + md5: 074e627d559c11e0e9b241ae9a1960b7 + sha256: ecabe721d9c3cfce52a8d0f5a19d28d90582cae218c12cb8422eb7aad4768dcd category: main optional: false - name: modin-core @@ -15549,19 +16039,19 @@ package: category: main optional: false - name: modin-dask - version: 0.28.0 + version: 0.29.0 manager: conda platform: osx-64 dependencies: dask: '>=2.22.0' distributed: '>=2.22.0' - modin-core: 0.28.0 + modin-core: 0.29.0 python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/modin-dask-0.28.0-py39h6e9494a_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/modin-dask-0.29.0-py39h6e9494a_0.conda hash: - md5: 60224e14c75aa0619a0efb08aeee8d4b - sha256: e03a929af284ac9bcf357d2d9da203972c4e0281270f4a966d476fe39ec8eca0 + md5: ff58afc1c85dae563f0bdbabc9f2615e + sha256: 2d118569a0528d1e11fee77e3e406f4b704f1000236146c8326eac38f804a6d9 category: main optional: false - name: modin-dask @@ -15674,11 +16164,11 @@ package: manager: conda platform: osx-64 dependencies: - gmp: '>=6.2.1,<7.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-h0c69b56_0.conda + gmp: '>=6.3.0,<7.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-h4f6b447_1.conda hash: - md5: d545aecded064848432bc994075dfccf - sha256: e7c93a5399661b0528981c6fd53e8614eee3f9ba97f92e8167c092c4a5d9368c + md5: b90df08f0deb2f58631447c1462c92a7 + sha256: 002209e7d1f21cdd04de17050ab2050de4347e5bf04210ce6a636cbabf43e1d0 category: main optional: false - name: mpfr @@ -15693,6 +16183,19 @@ package: sha256: a0b183cdf8bd1f2462d965f7a065cbfc32669d95bb6c8f970f7c7f63d2938436 category: main optional: false +- name: mpg123 + version: 1.32.6 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda + hash: + md5: 9160cdeb523a1b20cf8d2a0bf821f45d + sha256: 8895a5ce5122a3b8f59afcba4b032f198e8a690a0efc95ef61f2135357ef0d72 + category: main + optional: false - name: mpmath version: 1.3.0 manager: conda @@ -15950,46 +16453,46 @@ package: category: main optional: false - name: multiprocess - version: 0.70.15 + version: 0.70.16 manager: conda platform: linux-64 dependencies: - dill: '>=0.3.6' + dill: '>=0.3.8' libgcc-ng: '>=12' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py39hd1e30aa_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py39hd1e30aa_0.conda hash: - md5: ba981804a87d06ba9899e938c3178ed2 - sha256: 7f9c6d04b5ec3df502599ebd3e86a95194bb7358d70c23374f8b71a89040194a + md5: 9cef252eafc7a1a0ddba737290a1c4e2 + sha256: 805bc36c1aa37d80757b96cae7f12944343f1099c68813606416e35486c703d3 category: main optional: false - name: multiprocess - version: 0.70.15 + version: 0.70.16 manager: conda platform: osx-64 dependencies: - dill: '>=0.3.6' + dill: '>=0.3.8' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/multiprocess-0.70.15-py39hdc70f33_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/multiprocess-0.70.16-py39ha09f3b3_0.conda hash: - md5: fb095a5ac1085f0e0bb5051818520144 - sha256: c1b42c332f6ed3aa83b5b0d3949c9288fa9895c551c6bc1ff1c54f740813c721 + md5: bc33fc5b2556c4fcf4d3d756fe500c05 + sha256: 847719018ab1b5702257db4ac7d3eedeae48034da644047ca97d7af1fb3c5806 category: main optional: false - name: multiprocess - version: 0.70.15 + version: 0.70.16 manager: conda platform: osx-arm64 dependencies: - dill: '>=0.3.6' + dill: '>=0.3.8' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py39h0f82c59_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py39h17cfd9d_0.conda hash: - md5: 3b94f36e225c5b5fe8d37ce3577cf72c - sha256: 0675aaf60406afb644f42b714f58979feaa99892e98aca83b81b8376df7b5997 + md5: 785e3f2fca33cf22a899ad2f25b1f6df + sha256: 9d9d0ebe8f7ab624ff3951ef2ca9a12a46ce2fae9a17f78596322fa043f4290b category: main optional: false - name: munkres @@ -16064,6 +16567,20 @@ package: sha256: f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3 category: main optional: false +- name: mysql-common + version: 8.0.33 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openssl: '>=3.1.4,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_6.conda + hash: + md5: 80bf3b277c120dd294b51d404b931a75 + sha256: c8b2c5c9d0d013a4f6ef96cb4b339bfdc53a74232d8c61ed08178e5b1ec4eb63 + category: main + optional: false - name: mysql-common version: 8.0.33 manager: conda @@ -16078,6 +16595,23 @@ package: sha256: b6b18aeed435d4075b4aac3559a070a6caa5a174a339e8de87785fca2f8f57a6 category: main optional: false +- name: mysql-libs + version: 8.0.33 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + mysql-common: 8.0.33 + openssl: '>=3.1.4,<4.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_6.conda + hash: + md5: e87530d1b12dd7f4e0f856dc07358d60 + sha256: 78c905637dac79b197395065c169d452b8ca2a39773b58e45e23114f1cb6dcdb + category: main + optional: false - name: mysql-libs version: 8.0.33 manager: conda @@ -16096,29 +16630,29 @@ package: category: main optional: false - name: myst-nb - version: 0.17.2 + version: 1.1.0 manager: conda platform: linux-64 dependencies: importlib-metadata: '' ipykernel: '' ipython: '' - jupyter-cache: '>=0.5.0,<0.7.0' - myst-parser: '>=0.18.0,<0.19.0' + jupyter-cache: '>=0.5' + myst-parser: '>=1.0.0' nbclient: '' - nbformat: '>=5.0,<6' - python: '>=3.7' + nbformat: '>=5.0' + python: '>=3.9' pyyaml: '' - sphinx: '>=4,<6' + sphinx: '>=5' typing_extensions: '' - url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-0.17.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.1.0-pyhd8ed1ab_0.conda hash: - md5: 40190b7d06f86b63d28fa78aaa39c023 - sha256: 37bcf6de8618a0668ef6b364b14e0eceea87b202a3882c59dcd85bc1172a5402 + md5: bac818b87e5f0dace7bec63ec7ec8e72 + sha256: 58eb6d830c4d93f4f73a0fdf94b5d042c3bf520859776325d3b5cda226642475 category: main optional: false - name: myst-nb - version: 0.17.2 + version: 1.1.0 manager: conda platform: osx-64 dependencies: @@ -16128,19 +16662,19 @@ package: importlib-metadata: '' ipykernel: '' nbclient: '' - python: '>=3.7' - nbformat: '>=5.0,<6' - sphinx: '>=4,<6' - myst-parser: '>=0.18.0,<0.19.0' - jupyter-cache: '>=0.5.0,<0.7.0' - url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-0.17.2-pyhd8ed1ab_0.conda + python: '>=3.9' + nbformat: '>=5.0' + sphinx: '>=5' + myst-parser: '>=1.0.0' + jupyter-cache: '>=0.5' + url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.1.0-pyhd8ed1ab_0.conda hash: - md5: 40190b7d06f86b63d28fa78aaa39c023 - sha256: 37bcf6de8618a0668ef6b364b14e0eceea87b202a3882c59dcd85bc1172a5402 + md5: bac818b87e5f0dace7bec63ec7ec8e72 + sha256: 58eb6d830c4d93f4f73a0fdf94b5d042c3bf520859776325d3b5cda226642475 category: main optional: false - name: myst-nb - version: 0.17.2 + version: 1.1.0 manager: conda platform: osx-arm64 dependencies: @@ -16150,120 +16684,117 @@ package: importlib-metadata: '' ipykernel: '' nbclient: '' - python: '>=3.7' - nbformat: '>=5.0,<6' - sphinx: '>=4,<6' - myst-parser: '>=0.18.0,<0.19.0' - jupyter-cache: '>=0.5.0,<0.7.0' - url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-0.17.2-pyhd8ed1ab_0.conda + python: '>=3.9' + nbformat: '>=5.0' + sphinx: '>=5' + myst-parser: '>=1.0.0' + jupyter-cache: '>=0.5' + url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.1.0-pyhd8ed1ab_0.conda hash: - md5: 40190b7d06f86b63d28fa78aaa39c023 - sha256: 37bcf6de8618a0668ef6b364b14e0eceea87b202a3882c59dcd85bc1172a5402 + md5: bac818b87e5f0dace7bec63ec7ec8e72 + sha256: 58eb6d830c4d93f4f73a0fdf94b5d042c3bf520859776325d3b5cda226642475 category: main optional: false - name: myst-parser - version: 0.18.1 + version: 2.0.0 manager: conda platform: linux-64 dependencies: - docutils: '>=0.15,<0.20' + docutils: '>=0.16,<0.21' jinja2: '' - markdown-it-py: '>=1.0.0,<3.0.0' - mdit-py-plugins: '>=0.3.1,<1' - python: '>=3.7' + markdown-it-py: '>=3.0.0,<4.0.0' + mdit-py-plugins: '>=0.4,<1' + python: '>=3.8' pyyaml: '' - sphinx: '>=4,<6' - typing-extensions: '' - url: https://conda.anaconda.org/conda-forge/noarch/myst-parser-0.18.1-pyhd8ed1ab_0.tar.bz2 + sphinx: '>=6,<8' + url: https://conda.anaconda.org/conda-forge/noarch/myst-parser-2.0.0-pyhd8ed1ab_0.conda hash: - md5: bcfdf5c7d8bf5c6f6be7b4c66fff2eca - sha256: 260812a430adee3598103d75704c1c855a9816a3895971ca0190d0f5e1e8165a + md5: 70699181909e468875f12076e1b0a8a9 + sha256: 59cdc52d9875f623a4df82896d80f304e436138f8410cbef969a7e4452c6bab7 category: main optional: false - name: myst-parser - version: 0.18.1 + version: 2.0.0 manager: conda platform: osx-64 dependencies: pyyaml: '' - typing-extensions: '' jinja2: '' - python: '>=3.7' - markdown-it-py: '>=1.0.0,<3.0.0' - sphinx: '>=4,<6' - docutils: '>=0.15,<0.20' - mdit-py-plugins: '>=0.3.1,<1' - url: https://conda.anaconda.org/conda-forge/noarch/myst-parser-0.18.1-pyhd8ed1ab_0.tar.bz2 + python: '>=3.8' + docutils: '>=0.16,<0.21' + markdown-it-py: '>=3.0.0,<4.0.0' + mdit-py-plugins: '>=0.4,<1' + sphinx: '>=6,<8' + url: https://conda.anaconda.org/conda-forge/noarch/myst-parser-2.0.0-pyhd8ed1ab_0.conda hash: - md5: bcfdf5c7d8bf5c6f6be7b4c66fff2eca - sha256: 260812a430adee3598103d75704c1c855a9816a3895971ca0190d0f5e1e8165a + md5: 70699181909e468875f12076e1b0a8a9 + sha256: 59cdc52d9875f623a4df82896d80f304e436138f8410cbef969a7e4452c6bab7 category: main optional: false - name: myst-parser - version: 0.18.1 + version: 2.0.0 manager: conda platform: osx-arm64 dependencies: pyyaml: '' - typing-extensions: '' jinja2: '' - python: '>=3.7' - markdown-it-py: '>=1.0.0,<3.0.0' - sphinx: '>=4,<6' - docutils: '>=0.15,<0.20' - mdit-py-plugins: '>=0.3.1,<1' - url: https://conda.anaconda.org/conda-forge/noarch/myst-parser-0.18.1-pyhd8ed1ab_0.tar.bz2 + python: '>=3.8' + docutils: '>=0.16,<0.21' + markdown-it-py: '>=3.0.0,<4.0.0' + mdit-py-plugins: '>=0.4,<1' + sphinx: '>=6,<8' + url: https://conda.anaconda.org/conda-forge/noarch/myst-parser-2.0.0-pyhd8ed1ab_0.conda hash: - md5: bcfdf5c7d8bf5c6f6be7b4c66fff2eca - sha256: 260812a430adee3598103d75704c1c855a9816a3895971ca0190d0f5e1e8165a + md5: 70699181909e468875f12076e1b0a8a9 + sha256: 59cdc52d9875f623a4df82896d80f304e436138f8410cbef969a7e4452c6bab7 category: main optional: false - name: nbclient - version: 0.7.4 + version: 0.10.0 manager: conda platform: linux-64 dependencies: jupyter_client: '>=6.1.12' jupyter_core: '>=4.12,!=5.0.*' nbformat: '>=5.1' - python: '>=3.7' - traitlets: '>=5.3' - url: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.4-pyhd8ed1ab_0.conda + python: '>=3.8' + traitlets: '>=5.4' + url: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda hash: - md5: f7aa15f77d29b11caa1df1eb15383c59 - sha256: f26afcbbdd4bd1245db514c6ebc6ef18cc12067145dcab229b6f88653575d44c + md5: 15b51397e0fe8ea7d7da60d83eb76ebc + sha256: 589d72d36d61a23b39d6fff2c488f93e29e20de4fc6f5d315b5f2c16e81028bf category: main optional: false - name: nbclient - version: 0.7.4 + version: 0.10.0 manager: conda platform: osx-64 dependencies: - python: '>=3.7' + python: '>=3.8' jupyter_client: '>=6.1.12' jupyter_core: '>=4.12,!=5.0.*' nbformat: '>=5.1' - traitlets: '>=5.3' - url: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.4-pyhd8ed1ab_0.conda + traitlets: '>=5.4' + url: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda hash: - md5: f7aa15f77d29b11caa1df1eb15383c59 - sha256: f26afcbbdd4bd1245db514c6ebc6ef18cc12067145dcab229b6f88653575d44c + md5: 15b51397e0fe8ea7d7da60d83eb76ebc + sha256: 589d72d36d61a23b39d6fff2c488f93e29e20de4fc6f5d315b5f2c16e81028bf category: main optional: false - name: nbclient - version: 0.7.4 + version: 0.10.0 manager: conda platform: osx-arm64 dependencies: - python: '>=3.7' + python: '>=3.8' jupyter_client: '>=6.1.12' jupyter_core: '>=4.12,!=5.0.*' nbformat: '>=5.1' - traitlets: '>=5.3' - url: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.7.4-pyhd8ed1ab_0.conda + traitlets: '>=5.4' + url: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda hash: - md5: f7aa15f77d29b11caa1df1eb15383c59 - sha256: f26afcbbdd4bd1245db514c6ebc6ef18cc12067145dcab229b6f88653575d44c + md5: 15b51397e0fe8ea7d7da60d83eb76ebc + sha256: 589d72d36d61a23b39d6fff2c488f93e29e20de4fc6f5d315b5f2c16e81028bf category: main optional: false - name: nbconvert @@ -16286,10 +16817,10 @@ package: dependencies: nbconvert-core: 7.16.3 nbconvert-pandoc: 7.16.3 - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.3-hd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.3-hd8ed1ab_1.conda hash: - md5: b0c9bbbe54a11a6db3bec51eb0ef0281 - sha256: c9bb08085ba1508607cd1ba839a31f1164e3ed15f4e499a490b71721d1df7ec5 + md5: c80cd9bcb93679ceb9ea0938cf5f7db0 + sha256: 03f1b45a9860217a58c077a38e65abc27360868cb498e30d19cdbd1011c79874 category: main optional: false - name: nbconvert @@ -16355,10 +16886,10 @@ package: pygments: '>=2.4.1' nbclient: '>=0.5.0' mistune: '>=2.0.3,<4' - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.3-pyhd8ed1ab_1.conda hash: - md5: 0cab42b4917e71df9dc2224b9940ef19 - sha256: 522d28206fbafa634763da1ae9119a9edd141d8c516ed13878f77b67921e1bb5 + md5: 2f34a65aee1d1f354e701d166413783a + sha256: b86ab6e91bb0b25a1bc12f3ff2e332f481ff8ad9c835724c86f1adf98b913733 category: main optional: false - name: nbconvert-core @@ -16409,10 +16940,10 @@ package: dependencies: pandoc: '' nbconvert-core: 7.16.3 - url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.3-hd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.3-hd8ed1ab_1.conda hash: - md5: 1344bbd74e8bcd1acdd8ec0824e9840c - sha256: d22ef91db4ca9592860168499b4d6e5443eca0176190431321ee78ef9cc977df + md5: 105151637d2223d6274c5c79d839cc64 + sha256: ec4ce4efc6e4db87ff1d1deca0a0c71a3aea048a52931344db8944d0bc8a05eb category: main optional: false - name: nbconvert-pandoc @@ -16445,19 +16976,19 @@ package: category: main optional: false - name: nbformat - version: 5.10.3 + version: 5.10.4 manager: conda platform: osx-64 dependencies: - jupyter_core: '' - python-fastjsonschema: '' python: '>=3.8' + jupyter_core: '>=4.12,!=5.0.*' traitlets: '>=5.1' jsonschema: '>=2.6' - url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + python-fastjsonschema: '>=2.15' + url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda hash: - md5: ca3d437c0ef2e87f63d085822c74c49a - sha256: 774ba7f0f175851723d9e1524ca5246b431eca1b1e22387b58a80ad0dcd7acd8 + md5: 0b57b5368ab7fc7cdc9e3511fa867214 + sha256: 36fe73da4d37bc7ac2d1540526ecd294fbd09acda04e096181ab8f1ccd2b464c category: main optional: false - name: nbformat @@ -16476,20 +17007,6 @@ package: sha256: 36fe73da4d37bc7ac2d1540526ecd294fbd09acda04e096181ab8f1ccd2b464c category: main optional: false -- name: nccl - version: 2.21.5.1 - manager: conda - platform: linux-64 - dependencies: - cuda-version: '>=11.8,<12.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.21.5.1-h6103f9b_0.conda - hash: - md5: 05381b62b2faed9609fb68b27cd575aa - sha256: 64d0992b9e442f6e92c0fed7584c68bf48d43c741bb589d4afee450d41f805ca - category: main - optional: false - name: ncurses version: 6.4.20240210 manager: conda @@ -16664,7 +17181,7 @@ package: category: main optional: false - name: notebook - version: 7.1.2 + version: 7.1.3 manager: conda platform: osx-64 dependencies: @@ -16674,10 +17191,10 @@ package: jupyterlab_server: '>=2.22.1,<3' notebook-shim: '>=0.2,<0.3' jupyterlab: '>=4.1.1,<4.2' - url: https://conda.anaconda.org/conda-forge/noarch/notebook-7.1.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/notebook-7.1.3-pyhd8ed1ab_0.conda hash: - md5: fa781da51f05c9211b75b5e7bcff8136 - sha256: ed5987efcf3a394c4ab12288b4fe7d858784aabc591cebf3dabcd1cdbc7b7347 + md5: a4b1e12d54210fa80f3eb3fc270f2480 + sha256: 8ae08577df126ee1d583dcde59708928cca04ae405b1f38610a4bd44287f0e8e category: main optional: false - name: notebook @@ -17023,7 +17540,7 @@ package: category: main optional: false - name: openai - version: 1.23.1 + version: 1.23.2 manager: conda platform: linux-64 dependencies: @@ -17035,14 +17552,14 @@ package: sniffio: '' tqdm: '>4' typing-extensions: '>=4.7,<5' - url: https://conda.anaconda.org/conda-forge/noarch/openai-1.23.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/openai-1.23.2-pyhd8ed1ab_0.conda hash: - md5: 5d305543d3104015029feb7d0b342a8e - sha256: 26bd531f03a305b1336edb0f1071d1527ad9e7ab0c08b26869cd196fc795aa9c + md5: d476feebbb13de4fdc146121c29e0c28 + sha256: 9f942094056ed8d4d3f87d57e4ed51749012dba03de9c314ef775979b596b9b4 category: main optional: false - name: openai - version: 1.14.3 + version: 1.23.2 manager: conda platform: osx-64 dependencies: @@ -17054,14 +17571,14 @@ package: tqdm: '>4' anyio: '>=3.5.0,<5' typing-extensions: '>=4.7,<5' - url: https://conda.anaconda.org/conda-forge/noarch/openai-1.14.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/openai-1.23.2-pyhd8ed1ab_0.conda hash: - md5: 0c216c2228d136632cc7e19097f7aaac - sha256: 5d919b945556b42ad2d86e0a585ed95353baf1571ab5c95e97f86fe1fa80e138 + md5: d476feebbb13de4fdc146121c29e0c28 + sha256: 9f942094056ed8d4d3f87d57e4ed51749012dba03de9c314ef775979b596b9b4 category: main optional: false - name: openai - version: 1.23.1 + version: 1.23.2 manager: conda platform: osx-arm64 dependencies: @@ -17073,10 +17590,10 @@ package: tqdm: '>4' anyio: '>=3.5.0,<5' typing-extensions: '>=4.7,<5' - url: https://conda.anaconda.org/conda-forge/noarch/openai-1.23.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/openai-1.23.2-pyhd8ed1ab_0.conda hash: - md5: 5d305543d3104015029feb7d0b342a8e - sha256: 26bd531f03a305b1336edb0f1071d1527ad9e7ab0c08b26869cd196fc795aa9c + md5: d476feebbb13de4fdc146121c29e0c28 + sha256: 9f942094056ed8d4d3f87d57e4ed51749012dba03de9c314ef775979b596b9b4 category: main optional: false - name: openjpeg @@ -17229,7 +17746,7 @@ package: libprotobuf: '>=4.24.4,<4.24.5.0a0' libzlib: '>=1.2.13,<1.3.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - snappy: '>=1.1.10,<2.0a0' + snappy: '>=1.1.10,<1.2.0a0' zstd: '>=1.5.5,<1.6.0a0' url: https://conda.anaconda.org/conda-forge/osx-64/orc-1.9.2-h9ab30d4_0.conda hash: @@ -17307,15 +17824,15 @@ package: category: main optional: false - name: packaging - version: '23.2' + version: '24.0' manager: conda platform: osx-64 dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda hash: - md5: 79002079284aa895f883c6b7f3f88fd6 - sha256: 69b3ace6cca2dab9047b2c24926077d81d236bef45329d264b394001e3c3e52f + md5: 248f521b64ce055e7feae3105e7abeb8 + sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a category: main optional: false - name: packaging @@ -17350,7 +17867,7 @@ package: category: main optional: false - name: pandas - version: 2.2.1 + version: 2.2.2 manager: conda platform: osx-64 dependencies: @@ -17361,10 +17878,10 @@ package: python-tzdata: '>=2022a' python_abi: 3.9.* pytz: '>=2020.1' - url: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.1-py39haf03413_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.2-py39haf03413_0.conda hash: - md5: d29dc35b665029951dae988810f84508 - sha256: f6651dbf55da899a4e2590c910bee764b6f3ead78eb5e35e104ccaeb884f9fc7 + md5: 11225cf1f769af217ffc01f0a21d40fa + sha256: 3bd1746a24132f641b8a72a849c5f4629decb405ba28045645646ca5f3c8afe3 category: main optional: false - name: pandas @@ -17493,14 +18010,14 @@ package: category: main optional: false - name: pandoc - version: 3.1.12.3 + version: 3.1.13 manager: conda platform: osx-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.1.12.3-h694c41f_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.1.13-h694c41f_0.conda hash: - md5: dbd54d0b1e33c2c2713ca41fb32c51f6 - sha256: a1b36cfe362fd70ebb2ce7afa0ba6e5ccadfbb6a805bc0132f1642f151af080e + md5: 569f0ad9ff2d8654e5630d5a3232e6f1 + sha256: 8bc1b6557519c10bab1c90a6394fb4ad5f00ae1bffa7eafc982c481be348a46e category: main optional: false - name: pandoc @@ -17637,18 +18154,17 @@ package: requests: '' pyyaml: '' click: '' - black: '' entrypoints: '' - tenacity: '' - ansiwrap: '' python: '>=3.7' nbformat: '>=5.1.2' tqdm: '>=4.32.2' nbclient: '>=0.2.0' - url: https://conda.anaconda.org/conda-forge/noarch/papermill-2.5.0-pyhd8ed1ab_0.conda + aiohttp: '>=3.9,<3.10' + tenacity: '>=5.0.2' + url: https://conda.anaconda.org/conda-forge/noarch/papermill-2.5.0-pyhd8ed1ab_1.conda hash: - md5: e6e69b90afd3d0597da8f1f74cc4bd58 - sha256: c9896ec2358bf9da079ce34b986d8843ecf75f840d2d719f430b665cfa674a59 + md5: effa5bb75d544b8b7c165c7868f9612b + sha256: 67b06907b6c3e79e0a766fae1f02f3706927806a731a56ff9a74da8c22b0489f category: main optional: false - name: papermill @@ -17730,15 +18246,15 @@ package: category: main optional: false - name: parso - version: 0.8.3 + version: 0.8.4 manager: conda platform: osx-64 dependencies: python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda hash: - md5: 17a565a0c3899244e938cdf417e7b094 - sha256: 4e26d5daf5de0e31aa5e74ac56386a361b202433b83f024fdadbf07d4a244da4 + md5: 81534b420deb77da8833f2289b8d47ac + sha256: bfe404eebb930cc41782d34f8fc04c0388ea692eeebe2c5fc28df8ec8d4d61ae category: main optional: false - name: parso @@ -17795,18 +18311,6 @@ package: sha256: b248238da2bb9dfe98e680af911dc7013af86095e3ec8baf08905555632d34c7 category: main optional: false -- name: pathspec - version: 0.12.1 - manager: conda - platform: osx-64 - dependencies: - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - hash: - md5: 17064acba08d3686f1135b5ec1b32b12 - sha256: 4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d - category: main - optional: false - name: pcre version: '8.45' manager: conda @@ -17928,11 +18432,12 @@ package: manager: conda platform: linux-64 dependencies: - python: '>=3' - url: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/linux-64/pickleshare-0.7.5-py39hde42818_1002.tar.bz2 hash: - md5: 415f0ebb6198cc2801c73438a9fb5761 - sha256: a1ed1a094dd0d1b94a09ed85c283a0eb28943f2e6f22161fb45e128d35229738 + md5: 2dc9995512c80256532250a6fd616b14 + sha256: f3864a023507cda727997bcdf17baf404c98342a4dea6eb834b5e1fc9bdc388b category: main optional: false - name: pickleshare @@ -17984,7 +18489,7 @@ package: category: main optional: false - name: pillow - version: 10.2.0 + version: 10.3.0 manager: conda platform: osx-64 dependencies: @@ -17999,10 +18504,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* tk: '>=8.6.13,<8.7.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.2.0-py39hdd30358_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py39h9dabb2a_0.conda hash: - md5: 38aef4e0b3355d32485cd4a199296a5b - sha256: 70d5e8c36b1ac538d212816474594cf87aaa0c2e8f98308e952357df1b6b1c4f + md5: e385068c9511542eff20422f7e799064 + sha256: b2478cf4fc318a1be5b3287bf426b34d0b2cc2b0cb7a435e6ad7f9637c8e5f53 category: main optional: false - name: pillow @@ -18155,16 +18660,15 @@ package: category: main optional: false - name: platformdirs - version: 3.11.0 + version: 4.2.0 manager: conda platform: osx-64 dependencies: - python: '>=3.7' - typing-extensions: '>=4.6.3' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda hash: - md5: 8f567c0a74aa44cf732f15773b4083b0 - sha256: b3d809ff5a18ee8514bba8bc05a23b4cdf1758090a18a2cf742af38aed405144 + md5: a0bc3eec34b0fab84be6b2da94e98e20 + sha256: 2ebfb971236ab825dd79dd6086ea742a9901008ffb9c6222c1f2b5172a8039d3 category: main optional: false - name: platformdirs @@ -18194,17 +18698,17 @@ package: category: main optional: false - name: plotly - version: 5.19.0 + version: 5.21.0 manager: conda platform: osx-64 dependencies: packaging: '' python: '>=3.6' tenacity: '>=6.2.0' - url: https://conda.anaconda.org/conda-forge/noarch/plotly-5.19.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/plotly-5.21.0-pyhd8ed1ab_0.conda hash: - md5: 669cd7065794633b9e64e6a9612ec700 - sha256: fa9ae81e1f304f1480378ea25d559748e061c5b8d55b3ade433c3bc483dbae9e + md5: c8f5835e6c3a850d9a000d23056d780b + sha256: 69d9b5b30b93c02cfd9cb93351cd1c377fa04dfbf82386a7231bb2525ef367f1 category: main optional: false - name: plotly @@ -18221,16 +18725,28 @@ package: sha256: 69d9b5b30b93c02cfd9cb93351cd1c377fa04dfbf82386a7231bb2525ef367f1 category: main optional: false +- name: ply + version: '3.11' + manager: conda + platform: linux-64 + dependencies: + python: '>=2.6' + url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda + hash: + md5: 18c6deb6f9602e32446398203c8f0e91 + sha256: d8faaf4dcc13caed560fa32956523b35928a70499a2d08c51320947d637e3a41 + category: main + optional: false - name: ply version: '3.11' manager: conda platform: osx-64 dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 + python: '>=2.6' + url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda hash: - md5: 7205635cd71531943440fbfe3b6b5727 - sha256: 2cd6fae8f9cbc806b7f828f006ae4a83c23fac917cacfd73c37ce322d4324e53 + md5: 18c6deb6f9602e32446398203c8f0e91 + sha256: d8faaf4dcc13caed560fa32956523b35928a70499a2d08c51320947d637e3a41 category: main optional: false - name: polars @@ -18243,14 +18759,14 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* typing_extensions: '>=4.0.0' - url: https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.21-py39h87fa3cb_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.21-py39h87fa3cb_1.conda hash: - md5: a9428fa5e1bf8d9816756db1287c4e73 - sha256: a822e9259339427b0b5aa1b6b925831f009aa45005073d65455c133709a842e8 + md5: 67b1ece36573ad3e1c195bcd580277ba + sha256: 156fd37aa3ed6f71d9e4be2cd2652248ea8fe1efe42da85ef425bc0892e8d99f category: main optional: false - name: polars - version: 0.20.17 + version: 0.20.21 manager: conda platform: osx-64 dependencies: @@ -18258,10 +18774,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* typing_extensions: '>=4.0.0' - url: https://conda.anaconda.org/conda-forge/osx-64/polars-0.20.17-py39hcc1e243_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/polars-0.20.21-py39hcc1e243_1.conda hash: - md5: 2cadbd83308ee0e78b62e4707b880309 - sha256: 3a2f9581d7ba400c003cf6b73cd3f14c2b37f8f09c2a30d413129127145a204f + md5: efb6c71572a1b2122e4730a3b1b8d0e7 + sha256: ced3c566f2430a6b83587ee7c41f56018e6876ae7b4f28758a601da3b9b30ff1 category: main optional: false - name: polars @@ -18273,10 +18789,10 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* typing_extensions: '>=4.0.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/polars-0.20.21-py39h08ca3d8_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/polars-0.20.21-py39h08ca3d8_1.conda hash: - md5: 434ff585b23586578d1cb756895c384f - sha256: 909ab551e5764accdd03d64e1b16627e0754e3a37d27692f77e0a2e6c1652160 + md5: 13dcdf0598623bc57934315d895919ed + sha256: 7d355e182c0d48be60f92cbd9d5a7b24c548b716a3c890112b08fefb2a8d854b category: main optional: false - name: poppler @@ -19119,6 +19635,22 @@ package: sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a category: main optional: false +- name: pulseaudio-client + version: '16.1' + manager: conda + platform: linux-64 + dependencies: + dbus: '>=1.13.6,<2.0a0' + libgcc-ng: '>=12' + libglib: '>=2.76.4,<3.0a0' + libsndfile: '>=1.2.2,<1.3.0a0' + libsystemd0: '>=254' + url: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda + hash: + md5: ac902ff3c1c6d750dd0dfc93a974ab74 + sha256: 9981c70893d95c8cac02e7edd1a9af87f2c8745b772d529f08b7f9dafbe98606 + category: main + optional: false - name: pure_eval version: 0.2.2 manager: conda @@ -19216,19 +19748,26 @@ package: category: main optional: false - name: pyarrow - version: 13.0.0 + version: 15.0.0 manager: conda platform: osx-64 dependencies: - libarrow: 13.0.0 + libarrow: 15.0.0 + libarrow-acero: 15.0.0 + libarrow-dataset: 15.0.0 + libarrow-flight: 15.0.0 + libarrow-flight-sql: 15.0.0 + libarrow-gandiva: 15.0.0 + libarrow-substrait: 15.0.0 libcxx: '>=14' + libparquet: 15.0.0 numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-13.0.0-py39h8632116_23_cpu.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-15.0.0-py39h8632116_0_cpu.conda hash: - md5: b49feea876499e9169549f9e522029b8 - sha256: 1f9918533e6190210048b935709727c0f1a673b5db5c7c685e813873218ed39d + md5: 2d1710d0620eb889a157aa780c80c672 + sha256: 86aaf03998cc89fb903ec41634d8b25d878503b3c491730c984e54de295e5249 category: main optional: false - name: pyarrow @@ -19306,15 +19845,15 @@ package: category: main optional: false - name: pyasn1 - version: 0.5.1 + version: 0.6.0 manager: conda platform: osx-64 dependencies: python: '!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,!=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.5.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.0-pyhd8ed1ab_0.conda hash: - md5: fb1a800972b072aa4d16450983c81418 - sha256: 8b116da9acbb471e107203c11acaffcb259aca2367aa7e83e796e43ed5d381b3 + md5: d528d00a110a974e75aa6db6a4f04dc7 + sha256: 9b54bf52c76bb7365ceb36315258011b8c603fe00f568d4bbff8bc77c7ffcfdb category: main optional: false - name: pyasn1 @@ -19343,16 +19882,16 @@ package: category: main optional: false - name: pyasn1-modules - version: 0.3.0 + version: 0.4.0 manager: conda platform: osx-64 dependencies: - python: '>=3.6' - pyasn1: '>=0.4.6,<0.6.0' - url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.3.0-pyhd8ed1ab_0.conda + python: '>=3.8' + pyasn1: '>=0.4.6,<0.7.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.0-pyhd8ed1ab_0.conda hash: - md5: 26db749166cdca55e5ef1ffdc7767d0e - sha256: 7867ba43b6ef1e66054ca6b70f59bbef4cdb0cc761f0be3b66d79d15bd43143b + md5: 8e40d7b2b3bdf9f3cab88d93d7dfaf3b + sha256: dcd5b96adf56cf9b26045bc845f8ca50ede4c4c5f8654cfa58ece2ba29cf9a67 category: main optional: false - name: pyasn1-modules @@ -19463,17 +20002,18 @@ package: category: main optional: false - name: pydantic - version: 1.10.14 + version: 2.7.0 manager: conda platform: osx-64 dependencies: - python: '>=3.9,<3.10.0a0' - python_abi: 3.9.* - typing-extensions: '>=4.2.0' - url: https://conda.anaconda.org/conda-forge/osx-64/pydantic-1.10.14-py39ha09f3b3_0.conda + python: '>=3.7' + annotated-types: '>=0.4.0' + typing-extensions: '>=4.6.1' + pydantic-core: 2.18.1 + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.0-pyhd8ed1ab_0.conda hash: - md5: ee0eda42563d26e60a20d2907723afb1 - sha256: 0bcaa75d9dee087991f20f89f7b1b5a3553d8680748d02204eb93aa7754956ee + md5: 369c93f0209568e7c33892d8960fe583 + sha256: e7b58685010aaeb64524d430b7fd9e732d81644a7185810f567097fc16804e88 category: main optional: false - name: pydantic @@ -19506,6 +20046,20 @@ package: sha256: 1896bbf0ec12cf3787404bb63c33323e7fb78fd80cebff8d841d818d7085f9ed category: main optional: false +- name: pydantic-core + version: 2.18.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + typing-extensions: '>=4.6.0,!=4.7.0' + url: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.18.1-py39hcf47035_0.conda + hash: + md5: 39368fb1d273f8962624037293302b4f + sha256: a2b573c26ec1ff73e4d5df159989b90076f68e7f471398280bc92f24d4d629a5 + category: main + optional: false - name: pydantic-core version: 2.18.1 manager: conda @@ -19879,6 +20433,24 @@ package: sha256: d056de9eb7e7b568a003d5a24caa7a9c73e2cf34cbac0aecd253056157770ea3 category: main optional: false +- name: pyqt + version: 5.15.9 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + pyqt5-sip: 12.12.2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + qt-main: '>=5.15.8,<5.16.0a0' + sip: '>=6.7.11,<6.8.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda + hash: + md5: e1f148e57d071b09187719df86f513c1 + sha256: a0d0662c73b343931dbd66d9c25ec74f40115512568a87bf4d01af8d1a8ddf1c + category: main + optional: false - name: pyqt version: 5.15.9 manager: conda @@ -19896,6 +20468,24 @@ package: sha256: 58e3f096357bc899fa446bc9ff28cf04feaa3cb7b394b2fcf7e4facce442ff72 category: main optional: false +- name: pyqt5-sip + version: 12.12.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + packaging: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + sip: '' + toml: '' + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda + hash: + md5: 93aff412f3e49fdb43361c0215cbd72d + sha256: 86efec5e57111794e039bb14dfce23d9df6ed8df139ab1404086140eba6d4d7c + category: main + optional: false - name: pyqt5-sip version: 12.12.2 manager: conda @@ -19918,12 +20508,12 @@ package: manager: conda platform: linux-64 dependencies: - __unix: '' - python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py39hf3d152e_5.tar.bz2 hash: - md5: 2a7de29fb590ca14b5243c4c812c8025 - sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + md5: d34b97a2386932b97c7cb80916a673e7 + sha256: 42d46baeab725d3c70d22a4258549e9f0f1a72b740166cd9c3b394c4369cb306 category: main optional: false - name: pysocks @@ -19944,12 +20534,12 @@ package: manager: conda platform: osx-arm64 dependencies: - __unix: '' - python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + url: https://conda.anaconda.org/conda-forge/osx-arm64/pysocks-1.7.1-py39h2804cbe_5.tar.bz2 hash: - md5: 2a7de29fb590ca14b5243c4c812c8025 - sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + md5: 831038e9e2af74015b03d82209ac5f87 + sha256: 33258403558102b27ccc918338eb90906028f8f3f2b2af549b3232335dc355e1 category: main optional: false - name: pyspark @@ -20512,25 +21102,18 @@ package: manager: conda platform: linux-64 dependencies: - __cuda: '' __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' - cudatoolkit: '>=11.8,<12' - cudnn: '>=8.8.0.121,<9.0a0' filelock: '' fsspec: '' jinja2: '' libcblas: '>=3.9.0,<4.0a0' libgcc-ng: '>=12' - libmagma: '>=2.7.2,<2.7.3.0a0' - libmagma_sparse: '>=2.7.2,<2.7.3.0a0' libprotobuf: '>=4.24.4,<4.24.5.0a0' libstdcxx-ng: '>=12' libtorch: 2.1.2.* libuv: '>=1.46.0,<2.0a0' - magma: '>=2.7.2,<2.7.3.0a0' mkl: '>=2023.2.0,<2024.0a0' - nccl: '>=2.19.4.1,<3.0a0' networkx: '' numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' @@ -20538,10 +21121,10 @@ package: sleef: '>=3.5.1,<4.0a0' sympy: '' typing_extensions: '' - url: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.1.2-cuda118_py39hcb596ef_300.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.1.2-cpu_mkl_py39h9c325db_100.conda hash: - md5: d7355cce6a80513f7e9980e5e2e836be - sha256: 4f84efcd67159d4117b9519da2542da4f71c21e2abe2dae3368a54e365df6d98 + md5: bb34e51d3542a1b4b6afc04f28585055 + sha256: c363db53861a5ffe1613e57a8c3624f447fa203dde66f52b29ddb9859fb2e8bc category: main optional: false - name: pytorch @@ -20614,15 +21197,15 @@ package: category: main optional: false - name: pytz - version: '2023.4' + version: '2024.1' manager: conda platform: osx-64 dependencies: python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/pytz-2023.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda hash: - md5: 89445e229eb2d6605be88e0908afc912 - sha256: c988e6b9032ac2f917540a1d5a2268f45c01892c392fd7eee9d5c60270337835 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 category: main optional: false - name: pytz @@ -20759,7 +21342,7 @@ package: category: main optional: false - name: pyzmq - version: 26.0.0 + version: 26.0.2 manager: conda platform: linux-64 dependencies: @@ -20769,43 +21352,98 @@ package: python: '>=3.9,<3.10.0a0' python_abi: 3.9.* zeromq: '>=4.3.5,<4.4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.0-py39h8c080ef_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.2-py39ha1047a2_0.conda hash: - md5: ff428448ae918fe8a1d4636995444fb0 - sha256: e1f156d2ebcca7897711f0c4acad66113dc0317a1baa94bc3fa5d43d7562f4ba + md5: 916ab2d35fbe7a2ad3ba03f96c78922d + sha256: 0c373177f8458164c4c50eb663d2030ad488fa6a351073d375d267f6b7de9d00 category: main optional: false - name: pyzmq - version: 25.1.2 + version: 26.0.2 manager: conda platform: osx-64 dependencies: __osx: '>=10.9' - libcxx: '>=16.0.6' + libcxx: '>=16' libsodium: '>=1.0.18,<1.0.19.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* zeromq: '>=4.3.5,<4.4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-25.1.2-py39hcb7a90d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-26.0.2-py39hffc4518_0.conda hash: - md5: 39754a321b3dece3df9a0eb213d43dc8 - sha256: 9e491ef2066050c2c34a49aeddf2be773cee59bcdde037f6ef6b114690f21f69 + md5: 13c761db6b475447b63702e5f7ee3015 + sha256: f6eaef30ccf870a0473668f9675e20aaa715fb64678c2de547d4dee61e53f7b6 category: main optional: false - name: pyzmq - version: 26.0.0 + version: 26.0.2 manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' libcxx: '>=16' libsodium: '>=1.0.18,<1.0.19.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* zeromq: '>=4.3.5,<4.4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.0.0-py39he0a3c8b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.0.2-py39hf4e74ac_0.conda + hash: + md5: 69656eb3e90b47b1d57d247da4f69af5 + sha256: ef120767bad994d573563e91f291ea7f49731a01441dedb3ad2b684ab7ef5bd9 + category: main + optional: false +- name: qt-main + version: 5.15.8 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + alsa-lib: '>=1.2.10,<1.3.0.0a0' + dbus: '>=1.13.6,<2.0a0' + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freetype: '>=2.12.1,<3.0a0' + gst-plugins-base: '>=1.22.9,<1.23.0a0' + gstreamer: '>=1.22.9,<1.23.0a0' + harfbuzz: '>=8.3.0,<9.0a0' + icu: '>=73.2,<74.0a0' + krb5: '>=1.21.2,<1.22.0a0' + libclang: '>=15.0.7,<16.0a0' + libclang13: '>=15.0.7' + libcups: '>=2.3.3,<2.4.0a0' + libevent: '>=2.1.12,<2.1.13.0a0' + libexpat: '>=2.5.0,<3.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.3,<3.0a0' + libjpeg-turbo: '>=3.0.0,<4.0a0' + libpng: '>=1.6.42,<1.7.0a0' + libpq: '>=16.2,<17.0a0' + libsqlite: '>=3.45.1,<4.0a0' + libstdcxx-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + libxkbcommon: '>=1.6.0,<2.0a0' + libxml2: '>=2.12.5,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + mysql-libs: '>=8.0.33,<8.1.0a0' + nspr: '>=4.35,<5.0a0' + nss: '>=3.97,<4.0a0' + openssl: '>=3.2.1,<4.0a0' + pulseaudio-client: '>=16.1,<16.2.0a0' + xcb-util: '>=0.4.0,<0.5.0a0' + xcb-util-image: '>=0.4.0,<0.5.0a0' + xcb-util-keysyms: '>=0.4.0,<0.5.0a0' + xcb-util-renderutil: '>=0.3.9,<0.4.0a0' + xcb-util-wm: '>=0.4.1,<0.5.0a0' + xorg-libice: '>=1.1.1,<2.0a0' + xorg-libsm: '>=1.2.4,<2.0a0' + xorg-libx11: '>=1.8.7,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-xf86vidmodeproto: '' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5810be5_19.conda hash: - md5: 9aefb8ff2c3871b14b5ce1dd2c95491a - sha256: 9c5e1fbafda650d01ff5f202317b4754885e02b7c9ed9183d1d33202b2209f28 + md5: 54866f708d43002a514d0b9b0f84bc11 + sha256: 41228ec12346d640ef1f549885d8438e98b1be0fdeb68cd1dd3938f255cbd719 category: main optional: false - name: qt-main @@ -20836,6 +21474,20 @@ package: sha256: f1ab73268198fe66c0b438b58b34bc56b987d0c411c4d60882c9474186a7d7f0 category: main optional: false +- name: qtconsole + version: 5.5.1 + manager: conda + platform: linux-64 + dependencies: + pyqt: '' + python: '>=3.7' + qtconsole-base: '>=5.5.1,<5.5.2.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/qtconsole-5.5.1-pyhd8ed1ab_0.conda + hash: + md5: eb44d4dc1e8c84287c4fb28518ffedd0 + sha256: c102ef2919dc780086ee59cb1dd9823603bf6e6d394eace6ae53c84c97661e9d + category: main + optional: false - name: qtconsole version: 5.5.1 manager: conda @@ -20888,25 +21540,6 @@ package: sha256: e81a294941a598aabfd9462cf9aaa3b3e2c04996420f82494bdc13233de8ca70 category: main optional: false -- name: qtconsole-base - version: 5.5.1 - manager: conda - platform: osx-arm64 - dependencies: - packaging: '' - pygments: '' - traitlets: '' - jupyter_core: '' - python: '>=3.8' - ipykernel: '>=4.1' - jupyter_client: '>=4.1' - qtpy: '>=2.4.0' - url: https://conda.anaconda.org/conda-forge/noarch/qtconsole-base-5.5.1-pyha770c72_0.conda - hash: - md5: 5528a3eda283b421055c89bface19a1c - sha256: e81a294941a598aabfd9462cf9aaa3b3e2c04996420f82494bdc13233de8ca70 - category: main - optional: false - name: qtpy version: 2.4.1 manager: conda @@ -20933,19 +21566,6 @@ package: sha256: 925bf48e747af6ceff1b073c10b12fc94ef79c88a34729059d253e43466a33f1 category: main optional: false -- name: qtpy - version: 2.4.1 - manager: conda - platform: osx-arm64 - dependencies: - packaging: '' - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/qtpy-2.4.1-pyhd8ed1ab_0.conda - hash: - md5: 7f391bd70d2abfb70f304ba5aa4e1261 - sha256: 925bf48e747af6ceff1b073c10b12fc94ef79c88a34729059d253e43466a33f1 - category: main - optional: false - name: querystring_parser version: 1.2.4 manager: conda @@ -21701,22 +22321,22 @@ package: category: main optional: false - name: scikit-learn - version: 1.4.1.post1 + version: 1.4.2 manager: conda platform: osx-64 dependencies: joblib: '>=1.2.0' libcxx: '>=16' - llvm-openmp: '>=17.0.6' + llvm-openmp: '>=18.1.3' numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* scipy: '' threadpoolctl: '>=2.0.0' - url: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.1.post1-py39hf36d3f6_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py39hf36d3f6_0.conda hash: - md5: 6840465b23096b25f4f2340441599b54 - sha256: 622c1d231e1d41a89021f6e2ebbcd3fdc2dc5198331ee4b05b21ff2bb504b45f + md5: ee66e61bb796d0ebee8fc2a0638fdc3f + sha256: 128d740dc13b2beb8764bb06f9c9987c0f9e568f9b8023e3f6991f538a698a49 category: main optional: false - name: scikit-learn @@ -21760,23 +22380,23 @@ package: category: main optional: false - name: scipy - version: 1.12.0 + version: 1.13.0 manager: conda platform: osx-64 dependencies: libblas: '>=3.9.0,<4.0a0' libcblas: '>=3.9.0,<4.0a0' - libcxx: '>=15' + libcxx: '>=16' libgfortran: 5.* libgfortran5: '>=13.2.0' liblapack: '>=3.9.0,<4.0a0' numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.12.0-py39h0ed1e0f_2.conda + url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py39h0ed1e0f_0.conda hash: - md5: dcc2e3dd279432335b58f986d91dd9fd - sha256: 3a721490dff7c37d6e516ab3991761afa5586e3722f97a793dba538ee9cfa310 + md5: 3a4d0af4fe2006bedc33ca61e9a0b4d6 + sha256: 3dea9d2501faed932014f79d546467e905840dd60163fb54e1a4786fca3e5e82 category: main optional: false - name: scipy @@ -21829,17 +22449,17 @@ package: category: main optional: false - name: send2trash - version: 1.8.2 + version: 1.8.3 manager: conda platform: osx-64 dependencies: __osx: '' pyobjc-framework-cocoa: '' - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyhd1c38e8_0.conda + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_0.conda hash: - md5: 2657c3de5371c571aef6678afb4aaadd - sha256: dca4022bae47618ed738ab7d45ead5202d174b741cfb98e4484acdc6e76da32a + md5: c3cb67fc72fb38020fe7923dbbcf69b0 + sha256: f911307db932c92510da6c3c15b461aef935720776643a1fbf3683f61001068b category: main optional: false - name: send2trash @@ -21869,15 +22489,15 @@ package: category: main optional: false - name: setuptools - version: 69.2.0 + version: 69.5.1 manager: conda platform: osx-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda hash: - md5: da214ecd521a720a9d521c68047682dc - sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 + md5: 7462280d81f639363e6e63c81276bd9e + sha256: 72d143408507043628b32bed089730b6d5f5445eccc44b59911ec9f262e365e7 category: main optional: false - name: setuptools @@ -21909,7 +22529,7 @@ package: category: main optional: false - name: shapely - version: 2.0.3 + version: 2.0.4 manager: conda platform: osx-64 dependencies: @@ -21917,10 +22537,10 @@ package: numpy: '>=1.22.4,<2.0a0' python: '>=3.9,<3.10.0a0' python_abi: 3.9.* - url: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.3-py39h19e25c1_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.4-py39h19e25c1_0.conda hash: - md5: 139065ace3542c37f2f6c2def6a7248f - sha256: ef82124eacdccc7109306fab623a130689e0e2efa65b5930aafe9de67ecdbfe3 + md5: ed6d23f6ef9f6e26390896b356fb5c86 + sha256: b06b6dd583e5f29d9b18037364de01c11c01e95ddb327fc3be398c97949457df category: main optional: false - name: shapely @@ -21938,6 +22558,24 @@ package: sha256: 80afeeec485a95461333cc92d2d01b1eae229ff672a8a96b1ae6b6c401a44692 category: main optional: false +- name: sip + version: 6.7.12 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + packaging: '' + ply: '' + python: '>=3.9,<3.10.0a0' + python_abi: 3.9.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda + hash: + md5: e667a3ab0df62c54e60e1843d2e6defb + sha256: fd50c71dc05daf9d28663d448d17f150b3eb79ae629198c73e2186b5b1e990dc + category: main + optional: false - name: sip version: 6.7.12 manager: conda @@ -22056,10 +22694,10 @@ package: dependencies: _openmp_mutex: '>=4.5' libgcc-ng: '>=9.4.0' - url: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.5.1-h9b69904_2.tar.bz2 + url: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.5.1-h28343ad_2.tar.bz2 hash: - md5: 6e016cf4c525d04a7bd038cee53ad3fd - sha256: 77d644a16f682e6d01df63fe9d25315011393498b63cf08c0e548780e46b2170 + md5: a41b5f5f2ee067f55d9774815d3d42db + sha256: 17457848ad97e9e8c2ff5f56316b68284e16ed854c46460c0ba7374e880dba1f category: main optional: false - name: sleef @@ -22080,10 +22718,10 @@ package: platform: osx-arm64 dependencies: llvm-openmp: '>=12.0.1' - url: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.5.1-h156473d_2.tar.bz2 + url: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.5.1-he9cb808_2.tar.bz2 hash: - md5: bd159e7f04dbf79b06ed2bd37e112458 - sha256: a3d20bed697aaababfcb53ca2011486cf5e44e20855142c170fa0826df5f952c + md5: bb73bb3beec3fef3870d8cd328a39bd8 + sha256: b01163e1e97f3eada667d45196f9695e9fa1fa82cd89c35d52fc025e0af2777c category: main optional: false - name: smmap @@ -22140,11 +22778,11 @@ package: manager: conda platform: osx-64 dependencies: - libcxx: '>=14.0.6' - url: https://conda.anaconda.org/conda-forge/osx-64/snappy-1.1.10-h225ccf5_0.conda + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-64/snappy-1.1.10-h6dc393e_1.conda hash: - md5: 4320a8781f14cd959689b86e349f3b73 - sha256: 575915dc13152e446a84e2f88de70a14f8b6af1a870e708f9370bd4be105583b + md5: 61ef3240d413e733ba4e547657d8a9db + sha256: 902133a046a264c7179278d09270e47a420961358c409dd1938a20b6436b82cf category: main optional: false - name: snappy @@ -22265,7 +22903,7 @@ package: category: main optional: false - name: snowflake-connector-python - version: 3.7.1 + version: 3.8.1 manager: conda platform: osx-64 dependencies: @@ -22279,7 +22917,7 @@ package: libcxx: '>=16' numpy: '>=1.22.4,<2.0a0' packaging: '' - platformdirs: '>=2.6.0,<4.0.0' + platformdirs: '>=2.6.0,<5.0.0' pyjwt: <3.0.0 pyopenssl: '>=16.2.0,<25.0.0' python: '>=3.9,<3.10.0a0' @@ -22290,10 +22928,10 @@ package: tomlkit: '' typing_extensions: '>=4.3,<5' urllib3: '>=1.21.1,<2' - url: https://conda.anaconda.org/conda-forge/osx-64/snowflake-connector-python-3.7.1-py39haf03413_2.conda + url: https://conda.anaconda.org/conda-forge/osx-64/snowflake-connector-python-3.8.1-py39haf03413_0.conda hash: - md5: 0aaa98c22a1a8c0b4744bcf6616bdfb4 - sha256: 3540360351e3b37671b7c30118c0d599390d73b8187d691fccba0ef6fd57825d + md5: 4b80bb0e478f7e5945a773e6d5ad0eca + sha256: b275ba8847ca2ff9a309dde2635fe35279bd5582c15b048793a8c8336c4a4d69 category: main optional: false - name: snowflake-connector-python @@ -22401,147 +23039,144 @@ package: category: main optional: false - name: sphinx - version: 4.5.0 + version: 7.3.7 manager: conda platform: linux-64 dependencies: - alabaster: '>=0.7,<0.8' - babel: '>=1.3' - colorama: '>=0.3.5' - docutils: '>=0.14,<0.18' - imagesize: '' - importlib-metadata: '>=4.4' - jinja2: '>=2.3' - packaging: '' - pygments: '>=2.0' - python: '>=3.6' - requests: '>=2.5.0' - snowballstemmer: '>=1.1' + alabaster: '>=0.7.14,<0.8.dev0' + babel: '>=2.9' + colorama: '>=0.4.5' + docutils: '>=0.18.1,<0.22' + imagesize: '>=1.3' + importlib-metadata: '>=4.8' + jinja2: '>=3.0' + packaging: '>=21.0' + pygments: '>=2.14' + python: '>=3.9' + requests: '>=2.25.0' + snowballstemmer: '>=2.0' sphinxcontrib-applehelp: '' sphinxcontrib-devhelp: '' sphinxcontrib-htmlhelp: '>=2.0.0' sphinxcontrib-jsmath: '' sphinxcontrib-qthelp: '' - sphinxcontrib-serializinghtml: '>=1.1.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2 + sphinxcontrib-serializinghtml: '>=1.1.9' + tomli: '>=2.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda hash: - md5: 46b38d88c4270ff9ba78a89c83c66345 - sha256: 2fe70d936cc969e20f07a7df64438587261f187d4f08e1c0f412cdd1d632730c + md5: 7b1465205e28d75d2c0e1a868ee00a67 + sha256: 41101e2b0b8722087f06bd73251ba95ef89db515982b6a89aeebfa98ebcb65a1 category: main optional: false - name: sphinx - version: 4.5.0 + version: 7.3.7 manager: conda platform: osx-64 dependencies: - packaging: '' sphinxcontrib-jsmath: '' sphinxcontrib-applehelp: '' sphinxcontrib-devhelp: '' sphinxcontrib-qthelp: '' - imagesize: '' - python: '>=3.6' - importlib-metadata: '>=4.4' - pygments: '>=2.0' - alabaster: '>=0.7,<0.8' - requests: '>=2.5.0' - jinja2: '>=2.3' - snowballstemmer: '>=1.1' - babel: '>=1.3' + python: '>=3.9' + jinja2: '>=3.0' + packaging: '>=21.0' + requests: '>=2.25.0' + colorama: '>=0.4.5' + pygments: '>=2.14' sphinxcontrib-htmlhelp: '>=2.0.0' - sphinxcontrib-serializinghtml: '>=1.1.5' - colorama: '>=0.3.5' - docutils: '>=0.14,<0.18' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2 + importlib-metadata: '>=4.8' + babel: '>=2.9' + imagesize: '>=1.3' + snowballstemmer: '>=2.0' + tomli: '>=2.0' + sphinxcontrib-serializinghtml: '>=1.1.9' + alabaster: '>=0.7.14,<0.8.dev0' + docutils: '>=0.18.1,<0.22' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda hash: - md5: 46b38d88c4270ff9ba78a89c83c66345 - sha256: 2fe70d936cc969e20f07a7df64438587261f187d4f08e1c0f412cdd1d632730c + md5: 7b1465205e28d75d2c0e1a868ee00a67 + sha256: 41101e2b0b8722087f06bd73251ba95ef89db515982b6a89aeebfa98ebcb65a1 category: main optional: false - name: sphinx - version: 4.5.0 + version: 7.3.7 manager: conda platform: osx-arm64 dependencies: - packaging: '' sphinxcontrib-jsmath: '' sphinxcontrib-applehelp: '' sphinxcontrib-devhelp: '' sphinxcontrib-qthelp: '' - imagesize: '' - python: '>=3.6' - importlib-metadata: '>=4.4' - pygments: '>=2.0' - alabaster: '>=0.7,<0.8' - requests: '>=2.5.0' - jinja2: '>=2.3' - snowballstemmer: '>=1.1' - babel: '>=1.3' + python: '>=3.9' + jinja2: '>=3.0' + packaging: '>=21.0' + requests: '>=2.25.0' + colorama: '>=0.4.5' + pygments: '>=2.14' sphinxcontrib-htmlhelp: '>=2.0.0' - sphinxcontrib-serializinghtml: '>=1.1.5' - colorama: '>=0.3.5' - docutils: '>=0.14,<0.18' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2 + importlib-metadata: '>=4.8' + babel: '>=2.9' + imagesize: '>=1.3' + snowballstemmer: '>=2.0' + tomli: '>=2.0' + sphinxcontrib-serializinghtml: '>=1.1.9' + alabaster: '>=0.7.14,<0.8.dev0' + docutils: '>=0.18.1,<0.22' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda hash: - md5: 46b38d88c4270ff9ba78a89c83c66345 - sha256: 2fe70d936cc969e20f07a7df64438587261f187d4f08e1c0f412cdd1d632730c + md5: 7b1465205e28d75d2c0e1a868ee00a67 + sha256: 41101e2b0b8722087f06bd73251ba95ef89db515982b6a89aeebfa98ebcb65a1 category: main optional: false - name: sphinx-autoapi - version: 2.1.0 + version: 3.0.0 manager: conda platform: linux-64 dependencies: + anyascii: '' astroid: '>=2.7' jinja2: '' - python: '>=3.6' + python: '>=3.8' pyyaml: '' - sphinx: '>=3.0' - sphinxcontrib-dotnetdomain: '' - sphinxcontrib-golangdomain: '' - unidecode: '' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-2.1.0-pyhd8ed1ab_0.conda + sphinx: '>=6.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-3.0.0-pyhd8ed1ab_0.conda hash: - md5: 6cb2b182390f837ce98737e92b9461f7 - sha256: 07f4a813627c3b4f4e1175366b58574d886f14ea94df855c3c69cb0676d004e4 + md5: 736b53813c2b9582b1345462d8ca66e7 + sha256: 61d127c9e32176ac75a24b85c4d1ba3e8cf7e638884331429752a2da6a3ac63a category: main optional: false - name: sphinx-autoapi - version: 2.1.0 + version: 3.0.0 manager: conda platform: osx-64 dependencies: pyyaml: '' jinja2: '' - unidecode: '' - sphinxcontrib-dotnetdomain: '' - sphinxcontrib-golangdomain: '' - python: '>=3.6' - sphinx: '>=3.0' + anyascii: '' + python: '>=3.8' astroid: '>=2.7' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-2.1.0-pyhd8ed1ab_0.conda + sphinx: '>=6.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-3.0.0-pyhd8ed1ab_0.conda hash: - md5: 6cb2b182390f837ce98737e92b9461f7 - sha256: 07f4a813627c3b4f4e1175366b58574d886f14ea94df855c3c69cb0676d004e4 + md5: 736b53813c2b9582b1345462d8ca66e7 + sha256: 61d127c9e32176ac75a24b85c4d1ba3e8cf7e638884331429752a2da6a3ac63a category: main optional: false - name: sphinx-autoapi - version: 2.1.0 + version: 3.0.0 manager: conda platform: osx-arm64 dependencies: pyyaml: '' jinja2: '' - unidecode: '' - sphinxcontrib-dotnetdomain: '' - sphinxcontrib-golangdomain: '' - python: '>=3.6' - sphinx: '>=3.0' + anyascii: '' + python: '>=3.8' astroid: '>=2.7' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-2.1.0-pyhd8ed1ab_0.conda + sphinx: '>=6.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-3.0.0-pyhd8ed1ab_0.conda hash: - md5: 6cb2b182390f837ce98737e92b9461f7 - sha256: 07f4a813627c3b4f4e1175366b58574d886f14ea94df855c3c69cb0676d004e4 + md5: 736b53813c2b9582b1345462d8ca66e7 + sha256: 61d127c9e32176ac75a24b85c4d1ba3e8cf7e638884331429752a2da6a3ac63a category: main optional: false - name: sphinx-basic-ng @@ -22664,46 +23299,43 @@ package: sha256: 7ea21f009792e7c69612ddba367afe0412b3fdff2e92f439e8cd222de4b40bfe category: main optional: false -- name: sphinx-inline-tabs - version: 2023.4.21 +- name: sphinx-design + version: 0.5.0 manager: conda platform: linux-64 dependencies: - beautifulsoup4: '' - python: '>=3.6' - sphinx: '>3' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-inline-tabs-2023.4.21-pyhd8ed1ab_0.conda + python: '>=3.8' + sphinx: '>=5,<8' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda hash: - md5: 4addb035e43d09440597352079305513 - sha256: 142f45bb224380f13f800ae3769f0d2aa3efcd9c49e5389b48863d03c08a801a + md5: 264b3c697fa9cdade87eb0abe4440d54 + sha256: 5333c50f3687da5b59dd8df24094d8c0e834922ceabc1f525e54735e06d0bd52 category: main optional: false -- name: sphinx-inline-tabs - version: 2023.4.21 +- name: sphinx-design + version: 0.5.0 manager: conda platform: osx-64 dependencies: - beautifulsoup4: '' - python: '>=3.6' - sphinx: '>3' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-inline-tabs-2023.4.21-pyhd8ed1ab_0.conda + python: '>=3.8' + sphinx: '>=5,<8' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda hash: - md5: 4addb035e43d09440597352079305513 - sha256: 142f45bb224380f13f800ae3769f0d2aa3efcd9c49e5389b48863d03c08a801a + md5: 264b3c697fa9cdade87eb0abe4440d54 + sha256: 5333c50f3687da5b59dd8df24094d8c0e834922ceabc1f525e54735e06d0bd52 category: main optional: false -- name: sphinx-inline-tabs - version: 2023.4.21 +- name: sphinx-design + version: 0.5.0 manager: conda platform: osx-arm64 dependencies: - beautifulsoup4: '' - python: '>=3.6' - sphinx: '>3' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-inline-tabs-2023.4.21-pyhd8ed1ab_0.conda + python: '>=3.8' + sphinx: '>=5,<8' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda hash: - md5: 4addb035e43d09440597352079305513 - sha256: 142f45bb224380f13f800ae3769f0d2aa3efcd9c49e5389b48863d03c08a801a + md5: 264b3c697fa9cdade87eb0abe4440d54 + sha256: 5333c50f3687da5b59dd8df24094d8c0e834922ceabc1f525e54735e06d0bd52 category: main optional: false - name: sphinx-issues @@ -22745,48 +23377,6 @@ package: sha256: 9d98392bff12194c45c6f13c6c93d0b15b2fe489de5746654e732009fce41a86 category: main optional: false -- name: sphinx-panels - version: 0.6.0 - manager: conda - platform: linux-64 - dependencies: - docutils: '' - python: '>=3.6' - sphinx: '>=2,<5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-panels-0.6.0-pyhd8ed1ab_0.tar.bz2 - hash: - md5: 6eec6480601f5d15babf9c3b3987f34a - sha256: c6043ff3f25905453f5c11d1620a4bc118a87a3eda02a3041f4ef98d8e6e6389 - category: main - optional: false -- name: sphinx-panels - version: 0.6.0 - manager: conda - platform: osx-64 - dependencies: - docutils: '' - python: '>=3.6' - sphinx: '>=2,<5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-panels-0.6.0-pyhd8ed1ab_0.tar.bz2 - hash: - md5: 6eec6480601f5d15babf9c3b3987f34a - sha256: c6043ff3f25905453f5c11d1620a4bc118a87a3eda02a3041f4ef98d8e6e6389 - category: main - optional: false -- name: sphinx-panels - version: 0.6.0 - manager: conda - platform: osx-arm64 - dependencies: - docutils: '' - python: '>=3.6' - sphinx: '>=2,<5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-panels-0.6.0-pyhd8ed1ab_0.tar.bz2 - hash: - md5: 6eec6480601f5d15babf9c3b3987f34a - sha256: c6043ff3f25905453f5c11d1620a4bc118a87a3eda02a3041f4ef98d8e6e6389 - category: main - optional: false - name: sphinx-prompt version: 1.4.0 manager: conda @@ -22834,14 +23424,14 @@ package: manager: conda platform: linux-64 dependencies: - docutils: '>=0.16.0' + docutils: '>=0.18.0' pygments: '' python: '>=3.6' - sphinx: '>=2,<5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_0.tar.bz2 + sphinx: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda hash: - md5: b04565a0bfac26170025770fe3256dcd - sha256: 79228ab583277a527456786f2060211bfed2647259b960566af1718d44dae2aa + md5: 8b8362d876396fd967cbb5f404def907 + sha256: 43c343edc9ea11ffd947d97fa60bf6347a404700e2cde81fb954e60b7e6a42c1 category: main optional: false - name: sphinx-tabs @@ -22851,12 +23441,12 @@ package: dependencies: pygments: '' python: '>=3.6' - sphinx: '>=2,<5' - docutils: '>=0.16.0' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_0.tar.bz2 + sphinx: '>=2' + docutils: '>=0.18.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda hash: - md5: b04565a0bfac26170025770fe3256dcd - sha256: 79228ab583277a527456786f2060211bfed2647259b960566af1718d44dae2aa + md5: 8b8362d876396fd967cbb5f404def907 + sha256: 43c343edc9ea11ffd947d97fa60bf6347a404700e2cde81fb954e60b7e6a42c1 category: main optional: false - name: sphinx-tabs @@ -22866,12 +23456,12 @@ package: dependencies: pygments: '' python: '>=3.6' - sphinx: '>=2,<5' - docutils: '>=0.16.0' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_0.tar.bz2 + sphinx: '>=2' + docutils: '>=0.18.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda hash: - md5: b04565a0bfac26170025770fe3256dcd - sha256: 79228ab583277a527456786f2060211bfed2647259b960566af1718d44dae2aa + md5: 8b8362d876396fd967cbb5f404def907 + sha256: 43c343edc9ea11ffd947d97fa60bf6347a404700e2cde81fb954e60b7e6a42c1 category: main optional: false - name: sphinx-tags @@ -22934,211 +23524,142 @@ package: manager: conda platform: osx-64 dependencies: - python: '' - sphinx: '>=1.5.0' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx_fontawesome-0.0.6-pyh8c360ce_0.tar.bz2 - hash: - md5: fc037d1b4a799959b8770375e6458bfd - sha256: 2125421eada1cbafdc5e0058e07a417f7f6c938b447eb63e80fbe8403e7235e5 - category: main - optional: false -- name: sphinx_fontawesome - version: 0.0.6 - manager: conda - platform: osx-arm64 - dependencies: - python: '' - sphinx: '>=1.5.0' - url: https://conda.anaconda.org/conda-forge/noarch/sphinx_fontawesome-0.0.6-pyh8c360ce_0.tar.bz2 - hash: - md5: fc037d1b4a799959b8770375e6458bfd - sha256: 2125421eada1cbafdc5e0058e07a417f7f6c938b447eb63e80fbe8403e7235e5 - category: main - optional: false -- name: sphinxcontrib-applehelp - version: 1.0.4 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda - hash: - md5: 5a31a7d564f551d0e6dff52fd8cb5b16 - sha256: 802810d8321d55e5666806d565e72949eabf77ad510fe2758ce1da2441675ef1 - category: main - optional: false -- name: sphinxcontrib-applehelp - version: 1.0.4 - manager: conda - platform: osx-64 - dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda - hash: - md5: 5a31a7d564f551d0e6dff52fd8cb5b16 - sha256: 802810d8321d55e5666806d565e72949eabf77ad510fe2758ce1da2441675ef1 - category: main - optional: false -- name: sphinxcontrib-applehelp - version: 1.0.4 - manager: conda - platform: osx-arm64 - dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda - hash: - md5: 5a31a7d564f551d0e6dff52fd8cb5b16 - sha256: 802810d8321d55e5666806d565e72949eabf77ad510fe2758ce1da2441675ef1 - category: main - optional: false -- name: sphinxcontrib-devhelp - version: 1.0.2 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2 - hash: - md5: 68e01cac9d38d0e717cd5c87bc3d2cc9 - sha256: 66cca7eccb7f92eee53f9f5a552e3e1d643daa3a1ebd03c185e2819e5c491576 - category: main - optional: false -- name: sphinxcontrib-devhelp - version: 1.0.2 - manager: conda - platform: osx-64 - dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2 + python: '' + sphinx: '>=1.5.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx_fontawesome-0.0.6-pyh8c360ce_0.tar.bz2 hash: - md5: 68e01cac9d38d0e717cd5c87bc3d2cc9 - sha256: 66cca7eccb7f92eee53f9f5a552e3e1d643daa3a1ebd03c185e2819e5c491576 + md5: fc037d1b4a799959b8770375e6458bfd + sha256: 2125421eada1cbafdc5e0058e07a417f7f6c938b447eb63e80fbe8403e7235e5 category: main optional: false -- name: sphinxcontrib-devhelp - version: 1.0.2 +- name: sphinx_fontawesome + version: 0.0.6 manager: conda platform: osx-arm64 dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2 + python: '' + sphinx: '>=1.5.0' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx_fontawesome-0.0.6-pyh8c360ce_0.tar.bz2 hash: - md5: 68e01cac9d38d0e717cd5c87bc3d2cc9 - sha256: 66cca7eccb7f92eee53f9f5a552e3e1d643daa3a1ebd03c185e2819e5c491576 + md5: fc037d1b4a799959b8770375e6458bfd + sha256: 2125421eada1cbafdc5e0058e07a417f7f6c938b447eb63e80fbe8403e7235e5 category: main optional: false -- name: sphinxcontrib-dotnetdomain - version: '0.4' +- name: sphinxcontrib-applehelp + version: 1.0.8 manager: conda platform: linux-64 dependencies: - python: '' - sphinx: '>=0.6' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-dotnetdomain-0.4-py_0.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda hash: - md5: fb61a7369f505b4bb98e1530c3e09f9f - sha256: bcec8d02205dc27bc399e42513d204f8557b8b06a9546ed784c283086850211c + md5: 611a35a27914fac3aa37611a6fe40bb5 + sha256: 710013443a063518d587d2af82299e92ab6d6695edf35a676ac3a0ccc9e3f8e6 category: main optional: false -- name: sphinxcontrib-dotnetdomain - version: '0.4' +- name: sphinxcontrib-applehelp + version: 1.0.8 manager: conda platform: osx-64 dependencies: - python: '' - sphinx: '>=0.6' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-dotnetdomain-0.4-py_0.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda hash: - md5: fb61a7369f505b4bb98e1530c3e09f9f - sha256: bcec8d02205dc27bc399e42513d204f8557b8b06a9546ed784c283086850211c + md5: 611a35a27914fac3aa37611a6fe40bb5 + sha256: 710013443a063518d587d2af82299e92ab6d6695edf35a676ac3a0ccc9e3f8e6 category: main optional: false -- name: sphinxcontrib-dotnetdomain - version: '0.4' +- name: sphinxcontrib-applehelp + version: 1.0.8 manager: conda platform: osx-arm64 dependencies: - python: '' - sphinx: '>=0.6' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-dotnetdomain-0.4-py_0.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda hash: - md5: fb61a7369f505b4bb98e1530c3e09f9f - sha256: bcec8d02205dc27bc399e42513d204f8557b8b06a9546ed784c283086850211c + md5: 611a35a27914fac3aa37611a6fe40bb5 + sha256: 710013443a063518d587d2af82299e92ab6d6695edf35a676ac3a0ccc9e3f8e6 category: main optional: false -- name: sphinxcontrib-golangdomain - version: 0.2.0.dev0 +- name: sphinxcontrib-devhelp + version: 1.0.6 manager: conda platform: linux-64 dependencies: - python: '' - sphinx: '>=1.0' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-golangdomain-0.2.0.dev0-py_0.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda hash: - md5: d1a73c192888d08cedec232602c22f32 - sha256: 1610ab148559364b6927e481f5c97f31c8130ffcca2dc16d1c4b33c281e408d6 + md5: d7e4954df0d3aea2eacc7835ad12671d + sha256: 63a6b60653ef13a6712848f4b3c4b713d4b564da1dae571893f1a3659cde85f3 category: main optional: false -- name: sphinxcontrib-golangdomain - version: 0.2.0.dev0 +- name: sphinxcontrib-devhelp + version: 1.0.6 manager: conda platform: osx-64 dependencies: - python: '' - sphinx: '>=1.0' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-golangdomain-0.2.0.dev0-py_0.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda hash: - md5: d1a73c192888d08cedec232602c22f32 - sha256: 1610ab148559364b6927e481f5c97f31c8130ffcca2dc16d1c4b33c281e408d6 + md5: d7e4954df0d3aea2eacc7835ad12671d + sha256: 63a6b60653ef13a6712848f4b3c4b713d4b564da1dae571893f1a3659cde85f3 category: main optional: false -- name: sphinxcontrib-golangdomain - version: 0.2.0.dev0 +- name: sphinxcontrib-devhelp + version: 1.0.6 manager: conda platform: osx-arm64 dependencies: - python: '' - sphinx: '>=1.0' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-golangdomain-0.2.0.dev0-py_0.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda hash: - md5: d1a73c192888d08cedec232602c22f32 - sha256: 1610ab148559364b6927e481f5c97f31c8130ffcca2dc16d1c4b33c281e408d6 + md5: d7e4954df0d3aea2eacc7835ad12671d + sha256: 63a6b60653ef13a6712848f4b3c4b713d4b564da1dae571893f1a3659cde85f3 category: main optional: false - name: sphinxcontrib-htmlhelp - version: 2.0.1 + version: 2.0.5 manager: conda platform: linux-64 dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda hash: - md5: 6c8c4d6eb2325e59290ac6dbbeacd5f0 - sha256: aeff20be994e6f9520a91fc177a33cb3e4d0911cdf8d27e575d001f00afa33fd + md5: 7e1e7437273682ada2ed5e9e9714b140 + sha256: 512f393cfe34cb3de96ade7a7ad900d6278e2087a1f0e5732aa60fadee396d99 category: main optional: false - name: sphinxcontrib-htmlhelp - version: 2.0.1 + version: 2.0.5 manager: conda platform: osx-64 dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda hash: - md5: 6c8c4d6eb2325e59290ac6dbbeacd5f0 - sha256: aeff20be994e6f9520a91fc177a33cb3e4d0911cdf8d27e575d001f00afa33fd + md5: 7e1e7437273682ada2ed5e9e9714b140 + sha256: 512f393cfe34cb3de96ade7a7ad900d6278e2087a1f0e5732aa60fadee396d99 category: main optional: false - name: sphinxcontrib-htmlhelp - version: 2.0.1 + version: 2.0.5 manager: conda platform: osx-arm64 dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda hash: - md5: 6c8c4d6eb2325e59290ac6dbbeacd5f0 - sha256: aeff20be994e6f9520a91fc177a33cb3e4d0911cdf8d27e575d001f00afa33fd + md5: 7e1e7437273682ada2ed5e9e9714b140 + sha256: 512f393cfe34cb3de96ade7a7ad900d6278e2087a1f0e5732aa60fadee396d99 category: main optional: false - name: sphinxcontrib-jsmath @@ -23220,117 +23741,123 @@ package: category: main optional: false - name: sphinxcontrib-qthelp - version: 1.0.3 + version: 1.0.7 manager: conda platform: linux-64 dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda hash: - md5: d01180388e6d1838c3e1ad029590aa7a - sha256: 35d8f01fc798d38b72ae003c040d2dee650d315f904268a1f793d4d59460d1e2 + md5: 26acae54b06f178681bfb551760f5dd1 + sha256: dd35b52f056c39081cd0ae01155174277af579b69e5d83798a33e9056ec78d63 category: main optional: false - name: sphinxcontrib-qthelp - version: 1.0.3 + version: 1.0.7 manager: conda platform: osx-64 dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda hash: - md5: d01180388e6d1838c3e1ad029590aa7a - sha256: 35d8f01fc798d38b72ae003c040d2dee650d315f904268a1f793d4d59460d1e2 + md5: 26acae54b06f178681bfb551760f5dd1 + sha256: dd35b52f056c39081cd0ae01155174277af579b69e5d83798a33e9056ec78d63 category: main optional: false - name: sphinxcontrib-qthelp - version: 1.0.3 + version: 1.0.7 manager: conda platform: osx-arm64 dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda hash: - md5: d01180388e6d1838c3e1ad029590aa7a - sha256: 35d8f01fc798d38b72ae003c040d2dee650d315f904268a1f793d4d59460d1e2 + md5: 26acae54b06f178681bfb551760f5dd1 + sha256: dd35b52f056c39081cd0ae01155174277af579b69e5d83798a33e9056ec78d63 category: main optional: false - name: sphinxcontrib-serializinghtml - version: 1.1.5 + version: 1.1.10 manager: conda platform: linux-64 dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda hash: - md5: 9ff55a0901cf952f05c654394de76bf7 - sha256: 890bbf815cff114ddbb618b9876d492fce07d02956c1d7b3d46cb7f835f563f6 + md5: e507335cb4ca9cff4c3d0fa9cdab255e + sha256: bf80e4c0ff97d5e8e5f6db0831ba60007e820a3a438e8f1afd868aa516d67d6f category: main optional: false - name: sphinxcontrib-serializinghtml - version: 1.1.5 + version: 1.1.10 manager: conda platform: osx-64 dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda hash: - md5: 9ff55a0901cf952f05c654394de76bf7 - sha256: 890bbf815cff114ddbb618b9876d492fce07d02956c1d7b3d46cb7f835f563f6 + md5: e507335cb4ca9cff4c3d0fa9cdab255e + sha256: bf80e4c0ff97d5e8e5f6db0831ba60007e820a3a438e8f1afd868aa516d67d6f category: main optional: false - name: sphinxcontrib-serializinghtml - version: 1.1.5 + version: 1.1.10 manager: conda platform: osx-arm64 dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2 + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda hash: - md5: 9ff55a0901cf952f05c654394de76bf7 - sha256: 890bbf815cff114ddbb618b9876d492fce07d02956c1d7b3d46cb7f835f563f6 + md5: e507335cb4ca9cff4c3d0fa9cdab255e + sha256: bf80e4c0ff97d5e8e5f6db0831ba60007e820a3a438e8f1afd868aa516d67d6f category: main optional: false - name: sphinxcontrib-youtube - version: 1.2.0 + version: 1.4.1 manager: conda platform: linux-64 dependencies: python: '>=3.6' requests: '' - sphinx: '>=0.6' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-youtube-1.2.0-pyhd8ed1ab_0.conda + sphinx: '>=6.1' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-youtube-1.4.1-pyhd8ed1ab_0.conda hash: - md5: 08b58a79c8cc29922dd65fff31577008 - sha256: 90e8c853aa0f99ad82ae28f8289f7d56153970bd81dcc9f810ab9ec051d9365a + md5: 4ba3a0149c3f8cd1d29e2439f79587c2 + sha256: f5a7c8999348efc09a6d7c5805c9ed0f3d167926d95dc9fa56f4a3e1c5178166 category: main optional: false - name: sphinxcontrib-youtube - version: 1.2.0 + version: 1.4.1 manager: conda platform: osx-64 dependencies: requests: '' python: '>=3.6' - sphinx: '>=0.6' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-youtube-1.2.0-pyhd8ed1ab_0.conda + sphinx: '>=6.1' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-youtube-1.4.1-pyhd8ed1ab_0.conda hash: - md5: 08b58a79c8cc29922dd65fff31577008 - sha256: 90e8c853aa0f99ad82ae28f8289f7d56153970bd81dcc9f810ab9ec051d9365a + md5: 4ba3a0149c3f8cd1d29e2439f79587c2 + sha256: f5a7c8999348efc09a6d7c5805c9ed0f3d167926d95dc9fa56f4a3e1c5178166 category: main optional: false - name: sphinxcontrib-youtube - version: 1.2.0 + version: 1.4.1 manager: conda platform: osx-arm64 dependencies: requests: '' python: '>=3.6' - sphinx: '>=0.6' - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-youtube-1.2.0-pyhd8ed1ab_0.conda + sphinx: '>=6.1' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-youtube-1.4.1-pyhd8ed1ab_0.conda hash: - md5: 08b58a79c8cc29922dd65fff31577008 - sha256: 90e8c853aa0f99ad82ae28f8289f7d56153970bd81dcc9f810ab9ec051d9365a + md5: 4ba3a0149c3f8cd1d29e2439f79587c2 + sha256: f5a7c8999348efc09a6d7c5805c9ed0f3d167926d95dc9fa56f4a3e1c5178166 category: main optional: false - name: sqlalchemy @@ -23396,18 +23923,18 @@ package: category: main optional: false - name: sqlite - version: 3.45.2 + version: 3.45.3 manager: conda platform: osx-64 dependencies: - libsqlite: 3.45.2 + libsqlite: 3.45.3 libzlib: '>=1.2.13,<1.3.0a0' - ncurses: '>=6.4,<7.0a0' + ncurses: '>=6.4.20240210,<7.0a0' readline: '>=8.2,<9.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.45.2-h7461747_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.45.3-h7461747_0.conda hash: - md5: fc4dae09f6b38084f3bfc87c77032584 - sha256: c9c1b7d6025d5efa74f4ddbda1ae72a721f041ad3d4a6ec3dda600befe9dffaa + md5: 4d9a56087e6150e84b94087a8c0fdf98 + sha256: 73ab284ff41dd6aeb69f7a8a014018fbf8b019fd261ff4190fd5813b62d07b16 category: main optional: false - name: sqlite @@ -23674,16 +24201,16 @@ package: category: main optional: false - name: tbb - version: 2021.11.0 + version: 2021.12.0 manager: conda platform: osx-64 dependencies: - libcxx: '>=15' - libhwloc: '>=2.9.3,<2.9.4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-64/tbb-2021.11.0-h7728843_1.conda + libcxx: '>=16' + libhwloc: '>=2.10.0,<2.10.1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/tbb-2021.12.0-h7728843_0.conda hash: - md5: 29e29beba9deb0ef66bee015c5bf3c14 - sha256: 6d531daba5ccf150b58d434fa72b1da0da04e8f14ab71bdad289a90d355f47e8 + md5: e4fb6f4700d8890c36cbf317c2c6d0cb + sha256: 6068f814461eeb4ba68ded3d97bbe444d2909b469c51598c40734004b2c3b765 category: main optional: false - name: tblib @@ -23999,7 +24526,7 @@ package: python-flatbuffers: '>=23.5.26' python_abi: 3.9.* six: '>=1.12' - snappy: '>=1.1.10,<2.0a0' + snappy: '>=1.1.10,<1.2.0a0' tensorboard: '>=2.15,<2.16' termcolor: '>=1.1.0' typing_extensions: '>=3.6.6' @@ -24221,18 +24748,6 @@ package: sha256: db64669a918dec8c744f80a85b9c82216b79298256c7c8bd19bdba54a02f8914 category: main optional: false -- name: textwrap3 - version: 0.9.2 - manager: conda - platform: osx-64 - dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/textwrap3-0.9.2-py_0.tar.bz2 - hash: - md5: 1f84e74e9dbe2e5ae38c58496bffaca8 - sha256: d7b40d3a3f1c2e74bbea5ee845b34a30abc1ae8e4f2a92f4a58800e1e669c076 - category: main - optional: false - name: tf2onnx version: 1.16.1 manager: conda @@ -24697,39 +25212,39 @@ package: category: main optional: false - name: traitlets - version: 5.14.2 + version: 5.14.3 manager: conda platform: linux-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda hash: - md5: af5fa2d2186003472e766a23c46cae04 - sha256: 9ea6073091c130470a51b51703c8d2d959434992e29c4aa4abeba07cd56533a3 + md5: 3df84416a021220d8b5700c613af2dc5 + sha256: 8a64fa0f19022828513667c2c7176cfd125001f3f4b9bc00d33732e627dd2592 category: main optional: false - name: traitlets - version: 5.14.2 + version: 5.14.3 manager: conda platform: osx-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda hash: - md5: af5fa2d2186003472e766a23c46cae04 - sha256: 9ea6073091c130470a51b51703c8d2d959434992e29c4aa4abeba07cd56533a3 + md5: 3df84416a021220d8b5700c613af2dc5 + sha256: 8a64fa0f19022828513667c2c7176cfd125001f3f4b9bc00d33732e627dd2592 category: main optional: false - name: traitlets - version: 5.14.2 + version: 5.14.3 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda hash: - md5: af5fa2d2186003472e766a23c46cae04 - sha256: 9ea6073091c130470a51b51703c8d2d959434992e29c4aa4abeba07cd56533a3 + md5: 3df84416a021220d8b5700c613af2dc5 + sha256: 8a64fa0f19022828513667c2c7176cfd125001f3f4b9bc00d33732e627dd2592 category: main optional: false - name: typeguard @@ -24823,15 +25338,15 @@ package: category: main optional: false - name: typing-extensions - version: 4.10.0 + version: 4.11.0 manager: conda platform: osx-64 dependencies: - typing_extensions: 4.10.0 - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + typing_extensions: 4.11.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda hash: - md5: 091683b9150d2ebaa62fd7e2c86433da - sha256: 0698fe2c4e555fb44c27c60f7a21fa0eea7f5bf8186ad109543c5b056e27f96a + md5: 471e3988f8ca5e9eb3ce6be7eac3bcee + sha256: aecbd9c601ba5a6c128da8975276fd817b968a9edc969b7ae97aee76e80a14a6 category: main optional: false - name: typing-extensions @@ -24859,15 +25374,15 @@ package: category: main optional: false - name: typing_extensions - version: 4.10.0 + version: 4.11.0 manager: conda platform: osx-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda hash: - md5: 16ae769069b380646c47142d719ef466 - sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 + md5: 6ef2fc37559256cf682d8b3375e89b80 + sha256: a7e8714d14f854058e971a6ed44f18cc37cc685f98ddefb2e6b7899a0cc4d1a2 category: main optional: false - name: typing_extensions @@ -25072,13 +25587,14 @@ package: manager: conda platform: linux-64 dependencies: + cuda-cudart: '>=12.0.107,<13.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' rdma-core: '>=51.0' - url: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-ha691c75_8.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-hda83522_8.conda hash: - md5: 3f9bc6137b240642504a6c9b07a10c25 - sha256: 85b40ac6607c9e4e32bcb13e95da41ff48a10f813df0c1e74ff32412e1f7da35 + md5: 1262131747a950f88daea77b96937cb8 + sha256: 6caa77cd8b84735eef071b15d2746ffaab6bec74e584144d5cde5a30ea33315b category: main optional: false - name: ukkonen @@ -25167,42 +25683,6 @@ package: sha256: 31d33f967f0db811b25a9315bef727cb12a24c76d8ded8947188cc04535b06b0 category: main optional: false -- name: unidecode - version: 1.3.8 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/unidecode-1.3.8-pyhd8ed1ab_0.conda - hash: - md5: 913724e0dfe2708b7b7d4e35b8cc2e0f - sha256: 3f29636a555736983ac2bdeb6e41a5cd85b572fa4f6cc2270d6c6543d8eb8c0b - category: main - optional: false -- name: unidecode - version: 1.3.8 - manager: conda - platform: osx-64 - dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/unidecode-1.3.8-pyhd8ed1ab_0.conda - hash: - md5: 913724e0dfe2708b7b7d4e35b8cc2e0f - sha256: 3f29636a555736983ac2bdeb6e41a5cd85b572fa4f6cc2270d6c6543d8eb8c0b - category: main - optional: false -- name: unidecode - version: 1.3.8 - manager: conda - platform: osx-arm64 - dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/unidecode-1.3.8-pyhd8ed1ab_0.conda - hash: - md5: 913724e0dfe2708b7b7d4e35b8cc2e0f - sha256: 3f29636a555736983ac2bdeb6e41a5cd85b572fa4f6cc2270d6c6543d8eb8c0b - category: main - optional: false - name: uri-template version: 1.3.0 manager: conda @@ -25246,10 +25726,10 @@ package: dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.7-h59595ed_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.7-hcb278e6_1.conda hash: - md5: c5edf07141147789784f89d5b4e4a9ad - sha256: ec997599b6dcfef34242c67b695c4704d9ba6cb0b9de8f390defa475a95cdb3f + md5: 2c46deb08ba9b10e90d0a6401ad65deb + sha256: bc7670384fc3e519b376eab25b2c747afe392b243f17e881075231f4a0f2e5a0 category: main optional: false - name: uriparser @@ -25269,11 +25749,11 @@ package: manager: conda platform: osx-arm64 dependencies: - libcxx: '>=14' - url: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.7-h13dd4ca_1.conda + libcxx: '>=14.0.6' + url: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.7-hb7217d7_1.conda hash: - md5: df83a53820f413eb8b14045433a2d587 - sha256: 019103df9eec86c9afa92dec21a849e63d57bfa9125ca811e68b78dab224c4ee + md5: 4fe532e3c6b0cfa5365eb01743d32578 + sha256: bedd03f3bb30b73ae7b0dc9626f1371a8568ce6d41303df3e8299688428dfa94 category: main optional: false - name: urllib3 @@ -25434,7 +25914,7 @@ package: category: main optional: false - name: virtualenv - version: 20.25.1 + version: 20.25.3 manager: conda platform: osx-64 dependencies: @@ -25442,10 +25922,10 @@ package: distlib: <1,>=0.3.7 filelock: <4,>=3.12.2 platformdirs: <5,>=3.9.1 - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.3-pyhd8ed1ab_0.conda hash: - md5: 8797a4e26be36880a603aba29c785352 - sha256: 1ced4445cf72cd9dc344ad04bdaf703a08cc428c8c46e4bda928ad79786ee153 + md5: ac56e5a52b659482dc333de69475f99c + sha256: dd95bcaf4c0b88dd4abca0e15da109b2a276dd6fa0b59bb33d67aba5f0031aa7 category: main optional: false - name: virtualenv @@ -25621,16 +26101,16 @@ package: category: main optional: false - name: werkzeug - version: 3.0.1 + version: 3.0.2 manager: conda platform: osx-64 dependencies: python: '>=3.8' markupsafe: '>=2.1.1' - url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.2-pyhd8ed1ab_0.conda hash: - md5: af8d825d93dbe6331ee6d61c69869ca0 - sha256: b7ac49549d370a411b1d6150d24243a15adcce07f1c61ec2ea1b536346e47aa0 + md5: 96b2d2e2550ccba0f4008b4d0b4199dd + sha256: ae5744d6e3826d71826ca939436437016d14f38e3535517e160f74d392788d5d category: main optional: false - name: werkzeug @@ -25758,6 +26238,72 @@ package: sha256: 83f5c4e8963137f6c0287846d118d9e3baac69cfa86b4734a4ea02f4e276422c category: main optional: false +- name: xcb-util + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda + hash: + md5: 9bfac7ccd94d54fd21a0501296d60424 + sha256: 0c91d87f0efdaadd4e56a5f024f8aab20ec30f90aa2ce9e4ebea05fbc20f71ad + category: main + optional: false +- name: xcb-util-image + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + xcb-util: '>=0.4.0,<0.5.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda + hash: + md5: 9d7bcddf49cbf727730af10e71022c73 + sha256: 92ffd68d2801dbc27afe223e04ae7e78ef605fc8575f107113c93c7bafbd15b0 + category: main + optional: false +- name: xcb-util-keysyms + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda + hash: + md5: 632413adcd8bc16b515cab87a2932913 + sha256: 8451d92f25d6054a941b962179180728c48c62aab5bf20ac10fef713d5da6a9a + category: main + optional: false +- name: xcb-util-renderutil + version: 0.3.9 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda + hash: + md5: e995b155d938b6779da6ace6c6b13816 + sha256: 6987588e6fff5892056021c2ea52f7a0deefb2c7348e70d24750e2d60dabf009 + category: main + optional: false +- name: xcb-util-wm + version: 0.4.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda + hash: + md5: 90108a432fb5c6150ccfee3f03388656 + sha256: 08ba7147c7579249b6efd33397dc1a8c2404278053165aaecd39280fee705724 + category: main + optional: false - name: xerces-c version: 3.2.5 manager: conda @@ -25802,16 +26348,29 @@ package: sha256: 8ad901a5fe535ebd16b469cf8e46cf174f7e6e4d9b432cc8cc02666a87e7e2ee category: main optional: false +- name: xkeyboard-config + version: '2.41' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + xorg-libx11: '>=1.8.7,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda + hash: + md5: 81f740407b45e3f9047b3174fa94eb9e + sha256: 56955610c0747ea7cb026bb8aa9ef165ff41d616e89894538173b8b7dd2ee49a + category: main + optional: false - name: xorg-kbproto version: 1.0.7 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 + libgcc-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h14c3975_1002.tar.bz2 hash: - md5: 4b230e8381279d76131116660f5a241a - sha256: e90b0a6a5d41776f11add74aa030f789faf4efd3875c31964d6f9cfa63a10dd1 + md5: 6dfe5dbe10d55266e4a5e89287eed578 + sha256: e0ecf489734baf996703b2b274b0d130485476162ef5aae1d4e74851549a470e category: main optional: false - name: xorg-libice @@ -25895,11 +26454,11 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 + libgcc-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h516909a_0.tar.bz2 hash: - md5: be93aabceefa2fac576e971aef407908 - sha256: 4df7c5ee11b8686d3453e7f3f4aa20ceef441262b49860733066c52cfd0e4a77 + md5: e95a160e60b2a327309a6d323a4d780e + sha256: 6cd3f826a853bb26bf303b26560439b135ebc2a88c9806e70a8d6935cfeeea91 category: main optional: false - name: xorg-libxdmcp @@ -25957,11 +26516,11 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2 + libgcc-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h14c3975_1002.tar.bz2 hash: - md5: 06feff3d2634e3097ce2fe681474b534 - sha256: 38942930f233d1898594dd9edf4b0c0786f3dbc12065a0c308634c37fd936034 + md5: fbcb7fa11dee1a5d3df4371cc55bb229 + sha256: bbed3c5ab97fdde0a0a2d725be15cd9b5fc770086e0afecebc8c155873bfff73 category: main optional: false - name: xorg-xextproto @@ -25976,16 +26535,28 @@ package: sha256: b8dda3b560e8a7830fe23be1c58cc41f407b2e20ae2f3b6901eb5842ba62b743 category: main optional: false +- name: xorg-xf86vidmodeproto + version: 2.3.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h516909a_1002.tar.bz2 + hash: + md5: c3f8431e8a5e0b54f8f2ebd812000516 + sha256: 88e67824b807173c684988244965982cd9e63f1ddf33c10333b64c55e1768bf9 + category: main + optional: false - name: xorg-xproto version: 7.0.31 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2 + libgcc-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h14c3975_1007.tar.bz2 hash: - md5: b4a4381d54784606820704f7b5f05a15 - sha256: f197bb742a17c78234c24605ad1fe2d88b1d25f332b75d73e5ba8cf8fbc2a10d + md5: a45d8cd411bdf8f08ced463f68986b62 + sha256: d24dfec052d1ed796604caf405d8846a394c7950c60a611ec24a4b91aaa9d56f category: main optional: false - name: xxhash @@ -26035,15 +26606,15 @@ package: category: main optional: false - name: xyzservices - version: 2023.10.1 + version: 2024.4.0 manager: conda platform: osx-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2023.10.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.4.0-pyhd8ed1ab_0.conda hash: - md5: 1e0d85c0e2fef9539218da185b285f54 - sha256: da655e2e0a742fddefeeaf2dd828b62a1820a3755d13341e1a555a10fcb9cf81 + md5: 93dffc47dadbe36a1a644f3f50d4979d + sha256: 4e095631b52a78bbd9b53f28eb79b0c8f448d9509cf0451e99c2f3f85576f114 category: main optional: false - name: xyzservices @@ -26438,16 +27009,6 @@ package: sha256: 487fede588040bfa3a43df945275c28c1c73ca75bf705295adb9fbadd2e89be7 category: main optional: false -- name: annotated-types - version: 0.6.0 - manager: pip - platform: osx-64 - dependencies: {} - url: https://files.pythonhosted.org/packages/28/78/d31230046e58c207284c6b2c4e8d96e6d3cb4e52354721b944d3e1ee4aa5/annotated_types-0.6.0-py3-none-any.whl - hash: - sha256: 0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 - category: main - optional: false - name: boto3 version: 1.34.34 manager: pip @@ -26556,6 +27117,57 @@ package: sha256: cc31ad6fdea1f49962ea42db9421772afe01ac5442380d9a99fcf3d188c61afe category: main optional: false +- name: databricks-cli + version: 0.18.0 + manager: pip + platform: linux-64 + dependencies: + click: '>=7.0' + pyjwt: '>=1.7.0' + oauthlib: '>=3.1.0' + requests: '>=2.17.3' + tabulate: '>=0.7.7' + six: '>=1.10.0' + urllib3: '>=1.26.7,<3' + url: https://files.pythonhosted.org/packages/ae/a3/d56f8382c40899301f327d1c881278b09c9b8bc301c2c111633a0346d06e/databricks_cli-0.18.0-py2.py3-none-any.whl + hash: + sha256: 1176a5f42d3e8af4abfc915446fb23abc44513e325c436725f5898cbb9e3384b + category: main + optional: false +- name: databricks-cli + version: 0.18.0 + manager: pip + platform: osx-64 + dependencies: + click: '>=7.0' + pyjwt: '>=1.7.0' + oauthlib: '>=3.1.0' + requests: '>=2.17.3' + tabulate: '>=0.7.7' + six: '>=1.10.0' + urllib3: '>=1.26.7,<3' + url: https://files.pythonhosted.org/packages/ae/a3/d56f8382c40899301f327d1c881278b09c9b8bc301c2c111633a0346d06e/databricks_cli-0.18.0-py2.py3-none-any.whl + hash: + sha256: 1176a5f42d3e8af4abfc915446fb23abc44513e325c436725f5898cbb9e3384b + category: main + optional: false +- name: databricks-cli + version: 0.18.0 + manager: pip + platform: osx-arm64 + dependencies: + click: '>=7.0' + pyjwt: '>=1.7.0' + oauthlib: '>=3.1.0' + requests: '>=2.17.3' + tabulate: '>=0.7.7' + six: '>=1.10.0' + urllib3: '>=1.26.7,<3' + url: https://files.pythonhosted.org/packages/ae/a3/d56f8382c40899301f327d1c881278b09c9b8bc301c2c111633a0346d06e/databricks_cli-0.18.0-py2.py3-none-any.whl + hash: + sha256: 1176a5f42d3e8af4abfc915446fb23abc44513e325c436725f5898cbb9e3384b + category: main + optional: false - name: dolt-integrations version: 0.1.5 manager: pip @@ -27325,6 +27937,16 @@ package: sha256: e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e category: main optional: false +- name: platformdirs + version: 3.11.0 + manager: pip + platform: osx-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/56/29/3ec311dc18804409ecf0d2b09caa976f3ae6215559306b5b530004e11156/platformdirs-3.11.0-py3-none-any.whl + hash: + sha256: e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e + category: main + optional: false - name: platformdirs version: 3.11.0 manager: pip diff --git a/monodocs-environment.yaml b/monodocs-environment.yaml index 6008991174..f48beb9eb9 100644 --- a/monodocs-environment.yaml +++ b/monodocs-environment.yaml @@ -14,16 +14,16 @@ dependencies: - myst-nb - psycopg2-binary - recommonmark - - sphinx==4.5.0 + - sphinx - sphinx-prompt - sphinx-click - sphinx-autoapi - sphinx-copybutton - sphinx-issues - sphinx_fontawesome - - sphinx-panels + - sphinx-design - sphinxcontrib-mermaid - - sphinxcontrib-youtube==1.2.0 + - sphinxcontrib-youtube - sphinx-tabs - sphinx-tags==0.2.1 @@ -76,6 +76,7 @@ dependencies: - ray==2.6.3 - duckdb - aioboto3>=12.3.0 # aws sagemaker inference + - databricks-cli # mlflow platforms: - linux-64 From 8f0cd02c97068cc36b759b2171e9d293128b6821 Mon Sep 17 00:00:00 2001 From: Future-Outlier Date: Sun, 21 Apr 2024 15:27:08 +0800 Subject: [PATCH 449/645] add pip install flytekitplugins-envd (#5257) Signed-off-by: Future-Outlier --- docs/user_guide/environment_setup.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/user_guide/environment_setup.md b/docs/user_guide/environment_setup.md index 1d6a8740c7..36cdffdef6 100644 --- a/docs/user_guide/environment_setup.md +++ b/docs/user_guide/environment_setup.md @@ -235,6 +235,7 @@ before you submit your workflow, you will need to inform `envd` how to push the This can be done via: ``` +pip install flytekitplugins-envd envd context create --name flyte-sandbox --builder tcp --builder-address localhost:30003 --use ``` From 575a2a101c44c4326c0ac2b3a1d4f7c3746cbdc3 Mon Sep 17 00:00:00 2001 From: Future-Outlier Date: Sun, 21 Apr 2024 16:01:27 +0800 Subject: [PATCH 450/645] [Docs] add colon rule in version (#5258) * add Signed-off-by: Future-Outlier * add dns subdomain rule in k8s Signed-off-by: Future-Outlier * version Signed-off-by: Future-Outlier --------- Signed-off-by: Future-Outlier --- docs/concepts/versioning.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/concepts/versioning.rst b/docs/concepts/versioning.rst index 42df830e6c..77a8671de2 100644 --- a/docs/concepts/versioning.rst +++ b/docs/concepts/versioning.rst @@ -28,6 +28,12 @@ Versioning is required to: - Execute multiple experiments in production, which may use different training or data processing algorithms. - Understand how a specific system evolved and answer questions related to the effectiveness of a specific strategy. +.. admonition:: Note + + Please note that Flyte currently does not support the use of colons in specifying versions. + + For instance, using "0:1" as a version number is not permitted. + Operational Benefits of Completely Versioned Workflows/Pipelines ------------------------------------------------------------------- From e3e614a7c7505e473144fa2fea720953b558c641 Mon Sep 17 00:00:00 2001 From: Future-Outlier Date: Mon, 22 Apr 2024 08:12:59 +0800 Subject: [PATCH 451/645] Add Raw Container Local Execution Doc (#5262) Signed-off-by: Future-Outlier --- docs/user_guide/customizing_dependencies/raw_containers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user_guide/customizing_dependencies/raw_containers.md b/docs/user_guide/customizing_dependencies/raw_containers.md index 7f7d25afd6..72a2acd71f 100644 --- a/docs/user_guide/customizing_dependencies/raw_containers.md +++ b/docs/user_guide/customizing_dependencies/raw_containers.md @@ -47,7 +47,7 @@ correspond to the declared input variables. All data returned by the tasks are c One of the benefits of raw container tasks is that Flytekit does not need to be installed in the target container. :::{note} -Raw containers cannot be run locally at the moment. +Raw containers can be run locally when flytekit version >= 1.11.0. ::: ## Scripts From fb52e318dc99c4ed74b7b0e0694e997ce71fc358 Mon Sep 17 00:00:00 2001 From: Jason Lai Date: Tue, 23 Apr 2024 05:07:16 +0800 Subject: [PATCH 452/645] [Docs] add validation file tpye (#5259) Signed-off-by: jason.lai --- .../user_guide/data_types_and_io/flytefile.md | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/user_guide/data_types_and_io/flytefile.md b/docs/user_guide/data_types_and_io/flytefile.md index 97330669a5..883b7c5e0c 100644 --- a/docs/user_guide/data_types_and_io/flytefile.md +++ b/docs/user_guide/data_types_and_io/flytefile.md @@ -68,4 +68,26 @@ You can run the workflow locally as follows: :lines: 75-95 ``` +You can enable type validation if you have the [python-magic](https://pypi.org/project/python-magic/) package installed. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Mac OS + + .. code-block:: bash + + brew install libmagic + + .. group-tab:: Linux + + .. code-block:: bash + + sudo apt-get install libmagic1 +``` + +:::{note} +Currently, type validation is only supported on the `Mac OS` and `Linux` platforms. +::: + [flytesnacks]: https://github.com/flyteorg/flytesnacks/tree/master/examples/data_types_and_io/ From 4ff2707e76b071e074ea793b5cc266fdc102f1eb Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Mon, 22 Apr 2024 15:17:29 -0700 Subject: [PATCH 453/645] WebAPI plugins optimization (#5237) Signed-off-by: Kevin Su Signed-off-by: Kevin Su --- .../pluginmachinery/internal/webapi/cache.go | 8 ++++-- .../internal/webapi/launcher.go | 4 ++- .../internal/webapi/launcher_test.go | 3 ++ .../internal/webapi/monitor.go | 3 +- .../pluginmachinery/internal/webapi/state.go | 3 ++ .../go/tasks/plugins/webapi/agent/plugin.go | 5 ++++ flytestdlib/cache/auto_refresh.go | 28 ++++++++++++++----- 7 files changed, 43 insertions(+), 11 deletions(-) diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache.go index b13070534e..7569abd90e 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/cache.go @@ -44,11 +44,15 @@ type ResourceCache struct { // A wrapper for each item in the cache. type CacheItem struct { State - Resource webapi.Resource } func (c CacheItem) IsTerminal() bool { + if c.Resource != nil { + if resource, ok := c.Resource.(interface{ IsTerminal() bool }); ok { + return resource.IsTerminal() + } + } return c.State.Phase.IsTerminal() } @@ -80,7 +84,7 @@ func (q *ResourceCache) SyncResource(ctx context.Context, batch cache.Batch) ( logger.Debugf(ctx, "Sync loop - processing resource with cache key [%s]", resource.GetID()) - if cacheItem.State.Phase.IsTerminal() { + if cacheItem.IsTerminal() { logger.Debugf(ctx, "Sync loop - resource cache key [%v] in terminal state [%s]", resource.GetID()) resp = append(resp, cache.ItemSyncResponse{ diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/launcher.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/launcher.go index 9482b3df95..a8c2dc108b 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/launcher.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/launcher.go @@ -38,6 +38,8 @@ func launch(ctx context.Context, p webapi.AsyncPlugin, tCtx core.TaskExecutionCo // Store the created resource name, and update our state. state.ResourceMeta = rMeta state.Phase = PhaseResourcesCreated + state.PhaseVersion = 2 + cacheItem := CacheItem{ State: *state, } @@ -49,5 +51,5 @@ func launch(ctx context.Context, p webapi.AsyncPlugin, tCtx core.TaskExecutionCo return nil, core.PhaseInfo{}, err } - return state, core.PhaseInfoQueued(time.Now(), 2, "launched"), nil + return state, core.PhaseInfoQueued(time.Now(), state.PhaseVersion, "launched"), nil } diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/launcher_test.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/launcher_test.go index 7836cc591d..a200de9b4f 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/launcher_test.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/launcher_test.go @@ -27,6 +27,7 @@ func Test_launch(t *testing.T) { s := State{ ResourceMeta: "abc", Phase: PhaseResourcesCreated, + PhaseVersion: 2, } c.OnGetOrCreate("my-id", CacheItem{State: s}).Return(CacheItem{State: s}, nil) @@ -51,6 +52,7 @@ func Test_launch(t *testing.T) { c := &mocks2.AutoRefresh{} s := State{ Phase: PhaseResourcesCreated, + PhaseVersion: 2, ResourceMeta: "abc", } @@ -96,6 +98,7 @@ func Test_launch(t *testing.T) { c := &mocks2.AutoRefresh{} s := State{ Phase: PhaseResourcesCreated, + PhaseVersion: 2, ResourceMeta: "my-id", } c.OnGetOrCreate("my-id", CacheItem{State: s}).Return(CacheItem{State: s}, fmt.Errorf("failed to cache")) diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/monitor.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/monitor.go index 4edbadcb07..6244be3f26 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/monitor.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/monitor.go @@ -39,7 +39,7 @@ func monitor(ctx context.Context, tCtx core.TaskExecutionContext, p Client, cach } return state, core.PhaseInfoFailure(errors.CacheFailed, cacheItem.ErrorMessage, nil), nil } - return state, core.PhaseInfoQueued(time.Now(), core.DefaultPhaseVersion, "job submitted"), nil + return state, core.PhaseInfoQueued(time.Now(), cacheItem.PhaseVersion, "job submitted"), nil } newPhase, err := p.Status(ctx, newPluginContext(cacheItem.ResourceMeta, cacheItem.Resource, "", tCtx)) @@ -57,6 +57,7 @@ func monitor(ctx context.Context, tCtx core.TaskExecutionContext, p Client, cach } cacheItem.Phase = newPluginPhase + cacheItem.PhaseVersion = newPhase.Version() if newPluginPhase.IsTerminal() { // Queue item for deletion in the cache. diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/state.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/state.go index 164e8b2ef7..176b627b91 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/state.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/state.go @@ -41,6 +41,9 @@ type State struct { // Phase current phase of the resource. Phase Phase `json:"phase,omitempty"` + // PhaseVersion is the version of the phase. This is used to detect if the phase has changed since the last time + PhaseVersion uint32 + // ResourceMeta contain metadata about resource this task created. This can be a complex structure or a simple type // (e.g. a string). It should contain enough information for the plugin to interact (retrieve, check status, delete) // with the resource through the remote service. diff --git a/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go b/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go index d1b18e76dd..e41c4ccaa0 100644 --- a/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go +++ b/flyteplugins/go/tasks/plugins/webapi/agent/plugin.go @@ -40,6 +40,11 @@ type ResourceWrapper struct { LogLinks []*flyteIdl.TaskLog } +// IsTerminal is used to avoid making network calls to the agent service if the resource is already in a terminal state. +func (r ResourceWrapper) IsTerminal() bool { + return r.Phase == flyteIdl.TaskExecution_SUCCEEDED || r.Phase == flyteIdl.TaskExecution_FAILED || r.Phase == flyteIdl.TaskExecution_ABORTED +} + type ResourceMetaWrapper struct { OutputPrefix string AgentResourceMeta []byte diff --git a/flytestdlib/cache/auto_refresh.go b/flytestdlib/cache/auto_refresh.go index 58490669f4..252706d27a 100644 --- a/flytestdlib/cache/auto_refresh.go +++ b/flytestdlib/cache/auto_refresh.go @@ -116,11 +116,14 @@ type autoRefresh struct { syncCb SyncFunc createBatchesCb CreateBatchesFunc lruMap *lru.Cache - toDelete *syncSet - syncPeriod time.Duration - workqueue workqueue.RateLimitingInterface - parallelizm int - lock sync.RWMutex + // Items that are currently being processed are in the processing set. + // It will prevent the same item from being processed multiple times by different workers. + processing *syncSet + toDelete *syncSet + syncPeriod time.Duration + workqueue workqueue.RateLimitingInterface + parallelizm int + lock sync.RWMutex } func getEvictionFunction(counter prometheus.Counter) func(key interface{}, value interface{}) { @@ -211,6 +214,13 @@ func (w *autoRefresh) GetOrCreate(id ItemID, item Item) (Item, error) { w.lruMap.Add(id, item) w.metrics.CacheMiss.Inc() + + // It fixes cold start issue in the AutoRefreshCache by adding the item to the workqueue when it is created. + // This way, the item will be processed without waiting for the next sync cycle (30s by default). + batch := make([]ItemWrapper, 0, 1) + batch = append(batch, itemWrapper{id: id, item: item}) + w.workqueue.AddRateLimited(&batch) + w.processing.Insert(id) return item, nil } @@ -236,7 +246,7 @@ func (w *autoRefresh) enqueueBatches(ctx context.Context) error { // If not ok, it means evicted between the item was evicted between getting the keys and this update loop // which is fine, we can just ignore. if value, ok := w.lruMap.Peek(k); ok { - if item, ok := value.(Item); !ok || (ok && !item.IsTerminal()) { + if item, ok := value.(Item); !ok || (ok && !item.IsTerminal() && !w.processing.Contains(k)) { snapshot = append(snapshot, itemWrapper{ id: k.(ItemID), item: value.(Item), @@ -253,6 +263,9 @@ func (w *autoRefresh) enqueueBatches(ctx context.Context) error { for _, batch := range batches { b := batch w.workqueue.AddRateLimited(&b) + for i := 1; i < len(b); i++ { + w.processing.Insert(b[i].GetID()) + } } return nil @@ -295,7 +308,6 @@ func (w *autoRefresh) sync(ctx context.Context) (err error) { logger.Debugf(ctx, "Shutting down worker") return nil } - // Since we create batches every time we sync, we will just remove the item from the queue here // regardless of whether it succeeded the sync or not. w.workqueue.Forget(batch) @@ -304,6 +316,7 @@ func (w *autoRefresh) sync(ctx context.Context) (err error) { newBatch := make(Batch, 0, len(*batch.(*Batch))) for _, b := range *batch.(*Batch) { itemID := b.GetID() + w.processing.Remove(itemID) item, ok := w.lruMap.Get(itemID) if !ok { logger.Debugf(ctx, "item with id [%v] not found in cache", itemID) @@ -363,6 +376,7 @@ func NewAutoRefreshBatchedCache(name string, createBatches CreateBatchesFunc, sy createBatchesCb: createBatches, syncCb: syncCb, lruMap: lruCache, + processing: newSyncSet(), toDelete: newSyncSet(), syncPeriod: resyncPeriod, workqueue: workqueue.NewNamedRateLimitingQueue(syncRateLimiter, scope.CurrentScope()), From 0ffab4a7116bd17eab2481fe5c684036d5110f4e Mon Sep 17 00:00:00 2001 From: Kevin Su Date: Mon, 22 Apr 2024 15:17:43 -0700 Subject: [PATCH 454/645] fix(webapi): Ensure cache deletion on abort workflow (#5235) Signed-off-by: Kevin Su --- .../go/tasks/pluginmachinery/internal/webapi/core.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/core.go b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/core.go index 9c98521897..1d0e31f71c 100644 --- a/flyteplugins/go/tasks/pluginmachinery/internal/webapi/core.go +++ b/flyteplugins/go/tasks/pluginmachinery/internal/webapi/core.go @@ -117,13 +117,19 @@ func (c CorePlugin) Abort(ctx context.Context, tCtx core.TaskExecutionContext) e } func (c CorePlugin) Finalize(ctx context.Context, tCtx core.TaskExecutionContext) error { + cacheItemID := tCtx.TaskExecutionMetadata().GetTaskExecutionID().GetGeneratedName() + err := c.cache.DeleteDelayed(cacheItemID) + if err != nil { + logger.Errorf(ctx, "Failed to delete resource [%v] from cache. Error: %v", cacheItemID, err) + return fmt.Errorf("failed to delete resource [%v] from cache. Error: %v", cacheItemID, err) + } + if len(c.p.GetConfig().ResourceQuotas) == 0 { // If there are no defined quotas, there is nothing to cleanup. return nil } - logger.Infof(ctx, "Attempting to finalize resource [%v].", - tCtx.TaskExecutionMetadata().GetTaskExecutionID().GetGeneratedName()) + logger.Infof(ctx, "Attempting to finalize resource [%v].", cacheItemID) return c.tokenAllocator.releaseToken(ctx, c.p, tCtx, c.metrics) } From 8c5aac605f848978cac5c273515e7fd0de68fb1c Mon Sep 17 00:00:00 2001 From: Andre Giron Date: Tue, 23 Apr 2024 09:41:54 -0700 Subject: [PATCH 455/645] RunLLM Widget Configuration (#5266) * Adds RunLLM widget configuration to flyte docs. Signed-off-by: Andre Giron * Updates RunLLM Widget to 0.0.2 Signed-off-by: Andre Giron * RunLLM config update, stylesheet is no longer needed to be directly linked to. Signed-off-by: Andre Giron * move to head Signed-off-by: Andre Giron --------- Signed-off-by: Andre Giron --- docs/_templates/base.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/_templates/base.html b/docs/_templates/base.html index f3c5ef1a49..7e0e81480a 100644 --- a/docs/_templates/base.html +++ b/docs/_templates/base.html @@ -98,6 +98,13 @@ } }); + + - + {%- block site_meta -%} @@ -107,6 +114,10 @@ runllm-name="RunLLM" /> + + + {% block body %} -